Skip to content

Commit 9fd2c45

Browse files
authored
Merge pull request #45283 from AuroraPerego/removeTrajectories
TICLv5: do not use trajectories to compute the track path length
2 parents 578bfbf + 3ac2c6c commit 9fd2c45

File tree

3 files changed

+86
-180
lines changed

3 files changed

+86
-180
lines changed

RecoHGCal/TICL/plugins/TICLCandidateProducer.cc

Lines changed: 66 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "FWCore/Framework/interface/ConsumesCollector.h"
1616
#include "DataFormats/Common/interface/OrphanHandle.h"
1717

18-
#include "DataFormats/BeamSpot/interface/BeamSpot.h"
1918
#include "DataFormats/CaloRecHit/interface/CaloCluster.h"
2019
#include "DataFormats/HGCalReco/interface/Common.h"
2120
#include "DataFormats/HGCalReco/interface/MtdHostCollection.h"
@@ -27,6 +26,8 @@
2726
#include "DataFormats/HGCalReco/interface/TICLCandidate.h"
2827
#include "DataFormats/TrackReco/interface/TrackFwd.h"
2928
#include "RecoLocalCalo/HGCalRecAlgos/interface/RecHitTools.h"
29+
#include "DataFormats/GeometryVector/interface/GlobalPoint.h"
30+
#include "DataFormats/GeometryVector/interface/GlobalVector.h"
3031

3132
#include "RecoHGCal/TICL/interface/TICLInterpretationAlgoBase.h"
3233
#include "RecoHGCal/TICL/plugins/TICLInterpretationPluginFactory.h"
@@ -41,9 +42,7 @@
4142
#include "TrackingTools/GeomPropagators/interface/Propagator.h"
4243
#include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
4344
#include "TrackingTools/TrajectoryState/interface/TrajectoryStateClosestToBeamLine.h"
44-
#include "TrackingTools/PatternTools/interface/Trajectory.h"
45-
#include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
46-
#include "TrackingTools/PatternTools/interface/TSCBLBuilderWithPropagator.h"
45+
#include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
4746

