00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "Riostream.h"
00030
00031 #include "RooDataSet.h"
00032 #include "RooRealVar.h"
00033 #include "TString.h"
00034 #include "RooFit.h"
00035 #include "RooFitResult.h"
00036 #include "RooChi2MCSModule.h"
00037 #include "RooMsgService.h"
00038 #include "RooChi2Var.h"
00039 #include "RooDataHist.h"
00040 #include "TMath.h"
00041 #include "RooGlobalFunc.h"
00042
00043
00044
00045 ClassImp(RooChi2MCSModule)
00046 ;
00047
00048
00049
00050
00051 RooChi2MCSModule::RooChi2MCSModule() :
00052 RooAbsMCStudyModule("RooChi2MCSModule","RooChi2Module"),
00053 _data(0), _chi2(0), _ndof(0), _chi2red(0), _prob(0)
00054
00055 {
00056
00057 }
00058
00059
00060
00061
00062
00063 RooChi2MCSModule::RooChi2MCSModule(const RooChi2MCSModule& other) :
00064 RooAbsMCStudyModule(other),
00065 _data(0), _chi2(0), _ndof(0), _chi2red(0), _prob(0)
00066 {
00067
00068 }
00069
00070
00071
00072
00073 RooChi2MCSModule:: ~RooChi2MCSModule()
00074 {
00075
00076
00077 if (_chi2) {
00078 delete _chi2 ;
00079 }
00080 if (_ndof) {
00081 delete _ndof ;
00082 }
00083 if (_chi2red) {
00084 delete _chi2red ;
00085 }
00086 if (_prob) {
00087 delete _prob ;
00088 }
00089 if (_data) {
00090 delete _data ;
00091 }
00092 }
00093
00094
00095
00096
00097 Bool_t RooChi2MCSModule::initializeInstance()
00098 {
00099
00100
00101
00102 _chi2 = new RooRealVar("chi2","chi^2",0) ;
00103 _ndof = new RooRealVar("ndof","number of degrees of freedom",0) ;
00104 _chi2red = new RooRealVar("chi2red","reduced chi^2",0) ;
00105 _prob = new RooRealVar("prob","prob(chi2,ndof)",0) ;
00106
00107
00108 _data = new RooDataSet("Chi2Data","Additional data for Chi2 study",RooArgSet(*_chi2,*_ndof,*_chi2red,*_prob)) ;
00109
00110 return kTRUE ;
00111 }
00112
00113
00114
00115
00116 Bool_t RooChi2MCSModule::initializeRun(Int_t )
00117 {
00118
00119
00120 _data->reset() ;
00121 return kTRUE ;
00122 }
00123
00124
00125
00126
00127 RooDataSet* RooChi2MCSModule::finalizeRun()
00128 {
00129
00130
00131
00132
00133 return _data ;
00134 }
00135
00136
00137
00138
00139 Bool_t RooChi2MCSModule::processAfterFit(Int_t )
00140 {
00141
00142
00143 RooAbsData* data = genSample() ;
00144 RooDataHist* binnedData = dynamic_cast<RooDataHist*>(data) ;
00145 Bool_t deleteData(kFALSE) ;
00146 if (!binnedData) {
00147 deleteData = kTRUE ;
00148 binnedData = ((RooDataSet*)data)->binnedClone() ;
00149 }
00150
00151 RooChi2Var chi2Var("chi2Var","chi2Var",*fitModel(),*binnedData,RooFit::Extended(extendedGen()),RooFit::DataError(RooAbsData::SumW2)) ;
00152
00153 RooArgSet* floatPars = (RooArgSet*) fitParams()->selectByAttrib("Constant",kFALSE) ;
00154
00155 _chi2->setVal(chi2Var.getVal()) ;
00156 _ndof->setVal(binnedData->numEntries()-floatPars->getSize()-1) ;
00157 _chi2red->setVal(_chi2->getVal()/_ndof->getVal()) ;
00158 _prob->setVal(TMath::Prob(_chi2->getVal(),static_cast<int>(_ndof->getVal()))) ;
00159
00160 _data->add(RooArgSet(*_chi2,*_ndof,*_chi2red,*_prob)) ;
00161
00162 if (deleteData) {
00163 delete binnedData ;
00164 }
00165 delete floatPars ;
00166
00167 return kTRUE ;
00168 }