00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019
00020 #ifndef madqeid_cxx
00021 #define madqeid_cxx
00022
00023 #include "Mad/MadQEID.h"
00024 #include "Mad/NearbyEvents.h"
00025 #include "Mad/HoughTrans.h"
00026 #include "Mad/MadBase.h"
00027 #include "CandNtupleSR/NtpSREvent.h"
00028 #include <cmath>
00029 #include "TFile.h"
00030 #include "TDirectory.h"
00031 #include "TH1.h"
00032 #include "TH2.h"
00033
00034
00035 MadQEID::MadQEID()
00036 : ntrks(-1), nshows(-1), houghPeak(-1), recoWsqd(1000.0),
00037 rePHfrac(-1.0), PCAvar(-1.0), pdfs_normalised(kFALSE)
00038 {
00039
00040 for(Int_t i=0;i<18;i++){
00041 rePHfracCCQE[i] = 0;
00042 rePHfracCCR[i] = 0;
00043 rePHfracCCDIS[i] = 0;
00044 rePHfracNC[i] = 0;
00045 rePHfracBG[i] = 0;
00046 recoW2CCQE[i] = 0;
00047 recoW2CCR[i] = 0;
00048 recoW2CCDIS[i] = 0;
00049 recoW2NC[i] = 0;
00050 recoW2BG[i] = 0;
00051 ntrkCCQE[i] = 0;
00052 ntrkCCR[i] = 0;
00053 ntrkCCDIS[i] = 0;
00054 ntrkNC[i] = 0;
00055 ntrkBG[i] = 0;
00056 nshowCCQE[i] = 0;
00057 nshowCCR[i] = 0;
00058 nshowCCDIS[i] = 0;
00059 nshowNC[i] = 0;
00060 nshowBG[i] = 0;
00061 hpeakCCQE[i] = 0;
00062 hpeakCCR[i] = 0;
00063 hpeakCCDIS[i] = 0;
00064 hpeakNC[i] = 0;
00065 hpeakBG[i] = 0;
00066 PCACCQE[i] = 0;
00067 PCACCR[i] = 0;
00068 PCACCDIS[i] = 0;
00069 PCANC[i] = 0;
00070 PCABG[i] = 0;
00071 trainingHists[i] = 0;
00072 }
00073
00074 cutsHist = 0;
00075
00076 }
00077
00078
00079 void MadQEID::InitPDFs()
00080 {
00081 TH1::AddDirectory(kFALSE);
00082
00083 for(Int_t i=0;i<18;i++){
00084 char name[30];
00085 sprintf(name,"rePHfracCCQE[%d]",i);
00086 rePHfracCCQE[i] = new TH1F(name,name,25,0.0,1.0);
00087 sprintf(name,"rePHfracCCR[%d]",i);
00088 rePHfracCCR[i] = new TH1F(name,name,25,0.0,1.0);
00089 sprintf(name,"rePHfracCCDIS[%d]",i);
00090 rePHfracCCDIS[i] = new TH1F(name,name,25,0.0,1.0);
00091 sprintf(name,"rePHfracNC[%d]",i);
00092 rePHfracNC[i] = new TH1F(name,name,25,0.0,1.0);
00093 sprintf(name,"rePHfracBG[%d]",i);
00094 rePHfracBG[i] = new TH1F(name,name,25,0.0,1.0);
00095
00096 sprintf(name,"recoW2CCQE[%d]",i);
00097 recoW2CCQE[i] = new TH1F(name,name,75,-5,10);
00098 sprintf(name,"recoW2CCR[%d]",i);
00099 recoW2CCR[i] = new TH1F(name,name,75,-5,10);
00100 sprintf(name,"recoW2CCDIS[%d]",i);
00101 recoW2CCDIS[i] = new TH1F(name,name,75,-5,10);
00102 sprintf(name,"recoW2NC[%d]",i);
00103 recoW2NC[i] = new TH1F(name,name,75,-5,10);
00104 sprintf(name,"recoW2BG[%d]",i);
00105 recoW2BG[i] = new TH1F(name,name,75,-5,10);
00106
00107 sprintf(name,"ntrkCCQE[%d]",i);
00108 ntrkCCQE[i] = new TH1F(name,name,5,0,5);
00109 sprintf(name,"ntrkCCR[%d]",i);
00110 ntrkCCR[i] = new TH1F(name,name,5,0,5);
00111 sprintf(name,"ntrkCCDIS[%d]",i);
00112 ntrkCCDIS[i] = new TH1F(name,name,5,0,5);
00113 sprintf(name,"ntrkNC[%d]",i);
00114 ntrkNC[i] = new TH1F(name,name,5,0,5);
00115 sprintf(name,"ntrkBG[%d]",i);
00116 ntrkBG[i] = new TH1F(name,name,5,0,5);
00117
00118 sprintf(name,"nshowCCQE[%d]",i);
00119 nshowCCQE[i] = new TH1F(name,name,10,0,10);
00120 sprintf(name,"nshowCCR[%d]",i);
00121 nshowCCR[i] = new TH1F(name,name,10,0,10);
00122 sprintf(name,"nshowCCDIS[%d]",i);
00123 nshowCCDIS[i] = new TH1F(name,name,10,0,10);
00124 sprintf(name,"nshowNC[%d]",i);
00125 nshowNC[i] = new TH1F(name,name,10,0,10);
00126 sprintf(name,"nshowBG[%d]",i);
00127 nshowBG[i] = new TH1F(name,name,10,0,10);
00128
00129 sprintf(name,"hpeakCCQE[%d]",i);
00130 hpeakCCQE[i] = new TH1F(name,name,25,0,50);
00131 sprintf(name,"hpeakCCR[%d]",i);
00132 hpeakCCR[i] = new TH1F(name,name,25,0,50);
00133 sprintf(name,"hpeakCCDIS[%d]",i);
00134 hpeakCCDIS[i] = new TH1F(name,name,25,0,50);
00135 sprintf(name,"hpeakNC[%d]",i);
00136 hpeakNC[i] = new TH1F(name,name,25,0,50);
00137 sprintf(name,"hpeakBG[%d]",i);
00138 hpeakBG[i] = new TH1F(name,name,25,0,50);
00139
00140 sprintf(name,"PCACCQE[%d]",i);
00141 PCACCQE[i] = new TH1F(name,name,25,0,100000);
00142 sprintf(name,"PCACCR[%d]",i);
00143 PCACCR[i] = new TH1F(name,name,25,0,100000);
00144 sprintf(name,"PCACCDIS[%d]",i);
00145 PCACCDIS[i] = new TH1F(name,name,25,0,100000);
00146 sprintf(name,"PCANC[%d]",i);
00147 PCANC[i] = new TH1F(name,name,25,0,100000);
00148 sprintf(name,"PCABG[%d]",i);
00149 PCABG[i] = new TH1F(name,name,25,0,100000);
00150
00151 }
00152
00153 TH1::AddDirectory(kTRUE);
00154 }
00155
00156
00157 void MadQEID::InitTrainingHists()
00158 {
00159 for(Int_t i=0;i<18;i++){
00160 trainingHists[i] = 0;
00161 }
00162 TH1::AddDirectory(kFALSE);
00163 for(Int_t i=0;i<18;i++){
00164 char name[30];
00165 sprintf(name,"trainingHists[%d]",i);
00166 trainingHists[i] = new TH1F(name,name,1200,-6.0,6.0);
00167 }
00168 Float_t axarray[19] = {0.0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,
00169 5.0,6.0,7.0,8.0,10.0,12.0,14.0,17.0,20.0};
00170 cutsHist = new TH1F("cuthist","cuthist",18,axarray);
00171 TH1::AddDirectory(kTRUE);
00172 }
00173
00174
00175
00176
00177 void MadQEID::ResetPDFs()
00178 {
00179 for(Int_t i=0;i<18;i++){
00180 rePHfracCCQE[i]->Reset();
00181 rePHfracCCR[i]->Reset();
00182 rePHfracCCDIS[i]->Reset();
00183 rePHfracNC[i]->Reset();
00184 rePHfracBG[i]->Reset();
00185 recoW2CCQE[i]->Reset();
00186 recoW2CCR[i]->Reset();
00187 recoW2CCDIS[i]->Reset();
00188 recoW2NC[i]->Reset();
00189 recoW2BG[i]->Reset();
00190 ntrkCCQE[i]->Reset();
00191 ntrkCCR[i]->Reset();
00192 ntrkCCDIS[i]->Reset();
00193 ntrkNC[i]->Reset();
00194 ntrkBG[i]->Reset();
00195 nshowCCQE[i]->Reset();
00196 nshowCCR[i]->Reset();
00197 nshowCCDIS[i]->Reset();
00198 nshowNC[i]->Reset();
00199 nshowBG[i]->Reset();
00200 hpeakCCQE[i]->Reset();
00201 hpeakCCR[i]->Reset();
00202 hpeakCCDIS[i]->Reset();
00203 hpeakNC[i]->Reset();
00204 hpeakBG[i]->Reset();
00205 PCACCQE[i]->Reset();
00206 PCACCR[i]->Reset();
00207 PCACCDIS[i]->Reset();
00208 PCANC[i]->Reset();
00209 PCABG[i]->Reset();
00210 }
00211 }
00212
00213
00214 Bool_t MadQEID::CalcQEVars(MadBase* mb, Int_t evtindex)
00215 {
00216 ntrks = -1;
00217 nshows = -1;
00218 houghPeak = -1;
00219 rePHfrac = -1.0;
00220 PCAvar = -1.0;
00221
00222 if(!mb) return false;
00223 const NtpSREvent* evt = mb->GetEvent(evtindex);
00224 if(!evt) return false;
00225 ntrks = evt->ntrack;
00226 nshows = evt->nshower;
00227 Int_t track_index = -1;
00228 const NtpSRTrack* trk = mb->GetLargestTrackFromEvent(evtindex,track_index);
00229 if(track_index==-1) return false;
00230 Float_t EvtPH=0.0;
00231 Float_t PHremaining=0.0;
00232 Int_t numbighits=0;
00233
00234
00235
00236 static HoughTrans HTUpln(80,-4.0,4.0);
00237 static HoughTrans HTVpln(80,-4.0,4.0);
00238 HTUpln.ResetHough();
00239 HTVpln.ResetHough();
00240
00241 HTUpln.SetVtxz(evt->vtx.z);
00242 HTVpln.SetVtxz(evt->vtx.z);
00243 for(Int_t istp=0;istp<evt->nstrip;istp++){
00244 int stripindex = evt->stp[istp];
00245 const NtpSRStrip* stp = mb->GetStrip(stripindex);
00246 if(!stp) continue;
00247 Float_t zPos = stp->z;
00248 Float_t tPos = stp->tpos;
00249 Float_t pes = (stp->ph0.pe)+(stp->ph1.pe);
00250 Float_t scor = (stp->ph0.sigcor)+(stp->ph1.sigcor);
00251 Float_t vtxz = evt->vtx.z;
00252 Int_t pln = stp->plane;
00253 EvtPH+=scor;
00254 if(pes<1.5) continue;
00255 if((zPos-vtxz)>2) continue;
00256 if(!IsTrkHit(zPos,tPos,trk,mb)){
00257 PHremaining+=scor;
00258 if(pes>20) numbighits++;
00259 if(IsVPln(pln)) HTVpln.FillHough(zPos,tPos);
00260 if(!IsVPln(pln)) HTUpln.FillHough(zPos,tPos);
00261 }
00262 for(Int_t ishw=0;ishw<nshows;ishw++){
00263 int shwindex = evt->shw[ishw];
00264 const NtpSRShower* shwr = mb->GetShower(shwindex);
00265 if(!shwr) continue;
00266 if(IsShowHit(zPos,tPos,shwr,mb) && IsTrkHit(zPos,tPos,trk,mb)){
00267 PHremaining+=(scor-545);
00268 if(pes>26) numbighits++;
00269 }
00270 }
00271 }
00272
00273 houghPeak = (HTUpln.GetPeakHeight())+(HTVpln.GetPeakHeight());
00274
00275 if(EvtPH!=0) rePHfrac = (PHremaining/EvtPH);
00276 if(numbighits<=0 || PHremaining<=0) PCAvar = 0.0;
00277 else PCAvar = (((2500*numbighits)/PHremaining)*(2500*numbighits+PHremaining));
00278
00279 return true;
00280 }
00281
00282
00283 Float_t MadQEID::CalcQEID(MadBase* mb, Int_t evtindex, Float_t reco_enu, Float_t recoW2)
00284 {
00285 if(pdfs_normalised==kFALSE) NormalisePDFs();
00286
00287 if(reco_enu>=20.0) return -1000.0;
00288 if(!CalcQEVars(mb,evtindex)) return -1000.0;
00289
00290 recoWsqd = recoW2;
00291
00292 if(recoW2>=10.0) return -5.0;
00293 if(PCAvar>=50000.0) return -5.0;
00294
00295 Int_t currentBin = GetEnergyBin(reco_enu);
00296
00297
00298 Float_t QErePHfrac=rePHfracCCQE[currentBin]->GetBinContent(rePHfracCCQE[currentBin]->FindBin(rePHfrac));
00299 Float_t QErecoW2=recoW2CCQE[currentBin]->GetBinContent(recoW2CCQE[currentBin]->FindBin(recoWsqd));
00300 Float_t QEnshow=nshowCCQE[currentBin]->GetBinContent(nshowCCQE[currentBin]->FindBin(nshows));
00301
00302 Float_t QEhpk=hpeakCCQE[currentBin]->GetBinContent(hpeakCCQE[currentBin]->FindBin(houghPeak));
00303 Float_t QEpca=PCACCQE[currentBin]->GetBinContent(PCACCQE[currentBin]->FindBin(PCAvar));
00304
00305
00306 Float_t RrePHfrac=rePHfracCCR[currentBin]->GetBinContent(rePHfracCCR[currentBin]->FindBin(rePHfrac));
00307 Float_t RrecoW2=recoW2CCR[currentBin]->GetBinContent(recoW2CCR[currentBin]->FindBin(recoWsqd));
00308 Float_t Rnshow=nshowCCR[currentBin]->GetBinContent(nshowCCR[currentBin]->FindBin(nshows));
00309
00310 Float_t Rhpk=hpeakCCR[currentBin]->GetBinContent(hpeakCCR[currentBin]->FindBin(houghPeak));
00311 Float_t Rpca=PCACCR[currentBin]->GetBinContent(PCACCR[currentBin]->FindBin(PCAvar));
00312
00313
00314 Float_t DISrePHfrac=rePHfracCCDIS[currentBin]->GetBinContent(rePHfracCCDIS[currentBin]->FindBin(rePHfrac));
00315 Float_t DISrecoW2=recoW2CCDIS[currentBin]->GetBinContent(recoW2CCDIS[currentBin]->FindBin(recoWsqd));
00316 Float_t DISnshow=nshowCCDIS[currentBin]->GetBinContent(nshowCCDIS[currentBin]->FindBin(nshows));
00317
00318 Float_t DIShpk=hpeakCCDIS[currentBin]->GetBinContent(hpeakCCDIS[currentBin]->FindBin(houghPeak));
00319 Float_t DISpca=PCACCDIS[currentBin]->GetBinContent(PCACCDIS[currentBin]->FindBin(PCAvar));
00320
00321
00322 Float_t NCrePHfrac=rePHfracNC[currentBin]->GetBinContent(rePHfracNC[currentBin]->FindBin(rePHfrac));
00323 Float_t NCrecoW2=recoW2NC[currentBin]->GetBinContent(recoW2NC[currentBin]->FindBin(recoWsqd));
00324 Float_t NCnshow=nshowNC[currentBin]->GetBinContent(nshowNC[currentBin]->FindBin(nshows));
00325
00326 Float_t NChpk=hpeakNC[currentBin]->GetBinContent(hpeakNC[currentBin]->FindBin(houghPeak));
00327 Float_t NCpca=PCANC[currentBin]->GetBinContent(PCANC[currentBin]->FindBin(PCAvar));
00328
00329 Float_t likliQE = QErePHfrac*QErecoW2*QEnshow*QEhpk*QEpca;
00330 Float_t liklinotQE = (RrePHfrac*RrecoW2*Rnshow*Rhpk*Rpca)
00331 +(DISrePHfrac*DISrecoW2*DISnshow*DIShpk*DISpca)
00332 +(NCrePHfrac*NCrecoW2*NCnshow*NChpk*NCpca);
00333
00334 if(likliQE==0 && liklinotQE==0) return -1000.0;
00335 if(likliQE==0 && liklinotQE>0) return -5.0;
00336 if(likliQE>0 && liklinotQE==0) return 5.0;
00337 Float_t PID = -(sqrt(-log(likliQE)))+(sqrt(-log(liklinotQE)));
00338
00339 return PID;
00340
00341 }
00342
00343
00344 Float_t MadQEID::AltCalcQEID(MadBase* mb, Int_t evtindex, Float_t reco_enu, Float_t recoW2)
00345 {
00346 if(pdfs_normalised==kFALSE) NormalisePDFs();
00347
00348 if(reco_enu>=20.0) return -1000.0;
00349 if(!CalcQEVars(mb,evtindex)) return -1000.0;
00350
00351 recoWsqd = recoW2;
00352
00353 if(recoW2>=10.0) return -5.0;
00354 if(PCAvar>=50000.0) return -5.0;
00355
00356 Int_t currentBin = GetEnergyBin(reco_enu);
00357
00358
00359 Float_t QErePHfrac=rePHfracCCQE[currentBin]->GetBinContent(rePHfracCCQE[currentBin]->FindBin(rePHfrac));
00360 Float_t QErecoW2=recoW2CCQE[currentBin]->GetBinContent(recoW2CCQE[currentBin]->FindBin(recoWsqd));
00361 Float_t QEnshow=nshowCCQE[currentBin]->GetBinContent(nshowCCQE[currentBin]->FindBin(nshows));
00362
00363 Float_t QEhpk=hpeakCCQE[currentBin]->GetBinContent(hpeakCCQE[currentBin]->FindBin(houghPeak));
00364 Float_t QEpca=PCACCQE[currentBin]->GetBinContent(PCACCQE[currentBin]->FindBin(PCAvar));
00365
00366
00367 Float_t BGrePHfrac=rePHfracBG[currentBin]->GetBinContent(rePHfracBG[currentBin]->FindBin(rePHfrac));
00368 Float_t BGrecoW2=recoW2BG[currentBin]->GetBinContent(recoW2BG[currentBin]->FindBin(recoWsqd));
00369 Float_t BGnshow=nshowBG[currentBin]->GetBinContent(nshowBG[currentBin]->FindBin(nshows));
00370
00371 Float_t BGhpk=hpeakBG[currentBin]->GetBinContent(hpeakBG[currentBin]->FindBin(houghPeak));
00372 Float_t BGpca=PCABG[currentBin]->GetBinContent(PCABG[currentBin]->FindBin(PCAvar));
00373
00374 Float_t likliQE = QErePHfrac*QErecoW2*QEnshow*QEhpk*QEpca;
00375 Float_t liklinotQE = BGrePHfrac*BGrecoW2*BGnshow*BGhpk*BGpca;
00376
00377 if(likliQE==0 && liklinotQE==0) return -1000.0;
00378 if(likliQE==0 && liklinotQE>0) return -5.0;
00379 if(likliQE>0 && liklinotQE==0) return 5.0;
00380 Float_t PID = -(sqrt(-log(likliQE)))+(sqrt(-log(liklinotQE)));
00381
00382 return PID;
00383
00384 }
00385
00386
00387 Int_t MadQEID::PassMEDQECut(Float_t reco_enu, Float_t QEIDval)
00388 {
00389 if(reco_enu>=20.0) return -1;
00390 if(QEIDval==-1000.0) return -1;
00391 if(QEIDval==-5.0) return 0;
00392 Int_t currentBin = GetEnergyBin(reco_enu);
00393 Float_t currentBinRange = GetBinRange(currentBin);
00394 Float_t currentBinStart = GetBinStart(currentBin);
00395 Float_t lookup = (currentBinStart+(currentBinRange/2.0));
00396 Float_t cutVal = cutsHist->GetBinContent(cutsHist->FindBin(lookup));
00397 if(QEIDval>cutVal) return 1;
00398 return 0;
00399 }
00400
00401
00402 void MadQEID::FillPDFs(Int_t cc_nc, Int_t process, MadBase* mb, Int_t evtindex, Float_t reco_enu, Float_t recoW2)
00403 {
00404 static bool first=true;
00405 if(first){ InitPDFs(); first=false;}
00406 if(!CalcQEVars(mb,evtindex)) return;
00407 if(reco_enu>=20.0) return;
00408 Int_t currentBin = GetEnergyBin(reco_enu);
00409 recoWsqd = recoW2;
00410
00411 if(cc_nc==1 && process==1001){
00412 rePHfracCCQE[currentBin]->Fill(rePHfrac);
00413 ntrkCCQE[currentBin]->Fill(ntrks);
00414 recoW2CCQE[currentBin]->Fill(recoWsqd);
00415 nshowCCQE[currentBin]->Fill(nshows);
00416 hpeakCCQE[currentBin]->Fill(houghPeak);
00417 PCACCQE[currentBin]->Fill(PCAvar);
00418 }
00419 if(cc_nc==1 && process==1002){
00420 rePHfracCCR[currentBin]->Fill(rePHfrac);
00421 ntrkCCR[currentBin]->Fill(ntrks);
00422 recoW2CCR[currentBin]->Fill(recoWsqd);
00423 nshowCCR[currentBin]->Fill(nshows);
00424 hpeakCCR[currentBin]->Fill(houghPeak);
00425 PCACCR[currentBin]->Fill(PCAvar);
00426 rePHfracBG[currentBin]->Fill(rePHfrac);
00427 ntrkBG[currentBin]->Fill(ntrks);
00428 recoW2BG[currentBin]->Fill(recoWsqd);
00429 nshowBG[currentBin]->Fill(nshows);
00430 hpeakBG[currentBin]->Fill(houghPeak);
00431 PCABG[currentBin]->Fill(PCAvar);
00432 }
00433 if(cc_nc==1 && process==1003){
00434 rePHfracCCDIS[currentBin]->Fill(rePHfrac);
00435 ntrkCCDIS[currentBin]->Fill(ntrks);
00436 recoW2CCDIS[currentBin]->Fill(recoWsqd);
00437 nshowCCDIS[currentBin]->Fill(nshows);
00438 hpeakCCDIS[currentBin]->Fill(houghPeak);
00439 PCACCDIS[currentBin]->Fill(PCAvar);
00440 rePHfracBG[currentBin]->Fill(rePHfrac);
00441 ntrkBG[currentBin]->Fill(ntrks);
00442 recoW2BG[currentBin]->Fill(recoWsqd);
00443 nshowBG[currentBin]->Fill(nshows);
00444 hpeakBG[currentBin]->Fill(houghPeak);
00445 PCABG[currentBin]->Fill(PCAvar);
00446 }
00447 if(cc_nc==0){
00448 rePHfracNC[currentBin]->Fill(rePHfrac);
00449 ntrkNC[currentBin]->Fill(ntrks);
00450 recoW2NC[currentBin]->Fill(recoWsqd);
00451 nshowNC[currentBin]->Fill(nshows);
00452 hpeakNC[currentBin]->Fill(houghPeak);
00453 PCANC[currentBin]->Fill(PCAvar);
00454 rePHfracBG[currentBin]->Fill(rePHfrac);
00455 ntrkBG[currentBin]->Fill(ntrks);
00456 recoW2BG[currentBin]->Fill(recoWsqd);
00457 nshowBG[currentBin]->Fill(nshows);
00458 hpeakBG[currentBin]->Fill(houghPeak);
00459 PCABG[currentBin]->Fill(PCAvar);
00460 }
00461 }
00462
00463
00464 void MadQEID::NormalisePDFs()
00465 {
00466 Float_t integ;
00467 for(Int_t i=0;i<18;i++){
00468
00469 integ=rePHfracCCQE[i]->Integral(0,((rePHfracCCQE[i]->GetNbinsX())+1));
00470 if(integ!=0) rePHfracCCQE[i]->Scale(1./integ);
00471 integ=rePHfracCCR[i]->Integral(0,((rePHfracCCR[i]->GetNbinsX())+1));
00472 if(integ!=0) rePHfracCCR[i]->Scale(1./integ);
00473 integ=rePHfracCCDIS[i]->Integral(0,((rePHfracCCDIS[i]->GetNbinsX())+1));
00474 if(integ!=0) rePHfracCCDIS[i]->Scale(1./integ);
00475 integ=rePHfracNC[i]->Integral(0,((rePHfracNC[i]->GetNbinsX())+1));
00476 if(integ!=0) rePHfracNC[i]->Scale(1./integ);
00477 integ=rePHfracBG[i]->Integral(0,((rePHfracBG[i]->GetNbinsX())+1));
00478 if(integ!=0) rePHfracBG[i]->Scale(1./integ);
00479
00480 integ=recoW2CCQE[i]->Integral(0,((recoW2CCQE[i]->GetNbinsX())+1));
00481 if(integ!=0) recoW2CCQE[i]->Scale(1./integ);
00482 integ=recoW2CCR[i]->Integral(0,((recoW2CCR[i]->GetNbinsX())+1));
00483 if(integ!=0) recoW2CCR[i]->Scale(1./integ);
00484 integ=recoW2CCDIS[i]->Integral(0,((recoW2CCDIS[i]->GetNbinsX())+1));
00485 if(integ!=0) recoW2CCDIS[i]->Scale(1./integ);
00486 integ=recoW2NC[i]->Integral(0,((recoW2NC[i]->GetNbinsX())+1));
00487 if(integ!=0) recoW2NC[i]->Scale(1./integ);
00488 integ=recoW2BG[i]->Integral(0,((recoW2BG[i]->GetNbinsX())+1));
00489 if(integ!=0) recoW2BG[i]->Scale(1./integ);
00490
00491 integ=ntrkCCQE[i]->Integral(0,((ntrkCCQE[i]->GetNbinsX())+1));
00492 if(integ!=0) ntrkCCQE[i]->Scale(1./integ);
00493 integ=ntrkCCR[i]->Integral(0,((ntrkCCR[i]->GetNbinsX())+1));
00494 if(integ!=0) ntrkCCR[i]->Scale(1./integ);
00495 integ=ntrkCCDIS[i]->Integral(0,((ntrkCCDIS[i]->GetNbinsX())+1));
00496 if(integ!=0) ntrkCCDIS[i]->Scale(1./integ);
00497 integ=ntrkNC[i]->Integral(0,((ntrkNC[i]->GetNbinsX())+1));
00498 if(integ!=0) ntrkNC[i]->Scale(1./integ);
00499 integ=ntrkBG[i]->Integral(0,((ntrkBG[i]->GetNbinsX())+1));
00500 if(integ!=0) ntrkBG[i]->Scale(1./integ);
00501
00502 integ=nshowCCQE[i]->Integral(0,((nshowCCQE[i]->GetNbinsX())+1));
00503 if(integ!=0) nshowCCQE[i]->Scale(1./integ);
00504 integ=nshowCCR[i]->Integral(0,((nshowCCR[i]->GetNbinsX())+1));
00505 if(integ!=0) nshowCCR[i]->Scale(1./integ);
00506 integ=nshowCCDIS[i]->Integral(0,((nshowCCDIS[i]->GetNbinsX())+1));
00507 if(integ!=0) nshowCCDIS[i]->Scale(1./integ);
00508 integ=nshowNC[i]->Integral(0,((nshowNC[i]->GetNbinsX())+1));
00509 if(integ!=0) nshowNC[i]->Scale(1./integ);
00510 integ=nshowBG[i]->Integral(0,((nshowBG[i]->GetNbinsX())+1));
00511 if(integ!=0) nshowBG[i]->Scale(1./integ);
00512
00513 integ=hpeakCCQE[i]->Integral(0,((hpeakCCQE[i]->GetNbinsX())+1));
00514 if(integ!=0) hpeakCCQE[i]->Scale(1./integ);
00515 integ=hpeakCCR[i]->Integral(0,((hpeakCCR[i]->GetNbinsX())+1));
00516 if(integ!=0) hpeakCCR[i]->Scale(1./integ);
00517 integ=hpeakCCDIS[i]->Integral(0,((hpeakCCDIS[i]->GetNbinsX())+1));
00518 if(integ!=0) hpeakCCDIS[i]->Scale(1./integ);
00519 integ=hpeakNC[i]->Integral(0,((hpeakNC[i]->GetNbinsX())+1));
00520 if(integ!=0) hpeakNC[i]->Scale(1./integ);
00521 integ=hpeakBG[i]->Integral(0,((hpeakBG[i]->GetNbinsX())+1));
00522 if(integ!=0) hpeakBG[i]->Scale(1./integ);
00523
00524 integ=PCACCQE[i]->Integral(0,((PCACCQE[i]->GetNbinsX())+1));
00525 if(integ!=0) PCACCQE[i]->Scale(1./integ);
00526 integ=PCACCR[i]->Integral(0,((PCACCR[i]->GetNbinsX())+1));
00527 if(integ!=0) PCACCR[i]->Scale(1./integ);
00528 integ=PCACCDIS[i]->Integral(0,((PCACCDIS[i]->GetNbinsX())+1));
00529 if(integ!=0) PCACCDIS[i]->Scale(1./integ);
00530 integ=PCANC[i]->Integral(0,((PCANC[i]->GetNbinsX())+1));
00531 if(integ!=0) PCANC[i]->Scale(1./integ);
00532 integ=PCABG[i]->Integral(0,((PCABG[i]->GetNbinsX())+1));
00533 if(integ!=0) PCABG[i]->Scale(1./integ);
00534 }
00535 pdfs_normalised=kTRUE;
00536 }
00537
00538
00539 void MadQEID::RebinPDFs(Int_t nbins)
00540 {
00541 for(Int_t i=0;i<18;i++){
00542 rePHfracCCQE[i]->Rebin(nbins);
00543 rePHfracCCR[i]->Rebin(nbins);
00544 rePHfracCCDIS[i]->Rebin(nbins);
00545 rePHfracNC[i]->Rebin(nbins);
00546 rePHfracBG[i]->Rebin(nbins);
00547 recoW2CCQE[i]->Rebin(nbins);
00548 recoW2CCR[i]->Rebin(nbins);
00549 recoW2CCDIS[i]->Rebin(nbins);
00550 recoW2NC[i]->Rebin(nbins);
00551 recoW2BG[i]->Rebin(nbins);
00552 PCACCQE[i]->Rebin(nbins);
00553 PCACCR[i]->Rebin(nbins);
00554 PCACCDIS[i]->Rebin(nbins);
00555 PCANC[i]->Rebin(nbins);
00556 PCABG[i]->Rebin(nbins);
00557 }
00558 }
00559
00560
00561 void MadQEID::WritePDFs(const char* name)
00562 {
00563 TDirectory* dir = gDirectory;
00564 TFile* f = new TFile(name,"recreate");
00565 dir->cd();
00566 for(Int_t i=0;i<18;i++){
00567 rePHfracCCQE[i]->SetDirectory(f);
00568 rePHfracCCR[i]->SetDirectory(f);
00569 rePHfracCCDIS[i]->SetDirectory(f);
00570 rePHfracNC[i]->SetDirectory(f);
00571 rePHfracBG[i]->SetDirectory(f);
00572 recoW2CCQE[i]->SetDirectory(f);
00573 recoW2CCR[i]->SetDirectory(f);
00574 recoW2CCDIS[i]->SetDirectory(f);
00575 recoW2NC[i]->SetDirectory(f);
00576 recoW2BG[i]->SetDirectory(f);
00577 ntrkCCQE[i]->SetDirectory(f);
00578 ntrkCCR[i]->SetDirectory(f);
00579 ntrkCCDIS[i]->SetDirectory(f);
00580 ntrkNC[i]->SetDirectory(f);
00581 ntrkBG[i]->SetDirectory(f);
00582 nshowCCQE[i]->SetDirectory(f);
00583 nshowCCR[i]->SetDirectory(f);
00584 nshowCCDIS[i]->SetDirectory(f);
00585 nshowNC[i]->SetDirectory(f);
00586 nshowBG[i]->SetDirectory(f);
00587 hpeakCCQE[i]->SetDirectory(f);
00588 hpeakCCR[i]->SetDirectory(f);
00589 hpeakCCDIS[i]->SetDirectory(f);
00590 hpeakNC[i]->SetDirectory(f);
00591 hpeakBG[i]->SetDirectory(f);
00592 PCACCQE[i]->SetDirectory(f);
00593 PCACCR[i]->SetDirectory(f);
00594 PCACCDIS[i]->SetDirectory(f);
00595 PCANC[i]->SetDirectory(f);
00596 PCABG[i]->SetDirectory(f);
00597 if(trainingHists[i]) trainingHists[i]->SetDirectory(f);
00598 }
00599 if(cutsHist) cutsHist->SetDirectory(f);
00600 f->Write();
00601 }
00602
00603
00604 void MadQEID::ReadPDFs(const char* name)
00605 {
00606 TFile* QEfile = new TFile(name,"READ");
00607 if(QEfile->IsOpen() && !QEfile->IsZombie()){
00608 std::cout<<"Read MadQEID PDFs from : "<<name<<std::endl;
00609 QEfile->cd();
00610 for(Int_t i=0;i<18;i++){
00611 char name[30];
00612
00613 sprintf(name,"rePHfracCCQE[%d]",i);
00614 rePHfracCCQE[i] = (TH1F*) QEfile->Get(name);
00615 sprintf(name,"rePHfracCCR[%d]",i);
00616 rePHfracCCR[i] = (TH1F*) QEfile->Get(name);
00617 sprintf(name,"rePHfracCCDIS[%d]",i);
00618 rePHfracCCDIS[i] = (TH1F*) QEfile->Get(name);
00619 sprintf(name,"rePHfracNC[%d]",i);
00620 rePHfracNC[i] = (TH1F*) QEfile->Get(name);
00621 sprintf(name,"rePHfracBG[%d]",i);
00622 rePHfracBG[i] = (TH1F*) QEfile->Get(name);
00623
00624 sprintf(name,"recoW2CCQE[%d]",i);
00625 recoW2CCQE[i] = (TH1F*) QEfile->Get(name);
00626 sprintf(name,"recoW2CCR[%d]",i);
00627 recoW2CCR[i] = (TH1F*) QEfile->Get(name);
00628 sprintf(name,"recoW2CCDIS[%d]",i);
00629 recoW2CCDIS[i] = (TH1F*) QEfile->Get(name);
00630 sprintf(name,"recoW2NC[%d]",i);
00631 recoW2NC[i] = (TH1F*) QEfile->Get(name);
00632 sprintf(name,"recoW2BG[%d]",i);
00633 recoW2BG[i] = (TH1F*) QEfile->Get(name);
00634
00635 sprintf(name,"hpeakCCQE[%d]",i);
00636 hpeakCCQE[i] = (TH1F*) QEfile->Get(name);
00637 sprintf(name,"hpeakCCR[%d]",i);
00638 hpeakCCR[i] = (TH1F*) QEfile->Get(name);
00639 sprintf(name,"hpeakCCDIS[%d]",i);
00640 hpeakCCDIS[i] = (TH1F*) QEfile->Get(name);
00641 sprintf(name,"hpeakNC[%d]",i);
00642 hpeakNC[i] = (TH1F*) QEfile->Get(name);
00643 sprintf(name,"hpeakBG[%d]",i);
00644 hpeakBG[i] = (TH1F*) QEfile->Get(name);
00645
00646 sprintf(name,"ntrkCCQE[%d]",i);
00647 ntrkCCQE[i] = (TH1F*) QEfile->Get(name);
00648 sprintf(name,"ntrkCCR[%d]",i);
00649 ntrkCCR[i] = (TH1F*) QEfile->Get(name);
00650 sprintf(name,"ntrkCCDIS[%d]",i);
00651 ntrkCCDIS[i] = (TH1F*) QEfile->Get(name);
00652 sprintf(name,"ntrkNC[%d]",i);
00653 ntrkNC[i] = (TH1F*) QEfile->Get(name);
00654 sprintf(name,"ntrkBG[%d]",i);
00655 ntrkBG[i] = (TH1F*) QEfile->Get(name);
00656
00657 sprintf(name,"nshowCCQE[%d]",i);
00658 nshowCCQE[i] = (TH1F*) QEfile->Get(name);
00659 sprintf(name,"nshowCCR[%d]",i);
00660 nshowCCR[i] = (TH1F*) QEfile->Get(name);
00661 sprintf(name,"nshowCCDIS[%d]",i);
00662 nshowCCDIS[i] = (TH1F*) QEfile->Get(name);
00663 sprintf(name,"nshowNC[%d]",i);
00664 nshowNC[i] = (TH1F*) QEfile->Get(name);
00665 sprintf(name,"nshowBG[%d]",i);
00666 nshowBG[i] = (TH1F*) QEfile->Get(name);
00667
00668 sprintf(name,"PCACCQE[%d]",i);
00669 PCACCQE[i] = (TH1F*) QEfile->Get(name);
00670 sprintf(name,"PCACCR[%d]",i);
00671 PCACCR[i] = (TH1F*) QEfile->Get(name);
00672 sprintf(name,"PCACCDIS[%d]",i);
00673 PCACCDIS[i] = (TH1F*) QEfile->Get(name);
00674 sprintf(name,"PCANC[%d]",i);
00675 PCANC[i] = (TH1F*) QEfile->Get(name);
00676 sprintf(name,"PCABG[%d]",i);
00677 PCABG[i] = (TH1F*) QEfile->Get(name);
00678
00679 }
00680 }
00681 else {
00682 std::cout<<"Failed to read MadQEID PDFs from : "<<name<<std::endl;
00683 assert(false);
00684 }
00685 NormalisePDFs();
00686 cutsHist = (TH1F*) QEfile->Get("cuthist");
00687 }
00688
00689
00690 void MadQEID::FillCutTrainingHists(MadBase* mb, Int_t evtindex, Float_t reco_enu, Float_t recoW2)
00691 {
00692 if(reco_enu>=20.0) return;
00693 static bool first=true;
00694 if(first){ InitTrainingHists(); first=false;}
00695 Float_t currentID = CalcQEID(mb,evtindex,reco_enu,recoW2);
00696 Int_t currentBin = GetEnergyBin(reco_enu);
00697 trainingHists[currentBin]->Fill(currentID);
00698 }
00699
00700
00701 void MadQEID::AltFillCutTrainingHists(MadBase* mb, Int_t evtindex, Float_t reco_enu, Float_t recoW2)
00702 {
00703 if(reco_enu>=20.0) return;
00704 static bool first=true;
00705 if(first){ InitTrainingHists(); first=false;}
00706 Float_t currentID = AltCalcQEID(mb,evtindex,reco_enu,recoW2);
00707 Int_t currentBin = GetEnergyBin(reco_enu);
00708 trainingHists[currentBin]->Fill(currentID);
00709 }
00710
00711
00712 void MadQEID::MakeCutHist(Float_t eff)
00713 {
00714
00715 for(Int_t i=0;i<18;i++){
00716 Int_t totQE = static_cast<Int_t>(trainingHists[i]->GetEntries());
00717 Float_t currentBinStart = GetBinStart(i);
00718 Float_t currentBinRange = GetBinRange(i);
00719 Float_t lookup = (currentBinStart + (currentBinRange/2.0));
00720 if(totQE==0){
00721 cutsHist->Fill(lookup,0.3);
00722
00723
00724
00725 continue;
00726 }
00727 Int_t currentNumQE = 0;
00728 Float_t currentEff = 0.0;
00729 Bool_t foundEff = false;
00730 Int_t trainingHistBins = trainingHists[i]->GetNbinsX();
00731
00732
00733
00734
00735
00736
00737 for(Int_t bin=1;bin<trainingHistBins;bin++){
00738 if(foundEff) continue;
00739 Int_t binNumFromEnd = trainingHistBins-bin;
00740 currentNumQE+=static_cast<Int_t>(trainingHists[i]->GetBinContent(binNumFromEnd));
00741 if(currentNumQE==0){
00742 currentEff=0.0;
00743 continue;
00744 }
00745 else currentEff = (static_cast<Float_t>(currentNumQE)/static_cast<Float_t>(totQE));
00746
00747
00748
00749
00750
00751
00752
00753 if(currentEff>eff && !foundEff){
00754 Float_t cutVal = static_cast<Float_t>((trainingHists[i]->GetBinCenter(binNumFromEnd)));
00755 cutsHist->Fill(lookup,cutVal);
00756
00757
00758
00759 foundEff = true;
00760 }
00761 if(bin==(trainingHistBins-1) && !foundEff){
00762 cutsHist->Fill(lookup,4.5);
00763
00764
00765
00766 }
00767 }
00768 }
00769 }
00770
00771
00772 Float_t MadQEID::GetRePHfrac()
00773 {
00774 return rePHfrac;
00775 }
00776
00777
00778 Bool_t MadQEID::IsTrkHit(Float_t zPos,Float_t tPos, const NtpSRTrack* ntpTrk, MadBase* madb)
00779 {
00780 for(Int_t i=0;i<ntpTrk->nstrip;i++){
00781 const NtpSRStrip* strp = madb->GetStrip(ntpTrk->stp[i]);
00782 if(!strp) continue;
00783 if(strp->tpos==tPos && strp->z==zPos){
00784 return true;
00785 }
00786 }
00787 return false;
00788 }
00789
00790
00791 Bool_t MadQEID::IsShowHit(Float_t zPos,Float_t tPos, const NtpSRShower* ntpShow, MadBase* madb)
00792 {
00793 for(Int_t i=0;i<ntpShow->nstrip;i++){
00794 const NtpSRStrip* strp = madb->GetStrip(ntpShow->stp[i]);
00795 if(!strp) continue;
00796 if(strp->tpos==tPos && strp->z==zPos){
00797 return true;
00798 }
00799 }
00800 return false;
00801 }
00802
00803
00804 Bool_t MadQEID::IsVPln(Int_t plane)
00805 {
00806 for(int i=0;i<246;i++){
00807 if(plane==2*i) return true;
00808 }
00809 return false;
00810 }
00811
00812
00813 Int_t MadQEID::GetEnergyBin(Float_t enu)
00814 {
00815 Int_t bin = 0;
00816 if(enu>=0.0 && enu<0.5) bin=0;
00817 if(enu>=0.5 && enu<1.0) bin=1;
00818 if(enu>=1.0 && enu<1.5) bin=2;
00819 if(enu>=1.5 && enu<2.0) bin=3;
00820 if(enu>=2.0 && enu<2.5) bin=4;
00821 if(enu>=2.5 && enu<3.0) bin=5;
00822 if(enu>=3.0 && enu<3.5) bin=6;
00823 if(enu>=3.5 && enu<4.0) bin=7;
00824 if(enu>=4.0 && enu<4.5) bin=8;
00825 if(enu>=4.5 && enu<5.0) bin=9;
00826 if(enu>=5.0 && enu<6.0) bin=10;
00827 if(enu>=6.0 && enu<7.0) bin=11;
00828 if(enu>=7.0 && enu<8.0) bin=12;
00829 if(enu>=8.0 && enu<10.0) bin=13;
00830 if(enu>=10.0 && enu<12.0) bin=14;
00831 if(enu>=12.0 && enu<14.0) bin=15;
00832 if(enu>=14.0 && enu<17.0) bin=16;
00833 if(enu>=17.0 && enu<20.0) bin=17;
00834 return bin;
00835 }
00836
00837
00838 Float_t MadQEID::GetBinStart(Int_t bin)
00839 {
00840 Float_t binstart=0.;
00841 if(bin==0) binstart=0.0;
00842 if(bin==1) binstart=0.5;
00843 if(bin==2) binstart=1.0;
00844 if(bin==3) binstart=1.5;
00845 if(bin==4) binstart=2.0;
00846 if(bin==5) binstart=2.5;
00847 if(bin==6) binstart=3.0;
00848 if(bin==7) binstart=3.5;
00849 if(bin==8) binstart=4.0;
00850 if(bin==9) binstart=4.5;
00851 if(bin==10) binstart=5.0;
00852 if(bin==11) binstart=6.0;
00853 if(bin==12) binstart=7.0;
00854 if(bin==13) binstart=8.0;
00855 if(bin==14) binstart=10.0;
00856 if(bin==15) binstart=12.0;
00857 if(bin==16) binstart=14.0;
00858 if(bin==17) binstart=17.0;
00859 return binstart;
00860 }
00861
00862
00863 Float_t MadQEID::GetBinRange(Int_t bin)
00864 {
00865 Float_t binrange = 0.;
00866 if(bin<=9){
00867 binrange=0.5;
00868 }
00869 if(bin>9 && bin<=12){
00870 binrange=1.0;
00871 }
00872 if(bin>=13 && bin<16){
00873 binrange=2.0;
00874 }
00875 if(bin>=16){
00876 binrange=3.0;
00877 }
00878 return binrange;
00879 }
00880
00881
00882
00883
00884 #endif