Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

NuXFitAnalysis.cxx

Go to the documentation of this file.
00001 
00002 // $Id: NuXFitAnalysis.cxx,v 1.14 2009/10/01 18:56:09 bckhouse Exp $
00003 //
00004 // Combined numu & numubar extrapolation and FD fit by cross-section
00005 // fitting
00006 //
00007 // Justin Evans
00008 // j.evans2@physics.ox.ac.uk
00009 //
00010 //
00011 // $Log: NuXFitAnalysis.cxx,v $
00012 // Revision 1.14  2009/10/01 18:56:09  bckhouse
00013 // Centralize calculation of oscillation functions into NuUtilities: function OscillationWeight, DecayWeight, DecoherenceWeight.
00014 //
00015 // Revision 1.13  2008/05/02 19:39:22  evans
00016 // Updating a comment.
00017 //
00018 // Revision 1.12  2008/01/17 22:34:41  evans
00019 // ...and now the transition analysis is configurable between Minuit and
00020 // grid search (well, line search at least).
00021 //
00022 // Revision 1.11  2008/01/17 22:23:06  evans
00023 // CPT fit is now configurable between grid search and Minuit.
00024 //
00025 // Revision 1.10  2008/01/11 00:12:52  hartnell
00026 //
00027 // Have to be careful not to confuse hist->Reset() with hist->Clear().
00028 //
00029 // Change comment from:
00030 //
00031 // //Clear recoE histograms
00032 //
00033 // to
00034 //
00035 // //Reset recoE histograms (removes bin contents and errors)
00036 //
00037 // to reflect what is done. Just a little paranoia...
00038 //
00039 // Revision 1.9  2008/01/10 17:58:33  evans
00040 // Adding IsGoodMajorityCurvature to the list of selection cuts.
00041 //
00042 // Revision 1.8  2007/12/27 22:13:46  evans
00043 // New class to allow the XFit extrapolation to be performed on multiple
00044 // runs (e.g. SKZP periods), along with necessary interface additions to
00045 // NuXFitAnalysis.
00046 //
00047 // Revision 1.7  2007/12/25 21:12:56  evans
00048 // In the transition analysis, using the true neutrino energy for the
00049 // efficiency corrections instead of the reconstructed energy.
00050 //
00051 // Revision 1.6  2007/12/21 17:41:18  evans
00052 // Debugging and creating a FD output file for the XFit CPT analysis.
00053 //
00054 // Revision 1.5  2007/12/20 19:12:45  evans
00055 // Enabling the XFit analysis to receive its input data as a
00056 // reconstructed histogram (as well as a NuDST: you can do either). This
00057 // means it can fit the output of the Fluctuator in either the ND or FD
00058 // (or both).
00059 //
00060 // Revision 1.4  2007/12/07 14:53:15  evans
00061 // Adding protection against uninitialised variables found by Robert
00062 // Hatcher when compiling with gcc+optimization.
00063 //
00064 // Revision 1.3  2007/12/04 13:13:47  evans
00065 // Adding a mechanism to return the best fit parameters.
00066 //
00067 // Revision 1.2  2007/12/03 17:10:19  evans
00068 // Adding code to do a numu->numubar transition analysis withtruth
00069 // fitting. Also added the ability to do a stystematics study with the
00070 // NuSystematic class.
00071 //
00072 // Revision 1.1  2007/11/15 13:46:27  evans
00073 // The class to apply my ND XSec weights to the far detector data and do
00074 // an FD CPT fit (using Minuit2).
00075 //
00076 //
00078 
00079 #include "Minuit2/ContoursError.h"
00080 #include "Minuit2/MnContours.h"
00081 #include "Minuit2/MnMigrad.h"
00082 #include "Minuit2/MnPlot.h"
00083 #include "Minuit2/MnUserParameters.h"
00084 #include "Minuit2/FunctionMinimum.h"
00085 #include "TFile.h"
00086 #include "TFitterMinuit.h"
00087 #include "TGraph.h"
00088 #include "TGraph2DErrors.h"
00089 #include "TH1D.h"
00090 #include "TH2D.h"
00091 #include "TMath.h"
00092 #include "TMinuit.h"
00093 
00094 #include "MessageService/MsgService.h"
00095 #include "NtupleUtils/NuSystematic.h"
00096 #include "NtupleUtils/NuTreeWrapper.h"
00097 #include "NtupleUtils/NuUtilities.h"
00098 #include "NtupleUtils/NuXFitAnalysis.h"
00099 #include "NtupleUtils/NuXMLConfig.h"
00100 
00101 ClassImp(NuXFitAnalysis)
00102 
00103 CVSID("$Id: NuXFitAnalysis.cxx,v 1.14 2009/10/01 18:56:09 bckhouse Exp $");
00104 
00105 using namespace NuXSecFit;
00106 using namespace ROOT::Minuit2;
00107 
00108 using std::string;
00109 using std::vector;
00110 
00111 //____________________________________________________________________72
00112 NuXFitAnalysis::NuXFitAnalysis()
00113   : fdoGridSearch(false),
00114     fwriteOutput(true),
00115     fUp(1.0),
00116     ffdDataPoT(0.0),
00117     ffdMCPoT(0.0),
00118     fdm2(0.0),
00119     fsn2(0.0),
00120     fBestDm2(-1.0),
00121     fBestSn2(-1.0),
00122     fBestDm2Bar(-1.0),
00123     fBestSn2Bar(-1.0)
00124 {
00125   fanalysisSetting = NuXFit::kUnknown;
00126   fanaVersion = NuCuts::kJJE1;
00127   fnuSystematic = new NuSystematic();
00128 
00129   fSelEffFileName = "";
00130   fxsecfilename = "";
00131 
00132   fOutputFile = 0;
00133 
00134   ftFDDataTree = 0;
00135   ftFDMCTree = 0;
00136 
00137   fhNuBarCCSelectionEfficiency = 0;
00138   fhNuMuCCSelectionEfficiency = 0;
00139   fNuBarCCCrossSectionGraph = 0;
00140   fNuMuCCCrossSectionGraph = 0;
00141   fhNuBarCCCrossSections = 0;
00142   fhNuMuCCCrossSections = 0;
00143 
00144   fhFDNuMuCCDataFromFile = 0;
00145   fhFDNuMuBarCCDataFromFile = 0;
00146 
00147   fhFDDataRecoENuMuCC = 0;
00148   fhFDDataRecoENuMuBarCC = 0;
00149   fhFDMCRecoENuMuCC = 0;
00150   fhFDMCRecoENuMuBarCC = 0;
00151 
00152   fFitter = new TFitterMinuit();
00153   fFitter->CreateMinimizer();
00154   fFitter->SetMinuitFCN(this);
00155 }
00156 
00157 //____________________________________________________________________72
00158 NuXFitAnalysis::NuXFitAnalysis(const NuXMLConfig& xmlConfig)
00159   : fdoGridSearch(false),
00160     fUp(1.0),
00161     ffdDataPoT(0.0),
00162     ffdMCPoT(0.0),
00163     fdm2(0.0),
00164     fsn2(0.0)
00165 {
00166   fanalysisSetting = NuXFit::kUnknown;
00167   fanaVersion = NuCuts::kJJE1;
00168   fnuSystematic = new NuSystematic(xmlConfig);
00169 
00170   fSelEffFileName = "";
00171   fxsecfilename = "";
00172 
00173   fOutputFile = 0;
00174 
00175   ftFDDataTree = 0;
00176   ftFDMCTree = 0;
00177 
00178   fhNuBarCCSelectionEfficiency = 0;
00179   fhNuMuCCSelectionEfficiency = 0;
00180   fNuBarCCCrossSectionGraph = 0;
00181   fNuMuCCCrossSectionGraph = 0;
00182   fhNuBarCCCrossSections = 0;
00183   fhNuMuCCCrossSections = 0;
00184 
00185   fhFDNuMuCCDataFromFile = 0;
00186   fhFDNuMuBarCCDataFromFile = 0;
00187 
00188   fhFDDataRecoENuMuCC = 0;
00189   fhFDDataRecoENuMuBarCC = 0;
00190   fhFDMCRecoENuMuCC = 0;
00191   fhFDMCRecoENuMuBarCC = 0;
00192 
00193   fFitter = new TFitterMinuit();
00194   fFitter->CreateMinimizer();
00195   fFitter->SetMinuitFCN(this);
00196 }
00197 
00198 //____________________________________________________________________72
00199 
00200 NuXFitAnalysis::~NuXFitAnalysis()
00201 {
00202   if (fOutputFile){
00203     fOutputFile->Close();
00204     delete fOutputFile;
00205     fOutputFile = 0;
00206   }
00207 
00208   if (fnuSystematic){delete fnuSystematic; fnuSystematic = 0;}
00209 
00210   if (fhFDNuMuCCDataFromFile){
00211     delete fhFDNuMuCCDataFromFile; fhFDNuMuCCDataFromFile = 0;
00212   }
00213   if (fhFDNuMuBarCCDataFromFile){
00214     delete fhFDNuMuBarCCDataFromFile; fhFDNuMuBarCCDataFromFile = 0;
00215   }
00216 }
00217 
00218 //____________________________________________________________________72
00219 double NuXFitAnalysis
00220 ::operator () (const vector<double>& pars) const
00221 {
00222   static Int_t fitcounter = 0;
00223   if (!(fitcounter%50)){
00224     cout << "Minuit FD XFit call " << fitcounter << endl;
00225   }
00226   ++fitcounter;
00227   if (NuXFit::kCPT == fanalysisSetting){
00228     this->FillCPTFDPrediction(pars);
00229   }
00230   else if(NuXFit::kTransition == fanalysisSetting){
00231     this->FillTransitionFDPrediction(pars);
00232   }
00233   else{
00234     MSG("NuXFitAnalysis.cxx",Msg::kFatal)
00235       << "Incorrect analysis setting" << endl;
00236     return -1.0;
00237   }
00238   return this->CalculateLikelihood();
00239 }
00240 
00241 //____________________________________________________________________72
00242 const Double_t NuXFitAnalysis::CalculateLikelihood(const TH1D* fdPred,
00243                                                    const TH1D* fdData)
00244   const
00245 {
00246   //Aim to minimise -2lnL. That's what I'm returning.
00247 
00248   Double_t like = 0;
00249 
00250   for (Int_t i=1; i<=fdPred->GetNbinsX(); ++i){
00251     //Bizarre limits because root histograms are silly
00252     Double_t mnu = fdPred->GetBinContent(i);
00253     Double_t dnu = fdData->GetBinContent(i);
00254     if (mnu<0.0001){mnu = 0.0001;}
00255     if (dnu){
00256       like += 2*(mnu - dnu + dnu*log(dnu/mnu));
00257     }
00258     else{like += 2*(mnu - dnu);}
00259   }
00260 //   cout << "Like = " << like << endl;
00261   return like;
00262 }
00263 
00264 //____________________________________________________________________72
00265 const Double_t NuXFitAnalysis::CalculateLikelihood() const
00266 {
00267   //Aim to minimise -2lnL. That's what I'm returning.
00268 
00269   Double_t like = 0;
00270 
00271   for (Int_t i=1; i<=fhFDMCRecoENuMuCC->GetNbinsX(); ++i){
00272     //Bizarre limits because root histograms are silly
00273     Double_t mnu = fhFDMCRecoENuMuCC->GetBinContent(i);
00274     Double_t dnu = fhFDDataRecoENuMuCC->GetBinContent(i);
00275     if (mnu<0.0001){mnu = 0.0001;}
00276     if (dnu){
00277       like += 2*(mnu - dnu + dnu*log(dnu/mnu));
00278     }
00279     else{like += 2*(mnu - dnu);}
00280   }
00281 
00282   for (Int_t i=1; i<=fhFDMCRecoENuMuBarCC->GetNbinsX(); ++i){
00283     Double_t mbar = fhFDMCRecoENuMuBarCC->GetBinContent(i);
00284     Double_t dbar = fhFDDataRecoENuMuBarCC->GetBinContent(i);
00285     if (mbar<0.0001){mbar = 0.0001;}
00286     if (dbar){
00287       like += 2*(mbar - dbar + dbar*log(dbar/mbar));
00288     }
00289     else{like += 2*(mbar - dbar);}
00290   }
00291 //   cout << "Like = " << like << endl;
00292   return like;
00293 }
00294 
00295 //____________________________________________________________________72
00296 void NuXFitAnalysis::OutputFileName(const string outFile)
00297 {
00298   if (fOutputFile){
00299     fOutputFile->Close();
00300     delete fOutputFile;
00301     fOutputFile = 0;
00302   }
00303   fOutputFile = new TFile(outFile.c_str(),"RECREATE");
00304 }
00305 
00306 //____________________________________________________________________72
00307 const Bool_t NuXFitAnalysis::CreateFDNuMuBarCCDataHisto()
00308 {
00309   if (fhFDDataRecoENuMuBarCC) {
00310     delete fhFDDataRecoENuMuBarCC; fhFDDataRecoENuMuBarCC = 0;
00311   }
00312 
00313   if (fhFDNuMuCCDataFromFile && fhFDNuMuBarCCDataFromFile){
00314     fhFDDataRecoENuMuBarCC = new TH1D(*fhFDNuMuBarCCDataFromFile);
00315     fhFDDataRecoENuMuBarCC->Reset();
00316     return true;
00317   }
00318 
00319   Int_t size = fvFDRecoENuMuBarCCBins.size();
00320   if (!size){
00321     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
00322       << "FD reconstructed energy binning not supplied."
00323       << endl;
00324     return false;
00325   }
00326 
00327   Double_t* recoEBinEdges = new Double_t[size];
00328 
00329   Int_t i=0;
00330   for (vector<Double_t>::const_iterator it =
00331          fvFDRecoENuMuBarCCBins.begin();
00332        it != fvFDRecoENuMuBarCCBins.end();
00333        ++it, ++i){
00334     recoEBinEdges[i] = *it;
00335   }
00336 
00337   fhFDDataRecoENuMuBarCC = new TH1D("fhFDDataRecoENuMuBarCC",
00338                                "FD NuMuBar CC data",
00339                                size-1,
00340                                recoEBinEdges);
00341 
00342   if (!fhFDDataRecoENuMuBarCC) return false;
00343   return true;
00344 }
00345 
00346 //____________________________________________________________________72
00347 const Bool_t NuXFitAnalysis::CreateFDNuMuCCDataHisto()
00348 {
00349   if (fhFDDataRecoENuMuCC) {
00350     delete fhFDDataRecoENuMuCC; fhFDDataRecoENuMuCC = 0;
00351   }
00352 
00353   if (fhFDNuMuCCDataFromFile && fhFDNuMuBarCCDataFromFile){
00354     fhFDDataRecoENuMuCC = new TH1D(*fhFDNuMuCCDataFromFile);
00355     fhFDDataRecoENuMuCC->Reset();
00356     return true;
00357   }
00358 
00359   Int_t size = fvFDRecoENuMuCCBins.size();
00360   if (!size){
00361     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
00362       << "FD reconstructed energy binning not supplied."
00363       << endl;
00364     return false;
00365   }
00366 
00367   Double_t* recoEBinEdges = new Double_t[size];
00368 
00369   Int_t i=0;
00370   for (vector<Double_t>::const_iterator it =
00371          fvFDRecoENuMuCCBins.begin();
00372        it != fvFDRecoENuMuCCBins.end();
00373        ++it, ++i){
00374     recoEBinEdges[i] = *it;
00375   }
00376 
00377   fhFDDataRecoENuMuCC = new TH1D("fhFDDataRecoENuMuCC",
00378                                "FD NuMu CC data",
00379                                size-1,
00380                                recoEBinEdges);
00381 
00382   if (!fhFDDataRecoENuMuCC) return false;
00383   return true;
00384 }
00385 
00386 //____________________________________________________________________72
00387 const Bool_t NuXFitAnalysis::CreateFDNuMuBarCCMCHisto()
00388 {
00389   if (fhFDMCRecoENuMuBarCC) {
00390     delete fhFDMCRecoENuMuBarCC; fhFDMCRecoENuMuBarCC = 0;
00391   }
00392 
00393   if (fhFDNuMuCCDataFromFile && fhFDNuMuBarCCDataFromFile){
00394     fhFDMCRecoENuMuBarCC = new TH1D(*fhFDNuMuBarCCDataFromFile);
00395     fhFDMCRecoENuMuBarCC->Reset();
00396     return true;
00397   }
00398 
00399   Int_t size = fvFDRecoENuMuBarCCBins.size();
00400   if (!size){
00401     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
00402       << "FD reconstructed energy binning not supplied."
00403       << endl;
00404     return false;
00405   }
00406 
00407   Double_t* recoEBinEdges = new Double_t[size];
00408 
00409   Int_t i=0;
00410   for (vector<Double_t>::const_iterator it =
00411          fvFDRecoENuMuBarCCBins.begin();
00412        it != fvFDRecoENuMuBarCCBins.end();
00413        ++it, ++i){
00414     recoEBinEdges[i] = *it;
00415   }
00416 
00417   fhFDMCRecoENuMuBarCC = new TH1D("fhFDMCRecoENuMuBarCC",
00418                                "FD NuMuBar CC prediction",
00419                                size-1,
00420                                recoEBinEdges);
00421 
00422   if (!fhFDMCRecoENuMuBarCC) return false;
00423   return true;
00424 }
00425 
00426 //____________________________________________________________________72
00427 const Bool_t NuXFitAnalysis::CreateFDNuMuCCMCHisto()
00428 {
00429   if (fhFDMCRecoENuMuCC) {
00430     delete fhFDMCRecoENuMuCC; fhFDMCRecoENuMuCC = 0;
00431   }
00432 
00433   if (fhFDNuMuCCDataFromFile && fhFDNuMuBarCCDataFromFile){
00434     fhFDMCRecoENuMuCC = new TH1D(*fhFDNuMuCCDataFromFile);
00435     fhFDMCRecoENuMuCC->Reset();
00436     return true;
00437   }
00438 
00439   Int_t size = fvFDRecoENuMuCCBins.size();
00440   if (!size){
00441     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
00442       << "FD reconstructed energy binning not supplied."
00443       << endl;
00444     return false;
00445   }
00446 
00447   Double_t* recoEBinEdges = new Double_t[size];
00448 
00449   Int_t i=0;
00450   for (vector<Double_t>::const_iterator it =
00451          fvFDRecoENuMuCCBins.begin();
00452        it != fvFDRecoENuMuCCBins.end();
00453        ++it, ++i){
00454     recoEBinEdges[i] = *it;
00455   }
00456 
00457   fhFDMCRecoENuMuCC = new TH1D("fhFDMCRecoENuMuCC",
00458                                "FD NuMu CC prediction",
00459                                size-1,
00460                                recoEBinEdges);
00461 
00462   if (!fhFDMCRecoENuMuCC) return false;
00463   return true;
00464 }
00465 
00466 //____________________________________________________________________72
00467 void NuXFitAnalysis::FillCPTFDPrediction
00468 (const vector<double>& par) const
00469 {
00470   //Reset recoE histograms (removes bin contents and errors)
00471   fhFDMCRecoENuMuCC->Reset();
00472   fhFDMCRecoENuMuBarCC->Reset();
00473 
00474   Double_t shwEShift=1.0;
00475   Double_t trkEShift = 1.0;
00476 
00477   Double_t Dm2 = par[0];
00478   Double_t Sn2 = par[1];
00479   Double_t Dm2Bar = par[2];
00480   Double_t Sn2Bar = par[3];
00481 
00482   //Fill the nubar histogram, weighted with truth parameters
00483   for (vector<NuEvent>::const_iterator itBar
00484          = fvFDMCCCNuMuBarEvents.begin();
00485        itBar!=fvFDMCCCNuMuBarEvents.end();
00486        ++itBar){
00487     NuEvent barEvent = *itBar;
00488     Int_t truthpar = this->TruthIndex(barEvent);
00489     Double_t barweight = 1.0;
00490     barweight *= barEvent.rw;
00491     if (truthpar>=0){
00492       barweight *= fvNDFitPars[truthpar];
00493     }
00494     Double_t thisSn2 = 0.0;
00495     Double_t thisDm2 = 0.0;
00496     if (1==barEvent.iaction){
00497       if (-14==barEvent.inu){
00498         thisSn2 = Sn2Bar;
00499         thisDm2 = Dm2Bar;
00500       }
00501       if (14==barEvent.inu){
00502         thisSn2 = Sn2;
00503         thisDm2 = Dm2;
00504       }
00505     }
00506     Double_t oscweightbar = NuUtilities::OscillationWeight(barEvent.neuEnMC,
00507                                                            thisDm2, thisSn2);
00508     barweight *= oscweightbar;
00509     Double_t recoNuE = shwEShift*(barEvent.shwEn)
00510       + trkEShift*(barEvent.trkEn);
00511     fhFDMCRecoENuMuBarCC->Fill(recoNuE,barweight);
00512   }
00513   if (ffdMCPoT){fhFDMCRecoENuMuBarCC->Scale(ffdDataPoT/ffdMCPoT);}
00514 
00515   //Fill the numu histogram, weighted with truth parameters
00516   for (vector<NuEvent>::const_iterator itNu
00517          = fvFDMCCCNuMuEvents.begin();
00518        itNu!=fvFDMCCCNuMuEvents.end();
00519        ++itNu){
00520     NuEvent nuEvent = *itNu;
00521     Int_t truthpar = this->TruthIndex(nuEvent);
00522     Double_t nuweight = 1.0;
00523     nuweight *= nuEvent.rw;
00524     if (truthpar>=0){
00525       nuweight *= fvNDFitPars[truthpar];
00526     }
00527     Double_t thisSn2 = 0.0;
00528     Double_t thisDm2 = 0.0;
00529     if (1==nuEvent.iaction){
00530       if (-14==nuEvent.inu){
00531         thisSn2 = Sn2Bar;
00532         thisDm2 = Dm2Bar;
00533       }
00534       if (14==nuEvent.inu){
00535         thisSn2 = Sn2;
00536         thisDm2 = Dm2;
00537       }
00538     }
00539     Double_t oscweight = NuUtilities::OscillationWeight(nuEvent.neuEnMC,
00540                                                         thisDm2, thisSn2);
00541     nuweight *= oscweight;
00542     Double_t recoNuE = shwEShift*(nuEvent.shwEn)
00543       + trkEShift*(nuEvent.trkEn);
00544     fhFDMCRecoENuMuCC->Fill(recoNuE,nuweight);
00545   }
00546   if (ffdMCPoT){fhFDMCRecoENuMuCC->Scale(ffdDataPoT/ffdMCPoT);}
00547 }
00548 
00549 //____________________________________________________________________72
00550 void NuXFitAnalysis::FillTransitionFDPrediction
00551 (const vector<double>& par) const
00552 {
00553   //Reset recoE histograms
00554   fhFDMCRecoENuMuCC->Reset();
00555   fhFDMCRecoENuMuBarCC->Reset();
00556 
00557   Double_t shwEShift=1.0;
00558   Double_t trkEShift = 1.0;
00559 
00560   Double_t Dm2 = fdm2;
00561   Double_t Sn2 = fsn2;
00562   Double_t Dm2Bar = fdm2;
00563   Double_t Sn2Bar = fsn2;
00564   Double_t transitionProb = par[0];
00565 
00566   //Fill the nubar histogram, weighted with truth parameters
00567   for (vector<NuEvent>::const_iterator itBar
00568          = fvFDMCCCNuMuBarEvents.begin();
00569        itBar!=fvFDMCCCNuMuBarEvents.end();
00570        ++itBar){
00571     NuEvent barEvent = *itBar;
00572     Int_t truthpar = this->TruthIndex(barEvent);
00573     Double_t barweight = 1.0;
00574     barweight *= barEvent.rw;
00575     if (truthpar>=0){
00576       barweight *= fvNDFitPars[truthpar];
00577     }
00578     Double_t thisSn2 = 0.0;
00579     Double_t thisDm2 = 0.0;
00580     if (1==barEvent.iaction){
00581       if (-14==barEvent.inu){
00582         thisSn2 = Sn2Bar;
00583         thisDm2 = Dm2Bar;
00584       }
00585       if (14==barEvent.inu){
00586         thisSn2 = Sn2;
00587         thisDm2 = Dm2;
00588       }
00589     }
00590     Double_t oscweightbar = NuUtilities::OscillationWeight(barEvent.neuEnMC,
00591                                                            thisDm2, thisSn2);
00592     Double_t transitionWeight = barweight;
00593     barweight *= oscweightbar;
00594     Double_t recoNuE = shwEShift*(barEvent.shwEn)
00595       + trkEShift*(barEvent.trkEn);
00596     Double_t trueNuE = barEvent.neuEnMC;
00597     fhFDMCRecoENuMuBarCC->Fill(recoNuE,barweight);
00598     if (1==barEvent.iaction){
00599       if (-14==barEvent.inu){
00600         transitionWeight *= 1.0-oscweightbar;
00601         transitionWeight *= transitionProb;
00602         Double_t nuBarSelEff = this->NuBarCCSelectionEfficiency(trueNuE);
00603         Double_t nuBarXSec = this->NuBarCCCrossSection(trueNuE);
00604         if (nuBarSelEff && nuBarXSec){
00605           transitionWeight /= nuBarSelEff;
00606           transitionWeight /= nuBarXSec;
00607         }
00608         transitionWeight *= this->NuMuCCSelectionEfficiency(trueNuE);
00609         transitionWeight *= this->NuMuCCCrossSection(trueNuE);
00610         fhFDMCRecoENuMuCC->Fill(recoNuE,transitionWeight);
00611       }
00612     }
00613   }
00614   if (ffdMCPoT){fhFDMCRecoENuMuBarCC->Scale(ffdDataPoT/ffdMCPoT);}
00615 
00616   //Fill the numu histogram, weighted with truth parameters
00617   for (vector<NuEvent>::const_iterator itNu
00618          = fvFDMCCCNuMuEvents.begin();
00619        itNu!=fvFDMCCCNuMuEvents.end();
00620        ++itNu){
00621     NuEvent nuEvent = *itNu;
00622     Int_t truthpar = this->TruthIndex(nuEvent);
00623     Double_t nuweight = 1.0;
00624     nuweight *= nuEvent.rw;
00625     if (truthpar>=0){
00626       nuweight *= fvNDFitPars[truthpar];
00627     }
00628     Double_t thisSn2 = 0.0;
00629     Double_t thisDm2 = 0.0;
00630     if (1==nuEvent.iaction){
00631       if (-14==nuEvent.inu){
00632         thisSn2 = Sn2Bar;
00633         thisDm2 = Dm2Bar;
00634       }
00635       if (14==nuEvent.inu){
00636         thisSn2 = Sn2;
00637         thisDm2 = Dm2;
00638       }
00639     }
00640     Double_t oscweight = NuUtilities::OscillationWeight(nuEvent.neuEnMC,
00641                                                         thisDm2, thisSn2);
00642     Double_t transitionWeight = nuweight;
00643     nuweight *= oscweight;
00644     Double_t recoNuE = shwEShift*(nuEvent.shwEn)
00645       + trkEShift*(nuEvent.trkEn);
00646     Double_t trueNuE = nuEvent.neuEnMC;
00647     fhFDMCRecoENuMuCC->Fill(recoNuE,nuweight);
00648     if (1==nuEvent.iaction){
00649       if (14==nuEvent.inu){
00650         transitionWeight *= 1.0-oscweight;
00651         transitionWeight *= transitionProb;
00652         transitionWeight *= this->NuBarCCSelectionEfficiency(trueNuE);
00653         transitionWeight *= this->NuBarCCCrossSection(trueNuE);
00654         Double_t nuMuSelEff = this->NuMuCCSelectionEfficiency(trueNuE);
00655         Double_t nuMuXSec = this->NuMuCCCrossSection(trueNuE);
00656         if (nuMuSelEff && nuMuXSec){
00657           transitionWeight /= nuMuSelEff;
00658           transitionWeight /= nuMuXSec;
00659         }
00660         fhFDMCRecoENuMuBarCC->Fill(recoNuE,transitionWeight);
00661       }
00662     }
00663   }
00664   if (ffdMCPoT){fhFDMCRecoENuMuCC->Scale(ffdDataPoT/ffdMCPoT);}
00665 }
00666 
00667 //____________________________________________________________________72
00668 const Double_t NuXFitAnalysis
00669 ::NuBarCCCrossSection(const Double_t trueNuE) const
00670 {
00671   //  return fNuBarCCCrossSectionGraph->Eval(trueNuE,0,"");
00672   return fhNuBarCCCrossSections->
00673     GetBinContent(fhNuBarCCCrossSections->FindBin(trueNuE));
00674 }
00675 
00676 //____________________________________________________________________72
00677 const Double_t NuXFitAnalysis
00678 ::NuBarCCSelectionEfficiency(const Double_t trueNuE) const
00679 {
00680   return fhNuBarCCSelectionEfficiency->
00681     GetBinContent(fhNuBarCCSelectionEfficiency->FindBin(trueNuE));
00682 }
00683 
00684 //____________________________________________________________________72
00685 const Double_t NuXFitAnalysis
00686 ::NuMuCCCrossSection(const Double_t trueNuE) const
00687 {
00688   //  return fNuMuCCCrossSectionGraph->Eval(trueNuE,0,"");
00689   return fhNuMuCCCrossSections->
00690     GetBinContent(fhNuMuCCCrossSections->FindBin(trueNuE));
00691 }
00692 
00693 //____________________________________________________________________72
00694 const Double_t NuXFitAnalysis
00695 ::NuMuCCSelectionEfficiency(const Double_t trueNuE) const
00696 {
00697   return fhNuMuCCSelectionEfficiency->
00698     GetBinContent(fhNuMuCCSelectionEfficiency->FindBin(trueNuE));
00699 }
00700 
00701 //____________________________________________________________________72
00702 const Int_t NuXFitAnalysis::TruthIndex(const NuEvent& info) const
00703 {
00704   Int_t numnubins = fvTrueEBinsNuMuCC.size();
00705   Int_t numbarbins = fvTrueEBinsNuMuBarCC.size();
00706 
00707   Int_t type = info.inu;
00708   const vector<Double_t>* truthbins;
00709   Int_t offset = 0;
00710   Int_t numbins = 0;
00711   if (14 == type){
00712     truthbins = &fvTrueEBinsNuMuCC;
00713     numbins = numnubins;
00714     offset = 0;
00715   }
00716   else if (-14 == type){
00717     truthbins = &fvTrueEBinsNuMuBarCC;
00718     numbins = numbarbins;
00719     offset = numnubins;
00720   }
00721   else{
00722     return numnubins + numbarbins;
00723   }
00724   for (Int_t i=1; i<numbins; ++i){
00725     if ((*truthbins)[i]>info.neuEnMC){
00726       return i - 1 + offset;
00727     }
00728   }
00729   if ((14 == type) || (-14 == type)){
00730     return (numbins + offset);
00731   }
00732   return numnubins + numbarbins;
00733 }
00734 
00735 //____________________________________________________________________72
00736 void NuXFitAnalysis::FDData(const string fdDataFileName)
00737 {
00738   if (ftFDDataTree){delete ftFDDataTree; ftFDDataTree = 0;}
00739   ftFDDataTree = new NuTreeWrapper(fdDataFileName);
00740 
00741   //Get the total PoT
00742   ffdDataPoT = ftFDDataTree->GetPoT();
00743   
00744   MSG("NuXFitAnalysis.cxx",Msg::kInfo)
00745     << "fdDataPoT: " << ffdDataPoT
00746     << endl;
00747 }
00748 
00749 //____________________________________________________________________72
00750 void NuXFitAnalysis::FDNuMuBarCCData(const TH1D& fdData)
00751 {
00752   if (fhFDNuMuBarCCDataFromFile){
00753     delete fhFDNuMuBarCCDataFromFile; fhFDNuMuBarCCDataFromFile = 0;
00754   }
00755   fhFDNuMuBarCCDataFromFile = new TH1D(fdData);
00756   fhFDNuMuBarCCDataFromFile->SetDirectory(0);
00757 }
00758 
00759 //____________________________________________________________________72
00760 void NuXFitAnalysis::FDNuMuCCData(const TH1D& fdData)
00761 {
00762   if (fhFDNuMuCCDataFromFile){
00763     delete fhFDNuMuCCDataFromFile; fhFDNuMuCCDataFromFile = 0;
00764   }
00765   fhFDNuMuCCDataFromFile = new TH1D(fdData);
00766   fhFDNuMuCCDataFromFile->SetDirectory(0);
00767 }
00768 
00769 //____________________________________________________________________72
00770 void NuXFitAnalysis::FDMC(const string fdMCFileName)
00771 {
00772   if (ftFDMCTree){delete ftFDMCTree; ftFDMCTree = 0;}
00773   ftFDMCTree = new NuTreeWrapper(fdMCFileName);
00774 
00775   //Get the total PoT
00776   ffdMCPoT = ftFDMCTree->GetPoT();
00777   
00778   MSG("NuXFitAnalysis.cxx",Msg::kInfo)
00779     << "fdMCPoT: " << ffdMCPoT
00780     << endl;
00781 }
00782 
00783 //____________________________________________________________________72
00784 const Bool_t NuXFitAnalysis::CreateHistograms()
00785 {
00786   Bool_t goodConfig = true;
00787   if (!this->CreateFDNuMuCCDataHisto()) goodConfig = false;
00788   if (!this->CreateFDNuMuBarCCDataHisto()) goodConfig = false;
00789   if (!this->CreateFDNuMuCCMCHisto()) goodConfig = false;
00790   if (!this->CreateFDNuMuBarCCMCHisto()) goodConfig = false;
00791   return goodConfig;
00792 }
00793 
00794 //____________________________________________________________________72
00795 void NuXFitAnalysis::ConfigureForExternalFit
00796 (const NuXFit::NuXAnalysis_t analSetting)
00797 {
00798   fanalysisSetting = analSetting;
00799   this->CreateHistograms();
00800   this->FillFDDataHistograms();
00801   this->CacheFDMCEvents();
00802 
00803   this->SetupPars();
00804 }
00805 
00806 //____________________________________________________________________72
00807 void NuXFitAnalysis::CPTAnalysis()
00808 {
00809   fanalysisSetting = NuXFit::kCPT;
00810 
00811   if (!this->CreateHistograms()){return;}
00812   if (!this->FillFDDataHistograms()){return;}
00813   if (!this->CacheFDMCEvents()){return;}
00814 
00815   if (!fdoGridSearch){
00816     this->SetupPars();
00817     
00818     fFitter->FixParameter(0);
00819     fFitter->FixParameter(1);
00820     
00821     fFitter->Minimize();
00822     fFitter->PrintResults(0,0);
00823     
00824     fBestDm2 = fFitter->GetParameter(0);
00825     fBestSn2 = fFitter->GetParameter(1);
00826     fBestDm2Bar = fFitter->GetParameter(2);
00827     fBestSn2Bar = fFitter->GetParameter(3);
00828   }
00829 
00830   if (fdoGridSearch){
00831     Double_t bestChi2 = 1.0e10;
00832     Double_t bestsn2bar = 0.0;
00833     Double_t bestdm2bar = 0.0;
00834     
00835     Double_t sn2BarLow = 0.8;
00836     Double_t sn2BarHigh = 1.0;
00837     Double_t sn2BarGranularity = 0.001;
00838     Double_t dm2BarLow = 1.0e-3;
00839     Double_t dm2BarHigh = 4.0e-3;
00840     Double_t dm2BarGranularity = 0.005e-3; 
00841     
00842     //Create the Chi2 histogram
00843     Int_t numSn2BarBins = (Int_t) round((sn2BarHigh-sn2BarLow)/sn2BarGranularity) + 1;
00844     Int_t numDm2BarBins = (Int_t) round((dm2BarHigh-dm2BarLow)/dm2BarGranularity) + 1;
00845     TH2D hChi2Bar("hChi2Bar",
00846                   "",
00847                   numSn2BarBins,
00848                   sn2BarLow-sn2BarGranularity/2.0,
00849                   sn2BarHigh+sn2BarGranularity/2.0,
00850                   numDm2BarBins,
00851                   dm2BarLow-dm2BarGranularity/2.0,
00852                   dm2BarHigh+dm2BarGranularity/2.0); 
00853     
00854     for (Double_t sn2bar = sn2BarLow;
00855          sn2bar <= sn2BarHigh+sn2BarGranularity/2.0;
00856          sn2bar += sn2BarGranularity){
00857       MSG("NuMatrixFitter.cxx",Msg::kInfo) << "sn2bar = " << sn2bar << endl;
00858       for (Double_t dm2bar = dm2BarLow;
00859            dm2bar <= dm2BarHigh+dm2BarGranularity/2.0;
00860            dm2bar += dm2BarGranularity){
00861         
00862         vector<Double_t> vParameters;
00863         vParameters.push_back(2.38);
00864         vParameters.push_back(1.0);
00865         vParameters.push_back(dm2bar);
00866         vParameters.push_back(sn2bar);
00867         this->FillCPTFDPrediction(vParameters);
00868         
00869         Double_t chi2 = this->CalculateLikelihood(fhFDMCRecoENuMuBarCC,
00870                                                   fhFDDataRecoENuMuBarCC);
00871         
00872         //       chi2 += this->CalculateLikelihood(numufdPred,numufdData);
00873         Int_t xBin = hChi2Bar.GetXaxis()->FindBin(sn2bar);
00874         Int_t yBin = hChi2Bar.GetYaxis()->FindBin(dm2bar);
00875         Int_t bin2D = hChi2Bar.GetBin(xBin,yBin);
00876         hChi2Bar.SetBinContent(bin2D,chi2);
00877         if (chi2 < bestChi2){
00878           bestChi2 = chi2;
00879           bestsn2bar = sn2bar;
00880           bestdm2bar = dm2bar;
00881         }//if
00882       }//dm2bar
00883     }//sn2bar
00884 
00885     fBestDm2 = 2.38;
00886     fBestSn2 = 1.0;
00887     fBestDm2Bar = bestdm2bar;
00888     fBestSn2Bar = bestsn2bar;
00889   }
00890 
00891   vector<Double_t> vBestFit;
00892   vBestFit.push_back(fBestDm2);
00893   vBestFit.push_back(fBestSn2);
00894   vBestFit.push_back(fBestDm2Bar);
00895   vBestFit.push_back(fBestSn2Bar);
00896   this->FillCPTFDPrediction(vBestFit);
00897   if (fwriteOutput){
00898     fOutputFile->cd();
00899     fhFDMCRecoENuMuCC->Write("BestFitFDMCRecoENuMuCC");
00900     fhFDMCRecoENuMuBarCC->Write("BestFitFDMCRecoENuMuBarCC");
00901   }
00902 
00903 
00904 
00905   
00906 //   ROOT::Minuit2::MnUserParameters mnPars;
00907 //   mnPars.Add("Dm2",0.003,0.2,0.0e-3,10.0e-3);
00908 //   mnPars.Add("Sn2",1.0,0.2,0.0,2.0);
00909 //   mnPars.Add("Dm2Bar",0.003,0.2,4.0e-3,8.0e-3);
00910 //   mnPars.Add("Sn2Bar",1.0,0.2,0.4,1.6);
00911 //   ROOT::Minuit2::MnMigrad mnMigrad(*this,mnPars);
00912 //   cout << "Beginning second fit" << endl;
00913 //   ROOT::Minuit2::FunctionMinimum funcMin = mnMigrad();
00914 //   cout << "Function minimum is " << funcMin.UserParameters().Parameters()[2].Value() << ", " << funcMin.UserParameters().Parameters()[3].Value() << endl;
00915   
00916 //   ROOT::Minuit2::FCNBase& fcnBase = *this;
00917 //   ROOT::Minuit2::MnContours contours(fcnBase,funcMin);
00918 //   this->SetErrorDef(4);
00919 //   ContoursError contErr = contours.Contour(2,3,20);
00920 //   //  cout << contErr << endl;
00921 //   cout << "Contour:" << endl;
00922 
00923 //   std::vector<std::pair<Double_t,Double_t> > vContPoints = contErr();
00924 
00925 //   Double_t* x = new Double_t[vContPoints.size()];
00926 //   for (UInt_t pointCount = 0; pointCount<vContPoints.size(); ++pointCount){
00927 //     x[pointCount] = vContPoints[pointCount].first;
00928 //   }
00929 //   Double_t* y = new Double_t[vContPoints.size()];
00930 //   for (UInt_t pointCount = 0; pointCount<vContPoints.size(); ++pointCount){
00931 //     y[pointCount] = vContPoints[pointCount].second;
00932 //   }
00933 //   TGraph* gCont = new TGraph(vContPoints.size(),y,x);
00934 //   TCanvas* cCont;
00935 //   gCont->Draw("AL");
00936   //  cout << contours << endl;
00937 
00938   /*
00939   TGraph2DErrors* gConf = new TGraph2DErrors(100);
00940   fFitter->FixParameter(0);
00941   fFitter->FixParameter(1);
00942   fFitter->GetFitter()->GetConfidenceIntervals(gConf,0.66);
00943   if (fwriteOutput){
00944     fOutputFile->cd();
00945     gConf->Write("OneSigmaContour");
00946   }
00947   */
00948 }
00949 
00950 //____________________________________________________________________72
00951 void NuXFitAnalysis::TransitionAnalysis(const Double_t dm2,
00952                                         const Double_t sn2)
00953 {
00954   fanalysisSetting = NuXFit::kTransition;
00955   fdm2 = dm2;
00956   fsn2 = sn2;
00957 
00958   if (!this->CacheFDMCEvents()){return;}
00959   if (!this->FillFDDataHistograms()){return;}
00960 
00961   if (!fdoGridSearch){
00962     this->SetupPars();
00963     
00964     fFitter->Minimize();
00965     fFitter->PrintResults(0,0);
00966     
00967     fBestTransitionProb = fFitter->GetParameter(0);
00968   }
00969 
00970   if (fdoGridSearch){
00971     Double_t bestChi2 = 1.0e10;
00972     Double_t bestTransitionProb = 0.0;
00973     
00974     Double_t transitionProbLow = 0.0;
00975     Double_t transitionProbHigh = 1.0;
00976     Double_t transitionProbGranularity = 0.05;
00977     
00978     //Create the chi2 histogram
00979     Int_t numTransitionProbBins =
00980       (Int_t) round((transitionProbHigh-transitionProbLow)/
00981                     transitionProbGranularity) + 1;
00982     TH1D hChi2Trans("hChi2Trans",
00983                     "",
00984                     numTransitionProbBins,
00985                     transitionProbLow-transitionProbGranularity/2.0,
00986                     transitionProbHigh+transitionProbGranularity/2.0);
00987     for (Double_t transitionProb = transitionProbLow;
00988          transitionProb <= transitionProbHigh+transitionProbGranularity/2.0;
00989          transitionProb += transitionProbGranularity){
00990       MSG("NuMatrixFitter.cxx",Msg::kInfo)
00991         << "Fitting transitionProb = " << transitionProb << endl;
00992 
00993       vector<Double_t> vParams;
00994       vParams.push_back(transitionProb);
00995       this->FillTransitionFDPrediction(vParams);
00996       
00997       Double_t chi2 = this->CalculateLikelihood(fhFDMCRecoENuMuBarCC,
00998                                                 fhFDDataRecoENuMuBarCC);
00999       
01000       Int_t xBin = hChi2Trans.GetXaxis()->FindBin(transitionProb);
01001       hChi2Trans.SetBinContent(xBin,chi2);
01002       if (chi2 < bestChi2){
01003         bestChi2 = chi2;
01004         bestTransitionProb = transitionProb;
01005       }
01006     } //transitionProb
01007     fBestTransitionProb = bestTransitionProb;
01008   }
01009   
01010   vector<Double_t> vBestFit;
01011   vBestFit.push_back(fBestTransitionProb);
01012   this->FillTransitionFDPrediction(vBestFit);
01013   if (fwriteOutput){
01014     fOutputFile->cd();
01015     fhFDMCRecoENuMuCC->Write("BestFitFDMCRecoENuMuCC");
01016     fhFDMCRecoENuMuBarCC->Write("BestFitFDMCRecoENuMuBarCC");
01017   }
01018 }
01019 
01020 //____________________________________________________________________72
01021 void NuXFitAnalysis::SetupPars()
01022 {
01023   if (NuXFit::kCPT == fanalysisSetting){
01024     this->SetupCPTPars();
01025     return;
01026   }
01027   else if (NuXFit::kTransition == fanalysisSetting){
01028     this->SetupTransitionPars();
01029     return;
01030   }
01031   else{
01032     MSG("NuXFitAnalysis.cxx",Msg::kFatal)
01033       << "Incorrect analysis setting" << endl;
01034     return;
01035   }
01036 }
01037 
01038 //____________________________________________________________________72
01039 void NuXFitAnalysis::SetupCPTPars()
01040 {
01041   fFitter->SetParameter(0,
01042                         "Dm2",
01043                         0.00238,0.2,1.0,0.0);
01044   fFitter->SetParameter(1,
01045                         "Sn2",
01046                         1.0,0.2,1.0,0.0);
01047   fFitter->SetParameter(2,
01048                         "Dm2Bar",
01049                         0.00238,0.2,1.0,0.0);
01050   fFitter->SetParameter(3,
01051                         "Sn2Bar",
01052                         1.0,0.2,1.0,0.0);
01053 }
01054 
01055 //____________________________________________________________________72
01056 void NuXFitAnalysis::SetupTransitionPars()
01057 {
01058   //Get cross-sections
01059   TFile *xsecfile = new TFile(fxsecfilename.c_str(),"READ");
01060 
01061   if (fNuMuCCCrossSectionGraph){
01062     delete fNuMuCCCrossSectionGraph;
01063     fNuMuCCCrossSectionGraph = 0;
01064   }
01065   if (fhNuMuCCCrossSections){
01066     delete fhNuMuCCCrossSections;
01067     fhNuMuCCCrossSections = 0;
01068   }
01069   TH1F* XSec_CC = (TH1F*) xsecfile->Get("h_numu_cc_tot");
01070   fhNuMuCCCrossSections = new TH1F(*XSec_CC);
01071   fhNuMuCCCrossSections->SetDirectory(0);
01072   Float_t *x = new Float_t[XSec_CC->GetNbinsX()];
01073   Float_t *y = new Float_t[XSec_CC->GetNbinsX()];
01074   for(int i=0;i<XSec_CC->GetNbinsX();i++) {
01075     x[i] = XSec_CC->GetBinCenter(i+1);
01076     y[i] = XSec_CC->GetBinContent(i+1);
01077   }
01078   fNuMuCCCrossSectionGraph = new TGraph(XSec_CC->GetNbinsX(),x,y);
01079   if (x) {delete[] x; x = 0;}
01080   if (y) {delete[] y; y = 0;}
01081 
01082   if (fNuBarCCCrossSectionGraph){
01083     delete fNuBarCCCrossSectionGraph;
01084     fNuBarCCCrossSectionGraph = 0;
01085   }
01086   if (fhNuBarCCCrossSections){
01087     delete fhNuBarCCCrossSections;
01088     fhNuBarCCCrossSections = 0;
01089   }
01090   XSec_CC = (TH1F*) xsecfile->Get("h_numubar_cc_tot");
01091   fhNuBarCCCrossSections = new TH1F(*XSec_CC);
01092   fhNuBarCCCrossSections->SetDirectory(0);
01093   x = new Float_t[XSec_CC->GetNbinsX()];
01094   y = new Float_t[XSec_CC->GetNbinsX()];
01095   for(int i=0;i<XSec_CC->GetNbinsX();i++) {
01096     x[i] = XSec_CC->GetBinCenter(i+1);
01097     y[i] = XSec_CC->GetBinContent(i+1);
01098   }
01099   fNuBarCCCrossSectionGraph = new TGraph(XSec_CC->GetNbinsX(),x,y);
01100   if (x) {delete[] x; x = 0;}
01101   if (y) {delete[] y; y = 0;}
01102   
01103   xsecfile->Close();
01104   if (xsecfile){delete xsecfile; xsecfile = 0;}
01105   
01106   //Get selection efficiencies
01107   TFile* selEffFile = new TFile(fSelEffFileName.c_str(),"READ");
01108 
01109   if (fhNuBarCCSelectionEfficiency){
01110     delete fhNuBarCCSelectionEfficiency;
01111     fhNuBarCCSelectionEfficiency = 0;
01112   }
01113   fhNuBarCCSelectionEfficiency = (TH1D*) selEffFile->Get("EfficiencyPQ_FD");
01114   fhNuBarCCSelectionEfficiency->SetDirectory(0);
01115 
01116   if (fhNuMuCCSelectionEfficiency){
01117     delete fhNuMuCCSelectionEfficiency;
01118     fhNuMuCCSelectionEfficiency = 0;
01119   }
01120   fhNuMuCCSelectionEfficiency = (TH1D*) selEffFile->Get("Efficiency_FD");
01121   fhNuMuCCSelectionEfficiency->SetDirectory(0);
01122 
01123   selEffFile->Close();
01124   if (selEffFile){delete selEffFile; selEffFile = 0;}
01125 
01126   //Setup fit parameters
01127   fFitter->SetParameter(0,
01128                         "transitionProb",
01129                         0.0,0.2,1.0,0.0);
01130 }
01131 
01132 //____________________________________________________________________72
01133 const Bool_t NuXFitAnalysis::FillFDDataHistograms()
01134 {
01135   //Preferentially take data from histograms if they've been supplied
01136   if (fhFDNuMuCCDataFromFile && fhFDNuMuBarCCDataFromFile){
01137     if (fhFDDataRecoENuMuCC){
01138       delete fhFDDataRecoENuMuCC; fhFDDataRecoENuMuCC = 0;
01139     }
01140     if (fhFDDataRecoENuMuBarCC){
01141       delete fhFDDataRecoENuMuBarCC; fhFDDataRecoENuMuBarCC = 0;
01142     }
01143     fhFDDataRecoENuMuCC = new TH1D(*fhFDNuMuCCDataFromFile);
01144     fhFDDataRecoENuMuBarCC = new TH1D(*fhFDNuMuBarCCDataFromFile);
01145 
01146     if (fwriteOutput){
01147       fOutputFile->cd();
01148       fhFDDataRecoENuMuCC->Write("InputFDNuMuCCData");
01149       fhFDDataRecoENuMuBarCC->Write("InputFDNuMuBarCCData");
01150     }
01151     return true;
01152   }
01153 
01154   if (!fhFDDataRecoENuMuCC){
01155     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
01156       << "FD numu data histogram not created"
01157       << endl;
01158     return false;
01159   }
01160   if (!fhFDDataRecoENuMuBarCC){
01161     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
01162       << "FD numubar data histogram not created"
01163       << endl;
01164     return false;
01165   }
01166   if (!ftFDDataTree){
01167     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
01168       << "FD data not supplied"
01169       << endl;
01170     return false;
01171   }
01172 
01173   fhFDDataRecoENuMuCC->Reset();
01174   fhFDDataRecoENuMuBarCC->Reset();
01175   
01176   Double_t Sn2 = 1.0;
01177   Double_t Sn2Bar = 1.0;
01178   Double_t Dm2 = 0.003;
01179   Double_t Dm2Bar = 0.003;
01180   /*
01181   Double_t Sn2 = 0.0;
01182   Double_t Sn2Bar = 0.0;
01183   Double_t Dm2 = 0.0;
01184   Double_t Dm2Bar = 0.0;
01185   */
01186   MSG("NuXFitAnalysis.cxx",Msg::kInfo)
01187     << "Looping over FD data:"
01188     << endl;
01189   Int_t dataEntries = ftFDDataTree->GetEntries();
01190   for (Int_t counter = 0;
01191        counter < dataEntries;
01192        ++counter){
01193     if (!(counter%10000)){
01194       MSG("NuXFitAnalysis.cxx",Msg::kInfo)
01195         << counter << " of " << dataEntries
01196         << endl;
01197     }
01198     NuEvent currentEvent = ftFDDataTree->GetInfoObject(counter);
01199     NuSelectionResult_t recoType = this->SelectedAs(currentEvent);
01200     Double_t recoEnergy = currentEvent.energy;
01201     Double_t nuweight = 1.0;
01202     nuweight *= currentEvent.rw;
01203     
01204     //Fake oscillations
01205     Double_t thisSn2 = 0.0;
01206     Double_t thisDm2 = 0.0;
01207     if (1==currentEvent.iaction){
01208       if (-14==currentEvent.inu){
01209         thisSn2 = Sn2Bar;
01210         thisDm2 = Dm2Bar;
01211       }
01212       if (14==currentEvent.inu){
01213         thisSn2 = Sn2;
01214         thisDm2 = Dm2;
01215       }
01216     }
01217     Double_t oscweight = NuUtilities::OscillationWeight(currentEvent.neuEnMC,
01218                                                         thisDm2, thisSn2);
01219     nuweight *= oscweight;
01220     
01221     if (recoType==NuXSecFit::kCCNuMu){
01222       fhFDDataRecoENuMuCC->Fill(recoEnergy,nuweight);
01223     }
01224     if (recoType==NuXSecFit::kCCNuMuBar){
01225       fhFDDataRecoENuMuBarCC->Fill(recoEnergy,nuweight);
01226     }
01227   }
01228 
01229   if (fwriteOutput){
01230     fOutputFile->cd();
01231     fhFDDataRecoENuMuCC->Write("InputFDNuMuCCData");
01232     fhFDDataRecoENuMuBarCC->Write("InputFDNuMuBarCCData");
01233   }
01234 
01235   return true;
01236 }
01237 
01238 //____________________________________________________________________72
01239 const Bool_t NuXFitAnalysis::CacheFDMCEvents()
01240 {
01241   if (!ftFDMCTree){
01242     MSG("NuXFitAnalysis.cxx",Msg::kWarning)
01243       << "FD MC not supplied"
01244       << endl;
01245     return false;
01246   }
01247 
01248   TH1D hFDRawMCRecoECCNuMuBar(*fhFDDataRecoENuMuBarCC);
01249   TH1D hFDRawMCRecoECCNuMu(*fhFDDataRecoENuMuCC);
01250   TH1D hFDNoOscPredRecoECCNuMuBar(*fhFDDataRecoENuMuBarCC);
01251   TH1D hFDNoOscPredRecoECCNuMu(*fhFDDataRecoENuMuCC);
01252 
01253   fvFDMCCCNuMuEvents.clear();
01254   fvFDMCCCNuMuBarEvents.clear();
01255 
01256   MSG("NuXFitAnalysis.cxx",Msg::kInfo)
01257     << "Looping over FD MC:"
01258     << endl;
01259   Int_t mcEntries = ftFDMCTree->GetEntries();
01260   for (Int_t counter = 0;
01261        counter < mcEntries;
01262        ++counter){
01263     if (!(counter%10000)){
01264       MSG("NuXFitAnalysis.cxx",Msg::kInfo)
01265         << counter << " of " << mcEntries
01266         << endl;
01267     }
01268     NuEvent currentEvent = ftFDMCTree->GetInfoObject(counter);
01269     fnuSystematic->Shift(currentEvent);
01270     NuSelectionResult_t recoType = this->SelectedAs(currentEvent);
01271     Double_t eventWeight = currentEvent.rw;
01272 
01273     Int_t truthpar = this->TruthIndex(currentEvent);
01274     Double_t eventWeightPred = eventWeight;
01275     if (truthpar>=0){
01276       eventWeightPred *= fvNDFitPars[truthpar];
01277     }
01278 
01279     if (NuXSecFit::kCCNuMu==recoType){
01280       fvFDMCCCNuMuEvents.push_back(currentEvent);
01281       hFDRawMCRecoECCNuMu.Fill(currentEvent.energy,eventWeight);
01282       hFDNoOscPredRecoECCNuMu.Fill(currentEvent.energy,eventWeightPred);
01283     }
01284     if (NuXSecFit::kCCNuMuBar==recoType){
01285       fvFDMCCCNuMuBarEvents.push_back(currentEvent);
01286       hFDRawMCRecoECCNuMuBar.Fill(currentEvent.energy,eventWeight);
01287       hFDNoOscPredRecoECCNuMuBar.Fill(currentEvent.energy,eventWeightPred);
01288     }
01289   }
01290   
01291   if (ffdMCPoT){
01292     hFDNoOscPredRecoECCNuMu.Scale(ffdDataPoT/ffdMCPoT);
01293     hFDNoOscPredRecoECCNuMuBar.Scale(ffdDataPoT/ffdMCPoT);
01294     hFDRawMCRecoECCNuMu.Scale(ffdDataPoT/ffdMCPoT);
01295     hFDRawMCRecoECCNuMuBar.Scale(ffdDataPoT/ffdMCPoT);
01296   }
01297   
01298   if (fwriteOutput){
01299     fOutputFile->cd();
01300     hFDNoOscPredRecoECCNuMu.Write("NoOscPredRecoECCNuMu");
01301     hFDNoOscPredRecoECCNuMuBar.Write("NoOscPredRecoECCNuMuBar");
01302     hFDRawMCRecoECCNuMu.Write("RawMCRecoECCNuMu");
01303     hFDRawMCRecoECCNuMuBar.Write("RawMCRecoECCNuMuBar");
01304   }
01305 
01306   return true;
01307 }
01308 
01309 //____________________________________________________________________72
01310 const NuSelectionResult_t
01311 NuXFitAnalysis::SelectedAs(NuEvent& nuEvent) const
01312 {
01313   NuCuts nuCuts;
01314   nuEvent.anaVersion = this->SelectionScheme();
01315   
01316   //cut on LI
01317   if (nuCuts.IsLI(nuEvent)) return NuXSecFit::kUnknown;
01318   //cut on the data quality
01319   if (!nuCuts.IsGoodDataQuality(nuEvent)) return NuXSecFit::kUnknown;
01320   //cut on the spill time
01321   if (!nuCuts.IsGoodTimeToNearestSpill(nuEvent)) return NuXSecFit::kUnknown;
01322   //cut on the beam
01323   if (!nuCuts.IsGoodBeam(nuEvent)) return NuXSecFit::kUnknown;
01324   
01325   //cut on whether event vtx is in fid vol (does nothing for CC ana)
01326   //    if (!nuCuts.IsInFidVol(evt,nu)) continue;
01327   //ensure good number of tracks in event (note preselection above)
01328   if (!nuCuts.IsGoodNumberOfTracks(nuEvent)) return NuXSecFit::kUnknown;
01329   //check trk is in fiducial volume (note preselection above)
01330   if (!nuCuts.IsInFidVolTrk(nuEvent)) return NuXSecFit::kUnknown;
01331   
01332   //require a good trk fit
01333   if (!nuCuts.IsGoodTrackFitPass(nuEvent)) return NuXSecFit::kUnknown;
01334   //require a forward going neutrino about beam direction
01335   if (!nuCuts.IsGoodDirCos(nuEvent)) return NuXSecFit::kUnknown;
01336   
01337   //cut on the PID
01338   if (!nuCuts.IsGoodPID(nuEvent)) {
01339     return NuXSecFit::kUnknown;
01340   }
01341   //cut on the fractional track momentum and sign error      
01342   if (!nuCuts.IsGoodSigmaQP_QP(nuEvent)) {
01343     return NuXSecFit::kUnknown;
01344   }
01345   //cut on the track fit probability      
01346   if (!nuCuts.IsGoodFitProb(nuEvent)) {
01347     return NuXSecFit::kUnknown;
01348   }
01349   if (!nuCuts.IsGoodMajorityCurvature(nuEvent)){
01350     return NuXSecFit::kUnknown;
01351   }
01352   
01353   if (-1==nuEvent.charge){return NuXSecFit::kCCNuMu;}
01354   if (1==nuEvent.charge){return NuXSecFit::kCCNuMuBar;}
01355   return NuXSecFit::kUnknown;
01356 }

Generated on Mon Feb 15 11:07:17 2010 for loon by  doxygen 1.3.9.1