11 #include "CAFAna/nus/NuSPlotFunctions.h" 32 <<
"A Detector;\n\t1 For ND.\n\t2 for FD. \n" 33 <<
"An input samweb definition. \n" 34 <<
"An output file name. \n" 40 unsigned int NumCuts=1,
bool Debug=
false )
48 if ( (InputDef.find(
"prod_sumdecaf_") != std::string::npos ) &&
49 (InputDef.find(
"numu2017") != std::string::npos ) ) {
70 if ( WhichDetector == 1 ) {
72 }
else if (WhichDetector == 2) {
78 std::vector<Cut> kDefinedCut;
87 CutNames[0] =
"_QualCuts";
88 CutNames[1] =
"_DetCuts" ;
89 CutNames[2] =
"_CosmCuts";
90 CutNames[3] =
"_NeuCCuts";
92 if ( WhichDetector == 2 ) {
97 else if (NumCuts == 1) {
101 CutNames[0] =
"_NeuCCuts";
103 if ( WhichDetector == 2 ) {
110 if (InputDef.find(
"period1") != std::string::npos ) WhichPeriod =
"period1";
111 else if (InputDef.find(
"period2") != std::string::npos ) WhichPeriod =
"period2";
112 else if (InputDef.find(
"period3") != std::string::npos ) WhichPeriod =
"period3";
113 else if (InputDef.find(
"period5") != std::string::npos ) WhichPeriod =
"period5";
114 TString fdspecfile =
"/nova/app/users/karlwarb/Workspace/NuMuSystematics/FDQuantileHists/final_"+WhichPeriod+
"_FD_histo_for_quantile_cuts.root";
116 gDirectory->cd(
"dir_FDSpec2D");
117 TH2 *FDSpec2D = (TH2*)inFile.FindObjectAny(
"FDSpec2D");
122 const unsigned int NumQuants = 5;
123 Cut kQuantCut[NumQuants] = {
kNoCut, HadEFracQuantCuts[0], HadEFracQuantCuts[1], HadEFracQuantCuts[2], HadEFracQuantCuts[3] };
133 std::cout <<
"Before I declare anything, the following is set;\n" 134 <<
"\tWhichDetector is " << WhichDetector <<
"\n" 135 <<
"\tInput definit is " << InputDef <<
"\n" 136 <<
"\tOutput file name " << OutputName <<
"\n" 137 <<
"\tNumber of Cuts " << NumCuts <<
"\n" 138 <<
"\tIs debug mode is " << Debug <<
"\n" 225 const std::string CutName[4] = {
"_TopL",
"_TopR",
"_BotL",
"_BotR" };
228 for (
unsigned int cc=0;
cc<NumCuts; ++
cc) {
230 for (
unsigned int qq=0; qq<NumQuants; ++qq) {
232 const Cut kThisCut = kDefinedCut[
cc] && kQuantCut[qq];
304 for (
int cor=0; cor<4; ++cor) {
305 const Cut kCorCut = kThisCut && kCorner[cor];
325 TFile *
outFile =
new TFile(OutputName.c_str(),
"RECREATE");
335 for (
unsigned int cc=0;
cc<NumCuts; ++
cc) {
337 for (
unsigned int qq=0; qq<NumQuants; ++qq) {
340 sReconstEnergy[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sReconstEnergy")+TString(MyAppend) ) ;
341 sSliceTimeFull[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sSliceTimeFull")+TString(MyAppend) ) ;
342 sSliceTimeZoom[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sSliceTimeZoom")+TString(MyAppend) ) ;
343 sMuonEnergy [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sMuonEnergy") +TString(MyAppend) ) ;
344 sMuonEnPerHit [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sMuonEnPerHit") +TString(MyAppend) ) ;
345 sHadronEnergy [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sHadronEnergy") +TString(MyAppend) ) ;
346 sHadroEnPerHit[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sHadroEnPerHit")+TString(MyAppend) ) ;
347 sHadFracEnergy[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sHadFracEnergy")+TString(MyAppend) ) ;
348 sHitsPerSlice [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sHitsPerSlice") +TString(MyAppend) ) ;
349 sRemIDScore [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sRemIDScore") +TString(MyAppend) ) ;
350 sCVNCosmicScor[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sCVNCosmicScor")+TString(MyAppend) ) ;
351 sCVNNuMuIDScor[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sCVNNuMuIDScor")+TString(MyAppend) ) ;
352 sNuMuContPID [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sNuMuContPID") +TString(MyAppend) ) ;
353 sSANuMuContPID[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sSANuMuContPID")+TString(MyAppend) ) ;
355 sTrueNuEnergy [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrueNuEnergy") +TString(MyAppend) ) ;
356 sReTrOverTrNuE[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sReTrOverTrNuE")+TString(MyAppend) ) ;
359 sTrkStartX[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrkStartX")+TString(MyAppend) ) ;
360 sTrkStartY[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrkStartY")+TString(MyAppend) ) ;
361 sTrkStartZ[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrkStartZ")+TString(MyAppend) ) ;
362 sTrkEndX[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrkEndX") +TString(MyAppend) ) ;
363 sTrkEndY[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrkEndY") +TString(MyAppend) ) ;
364 sTrkEndZ[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrkEndZ") +TString(MyAppend) ) ;
365 sTrkLenXY[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sTrkLenXY") +TString(MyAppend) ) ;
368 sNumKalTracks [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sNumKalTracks") +TString(MyAppend) ) ;
369 sNumKalTrHits [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sNumKalTrHits") +TString(MyAppend) ) ;
370 sRatKalHitSlc [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sRatKalHitSlc") +TString(MyAppend) ) ;
371 sKalTrLength [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sKalTrLength") +TString(MyAppend) ) ;
372 sKalTrBeamAng [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sKalTrBeamAng") +TString(MyAppend) ) ;
373 sKalMostFwdCel[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sKalMostFwdCel")+TString(MyAppend) ) ;
374 sKalMostBakCel[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sKalMostBakCel")+TString(MyAppend) ) ;
375 sKalTrVer_MaxY[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sKalTrVer_MaxY")+TString(MyAppend) ) ;
376 sKalTrVer_MaxZ[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sKalTrVer_MaxZ")+TString(MyAppend) ) ;
377 sKalTrDir_Y [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sKalTrDir_Y") +TString(MyAppend) ) ;
378 sScattKalTrLen[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sScattKalTrLen")+TString(MyAppend) ) ;
381 sFirstHitCell [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sFirstHitCell") +TString(MyAppend) ) ;
382 sLastHitCell [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sLastHitCell") +TString(MyAppend) ) ;
383 sMaxActivity_Y[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sMaxActivity_Y")+TString(MyAppend) ) ;
384 sMinActivity_Y[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sMinActivity_Y")+TString(MyAppend) ) ;
385 sMinCellToEdge[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sMinCellToEdge")+TString(MyAppend) ) ;
386 sMaxActivity_Z[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sMaxActivity_Z")+TString(MyAppend) ) ;
387 sMinActivity_Z[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sMinActivity_Z")+TString(MyAppend) ) ;
391 sVisEInSlice [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sVisEInSlice") +TString(MyAppend) ) ;
392 sNHitInSlice [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sNHitInSlice") +TString(MyAppend) ) ;
393 sVisEPerHitSlc[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sVisEPerHitSlc")+TString(MyAppend) ) ;
395 sVisEInTrack [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sVisEInTrack") +TString(MyAppend) ) ;
396 sNHitInTrack [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sNHitInTrack") +TString(MyAppend) ) ;
397 sVisEPerHitTrk[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sVisEPerHitTrk")+TString(MyAppend) ) ;
399 sVisEInHadron [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sVisEInHadron") +TString(MyAppend) ) ;
400 sNHitInHadron [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sNHitInHadron") +TString(MyAppend) ) ;
401 sVisEPerHitHad[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sVisEPerHitHad")+TString(MyAppend) ) ;
404 sRemIDScatLLH [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sRemIDScatLLH") +TString(MyAppend) ) ;
405 sRemIDdEdxLLH [
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sRemIDdEdxLLH") +TString(MyAppend) ) ;
406 sRemIDMeasFrac[
cc][qq] -> Predict(&calc).
SaveTo( outFile, TString(
"sRemIDMeasFrac")+TString(MyAppend) ) ;
409 for (
int cor=0; cor<4; ++cor) {
410 sCor_RecEn[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_RecEn")+TString(MyAppend)+TString(CutName[cor]) ) ;
411 sCor_MuoEn[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_MuoEn")+TString(MyAppend)+TString(CutName[cor]) ) ;
412 sCor_HadEn[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_HadEn")+TString(MyAppend)+TString(CutName[cor]) ) ;
413 sCor_HFrEn[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_HFrEn")+TString(MyAppend)+TString(CutName[cor]) ) ;
415 sCor_RecTr[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_RecTr")+TString(MyAppend)+TString(CutName[cor]) ) ;
416 sCor_MuoTr[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_MuoTr")+TString(MyAppend)+TString(CutName[cor]) ) ;
417 sCor_HadTr[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_HadTr")+TString(MyAppend)+TString(CutName[cor]) ) ;
418 sCor_HFrTr[
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_HFrTr")+TString(MyAppend)+TString(CutName[cor]) ) ;
419 sCor_ReTr [
cc][qq][cor] -> Predict(&calc).
SaveTo( outFile, TString(
"sCor_ReTr" )+TString(MyAppend)+TString(CutName[cor]) ) ;
422 std::cerr <<
"\tWritten quantile set " << qq <<
" for cut set " <<
cc <<
" to disk!!!" <<
std::endl;
For nominal spectra and reweighting systs (xsec/flux)
Cuts and Vars for the 2020 FD DiF Study.
const Var kEnPHHad([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float)(sr->slc.calE-sr->trk.kalman.tracks[0].calE)/(float)(1.78 *(sr->slc.nhit-sr->trk.kalman.tracks[0].nhit));})
const Var kMaxKalYPos([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return std::max(sr->trk.kalman.tracks[0].start.Y()/100, sr->trk.kalman.tracks[0].stop.Y()/100);})
void ResetOscCalcToDefault(osc::IOscCalcAdjustable *calc)
Reset calculator to default assumptions for all parameters.
const Var kVisESlc([](const caf::SRProxy *sr){return sr->slc.calE;})
const Var kNHitSlc([](const caf::SRProxy *sr){return sr->slc.nhit;})
const Var kSlcMaxZ([](const caf::SRProxy *sr){return sr->slc.boxmax.Z()/100.;})
const Var kSlcMaxY([](const caf::SRProxy *sr){return sr->slc.boxmax.Y()/100.;})
const Cut kNumuContainND2017([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return false;for(unsigned int i=0;i< sr->vtx.elastic.fuzzyk.nshwlid;++i){TVector3 start=sr->vtx.elastic.fuzzyk.png[i].shwlid.start;TVector3 stop=sr->vtx.elastic.fuzzyk.png[i].shwlid.stop;if(std::min(start.X(), stop.X())< -180.0) return false;if(std::max(start.X(), stop.X()) > 180.0) return false;if(std::min(start.Y(), stop.Y())< -180.0) return false;if(std::max(start.Y(), stop.Y()) > 180.0) return false;if(std::min(start.Z(), stop.Z())< 20.0) return false;if(std::max(start.Z(), stop.Z()) > 1525.0) return false;}if(sr->trk.kalman.ntracks< 1) return false;for(unsigned int i=0;i< sr->trk.kalman.ntracks;++i){if(i==sr->trk.kalman.idxremid) continue;else if(sr->trk.kalman.tracks[i].start.Z() > 1275||sr->trk.kalman.tracks[i].stop.Z() > 1275) return false;}return(sr->trk.kalman.ntracks > sr->trk.kalman.idxremid &&sr->slc.firstplane > 1
&&sr->slc.lastplane< 212 &&sr->trk.kalman.tracks[0].start.Z()< 1100
&&(sr->trk.kalman.tracks[0].stop.Z()< 1275 ||sr->sel.contain.kalyposattrans< 55) &&sr->sel.contain.kalfwdcellnd > 5 &&sr->sel.contain.kalbakcellnd > 10);})
const Var kEnPHSlc([](const caf::SRProxy *sr){if(sr->slc.nhit< 1) return-10.0f;return(float)(sr->slc.calE)/(float)(1.78 *sr->slc.nhit);})
Collection of SpectrumLoaders for many configurations.
const HistAxis kHadEFracAxis("E_{had.} / E_{#nu}", Binning::Simple(200, 0, 1), kHadEFrac)
HistAxis that implements Hadronic Energy fraction binning used by L.Vinton to derive Hadronic Energy ...
const Var kNHitHad([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float)(sr->slc.nhit-sr->trk.kalman.tracks[0].nhit);})
const Var kMinCellEdg([](const caf::SRProxy *sr){return std::min((sr->sel.contain.kalfwdcell+sr->sel.contain.kalbakcell), (sr->sel.contain.cosfwdcell+sr->sel.contain.cosbakcell));})
const Var kTrkStartY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].start.Y()/100;})
const Var kFirstCell([](const caf::SRProxy *sr){return sr->slc.firstcell;})
const Var kSliceTime([](const caf::SRProxy *sr){return sr->slc.meantime/1000;})
const Var kTrueHFrE([](const caf::SRProxy *sr){float HadE=kTrueHadE(sr);float TruE=kTrueE(sr);return(HadE/TruE);})
const Var kLastCell([](const caf::SRProxy *sr){return sr->slc.lastcell;})
const Var kKalFwdCell([](const caf::SRProxy *sr){return sr->sel.contain.kalfwdcell;})
const Var kTrkLength([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].len/100;})
const Var kScattTrLen([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float)((float) sr->sel.cosrej.scatt/(float) sr->trk.kalman.tracks[0].len);})
const Var kHadEPerNHit([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.0f;int nHit=sr->slc.nhit-sr->trk.kalman.tracks[0].nhit;if(nHit<=0) return 0.0f;float hadE=sr->energy.numu.hadcalE;return hadE/nHit;})
const Var kDirY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].dir.Y();})
void Go()
Call Go() on all the loaders.
const Var kSlcMinY([](const caf::SRProxy *sr){return sr->slc.boxmin.Y()/100.;})
void SetSpillCut(const SpillCut &cut)
const Var kTrueE([](const caf::SRProxy *sr){assert(sr->mc.nnu==1);return sr->mc.nu[0].E;})
const Var kRatOfKalHi([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float)((float) sr->trk.kalman.tracks[0].nhit/(float) sr->slc.nhit);})
const Cut kNumuContainFD2017
const Cut kW_TR([](const caf::SRProxy *sr){bool IsTrue(sr->trk.kalman.tracks[0].start.X() > XCent && sr->trk.kalman.tracks[0].start.Y() > YCent);return IsTrue;})
const Var kSANumuContPID([](const caf::SRProxy *sr){return sr->sel.cosrej.numuSAcontpid;})
const Cut kW_BR([](const caf::SRProxy *sr){bool IsTrue(sr->trk.kalman.tracks[0].start.X() > XCent && sr->trk.kalman.tracks[0].start.Y()< YCent);return IsTrue;})
const Var kTrkStartZ([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].start.Z()/100;})
Optimized version of OscCalcPMNS.
const Var kNHitTrk([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float) sr->trk.kalman.tracks[0].nhit;})
void SetTh23(const T &th23) override
const std::string QuantNames[NumQuant]
const Cut kNumuPID2017([](const caf::SRProxy *sr){return(sr->sel.remid.pid > 0.5 &&sr->sel.cvn.numuid > 0.5);})
const HistAxis kNumuCCOptimisedAxis("Reconstructed Neutrino Energy (GeV)", kNumuCCEOptimisedBinning, kCCE)
HistAxis that implements optimised numuCCE from L. Vinton. See docdb 16332. This was close to 'custC'...
const Cut kW_TL([](const caf::SRProxy *sr){bool IsTrue=(sr->trk.kalman.tracks[0].start.X()< XCent && sr->trk.kalman.tracks[0].start.Y() > YCent);return IsTrue;})
const Cut kNumuCosmicRej2017([](const caf::SRProxy *sr){return(sr->sel.cosrej.anglekal > 0.5 && sr->sel.cosrej.numucontpid2020 > 0.5 && sr->slc.nhit< 400);})
const Var kTrkStartX([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].start.X()/100;})
void ComparisonPlots_MC()
const SystShifts kNoShift
const Var kTrkEndZ([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].stop.Z()/100;})
const Var kTrkLenXY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;float XLen=(sr->trk.kalman.tracks[0].start.X()-sr->trk.kalman.tracks[0].stop.X())/100;float YLen=(sr->trk.kalman.tracks[0].start.Y()-sr->trk.kalman.tracks[0].stop.Y())/100;return XLen-YLen;})
void SetDmsq32(const T &dmsq32) override
const Var kKalBakCell([](const caf::SRProxy *sr){return sr->sel.contain.kalbakcell;})
const Cut kW_BL([](const caf::SRProxy *sr){bool IsTrue(sr->trk.kalman.tracks[0].start.X()< XCent && sr->trk.kalman.tracks[0].start.Y()< YCent);return IsTrue;})
const Var kTrkEndY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].stop.Y()/100;})
const Var kTrkEndX([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].stop.X()/100;})
const Var kVisETrk([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float) sr->trk.kalman.tracks[0].calE;})
const Var kTrueMuonE([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return 0.f;if(sr->mc.nu[0].prim.empty()) return 0.f;if(std::abs(sr->mc.nu[0].prim[0].pdg)!=13) return 0.f;return float(sr->mc.nu[0].prim[0].p.E);})
void SetdCP(const T &dCP) override
std::vector< Cut > QuantileCutsFromTH2(TH2 *quantileHist, const HistAxis &independentAxis, const HistAxis &quantileAxis, const unsigned int &numQuantiles, const bool verbose)
: Do the same as the QuantileCuts function but taking in the TH2 instead of making it...
const Cut kInBeamSpill([](const caf::SRProxy *sr){if(sr->spill.run > util::kLastBadTimingRun) return kInBeamSpill_main(sr);else return kInBeamSpill_main(sr)||kInBeamSpill_shifted(sr);}, [](const caf::SRSpillProxy *spill){if(spill->run > util::kLastBadTimingRun) return kInBeamSpill_main.Livetime(spill);else return kInBeamSpill_main.Livetime(spill)+kInBeamSpill_shifted.Livetime(spill);}, [](const caf::SRSpillProxy *spill) -> double{return spill->spillpot;})
Does the event fall inside the window we call the beam spill?
const Var kVisEHad([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float)(sr->slc.calE-sr->trk.kalman.tracks[0].calE);})
const SpillCut kStandardSpillCuts
Apply this unless you're doing something special.
const Var kMaxKalZPos([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return std::max(sr->trk.kalman.tracks[0].start.Z()/100, sr->trk.kalman.tracks[0].stop.Z()/100);})
const Cut kNoCut
The simplest possible cut: pass everything, used as a default.
const Var kCosNumi([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999){if(sr->hdr.det==1){return sr->trk.kalman.tracks[0].dir.Dot(beamDirND);}if(sr->hdr.det==2){return sr->trk.kalman.tracks[0].dir.Dot(beamDirFD);}}return-5.f;})
const Var kSlcMinZ([](const caf::SRProxy *sr){return sr->slc.boxmin.Z()/100.;})
const Var kTrkNhits([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 65535;return int(sr->trk.kalman.tracks[0].nhit);})
const Var kEnPHTrk([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return(float)(sr->trk.kalman.tracks[0].calE)/(float)(1.78 *sr->trk.kalman.tracks[0].nhit);})
std::vector< std::string > CutNames