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"
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"
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
117116TICLCandidateProducer::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
197198void 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
408395template <typename F>
409396void 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