4847
#include "MagneticField/Engine/interface/MagneticField.h"
4948
#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
@@ -71,8 +70,7 @@ class TICLCandidateProducer : public edm::stream::EDProducer<> {
7170
template <typename F>
7271
void assignTimeToCandidates(std::vector<TICLCandidate> &resultCandidates,
7372
edm::Handle<std::vector<reco::Track>> track_h,
74-
edm::Handle<MtdHostCollection> inputTiming_h,
75-
TrajTrackAssociationCollection trjtrks,
73+
MtdHostCollection::ConstView &inputTimingView,
7674
F func) const;
7775

7876
std::unique_ptr<TICLInterpretationAlgoBase<reco::Track>> generalInterpretationAlgo_;
@@ -88,7 +86,6 @@ class TICLCandidateProducer : public edm::stream::EDProducer<> {
8886
std::vector<edm::EDGetTokenT<std::vector<float>>> original_masks_tokens_;
8987

9088
const edm::EDGetTokenT<std::vector<reco::Track>> tracks_token_;
91-
const edm::EDGetTokenT<TrajTrackAssociationCollection> trajTrackAssToken_;
9289
edm::EDGetTokenT<MtdHostCollection> inputTimingToken_;
9390

9491
const edm::EDGetTokenT<std::vector<reco::Muon>> muons_token_;
@@ -101,7 +98,7 @@ class TICLCandidateProducer : public edm::stream::EDProducer<> {
10198
const std::string detector_;
10299
const std::string propName_;
103100
const edm::ESGetToken<Propagator, TrackingComponentsRecord> propagator_token_;
104-
const edm::EDGetTokenT<reco::BeamSpot> bsToken_;
101+
const edm::ESGetToken<GlobalTrackingGeometry, GlobalTrackingGeometryRecord> trackingGeometry_token_;
105102

106103
std::once_flag initializeGeometry_;
107104
const HGCalDDDConstants *hgcons_;
@@ -111,15 +108,16 @@ class TICLCandidateProducer : public edm::stream::EDProducer<> {
111108
edm::ESGetToken<HGCalDDDConstants, IdealGeometryRecord> hdc_token_;
112109
edm::ESHandle<MagneticField> bfield_;
113110
edm::ESHandle<Propagator> propagator_;
111+
edm::ESHandle<GlobalTrackingGeometry> trackingGeometry_;
114112
static constexpr float c_light_ = CLHEP::c_light * CLHEP::ns / CLHEP::cm;
113+
static constexpr float timeRes = 0.02f;
115114
};
116115

117116
TICLCandidateProducer::TICLCandidateProducer(const edm::ParameterSet &ps)
118117
: clusters_token_(consumes<std::vector<reco::CaloCluster>>(ps.getParameter<edm::InputTag>("layer_clusters"))),
119118
clustersTime_token_(
120119
consumes<edm::ValueMap<std::pair<float, float>>>(ps.getParameter<edm::InputTag>("layer_clustersTime"))),
121120
tracks_token_(consumes<std::vector<reco::Track>>(ps.getParameter<edm::InputTag>("tracks"))),
122-
trajTrackAssToken_(consumes<TrajTrackAssociationCollection>(ps.getParameter<edm::InputTag>("trjtrkAss"))),
123121
inputTimingToken_(consumes<MtdHostCollection>(ps.getParameter<edm::InputTag>("timingSoA"))),
124122
muons_token_(consumes<std::vector<reco::Muon>>(ps.getParameter<edm::InputTag>("muons"))),
125123
useMTDTiming_(ps.getParameter<bool>("useMTDTiming")),
@@ -131,7 +129,8 @@ TICLCandidateProducer::TICLCandidateProducer(const edm::ParameterSet &ps)
131129
propName_(ps.getParameter<std::string>("propagator")),
132130
propagator_token_(
133131
esConsumes<Propagator, TrackingComponentsRecord, edm::Transition::BeginRun>(edm::ESInputTag("", propName_))),
134-
bsToken_(consumes<reco::BeamSpot>(ps.getParameter<edm::InputTag>("beamspot"))),
132+
trackingGeometry_token_(
133+
esConsumes<GlobalTrackingGeometry, GlobalTrackingGeometryRecord, edm::Transition::BeginRun>()),
135134
cutTk_(ps.getParameter<std::string>("cutTk")) {
136135
// These are the CLUE3DEM Tracksters put in the event by the TracksterLinksProducer with the superclustering algorithm
137136
for (auto const &tag : ps.getParameter<std::vector<edm::InputTag>>("egamma_tracksters_collections")) {
@@ -192,6 +191,8 @@ void TICLCandidateProducer::beginRun(edm::Run const &iEvent, edm::EventSetup con
192191
bfield_ = es.getHandle(bfield_token_);
193192
propagator_ = es.getHandle(propagator_token_);
194193
generalInterpretationAlgo_->initialize(hgcons_, rhtools_, bfield_, propagator_);
194+
195+
trackingGeometry_ = es.getHandle(trackingGeometry_token_);
195196
};
196197

197198
void filterTracks(edm::Handle<std::vector<reco::Track>> tkH,
@@ -238,15 +239,13 @@ void TICLCandidateProducer::produce(edm::Event &evt, const edm::EventSetup &es)
238239
evt.getByToken(tracks_token_, tracks_h);
239240
const auto &tracks = *tracks_h;
240241

241-
const auto &trjtrks = evt.get(trajTrackAssToken_);
242-
243242
edm::Handle<MtdHostCollection> inputTiming_h;
243+
MtdHostCollection::ConstView inputTimingView;
244244
if (useMTDTiming_) {
245245
evt.getByToken(inputTimingToken_, inputTiming_h);
246+
inputTimingView = (*inputTiming_h).const_view();
246247
}
247248

248-
const auto &bs = evt.get(bsToken_);
249-
250249
auto const bFieldProd = bfield_.product();
251250
const Propagator *propagator = propagator_.product();
252251

@@ -348,68 +347,55 @@ void TICLCandidateProducer::produce(edm::Event &evt, const edm::EventSetup &es)
348347
}
349348
}
350349

351-
auto getPathLength =
352-
[&](const reco::Track track, float zVal, const Trajectory &traj, TrajectoryStateClosestToBeamLine &tscbl) {
353-
TrajectoryStateOnSurface stateForProjectionToBeamLineOnSurface =
354-
traj.closestMeasurement(GlobalPoint(bs.x0(), bs.y0(), bs.z0())).updatedState();
350+
auto getPathLength = [&](const reco::Track &track, float zVal) {
351+
const auto &fts_inn = trajectoryStateTransform::innerFreeState(track, bFieldProd);
352+
const auto &fts_out = trajectoryStateTransform::outerFreeState(track, bFieldProd);
353+
const auto &surf_inn = trajectoryStateTransform::innerStateOnSurface(track, *trackingGeometry_, bFieldProd);
354+
const auto &surf_out = trajectoryStateTransform::outerStateOnSurface(track, *trackingGeometry_, bFieldProd);
355355

356-
if (!stateForProjectionToBeamLineOnSurface.isValid()) {
357-
edm::LogError("CannotPropagateToBeamLine")
358-
<< "the state on the closest measurement is not valid. skipping track.";
359-
return 0.f;
360-
}
361-
const FreeTrajectoryState &stateForProjectionToBeamLine = *stateForProjectionToBeamLineOnSurface.freeState();
362-
363-
TSCBLBuilderWithPropagator tscblBuilder(*propagator);
364-
tscbl = tscblBuilder(stateForProjectionToBeamLine, bs);
365-
366-
if (tscbl.isValid()) {
367-
auto const &tscblPCA = tscbl.trackStateAtPCA();
368-
auto const &innSurface = traj.direction() == alongMomentum ? traj.firstMeasurement().updatedState().surface()
369-
: traj.lastMeasurement().updatedState().surface();
370-
auto const &extSurface = traj.direction() == alongMomentum ? traj.lastMeasurement().updatedState().surface()
371-
: traj.firstMeasurement().updatedState().surface();
372-
float pathlength = propagator->propagateWithPath(tscblPCA, innSurface).second;
373-
374-
if (pathlength) {
375-
const auto &fts_inn = trajectoryStateTransform::innerFreeState((track), bFieldProd);
376-
const auto &t_inn_out = propagator->propagateWithPath(fts_inn, extSurface);
377-
378-
if (t_inn_out.first.isValid()) {
379-
pathlength += t_inn_out.second;
380-
381-
std::pair<float, float> rMinMax = hgcons_->rangeR(zVal, true);
382-
383-
int iSide = int(track.eta() > 0);
384-
float zSide = (iSide == 0) ? (-1. * zVal) : zVal;
385-
const auto &disk = std::make_unique<GeomDet>(
386-
Disk::build(Disk::PositionType(0, 0, zSide),
387-
Disk::RotationType(),
388-
SimpleDiskBounds(rMinMax.first, rMinMax.second, zSide - 0.5, zSide + 0.5))
389-
.get());
390-
const auto &fts_out = trajectoryStateTransform::outerFreeState((track), bFieldProd);
391-
const auto &tsos = propagator->propagateWithPath(fts_out, disk->surface());
392-
393-
if (tsos.first.isValid()) {
394-
pathlength += tsos.second;
395-
return pathlength;
396-
}
397-
}
398-
}
356+
Basic3DVector<float> pos(track.referencePoint());
357+
Basic3DVector<float> mom(track.momentum());
358+
FreeTrajectoryState stateAtBeamspot{GlobalPoint(pos), GlobalVector(mom), track.charge(), bFieldProd};
359+
360+
float pathlength = propagator->propagateWithPath(stateAtBeamspot, surf_inn.surface()).second;
361+
362+
if (pathlength) {
363+
const auto &t_inn_out = propagator->propagateWithPath(fts_inn, surf_out.surface());
364+
365+
if (t_inn_out.first.isValid()) {
366+
pathlength += t_inn_out.second;
367+
368+
std::pair<float, float> rMinMax = hgcons_->rangeR(zVal, true);
369+
370+
int iSide = int(track.eta() > 0);
371+
float zSide = (iSide == 0) ? (-1. * zVal) : zVal;
372+
const auto &disk = std::make_unique<GeomDet>(
373+
Disk::build(Disk::PositionType(0, 0, zSide),
374+
Disk::RotationType(),
375+
SimpleDiskBounds(rMinMax.first, rMinMax.second, zSide - 0.5, zSide + 0.5))
376+
.get());
377+
const auto &tsos = propagator->propagateWithPath(fts_out, disk->surface());
378+
379+
if (tsos.first.isValid()) {
380+
pathlength += tsos.second;
381+
return pathlength;
399382
}
400-
return 0.f;
401-
};
383+
}
384+
}
385+
edm::LogWarning("TICLCandidateProducer")
386+
<< "Not able to use the track to compute the path length. A straight line will be used instead.";
387+
return 0.f;
388+
};
402389

403-
assignTimeToCandidates(*resultCandidates, tracks_h, inputTiming_h, trjtrks, getPathLength);
390+
assignTimeToCandidates(*resultCandidates, tracks_h, inputTimingView, getPathLength);
404391

405392
evt.put(std::move(resultCandidates));
406393
}
407394

408395
template <typename F>
409396
void TICLCandidateProducer::assignTimeToCandidates(std::vector<TICLCandidate> &resultCandidates,
410397
edm::Handle<std::vector<reco::Track>> track_h,
411-
edm::Handle<MtdHostCollection> inputTiming_h,
412-
TrajTrackAssociationCollection trjtrks,
398+
MtdHostCollection::ConstView &inputTimingView,
413399
F func) const {
414400
for (auto &cand : resultCandidates) {
415401
float beta = 1;
@@ -426,30 +412,18 @@ void TICLCandidateProducer::assignTimeToCandidates(std::vector<TICLCandidate> &r
426412
auto path = std::sqrt(x * x + y * y + z * z);
427413
if (cand.trackPtr().get() != nullptr) {
428414
const auto &trackIndex = cand.trackPtr().get() - (edm::Ptr<reco::Track>(track_h, 0)).get();
429-
if (useMTDTiming_) {
430-
auto const &inputTimingView = (*inputTiming_h).const_view();
431-
if (inputTimingView.timeErr()[trackIndex] > 0) {
432-
const auto xMtd = inputTimingView.posInMTD_x()[trackIndex];
433-
const auto yMtd = inputTimingView.posInMTD_y()[trackIndex];
434-
const auto zMtd = inputTimingView.posInMTD_z()[trackIndex];
435-
436-
beta = inputTimingView.beta()[trackIndex];
437-
path = std::sqrt((x - xMtd) * (x - xMtd) + (y - yMtd) * (y - yMtd) + (z - zMtd) * (z - zMtd)) +
438-
inputTimingView.pathLength()[trackIndex];
439-
}
415+
if (useMTDTiming_ and inputTimingView.timeErr()[trackIndex] > 0) {
416+
const auto xMtd = inputTimingView.posInMTD_x()[trackIndex];
417+
const auto yMtd = inputTimingView.posInMTD_y()[trackIndex];
418+
const auto zMtd = inputTimingView.posInMTD_z()[trackIndex];
419+
420+
beta = inputTimingView.beta()[trackIndex];
421+
path = std::sqrt((x - xMtd) * (x - xMtd) + (y - yMtd) * (y - yMtd) + (z - zMtd) * (z - zMtd)) +
422+
inputTimingView.pathLength()[trackIndex];
440423
} else {
441-
const auto &trackIndex = cand.trackPtr().get() - (edm::Ptr<reco::Track>(track_h, 0)).get();
442-
for (const auto &trj : trjtrks) {
443-
if (trj.val != edm::Ref<std::vector<reco::Track>>(track_h, trackIndex))
444-
continue;
445-
const Trajectory &traj = *trj.key;
446-
TrajectoryStateClosestToBeamLine tscbl;
447-
448-
float pathLength = func(*(cand.trackPtr().get()), z, traj, tscbl);
449-
if (pathLength) {
450-
path = pathLength;
451-
break;
452-
}
424+
float pathLength = func(*(cand.trackPtr().get()), z);
425+
if (pathLength) {
426+
path = pathLength;
453427
}
454428
}
455429
}
@@ -460,13 +434,14 @@ void TICLCandidateProducer::assignTimeToCandidates(std::vector<TICLCandidate> &r
460434
if (invTimeErr > 0) {
461435
time = time / invTimeErr;
462436
// FIXME_ set a liminf of 0.02 ns on the ts error (based on residuals)
463-
timeErr = sqrt(1.f / invTimeErr) > 0.02 ? sqrt(1.f / invTimeErr) : 0.02;
437+
timeErr = sqrt(1.f / invTimeErr);
438+
if (timeErr < timeRes)
439+
timeErr = timeRes;
464440
cand.setTime(time, timeErr);
465441
}
466442

467443
if (useMTDTiming_ and cand.charge()) {
468444
// Check MTD timing availability
469-
auto const &inputTimingView = (*inputTiming_h).const_view();
470445
const auto &trackIndex = cand.trackPtr().get() - (edm::Ptr<reco::Track>(track_h, 0)).get();
471446
const bool assocQuality = inputTimingView.MVAquality()[trackIndex] > timingQualityThreshold_;
472447
if (assocQuality) {
@@ -507,12 +482,10 @@ void TICLCandidateProducer::fillDescriptions(edm::ConfigurationDescriptions &des
507482
desc.add<edm::InputTag>("layer_clusters", edm::InputTag("hgcalMergeLayerClusters"));
508483
desc.add<edm::InputTag>("layer_clustersTime", edm::InputTag("hgcalMergeLayerClusters", "timeLayerCluster"));
509484
desc.add<edm::InputTag>("tracks", edm::InputTag("generalTracks"));
510-
desc.add<edm::InputTag>("trjtrkAss", edm::InputTag("generalTracks"));
511485
desc.add<edm::InputTag>("timingSoA", edm::InputTag("mtdSoA"));
512486
desc.add<edm::InputTag>("muons", edm::InputTag("muons1stStep"));
513487
desc.add<std::string>("detector", "HGCAL");
514488
desc.add<std::string>("propagator", "PropagatorWithMaterial");
515-
desc.add<edm::InputTag>("beamspot", edm::InputTag("offlineBeamSpot"));
516489
desc.add<bool>("useMTDTiming", true);
517490
desc.add<bool>("useTimingAverage", true);
518491
desc.add<double>("timingQualityThreshold", 0.5);

0 commit comments

Comments
 (0)