From eade067efa821ab8a1b26f63e10e94259fb5c0ac Mon Sep 17 00:00:00 2001 From: Giuseppe Cerati Date: Thu, 10 Apr 2025 21:25:50 -0500 Subject: [PATCH 1/6] add first NuGraph2 info to CAF --- sbncode/CAFMaker/CAFMakerParams.h | 18 +++++++ sbncode/CAFMaker/CAFMaker_module.cc | 39 +++++++++++++++ sbncode/CAFMaker/FillReco.cxx | 73 +++++++++++++++++++++++++++++ sbncode/CAFMaker/FillReco.h | 14 ++++++ 4 files changed, 144 insertions(+) diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h index d05eb8b9b..636fcda57 100644 --- a/sbncode/CAFMaker/CAFMakerParams.h +++ b/sbncode/CAFMaker/CAFMakerParams.h @@ -340,6 +340,24 @@ namespace caf "" //Empty by default, configured in icaruscode cafmaker_defs }; + Atom NuGraphSliceHitLabel { + Name("NuGraphSliceHitLabel"), + Comment("Label of NuGraph slice hit map."), + art::InputTag("nuslhits") + }; + + Atom NuGraphFilterLabel { + Name("NuGraphFilterLabel"), + Comment("Label of NuGraph filter."), + art::InputTag("NuGraph","filter") + }; + + Atom NuGraphSemanticLabel { + Name("NuGraphSemanticLabel"), + Comment("Label of NuGraph semantic."), + art::InputTag("NuGraph","semantic") + }; + Atom OpFlashLabel { Name("OpFlashLabel"), Comment("Label of PMT flash."), diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 2728b395f..38a6e416c 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -95,6 +95,7 @@ #include "lardataobj/RecoBase/Vertex.h" #include "lardataobj/RecoBase/Shower.h" #include "lardataobj/RecoBase/MCSFitResult.h" +#include "lardataobj/RecoBase/Cluster.h" #include "nusimdata/SimulationBase/MCFlux.h" #include "nusimdata/SimulationBase/MCTruth.h" @@ -1696,6 +1697,17 @@ void CAFMaker::produce(art::Event& evt) noexcept { } } + // nu graph + std::vector< art::Handle> > ng2_slice_hit_map_handle(pandora_tag_suffixes.size()); + std::vector< art::Handle>> > ng2_filter_handle(pandora_tag_suffixes.size()); + std::vector< art::Handle>> > ng2_semantic_handle(pandora_tag_suffixes.size()); + for (unsigned i_tag = 0; i_tag < pandora_tag_suffixes.size(); i_tag++) { + const std::string &pandora_tag_suffix = pandora_tag_suffixes[i_tag]; + GetByLabelIfExists(evt, fParams.NuGraphSliceHitLabel().encode() + pandora_tag_suffix, ng2_slice_hit_map_handle[i_tag]); + GetByLabelIfExists(evt, fParams.NuGraphFilterLabel().label() + pandora_tag_suffix + ":" + fParams.NuGraphFilterLabel().instance(), ng2_filter_handle[i_tag]); + GetByLabelIfExists(evt, fParams.NuGraphSemanticLabel().label() + pandora_tag_suffix + ":" + fParams.NuGraphSemanticLabel().instance(), ng2_semantic_handle[i_tag]); + } + // The Standard Record // Branch entry definition -- contains list of slices, CRT information, and truth information StandardRecord rec; @@ -1752,6 +1764,12 @@ void CAFMaker::produce(art::Event& evt) noexcept { } } + std::vector>> ng2_filter_vec; + std::vector>> ng2_semantic_vec; + art::fill_ptr_vector(ng2_filter_vec,ng2_filter_handle[producer]); + art::fill_ptr_vector(ng2_semantic_vec,ng2_semantic_handle[producer]); + FillSliceNuGraph(slcHits,*ng2_slice_hit_map_handle[producer],ng2_filter_vec,ng2_semantic_vec,recslc); + art::FindManyP fmOpT0 = FindManyPStrict(sliceList, evt, fParams.OpT0Label() + slice_tag_suff); std::vector> slcOpT0; @@ -1798,6 +1816,25 @@ void CAFMaker::produce(art::Event& evt) noexcept { art::FindManyP fmSpacePointPFPs = FindManyPStrict(slcSpacePoints, evt, fParams.PFParticleLabel() + slice_tag_suff); + art::FindManyP fmPFPClusters = + FindManyPStrict(fmPFPart, evt, fParams.PFParticleLabel() + slice_tag_suff); + + std::vector>> fmPFPartHits; + // make Ptr's to clusters for cluster -> other object associations + if (fmPFPClusters.isValid()) { + for (size_t ipf=0; ipf> pfphits; + std::vector> pfclusters = fmPFPClusters.at(ipf); + art::FindManyP fmCluHits = FindManyPStrict(pfclusters, evt, fParams.PFParticleLabel() + slice_tag_suff); + for (size_t icl=0; icl fmShower = FindManyPStrict(fmPFPart, evt, fParams.RecoShowerLabel() + slice_tag_suff); @@ -2105,6 +2142,8 @@ void CAFMaker::produce(art::Event& evt) noexcept { FillCNNScores(thisParticle, cnnScores, pfp); } + FillPPFNuGraph(*ng2_slice_hit_map_handle[producer], ng2_filter_vec, ng2_semantic_vec, fmPFPartHits.at(iPart), pfp); + if (!thisTrack.empty()) { // it has a track! assert(thisTrack.size() == 1); diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index f47265c1e..67b8b8f22 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -544,6 +544,26 @@ namespace caf } } + + void FillSliceNuGraph(const std::vector> &inputHits, + const std::vector &sliceHitsMap, + const std::vector>> &ngFilterResult, + const std::vector>> &ngSemanticResult, + caf::SRSlice &slice) + { + + //need to double check that the slice processed by NuGraph is the same under consideration + std::cout << "sizes=" << inputHits.size() << " " << sliceHitsMap.size() << " " << ngFilterResult.size() << " " << ngSemanticResult.size() << std::endl; + unsigned int nHits = inputHits.size(); + if (nHits==0 || nHits!=sliceHitsMap.size() || inputHits[0].key()!=sliceHitsMap[0]) return;//not the same slice! + + unsigned int npass = 0; + for ( unsigned int i = 0; i < nHits; i++ ) { + if (ngFilterResult.at(i)->at(0)>0.5) npass++; + } + slice.ng_filt_pass_frac = float(npass)/nHits; + } + //...................................................................... void FillTrackCRTHit(const std::vector> &t0match, @@ -950,6 +970,59 @@ namespace caf srpfp.cnnscore.nclusters = cnnscore->nClusters; } + void FillPPFNuGraph(const std::vector &sliceHitsMap, + const std::vector>> &ngFilterResult, + const std::vector>> &ngSemanticResult, + const std::vector> &pfpHits, + caf::SRPFP& srpfp, + bool allowEmpty) + { + + auto arg_max = [](std::vector const& vec) { + return std::distance(vec.begin(), std::max_element(vec.begin(), vec.end())); + }; + + // the nugraph elements are ordered the same as the sliceHitsMap + std::vector mappedhits; + for (auto& hit : pfpHits) { + auto it = std::find(sliceHitsMap.begin(), sliceHitsMap.end(), hit.key()); + if (it != sliceHitsMap.end()) { + size_t index = std::distance(sliceHitsMap.begin(), it); + mappedhits.push_back(index); + } + } + + if (mappedhits.size()>0) { + std::vector ng2sempfpcounts(5,0); + size_t ng2bkgpfpcount = 0; + for (size_t pos : mappedhits) { + auto scores = ngSemanticResult.at(pos); + std::vector ng2semscores; + for (size_t i=0;isize();i++) ng2semscores.push_back(scores->at(i)); + size_t sem_label = arg_max(ng2semscores); + ng2sempfpcounts[sem_label]++; + auto bkgscore = ngFilterResult.at(pos); + if (bkgscore->at(0)<0.5) ng2bkgpfpcount++; + } + srpfp.ng_sem_cat = arg_max(ng2sempfpcounts); + srpfp.ng_mip_frac = float(ng2sempfpcounts[0])/pfpHits.size(); + srpfp.ng_hip_frac = float(ng2sempfpcounts[1])/pfpHits.size(); + srpfp.ng_shr_frac = float(ng2sempfpcounts[2])/pfpHits.size(); + srpfp.ng_mhl_frac = float(ng2sempfpcounts[3])/pfpHits.size(); + srpfp.ng_dif_frac = float(ng2sempfpcounts[4])/pfpHits.size(); + srpfp.ng_bkg_frac = float(ng2bkgpfpcount)/pfpHits.size(); + } else { + srpfp.ng_sem_cat = -1; + srpfp.ng_mip_frac = -1.; + srpfp.ng_hip_frac = -1.; + srpfp.ng_shr_frac = -1.; + srpfp.ng_mhl_frac = -1.; + srpfp.ng_dif_frac = -1.; + srpfp.ng_bkg_frac = -1.; + } + + } + void FillHitVars(const recob::Hit& hit, unsigned producer, const recob::SpacePoint& spacepoint, diff --git a/sbncode/CAFMaker/FillReco.h b/sbncode/CAFMaker/FillReco.h index c6df1ab39..5482077f1 100644 --- a/sbncode/CAFMaker/FillReco.h +++ b/sbncode/CAFMaker/FillReco.h @@ -20,6 +20,7 @@ #include "lardataobj/RecoBase/OpFlash.h" #include "lardataobj/RecoBase/OpHit.h" #include "lardataobj/AnalysisBase/Calorimetry.h" +#include "lardataobj/AnalysisBase/MVAOutput.h" #include "lardataobj/AnalysisBase/ParticleID.h" #include "lardataobj/AnalysisBase/T0.h" #include "lardataobj/RecoBase/PFParticleMetadata.h" @@ -104,6 +105,12 @@ namespace caf const std::vector> &inputPoints, caf::SRSlice &slice); + void FillSliceNuGraph(const std::vector> &inputHits, + const std::vector &sliceHitsMap, + const std::vector>> &ngFilterResult, + const std::vector>> &ngSemanticResult, + caf::SRSlice &slice); + bool SelectSlice(const caf::SRSlice &slice, bool cut_clear_cosmic); void FillTrackVars(const recob::Track& track, @@ -130,6 +137,13 @@ namespace caf caf::SRPFP& srpfp, bool allowEmpty = false); + void FillPPFNuGraph(const std::vector &sliceHitsMap, + const std::vector>> &ngFilterResult, + const std::vector>> &ngSemanticResult, + const std::vector> &pfpHits, + caf::SRPFP& srpfp, + bool allowEmpty= false); + void FillTrackCRTHit(const std::vector> &t0match, const std::vector> &hitmatch, bool use_ts0, From 33f56fbff4b31a34bb4787731269543ee85c99b0 Mon Sep 17 00:00:00 2001 From: Giuseppe Cerati Date: Thu, 10 Apr 2025 22:35:15 -0500 Subject: [PATCH 2/6] ensure CAF works if NuGraph2 products are not found --- sbncode/CAFMaker/CAFMakerParams.h | 6 +++--- sbncode/CAFMaker/CAFMaker_module.cc | 16 ++++++++++++---- sbncode/CAFMaker/FillReco.cxx | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h index 636fcda57..cf4cd7292 100644 --- a/sbncode/CAFMaker/CAFMakerParams.h +++ b/sbncode/CAFMaker/CAFMakerParams.h @@ -343,19 +343,19 @@ namespace caf Atom NuGraphSliceHitLabel { Name("NuGraphSliceHitLabel"), Comment("Label of NuGraph slice hit map."), - art::InputTag("nuslhits") + "" //Empty by default, please set to e.g. art::InputTag("nuslhits") }; Atom NuGraphFilterLabel { Name("NuGraphFilterLabel"), Comment("Label of NuGraph filter."), - art::InputTag("NuGraph","filter") + "" //Empty by default, please set to e.g. art::InputTag("NuGraph","filter") }; Atom NuGraphSemanticLabel { Name("NuGraphSemanticLabel"), Comment("Label of NuGraph semantic."), - art::InputTag("NuGraph","semantic") + "" //Empty by default, please set to e.g. art::InputTag("NuGraph","semantic") }; Atom OpFlashLabel { diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 38a6e416c..0e8b88482 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -1766,9 +1766,15 @@ void CAFMaker::produce(art::Event& evt) noexcept { std::vector>> ng2_filter_vec; std::vector>> ng2_semantic_vec; - art::fill_ptr_vector(ng2_filter_vec,ng2_filter_handle[producer]); - art::fill_ptr_vector(ng2_semantic_vec,ng2_semantic_handle[producer]); - FillSliceNuGraph(slcHits,*ng2_slice_hit_map_handle[producer],ng2_filter_vec,ng2_semantic_vec,recslc); + if (ng2_filter_handle[producer].isValid()) { + art::fill_ptr_vector(ng2_filter_vec,ng2_filter_handle[producer]); + } + if (ng2_semantic_handle[producer].isValid()) { + art::fill_ptr_vector(ng2_semantic_vec,ng2_semantic_handle[producer]); + } + if (ng2_slice_hit_map_handle[producer].isValid()) { + FillSliceNuGraph(slcHits,*ng2_slice_hit_map_handle[producer],ng2_filter_vec,ng2_semantic_vec,recslc); + } art::FindManyP fmOpT0 = FindManyPStrict(sliceList, evt, fParams.OpT0Label() + slice_tag_suff); @@ -2142,7 +2148,9 @@ void CAFMaker::produce(art::Event& evt) noexcept { FillCNNScores(thisParticle, cnnScores, pfp); } - FillPPFNuGraph(*ng2_slice_hit_map_handle[producer], ng2_filter_vec, ng2_semantic_vec, fmPFPartHits.at(iPart), pfp); + if (ng2_slice_hit_map_handle[producer].isValid()) { + FillPPFNuGraph(*ng2_slice_hit_map_handle[producer], ng2_filter_vec, ng2_semantic_vec, fmPFPartHits.at(iPart), pfp); + } if (!thisTrack.empty()) { // it has a track! assert(thisTrack.size() == 1); diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index 67b8b8f22..1224a10da 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -553,7 +553,7 @@ namespace caf { //need to double check that the slice processed by NuGraph is the same under consideration - std::cout << "sizes=" << inputHits.size() << " " << sliceHitsMap.size() << " " << ngFilterResult.size() << " " << ngSemanticResult.size() << std::endl; + //std::cout << "sizes=" << inputHits.size() << " " << sliceHitsMap.size() << " " << ngFilterResult.size() << " " << ngSemanticResult.size() << std::endl; unsigned int nHits = inputHits.size(); if (nHits==0 || nHits!=sliceHitsMap.size() || inputHits[0].key()!=sliceHitsMap[0]) return;//not the same slice! From 0b5ad313d5a7cb64f0d6fded578cdceac887b05c Mon Sep 17 00:00:00 2001 From: Giuseppe Cerati Date: Tue, 6 May 2025 12:02:17 -0500 Subject: [PATCH 3/6] address BH comments --- sbncode/CAFMaker/CAFMaker_module.cc | 1 + sbncode/CAFMaker/FillReco.cxx | 31 ++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 0e8b88482..74f08272a 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -96,6 +96,7 @@ #include "lardataobj/RecoBase/Shower.h" #include "lardataobj/RecoBase/MCSFitResult.h" #include "lardataobj/RecoBase/Cluster.h" +#include "lardataobj/AnalysisBase/MVAOutput.h" #include "nusimdata/SimulationBase/MCFlux.h" #include "nusimdata/SimulationBase/MCTruth.h" diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index 1224a10da..7dab1547d 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -978,10 +978,6 @@ namespace caf bool allowEmpty) { - auto arg_max = [](std::vector const& vec) { - return std::distance(vec.begin(), std::max_element(vec.begin(), vec.end())); - }; - // the nugraph elements are ordered the same as the sliceHitsMap std::vector mappedhits; for (auto& hit : pfpHits) { @@ -996,20 +992,23 @@ namespace caf std::vector ng2sempfpcounts(5,0); size_t ng2bkgpfpcount = 0; for (size_t pos : mappedhits) { - auto scores = ngSemanticResult.at(pos); - std::vector ng2semscores; - for (size_t i=0;isize();i++) ng2semscores.push_back(scores->at(i)); - size_t sem_label = arg_max(ng2semscores); - ng2sempfpcounts[sem_label]++; auto bkgscore = ngFilterResult.at(pos); - if (bkgscore->at(0)<0.5) ng2bkgpfpcount++; + if (bkgscore->at(0)<0.5) { + ng2bkgpfpcount++; + } else { + auto scores = ngSemanticResult.at(pos); + std::vector ng2semscores; + for (size_t i=0;isize();i++) ng2semscores.push_back(scores->at(i)); + size_t sem_label = std::distance(ng2semscores.begin(), std::max_element(ng2semscores.begin(), ng2semscores.end()));//arg_max(ng2semscores); + ng2sempfpcounts[sem_label]++; + } } - srpfp.ng_sem_cat = arg_max(ng2sempfpcounts); - srpfp.ng_mip_frac = float(ng2sempfpcounts[0])/pfpHits.size(); - srpfp.ng_hip_frac = float(ng2sempfpcounts[1])/pfpHits.size(); - srpfp.ng_shr_frac = float(ng2sempfpcounts[2])/pfpHits.size(); - srpfp.ng_mhl_frac = float(ng2sempfpcounts[3])/pfpHits.size(); - srpfp.ng_dif_frac = float(ng2sempfpcounts[4])/pfpHits.size(); + srpfp.ng_sem_cat = std::distance(ng2sempfpcounts.begin(), std::max_element(ng2sempfpcounts.begin(), ng2sempfpcounts.end()));//arg_max(ng2sempfpcounts); + srpfp.ng_mip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[0])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ng_hip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[1])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ng_shr_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[2])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ng_mhl_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[3])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ng_dif_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[4])/(pfpHits.size()-ng2bkgpfpcount) : -1.); srpfp.ng_bkg_frac = float(ng2bkgpfpcount)/pfpHits.size(); } else { srpfp.ng_sem_cat = -1; From b36ce76b7d5f5d255902eb2d1a924b8167c00b52 Mon Sep 17 00:00:00 2001 From: Giuseppe Cerati Date: Wed, 7 May 2025 13:27:30 -0500 Subject: [PATCH 4/6] fix typo --- sbncode/CAFMaker/CAFMaker_module.cc | 2 +- sbncode/CAFMaker/FillReco.cxx | 2 +- sbncode/CAFMaker/FillReco.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 74f08272a..948181bf2 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -2150,7 +2150,7 @@ void CAFMaker::produce(art::Event& evt) noexcept { } if (ng2_slice_hit_map_handle[producer].isValid()) { - FillPPFNuGraph(*ng2_slice_hit_map_handle[producer], ng2_filter_vec, ng2_semantic_vec, fmPFPartHits.at(iPart), pfp); + FillPFPNuGraph(*ng2_slice_hit_map_handle[producer], ng2_filter_vec, ng2_semantic_vec, fmPFPartHits.at(iPart), pfp); } if (!thisTrack.empty()) { // it has a track! diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index 0979d93fe..33b435fd9 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -970,7 +970,7 @@ namespace caf srpfp.cnnscore.nclusters = cnnscore->nClusters; } - void FillPPFNuGraph(const std::vector &sliceHitsMap, + void FillPFPNuGraph(const std::vector &sliceHitsMap, const std::vector>> &ngFilterResult, const std::vector>> &ngSemanticResult, const std::vector> &pfpHits, diff --git a/sbncode/CAFMaker/FillReco.h b/sbncode/CAFMaker/FillReco.h index 5482077f1..45cf2ea2b 100644 --- a/sbncode/CAFMaker/FillReco.h +++ b/sbncode/CAFMaker/FillReco.h @@ -137,7 +137,7 @@ namespace caf caf::SRPFP& srpfp, bool allowEmpty = false); - void FillPPFNuGraph(const std::vector &sliceHitsMap, + void FillPFPNuGraph(const std::vector &sliceHitsMap, const std::vector>> &ngFilterResult, const std::vector>> &ngSemanticResult, const std::vector> &pfpHits, From 0157111590797da7ce620909cebab78653bce80b Mon Sep 17 00:00:00 2001 From: Giuseppe Cerati Date: Wed, 7 May 2025 19:00:19 -0500 Subject: [PATCH 5/6] address GP's comments --- sbncode/CAFMaker/FillReco.cxx | 38 +++++++++++++++++------------------ sbncode/CAFMaker/FillReco.h | 20 ++++++++++++++++++ 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index 33b435fd9..0106aaf61 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -12,6 +12,7 @@ namespace caf { + const float ng_filter_cut = 0.5; //...................................................................... bool SelectSlice(const caf::SRSlice &slice, bool cut_clear_cosmic) { @@ -544,7 +545,6 @@ namespace caf } } - void FillSliceNuGraph(const std::vector> &inputHits, const std::vector &sliceHitsMap, const std::vector>> &ngFilterResult, @@ -559,7 +559,7 @@ namespace caf unsigned int npass = 0; for ( unsigned int i = 0; i < nHits; i++ ) { - if (ngFilterResult.at(i)->at(0)>0.5) npass++; + if (ngFilterResult.at(i)->at(0)>=ng_filter_cut) npass++; } slice.ng_filt_pass_frac = float(npass)/nHits; } @@ -992,32 +992,32 @@ namespace caf std::vector ng2sempfpcounts(5,0); size_t ng2bkgpfpcount = 0; for (size_t pos : mappedhits) { - auto bkgscore = ngFilterResult.at(pos); - if (bkgscore->at(0)<0.5) { + auto const& bkgscore = ngFilterResult.at(pos); + if (bkgscore->at(0) ng2semscores; for (size_t i=0;isize();i++) ng2semscores.push_back(scores->at(i)); size_t sem_label = std::distance(ng2semscores.begin(), std::max_element(ng2semscores.begin(), ng2semscores.end()));//arg_max(ng2semscores); ng2sempfpcounts[sem_label]++; } } - srpfp.ng_sem_cat = std::distance(ng2sempfpcounts.begin(), std::max_element(ng2sempfpcounts.begin(), ng2sempfpcounts.end()));//arg_max(ng2sempfpcounts); - srpfp.ng_mip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[0])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ng_hip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[1])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ng_shr_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[2])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ng_mhl_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[3])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ng_dif_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[4])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ng_bkg_frac = float(ng2bkgpfpcount)/pfpHits.size(); + srpfp.ngscore.sem_cat = SRNuGraphScore::NuGraphCategory(std::distance(ng2sempfpcounts.begin(), std::max_element(ng2sempfpcounts.begin(), ng2sempfpcounts.end())));//arg_max(ng2sempfpcounts); + srpfp.ngscore.mip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[0])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ngscore.hip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[1])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ngscore.shr_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[2])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ngscore.mhl_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[3])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ngscore.dif_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[4])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + srpfp.ngscore.bkg_frac = float(ng2bkgpfpcount)/pfpHits.size(); } else { - srpfp.ng_sem_cat = -1; - srpfp.ng_mip_frac = -1.; - srpfp.ng_hip_frac = -1.; - srpfp.ng_shr_frac = -1.; - srpfp.ng_mhl_frac = -1.; - srpfp.ng_dif_frac = -1.; - srpfp.ng_bkg_frac = -1.; + srpfp.ngscore.sem_cat = SRNuGraphScore::NuGraphCategory::Unset; + srpfp.ngscore.mip_frac = -1.; + srpfp.ngscore.hip_frac = -1.; + srpfp.ngscore.shr_frac = -1.; + srpfp.ngscore.mhl_frac = -1.; + srpfp.ngscore.dif_frac = -1.; + srpfp.ngscore.bkg_frac = -1.; } } diff --git a/sbncode/CAFMaker/FillReco.h b/sbncode/CAFMaker/FillReco.h index 45cf2ea2b..efe582756 100644 --- a/sbncode/CAFMaker/FillReco.h +++ b/sbncode/CAFMaker/FillReco.h @@ -105,6 +105,16 @@ namespace caf const std::vector> &inputPoints, caf::SRSlice &slice); + /** + * @brief Fills the results from NuGraph at slice level + * @param inputHits (pointers to) the hits associated to the slice + * @param sliceHitsMap maps position of hits in collection input to NuGraph (slice only) to the one input to Pandora (all gaus hits) + * @param ngFilterResult NuGraph filter result, for each hit + * @param ngSemanticResult NuGraph semnatic result, for each hit (MIP track, HIP, shower, Michel electron, diffuse activity) + * @param[out] slice the destination slice object + * + * Hits with filter value (`ngFilterResult`) lower than `ng_filter_cut` are counted as background. + */ void FillSliceNuGraph(const std::vector> &inputHits, const std::vector &sliceHitsMap, const std::vector>> &ngFilterResult, @@ -137,6 +147,16 @@ namespace caf caf::SRPFP& srpfp, bool allowEmpty = false); + /** + * @brief Fills the results from NuGraph at slice level + * @param sliceHitsMap maps position of hits in collection input to NuGraph (slice only) to the one input to Pandora (all gaus hits) + * @param ngFilterResult NuGraph filter result, for each hit + * @param ngSemanticResult NuGraph semnatic result, for each hit (MIP track, HIP, shower, Michel electron, diffuse activity) + * @param pfpHits Vector of hits associated to the PFParticle + * @param[out] srpfp the destination PFParticle object + * + * Hits with filter value (`ngFilterResult`) lower than `ng_filter_cut` are counted as background. + */ void FillPFPNuGraph(const std::vector &sliceHitsMap, const std::vector>> &ngFilterResult, const std::vector>> &ngSemanticResult, From cae5b11869ac295ad72061d4cd4de77fcd81744c Mon Sep 17 00:00:00 2001 From: Giuseppe Cerati Date: Wed, 7 May 2025 19:22:29 -0500 Subject: [PATCH 6/6] address GP's comments --- sbncode/CAFMaker/FillReco.cxx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index d01cb1d91..d81cb5890 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -1058,11 +1058,12 @@ namespace caf } } srpfp.ngscore.sem_cat = SRNuGraphScore::NuGraphCategory(std::distance(ng2sempfpcounts.begin(), std::max_element(ng2sempfpcounts.begin(), ng2sempfpcounts.end())));//arg_max(ng2sempfpcounts); - srpfp.ngscore.mip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[0])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ngscore.hip_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[1])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ngscore.shr_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[2])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ngscore.mhl_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[3])/(pfpHits.size()-ng2bkgpfpcount) : -1.); - srpfp.ngscore.dif_frac = (pfpHits.size()>ng2bkgpfpcount ? float(ng2sempfpcounts[4])/(pfpHits.size()-ng2bkgpfpcount) : -1.); + size_t nonBkgHits = (pfpHits.size() > ng2bkgpfpcount ? pfpHits.size()-ng2bkgpfpcount : 0); + srpfp.ngscore.mip_frac = (nonBkgHits>0 ? float(ng2sempfpcounts[0])/nonBkgHits : -1.); + srpfp.ngscore.hip_frac = (nonBkgHits>0 ? float(ng2sempfpcounts[1])/nonBkgHits : -1.); + srpfp.ngscore.shr_frac = (nonBkgHits>0 ? float(ng2sempfpcounts[2])/nonBkgHits : -1.); + srpfp.ngscore.mhl_frac = (nonBkgHits>0 ? float(ng2sempfpcounts[3])/nonBkgHits : -1.); + srpfp.ngscore.dif_frac = (nonBkgHits>0 ? float(ng2sempfpcounts[4])/nonBkgHits : -1.); srpfp.ngscore.bkg_frac = float(ng2bkgpfpcount)/pfpHits.size(); } else { srpfp.ngscore.sem_cat = SRNuGraphScore::NuGraphCategory::Unset;