diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h index f5d049d97..3c3dddb0b 100644 --- a/sbncode/CAFMaker/CAFMakerParams.h +++ b/sbncode/CAFMaker/CAFMakerParams.h @@ -252,6 +252,18 @@ namespace caf "pandoraTrackCRTTrack" }; + Atom<string> CRTSpacePointMatchLabel { + Name("CRTSpacePointMatchLabel"), + Comment("Base label of track to CRT spacepoint matching producer."), + "crtspacepointmatching" + }; + + Atom<string> SBNDCRTTrackMatchLabel { + Name("SBNDCRTTrackMatchLabel"), + Comment("Base label of track to SBND CRT track matching producer."), + "crttrackmatching" + }; + Atom<string> TrackMCSLabel { Name("TrackMCSLabel"), Comment("Base label of track MCS momentum calculation producer."), @@ -267,15 +279,27 @@ namespace caf Atom<string> CRTHitLabel { Name("CRTHitLabel"), Comment("Label of sbn CRT hits."), - "crthit" // same for icarus and sbnd + "crthit" // icarus }; Atom<string> CRTTrackLabel { Name("CRTTrackLabel"), Comment("Label of sbn CRT tracks."), - "crttrack" // same for icarus and sbnd + "crttrack" // icarus }; - + + Atom<string> CRTSpacePointLabel { + Name("CRTSpacePointLabel"), + Comment("Label of sbnd CRT spacepoints."), + "crtspacepoints" // sbnd + }; + + Atom<string> SBNDCRTTrackLabel { + Name("SBNDCRTTrackLabel"), + Comment("Label of sbnd CRT tracks."), + "crttracks" // sbnd + }; + Atom<string> CRTPMTLabel { Name("CRTPMTLabel"), Comment("Label for the CRTPMT Matched variables from the crtpmt data product"), diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index c902272fc..a61e27e9a 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -276,6 +276,10 @@ class CAFMaker : public art::EDProducer { art::FindOneP<T> FindOnePStrict(const U& from, const art::Event& evt, const art::InputTag& label) const; + template <class T, class D, class U> + art::FindOneP<T, D> FindOnePDStrict(const U& from, + const art::Event& evt, + const art::InputTag& tag) const; /// \brief Retrieve an object from an association, with error handling /// @@ -1005,6 +1009,25 @@ art::FindOneP<T> CAFMaker::FindOnePStrict(const U& from, return ret; } +//...................................................................... +template <class T, class D, class U> +art::FindOneP<T, D> CAFMaker::FindOnePDStrict(const U& from, + const art::Event& evt, + const art::InputTag& tag) const { + art::FindOneP<T, D> ret(from, evt, tag); + + if (!tag.label().empty() && !ret.isValid() && fParams.StrictMode()) { + std::cout << "CAFMaker: No Assn from '" + << cet::demangle_symbol(typeid(from).name()) << "' to '" + << cet::demangle_symbol(typeid(T).name()) + << "' found under label '" << tag << "'. " + << "Set 'StrictMode: false' to continue anyway." << std::endl; + abort(); + } + + return ret; +} + //...................................................................... template <class T> bool CAFMaker::GetAssociatedProduct(const art::FindManyP<T>& fm, int idx, @@ -1311,40 +1334,64 @@ void CAFMaker::produce(art::Event& evt) noexcept { pass_flash_trig = *flashtrig_handle; } - // Fill various detector information associated with the event - // - // Get all of the CRT hits - std::vector<caf::SRCRTHit> srcrthits; - - art::Handle<std::vector<sbn::crt::CRTHit>> crthits_handle; - GetByLabelStrict(evt, fParams.CRTHitLabel(), crthits_handle); - // fill into event - //int64_t CRT_T0_reference_time = fParams.ReferenceCRTT0ToBeam() ? -srtrigger.beam_gate_time_abs : 0; // ns, signed - //double CRT_T1_reference_time = fParams.ReferenceCRTT1FromTriggerToBeam() ? srtrigger.trigger_within_gate : 0.; int64_t CRT_T0_reference_time = isRealData ? -srtrigger.beam_gate_time_abs : -fParams.CRTSimT0Offset(); double CRT_T1_reference_time = isRealData ? srtrigger.trigger_within_gate : -fParams.CRTSimT0Offset(); - if (crthits_handle.isValid()) { - const std::vector<sbn::crt::CRTHit> &crthits = *crthits_handle; - for (unsigned i = 0; i < crthits.size(); i++) { - srcrthits.emplace_back(); - FillCRTHit(crthits[i], fParams.CRTUseTS0(), CRT_T0_reference_time, CRT_T1_reference_time, srcrthits.back()); - } - } + // Fill various detector information associated with the event - // Get all of the CRT Tracks + std::vector<caf::SRCRTHit> srcrthits; std::vector<caf::SRCRTTrack> srcrttracks; + std::vector<caf::SRCRTSpacePoint> srcrtspacepoints; + std::vector<caf::SRSBNDCRTTrack> srsbndcrttracks; + + if(fDet == kICARUS) + { + art::Handle<std::vector<sbn::crt::CRTHit>> crthits_handle; + GetByLabelStrict(evt, fParams.CRTHitLabel(), crthits_handle); + // fill into event + if (crthits_handle.isValid()) { + const std::vector<sbn::crt::CRTHit> &crthits = *crthits_handle; + for (unsigned i = 0; i < crthits.size(); i++) { + srcrthits.emplace_back(); + FillCRTHit(crthits[i], fParams.CRTUseTS0(), CRT_T0_reference_time, CRT_T1_reference_time, srcrthits.back()); + } + } - art::Handle<std::vector<sbn::crt::CRTTrack>> crttracks_handle; - GetByLabelStrict(evt, fParams.CRTTrackLabel(), crttracks_handle); - // fill into event - if (crttracks_handle.isValid()) { - const std::vector<sbn::crt::CRTTrack> &crttracks = *crttracks_handle; - for (unsigned i = 0; i < crttracks.size(); i++) { - srcrttracks.emplace_back(); - FillCRTTrack(crttracks[i], fParams.CRTUseTS0(), srcrttracks.back()); + art::Handle<std::vector<sbn::crt::CRTTrack>> crttracks_handle; + GetByLabelStrict(evt, fParams.CRTTrackLabel(), crttracks_handle); + // fill into event + if (crttracks_handle.isValid()) { + const std::vector<sbn::crt::CRTTrack> &crttracks = *crttracks_handle; + for (unsigned i = 0; i < crttracks.size(); i++) { + srcrttracks.emplace_back(); + FillCRTTrack(crttracks[i], fParams.CRTUseTS0(), srcrttracks.back()); + } + } + } + else if(fDet == kSBND) + { + art::Handle<std::vector<sbnd::crt::CRTSpacePoint>> crtspacepoints_handle; + GetByLabelStrict(evt, fParams.CRTSpacePointLabel(), crtspacepoints_handle); + + if (crtspacepoints_handle.isValid()) { + const std::vector<sbnd::crt::CRTSpacePoint> &crtspacepoints = *crtspacepoints_handle; + for (unsigned i = 0; i < crtspacepoints.size(); i++) { + srcrtspacepoints.emplace_back(); + FillCRTSpacePoint(crtspacepoints[i], srcrtspacepoints.back()); + } + } + + art::Handle<std::vector<sbnd::crt::CRTTrack>> sbndcrttracks_handle; + GetByLabelStrict(evt, fParams.SBNDCRTTrackLabel(), sbndcrttracks_handle); + // fill into event + if (sbndcrttracks_handle.isValid()) { + const std::vector<sbnd::crt::CRTTrack> &sbndcrttracks = *sbndcrttracks_handle; + for (unsigned i = 0; i < sbndcrttracks.size(); i++) { + srsbndcrttracks.emplace_back(); + FillSBNDCRTTrack(sbndcrttracks[i], srsbndcrttracks.back()); + } + } } - } // Get all of the CRTPMT Matches .. std::vector<caf::SRCRTPMTMatch> srcrtpmtmatches; @@ -1622,6 +1669,14 @@ void CAFMaker::produce(art::Event& evt) noexcept { FindManyPStrict<anab::T0>(slcTracks, evt, fParams.CRTTrackMatchLabel() + slice_tag_suff); + art::FindOneP<sbnd::crt::CRTSpacePoint, anab::T0> foCRTSpacePointMatch = + FindOnePDStrict<sbnd::crt::CRTSpacePoint, anab::T0>(slcTracks, evt, + fParams.CRTSpacePointMatchLabel() + slice_tag_suff); + + art::FindOneP<sbnd::crt::CRTTrack, anab::T0> foSBNDCRTTrackMatch = + FindOnePDStrict<sbnd::crt::CRTTrack, anab::T0>(slcTracks, evt, + fParams.SBNDCRTTrackMatchLabel() + slice_tag_suff); + std::vector<art::FindManyP<recob::MCSFitResult>> fmMCSs; static const std::vector<std::string> PIDnames {"muon", "pion", "kaon", "proton"}; for (std::string pid: PIDnames) { @@ -1836,7 +1891,7 @@ void CAFMaker::produce(art::Event& evt) noexcept { fParams.TrackHitFillRRStartCut(), fParams.TrackHitFillRREndCut(), lar::providerFrom<geo::Geometry>(), dprop, trk); } - if (fmCRTHitMatch.isValid()) { + if (fmCRTHitMatch.isValid() && fDet == kICARUS) { art::FindManyP<sbn::crt::CRTHit> CRTT02Hit = FindManyPStrict<sbn::crt::CRTHit> (fmCRTHitMatch.at(iPart), evt, fParams.CRTHitMatchLabel() + slice_tag_suff); @@ -1846,9 +1901,25 @@ void CAFMaker::produce(art::Event& evt) noexcept { FillTrackCRTHit(fmCRTHitMatch.at(iPart), crthitmatch, fParams.CRTUseTS0(), CRT_T0_reference_time, CRT_T1_reference_time, trk); } // NOTE: SEE TODO AT fmCRTTrackMatch - if (fmCRTTrackMatch.isValid()) { + if (fmCRTTrackMatch.isValid() && fDet == kICARUS) { FillTrackCRTTrack(fmCRTTrackMatch.at(iPart), trk); } + + if(foCRTSpacePointMatch.isValid() && fDet == kSBND) + { + const art::Ptr<sbnd::crt::CRTSpacePoint> crtspacepoint = foCRTSpacePointMatch.at(iPart); + + if(crtspacepoint.isNonnull()) + FillTrackCRTSpacePoint(foCRTSpacePointMatch.data(iPart).ref(), crtspacepoint, trk); + } + if(foSBNDCRTTrackMatch.isValid() && fDet == kSBND) + { + const art::Ptr<sbnd::crt::CRTTrack> sbndcrttrack = foSBNDCRTTrackMatch.at(iPart); + + if(sbndcrttrack.isNonnull()) + FillTrackSBNDCRTTrack(foSBNDCRTTrackMatch.data(iPart).ref(), sbndcrttrack, trk); + } + // Truth matching if (fmTrackHit.isValid()) { if ( !isRealData ) { @@ -1912,17 +1983,21 @@ void CAFMaker::produce(art::Event& evt) noexcept { //####################################################### // Fill rec Tree //####################################################### - rec.nslc = rec.slc.size(); - rec.mc = srtruthbranch; - rec.fake_reco = srfakereco; - rec.nfake_reco = srfakereco.size(); - rec.pass_flashtrig = pass_flash_trig; // trigger result - rec.crt_hits = srcrthits; - rec.ncrt_hits = srcrthits.size(); - rec.crt_tracks = srcrttracks; - rec.ncrt_tracks = srcrttracks.size(); - rec.opflashes = srflashes; - rec.nopflashes = srflashes.size(); + rec.nslc = rec.slc.size(); + rec.mc = srtruthbranch; + rec.fake_reco = srfakereco; + rec.nfake_reco = srfakereco.size(); + rec.pass_flashtrig = pass_flash_trig; // trigger result + rec.crt_hits = srcrthits; + rec.ncrt_hits = srcrthits.size(); + rec.crt_tracks = srcrttracks; + rec.ncrt_tracks = srcrttracks.size(); + rec.crt_spacepoints = srcrtspacepoints; + rec.ncrt_spacepoints = srcrtspacepoints.size(); + rec.sbnd_crt_tracks = srsbndcrttracks; + rec.nsbnd_crt_tracks = srsbndcrttracks.size(); + rec.opflashes = srflashes; + rec.nopflashes = srflashes.size(); if (fParams.FillTrueParticles()) { rec.true_particles = true_particles; } diff --git a/sbncode/CAFMaker/CMakeLists.txt b/sbncode/CAFMaker/CMakeLists.txt index cd0283055..de8932790 100644 --- a/sbncode/CAFMaker/CMakeLists.txt +++ b/sbncode/CAFMaker/CMakeLists.txt @@ -34,6 +34,7 @@ art_make_library( LIBRARY_NAME sbncode_CAFMaker sbnobj::Common_CRT sbnobj::Common_Reco sbnobj::Common_Analysis + sbnobj::SBND_CRT lardataalg::DetectorInfo art::Framework_Services_System_TriggerNamesService_service sbncode_Metadata_MetadataSBN_service diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index 0655b1c02..1f8e0e8e9 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -112,6 +112,31 @@ namespace caf srtrack.hitb.plane = track.plane2; } + void FillCRTSpacePoint(const sbnd::crt::CRTSpacePoint &spacepoint, + caf::SRCRTSpacePoint &srspacepoint, + bool allowEmpty) + { + srspacepoint.position = SRVector3D(spacepoint.X(), spacepoint.Y(), spacepoint.Z()); + srspacepoint.position_err = SRVector3D(spacepoint.XErr(), spacepoint.YErr(), spacepoint.ZErr()); + srspacepoint.pe = spacepoint.PE(); + srspacepoint.time = spacepoint.Time(); + srspacepoint.time_err = spacepoint.TimeErr(); + srspacepoint.complete = spacepoint.Complete(); + } + + void FillSBNDCRTTrack(const sbnd::crt::CRTTrack &track, + caf::SRSBNDCRTTrack &srsbndcrttrack, + bool allowEmpty) + { + for(auto const& point : track.Points()) + srsbndcrttrack.points.emplace_back(point.X(), point.Y(), point.Z()); + + srsbndcrttrack.time = track.Time(); + srsbndcrttrack.time_err = track.TimeErr(); + srsbndcrttrack.pe = track.PE(); + srsbndcrttrack.tof = track.ToF(); + } + void FillCRTPMTMatch(const sbn::crt::CRTPMTMatching &match, caf::SRCRTPMTMatch &srmatch, bool allowEmpty){ @@ -540,6 +565,24 @@ namespace caf } } + void FillTrackCRTSpacePoint(const anab::T0 &t0match, + const art::Ptr<sbnd::crt::CRTSpacePoint> &spacepointmatch, + caf::SRTrack &srtrack, + bool allowEmpty) + { + srtrack.crtspacepoint.score = t0match.fTriggerConfidence; + FillCRTSpacePoint(*spacepointmatch, srtrack.crtspacepoint.spacepoint); + } + + void FillTrackSBNDCRTTrack(const anab::T0 &t0match, + const art::Ptr<sbnd::crt::CRTTrack> &trackmatch, + caf::SRTrack &srtrack, + bool allowEmpty) + { + srtrack.crtsbndtrack.score = t0match.fTriggerConfidence; + FillSBNDCRTTrack(*trackmatch, srtrack.crtsbndtrack.track); + } + void FillTrackMCS(const recob::Track& track, const std::array<std::vector<art::Ptr<recob::MCSFitResult>>, 4> &mcs_results, caf::SRTrack& srtrack, diff --git a/sbncode/CAFMaker/FillReco.h b/sbncode/CAFMaker/FillReco.h index ff68916a1..3049947b5 100644 --- a/sbncode/CAFMaker/FillReco.h +++ b/sbncode/CAFMaker/FillReco.h @@ -37,6 +37,8 @@ #include "sbnobj/Common/Reco/TPCPMTBarycenterMatch.h" #include "sbnobj/Common/CRT/CRTHit.hh" #include "sbnobj/Common/CRT/CRTTrack.hh" +#include "sbnobj/SBND/CRT/CRTSpacePoint.hh" +#include "sbnobj/SBND/CRT/CRTTrack.hh" #include "sbnobj/Common/CRT/CRTPMTMatching.hh" #include "nusimdata/SimulationBase/MCParticle.h" #include "nusimdata/SimulationBase/MCTruth.h" @@ -135,6 +137,16 @@ namespace caf caf::SRTrack &srtrack, bool allowEmpty = false); + void FillTrackCRTSpacePoint(const anab::T0 &t0match, + const art::Ptr<sbnd::crt::CRTSpacePoint> &spacepointmatch, + caf::SRTrack &srtrack, + bool allowEmpty = false); + + void FillTrackSBNDCRTTrack(const anab::T0 &t0match, + const art::Ptr<sbnd::crt::CRTTrack> &trackmatch, + caf::SRTrack &srtrack, + bool allowEmpty = false); + void FillTrackMCS(const recob::Track& track, const std::array<std::vector<art::Ptr<recob::MCSFitResult>>, 4> &mcs_results, caf::SRTrack& srtrack, @@ -193,6 +205,14 @@ namespace caf caf::SRCRTTrack &srtrack, bool allowEmpty = false); + void FillCRTSpacePoint(const sbnd::crt::CRTSpacePoint &spacepoint, + caf::SRCRTSpacePoint &srspacepoint, + bool allowEmpty = false); + + void FillSBNDCRTTrack(const sbnd::crt::CRTTrack &track, + caf::SRSBNDCRTTrack &srsbndcrttrack, + bool allowEmpty = false); + void FillOpFlash(const recob::OpFlash &flash, std::vector<recob::OpHit const*> const& hits, int cryo, diff --git a/sbncode/CosmicID/CMakeLists.txt b/sbncode/CosmicID/CMakeLists.txt index 4ab97c17f..527721870 100644 --- a/sbncode/CosmicID/CMakeLists.txt +++ b/sbncode/CosmicID/CMakeLists.txt @@ -4,6 +4,7 @@ cet_build_plugin( CRUMBS art::module fhiclcpp::fhiclcpp art::Persistency_Provenance canvas::canvas sbnobj::Common_Reco + sbnobj::SBND_CRT sbncode_GeoWrappers sbncode_LArRecoProducer lardataobj::RecoBase_AssnsDicts_dict diff --git a/sbncode/CosmicID/CRUMBS_module.cc b/sbncode/CosmicID/CRUMBS_module.cc index 469787d6b..d4c583b34 100644 --- a/sbncode/CosmicID/CRUMBS_module.cc +++ b/sbncode/CosmicID/CRUMBS_module.cc @@ -40,6 +40,8 @@ #include "sbnobj/Common/Reco/SimpleFlashMatchVars.h" #include "sbnobj/Common/Reco/StoppingChi2Fit.h" #include "sbncode/LArRecoProducer/TrackStoppingChi2Alg.h" +#include "sbnobj/SBND/CRT/CRTTrack.hh" +#include "sbnobj/SBND/CRT/CRTSpacePoint.hh" #include "sbnobj/Common/Reco/CRUMBSResult.h" #include "TTree.h" @@ -70,31 +72,31 @@ namespace sbn { void GetMaps(art::Event const& e, std::map<int, int> &trackIDToGenMap, std::map<int, std::string> &genTypeMap, std::map<int, int> &genCCNCMap, std::map<int, int> &genNuTypeMap); - art::Ptr<recob::PFParticle> GetSlicePrimary(art::Event const& e, - const art::Ptr<recob::Slice> &slice, + art::Ptr<recob::PFParticle> GetSlicePrimary(art::Event const& e, + const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::Slice> > &handleSlices); - std::vector<art::Ptr<anab::T0> > GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, - const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, - const art::ValidHandle<std::vector<recob::Slice> > &handleSlices); + std::vector<anab::T0> GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, + const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, + const art::ValidHandle<std::vector<recob::Slice> > &handleSlices); - std::vector<art::Ptr<anab::T0> > GetCRTHitT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, - const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, - const art::ValidHandle<std::vector<recob::Slice> > &handleSlices); + std::vector<anab::T0> GetCRTSPT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, + const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, + const art::ValidHandle<std::vector<recob::Slice> > &handleSlices); - float GetLongestTrackStoppingChi2Ratio(art::Event const& e, const art::Ptr<recob::Slice> &slice, + float GetLongestTrackStoppingChi2Ratio(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, const art::ValidHandle<std::vector<recob::Slice> > &handleSlices); - void FillCRTVars(const std::vector<art::Ptr<anab::T0> > &trackT0s, const std::vector<art::Ptr<anab::T0> > &hitT0s); + void FillCRTVars(const std::vector<anab::T0> &trackT0s, const std::vector<anab::T0> &hitT0s); void FillPandoraNuScoreVars(std::map<std::string, float> &propertiesMap); - std::vector<art::Ptr<recob::Hit> > GetAllSliceHits(art::Event const& e, - const art::Ptr<recob::Slice> &slice, + std::vector<art::Ptr<recob::Hit> > GetAllSliceHits(art::Event const& e, + const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::Slice> > &handleSlices); - void GetTruthMatching(art::Event const& e, const std::vector<art::Ptr<recob::Hit> > &sliceHits, const std::vector<art::Ptr<recob::Hit> > &allHits, + void GetTruthMatching(art::Event const& e, const std::vector<art::Ptr<recob::Hit> > &sliceHits, const std::vector<art::Ptr<recob::Hit> > &allHits, std::map<int, int> &trackIDToGenMap, int &matchedID, double &purity, double &completeness); int SliceTruthId(std::map<int, float> &purities); @@ -106,7 +108,7 @@ namespace sbn { // Module labels std::string fMCParticleModuleLabel, fGeneratorModuleLabel, fCosmicModuleLabel, fPFParticleModuleLabel, fHitModuleLabel, fTrackModuleLabel, fSliceModuleLabel, - fFlashMatchModuleLabel, fCRTTrackMatchModuleLabel, fCRTHitMatchModuleLabel, fCalorimetryModuleLabel; + fFlashMatchModuleLabel, fCRTTrackMatchModuleLabel, fCRTSPMatchModuleLabel, fCalorimetryModuleLabel; // MVA location and type for loading std::string fMVAName, fMVAFileName, fCCNuMuMVAName, fCCNuMuMVAFileName, fCCNuEMVAName, fCCNuEMVAFileName, fNCMVAName, fNCMVAFileName; @@ -159,9 +161,9 @@ namespace sbn { // CRT Track and Hit Matching Variables float crt_TrackScore; // a combination of the DCA and angle between the best matched TPC & CRT tracks - float crt_HitScore; // the best distance from an extrapolated TPC track to a CRT hit [cm] + float crt_SPScore; // the best distance from an extrapolated TPC track to a CRT SP [cm] float crt_TrackTime; // the time associated with the matched CRT track [us] - float crt_HitTime; // the time associated with the matched CRT hit [us] + float crt_SPTime; // the time associated with the matched CRT SP [us] }; @@ -180,7 +182,7 @@ namespace sbn { fSliceModuleLabel (p.get<std::string>("SliceModuleLabel")), fFlashMatchModuleLabel (p.get<std::string>("FlashMatchModuleLabel")), fCRTTrackMatchModuleLabel (p.get<std::string>("CRTTrackMatchModuleLabel")), - fCRTHitMatchModuleLabel (p.get<std::string>("CRTHitMatchModuleLabel")), + fCRTSPMatchModuleLabel (p.get<std::string>("CRTSPMatchModuleLabel")), fCalorimetryModuleLabel (p.get<std::string>("CalorimetryModuleLabel")), fMVAName (p.get<std::string>("MVAName")), fMVAFileName (p.get<std::string>("MVAFileName")), @@ -227,9 +229,9 @@ namespace sbn { fSliceTree->Branch("pds_FMTime",&pds_FMTime); fSliceTree->Branch("crt_TrackScore",&crt_TrackScore); - fSliceTree->Branch("crt_HitScore",&crt_HitScore); + fSliceTree->Branch("crt_SPScore",&crt_SPScore); fSliceTree->Branch("crt_TrackTime",&crt_TrackTime); - fSliceTree->Branch("crt_HitTime",&crt_HitTime); + fSliceTree->Branch("crt_SPTime",&crt_SPTime); fSliceTree->Branch("eventID",&eventID); fSliceTree->Branch("subRunID",&subRunID); @@ -262,9 +264,9 @@ namespace sbn { mvaReader.AddVariable("pds_FMTime",&pds_FMTime); mvaReader.AddVariable("crt_TrackScore",&crt_TrackScore); - mvaReader.AddVariable("crt_HitScore",&crt_HitScore); + mvaReader.AddVariable("crt_HitScore",&crt_SPScore); mvaReader.AddVariable("crt_TrackTime",&crt_TrackTime); - mvaReader.AddVariable("crt_HitTime",&crt_HitTime); + mvaReader.AddVariable("crt_HitTime",&crt_SPTime); cet::search_path searchPath("FW_SEARCH_PATH"); std::string weightFileFullPath; @@ -282,7 +284,7 @@ namespace sbn { pds_FMTotalScore = -999999.; pds_FMPE = -999999.; pds_FMTime = -500.; - crt_TrackScore = -4.; crt_HitScore = -4.; crt_TrackTime = -3000; crt_HitTime = -3000; + crt_TrackScore = -4.; crt_SPScore = -4.; crt_TrackTime = -3000; crt_SPTime = -3000; slicePDG = 999999; matchedType = ""; @@ -396,14 +398,14 @@ namespace sbn { const std::vector<art::Ptr<larpandoraobj::PFParticleMetadata> > pfpMetaVec = pfpMetadataAssoc.at(primary.key()); const std::vector<art::Ptr<sbn::SimpleFlashMatch> > pfpFMVec = pfpFMAssoc.at(primary.key()); - const std::vector<art::Ptr<anab::T0> > sliceCRTTrackT0s = this->GetCRTTrackT0s(e, slice, handlePFPs, handleSlices); - const std::vector<art::Ptr<anab::T0> > sliceCRTHitT0s = this->GetCRTHitT0s(e, slice, handlePFPs, handleSlices); + const std::vector<anab::T0> sliceCRTTrackT0s = this->GetCRTTrackT0s(e, slice, handlePFPs, handleSlices); + const std::vector<anab::T0> sliceCRTSPT0s = this->GetCRTSPT0s(e, slice, handlePFPs, handleSlices); - this->FillCRTVars(sliceCRTTrackT0s, sliceCRTHitT0s); + this->FillCRTVars(sliceCRTTrackT0s, sliceCRTSPT0s); const art::Ptr<larpandoraobj::PFParticleMetadata> pfpMeta = pfpMetaVec.front(); std::map<std::string, float> propertiesMap = pfpMeta->GetPropertiesMap(); - + this->FillPandoraNuScoreVars(propertiesMap); tpc_StoppingChi2CosmicRatio = this->GetLongestTrackStoppingChi2Ratio(e, slice, handlePFPs, handleSlices); @@ -426,8 +428,8 @@ namespace sbn { resultsVec->emplace_back(score, ccnumuscore, ccnuescore, ncscore, bestscore, bestid, tpc_CRFracHitsInLongestTrack, tpc_CRLongestTrackDeflection, tpc_CRLongestTrackDirY, std::round(tpc_CRNHitsMax), tpc_NuEigenRatioInSphere, std::round(tpc_NuNFinalStatePfos), std::round(tpc_NuNHitsTotal), std::round(tpc_NuNSpacePointsInSphere), tpc_NuVertexY, tpc_NuWeightedDirZ, - tpc_StoppingChi2CosmicRatio, pds_FMTotalScore, pds_FMPE, pds_FMTime, crt_TrackScore, crt_HitScore, - crt_TrackTime, crt_HitTime); + tpc_StoppingChi2CosmicRatio, pds_FMTotalScore, pds_FMPE, pds_FMTime, crt_TrackScore, crt_SPScore, + crt_TrackTime, crt_SPTime); util::CreateAssn(*this, e, *resultsVec, slice, *sliceAssns); } @@ -456,28 +458,28 @@ namespace sbn { } } - void CRUMBS::FillCRTVars(const std::vector<art::Ptr<anab::T0> > &trackT0s, const std::vector<art::Ptr<anab::T0> > &hitT0s) + void CRUMBS::FillCRTVars(const std::vector<anab::T0> &trackT0s, const std::vector<anab::T0> &spT0s) { if (!trackT0s.empty()){ crt_TrackScore = std::numeric_limits<float>::max(); for(auto const crttrackmatcht0 : trackT0s) { - if(crttrackmatcht0->TriggerConfidence() < crt_TrackScore) + if(crttrackmatcht0.TriggerConfidence() < crt_TrackScore) { - crt_TrackScore = crttrackmatcht0->TriggerConfidence(); - crt_TrackTime = crttrackmatcht0->Time() * 1e-3; + crt_TrackScore = crttrackmatcht0.TriggerConfidence(); + crt_TrackTime = crttrackmatcht0.Time() * 1e-3; } } } - if (!hitT0s.empty()){ - crt_HitScore = std::numeric_limits<float>::max(); - for(auto const crthitmatcht0 : hitT0s) + if (!spT0s.empty()){ + crt_SPScore = std::numeric_limits<float>::max(); + for(auto const crtspmatcht0 : spT0s) { - if(crthitmatcht0->TriggerConfidence() < crt_HitScore) + if(crtspmatcht0.TriggerConfidence() < crt_SPScore) { - crt_HitScore = crthitmatcht0->TriggerConfidence(); - crt_HitTime = crthitmatcht0->Time() * 1e-3; + crt_SPScore = crtspmatcht0.TriggerConfidence(); + crt_SPTime = crtspmatcht0.Time() * 1e-3; } } } @@ -625,17 +627,17 @@ namespace sbn { completeness = sliceHitMap[matchedID] / (float) totalTrueHits; } - std::vector<art::Ptr<anab::T0> > CRUMBS::GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, - const art::ValidHandle<std::vector<recob::Slice> > &handleSlices) + std::vector<anab::T0> CRUMBS::GetCRTTrackT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, + const art::ValidHandle<std::vector<recob::Slice> > &handleSlices) { - std::vector<art::Ptr<anab::T0> > t0Vec; + std::vector<anab::T0> t0Vec; art::Handle<std::vector<recob::Track> > handleTracks; e.getByLabel(fTrackModuleLabel, handleTracks); art::FindManyP<recob::PFParticle> slicePFPAssn(handleSlices,e,fSliceModuleLabel); art::FindManyP<recob::Track> pfpTrackAssn(handlePFPs,e,fTrackModuleLabel); - art::FindManyP<anab::T0> trackT0Assn(handleTracks,e,fCRTTrackMatchModuleLabel); + art::FindOneP<sbnd::crt::CRTTrack, anab::T0> trackT0Assn(handleTracks,e,fCRTTrackMatchModuleLabel); const std::vector<art::Ptr<recob::PFParticle> > pfps = slicePFPAssn.at(slice.key()); @@ -651,24 +653,29 @@ namespace sbn { const art::Ptr<recob::Track> track = tracks.front(); - const std::vector<art::Ptr<anab::T0> > t0s = trackT0Assn.at(track.key()); - t0Vec.insert(t0Vec.end(), t0s.begin(), t0s.end()); + const art::Ptr<sbnd::crt::CRTTrack> crttrack = trackT0Assn.at(track.key()); + + if(crttrack.isNonnull()) + { + const anab::T0 t0 = trackT0Assn.data(track.key()).ref(); + t0Vec.push_back(t0); + } } return t0Vec; } - std::vector<art::Ptr<anab::T0> > CRUMBS::GetCRTHitT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, - const art::ValidHandle<std::vector<recob::Slice> > &handleSlices) + std::vector<anab::T0> CRUMBS::GetCRTSPT0s(art::Event const& e, const art::Ptr<recob::Slice> &slice, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, + const art::ValidHandle<std::vector<recob::Slice> > &handleSlices) { - std::vector<art::Ptr<anab::T0> > t0Vec; + std::vector<anab::T0> t0Vec; art::Handle<std::vector<recob::Track> > handleTracks; e.getByLabel(fTrackModuleLabel, handleTracks); art::FindManyP<recob::PFParticle> slicePFPAssn(handleSlices,e,fSliceModuleLabel); art::FindManyP<recob::Track> pfpTrackAssn(handlePFPs,e,fTrackModuleLabel); - art::FindManyP<anab::T0> trackT0Assn(handleTracks,e,fCRTHitMatchModuleLabel); + art::FindOneP<sbnd::crt::CRTSpacePoint, anab::T0> trackT0Assn(handleTracks,e,fCRTSPMatchModuleLabel); const std::vector<art::Ptr<recob::PFParticle> > pfps = slicePFPAssn.at(slice.key()); @@ -684,8 +691,13 @@ namespace sbn { const art::Ptr<recob::Track> track = tracks.front(); - const std::vector<art::Ptr<anab::T0> > t0s = trackT0Assn.at(track.key()); - t0Vec.insert(t0Vec.end(), t0s.begin(), t0s.end()); + const art::Ptr<sbnd::crt::CRTSpacePoint> crtsp = trackT0Assn.at(track.key()); + + if(crtsp.isNonnull()) + { + const anab::T0 t0 = trackT0Assn.data(track.key()).ref(); + t0Vec.push_back(t0); + } } return t0Vec; diff --git a/sbncode/CosmicID/sbn_crumbs_producer.fcl b/sbncode/CosmicID/sbn_crumbs_producer.fcl index a71af130d..08600df57 100644 --- a/sbncode/CosmicID/sbn_crumbs_producer.fcl +++ b/sbncode/CosmicID/sbn_crumbs_producer.fcl @@ -13,8 +13,8 @@ crumbs_sbnd: TrackModuleLabel: "pandoraTrack" SliceModuleLabel: "pandora" FlashMatchModuleLabel: "fmatch" - CRTTrackMatchModuleLabel: "crttrackt0" - CRTHitMatchModuleLabel: "crthitt0" + CRTTrackMatchModuleLabel: "crttrackmatching" + CRTSPMatchModuleLabel: "crtspacepointmatching" CalorimetryModuleLabel: "pandoraCalo" MVAName: "BDT" diff --git a/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C b/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C index 6cc90416f..bc757d4a4 100644 --- a/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C +++ b/sbncode/CosmicID/training_scripts/CRUMBSTMVADriver.C @@ -91,9 +91,9 @@ void TrainCRUMBSInstance(const TString outDirName, TTree *inputTree, dataloader->AddVariable("pds_FMTime","FM Time","#mu s",'F'); dataloader->AddVariable("crt_TrackScore","CRT Track Match Score","",'F'); - dataloader->AddVariable("crt_HitScore","CRT Hit Match Score","",'F'); + dataloader->AddVariable("crt_SPScore","CRT SpacePoint Match Score","",'F'); dataloader->AddVariable("crt_TrackTime","CRT Track Match Time","#mu s",'F'); - dataloader->AddVariable("crt_HitTime","CRT Hit Match Time","#mu s",'F'); + dataloader->AddVariable("crt_SPTime","CRT SpacePoint Match Time","#mu s",'F'); dataloader->AddSignalTree (inputTree, signalWeight); dataloader->AddBackgroundTree(inputTree, backgroundWeight);