From e563f786f6fae3975fd02f4ba25e31836978ffeb Mon Sep 17 00:00:00 2001 From: VCLanNguyen Date: Mon, 28 Sep 2026 20:07:53 -0500 Subject: [PATCH 1/2] Fill SRTrueInteraction.prod_time/dk2gen and tag rec.mc.nu.generator in CAFMaker Retrieves the event's Dk2Nu product to fill the new prod_time/dk2gen fields in FillTrueNeutrino, and tags each rec.mc.nu entry's generator as kGENIE, kMeVPrtl, or kUnknownGenerator so downstream code (e.g. a dk2nu vertex-time correction) can scope itself to GENIE-only interactions. --- sbncode/CAFMaker/CAFMaker_module.cc | 23 ++++++++++++++++++++++- sbncode/CAFMaker/CMakeLists.txt | 1 + sbncode/CAFMaker/FillTrue.cxx | 6 ++++++ sbncode/CAFMaker/FillTrue.h | 3 +++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 4cc2fcffe..e532328da 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -41,6 +41,7 @@ #endif #include "ifdh_art/IFDHService/IFDH_service.h" +#include "dk2nu/tree/dk2nu.h" // ROOT includes #include "TFile.h" @@ -1469,6 +1470,14 @@ void CAFMaker::produce(art::Event& evt) noexcept { art::fill_ptr_vector(mcfluxes, mcflux_handle); } + art::Handle> dk2nu_handle; + GetByLabelStrict(evt, std::string("generator"), dk2nu_handle); + + std::vector> dk2nus; + if (dk2nu_handle.isValid()) { + art::fill_ptr_vector(dk2nus, dk2nu_handle); + } + // get the MCReco for the fake-reco art::Handle> mctrack_handle; GetByLabelStrict(evt, std::string("mcreco"), mctrack_handle); @@ -1552,9 +1561,13 @@ void CAFMaker::produce(art::Event& evt) noexcept { // holder for invalid MCFlux simb::MCFlux badflux; // default constructor gives nonsense values + // holder for invalid Dk2Nu (default-constructed ancestor vector is empty -- treated as "absent") + bsim::Dk2Nu baddk2nu; + for (size_t i=0; i mctruth, const simb::MCFlux &mcflux, + const bsim::Dk2Nu &dk2nu, const simb::GTruth& gtruth, const std::vector &srparticles, const std::map>> &id_to_truehit_map, @@ -549,6 +552,9 @@ namespace caf { // Set the MCFlux stuff srneutrino.initpdg = mcflux.fntype; srneutrino.baseline = mcflux.fdk2gen + mcflux.fgen2vtx; + srneutrino.dk2gen = mcflux.fdk2gen; + srneutrino.prod_time = (!dk2nu.ancestor.empty()) + ? dk2nu.ancestor.back().startt : std::numeric_limits::signaling_NaN(); srneutrino.parent_pdg = mcflux.fptype; srneutrino.parent_dcy_mode = mcflux.fndecay; srneutrino.prod_vtx.x = mcflux.fvx; diff --git a/sbncode/CAFMaker/FillTrue.h b/sbncode/CAFMaker/FillTrue.h index 419ed6ee9..e7579d799 100644 --- a/sbncode/CAFMaker/FillTrue.h +++ b/sbncode/CAFMaker/FillTrue.h @@ -33,6 +33,8 @@ #include "sbnanaobj/StandardRecord/StandardRecord.h" #include "sbnanaobj/StandardRecord/SRMeVPrtl.h" +namespace bsim { class Dk2Nu; } + namespace caf { struct HitsEnergy { @@ -86,6 +88,7 @@ namespace caf void FillTrueNeutrino(const art::Ptr mctruth, const simb::MCFlux &mcflux, + const bsim::Dk2Nu &dk2nu, const simb::GTruth& gtruth, const std::vector &srparticles, const std::map>> &id_to_truehit_map, From 28cb2b384faa65b95bca5d3aac29bd91ea675e4c Mon Sep 17 00:00:00 2001 From: VCLanNguyen Date: Tue, 29 Sep 2026 16:17:49 -0500 Subject: [PATCH 2/2] Fill MeVPrtl production-time from meson_dpos_beamcoord Companion to the sbnanaobj SRMeVPrtl::prod_time field: sources it from MeVPrtlTruth::meson_dpos_beamcoord.T(), the clean pre-beam-offset meson decay time (already threaded from the BNB flux ntuple's ini_t[0]). Co-Authored-By: Claude Sonnet 5 --- sbncode/CAFMaker/FillTrue.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/sbncode/CAFMaker/FillTrue.cxx b/sbncode/CAFMaker/FillTrue.cxx index 9d291b5fe..8be94a3f6 100644 --- a/sbncode/CAFMaker/FillTrue.cxx +++ b/sbncode/CAFMaker/FillTrue.cxx @@ -387,6 +387,7 @@ namespace caf { srtruth.position.y = truth.decay_pos.Y(); srtruth.position.z = truth.decay_pos.Z(); srtruth.time = truth.decay_pos.T(); + srtruth.prod_time = truth.meson_dpos_beamcoord.T(); //Meson time from flux file. srtruth.momentum.x = truth.mevprtl_mom.X(); srtruth.momentum.y = truth.mevprtl_mom.Y();