Go to the documentation of this file.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 }