Skip to content

Commit c0df755

Browse files
authored
Merge pull request #48862 from AuroraPerego/trackCandValidation_15_1_0_pre5
Add vector of tracks to TICL tracksters and candidates and add other validation plots
2 parents 5cbdf19 + 7cd5fc0 commit c0df755

File tree

15 files changed

+550
-234
lines changed

15 files changed

+550
-234
lines changed

DataFormats/HGCalReco/interface/TICLCandidate.h

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define DataFormats_HGCalReco_TICLCandidate_h
33

44
#include "DataFormats/Candidate/interface/LeafCandidate.h"
5+
#include "DataFormats/Common/interface/Ptr.h"
56
#include "DataFormats/Common/interface/Ref.h"
67
#include "DataFormats/HGCalReco/interface/Trackster.h"
78
#include "DataFormats/Math/interface/Point3D.h"
@@ -33,18 +34,19 @@ class TICLCandidate : public reco::LeafCandidate {
3334
rawEnergy_(0.f) {}
3435

3536
TICLCandidate(const edm::Ptr<reco::Track> trackPtr, const edm::Ptr<ticl::Trackster>& tracksterPtr)
36-
: LeafCandidate(), tracksters_{}, trackPtr_(trackPtr), time_(0.f), timeError_(-1.f) {
37-
if (trackPtr_.isNull() and tracksterPtr.isNull())
37+
: LeafCandidate(), tracksters_{}, trackPtrs_{}, time_(0.f), timeError_(-1.f) {
38+
if (trackPtr.isNull() and tracksterPtr.isNull())
3839
throw cms::Exception("NullPointerError")
3940
<< "TICLCandidate constructor: at least one between track and trackster must be valid";
4041

4142
if (tracksterPtr.isNonnull()) {
4243
tracksters_.push_back(tracksterPtr);
4344
auto const& trackster = tracksters_[0].get();
4445
idProbabilities_ = trackster->id_probabilities();
45-
if (trackPtr_.isNonnull()) {
46+
if (trackPtr.isNonnull()) {
47+
trackPtrs_.push_back(trackPtr);
4648
auto pdgId = trackster->isHadronic() ? 211 : 11;
47-
auto const& tk = trackPtr_.get();
49+
auto const& tk = trackPtr.get();
4850
setPdgId(pdgId * tk->charge());
4951
setCharge(tk->charge());
5052
rawEnergy_ = trackster->raw_energy();
@@ -69,7 +71,8 @@ class TICLCandidate : public reco::LeafCandidate {
6971
}
7072
} else {
7173
//candidate from track only
72-
auto const& tk = trackPtr_.get();
74+
trackPtrs_.push_back(trackPtr);
75+
auto const& tk = trackPtr.get();
7376
setPdgId(211 * tk->charge());
7477
setCharge(tk->charge());
7578
const float energy = std::sqrt(tk->p() * tk->p() + ticl::mpion2);
@@ -95,15 +98,18 @@ class TICLCandidate : public reco::LeafCandidate {
9598
MTDtimeError_ = timeError;
9699
};
97100

98-
inline const edm::Ptr<reco::Track> trackPtr() const { return trackPtr_; }
99-
void setTrackPtr(const edm::Ptr<reco::Track>& trackPtr) { trackPtr_ = trackPtr; }
101+
inline const edm::Ptr<reco::Track> trackPtr(int index = 0) const {
102+
return trackPtrs_.empty() ? edm::Ptr<reco::Track>() : trackPtrs_[index];
103+
}
104+
inline const std::vector<edm::Ptr<reco::Track>> trackPtrs() const { return trackPtrs_; }
105+
void addTrackPtr(const edm::Ptr<reco::Track>& trackPtr) { trackPtrs_.push_back(trackPtr); }
100106

101107
inline float rawEnergy() const { return rawEnergy_; }
102108
void setRawEnergy(float rawEnergy) { rawEnergy_ = rawEnergy; }
103109

104-
inline const std::vector<edm::Ptr<ticl::Trackster> > tracksters() const { return tracksters_; };
110+
inline const std::vector<edm::Ptr<ticl::Trackster>> tracksters() const { return tracksters_; };
105111

106-
void setTracksters(const std::vector<edm::Ptr<ticl::Trackster> >& tracksters) { tracksters_ = tracksters; }
112+
void setTracksters(const std::vector<edm::Ptr<ticl::Trackster>>& tracksters) { tracksters_ = tracksters; }
107113
void addTrackster(const edm::Ptr<ticl::Trackster>& trackster) {
108114
tracksters_.push_back(trackster);
109115
time_ = trackster->time();
@@ -129,8 +135,8 @@ class TICLCandidate : public reco::LeafCandidate {
129135
private:
130136
// vector of Ptr so Tracksters can come from different collections
131137
// and there can be derived classes
132-
std::vector<edm::Ptr<ticl::Trackster> > tracksters_;
133-
edm::Ptr<reco::Track> trackPtr_;
138+
std::vector<edm::Ptr<ticl::Trackster>> tracksters_;
139+
std::vector<edm::Ptr<reco::Track>> trackPtrs_;
134140
// Since it contains multiple tracksters, duplicate the probability interface
135141
std::array<float, 8> idProbabilities_;
136142

DataFormats/HGCalReco/interface/Trackster.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ namespace ticl {
7777
inline void setRawEmPt(float value) { raw_em_pt_ = value; }
7878
inline void calculateRawEmPt() { raw_em_pt_ = raw_em_energy_ / std::cosh(barycenter_.eta()); }
7979
inline void setBarycenter(Vector value) { barycenter_ = value; }
80-
inline void setTrackIdx(int index) { track_idx_ = index; }
81-
int trackIdx() const { return track_idx_; }
80+
inline void addTrackIdx(int index) { track_idxs_.push_back(index); }
81+
int trackIdx(int index = 0) const { return track_idxs_.empty() ? -1 : track_idxs_[index]; }
8282
inline bool isHadronic(float th = 0.5f) const {
8383
return id_probability(Trackster::ParticleType::photon) + id_probability(Trackster::ParticleType::electron) < th;
8484
}
@@ -198,6 +198,7 @@ namespace ticl {
198198
inline const std::array<float, 3> &sigmasPCA() const { return sigmasPCA_; }
199199
inline const std::array<float, 8> &id_probabilities() const { return id_probabilities_; }
200200
inline const float id_probabilities(int index) const { return id_probabilities_[index]; }
201+
inline const std::vector<int> &trackIdxs() const { return track_idxs_; }
201202

202203
// convenience method to return the ID probability for a certain particle type
203204
inline float id_probability(ParticleType type) const {
@@ -236,7 +237,7 @@ namespace ticl {
236237
// created the trackster. For track-based seeding the pointer to the track
237238
// can be cooked using the previous ProductID and this index.
238239
int seedIndex_;
239-
int track_idx_ = -1;
240+
std::vector<int> track_idxs_;
240241

241242
std::array<Vector, 3> eigenvectors_;
242243
std::array<float, 3> eigenvalues_;

DataFormats/HGCalReco/src/classes_def.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
<lcgdict>
3-
<class name="ticl::Trackster" ClassVersion="11">
3+
<class name="ticl::Trackster" ClassVersion="12">
4+
<version ClassVersion="12" checksum="912917580"/>
45
<version ClassVersion="11" checksum="2111726404"/>
56
<version ClassVersion="10" checksum="556627704"/>
67
<version ClassVersion="9" checksum="1001808235"/>
@@ -66,7 +67,8 @@
6667
<class name="edm::Wrapper<TICLSeedingRegion>" />
6768
<class name="edm::Wrapper<std::vector<TICLSeedingRegion> >" />
6869

69-
<class name="TICLCandidate" ClassVersion="4">
70+
<class name="TICLCandidate" ClassVersion="5">
71+
<version ClassVersion="5" checksum="809321696"/>
7072
<version ClassVersion="4" checksum="2260471800"/>
7173
<version ClassVersion="3" checksum="450468662"/>
7274
</class>

RecoHGCal/TICL/plugins/LinkingAlgoByDirectionGeometric.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ void LinkingAlgoByDirectionGeometric::linkTracksters(const edm::Handle<std::vect
396396
for (unsigned &i : candidateTrackIds) {
397397
if (tsNearTk[i].empty() && tsNearTkAtInt[i].empty()) { // nothing linked to track, make charged hadrons
398398
TICLCandidate chargedHad;
399-
chargedHad.setTrackPtr(edm::Ptr<reco::Track>(tkH, i));
399+
chargedHad.addTrackPtr(edm::Ptr<reco::Track>(tkH, i));
400400
chargedHadronsFromTk.push_back(chargedHad);
401401
continue;
402402
}
@@ -506,11 +506,11 @@ void LinkingAlgoByDirectionGeometric::linkTracksters(const edm::Handle<std::vect
506506
// do not create a candidate if no tracksters were added to candidate
507507
// can happen if all the tracksters linked to that track were already masked
508508
if (!chargedCandidate.tracksters().empty()) {
509-
chargedCandidate.setTrackPtr(edm::Ptr<reco::Track>(tkH, i));
509+
chargedCandidate.addTrackPtr(edm::Ptr<reco::Track>(tkH, i));
510510
chargedCandidates.push_back(chargedCandidate);
511511
} else { // create charged hadron
512512
TICLCandidate chargedHad;
513-
chargedHad.setTrackPtr(edm::Ptr<reco::Track>(tkH, i));
513+
chargedHad.addTrackPtr(edm::Ptr<reco::Track>(tkH, i));
514514
chargedHadronsFromTk.push_back(chargedHad);
515515
}
516516
}

RecoHGCal/TICL/plugins/SimTrackstersProducer.cc

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -435,9 +435,8 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es)
435435

436436
makePUTrackster(inputClusterMask, *output_mask, *resultPU, caloParticles_h.id(), 0);
437437

438-
auto simTrackToRecoTrack = [&](UniqueSimTrackId simTkId) -> std::pair<int, float> {
439-
int trackIdx = -1;
440-
float quality = 0.f;
438+
auto simTrackToRecoTrack = [&](UniqueSimTrackId simTkId) -> std::vector<int> {
439+
std::vector<int> trackIdx;
441440
auto ipos = simTrackToTPMap.mapping.find(simTkId);
442441
if (ipos != simTrackToTPMap.mapping.end()) {
443442
auto jpos = TPtoRecoTrackMap.find((ipos->second));
@@ -446,41 +445,55 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es)
446445
if (!associatedRecoTracks.empty()) {
447446
// associated reco tracks are sorted by decreasing quality
448447
if (associatedRecoTracks[0].second > qualityCutTrack_) {
449-
trackIdx = &(*associatedRecoTracks[0].first) - &recoTracks[0];
450-
quality = associatedRecoTracks[0].second;
448+
trackIdx.push_back(&(*associatedRecoTracks[0].first) - &recoTracks[0]);
449+
}
450+
}
451+
}
452+
const auto& tp = (*ipos->second);
453+
if (!tp.decayVertices().empty()) {
454+
const auto& iTV = tp.decayVertices()[0];
455+
for (auto iTP = iTV->daughterTracks_begin(); iTP != iTV->daughterTracks_end(); ++iTP) {
456+
auto kpos = TPtoRecoTrackMap.find((*iTP));
457+
if (kpos != TPtoRecoTrackMap.end()) {
458+
auto& associatedRecoTracks = kpos->val;
459+
if (!associatedRecoTracks.empty()) {
460+
// associated reco tracks are sorted by decreasing quality
461+
if (associatedRecoTracks[0].second > qualityCutTrack_) {
462+
trackIdx.push_back(&(*associatedRecoTracks[0].first) - &recoTracks[0]);
463+
}
464+
}
451465
}
452466
}
453467
}
454468
}
455-
return {trackIdx, quality};
469+
return trackIdx;
456470
};
457471

458-
// Creating the map from TrackingParticle to SimTrackstersFromCP
472+
// Set the reco track id to SimTrackstersFromCP
459473
auto& simTrackstersFromCP = *result_fromCP;
460474
for (unsigned int i = 0; i < simTrackstersFromCP.size(); ++i) {
461475
if (simTrackstersFromCP[i].vertices().empty())
462476
continue;
463477
const auto& simTrack = caloparticles[simTrackstersFromCP[i].seedIndex()].g4Tracks()[0];
464478
UniqueSimTrackId simTkIds(simTrack.trackId(), simTrack.eventId());
465-
auto bestAssociatedRecoTrack = simTrackToRecoTrack(simTkIds);
466-
if (bestAssociatedRecoTrack.first != -1 and bestAssociatedRecoTrack.second > qualityCutTrack_) {
467-
auto trackIndex = bestAssociatedRecoTrack.first;
468-
simTrackstersFromCP[i].setTrackIdx(trackIndex);
479+
auto bestAssociatedRecoTracks = simTrackToRecoTrack(simTkIds);
480+
if (not bestAssociatedRecoTracks.empty()) {
481+
for (auto const trackIndex : bestAssociatedRecoTracks)
482+
simTrackstersFromCP[i].addTrackIdx(trackIndex);
469483
}
470484
}
471485

472486
auto& simTracksters = *result;
473-
// Creating the map from TrackingParticle to SimTrackster
474-
std::unordered_map<unsigned int, std::vector<unsigned int>> TPtoSimTracksterMap;
487+
// Set the reco track id to simTracksters
475488
for (unsigned int i = 0; i < simTracksters.size(); ++i) {
476489
const auto& simTrack = (simTracksters[i].seedID() == caloParticles_h.id())
477490
? caloparticles[simTracksters[i].seedIndex()].g4Tracks()[0]
478491
: simclusters[simTracksters[i].seedIndex()].g4Tracks()[0];
479492
UniqueSimTrackId simTkIds(simTrack.trackId(), simTrack.eventId());
480-
auto bestAssociatedRecoTrack = simTrackToRecoTrack(simTkIds);
481-
if (bestAssociatedRecoTrack.first != -1 and bestAssociatedRecoTrack.second > qualityCutTrack_) {
482-
auto trackIndex = bestAssociatedRecoTrack.first;
483-
simTracksters[i].setTrackIdx(trackIndex);
493+
auto bestAssociatedRecoTracks = simTrackToRecoTrack(simTkIds);
494+
if (not bestAssociatedRecoTracks.empty()) {
495+
for (auto const trackIndex : bestAssociatedRecoTracks)
496+
simTracksters[i].addTrackIdx(trackIndex);
484497
}
485498
}
486499

@@ -502,12 +515,15 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es)
502515
: SimClusterToCaloParticleMap[simTrackster.seedIndex()];
503516
auto const& tCP = (*result_fromCP)[cp_index];
504517
if (!tCP.vertices().empty()) {
505-
auto trackIndex = tCP.trackIdx();
518+
auto trackIndices = tCP.trackIdxs();
506519

507520
auto& cand = (*result_ticlCandidates)[cp_index];
508521
cand.addTrackster(edm::Ptr<Trackster>(simTracksters_h, i));
509-
if (trackIndex != -1 && caloparticles[cp_index].charge() != 0)
510-
cand.setTrackPtr(edm::Ptr<reco::Track>(recoTracks_h, trackIndex));
522+
if (cand.trackPtrs().empty() and not trackIndices.empty() and caloparticles[cp_index].charge() != 0) {
523+
for (const auto trackIndex : trackIndices) {
524+
cand.addTrackPtr(edm::Ptr<reco::Track>(recoTracks_h, trackIndex));
525+
}
526+
}
511527
toKeep.push_back(cp_index);
512528
}
513529
}

RecoHGCal/TICL/plugins/TICLCandidateProducer.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -434,15 +434,16 @@ void TICLCandidateProducer::assignTimeToCandidates(std::vector<TICLCandidate> &r
434434
float invTimeErr = 0.f;
435435
float timeErr = -1.f;
436436

437+
const int trackIndex =
438+
cand.trackPtr().isNonnull() ? (cand.trackPtr().get() - (edm::Ptr<reco::Track>(track_h, 0)).get()) : -1;
437439
for (const auto &tr : cand.tracksters()) {
438440
if (tr->timeError() > 0) {
439441
const auto invTimeESq = pow(tr->timeError(), -2);
440442
const auto x = tr->barycenter().X();
441443
const auto y = tr->barycenter().Y();
442444
const auto z = tr->barycenter().Z();
443445
auto path = std::sqrt(x * x + y * y + z * z);
444-
if (cand.trackPtr().get() != nullptr) {
445-
const auto &trackIndex = cand.trackPtr().get() - (edm::Ptr<reco::Track>(track_h, 0)).get();
446+
if (trackIndex != -1) {
446447
if (useMTDTiming_ and inputTimingView.timeErr()[trackIndex] > 0) {
447448
const auto xMtd = inputTimingView.posInMTD_x()[trackIndex];
448449
const auto yMtd = inputTimingView.posInMTD_y()[trackIndex];
@@ -473,7 +474,6 @@ void TICLCandidateProducer::assignTimeToCandidates(std::vector<TICLCandidate> &r
473474

474475
if (useMTDTiming_ and cand.charge()) {
475476
// Check MTD timing availability
476-
const auto &trackIndex = cand.trackPtr().get() - (edm::Ptr<reco::Track>(track_h, 0)).get();
477477
const bool assocQuality = inputTimingView.MVAquality()[trackIndex] > timingQualityThreshold_;
478478
if (assocQuality) {
479479
const auto timeHGC = cand.time();

0 commit comments

Comments
 (0)