00001 #include <string>
00002
00003 #include "TFile.h"
00004 #include "TGraph.h"
00005 #include "TH1D.h"
00006 #include "TH2D.h"
00007 #include "TF1.h"
00008
00009 #include "MessageService/MsgService.h"
00010 #include "NtupleUtils/NuMMHelperCPT.h"
00011
00012 ClassImp(NuMMHelperCPT)
00013
00014 CVSID("$Id: NuMMHelperCPT.cxx,v 1.8 2009/10/15 16:40:55 ahimmel Exp $");
00015
00016
00017 NuMMHelperCPT::NuMMHelperCPT() : doTaus(false)
00018 {
00019 }
00020
00021
00022 NuMMHelperCPT::NuMMHelperCPT(const char * helperFilename,
00023 const char * xSecFilename)
00024 {
00025 Construct(helperFilename, xSecFilename);
00026 }
00027
00028
00029 NuMMHelperCPT::NuMMHelperCPT(const std::string helperFilename,
00030 const std::string xSecFilename)
00031 {
00032 Construct(helperFilename.c_str(), xSecFilename.c_str());
00033 }
00034
00035
00036 void NuMMHelperCPT::Construct(const char * helperFilename,
00037 const char * xSecFilename)
00038 {
00039 TFile helperFile(helperFilename,"READ");
00040
00041 fRecoVsTrueEnergy_ND = (TH2D*) helperFile.Get("RecoVsTrueEnergy_ND");
00042 fRecoVsTrueEnergy_ND->SetDirectory(0);
00043 fRecoVsTrueEnergy_FD = (TH2D*) helperFile.Get("RecoVsTrueEnergy_FD");
00044 fRecoVsTrueEnergy_FD->SetDirectory(0);
00045
00046 fFDVsNDMatrixRW = (TH2D*) helperFile.Get("FDVsNDMatrixRW");
00047 if(fFDVsNDMatrixRW) fFDVsNDMatrixRW->SetDirectory(0);
00048
00049 fEfficiency_ND = (TH1D*) helperFile.Get("Efficiency_ND");
00050 fEfficiency_ND->SetDirectory(0);
00051 fEfficiency_FD = (TH1D*) helperFile.Get("Efficiency_FD");
00052 fEfficiency_FD->SetDirectory(0);
00053
00054 fPurity_ND = (TH1D*) helperFile.Get("Purity_ND");
00055 fPurity_ND->SetDirectory(0);
00056 fPurity_FD = (TH1D*) helperFile.Get("Purity_FD");
00057 fPurity_FD->SetDirectory(0);
00058
00059 fNCContamination_FD = (TH1D*) helperFile.Get("NCContamination_FD");
00060 fNCContamination_FD->SetDirectory(0);
00061 fRecoVsTrueCCContamination_FD = (TH2D*)
00062 helperFile.Get("CCContaminationRecoVsTrue_FD");
00063 fRecoVsTrueCCContamination_FD->SetDirectory(0);
00064 fOtherEfficiency_FD = (TH1D*)
00065 helperFile.Get("OtherEfficiency_FD");
00066 fOtherEfficiency_FD->SetDirectory(0);
00067
00068
00069 fRecoVsTrueEnergyPQ_ND = (TH2D*) helperFile.Get("RecoVsTrueEnergyPQ_ND");
00070 fRecoVsTrueEnergyPQ_ND->SetDirectory(0);
00071 fRecoVsTrueEnergyPQ_FD = (TH2D*) helperFile.Get("RecoVsTrueEnergyPQ_FD");
00072 fRecoVsTrueEnergyPQ_FD->SetDirectory(0);
00073
00074 fFDVsNDMatrixRWBar = (TH2D*) helperFile.Get("FDVsNDMatrixRWPQ");
00075 if(fFDVsNDMatrixRWBar) fFDVsNDMatrixRWBar->SetDirectory(0);
00076
00077 fEfficiencyPQ_ND = (TH1D*) helperFile.Get("EfficiencyPQ_ND");
00078 fEfficiencyPQ_ND->SetDirectory(0);
00079 fEfficiencyPQ_FD = (TH1D*) helperFile.Get("EfficiencyPQ_FD");
00080 fEfficiencyPQ_FD->SetDirectory(0);
00081
00082 fPurityPQ_ND = (TH1D*) helperFile.Get("PurityPQ_ND");
00083 fPurityPQ_ND->SetDirectory(0);
00084 fPurityPQ_FD = (TH1D*) helperFile.Get("PurityPQ_FD");
00085 fPurityPQ_FD->SetDirectory(0);
00086
00087 fNCContaminationPQ_FD = (TH1D*) helperFile.Get("NCContaminationPQ_FD");
00088 fNCContaminationPQ_FD->SetDirectory(0);
00089 fRecoVsTrueCCContaminationPQ_FD = (TH2D*)
00090 helperFile.Get("CCContaminationRecoVsTruePQ_FD");
00091 fRecoVsTrueCCContaminationPQ_FD->SetDirectory(0);
00092 fOtherEfficiencyPQ_FD = (TH1D*)
00093 helperFile.Get("OtherEfficiencyPQ_FD");
00094 fOtherEfficiencyPQ_FD->SetDirectory(0);
00095
00096
00097 fEfficiencyTau_FD = (TH1D*) helperFile.Get("EfficiencyTau_FD");
00098 if (!fEfficiencyTau_FD) doTaus = false;
00099 else doTaus = true;
00100 if (doTaus) {
00101 fEfficiencyTau_FD->SetDirectory(0);
00102 fRecoVsTrueEnergyTau_FD = (TH2D*)
00103 helperFile.Get("RecoVsTrueEnergyTau_FD");
00104 fRecoVsTrueEnergyTau_FD->SetDirectory(0);
00105
00106
00107 fEfficiencyTauPQ_FD = (TH1D*) helperFile.Get("EfficiencyTauPQ_FD");
00108 fEfficiencyTauPQ_FD->SetDirectory(0);
00109 fRecoVsTrueEnergyTauPQ_FD = (TH2D*)
00110 helperFile.Get("RecoVsTrueEnergyTauPQ_FD");
00111 fRecoVsTrueEnergyTauPQ_FD->SetDirectory(0);
00112 }
00113
00114 helperFile.Close();
00115
00116
00117 TFile *xsecfile = new TFile(xSecFilename,"READ");
00118 TH1F* XSec_CC = (TH1F*) xsecfile->Get("h_numu_cc_tot");
00119 XSec_CC->SetDirectory(0);
00120 xsecfile->Close();
00121 if (xsecfile){delete xsecfile; xsecfile = 0;}
00122 Float_t *x = new Float_t[XSec_CC->GetNbinsX()];
00123 Float_t *y = new Float_t[XSec_CC->GetNbinsX()];
00124 for(int i=0;i<XSec_CC->GetNbinsX();i++) {
00125 x[i] = XSec_CC->GetBinCenter(i+1);
00126 y[i] = XSec_CC->GetBinContent(i+1);
00127 }
00128 fXSec_CC_Graph = new TGraph(XSec_CC->GetNbinsX(),x,y);
00129 if (x) {delete[] x; x = 0;}
00130 if (y) {delete[] y; y = 0;}
00131
00132
00133 xsecfile = new TFile(xSecFilename,"READ");
00134 TH1F* XSec_CCBar = (TH1F*) xsecfile->Get("h_numubar_cc_tot");
00135 XSec_CCBar->SetDirectory(0);
00136 xsecfile->Close();
00137 if (xsecfile){delete xsecfile; xsecfile = 0;}
00138 x = new Float_t[XSec_CCBar->GetNbinsX()];
00139 y = new Float_t[XSec_CCBar->GetNbinsX()];
00140 for(int i=0;i<XSec_CCBar->GetNbinsX();i++) {
00141 x[i] = XSec_CCBar->GetBinCenter(i+1);
00142 y[i] = XSec_CCBar->GetBinContent(i+1);
00143 }
00144 fXSec_CCBar_Graph = new TGraph(XSec_CCBar->GetNbinsX(),x,y);
00145 if (x) {delete[] x; x = 0;}
00146 if (y) {delete[] y; y = 0;}
00147
00148 if (doTaus) {
00149
00150 xsecfile = new TFile(xSecFilename,"READ");
00151 TH1F* tau_XSec_CC = (TH1F*) xsecfile->Get("h_nutau_cc_tot");
00152 tau_XSec_CC->SetDirectory(0);
00153 xsecfile->Close();
00154 if (xsecfile){delete xsecfile; xsecfile = 0;}
00155 x = new Float_t[tau_XSec_CC->GetNbinsX()];
00156 y = new Float_t[tau_XSec_CC->GetNbinsX()];
00157 for(int i=0;i<tau_XSec_CC->GetNbinsX();i++) {
00158 x[i] = tau_XSec_CC->GetBinCenter(i+1);
00159 y[i] = tau_XSec_CC->GetBinContent(i+1);
00160 }
00161 fTau_XSec_CC_Graph = new TGraph(tau_XSec_CC->GetNbinsX(),x,y);
00162 if (x) {delete[] x; x = 0;}
00163 if (y) {delete[] y; y = 0;}
00164
00165
00166 xsecfile = new TFile(xSecFilename,"READ");
00167 TH1F* taubar_XSec_CC = (TH1F*) xsecfile->Get("h_nutaubar_cc_tot");
00168 taubar_XSec_CC->SetDirectory(0);
00169 xsecfile->Close();
00170 if (xsecfile){delete xsecfile; xsecfile = 0;}
00171 x = new Float_t[taubar_XSec_CC->GetNbinsX()];
00172 y = new Float_t[taubar_XSec_CC->GetNbinsX()];
00173 for(int i=0;i<taubar_XSec_CC->GetNbinsX();i++) {
00174 x[i] = taubar_XSec_CC->GetBinCenter(i+1);
00175 y[i] = taubar_XSec_CC->GetBinContent(i+1);
00176 }
00177 fTauBar_XSec_CC_Graph = new TGraph(taubar_XSec_CC->GetNbinsX(),x,y);
00178 if (x) {delete[] x; x = 0;}
00179 if (y) {delete[] y; y = 0;}
00180 }
00181
00182 if (fRecoVsTrueCCContamination_FD){
00183
00184
00185 for (Int_t i=1; i<=fRecoVsTrueCCContamination_FD->GetNbinsX()+1; ++i){
00186
00187 Double_t trueEvents = 0.0;
00188 for (Int_t j=1; j<=fRecoVsTrueCCContamination_FD->GetNbinsY()+1; ++j){
00189 trueEvents += fRecoVsTrueCCContamination_FD->GetBinContent(i,j);
00190 }
00191
00192 for (Int_t j=1; j<=fRecoVsTrueCCContamination_FD->GetNbinsY()+1; ++j){
00193 if (trueEvents>0){
00194 Double_t oldContent =
00195 fRecoVsTrueCCContamination_FD->GetBinContent(i,j);
00196 Double_t oldError =
00197 fRecoVsTrueCCContamination_FD->GetBinError(i,j);
00198 fRecoVsTrueCCContamination_FD->SetBinContent
00199 (i,j,oldContent/trueEvents);
00200 fRecoVsTrueCCContamination_FD->SetBinError
00201 (i,j,oldError/trueEvents);
00202 }
00203 else{
00204 fRecoVsTrueCCContamination_FD->SetBinContent(i,j,0);
00205
00206 fRecoVsTrueCCContamination_FD->SetBinError(i,j,0);
00207 }
00208 }
00209 }
00210 }
00211
00212 if (fRecoVsTrueCCContaminationPQ_FD){
00213
00214
00215 for (Int_t i=1; i<=fRecoVsTrueCCContaminationPQ_FD->GetNbinsX()+1; ++i){
00216
00217 Double_t trueEvents = 0.0;
00218 for (Int_t j=1; j<=fRecoVsTrueCCContaminationPQ_FD->GetNbinsY()+1; ++j){
00219 trueEvents += fRecoVsTrueCCContaminationPQ_FD->GetBinContent(i,j);
00220 }
00221
00222 for (Int_t j=1; j<=fRecoVsTrueCCContaminationPQ_FD->GetNbinsY()+1; ++j){
00223 if (trueEvents>0){
00224 Double_t oldContent =
00225 fRecoVsTrueCCContaminationPQ_FD->GetBinContent(i,j);
00226 Double_t oldError =
00227 fRecoVsTrueCCContaminationPQ_FD->GetBinError(i,j);
00228 fRecoVsTrueCCContaminationPQ_FD->SetBinContent
00229 (i,j,oldContent/trueEvents);
00230 fRecoVsTrueCCContaminationPQ_FD->SetBinError
00231 (i,j,oldError/trueEvents);
00232 }
00233 else{
00234 fRecoVsTrueCCContaminationPQ_FD->SetBinContent(i,j,0);
00235
00236 fRecoVsTrueCCContaminationPQ_FD->SetBinError(i,j,0);
00237 }
00238 }
00239 }
00240 }
00241
00242 TF1 *xsec_func = new TF1("xsec_func","[5]*(-[1]+([0]-1.+2.*(1.-[0])*x/25+([0]-1.)*x*x/(25*25))*(x<25)+([4]*([2]-x)^3+[3]*([2]-x)^2)*(x<[2]))",0,50);
00243 xsec_func->SetParameter(0, 0.895);
00244 xsec_func->SetParameter(1, 0.0617);
00245
00246 xsec_func->SetParameter(2, 4.0);
00247 xsec_func->SetParameter(3, 7.59e-3);
00248 xsec_func->SetParameter(4, -8.05e-4);
00249
00250 xsec_func->SetParameter(5, 0);
00251 fXSec_CCBar_Graph_orig = 0;
00252 }
00253
00254
00255 void NuMMHelperCPT::OverrideNuBeamMatrix(const TH2D* beamMatrix)
00256 {
00257 if (fFDVsNDMatrixRW){delete fFDVsNDMatrixRW; fFDVsNDMatrixRW=0;}
00258 fFDVsNDMatrixRW = new TH2D(*beamMatrix);
00259 }
00260
00261
00262 void NuMMHelperCPT::OverrideBarBeamMatrix(const TH2D* beamMatrix)
00263 {
00264 if (fFDVsNDMatrixRWBar)
00265 {delete fFDVsNDMatrixRWBar; fFDVsNDMatrixRWBar=0;}
00266 fFDVsNDMatrixRWBar = new TH2D(*beamMatrix);
00267 }
00268
00269
00270
00271
00272 void NuMMHelperCPT::ShiftBarXSecGraph(double scale)
00273 {
00274 if (fXSec_CCBar_Graph_orig) {
00275 MAXMSG("NuMMHelperCPT",Msg::kWarning, 1) << "You did not reset the Bar xsec after modifying it. Doing so now." << endl;
00276 ResetBarXSecGraph();
00277 }
00278
00279 MAXMSG("NuMMHelperCPT",Msg::kInfo, 1) << "Making a Bar xsec backup copy." << endl;
00280
00281
00282 fXSec_CCBar_Graph_orig = fXSec_CCBar_Graph;
00283 fXSec_CCBar_Graph = new TGraph(*fXSec_CCBar_Graph);
00284
00285
00286 xsec_func->SetParameter(5, scale);
00287
00288 Double_t x, y;
00289 for (int i = 0; i < fXSec_CCBar_Graph->GetN(); ++i) {
00290 fXSec_CCBar_Graph->GetPoint(i, x, y);
00291 y *= xsec_func->Eval(x);
00292 fXSec_CCBar_Graph->SetPoint(i, x, y);
00293 }
00294 }
00295
00296
00297
00298 void NuMMHelperCPT::ResetBarXSecGraph()
00299 {
00300 if (fXSec_CCBar_Graph_orig) {
00301 MAXMSG("NuMMHelperCPT",Msg::kInfo, 1) << "Reverting Bar to backup copy." << endl;
00302
00303 delete fXSec_CCBar_Graph;
00304 fXSec_CCBar_Graph = fXSec_CCBar_Graph_orig;
00305 fXSec_CCBar_Graph_orig = 0;
00306 }
00307 else {
00308 MAXMSG("NuMMHelperCPT",Msg::kWarning, 1) << "Resetting unmodified Bars data. Not harmful, just superfluous." << endl;
00309 }
00310 }
00311