CMS 3D CMS Logo

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