CMS 3D CMS Logo

TrackingNtuple.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: NtupleDump/TrackingNtuple
4 // Class: TrackingNtuple
5 //
13 //
14 // Original Author: Giuseppe Cerati
15 // Created: Tue, 25 Aug 2015 13:22:49 GMT
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 
22 // user include files
25 
35 
38 
42 
46 
53 
56 
63 
68 
71 
82 
85 
87 #include "HepPDT/ParticleID.hh"
88 
90 
92 
93 #include <set>
94 #include <map>
95 #include <unordered_set>
96 #include <unordered_map>
97 #include <tuple>
98 #include <utility>
99 
100 #include "TTree.h"
101 
102 /*
103 todo:
104 add refitted hit position after track/seed fit
105 add local angle, path length!
106 */
107 
108 namespace {
109  // This pattern is copied from QuickTrackAssociatorByHitsImpl. If
110  // further needs arises, it wouldn't hurt to abstract it somehow.
111  using TrackingParticleRefKeyToIndex = std::unordered_map<reco::RecoToSimCollection::index_type, size_t>;
112  using TrackingVertexRefKeyToIndex = TrackingParticleRefKeyToIndex;
113  using SimHitFullKey = std::pair<TrackPSimHitRef::key_type, edm::ProductID>;
114  using SimHitRefKeyToIndex = std::map<SimHitFullKey, size_t>;
115  using TrackingParticleRefKeyToCount = TrackingParticleRefKeyToIndex;
116 
117  std::string subdetstring(int subdet) {
118  switch (subdet) {
120  return "- TIB";
122  return "- TOB";
124  return "- TEC";
126  return "- TID";
128  return "- PixBar";
130  return "- PixFwd";
131  default:
132  return "UNKNOWN TRACKER HIT TYPE";
133  }
134  }
135 
136  struct ProductIDSetPrinter {
137  ProductIDSetPrinter(const std::set<edm::ProductID>& set) : set_(set) {}
138 
139  void print(std::ostream& os) const {
140  for (const auto& item : set_) {
141  os << item << " ";
142  }
143  }
144 
145  const std::set<edm::ProductID>& set_;
146  };
147  std::ostream& operator<<(std::ostream& os, const ProductIDSetPrinter& o) {
148  o.print(os);
149  return os;
150  }
151  template <typename T>
152  struct ProductIDMapPrinter {
153  ProductIDMapPrinter(const std::map<edm::ProductID, T>& map) : map_(map) {}
154 
155  void print(std::ostream& os) const {
156  for (const auto& item : map_) {
157  os << item.first << " ";
158  }
159  }
160 
161  const std::map<edm::ProductID, T>& map_;
162  };
163  template <typename T>
164  auto make_ProductIDMapPrinter(const std::map<edm::ProductID, T>& map) {
165  return ProductIDMapPrinter<T>(map);
166  }
167  template <typename T>
168  std::ostream& operator<<(std::ostream& os, const ProductIDMapPrinter<T>& o) {
169  o.print(os);
170  return os;
171  }
172 
173  template <typename T>
174  struct VectorPrinter {
175  VectorPrinter(const std::vector<T>& vec) : vec_(vec) {}
176 
177  void print(std::ostream& os) const {
178  for (const auto& item : vec_) {
179  os << item << " ";
180  }
181  }
182 
183  const std::vector<T>& vec_;
184  };
185  template <typename T>
186  auto make_VectorPrinter(const std::vector<T>& vec) {
187  return VectorPrinter<T>(vec);
188  }
189  template <typename T>
190  std::ostream& operator<<(std::ostream& os, const VectorPrinter<T>& o) {
191  o.print(os);
192  return os;
193  }
194 
195  void checkProductID(const std::set<edm::ProductID>& set, const edm::ProductID& id, const char* name) {
196  if (set.find(id) == set.end())
197  throw cms::Exception("Configuration")
198  << "Got " << name << " with a hit with ProductID " << id
199  << " which does not match to the set of ProductID's for the hits: " << ProductIDSetPrinter(set)
200  << ". Usually this is caused by a wrong hit collection in the configuration.";
201  }
202 
203  template <typename SimLink, typename Func>
204  void forEachMatchedSimLink(const edm::DetSet<SimLink>& digiSimLinks, uint32_t channel, Func func) {
205  for (const auto& link : digiSimLinks) {
206  if (link.channel() == channel) {
207  func(link);
208  }
209  }
210  }
211 
213  template <typename... Args>
214  void call_nop(Args&&... args) {}
215 
216  template <typename... Types>
217  class CombineDetId {
218  public:
219  CombineDetId() {}
220 
223  unsigned int operator[](size_t i) const { return std::get<0>(content_)[i]; }
224 
225  template <typename... Args>
226  void book(Args&&... args) {
227  impl([&](auto& vec) { vec.book(std::forward<Args>(args)...); });
228  }
229 
230  template <typename... Args>
231  void push_back(Args&&... args) {
232  impl([&](auto& vec) { vec.push_back(std::forward<Args>(args)...); });
233  }
234 
235  template <typename... Args>
236  void resize(Args&&... args) {
237  impl([&](auto& vec) { vec.resize(std::forward<Args>(args)...); });
238  }
239 
240  template <typename... Args>
241  void set(Args&&... args) {
242  impl([&](auto& vec) { vec.set(std::forward<Args>(args)...); });
243  }
244 
245  void clear() {
246  impl([&](auto& vec) { vec.clear(); });
247  }
248 
249  private:
250  // Trick to not repeate std::index_sequence_for in each of the methods above
251  template <typename F>
252  void impl(F&& func) {
253  impl2(std::index_sequence_for<Types...>{}, std::forward<F>(func));
254  }
255 
256  // Trick to exploit parameter pack expansion in function call
257  // arguments to call a member function for each tuple element
258  // (with the same signature). The comma operator is needed to
259  // return a value from the expression as an argument for the
260  // call_nop.
261  template <std::size_t... Is, typename F>
262  void impl2(std::index_sequence<Is...>, F&& func) {
263  call_nop((func(std::get<Is>(content_)), 0)...);
264  }
265 
266  std::tuple<Types...> content_;
267  };
268 
269  std::map<unsigned int, double> chargeFraction(const SiPixelCluster& cluster,
270  const DetId& detId,
271  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink) {
272  std::map<unsigned int, double> simTrackIdToAdc;
273 
274  auto idetset = digiSimLink.find(detId);
275  if (idetset == digiSimLink.end())
276  return simTrackIdToAdc;
277 
278  double adcSum = 0;
280  for (int iPix = 0; iPix != cluster.size(); ++iPix) {
281  const SiPixelCluster::Pixel& pixel = cluster.pixel(iPix);
282  adcSum += pixel.adc;
283  uint32_t channel = PixelChannelIdentifier::pixelToChannel(pixel.x, pixel.y);
284  forEachMatchedSimLink(*idetset, channel, [&](const PixelDigiSimLink& simLink) {
285  double& adc = simTrackIdToAdc[simLink.SimTrackId()];
286  adc += pixel.adc * simLink.fraction();
287  });
288  }
289 
290  for (auto& pair : simTrackIdToAdc) {
291  if (adcSum == 0.)
292  pair.second = 0.;
293  else
294  pair.second /= adcSum;
295  }
296 
297  return simTrackIdToAdc;
298  }
299 
300  std::map<unsigned int, double> chargeFraction(const SiStripCluster& cluster,
301  const DetId& detId,
302  const edm::DetSetVector<StripDigiSimLink>& digiSimLink) {
303  std::map<unsigned int, double> simTrackIdToAdc;
304 
305  auto idetset = digiSimLink.find(detId);
306  if (idetset == digiSimLink.end())
307  return simTrackIdToAdc;
308 
309  double adcSum = 0;
311  int first = cluster.firstStrip();
312  for (size_t i = 0; i < cluster.amplitudes().size(); ++i) {
313  adcSum += cluster.amplitudes()[i];
314  forEachMatchedSimLink(*idetset, first + i, [&](const StripDigiSimLink& simLink) {
315  double& adc = simTrackIdToAdc[simLink.SimTrackId()];
316  adc += cluster.amplitudes()[i] * simLink.fraction();
317  });
318 
319  for (const auto& pair : simTrackIdToAdc) {
320  simTrackIdToAdc[pair.first] = (adcSum != 0. ? pair.second / adcSum : 0.);
321  }
322  }
323  return simTrackIdToAdc;
324  }
325 
326  std::map<unsigned int, double> chargeFraction(const Phase2TrackerCluster1D& cluster,
327  const DetId& detId,
328  const edm::DetSetVector<StripDigiSimLink>& digiSimLink) {
329  std::map<unsigned int, double> simTrackIdToAdc;
330  throw cms::Exception("LogicError") << "Not possible to use StripDigiSimLink with Phase2TrackerCluster1D! ";
331  return simTrackIdToAdc;
332  }
333 
334  //In the OT, there is no measurement of the charge, so no ADC value.
335  //Only in the SSA chip (so in PSs) you have one "threshold" flag that tells you if the charge of at least one strip in the cluster exceeded 1.2 MIPs.
336  std::map<unsigned int, double> chargeFraction(const Phase2TrackerCluster1D& cluster,
337  const DetId& detId,
338  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink) {
339  std::map<unsigned int, double> simTrackIdToAdc;
340  return simTrackIdToAdc;
341  }
342 
343  struct TrackTPMatch {
344  int key = -1;
345  int countClusters = 0;
346  };
347 
348  TrackTPMatch findBestMatchingTrackingParticle(const reco::Track& track,
349  const ClusterTPAssociation& clusterToTPMap,
350  const TrackingParticleRefKeyToIndex& tpKeyToIndex) {
351  struct Count {
352  int clusters = 0;
353  size_t innermostHit = std::numeric_limits<size_t>::max();
354  };
355 
356  std::vector<OmniClusterRef> clusters =
358 
359  std::unordered_map<int, Count> count;
360  for (size_t iCluster = 0, end = clusters.size(); iCluster < end; ++iCluster) {
361  const auto& clusterRef = clusters[iCluster];
362 
363  auto range = clusterToTPMap.equal_range(clusterRef);
364  for (auto ip = range.first; ip != range.second; ++ip) {
365  const auto tpKey = ip->second.key();
366  if (tpKeyToIndex.find(tpKey) == tpKeyToIndex.end()) // filter out TPs not given as an input
367  continue;
368 
369  auto& elem = count[tpKey];
370  ++elem.clusters;
371  elem.innermostHit = std::min(elem.innermostHit, iCluster);
372  }
373  }
374 
375  // In case there are many matches with the same number of clusters,
376  // select the one with innermost hit
377  TrackTPMatch best;
378  int bestCount = 2; // require >= 3 cluster for the best match
379  size_t bestInnermostHit = std::numeric_limits<size_t>::max();
380  for (auto& keyCount : count) {
381  if (keyCount.second.clusters > bestCount ||
382  (keyCount.second.clusters == bestCount && keyCount.second.innermostHit < bestInnermostHit)) {
383  best.key = keyCount.first;
384  best.countClusters = bestCount = keyCount.second.clusters;
385  bestInnermostHit = keyCount.second.innermostHit;
386  }
387  }
388 
389  LogTrace("TrackingNtuple") << "findBestMatchingTrackingParticle key " << best.key;
390 
391  return best;
392  }
393 
394  TrackTPMatch findMatchingTrackingParticleFromFirstHit(const reco::Track& track,
395  const ClusterTPAssociation& clusterToTPMap,
396  const TrackingParticleRefKeyToIndex& tpKeyToIndex) {
397  TrackTPMatch best;
398 
399  std::vector<OmniClusterRef> clusters =
401  if (clusters.empty()) {
402  return best;
403  }
404 
405  auto operateCluster = [&](const auto& clusterRef, const auto& func) {
406  auto range = clusterToTPMap.equal_range(clusterRef);
407  for (auto ip = range.first; ip != range.second; ++ip) {
408  const auto tpKey = ip->second.key();
409  if (tpKeyToIndex.find(tpKey) == tpKeyToIndex.end()) // filter out TPs not given as an input
410  continue;
411  func(tpKey);
412  }
413  };
414 
415  std::vector<unsigned int>
416  validTPs; // first cluster can be associated to multiple TPs, use vector as set as this should be small
417  auto iCluster = clusters.begin();
418  operateCluster(*iCluster, [&](unsigned int tpKey) { validTPs.push_back(tpKey); });
419  if (validTPs.empty()) {
420  return best;
421  }
422  ++iCluster;
423  ++best.countClusters;
424 
425  std::vector<bool> foundTPs(validTPs.size(), false);
426  for (auto iEnd = clusters.end(); iCluster != iEnd; ++iCluster) {
427  const auto& clusterRef = *iCluster;
428 
429  // find out to which first-cluster TPs this cluster is matched to
430  operateCluster(clusterRef, [&](unsigned int tpKey) {
431  auto found = std::find(cbegin(validTPs), cend(validTPs), tpKey);
432  if (found != cend(validTPs)) {
433  foundTPs[std::distance(cbegin(validTPs), found)] = true;
434  }
435  });
436 
437  // remove the non-found TPs
438  auto iTP = validTPs.size();
439  do {
440  --iTP;
441 
442  if (!foundTPs[iTP]) {
443  validTPs.erase(validTPs.begin() + iTP);
444  foundTPs.erase(foundTPs.begin() + iTP);
445  }
446  } while (iTP > 0);
447  if (!validTPs.empty()) {
448  // for multiple TPs the "first one" is a bit arbitrary, but
449  // I hope it is rare that a track would have many
450  // consecutive hits matched to two TPs
451  best.key = validTPs[0];
452  } else {
453  break;
454  }
455 
456  std::fill(begin(foundTPs), end(foundTPs), false);
457  ++best.countClusters;
458  }
459 
460  // Reqquire >= 3 clusters for a match
461  return best.countClusters >= 3 ? best : TrackTPMatch();
462  }
463 } // namespace
464 
465 //
466 // class declaration
467 //
468 
469 class TrackingNtuple : public edm::one::EDAnalyzer<edm::one::SharedResources> {
470 public:
471  explicit TrackingNtuple(const edm::ParameterSet&);
472  ~TrackingNtuple() override;
473 
474  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
475 
476 private:
477  void analyze(const edm::Event&, const edm::EventSetup&) override;
478 
479  void clearVariables();
480 
481  enum class HitType { Pixel = 0, Strip = 1, Glued = 2, Invalid = 3, Phase2OT = 4, Unknown = 99 };
482 
483  // This gives the "best" classification of a reco hit
484  // In case of reco hit mathing to multiple sim, smaller number is
485  // considered better
486  // To be kept in synch with class HitSimType in ntuple.py
487  enum class HitSimType { Signal = 0, ITPileup = 1, OOTPileup = 2, Noise = 3, Unknown = 99 };
488 
489  using MVACollection = std::vector<float>;
490  using QualityMaskCollection = std::vector<unsigned char>;
491 
492  struct TPHitIndex {
493  TPHitIndex(unsigned int tp = 0, unsigned int simHit = 0, float to = 0, unsigned int id = 0)
494  : tpKey(tp), simHitIdx(simHit), tof(to), detId(id) {}
495  unsigned int tpKey;
496  unsigned int simHitIdx;
497  float tof;
498  unsigned int detId;
499  };
500  static bool tpHitIndexListLess(const TPHitIndex& i, const TPHitIndex& j) { return (i.tpKey < j.tpKey); }
501  static bool tpHitIndexListLessSort(const TPHitIndex& i, const TPHitIndex& j) {
502  if (i.tpKey == j.tpKey) {
503  if (edm::isNotFinite(i.tof) && edm::isNotFinite(j.tof)) {
504  return i.detId < j.detId;
505  }
506  return i.tof < j.tof; // works as intended if either one is NaN
507  }
508  return i.tpKey < j.tpKey;
509  }
510 
511  void fillBeamSpot(const reco::BeamSpot& bs);
512  void fillPixelHits(const edm::Event& iEvent,
513  const ClusterTPAssociation& clusterToTPMap,
514  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
516  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
517  const TransientTrackingRecHitBuilder& theTTRHBuilder,
518  const TrackerTopology& tTopo,
519  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
520  std::set<edm::ProductID>& hitProductIds);
521 
522  void fillStripRphiStereoHits(const edm::Event& iEvent,
523  const ClusterTPAssociation& clusterToTPMap,
524  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
526  const edm::DetSetVector<StripDigiSimLink>& digiSimLink,
527  const TransientTrackingRecHitBuilder& theTTRHBuilder,
528  const TrackerTopology& tTopo,
529  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
530  std::set<edm::ProductID>& hitProductIds);
531 
532  void fillStripMatchedHits(const edm::Event& iEvent,
533  const TransientTrackingRecHitBuilder& theTTRHBuilder,
534  const TrackerTopology& tTopo,
535  std::vector<std::pair<int, int>>& monoStereoClusterList);
536 
537  size_t addStripMatchedHit(const SiStripMatchedRecHit2D& hit,
538  const TransientTrackingRecHitBuilder& theTTRHBuilder,
539  const TrackerTopology& tTopo,
540  std::vector<std::pair<int, int>>& monoStereoClusterList);
541 
542  void fillPhase2OTHits(const edm::Event& iEvent,
543  const ClusterTPAssociation& clusterToTPMap,
544  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
546  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
547  const TransientTrackingRecHitBuilder& theTTRHBuilder,
548  const TrackerTopology& tTopo,
549  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
550  std::set<edm::ProductID>& hitProductIds);
551 
552  void fillSeeds(const edm::Event& iEvent,
553  const TrackingParticleRefVector& tpCollection,
554  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
555  const reco::BeamSpot& bs,
556  const reco::TrackToTrackingParticleAssociator& associatorByHits,
557  const ClusterTPAssociation& clusterToTPMap,
558  const TransientTrackingRecHitBuilder& theTTRHBuilder,
559  const MagneticField& theMF,
560  const TrackerTopology& tTopo,
561  std::vector<std::pair<int, int>>& monoStereoClusterList,
562  const std::set<edm::ProductID>& hitProductIds,
563  std::map<edm::ProductID, size_t>& seedToCollIndex);
564 
566  const TrackingParticleRefVector& tpCollection,
567  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
568  const TrackingParticleRefKeyToCount& tpKeyToClusterCount,
569  const MagneticField& mf,
570  const reco::BeamSpot& bs,
572  const reco::TrackToTrackingParticleAssociator& associatorByHits,
573  const ClusterTPAssociation& clusterToTPMap,
574  const TransientTrackingRecHitBuilder& theTTRHBuilder,
575  const TrackerTopology& tTopo,
576  const std::set<edm::ProductID>& hitProductIds,
577  const std::map<edm::ProductID, size_t>& seedToCollIndex,
578  const std::vector<const MVACollection*>& mvaColls,
579  const std::vector<const QualityMaskCollection*>& qualColls);
580 
581  void fillSimHits(const TrackerGeometry& tracker,
582  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
584  const TrackerTopology& tTopo,
585  SimHitRefKeyToIndex& simHitRefKeyToIndex,
586  std::vector<TPHitIndex>& tpHitList);
587 
588  void fillTrackingParticles(const edm::Event& iEvent,
589  const edm::EventSetup& iSetup,
590  const edm::RefToBaseVector<reco::Track>& tracks,
591  const reco::BeamSpot& bs,
592  const TrackingParticleRefVector& tpCollection,
593  const TrackingVertexRefKeyToIndex& tvKeyToIndex,
594  const reco::TrackToTrackingParticleAssociator& associatorByHits,
595  const std::vector<TPHitIndex>& tpHitList,
596  const TrackingParticleRefKeyToCount& tpKeyToClusterCount);
597 
598  void fillTrackingParticlesForSeeds(const TrackingParticleRefVector& tpCollection,
599  const reco::SimToRecoCollection& simRecColl,
600  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
601  const unsigned int seedOffset);
602 
603  void fillVertices(const reco::VertexCollection& vertices, const edm::RefToBaseVector<reco::Track>& tracks);
604 
605  void fillTrackingVertices(const TrackingVertexRefVector& trackingVertices,
606  const TrackingParticleRefKeyToIndex& tpKeyToIndex);
607 
608  struct SimHitData {
609  std::vector<int> matchingSimHit;
610  std::vector<float> chargeFraction;
611  std::vector<int> bunchCrossing;
612  std::vector<int> event;
614  };
615 
616  template <typename SimLink>
617  SimHitData matchCluster(const OmniClusterRef& cluster,
618  DetId hitId,
619  int clusterKey,
621  const ClusterTPAssociation& clusterToTPMap,
622  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
624  const edm::DetSetVector<SimLink>& digiSimLinks,
625  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
626  HitType hitType);
627 
628  // ----------member data ---------------------------
629  std::vector<edm::EDGetTokenT<edm::View<reco::Track>>> seedTokens_;
630  std::vector<edm::EDGetTokenT<std::vector<SeedStopInfo>>> seedStopInfoTokens_;
632  std::vector<std::tuple<edm::EDGetTokenT<MVACollection>, edm::EDGetTokenT<QualityMaskCollection>>>
642  bool includeStripHits_, includePhase2OTHits_;
656  const bool includeSeeds_;
657  const bool includeAllHits_;
658  const bool includeMVA_;
660 
662 
663  TTree* t;
664 
665  // DetId branches
666 #define BOOK(name) tree->Branch((prefix + "_" + #name).c_str(), &name);
667  class DetIdCommon {
668  public:
670 
671  unsigned int operator[](size_t i) const { return detId[i]; }
672 
673  void book(const std::string& prefix, TTree* tree) {
674  BOOK(detId);
675  BOOK(subdet);
676  BOOK(layer);
677  BOOK(side);
678  BOOK(module);
679  }
680 
681  void push_back(const TrackerTopology& tTopo, const DetId& id) {
682  detId.push_back(id.rawId());
683  subdet.push_back(id.subdetId());
684  layer.push_back(tTopo.layer(id));
685  module.push_back(tTopo.module(id));
686 
687  unsigned short s = 0;
688  switch (id.subdetId()) {
690  s = tTopo.tibSide(id);
691  break;
693  s = tTopo.tobSide(id);
694  break;
695  default:
696  s = tTopo.side(id);
697  }
698  side.push_back(s);
699  }
700 
701  void resize(size_t size) {
702  detId.resize(size);
703  subdet.resize(size);
704  layer.resize(size);
705  side.resize(size);
706  module.resize(size);
707  }
708 
709  void set(size_t index, const TrackerTopology& tTopo, const DetId& id) {
710  detId[index] = id.rawId();
711  subdet[index] = id.subdetId();
712  layer[index] = tTopo.layer(id);
713  side[index] = tTopo.side(id);
714  module[index] = tTopo.module(id);
715  }
716 
717  void clear() {
718  detId.clear();
719  subdet.clear();
720  layer.clear();
721  side.clear();
722  module.clear();
723  }
724 
725  private:
726  std::vector<unsigned int> detId;
727  std::vector<unsigned short> subdet;
728  std::vector<unsigned short> layer; // or disk/wheel
729  std::vector<unsigned short> side;
730  std::vector<unsigned short> module;
731  };
732 
734  public:
736 
737  void book(const std::string& prefix, TTree* tree) {
738  BOOK(ladder);
739  BOOK(blade);
740  BOOK(panel);
741  }
742 
743  void push_back(const TrackerTopology& tTopo, const DetId& id) {
744  const bool isBarrel = id.subdetId() == PixelSubdetector::PixelBarrel;
745  ladder.push_back(isBarrel ? tTopo.pxbLadder(id) : 0);
746  blade.push_back(isBarrel ? 0 : tTopo.pxfBlade(id));
747  panel.push_back(isBarrel ? 0 : tTopo.pxfPanel(id));
748  }
749 
750  void clear() {
751  ladder.clear();
752  blade.clear();
753  panel.clear();
754  }
755 
756  private:
757  std::vector<unsigned short> ladder;
758  std::vector<unsigned short> blade;
759  std::vector<unsigned short> panel;
760  };
761 
763  public:
765 
766  void book(const std::string& prefix, TTree* tree) {
767  BOOK(order);
768  BOOK(ring);
769  BOOK(rod);
770  }
771 
772  void push_back(const TrackerTopology& tTopo, const DetId& id) {
773  const auto parsed = parse(tTopo, id);
774  order.push_back(parsed.order);
775  ring.push_back(parsed.ring);
776  rod.push_back(parsed.rod);
777  }
778 
779  void resize(size_t size) {
780  order.resize(size);
781  ring.resize(size);
782  rod.resize(size);
783  }
784 
785  void set(size_t index, const TrackerTopology& tTopo, const DetId& id) {
786  const auto parsed = parse(tTopo, id);
787  order[index] = parsed.order;
788  ring[index] = parsed.ring;
789  rod[index] = parsed.rod;
790  }
791 
792  void clear() {
793  order.clear();
794  ring.clear();
795  rod.clear();
796  }
797 
798  private:
799  struct Parsed {
800  // use int here instead of short to avoid compilation errors due
801  // to narrowing conversion (less boilerplate than explicit static_casts)
802  unsigned int order = 0;
803  unsigned int ring = 0;
804  unsigned int rod = 0;
805  };
806  Parsed parse(const TrackerTopology& tTopo, const DetId& id) const {
807  switch (id.subdetId()) {
809  return Parsed{tTopo.tibOrder(id), 0, 0};
811  return Parsed{tTopo.tidOrder(id), tTopo.tidRing(id), 0};
813  return Parsed{0, 0, tTopo.tobRod(id)};
815  return Parsed{tTopo.tecOrder(id), tTopo.tecRing(id), 0};
816  default:
817  return Parsed{};
818  };
819  }
820 
821  std::vector<unsigned short> order;
822  std::vector<unsigned short> ring;
823  std::vector<unsigned short> rod;
824  };
825 
827  public:
829 
830  void book(const std::string& prefix, TTree* tree) {
831  BOOK(string);
832  BOOK(petalNumber);
833  BOOK(isStereo);
834  BOOK(isRPhi);
835  BOOK(isGlued);
836  }
837 
838  void push_back(const TrackerTopology& tTopo, const DetId& id) {
839  const auto parsed = parse(tTopo, id);
840  string.push_back(parsed.string);
841  petalNumber.push_back(parsed.petalNumber);
842  isStereo.push_back(tTopo.isStereo(id));
843  isRPhi.push_back(tTopo.isRPhi(id));
844  isGlued.push_back(parsed.glued);
845  }
846 
847  void resize(size_t size) {
848  string.resize(size);
849  petalNumber.resize(size);
850  isStereo.resize(size);
851  isRPhi.resize(size);
852  isGlued.resize(size);
853  }
854 
855  void set(size_t index, const TrackerTopology& tTopo, const DetId& id) {
856  const auto parsed = parse(tTopo, id);
857  string[index] = parsed.string;
858  petalNumber[index] = parsed.petalNumber;
859  isStereo[index] = tTopo.isStereo(id);
860  isRPhi[index] = tTopo.isRPhi(id);
861  isGlued[index] = parsed.glued;
862  }
863 
864  void clear() {
865  string.clear();
866  isStereo.clear();
867  isRPhi.clear();
868  isGlued.clear();
869  petalNumber.clear();
870  }
871 
872  private:
873  struct Parsed {
874  // use int here instead of short to avoid compilation errors due
875  // to narrowing conversion (less boilerplate than explicit static_casts)
876  unsigned int string = 0;
877  unsigned int petalNumber = 0;
878  bool glued = false;
879  };
880  Parsed parse(const TrackerTopology& tTopo, const DetId& id) const {
881  switch (id.subdetId()) {
883  return Parsed{tTopo.tibString(id), 0, tTopo.tibIsDoubleSide(id)};
885  return Parsed{0, 0, tTopo.tidIsDoubleSide(id)};
887  return Parsed{0, 0, tTopo.tobIsDoubleSide(id)};
889  return Parsed{0, tTopo.tecPetalNumber(id), tTopo.tecIsDoubleSide(id)};
890  default:
891  return Parsed{};
892  }
893  }
894 
895  std::vector<unsigned short> string;
896  std::vector<unsigned short> petalNumber;
897  std::vector<unsigned short> isStereo;
898  std::vector<unsigned short> isRPhi;
899  std::vector<unsigned short> isGlued;
900  };
901 
903  public:
905 
906  void book(const std::string& prefix, TTree* tree) {
907  BOOK(isLower);
908  BOOK(isUpper);
909  BOOK(isStack);
910  }
911 
912  void push_back(const TrackerTopology& tTopo, const DetId& id) {
913  isLower.push_back(tTopo.isLower(id));
914  isUpper.push_back(tTopo.isUpper(id));
915  isStack.push_back(tTopo.stack(id) ==
916  0); // equivalent to *IsDoubleSide() but without the hardcoded layer+ring requirements
917  }
918 
919  void clear() {
920  isLower.clear();
921  isUpper.clear();
922  isStack.clear();
923  }
924 
925  private:
926  std::vector<unsigned short> isLower;
927  std::vector<unsigned short> isUpper;
928  std::vector<unsigned short> isStack;
929  };
930 #undef BOOK
931 
932  using DetIdPixel = CombineDetId<DetIdCommon, DetIdPixelOnly>;
933  using DetIdStrip = CombineDetId<DetIdCommon, DetIdOTCommon, DetIdStripOnly>;
934  using DetIdPhase2OT = CombineDetId<DetIdCommon, DetIdOTCommon, DetIdPhase2OTOnly>;
935  using DetIdAll = CombineDetId<DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdStripOnly>;
936  using DetIdAllPhase2 = CombineDetId<DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdPhase2OTOnly>;
937 
938  // event
942 
944  // tracks
945  // (first) index runs through tracks
946  std::vector<float> trk_px;
947  std::vector<float> trk_py;
948  std::vector<float> trk_pz;
949  std::vector<float> trk_pt;
950  std::vector<float> trk_inner_px;
951  std::vector<float> trk_inner_py;
952  std::vector<float> trk_inner_pz;
953  std::vector<float> trk_inner_pt;
954  std::vector<float> trk_outer_px;
955  std::vector<float> trk_outer_py;
956  std::vector<float> trk_outer_pz;
957  std::vector<float> trk_outer_pt;
958  std::vector<float> trk_eta;
959  std::vector<float> trk_lambda;
960  std::vector<float> trk_cotTheta;
961  std::vector<float> trk_phi;
962  std::vector<float> trk_dxy;
963  std::vector<float> trk_dz;
964  std::vector<float> trk_dxyPV;
965  std::vector<float> trk_dzPV;
966  std::vector<float> trk_dxyClosestPV;
967  std::vector<float> trk_dzClosestPV;
968  std::vector<float> trk_ptErr;
969  std::vector<float> trk_etaErr;
970  std::vector<float> trk_lambdaErr;
971  std::vector<float> trk_phiErr;
972  std::vector<float> trk_dxyErr;
973  std::vector<float> trk_dzErr;
974  std::vector<float> trk_refpoint_x;
975  std::vector<float> trk_refpoint_y;
976  std::vector<float> trk_refpoint_z;
977  std::vector<float> trk_nChi2;
978  std::vector<float> trk_nChi2_1Dmod;
979  std::vector<float> trk_ndof;
980  std::vector<std::vector<float>> trk_mvas;
981  std::vector<std::vector<unsigned short>> trk_qualityMasks;
982  std::vector<int> trk_q;
983  std::vector<unsigned int> trk_nValid;
984  std::vector<unsigned int> trk_nLost;
985  std::vector<unsigned int> trk_nInactive;
986  std::vector<unsigned int> trk_nPixel;
987  std::vector<unsigned int> trk_nStrip;
988  std::vector<unsigned int> trk_nOuterLost;
989  std::vector<unsigned int> trk_nInnerLost;
990  std::vector<unsigned int> trk_nOuterInactive;
991  std::vector<unsigned int> trk_nInnerInactive;
992  std::vector<unsigned int> trk_nPixelLay;
993  std::vector<unsigned int> trk_nStripLay;
994  std::vector<unsigned int> trk_n3DLay;
995  std::vector<unsigned int> trk_nLostLay;
996  std::vector<unsigned int> trk_nCluster;
997  std::vector<unsigned int> trk_algo;
998  std::vector<unsigned int> trk_originalAlgo;
999  std::vector<decltype(reco::TrackBase().algoMaskUL())> trk_algoMask;
1000  std::vector<unsigned short> trk_stopReason;
1001  std::vector<short> trk_isHP;
1002  std::vector<int> trk_seedIdx;
1003  std::vector<int> trk_vtxIdx;
1004  std::vector<short> trk_isTrue;
1005  std::vector<int> trk_bestSimTrkIdx;
1006  std::vector<float> trk_bestSimTrkShareFrac;
1009  std::vector<float> trk_bestSimTrkNChi2;
1015  std::vector<std::vector<float>> trk_simTrkShareFrac; // second index runs through matched TrackingParticles
1016  std::vector<std::vector<float>> trk_simTrkNChi2; // second index runs through matched TrackingParticles
1017  std::vector<std::vector<int>> trk_simTrkIdx; // second index runs through matched TrackingParticles
1018  std::vector<std::vector<int>> trk_hitIdx; // second index runs through hits
1019  std::vector<std::vector<int>> trk_hitType; // second index runs through hits
1021  // sim tracks
1022  // (first) index runs through TrackingParticles
1023  std::vector<int> sim_event;
1024  std::vector<int> sim_bunchCrossing;
1025  std::vector<int> sim_pdgId;
1026  std::vector<std::vector<int>> sim_genPdgIds;
1027  std::vector<int> sim_isFromBHadron;
1028  std::vector<float> sim_px;
1029  std::vector<float> sim_py;
1030  std::vector<float> sim_pz;
1031  std::vector<float> sim_pt;
1032  std::vector<float> sim_eta;
1033  std::vector<float> sim_phi;
1034  std::vector<float> sim_pca_pt;
1035  std::vector<float> sim_pca_eta;
1036  std::vector<float> sim_pca_lambda;
1037  std::vector<float> sim_pca_cotTheta;
1038  std::vector<float> sim_pca_phi;
1039  std::vector<float> sim_pca_dxy;
1040  std::vector<float> sim_pca_dz;
1041  std::vector<int> sim_q;
1042  // numbers of sim hits/layers
1043  std::vector<unsigned int> sim_nValid;
1044  std::vector<unsigned int> sim_nPixel;
1045  std::vector<unsigned int> sim_nStrip;
1046  std::vector<unsigned int> sim_nLay;
1047  std::vector<unsigned int> sim_nPixelLay;
1048  std::vector<unsigned int> sim_n3DLay;
1049  // number of sim hits as calculated in TrackingTruthAccumulator
1050  std::vector<unsigned int> sim_nTrackerHits;
1051  // number of clusters associated to TP
1052  std::vector<unsigned int> sim_nRecoClusters;
1053  // links to other objects
1054  std::vector<std::vector<int>> sim_trkIdx; // second index runs through matched tracks
1055  std::vector<std::vector<float>> sim_trkShareFrac; // second index runs through matched tracks
1056  std::vector<std::vector<int>> sim_seedIdx; // second index runs through matched seeds
1057  std::vector<int> sim_parentVtxIdx;
1058  std::vector<std::vector<int>> sim_decayVtxIdx; // second index runs through decay vertices
1059  std::vector<std::vector<int>> sim_simHitIdx; // second index runs through SimHits
1061  // pixel hits
1062  // (first) index runs through hits
1063  std::vector<short> pix_isBarrel;
1065  std::vector<std::vector<int>> pix_trkIdx; // second index runs through tracks containing this hit
1066  std::vector<std::vector<int>> pix_seeIdx; // second index runs through seeds containing this hit
1067  std::vector<std::vector<int>> pix_simHitIdx; // second index runs through SimHits inducing this hit
1068  std::vector<std::vector<float>> pix_chargeFraction; // second index runs through SimHits inducing this hit
1069  std::vector<unsigned short> pix_simType;
1070  std::vector<float> pix_x;
1071  std::vector<float> pix_y;
1072  std::vector<float> pix_z;
1073  std::vector<float> pix_xx;
1074  std::vector<float> pix_xy;
1075  std::vector<float> pix_yy;
1076  std::vector<float> pix_yz;
1077  std::vector<float> pix_zz;
1078  std::vector<float> pix_zx;
1079  std::vector<float>
1080  pix_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1081  std::vector<float> pix_bbxi;
1083  // strip hits
1084  // (first) index runs through hits
1085  std::vector<short> str_isBarrel;
1087  std::vector<std::vector<int>> str_trkIdx; // second index runs through tracks containing this hit
1088  std::vector<std::vector<int>> str_seeIdx; // second index runs through seeds containing this hit
1089  std::vector<std::vector<int>> str_simHitIdx; // second index runs through SimHits inducing this hit
1090  std::vector<std::vector<float>> str_chargeFraction; // second index runs through SimHits inducing this hit
1091  std::vector<unsigned short> str_simType;
1092  std::vector<float> str_x;
1093  std::vector<float> str_y;
1094  std::vector<float> str_z;
1095  std::vector<float> str_xx;
1096  std::vector<float> str_xy;
1097  std::vector<float> str_yy;
1098  std::vector<float> str_yz;
1099  std::vector<float> str_zz;
1100  std::vector<float> str_zx;
1101  std::vector<float>
1102  str_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1103  std::vector<float> str_bbxi;
1105  // strip matched hits
1106  // (first) index runs through hits
1107  std::vector<short> glu_isBarrel;
1109  std::vector<int> glu_monoIdx;
1110  std::vector<int> glu_stereoIdx;
1111  std::vector<std::vector<int>> glu_seeIdx; // second index runs through seeds containing this hit
1112  std::vector<float> glu_x;
1113  std::vector<float> glu_y;
1114  std::vector<float> glu_z;
1115  std::vector<float> glu_xx;
1116  std::vector<float> glu_xy;
1117  std::vector<float> glu_yy;
1118  std::vector<float> glu_yz;
1119  std::vector<float> glu_zz;
1120  std::vector<float> glu_zx;
1121  std::vector<float>
1122  glu_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1123  std::vector<float> glu_bbxi;
1125  // phase2 Outer Tracker hits
1126  // (first) index runs through hits
1127  std::vector<short> ph2_isBarrel;
1129  std::vector<std::vector<int>> ph2_trkIdx; // second index runs through tracks containing this hit
1130  std::vector<std::vector<int>> ph2_seeIdx; // second index runs through seeds containing this hit
1131  std::vector<std::vector<int>> ph2_simHitIdx; // second index runs through SimHits inducing this hit
1132  //std::vector<std::vector<float> > ph2_chargeFraction; // Not supported at the moment for Phase2
1133  std::vector<unsigned short> ph2_simType;
1134  std::vector<float> ph2_x;
1135  std::vector<float> ph2_y;
1136  std::vector<float> ph2_z;
1137  std::vector<float> ph2_xx;
1138  std::vector<float> ph2_xy;
1139  std::vector<float> ph2_yy;
1140  std::vector<float> ph2_yz;
1141  std::vector<float> ph2_zz;
1142  std::vector<float> ph2_zx;
1143  std::vector<float>
1144  ph2_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1145  std::vector<float> ph2_bbxi;
1146 
1148  // invalid (missing/inactive/etc) hits
1149  // (first) index runs through hits
1150  std::vector<short> inv_isBarrel;
1153  std::vector<unsigned short> inv_type;
1155  // sim hits
1156  // (first) index runs through hits
1159  std::vector<float> simhit_x;
1160  std::vector<float> simhit_y;
1161  std::vector<float> simhit_z;
1162  std::vector<int> simhit_particle;
1163  std::vector<short> simhit_process;
1164  std::vector<float> simhit_eloss;
1165  std::vector<float> simhit_tof;
1166  //std::vector<unsigned int> simhit_simTrackId; // can be useful for debugging, but not much of general interest
1167  std::vector<int> simhit_simTrkIdx;
1168  std::vector<std::vector<int>> simhit_hitIdx; // second index runs through induced reco hits
1169  std::vector<std::vector<int>> simhit_hitType; // second index runs through induced reco hits
1171  // beam spot
1172  float bsp_x;
1173  float bsp_y;
1174  float bsp_z;
1175  float bsp_sigmax;
1176  float bsp_sigmay;
1177  float bsp_sigmaz;
1179  // seeds
1180  // (first) index runs through seeds
1181  std::vector<short> see_fitok;
1182  std::vector<float> see_px;
1183  std::vector<float> see_py;
1184  std::vector<float> see_pz;
1185  std::vector<float> see_pt;
1186  std::vector<float> see_eta;
1187  std::vector<float> see_phi;
1188  std::vector<float> see_dxy;
1189  std::vector<float> see_dz;
1190  std::vector<float> see_ptErr;
1191  std::vector<float> see_etaErr;
1192  std::vector<float> see_phiErr;
1193  std::vector<float> see_dxyErr;
1194  std::vector<float> see_dzErr;
1195  std::vector<float> see_chi2;
1196  std::vector<float> see_statePt;
1197  std::vector<float> see_stateTrajX;
1198  std::vector<float> see_stateTrajY;
1199  std::vector<float> see_stateTrajPx;
1200  std::vector<float> see_stateTrajPy;
1201  std::vector<float> see_stateTrajPz;
1202  std::vector<int> see_q;
1203  std::vector<unsigned int> see_nValid;
1204  std::vector<unsigned int> see_nPixel;
1205  std::vector<unsigned int> see_nGlued;
1206  std::vector<unsigned int> see_nStrip;
1207  std::vector<unsigned int> see_nPhase2OT;
1208  std::vector<unsigned int> see_nCluster;
1209  std::vector<unsigned int> see_algo;
1210  std::vector<unsigned short> see_stopReason;
1211  std::vector<unsigned short> see_nCands;
1212  std::vector<int> see_trkIdx;
1213  std::vector<short> see_isTrue;
1214  std::vector<int> see_bestSimTrkIdx;
1215  std::vector<float> see_bestSimTrkShareFrac;
1218  std::vector<std::vector<float>> see_simTrkShareFrac; // second index runs through matched TrackingParticles
1219  std::vector<std::vector<int>> see_simTrkIdx; // second index runs through matched TrackingParticles
1220  std::vector<std::vector<int>> see_hitIdx; // second index runs through hits
1221  std::vector<std::vector<int>> see_hitType; // second index runs through hits
1222  //seed algo offset, index runs through iterations
1223  std::vector<unsigned int> see_offset;
1224 
1226  // Vertices
1227  // (first) index runs through vertices
1228  std::vector<float> vtx_x;
1229  std::vector<float> vtx_y;
1230  std::vector<float> vtx_z;
1231  std::vector<float> vtx_xErr;
1232  std::vector<float> vtx_yErr;
1233  std::vector<float> vtx_zErr;
1234  std::vector<float> vtx_ndof;
1235  std::vector<float> vtx_chi2;
1236  std::vector<short> vtx_fake;
1237  std::vector<short> vtx_valid;
1238  std::vector<std::vector<int>> vtx_trkIdx; // second index runs through tracks used in the vertex fit
1239 
1241  // Tracking vertices
1242  // (first) index runs through TrackingVertices
1243  std::vector<int> simvtx_event;
1244  std::vector<int> simvtx_bunchCrossing;
1245  std::vector<unsigned int> simvtx_processType; // only from first SimVertex of TrackingVertex
1246  std::vector<float> simvtx_x;
1247  std::vector<float> simvtx_y;
1248  std::vector<float> simvtx_z;
1249  std::vector<std::vector<int>> simvtx_sourceSimIdx; // second index runs through source TrackingParticles
1250  std::vector<std::vector<int>> simvtx_daughterSimIdx; // second index runs through daughter TrackingParticles
1251  std::vector<int> simpv_idx;
1252 };
1253 
1254 //
1255 // constructors and destructor
1256 //
1258  : trackToken_(consumes<edm::View<reco::Track>>(iConfig.getUntrackedParameter<edm::InputTag>("tracks"))),
1259  clusterTPMapToken_(consumes<ClusterTPAssociation>(iConfig.getUntrackedParameter<edm::InputTag>("clusterTPMap"))),
1260  simHitTPMapToken_(consumes<SimHitTPAssociationProducer::SimHitTPAssociationList>(
1261  iConfig.getUntrackedParameter<edm::InputTag>("simHitTPMap"))),
1262  trackAssociatorToken_(consumes<reco::TrackToTrackingParticleAssociator>(
1263  iConfig.getUntrackedParameter<edm::InputTag>("trackAssociator"))),
1264  pixelSimLinkToken_(consumes<edm::DetSetVector<PixelDigiSimLink>>(
1265  iConfig.getUntrackedParameter<edm::InputTag>("pixelDigiSimLink"))),
1266  stripSimLinkToken_(consumes<edm::DetSetVector<StripDigiSimLink>>(
1267  iConfig.getUntrackedParameter<edm::InputTag>("stripDigiSimLink"))),
1268  siphase2OTSimLinksToken_(consumes<edm::DetSetVector<PixelDigiSimLink>>(
1269  iConfig.getUntrackedParameter<edm::InputTag>("phase2OTSimLink"))),
1270  includeStripHits_(!iConfig.getUntrackedParameter<edm::InputTag>("stripDigiSimLink").label().empty()),
1271  includePhase2OTHits_(!iConfig.getUntrackedParameter<edm::InputTag>("phase2OTSimLink").label().empty()),
1272  beamSpotToken_(consumes<reco::BeamSpot>(iConfig.getUntrackedParameter<edm::InputTag>("beamSpot"))),
1273  pixelRecHitToken_(
1274  consumes<SiPixelRecHitCollection>(iConfig.getUntrackedParameter<edm::InputTag>("pixelRecHits"))),
1275  stripRphiRecHitToken_(
1276  consumes<SiStripRecHit2DCollection>(iConfig.getUntrackedParameter<edm::InputTag>("stripRphiRecHits"))),
1277  stripStereoRecHitToken_(
1278  consumes<SiStripRecHit2DCollection>(iConfig.getUntrackedParameter<edm::InputTag>("stripStereoRecHits"))),
1279  stripMatchedRecHitToken_(consumes<SiStripMatchedRecHit2DCollection>(
1280  iConfig.getUntrackedParameter<edm::InputTag>("stripMatchedRecHits"))),
1281  phase2OTRecHitToken_(consumes<Phase2TrackerRecHit1DCollectionNew>(
1282  iConfig.getUntrackedParameter<edm::InputTag>("phase2OTRecHits"))),
1283  vertexToken_(consumes<reco::VertexCollection>(iConfig.getUntrackedParameter<edm::InputTag>("vertices"))),
1284  trackingVertexToken_(
1285  consumes<TrackingVertexCollection>(iConfig.getUntrackedParameter<edm::InputTag>("trackingVertices"))),
1286  tpNLayersToken_(consumes<edm::ValueMap<unsigned int>>(
1287  iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNlayers"))),
1288  tpNPixelLayersToken_(consumes<edm::ValueMap<unsigned int>>(
1289  iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNpixellayers"))),
1290  tpNStripStereoLayersToken_(consumes<edm::ValueMap<unsigned int>>(
1291  iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNstripstereolayers"))),
1292  builderName_(iConfig.getUntrackedParameter<std::string>("TTRHBuilder")),
1293  parametersDefinerName_(iConfig.getUntrackedParameter<std::string>("parametersDefiner")),
1294  includeSeeds_(iConfig.getUntrackedParameter<bool>("includeSeeds")),
1295  includeAllHits_(iConfig.getUntrackedParameter<bool>("includeAllHits")),
1296  includeMVA_(iConfig.getUntrackedParameter<bool>("includeMVA")),
1297  includeTrackingParticles_(iConfig.getUntrackedParameter<bool>("includeTrackingParticles")) {
1298  if (includeSeeds_) {
1299  seedTokens_ =
1300  edm::vector_transform(iConfig.getUntrackedParameter<std::vector<edm::InputTag>>("seedTracks"),
1301  [&](const edm::InputTag& tag) { return consumes<edm::View<reco::Track>>(tag); });
1302  seedStopInfoTokens_ =
1303  edm::vector_transform(iConfig.getUntrackedParameter<std::vector<edm::InputTag>>("trackCandidates"),
1304  [&](const edm::InputTag& tag) { return consumes<std::vector<SeedStopInfo>>(tag); });
1305  if (seedTokens_.size() != seedStopInfoTokens_.size()) {
1306  throw cms::Exception("Configuration") << "Got " << seedTokens_.size() << " seed collections, but "
1307  << seedStopInfoTokens_.size() << " track candidate collections";
1308  }
1309  }
1310 
1311  if (includeAllHits_) {
1312  if (includeStripHits_ && includePhase2OTHits_) {
1313  throw cms::Exception("Configuration")
1314  << "Both stripDigiSimLink and phase2OTSimLink are set, please set only either one (this information is used "
1315  "to infer if you're running phase0/1 or phase2 detector)";
1316  }
1317  if (!includeStripHits_ && !includePhase2OTHits_) {
1318  throw cms::Exception("Configuration")
1319  << "Neither stripDigiSimLink or phase2OTSimLink are set, please set either one.";
1320  }
1321  }
1322 
1323  const bool tpRef = iConfig.getUntrackedParameter<bool>("trackingParticlesRef");
1324  const auto tpTag = iConfig.getUntrackedParameter<edm::InputTag>("trackingParticles");
1325  if (tpRef) {
1326  trackingParticleRefToken_ = consumes<TrackingParticleRefVector>(tpTag);
1327  } else {
1328  trackingParticleToken_ = consumes<TrackingParticleCollection>(tpTag);
1329  }
1330 
1331  tracer_.depth(-2); // as in SimTracker/TrackHistory/src/TrackClassifier.cc
1332 
1333  if (includeMVA_) {
1335  iConfig.getUntrackedParameter<std::vector<std::string>>("trackMVAs"), [&](const std::string& tag) {
1336  return std::make_tuple(consumes<MVACollection>(edm::InputTag(tag, "MVAValues")),
1337  consumes<QualityMaskCollection>(edm::InputTag(tag, "QualityMasks")));
1338  });
1339  }
1340 
1341  usesResource(TFileService::kSharedResource);
1343  t = fs->make<TTree>("tree", "tree");
1344 
1345  t->Branch("event", &ev_event);
1346  t->Branch("lumi", &ev_lumi);
1347  t->Branch("run", &ev_run);
1348 
1349  //tracks
1350  t->Branch("trk_px", &trk_px);
1351  t->Branch("trk_py", &trk_py);
1352  t->Branch("trk_pz", &trk_pz);
1353  t->Branch("trk_pt", &trk_pt);
1354  t->Branch("trk_inner_px", &trk_inner_px);
1355  t->Branch("trk_inner_py", &trk_inner_py);
1356  t->Branch("trk_inner_pz", &trk_inner_pz);
1357  t->Branch("trk_inner_pt", &trk_inner_pt);
1358  t->Branch("trk_outer_px", &trk_outer_px);
1359  t->Branch("trk_outer_py", &trk_outer_py);
1360  t->Branch("trk_outer_pz", &trk_outer_pz);
1361  t->Branch("trk_outer_pt", &trk_outer_pt);
1362  t->Branch("trk_eta", &trk_eta);
1363  t->Branch("trk_lambda", &trk_lambda);
1364  t->Branch("trk_cotTheta", &trk_cotTheta);
1365  t->Branch("trk_phi", &trk_phi);
1366  t->Branch("trk_dxy", &trk_dxy);
1367  t->Branch("trk_dz", &trk_dz);
1368  t->Branch("trk_dxyPV", &trk_dxyPV);
1369  t->Branch("trk_dzPV", &trk_dzPV);
1370  t->Branch("trk_dxyClosestPV", &trk_dxyClosestPV);
1371  t->Branch("trk_dzClosestPV", &trk_dzClosestPV);
1372  t->Branch("trk_ptErr", &trk_ptErr);
1373  t->Branch("trk_etaErr", &trk_etaErr);
1374  t->Branch("trk_lambdaErr", &trk_lambdaErr);
1375  t->Branch("trk_phiErr", &trk_phiErr);
1376  t->Branch("trk_dxyErr", &trk_dxyErr);
1377  t->Branch("trk_dzErr", &trk_dzErr);
1378  t->Branch("trk_refpoint_x", &trk_refpoint_x);
1379  t->Branch("trk_refpoint_y", &trk_refpoint_y);
1380  t->Branch("trk_refpoint_z", &trk_refpoint_z);
1381  t->Branch("trk_nChi2", &trk_nChi2);
1382  t->Branch("trk_nChi2_1Dmod", &trk_nChi2_1Dmod);
1383  t->Branch("trk_ndof", &trk_ndof);
1384  if (includeMVA_) {
1385  trk_mvas.resize(mvaQualityCollectionTokens_.size());
1386  trk_qualityMasks.resize(mvaQualityCollectionTokens_.size());
1387  if (!trk_mvas.empty()) {
1388  t->Branch("trk_mva", &(trk_mvas[0]));
1389  t->Branch("trk_qualityMask", &(trk_qualityMasks[0]));
1390  for (size_t i = 1; i < trk_mvas.size(); ++i) {
1391  t->Branch(("trk_mva" + std::to_string(i + 1)).c_str(), &(trk_mvas[i]));
1392  t->Branch(("trk_qualityMask" + std::to_string(i + 1)).c_str(), &(trk_qualityMasks[i]));
1393  }
1394  }
1395  }
1396  t->Branch("trk_q", &trk_q);
1397  t->Branch("trk_nValid", &trk_nValid);
1398  t->Branch("trk_nLost", &trk_nLost);
1399  t->Branch("trk_nInactive", &trk_nInactive);
1400  t->Branch("trk_nPixel", &trk_nPixel);
1401  t->Branch("trk_nStrip", &trk_nStrip);
1402  t->Branch("trk_nOuterLost", &trk_nOuterLost);
1403  t->Branch("trk_nInnerLost", &trk_nInnerLost);
1404  t->Branch("trk_nOuterInactive", &trk_nOuterInactive);
1405  t->Branch("trk_nInnerInactive", &trk_nInnerInactive);
1406  t->Branch("trk_nPixelLay", &trk_nPixelLay);
1407  t->Branch("trk_nStripLay", &trk_nStripLay);
1408  t->Branch("trk_n3DLay", &trk_n3DLay);
1409  t->Branch("trk_nLostLay", &trk_nLostLay);
1410  t->Branch("trk_nCluster", &trk_nCluster);
1411  t->Branch("trk_algo", &trk_algo);
1412  t->Branch("trk_originalAlgo", &trk_originalAlgo);
1413  t->Branch("trk_algoMask", &trk_algoMask);
1414  t->Branch("trk_stopReason", &trk_stopReason);
1415  t->Branch("trk_isHP", &trk_isHP);
1416  if (includeSeeds_) {
1417  t->Branch("trk_seedIdx", &trk_seedIdx);
1418  }
1419  t->Branch("trk_vtxIdx", &trk_vtxIdx);
1420  if (includeTrackingParticles_) {
1421  t->Branch("trk_simTrkIdx", &trk_simTrkIdx);
1422  t->Branch("trk_simTrkShareFrac", &trk_simTrkShareFrac);
1423  t->Branch("trk_simTrkNChi2", &trk_simTrkNChi2);
1424  t->Branch("trk_bestSimTrkIdx", &trk_bestSimTrkIdx);
1425  t->Branch("trk_bestFromFirstHitSimTrkIdx", &trk_bestFromFirstHitSimTrkIdx);
1426  } else {
1427  t->Branch("trk_isTrue", &trk_isTrue);
1428  }
1429  t->Branch("trk_bestSimTrkShareFrac", &trk_bestSimTrkShareFrac);
1430  t->Branch("trk_bestSimTrkShareFracSimDenom", &trk_bestSimTrkShareFracSimDenom);
1431  t->Branch("trk_bestSimTrkShareFracSimClusterDenom", &trk_bestSimTrkShareFracSimClusterDenom);
1432  t->Branch("trk_bestSimTrkNChi2", &trk_bestSimTrkNChi2);
1433  t->Branch("trk_bestFromFirstHitSimTrkShareFrac", &trk_bestFromFirstHitSimTrkShareFrac);
1434  t->Branch("trk_bestFromFirstHitSimTrkShareFracSimDenom", &trk_bestFromFirstHitSimTrkShareFracSimDenom);
1435  t->Branch("trk_bestFromFirstHitSimTrkShareFracSimClusterDenom", &trk_bestFromFirstHitSimTrkShareFracSimClusterDenom);
1436  t->Branch("trk_bestFromFirstHitSimTrkNChi2", &trk_bestFromFirstHitSimTrkNChi2);
1437  if (includeAllHits_) {
1438  t->Branch("trk_hitIdx", &trk_hitIdx);
1439  t->Branch("trk_hitType", &trk_hitType);
1440  }
1441  if (includeTrackingParticles_) {
1442  //sim tracks
1443  t->Branch("sim_event", &sim_event);
1444  t->Branch("sim_bunchCrossing", &sim_bunchCrossing);
1445  t->Branch("sim_pdgId", &sim_pdgId);
1446  t->Branch("sim_genPdgIds", &sim_genPdgIds);
1447  t->Branch("sim_isFromBHadron", &sim_isFromBHadron);
1448  t->Branch("sim_px", &sim_px);
1449  t->Branch("sim_py", &sim_py);
1450  t->Branch("sim_pz", &sim_pz);
1451  t->Branch("sim_pt", &sim_pt);
1452  t->Branch("sim_eta", &sim_eta);
1453  t->Branch("sim_phi", &sim_phi);
1454  t->Branch("sim_pca_pt", &sim_pca_pt);
1455  t->Branch("sim_pca_eta", &sim_pca_eta);
1456  t->Branch("sim_pca_lambda", &sim_pca_lambda);
1457  t->Branch("sim_pca_cotTheta", &sim_pca_cotTheta);
1458  t->Branch("sim_pca_phi", &sim_pca_phi);
1459  t->Branch("sim_pca_dxy", &sim_pca_dxy);
1460  t->Branch("sim_pca_dz", &sim_pca_dz);
1461  t->Branch("sim_q", &sim_q);
1462  t->Branch("sim_nValid", &sim_nValid);
1463  t->Branch("sim_nPixel", &sim_nPixel);
1464  t->Branch("sim_nStrip", &sim_nStrip);
1465  t->Branch("sim_nLay", &sim_nLay);
1466  t->Branch("sim_nPixelLay", &sim_nPixelLay);
1467  t->Branch("sim_n3DLay", &sim_n3DLay);
1468  t->Branch("sim_nTrackerHits", &sim_nTrackerHits);
1469  t->Branch("sim_nRecoClusters", &sim_nRecoClusters);
1470  t->Branch("sim_trkIdx", &sim_trkIdx);
1471  t->Branch("sim_trkShareFrac", &sim_trkShareFrac);
1472  if (includeSeeds_) {
1473  t->Branch("sim_seedIdx", &sim_seedIdx);
1474  }
1475  t->Branch("sim_parentVtxIdx", &sim_parentVtxIdx);
1476  t->Branch("sim_decayVtxIdx", &sim_decayVtxIdx);
1477  if (includeAllHits_) {
1478  t->Branch("sim_simHitIdx", &sim_simHitIdx);
1479  }
1480  }
1481  if (includeAllHits_) {
1482  //pixels
1483  t->Branch("pix_isBarrel", &pix_isBarrel);
1484  pix_detId.book("pix", t);
1485  t->Branch("pix_trkIdx", &pix_trkIdx);
1486  if (includeSeeds_) {
1487  t->Branch("pix_seeIdx", &pix_seeIdx);
1488  }
1489  if (includeTrackingParticles_) {
1490  t->Branch("pix_simHitIdx", &pix_simHitIdx);
1491  t->Branch("pix_chargeFraction", &pix_chargeFraction);
1492  t->Branch("pix_simType", &pix_simType);
1493  }
1494  t->Branch("pix_x", &pix_x);
1495  t->Branch("pix_y", &pix_y);
1496  t->Branch("pix_z", &pix_z);
1497  t->Branch("pix_xx", &pix_xx);
1498  t->Branch("pix_xy", &pix_xy);
1499  t->Branch("pix_yy", &pix_yy);
1500  t->Branch("pix_yz", &pix_yz);
1501  t->Branch("pix_zz", &pix_zz);
1502  t->Branch("pix_zx", &pix_zx);
1503  t->Branch("pix_radL", &pix_radL);
1504  t->Branch("pix_bbxi", &pix_bbxi);
1505  t->Branch("pix_bbxi", &pix_bbxi);
1506  //strips
1507  if (includeStripHits_) {
1508  t->Branch("str_isBarrel", &str_isBarrel);
1509  str_detId.book("str", t);
1510  t->Branch("str_trkIdx", &str_trkIdx);
1511  if (includeSeeds_) {
1512  t->Branch("str_seeIdx", &str_seeIdx);
1513  }
1514  if (includeTrackingParticles_) {
1515  t->Branch("str_simHitIdx", &str_simHitIdx);
1516  t->Branch("str_chargeFraction", &str_chargeFraction);
1517  t->Branch("str_simType", &str_simType);
1518  }
1519  t->Branch("str_x", &str_x);
1520  t->Branch("str_y", &str_y);
1521  t->Branch("str_z", &str_z);
1522  t->Branch("str_xx", &str_xx);
1523  t->Branch("str_xy", &str_xy);
1524  t->Branch("str_yy", &str_yy);
1525  t->Branch("str_yz", &str_yz);
1526  t->Branch("str_zz", &str_zz);
1527  t->Branch("str_zx", &str_zx);
1528  t->Branch("str_radL", &str_radL);
1529  t->Branch("str_bbxi", &str_bbxi);
1530  //matched hits
1531  t->Branch("glu_isBarrel", &glu_isBarrel);
1532  glu_detId.book("glu", t);
1533  t->Branch("glu_monoIdx", &glu_monoIdx);
1534  t->Branch("glu_stereoIdx", &glu_stereoIdx);
1535  if (includeSeeds_) {
1536  t->Branch("glu_seeIdx", &glu_seeIdx);
1537  }
1538  t->Branch("glu_x", &glu_x);
1539  t->Branch("glu_y", &glu_y);
1540  t->Branch("glu_z", &glu_z);
1541  t->Branch("glu_xx", &glu_xx);
1542  t->Branch("glu_xy", &glu_xy);
1543  t->Branch("glu_yy", &glu_yy);
1544  t->Branch("glu_yz", &glu_yz);
1545  t->Branch("glu_zz", &glu_zz);
1546  t->Branch("glu_zx", &glu_zx);
1547  t->Branch("glu_radL", &glu_radL);
1548  t->Branch("glu_bbxi", &glu_bbxi);
1549  }
1550  //phase2 OT
1551  if (includePhase2OTHits_) {
1552  t->Branch("ph2_isBarrel", &ph2_isBarrel);
1553  ph2_detId.book("ph2", t);
1554  t->Branch("ph2_trkIdx", &ph2_trkIdx);
1555  if (includeSeeds_) {
1556  t->Branch("ph2_seeIdx", &ph2_seeIdx);
1557  }
1558  if (includeTrackingParticles_) {
1559  t->Branch("ph2_simHitIdx", &ph2_simHitIdx);
1560  t->Branch("ph2_simType", &ph2_simType);
1561  }
1562  t->Branch("ph2_x", &ph2_x);
1563  t->Branch("ph2_y", &ph2_y);
1564  t->Branch("ph2_z", &ph2_z);
1565  t->Branch("ph2_xx", &ph2_xx);
1566  t->Branch("ph2_xy", &ph2_xy);
1567  t->Branch("ph2_yy", &ph2_yy);
1568  t->Branch("ph2_yz", &ph2_yz);
1569  t->Branch("ph2_zz", &ph2_zz);
1570  t->Branch("ph2_zx", &ph2_zx);
1571  t->Branch("ph2_radL", &ph2_radL);
1572  t->Branch("ph2_bbxi", &ph2_bbxi);
1573  t->Branch("ph2_bbxi", &ph2_bbxi);
1574  }
1575  //invalid hits
1576  t->Branch("inv_isBarrel", &inv_isBarrel);
1577  if (includeStripHits_)
1578  inv_detId.book("inv", t);
1579  else
1580  inv_detId_phase2.book("inv", t);
1581  t->Branch("inv_type", &inv_type);
1582  //simhits
1583  if (includeTrackingParticles_) {
1584  if (includeStripHits_)
1585  simhit_detId.book("simhit", t);
1586  else
1587  simhit_detId_phase2.book("simhit", t);
1588  t->Branch("simhit_x", &simhit_x);
1589  t->Branch("simhit_y", &simhit_y);
1590  t->Branch("simhit_z", &simhit_z);
1591  t->Branch("simhit_particle", &simhit_particle);
1592  t->Branch("simhit_process", &simhit_process);
1593  t->Branch("simhit_eloss", &simhit_eloss);
1594  t->Branch("simhit_tof", &simhit_tof);
1595  t->Branch("simhit_simTrkIdx", &simhit_simTrkIdx);
1596  t->Branch("simhit_hitIdx", &simhit_hitIdx);
1597  t->Branch("simhit_hitType", &simhit_hitType);
1598  }
1599  }
1600  //beam spot
1601  t->Branch("bsp_x", &bsp_x, "bsp_x/F");
1602  t->Branch("bsp_y", &bsp_y, "bsp_y/F");
1603  t->Branch("bsp_z", &bsp_z, "bsp_z/F");
1604  t->Branch("bsp_sigmax", &bsp_sigmax, "bsp_sigmax/F");
1605  t->Branch("bsp_sigmay", &bsp_sigmay, "bsp_sigmay/F");
1606  t->Branch("bsp_sigmaz", &bsp_sigmaz, "bsp_sigmaz/F");
1607  if (includeSeeds_) {
1608  //seeds
1609  t->Branch("see_fitok", &see_fitok);
1610  t->Branch("see_px", &see_px);
1611  t->Branch("see_py", &see_py);
1612  t->Branch("see_pz", &see_pz);
1613  t->Branch("see_pt", &see_pt);
1614  t->Branch("see_eta", &see_eta);
1615  t->Branch("see_phi", &see_phi);
1616  t->Branch("see_dxy", &see_dxy);
1617  t->Branch("see_dz", &see_dz);
1618  t->Branch("see_ptErr", &see_ptErr);
1619  t->Branch("see_etaErr", &see_etaErr);
1620  t->Branch("see_phiErr", &see_phiErr);
1621  t->Branch("see_dxyErr", &see_dxyErr);
1622  t->Branch("see_dzErr", &see_dzErr);
1623  t->Branch("see_chi2", &see_chi2);
1624  t->Branch("see_statePt", &see_statePt);
1625  t->Branch("see_stateTrajX", &see_stateTrajX);
1626  t->Branch("see_stateTrajY", &see_stateTrajY);
1627  t->Branch("see_stateTrajPx", &see_stateTrajPx);
1628  t->Branch("see_stateTrajPy", &see_stateTrajPy);
1629  t->Branch("see_stateTrajPz", &see_stateTrajPz);
1630  t->Branch("see_q", &see_q);
1631  t->Branch("see_nValid", &see_nValid);
1632  t->Branch("see_nPixel", &see_nPixel);
1633  t->Branch("see_nGlued", &see_nGlued);
1634  t->Branch("see_nStrip", &see_nStrip);
1635  t->Branch("see_nPhase2OT", &see_nPhase2OT);
1636  t->Branch("see_nCluster", &see_nCluster);
1637  t->Branch("see_algo", &see_algo);
1638  t->Branch("see_stopReason", &see_stopReason);
1639  t->Branch("see_nCands", &see_nCands);
1640  t->Branch("see_trkIdx", &see_trkIdx);
1641  if (includeTrackingParticles_) {
1642  t->Branch("see_simTrkIdx", &see_simTrkIdx);
1643  t->Branch("see_simTrkShareFrac", &see_simTrkShareFrac);
1644  t->Branch("see_bestSimTrkIdx", &see_bestSimTrkIdx);
1645  t->Branch("see_bestFromFirstHitSimTrkIdx", &see_bestFromFirstHitSimTrkIdx);
1646  } else {
1647  t->Branch("see_isTrue", &see_isTrue);
1648  }
1649  t->Branch("see_bestSimTrkShareFrac", &see_bestSimTrkShareFrac);
1650  t->Branch("see_bestFromFirstHitSimTrkShareFrac", &see_bestFromFirstHitSimTrkShareFrac);
1651  if (includeAllHits_) {
1652  t->Branch("see_hitIdx", &see_hitIdx);
1653  t->Branch("see_hitType", &see_hitType);
1654  }
1655  //seed algo offset
1656  t->Branch("see_offset", &see_offset);
1657  }
1658 
1659  //vertices
1660  t->Branch("vtx_x", &vtx_x);
1661  t->Branch("vtx_y", &vtx_y);
1662  t->Branch("vtx_z", &vtx_z);
1663  t->Branch("vtx_xErr", &vtx_xErr);
1664  t->Branch("vtx_yErr", &vtx_yErr);
1665  t->Branch("vtx_zErr", &vtx_zErr);
1666  t->Branch("vtx_ndof", &vtx_ndof);
1667  t->Branch("vtx_chi2", &vtx_chi2);
1668  t->Branch("vtx_fake", &vtx_fake);
1669  t->Branch("vtx_valid", &vtx_valid);
1670  t->Branch("vtx_trkIdx", &vtx_trkIdx);
1671 
1672  // tracking vertices
1673  t->Branch("simvtx_event", &simvtx_event);
1674  t->Branch("simvtx_bunchCrossing", &simvtx_bunchCrossing);
1675  t->Branch("simvtx_processType", &simvtx_processType);
1676  t->Branch("simvtx_x", &simvtx_x);
1677  t->Branch("simvtx_y", &simvtx_y);
1678  t->Branch("simvtx_z", &simvtx_z);
1679  t->Branch("simvtx_sourceSimIdx", &simvtx_sourceSimIdx);
1680  t->Branch("simvtx_daughterSimIdx", &simvtx_daughterSimIdx);
1681 
1682  t->Branch("simpv_idx", &simpv_idx);
1683 
1684  //t->Branch("" , &);
1685 }
1686 
1688  // do anything here that needs to be done at desctruction time
1689  // (e.g. close files, deallocate resources etc.)
1690 }
1691 
1692 //
1693 // member functions
1694 //
1696  ev_run = 0;
1697  ev_lumi = 0;
1698  ev_event = 0;
1699 
1700  //tracks
1701  trk_px.clear();
1702  trk_py.clear();
1703  trk_pz.clear();
1704  trk_pt.clear();
1705  trk_inner_px.clear();
1706  trk_inner_py.clear();
1707  trk_inner_pz.clear();
1708  trk_inner_pt.clear();
1709  trk_outer_px.clear();
1710  trk_outer_py.clear();
1711  trk_outer_pz.clear();
1712  trk_outer_pt.clear();
1713  trk_eta.clear();
1714  trk_lambda.clear();
1715  trk_cotTheta.clear();
1716  trk_phi.clear();
1717  trk_dxy.clear();
1718  trk_dz.clear();
1719  trk_dxyPV.clear();
1720  trk_dzPV.clear();
1721  trk_dxyClosestPV.clear();
1722  trk_dzClosestPV.clear();
1723  trk_ptErr.clear();
1724  trk_etaErr.clear();
1725  trk_lambdaErr.clear();
1726  trk_phiErr.clear();
1727  trk_dxyErr.clear();
1728  trk_dzErr.clear();
1729  trk_refpoint_x.clear();
1730  trk_refpoint_y.clear();
1731  trk_refpoint_z.clear();
1732  trk_nChi2.clear();
1733  trk_nChi2_1Dmod.clear();
1734  trk_ndof.clear();
1735  for (auto& mva : trk_mvas) {
1736  mva.clear();
1737  }
1738  for (auto& mask : trk_qualityMasks) {
1739  mask.clear();
1740  }
1741  trk_q.clear();
1742  trk_nValid.clear();
1743  trk_nLost.clear();
1744  trk_nInactive.clear();
1745  trk_nPixel.clear();
1746  trk_nStrip.clear();
1747  trk_nOuterLost.clear();
1748  trk_nInnerLost.clear();
1749  trk_nOuterInactive.clear();
1750  trk_nInnerInactive.clear();
1751  trk_nPixelLay.clear();
1752  trk_nStripLay.clear();
1753  trk_n3DLay.clear();
1754  trk_nLostLay.clear();
1755  trk_nCluster.clear();
1756  trk_algo.clear();
1757  trk_originalAlgo.clear();
1758  trk_algoMask.clear();
1759  trk_stopReason.clear();
1760  trk_isHP.clear();
1761  trk_seedIdx.clear();
1762  trk_vtxIdx.clear();
1763  trk_isTrue.clear();
1764  trk_bestSimTrkIdx.clear();
1765  trk_bestSimTrkShareFrac.clear();
1768  trk_bestSimTrkNChi2.clear();
1774  trk_simTrkIdx.clear();
1775  trk_simTrkShareFrac.clear();
1776  trk_simTrkNChi2.clear();
1777  trk_hitIdx.clear();
1778  trk_hitType.clear();
1779  //sim tracks
1780  sim_event.clear();
1781  sim_bunchCrossing.clear();
1782  sim_pdgId.clear();
1783  sim_genPdgIds.clear();
1784  sim_isFromBHadron.clear();
1785  sim_px.clear();
1786  sim_py.clear();
1787  sim_pz.clear();
1788  sim_pt.clear();
1789  sim_eta.clear();
1790  sim_phi.clear();
1791  sim_pca_pt.clear();
1792  sim_pca_eta.clear();
1793  sim_pca_lambda.clear();
1794  sim_pca_cotTheta.clear();
1795  sim_pca_phi.clear();
1796  sim_pca_dxy.clear();
1797  sim_pca_dz.clear();
1798  sim_q.clear();
1799  sim_nValid.clear();
1800  sim_nPixel.clear();
1801  sim_nStrip.clear();
1802  sim_nLay.clear();
1803  sim_nPixelLay.clear();
1804  sim_n3DLay.clear();
1805  sim_nTrackerHits.clear();
1806  sim_nRecoClusters.clear();
1807  sim_trkIdx.clear();
1808  sim_seedIdx.clear();
1809  sim_trkShareFrac.clear();
1810  sim_parentVtxIdx.clear();
1811  sim_decayVtxIdx.clear();
1812  sim_simHitIdx.clear();
1813  //pixels
1814  pix_isBarrel.clear();
1815  pix_detId.clear();
1816  pix_trkIdx.clear();
1817  pix_seeIdx.clear();
1818  pix_simHitIdx.clear();
1819  pix_chargeFraction.clear();
1820  pix_simType.clear();
1821  pix_x.clear();
1822  pix_y.clear();
1823  pix_z.clear();
1824  pix_xx.clear();
1825  pix_xy.clear();
1826  pix_yy.clear();
1827  pix_yz.clear();
1828  pix_zz.clear();
1829  pix_zx.clear();
1830  pix_radL.clear();
1831  pix_bbxi.clear();
1832  //strips
1833  str_isBarrel.clear();
1834  str_detId.clear();
1835  str_trkIdx.clear();
1836  str_seeIdx.clear();
1837  str_simHitIdx.clear();
1838  str_chargeFraction.clear();
1839  str_simType.clear();
1840  str_x.clear();
1841  str_y.clear();
1842  str_z.clear();
1843  str_xx.clear();
1844  str_xy.clear();
1845  str_yy.clear();
1846  str_yz.clear();
1847  str_zz.clear();
1848  str_zx.clear();
1849  str_radL.clear();
1850  str_bbxi.clear();
1851  //matched hits
1852  glu_isBarrel.clear();
1853  glu_detId.clear();
1854  glu_monoIdx.clear();
1855  glu_stereoIdx.clear();
1856  glu_seeIdx.clear();
1857  glu_x.clear();
1858  glu_y.clear();
1859  glu_z.clear();
1860  glu_xx.clear();
1861  glu_xy.clear();
1862  glu_yy.clear();
1863  glu_yz.clear();
1864  glu_zz.clear();
1865  glu_zx.clear();
1866  glu_radL.clear();
1867  glu_bbxi.clear();
1868  //phase2 OT
1869  ph2_isBarrel.clear();
1870  ph2_detId.clear();
1871  ph2_trkIdx.clear();
1872  ph2_seeIdx.clear();
1873  ph2_simHitIdx.clear();
1874  ph2_simType.clear();
1875  ph2_x.clear();
1876  ph2_y.clear();
1877  ph2_z.clear();
1878  ph2_xx.clear();
1879  ph2_xy.clear();
1880  ph2_yy.clear();
1881  ph2_yz.clear();
1882  ph2_zz.clear();
1883  ph2_zx.clear();
1884  ph2_radL.clear();
1885  ph2_bbxi.clear();
1886  //invalid hits
1887  inv_isBarrel.clear();
1888  inv_detId.clear();
1889  inv_detId_phase2.clear();
1890  inv_type.clear();
1891  // simhits
1892  simhit_detId.clear();
1893  simhit_detId_phase2.clear();
1894  simhit_x.clear();
1895  simhit_y.clear();
1896  simhit_z.clear();
1897  simhit_particle.clear();
1898  simhit_process.clear();
1899  simhit_eloss.clear();
1900  simhit_tof.clear();
1901  //simhit_simTrackId.clear();
1902  simhit_simTrkIdx.clear();
1903  simhit_hitIdx.clear();
1904  simhit_hitType.clear();
1905  //beamspot
1906  bsp_x = -9999.;
1907  bsp_y = -9999.;
1908  bsp_z = -9999.;
1909  bsp_sigmax = -9999.;
1910  bsp_sigmay = -9999.;
1911  bsp_sigmaz = -9999.;
1912  //seeds
1913  see_fitok.clear();
1914  see_px.clear();
1915  see_py.clear();
1916  see_pz.clear();
1917  see_pt.clear();
1918  see_eta.clear();
1919  see_phi.clear();
1920  see_dxy.clear();
1921  see_dz.clear();
1922  see_ptErr.clear();
1923  see_etaErr.clear();
1924  see_phiErr.clear();
1925  see_dxyErr.clear();
1926  see_dzErr.clear();
1927  see_chi2.clear();
1928  see_statePt.clear();
1929  see_stateTrajX.clear();
1930  see_stateTrajY.clear();
1931  see_stateTrajPx.clear();
1932  see_stateTrajPy.clear();
1933  see_stateTrajPz.clear();
1934  see_q.clear();
1935  see_nValid.clear();
1936  see_nPixel.clear();
1937  see_nGlued.clear();
1938  see_nStrip.clear();
1939  see_nPhase2OT.clear();
1940  see_nCluster.clear();
1941  see_algo.clear();
1942  see_stopReason.clear();
1943  see_nCands.clear();
1944  see_trkIdx.clear();
1945  see_bestSimTrkIdx.clear();
1946  see_bestSimTrkShareFrac.clear();
1949  see_simTrkIdx.clear();
1950  see_simTrkShareFrac.clear();
1951  see_hitIdx.clear();
1952  see_hitType.clear();
1953  //seed algo offset
1954  see_offset.clear();
1955 
1956  // vertices
1957  vtx_x.clear();
1958  vtx_y.clear();
1959  vtx_z.clear();
1960  vtx_xErr.clear();
1961  vtx_yErr.clear();
1962  vtx_zErr.clear();
1963  vtx_ndof.clear();
1964  vtx_chi2.clear();
1965  vtx_fake.clear();
1966  vtx_valid.clear();
1967  vtx_trkIdx.clear();
1968 
1969  // Tracking vertices
1970  simvtx_event.clear();
1971  simvtx_bunchCrossing.clear();
1972  simvtx_x.clear();
1973  simvtx_y.clear();
1974  simvtx_z.clear();
1975  simvtx_sourceSimIdx.clear();
1976  simvtx_daughterSimIdx.clear();
1977  simpv_idx.clear();
1978 }
1979 
1980 // ------------ method called for each event ------------
1981 void TrackingNtuple::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
1982  using namespace edm;
1983  using namespace reco;
1984  using namespace std;
1985 
1987  iSetup.get<IdealMagneticFieldRecord>().get(mfHandle);
1988  const auto& mf = *mfHandle;
1989 
1991  iSetup.get<TransientRecHitRecord>().get(builderName_, theTTRHBuilder);
1992 
1993  edm::ESHandle<TrackerTopology> tTopoHandle;
1994  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
1995  const TrackerTopology& tTopo = *tTopoHandle;
1996 
1997  edm::ESHandle<TrackerGeometry> geometryHandle;
1998  iSetup.get<TrackerDigiGeometryRecord>().get(geometryHandle);
1999  const TrackerGeometry& tracker = *geometryHandle;
2000 
2002  iEvent.getByToken(trackAssociatorToken_, theAssociator);
2003  const reco::TrackToTrackingParticleAssociator& associatorByHits = *theAssociator;
2004 
2005  LogDebug("TrackingNtuple") << "Analyzing new event";
2006 
2007  //initialize tree variables
2008  clearVariables();
2009 
2010  // FIXME: we really need to move to edm::View for reading the
2011  // TrackingParticles... Unfortunately it has non-trivial
2012  // consequences on the associator/association interfaces etc.
2014  const TrackingParticleRefVector* tmpTPptr = nullptr;
2016  edm::Handle<TrackingParticleRefVector> TPCollectionHRefVector;
2017 
2018  if (!trackingParticleToken_.isUninitialized()) {
2019  iEvent.getByToken(trackingParticleToken_, TPCollectionH);
2020  for (size_t i = 0, size = TPCollectionH->size(); i < size; ++i) {
2021  tmpTP.push_back(TrackingParticleRef(TPCollectionH, i));
2022  }
2023  tmpTPptr = &tmpTP;
2024  } else {
2025  iEvent.getByToken(trackingParticleRefToken_, TPCollectionHRefVector);
2026  tmpTPptr = TPCollectionHRefVector.product();
2027  }
2028  const TrackingParticleRefVector& tpCollection = *tmpTPptr;
2029 
2030  // Fill mapping from Ref::key() to index
2031  TrackingParticleRefKeyToIndex tpKeyToIndex;
2032  for (size_t i = 0; i < tpCollection.size(); ++i) {
2033  tpKeyToIndex[tpCollection[i].key()] = i;
2034  }
2035 
2036  // tracking vertices
2038  iEvent.getByToken(trackingVertexToken_, htv);
2039  const TrackingVertexCollection& tvs = *htv;
2040 
2041  // Fill mapping from Ref::key() to index
2042  TrackingVertexRefVector tvRefs;
2043  TrackingVertexRefKeyToIndex tvKeyToIndex;
2044  for (size_t i = 0; i < tvs.size(); ++i) {
2045  const TrackingVertex& v = tvs[i];
2046  if (v.eventId().bunchCrossing() != 0) // Ignore OOTPU; would be better to not to hardcode?
2047  continue;
2048  tvKeyToIndex[i] = tvRefs.size();
2049  tvRefs.push_back(TrackingVertexRef(htv, i));
2050  }
2051 
2052  //get association maps, etc.
2053  Handle<ClusterTPAssociation> pCluster2TPListH;
2054  iEvent.getByToken(clusterTPMapToken_, pCluster2TPListH);
2055  const ClusterTPAssociation& clusterToTPMap = *pCluster2TPListH;
2057  iEvent.getByToken(simHitTPMapToken_, simHitsTPAssoc);
2058 
2059  // TP -> cluster count
2060  TrackingParticleRefKeyToCount tpKeyToClusterCount;
2061  for (const auto& clusterTP : clusterToTPMap) {
2062  tpKeyToClusterCount[clusterTP.second.key()] += 1;
2063  }
2064 
2065  // SimHit key -> index mapping
2066  SimHitRefKeyToIndex simHitRefKeyToIndex;
2067 
2068  //make a list to link TrackingParticles to its simhits
2069  std::vector<TPHitIndex> tpHitList;
2070 
2071  // Count the number of reco cluster per TP
2072 
2073  std::set<edm::ProductID> hitProductIds;
2074  std::map<edm::ProductID, size_t> seedCollToOffset;
2075 
2076  ev_run = iEvent.id().run();
2077  ev_lumi = iEvent.id().luminosityBlock();
2078  ev_event = iEvent.id().event();
2079 
2080  // Digi->Sim links for pixels and strips
2081  edm::Handle<edm::DetSetVector<PixelDigiSimLink>> pixelDigiSimLinksHandle;
2082  iEvent.getByToken(pixelSimLinkToken_, pixelDigiSimLinksHandle);
2083  const auto& pixelDigiSimLinks = *pixelDigiSimLinksHandle;
2084 
2085  edm::Handle<edm::DetSetVector<StripDigiSimLink>> stripDigiSimLinksHandle;
2086  iEvent.getByToken(stripSimLinkToken_, stripDigiSimLinksHandle);
2087 
2088  // Phase2 OT DigiSimLink
2089  edm::Handle<edm::DetSetVector<PixelDigiSimLink>> siphase2OTSimLinksHandle;
2090  iEvent.getByToken(siphase2OTSimLinksToken_, siphase2OTSimLinksHandle);
2091 
2092  //beamspot
2093  Handle<reco::BeamSpot> recoBeamSpotHandle;
2094  iEvent.getByToken(beamSpotToken_, recoBeamSpotHandle);
2095  BeamSpot const& bs = *recoBeamSpotHandle;
2096  fillBeamSpot(bs);
2097 
2098  //prapare list to link matched hits to collection
2099  vector<pair<int, int>> monoStereoClusterList;
2100  if (includeAllHits_) {
2101  // simhits, only if TPs are saved as well
2102  if (includeTrackingParticles_) {
2103  fillSimHits(tracker, tpKeyToIndex, *simHitsTPAssoc, tTopo, simHitRefKeyToIndex, tpHitList);
2104  }
2105 
2106  //pixel hits
2107  fillPixelHits(iEvent,
2108  clusterToTPMap,
2109  tpKeyToIndex,
2110  *simHitsTPAssoc,
2111  pixelDigiSimLinks,
2112  *theTTRHBuilder,
2113  tTopo,
2114  simHitRefKeyToIndex,
2115  hitProductIds);
2116 
2117  //strip hits
2118  if (includeStripHits_) {
2119  LogDebug("TrackingNtuple") << "foundStripSimLink";
2120  const auto& stripDigiSimLinks = *stripDigiSimLinksHandle;
2121  fillStripRphiStereoHits(iEvent,
2122  clusterToTPMap,
2123  tpKeyToIndex,
2124  *simHitsTPAssoc,
2125  stripDigiSimLinks,
2126  *theTTRHBuilder,
2127  tTopo,
2128  simHitRefKeyToIndex,
2129  hitProductIds);
2130 
2131  //matched hits
2132  fillStripMatchedHits(iEvent, *theTTRHBuilder, tTopo, monoStereoClusterList);
2133  }
2134 
2135  if (includePhase2OTHits_) {
2136  LogDebug("TrackingNtuple") << "foundPhase2OTSimLinks";
2137  const auto& phase2OTSimLinks = *siphase2OTSimLinksHandle;
2138  fillPhase2OTHits(iEvent,
2139  clusterToTPMap,
2140  tpKeyToIndex,
2141  *simHitsTPAssoc,
2142  phase2OTSimLinks,
2143  *theTTRHBuilder,
2144  tTopo,
2145  simHitRefKeyToIndex,
2146  hitProductIds);
2147  }
2148  }
2149 
2150  //seeds
2151  if (includeSeeds_) {
2152  fillSeeds(iEvent,
2153  tpCollection,
2154  tpKeyToIndex,
2155  bs,
2156  associatorByHits,
2157  clusterToTPMap,
2158  *theTTRHBuilder,
2159  mf,
2160  tTopo,
2161  monoStereoClusterList,
2162  hitProductIds,
2163  seedCollToOffset);
2164  }
2165 
2166  //tracks
2167  edm::Handle<edm::View<reco::Track>> tracksHandle;
2168  iEvent.getByToken(trackToken_, tracksHandle);
2169  const edm::View<reco::Track>& tracks = *tracksHandle;
2170  // The associator interfaces really need to be fixed...
2172  for (edm::View<Track>::size_type i = 0; i < tracks.size(); ++i) {
2173  trackRefs.push_back(tracks.refAt(i));
2174  }
2175  std::vector<const MVACollection*> mvaColls;
2176  std::vector<const QualityMaskCollection*> qualColls;
2177  if (includeMVA_) {
2180 
2181  for (const auto& tokenTpl : mvaQualityCollectionTokens_) {
2182  iEvent.getByToken(std::get<0>(tokenTpl), hmva);
2183  iEvent.getByToken(std::get<1>(tokenTpl), hqual);
2184 
2185  mvaColls.push_back(hmva.product());
2186  qualColls.push_back(hqual.product());
2187  if (mvaColls.back()->size() != tracks.size()) {
2188  throw cms::Exception("Configuration")
2189  << "Inconsistency in track collection and MVA sizes. Track collection has " << tracks.size()
2190  << " tracks, whereas the MVA " << (mvaColls.size() - 1) << " has " << mvaColls.back()->size()
2191  << " entries. Double-check your configuration.";
2192  }
2193  if (qualColls.back()->size() != tracks.size()) {
2194  throw cms::Exception("Configuration")
2195  << "Inconsistency in track collection and quality mask sizes. Track collection has " << tracks.size()
2196  << " tracks, whereas the quality mask " << (qualColls.size() - 1) << " has " << qualColls.back()->size()
2197  << " entries. Double-check your configuration.";
2198  }
2199  }
2200  }
2201 
2203  iEvent.getByToken(vertexToken_, vertices);
2204 
2205  fillTracks(trackRefs,
2206  tpCollection,
2207  tpKeyToIndex,
2208  tpKeyToClusterCount,
2209  mf,
2210  bs,
2211  *vertices,
2212  associatorByHits,
2213  clusterToTPMap,
2214  *theTTRHBuilder,
2215  tTopo,
2216  hitProductIds,
2217  seedCollToOffset,
2218  mvaColls,
2219  qualColls);
2220 
2221  //tracking particles
2222  //sort association maps with simHits
2223  std::sort(tpHitList.begin(), tpHitList.end(), tpHitIndexListLessSort);
2225  iEvent, iSetup, trackRefs, bs, tpCollection, tvKeyToIndex, associatorByHits, tpHitList, tpKeyToClusterCount);
2226 
2227  // vertices
2228  fillVertices(*vertices, trackRefs);
2229 
2230  // tracking vertices
2231  fillTrackingVertices(tvRefs, tpKeyToIndex);
2232 
2233  t->Fill();
2234 }
2235 
2237  bsp_x = bs.x0();
2238  bsp_y = bs.y0();
2239  bsp_z = bs.x0();
2240  bsp_sigmax = bs.BeamWidthX();
2241  bsp_sigmay = bs.BeamWidthY();
2242  bsp_sigmaz = bs.sigmaZ();
2243 }
2244 
2245 namespace {
2246  template <typename SimLink>
2247  struct GetCluster;
2248  template <>
2249  struct GetCluster<PixelDigiSimLink> {
2250  static const SiPixelCluster& call(const OmniClusterRef& cluster) { return cluster.pixelCluster(); }
2251  };
2252  template <>
2253  struct GetCluster<StripDigiSimLink> {
2254  static const SiStripCluster& call(const OmniClusterRef& cluster) { return cluster.stripCluster(); }
2255  };
2256 } // namespace
2257 
2258 template <typename SimLink>
2260  const OmniClusterRef& cluster,
2261  DetId hitId,
2262  int clusterKey,
2264  const ClusterTPAssociation& clusterToTPMap,
2265  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2267  const edm::DetSetVector<SimLink>& digiSimLinks,
2268  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
2269  HitType hitType) {
2270  SimHitData ret;
2271 
2272  std::map<unsigned int, double> simTrackIdToChargeFraction;
2273  if (hitType == HitType::Phase2OT)
2274  simTrackIdToChargeFraction = chargeFraction(cluster.phase2OTCluster(), hitId, digiSimLinks);
2275  else
2276  simTrackIdToChargeFraction = chargeFraction(GetCluster<SimLink>::call(cluster), hitId, digiSimLinks);
2277 
2278  ret.type = HitSimType::Noise;
2279  auto range = clusterToTPMap.equal_range(cluster);
2280  if (range.first != range.second) {
2281  for (auto ip = range.first; ip != range.second; ++ip) {
2282  const TrackingParticleRef& trackingParticle = ip->second;
2283 
2284  // Find out if the cluster is from signal/ITPU/OOTPU
2285  const auto event = trackingParticle->eventId().event();
2286  const auto bx = trackingParticle->eventId().bunchCrossing();
2288  if (bx == 0) {
2289  type = (event == 0 ? HitSimType::Signal : HitSimType::ITPileup);
2290  }
2291  ret.type = static_cast<HitSimType>(std::min(static_cast<int>(ret.type), static_cast<int>(type)));
2292 
2293  // Limit to only input TrackingParticles (usually signal+ITPU)
2294  auto tpIndex = tpKeyToIndex.find(trackingParticle.key());
2295  if (tpIndex == tpKeyToIndex.end())
2296  continue;
2297 
2298  //now get the corresponding sim hit
2299  std::pair<TrackingParticleRef, TrackPSimHitRef> simHitTPpairWithDummyTP(trackingParticle, TrackPSimHitRef());
2300  //SimHit is dummy: for simHitTPAssociationListGreater sorting only the TP is needed
2301  auto range = std::equal_range(simHitsTPAssoc.begin(),
2302  simHitsTPAssoc.end(),
2303  simHitTPpairWithDummyTP,
2305  bool foundSimHit = false;
2306  bool foundElectron = false;
2307  for (auto ip = range.first; ip != range.second; ++ip) {
2308  TrackPSimHitRef TPhit = ip->second;
2309  DetId dId = DetId(TPhit->detUnitId());
2310  if (dId.rawId() == hitId.rawId()) {
2311  // skip electron SimHits for non-electron TPs also here
2312  if (std::abs(TPhit->particleType()) == 11 && std::abs(trackingParticle->pdgId()) != 11) {
2313  foundElectron = true;
2314  continue;
2315  }
2316 
2317  foundSimHit = true;
2318  auto simHitKey = TPhit.key();
2319  auto simHitID = TPhit.id();
2320 
2321  auto simHitIndex = simHitRefKeyToIndex.at(std::make_pair(simHitKey, simHitID));
2322  ret.matchingSimHit.push_back(simHitIndex);
2323 
2324  double chargeFraction = 0.;
2325  for (const SimTrack& simtrk : trackingParticle->g4Tracks()) {
2326  auto found = simTrackIdToChargeFraction.find(simtrk.trackId());
2327  if (found != simTrackIdToChargeFraction.end()) {
2328  chargeFraction += found->second;
2329  }
2330  }
2331  ret.chargeFraction.push_back(chargeFraction);
2332 
2333  // only for debug prints
2334  ret.bunchCrossing.push_back(bx);
2335  ret.event.push_back(event);
2336 
2337  simhit_hitIdx[simHitIndex].push_back(clusterKey);
2338  simhit_hitType[simHitIndex].push_back(static_cast<int>(hitType));
2339  }
2340  }
2341  if (!foundSimHit) {
2342  // In case we didn't find a simhit because of filtered-out
2343  // electron SimHit, just ignore the missing SimHit.
2344  if (foundElectron)
2345  continue;
2346 
2347  auto ex = cms::Exception("LogicError")
2348  << "Did not find SimHit for reco hit DetId " << hitId.rawId() << " for TP " << trackingParticle.key()
2349  << " bx:event " << bx << ":" << event << ".\nFound SimHits from detectors ";
2350  for (auto ip = range.first; ip != range.second; ++ip) {
2351  TrackPSimHitRef TPhit = ip->second;
2352  DetId dId = DetId(TPhit->detUnitId());
2353  ex << dId.rawId() << " ";
2354  }
2355  if (trackingParticle->eventId().event() != 0) {
2356  ex << "\nSince this is a TrackingParticle from pileup, check that you're running the pileup mixing in "
2357  "playback mode.";
2358  }
2359  throw ex;
2360  }
2361  }
2362  }
2363 
2364  return ret;
2365 }
2366 
2368  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2370  const TrackerTopology& tTopo,
2371  SimHitRefKeyToIndex& simHitRefKeyToIndex,
2372  std::vector<TPHitIndex>& tpHitList) {
2373  for (const auto& assoc : simHitsTPAssoc) {
2374  auto tpKey = assoc.first.key();
2375 
2376  // SimHitTPAssociationList can contain more TrackingParticles than
2377  // what are given to this EDAnalyzer, so we can filter those out here.
2378  auto found = tpKeyToIndex.find(tpKey);
2379  if (found == tpKeyToIndex.end())
2380  continue;
2381  const auto tpIndex = found->second;
2382 
2383  // skip non-tracker simhits (mostly muons)
2384  const auto& simhit = *(assoc.second);
2385  auto detId = DetId(simhit.detUnitId());
2386  if (detId.det() != DetId::Tracker)
2387  continue;
2388 
2389  // Skip electron SimHits for non-electron TrackingParticles to
2390  // filter out delta rays. The delta ray hits just confuse. If we
2391  // need them later, let's add them as a separate "collection" of
2392  // hits of a TP
2393  const TrackingParticle& tp = *(assoc.first);
2394  if (std::abs(simhit.particleType()) == 11 && std::abs(tp.pdgId()) != 11)
2395  continue;
2396 
2397  auto simHitKey = std::make_pair(assoc.second.key(), assoc.second.id());
2398 
2399  if (simHitRefKeyToIndex.find(simHitKey) != simHitRefKeyToIndex.end()) {
2400  for (const auto& assoc2 : simHitsTPAssoc) {
2401  if (std::make_pair(assoc2.second.key(), assoc2.second.id()) == simHitKey) {
2402 #ifdef EDM_ML_DEBUG
2403  auto range1 = std::equal_range(simHitsTPAssoc.begin(),
2404  simHitsTPAssoc.end(),
2405  std::make_pair(assoc.first, TrackPSimHitRef()),
2407  auto range2 = std::equal_range(simHitsTPAssoc.begin(),
2408  simHitsTPAssoc.end(),
2409  std::make_pair(assoc2.first, TrackPSimHitRef()),
2411 
2412  LogTrace("TrackingNtuple") << "Earlier TP " << assoc2.first.key() << " SimTrack Ids";
2413  for (const auto& simTrack : assoc2.first->g4Tracks()) {
2414  edm::LogPrint("TrackingNtuple") << " SimTrack " << simTrack.trackId() << " BX:event "
2415  << simTrack.eventId().bunchCrossing() << ":" << simTrack.eventId().event();
2416  }
2417  for (auto iHit = range2.first; iHit != range2.second; ++iHit) {
2418  LogTrace("TrackingNtuple") << " SimHit " << iHit->second.key() << " " << iHit->second.id() << " tof "
2419  << iHit->second->tof() << " trackId " << iHit->second->trackId() << " BX:event "
2420  << iHit->second->eventId().bunchCrossing() << ":"
2421  << iHit->second->eventId().event();
2422  }
2423  LogTrace("TrackingNtuple") << "Current TP " << assoc.first.key() << " SimTrack Ids";
2424  for (const auto& simTrack : assoc.first->g4Tracks()) {
2425  edm::LogPrint("TrackingNtuple") << " SimTrack " << simTrack.trackId() << " BX:event "
2426  << simTrack.eventId().bunchCrossing() << ":" << simTrack.eventId().event();
2427  }
2428  for (auto iHit = range1.first; iHit != range1.second; ++iHit) {
2429  LogTrace("TrackingNtuple") << " SimHit " << iHit->second.key() << " " << iHit->second.id() << " tof "
2430  << iHit->second->tof() << " trackId " << iHit->second->trackId() << " BX:event "
2431  << iHit->second->eventId().bunchCrossing() << ":"
2432  << iHit->second->eventId().event();
2433  }
2434 #endif
2435 
2436  throw cms::Exception("LogicError")
2437  << "Got second time the SimHit " << simHitKey.first << " of " << simHitKey.second
2438  << ", first time with TrackingParticle " << assoc2.first.key() << ", now with " << tpKey;
2439  }
2440  }
2441  throw cms::Exception("LogicError") << "Got second time the SimHit " << simHitKey.first << " of "
2442  << simHitKey.second << ", now with TrackingParticle " << tpKey
2443  << ", but I didn't find the first occurrance!";
2444  }
2445 
2446  auto det = tracker.idToDetUnit(detId);
2447  if (!det)
2448  throw cms::Exception("LogicError") << "Did not find a det unit for DetId " << simhit.detUnitId()
2449  << " from tracker geometry";
2450 
2451  const auto pos = det->surface().toGlobal(simhit.localPosition());
2452  const float tof = simhit.timeOfFlight();
2453 
2454  const auto simHitIndex = simhit_x.size();
2455  simHitRefKeyToIndex[simHitKey] = simHitIndex;
2456 
2457  if (includeStripHits_)
2458  simhit_detId.push_back(tTopo, detId);
2459  else
2460  simhit_detId_phase2.push_back(tTopo, detId);
2461  simhit_x.push_back(pos.x());
2462  simhit_y.push_back(pos.y());
2463  simhit_z.push_back(pos.z());
2464  simhit_particle.push_back(simhit.particleType());
2465  simhit_process.push_back(simhit.processType());
2466  simhit_eloss.push_back(simhit.energyLoss());
2467  simhit_tof.push_back(tof);
2468  //simhit_simTrackId.push_back(simhit.trackId());
2469 
2470  simhit_simTrkIdx.push_back(tpIndex);
2471 
2472  simhit_hitIdx.emplace_back(); // filled in matchCluster
2473  simhit_hitType.emplace_back(); // filled in matchCluster
2474 
2475  tpHitList.emplace_back(tpKey, simHitIndex, tof, simhit.detUnitId());
2476  }
2477 }
2478 
2480  const ClusterTPAssociation& clusterToTPMap,
2481  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2483  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
2484  const TransientTrackingRecHitBuilder& theTTRHBuilder,
2485  const TrackerTopology& tTopo,
2486  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
2487  std::set<edm::ProductID>& hitProductIds) {
2489  iEvent.getByToken(pixelRecHitToken_, pixelHits);
2490  for (auto it = pixelHits->begin(); it != pixelHits->end(); it++) {
2491  const DetId hitId = it->detId();
2492  for (auto hit = it->begin(); hit != it->end(); hit++) {
2493  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&*hit);
2494 
2495  hitProductIds.insert(hit->cluster().id());
2496 
2497  const int key = hit->cluster().key();
2498  const int lay = tTopo.layer(hitId);
2499 
2500  pix_isBarrel.push_back(hitId.subdetId() == 1);
2501  pix_detId.push_back(tTopo, hitId);
2502  pix_trkIdx.emplace_back(); // filled in fillTracks
2503  pix_seeIdx.emplace_back(); // filled in fillSeeds
2504  pix_x.push_back(ttrh->globalPosition().x());
2505  pix_y.push_back(ttrh->globalPosition().y());
2506  pix_z.push_back(ttrh->globalPosition().z());
2507  pix_xx.push_back(ttrh->globalPositionError().cxx());
2508  pix_xy.push_back(ttrh->globalPositionError().cyx());
2509  pix_yy.push_back(ttrh->globalPositionError().cyy());
2510  pix_yz.push_back(ttrh->globalPositionError().czy());
2511  pix_zz.push_back(ttrh->globalPositionError().czz());
2512  pix_zx.push_back(ttrh->globalPositionError().czx());
2513  pix_radL.push_back(ttrh->surface()->mediumProperties().radLen());
2514  pix_bbxi.push_back(ttrh->surface()->mediumProperties().xi());
2515 
2516  LogTrace("TrackingNtuple") << "pixHit cluster=" << key << " subdId=" << hitId.subdetId() << " lay=" << lay
2517  << " rawId=" << hitId.rawId() << " pos =" << ttrh->globalPosition();
2518  if (includeTrackingParticles_) {
2519  SimHitData simHitData = matchCluster(hit->firstClusterRef(),
2520  hitId,
2521  key,
2522  ttrh,
2523  clusterToTPMap,
2524  tpKeyToIndex,
2525  simHitsTPAssoc,
2526  digiSimLink,
2527  simHitRefKeyToIndex,
2528  HitType::Pixel);
2529  pix_simHitIdx.push_back(simHitData.matchingSimHit);
2530  pix_simType.push_back(static_cast<int>(simHitData.type));
2531  pix_chargeFraction.push_back(simHitData.chargeFraction);
2532  LogTrace("TrackingNtuple") << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
2533  if (!simHitData.matchingSimHit.empty()) {
2534  const auto simHitIdx = simHitData.matchingSimHit[0];
2535  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx << " simHitPos="
2536  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
2537  << " energyLoss=" << simhit_eloss[simHitIdx]
2538  << " particleType=" << simhit_particle[simHitIdx]
2539  << " processType=" << simhit_process[simHitIdx]
2540  << " bunchCrossing=" << simHitData.bunchCrossing[0]
2541  << " event=" << simHitData.event[0];
2542  }
2543  }
2544  }
2545  }
2546 }
2547 
2549  const ClusterTPAssociation& clusterToTPMap,
2550  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2552  const edm::DetSetVector<StripDigiSimLink>& digiSimLink,
2553  const TransientTrackingRecHitBuilder& theTTRHBuilder,
2554  const TrackerTopology& tTopo,
2555  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
2556  std::set<edm::ProductID>& hitProductIds) {
2557  //index strip hit branches by cluster index
2559  iEvent.getByToken(stripRphiRecHitToken_, rphiHits);
2561  iEvent.getByToken(stripStereoRecHitToken_, stereoHits);
2562  int totalStripHits = rphiHits->dataSize() + stereoHits->dataSize();
2563  str_isBarrel.resize(totalStripHits);
2564  str_detId.resize(totalStripHits);
2565  str_trkIdx.resize(totalStripHits); // filled in fillTracks
2566  str_seeIdx.resize(totalStripHits); // filled in fillSeeds
2567  str_simHitIdx.resize(totalStripHits);
2568  str_simType.resize(totalStripHits);
2569  str_chargeFraction.resize(totalStripHits);
2570  str_x.resize(totalStripHits);
2571  str_y.resize(totalStripHits);
2572  str_z.resize(totalStripHits);
2573  str_xx.resize(totalStripHits);
2574  str_xy.resize(totalStripHits);
2575  str_yy.resize(totalStripHits);
2576  str_yz.resize(totalStripHits);
2577  str_zz.resize(totalStripHits);
2578  str_zx.resize(totalStripHits);
2579  str_radL.resize(totalStripHits);
2580  str_bbxi.resize(totalStripHits);
2581 
2582  auto fill = [&](const SiStripRecHit2DCollection& hits, const char* name) {
2583  for (const auto& detset : hits) {
2584  const DetId hitId = detset.detId();
2585  for (const auto& hit : detset) {
2586  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&hit);
2587 
2588  hitProductIds.insert(hit.cluster().id());
2589 
2590  const int key = hit.cluster().key();
2591  const int lay = tTopo.layer(hitId);
2593  str_detId.set(key, tTopo, hitId);
2594  str_x[key] = ttrh->globalPosition().x();
2595  str_y[key] = ttrh->globalPosition().y();
2596  str_z[key] = ttrh->globalPosition().z();
2597  str_xx[key] = ttrh->globalPositionError().cxx();
2598  str_xy[key] = ttrh->globalPositionError().cyx();
2599  str_yy[key] = ttrh->globalPositionError().cyy();
2600  str_yz[key] = ttrh->globalPositionError().czy();
2601  str_zz[key] = ttrh->globalPositionError().czz();
2602  str_zx[key] = ttrh->globalPositionError().czx();
2603  str_radL[key] = ttrh->surface()->mediumProperties().radLen();
2604  str_bbxi[key] = ttrh->surface()->mediumProperties().xi();
2605  LogTrace("TrackingNtuple") << name << " cluster=" << key << " subdId=" << hitId.subdetId() << " lay=" << lay
2606  << " rawId=" << hitId.rawId() << " pos =" << ttrh->globalPosition();
2607 
2608  if (includeTrackingParticles_) {
2609  SimHitData simHitData = matchCluster(hit.firstClusterRef(),
2610  hitId,
2611  key,
2612  ttrh,
2613  clusterToTPMap,
2614  tpKeyToIndex,
2615  simHitsTPAssoc,
2616  digiSimLink,
2617  simHitRefKeyToIndex,
2618  HitType::Strip);
2619  str_simHitIdx[key] = simHitData.matchingSimHit;
2620  str_simType[key] = static_cast<int>(simHitData.type);
2621  str_chargeFraction[key] = simHitData.chargeFraction;
2622  LogTrace("TrackingNtuple") << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
2623  if (!simHitData.matchingSimHit.empty()) {
2624  const auto simHitIdx = simHitData.matchingSimHit[0];
2625  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx << " simHitPos="
2626  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
2627  << " simHitPos="
2628  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
2629  << " energyLoss=" << simhit_eloss[simHitIdx]
2630  << " particleType=" << simhit_particle[simHitIdx]
2631  << " processType=" << simhit_process[simHitIdx]
2632  << " bunchCrossing=" << simHitData.bunchCrossing[0]
2633  << " event=" << simHitData.event[0];
2634  }
2635  }
2636  }
2637  }
2638  };
2639 
2640  fill(*rphiHits, "stripRPhiHit");
2641  fill(*stereoHits, "stripStereoHit");
2642 }
2643 
2645  const TransientTrackingRecHitBuilder& theTTRHBuilder,
2646  const TrackerTopology& tTopo,
2647  std::vector<std::pair<int, int>>& monoStereoClusterList) {
2648  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&hit);
2649  const auto hitId = hit.geographicalId();
2650  const int lay = tTopo.layer(hitId);
2651  monoStereoClusterList.emplace_back(hit.monoHit().cluster().key(), hit.stereoHit().cluster().key());
2652  glu_isBarrel.push_back((hitId.subdetId() == StripSubdetector::TIB || hitId.subdetId() == StripSubdetector::TOB));
2653  glu_detId.push_back(tTopo, hitId);
2654  glu_monoIdx.push_back(hit.monoHit().cluster().key());
2655  glu_stereoIdx.push_back(hit.stereoHit().cluster().key());
2656  glu_seeIdx.emplace_back(); // filled in fillSeeds
2657  glu_x.push_back(ttrh->globalPosition().x());
2658  glu_y.push_back(ttrh->globalPosition().y());
2659  glu_z.push_back(ttrh->globalPosition().z());
2660  glu_xx.push_back(ttrh->globalPositionError().cxx());
2661  glu_xy.push_back(ttrh->globalPositionError().cyx());
2662  glu_yy.push_back(ttrh->globalPositionError().cyy());
2663  glu_yz.push_back(ttrh->globalPositionError().czy());
2664  glu_zz.push_back(ttrh->globalPositionError().czz());
2665  glu_zx.push_back(ttrh->globalPositionError().czx());
2666  glu_radL.push_back(ttrh->surface()->mediumProperties().radLen());
2667  glu_bbxi.push_back(ttrh->surface()->mediumProperties().xi());
2668  LogTrace("TrackingNtuple") << "stripMatchedHit"
2669  << " cluster0=" << hit.stereoHit().cluster().key()
2670  << " cluster1=" << hit.monoHit().cluster().key() << " subdId=" << hitId.subdetId()
2671  << " lay=" << lay << " rawId=" << hitId.rawId() << " pos =" << ttrh->globalPosition();
2672  return glu_isBarrel.size() - 1;
2673 }
2674 
2676  const TransientTrackingRecHitBuilder& theTTRHBuilder,
2677  const TrackerTopology& tTopo,
2678  std::vector<std::pair<int, int>>& monoStereoClusterList) {
2680  iEvent.getByToken(stripMatchedRecHitToken_, matchedHits);
2681  for (auto it = matchedHits->begin(); it != matchedHits->end(); it++) {
2682  for (auto hit = it->begin(); hit != it->end(); hit++) {
2683  addStripMatchedHit(*hit, theTTRHBuilder, tTopo, monoStereoClusterList);
2684  }
2685  }
2686 }
2687 
2689  const ClusterTPAssociation& clusterToTPMap,
2690  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2692  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
2693  const TransientTrackingRecHitBuilder& theTTRHBuilder,
2694  const TrackerTopology& tTopo,
2695  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
2696  std::set<edm::ProductID>& hitProductIds) {
2698  iEvent.getByToken(phase2OTRecHitToken_, phase2OTHits);
2699  for (auto it = phase2OTHits->begin(); it != phase2OTHits->end(); it++) {
2700  const DetId hitId = it->detId();
2701  for (auto hit = it->begin(); hit != it->end(); hit++) {
2702  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&*hit);
2703 
2704  hitProductIds.insert(hit->cluster().id());
2705 
2706  const int key = hit->cluster().key();
2707  const int lay = tTopo.layer(hitId);
2708 
2709  ph2_isBarrel.push_back(hitId.subdetId() == 1);
2710  ph2_detId.push_back(tTopo, hitId);
2711  ph2_trkIdx.emplace_back(); // filled in fillTracks
2712  ph2_seeIdx.emplace_back(); // filled in fillSeeds
2713  ph2_x.push_back(ttrh->globalPosition().x());
2714  ph2_y.push_back(ttrh->globalPosition().y());
2715  ph2_z.push_back(ttrh->globalPosition().z());
2716  ph2_xx.push_back(ttrh->globalPositionError().cxx());
2717  ph2_xy.push_back(ttrh->globalPositionError().cyx());
2718  ph2_yy.push_back(ttrh->globalPositionError().cyy());
2719  ph2_yz.push_back(ttrh->globalPositionError().czy());
2720  ph2_zz.push_back(ttrh->globalPositionError().czz());
2721  ph2_zx.push_back(ttrh->globalPositionError().czx());
2722  ph2_radL.push_back(ttrh->surface()->mediumProperties().radLen());
2723  ph2_bbxi.push_back(ttrh->surface()->mediumProperties().xi());
2724 
2725  LogTrace("TrackingNtuple") << "phase2 OT cluster=" << key << " subdId=" << hitId.subdetId() << " lay=" << lay
2726  << " rawId=" << hitId.rawId() << " pos =" << ttrh->globalPosition();
2727 
2728  if (includeTrackingParticles_) {
2729  SimHitData simHitData = matchCluster(hit->firstClusterRef(),
2730  hitId,
2731  key,
2732  ttrh,
2733  clusterToTPMap,
2734  tpKeyToIndex,
2735  simHitsTPAssoc,
2736  digiSimLink,
2737  simHitRefKeyToIndex,
2739  ph2_simHitIdx.push_back(simHitData.matchingSimHit);
2740  ph2_simType.push_back(static_cast<int>(simHitData.type));
2741  LogTrace("TrackingNtuple") << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
2742  if (!simHitData.matchingSimHit.empty()) {
2743  const auto simHitIdx = simHitData.matchingSimHit[0];
2744  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx << " simHitPos="
2745  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
2746  << " energyLoss=" << simhit_eloss[simHitIdx]
2747  << " particleType=" << simhit_particle[simHitIdx]
2748  << " processType=" << simhit_process[simHitIdx]
2749  << " bunchCrossing=" << simHitData.bunchCrossing[0]
2750  << " event=" << simHitData.event[0];
2751  }
2752  }
2753  }
2754  }
2755 }
2756 
2758  const TrackingParticleRefVector& tpCollection,
2759  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2760  const reco::BeamSpot& bs,
2761  const reco::TrackToTrackingParticleAssociator& associatorByHits,
2762  const ClusterTPAssociation& clusterToTPMap,
2763  const TransientTrackingRecHitBuilder& theTTRHBuilder,
2764  const MagneticField& theMF,
2765  const TrackerTopology& tTopo,
2766  std::vector<std::pair<int, int>>& monoStereoClusterList,
2767  const std::set<edm::ProductID>& hitProductIds,
2768  std::map<edm::ProductID, size_t>& seedCollToOffset) {
2769  TSCBLBuilderNoMaterial tscblBuilder;
2770  for (size_t iColl = 0; iColl < seedTokens_.size(); ++iColl) {
2771  const auto& seedToken = seedTokens_[iColl];
2772 
2773  edm::Handle<edm::View<reco::Track>> seedTracksHandle;
2774  iEvent.getByToken(seedToken, seedTracksHandle);
2775  const auto& seedTracks = *seedTracksHandle;
2776 
2777  if (seedTracks.empty())
2778  continue;
2779 
2781  labelsForToken(seedToken, labels);
2782 
2783  const auto& seedStopInfoToken = seedStopInfoTokens_[iColl];
2784  edm::Handle<std::vector<SeedStopInfo>> seedStopInfoHandle;
2785  iEvent.getByToken(seedStopInfoToken, seedStopInfoHandle);
2786  const auto& seedStopInfos = *seedStopInfoHandle;
2787  if (seedTracks.size() != seedStopInfos.size()) {
2789  labelsForToken(seedStopInfoToken, labels2);
2790 
2791  throw cms::Exception("LogicError") << "Got " << seedTracks.size() << " seeds, but " << seedStopInfos.size()
2792  << " seed stopping infos for collections " << labels.module << ", "
2793  << labels2.module;
2794  }
2795 
2796  // The associator interfaces really need to be fixed...
2797  edm::RefToBaseVector<reco::Track> seedTrackRefs;
2798  for (edm::View<reco::Track>::size_type i = 0; i < seedTracks.size(); ++i) {
2799  seedTrackRefs.push_back(seedTracks.refAt(i));
2800  }
2801  reco::RecoToSimCollection recSimColl = associatorByHits.associateRecoToSim(seedTrackRefs, tpCollection);
2802  reco::SimToRecoCollection simRecColl = associatorByHits.associateSimToReco(seedTrackRefs, tpCollection);
2803 
2804  TString label = labels.module;
2805  //format label to match algoName
2806  label.ReplaceAll("seedTracks", "");
2807  label.ReplaceAll("Seeds", "");
2808  label.ReplaceAll("muonSeeded", "muonSeededStep");
2809  int algo = reco::TrackBase::algoByName(label.Data());
2810 
2811  edm::ProductID id = seedTracks[0].seedRef().id();
2812  const auto offset = see_fitok.size();
2813  auto inserted = seedCollToOffset.emplace(id, offset);
2814  if (!inserted.second)
2815  throw cms::Exception("Configuration")
2816  << "Trying to add seeds with ProductID " << id << " for a second time from collection " << labels.module
2817  << ", seed algo " << label << ". Typically this is caused by a configuration problem.";
2818  see_offset.push_back(offset);
2819 
2820  LogTrace("TrackingNtuple") << "NEW SEED LABEL: " << label << " size: " << seedTracks.size() << " algo=" << algo
2821  << " ProductID " << id;
2822 
2823  for (size_t iSeed = 0; iSeed < seedTrackRefs.size(); ++iSeed) {
2824  const auto& seedTrackRef = seedTrackRefs[iSeed];
2825  const auto& seedTrack = *seedTrackRef;
2826  const auto& seedRef = seedTrack.seedRef();
2827  const auto& seed = *seedRef;
2828 
2829  const auto seedStopInfo = seedStopInfos[iSeed];
2830 
2831  if (seedRef.id() != id)
2832  throw cms::Exception("LogicError")
2833  << "All tracks in 'TracksFromSeeds' collection should point to seeds in the same collection. Now the "
2834  "element 0 had ProductID "
2835  << id << " while the element " << seedTrackRef.key() << " had " << seedTrackRef.id()
2836  << ". The source collection is " << labels.module << ".";
2837 
2838  std::vector<int> tpIdx;
2839  std::vector<float> sharedFraction;
2840  auto foundTPs = recSimColl.find(seedTrackRef);
2841  if (foundTPs != recSimColl.end()) {
2842  for (const auto tpQuality : foundTPs->val) {
2843  tpIdx.push_back(tpKeyToIndex.at(tpQuality.first.key()));
2844  sharedFraction.push_back(tpQuality.second);
2845  }
2846  }
2847 
2848  // Search for a best-matching TrackingParticle for a seed
2849  const int nHits = seedTrack.numberOfValidHits();
2850  const auto clusters = track_associator::hitsToClusterRefs(
2851  seedTrack.recHitsBegin(),
2852  seedTrack.recHitsEnd()); // TODO: this function is called 3 times per track, try to reduce
2853  const int nClusters = clusters.size();
2854  const auto bestKeyCount = findBestMatchingTrackingParticle(seedTrack, clusterToTPMap, tpKeyToIndex);
2855  const float bestShareFrac =
2856  nClusters > 0 ? static_cast<float>(bestKeyCount.countClusters) / static_cast<float>(nClusters) : 0;
2857  // Another way starting from the first hit of the seed
2858  const auto bestFirstHitKeyCount =
2859  findMatchingTrackingParticleFromFirstHit(seedTrack, clusterToTPMap, tpKeyToIndex);
2860  const float bestFirstHitShareFrac =
2861  nClusters > 0 ? static_cast<float>(bestFirstHitKeyCount.countClusters) / static_cast<float>(nClusters) : 0;
2862 
2863  const bool seedFitOk = !trackFromSeedFitFailed(seedTrack);
2864  const int charge = seedTrack.charge();
2865  const float pt = seedFitOk ? seedTrack.pt() : 0;
2866  const float eta = seedFitOk ? seedTrack.eta() : 0;
2867  const float phi = seedFitOk ? seedTrack.phi() : 0;
2868 
2869  const auto seedIndex = see_fitok.size();
2870 
2871  see_fitok.push_back(seedFitOk);
2872 
2873  see_px.push_back(seedFitOk ? seedTrack.px() : 0);
2874  see_py.push_back(seedFitOk ? seedTrack.py() : 0);
2875  see_pz.push_back(seedFitOk ? seedTrack.pz() : 0);
2876  see_pt.push_back(pt);
2877  see_eta.push_back(eta);
2878  see_phi.push_back(phi);
2879  see_q.push_back(charge);
2880  see_nValid.push_back(nHits);
2881 
2882  see_dxy.push_back(seedFitOk ? seedTrack.dxy(bs.position()) : 0);
2883  see_dz.push_back(seedFitOk ? seedTrack.dz(bs.position()) : 0);
2884  see_ptErr.push_back(seedFitOk ? seedTrack.ptError() : 0);
2885  see_etaErr.push_back(seedFitOk ? seedTrack.etaError() : 0);
2886  see_phiErr.push_back(seedFitOk ? seedTrack.phiError() : 0);
2887  see_dxyErr.push_back(seedFitOk ? seedTrack.dxyError() : 0);
2888  see_dzErr.push_back(seedFitOk ? seedTrack.dzError() : 0);
2889  see_algo.push_back(algo);
2890  see_stopReason.push_back(seedStopInfo.stopReasonUC());
2891  see_nCands.push_back(seedStopInfo.candidatesPerSeed());
2892 
2893  const auto& state = seedTrack.seedRef()->startingState();
2894  const auto& pos = state.parameters().position();
2895  const auto& mom = state.parameters().momentum();
2896  see_statePt.push_back(state.pt());
2897  see_stateTrajX.push_back(pos.x());
2898  see_stateTrajY.push_back(pos.y());
2899  see_stateTrajPx.push_back(mom.x());
2900  see_stateTrajPy.push_back(mom.y());
2901  see_stateTrajPz.push_back(mom.z());
2902 
2903  see_trkIdx.push_back(-1); // to be set correctly in fillTracks
2904  if (includeTrackingParticles_) {
2905  see_simTrkIdx.push_back(tpIdx);
2906  see_simTrkShareFrac.push_back(sharedFraction);
2907  see_bestSimTrkIdx.push_back(bestKeyCount.key >= 0 ? tpKeyToIndex.at(bestKeyCount.key) : -1);
2909  bestFirstHitKeyCount.key >= 0 ? tpKeyToIndex.at(bestFirstHitKeyCount.key) : -1);
2910  } else {
2911  see_isTrue.push_back(!tpIdx.empty());
2912  }
2913  see_bestSimTrkShareFrac.push_back(bestShareFrac);
2914  see_bestFromFirstHitSimTrkShareFrac.push_back(bestFirstHitShareFrac);
2915 
2917  /*
2918  TransientTrackingRecHit::RecHitPointer lastRecHit = theTTRHBuilder.build(&*(seed.recHits().second-1));
2919  TrajectoryStateOnSurface state = trajectoryStateTransform::transientState( itSeed->startingState(), lastRecHit->surface(), &theMF);
2920  float pt = state.globalParameters().momentum().perp();
2921  float eta = state.globalParameters().momentum().eta();
2922  float phi = state.globalParameters().momentum().phi();
2923  see_px .push_back( state.globalParameters().momentum().x() );
2924  see_py .push_back( state.globalParameters().momentum().y() );
2925  see_pz .push_back( state.globalParameters().momentum().z() );
2926  */
2927 
2928  std::vector<int> hitIdx;
2929  std::vector<int> hitType;
2930 
2931  for (auto hit = seed.recHits().first; hit != seed.recHits().second; ++hit) {
2932  TransientTrackingRecHit::RecHitPointer recHit = theTTRHBuilder.build(&*hit);
2933  int subid = recHit->geographicalId().subdetId();
2934  if (subid == (int)PixelSubdetector::PixelBarrel || subid == (int)PixelSubdetector::PixelEndcap) {
2935  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*recHit);
2936  const auto& clusterRef = bhit->firstClusterRef();
2937  const auto clusterKey = clusterRef.cluster_pixel().key();
2938  if (includeAllHits_) {
2939  checkProductID(hitProductIds, clusterRef.id(), "seed");
2940  pix_seeIdx[clusterKey].push_back(seedIndex);
2941  }
2942  hitIdx.push_back(clusterKey);
2943  hitType.push_back(static_cast<int>(HitType::Pixel));
2944  } else if (subid == (int)StripSubdetector::TOB || subid == (int)StripSubdetector::TID ||
2945  subid == (int)StripSubdetector::TIB || subid == (int)StripSubdetector::TEC) {
2946  if (trackerHitRTTI::isMatched(*recHit)) {
2947  const SiStripMatchedRecHit2D* matchedHit = dynamic_cast<const SiStripMatchedRecHit2D*>(&*recHit);
2948  if (includeAllHits_) {
2949  checkProductID(hitProductIds, matchedHit->monoClusterRef().id(), "seed");
2950  checkProductID(hitProductIds, matchedHit->stereoClusterRef().id(), "seed");
2951  }
2952  int monoIdx = matchedHit->monoClusterRef().key();
2953  int stereoIdx = matchedHit->stereoClusterRef().key();
2954 
2955  std::vector<std::pair<int, int>>::iterator pos =
2956  find(monoStereoClusterList.begin(), monoStereoClusterList.end(), std::make_pair(monoIdx, stereoIdx));
2957  size_t gluedIndex = -1;
2958  if (pos != monoStereoClusterList.end()) {
2959  gluedIndex = std::distance(monoStereoClusterList.begin(), pos);
2960  } else {
2961  // We can encounter glued hits not in the input
2962  // SiStripMatchedRecHit2DCollection, e.g. via muon
2963  // outside-in seeds (or anything taking hits from
2964  // MeasurementTrackerEvent). So let's add them here.
2965  gluedIndex = addStripMatchedHit(*matchedHit, theTTRHBuilder, tTopo, monoStereoClusterList);
2966  }
2967 
2968  if (includeAllHits_)
2969  glu_seeIdx[gluedIndex].push_back(seedIndex);
2970  hitIdx.push_back(gluedIndex);
2971  hitType.push_back(static_cast<int>(HitType::Glued));
2972  } else {
2973  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*recHit);
2974  const auto& clusterRef = bhit->firstClusterRef();
2975  unsigned int clusterKey;
2976  if (clusterRef.isPhase2()) {
2977  clusterKey = clusterRef.cluster_phase2OT().key();
2978  } else {
2979  clusterKey = clusterRef.cluster_strip().key();
2980  }
2981 
2982  if (includeAllHits_) {
2983  checkProductID(hitProductIds, clusterRef.id(), "seed");
2984  if (clusterRef.isPhase2()) {
2985  ph2_seeIdx[clusterKey].push_back(seedIndex);
2986  } else {
2987  str_seeIdx[clusterKey].push_back(seedIndex);
2988  }
2989  }
2990 
2991  hitIdx.push_back(clusterKey);
2992  if (clusterRef.isPhase2()) {
2993  hitType.push_back(static_cast<int>(HitType::Phase2OT));
2994  } else {
2995  hitType.push_back(static_cast<int>(HitType::Strip));
2996  }
2997  }
2998  } else {
2999  LogTrace("TrackingNtuple") << " not pixel and not Strip detector";
3000  }
3001  }
3002  see_hitIdx.push_back(hitIdx);
3003  see_hitType.push_back(hitType);
3004  see_nPixel.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Pixel)));
3005  see_nGlued.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Glued)));
3006  see_nStrip.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Strip)));
3007  see_nPhase2OT.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Phase2OT)));
3008  see_nCluster.push_back(nClusters);
3009  //the part below is not strictly needed
3010  float chi2 = -1;
3011  if (nHits == 2) {
3012  TransientTrackingRecHit::RecHitPointer recHit0 = theTTRHBuilder.build(&*(seed.recHits().first));
3013  TransientTrackingRecHit::RecHitPointer recHit1 = theTTRHBuilder.build(&*(seed.recHits().first + 1));
3014  std::vector<GlobalPoint> gp(2);
3015  std::vector<GlobalError> ge(2);
3016  gp[0] = recHit0->globalPosition();
3017  ge[0] = recHit0->globalPositionError();
3018  gp[1] = recHit1->globalPosition();
3019  ge[1] = recHit1->globalPositionError();
3020  LogTrace("TrackingNtuple")
3021  << "seed " << seedTrackRef.key() << " pt=" << pt << " eta=" << eta << " phi=" << phi << " q=" << charge
3022  << " - PAIR - ids: " << recHit0->geographicalId().rawId() << " " << recHit1->geographicalId().rawId()
3023  << " hitpos: " << gp[0] << " " << gp[1] << " trans0: "
3024  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[0]->globalPosition()
3025  : GlobalPoint(0, 0, 0))
3026  << " "
3027  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[1]->globalPosition()
3028  : GlobalPoint(0, 0, 0))
3029  << " trans1: "
3030  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[0]->globalPosition()
3031  : GlobalPoint(0, 0, 0))
3032  << " "
3033  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[1]->globalPosition()
3034  : GlobalPoint(0, 0, 0))
3035  << " eta,phi: " << gp[0].eta() << "," << gp[0].phi();
3036  } else if (nHits == 3) {
3037  TransientTrackingRecHit::RecHitPointer recHit0 = theTTRHBuilder.build(&*(seed.recHits().first));
3038  TransientTrackingRecHit::RecHitPointer recHit1 = theTTRHBuilder.build(&*(seed.recHits().first + 1));
3039  TransientTrackingRecHit::RecHitPointer recHit2 = theTTRHBuilder.build(&*(seed.recHits().first + 2));
3041  declareDynArray(GlobalError, 4, ge);
3042  declareDynArray(bool, 4, bl);
3043  gp[0] = recHit0->globalPosition();
3044  ge[0] = recHit0->globalPositionError();
3045  int subid0 = recHit0->geographicalId().subdetId();
3046  bl[0] = (subid0 == StripSubdetector::TIB || subid0 == StripSubdetector::TOB ||
3047  subid0 == (int)PixelSubdetector::PixelBarrel);
3048  gp[1] = recHit1->globalPosition();
3049  ge[1] = recHit1->globalPositionError();
3050  int subid1 = recHit1->geographicalId().subdetId();
3051  bl[1] = (subid1 == StripSubdetector::TIB || subid1 == StripSubdetector::TOB ||
3052  subid1 == (int)PixelSubdetector::PixelBarrel);
3053  gp[2] = recHit2->globalPosition();
3054  ge[2] = recHit2->globalPositionError();
3055  int subid2 = recHit2->geographicalId().subdetId();
3056  bl[2] = (subid2 == StripSubdetector::TIB || subid2 == StripSubdetector::TOB ||
3057  subid2 == (int)PixelSubdetector::PixelBarrel);
3058  RZLine rzLine(gp, ge, bl);
3059  float seed_chi2 = rzLine.chi2();
3060  //float seed_pt = state.globalParameters().momentum().perp();
3061  float seed_pt = pt;
3062  LogTrace("TrackingNtuple")
3063  << "seed " << seedTrackRef.key() << " pt=" << pt << " eta=" << eta << " phi=" << phi << " q=" << charge
3064  << " - TRIPLET - ids: " << recHit0->geographicalId().rawId() << " " << recHit1->geographicalId().rawId()
3065  << " " << recHit2->geographicalId().rawId() << " hitpos: " << gp[0] << " " << gp[1] << " " << gp[2]
3066  << " trans0: "
3067  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[0]->globalPosition()
3068  : GlobalPoint(0, 0, 0))
3069  << " "
3070  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[1]->globalPosition()
3071  : GlobalPoint(0, 0, 0))
3072  << " trans1: "
3073  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[0]->globalPosition()
3074  : GlobalPoint(0, 0, 0))
3075  << " "
3076  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[1]->globalPosition()
3077  : GlobalPoint(0, 0, 0))
3078  << " trans2: "
3079  << (recHit2->transientHits().size() > 1 ? recHit2->transientHits()[0]->globalPosition()
3080  : GlobalPoint(0, 0, 0))
3081  << " "
3082  << (recHit2->transientHits().size() > 1 ? recHit2->transientHits()[1]->globalPosition()
3083  : GlobalPoint(0, 0, 0))
3084  << " local: "
3085  << recHit2->localPosition()
3086  //<< " tsos pos, mom: " << state.globalPosition()<<" "<<state.globalMomentum()
3087  << " eta,phi: " << gp[0].eta() << "," << gp[0].phi() << " pt,chi2: " << seed_pt << "," << seed_chi2;
3088  chi2 = seed_chi2;
3089  }
3090  see_chi2.push_back(chi2);
3091  }
3092 
3093  fillTrackingParticlesForSeeds(tpCollection, simRecColl, tpKeyToIndex, offset);
3094  }
3095 }
3096 
3098  const TrackingParticleRefVector& tpCollection,
3099  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
3100  const TrackingParticleRefKeyToCount& tpKeyToClusterCount,
3101  const MagneticField& mf,
3102  const reco::BeamSpot& bs,
3103  const reco::VertexCollection& vertices,
3104  const reco::TrackToTrackingParticleAssociator& associatorByHits,
3105  const ClusterTPAssociation& clusterToTPMap,
3106  const TransientTrackingRecHitBuilder& theTTRHBuilder,
3107  const TrackerTopology& tTopo,
3108  const std::set<edm::ProductID>& hitProductIds,
3109  const std::map<edm::ProductID, size_t>& seedCollToOffset,
3110  const std::vector<const MVACollection*>& mvaColls,
3111  const std::vector<const QualityMaskCollection*>& qualColls) {
3112  reco::RecoToSimCollection recSimColl = associatorByHits.associateRecoToSim(tracks, tpCollection);
3114  labelsForToken(trackToken_, labels);
3115  LogTrace("TrackingNtuple") << "NEW TRACK LABEL: " << labels.module;
3116 
3117  auto pvPosition = vertices[0].position();
3118 
3119  for (size_t iTrack = 0; iTrack < tracks.size(); ++iTrack) {
3120  const auto& itTrack = tracks[iTrack];
3121  int charge = itTrack->charge();
3122  float pt = itTrack->pt();
3123  float eta = itTrack->eta();
3124  const double lambda = itTrack->lambda();
3125  float chi2 = itTrack->normalizedChi2();
3126  float ndof = itTrack->ndof();
3127  float phi = itTrack->phi();
3128  int nHits = itTrack->numberOfValidHits();
3129  const reco::HitPattern& hp = itTrack->hitPattern();
3130 
3131  const auto& tkParam = itTrack->parameters();
3132  auto tkCov = itTrack->covariance();
3133  tkCov.Invert();
3134 
3135  // Standard track-TP matching
3136  int nSimHits = 0;
3137  bool isSimMatched = false;
3138  std::vector<int> tpIdx;
3139  std::vector<float> sharedFraction;
3140  std::vector<float> tpChi2;
3141  auto foundTPs = recSimColl.find(itTrack);
3142  if (foundTPs != recSimColl.end()) {
3143  if (!foundTPs->val.empty()) {
3144  nSimHits = foundTPs->val[0].first->numberOfTrackerHits();
3145  isSimMatched = true;
3146  }
3147  for (const auto tpQuality : foundTPs->val) {
3148  tpIdx.push_back(tpKeyToIndex.at(tpQuality.first.key()));
3149  sharedFraction.push_back(tpQuality.second);
3150  tpChi2.push_back(track_associator::trackAssociationChi2(tkParam, tkCov, *(tpCollection[tpIdx.back()]), mf, bs));
3151  }
3152  }
3153 
3154  // Search for a best-matching TrackingParticle for a track
3155  const auto clusters = track_associator::hitsToClusterRefs(
3156  itTrack->recHitsBegin(),
3157  itTrack->recHitsEnd()); // TODO: this function is called 3 times per track, try to reduce
3158  const int nClusters = clusters.size();
3159 
3160  const auto bestKeyCount = findBestMatchingTrackingParticle(*itTrack, clusterToTPMap, tpKeyToIndex);
3161  const float bestShareFrac = static_cast<float>(bestKeyCount.countClusters) / static_cast<float>(nClusters);
3162  float bestShareFracSimDenom = 0;
3163  float bestShareFracSimClusterDenom = 0;
3164  float bestChi2 = -1;
3165  if (bestKeyCount.key >= 0) {
3166  bestShareFracSimDenom =
3167  static_cast<float>(bestKeyCount.countClusters) /
3168  static_cast<float>(tpCollection[tpKeyToIndex.at(bestKeyCount.key)]->numberOfTrackerHits());
3169  bestShareFracSimClusterDenom =
3170  static_cast<float>(bestKeyCount.countClusters) / static_cast<float>(tpKeyToClusterCount.at(bestKeyCount.key));
3172  tkParam, tkCov, *(tpCollection[tpKeyToIndex.at(bestKeyCount.key)]), mf, bs);
3173  }
3174  // Another way starting from the first hit of the track
3175  const auto bestFirstHitKeyCount = findMatchingTrackingParticleFromFirstHit(*itTrack, clusterToTPMap, tpKeyToIndex);
3176  const float bestFirstHitShareFrac =
3177  static_cast<float>(bestFirstHitKeyCount.countClusters) / static_cast<float>(nClusters);
3178  float bestFirstHitShareFracSimDenom = 0;
3179  float bestFirstHitShareFracSimClusterDenom = 0;
3180  float bestFirstHitChi2 = -1;
3181  if (bestFirstHitKeyCount.key >= 0) {
3182  bestFirstHitShareFracSimDenom =
3183  static_cast<float>(bestFirstHitKeyCount.countClusters) /
3184  static_cast<float>(tpCollection[tpKeyToIndex.at(bestFirstHitKeyCount.key)]->numberOfTrackerHits());
3185  bestFirstHitShareFracSimClusterDenom = static_cast<float>(bestFirstHitKeyCount.countClusters) /
3186  static_cast<float>(tpKeyToClusterCount.at(bestFirstHitKeyCount.key));
3187  bestFirstHitChi2 = track_associator::trackAssociationChi2(
3188  tkParam, tkCov, *(tpCollection[tpKeyToIndex.at(bestFirstHitKeyCount.key)]), mf, bs);
3189  }
3190 
3191  float chi2_1Dmod = chi2;
3192  int count1dhits = 0;
3193  for (auto iHit = itTrack->recHitsBegin(), iEnd = itTrack->recHitsEnd(); iHit != iEnd; ++iHit) {
3194  const TrackingRecHit& hit = **iHit;
3195  if (hit.isValid() && typeid(hit) == typeid(SiStripRecHit1D))
3196  ++count1dhits;
3197  }
3198  if (count1dhits > 0) {
3199  chi2_1Dmod = (chi2 + count1dhits) / (ndof + count1dhits);
3200  }
3201 
3202  Point bestPV = getBestVertex(*itTrack, vertices);
3203 
3204  trk_px.push_back(itTrack->px());
3205  trk_py.push_back(itTrack->py());
3206  trk_pz.push_back(itTrack->pz());
3207  trk_pt.push_back(pt);
3208  trk_inner_px.push_back(itTrack->innerMomentum().x());
3209  trk_inner_py.push_back(itTrack->innerMomentum().y());
3210  trk_inner_pz.push_back(itTrack->innerMomentum().z());
3211  trk_inner_pt.push_back(itTrack->innerMomentum().rho());
3212  trk_outer_px.push_back(itTrack->outerMomentum().x());
3213  trk_outer_py.push_back(itTrack->outerMomentum().y());
3214  trk_outer_pz.push_back(itTrack->outerMomentum().z());
3215  trk_outer_pt.push_back(itTrack->outerMomentum().rho());
3216  trk_eta.push_back(eta);
3217  trk_lambda.push_back(lambda);
3218  trk_cotTheta.push_back(1 / tan(M_PI * 0.5 - lambda));
3219  trk_phi.push_back(phi);
3220  trk_dxy.push_back(itTrack->dxy(bs.position()));
3221  trk_dz.push_back(itTrack->dz(bs.position()));
3222  trk_dxyPV.push_back(itTrack->dxy(pvPosition));
3223  trk_dzPV.push_back(itTrack->dz(pvPosition));
3224  trk_dxyClosestPV.push_back(itTrack->dxy(bestPV));
3225  trk_dzClosestPV.push_back(itTrack->dz(bestPV));
3226  trk_ptErr.push_back(itTrack->ptError());
3227  trk_etaErr.push_back(itTrack->etaError());
3228  trk_lambdaErr.push_back(itTrack->lambdaError());
3229  trk_phiErr.push_back(itTrack->phiError());
3230  trk_dxyErr.push_back(itTrack->dxyError());
3231  trk_dzErr.push_back(itTrack->dzError());
3232  trk_refpoint_x.push_back(itTrack->vx());
3233  trk_refpoint_y.push_back(itTrack->vy());
3234  trk_refpoint_z.push_back(itTrack->vz());
3235  trk_nChi2.push_back(chi2);
3236  trk_nChi2_1Dmod.push_back(chi2_1Dmod);
3237  trk_ndof.push_back(ndof);
3238  trk_q.push_back(charge);
3239  trk_nValid.push_back(hp.numberOfValidHits());
3240  trk_nLost.push_back(hp.numberOfLostHits(reco::HitPattern::TRACK_HITS));
3241  trk_nInactive.push_back(hp.trackerLayersTotallyOffOrBad(reco::HitPattern::TRACK_HITS));
3242  trk_nPixel.push_back(hp.numberOfValidPixelHits());
3243  trk_nStrip.push_back(hp.numberOfValidStripHits());
3244  trk_nOuterLost.push_back(hp.numberOfLostTrackerHits(reco::HitPattern::MISSING_OUTER_HITS));
3245  trk_nInnerLost.push_back(hp.numberOfLostTrackerHits(reco::HitPattern::MISSING_INNER_HITS));
3246  trk_nOuterInactive.push_back(hp.trackerLayersTotallyOffOrBad(reco::HitPattern::MISSING_OUTER_HITS));
3247  trk_nInnerInactive.push_back(hp.trackerLayersTotallyOffOrBad(reco::HitPattern::MISSING_INNER_HITS));
3248  trk_nPixelLay.push_back(hp.pixelLayersWithMeasurement());
3249  trk_nStripLay.push_back(hp.stripLayersWithMeasurement());
3252  trk_nCluster.push_back(nClusters);
3253  trk_algo.push_back(itTrack->algo());
3254  trk_originalAlgo.push_back(itTrack->originalAlgo());
3255  trk_algoMask.push_back(itTrack->algoMaskUL());
3256  trk_stopReason.push_back(itTrack->stopReason());
3257  trk_isHP.push_back(itTrack->quality(reco::TrackBase::highPurity));
3258  if (includeMVA_) {
3259  for (size_t i = 0; i < trk_mvas.size(); ++i) {
3260  trk_mvas[i].push_back((*(mvaColls[i]))[iTrack]);
3261  trk_qualityMasks[i].push_back((*(qualColls[i]))[iTrack]);
3262  }
3263  }
3264  if (includeSeeds_) {
3265  auto offset = seedCollToOffset.find(itTrack->seedRef().id());
3266  if (offset == seedCollToOffset.end()) {
3267  throw cms::Exception("Configuration")
3268  << "Track algo '" << reco::TrackBase::algoName(itTrack->algo()) << "' originalAlgo '"
3269  << reco::TrackBase::algoName(itTrack->originalAlgo()) << "' refers to seed collection "
3270  << itTrack->seedRef().id()
3271  << ", but that seed collection is not given as an input. The following collections were given as an input "
3272  << make_ProductIDMapPrinter(seedCollToOffset);
3273  }
3274 
3275  const auto seedIndex = offset->second + itTrack->seedRef().key();
3276  trk_seedIdx.push_back(seedIndex);
3277  if (see_trkIdx[seedIndex] != -1) {
3278  throw cms::Exception("LogicError") << "Track index has already been set for seed " << seedIndex << " to "
3279  << see_trkIdx[seedIndex] << "; was trying to set it to " << iTrack;
3280  }
3281  see_trkIdx[seedIndex] = iTrack;
3282  }
3283  trk_vtxIdx.push_back(-1); // to be set correctly in fillVertices
3284  if (includeTrackingParticles_) {
3285  trk_simTrkIdx.push_back(tpIdx);
3286  trk_simTrkShareFrac.push_back(sharedFraction);
3287  trk_simTrkNChi2.push_back(tpChi2);
3288  trk_bestSimTrkIdx.push_back(bestKeyCount.key >= 0 ? tpKeyToIndex.at(bestKeyCount.key) : -1);
3289  trk_bestFromFirstHitSimTrkIdx.push_back(bestFirstHitKeyCount.key >= 0 ? tpKeyToIndex.at(bestFirstHitKeyCount.key)
3290  : -1);
3291  } else {
3292  trk_isTrue.push_back(!tpIdx.empty());
3293  }
3294  trk_bestSimTrkShareFrac.push_back(bestShareFrac);
3295  trk_bestSimTrkShareFracSimDenom.push_back(bestShareFracSimDenom);
3296  trk_bestSimTrkShareFracSimClusterDenom.push_back(bestShareFracSimClusterDenom);
3297  trk_bestSimTrkNChi2.push_back(bestChi2);
3298  trk_bestFromFirstHitSimTrkShareFrac.push_back(bestFirstHitShareFrac);
3299  trk_bestFromFirstHitSimTrkShareFracSimDenom.push_back(bestFirstHitShareFracSimDenom);
3300  trk_bestFromFirstHitSimTrkShareFracSimClusterDenom.push_back(bestFirstHitShareFracSimClusterDenom);
3301  trk_bestFromFirstHitSimTrkNChi2.push_back(bestFirstHitChi2);
3302 
3303  LogTrace("TrackingNtuple") << "Track #" << itTrack.key() << " with q=" << charge << ", pT=" << pt
3304  << " GeV, eta: " << eta << ", phi: " << phi << ", chi2=" << chi2 << ", Nhits=" << nHits
3305  << ", algo=" << itTrack->algoName(itTrack->algo()).c_str()
3306  << " hp=" << itTrack->quality(reco::TrackBase::highPurity)
3307  << " seed#=" << itTrack->seedRef().key() << " simMatch=" << isSimMatched
3308  << " nSimHits=" << nSimHits
3309  << " sharedFraction=" << (sharedFraction.empty() ? -1 : sharedFraction[0])
3310  << " tpIdx=" << (tpIdx.empty() ? -1 : tpIdx[0]);
3311  std::vector<int> hitIdx;
3312  std::vector<int> hitType;
3313 
3314  for (auto i = itTrack->recHitsBegin(); i != itTrack->recHitsEnd(); i++) {
3315  TransientTrackingRecHit::RecHitPointer hit = theTTRHBuilder.build(&**i);
3316  DetId hitId = hit->geographicalId();
3317  LogTrace("TrackingNtuple") << "hit #" << std::distance(itTrack->recHitsBegin(), i)
3318  << " subdet=" << hitId.subdetId();
3319  if (hitId.det() != DetId::Tracker)
3320  continue;
3321 
3322  LogTrace("TrackingNtuple") << " " << subdetstring(hitId.subdetId()) << " " << tTopo.layer(hitId);
3323 
3324  if (hit->isValid()) {
3325  //ugly... but works
3326  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*hit);
3327  const auto& clusterRef = bhit->firstClusterRef();
3328  unsigned int clusterKey;
3329  if (clusterRef.isPixel()) {
3330  clusterKey = clusterRef.cluster_pixel().key();
3331  } else if (clusterRef.isPhase2()) {
3332  clusterKey = clusterRef.cluster_phase2OT().key();
3333  } else {
3334  clusterKey = clusterRef.cluster_strip().key();
3335  }
3336 
3337  LogTrace("TrackingNtuple") << " id: " << hitId.rawId() << " - globalPos =" << hit->globalPosition()
3338  << " cluster=" << clusterKey << " clusterRef ID=" << clusterRef.id()
3339  << " eta,phi: " << hit->globalPosition().eta() << "," << hit->globalPosition().phi();
3340  if (includeAllHits_) {
3341  checkProductID(hitProductIds, clusterRef.id(), "track");
3342  if (clusterRef.isPixel()) {
3343  pix_trkIdx[clusterKey].push_back(iTrack);
3344  } else if (clusterRef.isPhase2()) {
3345  ph2_trkIdx[clusterKey].push_back(iTrack);
3346  } else {
3347  str_trkIdx[clusterKey].push_back(iTrack);
3348  }
3349  }
3350 
3351  hitIdx.push_back(clusterKey);
3352  if (clusterRef.isPixel()) {
3353  hitType.push_back(static_cast<int>(HitType::Pixel));
3354  } else if (clusterRef.isPhase2()) {
3355  hitType.push_back(static_cast<int>(HitType::Phase2OT));
3356  } else {
3357  hitType.push_back(static_cast<int>(HitType::Strip));
3358  }
3359  } else {
3360  LogTrace("TrackingNtuple") << " - invalid hit";
3361 
3362  hitIdx.push_back(inv_isBarrel.size());
3363  hitType.push_back(static_cast<int>(HitType::Invalid));
3364 
3365  inv_isBarrel.push_back(hitId.subdetId() == 1);
3366  if (includeStripHits_)
3367  inv_detId.push_back(tTopo, hitId);
3368  else
3369  inv_detId_phase2.push_back(tTopo, hitId);
3370  inv_type.push_back(hit->getType());
3371  }
3372  }
3373 
3374  trk_hitIdx.push_back(hitIdx);
3375  trk_hitType.push_back(hitType);
3376  }
3377 }
3378 
3380  const edm::EventSetup& iSetup,
3381  const edm::RefToBaseVector<reco::Track>& tracks,
3382  const reco::BeamSpot& bs,
3383  const TrackingParticleRefVector& tpCollection,
3384  const TrackingVertexRefKeyToIndex& tvKeyToIndex,
3385  const reco::TrackToTrackingParticleAssociator& associatorByHits,
3386  const std::vector<TPHitIndex>& tpHitList,
3387  const TrackingParticleRefKeyToCount& tpKeyToClusterCount) {
3388  edm::ESHandle<ParametersDefinerForTP> parametersDefinerH;
3389  iSetup.get<TrackAssociatorRecord>().get(parametersDefinerName_, parametersDefinerH);
3390  const ParametersDefinerForTP* parametersDefiner = parametersDefinerH.product();
3391 
3392  // Number of 3D layers for TPs
3394  iEvent.getByToken(tpNLayersToken_, tpNLayersH);
3395  const auto& nLayers_tPCeff = *tpNLayersH;
3396 
3397  iEvent.getByToken(tpNPixelLayersToken_, tpNLayersH);
3398  const auto& nPixelLayers_tPCeff = *tpNLayersH;
3399 
3400  iEvent.getByToken(tpNStripStereoLayersToken_, tpNLayersH);
3401  const auto& nStripMonoAndStereoLayers_tPCeff = *tpNLayersH;
3402 
3403  reco::SimToRecoCollection simRecColl = associatorByHits.associateSimToReco(tracks, tpCollection);
3404 
3405  for (const TrackingParticleRef& tp : tpCollection) {
3406  LogTrace("TrackingNtuple") << "tracking particle pt=" << tp->pt() << " eta=" << tp->eta() << " phi=" << tp->phi();
3407  bool isRecoMatched = false;
3408  std::vector<int> tkIdx;
3409  std::vector<float> sharedFraction;
3410  auto foundTracks = simRecColl.find(tp);
3411  if (foundTracks != simRecColl.end()) {
3412  isRecoMatched = true;
3413  for (const auto trackQuality : foundTracks->val) {
3414  sharedFraction.push_back(trackQuality.second);
3415  tkIdx.push_back(trackQuality.first.key());
3416  }
3417  }
3418 
3419  sim_genPdgIds.emplace_back();
3420  for (const auto& genRef : tp->genParticles()) {
3421  if (genRef.isNonnull())
3422  sim_genPdgIds.back().push_back(genRef->pdgId());
3423  }
3424 
3425  bool isFromBHadron = false;
3426  // Logic is similar to SimTracker/TrackHistory
3427  if (tracer_.evaluate(tp)) { // ignore TP if history can not be traced
3428  // following is from TrackClassifier::processesAtGenerator()
3429  HistoryBase::RecoGenParticleTrail const& recoGenParticleTrail = tracer_.recoGenParticleTrail();
3430  for (const auto& particle : recoGenParticleTrail) {
3431  HepPDT::ParticleID particleID(particle->pdgId());
3432  if (particleID.hasBottom()) {
3433  isFromBHadron = true;
3434  break;
3435  }
3436  }
3437  }
3438 
3439  LogTrace("TrackingNtuple") << "matched to tracks = " << make_VectorPrinter(tkIdx)
3440  << " isRecoMatched=" << isRecoMatched;
3441  sim_event.push_back(tp->eventId().event());
3442  sim_bunchCrossing.push_back(tp->eventId().bunchCrossing());
3443  sim_pdgId.push_back(tp->pdgId());
3444  sim_isFromBHadron.push_back(isFromBHadron);
3445  sim_px.push_back(tp->px());
3446  sim_py.push_back(tp->py());
3447  sim_pz.push_back(tp->pz());
3448  sim_pt.push_back(tp->pt());
3449  sim_eta.push_back(tp->eta());
3450  sim_phi.push_back(tp->phi());
3451  sim_q.push_back(tp->charge());
3452  sim_trkIdx.push_back(tkIdx);
3453  sim_trkShareFrac.push_back(sharedFraction);
3454  sim_parentVtxIdx.push_back(tvKeyToIndex.at(tp->parentVertex().key()));
3455  std::vector<int> decayIdx;
3456  for (const auto& v : tp->decayVertices())
3457  decayIdx.push_back(tvKeyToIndex.at(v.key()));
3458  sim_decayVtxIdx.push_back(decayIdx);
3459 
3460  //Calcualte the impact parameters w.r.t. PCA
3461  TrackingParticle::Vector momentum = parametersDefiner->momentum(iEvent, iSetup, tp);
3462  TrackingParticle::Point vertex = parametersDefiner->vertex(iEvent, iSetup, tp);
3463  auto dxySim = TrackingParticleIP::dxy(vertex, momentum, bs.position());
3464  auto dzSim = TrackingParticleIP::dz(vertex, momentum, bs.position());
3465  const double lambdaSim = M_PI / 2 - momentum.theta();
3466  sim_pca_pt.push_back(std::sqrt(momentum.perp2()));
3467  sim_pca_eta.push_back(momentum.Eta());
3468  sim_pca_lambda.push_back(lambdaSim);
3469  sim_pca_cotTheta.push_back(1 / tan(M_PI * 0.5 - lambdaSim));
3470  sim_pca_phi.push_back(momentum.phi());
3471  sim_pca_dxy.push_back(dxySim);
3472  sim_pca_dz.push_back(dzSim);
3473 
3474  std::vector<int> hitIdx;
3475  int nPixel = 0, nStrip = 0;
3476  auto rangeHit = std::equal_range(tpHitList.begin(), tpHitList.end(), TPHitIndex(tp.key()), tpHitIndexListLess);
3477  for (auto ip = rangeHit.first; ip != rangeHit.second; ++ip) {
3478  auto type = HitType::Unknown;
3479  if (!simhit_hitType[ip->simHitIdx].empty())
3480  type = static_cast<HitType>(simhit_hitType[ip->simHitIdx][0]);
3481  LogTrace("TrackingNtuple") << "simhit=" << ip->simHitIdx << " type=" << static_cast<int>(type);
3482  hitIdx.push_back(ip->simHitIdx);
3483  const auto detid = DetId(includeStripHits_ ? simhit_detId[ip->simHitIdx] : simhit_detId_phase2[ip->simHitIdx]);
3484  if (detid.det() != DetId::Tracker) {
3485  throw cms::Exception("LogicError") << "Encountered SimHit for TP " << tp.key() << " with DetId "
3486  << detid.rawId() << " whose det() is not Tracker but " << detid.det();
3487  }
3488  const auto subdet = detid.subdetId();
3489  switch (subdet) {
3492  ++nPixel;
3493  break;
3494  case StripSubdetector::TIB:
3495  case StripSubdetector::TID:
3496  case StripSubdetector::TOB:
3497  case StripSubdetector::TEC:
3498  ++nStrip;
3499  break;
3500  default:
3501  throw cms::Exception("LogicError") << "Encountered SimHit for TP " << tp.key() << " with DetId "
3502  << detid.rawId() << " whose subdet is not recognized, is " << subdet;
3503  };
3504  }
3505  sim_nValid.push_back(hitIdx.size());
3506  sim_nPixel.push_back(nPixel);
3507  sim_nStrip.push_back(nStrip);
3508 
3509  const auto nSimLayers = nLayers_tPCeff[tp];
3510  const auto nSimPixelLayers = nPixelLayers_tPCeff[tp];
3511  const auto nSimStripMonoAndStereoLayers = nStripMonoAndStereoLayers_tPCeff[tp];
3512  sim_nLay.push_back(nSimLayers);
3513  sim_nPixelLay.push_back(nSimPixelLayers);
3514  sim_n3DLay.push_back(nSimPixelLayers + nSimStripMonoAndStereoLayers);
3515 
3516  sim_nTrackerHits.push_back(tp->numberOfTrackerHits());
3517  auto found = tpKeyToClusterCount.find(tp.key());
3518  sim_nRecoClusters.push_back(found != cend(tpKeyToClusterCount) ? found->second : 0);
3519 
3520  sim_simHitIdx.push_back(hitIdx);
3521  }
3522 }
3523 
3524 // called from fillSeeds
3526  const reco::SimToRecoCollection& simRecColl,
3527  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
3528  const unsigned int seedOffset) {
3529  if (sim_seedIdx.empty()) // first call
3530  sim_seedIdx.resize(tpCollection.size());
3531 
3532  for (const auto& keyVal : simRecColl) {
3533  const auto& tpRef = keyVal.key;
3534  auto found = tpKeyToIndex.find(tpRef.key());
3535  if (found == tpKeyToIndex.end())
3536  throw cms::Exception("Assert") << __FILE__ << ":" << __LINE__ << " fillTrackingParticlesForSeeds: tpRef.key() "
3537  << tpRef.key() << " not found from tpKeyToIndex. tpKeyToIndex size "
3538  << tpKeyToIndex.size();
3539  const auto tpIndex = found->second;
3540  for (const auto& pair : keyVal.val) {
3541  const auto& seedRef = pair.first->seedRef();
3542  sim_seedIdx[tpIndex].push_back(seedOffset + seedRef.key());
3543  }
3544  }
3545 }
3546 
3548  const edm::RefToBaseVector<reco::Track>& tracks) {
3549  for (size_t iVertex = 0, size = vertices.size(); iVertex < size; ++iVertex) {
3550  const reco::Vertex& vertex = vertices[iVertex];
3551  vtx_x.push_back(vertex.x());
3552  vtx_y.push_back(vertex.y());
3553  vtx_z.push_back(vertex.z());
3554  vtx_xErr.push_back(vertex.xError());
3555  vtx_yErr.push_back(vertex.yError());
3556  vtx_zErr.push_back(vertex.zError());
3557  vtx_chi2.push_back(vertex.chi2());
3558  vtx_ndof.push_back(vertex.ndof());
3559  vtx_fake.push_back(vertex.isFake());
3560  vtx_valid.push_back(vertex.isValid());
3561 
3562  std::vector<int> trkIdx;
3563  for (auto iTrack = vertex.tracks_begin(); iTrack != vertex.tracks_end(); ++iTrack) {
3564  // Ignore link if vertex was fit from a track collection different from the input
3565  if (iTrack->id() != tracks.id())
3566  continue;
3567 
3568  trkIdx.push_back(iTrack->key());
3569 
3570  if (trk_vtxIdx[iTrack->key()] != -1) {
3571  throw cms::Exception("LogicError") << "Vertex index has already been set for track " << iTrack->key() << " to "
3572  << trk_vtxIdx[iTrack->key()] << "; was trying to set it to " << iVertex;
3573  }
3574  trk_vtxIdx[iTrack->key()] = iVertex;
3575  }
3576  vtx_trkIdx.push_back(trkIdx);
3577  }
3578 }
3579 
3581  const TrackingParticleRefKeyToIndex& tpKeyToIndex) {
3582  int current_event = -1;
3583  for (const auto& ref : trackingVertices) {
3584  const TrackingVertex v = *ref;
3585  if (v.eventId().event() != current_event) {
3586  // next PV
3587  current_event = v.eventId().event();
3588  simpv_idx.push_back(simvtx_x.size());
3589  }
3590 
3591  unsigned int processType = std::numeric_limits<unsigned int>::max();
3592  if (!v.g4Vertices().empty()) {
3593  processType = v.g4Vertices()[0].processType();
3594  }
3595 
3596  simvtx_event.push_back(v.eventId().event());
3597  simvtx_bunchCrossing.push_back(v.eventId().bunchCrossing());
3598  simvtx_processType.push_back(processType);
3599 
3600  simvtx_x.push_back(v.position().x());
3601  simvtx_y.push_back(v.position().y());
3602  simvtx_z.push_back(v.position().z());
3603 
3604  auto fill = [&](const TrackingParticleRefVector& tps, std::vector<int>& idx) {
3605  for (const auto& tpRef : tps) {
3606  auto found = tpKeyToIndex.find(tpRef.key());
3607  if (found != tpKeyToIndex.end()) {
3608  idx.push_back(found->second);
3609  }
3610  }
3611  };
3612 
3613  std::vector<int> sourceIdx;
3614  std::vector<int> daughterIdx;
3615  fill(v.sourceTracks(), sourceIdx);
3616  fill(v.daughterTracks(), daughterIdx);
3617 
3618  simvtx_sourceSimIdx.push_back(sourceIdx);
3619  simvtx_daughterSimIdx.push_back(daughterIdx);
3620  }
3621 }
3622 
3623 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
3625  //The following says we do not know what parameters are allowed so do no validation
3626  // Please change this to state exactly what you do use, even if it is no parameters
3628  desc.addUntracked<std::vector<edm::InputTag>>(
3629  "seedTracks",
3630  std::vector<edm::InputTag>{edm::InputTag("seedTracksinitialStepSeeds"),
3631  edm::InputTag("seedTracksdetachedTripletStepSeeds"),
3632  edm::InputTag("seedTrackspixelPairStepSeeds"),
3633  edm::InputTag("seedTrackslowPtTripletStepSeeds"),
3634  edm::InputTag("seedTracksmixedTripletStepSeeds"),
3635  edm::InputTag("seedTrackspixelLessStepSeeds"),
3636  edm::InputTag("seedTrackstobTecStepSeeds"),
3637  edm::InputTag("seedTracksjetCoreRegionalStepSeeds"),
3638  edm::InputTag("seedTracksmuonSeededSeedsInOut"),
3639  edm::InputTag("seedTracksmuonSeededSeedsOutIn")});
3640  desc.addUntracked<std::vector<edm::InputTag>>(
3641  "trackCandidates",
3642  std::vector<edm::InputTag>{edm::InputTag("initialStepTrackCandidates"),
3643  edm::InputTag("detachedTripletStepTrackCandidates"),
3644  edm::InputTag("pixelPairStepTrackCandidates"),
3645  edm::InputTag("lowPtTripletStepTrackCandidates"),
3646  edm::InputTag("mixedTripletStepTrackCandidates"),
3647  edm::InputTag("pixelLessStepTrackCandidates"),
3648  edm::InputTag("tobTecStepTrackCandidates"),
3649  edm::InputTag("jetCoreRegionalStepTrackCandidates"),
3650  edm::InputTag("muonSeededTrackCandidatesInOut"),
3651  edm::InputTag("muonSeededTrackCandidatesOutIn")});
3652  desc.addUntracked<edm::InputTag>("tracks", edm::InputTag("generalTracks"));
3653  desc.addUntracked<std::vector<std::string>>("trackMVAs", std::vector<std::string>{{"generalTracks"}});
3654  desc.addUntracked<edm::InputTag>("trackingParticles", edm::InputTag("mix", "MergedTrackTruth"));
3655  desc.addUntracked<bool>("trackingParticlesRef", false);
3656  desc.addUntracked<edm::InputTag>("clusterTPMap", edm::InputTag("tpClusterProducer"));
3657  desc.addUntracked<edm::InputTag>("simHitTPMap", edm::InputTag("simHitTPAssocProducer"));
3658  desc.addUntracked<edm::InputTag>("trackAssociator", edm::InputTag("quickTrackAssociatorByHits"));
3659  desc.addUntracked<edm::InputTag>("pixelDigiSimLink", edm::InputTag("simSiPixelDigis"));
3660  desc.addUntracked<edm::InputTag>("stripDigiSimLink", edm::InputTag("simSiStripDigis"));
3661  desc.addUntracked<edm::InputTag>("phase2OTSimLink", edm::InputTag(""));
3662  desc.addUntracked<edm::InputTag>("beamSpot", edm::InputTag("offlineBeamSpot"));
3663  desc.addUntracked<edm::InputTag>("pixelRecHits", edm::InputTag("siPixelRecHits"));
3664  desc.addUntracked<edm::InputTag>("stripRphiRecHits", edm::InputTag("siStripMatchedRecHits", "rphiRecHit"));
3665  desc.addUntracked<edm::InputTag>("stripStereoRecHits", edm::InputTag("siStripMatchedRecHits", "stereoRecHit"));
3666  desc.addUntracked<edm::InputTag>("stripMatchedRecHits", edm::InputTag("siStripMatchedRecHits", "matchedRecHit"));
3667  desc.addUntracked<edm::InputTag>("phase2OTRecHits", edm::InputTag("siPhase2RecHits"));
3668  desc.addUntracked<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
3669  desc.addUntracked<edm::InputTag>("trackingVertices", edm::InputTag("mix", "MergedTrackTruth"));
3670  desc.addUntracked<edm::InputTag>("trackingParticleNlayers",
3671  edm::InputTag("trackingParticleNumberOfLayersProducer", "trackerLayers"));
3672  desc.addUntracked<edm::InputTag>("trackingParticleNpixellayers",
3673  edm::InputTag("trackingParticleNumberOfLayersProducer", "pixelLayers"));
3674  desc.addUntracked<edm::InputTag>("trackingParticleNstripstereolayers",
3675  edm::InputTag("trackingParticleNumberOfLayersProducer", "stripStereoLayers"));
3676  desc.addUntracked<std::string>("TTRHBuilder", "WithTrackAngle");
3677  desc.addUntracked<std::string>("parametersDefiner", "LhcParametersDefinerForTP");
3678  desc.addUntracked<bool>("includeSeeds", false);
3679  desc.addUntracked<bool>("includeAllHits", false);
3680  desc.addUntracked<bool>("includeMVA", true);
3681  desc.addUntracked<bool>("includeTrackingParticles", true);
3682  descriptions.add("trackingNtuple", desc);
3683 }
3684 
3685 //define this as a plug-in
#define LogDebug(id)
std::vector< unsigned int > sim_nTrackerHits
#define declareDynArray(T, n, x)
Definition: DynArray.h:91
std::vector< int > trk_bestSimTrkIdx
RunNumber_t run() const
Definition: EventID.h:38
size
Write out results.
std::vector< float > sim_pca_dz
edm::LuminosityBlockNumber_t ev_lumi
std::vector< float > trk_nChi2_1Dmod
static const std::string kSharedResource
Definition: TFileService.h:76
std::vector< unsigned int > simvtx_processType
Parsed parse(const TrackerTopology &tTopo, const DetId &id) const
edm::EDGetTokenT< TrackingParticleRefVector > trackingParticleRefToken_
std::vector< unsigned int > sim_nLay
type
Definition: HCALResponse.h:21
std::vector< float > ph2_radL
std::vector< float > trk_dxyPV
reco::SimToRecoCollection associateSimToReco(const edm::Handle< edm::View< reco::Track >> &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
EventNumber_t event() const
Definition: EventID.h:40
static constexpr auto TEC
unsigned int size_type
Definition: View.h:90
void fillTrackingVertices(const TrackingVertexRefVector &trackingVertices, const TrackingParticleRefKeyToIndex &tpKeyToIndex)
std::vector< float > see_bestSimTrkShareFrac
std::vector< std::vector< float > > see_simTrkShareFrac
edm::EDGetTokenT< SiStripMatchedRecHit2DCollection > stripMatchedRecHitToken_
T getUntrackedParameter(std::string const &, T const &) const
std::vector< short > see_fitok
Phase2Cluster1DRef cluster_phase2OT() const
std::vector< short > vtx_fake
std::vector< float > simvtx_z
std::vector< std::vector< float > > trk_simTrkNChi2
std::vector< std::vector< int > > see_hitType
std::vector< float > trk_dzClosestPV
edm::EDGetTokenT< SiStripRecHit2DCollection > stripRphiRecHitToken_
Phase2TrackerCluster1D const & phase2OTCluster() const
const TrackingParticleRefVector & sourceTracks() const
std::vector< short > ph2_isBarrel
bool tecIsDoubleSide(const DetId &id) const
TrackAssociatorByHitsImpl::SimHitTPAssociationList SimHitTPAssociationList
DetIdStrip str_detId
std::vector< float > trk_phi
SiPixelCluster const & pixelCluster() const
std::vector< float > sim_pca_cotTheta
bool tobIsDoubleSide(const DetId &id) const
const_iterator end(bool update=false) const
std::vector< float > sim_pca_dxy
void book(const std::string &prefix, TTree *tree)
std::vector< float > see_stateTrajX
std::vector< unsigned int > trk_nOuterLost
size_type dataSize() const
std::vector< float > glu_xy
std::vector< short > trk_isTrue
std::vector< std::vector< int > > ph2_seeIdx
std::vector< float > glu_radL
std::vector< float > trk_inner_pz
int event() const
get the contents of the subdetector field (should be protected?)
std::vector< float > see_stateTrajPy
std::vector< float > pix_y
std::vector< int > trk_vtxIdx
std::vector< std::vector< int > > str_trkIdx
std::vector< unsigned int > see_nValid
std::vector< float > str_yy
iterator find(det_id_type id)
Definition: DetSetVector.h:264
bool tibIsDoubleSide(const DetId &id) const
bool trackFromSeedFitFailed(const reco::Track &track)
std::vector< float > trk_outer_py
unsigned int tibString(const DetId &id) const
std::vector< float > pix_zz
unsigned int tidRing(const DetId &id) const
std::vector< unsigned short > layer
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
std::vector< float > ph2_bbxi
std::vector< int > glu_monoIdx
std::vector< float > trk_eta
module()
Definition: vlib.cc:913
std::vector< short > glu_isBarrel
std::vector< unsigned short > order
std::vector< int > sim_bunchCrossing
SimHitData matchCluster(const OmniClusterRef &cluster, DetId hitId, int clusterKey, const TransientTrackingRecHit::RecHitPointer &ttrh, const ClusterTPAssociation &clusterToTPMap, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< SimLink > &digiSimLinks, const SimHitRefKeyToIndex &simHitRefKeyToIndex, HitType hitType)
std::vector< float > see_phiErr
trackRef_iterator tracks_end() const
last iterator over tracks
Definition: Vertex.cc:73
std::vector< int > trk_bestFromFirstHitSimTrkIdx
std::vector< std::vector< int > > simhit_hitIdx
static bool simHitTPAssociationListGreater(SimHitTPPair i, SimHitTPPair j)
const_iterator end() const
last iterator over the map (read only)
std::vector< float > str_x
std::vector< float > see_dzErr
std::vector< unsigned int > sim_n3DLay
std::vector< float > trk_cotTheta
std::vector< float > trk_bestSimTrkNChi2
CombineDetId< DetIdCommon, DetIdOTCommon, DetIdStripOnly > DetIdStrip
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
std::vector< unsigned int > see_nStrip
std::vector< float > trk_px
double zError() const
error on z
Definition: Vertex.h:127
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
void fillPixelHits(const edm::Event &iEvent, const ClusterTPAssociation &clusterToTPMap, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< PixelDigiSimLink > &digiSimLink, const TransientTrackingRecHitBuilder &theTTRHBuilder, const TrackerTopology &tTopo, const SimHitRefKeyToIndex &simHitRefKeyToIndex, std::set< edm::ProductID > &hitProductIds)
std::vector< unsigned short > pix_simType
std::vector< unsigned short > inv_type
std::vector< float > see_stateTrajPz
std::vector< float > pix_zx
ret
prodAgent to be discontinued
TPHitIndex(unsigned int tp=0, unsigned int simHit=0, float to=0, unsigned int id=0)
const std::vector< SimVertex > & g4Vertices() const
std::vector< float > sim_phi
std::vector< std::vector< int > > trk_simTrkIdx
void fillStripRphiStereoHits(const edm::Event &iEvent, const ClusterTPAssociation &clusterToTPMap, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< StripDigiSimLink > &digiSimLink, const TransientTrackingRecHitBuilder &theTTRHBuilder, const TrackerTopology &tTopo, const SimHitRefKeyToIndex &simHitRefKeyToIndex, std::set< edm::ProductID > &hitProductIds)
int numberOfValidHits() const
Definition: HitPattern.h:787
std::vector< float > trk_dzPV
double y() const
y coordinate
Definition: Vertex.h:117
edm::EDGetTokenT< reco::TrackToTrackingParticleAssociator > trackAssociatorToken_
OmniClusterRef const & stereoClusterRef() const
int pdgId() const
PDG ID.
bool isValid() const
Tells whether the vertex is valid.
Definition: Vertex.h:71
edm::EDGetTokenT< SiStripRecHit2DCollection > stripStereoRecHitToken_
std::vector< float > trk_dxyErr
std::vector< float > str_yz
void push_back(const TrackerTopology &tTopo, const DetId &id)
std::vector< float > trk_pt
unsigned int tecRing(const DetId &id) const
ring id
std::vector< float > glu_x
std::vector< float > trk_inner_py
std::vector< float > see_px
std::vector< float > see_chi2
const_iterator find(const key_type &k) const
find element with specified reference key
std::vector< float > glu_z
std::vector< float > see_stateTrajY
edm::EDGetTokenT< edm::View< reco::Track > > trackToken_
CombineDetId< DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdPhase2OTOnly > DetIdAllPhase2
CombineDetId< DetIdCommon, DetIdPixelOnly > DetIdPixel
unsigned int pxbLadder(const DetId &id) const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
unsigned int side(const DetId &id) const
void fillBeamSpot(const reco::BeamSpot &bs)
std::vector< unsigned short > see_stopReason
std::vector< float > trk_outer_px
std::vector< std::vector< int > > trk_hitType
std::vector< unsigned int > trk_nCluster
DetIdPixel pix_detId
std::vector< float > ph2_xx
unsigned long long EventNumber_t
std::vector< std::vector< int > > ph2_trkIdx
int numberOfValidStripHits() const
Definition: HitPattern.h:813
#define BOOK(name)
edm::EDGetTokenT< Phase2TrackerRecHit1DCollectionNew > phase2OTRecHitToken_
bool isStereo(const DetId &id) const
size_type size() const
std::vector< OmniClusterRef > hitsToClusterRefs(iter begin, iter end)
std::vector< unsigned int > see_algo
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
std::vector< float > trk_inner_pt
uint16_t firstStrip() const
std::vector< short > simhit_process
std::vector< unsigned short > module
std::vector< float > trk_bestSimTrkShareFracSimClusterDenom
CombineDetId< DetIdCommon, DetIdOTCommon, DetIdPhase2OTOnly > DetIdPhase2OT
std::vector< std::vector< int > > str_seeIdx
std::vector< std::vector< int > > see_simTrkIdx
std::vector< int > simvtx_event
std::vector< float > str_radL
std::vector< int > simhit_simTrkIdx
key_type key() const
Accessor for product key.
Definition: Ref.h:250
std::vector< unsigned short > trk_stopReason
int pixelLayersWithMeasurement() const
Definition: HitPattern.cc:492
std::vector< unsigned short > ladder
static bool tpHitIndexListLess(const TPHitIndex &i, const TPHitIndex &j)
TrackingNtuple(const edm::ParameterSet &)
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:167
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
std::vector< float > sim_py
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:39
std::vector< float > sim_px
unsigned int LuminosityBlockNumber_t
std::vector< float > pix_xx
std::vector< std::vector< int > > sim_decayVtxIdx
std::vector< float > trk_refpoint_x
std::vector< float > pix_radL
std::vector< float > pix_bbxi
std::vector< std::vector< float > > sim_trkShareFrac
std::vector< std::vector< float > > trk_mvas
example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
void fillPhase2OTHits(const edm::Event &iEvent, const ClusterTPAssociation &clusterToTPMap, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< PixelDigiSimLink > &digiSimLink, const TransientTrackingRecHitBuilder &theTTRHBuilder, const TrackerTopology &tTopo, const SimHitRefKeyToIndex &simHitRefKeyToIndex, std::set< edm::ProductID > &hitProductIds)
std::vector< float > ph2_zx
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
std::vector< int > simpv_idx
std::vector< unsigned char > QualityMaskCollection
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > pixelSimLinkToken_
CombineDetId< DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdStripOnly > DetIdAll
std::vector< std::vector< int > > pix_seeIdx
int numberOfLostTrackerHits(HitCategory category) const
Definition: HitPattern.h:863
std::vector< unsigned short > str_simType
ClusterPixelRef cluster_pixel() const
std::vector< int > sim_q
std::vector< short > see_isTrue
std::vector< short > inv_isBarrel
std::vector< float > trk_bestSimTrkShareFracSimDenom
std::vector< unsigned short > ring
std::vector< float > trk_bestFromFirstHitSimTrkNChi2
RefToBase< value_type > refAt(size_type i) const
bool isLower(const DetId &id) const
math::XYZPointD Point
point in the space
std::vector< float > see_etaErr
std::vector< std::vector< float > > trk_simTrkShareFrac
std::vector< float > simhit_z
std::vector< float > ph2_z
std::vector< float > ph2_yy
Parsed parse(const TrackerTopology &tTopo, const DetId &id) const
std::vector< float > trk_refpoint_y
std::vector< unsigned int > trk_nLostLay
std::vector< float > MVACollection
unsigned int module(const DetId &id) const
std::vector< int > sim_event
char const * label
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
std::vector< unsigned int > trk_nStrip
SiStripCluster const & stripCluster() const
std::vector< const reco::GenParticle * > RecoGenParticleTrail
reco::GenParticle trail type.
Definition: HistoryBase.h:18
std::vector< int > see_bestSimTrkIdx
std::vector< float > chargeFraction
edm::EDGetTokenT< edm::ValueMap< unsigned int > > tpNStripStereoLayersToken_
unsigned int tibSide(const DetId &id) const
std::string parametersDefinerName_
std::vector< unsigned int > trk_nPixel
std::vector< float > glu_y
std::vector< unsigned short > panel
std::vector< float > trk_pz
int iEvent
Definition: GenABIO.cc:224
std::vector< float > trk_dzErr
std::vector< unsigned short > isStereo
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< float > trk_lambdaErr
std::vector< unsigned short > isUpper
int numberOfValidStripLayersWithMonoAndStereo(uint16_t stripdet, uint16_t layer) const
Definition: HitPattern.cc:348
std::vector< unsigned int > see_nCluster
edm::EDGetTokenT< SiPixelRecHitCollection > pixelRecHitToken_
std::vector< float > ph2_y
std::vector< std::tuple< edm::EDGetTokenT< MVACollection >, edm::EDGetTokenT< QualityMaskCollection > > > mvaQualityCollectionTokens_
std::vector< std::vector< int > > simvtx_sourceSimIdx
std::vector< float > trk_bestFromFirstHitSimTrkShareFracSimDenom
std::vector< float > trk_etaErr
std::vector< short > pix_isBarrel
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > siphase2OTSimLinksToken_
std::vector< float > glu_yz
std::vector< float > sim_pca_phi
auto dz(const T_Vertex &vertex, const T_Momentum &momentum, const T_Point &point)
std::vector< unsigned int > trk_algo
std::vector< unsigned int > sim_nRecoClusters
void fillTrackingParticlesForSeeds(const TrackingParticleRefVector &tpCollection, const reco::SimToRecoCollection &simRecColl, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const unsigned int seedOffset)
susybsm::HSCParticleRefProd hp
Definition: classes.h:27
std::vector< float > ph2_xy
T sqrt(T t)
Definition: SSEVec.h:19
std::vector< float > trk_bestFromFirstHitSimTrkShareFracSimClusterDenom
std::vector< float > vtx_y
std::vector< float > pix_z
void clear(CLHEP::HepGenMatrix &m)
Helper function: Reset all elements of a matrix to 0.
Definition: matutil.cc:151
std::vector< int > see_bestFromFirstHitSimTrkIdx
int bunchCrossing() const
get the detector field from this detid
std::vector< int > bunchCrossing
std::vector< float > sim_eta
std::vector< unsigned short > blade
std::vector< unsigned int > trk_originalAlgo
std::vector< unsigned int > trk_nInnerLost
std::vector< float > str_y
std::vector< int > sim_pdgId
std::vector< int > see_q
std::vector< std::vector< int > > simhit_hitType
std::vector< float > trk_refpoint_z
unsigned int tobSide(const DetId &id) const
std::vector< unsigned int > trk_nInactive
std::vector< edm::EDGetTokenT< edm::View< reco::Track > > > seedTokens_
edm::EDGetTokenT< SimHitTPAssociationProducer::SimHitTPAssociationList > simHitTPMapToken_
std::vector< unsigned int > trk_nOuterInactive
std::vector< float > pix_yz
std::vector< std::vector< int > > sim_genPdgIds
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
std::vector< int > trk_seedIdx
std::vector< std::vector< float > > pix_chargeFraction
edm::RunNumber_t ev_run
std::vector< float > vtx_yErr
std::vector< std::vector< int > > pix_trkIdx
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< unsigned int > sim_nValid
std::vector< float > glu_yy
std::vector< float > vtx_ndof
double chi2() const
chi-squares
Definition: Vertex.h:102
std::vector< std::vector< int > > ph2_simHitIdx
std::vector< float > simvtx_x
double z() const
z coordinate
Definition: Vertex.h:119
T operator[](int i) const
virtual TrackingParticle::Vector momentum(const edm::Event &iEvent, const edm::EventSetup &iSetup, const Charge ch, const Point &vtx, const LorentzVector &lv) const
std::vector< float > str_zz
DetIdAllPhase2 inv_detId_phase2
std::vector< float > sim_pca_pt
DetIdPhase2OT ph2_detId
std::vector< float > see_dxyErr
bool isMatched(TrackingRecHit const &hit)
std::vector< float > trk_bestFromFirstHitSimTrkShareFrac
double BeamWidthX() const
beam width X
Definition: BeamSpot.h:82
ClusterRef cluster() const
range equal_range(const OmniClusterRef &key) const
std::vector< float > see_pt
std::vector< unsigned int > see_nPhase2OT
edm::EDGetTokenT< TrackingVertexCollection > trackingVertexToken_
std::vector< float > see_dxy
std::vector< std::vector< int > > glu_seeIdx
std::vector< unsigned int > trk_n3DLay
std::vector< std::vector< int > > sim_trkIdx
Definition: Types.py:1
std::vector< float > trk_outer_pt
#define end
Definition: vmac.h:39
static bool tpHitIndexListLessSort(const TPHitIndex &i, const TPHitIndex &j)
std::vector< int > matchingSimHit
T min(T a, T b)
Definition: MathUtil.h:58
const bool includeSeeds_
const bool includeTrackingParticles_
OmniClusterRef const & firstClusterRef() const override
size_type size() const
constexpr int adc(sample_type sample)
get the ADC sample (12 bits)
std::vector< float > trk_dz
static constexpr auto TOB
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:88
std::vector< float > trk_ptErr
std::vector< unsigned int > trk_nStripLay
void fillSimHits(const TrackerGeometry &tracker, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const TrackerTopology &tTopo, SimHitRefKeyToIndex &simHitRefKeyToIndex, std::vector< TPHitIndex > &tpHitList)
std::vector< float > see_phi
OmniClusterRef const & monoClusterRef() const
std::vector< float > vtx_z
char const * module
Definition: ProductLabels.h:5
int trackerLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
Definition: HitPattern.h:993
std::vector< float > see_pz
void fillTrackingParticles(const edm::Event &iEvent, const edm::EventSetup &iSetup, const edm::RefToBaseVector< reco::Track > &tracks, const reco::BeamSpot &bs, const TrackingParticleRefVector &tpCollection, const TrackingVertexRefKeyToIndex &tvKeyToIndex, const reco::TrackToTrackingParticleAssociator &associatorByHits, const std::vector< TPHitIndex > &tpHitList, const TrackingParticleRefKeyToCount &tpKeyToClusterCount)
void book(const std::string &prefix, TTree *tree)
std::vector< float > trk_phiErr
std::vector< unsigned int > sim_nPixelLay
std::vector< float > trk_lambda
std::vector< edm::EDGetTokenT< std::vector< SeedStopInfo > > > seedStopInfoTokens_
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:325
#define LogTrace(id)
std::vector< float > glu_zz
std::vector< float > sim_pca_lambda
std::vector< float > see_stateTrajPx
std::vector< float > glu_zx
reco::RecoToSimCollection associateRecoToSim(const edm::Handle< edm::View< reco::Track >> &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
std::shared_ptr< TrackingRecHit const > RecHitPointer
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
double ndof() const
Definition: Vertex.h:109
def elem(elemtype, innerHTML='', html_class='', kwargs)
Definition: HTMLExport.py:19
void fillTracks(const edm::RefToBaseVector< reco::Track > &tracks, const TrackingParticleRefVector &tpCollection, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const TrackingParticleRefKeyToCount &tpKeyToClusterCount, const MagneticField &mf, const reco::BeamSpot &bs, const reco::VertexCollection &vertices, const reco::TrackToTrackingParticleAssociator &associatorByHits, const ClusterTPAssociation &clusterToTPMap, const TransientTrackingRecHitBuilder &theTTRHBuilder, const TrackerTopology &tTopo, const std::set< edm::ProductID > &hitProductIds, const std::map< edm::ProductID, size_t > &seedToCollIndex, const std::vector< const MVACollection * > &mvaColls, const std::vector< const QualityMaskCollection * > &qualColls)
#define M_PI
Definition: RZLine.h:12
std::vector< float > vtx_xErr
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool isUpper(const DetId &id) const
std::vector< float > sim_pz
std::vector< int > event
std::vector< std::vector< int > > sim_simHitIdx
edm::Ref< TrackingVertexCollection > TrackingVertexRef
std::vector< unsigned short > isGlued
edm::EventNumber_t ev_event
void push_back(const TrackerTopology &tTopo, const DetId &id)
Definition: DetId.h:17
std::vector< unsigned short > isRPhi
std::vector< float > ph2_x
edm::EDGetTokenT< reco::VertexCollection > vertexToken_
edm::EDGetTokenT< TrackingParticleCollection > trackingParticleToken_
double x() const
x coordinate
Definition: Vertex.h:115
std::vector< int > glu_stereoIdx
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
std::vector< float > trk_py
double xError() const
error on x
Definition: Vertex.h:123
static constexpr auto TIB
std::vector< std::vector< int > > pix_simHitIdx
std::vector< float > trk_nChi2
SiStripRecHit2D stereoHit() const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool isFake() const
Definition: Vertex.h:75
std::vector< std::vector< unsigned short > > trk_qualityMasks
void book(const std::string &prefix, TTree *tree)
def parse(path, config)
Definition: dumpparser.py:13
T const * product() const
Definition: Handle.h:69
std::vector< unsigned int > see_nGlued
std::vector< float > see_py
std::vector< float > pix_x
std::vector< unsigned int > detId
std::vector< int > sim_parentVtxIdx
std::vector< float > see_ptErr
const bool includeMVA_
std::vector< float > str_z
std::vector< unsigned short > isStack
std::vector< float > str_zx
uint32_t stack(const DetId &id) const
size_t addStripMatchedHit(const SiStripMatchedRecHit2D &hit, const TransientTrackingRecHitBuilder &theTTRHBuilder, const TrackerTopology &tTopo, std::vector< std::pair< int, int >> &monoStereoClusterList)
std::vector< TrackingVertex > TrackingVertexCollection
HistoryBase tracer_
double sigmaZ() const
sigma z
Definition: BeamSpot.h:76
std::string algoName() const
Definition: TrackBase.h:529
bool tidIsDoubleSide(const DetId &id) const
int stripLayersWithMeasurement() const
Definition: HitPattern.h:975
std::vector< short > trk_isHP
std::vector< float > str_xy
double BeamWidthY() const
beam width Y
Definition: BeamSpot.h:84
std::vector< std::vector< float > > str_chargeFraction
bool isValid() const
void push_back(const TrackerTopology &tTopo, const DetId &id)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
~TrackingNtuple() override
std::vector< unsigned int > trk_nInnerInactive
std::vector< unsigned short > isLower
unsigned int tecOrder(const DetId &id) const
Base class to all the history types.
Definition: HistoryBase.h:12
int numberOfLostHits(HitCategory category) const
Definition: HitPattern.h:861
std::vector< std::vector< int > > trk_hitIdx
unsigned int layer(const DetId &id) const
void labelsForToken(EDGetToken iToken, Labels &oLabels) const
void fillSeeds(const edm::Event &iEvent, const TrackingParticleRefVector &tpCollection, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const reco::BeamSpot &bs, const reco::TrackToTrackingParticleAssociator &associatorByHits, const ClusterTPAssociation &clusterToTPMap, const TransientTrackingRecHitBuilder &theTTRHBuilder, const MagneticField &theMF, const TrackerTopology &tTopo, std::vector< std::pair< int, int >> &monoStereoClusterList, const std::set< edm::ProductID > &hitProductIds, std::map< edm::ProductID, size_t > &seedToCollIndex)
SiStripRecHit2D monoHit() const
std::vector< int > trk_q
std::vector< unsigned int > sim_nPixel
std::vector< SimHitTPPair > SimHitTPAssociationList
const bool includeAllHits_
int trackerLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:532
std::vector< short > vtx_valid
bool evaluate(TrackingParticleRef tpr)
Evaluate track history using a TrackingParticleRef.
Definition: HistoryBase.h:96
edm::EventID id() const
Definition: EventBase.h:59
const EncodedEventId & eventId() const
edm::EDGetTokenT< ClusterTPAssociation > clusterTPMapToken_
unsigned int tidOrder(const DetId &id) const
Pixel cluster – collection of neighboring pixels above threshold.
fixed size matrix
std::vector< std::vector< int > > vtx_trkIdx
#define begin
Definition: vmac.h:32
edm::ProductID id() const
HLT enums.
Pixel pixel(int i) const
void push_back(const TrackerTopology &tTopo, const DetId &id)
std::vector< short > str_isBarrel
auto dxy(const T_Vertex &vertex, const T_Momentum &momentum, const T_Point &point)
void analyze(const edm::Event &, const edm::EventSetup &) override
void depth(int d)
Set the depth of the history.
Definition: HistoryBase.h:49
Structure Point Contains parameters of Gaussian fits to DMRs.
Definition: DMRtrends.cc:57
const TrackingParticleRefVector & daughterTracks() const
std::vector< float > glu_bbxi
std::vector< int > simhit_particle
std::vector< float > trk_outer_pz
T get() const
Definition: EventSetup.h:73
edm::EDGetTokenT< edm::ValueMap< unsigned int > > tpNLayersToken_
std::vector< unsigned short > ph2_simType
std::vector< float > sim_pca_eta
void push_back(const RefToBase< T > &)
virtual OmniClusterRef const & firstClusterRef() const =0
std::vector< float > ph2_yz
std::vector< unsigned short > string
Point getBestVertex(reco::Track const &trk, reco::VertexCollection const &vertices, const size_t minNtracks=2)
Definition: getBestVertex.h:8
static int pixelToChannel(int row, int col)
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
std::vector< unsigned short > rod
static TrackAlgorithm algoByName(const std::string &name)
Definition: TrackBase.cc:137
double y0() const
y coordinate
Definition: BeamSpot.h:63
std::vector< float > simhit_y
void push_back(value_type const &ref)
Add a Ref<C, T> to the RefVector.
Definition: RefVector.h:67
std::vector< float > trk_dxyClosestPV
int numberOfValidPixelHits() const
Definition: HitPattern.h:801
edm::Ref< edm::PSimHitContainer > TrackPSimHitRef
std::vector< std::vector< int > > str_simHitIdx
std::vector< float > see_statePt
std::string builderName_
std::vector< float > trk_ndof
size_type size() const
Size of the RefVector.
Definition: RefVector.h:102
std::vector< float > glu_xx
Monte Carlo truth information used for tracking validation.
edm::EDGetTokenT< edm::ValueMap< unsigned int > > tpNPixelLayersToken_
bool isUninitialized() const
Definition: EDGetToken.h:70
std::vector< unsigned int > trk_nPixelLay
unsigned int tecPetalNumber(const DetId &id) const
std::vector< float > simhit_x
const Point & position() const
position
Definition: BeamSpot.h:59
std::vector< float > simvtx_y
std::vector< unsigned short > see_nCands
std::vector< std::vector< int > > simvtx_daughterSimIdx
std::vector< float > str_xx
unsigned int RunNumber_t
std::vector< float > trk_bestSimTrkShareFrac
void fillStripMatchedHits(const edm::Event &iEvent, const TransientTrackingRecHitBuilder &theTTRHBuilder, const TrackerTopology &tTopo, std::vector< std::pair< int, int >> &monoStereoClusterList)
std::vector< unsigned int > see_offset
DetId geographicalId() const
Definition: tree.py:1
std::vector< float > ph2_zz
trackRef_iterator tracks_begin() const
first iterator over tracks
Definition: Vertex.cc:71
void book(const std::string &prefix, TTree *tree)
bool isRPhi(const DetId &id) const
std::vector< int > see_trkIdx
unsigned int tobRod(const DetId &id) const
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
math::XYZVectorD Vector
point in the space
std::vector< unsigned short > side
std::vector< float > simhit_tof
std::vector< std::vector< int > > sim_seedIdx
void fillVertices(const reco::VertexCollection &vertices, const edm::RefToBaseVector< reco::Track > &tracks)
std::vector< float > pix_xy
std::vector< unsigned short > subdet
std::vector< float > trk_dxy
RecoGenParticleTrail const & recoGenParticleTrail() const
Return all reco::GenParticle in the history.
Definition: HistoryBase.h:64
void book(const std::string &prefix, TTree *tree)
std::vector< float > sim_pt
std::vector< float > pix_yy
unsigned int key() const
float chi2() const
Definition: RZLine.h:94
static constexpr auto TID
std::vector< decltype(reco::TrackBase().algoMaskUL())> trk_algoMask
std::vector< std::vector< int > > see_hitIdx
T const * product() const
Definition: ESHandle.h:86
Definition: vlib.h:198
std::vector< float > vtx_x
double trackAssociationChi2(const reco::TrackBase::ParameterVector &rParameters, const reco::TrackBase::CovarianceMatrix &recoTrackCovMatrix, const Basic3DVector< double > &momAtVtx, const Basic3DVector< double > &vert, int charge, const MagneticField &magfield, const reco::BeamSpot &bs)
basic method where chi2 is computed
void push_back(const TrackerTopology &tTopo, const DetId &id)
std::vector< unsigned int > see_nPixel
edm::Ref< TrackingParticleCollection > TrackingParticleRef
ProductID id() const
std::vector< unsigned short > petalNumber
std::vector< float > see_eta
const std::vector< uint8_t > & amplitudes() const
unsigned int pxfPanel(const DetId &id) const
DetIdAllPhase2 simhit_detId_phase2
std::vector< unsigned int > trk_nValid
unsigned int pxfBlade(const DetId &id) const
std::vector< unsigned int > trk_nLost
std::vector< float > trk_inner_px
DetIdStrip glu_detId
double yError() const
error on y
Definition: Vertex.h:125
const_iterator begin(bool update=false) const
std::vector< float > vtx_zErr
unsigned int operator[](size_t i) const
std::vector< float > simhit_eloss
std::vector< float > see_bestFromFirstHitSimTrkShareFrac
Definition: event.py:1
std::vector< int > sim_isFromBHadron
edm::EDGetTokenT< edm::DetSetVector< StripDigiSimLink > > stripSimLinkToken_
std::vector< float > vtx_chi2
std::vector< int > simvtx_bunchCrossing
std::vector< float > str_bbxi
virtual TrackingParticle::Point vertex(const edm::Event &iEvent, const edm::EventSetup &iSetup, const Charge ch, const Point &vtx, const LorentzVector &lv) const
std::vector< float > see_dz
unsigned int tibOrder(const DetId &id) const
const LorentzVector & position() const
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46
double x0() const
x coordinate
Definition: BeamSpot.h:61
std::vector< unsigned int > sim_nStrip
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:91
int size() const
Definition: vlib.h:28