Skip to content

Commit

Permalink
changes to timing info for ticlv5 (cms-sw#23)
Browse files Browse the repository at this point in the history
* Adding missing track variables to the dumper

* add configurable local time for UncalibRechits

* change the computation of the trackster time

* Add track time variables to Dumper

* ticlv5: compute candidate time at the vertex

* fix warning in TICLCandidate validation

* code checks and code format

* replace InpuTag with std::string in hgcalValidator_cfi

* ticlv5: producer for just merging the two clue3d collections

* ticlv5: customise dumper for ticlv5

* ticlv5: fix TICLCandidate constructor

* ticlv5: add boundary time and change simTICLCandidate time

* ticlv5: remove track quality and fix TICLCandidateProducer

* ticlv5: trackster time computation

- add the possibiility to compute local trackster time in
  PatternReconition plugins
- fix arguments order in assignPCA

* ticlv5: set local time in customiseForTICLv5

* code-format and code-checks

* ticlv5: fix tracksters in input to candidates in TICLDumper

* change 1 and 1. to 1.f

* ticlv5: fix candidates creation

---------

Co-authored-by: Felice Pantaleo <felice.pantaleo@cern.ch>
Co-authored-by: Wahid Redjeb <wahid.redjeb.wr@gmail.com>
  • Loading branch information
3 people committed Apr 18, 2024
1 parent 35d72ad commit b8666c5
Show file tree
Hide file tree
Showing 36 changed files with 643 additions and 171 deletions.
23 changes: 10 additions & 13 deletions DataFormats/HGCalReco/interface/TICLCandidate.h
Expand Up @@ -9,6 +9,8 @@
#include "DataFormats/TrackReco/interface/TrackFwd.h"
#include "RecoHGCal/TICL/interface/commons.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"

// A TICLCandidate is a lightweight physics object made from one or multiple Tracksters.

class TICLCandidate : public reco::LeafCandidate {
Expand All @@ -28,16 +30,13 @@ class TICLCandidate : public reco::LeafCandidate {
timeError_(trackster->timeError()),
rawEnergy_(0.f) {}

TICLCandidate(const edm::Ptr<reco::Track> trackPtr, edm::Ptr<ticl::Trackster>& tracksterPtr)
: LeafCandidate(),
tracksters_({std::move(tracksterPtr)}),
trackPtr_(std::move(trackPtr)),
time_(0.f),
timeError_(-1.f) {
//TODO: Raise Error
assert(trackPtr_.isNonnull() or tracksters_[0].isNonnull());

if (tracksters_[0].isNonnull()) {
TICLCandidate(const edm::Ptr<reco::Track> trackPtr, const edm::Ptr<ticl::Trackster>& tracksterPtr)
: LeafCandidate(), tracksters_{}, trackPtr_(trackPtr), time_(0.f), timeError_(-1.f) {
if (trackPtr_.isNull() and tracksterPtr.isNull())
edm::LogError("TICLCandidate") << "At least one between track and trackster must be valid\n";

if (tracksterPtr.isNonnull()) {
tracksters_.push_back(std::move(tracksterPtr));
auto const& trackster = tracksters_[0].get();
idProbabilities_ = trackster->id_probabilities();
if (trackPtr_.isNonnull()) {
Expand Down Expand Up @@ -65,9 +64,7 @@ class TICLCandidate : public reco::LeafCandidate {
regrE);
setP4(p4);
}
}

else {
} else {
//candidate from track only
auto const& tk = trackPtr_.get();
setPdgId(211 * tk->charge());
Expand Down
9 changes: 7 additions & 2 deletions DataFormats/HGCalReco/interface/Trackster.h
Expand Up @@ -41,11 +41,12 @@ namespace ticl {
regressed_energy_(0.f),
raw_energy_(0.f),
time_(0.f),
boundTime_(0.f),
timeError_(-1.f),
raw_em_energy_(0.f),
id_probabilities_{},
raw_pt_(0.f),
raw_em_pt_(0.f),
raw_em_energy_(0.f),
seedIndex_(-1),
eigenvalues_{},
sigmas_{},
Expand Down Expand Up @@ -137,6 +138,8 @@ namespace ticl {
}
inline void setIdProbability(ParticleType type, float value) { id_probabilities_[int(type)] = value; }

inline void setBoundaryTime(float t) { boundTime_ = t; };

inline const Trackster::IterationIndex ticlIteration() const { return (IterationIndex)iterationIndex_; }
inline const std::vector<unsigned int> &vertices() const { return vertices_; }
inline const unsigned int vertices(int index) const { return vertices_[index]; }
Expand All @@ -152,6 +155,7 @@ namespace ticl {
inline const float raw_em_energy() const { return raw_em_energy_; }
inline const float raw_pt() const { return raw_pt_; }
inline const float raw_em_pt() const { return raw_em_pt_; }
inline const float boundaryTime() const { return boundTime_; };
inline const Vector &barycenter() const { return barycenter_; }
inline const std::array<float, 3> &eigenvalues() const { return eigenvalues_; }
inline const std::array<Vector, 3> &eigenvectors() const { return eigenvectors_; }
Expand All @@ -173,8 +177,8 @@ namespace ticl {
float raw_energy_;
// -99, -1 if not available. ns units otherwise
float time_;
float boundTime_;
float timeError_;
float raw_em_energy_;

// trackster ID probabilities
std::array<float, 8> id_probabilities_;
Expand All @@ -185,6 +189,7 @@ namespace ticl {
std::vector<float> vertex_multiplicity_;
float raw_pt_;
float raw_em_pt_;
float raw_em_energy_;

// Product ID of the seeding collection used to create the Trackster.
// For GlobalSeeding the ProductID is set to 0. For track-based seeding
Expand Down
3 changes: 2 additions & 1 deletion DataFormats/HGCalReco/src/classes_def.xml
@@ -1,6 +1,7 @@

<lcgdict>
<class name="ticl::Trackster" ClassVersion="10">
<class name="ticl::Trackster" ClassVersion="11">
<version ClassVersion="11" checksum="2995118904"/>
<version ClassVersion="10" checksum="556627704"/>
<version ClassVersion="9" checksum="1001808235"/>
<version ClassVersion="8" checksum="749412802"/>
Expand Down
@@ -1,6 +1,7 @@
import FWCore.ParameterSet.Config as cms
from RecoLocalCalo.HGCalRecProducers.HGCalUncalibRecHitProducer_cfi import HGCalUncalibRecHitProducer

HGCalUncalibRecHitL1Seeded = cms.EDProducer("HGCalUncalibRecHitProducer",
HGCalUncalibRecHitL1Seeded = HGCalUncalibRecHitProducer.clone(
HGCEEConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(100),
Expand All @@ -13,7 +14,6 @@
tofDelay = cms.double(-9)
),
HGCEEdigiCollection = cms.InputTag("hgcalDigisL1Seeded","EE"),
HGCEEhitCollection = cms.string('HGCEEUncalibRecHits'),
HGCHEBConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(68.75),
Expand All @@ -26,7 +26,6 @@
tofDelay = cms.double(-14)
),
HGCHEBdigiCollection = cms.InputTag("hgcalDigisL1Seeded","HEback"),
HGCHEBhitCollection = cms.string('HGCHEBUncalibRecHits'),
HGCHEFConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(100),
Expand All @@ -39,7 +38,6 @@
tofDelay = cms.double(-11)
),
HGCHEFdigiCollection = cms.InputTag("hgcalDigisL1Seeded","HEfront"),
HGCHEFhitCollection = cms.string('HGCHEFUncalibRecHits'),
HGCHFNoseConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(100),
Expand Down
@@ -1,6 +1,7 @@
import FWCore.ParameterSet.Config as cms
from RecoLocalCalo.HGCalRecProducers.HGCalUncalibRecHitProducer_cfi import HGCalUncalibRecHitProducer

HGCalUncalibRecHit = cms.EDProducer("HGCalUncalibRecHitProducer",
HGCalUncalibRecHit = HGCalUncalibRecHitProducer.clone(
HGCEEConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(100),
Expand All @@ -12,8 +13,6 @@
toaLSB_ns = cms.double(0.0244),
tofDelay = cms.double(-9)
),
HGCEEdigiCollection = cms.InputTag("hgcalDigis","EE"),
HGCEEhitCollection = cms.string('HGCEEUncalibRecHits'),
HGCHEBConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(68.75),
Expand All @@ -25,8 +24,6 @@
toaLSB_ns = cms.double(0.0244),
tofDelay = cms.double(-14)
),
HGCHEBdigiCollection = cms.InputTag("hgcalDigis","HEback"),
HGCHEBhitCollection = cms.string('HGCHEBUncalibRecHits'),
HGCHEFConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(100),
Expand All @@ -38,8 +35,6 @@
toaLSB_ns = cms.double(0.0244),
tofDelay = cms.double(-11)
),
HGCHEFdigiCollection = cms.InputTag("hgcalDigis","HEfront"),
HGCHEFhitCollection = cms.string('HGCHEFUncalibRecHits'),
HGCHFNoseConfig = cms.PSet(
adcNbits = cms.uint32(10),
adcSaturation = cms.double(100),
Expand Down
6 changes: 3 additions & 3 deletions RecoHGCal/TICL/interface/TICLInterpretationAlgoBase.h
Expand Up @@ -65,16 +65,16 @@ namespace ticl {
struct TrackTimingInformation {
const edm::Handle<edm::ValueMap<float>> tkTime_h;
const edm::Handle<edm::ValueMap<float>> tkTimeErr_h;
const edm::Handle<edm::ValueMap<float>> tkTimeQual_h;
const edm::Handle<edm::ValueMap<float>> tkBeta_h;
const edm::Handle<edm::ValueMap<float>> tkPath_h;
const edm::Handle<edm::ValueMap<GlobalPoint>> tkMtdPos_h;

TrackTimingInformation(const edm::Handle<edm::ValueMap<float>> tkT,
const edm::Handle<edm::ValueMap<float>> tkTE,
const edm::Handle<edm::ValueMap<float>> tkTQ,
const edm::Handle<edm::ValueMap<float>> tkB,
const edm::Handle<edm::ValueMap<float>> tkP,
const edm::Handle<edm::ValueMap<GlobalPoint>> mtdPos)
: tkTime_h(tkT), tkTimeErr_h(tkTE), tkTimeQual_h(tkTQ), tkBeta_h(tkB), tkMtdPos_h(mtdPos) {}
: tkTime_h(tkT), tkTimeErr_h(tkTE), tkBeta_h(tkB), tkPath_h(tkP), tkMtdPos_h(mtdPos) {}
};

virtual void makeCandidates(const Inputs& input,
Expand Down
32 changes: 2 additions & 30 deletions RecoHGCal/TICL/plugins/GeneralInterpretationAlgo.cc
Expand Up @@ -14,8 +14,7 @@ GeneralInterpretationAlgo::GeneralInterpretationAlgo(const edm::ParameterSet &co
del_tk_ts_layer1_(conf.getParameter<double>("delta_tk_ts_layer1")),
del_tk_ts_int_(conf.getParameter<double>("delta_tk_ts_interface")),
del_ts_em_had_(conf.getParameter<double>("delta_ts_em_had")),
del_ts_had_had_(conf.getParameter<double>("delta_ts_had_had")),
timing_quality_threshold_(conf.getParameter<double>("track_time_quality_threshold")) {}
del_ts_had_had_(conf.getParameter<double>("delta_ts_had_had")) {}

void GeneralInterpretationAlgo::initialize(const HGCalDDDConstants *hgcons,
const hgcal::RecHitTools rhtools,
Expand Down Expand Up @@ -155,7 +154,6 @@ bool GeneralInterpretationAlgo::timeAndEnergyCompatible(float &total_raw_energy,
const Trackster &trackster,
const float &tkT,
const float &tkTErr,
const float &tkTimeQual,
const float &tkBeta,
const GlobalPoint &tkMtdPos,
bool useMTDTiming) {
Expand All @@ -167,7 +165,7 @@ bool GeneralInterpretationAlgo::timeAndEnergyCompatible(float &total_raw_energy,

// compatible if trackster time is within 3sigma of
// track time; compatible if either: no time assigned
// to trackster or track time quality is below threshold
// to trackster or track

float tsT = trackster.time();
float tsTErr = trackster.timeError();
Expand Down Expand Up @@ -223,21 +221,12 @@ void GeneralInterpretationAlgo::makeCandidates(const Inputs &input,
// to look for potential linkages in the appropriate tiles
std::vector<std::pair<Vector, unsigned>> trackPColl; // propagated track points and index of track in collection
std::vector<std::pair<Vector, unsigned>> tkPropIntColl; // tracks propagated to lastLayerEE
std::vector<std::pair<Vector, unsigned>> tsPropIntColl; // Tracksters in CE-E, propagated to lastLayerEE
std::vector<std::pair<Vector, unsigned>> tsHadPropIntColl; // Tracksters in CE-H, propagated to lastLayerEE

trackPColl.reserve(tracks.size());
tkPropIntColl.reserve(tracks.size());

std::array<TICLLayerTile, 2> tracksterPropTiles = {}; // all Tracksters, propagated to layer 1
std::array<TICLLayerTile, 2> tsPropIntTiles = {}; // all Tracksters, propagated to lastLayerEE
std::array<TICLLayerTile, 2> tsHadPropIntTiles = {}; // Tracksters in CE-H, propagated to lastLayerEE

// linking : trackster is hadronic if its barycenter is in CE-H
auto isHadron = [&](const Trackster &t) -> bool {
auto boundary_z = rhtools_.getPositionLayer(rhtools_.lastLayerEE()).z();
return (std::abs(t.barycenter().Z()) > boundary_z);
};

if (TICLInterpretationAlgoBase::algo_verbosity_ > VerbosityLevel::Advanced)
LogDebug("GeneralInterpretationAlgo") << "------- Geometric Linking ------- \n";
Expand All @@ -248,8 +237,6 @@ void GeneralInterpretationAlgo::makeCandidates(const Inputs &input,
for (unsigned i = 0; i < tracks.size(); ++i) {
if (!maskTracks.at(i))
continue;
const auto &tk = tracks.at(i);
reco::TrackRef trackref = reco::TrackRef(tkH, i);
candidateTrackIds.push_back(i);
}

Expand Down Expand Up @@ -306,15 +293,7 @@ void GeneralInterpretationAlgo::makeCandidates(const Inputs &input,
tsP = propagateTrackster(t, i, zVal, tsPropIntTiles);
tsAllPropInt.emplace_back(tsP);

if (!isHadron(t)) // EM tracksters
tsPropIntColl.emplace_back(tsP, i);
else { // HAD
tsHadPropIntTiles[(t.barycenter().Z() > 0) ? 1 : 0].fill(tsP.Eta(), tsP.Phi(), i);
tsHadPropIntColl.emplace_back(tsP, i);
}
} // TS
tsPropIntColl.shrink_to_fit();
tsHadPropIntColl.shrink_to_fit();

std::vector<std::vector<unsigned>> tsNearTk(tracks.size());
findTrackstersInWindow(
Expand All @@ -329,8 +308,6 @@ void GeneralInterpretationAlgo::makeCandidates(const Inputs &input,
std::vector<std::vector<unsigned int>> trackstersInTrackIndices;
trackstersInTrackIndices.resize(tracks.size());

resultCandidate.resize(tracks.size(), -1);

std::vector<bool> chargedMask(tracksters.size(), true);
for (unsigned &i : candidateTrackIds) {
if (tsNearTk[i].empty() && tsNearTkAtInt[i].empty()) { // nothing linked to track, make charged hadrons
Expand All @@ -343,13 +320,11 @@ void GeneralInterpretationAlgo::makeCandidates(const Inputs &input,
auto tkRef = reco::TrackRef(tkH, i);
float track_time = 0.f;
float track_timeErr = 0.f;
float track_timeQual = 0.f;
float track_beta = 0.f;
GlobalPoint track_MtdPos{0.f, 0.f, 0.f};
if (useMTDTiming) {
track_time = (*inputTiming.tkTime_h)[tkRef];
track_timeErr = (*inputTiming.tkTimeErr_h)[tkRef];
track_timeQual = (*inputTiming.tkTimeQual_h)[tkRef];
track_beta = (*inputTiming.tkBeta_h)[tkRef];
track_MtdPos = (*inputTiming.tkMtdPos_h)[tkRef];
}
Expand All @@ -360,7 +335,6 @@ void GeneralInterpretationAlgo::makeCandidates(const Inputs &input,
tracksters[tsIdx],
track_time,
track_timeErr,
track_timeQual,
track_beta,
track_MtdPos,
useMTDTiming)) {
Expand All @@ -374,7 +348,6 @@ void GeneralInterpretationAlgo::makeCandidates(const Inputs &input,
tracksters[tsIdx],
track_time,
track_timeErr,
track_timeQual,
track_beta,
track_MtdPos,
useMTDTiming)) {
Expand Down Expand Up @@ -412,6 +385,5 @@ void GeneralInterpretationAlgo::fillPSetDescription(edm::ParameterSetDescription
desc.add<double>("delta_tk_ts_interface", 0.03);
desc.add<double>("delta_ts_em_had", 0.03);
desc.add<double>("delta_ts_had_had", 0.03);
desc.add<double>("track_time_quality_threshold", 0.5);
TICLInterpretationAlgoBase::fillPSetDescription(desc);
}
2 changes: 0 additions & 2 deletions RecoHGCal/TICL/plugins/GeneralInterpretationAlgo.h
Expand Up @@ -51,7 +51,6 @@ namespace ticl {
const Trackster &trackster,
const float &tkTime,
const float &tkTimeErr,
const float &tkTimeQual,
const float &tkBeta,
const GlobalPoint &tkMtdPos,
bool useMTDTiming);
Expand All @@ -63,7 +62,6 @@ namespace ticl {
const float del_ts_em_had_;
const float del_ts_had_had_;

const float timing_quality_threshold_;
const HGCalDDDConstants *hgcons_;

std::unique_ptr<GeomDet> firstDisk_[2];
Expand Down
58 changes: 58 additions & 0 deletions RecoHGCal/TICL/plugins/MergedTrackstersProducer.cc
@@ -0,0 +1,58 @@
// Author: Felice Pantaleo, Wahid Redjeb, Aurora Perego (CERN) - felice.pantaleo@cern.ch, wahid.redjeb@cern.ch, aurora.perego@cern.ch
// Date: 12/2023
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/PluginDescription.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/Utilities/interface/ESGetToken.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "DataFormats/HGCalReco/interface/Trackster.h"

using namespace ticl;

class MergedTrackstersProducer : public edm::stream::EDProducer<> {
public:
explicit MergedTrackstersProducer(const edm::ParameterSet &ps);
~MergedTrackstersProducer() override{};
void produce(edm::Event &, const edm::EventSetup &) override;
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);

private:
edm::EDGetTokenT<std::vector<Trackster>> egamma_tracksters_token_;

edm::EDGetTokenT<std::vector<Trackster>> general_tracksters_token_;
};

MergedTrackstersProducer::MergedTrackstersProducer(const edm::ParameterSet &ps)
: egamma_tracksters_token_(
consumes<std::vector<ticl::Trackster>>(ps.getParameter<edm::InputTag>("egamma_tracksters"))),
general_tracksters_token_(
consumes<std::vector<ticl::Trackster>>(ps.getParameter<edm::InputTag>("had_tracksters"))) {
produces<std::vector<Trackster>>();
}

void MergedTrackstersProducer::produce(edm::Event &evt, const edm::EventSetup &es) {
auto resultTracksters = std::make_unique<std::vector<Trackster>>();
auto const &egamma_tracksters = evt.get(egamma_tracksters_token_);
auto const &had_tracksters = evt.get(general_tracksters_token_);
for (auto const &eg_trackster : egamma_tracksters) {
resultTracksters->push_back(eg_trackster);
}
for (auto const &had_trackster : had_tracksters) {
resultTracksters->push_back(had_trackster);
}

evt.put(std::move(resultTracksters));
}

void MergedTrackstersProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>("egamma_tracksters", edm::InputTag("ticlTrackstersCLUE3DEM"));
desc.add<edm::InputTag>("had_tracksters", edm::InputTag("ticlTrackstersCLUE3DHAD"));
descriptions.add("mergedTrackstersProducer", desc);
}

DEFINE_FWK_MODULE(MergedTrackstersProducer);
2 changes: 1 addition & 1 deletion RecoHGCal/TICL/plugins/PFTICLProducer.cc
Expand Up @@ -167,7 +167,7 @@ void PFTICLProducer::produce(edm::Event& evt, const edm::EventSetup& es) {
// Compute weighted average between HGCAL and MTD timing
const auto invTimeESqHGC = pow(timeEHGC, -2);
const auto invTimeESqMTD = pow(timeEMTD, -2);
timeE = (invTimeESqHGC * invTimeESqMTD) / (invTimeESqHGC + invTimeESqMTD);
timeE = 1.f / (invTimeESqHGC + invTimeESqMTD);
time = (timeHGC * invTimeESqHGC + timeMTD * invTimeESqMTD) * timeE;
timeE = sqrt(timeE);
} else if (timeEMTD > 0) { // Ignore HGCal timing until it will be TOF corrected
Expand Down

0 comments on commit b8666c5

Please sign in to comment.