00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00019
00020 #include "MessageService/MsgService.h"
00021 #include "NtupleUtils/NuMultiRunXFitAnalysis.h"
00022
00023 ClassImp(NuMultiRunXFitAnalysis)
00024
00025 CVSID("$Id: NuMultiRunXFitAnalysis.cxx,v 1.1 2007/12/27 22:13:46 evans Exp $");
00026
00027
00028 NuMultiRunXFitAnalysis::NuMultiRunXFitAnalysis
00029 (vector<NuFDXFitConfig>& vFDConfig)
00030 {
00031 fanalysisSetting = NuXFit::kUnknown;
00032
00033 fvFDConfig = vFDConfig;
00034
00035 fFitter = new TFitterMinuit();
00036 fFitter->CreateMinimizer();
00037 fFitter->SetMinuitFCN(this);
00038 }
00039
00040
00041 double NuMultiRunXFitAnalysis
00042 ::operator () (const vector<double>& pars) const
00043 {
00044 static Int_t fitcounter = 0;
00045 if (!(fitcounter%50)){
00046 cout << "Minuit FD XFit call " << fitcounter << endl;
00047 }
00048 ++fitcounter;
00049 if (NuXFit::kCPT == fanalysisSetting){
00050 Double_t like = 0;
00051 for (vector<NuXFitAnalysis*>::const_iterator it = fvExtrapolators.begin();
00052 it != fvExtrapolators.end();
00053 ++it){
00054 (*it)->FillCPTFDPrediction(pars);
00055 like += (*it)->CalculateLikelihood();
00056 }
00057 return like;
00058 }
00059 else if(NuXFit::kTransition == fanalysisSetting){
00060 Double_t like = 0;
00061 for (vector<NuXFitAnalysis*>::const_iterator it = fvExtrapolators.begin();
00062 it != fvExtrapolators.end();
00063 ++it){
00064 (*it)->FillTransitionFDPrediction(pars);
00065 like += (*it)->CalculateLikelihood();
00066 }
00067 return like;
00068 }
00069 else{
00070 MSG("NuXFitAnalysis.cxx",Msg::kFatal)
00071 << "Incorrect analysis setting" << endl;
00072 return -1.0;
00073 }
00074 }
00075
00076
00077 NuMultiRunXFitAnalysis::~NuMultiRunXFitAnalysis()
00078 {
00079 }
00080
00081
00082 void NuMultiRunXFitAnalysis::PerformFit()
00083 {
00084 this->ConfigureExtrapolators();
00085 fFitter->Minimize();
00086 fFitter->PrintResults(0,0);
00087 }
00088
00089
00090 void NuMultiRunXFitAnalysis::ConfigureExtrapolators()
00091 {
00092 for (vector<NuFDXFitConfig>::iterator it = fvFDConfig.begin();
00093 it != fvFDConfig.end();
00094 ++it){
00095 NuXFitAnalysis* xAnal = new NuXFitAnalysis((*it).xmlConfig);
00096 xAnal->WriteOutput(false);
00097 xAnal->NDFitResults((*it).ndFitResults);
00098 xAnal->NDFitBinningNuMuCC((*it).ndFitBinsNuMuCC);
00099 xAnal->NDFitBinningNuMuBarCC((*it).ndFitBinsNuMuBarCC);
00100 xAnal->FDNuMuCCData(*(*it).fdNuMuCCData);
00101 xAnal->FDNuMuBarCCData(*(*it).fdNuMuBarCCData);
00102 xAnal->FDDataPoT((*it).fdDataPoT);
00103 xAnal->FDMC((*it).fdMCFileName);
00104 xAnal->ConfigureForExternalFit((*it).analSetting);
00105 fvExtrapolators.push_back(xAnal);
00106
00107 fanalysisSetting = (*it).analSetting;
00108 }
00109 }
00110
00111
00112 void NuMultiRunXFitAnalysis::SetupPars()
00113 {
00114 if (NuXFit::kCPT == fanalysisSetting){
00115 this->SetupCPTPars();
00116 return;
00117 }
00118 else if (NuXFit::kTransition == fanalysisSetting){
00119 this->SetupTransitionPars();
00120 return;
00121 }
00122 else{
00123 MSG("NuXFitAnalysis.cxx",Msg::kFatal)
00124 << "Incorrect analysis setting" << endl;
00125 return;
00126 }
00127 }
00128
00129
00130 void NuMultiRunXFitAnalysis::SetupCPTPars()
00131 {
00132 fFitter->SetParameter(0,
00133 "Dm2",
00134 0.003,0.2,1.0,0.0);
00135 fFitter->SetParameter(1,
00136 "Sn2",
00137 1.0,0.2,1.0,0.0);
00138 fFitter->SetParameter(2,
00139 "Dm2Bar",
00140 0.003,0.2,1.0,0.0);
00141 fFitter->SetParameter(3,
00142 "Sn2Bar",
00143 1.0,0.2,1.0,0.0);
00144 }
00145
00146
00147 void NuMultiRunXFitAnalysis::SetupTransitionPars()
00148 {
00149
00150 fFitter->SetParameter(0,
00151 "transitionProb",
00152 0.0,0.2,1.0,0.0);
00153 }