00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013 #include <vector>
00014 #include "NueAna/NueAnaTools/NueConvention.h"
00015 #include "NueStandard.h"
00016 #include "DcsUser/CoilTools.h"
00017 #include "MCReweight/SKZPWeightCalculator.h"
00018 #include "TMultiLayerPerceptron.h"
00019
00020 #include "TFile.h"
00021 #include "TMath.h"
00022 #include <cmath>
00023
00024 #include <fstream>
00025 #include "MessageService/MsgService.h"
00026
00027 CVSID("");
00028
00029 bool NueStandard::IsInFid(NueRecord *nr)
00030 {
00031 float x = nr->srevent.vtxX;
00032 float y = nr->srevent.vtxY;
00033 float z = nr->srevent.vtxZ;
00034
00035 Detector::Detector_t fDet;
00036 fDet = nr->GetHeader().GetVldContext().GetDetector();
00037 if (fDet != Detector::kFar && fDet != Detector::kNear) return false;
00038
00039 SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00040 bool isMC = (sim == SimFlag::kMC);
00041 int retval = 0;
00042
00043 if (fDet == Detector::kFar)
00044 retval = NueConvention::IsInsideFarFiducial_Nue_Standard(x,y,z, isMC);
00045
00046 if (fDet == Detector::kNear)
00047 retval = NueConvention::IsInsideNearFiducial_Nue_Standard(x,y,z, isMC);
00048
00049 return (retval == 1);
00050 }
00051
00052 bool NueStandard::PassesPOTStandards(NueRecord *nr)
00053 {
00054 SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00055 bool isMC = (sim == SimFlag::kMC);
00056 VldContext vld = nr->GetHeader().GetVldContext();
00057
00058 if (isMC) return true;
00059
00060
00061 if (nr->bmon.goodBeamMon != 1) return false;
00062
00063 if (nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear )
00064 {
00065 bool goodCoil = nr->eventq.coilQuality && (nr->eventq.coilDirection ==1);
00066
00067 int dpDQ = nr->eventq.passNearDetQuality;
00068 return goodCoil && (dpDQ == 1);
00069 }
00070
00071 if (nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar)
00072 {
00073
00074 if (nr->eventq.spillType != 1) return false;
00075 int dpDQ = nr->eventq.passFarDetQuality;
00076 if (nr->GetHeader().GetEventNo() < 0) return (dpDQ == 1);
00077
00078 return (dpDQ == 1) && (nr->eventq.passLI == 1);
00079 }
00080
00081 return false;
00082 }
00083 bool NueStandard::PassesDataQuality(NueRecord *nr)
00084 {
00085 SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00086 bool isMC = (sim == SimFlag::kMC);
00087 VldContext vld = nr->GetHeader().GetVldContext();
00088
00089 if (isMC) return true;
00090
00091 if(!PassesPOTStandards(nr)) return false;
00092
00093 if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear) return true;
00094
00095 if (nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar){
00096
00097 int rcB = nr->eventq.rcBoundary;
00098 float tmin = nr->srevent.eventTimeMin;
00099 double spillT = nr->bmon.dt_stnd;
00100 return PassesFarDataQuality(-1, rcB, 1, tmin, spillT);
00101 }
00102
00103 return false;
00104 }
00105
00106 bool NueStandard::PassesNearDataQuality(int gbm, float cc, int st)
00107 {
00108
00109
00110 if (gbm == 1 && cc < -1000.0 && st != 3)
00111 return true;
00112
00113 return false;
00114 }
00115
00116 bool NueStandard::PassesFarDataTiming(NueRecord *nr)
00117 {
00118 if(
00119 Detector::kFar == nr->GetHeader().GetVldContext().GetDetector()
00120 && SimFlag::kData == nr->GetHeader().GetVldContext().GetSimFlag()
00121 )
00122 {
00123 float tmin = nr->srevent.eventTimeMin;
00124 double spillT = nr->bmon.dt_stnd;
00125 return( (tmin - spillT) > -2e-6 && (tmin - spillT) < 12e-6 );
00126 }
00127 return true;
00128 }
00129
00130 bool NueStandard::PassesFarDataQuality(float li, int rc, int dpfddq,
00131 float tmin, double spillt)
00132 {
00133 if (li == -1 && rc == 0 && dpfddq == 1
00134 && (tmin - spillt) > -20e-6 && (tmin - spillt) < 30e-6)
00135 return true;
00136
00137 return false;
00138 }
00139
00140 bool NueStandard::IsGoodRun(NueRecord *nr)
00141 {
00142 if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
00143 {
00144 return true;
00145 }
00146
00147 if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar)
00148 {
00149 return NueStandard::IsGoodFarRun(nr);
00150 }
00151
00152 return false;
00153 }
00154
00155 bool NueStandard::IsGoodNearRun(NueRecord *nr)
00156 {
00157 if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
00158 {
00159 return true;
00160 }
00161
00162 if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar)
00163 {
00164 return true;
00165 }
00166
00167
00168 if(nr->GetHeader().GetRun()==8165 || nr->GetHeader().GetRun()==11318)
00169 {
00170 return false;
00171 }
00172
00173 if(nr->GetHeader().GetRun()==7942 && nr->GetHeader().GetSubRun()==0)
00174 {
00175 return false;
00176 }
00177
00178 if(nr->GetHeader().GetRun()==7982 && nr->GetHeader().GetSubRun()==0)
00179 {
00180 return false;
00181 }
00182
00183 if(nr->GetHeader().GetRun()==8214 && nr->GetHeader().GetSubRun()==0)
00184 {
00185 return false;
00186 }
00187
00188 if(nr->GetHeader().GetRun()==9809 && nr->GetHeader().GetSubRun()==0)
00189 {
00190 return false;
00191 }
00192
00193 return true;
00194 }
00195
00196 bool NueStandard::IsGoodFarRun(NueRecord *nr)
00197 {
00198 if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
00199 {
00200 return true;
00201 }
00202
00203 if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear)
00204 {
00205 return true;
00206 }
00207
00208
00209 static vector<FilePosition> badFDrunlist;
00210 static unsigned int listpos = 0;
00211 int Run, SubRun;
00212
00213
00214 if(badFDrunlist.size() == 0)
00215 {
00216 std::ifstream ins;
00217 char *srt_dir = getenv("SRT_PRIVATE_CONTEXT");
00218 ins.open(Form("%s/NueAna/badrunsFD_list.txt",srt_dir));
00219 if(!ins.is_open())
00220 {
00221 MSG("NueStandard", Msg::kError)<<"IsGoodFarRun(): Unable to open badrunsFD_list.txt"<<endl;
00222 }
00223
00224 while(!ins.eof())
00225 {
00226 ins>>Run>>SubRun;
00227 FilePosition temp;
00228 if(!ins.eof()){
00229 temp.Run = Run;
00230 temp.SubRun = SubRun;
00231 temp.Snarl = -1;
00232 temp.Event = -1;
00233 badFDrunlist.push_back(temp);
00234 }
00235 }
00236
00237 if(badFDrunlist.size() == 0) return true;
00238 }
00239
00240 FilePosition current;
00241
00242 current.Snarl = -1;
00243 current.Event = -1;
00244 current.Run = nr->GetHeader().GetRun();
00245 current.SubRun = nr->GetHeader().GetSubRun();
00246
00247 if(current < badFDrunlist[0]) return true;
00248
00249 if(current > badFDrunlist[badFDrunlist.size() - 1]) return true;
00250
00251 if(current > badFDrunlist[listpos] )
00252 {
00253 while(current > badFDrunlist[listpos] && listpos < badFDrunlist.size())
00254 listpos++;
00255 }
00256 else if(current < badFDrunlist[listpos] )
00257 {
00258 while(current < badFDrunlist[listpos] && listpos > 0)
00259 listpos--;
00260 }
00261
00262 if(current == badFDrunlist[listpos])
00263 {
00264 return false;
00265 }
00266
00267
00268 return true;
00269 }
00270
00271
00272
00273 bool NueStandard::PassesTrackPlaneCut(NueRecord *nr)
00274 {
00275 int tp = TMath::Abs(nr->srtrack.endPlane - nr->srtrack.begPlane);
00276
00277 return PassesTrackPlaneCut(tp);
00278 }
00279
00280 bool NueStandard::PassesTrackPlaneCut(int trkplane)
00281 {
00282 return (trkplane < 25);
00283 }
00284
00285 bool NueStandard::PassesMinPlaneCut(NueRecord *nr)
00286 {
00287 int planes = nr->shwfit.contPlaneCount050;
00288 return PassesMinPlaneCut(planes);
00289 }
00290
00291 bool NueStandard::PassesMinPlaneCut(int planes)
00292 {
00293 return (planes > 4);
00294 }
00295
00296 bool NueStandard::PassesShowerCut(NueRecord *nr)
00297 {
00298 int nshw = nr->srevent.showers;
00299 return PassesShowerCut(nshw);
00300 }
00301
00302 bool NueStandard::PassesShowerCut(int nshw)
00303 {
00304 return (nshw > 0);
00305 }
00306
00307 bool NueStandard::PassesCosmicCutFunction(NueRecord *nr)
00308 {
00309 bool result=true;
00310
00311 result = result && !(nr->shwfit.UVSlope > 10);
00312
00313
00314 if (nr->srevent.tracks<1) return result;
00315
00316 float ex = nr->srtrack.endX;
00317 float ey = nr->srtrack.endY;
00318 float ez = nr->srtrack.endZ;
00319
00320 float vx = nr->srtrack.vtxX;
00321 float vy = nr->srtrack.vtxY;
00322 float vz = nr->srtrack.vtxZ;
00323
00324 float cosy = acos(fabs(vy-ey)/sqrt((vx-ex)*(vx-ex)+(vy-ey)*(vy-ey)+(vz-ez)*(vz-ez)));
00325 float dy=fabs(vy-ey);
00326
00327 result = result && !(dy>2 && cosy < 0.6);
00328
00329 return result;
00330 }
00331
00332 bool NueStandard::PassesCosmicCut(NueRecord *nr)
00333 {
00334 if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear)
00335 return true;
00336
00337 bool ret=true;
00338 if(nr->eventq.passCosmicCut > -10)
00339 return (nr->eventq.passCosmicCut == 1);
00340
00341
00342
00343 if(nr->dtree.bt_var1==0)ret = false;
00344 else if(nr->dtree.bt_var1==1)ret = true;
00345 else{ NueStandard::FillCosmicCut(nr); ret = nr->dtree.bt_var1; }
00346
00347 Detector::Detector_t fDet;
00348 fDet = nr->GetHeader().GetVldContext().GetDetector();
00349 if (fDet != Detector::kFar) ret = true;
00350
00351 return ret;
00352 }
00353
00354 void NueStandard::FillCosmicCut(NueRecord *nr)
00355 {
00356 int bv = 0;
00357 if (NueStandard::PassesCosmicCutFunction(nr)) bv=1;
00358 nr->dtree.bt_var1=bv;
00359 }
00360
00361 bool NueStandard::PassesTrackLikePlaneCut(NueRecord *nr)
00362 {
00363 int tlp = nr->srtrack.trklikePlanes;
00364 return PassesTrackLikePlaneCut(tlp);
00365 }
00366
00367 bool NueStandard::PassesTrackLikePlaneCut(int tlp)
00368 {
00369 return (tlp < 16);
00370 }
00371
00372 bool NueStandard::PassesLowEnergyCut(NueRecord *nr)
00373 {
00374 float energy = nr->srevent.phNueGeV;
00375 return PassesLowEnergyCut(energy);
00376 }
00377
00378 bool NueStandard::PassesLowEnergyCut(float energy)
00379 {
00380 return (energy > 1.0);
00381 }
00382
00383 bool NueStandard::PassesHighEnergyCut(NueRecord *nr)
00384 {
00385 float energy = nr->srevent.phNueGeV;
00386 return PassesHighEnergyCut(energy);
00387 }
00388
00389 bool NueStandard::PassesHighEnergyCut(float energy)
00390 {
00391 return (energy < 8.0);
00392 }
00393
00394
00395 bool NueStandard::PassesPreSelection(NueRecord *nr)
00396 {
00397 bool temp = PassesNonHEPreSelection(nr);
00398 temp = temp && PassesHighEnergyCut(nr);
00399
00400 return temp;
00401 }
00402
00403 bool NueStandard::PassesPreSelection(int trkplane, int tlp, float energy)
00404 {
00405 bool temp = PassesNonHEPreSelection(trkplane, tlp, energy);
00406 temp = temp && PassesHighEnergyCut(energy);
00407 return temp;
00408 }
00409
00410 bool NueStandard::PassesNonHEPreSelection(NueRecord *nr)
00411 {
00412 bool temp = PassesPreSelectionTrackCuts(nr);
00413 temp = temp && PassesLowEnergyCut(nr);
00414 temp = temp && PassesPreSelectionBasicCuts(nr);
00415
00416 return temp;
00417 }
00418 bool NueStandard::PassesNonHEPreSelection(int trkplane, int tlp, float energy)
00419 {
00420 bool temp = PassesPreSelectionTrackCuts(trkplane, tlp);
00421 temp = temp && PassesLowEnergyCut(energy);
00422 return temp;
00423 }
00424
00425 bool NueStandard::PassesPreSelectionTrackCuts(NueRecord *nr)
00426 {
00427 bool temp = PassesTrackPlaneCut(nr);
00428 temp = temp && PassesTrackLikePlaneCut(nr);
00429 return temp;
00430 }
00431
00432 bool NueStandard::PassesPreSelectionTrackCuts(int trkplane, int tlp)
00433 {
00434 bool temp = PassesTrackPlaneCut(trkplane);
00435 temp = temp && PassesTrackLikePlaneCut(tlp);
00436 return temp;
00437 }
00438
00439 bool NueStandard::PassesPreSelectionBasicCuts(NueRecord *nr)
00440 {
00441 bool one = PassesMinPlaneCut(nr);
00442 one = one && PassesCosmicCut(nr);
00443 one = one && IsLargestEvent(nr);
00444 one = one && PassesShowerCut(nr);
00445
00446 return one;
00447 }
00448
00449 bool NueStandard::PassesMRCCFiducial(NueRecord *nr)
00450 {
00451 float x = nr->mri.vtxx;
00452 float y = nr->mri.vtxy;
00453 float z = nr->mri.vtxz;
00454
00455 Detector::Detector_t fDet;
00456 fDet = nr->GetHeader().GetVldContext().GetDetector();
00457
00458 SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00459 bool isMC = (sim == SimFlag::kMC);
00460 int retval = 0;
00461
00462 if (fDet == Detector::kFar)
00463 {
00464 if(sqrt((x*x) + (y*y))>0.3 && sqrt((x*x) + (y*y))<sqrt(15.5) && ((z>0.3 && z<14.4)||(z>16.1 && z<28.2)))
00465 {
00466 retval=1;
00467 }
00468 }
00469
00470 if (fDet == Detector::kNear)
00471 retval = NueConvention::IsInsideNearFiducial_MRE_Standard(x,y,z, isMC);
00472
00473 return (retval == 1);
00474 }
00475
00476 bool NueStandard::PassesMRCCPreSelection(NueRecord *nr)
00477 {
00478 double pid = nr->mri.orig_roCCPID;
00479 int fitp = nr->mri.fitp;
00480 float bestC = nr->mri.best_complete;
00481
00482 return NueStandard::PassesMRCCPreSelection(bestC, fitp, pid);
00483 }
00484
00485 bool NueStandard::PassesMRCCPreSelection(float bestComp, int fitp, double pid)
00486 {
00487
00488 bool good = true;
00489 good = good && (bestComp > -10);
00490 good = good && (fitp == 1);
00491 good = good && (pid > 0.3);
00492
00493 return good;
00494 }
00495
00496 bool NueStandard::PassesMREFiducial(NueRecord *nr)
00497 {
00498 return NueStandard::PassesMRCCFiducial(nr);
00499 }
00500
00501 bool NueStandard::PassesMREPreSelection(NueRecord *nr)
00502 {
00503 return NueStandard::PassesMRCCPreSelection(nr);
00504 }
00505
00506 bool NueStandard::PassesMREPreSelection(float bestC, int fitp, double pid)
00507 {
00508 return NueStandard::PassesMRCCPreSelection(bestC, fitp, pid);
00509 }
00510
00511 bool NueStandard::PassesSysPreSelectionNoHE(NueRecord *nr)
00512 {
00513 int tp = TMath::Abs(nr->srtrack.endPlane - nr->srtrack.begPlane);
00514 int tlp = nr->srtrack.trklikePlanes;
00515 float energy = nr->srevent.phNueGeV;
00516
00517 return PassesSysPreSelectionNoHE(tp, tlp, energy);
00518 }
00519
00520 bool NueStandard::PassesSysPreSelectionNoHE(int trkplane, int tlp, float energy)
00521 {
00522 bool good = true;
00523 good = good && (trkplane < 28);
00524 good = good && (tlp < 18);
00525 good = good && (energy > 0.5);
00526 return good;
00527 }
00528
00529
00530 bool NueStandard::PassesSysPreSelection(NueRecord *nr)
00531 {
00532 int tp = TMath::Abs(nr->srtrack.endPlane - nr->srtrack.begPlane);
00533 int tlp = nr->srtrack.trklikePlanes;
00534 float energy = nr->srevent.phNueGeV;
00535
00536 return PassesSysPreSelection(tp, tlp, energy);
00537 }
00538
00539 bool NueStandard::PassesSysPreSelection(int trkplane, int tlp, float energy)
00540 {
00541 bool good = true;
00542 good = good && (trkplane < 28);
00543 good = good && (tlp < 18);
00544 good = good && (energy > 0.5 && energy < 10);
00545 return good;
00546 }
00547
00548 double NueStandard::GetPIDValue(NueRecord *nr, Selection::Selection_t sel)
00549 {
00550 double retval = -9999;
00551
00552 switch(sel) {
00553 case Selection::kCuts: retval = nr->treepid.fCutPID; break;
00554 case Selection::kANN6: retval = nr->ann.pid_6inp; break;
00555 case Selection::kANN30: retval = nr->ann.pid_30inp; break;
00556 case Selection::kANN2PE: retval = nr->ann.pid_11inp; break;
00557 case Selection::kANN2PE_DAIKON04: retval = nr->ann.pid_11inp_daikon04; break;
00558 case Selection::kANN14_DAIKON04: retval = nr->ann.pid; break;
00559
00560 case Selection::kSSPID: retval = nr->subshowervars.pid; break;
00561 case Selection::kMCNN:
00562 if (nr->mcnnv.bestmatches < 50) retval = -0.5;
00563 else retval = nr->mcnnv.mcnn_var1; break;
00564
00565
00566 case Selection::kParticlePID:
00567 if(PassesParticlePIDPreselectionCut(nr))retval = nr->precord.event.pidF;
00568 break;
00569
00570 default: break;
00571 }
00572
00573 return retval;
00574 }
00575
00576 bool NueStandard::PassesPIDSelection(NueRecord *nr, Selection::Selection_t sel)
00577 {
00578 bool pass = false;
00579 double val = GetPIDValue(nr, sel);
00580
00581 switch(sel) {
00582 case Selection::kCuts: pass = (int(val) == 1); break;
00583 case Selection::kANN6: pass = val > 0.5; break;
00584 case Selection::kANN30: pass = val > 0.5; break;
00585 case Selection::kANN2PE: pass = val > 0.7; break;
00586 case Selection::kANN2PE_DAIKON04: pass = val > 0.7; break;
00587 case Selection::kANN14_DAIKON04: pass = val > 0.75; break;
00588 case Selection::kSSPID: pass = val > 0.67; break;
00589 case Selection::kMCNN: pass = val > 0.80; break;
00590 case Selection::kParticlePID: pass = PassesParticlePIDCut(nr); break;
00591 default: break;
00592 }
00593
00594 return pass;
00595 }
00596
00597 bool NueStandard::PassesParticlePIDCut(NueRecord *nr)
00598 {
00599 bool passPID=true;
00600
00601 passPID = passPID && nr->precord.event.pidF>0.7;
00602
00603 if(!passPID)return false;
00604
00605
00606 return passPID && PassesParticlePIDPreselectionCut(nr);
00607
00608
00609 }
00610
00611
00612 bool NueStandard::PassesParticlePIDPreselectionCut(NueRecord *nr)
00613 {
00614
00615
00616 bool passFid=true;
00617 passFid = passFid && (nr->precord.event.inFiducial==1);
00618
00619 if(!passFid)return false;
00620
00621
00622 double visenergy = nr->precord.event.visenergy;
00623
00624
00625 int det = nr->GetHeader().GetVldContext().GetDetector();
00626 if(det == Detector::kFar)
00627 {
00628 float offset = 0.489987;
00629 float slope = 0.0387301;
00630 visenergy = visenergy*slope+offset;
00631 }else if(det == Detector::kNear)
00632 {
00633 float offset = 0.4803261;
00634 float slope = 0.03799819;
00635 visenergy = visenergy*slope+offset;
00636 }else{
00637 printf("please don't run in a detector that is not near or far (NueStandard::PassesParticlePIDCut)\n");
00638 exit(1);
00639 }
00640
00641 bool passPre=true;
00642
00643 double event_length=nr->precord.event.max_z-nr->precord.event.min_z;
00644 passPre = passPre && event_length>0.1 && event_length<1.2;
00645 passPre = passPre && nr->precord.particles.longest_s_particle_s>0.1 &&
00646 nr->precord.particles.longest_s_particle_s<1.2;
00647 passPre = passPre && nr->precord.particles.ntot>0;
00648 passPre = passPre && visenergy>0.5 && visenergy<8;
00649
00650 return passPre && passFid;
00651
00652 }
00653
00654
00655 bool NueStandard::IsLargestEvent(NueRecord *nr)
00656 {
00657 if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar){
00658 if(nr->srevent.largestEvent == 1) return true;
00659 return false;
00660 }
00661 return true;
00662 }
00663
00664 bool NueStandard::PassesSelection(NueRecord *nr, Selection::Selection_t sel)
00665 {
00666 bool pass = false;
00667
00668 bool dq = NueStandard::PassesDataQuality(nr);
00669 bool infid = NueStandard::IsInFid(nr) && dq;
00670
00671 bool isMR = nr->GetHeader().FoundMR();
00672
00673 if (isMR){
00674 bool mrfid = PassesMRCCFiducial(nr);
00675 bool mrps = PassesMRCCPreSelection(nr);
00676
00677 infid = infid && mrfid && mrps;
00678 }
00679
00680 bool basic = NueStandard::PassesPreSelectionBasicCuts(nr) && infid;
00681 bool presel = infid && NueStandard::PassesPreSelection(nr);
00682 bool pid = NueStandard::PassesPIDSelection(nr,sel);
00683
00684 switch(sel) {
00685 case Selection::kNone: pass = true; break;
00686 case Selection::kDataQual: pass = dq; break;
00687 case Selection::kFid: pass = infid; break;
00688 case Selection::kBasic: pass = basic; break;
00689 case Selection::kPre: pass = presel; break;
00690 case Selection::kCuts: pass = presel && pid; break;
00691 case Selection::kANN6: pass = presel && pid; break;
00692 case Selection::kANN30: pass = presel && pid; break;
00693 case Selection::kANN2PE: pass = presel && pid; break;
00694 case Selection::kANN2PE_DAIKON04: pass = presel && pid; break;
00695 case Selection::kANN14_DAIKON04: pass = presel && pid; break;
00696 case Selection::kSSPID: pass = presel && pid; break;
00697 case Selection::kMCNN: pass = presel && pid; break;
00698 case Selection::kMDA: pass = presel && false; break;
00699 case Selection::kBDT: pass = presel && false; break;
00700 case Selection::kKNue: pass = presel && false; break;
00701 case Selection::kCC: pass = infid &&
00702 NueStandard::PassesCCSelection(nr); break;
00703 default: break;
00704 }
00705
00706 return pass;
00707 }
00708
00709 bool NueStandard::PassesSelection(NueRecord *nr, Selection::Selection_t sel, Selection::Selection_t sel2)
00710 {
00711 bool pass = false;
00712
00713 bool dq = NueStandard::PassesDataQuality(nr);
00714 bool infid = NueStandard::IsInFid(nr) && dq;
00715 bool basic = NueStandard::PassesPreSelectionBasicCuts(nr);
00716 bool presel = NueStandard::PassesPreSelection(nr);
00717 bool pid = NueStandard::PassesPIDSelection(nr,sel);
00718
00719 switch(sel2) {
00720 case Selection::kDataQual: dq = true; break;
00721 case Selection::kFid: infid = true; break;
00722 case Selection::kBasic: basic = true; break;
00723 case Selection::kPre: presel = true; break;
00724 default: break;
00725 }
00726
00727 bool isMR = nr->GetHeader().FoundMR();
00728
00729 if(isMR){
00730 bool mrfid = true;
00731 bool mrps = PassesMRCCPreSelection(nr);
00732
00733 infid = infid && mrfid && mrps;
00734 }
00735
00736 basic = basic && infid;
00737 presel = dq && infid && presel;
00738
00739 switch(sel) {
00740 case Selection::kNone: pass = true; break;
00741 case Selection::kDataQual: pass = dq; break;
00742 case Selection::kFid: pass = infid; break;
00743 case Selection::kBasic: pass = basic; break;
00744 case Selection::kPre: pass = presel; break;
00745 case Selection::kCuts: pass = presel && pid; break;
00746 case Selection::kANN6: pass = presel && pid; break;
00747 case Selection::kANN30: pass = presel && pid; break;
00748 case Selection::kANN2PE: pass = presel && pid; break;
00749 case Selection::kANN2PE_DAIKON04: pass = presel && pid; break;
00750 case Selection::kANN14_DAIKON04: pass = presel && pid; break;
00751 case Selection::kSSPID: pass = presel && pid; break;
00752 case Selection::kMCNN: pass = presel && pid; break;
00753 case Selection::kMDA: pass = presel && false; break;
00754 case Selection::kBDT: pass = presel && false; break;
00755 case Selection::kKNue: pass = presel && false; break;
00756 case Selection::kCC: pass = infid &&
00757 NueStandard::PassesCCSelection(nr); break;
00758 default: break;
00759 }
00760
00761 return pass;
00762 }
00763
00764
00765 bool NueStandard::PassesCCSelection(NueRecord *nr)
00766 {
00767 int ntrack = nr->srevent.tracks;
00768 int pass = nr->srtrack.passedFit;
00769 int endPlaneU = nr->srtrack.endPlaneU;
00770 int endPlaneV = nr->srtrack.endPlaneV;
00771 int deltaUVVtx = nr->srtrack.deltaUVVtx;
00772
00773 if (ntrack < 1){ pass = 0; endPlaneU = endPlaneV = deltaUVVtx = 300; }
00774
00775 bool trackPass = (pass == 1) ||
00776 (deltaUVVtx <= 5 && TMath::Abs(endPlaneU - endPlaneV) <= 40
00777 && endPlaneU < 270 && endPlaneV < 270);
00778
00779
00780 return (ntrack > 0) && trackPass && nr->anainfo.roCCPID > 0.3;
00781 }
00782
00783
00784 double NueStandard::GetRPWBeamWeight(NueRecord *nr, bool ismrcc)
00785 {
00786
00787
00788 std::vector<double> pots;
00789
00790 Detector::Detector_t det = nr->GetHeader().GetVldContext().GetDetector();
00791 BeamType::BeamType_t beam = nr->GetHeader().GetBeamType();
00792
00793 if(beam != BeamType::kL010z185i
00794 &&beam != BeamType::kL010z185i_i124
00795 &&beam != BeamType::kL010z185i_i191
00796 &&beam != BeamType::kL010z185i_i213
00797 &&beam != BeamType::kL010z185i_i224
00798 &&beam != BeamType::kL010z185i_i232
00799 &&beam != BeamType::kL010z185i_i243
00800 &&beam != BeamType::kL010z185i_i257
00801 &&beam != BeamType::kL010z185i_i282
00802 &&beam != BeamType::kL010z185i_i303
00803 &&beam != BeamType::kL010z185i_i324
00804
00805 &&beam != BeamType::kL010z000i
00806 &&beam != BeamType::kL010z000i_i209
00807 &&beam != BeamType::kL010z000i_i225
00808 &&beam != BeamType::kL010z000i_i232
00809 &&beam != BeamType::kL010z000i_i259
00810 &&beam != BeamType::kL010z000i_i300
00811 &&beam != BeamType::kL010z000i_i317
00812 &&beam != BeamType::kL010z000i_i326
00813 &&beam != BeamType::kL010z000i_i380){
00814
00815 MAXMSG("NueStandard",Msg::kWarning,5)<<"Can't use NueStandard::GetRPWBeamWeight for non L010185 or L010000 beams, stop it!"<<endl;
00816 return 0;
00817 }
00818
00819 if (det==Detector::kNear){
00820 if (ismrcc){
00821 for(int i=0;i<NRUNPERIODS;i++){
00822 pots.push_back(pot_ndmrcc[i]);
00823 }
00824 }
00825 else if (beam == BeamType::kL010z185i
00826 ||beam == BeamType::kL010z185i_i124
00827 ||beam == BeamType::kL010z185i_i191
00828 ||beam == BeamType::kL010z185i_i213
00829 ||beam == BeamType::kL010z185i_i224
00830 ||beam == BeamType::kL010z185i_i232
00831 ||beam == BeamType::kL010z185i_i243
00832 ||beam == BeamType::kL010z185i_i257
00833 ||beam == BeamType::kL010z185i_i282
00834 ||beam == BeamType::kL010z185i_i303
00835 ||beam == BeamType::kL010z185i_i324){
00836 for(int i=0;i<NRUNPERIODS;i++){
00837 pots.push_back(pot_nd[i]);
00838 }
00839 }
00840 else if (beam==BeamType::kL010z000i
00841 ||beam == BeamType::kL010z000i_i209
00842 ||beam == BeamType::kL010z000i_i225
00843 ||beam == BeamType::kL010z000i_i232
00844 ||beam == BeamType::kL010z000i_i259
00845 ||beam == BeamType::kL010z000i_i300
00846 ||beam == BeamType::kL010z000i_i317
00847 ||beam == BeamType::kL010z000i_i326
00848 ||beam == BeamType::kL010z000i_i380){
00849 for(int i=0;i<NRUNPERIODS;i++){
00850 pots.push_back(pot_ndhornoff[i]);
00851 }
00852 }
00853 }
00854 else{
00855 if (ismrcc){
00856 for(int i=0;i<NRUNPERIODS;i++){
00857 pots.push_back(pot_fdmrcc[i]);
00858 }
00859 }
00860
00861 else if (beam==BeamType::kL010z185i){
00862 for(int i=0;i<NRUNPERIODS;i++){
00863 pots.push_back(pot_fd[i]);
00864 }
00865 }
00866
00867 else if (beam==BeamType::kL010z000i){
00868 MAXMSG("NueStandard",Msg::kWarning,5)<<"Can't use NueStandard::GetRPWBeamWeight for FD L010000 beams, stop it!"<<endl;
00869 return 0;
00870 }
00871 }
00872
00873 if(nr->mctrue.nuFlavor < -1000){
00874 MAXMSG("NueStandard",Msg::kWarning,5)<<"No truth info for this event returning 0 for beamweight"<<endl;
00875 return 0;
00876 }
00877
00878 double weight = GetRPWBeamWeight(nr->fluxweights.RPtotbeamweight,pots);
00879 return weight;
00880 }
00881
00882 double NueStandard::GetRPWBeamWeight(std::vector<double> weights, std::vector<double> pots)
00883 {
00884
00885 double w=0.;
00886 double p=0.;
00887 for(unsigned int i=0;i<weights.size();i++){
00888 w+=weights[i]*pots[i];
00889 p+=pots[i];
00890 }
00891
00892 if (p==0){
00893 cout<<"Total pots is set to zero, can not compute a exposure weighted average beam weight. Returning 1"<<endl;
00894 return 1;
00895 }
00896
00897 return w/p;
00898 }
00899
00900 bool NueStandard::PassesNCCleaningCuts(NueRecord* nr)
00901 {
00902
00903 if (TMath::Abs(nr->eventq.minTimeSeparation)<40e-9)
00904 return false;
00905
00906
00907 if (nr->srevent.totalStrips<5) return false;
00908
00909
00910 if ( (nr->srevent.totalStrips/(nr->srevent.planes*nr->srevent.planes))>1.0)
00911 return false;
00912
00913
00914
00915 if ( (nr->eventq.edgeActivityStrips>3)
00916 && (nr->eventq.edgeActivityPH>1000)
00917 && (nr->srevent.energyGeV<5.0)
00918 && (nr->srshower.planes>nr->srtrack.planes) )
00919 return false;
00920
00921 if ( (nr->eventq.oppEdgeStrips>3)
00922 && (nr->eventq.oppEdgePH>1000)
00923 && (nr->srevent.energyGeV<5.0 )
00924 && (nr->srshower.planes>nr->srtrack.planes) )
00925 return false;
00926
00927
00928 if (TMath::Abs(nr->eventq.closeTimeDeltaZ)<1.0
00929 && TMath::Abs(nr->eventq.minTimeSeparation)<120e-9)
00930 return false;
00931
00932
00933 return true;
00934 }
00935
00936 void NueStandard::SetDefaultOscParam()
00937 {
00938 Double_t dm2_12 = 8.0e-5;
00939 Double_t dm2_23 = 2.43e-3;
00940
00941 Double_t par[9] = {0};
00942 par[OscPar::kL] = 735.0;
00943 par[OscPar::kTh23] = 3.1415926/4.0;
00944 par[OscPar::kTh12] = 0.59365;
00945 par[OscPar::kTh13] = 0.19885;
00946 par[OscPar::kDeltaM23] = dm2_23;
00947 par[OscPar::kDeltaM12] = dm2_12;
00948 par[OscPar::kDensity] = 2.75;
00949 par[OscPar::kDelta] = 0;
00950 par[OscPar::kNuAntiNu] = 1;
00951
00952 fOscGen.SetOscParam(par);
00953 }
00954
00955 void NueStandard::SetDefaultOscParamNoNue()
00956 {
00957 NueStandard::SetDefaultOscParam();
00958 NueStandard::SetOscParam(OscPar::kTh13, 0);
00959 }
00960
00961 void NueStandard::SetOscParamBestFitANN()
00962 {
00963 NueStandard::SetDefaultOscParam();
00964 NueStandard::SetOscParam(OscPar::kTh13, 0.172088);
00965 }
00966
00967 void NueStandard::SetOscParamBestFitkNN()
00968 {
00969 NueStandard::SetDefaultOscParam();
00970 NueStandard::SetOscParam(OscPar::kTh13, 0.145518);
00971 }
00972
00973 void NueStandard::SetOscNoMatter()
00974 {
00975 fOscGen.SetOscParam(OscPar::kDensity, 1e-9);
00976 }
00977
00978 void NueStandard::SetOscParam(double *par)
00979 {
00980 fOscGen.SetOscParam(par);
00981 }
00982
00983 void NueStandard::SetOscParam(OscPar::OscPar_t pos, double val)
00984 {
00985 fOscGen.SetOscParam(pos, val);
00986 }
00987
00988 double NueStandard::GetOscWeight(int nuFlavor, int nonOsc, double E)
00989 {
00990 return fOscGen.Oscillate(nuFlavor, nonOsc, E);
00991 }
00992
00993 void NueStandard::FillDefaultOscParam(double* par)
00994 {
00995 Double_t dm2_12 = 8.0e-5;
00996 Double_t dm2_23 = 2.43e-3;
00997
00998 par[OscPar::kL] = 735.0;
00999 par[OscPar::kTh23] = 3.1415926/4.0;
01000 par[OscPar::kTh12] = 0.59365;
01001 par[OscPar::kTh13] = 0.19885;
01002 par[OscPar::kDeltaM23] = dm2_23;
01003 par[OscPar::kDeltaM12] = dm2_12;
01004 par[OscPar::kDensity] = 2.75;
01005 par[OscPar::kDelta] = 0;
01006 par[OscPar::kNuAntiNu] = 1;
01007 }
01008
01009 void NueStandard::GetOscParam(double* par){
01010 fOscGen.GetOscParam(par);
01011 }
01012
01013 Bool_t NueStandard::IsRun1(NueRecord* nr)
01014 {
01015 return(nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() < 1145036420);
01016 }
01017
01018
01019 Bool_t NueStandard::IsRun2(NueRecord* nr)
01020 {
01021 return(nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() > 1145036420 && nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() < 1190028111);
01022 }
01023
01024 Bool_t NueStandard::IsRun3(NueRecord* nr)
01025 {
01026 return(nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() > 1190028111 && nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() < 1249594050);
01027 }
01028
01029
01030 Double_t NueStandard::GetMCWeights(NueRecord *nr)
01031 {
01032
01033 Double_t eventWeight = 1.0;
01034
01035
01036 if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
01037 {
01038
01039 eventWeight *= NueStandard::GetSKZPBeamWeight(nr);
01040 }
01041
01042 return(eventWeight);
01043 }
01044
01045
01046
01047 Double_t NueStandard::GetSKZPBeamWeight(NueRecord *nr)
01048 {
01049
01050 static SKZPWeightCalculator skzpWC("DetXs",true);
01051
01052 static bool firstTimeFunctionCalled = true;
01053
01054 if(firstTimeFunctionCalled)
01055 {
01056
01057 skzpWC.PrintReweightConfig(std::cout);
01058 firstTimeFunctionCalled = false;
01059 }
01060
01061
01062 Double_t eventWeight = 1.0;
01063
01064
01065 if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
01066 {
01067
01068
01069 double pt = (nr->fluxinfo.tpx * nr->fluxinfo.tpx);
01070 pt += (nr->fluxinfo.tpy * nr->fluxinfo.tpy);
01071 pt = sqrt(pt);
01072
01073 eventWeight = skzpWC.GetBeamWeight(
01074 nr->GetHeader().GetVldContext().GetDetector() ,
01075 BeamType::ToZarko( nr->GetHeader().GetBeamType() ) ,
01076
01077 nr->fluxinfo.tptype ,
01078 pt ,
01079 nr->fluxinfo.tpz ,
01080
01081 nr->mctrue.nuEnergy ,
01082 nr->mctrue.nonOscNuFlavor ,
01083 nr->GetHeader().GetVldContext()
01084 );
01085 }
01086
01087 return(eventWeight);
01088 }
01089
01090 void NueStandard::ModifyANNPID(NueRecord *nr) {
01091
01092
01093
01094 static bool firstcall = true;
01095 static TMultiLayerPerceptron* fneuralNet_14inp_daikon04 = 0;
01096
01097 double ann14pid = -9999.9;
01098
01099 char *srt_dir = getenv("SRT_PRIVATE_CONTEXT");
01100 char annfile[1000];
01101
01102 if (firstcall) {
01103 srt_dir = getenv("SRT_PRIVATE_CONTEXT");
01104 sprintf(annfile,"%s/NueAna/data/ann14_400_14_9.root",srt_dir);
01105 ifstream Test2(annfile);
01106 if (!Test2){
01107 srt_dir = getenv("SRT_PUBLIC_CONTEXT");
01108 sprintf(annfile,"%s/NueAna/data/ann14_400_14_9.root",srt_dir);
01109 ifstream Test_again2(annfile);
01110 if (!Test_again2){
01111 cout<<"Couldn't find ANN object, blame Jiajie"<<endl;
01112 exit(0);
01113 }
01114 }
01115
01116 static TFile *f = TFile::Open(annfile);
01117 fneuralNet_14inp_daikon04 = (TMultiLayerPerceptron*) f->Get("mlp");
01118 }
01119
01120 if (!fneuralNet_14inp_daikon04) {
01121 cout << "Couldn't find ANN object, blame Jiajie" << endl;
01122 exit(0);
01123 }
01124
01125 if (firstcall) {
01126 cout << "Get ann14 value from : " << annfile << endl;
01127 firstcall = false;
01128 }
01129
01130 NueConvention::NueEnergyCorrection(nr);
01131
01132 double paras[14];
01133 paras[0] = nr->shwfit.par_a;
01134 paras[1] = nr->shwfit.par_b;
01135 paras[2] = nr->shwfit.uv_rms_9s_2pe_dw;
01136 paras[3] = nr->fracvars.fract_road;
01137 paras[4] = nr->shwfit.LongE;
01138 paras[5] = nr->fracvars.shw_max;
01139 paras[6] = nr->fracvars.shw_slp;
01140 paras[7] = nr->srevent.phNueGeV;
01141 paras[8] = nr->fracvars.dis2stp;
01142 paras[9] = nr->fracvars.fract_1_plane;
01143 paras[10] = nr->fracvars.fract_5_planes;
01144 paras[11] = nr->fracvars.fract_6_counters;
01145 paras[12] = nr->fracvars.fract_20_counters;
01146 paras[13] = TMath::Abs(nr->srevent.endPlane - nr->srevent.begPlane);
01147
01148 int pass = 1;
01149
01150 if (nr->shwfit.par_a<-1000) pass = 0;
01151 if (nr->shwfit.par_b<-1000) pass = 0;
01152 if (nr->shwfit.uv_rms_9s_2pe_dw<-1000) pass = 0;
01153 if (nr->fracvars.fract_1_plane<-1000) pass = 0;
01154 if (nr->fracvars.fract_5_planes<-1000) pass = 0;
01155 if (nr->fracvars.fract_6_counters<-1000) pass = 0;
01156 if (nr->fracvars.fract_20_counters<-1000) pass = 0;
01157 if (nr->fracvars.fract_road<-1000) pass = 0;
01158 if (nr->shwfit.LongE<-1000) pass = 0;
01159 if (nr->shwfit.LongE>1000) pass = 0;
01160 if (nr->fracvars.shw_max<-1000) pass = 0;
01161 if (nr->fracvars.dis2stp<-1000) pass = 0;
01162 if (nr->fracvars.shw_slp<0) pass = 0;
01163 if (nr->srevent.endPlane<-1000) pass = 0;
01164 if (nr->srevent.begPlane<-1000) pass = 0;
01165
01166 if (pass) {
01167 ann14pid = fneuralNet_14inp_daikon04->Evaluate(0, paras);
01168 }
01169
01170
01171 nr->ann.pid = ann14pid;
01172 }