From d20d4c23496ff286f6a4ea2d01a15f0c321032eb Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Tue, 26 Aug 2025 15:15:11 +0200 Subject: [PATCH 1/8] add cuts on tracks not used for the linking --- Validation/HGCalValidation/interface/HGCalValidator.h | 2 ++ .../HGCalValidation/interface/TICLCandidateValidator.h | 5 ++++- Validation/HGCalValidation/plugins/HGCalValidator.cc | 8 ++++++-- Validation/HGCalValidation/src/TICLCandidateValidator.cc | 6 +++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Validation/HGCalValidation/interface/HGCalValidator.h b/Validation/HGCalValidation/interface/HGCalValidator.h index 6d9fc41877ed4..9d8d0fdde260b 100644 --- a/Validation/HGCalValidation/interface/HGCalValidator.h +++ b/Validation/HGCalValidation/interface/HGCalValidator.h @@ -33,6 +33,7 @@ #include "SimDataFormats/Associations/interface/TICLAssociationMap.h" #include "DataFormats/HGCalReco/interface/MultiVectorManager.h" +#include "CommonTools/Utils/interface/StringCutObjectSelector.h" class PileupSummaryInfo; @@ -118,6 +119,7 @@ class HGCalValidator : public DQMGlobalEDAnalyzer { std::vector> tracksterToTracksterAssociatorsTokens_; std::vector> tracksterToTracksterByHitsAssociatorsTokens_; edm::EDGetTokenT scToCpMapToken_; + const StringCutObjectSelector cutTk_; private: CaloParticleSelector cpSelector; diff --git a/Validation/HGCalValidation/interface/TICLCandidateValidator.h b/Validation/HGCalValidation/interface/TICLCandidateValidator.h index ae78a9c250e53..7012bb5113fbf 100644 --- a/Validation/HGCalValidation/interface/TICLCandidateValidator.h +++ b/Validation/HGCalValidation/interface/TICLCandidateValidator.h @@ -12,6 +12,8 @@ #include "FWCore/Utilities/interface/EDGetToken.h" #include "FWCore/Framework/interface/Frameworkfwd.h" +#include "CommonTools/Utils/interface/StringCutObjectSelector.h" + #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/HGCalReco/interface/Trackster.h" #include "DataFormats/HGCalReco/interface/TICLCandidate.h" @@ -128,7 +130,8 @@ class TICLCandidateValidator { void fillCandidateHistos(const edm::Event& event, const Histograms& histograms, - edm::Handle simTrackstersCP_h) const; + edm::Handle simTrackstersCP_h, + const StringCutObjectSelector cutTk) const; private: edm::EDGetTokenT> TICLCandidatesToken_; diff --git a/Validation/HGCalValidation/plugins/HGCalValidator.cc b/Validation/HGCalValidation/plugins/HGCalValidator.cc index c008a565edc5b..e3c72d4f96a77 100644 --- a/Validation/HGCalValidation/plugins/HGCalValidator.cc +++ b/Validation/HGCalValidation/plugins/HGCalValidator.cc @@ -99,7 +99,8 @@ HGCalValidator::HGCalValidator(const edm::ParameterSet& pset) isTICLv5_(pset.getUntrackedParameter("isticlv5")), hits_label_(pset.getParameter>("hits")), scToCpMapToken_( - consumes(pset.getParameter("simClustersToCaloParticlesMap"))) { + consumes(pset.getParameter("simClustersToCaloParticlesMap"))), + cutTk_(pset.getParameter("cutTk")) { //In this way we can easily generalize to associations between other objects also. const edm::InputTag& label_cp_effic_tag = pset.getParameter("label_cp_effic"); const edm::InputTag& label_cp_fake_tag = pset.getParameter("label_cp_fake"); @@ -628,7 +629,7 @@ void HGCalValidator::dqmAnalyze(const edm::Event& event, // tracksters histograms if (doCandidatesPlots_) { - candidateVal_->fillCandidateHistos(event, histograms.histoTICLCandidates, simTracksterFromCPHandle); + candidateVal_->fillCandidateHistos(event, histograms.histoTICLCandidates, simTracksterFromCPHandle, cutTk_); } } @@ -883,6 +884,9 @@ void HGCalValidator::fillDescriptions(edm::ConfigurationDescriptions& descriptio -1, }); desc.add("dirName", "HGCAL/HGCalValidator/"); + desc.add("cutTk", + "1.48 < abs(eta) < 3.0 && pt > 1. && quality(\"highPurity\") && " + "hitPattern().numberOfLostHits(\"MISSING_OUTER_HITS\") < 5"); desc.addUntracked("isticlv5", false); descriptions.add("hgcalValidator", desc); } diff --git a/Validation/HGCalValidation/src/TICLCandidateValidator.cc b/Validation/HGCalValidation/src/TICLCandidateValidator.cc index 104ef661db68b..70e66b13210fd 100644 --- a/Validation/HGCalValidation/src/TICLCandidateValidator.cc +++ b/Validation/HGCalValidation/src/TICLCandidateValidator.cc @@ -278,7 +278,8 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, const Histograms& histograms, - edm::Handle simTrackstersCP_h) const { + edm::Handle simTrackstersCP_h, + const StringCutObjectSelector cutTk) const { auto TICLCandidatesHandle = event.getHandle(TICLCandidatesToken_); if (!TICLCandidatesHandle.isValid()) { edm::LogError("TICLCandidatesError") << "Failed to retrieve TICL candidates."; @@ -355,8 +356,7 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, // no reco track, but simCand is charged continue; } - if (simCand.trackPtr().get()->pt() < 1 or simCand.trackPtr().get()->missingOuterHits() > 5 or - not simCand.trackPtr().get()->quality(reco::TrackBase::highPurity)) + if (!cutTk(*(simCand.trackPtr().get()))) continue; // +1 to all denominators From 92cfa02bdcc6410cdc12ae6a563a496762686146 Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Tue, 26 Aug 2025 15:21:35 +0200 Subject: [PATCH 2/8] ignore charged sim candidates with no reco track --- Validation/HGCalValidation/src/TICLCandidateValidator.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Validation/HGCalValidation/src/TICLCandidateValidator.cc b/Validation/HGCalValidation/src/TICLCandidateValidator.cc index 70e66b13210fd..445de45ab8bea 100644 --- a/Validation/HGCalValidation/src/TICLCandidateValidator.cc +++ b/Validation/HGCalValidation/src/TICLCandidateValidator.cc @@ -571,6 +571,13 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, continue; const auto& simCand = simTICLCandidates[simCand_idx]; + + // if simCand does not have the track and has pdg id charged skip this + // it means we have not recontruct the track + // if associated cand is neutral then this is correct + if (simCand.charge() == 0 and (std::abs(simCand.pdgId()) == 211 or std::abs(simCand.pdgId()) == 11)) + continue; + if (simCand.trackPtr().get() != nullptr) { const auto simCandTrackIdx = simCand.trackPtr().get() - edm::Ptr(recoTracks_h, 0).get(); if (simCandTrackIdx != candTrackIdx) { From 7257ba16ccfad7c274791c375fb35e0aa4d553df Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Tue, 26 Aug 2025 15:20:18 +0200 Subject: [PATCH 3/8] use vector of tracks in TICL tracksters and candidates - change the dataformats to allow this - change the simulation to link multiple tracks - change the validation to consider all the tracks --- .../HGCalReco/interface/TICLCandidate.h | 28 +++++--- DataFormats/HGCalReco/interface/Trackster.h | 7 +- DataFormats/HGCalReco/src/classes_def.xml | 6 +- .../LinkingAlgoByDirectionGeometric.cc | 6 +- .../TICL/plugins/SimTrackstersProducer.cc | 56 +++++++++------ .../plugins/TracksterGeneralTrackPlugin.cc | 2 +- .../TICL/plugins/TrackstersMergeProducer.cc | 2 +- .../src/TICLCandidateValidator.cc | 68 +++++++++++-------- 8 files changed, 105 insertions(+), 70 deletions(-) diff --git a/DataFormats/HGCalReco/interface/TICLCandidate.h b/DataFormats/HGCalReco/interface/TICLCandidate.h index fa8428f88a9f2..3100b366dbb2a 100644 --- a/DataFormats/HGCalReco/interface/TICLCandidate.h +++ b/DataFormats/HGCalReco/interface/TICLCandidate.h @@ -2,6 +2,7 @@ #define DataFormats_HGCalReco_TICLCandidate_h #include "DataFormats/Candidate/interface/LeafCandidate.h" +#include "DataFormats/Common/interface/Ptr.h" #include "DataFormats/Common/interface/Ref.h" #include "DataFormats/HGCalReco/interface/Trackster.h" #include "DataFormats/Math/interface/Point3D.h" @@ -33,8 +34,8 @@ class TICLCandidate : public reco::LeafCandidate { rawEnergy_(0.f) {} TICLCandidate(const edm::Ptr trackPtr, const edm::Ptr& tracksterPtr) - : LeafCandidate(), tracksters_{}, trackPtr_(trackPtr), time_(0.f), timeError_(-1.f) { - if (trackPtr_.isNull() and tracksterPtr.isNull()) + : LeafCandidate(), tracksters_{}, trackPtrs_{}, time_(0.f), timeError_(-1.f) { + if (trackPtr.isNull() and tracksterPtr.isNull()) throw cms::Exception("NullPointerError") << "TICLCandidate constructor: at least one between track and trackster must be valid"; @@ -42,9 +43,10 @@ class TICLCandidate : public reco::LeafCandidate { tracksters_.push_back(tracksterPtr); auto const& trackster = tracksters_[0].get(); idProbabilities_ = trackster->id_probabilities(); - if (trackPtr_.isNonnull()) { + if (trackPtr.isNonnull()) { + trackPtrs_.push_back(trackPtr); auto pdgId = trackster->isHadronic() ? 211 : 11; - auto const& tk = trackPtr_.get(); + auto const& tk = trackPtr.get(); setPdgId(pdgId * tk->charge()); setCharge(tk->charge()); rawEnergy_ = trackster->raw_energy(); @@ -69,7 +71,8 @@ class TICLCandidate : public reco::LeafCandidate { } } else { //candidate from track only - auto const& tk = trackPtr_.get(); + trackPtrs_.push_back(trackPtr); + auto const& tk = trackPtr.get(); setPdgId(211 * tk->charge()); setCharge(tk->charge()); const float energy = std::sqrt(tk->p() * tk->p() + ticl::mpion2); @@ -95,15 +98,18 @@ class TICLCandidate : public reco::LeafCandidate { MTDtimeError_ = timeError; }; - inline const edm::Ptr trackPtr() const { return trackPtr_; } - void setTrackPtr(const edm::Ptr& trackPtr) { trackPtr_ = trackPtr; } + inline const edm::Ptr trackPtr(int index = 0) const { + return trackPtrs_.empty() ? edm::Ptr() : trackPtrs_[index]; + } + inline const std::vector> trackPtrs() const { return trackPtrs_; } + void addTrackPtr(const edm::Ptr& trackPtr) { trackPtrs_.push_back(trackPtr); } inline float rawEnergy() const { return rawEnergy_; } void setRawEnergy(float rawEnergy) { rawEnergy_ = rawEnergy; } - inline const std::vector > tracksters() const { return tracksters_; }; + inline const std::vector> tracksters() const { return tracksters_; }; - void setTracksters(const std::vector >& tracksters) { tracksters_ = tracksters; } + void setTracksters(const std::vector>& tracksters) { tracksters_ = tracksters; } void addTrackster(const edm::Ptr& trackster) { tracksters_.push_back(trackster); time_ = trackster->time(); @@ -129,8 +135,8 @@ class TICLCandidate : public reco::LeafCandidate { private: // vector of Ptr so Tracksters can come from different collections // and there can be derived classes - std::vector > tracksters_; - edm::Ptr trackPtr_; + std::vector> tracksters_; + std::vector> trackPtrs_; // Since it contains multiple tracksters, duplicate the probability interface std::array idProbabilities_; diff --git a/DataFormats/HGCalReco/interface/Trackster.h b/DataFormats/HGCalReco/interface/Trackster.h index d9b927d0a6b13..cce9ec1fc2a00 100644 --- a/DataFormats/HGCalReco/interface/Trackster.h +++ b/DataFormats/HGCalReco/interface/Trackster.h @@ -77,8 +77,8 @@ namespace ticl { inline void setRawEmPt(float value) { raw_em_pt_ = value; } inline void calculateRawEmPt() { raw_em_pt_ = raw_em_energy_ / std::cosh(barycenter_.eta()); } inline void setBarycenter(Vector value) { barycenter_ = value; } - inline void setTrackIdx(int index) { track_idx_ = index; } - int trackIdx() const { return track_idx_; } + inline void addTrackIdx(int index) { track_idxs_.push_back(index); } + int trackIdx(int index = 0) const { return track_idxs_.empty() ? -1 : track_idxs_[index]; } inline bool isHadronic(float th = 0.5f) const { return id_probability(Trackster::ParticleType::photon) + id_probability(Trackster::ParticleType::electron) < th; } @@ -198,6 +198,7 @@ namespace ticl { inline const std::array &sigmasPCA() const { return sigmasPCA_; } inline const std::array &id_probabilities() const { return id_probabilities_; } inline const float id_probabilities(int index) const { return id_probabilities_[index]; } + inline const std::vector &trackIdxs() const { return track_idxs_; } // convenience method to return the ID probability for a certain particle type inline float id_probability(ParticleType type) const { @@ -236,7 +237,7 @@ namespace ticl { // created the trackster. For track-based seeding the pointer to the track // can be cooked using the previous ProductID and this index. int seedIndex_; - int track_idx_ = -1; + std::vector track_idxs_; std::array eigenvectors_; std::array eigenvalues_; diff --git a/DataFormats/HGCalReco/src/classes_def.xml b/DataFormats/HGCalReco/src/classes_def.xml index 1483c50609dcd..982737b35f4f6 100644 --- a/DataFormats/HGCalReco/src/classes_def.xml +++ b/DataFormats/HGCalReco/src/classes_def.xml @@ -1,6 +1,7 @@ - + + @@ -66,7 +67,8 @@ - + + diff --git a/RecoHGCal/TICL/plugins/LinkingAlgoByDirectionGeometric.cc b/RecoHGCal/TICL/plugins/LinkingAlgoByDirectionGeometric.cc index 093931d4d409c..866d7f5b33f69 100644 --- a/RecoHGCal/TICL/plugins/LinkingAlgoByDirectionGeometric.cc +++ b/RecoHGCal/TICL/plugins/LinkingAlgoByDirectionGeometric.cc @@ -396,7 +396,7 @@ void LinkingAlgoByDirectionGeometric::linkTracksters(const edm::Handle(tkH, i)); + chargedHad.addTrackPtr(edm::Ptr(tkH, i)); chargedHadronsFromTk.push_back(chargedHad); continue; } @@ -506,11 +506,11 @@ void LinkingAlgoByDirectionGeometric::linkTracksters(const edm::Handle(tkH, i)); + chargedCandidate.addTrackPtr(edm::Ptr(tkH, i)); chargedCandidates.push_back(chargedCandidate); } else { // create charged hadron TICLCandidate chargedHad; - chargedHad.setTrackPtr(edm::Ptr(tkH, i)); + chargedHad.addTrackPtr(edm::Ptr(tkH, i)); chargedHadronsFromTk.push_back(chargedHad); } } diff --git a/RecoHGCal/TICL/plugins/SimTrackstersProducer.cc b/RecoHGCal/TICL/plugins/SimTrackstersProducer.cc index 435afdc17e952..a2836b3790cc5 100644 --- a/RecoHGCal/TICL/plugins/SimTrackstersProducer.cc +++ b/RecoHGCal/TICL/plugins/SimTrackstersProducer.cc @@ -398,9 +398,8 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es) makePUTrackster(inputClusterMask, *output_mask, *resultPU, caloParticles_h.id(), 0); - auto simTrackToRecoTrack = [&](UniqueSimTrackId simTkId) -> std::pair { - int trackIdx = -1; - float quality = 0.f; + auto simTrackToRecoTrack = [&](UniqueSimTrackId simTkId) -> std::vector { + std::vector trackIdx; auto ipos = simTrackToTPMap.mapping.find(simTkId); if (ipos != simTrackToTPMap.mapping.end()) { auto jpos = TPtoRecoTrackMap.find((ipos->second)); @@ -409,41 +408,55 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es) if (!associatedRecoTracks.empty()) { // associated reco tracks are sorted by decreasing quality if (associatedRecoTracks[0].second > qualityCutTrack_) { - trackIdx = &(*associatedRecoTracks[0].first) - &recoTracks[0]; - quality = associatedRecoTracks[0].second; + trackIdx.push_back(&(*associatedRecoTracks[0].first) - &recoTracks[0]); + } + } + } + const auto& tp = (*ipos->second); + if (!tp.decayVertices().empty()) { + const auto& iTV = tp.decayVertices()[0]; + for (auto iTP = iTV->daughterTracks_begin(); iTP != iTV->daughterTracks_end(); ++iTP) { + auto kpos = TPtoRecoTrackMap.find((*iTP)); + if (kpos != TPtoRecoTrackMap.end()) { + auto& associatedRecoTracks = kpos->val; + if (!associatedRecoTracks.empty()) { + // associated reco tracks are sorted by decreasing quality + if (associatedRecoTracks[0].second > qualityCutTrack_) { + trackIdx.push_back(&(*associatedRecoTracks[0].first) - &recoTracks[0]); + } + } } } } } - return {trackIdx, quality}; + return trackIdx; }; - // Creating the map from TrackingParticle to SimTrackstersFromCP + // Set the reco track id to SimTrackstersFromCP auto& simTrackstersFromCP = *result_fromCP; for (unsigned int i = 0; i < simTrackstersFromCP.size(); ++i) { if (simTrackstersFromCP[i].vertices().empty()) continue; const auto& simTrack = caloparticles[simTrackstersFromCP[i].seedIndex()].g4Tracks()[0]; UniqueSimTrackId simTkIds(simTrack.trackId(), simTrack.eventId()); - auto bestAssociatedRecoTrack = simTrackToRecoTrack(simTkIds); - if (bestAssociatedRecoTrack.first != -1 and bestAssociatedRecoTrack.second > qualityCutTrack_) { - auto trackIndex = bestAssociatedRecoTrack.first; - simTrackstersFromCP[i].setTrackIdx(trackIndex); + auto bestAssociatedRecoTracks = simTrackToRecoTrack(simTkIds); + if (not bestAssociatedRecoTracks.empty()) { + for (auto const trackIndex : bestAssociatedRecoTracks) + simTrackstersFromCP[i].addTrackIdx(trackIndex); } } auto& simTracksters = *result; - // Creating the map from TrackingParticle to SimTrackster - std::unordered_map> TPtoSimTracksterMap; + // Set the reco track id to simTracksters for (unsigned int i = 0; i < simTracksters.size(); ++i) { const auto& simTrack = (simTracksters[i].seedID() == caloParticles_h.id()) ? caloparticles[simTracksters[i].seedIndex()].g4Tracks()[0] : simclusters[simTracksters[i].seedIndex()].g4Tracks()[0]; UniqueSimTrackId simTkIds(simTrack.trackId(), simTrack.eventId()); - auto bestAssociatedRecoTrack = simTrackToRecoTrack(simTkIds); - if (bestAssociatedRecoTrack.first != -1 and bestAssociatedRecoTrack.second > qualityCutTrack_) { - auto trackIndex = bestAssociatedRecoTrack.first; - simTracksters[i].setTrackIdx(trackIndex); + auto bestAssociatedRecoTracks = simTrackToRecoTrack(simTkIds); + if (not bestAssociatedRecoTracks.empty()) { + for (auto const trackIndex : bestAssociatedRecoTracks) + simTracksters[i].addTrackIdx(trackIndex); } } @@ -465,12 +478,15 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es) : SimClusterToCaloParticleMap[simTrackster.seedIndex()]; auto const& tCP = (*result_fromCP)[cp_index]; if (!tCP.vertices().empty()) { - auto trackIndex = tCP.trackIdx(); + auto trackIndices = tCP.trackIdxs(); auto& cand = (*result_ticlCandidates)[cp_index]; cand.addTrackster(edm::Ptr(simTracksters_h, i)); - if (trackIndex != -1 && caloparticles[cp_index].charge() != 0) - cand.setTrackPtr(edm::Ptr(recoTracks_h, trackIndex)); + if (cand.trackPtrs().empty() and not trackIndices.empty() and caloparticles[cp_index].charge() != 0) { + for (const auto trackIndex : trackIndices) { + cand.addTrackPtr(edm::Ptr(recoTracks_h, trackIndex)); + } + } toKeep.push_back(cp_index); } } diff --git a/RecoHGCal/TICL/plugins/TracksterGeneralTrackPlugin.cc b/RecoHGCal/TICL/plugins/TracksterGeneralTrackPlugin.cc index b28d86ffde547..fda6480bef832 100644 --- a/RecoHGCal/TICL/plugins/TracksterGeneralTrackPlugin.cc +++ b/RecoHGCal/TICL/plugins/TracksterGeneralTrackPlugin.cc @@ -32,7 +32,7 @@ namespace ticl { TrackPtr ptr(trackster.seedID(), trackster.seedIndex(), &event.productGetter()); auto& ticl_cand = ticl_cands[i]; - ticl_cand.setTrackPtr(ptr); + ticl_cand.addTrackPtr(ptr); } } } // namespace ticl diff --git a/RecoHGCal/TICL/plugins/TrackstersMergeProducer.cc b/RecoHGCal/TICL/plugins/TrackstersMergeProducer.cc index b88766107b9d0..6ac4f91c97212 100644 --- a/RecoHGCal/TICL/plugins/TrackstersMergeProducer.cc +++ b/RecoHGCal/TICL/plugins/TrackstersMergeProducer.cc @@ -309,7 +309,7 @@ void TrackstersMergeProducer::produce(edm::Event &evt, const edm::EventSetup &es // Merge included tracksters ticl::Trackster outTrackster; - outTrackster.setTrackIdx(track_idx); + outTrackster.addTrackIdx(track_idx); auto updated_size = 0; for (const auto &ts_ptr : trackster_ptrs) { #ifdef EDM_ML_DEBUG diff --git a/Validation/HGCalValidation/src/TICLCandidateValidator.cc b/Validation/HGCalValidation/src/TICLCandidateValidator.cc index 445de45ab8bea..02a762e1dfcae 100644 --- a/Validation/HGCalValidation/src/TICLCandidateValidator.cc +++ b/Validation/HGCalValidation/src/TICLCandidateValidator.cc @@ -342,6 +342,8 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, chargedCandidates.shrink_to_fit(); neutralCandidates.shrink_to_fit(); + auto firstTs = edm::Ptr(Tracksters_h, 0).get(); + auto firstTrack = edm::Ptr(recoTracks_h, 0).get(); for (const auto i : chargedCandidates) { const auto& simCand = simTICLCandidates[i]; auto index = std::log2(int(ticl::tracksterParticleTypeFromPdgId(simCand.pdgId(), 1))); @@ -349,14 +351,13 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, * 13 (type 2) becomes 1 * 211 (type 4) becomes 2 */ - int32_t simCandTrackIdx = -1; - if (simCand.trackPtr().get() != nullptr) - simCandTrackIdx = simCand.trackPtr().get() - edm::Ptr(recoTracks_h, 0).get(); - else { - // no reco track, but simCand is charged - continue; + + std::vector simCandTrackIdx; + for (const auto& track : simCand.trackPtrs()) { + if (cutTk(*(simCand.trackPtr().get()))) + simCandTrackIdx.push_back(track.get() - firstTrack); } - if (!cutTk(*(simCand.trackPtr().get()))) + if (simCandTrackIdx.empty()) continue; // +1 to all denominators @@ -383,13 +384,14 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, auto& recoCand = TICLCandidates[cand_idx]; if (isTICLv5_) { // cand_idx is the tsMerge index, find the ts in the candidates collection - auto const tsPtr = edm::Ptr(Tracksters_h, cand_idx); - auto cand_it = std::find_if(TICLCandidates.begin(), TICLCandidates.end(), [tsPtr](TICLCandidate const& cand) { - if (!cand.tracksters().empty()) - return cand.tracksters()[0] == tsPtr; - else - return false; - }); + auto cand_it = + std::find_if(TICLCandidates.begin(), TICLCandidates.end(), [firstTs, cand_idx](TICLCandidate const& cand) { + if (!cand.tracksters().empty()) + return (cand.tracksters()[0]).get() - firstTs == + cand_idx; // in TICLv5 there is one trackster per candidate + else + return false; + }); if (cand_it != TICLCandidates.end()) recoCand = *cand_it; else @@ -397,8 +399,8 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, } if (recoCand.trackPtr().get() != nullptr) { - const auto candTrackIdx = recoCand.trackPtr().get() - edm::Ptr(recoTracks_h, 0).get(); - if (simCandTrackIdx == candTrackIdx) { + const auto candTrackIdx = recoCand.trackPtr().get() - firstTrack; + if (std::find(simCandTrackIdx.begin(), simCandTrackIdx.end(), candTrackIdx) != simCandTrackIdx.end()) { // +1 to track num histograms.h_num_chg_energy_candidate_track[index]->Fill(simCand.rawEnergy()); histograms.h_num_chg_pt_candidate_track[index]->Fill(simCand.pt()); @@ -412,6 +414,7 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, } //step 2: PID + // NOTE: ok to compare number and not had / em because few pgd are used for the candidates if (simCand.pdgId() == recoCand.pdgId()) { // +1 to num pdg id histograms.h_num_chg_energy_candidate_pdgId[index]->Fill(simCand.rawEnergy()); @@ -461,13 +464,14 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, auto& recoCand = TICLCandidates[cand_idx]; if (isTICLv5_) { // cand_idx is the tsMerge index, find the ts in the candidates collection - auto const tsPtr = edm::Ptr(Tracksters_h, cand_idx); - auto cand_it = std::find_if(TICLCandidates.begin(), TICLCandidates.end(), [tsPtr](TICLCandidate const& cand) { - if (!cand.tracksters().empty()) - return cand.tracksters()[0] == tsPtr; - else - return false; - }); + auto cand_it = + std::find_if(TICLCandidates.begin(), TICLCandidates.end(), [firstTs, cand_idx](TICLCandidate const& cand) { + if (!cand.tracksters().empty()) + return (cand.tracksters()[0]).get() - firstTs == + cand_idx; // in TICLv5 there is one trackster per candidate + else + return false; + }); if (cand_it != TICLCandidates.end()) recoCand = *cand_it; else @@ -530,7 +534,7 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, * 211 (type 4) becomes 2 */ int32_t candTrackIdx = -1; - candTrackIdx = cand.trackPtr().get() - edm::Ptr(recoTracks_h, 0).get(); + candTrackIdx = cand.trackPtr().get() - firstTrack; if (cand.tracksters().empty()) continue; @@ -538,7 +542,7 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, // i is the candidate idx == ts idx only in v4, find ts_idx in v5 auto mergeTs_id = i; if (isTICLv5_) { - mergeTs_id = cand.tracksters()[0].get() - edm::Ptr(Tracksters_h, 0).get(); + mergeTs_id = cand.tracksters()[0].get() - firstTs; } // +1 to all denominators @@ -547,6 +551,7 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_den_fake_chg_eta_candidate[index]->Fill(cand.eta()); histograms.h_den_fake_chg_phi_candidate[index]->Fill(cand.phi()); + // general plots histograms.h_chg_tracksters_in_candidate[index]->Fill(cand.tracksters().size()); histograms.h_chg_candidate_regressed_energy[index]->Fill(cand.energy()); histograms.h_chg_candidate_charge[index]->Fill(cand.charge()); @@ -578,9 +583,13 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, if (simCand.charge() == 0 and (std::abs(simCand.pdgId()) == 211 or std::abs(simCand.pdgId()) == 11)) continue; - if (simCand.trackPtr().get() != nullptr) { - const auto simCandTrackIdx = simCand.trackPtr().get() - edm::Ptr(recoTracks_h, 0).get(); - if (simCandTrackIdx != candTrackIdx) { + std::vector simCandTrackIdx; + for (const auto& track : simCand.trackPtrs()) { + simCandTrackIdx.push_back(track.get() - firstTrack); + } + + if (!simCandTrackIdx.empty()) { + if (std::find(simCandTrackIdx.begin(), simCandTrackIdx.end(), candTrackIdx) == simCandTrackIdx.end()) { // fake += 1 histograms.h_num_fake_chg_energy_candidate_track[index]->Fill(cand.rawEnergy()); histograms.h_num_fake_chg_pt_candidate_track[index]->Fill(cand.pt()); @@ -631,7 +640,7 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, // i is the candidate idx == ts idx only in v4, find ts_idx in v5 auto mergeTs_id = i; if (isTICLv5_) { - mergeTs_id = cand.tracksters()[0].get() - edm::Ptr(Tracksters_h, 0).get(); + mergeTs_id = cand.tracksters()[0].get() - firstTs; } // +1 to all denominators @@ -640,6 +649,7 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_den_fake_neut_eta_candidate[index]->Fill(cand.eta()); histograms.h_den_fake_neut_phi_candidate[index]->Fill(cand.phi()); + // general plots histograms.h_neut_tracksters_in_candidate[index]->Fill(cand.tracksters().size()); histograms.h_neut_candidate_regressed_energy[index]->Fill(cand.energy()); histograms.h_neut_candidate_charge[index]->Fill(cand.charge()); From 91138568a5983fa4113376127a46647039298fcf Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Fri, 29 Aug 2025 12:01:10 +0200 Subject: [PATCH 4/8] small change in mtd time computation --- RecoHGCal/TICL/plugins/TICLCandidateProducer.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RecoHGCal/TICL/plugins/TICLCandidateProducer.cc b/RecoHGCal/TICL/plugins/TICLCandidateProducer.cc index f67841c5406ab..ad53156153be4 100644 --- a/RecoHGCal/TICL/plugins/TICLCandidateProducer.cc +++ b/RecoHGCal/TICL/plugins/TICLCandidateProducer.cc @@ -409,6 +409,8 @@ void TICLCandidateProducer::assignTimeToCandidates(std::vector &r float invTimeErr = 0.f; float timeErr = -1.f; + const int trackIndex = + cand.trackPtr().isNonnull() ? (cand.trackPtr().get() - (edm::Ptr(track_h, 0)).get()) : -1; for (const auto &tr : cand.tracksters()) { if (tr->timeError() > 0) { const auto invTimeESq = pow(tr->timeError(), -2); @@ -416,8 +418,7 @@ void TICLCandidateProducer::assignTimeToCandidates(std::vector &r const auto y = tr->barycenter().Y(); const auto z = tr->barycenter().Z(); auto path = std::sqrt(x * x + y * y + z * z); - if (cand.trackPtr().get() != nullptr) { - const auto &trackIndex = cand.trackPtr().get() - (edm::Ptr(track_h, 0)).get(); + if (trackIndex != -1) { if (useMTDTiming_ and inputTimingView.timeErr()[trackIndex] > 0) { const auto xMtd = inputTimingView.posInMTD_x()[trackIndex]; const auto yMtd = inputTimingView.posInMTD_y()[trackIndex]; @@ -448,7 +449,6 @@ void TICLCandidateProducer::assignTimeToCandidates(std::vector &r if (useMTDTiming_ and cand.charge()) { // Check MTD timing availability - const auto &trackIndex = cand.trackPtr().get() - (edm::Ptr(track_h, 0)).get(); const bool assocQuality = inputTimingView.MVAquality()[trackIndex] > timingQualityThreshold_; if (assocQuality) { const auto timeHGC = cand.time(); From 617fdcd56845464f05044b8ce44bf9cd92ba6c77 Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Wed, 3 Sep 2025 11:43:48 +0200 Subject: [PATCH 5/8] add multiplicity plots and fix ranges --- .../interface/TICLCandidateValidator.h | 8 ++ .../python/PostProcessorHGCAL_cfi.py | 8 +- .../HGCalValidation/python/hgcalPlots.py | 34 ++++- .../src/TICLCandidateValidator.cc | 131 +++++++++++++----- 4 files changed, 140 insertions(+), 41 deletions(-) diff --git a/Validation/HGCalValidation/interface/TICLCandidateValidator.h b/Validation/HGCalValidation/interface/TICLCandidateValidator.h index 7012bb5113fbf..21ea79f414e4f 100644 --- a/Validation/HGCalValidation/interface/TICLCandidateValidator.h +++ b/Validation/HGCalValidation/interface/TICLCandidateValidator.h @@ -70,31 +70,39 @@ struct TICLCandidateValidatorHistograms { std::vector h_num_fake_chg_energy_candidate_track; std::vector h_num_fake_chg_energy_candidate_pdgId; std::vector h_num_fake_chg_energy_candidate_energy; + std::vector h_num_fake_chg_energy_candidate_tot; std::vector h_den_fake_chg_pt_candidate; std::vector h_num_fake_chg_pt_candidate_track; std::vector h_num_fake_chg_pt_candidate_pdgId; std::vector h_num_fake_chg_pt_candidate_energy; + std::vector h_num_fake_chg_pt_candidate_tot; std::vector h_den_fake_chg_eta_candidate; std::vector h_num_fake_chg_eta_candidate_track; std::vector h_num_fake_chg_eta_candidate_pdgId; std::vector h_num_fake_chg_eta_candidate_energy; + std::vector h_num_fake_chg_eta_candidate_tot; std::vector h_den_fake_chg_phi_candidate; std::vector h_num_fake_chg_phi_candidate_track; std::vector h_num_fake_chg_phi_candidate_pdgId; std::vector h_num_fake_chg_phi_candidate_energy; + std::vector h_num_fake_chg_phi_candidate_tot; std::vector h_den_fake_neut_energy_candidate; std::vector h_num_fake_neut_energy_candidate_pdgId; std::vector h_num_fake_neut_energy_candidate_energy; + std::vector h_num_fake_neut_energy_candidate_tot; std::vector h_den_fake_neut_pt_candidate; std::vector h_num_fake_neut_pt_candidate_pdgId; std::vector h_num_fake_neut_pt_candidate_energy; + std::vector h_num_fake_neut_pt_candidate_tot; std::vector h_den_fake_neut_eta_candidate; std::vector h_num_fake_neut_eta_candidate_pdgId; std::vector h_num_fake_neut_eta_candidate_energy; + std::vector h_num_fake_neut_eta_candidate_tot; std::vector h_den_fake_neut_phi_candidate; std::vector h_num_fake_neut_phi_candidate_pdgId; std::vector h_num_fake_neut_phi_candidate_energy; + std::vector h_num_fake_neut_phi_candidate_tot; std::vector h_chg_tracksters_in_candidate; std::vector h_chg_candidate_regressed_energy; diff --git a/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py b/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py index 0459267b597d2..bba82855214d7 100644 --- a/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py +++ b/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py @@ -110,12 +110,14 @@ for c in charged: for var in variables.keys(): eff_candidates.append("fake_"+c+"_track_"+var+" '"+c.replace("_", " ")+" candidates track fake vs "+var+"' num_fake_track_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) - eff_candidates.append("fake_"+c+"_pid_"+var+" '"+c.replace("_", " ")+" candidates track + pid fake vs "+var+"' num_fake_pid_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) - eff_candidates.append("fake_"+c+"_energy_"+var+" '"+c.replace("_", " ")+" candidates track + pid + energy fake vs "+var+"' num_fake_energy_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) + eff_candidates.append("fake_"+c+"_pid_"+var+" '"+c.replace("_", " ")+" candidates pid fake vs "+var+"' num_fake_pid_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) + eff_candidates.append("fake_"+c+"_energy_"+var+" '"+c.replace("_", " ")+" candidates energy fake vs "+var+"' num_fake_energy_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) + eff_candidates.append("fake_"+c+"_total_"+var+" '"+c.replace("_", " ")+" candidates track + pid + energy fake vs "+var+"' num_fake_total_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) for n in neutrals: for var in variables.keys(): eff_candidates.append("fake_"+n+"_pid_"+var+" '"+n.replace("_", " ")+" candidates pid fake vs "+var+"' num_fake_pid_cand_vs_"+var+"_"+n+" den_fake_cand_vs_"+var+"_"+n) - eff_candidates.append("fake_"+n+"_energy_"+var+" '"+n.replace("_", " ")+" candidates pid + energy fake vs "+var+"' num_fake_energy_cand_vs_"+var+"_"+n+" den_fake_cand_vs_"+var+"_"+n) + eff_candidates.append("fake_"+n+"_energy_"+var+" '"+n.replace("_", " ")+" candidates energy fake vs "+var+"' num_fake_energy_cand_vs_"+var+"_"+n+" den_fake_cand_vs_"+var+"_"+n) + eff_candidates.append("fake_"+n+"_total_"+var+" '"+n.replace("_", " ")+" candidates pid + energy fake vs "+var+"' num_fake_total_cand_vs_"+var+"_"+n+" den_fake_cand_vs_"+var+"_"+n) postProcessorHGCALCandidates = DQMEDHarvester('DQMGenericClient', subDirs = cms.untracked.vstring(subDirsCandidates), diff --git a/Validation/HGCalValidation/python/hgcalPlots.py b/Validation/HGCalValidation/python/hgcalPlots.py index ea04a6328513c..8d1c4ffc5eb3a 100644 --- a/Validation/HGCalValidation/python/hgcalPlots.py +++ b/Validation/HGCalValidation/python/hgcalPlots.py @@ -1835,20 +1835,44 @@ cand_eff_plots = [] for var in ["pt", "energy", "eta", "phi"]: for cut in ["track", "pid", "energy"]: - cand_eff_plots.extend([Plot("eff_"+ct+"_"+cut+"_"+var, title=cut + " efficiency for "+ct.replace("_", " ")+" vs "+var, ytitle="Efficiency", **_common_eff_fake)]) + if cut=="track" and ct in ["neutral_hadrons", "neutral_pions", "photons"]: continue + #options = (_common_eff_fake | _xminmaxEn) if var=="energy" else ( (_common_eff_fake | _xminmaxPt) if var=="pt" else _common_eff_fake) + cand_eff_plots.extend([Plot("eff_"+ct+"_"+cut+"_"+var, title=cut + " - efficiency for "+ct.replace("_", " ")+" vs "+var, ytitle="Efficiency", **_common_eff_fake)]) _all_cand_eff_plots.append(cand_eff_plots) +_all_cand_effNum_plots = [] +for ct in cand_type: + cand_eff_plots = [] + for var in ["pt", "energy", "eta", "phi"]: + for cut in ["track", "pid", "energy"]: + if cut=="track" and ct in ["neutral_hadrons", "neutral_pions", "photons"]: continue + cand_eff_plots.extend([Plot("num_"+cut+"_cand_vs_"+var+"_"+ct, title=cut + " - number of efficient "+ct.replace("_", " ")+" vs "+var, ytitle="Efficient candidates", **_common)]) + _all_cand_effNum_plots.append(cand_eff_plots) + _all_cand_fake_plots = [] for ct in cand_type: cand_fake_plots = [] for var in ["pt", "energy", "eta", "phi"]: - for cut in ["track", "pid", "energy"]: - cand_fake_plots.extend([Plot("fake_"+ct+"_"+cut+"_"+var, title=cut + " fake rate for "+ct.replace("_", " ")+" vs "+var, ytitle="Fake rate", **_common_eff_fake)]) + for cut in ["track", "pid", "energy", "total"]: + if cut=="track" and ct in ["neutral_hadrons", "neutral_pions", "photons"]: continue + #options = (_common_eff_fake | _xminmaxEn) if var=="energy" else ( (_common_eff_fake | _xminmaxPt) if var=="pt" else _common_eff_fake) + cand_fake_plots.extend([Plot("fake_"+ct+"_"+cut+"_"+var, title=cut + " - fake rate for "+ct.replace("_", " ")+" vs "+var, ytitle="Fake rate", **_common_eff_fake)]) _all_cand_fake_plots.append(cand_fake_plots) +_all_cand_fakeNum_plots = [] +for ct in cand_type: + cand_fake_plots = [] + for var in ["pt", "energy", "eta", "phi"]: + for cut in ["track", "pid", "energy", "total"]: + if cut=="track" and ct in ["neutral_hadrons", "neutral_pions", "photons"]: continue + cand_fake_plots.extend([Plot("num_fake_"+cut+"_cand_vs_"+var+"_"+ct, title=cut + " - number of fakes for "+ct.replace("_", " ")+" vs "+var, ytitle="Fake number", **_common)]) + _all_cand_fakeNum_plots.append(cand_fake_plots) + _allCandidatesPlots = [[],[],[],[],[],[]] -for i in range(6): - _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=3)]) +for i in range(3): + _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=3), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=4), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=4)]) +for i in range(3,6): + _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=2), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=2), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=3)]) #-------------------------------------------------------------------------------------------- # SIMHITS, DIGIS, RECHITS diff --git a/Validation/HGCalValidation/src/TICLCandidateValidator.cc b/Validation/HGCalValidation/src/TICLCandidateValidator.cc index 02a762e1dfcae..c68053e233a9f 100644 --- a/Validation/HGCalValidation/src/TICLCandidateValidator.cc +++ b/Validation/HGCalValidation/src/TICLCandidateValidator.cc @@ -29,10 +29,10 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, histograms.h_tracksters_in_candidate = ibook.book1D("N of tracksters in candidate", "N of tracksters in candidate", 100, 0, 99); histograms.h_candidate_raw_energy = - ibook.book1D("Candidates raw energy", "Candidates raw energy;E (GeV)", 250, 0, 250); + ibook.book1D("Candidates raw energy", "Candidates raw energy;E (GeV)", 100, 0, 500); histograms.h_candidate_regressed_energy = - ibook.book1D("Candidates regressed energy", "Candidates regressed energy;E (GeV)", 250, 0, 250); - histograms.h_candidate_pT = ibook.book1D("Candidates pT", "Candidates pT;p_{T}", 250, 0, 250); + ibook.book1D("Candidates regressed energy", "Candidates regressed energy;E (GeV)", 100, 0, 500); + histograms.h_candidate_pT = ibook.book1D("Candidates pT", "Candidates pT;p_{T}", 100, 0, 200); histograms.h_candidate_charge = ibook.book1D("Candidates charge", "Candidates charge;Charge", 3, -1.5, 1.5); histograms.h_candidate_pdgId = ibook.book1D("Candidates PDG Id", "Candidates PDG ID", 100, -220, 220); histograms.h_candidate_partType = ibook.book1D("Candidates type", "Candidates type", 9, -0.5, 8.5); @@ -48,7 +48,7 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, 0, 99)); histograms.h_neut_candidate_regressed_energy.push_back(ibook.book1D( - neutrals[i] + "candidates regressed energy", neutrals[i] + " candidates regressed energy;E (GeV)", 250, 0, 250)); + neutrals[i] + "candidates regressed energy", neutrals[i] + " candidates regressed energy;E (GeV)", 100, 0, 500)); histograms.h_neut_candidate_charge.push_back( ibook.book1D(neutrals[i] + " candidates charge", neutrals[i] + " candidates charge;Charge", 3, -1.5, 1.5)); histograms.h_neut_candidate_pdgId.push_back( @@ -57,25 +57,33 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, ibook.book1D(neutrals[i] + " candidates type", neutrals[i] + " candidates type", 9, -0.5, 8.5)); histograms.h_den_fake_neut_energy_candidate.push_back( - ibook.book1D("den_fake_cand_vs_energy_" + neutrals[i], neutrals[i] + " candidates energy;E (GeV)", 50, 0, 250)); + ibook.book1D("den_fake_cand_vs_energy_" + neutrals[i], neutrals[i] + " candidates energy;E (GeV)", 50, 0, 500)); histograms.h_num_fake_neut_energy_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_energy_" + neutrals[i], neutrals[i] + " PID fake vs energy;E (GeV)", 50, 0, 250)); + "num_fake_pid_cand_vs_energy_" + neutrals[i], neutrals[i] + " PID fake vs energy;E (GeV)", 50, 0, 500)); histograms.h_num_fake_neut_energy_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_energy_" + neutrals[i], neutrals[i] + " PID and energy fake vs energy;E (GeV)", 50, 0, - 250)); + 500)); + histograms.h_num_fake_neut_energy_candidate_tot.push_back( + ibook.book1D("num_fake_total_cand_vs_energy_" + neutrals[i], + neutrals[i] + " PID and energy fake vs energy;E (GeV)", + 50, + 0, + 500)); histograms.h_den_fake_neut_pt_candidate.push_back( - ibook.book1D("den_fake_cand_vs_pt_" + neutrals[i], neutrals[i] + " candidates pT;p_{T} (GeV)", 50, 0, 250)); + ibook.book1D("den_fake_cand_vs_pt_" + neutrals[i], neutrals[i] + " candidates pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_fake_neut_pt_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " PID fake vs pT;p_{T} (GeV)", 50, 0, 250)); + "num_fake_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " PID fake vs pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_fake_neut_pt_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_pt_" + neutrals[i], neutrals[i] + " PID and energy fake vs pT;p_{T} (GeV)", 50, 0, - 250)); + 200)); + histograms.h_num_fake_neut_pt_candidate_tot.push_back(ibook.book1D( + "num_fake_total_cand_vs_pt_" + neutrals[i], neutrals[i] + " PID and energy fake vs pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_den_fake_neut_eta_candidate.push_back( ibook.book1D("den_fake_cand_vs_eta_" + neutrals[i], neutrals[i] + " candidates eta;#eta (GeV)", 50, -3, 3)); histograms.h_num_fake_neut_eta_candidate_pdgId.push_back(ibook.book1D( @@ -86,6 +94,8 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, 50, -3, 3)); + histograms.h_num_fake_neut_eta_candidate_tot.push_back(ibook.book1D( + "num_fake_total_cand_vs_eta_" + neutrals[i], neutrals[i] + " PID and energy fake vs eta;#eta (GeV)", 50, -3, 3)); histograms.h_den_fake_neut_phi_candidate.push_back(ibook.book1D( "den_fake_cand_vs_phi_" + neutrals[i], neutrals[i] + " candidates phi;#phi (GeV)", 50, -3.14159, 3.14159)); histograms.h_num_fake_neut_phi_candidate_pdgId.push_back(ibook.book1D( @@ -96,31 +106,37 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, 50, -3.14159, 3.14159)); + histograms.h_num_fake_neut_phi_candidate_tot.push_back( + ibook.book1D("num_fake_total_cand_vs_phi_" + neutrals[i], + neutrals[i] + " PID and energy fake vs phi;#phi (GeV)", + 50, + -3.14159, + 3.14159)); histograms.h_den_neut_energy_candidate.push_back( - ibook.book1D("den_cand_vs_energy_" + neutrals[i], neutrals[i] + " simCandidates energy;E (GeV)", 50, 0, 250)); + ibook.book1D("den_cand_vs_energy_" + neutrals[i], neutrals[i] + " simCandidates energy;E (GeV)", 50, 0, 500)); histograms.h_num_neut_energy_candidate_pdgId.push_back( ibook.book1D("num_pid_cand_vs_energy_" + neutrals[i], neutrals[i] + " track and PID efficiency vs energy;E (GeV)", 50, 0, - 250)); + 500)); histograms.h_num_neut_energy_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_energy_" + neutrals[i], neutrals[i] + " track, PID and energy efficiency vs energy;E (GeV)", 50, 0, - 250)); + 500)); histograms.h_den_neut_pt_candidate.push_back( - ibook.book1D("den_cand_vs_pt_" + neutrals[i], neutrals[i] + " simCandidates pT;p_{T} (GeV)", 50, 0, 250)); + ibook.book1D("den_cand_vs_pt_" + neutrals[i], neutrals[i] + " simCandidates pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_neut_pt_candidate_pdgId.push_back(ibook.book1D( - "num_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 50, 0, 250)); + "num_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_neut_pt_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_pt_" + neutrals[i], neutrals[i] + " track, PID and energy efficiency vs pT;p_{T} (GeV)", 50, 0, - 250)); + 200)); histograms.h_den_neut_eta_candidate.push_back( ibook.book1D("den_cand_vs_eta_" + neutrals[i], neutrals[i] + " simCandidates eta;#eta (GeV)", 50, -3, 3)); histograms.h_num_neut_eta_candidate_pdgId.push_back(ibook.book1D( @@ -154,7 +170,7 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, histograms.h_chg_tracksters_in_candidate.push_back(ibook.book1D( "N of tracksters in candidate for " + charged[i], "N of tracksters in candidate for " + charged[i], 100, 0, 99)); histograms.h_chg_candidate_regressed_energy.push_back(ibook.book1D( - charged[i] + "candidates regressed energy", charged[i] + " candidates regressed energy;E (GeV)", 250, 0, 250)); + charged[i] + "candidates regressed energy", charged[i] + " candidates regressed energy;E (GeV)", 500, 0, 500)); histograms.h_chg_candidate_charge.push_back( ibook.book1D(charged[i] + " candidates charge", charged[i] + " candidates charge;Charge", 3, -1.5, 1.5)); histograms.h_chg_candidate_pdgId.push_back( @@ -163,29 +179,41 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, ibook.book1D(charged[i] + " candidates type", charged[i] + " candidates type", 9, -0.5, 8.5)); histograms.h_den_fake_chg_energy_candidate.push_back( - ibook.book1D("den_fake_cand_vs_energy_" + charged[i], charged[i] + " candidates energy;E (GeV)", 50, 0, 250)); + ibook.book1D("den_fake_cand_vs_energy_" + charged[i], charged[i] + " candidates energy;E (GeV)", 50, 0, 500)); histograms.h_num_fake_chg_energy_candidate_track.push_back(ibook.book1D( - "num_fake_track_cand_vs_energy_" + charged[i], charged[i] + " track fake vs energy;E (GeV)", 50, 0, 250)); + "num_fake_track_cand_vs_energy_" + charged[i], charged[i] + " track fake vs energy;E (GeV)", 50, 0, 500)); histograms.h_num_fake_chg_energy_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_energy_" + charged[i], charged[i] + " track and PID fake vs energy;E (GeV)", 50, 0, 250)); + "num_fake_pid_cand_vs_energy_" + charged[i], charged[i] + " track and PID fake vs energy;E (GeV)", 50, 0, 500)); histograms.h_num_fake_chg_energy_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_energy_" + charged[i], charged[i] + " track, PID and energy fake vs energy;E (GeV)", 50, 0, - 250)); + 500)); + histograms.h_num_fake_chg_energy_candidate_tot.push_back( + ibook.book1D("num_fake_total_cand_vs_energy_" + charged[i], + charged[i] + " track, PID and energy fake vs energy;E (GeV)", + 50, + 0, + 500)); histograms.h_den_fake_chg_pt_candidate.push_back( - ibook.book1D("den_fake_cand_vs_pt_" + charged[i], charged[i] + " candidates pT;p_{T} (GeV)", 50, 0, 250)); + ibook.book1D("den_fake_cand_vs_pt_" + charged[i], charged[i] + " candidates pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_fake_chg_pt_candidate_track.push_back(ibook.book1D( - "num_fake_track_cand_vs_pt_" + charged[i], charged[i] + " track fake vs pT;p_{T} (GeV)", 50, 0, 250)); + "num_fake_track_cand_vs_pt_" + charged[i], charged[i] + " track fake vs pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_fake_chg_pt_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID fake vs pT;p_{T} (GeV)", 50, 0, 250)); + "num_fake_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID fake vs pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_fake_chg_pt_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_pt_" + charged[i], charged[i] + " track, PID and energy fake vs pT;p_{T} (GeV)", 50, 0, - 250)); + 200)); + histograms.h_num_fake_chg_pt_candidate_tot.push_back( + ibook.book1D("num_fake_total_cand_vs_pt_" + charged[i], + charged[i] + " track, PID and energy fake vs pT;p_{T} (GeV)", + 50, + 0, + 200)); histograms.h_den_fake_chg_eta_candidate.push_back( ibook.book1D("den_fake_cand_vs_eta_" + charged[i], charged[i] + " candidates eta;#eta (GeV)", 50, -3, 3)); histograms.h_num_fake_chg_eta_candidate_track.push_back(ibook.book1D( @@ -198,6 +226,12 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, 50, -3, 3)); + histograms.h_num_fake_chg_eta_candidate_tot.push_back( + ibook.book1D("num_fake_total_cand_vs_eta_" + charged[i], + charged[i] + " track, PID and energy fake vs eta;#eta (GeV)", + 50, + -3, + 3)); histograms.h_den_fake_chg_phi_candidate.push_back(ibook.book1D( "den_fake_cand_vs_phi_" + charged[i], charged[i] + " candidates phi;#phi (GeV)", 50, -3.14159, 3.14159)); histograms.h_num_fake_chg_phi_candidate_track.push_back(ibook.book1D("num_fake_track_cand_vs_phi_" + charged[i], @@ -217,31 +251,37 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, 50, -3.14159, 3.14159)); + histograms.h_num_fake_chg_phi_candidate_tot.push_back( + ibook.book1D("num_fake_total_cand_vs_phi_" + charged[i], + charged[i] + " track, PID and energy fake vs phi;#phi (GeV)", + 50, + -3.14159, + 3.14159)); histograms.h_den_chg_energy_candidate.push_back( - ibook.book1D("den_cand_vs_energy_" + charged[i], charged[i] + " simCandidates energy;E (GeV)", 50, 0, 250)); + ibook.book1D("den_cand_vs_energy_" + charged[i], charged[i] + " simCandidates energy;E (GeV)", 50, 0, 500)); histograms.h_num_chg_energy_candidate_track.push_back(ibook.book1D( - "num_track_cand_vs_energy_" + charged[i], charged[i] + " track efficiency vs energy;E (GeV)", 50, 0, 250)); + "num_track_cand_vs_energy_" + charged[i], charged[i] + " track efficiency vs energy;E (GeV)", 50, 0, 500)); histograms.h_num_chg_energy_candidate_pdgId.push_back(ibook.book1D( - "num_pid_cand_vs_energy_" + charged[i], charged[i] + " track and PID efficiency vs energy;E (GeV)", 50, 0, 250)); + "num_pid_cand_vs_energy_" + charged[i], charged[i] + " track and PID efficiency vs energy;E (GeV)", 50, 0, 500)); histograms.h_num_chg_energy_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_energy_" + charged[i], charged[i] + " track, PID and energy efficiency vs energy;E (GeV)", 50, 0, - 250)); + 500)); histograms.h_den_chg_pt_candidate.push_back( - ibook.book1D("den_cand_vs_pt_" + charged[i], charged[i] + " simCandidates pT;p_{T} (GeV)", 50, 0, 250)); + ibook.book1D("den_cand_vs_pt_" + charged[i], charged[i] + " simCandidates pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_chg_pt_candidate_track.push_back(ibook.book1D( - "num_track_cand_vs_pt_" + charged[i], charged[i] + " track efficiency vs pT;p_{T} (GeV)", 50, 0, 250)); + "num_track_cand_vs_pt_" + charged[i], charged[i] + " track efficiency vs pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_chg_pt_candidate_pdgId.push_back(ibook.book1D( - "num_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 50, 0, 250)); + "num_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 50, 0, 200)); histograms.h_num_chg_pt_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_pt_" + charged[i], charged[i] + " track, PID and energy efficiency vs pT;p_{T} (GeV)", 50, 0, - 250)); + 200)); histograms.h_den_chg_eta_candidate.push_back( ibook.book1D("den_cand_vs_eta_" + charged[i], charged[i] + " simCandidates eta;#eta (GeV)", 50, -3, 3)); histograms.h_num_chg_eta_candidate_track.push_back(ibook.book1D( @@ -595,6 +635,10 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_num_fake_chg_pt_candidate_track[index]->Fill(cand.pt()); histograms.h_num_fake_chg_eta_candidate_track[index]->Fill(cand.eta()); histograms.h_num_fake_chg_phi_candidate_track[index]->Fill(cand.phi()); + histograms.h_num_fake_chg_energy_candidate_tot[index]->Fill(cand.rawEnergy()); + histograms.h_num_fake_chg_pt_candidate_tot[index]->Fill(cand.pt()); + histograms.h_num_fake_chg_eta_candidate_tot[index]->Fill(cand.eta()); + histograms.h_num_fake_chg_phi_candidate_tot[index]->Fill(cand.phi()); continue; } } else { @@ -603,6 +647,10 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_num_fake_chg_pt_candidate_track[index]->Fill(cand.pt()); histograms.h_num_fake_chg_eta_candidate_track[index]->Fill(cand.eta()); histograms.h_num_fake_chg_phi_candidate_track[index]->Fill(cand.phi()); + histograms.h_num_fake_chg_energy_candidate_tot[index]->Fill(cand.rawEnergy()); + histograms.h_num_fake_chg_pt_candidate_tot[index]->Fill(cand.pt()); + histograms.h_num_fake_chg_eta_candidate_tot[index]->Fill(cand.eta()); + histograms.h_num_fake_chg_phi_candidate_tot[index]->Fill(cand.phi()); continue; } @@ -613,6 +661,10 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_num_fake_chg_pt_candidate_pdgId[index]->Fill(cand.pt()); histograms.h_num_fake_chg_eta_candidate_pdgId[index]->Fill(cand.eta()); histograms.h_num_fake_chg_phi_candidate_pdgId[index]->Fill(cand.phi()); + histograms.h_num_fake_chg_energy_candidate_tot[index]->Fill(cand.rawEnergy()); + histograms.h_num_fake_chg_pt_candidate_tot[index]->Fill(cand.pt()); + histograms.h_num_fake_chg_eta_candidate_tot[index]->Fill(cand.eta()); + histograms.h_num_fake_chg_phi_candidate_tot[index]->Fill(cand.phi()); continue; } @@ -623,8 +675,13 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_num_fake_chg_pt_candidate_energy[index]->Fill(cand.pt()); histograms.h_num_fake_chg_eta_candidate_energy[index]->Fill(cand.eta()); histograms.h_num_fake_chg_phi_candidate_energy[index]->Fill(cand.phi()); + histograms.h_num_fake_chg_energy_candidate_tot[index]->Fill(cand.rawEnergy()); + histograms.h_num_fake_chg_pt_candidate_tot[index]->Fill(cand.pt()); + histograms.h_num_fake_chg_eta_candidate_tot[index]->Fill(cand.eta()); + histograms.h_num_fake_chg_phi_candidate_tot[index]->Fill(cand.phi()); } } + // loop on neutrals for (const auto i : neutralCandidates) { const auto& cand = TICLCandidates[i]; @@ -682,6 +739,10 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_num_fake_neut_pt_candidate_pdgId[index]->Fill(cand.pt()); histograms.h_num_fake_neut_eta_candidate_pdgId[index]->Fill(cand.eta()); histograms.h_num_fake_neut_phi_candidate_pdgId[index]->Fill(cand.phi()); + histograms.h_num_fake_neut_energy_candidate_tot[index]->Fill(cand.rawEnergy()); + histograms.h_num_fake_neut_pt_candidate_tot[index]->Fill(cand.pt()); + histograms.h_num_fake_neut_eta_candidate_tot[index]->Fill(cand.eta()); + histograms.h_num_fake_neut_phi_candidate_tot[index]->Fill(cand.phi()); continue; } @@ -692,6 +753,10 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, histograms.h_num_fake_neut_pt_candidate_energy[index]->Fill(cand.pt()); histograms.h_num_fake_neut_eta_candidate_energy[index]->Fill(cand.eta()); histograms.h_num_fake_neut_phi_candidate_energy[index]->Fill(cand.phi()); + histograms.h_num_fake_neut_energy_candidate_tot[index]->Fill(cand.rawEnergy()); + histograms.h_num_fake_neut_pt_candidate_tot[index]->Fill(cand.pt()); + histograms.h_num_fake_neut_eta_candidate_tot[index]->Fill(cand.eta()); + histograms.h_num_fake_neut_phi_candidate_tot[index]->Fill(cand.phi()); } } } From ab28ccf8054f4c51062cb43ad3905d8d1e32520d Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Fri, 5 Sep 2025 11:07:57 +0200 Subject: [PATCH 6/8] add plot to monitor candidate with no track / tracskter --- .../interface/TICLCandidateValidator.h | 17 +++ .../HGCalValidation/python/hgcalPlots.py | 16 ++- .../src/TICLCandidateValidator.cc | 118 +++++++++++++++++- 3 files changed, 144 insertions(+), 7 deletions(-) diff --git a/Validation/HGCalValidation/interface/TICLCandidateValidator.h b/Validation/HGCalValidation/interface/TICLCandidateValidator.h index 21ea79f414e4f..ee3a4c7f0cb15 100644 --- a/Validation/HGCalValidation/interface/TICLCandidateValidator.h +++ b/Validation/HGCalValidation/interface/TICLCandidateValidator.h @@ -115,6 +115,23 @@ struct TICLCandidateValidatorHistograms { std::vector h_neut_candidate_charge; std::vector h_neut_candidate_pdgId; std::vector h_neut_candidate_partType; + + std::vector h_neut_energy_noTrackster; + std::vector h_neut_pt_noTrackster; + std::vector h_neut_eta_noTrackster; + std::vector h_neut_phi_noTrackster; + std::vector h_chg_energy_noTrack; + std::vector h_chg_pt_noTrack; + std::vector h_chg_eta_noTrack; + std::vector h_chg_phi_noTrack; + std::vector h_chg_energy_noGoodTrack; + std::vector h_chg_pt_noGoodTrack; + std::vector h_chg_eta_noGoodTrack; + std::vector h_chg_phi_noGoodTrack; + std::vector h_chg_energy_noTrackster; + std::vector h_chg_pt_noTrackster; + std::vector h_chg_eta_noTrackster; + std::vector h_chg_phi_noTrackster; }; class TICLCandidateValidator { diff --git a/Validation/HGCalValidation/python/hgcalPlots.py b/Validation/HGCalValidation/python/hgcalPlots.py index 8d1c4ffc5eb3a..7b6a7f482cf74 100644 --- a/Validation/HGCalValidation/python/hgcalPlots.py +++ b/Validation/HGCalValidation/python/hgcalPlots.py @@ -1836,7 +1836,6 @@ for var in ["pt", "energy", "eta", "phi"]: for cut in ["track", "pid", "energy"]: if cut=="track" and ct in ["neutral_hadrons", "neutral_pions", "photons"]: continue - #options = (_common_eff_fake | _xminmaxEn) if var=="energy" else ( (_common_eff_fake | _xminmaxPt) if var=="pt" else _common_eff_fake) cand_eff_plots.extend([Plot("eff_"+ct+"_"+cut+"_"+var, title=cut + " - efficiency for "+ct.replace("_", " ")+" vs "+var, ytitle="Efficiency", **_common_eff_fake)]) _all_cand_eff_plots.append(cand_eff_plots) @@ -1855,7 +1854,6 @@ for var in ["pt", "energy", "eta", "phi"]: for cut in ["track", "pid", "energy", "total"]: if cut=="track" and ct in ["neutral_hadrons", "neutral_pions", "photons"]: continue - #options = (_common_eff_fake | _xminmaxEn) if var=="energy" else ( (_common_eff_fake | _xminmaxPt) if var=="pt" else _common_eff_fake) cand_fake_plots.extend([Plot("fake_"+ct+"_"+cut+"_"+var, title=cut + " - fake rate for "+ct.replace("_", " ")+" vs "+var, ytitle="Fake rate", **_common_eff_fake)]) _all_cand_fake_plots.append(cand_fake_plots) @@ -1868,11 +1866,21 @@ cand_fake_plots.extend([Plot("num_fake_"+cut+"_cand_vs_"+var+"_"+ct, title=cut + " - number of fakes for "+ct.replace("_", " ")+" vs "+var, ytitle="Fake number", **_common)]) _all_cand_fakeNum_plots.append(cand_fake_plots) +#association with track/tracksters +_all_cand_TkTsAss_plots = [] +for ct in cand_type: + cand_ass_plots = [] + for var in ["pt", "energy", "eta", "phi"]: + for cut in ["noTrack", "noGoodTrack", "noTrackster"]: + if cut in ["noTrack", "noGoodTrack"] and ct in ["neutral_hadrons", "neutral_pions", "photons"]: continue + cand_ass_plots.extend([Plot(cut+"_cand_vs_"+var+"_"+ct, title="number of "+ct.replace("_", " ")+" with "+cut+" vs "+var, ytitle="Number of candidates", **_common)]) + _all_cand_TkTsAss_plots.append(cand_ass_plots) + _allCandidatesPlots = [[],[],[],[],[],[]] for i in range(3): - _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=3), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=4), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=4)]) + _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=3), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=4), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=4), PlotGroup(cand_type[i]+"_NoTrackTracksterAssoc", _all_cand_TkTsAss_plots[i], ncols=3)]) for i in range(3,6): - _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=2), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=2), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=3)]) + _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=2), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=2), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=3), PlotGroup(cand_type[i]+"_NoTrackTracksterAssoc", _all_cand_TkTsAss_plots[i], ncols=1)]) #-------------------------------------------------------------------------------------------- # SIMHITS, DIGIS, RECHITS diff --git a/Validation/HGCalValidation/src/TICLCandidateValidator.cc b/Validation/HGCalValidation/src/TICLCandidateValidator.cc index c68053e233a9f..09d4d735820a6 100644 --- a/Validation/HGCalValidation/src/TICLCandidateValidator.cc +++ b/Validation/HGCalValidation/src/TICLCandidateValidator.cc @@ -161,6 +161,31 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, 50, -3.14159, 3.14159)); + + histograms.h_neut_energy_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_energy_" + neutrals[i], + neutrals[i] + " simCandidates without trackster energy;E (GeV)", + 50, + 0, + 500)); + histograms.h_neut_pt_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_pt_" + neutrals[i], + neutrals[i] + " simCandidates without trackster pT;p_{T} (GeV)", + 50, + 0, + 200)); + histograms.h_neut_eta_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_eta_" + neutrals[i], + neutrals[i] + " simCandidates without trackster eta;#eta (GeV)", + 50, + -3, + 3)); + histograms.h_neut_phi_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_phi_" + neutrals[i], + neutrals[i] + " simCandidates without trackster phi;#phi (GeV)", + 50, + -3.14159, + 3.14159)); } // charged: electron, muon, hadron const std::vector charged{"electrons", "muons", "charged_hadrons"}; @@ -313,6 +338,68 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, 50, -3.14159, 3.14159)); + + histograms.h_chg_energy_noTrack.push_back(ibook.book1D( + "noTrack_cand_vs_energy_" + charged[i], charged[i] + " simCandidates without track energy;E (GeV)", 50, 0, 500)); + histograms.h_chg_pt_noTrack.push_back(ibook.book1D( + "noTrack_cand_vs_pt_" + charged[i], charged[i] + " simCandidates without track pT;p_{T} (GeV)", 50, 0, 200)); + histograms.h_chg_eta_noTrack.push_back(ibook.book1D( + "noTrack_cand_vs_eta_" + charged[i], charged[i] + " simCandidates without track eta;#eta (GeV)", 50, -3, 3)); + histograms.h_chg_phi_noTrack.push_back(ibook.book1D("noTrack_cand_vs_phi_" + charged[i], + charged[i] + " simCandidates without track phi;#phi (GeV)", + 50, + -3.14159, + 3.14159)); + + histograms.h_chg_energy_noGoodTrack.push_back( + ibook.book1D("noGoodTrack_cand_vs_energy_" + charged[i], + charged[i] + " simCandidates without good track energy;E (GeV)", + 50, + 0, + 500)); + histograms.h_chg_pt_noGoodTrack.push_back( + ibook.book1D("noGoodTrack_cand_vs_pt_" + charged[i], + charged[i] + " simCandidates without good track pT;p_{T} (GeV)", + 50, + 0, + 200)); + histograms.h_chg_eta_noGoodTrack.push_back( + ibook.book1D("noGoodTrack_cand_vs_eta_" + charged[i], + charged[i] + " simCandidates without good track eta;#eta (GeV)", + 50, + -3, + 3)); + histograms.h_chg_phi_noGoodTrack.push_back( + ibook.book1D("noGoodTrack_cand_vs_phi_" + charged[i], + charged[i] + " simCandidates without good track phi;#phi (GeV)", + 50, + -3.14159, + 3.14159)); + + histograms.h_chg_energy_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_energy_" + charged[i], + charged[i] + " simCandidates without trackster energy;E (GeV)", + 50, + 0, + 500)); + histograms.h_chg_pt_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_pt_" + charged[i], + charged[i] + " simCandidates without trackster pT;p_{T} (GeV)", + 50, + 0, + 200)); + histograms.h_chg_eta_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_eta_" + charged[i], + charged[i] + " simCandidates without trackster eta;#eta (GeV)", + 50, + -3, + 3)); + histograms.h_chg_phi_noTrackster.push_back( + ibook.book1D("noTrackster_cand_vs_phi_" + charged[i], + charged[i] + " simCandidates without trackster phi;#phi (GeV)", + 50, + -3.14159, + 3.14159)); } } @@ -392,13 +479,28 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, * 211 (type 4) becomes 2 */ + // no track + if (simCand.trackPtrs().empty()) { + histograms.h_chg_energy_noTrack[index]->Fill(simCand.rawEnergy()); + histograms.h_chg_pt_noTrack[index]->Fill(simCand.pt()); + histograms.h_chg_eta_noTrack[index]->Fill(simCand.eta()); + histograms.h_chg_phi_noTrack[index]->Fill(simCand.phi()); + continue; + } + std::vector simCandTrackIdx; for (const auto& track : simCand.trackPtrs()) { if (cutTk(*(simCand.trackPtr().get()))) simCandTrackIdx.push_back(track.get() - firstTrack); } - if (simCandTrackIdx.empty()) + if (simCandTrackIdx.empty()) { + // no track passing cuts + histograms.h_chg_energy_noGoodTrack[index]->Fill(simCand.rawEnergy()); + histograms.h_chg_pt_noGoodTrack[index]->Fill(simCand.pt()); + histograms.h_chg_eta_noGoodTrack[index]->Fill(simCand.eta()); + histograms.h_chg_phi_noGoodTrack[index]->Fill(simCand.phi()); continue; + } // +1 to all denominators histograms.h_den_chg_energy_candidate[index]->Fill(simCand.rawEnergy()); @@ -418,8 +520,13 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, cand_idx = min_elem->index(); } // no reco associated to sim - if (cand_idx == -1) + if (cand_idx == -1) { + histograms.h_chg_energy_noTrackster[index]->Fill(simCand.rawEnergy()); + histograms.h_chg_pt_noTrackster[index]->Fill(simCand.pt()); + histograms.h_chg_eta_noTrackster[index]->Fill(simCand.eta()); + histograms.h_chg_phi_noTrackster[index]->Fill(simCand.phi()); continue; + } auto& recoCand = TICLCandidates[cand_idx]; if (isTICLv5_) { @@ -498,8 +605,13 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, } // no reco associated to sim - if (cand_idx == -1) + if (cand_idx == -1) { + histograms.h_neut_energy_noTrackster[index]->Fill(simCand.rawEnergy()); + histograms.h_neut_pt_noTrackster[index]->Fill(simCand.pt()); + histograms.h_neut_eta_noTrackster[index]->Fill(simCand.eta()); + histograms.h_neut_phi_noTrackster[index]->Fill(simCand.phi()); continue; + } auto& recoCand = TICLCandidates[cand_idx]; if (isTICLv5_) { From 862c40007ebc8215030ead3064b6cbab784e5a37 Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Mon, 8 Sep 2025 15:34:12 +0200 Subject: [PATCH 7/8] save vector of tracks in TICLDumper --- RecoHGCal/TICL/plugins/TICLDumper.cc | 220 +++++++++++++++------------ 1 file changed, 123 insertions(+), 97 deletions(-) diff --git a/RecoHGCal/TICL/plugins/TICLDumper.cc b/RecoHGCal/TICL/plugins/TICLDumper.cc index 8f40aae178bcd..4f313f90d1e83 100644 --- a/RecoHGCal/TICL/plugins/TICLDumper.cc +++ b/RecoHGCal/TICL/plugins/TICLDumper.cc @@ -159,8 +159,7 @@ class TracksterDumperHelper { if (tracksterType_ != TracksterType::Trackster) { trackster_tree_->Branch("regressed_pt", &simtrackster_regressed_pt); trackster_tree_->Branch("pdgID", &simtrackster_pdgID); - trackster_tree_->Branch("trackIdx", &simtrackster_trackIdx); - trackster_tree_->Branch("trackTime", &simtrackster_trackTime); + trackster_tree_->Branch("trackIdx", &simtrackster_trackIdxs); trackster_tree_->Branch("timeBoundary", &simtrackster_timeBoundary); trackster_tree_->Branch("boundaryX", &simtrackster_boundaryX); trackster_tree_->Branch("boundaryY", &simtrackster_boundaryY); @@ -217,8 +216,7 @@ class TracksterDumperHelper { simtrackster_regressed_pt.clear(); simtrackster_pdgID.clear(); - simtrackster_trackIdx.clear(); - simtrackster_trackTime.clear(); + simtrackster_trackIdxs.clear(); simtrackster_timeBoundary.clear(); simtrackster_boundaryX.clear(); simtrackster_boundaryY.clear(); @@ -291,11 +289,11 @@ class TracksterDumperHelper { simtrackster_timeBoundary.push_back(trackster_iterator->boundaryTime()); - /* SimTracksters can be built from either a CaloParticle or a SimCluster + /* SimTracksters can be built from either a CaloParticle or a SimCluster The SimTrackster "fromCP" collection is built solely from CaloParticle (all CPs that have association to reco in HGCAL) SimTrackster "from SC" is built from either : - a CaloParticle (when the CaloParticle first SimTrack has crossedBoundary=True) - - a SimCluster (other cases) + - a SimCluster (other cases) Thus trackster.seedIndex() can point to either CaloParticle or SimCluster collection (check seedID to differentiate) */ using CaloObjectVariant = std::variant; @@ -330,47 +328,62 @@ class TracksterDumperHelper { simtrackster_boundaryPz.push_back(-999); } - auto const trackIdx = trackster_iterator->trackIdx(); - simtrackster_trackIdx.push_back(trackIdx); - if (trackIdx != -1) { - const auto& track = tracks[trackIdx]; - - int iSide = int(track.eta() > 0); - - const auto& fts = trajectoryStateTransform::outerFreeState((track), &detectorTools.bfield); - // to the HGCal front - const auto& tsos = detectorTools.propagator.propagate(fts, detectorTools.firstDisk_[iSide]->surface()); - if (tsos.isValid()) { - const auto& globalPos = tsos.globalPosition(); - const auto& globalMom = tsos.globalMomentum(); - simtrackster_track_boundaryX.push_back(globalPos.x()); - simtrackster_track_boundaryY.push_back(globalPos.y()); - simtrackster_track_boundaryZ.push_back(globalPos.z()); - simtrackster_track_boundaryEta.push_back(globalPos.eta()); - simtrackster_track_boundaryPhi.push_back(globalPos.phi()); - simtrackster_track_boundaryPx.push_back(globalMom.x()); - simtrackster_track_boundaryPy.push_back(globalMom.y()); - simtrackster_track_boundaryPz.push_back(globalMom.z()); - simtrackster_trackTime.push_back(track.t0()); - } else { - simtrackster_track_boundaryX.push_back(-999); - simtrackster_track_boundaryY.push_back(-999); - simtrackster_track_boundaryZ.push_back(-999); - simtrackster_track_boundaryEta.push_back(-999); - simtrackster_track_boundaryPhi.push_back(-999); - simtrackster_track_boundaryPx.push_back(-999); - simtrackster_track_boundaryPy.push_back(-999); - simtrackster_track_boundaryPz.push_back(-999); + auto const trackIdxs = trackster_iterator->trackIdxs(); + simtrackster_trackIdxs.push_back(trackIdxs); + if (!trackIdxs.empty()) { + std::vector track_boundaryX; + std::vector track_boundaryY; + std::vector track_boundaryZ; + std::vector track_boundaryEta; + std::vector track_boundaryPhi; + std::vector track_boundaryPx; + std::vector track_boundaryPy; + std::vector track_boundaryPz; + for (const auto trackIdx : trackIdxs) { + const auto& track = tracks[trackIdx]; + int iSide = int(track.eta() > 0); + const auto& fts = trajectoryStateTransform::outerFreeState((track), &detectorTools.bfield); + // to the HGCal front + const auto& tsos = detectorTools.propagator.propagate(fts, detectorTools.firstDisk_[iSide]->surface()); + if (tsos.isValid()) { + const auto& globalPos = tsos.globalPosition(); + const auto& globalMom = tsos.globalMomentum(); + track_boundaryX.push_back(globalPos.x()); + track_boundaryY.push_back(globalPos.y()); + track_boundaryZ.push_back(globalPos.z()); + track_boundaryEta.push_back(globalPos.eta()); + track_boundaryPhi.push_back(globalPos.phi()); + track_boundaryPx.push_back(globalMom.x()); + track_boundaryPy.push_back(globalMom.y()); + track_boundaryPz.push_back(globalMom.z()); + } else { + track_boundaryX.push_back(-999); + track_boundaryY.push_back(-999); + track_boundaryZ.push_back(-999); + track_boundaryEta.push_back(-999); + track_boundaryPhi.push_back(-999); + track_boundaryPx.push_back(-999); + track_boundaryPy.push_back(-999); + track_boundaryPz.push_back(-999); + } } + simtrackster_track_boundaryX.push_back(track_boundaryX); + simtrackster_track_boundaryY.push_back(track_boundaryY); + simtrackster_track_boundaryZ.push_back(track_boundaryZ); + simtrackster_track_boundaryEta.push_back(track_boundaryEta); + simtrackster_track_boundaryPhi.push_back(track_boundaryPhi); + simtrackster_track_boundaryPx.push_back(track_boundaryPx); + simtrackster_track_boundaryPy.push_back(track_boundaryPy); + simtrackster_track_boundaryPz.push_back(track_boundaryPz); } else { - simtrackster_track_boundaryX.push_back(-999); - simtrackster_track_boundaryY.push_back(-999); - simtrackster_track_boundaryZ.push_back(-999); - simtrackster_track_boundaryEta.push_back(-999); - simtrackster_track_boundaryPhi.push_back(-999); - simtrackster_track_boundaryPx.push_back(-999); - simtrackster_track_boundaryPy.push_back(-999); - simtrackster_track_boundaryPz.push_back(-999); + simtrackster_track_boundaryX.push_back({-999}); + simtrackster_track_boundaryY.push_back({-999}); + simtrackster_track_boundaryZ.push_back({-999}); + simtrackster_track_boundaryEta.push_back({-999}); + simtrackster_track_boundaryPhi.push_back({-999}); + simtrackster_track_boundaryPx.push_back({-999}); + simtrackster_track_boundaryPy.push_back({-999}); + simtrackster_track_boundaryPz.push_back({-999}); } } @@ -450,8 +463,7 @@ class TracksterDumperHelper { // for simtrackster std::vector simtrackster_regressed_pt; std::vector simtrackster_pdgID; - std::vector simtrackster_trackIdx; - std::vector simtrackster_trackTime; + std::vector> simtrackster_trackIdxs; std::vector simtrackster_timeBoundary; std::vector simtrackster_boundaryX; std::vector simtrackster_boundaryY; @@ -461,14 +473,14 @@ class TracksterDumperHelper { std::vector simtrackster_boundaryPx; std::vector simtrackster_boundaryPy; std::vector simtrackster_boundaryPz; - std::vector simtrackster_track_boundaryX; - std::vector simtrackster_track_boundaryY; - std::vector simtrackster_track_boundaryZ; - std::vector simtrackster_track_boundaryEta; - std::vector simtrackster_track_boundaryPhi; - std::vector simtrackster_track_boundaryPx; - std::vector simtrackster_track_boundaryPy; - std::vector simtrackster_track_boundaryPz; + std::vector> simtrackster_track_boundaryX; + std::vector> simtrackster_track_boundaryY; + std::vector> simtrackster_track_boundaryZ; + std::vector> simtrackster_track_boundaryEta; + std::vector> simtrackster_track_boundaryPhi; + std::vector> simtrackster_track_boundaryPx; + std::vector> simtrackster_track_boundaryPy; + std::vector> simtrackster_track_boundaryPz; std::vector> trackster_id_probabilities; std::vector> trackster_vertices_indexes; @@ -663,12 +675,13 @@ class TICLDumper : public edm::one::EDAnalyzer simTICLCandidate_raw_energy; std::vector simTICLCandidate_regressed_energy; std::vector> simTICLCandidate_simTracksterCPIndex; - std::vector simTICLCandidate_boundaryX; - std::vector simTICLCandidate_boundaryY; - std::vector simTICLCandidate_boundaryZ; - std::vector simTICLCandidate_boundaryPx; - std::vector simTICLCandidate_boundaryPy; - std::vector simTICLCandidate_boundaryPz; + std::vector> simTICLCandidate_tracks_in_candidate; + std::vector> simTICLCandidate_boundaryX; + std::vector> simTICLCandidate_boundaryY; + std::vector> simTICLCandidate_boundaryZ; + std::vector> simTICLCandidate_boundaryPx; + std::vector> simTICLCandidate_boundaryPy; + std::vector> simTICLCandidate_boundaryPz; std::vector simTICLCandidate_pt; std::vector simTICLCandidate_phi; std::vector simTICLCandidate_eta; @@ -676,7 +689,6 @@ class TICLDumper : public edm::one::EDAnalyzer simTICLCandidate_time; std::vector simTICLCandidate_pdgId; std::vector simTICLCandidate_charge; - std::vector simTICLCandidate_track_in_candidate; // from TICLCandidate, product of linking size_t nCandidates; @@ -784,7 +796,7 @@ void TICLDumper::clearVariables() { simTICLCandidate_caloParticleMass.clear(); simTICLCandidate_pdgId.clear(); simTICLCandidate_charge.clear(); - simTICLCandidate_track_in_candidate.clear(); + simTICLCandidate_tracks_in_candidate.clear(); nCandidates = 0; candidate_charge.clear(); @@ -1069,7 +1081,7 @@ void TICLDumper::beginJob() { simTICLCandidate_tree->Branch("simTICLCandidate_caloParticleMass", &simTICLCandidate_caloParticleMass); simTICLCandidate_tree->Branch("simTICLCandidate_pdgId", &simTICLCandidate_pdgId); simTICLCandidate_tree->Branch("simTICLCandidate_charge", &simTICLCandidate_charge); - simTICLCandidate_tree->Branch("simTICLCandidate_track_in_candidate", &simTICLCandidate_track_in_candidate); + simTICLCandidate_tree->Branch("simTICLCandidate_tracks_in_candidate", &simTICLCandidate_tracks_in_candidate); } } @@ -1200,7 +1212,7 @@ void TICLDumper::analyze(const edm::Event& event, const edm::EventSetup& setup) } const auto& simTrackstersSC_h = event.getHandle(simTracksters_SC_token_); - simTICLCandidate_track_in_candidate.resize(simTICLCandidates.size(), -1); + simTICLCandidate_tracks_in_candidate.resize(simTICLCandidates.size()); for (size_t i = 0; i < simTICLCandidates.size(); ++i) { auto const& cand = simTICLCandidates[i]; @@ -1219,40 +1231,54 @@ void TICLDumper::analyze(const edm::Event& event, const edm::EventSetup& setup) } simTICLCandidate_simTracksterCPIndex.push_back(tmpIdxVec); tmpIdxVec.clear(); - auto const& trackPtr = cand.trackPtr(); - if (!trackPtr.isNull()) { - auto const& track = *trackPtr; - int iSide = int(track.eta() > 0); - int tk_idx = trackPtr.get() - (edm::Ptr(tracks_h, 0)).get(); - simTICLCandidate_track_in_candidate[i] = tk_idx; - - const auto& fts = trajectoryStateTransform::outerFreeState((track), &detectorTools_->bfield); - // to the HGCal front - const auto& tsos = detectorTools_->propagator.propagate(fts, detectorTools_->firstDisk_[iSide]->surface()); - if (tsos.isValid()) { - const auto& globalPos = tsos.globalPosition(); - const auto& globalMom = tsos.globalMomentum(); - simTICLCandidate_boundaryX.push_back(globalPos.x()); - simTICLCandidate_boundaryY.push_back(globalPos.y()); - simTICLCandidate_boundaryZ.push_back(globalPos.z()); - simTICLCandidate_boundaryPx.push_back(globalMom.x()); - simTICLCandidate_boundaryPy.push_back(globalMom.y()); - simTICLCandidate_boundaryPz.push_back(globalMom.z()); - } else { - simTICLCandidate_boundaryX.push_back(-999); - simTICLCandidate_boundaryY.push_back(-999); - simTICLCandidate_boundaryZ.push_back(-999); - simTICLCandidate_boundaryPx.push_back(-999); - simTICLCandidate_boundaryPy.push_back(-999); - simTICLCandidate_boundaryPz.push_back(-999); + auto const& trackPtrs = cand.trackPtrs(); + if (!trackPtrs.empty()) { + std::vector boundaryX; + std::vector boundaryY; + std::vector boundaryZ; + std::vector boundaryPx; + std::vector boundaryPy; + std::vector boundaryPz; + for (const auto& trackPtr : trackPtrs) { + auto const& track = *trackPtr; + int iSide = int(track.eta() > 0); + int tk_idx = trackPtr.get() - (edm::Ptr(tracks_h, 0)).get(); + simTICLCandidate_tracks_in_candidate[i].push_back(tk_idx); + + const auto& fts = trajectoryStateTransform::outerFreeState((track), &detectorTools_->bfield); + // to the HGCal front + const auto& tsos = detectorTools_->propagator.propagate(fts, detectorTools_->firstDisk_[iSide]->surface()); + if (tsos.isValid()) { + const auto& globalPos = tsos.globalPosition(); + const auto& globalMom = tsos.globalMomentum(); + boundaryX.push_back(globalPos.x()); + boundaryY.push_back(globalPos.y()); + boundaryZ.push_back(globalPos.z()); + boundaryPx.push_back(globalMom.x()); + boundaryPy.push_back(globalMom.y()); + boundaryPz.push_back(globalMom.z()); + } else { + boundaryX.push_back(-999); + boundaryY.push_back(-999); + boundaryZ.push_back(-999); + boundaryPx.push_back(-999); + boundaryPy.push_back(-999); + boundaryPz.push_back(-999); + } } + simTICLCandidate_boundaryX.push_back(boundaryX); + simTICLCandidate_boundaryY.push_back(boundaryY); + simTICLCandidate_boundaryZ.push_back(boundaryZ); + simTICLCandidate_boundaryPx.push_back(boundaryPx); + simTICLCandidate_boundaryPy.push_back(boundaryPy); + simTICLCandidate_boundaryPz.push_back(boundaryPz); } else { - simTICLCandidate_boundaryX.push_back(-999); - simTICLCandidate_boundaryY.push_back(-999); - simTICLCandidate_boundaryZ.push_back(-999); - simTICLCandidate_boundaryPx.push_back(-999); - simTICLCandidate_boundaryPy.push_back(-999); - simTICLCandidate_boundaryPz.push_back(-999); + simTICLCandidate_boundaryX.push_back({-999}); + simTICLCandidate_boundaryY.push_back({-999}); + simTICLCandidate_boundaryZ.push_back({-999}); + simTICLCandidate_boundaryPx.push_back({-999}); + simTICLCandidate_boundaryPy.push_back({-999}); + simTICLCandidate_boundaryPz.push_back({-999}); } } From 1619eedf996a316c742eb85c010fe3b3e051ddab Mon Sep 17 00:00:00 2001 From: AuroraPerego Date: Fri, 26 Sep 2025 11:46:03 +0200 Subject: [PATCH 8/8] add comments and improve readibility in strings --- .../python/PostProcessorHGCAL_cfi.py | 33 ++++++++++--------- .../HGCalValidation/python/hgcalPlots.py | 14 ++++---- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py b/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py index bba82855214d7..5bfade2d97dc6 100644 --- a/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py +++ b/Validation/HGCalValidation/python/PostProcessorHGCAL_cfi.py @@ -99,25 +99,26 @@ for c in charged: for var in variables.keys(): - eff_candidates.append("eff_"+c+"_track_"+var+" '"+c.replace("_", " ")+" candidates track efficiency vs "+var+"' num_track_cand_vs_"+var+"_"+c+" den_cand_vs_"+var+"_"+c) - eff_candidates.append("eff_"+c+"_pid_"+var+" '"+c.replace("_", " ")+" candidates track + pid efficiency vs "+var+"' num_pid_cand_vs_"+var+"_"+c+" den_cand_vs_"+var+"_"+c) - eff_candidates.append("eff_"+c+"_energy_"+var+" '"+c.replace("_", " ")+" candidates track + pid + energy efficiency vs "+var+"' num_energy_cand_vs_"+var+"_"+c+" den_cand_vs_"+var+"_"+c) -for n in neutrals: - for var in variables.keys(): - eff_candidates.append("eff_"+n+"_pid_"+var+" '"+n.replace("_", " ")+" candidates pid efficiency vs "+var+"' num_pid_cand_vs_"+var+"_"+n+" den_cand_vs_"+var+"_"+n) - eff_candidates.append("eff_"+n+"_energy_"+var+" '"+n.replace("_", " ")+" candidates pid + energy efficiency vs "+var+"' num_energy_cand_vs_"+var+"_"+n+" den_cand_vs_"+var+"_"+n) + # efficiency + eff_candidates.append(f"eff_{c}_track_{var} '{c.replace('_', ' ')} candidates track efficiency vs {var}' num_track_cand_vs_{var}_{c} den_cand_vs_{var}_{c}") + eff_candidates.append(f"eff_{c}_pid_{var} '{c.replace('_', ' ')} candidates track + pid efficiency vs {var}' num_pid_cand_vs_{var}_{c} den_cand_vs_{var}_{c}") + eff_candidates.append(f"eff_{c}_energy_{var} '{c.replace('_', ' ')} candidates track + pid + energy efficiency vs {var}' num_energy_cand_vs_{var}_{c} den_cand_vs_{var}_{c}") + # fake + eff_candidates.append(f"fake_{c}_track_{var} '{c.replace('_', ' ')} candidates track fake vs {var}' num_fake_track_cand_vs_{var}_{c} den_fake_cand_vs_{var}_{c}") + eff_candidates.append(f"fake_{c}_pid_{var} '{c.replace('_', ' ')} candidates pid fake vs {var}' num_fake_pid_cand_vs_{var}_{c} den_fake_cand_vs_{var}_{c}") + eff_candidates.append(f"fake_{c}_energy_{var} '{c.replace('_', ' ')} candidates energy fake vs {var}' num_fake_energy_cand_vs_{var}_{c} den_fake_cand_vs_{var}_{c}") + eff_candidates.append(f"fake_{c}_total_{var} '{c.replace('_', ' ')} candidates track + pid + energy fake vs {var}' num_fake_total_cand_vs_{var}_{c} den_fake_cand_vs_{var}_{c}") -for c in charged: - for var in variables.keys(): - eff_candidates.append("fake_"+c+"_track_"+var+" '"+c.replace("_", " ")+" candidates track fake vs "+var+"' num_fake_track_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) - eff_candidates.append("fake_"+c+"_pid_"+var+" '"+c.replace("_", " ")+" candidates pid fake vs "+var+"' num_fake_pid_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) - eff_candidates.append("fake_"+c+"_energy_"+var+" '"+c.replace("_", " ")+" candidates energy fake vs "+var+"' num_fake_energy_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) - eff_candidates.append("fake_"+c+"_total_"+var+" '"+c.replace("_", " ")+" candidates track + pid + energy fake vs "+var+"' num_fake_total_cand_vs_"+var+"_"+c+" den_fake_cand_vs_"+var+"_"+c) for n in neutrals: for var in variables.keys(): - eff_candidates.append("fake_"+n+"_pid_"+var+" '"+n.replace("_", " ")+" candidates pid fake vs "+var+"' num_fake_pid_cand_vs_"+var+"_"+n+" den_fake_cand_vs_"+var+"_"+n) - eff_candidates.append("fake_"+n+"_energy_"+var+" '"+n.replace("_", " ")+" candidates energy fake vs "+var+"' num_fake_energy_cand_vs_"+var+"_"+n+" den_fake_cand_vs_"+var+"_"+n) - eff_candidates.append("fake_"+n+"_total_"+var+" '"+n.replace("_", " ")+" candidates pid + energy fake vs "+var+"' num_fake_total_cand_vs_"+var+"_"+n+" den_fake_cand_vs_"+var+"_"+n) + # efficiency + eff_candidates.append(f"eff_{n}_pid_{var} '{n.replace('_', ' ')} candidates pid efficiency vs {var}' num_pid_cand_vs_{var}_{n} den_cand_vs_{var}_{n}") + eff_candidates.append(f"eff_{n}_energy_{var} '{n.replace('_', ' ')} candidates pid + energy efficiency vs {var}' num_energy_cand_vs_{var}_{n} den_cand_vs_{var}_{n}") + # fake + eff_candidates.append(f"fake_{n}_pid_{var} '{n.replace('_', ' ')} candidates pid fake vs {var}' num_fake_pid_cand_vs_{var}_{n} den_fake_cand_vs_{var}_{n}") + eff_candidates.append(f"fake_{n}_energy_{var} '{n.replace('_', ' ')} candidates energy fake vs {var}' num_fake_energy_cand_vs_{var}_{n} den_fake_cand_vs_{var}_{n}") + eff_candidates.append(f"fake_{n}_total_{var} '{n.replace('_', ' ')} candidates pid + energy fake vs {var}' num_fake_total_cand_vs_{var}_{n} den_fake_cand_vs_{var}_{n}") + postProcessorHGCALCandidates = DQMEDHarvester('DQMGenericClient', subDirs = cms.untracked.vstring(subDirsCandidates), diff --git a/Validation/HGCalValidation/python/hgcalPlots.py b/Validation/HGCalValidation/python/hgcalPlots.py index 7b6a7f482cf74..7f50c9843146a 100644 --- a/Validation/HGCalValidation/python/hgcalPlots.py +++ b/Validation/HGCalValidation/python/hgcalPlots.py @@ -1642,7 +1642,7 @@ for ver in score_versions_recoToSim: _score_trackster_to_simtrackster[-1].append(Plot("Score"+ver+"_trackster2"+val, **_common_score)) print("appending plot ", "Score"+ver+"_trackster2"+val) - + _energyscore_to_trackster.append(PlotGroup("Energy_vs_Score_"+val+"ToTracksters", [], ncols=len(en_vs_score))) _energyscore_trackster_to.append(PlotGroup("Energy_vs_Score_TrackstersTo"+val, [], ncols=len(en_vs_score))) @@ -1877,8 +1877,10 @@ _all_cand_TkTsAss_plots.append(cand_ass_plots) _allCandidatesPlots = [[],[],[],[],[],[]] +# loop over the 3 charged chandidates (charged_hadrons, electrons, muons: indices 0,1,2 in cand_type respectively) for i in range(3): _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=3), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=4), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=4), PlotGroup(cand_type[i]+"_NoTrackTracksterAssoc", _all_cand_TkTsAss_plots[i], ncols=3)]) +# loop over the 3 neutral chandidates (neutral_hadrons, neutral_pions, photons: indices 3,4,5 in cand_type respectively) for i in range(3,6): _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=2), PlotGroup(cand_type[i]+"_effMultiplicity", _all_cand_effNum_plots[i], ncols=2), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fakeMultiplicity", _all_cand_fakeNum_plots[i], ncols=3), PlotGroup(cand_type[i]+"_NoTrackTracksterAssoc", _all_cand_TkTsAss_plots[i], ncols=1)]) @@ -2647,7 +2649,7 @@ def append_hgcalTrackstersPlots(collection = 'ticlTrackstersMerge', name_collect ,page="Trackster to SimTracksters from CP Associated by Hits" ,section=name_collection) ) - + hgcalTrackstersPlotter.append(collection, [ _hgcalFolders(collection + "/" + TSbyLCs) ], PlotFolder( @@ -2657,7 +2659,7 @@ def append_hgcalTrackstersPlots(collection = 'ticlTrackstersMerge', name_collect ,page="Trackster to SimTracksters Associated by LCs" ,section=name_collection) ) - + hgcalTrackstersPlotter.append(collection, [ _hgcalFolders(collection + "/" + TSbyLCs_CP) ], PlotFolder( @@ -2667,7 +2669,7 @@ def append_hgcalTrackstersPlots(collection = 'ticlTrackstersMerge', name_collect ,page="Trackster to SimTracksters from CP Associated by LCs" ,section=name_collection) ) - + hgcalTrackstersPlotter.append(collection, [ _hgcalFolders(collection + "/" + TSbyHits) ], PlotFolder( @@ -2677,8 +2679,8 @@ def append_hgcalTrackstersPlots(collection = 'ticlTrackstersMerge', name_collect ,page="Trackster to SimTracksters Associated by Hits" ,section=name_collection) ) - - + + #================================================================================================= _common_Calo = {"stat": False, "drawStyle": "hist", "staty": 0.65, "ymin": 0.0, "ylog": False, "xtitle": "Default", "ytitle": "Default"}