CMS 3D CMS Logo

LinkingAlgoByDirectionGeometric.cc
Go to the documentation of this file.
1 #include <cmath>
2 #include <string>
4 
7 
9 
11 
13 
14 using namespace ticl;
15 
17  : LinkingAlgoBase(conf),
18  del_tk_ts_layer1_(conf.getParameter<double>("delta_tk_ts_layer1")),
19  del_tk_ts_int_(conf.getParameter<double>("delta_tk_ts_interface")),
20  del_ts_em_had_(conf.getParameter<double>("delta_ts_em_had")),
21  del_ts_had_had_(conf.getParameter<double>("delta_ts_had_had")),
22  timing_quality_threshold_(conf.getParameter<double>("track_time_quality_threshold")),
23  cutTk_(conf.getParameter<std::string>("cutTk")) {}
24 
26 
28  const hgcal::RecHitTools rhtools,
29  const edm::ESHandle<MagneticField> bfieldH,
30  const edm::ESHandle<Propagator> propH) {
31  hgcons_ = hgcons;
32  rhtools_ = rhtools;
33  buildLayers();
34 
35  bfield_ = bfieldH;
36  propagator_ = propH;
37 }
38 
40  const unsigned idx,
41  float zVal,
42  std::array<TICLLayerTile, 2> &tracksterTiles) {
43  // needs only the positive Z co-ordinate of the surface to propagate to
44  // the correct sign is calculated inside according to the barycenter of trackster
45  Vector const &baryc = t.barycenter();
46  Vector directnv = t.eigenvectors(0);
47 
48  // barycenter as direction for tracksters w/ poor PCA
49  // propagation still done to get the cartesian coords
50  // which are anyway converted to eta, phi in linking
51  // -> can be simplified later
52 
53  //FP: disable PCA propagation for the moment and fallback to barycenter position
54  // if (t.eigenvalues()[0] / t.eigenvalues()[1] < 20)
55  directnv = baryc.unit();
56 
57  zVal *= (baryc.Z() > 0) ? 1 : -1;
58 
59  float par = (zVal - baryc.Z()) / directnv.Z();
60  float xOnSurface = par * directnv.X() + baryc.X();
61  float yOnSurface = par * directnv.Y() + baryc.Y();
62  Vector tPoint(xOnSurface, yOnSurface, zVal);
63  if (tPoint.Eta() > 0)
64  tracksterTiles[1].fill(tPoint.Eta(), tPoint.Phi(), idx);
65 
66  else if (tPoint.Eta() < 0)
67  tracksterTiles[0].fill(tPoint.Eta(), tPoint.Phi(), idx);
68 
69  return tPoint;
70 }
71 
73  const std::vector<std::pair<Vector, unsigned>> &seedingCollection,
74  const std::array<TICLLayerTile, 2> &tracksterTiles,
75  const std::vector<Vector> &tracksterPropPoints,
76  float delta,
77  unsigned trackstersSize,
78  std::vector<std::vector<unsigned>> &resultCollection,
79  bool useMask = false) {
80  // Finds tracksters in tracksterTiles within an eta-phi window
81  // (given by delta) of the objects (track/trackster) in the seedingCollection.
82  // Element i in resultCollection is the vector of trackster
83  // indices found close to the i-th object in the seedingCollection.
84  // If specified, Tracksters are masked once found as close to an object.
85  std::vector<int> mask(trackstersSize, 0);
86  float delta2 = delta * delta;
87 
88  for (auto &i : seedingCollection) {
89  float seed_eta = i.first.Eta();
90  float seed_phi = i.first.Phi();
91  unsigned seedId = i.second;
92  auto sideZ = seed_eta > 0; //forward or backward region
93  const TICLLayerTile &tile = tracksterTiles[sideZ];
94  float eta_min = std::max(abs(seed_eta) - delta, (float)TileConstants::minEta);
95  float eta_max = std::min(abs(seed_eta) + delta, (float)TileConstants::maxEta);
96 
97  // get range of bins touched by delta
98  std::array<int, 4> search_box = tile.searchBoxEtaPhi(eta_min, eta_max, seed_phi - delta, seed_phi + delta);
99 
100  std::vector<unsigned> in_delta;
101  std::vector<float> distances2;
102  for (int eta_i = search_box[0]; eta_i <= search_box[1]; ++eta_i) {
103  for (int phi_i = search_box[2]; phi_i <= search_box[3]; ++phi_i) {
104  const auto &in_tile = tile[tile.globalBin(eta_i, (phi_i % TileConstants::nPhiBins))];
105  for (const unsigned &t_i : in_tile) {
106  // calculate actual distances of tracksters to the seed for a more accurate cut
107  auto sep2 = (tracksterPropPoints[t_i].Eta() - seed_eta) * (tracksterPropPoints[t_i].Eta() - seed_eta) +
108  (tracksterPropPoints[t_i].Phi() - seed_phi) * (tracksterPropPoints[t_i].Phi() - seed_phi);
109  if (sep2 < delta2) {
110  in_delta.push_back(t_i);
111  distances2.push_back(sep2);
112  }
113  }
114  }
115  }
116 
117  // sort tracksters found in ascending order of their distances from the seed
118  std::vector<unsigned> indices(in_delta.size());
119  std::iota(indices.begin(), indices.end(), 0);
120  std::sort(indices.begin(), indices.end(), [&](unsigned i, unsigned j) { return distances2[i] < distances2[j]; });
121 
122  // push back sorted tracksters in the result collection
123  for (const unsigned &index : indices) {
124  const auto &t_i = in_delta[index];
125  if (!mask[t_i]) {
126  resultCollection[seedId].push_back(t_i);
127  if (useMask)
128  mask[t_i] = 1;
129  }
130  }
131 
132  } // seeding collection loop
133 }
134 
136  const reco::Track &track,
137  const Trackster &trackster,
138  const float &tkT,
139  const float &tkTErr,
140  const float &tkTimeQual) {
141  float threshold = std::min(0.2 * trackster.raw_energy(), 10.0);
142 
143  bool energyCompatible = (total_raw_energy + trackster.raw_energy() < track.p() + threshold);
144  // compatible if trackster time is within 3sigma of
145  // track time; compatible if either: no time assigned
146  // to trackster or track time quality is below threshold
147  float tsT = trackster.time();
148  float tsTErr = trackster.timeError();
149 
150  bool timeCompatible = false;
151 
152  if (tsT == -99. or tkTimeQual < timing_quality_threshold_)
153  timeCompatible = true;
154  else {
155  timeCompatible = (std::abs(tsT - tkT) < maxDeltaT_ * sqrt(tsTErr * tsTErr + tkTErr * tkTErr));
156  }
157 
159  if (!(energyCompatible))
160  LogDebug("LinkingAlgoByDirectionGeometric")
161  << "energy incompatible : track p " << track.p() << " trackster energy " << trackster.raw_energy() << "\n";
162  if (!(timeCompatible))
163  LogDebug("LinkingAlgoByDirectionGeometric") << "time incompatible : track time " << tkT << " +/- " << tkTErr
164  << " trackster time " << tsT << " +/- " << tsTErr << "\n";
165  }
166  return energyCompatible && timeCompatible;
167 }
168 
169 void LinkingAlgoByDirectionGeometric::recordTrackster(const unsigned ts, //trackster index
170  const std::vector<Trackster> &tracksters,
171  const edm::Handle<std::vector<Trackster>> tsH,
172  std::vector<unsigned> &ts_mask,
173  float &energy_in_candidate,
174  TICLCandidate &candidate) {
175  if (ts_mask[ts])
176  return;
177  candidate.addTrackster(edm::Ptr<Trackster>(tsH, ts));
178  ts_mask[ts] = 1;
179  energy_in_candidate += tracksters[ts].raw_energy();
180 }
181 
182 void LinkingAlgoByDirectionGeometric::dumpLinksFound(std::vector<std::vector<unsigned>> &resultCollection,
183  const char *label) const {
184 #ifdef EDM_ML_DEBUG
186  return;
187 
188  LogDebug("LinkingAlgoByDirectionGeometric") << "All links found - " << label << "\n";
189  LogDebug("LinkingAlgoByDirectionGeometric") << "(seed can either be a track or trackster depending on the step)\n";
190  for (unsigned i = 0; i < resultCollection.size(); ++i) {
191  LogDebug("LinkingAlgoByDirectionGeometric") << "seed " << i << " - tracksters : ";
192  const auto &links = resultCollection[i];
193  for (unsigned j = 0; j < links.size(); ++j) {
194  LogDebug("LinkingAlgoByDirectionGeometric") << j;
195  }
196  LogDebug("LinkingAlgoByDirectionGeometric") << "\n";
197  }
198 #endif // EDM_ML_DEBUG
199 }
200 
202  // build disks at HGCal front & EM-Had interface for track propagation
203 
204  float zVal = hgcons_->waferZ(1, true);
205  std::pair<float, float> rMinMax = hgcons_->rangeR(zVal, true);
206 
207  float zVal_interface = rhtools_.getPositionLayer(rhtools_.lastLayerEE()).z();
208  std::pair<float, float> rMinMax_interface = hgcons_->rangeR(zVal_interface, true);
209 
210  for (int iSide = 0; iSide < 2; ++iSide) {
211  float zSide = (iSide == 0) ? (-1. * zVal) : zVal;
212  firstDisk_[iSide] =
213  std::make_unique<GeomDet>(Disk::build(Disk::PositionType(0, 0, zSide),
215  SimpleDiskBounds(rMinMax.first, rMinMax.second, zSide - 0.5, zSide + 0.5))
216  .get());
217 
218  zSide = (iSide == 0) ? (-1. * zVal_interface) : zVal_interface;
219  interfaceDisk_[iSide] = std::make_unique<GeomDet>(
220  Disk::build(Disk::PositionType(0, 0, zSide),
222  SimpleDiskBounds(rMinMax_interface.first, rMinMax_interface.second, zSide - 0.5, zSide + 0.5))
223  .get());
224  }
225 }
226 
227 void LinkingAlgoByDirectionGeometric::linkTracksters(const edm::Handle<std::vector<reco::Track>> tkH,
228  const edm::ValueMap<float> &tkTime,
229  const edm::ValueMap<float> &tkTimeErr,
230  const edm::ValueMap<float> &tkTimeQual,
231  const std::vector<reco::Muon> &muons,
232  const edm::Handle<std::vector<Trackster>> tsH,
233  std::vector<TICLCandidate> &resultLinked,
234  std::vector<TICLCandidate> &chargedHadronsFromTk) {
235  const auto &tracks = *tkH;
236  const auto &tracksters = *tsH;
237 
238  auto bFieldProd = bfield_.product();
239  const Propagator &prop = (*propagator_);
240 
241  // propagated point collections
242  // elements in the propagated points collecions are used
243  // to look for potential linkages in the appropriate tiles
244  std::vector<std::pair<Vector, unsigned>> trackPColl; // propagated track points and index of track in collection
245  std::vector<std::pair<Vector, unsigned>> tkPropIntColl; // tracks propagated to lastLayerEE
246  std::vector<std::pair<Vector, unsigned>> tsPropIntColl; // Tracksters in CE-E, propagated to lastLayerEE
247  std::vector<std::pair<Vector, unsigned>> tsHadPropIntColl; // Tracksters in CE-H, propagated to lastLayerEE
248  trackPColl.reserve(tracks.size());
249  tkPropIntColl.reserve(tracks.size());
250  tsPropIntColl.reserve(tracksters.size());
251  tsHadPropIntColl.reserve(tracksters.size());
252  // tiles, element 0 is bw, 1 is fw
253  std::array<TICLLayerTile, 2> tracksterPropTiles = {}; // all Tracksters, propagated to layer 1
254  std::array<TICLLayerTile, 2> tsPropIntTiles = {}; // all Tracksters, propagated to lastLayerEE
255  std::array<TICLLayerTile, 2> tsHadPropIntTiles = {}; // Tracksters in CE-H, propagated to lastLayerEE
256 
257  // linking : trackster is hadronic if its barycenter is in CE-H
258  auto isHadron = [&](const Trackster &t) -> bool {
259  auto boundary_z = rhtools_.getPositionLayer(rhtools_.lastLayerEE()).z();
260  return (std::abs(t.barycenter().Z()) > boundary_z);
261  };
262 
264  LogDebug("LinkingAlgoByDirectionGeometric") << "------- Geometric Linking ------- \n";
265 
266  // Propagate tracks
267  std::vector<unsigned> candidateTrackIds;
268  candidateTrackIds.reserve(tracks.size());
269  for (unsigned i = 0; i < tracks.size(); ++i) {
270  const auto &tk = tracks[i];
271  reco::TrackRef trackref = reco::TrackRef(tkH, i);
272 
273  // veto tracks associated to muons
274  int muId = PFMuonAlgo::muAssocToTrack(trackref, muons);
275 
277  LogDebug("LinkingAlgoByDirectionGeometric")
278  << "track " << i << " - eta " << tk.eta() << " phi " << tk.phi() << " time " << tkTime[reco::TrackRef(tkH, i)]
279  << " time qual " << tkTimeQual[reco::TrackRef(tkH, i)] << " muid " << muId << "\n";
280 
281  if (!cutTk_((tk)) or muId != -1)
282  continue;
283 
284  // record tracks that can be used to make a ticlcandidate
285  candidateTrackIds.push_back(i);
286 
287  // don't consider tracks below 2 GeV for linking
288  if (std::sqrt(tk.p() * tk.p() + ticl::mpion2) < tkEnergyCut_)
289  continue;
290 
291  int iSide = int(tk.eta() > 0);
292  const auto &fts = trajectoryStateTransform::outerFreeState((tk), bFieldProd);
293  // to the HGCal front
294  const auto &tsos = prop.propagate(fts, firstDisk_[iSide]->surface());
295  if (tsos.isValid()) {
296  Vector trackP(tsos.globalPosition().x(), tsos.globalPosition().y(), tsos.globalPosition().z());
297  trackPColl.emplace_back(trackP, i);
298  }
299  // to lastLayerEE
300  const auto &tsos_int = prop.propagate(fts, interfaceDisk_[iSide]->surface());
301  if (tsos_int.isValid()) {
302  Vector trackP(tsos_int.globalPosition().x(), tsos_int.globalPosition().y(), tsos_int.globalPosition().z());
303  tkPropIntColl.emplace_back(trackP, i);
304  }
305  } // Tracks
306  tkPropIntColl.shrink_to_fit();
307  trackPColl.shrink_to_fit();
308  candidateTrackIds.shrink_to_fit();
309 
310  // Propagate tracksters
311 
312  // Record postions of all tracksters propagated to layer 1 and lastLayerEE,
313  // to be used later for distance calculation in the link finding stage
314  // indexed by trackster index in event collection
315  std::vector<Vector> tsAllProp;
316  std::vector<Vector> tsAllPropInt;
317  tsAllProp.reserve(tracksters.size());
318  tsAllPropInt.reserve(tracksters.size());
319 
320  for (unsigned i = 0; i < tracksters.size(); ++i) {
321  const auto &t = tracksters[i];
323  LogDebug("LinkingAlgoByDirectionGeometric")
324  << "trackster " << i << " - eta " << t.barycenter().eta() << " phi " << t.barycenter().phi() << " time "
325  << t.time() << " energy " << t.raw_energy() << "\n";
326 
327  // to HGCal front
328  float zVal = hgcons_->waferZ(1, true);
329  auto tsP = propagateTrackster(t, i, zVal, tracksterPropTiles);
330  tsAllProp.emplace_back(tsP);
331 
332  // to lastLayerEE
334  tsP = propagateTrackster(t, i, zVal, tsPropIntTiles);
335  tsAllPropInt.emplace_back(tsP);
336 
337  if (!isHadron(t)) // EM tracksters
338  tsPropIntColl.emplace_back(tsP, i);
339  else { // HAD
340  tsHadPropIntTiles[(t.barycenter().Z() > 0) ? 1 : 0].fill(tsP.Eta(), tsP.Phi(), i);
341  tsHadPropIntColl.emplace_back(tsP, i);
342  }
343  } // TS
344  tsPropIntColl.shrink_to_fit();
345  tsHadPropIntColl.shrink_to_fit();
346 
347  // Track - Trackster link finding
348  // step 3: tracks -> all tracksters, at layer 1
349 
350  std::vector<std::vector<unsigned>> tsNearTk(tracks.size());
351  findTrackstersInWindow(trackPColl, tracksterPropTiles, tsAllProp, del_tk_ts_layer1_, tracksters.size(), tsNearTk);
352 
353  // step 4: tracks -> all tracksters, at lastLayerEE
354 
355  std::vector<std::vector<unsigned>> tsNearTkAtInt(tracks.size());
356  findTrackstersInWindow(tkPropIntColl, tsPropIntTiles, tsAllPropInt, del_tk_ts_int_, tracksters.size(), tsNearTkAtInt);
357 
358  // Trackster - Trackster link finding
359  // step 2: tracksters EM -> HAD, at lastLayerEE
360 
361  std::vector<std::vector<unsigned>> tsNearAtInt(tracksters.size());
363  tsPropIntColl, tsHadPropIntTiles, tsAllPropInt, del_ts_em_had_, tracksters.size(), tsNearAtInt);
364 
365  // step 1: tracksters HAD -> HAD, at lastLayerEE
366 
367  std::vector<std::vector<unsigned>> tsHadNearAtInt(tracksters.size());
369  tsHadPropIntColl, tsHadPropIntTiles, tsAllPropInt, del_ts_had_had_, tracksters.size(), tsHadNearAtInt);
370 
371 #ifdef EDM_ML_DEBUG
372  dumpLinksFound(tsNearTk, "track -> tracksters at layer 1");
373  dumpLinksFound(tsNearTkAtInt, "track -> tracksters at lastLayerEE");
374  dumpLinksFound(tsNearAtInt, "EM -> HAD tracksters at lastLayerEE");
375  dumpLinksFound(tsHadNearAtInt, "HAD -> HAD tracksters at lastLayerEE");
376 #endif //EDM_ML_DEBUG
377 
378  // make final collections
379 
380  std::vector<TICLCandidate> chargedCandidates;
381  std::vector<unsigned int> chargedMask(tracksters.size(), 0);
382  for (unsigned &i : candidateTrackIds) {
383  if (tsNearTk[i].empty() && tsNearTkAtInt[i].empty()) { // nothing linked to track, make charged hadrons
384  TICLCandidate chargedHad;
385  chargedHad.setTrackPtr(edm::Ptr<reco::Track>(tkH, i));
386  chargedHadronsFromTk.push_back(chargedHad);
387  continue;
388  }
389 
390  TICLCandidate chargedCandidate;
391  float total_raw_energy = 0.;
392 
393  auto tkRef = reco::TrackRef(tkH, i);
394  auto track_time = tkTime[tkRef];
395  auto track_timeErr = tkTimeErr[tkRef];
396  auto track_timeQual = tkTimeQual[tkRef];
397 
398  for (const unsigned ts3_idx : tsNearTk[i]) { // tk -> ts
400  total_raw_energy, tracks[i], tracksters[ts3_idx], track_time, track_timeErr, track_timeQual)) {
401  recordTrackster(ts3_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
402  }
403  for (const unsigned ts2_idx : tsNearAtInt[ts3_idx]) { // ts_EM -> ts_HAD
405  total_raw_energy, tracks[i], tracksters[ts2_idx], track_time, track_timeErr, track_timeQual)) {
406  recordTrackster(ts2_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
407  }
408  for (const unsigned ts1_idx : tsHadNearAtInt[ts2_idx]) { // ts_HAD -> ts_HAD
410  total_raw_energy, tracks[i], tracksters[ts1_idx], track_time, track_timeErr, track_timeQual)) {
411  recordTrackster(ts1_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
412  }
413  }
414  }
415  for (const unsigned ts1_idx : tsHadNearAtInt[ts3_idx]) { // ts_HAD -> ts_HAD
417  total_raw_energy, tracks[i], tracksters[ts1_idx], track_time, track_timeErr, track_timeQual)) {
418  recordTrackster(ts1_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
419  }
420  }
421  }
422  for (const unsigned ts4_idx : tsNearTkAtInt[i]) { // do the same for tk -> ts links at the interface
424  total_raw_energy, tracks[i], tracksters[ts4_idx], track_time, track_timeErr, track_timeQual)) {
425  recordTrackster(ts4_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
426  }
427  for (const unsigned ts2_idx : tsNearAtInt[ts4_idx]) {
429  total_raw_energy, tracks[i], tracksters[ts2_idx], track_time, track_timeErr, track_timeQual)) {
430  recordTrackster(ts2_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
431  }
432  for (const unsigned ts1_idx : tsHadNearAtInt[ts2_idx]) {
434  total_raw_energy, tracks[i], tracksters[ts1_idx], track_time, track_timeErr, track_timeQual)) {
435  recordTrackster(ts1_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
436  }
437  }
438  }
439  for (const unsigned ts1_idx : tsHadNearAtInt[ts4_idx]) {
441  total_raw_energy, tracks[i], tracksters[ts1_idx], track_time, track_timeErr, track_timeQual)) {
442  recordTrackster(ts1_idx, tracksters, tsH, chargedMask, total_raw_energy, chargedCandidate);
443  }
444  }
445  }
446 
447  // do not create a candidate if no tracksters were added to candidate
448  // can happen if all the tracksters linked to that track were already masked
449  if (!chargedCandidate.tracksters().empty()) {
450  chargedCandidate.setTrackPtr(edm::Ptr<reco::Track>(tkH, i));
451  chargedCandidates.push_back(chargedCandidate);
452  } else { // create charged hadron
453  TICLCandidate chargedHad;
454  chargedHad.setTrackPtr(edm::Ptr<reco::Track>(tkH, i));
455  chargedHadronsFromTk.push_back(chargedHad);
456  }
457  }
458 
459  std::vector<TICLCandidate> neutralCandidates;
460  std::vector<int> neutralMask(tracksters.size(), 0);
461  for (unsigned i = 0; i < tracksters.size(); ++i) {
462  if (chargedMask[i])
463  continue;
464 
465  TICLCandidate neutralCandidate;
466  if (tsNearAtInt[i].empty() && tsHadNearAtInt[i].empty() && !neutralMask[i]) { // nothing linked to this ts
467  neutralCandidate.addTrackster(edm::Ptr<Trackster>(tsH, i));
468  neutralMask[i] = 1;
469  neutralCandidates.push_back(neutralCandidate);
470  continue;
471  }
472  if (!neutralMask[i]) {
473  neutralCandidate.addTrackster(edm::Ptr<Trackster>(tsH, i));
474  neutralMask[i] = 1;
475  }
476  for (const unsigned ts2_idx : tsNearAtInt[i]) {
477  if (chargedMask[ts2_idx])
478  continue;
479  if (!neutralMask[ts2_idx]) {
480  neutralCandidate.addTrackster(edm::Ptr<Trackster>(tsH, ts2_idx));
481  neutralMask[ts2_idx] = 1;
482  }
483  for (const unsigned ts1_idx : tsHadNearAtInt[ts2_idx]) {
484  if (chargedMask[ts1_idx])
485  continue;
486  if (!neutralMask[ts1_idx]) {
487  neutralCandidate.addTrackster(edm::Ptr<Trackster>(tsH, ts1_idx));
488  neutralMask[ts1_idx] = 1;
489  }
490  }
491  }
492  for (const unsigned ts1_idx : tsHadNearAtInt[i]) {
493  if (chargedMask[ts1_idx])
494  continue;
495  if (!neutralMask[ts1_idx]) {
496  neutralCandidate.addTrackster(edm::Ptr<Trackster>(tsH, ts1_idx));
497  neutralMask[ts1_idx] = 1;
498  }
499  }
500  // filter empty candidates
501  if (!neutralCandidate.tracksters().empty()) {
502  neutralCandidates.push_back(neutralCandidate);
503  }
504  }
505 
506  resultLinked.insert(std::end(resultLinked), std::begin(neutralCandidates), std::end(neutralCandidates));
507  resultLinked.insert(std::end(resultLinked), std::begin(chargedCandidates), std::end(chargedCandidates));
508 
509 } // linkTracksters
510 
512  desc.add<std::string>("cutTk",
513  "1.48 < abs(eta) < 3.0 && pt > 1. && quality(\"highPurity\") && "
514  "hitPattern().numberOfLostHits(\"MISSING_OUTER_HITS\") < 5");
515  desc.add<double>("delta_tk_ts_layer1", 0.02);
516  desc.add<double>("delta_tk_ts_interface", 0.03);
517  desc.add<double>("delta_ts_em_had", 0.03);
518  desc.add<double>("delta_ts_had_had", 0.03);
519  desc.add<double>("track_time_quality_threshold", 0.5);
521 }
double waferZ(int layer, bool reco) const
static DiskPointer build(Args &&... args)
Definition: BoundDisk.h:38
static int muAssocToTrack(const reco::TrackRef &trackref, const reco::MuonCollection &muons)
Definition: PFMuonAlgo.cc:479
void linkTracksters(const edm::Handle< std::vector< reco::Track >>, const edm::ValueMap< float > &, const edm::ValueMap< float > &, const edm::ValueMap< float > &, const std::vector< reco::Muon > &, const edm::Handle< std::vector< Trackster >>, std::vector< TICLCandidate > &, std::vector< TICLCandidate > &) override
math::XYZVector propagateTrackster(const Trackster &t, const unsigned idx, float zVal, std::array< TICLLayerTile, 2 > &tracksterTiles)
static constexpr int nPhiBins
Definition: Common.h:13
bool timeAndEnergyCompatible(float &total_raw_energy, const reco::Track &track, const Trackster &trackster, const float &tkTime, const float &tkTimeErr, const float &tkTimeQual)
static constexpr float maxEta
Definition: Common.h:11
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
static void fillPSetDescription(edm::ParameterSetDescription &desc)
constexpr uint32_t mask
Definition: gpuClustering.h:26
const float timeError() const
Definition: Trackster.h:128
char const * label
T const * product() const
Definition: ESHandle.h:86
const StringCutObjectSelector< reco::Track > cutTk_
void recordTrackster(const unsigned ts, const std::vector< Trackster > &tracksters, const edm::Handle< std::vector< Trackster >> tsH, std::vector< unsigned > &ts_mask, float &energy_in_candidate, TICLCandidate &candidate)
const float raw_energy() const
Definition: Trackster.h:130
T sqrt(T t)
Definition: SSEVec.h:19
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
void initialize(const HGCalDDDConstants *hgcons, const hgcal::RecHitTools rhtools, const edm::ESHandle< MagneticField > bfieldH, const edm::ESHandle< Propagator > propH) override
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static void fillPSetDescription(edm::ParameterSetDescription &desc)
static constexpr float minEta
Definition: Common.h:10
std::pair< double, double > rangeR(double z, bool reco) const
LinkingAlgoByDirectionGeometric(const edm::ParameterSet &conf)
void dumpLinksFound(std::vector< std::vector< unsigned >> &resultCollection, const char *label) const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
GlobalPoint getPositionLayer(int layer, bool nose=false) const
Definition: RecHitTools.cc:141
void findTrackstersInWindow(const std::vector< std::pair< Vector, unsigned >> &seedingCollection, const std::array< TICLLayerTile, 2 > &tracksterTiles, const std::vector< Vector > &tracksterPropPoints, float delta, unsigned trackstersSize, std::vector< std::vector< unsigned >> &resultCollection, bool useMask)
constexpr float mpion2
Definition: commons.h:12
void addTrackster(const edm::Ptr< ticl::Trackster > &trackster)
Definition: TICLCandidate.h:45
const float time() const
Definition: Trackster.h:127
Definition: Common.h:8
const std::vector< edm::Ptr< ticl::Trackster > > tracksters() const
Definition: TICLCandidate.h:42
FreeTrajectoryState outerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
void setTrackPtr(const edm::Ptr< reco::Track > &trackPtr)
Definition: TICLCandidate.h:37
unsigned int lastLayerEE(bool nose=false) const
Definition: RecHitTools.h:75
#define LogDebug(id)