From ac4c74ac9d4335c7bbcc9632a3324a7faa78161a Mon Sep 17 00:00:00 2001 From: Henry Lay <h.lay@lancaster.ac.uk> Date: Sat, 25 Mar 2023 15:59:24 -0500 Subject: [PATCH 1/4] CRUMBS updates --- sbncode/CosmicID/CRUMBS_module.cc | 74 ++++++++++++++++++------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/sbncode/CosmicID/CRUMBS_module.cc b/sbncode/CosmicID/CRUMBS_module.cc index 469787d6b..dae9f55e1 100644 --- a/sbncode/CosmicID/CRUMBS_module.cc +++ b/sbncode/CosmicID/CRUMBS_module.cc @@ -78,9 +78,9 @@ namespace sbn { 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<art::Ptr<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, const art::ValidHandle<std::vector<recob::PFParticle> > &handlePFPs, @@ -106,7 +106,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 +159,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 +180,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 +227,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 +262,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 +282,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 = ""; @@ -397,9 +397,9 @@ 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<art::Ptr<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(); @@ -426,8 +426,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,7 +456,7 @@ 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<art::Ptr<anab::T0> > &trackT0s, const std::vector<art::Ptr<anab::T0> > &spT0s) { if (!trackT0s.empty()){ crt_TrackScore = std::numeric_limits<float>::max(); @@ -465,19 +465,19 @@ namespace sbn { if(crttrackmatcht0->TriggerConfidence() < crt_TrackScore) { crt_TrackScore = crttrackmatcht0->TriggerConfidence(); - crt_TrackTime = crttrackmatcht0->Time() * 1e-3; + 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; } } } @@ -635,7 +635,7 @@ namespace sbn { 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,15 +651,20 @@ 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<art::Ptr<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; @@ -668,7 +673,7 @@ namespace sbn { 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::FindOneeP<sbnd::crt::CRTSpacePoint, anab::T0> trackT0Assn(handleTracks,e,fCRTSPMatchModuleLabel); const std::vector<art::Ptr<recob::PFParticle> > pfps = slicePFPAssn.at(slice.key()); @@ -684,8 +689,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; From cb61db0ebeec55961ea9b23164ef3ca8f5e587d6 Mon Sep 17 00:00:00 2001 From: Henry Lay <h.lay@lancaster.ac.uk> Date: Wed, 26 Apr 2023 12:03:00 -0500 Subject: [PATCH 2/4] Swap CRUMBS to CRT space point usage --- sbncode/CosmicID/CMakeLists.txt | 1 + sbncode/CosmicID/CRUMBS_module.cc | 62 ++++++++++--------- sbncode/CosmicID/sbn_crumbs_producer.fcl | 2 +- .../training_scripts/CRUMBSTMVADriver.C | 4 +- 4 files changed, 36 insertions(+), 33 deletions(-) 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 dae9f55e1..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> > 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<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); @@ -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> > sliceCRTSPT0s = this->GetCRTSPT0s(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, 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); @@ -456,16 +458,16 @@ namespace sbn { } } - void CRUMBS::FillCRTVars(const std::vector<art::Ptr<anab::T0> > &trackT0s, const std::vector<art::Ptr<anab::T0> > &spT0s) + 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; } } } @@ -474,10 +476,10 @@ namespace sbn { crt_SPScore = std::numeric_limits<float>::max(); for(auto const crtspmatcht0 : spT0s) { - if(crtspmatcht0->TriggerConfidence() < crt_SPScore) + if(crtspmatcht0.TriggerConfidence() < crt_SPScore) { - crt_SPScore = crtspmatcht0->TriggerConfidence(); - crt_SPTime = crtspmatcht0->Time() * 1e-3; + crt_SPScore = crtspmatcht0.TriggerConfidence(); + crt_SPTime = crtspmatcht0.Time() * 1e-3; } } } @@ -625,10 +627,10 @@ 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); @@ -663,17 +665,17 @@ namespace sbn { return t0Vec; } - std::vector<art::Ptr<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<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::FindOneeP<sbnd::crt::CRTSpacePoint, anab::T0> trackT0Assn(handleTracks,e,fCRTSPMatchModuleLabel); + art::FindOneP<sbnd::crt::CRTSpacePoint, anab::T0> trackT0Assn(handleTracks,e,fCRTSPMatchModuleLabel); const std::vector<art::Ptr<recob::PFParticle> > pfps = slicePFPAssn.at(slice.key()); diff --git a/sbncode/CosmicID/sbn_crumbs_producer.fcl b/sbncode/CosmicID/sbn_crumbs_producer.fcl index a71af130d..9a6b184b7 100644 --- a/sbncode/CosmicID/sbn_crumbs_producer.fcl +++ b/sbncode/CosmicID/sbn_crumbs_producer.fcl @@ -14,7 +14,7 @@ crumbs_sbnd: SliceModuleLabel: "pandora" FlashMatchModuleLabel: "fmatch" CRTTrackMatchModuleLabel: "crttrackt0" - CRTHitMatchModuleLabel: "crthitt0" + CRTSPMatchModuleLabel: "crthitt0" 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); From d45547ecad15b42efc73937850509d72edc723d8 Mon Sep 17 00:00:00 2001 From: Henry Lay <h.lay@lancaster.ac.uk> Date: Tue, 16 Jan 2024 09:09:05 -0600 Subject: [PATCH 3/4] Fill new CRT reco objects --- sbncode/CAFMaker/CAFMakerParams.h | 30 ++++- sbncode/CAFMaker/CAFMaker_module.cc | 138 ++++++++++++++++------- sbncode/CAFMaker/CMakeLists.txt | 1 + sbncode/CAFMaker/FillReco.cxx | 59 ++++++++++ sbncode/CAFMaker/FillReco.h | 20 ++++ sbncode/CosmicID/sbn_crumbs_producer.fcl | 4 +- 6 files changed, 207 insertions(+), 45 deletions(-) diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h index 77918945a..56250c17c 100644 --- a/sbncode/CAFMaker/CAFMakerParams.h +++ b/sbncode/CAFMaker/CAFMakerParams.h @@ -242,6 +242,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."), @@ -257,15 +269,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 fb1db2903..53499b041 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -1313,40 +1313,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()); + } + } + } + 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<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<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; @@ -1610,6 +1634,14 @@ void CAFMaker::produce(art::Event& evt) noexcept { FindManyPStrict<anab::T0>(slcTracks, evt, fParams.CRTTrackMatchLabel() + slice_tag_suff); + art::FindManyP<anab::T0> fmCRTSpacePointMatch = + FindManyPStrict<anab::T0>(slcTracks, evt, + fParams.CRTSpacePointMatchLabel() + slice_tag_suff); + + art::FindManyP<anab::T0> fmSBNDCRTTrackMatch = + FindManyPStrict<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) { @@ -1808,7 +1840,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); @@ -1818,9 +1850,31 @@ 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(fmCRTSpacePointMatch.isValid() && fDet == kSBND) + { + art::FindManyP<sbnd::crt::CRTSpacePoint> crtT0ToSpacePoint = FindManyPStrict<sbnd::crt::CRTSpacePoint> + (fmCRTSpacePointMatch.at(iPart), evt, fParams.CRTSpacePointMatchLabel() + slice_tag_suff); + + std::vector<art::Ptr<sbnd::crt::CRTSpacePoint>> crtspacepointmatch; + if(crtT0ToSpacePoint.isValid() && crtT0ToSpacePoint.size() == 1) + crtspacepointmatch = crtT0ToSpacePoint.at(0); + + FillTrackCRTSpacePoint(fmCRTSpacePointMatch.at(iPart), crtspacepointmatch, trk); + } + if(fmSBNDCRTTrackMatch.isValid() && fDet == kSBND) + { + art::FindManyP<sbnd::crt::CRTTrack> crtT0ToSBNDTrack = FindManyPStrict<sbnd::crt::CRTTrack> + (fmSBNDCRTTrackMatch.at(iPart), evt, fParams.SBNDCRTTrackMatchLabel() + slice_tag_suff); + + std::vector<art::Ptr<sbnd::crt::CRTTrack>> sbndcrttrackmatch; + if(crtT0ToSBNDTrack.isValid() && crtT0ToSBNDTrack.size() == 1) + sbndcrttrackmatch = crtT0ToSBNDTrack.at(0); + + FillTrackSBNDCRTTrack(fmSBNDCRTTrackMatch.at(iPart), sbndcrttrackmatch, trk); + } // Truth matching if (fmTrackHit.isValid()) { if ( !isRealData ) { @@ -1884,17 +1938,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..accb6e19e 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,40 @@ namespace caf } } + void FillTrackCRTSpacePoint(const std::vector<art::Ptr<anab::T0>> &t0match, + const std::vector<art::Ptr<sbnd::crt::CRTSpacePoint>> &spacepointmatch, + caf::SRTrack &srtrack, + bool allowEmpty) + { + if(t0match.size()) + { + assert(t0match.size() == 1); + srtrack.crtspacepoint.score = t0match[0]->fTriggerConfidence; + } + if(spacepointmatch.size()) + { + assert(spacepointmatch.size() == 1); + FillCRTSpacePoint(*spacepointmatch[0], srtrack.crtspacepoint.spacepoint); + } + } + + void FillTrackSBNDCRTTrack(const std::vector<art::Ptr<anab::T0>> &t0match, + const std::vector<art::Ptr<sbnd::crt::CRTTrack>> &trackmatch, + caf::SRTrack &srtrack, + bool allowEmpty) + { + if(t0match.size()) + { + assert(t0match.size() == 1); + srtrack.crtsbndtrack.score = t0match[0]->fTriggerConfidence; + } + if(trackmatch.size()) + { + assert(trackmatch.size() == 1); + FillSBNDCRTTrack(*trackmatch[0], 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..ea2f83423 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 std::vector<art::Ptr<anab::T0>> &t0match, + const std::vector<art::Ptr<sbnd::crt::CRTSpacePoint>> &spacepointmatch, + caf::SRTrack &srtrack, + bool allowEmpty = false); + + void FillTrackSBNDCRTTrack(const std::vector<art::Ptr<anab::T0>> &t0match, + const std::vector<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/sbn_crumbs_producer.fcl b/sbncode/CosmicID/sbn_crumbs_producer.fcl index 9a6b184b7..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" - CRTSPMatchModuleLabel: "crthitt0" + CRTTrackMatchModuleLabel: "crttrackmatching" + CRTSPMatchModuleLabel: "crtspacepointmatching" CalorimetryModuleLabel: "pandoraCalo" MVAName: "BDT" From a75a0dd656f0ae59fba5b3745ff1cd4f7525c7f9 Mon Sep 17 00:00:00 2001 From: Henry Lay <h.lay@lancaster.ac.uk> Date: Tue, 16 Jan 2024 11:18:55 -0600 Subject: [PATCH 4/4] Fix bugs in filling of CRT vars --- sbncode/CAFMaker/CAFMaker_module.cc | 109 ++++++++++++++++------------ sbncode/CAFMaker/FillReco.cxx | 42 ++++------- sbncode/CAFMaker/FillReco.h | 24 +++--- 3 files changed, 88 insertions(+), 87 deletions(-) diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 53499b041..703388437 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 /// @@ -1007,6 +1011,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, @@ -1329,22 +1352,22 @@ void CAFMaker::produce(art::Event& evt) noexcept { 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()); - } + 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()); - } + 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) @@ -1353,22 +1376,22 @@ void CAFMaker::produce(art::Event& evt) noexcept { 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()); - } + 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()); - } + 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()); + } } } @@ -1634,12 +1657,12 @@ void CAFMaker::produce(art::Event& evt) noexcept { FindManyPStrict<anab::T0>(slcTracks, evt, fParams.CRTTrackMatchLabel() + slice_tag_suff); - art::FindManyP<anab::T0> fmCRTSpacePointMatch = - FindManyPStrict<anab::T0>(slcTracks, evt, + art::FindOneP<sbnd::crt::CRTSpacePoint, anab::T0> foCRTSpacePointMatch = + FindOnePDStrict<sbnd::crt::CRTSpacePoint, anab::T0>(slcTracks, evt, fParams.CRTSpacePointMatchLabel() + slice_tag_suff); - art::FindManyP<anab::T0> fmSBNDCRTTrackMatch = - FindManyPStrict<anab::T0>(slcTracks, evt, + 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; @@ -1853,28 +1876,22 @@ void CAFMaker::produce(art::Event& evt) noexcept { if (fmCRTTrackMatch.isValid() && fDet == kICARUS) { FillTrackCRTTrack(fmCRTTrackMatch.at(iPart), trk); } - if(fmCRTSpacePointMatch.isValid() && fDet == kSBND) - { - art::FindManyP<sbnd::crt::CRTSpacePoint> crtT0ToSpacePoint = FindManyPStrict<sbnd::crt::CRTSpacePoint> - (fmCRTSpacePointMatch.at(iPart), evt, fParams.CRTSpacePointMatchLabel() + slice_tag_suff); - - std::vector<art::Ptr<sbnd::crt::CRTSpacePoint>> crtspacepointmatch; - if(crtT0ToSpacePoint.isValid() && crtT0ToSpacePoint.size() == 1) - crtspacepointmatch = crtT0ToSpacePoint.at(0); - - FillTrackCRTSpacePoint(fmCRTSpacePointMatch.at(iPart), crtspacepointmatch, trk); - } - if(fmSBNDCRTTrackMatch.isValid() && fDet == kSBND) - { - art::FindManyP<sbnd::crt::CRTTrack> crtT0ToSBNDTrack = FindManyPStrict<sbnd::crt::CRTTrack> - (fmSBNDCRTTrackMatch.at(iPart), evt, fParams.SBNDCRTTrackMatchLabel() + slice_tag_suff); - - std::vector<art::Ptr<sbnd::crt::CRTTrack>> sbndcrttrackmatch; - if(crtT0ToSBNDTrack.isValid() && crtT0ToSBNDTrack.size() == 1) - sbndcrttrackmatch = crtT0ToSBNDTrack.at(0); - - FillTrackSBNDCRTTrack(fmSBNDCRTTrackMatch.at(iPart), sbndcrttrackmatch, 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 ) { diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index accb6e19e..1f8e0e8e9 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -113,8 +113,8 @@ namespace caf } void FillCRTSpacePoint(const sbnd::crt::CRTSpacePoint &spacepoint, - caf::SRCRTSpacePoint &srspacepoint, - bool allowEmpty) + caf::SRCRTSpacePoint &srspacepoint, + bool allowEmpty) { srspacepoint.position = SRVector3D(spacepoint.X(), spacepoint.Y(), spacepoint.Z()); srspacepoint.position_err = SRVector3D(spacepoint.XErr(), spacepoint.YErr(), spacepoint.ZErr()); @@ -125,8 +125,8 @@ namespace caf } void FillSBNDCRTTrack(const sbnd::crt::CRTTrack &track, - caf::SRSBNDCRTTrack &srsbndcrttrack, - bool allowEmpty) + caf::SRSBNDCRTTrack &srsbndcrttrack, + bool allowEmpty) { for(auto const& point : track.Points()) srsbndcrttrack.points.emplace_back(point.X(), point.Y(), point.Z()); @@ -565,38 +565,22 @@ namespace caf } } - void FillTrackCRTSpacePoint(const std::vector<art::Ptr<anab::T0>> &t0match, - const std::vector<art::Ptr<sbnd::crt::CRTSpacePoint>> &spacepointmatch, + void FillTrackCRTSpacePoint(const anab::T0 &t0match, + const art::Ptr<sbnd::crt::CRTSpacePoint> &spacepointmatch, caf::SRTrack &srtrack, bool allowEmpty) { - if(t0match.size()) - { - assert(t0match.size() == 1); - srtrack.crtspacepoint.score = t0match[0]->fTriggerConfidence; - } - if(spacepointmatch.size()) - { - assert(spacepointmatch.size() == 1); - FillCRTSpacePoint(*spacepointmatch[0], srtrack.crtspacepoint.spacepoint); - } + srtrack.crtspacepoint.score = t0match.fTriggerConfidence; + FillCRTSpacePoint(*spacepointmatch, srtrack.crtspacepoint.spacepoint); } - void FillTrackSBNDCRTTrack(const std::vector<art::Ptr<anab::T0>> &t0match, - const std::vector<art::Ptr<sbnd::crt::CRTTrack>> &trackmatch, + void FillTrackSBNDCRTTrack(const anab::T0 &t0match, + const art::Ptr<sbnd::crt::CRTTrack> &trackmatch, caf::SRTrack &srtrack, - bool allowEmpty) + bool allowEmpty) { - if(t0match.size()) - { - assert(t0match.size() == 1); - srtrack.crtsbndtrack.score = t0match[0]->fTriggerConfidence; - } - if(trackmatch.size()) - { - assert(trackmatch.size() == 1); - FillSBNDCRTTrack(*trackmatch[0], srtrack.crtsbndtrack.track); - } + srtrack.crtsbndtrack.score = t0match.fTriggerConfidence; + FillSBNDCRTTrack(*trackmatch, srtrack.crtsbndtrack.track); } void FillTrackMCS(const recob::Track& track, diff --git a/sbncode/CAFMaker/FillReco.h b/sbncode/CAFMaker/FillReco.h index ea2f83423..3049947b5 100644 --- a/sbncode/CAFMaker/FillReco.h +++ b/sbncode/CAFMaker/FillReco.h @@ -137,15 +137,15 @@ namespace caf caf::SRTrack &srtrack, bool allowEmpty = false); - void FillTrackCRTSpacePoint(const std::vector<art::Ptr<anab::T0>> &t0match, - const std::vector<art::Ptr<sbnd::crt::CRTSpacePoint>> &spacepointmatch, - 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 std::vector<art::Ptr<anab::T0>> &t0match, - const std::vector<art::Ptr<sbnd::crt::CRTTrack>> &trackmatch, - 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, @@ -206,12 +206,12 @@ namespace caf bool allowEmpty = false); void FillCRTSpacePoint(const sbnd::crt::CRTSpacePoint &spacepoint, - caf::SRCRTSpacePoint &srspacepoint, - bool allowEmpty = false); + caf::SRCRTSpacePoint &srspacepoint, + bool allowEmpty = false); void FillSBNDCRTTrack(const sbnd::crt::CRTTrack &track, - caf::SRSBNDCRTTrack &srsbndcrttrack, - bool allowEmpty = false); + caf::SRSBNDCRTTrack &srsbndcrttrack, + bool allowEmpty = false); void FillOpFlash(const recob::OpFlash &flash, std::vector<recob::OpHit const*> const& hits,