5 #include "CAFAna/Core/Binning.h" 7 #include "CAFAna/Core/Var.h" 25 #include "TMultiGraph.h" 30 #include "TPaveText.h" 34 #include "TAttMarker.h" 52 TLatex*
prelim =
new TLatex(.9, .95,
"NO#nuA Preliminary");
53 prelim->SetTextColor(
kBlue);
55 prelim->SetTextSize(2/30.);
56 prelim->SetTextAlign(32);
63 for (
size_t i=0;
i<name.size();
i++){
64 if(name[
i] ==
'/') pos =
i;
67 return tmp.substr(0, tmp.size()-5) +
"_web.root";
99 fHist(loaderMC, fAxis.
fObj, fSel.
fObj),
115 <<
"This script appears to be quite old. I've hacked some stuff to remove qepid, but I doubt it will run out of the box." 117 <<
"If you choose to run it, best of luck to you..." 121 gStyle->SetMarkerStyle(kFullCircle);
122 TGaxis::SetMaxDigits(3);
124 std::string fnameMC (
"/nova/ana/nu_e_ana/concat/prod_decaf_S15-05-22a_fd_genie_fhc_fluxswap_fdfluxv08_numu_contain.root");
130 TH1D* spillHist =
new TH1D(
"spills",
";Detector;Spills", 3, 0, 3);
141 std::vector<Selection> selections;
144 "Selected events pass numu containment and slice quality cuts. ");
146 "Selected events pass numu containment, slice quality, and ReMId cuts. ");
148 std::vector<TangibleAxis> variables;
150 variables.emplace_back(
151 HistAxis(
"Reconstructed Neutrino Energy [GeV]", kEnergyBinning,
kCCE),
152 "numuE",
"CC energy estimator. ");
154 variables.emplace_back(
156 "slcNHit",
"Number of hits in slice. " );
158 variables.emplace_back(
159 HistAxis(
"Slice Calorimetric Energy [GeV]", kEnergyBinning,
kCaloE),
160 "calE",
"Calorimetric energy of slice. " );
162 variables.emplace_back(
163 HistAxis(
"Reconstructed Hadronic Energy [GeV]", kHadronicEnergyBinning,
kHadE),
164 "hadE",
"Hadronic enery, i.e. numu energy estimate minus muon track energy. " );
166 variables.emplace_back(
168 "numuTrackE",
"Muon track Energy. " );
170 variables.emplace_back(
172 "hadEPerNHit",
"Average energy per hit in hadronic cluster, i.e. had_E/had_n_hit. " );
174 variables.emplace_back(
176 "trkEPerNHit",
"Average energy per hit on primary track, i.e. trk_E/trk_n_hit. " );
178 variables.emplace_back(
180 "hadNHit",
"Number of hits in hadronic cluster. ");
182 variables.emplace_back(
184 "hadcalE",
"Sum of calibrated energy deposits in hadronic cluster. " );
186 variables.emplace_back(
188 "hadTrkE",
"Hadronic Energy in active region, on the track. " );
190 variables.emplace_back(
192 "hadVisE",
"Hadronic Energy in active region, on the track. " );
194 variables.emplace_back(
196 "maxy",
"Maximum Y position of slice. " );
198 variables.emplace_back(
200 "nkal",
"Number of tracks in slice. " );
202 variables.emplace_back(
204 "nhit",
"Number of hits in slice. " );
206 variables.emplace_back(
208 "trkStartX",
"Track start x position. " );
210 variables.emplace_back(
212 "trkStartY",
"Track start y position. " );
214 variables.emplace_back(
216 "trkStartZ",
"Track start z position. " );
218 variables.emplace_back(
220 "trkEndX",
"Track stop x position. " );
222 variables.emplace_back(
224 "trkEndY",
"Track stop y position. " );
226 variables.emplace_back(
228 "trkEndZ",
"Track stop z position. " );
230 variables.emplace_back(
232 "sliceDuration",
"Slice duration. " );
234 variables.emplace_back(
236 "trkNhits",
"Number of hits on primary track. ");
238 variables.emplace_back(
240 "trkLength",
"Primary track length. " );
242 variables.emplace_back(
244 "scatLL",
"ReMId scattering log log-likelihood for primary track. " );
246 variables.emplace_back(
248 "dedxLL",
"ReMId dE/dx log log-likelihood for primary track. " );
250 variables.emplace_back(
252 "nonHadPlaneFrac",
"ReMId Non-hadronic plane fraction. " );
254 variables.emplace_back(
256 "remid",
"ReMId kNN score. " );
258 variables.emplace_back(
260 "slcUnCalibNHit",
"Uncalibrated slice nhit. " );
262 variables.emplace_back(
264 "slcMeanTime",
"Slice mean time TNS in microseconds. " );
266 variables.emplace_back(
268 "slcStartTime",
"Slice start time TNS in microseconds. " );
270 variables.emplace_back(
272 "slcEndTime",
"Slice end time TNS in microseconds. " );
274 variables.emplace_back(
276 "slcMinX",
"Slice Min X [m]. " );
278 variables.emplace_back(
280 "slcMinY",
"Slice Min Y [m]. " );
282 variables.emplace_back(
284 "slcMinZ",
"Slice Min Z [m]. " );
286 variables.emplace_back(
288 "slcMaxX",
"Slice Max X [m]. " );
290 variables.emplace_back(
292 "slcMaxY",
"Slice Max Y [m]. " );
294 variables.emplace_back(
296 "slcMaxZ",
"Slice Max Z [m]. " );
298 variables.emplace_back(
300 "slcExtentX",
"Slice Extent X [m]. " );
302 variables.emplace_back(
304 "slcExtentY",
"Slice Extent Y [m]. " );
306 variables.emplace_back(
308 "slcExtentZ",
"Slice Extent Z [m]. " );
310 variables.emplace_back(
312 "dirX",
"X-direction of muon track. " );
314 variables.emplace_back(
316 "dirY",
"Y-direction of muon track. " );
318 variables.emplace_back(
320 "dirZ",
"Z-direction of muon track. " );
322 variables.emplace_back(
324 "cosNumi",
"Beam direction of muon track. " );
326 variables.emplace_back(
329 "trkNPlaneGap",
"Track N Plane Gap. " );
331 variables.emplace_back(
334 "slcCalEPerNHit",
"Slice Energy Per Slice NHit. " );
338 std::vector<UsefulHist>
hists;
339 hists.reserve(selections.size() * variables.size());
341 for(
const auto& sel:selections){
342 for(
const auto& variable:variables){
343 hists.emplace_back(sel, variable, loaderMC);
348 double pot = hists[0].fHist.POT();
350 TFile inputfile(fnameMC.c_str(),
"READ");
351 TFile outputfile(fnameOutput.c_str(),
"RECREATE");
353 for(
const auto&
hist:hists){
356 temp->Write(tempName.c_str());
359 TH1F *pothist =
new TH1F(
"TotalPOT",
"TotalPOT", 1, 0, 1);
360 TH1F *evthist =
new TH1F(
"TotalEvents",
"TotalEvents", 1, 0, 1);
361 pothist->SetBinContent(1, pot);
362 evthist->SetBinContent(1, spillHist->GetEntries());
363 pothist->Write(
"TotalPOT");
364 evthist->Write(
"TotalEvents");
const Var kHadNHit([](const caf::SRProxy *sr){unsigned int nought=0;if(sr->trk.kalman.ntracks< 1) return nought;return sr->slc.nhit-sr->trk.kalman.tracks[0].nhit;})
_HistAxis< Var > HistAxis
Represent the binning of a Spectrum's x-axis.
Cuts and Vars for the 2020 FD DiF Study.
const Var kSlcMeanTime([](const caf::SRProxy *sr){return sr->slc.meantime/1000.;})
const Binning kRemidBinning
Binning for plotting remid attractively.
const Var kSlcMaxZ([](const caf::SRProxy *sr){return sr->slc.boxmax.Z()/100.;})
const Var kSlcCalEPerNHit([](const caf::SRProxy *sr){if(sr->slc.nhit > 0) return sr->slc.calE/(1.78 *sr->slc.nhit);return-5.;})
const Var kSlcMaxY([](const caf::SRProxy *sr){return sr->slc.boxmax.Y()/100.;})
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;})
Tangible< Cut > Selection
const Var kSliceDuration([](const caf::SRProxy *sr){return(sr->slc.endtime-sr->slc.starttime);})
const Var kSlcExtentY([](const caf::SRProxy *sr){return(sr->slc.boxmax.Y()-sr->slc.boxmin.Y())/100.;})
void SetSpillCut(const SpillCut &cut)
Det_t det
Detector, ND = 1, FD = 2, NDOS = 3.
const Var kDirZ([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].dir.Z();})
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 kSlcMinX([](const caf::SRProxy *sr){return sr->slc.boxmin.X()/100.;})
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 kNumuHadVisE([](const caf::SRProxy *sr){return kNumuHadCalE(sr)+kNumuHadTrkE(sr);})
const Var kSlcMaxX([](const caf::SRProxy *sr){return sr->slc.boxmax.X()/100.;})
const Cut kNumuContainND([](const caf::SRProxy *sr){return( sr->trk.kalman.ntracks > sr->trk.kalman.idxremid &&sr->slc.ncellsfromedge > 1 &&sr->slc.firstplane > 1
&&sr->slc.lastplane< 212 &&sr->trk.kalman.tracks[0].start.Z()< 1150
&&( sr->trk.kalman.tracks[0].stop.Z()< 1275 ||sr->sel.contain.kalyposattrans< 55) &&( sr->energy.numu.ndhadcalcatE +sr->energy.numu.ndhadcaltranE)< 0.03
&&sr->sel.contain.kalfwdcellnd > 4 &&sr->sel.contain.kalbakcellnd > 8);})
const Var kDirY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].dir.Y();})
Representation of a spectrum in any variable, with associated POT.
const Var kSlcMinY([](const caf::SRProxy *sr){return sr->slc.boxmin.Y()/100.;})
std::string GetOutputFileName(std::string &name)
virtual void AddSpillHistogram(TH1 *h, const SpillVar &var, const SpillCut &cut, const SpillVar &wei=kSpillUnweighted)
Uses include counting the total POT or spills in a run.
const Var kCaloE
Summed calorimetric energy of all hits in slice, uncorrected.
Tangible(const T &obj, const std::string &shortName, const std::string &blurb)
const Binning kHadronicEnergyBinning
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;})
Tangible< HistAxis > TangibleAxis
const Binning kEnergyBinning
UsefulHist(Selection sel, TangibleAxis tanAxis, SpectrumLoader &loaderMC, const Cut &bkg=kNoCut)
const Var kSlcStartTime([](const caf::SRProxy *sr){return sr->slc.starttime/1000.;})
virtual void Go() override
Load all the registered spectra.
const Cut kNumuNCRej([](const caf::SRProxy *sr){return(sr->sel.remid.pid >0.75);})
void validation_numu_nd()
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;})
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 kTrkNPlaneGap([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999) return int(sr->trk.kalman.tracks[0].nplanegap);return 500;})
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;})
Collaborates with Spectrum and OscillatableSpectrum to fill spectra from CAF files.
const Var kSlcEndTime([](const caf::SRProxy *sr){return sr->slc.endtime/1000.;})
const Var kDirX([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].dir.X();})
string shortName
THUMBNAIL BLOCK: We need to make a thumbnail for each.
const SpillCut kStandardSpillCuts
Apply this unless you're doing something special.
const Var kSlcExtentX([](const caf::SRProxy *sr){return(sr->slc.boxmax.X()-sr->slc.boxmin.X())/100.;})
Template for Var and SpillVar.
const Var kSlcExtentZ([](const caf::SRProxy *sr){return(sr->slc.boxmax.Z()-sr->slc.boxmin.Z())/100.;})
const Var kSlcUnCalibNHit([](const caf::SRProxy *sr){return sr->slc.nhit-sr->slc.ncalhit;})
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.
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);})