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 NTupleChiSqFCN:: 00026 NTupleChiSqFCN ( ) 00027 { 00028 } 00029 00030 NTupleChiSqFCN:: 00031 NTupleChiSqFCN ( const NTupleChiSqFCN & fcn ) 00032 : NTupleFCN ( fcn ) 00033 { 00034 } 00035 00036 StatedFCN * 00037 NTupleChiSqFCN:: 00038 clone () const 00039 { 00040 return new NTupleChiSqFCN ( *this ); 00041 } 00042 00043 double 00044 NTupleChiSqFCN:: 00045 up () const 00046 { 00047 return 1.0; 00048 } 00049 00050 namespace dp2 = hippodraw::DataPoint2DTuple; 00051 namespace dp3 = hippodraw::DataPoint3DTuple; 00052 00053 double 00054 NTupleChiSqFCN:: 00055 objectiveValue () const 00056 { 00057 double result = 0.0; 00058 00059 if ( m_dimen == 1 ) { 00060 int ix = m_indices [ dp2::X ]; 00061 int iy = m_indices [ dp2::Y ]; 00062 int ie = m_indices [ dp2::YERR ]; 00063 00064 unsigned int rows = m_ntuple -> rows (); 00065 00066 for ( unsigned int i = 0; i < rows; i++ ) { 00067 if ( acceptRow ( i ) ) { 00068 const vector < double > & row = m_ntuple -> getRow ( i ); 00069 double err = ie < 0 ? 0. : row [ ie ]; 00070 if ( err == 0.0 && m_has_errors ) continue; 00071 if ( m_has_errors == false ) err = 1.0; 00072 00073 double diff = m_function -> operator () ( row [ ix ] ) - row [ iy ]; 00074 result += diff * diff / ( err * err ); 00075 } 00076 } 00077 } 00078 else { 00079 vector < double > coord ( m_dimen ); 00080 00081 int iy = m_indices [ dp3::Z ]; 00082 int ie = m_indices [ dp3::ZERR ]; 00083 00084 unsigned int rows = m_ntuple -> rows (); 00085 00086 for ( unsigned int i = 0; i < rows; i++ ) { 00087 if ( acceptRow ( i ) ) { 00088 const vector < double > & row = m_ntuple -> getRow ( i ); 00089 00090 double err = ie < 0 ? 0. : row [ ie ]; 00091 if ( err == 0.0 && m_has_errors ) continue; 00092 if ( m_has_errors == false ) err = 1.0; 00093 00094 for ( unsigned int j = 0; j < m_dimen; j++ ) { 00095 coord [ j ] = row [ m_indices [ j ] ]; 00096 } 00097 00098 double diff = m_function -> operator () ( coord ) - row [ iy ]; 00099 result += diff * diff / ( err * err ); 00100 } 00101 } 00102 } 00103 00104 return result; 00105 } 00106 00107 bool 00108 NTupleChiSqFCN:: 00109 needsIntegrated () const 00110 { 00111 return false; 00112 }