00001 00012 #ifdef _MSC_VER 00013 #include "msdevstudio/MSconfig.h" 00014 #endif 00015 00016 #include "NTupleChiSqFCN.h" 00017 00018 #include "functions/FunctionBase.h" 00019 00020 #include "datasrcs/DataPointTuple.h" 00021 #include "datasrcs/DataSource.h" 00022 00023 using std::vector; 00024 00025 using namespace hippodraw; 00026 00027 NTupleChiSqFCN:: 00028 NTupleChiSqFCN ( ) 00029 { 00030 } 00031 00032 NTupleChiSqFCN:: 00033 NTupleChiSqFCN ( const NTupleChiSqFCN & fcn ) 00034 : NTupleFCN ( fcn ) 00035 { 00036 } 00037 00038 StatedFCN * 00039 NTupleChiSqFCN:: 00040 clone () const 00041 { 00042 return new NTupleChiSqFCN ( *this ); 00043 } 00044 00045 double 00046 NTupleChiSqFCN:: 00047 #ifdef HAVE_MINUIT2 00048 Up () const 00049 #else 00050 up () const 00051 #endif 00052 { 00053 return 1.0; 00054 } 00055 00056 namespace dp2 = hippodraw::DataPoint2DTuple; 00057 namespace dp3 = hippodraw::DataPoint3DTuple; 00058 00059 double 00060 NTupleChiSqFCN:: 00061 objectiveValue () const 00062 { 00063 double result = 0.0; 00064 00065 unsigned int dim = ( m_indices.size() - 2 ) / 2; 00066 00067 if ( dim == 1 ) { 00068 int ix = m_indices [ dp2::X ]; 00069 int iy = m_indices [ dp2::Y ]; 00070 int ie = m_indices [ dp2::YERR ]; 00071 00072 unsigned int rows = m_ntuple -> rows (); 00073 00074 for ( unsigned int i = 0; i < rows; i++ ) { 00075 if ( acceptRow ( i ) ) { 00076 const vector < double > & row = m_ntuple -> getRow ( i ); 00077 double err = ie < 0 ? 0. : row [ ie ]; 00078 if ( err == 0.0 && m_has_errors ) continue; 00079 if ( m_has_errors == false ) err = 1.0; 00080 00081 double diff = m_function -> operator () ( row [ ix ] ) - row [ iy ]; 00082 result += diff * diff / ( err * err ); 00083 } 00084 } 00085 } 00086 else { 00087 vector < double > coord ( dim ); 00088 int iv = m_indices [ dim ]; 00089 int ie = getErrorColumn (); 00090 00091 unsigned int rows = m_ntuple -> rows (); 00092 00093 for ( unsigned int i = 0; i < rows; i++ ) { 00094 if ( acceptRow ( i ) ) { 00095 const vector < double > & row = m_ntuple -> getRow ( i ); 00096 00097 double err = ie < 0 ? 0. : row [ ie ]; 00098 if ( err == 0.0 && m_has_errors ) continue; 00099 if ( m_has_errors == false ) err = 1.0; 00100 00101 for ( unsigned int j = 0; j < dim; j++ ) { 00102 coord [ j ] = row [ m_indices [ j ] ]; 00103 } 00104 00105 double diff = m_function -> operator () ( coord ) - row [ iv ]; 00106 result += diff * diff / ( err * err ); 00107 } 00108 } 00109 } 00110 00111 return result; 00112 } 00113 00114 bool 00115 NTupleChiSqFCN:: 00116 needsIntegrated () const 00117 { 00118 return false; 00119 }