diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 4cc2fcffe..9c5fb87c9 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" @@ -1462,13 +1463,19 @@ void CAFMaker::produce(art::Event& evt) noexcept { } art::Handle> mcflux_handle; - GetByLabelStrict(evt, std::string("generator"), mcflux_handle); + GetByLabelStrict(evt, fParams.GenLabel(), mcflux_handle); std::vector> mcfluxes; if (mcflux_handle.isValid()) { art::fill_ptr_vector(mcfluxes, mcflux_handle); } + art::Handle> dk2nu_handle; + GetByLabelStrict(evt, fParams.GenLabel(), dk2nu_handle); + + std::vector const* dk2nus = + dk2nu_handle.isValid() ? dk2nu_handle.product() : nullptr; + // get the MCReco for the fake-reco art::Handle> mctrack_handle; GetByLabelStrict(evt, std::string("mcreco"), mctrack_handle); @@ -1552,9 +1559,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 const baddk2nu; + for (size_t i=0; iat(i) : baddk2nu; simb::GTruth gtruth; bool ok = GetAssociatedProduct(fmp_gtruth, i, gtruth); @@ -1569,7 +1580,13 @@ void CAFMaker::produce(art::Event& evt) noexcept { if ( !isRealData ){ - FillTrueNeutrino(mctruth, mcflux, gtruth, true_particles, id_to_truehit_map, srtruthbranch.nu.back(), i, fActiveVolumes); + FillTrueNeutrino(mctruth, mcflux, dk2nu, gtruth, true_particles, id_to_truehit_map, srtruthbranch.nu.back(), i, fActiveVolumes); + + SRTrueInteraction &nu = srtruthbranch.nu.back(); + caf::generator_ &generator = nu.generator; + if (ok) generator = caf::kGENIE; + else if (i < mevprtl_truths.size()) generator = caf::kMeVPrtl; + else generator = caf::kUnknownGenerator; srtruthbranch.nu.back().genie_evtrec_idx = fGenieEventCounter; diff --git a/sbncode/CAFMaker/CMakeLists.txt b/sbncode/CAFMaker/CMakeLists.txt index 4368ff48a..0d39a55cb 100644 --- a/sbncode/CAFMaker/CMakeLists.txt +++ b/sbncode/CAFMaker/CMakeLists.txt @@ -23,6 +23,7 @@ art_make_library( LIBRARY_NAME sbncode_CAFMaker ROOT::EG CLHEP::Random caf_RecoUtils + dk2nu::Tree lardataobj::AnalysisBase lardataobj::RecoBase lardataobj::Simulation diff --git a/sbncode/CAFMaker/FillTrue.cxx b/sbncode/CAFMaker/FillTrue.cxx index 4d1d794d0..3cf135a04 100644 --- a/sbncode/CAFMaker/FillTrue.cxx +++ b/sbncode/CAFMaker/FillTrue.cxx @@ -1,10 +1,13 @@ #include "FillTrue.h" +#include "dk2nu/tree/dk2nu.h" + #include "larcorealg/GeoAlgo/GeoAlgo.h" #include "larcorealg/Geometry/GeometryCore.h" #include "larcorealg/Geometry/WireReadoutGeom.h" #include "larevt/SpaceCharge/SpaceCharge.h" #include "larcore/CoreUtils/ServiceUtil.h" +#include "larcoreobj/SimpleTypesAndConstants/PhysicalConstants.h" #include "RecoUtils/RecoUtils.h" #include "CLHEP/Random/RandGauss.h" @@ -385,6 +388,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(); @@ -457,6 +461,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, @@ -548,7 +553,10 @@ namespace caf { // Set the MCFlux stuff srneutrino.initpdg = mcflux.fntype; - srneutrino.baseline = mcflux.fdk2gen + mcflux.fgen2vtx; + srneutrino.baseline = (mcflux.fdk2gen + mcflux.fgen2vtx) * util::kMeterToCentimeter; + srneutrino.dk2gen = mcflux.fdk2gen * util::kMeterToCentimeter; + srneutrino.prod_time = (!dk2nu.ancestor.empty()) + ? dk2nu.ancestor.back().startt / 1000. /* ns -> us */ : 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,