11 #include "CAFAna/Cuts/NueCutsFirstAna.h" 15 #include "OscLib/func/IOscCalculator.h" 23 #define ELASTICVAR(VAR) \ 24 Var({"vtx.nelastic", "vtx.elastic.*"}, \ 25 [](const caf::StandardRecord* sr) \ 27 if(sr->vtx.nelastic < 1) return -1000.; \ 28 return double(sr->vtx.elastic[0].vtx.VAR); \ 41 #define SHWLIDVAR(VAR) \ 42 Var({"shw.nshwlid", "shw.shwlid.*"}, \ 43 [](const caf::StandardRecord* sr) \ 45 if(sr->shw.nshwlid < 1) return -1000.; \ 46 return double(sr->shw.shwlid[0].VAR); \ 64 const Var kHadCalE({
"shw.nshwlid",
"shw.shwlid.*",
"slc.calE"},
69 sr->shw.shwlid[0].calE);
72 #define ELECIDVAR(VAR) \ 73 Var({"sel.elecid.nshwlid", "sel.elecid.shwlid.*"}, \ 74 [](const caf::StandardRecord* sr) \ 76 if(sr->sel.elecid.nshwlid < 1) return -1000.; \ 77 return double(sr->sel.elecid.shwlid[0].VAR); \ 114 SpectrumLoader loaderData(
"defname: prod_caf_S15-05-22a_nd_numi_goodruns with stride 100");
115 SpectrumLoader loaderDataStagger(
"defname: prod_caf_S15-05-22a_nd_numi_stagger_goodruns with stride 100");
116 SpectrumLoader loaderMC(
"defname: prod_caf_S15-05-22_nd_genie_fhc_nonswap with stride 100");
132 const Var kPtp({
"sel.nuecosrej.photptp"},
169 {
"shwstartx", {
"Shower X Start",
Binning::Simple(50, -200, +200), kShwStartX}},
170 {
"shwstarty", {
"Shower Y Start",
Binning::Simple(50, -200, +200), kShwStartY}},
171 {
"shwstartz", {
"Shower Z Start",
Binning::Simple(50, 0, +1000), kShwStartZ}},
172 {
"shwstopx", {
"Shower X Stop",
Binning::Simple(50, -200, +200), kShwStopX}},
173 {
"shwstopy", {
"Shower Y Stop",
Binning::Simple(50, -200, +200), kShwStopY}},
174 {
"shwstopz", {
"Shower Z Stop",
Binning::Simple(70, 0, +1400), kShwStopZ}},
175 {
"longprong", {
"Longest prong (cm)",
Binning::Simple(60, 0, 600), kLongestProng}},
177 {
"shw_nhit", {
"Number of hits in primary shower",
Binning::Simple(50, 0, 300), kShwNHit}},
178 {
"shw_len", {
"Length of primary shower (cm)",
Binning::Simple(50, 0, 500), kShwLen}},
179 {
"shw_width", {
"Width of primary shower (cm)",
Binning::Simple(20, 0, 20), kShwWidth}},
180 {
"shw_gap", {
"Primary shower gap to vertex (cm)",
Binning::Simple(25, 0, 200), kShwGap}},
181 {
"shw_efrac", {
"Fraction of slice energy in shower",
Binning::Simple(52, -.02, 1.02), kShwEFrac}},
183 {
"shw_e", {
"Primary shower calorimetric energy (GeV)",
Binning::Simple(30, 0, 3), kShwCalE}},
188 {
"hits_per_plane", {
"Hits per plane",
Binning::Simple(10, 0, 10), kHitsPerPlane}},
189 {
"pi0mass", {
"#pi^{0} mass (GeV)",
Binning::Simple(50, 0, .5), kPi0Mass}},
201 {
"epi0lll", {
"e/#pi^{0} LLL",
Binning::Simple(50, -1.2, 1.2), kEPi0LLL}},
215 const Cut sels[
kNumSels] = {
kNoCut, kNueNDFirstAnaPresel, kNueNDFirstAnaPreselPlusLEM, kNueNDFirstAnaPreselPlusLID};
222 for(
int selIdx = 0; selIdx <
kNumSels; ++selIdx){
223 for(
int varIdx = 0; varIdx <
kNumVars; ++varIdx){
225 spects[selIdx][varIdx] =
new Spectrum(loaderData, axis, sels[selIdx]);
226 spectsStagger[selIdx][varIdx] =
new Spectrum(loaderDataStagger, axis, sels[selIdx]);
228 axis.label, axis.bins, axis.var,
235 loaderDataStagger.
Go();
237 TFile*
fout =
new TFile(
"fout.root",
"RECREATE");
238 for(
int selIdx = 0; selIdx <
kNumSels; ++selIdx){
239 TDirectory*
d = fout->mkdir(selNames[selIdx].c_str());
240 for(
int varIdx = 0; varIdx <
kNumVars; ++varIdx){
241 const char*
name = defs[varIdx].
name.c_str();
int isinf(const stan::math::var &a)
Cuts and Vars for the 2020 FD DiF Study.
float pid
The default PID value - normally use this one.
virtual void SaveTo(TDirectory *dir, const std::string &name) const
void SetSpillCut(const SpillCut &cut)
const Var kEPerHit([](const caf::SRProxy *sr){if(sr->slc.nhit >0) return 1000.0 *(sr->slc.calE/sr->slc.nhit);else return-5.;})
const Var kHadCalE([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return float(sr->slc.calE);if(sr->vtx.elastic.fuzzyk.nshwlid< 1) return float(sr->slc.calE);return((sr->slc.calE- sr->vtx.elastic.fuzzyk.png[0].shwlid.calE));})
Representation of a spectrum in any variable, with associated POT.
int isnan(const stan::math::var &a)
const Var kLongestProng([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return 0.f;if(sr->vtx.elastic.fuzzyk.npng==0) return 0.f;auto idx=sr->vtx.elastic.fuzzyk.longestidx;return float(sr->vtx.elastic.fuzzyk.png[idx].len);})
const Var kCaloE
Summed calorimetric energy of all hits in slice, uncorrected.
const Var kConfusion([](const caf::SRProxy *sr){if(sr->sel.lem.pid< .47 &&sr->sel.lid.ann< .63) return.5;if(sr->sel.lem.pid< .47 &&sr->sel.lid.ann >=.63) return 1.5;if(sr->sel.lem.pid >=.47 &&sr->sel.lid.ann< .63) return 2.5;if(sr->sel.lem.pid >=.47 &&sr->sel.lid.ann >=.63) return 3.5;return-5.;})
SRNueCosRej nuecosrej
Output from NueCosRej (Nue Cosmic Rejection)
const SpillCut kStandardDQCuts([](const caf::SRSpillProxy *spill){if(spill->dcmedgematchfrac==0 &&spill->fracdcm3hits==0 &&spill->nmissingdcmslg==0) return bool(spill->isgoodspill); if(spill->det==caf::kNEARDET && (spill->fracdcm3hits > 0.45|| spill->nmissingdcms > 0)) return false; if(spill->eventincomplete) return false; if(spill->det==caf::kFARDET && spill->nmissingdcmslg > 0) return false; if(spill->det==caf::kFARDET && !spill->ismc && spill->dcmedgematchfrac<=0.2) return false;return true;})
Cut out events with a noisy detector or with parts missing.
float calE
Calorimetric energy of the cluster [GeV].
virtual void Go() override
Load all the registered spectra.
void SaveTo(TDirectory *dir, const std::string &name) const
const HistDef defs[kNumVars]
std::vector< float > Spectrum
unsigned int nhit
number of hits
The StandardRecord is the primary top-level object in the Common Analysis File trees.
Collaborates with Spectrum and OscillatableSpectrum to fill spectra from CAF files.
#define SIMPLEVAR(CAFNAME)
For Vars where literally all you need is a single CAF variable.
SRIDBranch sel
Selector (PID) branch.
SRSlice slc
Slice branch: nhit, extents, time, etc.
Standard interface to all prediction techniques.
const SpillCut kStandardSpillCuts
Apply this unless you're doing something special.
SRLem lem
Output from Library Event Matching (LEM)
void Format(TGraph *gr, int lcol, int lsty, int lwid, int mcol, int msty, double msiz)
const Var kNShwLID([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return 0u;return(unsigned int) sr->vtx.elastic.fuzzyk.nshwlid;})
const std::string selNames[kNumSels]
const Var kNElastic([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid){return 0.;}else{return 1.;}})
static Binning Simple(int n, double lo, double hi, const std::vector< std::string > &labels={})
const Cut kNoCut
The simplest possible cut: pass everything, used as a default.
static NullLoader kNullLoader
Dummy loader that doesn't load any files.