CMS 3D CMS Logo

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