CMS 3D CMS Logo

TrackingNtuple.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: NtupleDump/TrackingNtuple
4 // Class: TrackingNtuple
5 //
13 //
14 // Original Author: Giuseppe Cerati
15 // Created: Tue, 25 Aug 2015 13:22:49 GMT
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 
22 // user include files
25 
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  template <typename HRange>
350  TrackTPMatch findBestMatchingTrackingParticle(const HRange& hits,
351  const ClusterTPAssociation& clusterToTPMap,
352  const TrackingParticleRefKeyToIndex& tpKeyToIndex) {
353  struct Count {
354  int clusters = 0;
355  size_t innermostHit = std::numeric_limits<size_t>::max();
356  };
357 
358  std::vector<OmniClusterRef> clusters = track_associator::hitsToClusterRefs(hits.begin(), hits.end());
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  template <typename HRange>
396  TrackTPMatch findMatchingTrackingParticleFromFirstHit(const HRange& hits,
397  const ClusterTPAssociation& clusterToTPMap,
398  const TrackingParticleRefKeyToIndex& tpKeyToIndex) {
399  TrackTPMatch best;
400 
401  std::vector<OmniClusterRef> clusters = track_associator::hitsToClusterRefs(hits.begin(), hits.end());
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 TrackerGeometry& tracker,
518  const ClusterTPAssociation& clusterToTPMap,
519  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
521  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
522  const TrackerTopology& tTopo,
523  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
524  std::set<edm::ProductID>& hitProductIds);
525 
527  const TrackerGeometry& tracker,
528  const ClusterTPAssociation& clusterToTPMap,
529  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
531  const edm::DetSetVector<StripDigiSimLink>& digiSimLink,
532  const TrackerTopology& tTopo,
533  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
534  std::set<edm::ProductID>& hitProductIds);
535 
537  const TrackerGeometry& tracker,
538  const TrackerTopology& tTopo,
539  std::vector<std::pair<int, int>>& monoStereoClusterList);
540 
542  const TrackerGeometry& tracker,
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 TrackerGeometry& tracker,
550  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
552  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
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 TrackerGeometry& tracker,
562  const reco::TrackToTrackingParticleAssociator& associatorByHits,
563  const ClusterTPAssociation& clusterToTPMap,
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 TrackerGeometry& tracker,
572  const TrackingParticleRefVector& tpCollection,
573  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
574  const TrackingParticleRefKeyToCount& tpKeyToClusterCount,
575  const MagneticField& mf,
576  const reco::BeamSpot& bs,
578  const reco::TrackToTrackingParticleAssociator& associatorByHits,
579  const ClusterTPAssociation& clusterToTPMap,
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 
587  int algo,
588  const TrackingParticleRefVector& tpCollection,
589  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
590  const TrackingParticleRefKeyToCount& tpKeyToClusterCount,
591  const MagneticField& mf,
592  const reco::BeamSpot& bs,
594  const reco::TrackToTrackingParticleAssociator& associatorByHits,
595  const ClusterTPAssociation& clusterToTPMap,
596  const TrackerGeometry& tracker,
597  const TrackerTopology& tTopo,
598  const std::set<edm::ProductID>& hitProductIds,
599  const std::map<edm::ProductID, size_t>& seedToCollIndex);
600 
601  void fillSimHits(const TrackerGeometry& tracker,
602  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
604  const TrackerTopology& tTopo,
605  SimHitRefKeyToIndex& simHitRefKeyToIndex,
606  std::vector<TPHitIndex>& tpHitList);
607 
609  const edm::EventSetup& iSetup,
611  const reco::BeamSpot& bs,
612  const TrackingParticleRefVector& tpCollection,
613  const TrackingVertexRefKeyToIndex& tvKeyToIndex,
614  const reco::TrackToTrackingParticleAssociator& associatorByHits,
615  const std::vector<TPHitIndex>& tpHitList,
616  const TrackingParticleRefKeyToCount& tpKeyToClusterCount);
617 
619  const reco::SimToRecoCollection& simRecColl,
620  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
621  const unsigned int seedOffset);
622 
624 
625  void fillTrackingVertices(const TrackingVertexRefVector& trackingVertices,
626  const TrackingParticleRefKeyToIndex& tpKeyToIndex);
627 
628  struct SimHitData {
629  std::vector<int> matchingSimHit;
630  std::vector<float> chargeFraction;
631  std::vector<float> xySignificance;
632  std::vector<int> bunchCrossing;
633  std::vector<int> event;
635  };
636 
637  template <typename SimLink>
638  SimHitData matchCluster(const OmniClusterRef& cluster,
639  DetId hitId,
640  int clusterKey,
641  const TrackingRecHit& hit,
642  const ClusterTPAssociation& clusterToTPMap,
643  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
646  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
647  HitType hitType);
648 
649  // ----------member data ---------------------------
653 
654  std::vector<edm::EDGetTokenT<edm::View<reco::Track>>> seedTokens_;
655  std::vector<edm::EDGetTokenT<std::vector<SeedStopInfo>>> seedStopInfoTokens_;
656 
657  std::vector<edm::EDGetTokenT<TrackCandidateCollection>> candidateTokens_;
659  std::vector<std::tuple<edm::EDGetTokenT<MVACollection>, edm::EDGetTokenT<QualityMaskCollection>>>
681 
682  std::vector<std::pair<unsigned int, edm::EDGetTokenT<PixelMaskContainer>>> pixelUseMaskTokens_;
683  std::vector<std::pair<unsigned int, edm::EDGetTokenT<StripMaskContainer>>> stripUseMaskTokens_;
684 
686  const bool includeSeeds_;
688  const bool addSeedCurvCov_;
689  const bool includeAllHits_;
691  const bool includeMVA_;
693  const bool includeOOT_;
694  const bool keepEleSimHits_;
695  const bool saveSimHitsP3_;
697 
700 
701  TTree* t;
702 
703  // DetId branches
704 #define BOOK(name) tree->Branch((prefix + "_" + #name).c_str(), &name);
705  class DetIdCommon {
706  public:
708 
709  unsigned int operator[](size_t i) const { return detId[i]; }
710 
711  void book(const std::string& prefix, TTree* tree) {
712  BOOK(detId);
713  BOOK(subdet);
714  BOOK(layer);
715  BOOK(side);
716  BOOK(module);
717  BOOK(moduleType);
718  }
719 
720  void push_back(const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
721  detId.push_back(id.rawId());
722  subdet.push_back(id.subdetId());
723  layer.push_back(tTopo.layer(id));
724  module.push_back(tTopo.module(id));
725  moduleType.push_back(static_cast<int>(tracker.getDetectorType(id)));
726 
727  unsigned short s = 0;
728  switch (id.subdetId()) {
730  s = tTopo.tibSide(id);
731  break;
733  s = tTopo.tobSide(id);
734  break;
735  default:
736  s = tTopo.side(id);
737  }
738  side.push_back(s);
739  }
740 
741  void resize(size_t size) {
742  detId.resize(size);
743  subdet.resize(size);
744  layer.resize(size);
745  side.resize(size);
746  module.resize(size);
747  moduleType.resize(size);
748  }
749 
750  void set(size_t index, const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
751  detId[index] = id.rawId();
752  subdet[index] = id.subdetId();
753  layer[index] = tTopo.layer(id);
754  side[index] = tTopo.side(id);
755  module[index] = tTopo.module(id);
756  moduleType[index] = static_cast<int>(tracker.getDetectorType(id));
757  }
758 
759  void clear() {
760  detId.clear();
761  subdet.clear();
762  layer.clear();
763  side.clear();
764  module.clear();
765  moduleType.clear();
766  }
767 
768  private:
769  std::vector<unsigned int> detId;
770  std::vector<unsigned short> subdet;
771  std::vector<unsigned short> layer; // or disk/wheel
772  std::vector<unsigned short> side;
773  std::vector<unsigned short> module;
774  std::vector<unsigned int> moduleType;
775  };
776 
778  public:
780 
781  void book(const std::string& prefix, TTree* tree) {
782  BOOK(ladder);
783  BOOK(blade);
784  BOOK(panel);
785  }
786 
787  void push_back(const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
788  const bool isBarrel = id.subdetId() == PixelSubdetector::PixelBarrel;
789  ladder.push_back(isBarrel ? tTopo.pxbLadder(id) : 0);
790  blade.push_back(isBarrel ? 0 : tTopo.pxfBlade(id));
791  panel.push_back(isBarrel ? 0 : tTopo.pxfPanel(id));
792  }
793 
794  void clear() {
795  ladder.clear();
796  blade.clear();
797  panel.clear();
798  }
799 
800  private:
801  std::vector<unsigned short> ladder;
802  std::vector<unsigned short> blade;
803  std::vector<unsigned short> panel;
804  };
805 
807  public:
809 
810  void book(const std::string& prefix, TTree* tree) {
811  BOOK(order);
812  BOOK(ring);
813  BOOK(rod);
814  }
815 
816  void push_back(const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
817  const auto parsed = parse(tTopo, id);
818  order.push_back(parsed.order);
819  ring.push_back(parsed.ring);
820  rod.push_back(parsed.rod);
821  }
822 
823  void resize(size_t size) {
824  order.resize(size);
825  ring.resize(size);
826  rod.resize(size);
827  }
828 
829  void set(size_t index, const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
830  const auto parsed = parse(tTopo, id);
831  order[index] = parsed.order;
832  ring[index] = parsed.ring;
833  rod[index] = parsed.rod;
834  }
835 
836  void clear() {
837  order.clear();
838  ring.clear();
839  rod.clear();
840  }
841 
842  private:
843  struct Parsed {
844  // use int here instead of short to avoid compilation errors due
845  // to narrowing conversion (less boilerplate than explicit static_casts)
846  unsigned int order = 0;
847  unsigned int ring = 0;
848  unsigned int rod = 0;
849  };
850  Parsed parse(const TrackerTopology& tTopo, const DetId& id) const {
851  switch (id.subdetId()) {
853  return Parsed{tTopo.tibOrder(id), 0, 0};
855  return Parsed{tTopo.tidOrder(id), tTopo.tidRing(id), 0};
857  return Parsed{0, 0, tTopo.tobRod(id)};
859  return Parsed{tTopo.tecOrder(id), tTopo.tecRing(id), 0};
860  default:
861  return Parsed{};
862  };
863  }
864 
865  std::vector<unsigned short> order;
866  std::vector<unsigned short> ring;
867  std::vector<unsigned short> rod;
868  };
869 
871  public:
873 
874  void book(const std::string& prefix, TTree* tree) {
875  BOOK(string);
876  BOOK(petalNumber);
877  BOOK(isStereo);
878  BOOK(isRPhi);
879  BOOK(isGlued);
880  }
881 
882  void push_back(const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
883  const auto parsed = parse(tTopo, id);
884  string.push_back(parsed.string);
885  petalNumber.push_back(parsed.petalNumber);
886  isStereo.push_back(tTopo.isStereo(id));
887  isRPhi.push_back(tTopo.isRPhi(id));
888  isGlued.push_back(parsed.glued);
889  }
890 
891  void resize(size_t size) {
892  string.resize(size);
893  petalNumber.resize(size);
894  isStereo.resize(size);
895  isRPhi.resize(size);
896  isGlued.resize(size);
897  }
898 
899  void set(size_t index, const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
900  const auto parsed = parse(tTopo, id);
901  string[index] = parsed.string;
902  petalNumber[index] = parsed.petalNumber;
903  isStereo[index] = tTopo.isStereo(id);
904  isRPhi[index] = tTopo.isRPhi(id);
905  isGlued[index] = parsed.glued;
906  }
907 
908  void clear() {
909  string.clear();
910  isStereo.clear();
911  isRPhi.clear();
912  isGlued.clear();
913  petalNumber.clear();
914  }
915 
916  private:
917  struct Parsed {
918  // use int here instead of short to avoid compilation errors due
919  // to narrowing conversion (less boilerplate than explicit static_casts)
920  unsigned int string = 0;
921  unsigned int petalNumber = 0;
922  bool glued = false;
923  };
924  Parsed parse(const TrackerTopology& tTopo, const DetId& id) const {
925  switch (id.subdetId()) {
927  return Parsed{tTopo.tibString(id), 0, tTopo.tibIsDoubleSide(id)};
929  return Parsed{0, 0, tTopo.tidIsDoubleSide(id)};
931  return Parsed{0, 0, tTopo.tobIsDoubleSide(id)};
933  return Parsed{0, tTopo.tecPetalNumber(id), tTopo.tecIsDoubleSide(id)};
934  default:
935  return Parsed{};
936  }
937  }
938 
939  std::vector<unsigned short> string;
940  std::vector<unsigned short> petalNumber;
941  std::vector<unsigned short> isStereo;
942  std::vector<unsigned short> isRPhi;
943  std::vector<unsigned short> isGlued;
944  };
945 
947  public:
949 
950  void book(const std::string& prefix, TTree* tree) {
951  BOOK(isLower);
952  BOOK(isUpper);
953  BOOK(isStack);
954  }
955 
956  void push_back(const TrackerGeometry& tracker, const TrackerTopology& tTopo, const DetId& id) {
957  isLower.push_back(tTopo.isLower(id));
958  isUpper.push_back(tTopo.isUpper(id));
959  isStack.push_back(tTopo.stack(id) ==
960  0); // equivalent to *IsDoubleSide() but without the hardcoded layer+ring requirements
961  }
962 
963  void clear() {
964  isLower.clear();
965  isUpper.clear();
966  isStack.clear();
967  }
968 
969  private:
970  std::vector<unsigned short> isLower;
971  std::vector<unsigned short> isUpper;
972  std::vector<unsigned short> isStack;
973  };
974 #undef BOOK
975 
976  using DetIdPixel = CombineDetId<DetIdCommon, DetIdPixelOnly>;
977  using DetIdStrip = CombineDetId<DetIdCommon, DetIdOTCommon, DetIdStripOnly>;
978  using DetIdPhase2OT = CombineDetId<DetIdCommon, DetIdOTCommon, DetIdPhase2OTOnly>;
979  using DetIdAll = CombineDetId<DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdStripOnly>;
980  using DetIdAllPhase2 = CombineDetId<DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdPhase2OTOnly>;
981 
982  // event
986 
988  // tracks
989  // (first) index runs through tracks
990  std::vector<float> trk_px;
991  std::vector<float> trk_py;
992  std::vector<float> trk_pz;
993  std::vector<float> trk_pt;
994  std::vector<float> trk_inner_px;
995  std::vector<float> trk_inner_py;
996  std::vector<float> trk_inner_pz;
997  std::vector<float> trk_inner_pt;
998  std::vector<float> trk_outer_px;
999  std::vector<float> trk_outer_py;
1000  std::vector<float> trk_outer_pz;
1001  std::vector<float> trk_outer_pt;
1002  std::vector<float> trk_eta;
1003  std::vector<float> trk_lambda;
1004  std::vector<float> trk_cotTheta;
1005  std::vector<float> trk_phi;
1006  std::vector<float> trk_dxy;
1007  std::vector<float> trk_dz;
1008  std::vector<float> trk_dxyPV;
1009  std::vector<float> trk_dzPV;
1010  std::vector<float> trk_dxyClosestPV;
1011  std::vector<float> trk_dzClosestPV;
1012  std::vector<float> trk_ptErr;
1013  std::vector<float> trk_etaErr;
1014  std::vector<float> trk_lambdaErr;
1015  std::vector<float> trk_phiErr;
1016  std::vector<float> trk_dxyErr;
1017  std::vector<float> trk_dzErr;
1018  std::vector<float> trk_refpoint_x;
1019  std::vector<float> trk_refpoint_y;
1020  std::vector<float> trk_refpoint_z;
1021  std::vector<float> trk_nChi2;
1022  std::vector<float> trk_nChi2_1Dmod;
1023  std::vector<float> trk_ndof;
1024  std::vector<std::vector<float>> trk_mvas;
1025  std::vector<std::vector<unsigned short>> trk_qualityMasks;
1026  std::vector<int> trk_q;
1027  std::vector<unsigned int> trk_nValid;
1028  std::vector<unsigned int> trk_nLost;
1029  std::vector<unsigned int> trk_nInactive;
1030  std::vector<unsigned int> trk_nPixel;
1031  std::vector<unsigned int> trk_nStrip;
1032  std::vector<unsigned int> trk_nOuterLost;
1033  std::vector<unsigned int> trk_nInnerLost;
1034  std::vector<unsigned int> trk_nOuterInactive;
1035  std::vector<unsigned int> trk_nInnerInactive;
1036  std::vector<unsigned int> trk_nPixelLay;
1037  std::vector<unsigned int> trk_nStripLay;
1038  std::vector<unsigned int> trk_n3DLay;
1039  std::vector<unsigned int> trk_nLostLay;
1040  std::vector<unsigned int> trk_nCluster;
1041  std::vector<unsigned int> trk_algo;
1042  std::vector<unsigned int> trk_originalAlgo;
1043  std::vector<decltype(reco::TrackBase().algoMaskUL())> trk_algoMask;
1044  std::vector<unsigned short> trk_stopReason;
1045  std::vector<short> trk_isHP;
1046  std::vector<int> trk_seedIdx;
1047  std::vector<int> trk_vtxIdx;
1048  std::vector<short> trk_isTrue;
1049  std::vector<int> trk_bestSimTrkIdx;
1050  std::vector<float> trk_bestSimTrkShareFrac;
1053  std::vector<float> trk_bestSimTrkNChi2;
1059  std::vector<std::vector<float>> trk_simTrkShareFrac; // second index runs through matched TrackingParticles
1060  std::vector<std::vector<float>> trk_simTrkNChi2; // second index runs through matched TrackingParticles
1061  std::vector<std::vector<int>> trk_simTrkIdx; // second index runs through matched TrackingParticles
1062  std::vector<std::vector<int>> trk_hitIdx; // second index runs through hits
1063  std::vector<std::vector<int>> trk_hitType; // second index runs through hits
1065  // track candidates
1066  // (first) index runs through track candidates
1067  std::vector<short> tcand_pca_valid; // pca: propagated params at BS
1068  std::vector<float> tcand_pca_px;
1069  std::vector<float> tcand_pca_py;
1070  std::vector<float> tcand_pca_pz;
1071  std::vector<float> tcand_pca_pt;
1072  std::vector<float> tcand_pca_eta;
1073  std::vector<float> tcand_pca_phi;
1074  std::vector<float> tcand_pca_dxy;
1075  std::vector<float> tcand_pca_dz;
1076  std::vector<float> tcand_pca_ptErr;
1077  std::vector<float> tcand_pca_etaErr;
1078  std::vector<float> tcand_pca_lambdaErr;
1079  std::vector<float> tcand_pca_phiErr;
1080  std::vector<float> tcand_pca_dxyErr;
1081  std::vector<float> tcand_pca_dzErr;
1082  std::vector<float> tcand_px; // from PState
1083  std::vector<float> tcand_py;
1084  std::vector<float> tcand_pz;
1085  std::vector<float> tcand_pt;
1086  std::vector<float> tcand_x;
1087  std::vector<float> tcand_y;
1088  std::vector<float> tcand_z;
1089  std::vector<float> tcand_qbpErr;
1090  std::vector<float> tcand_lambdaErr;
1091  std::vector<float> tcand_phiErr;
1092  std::vector<float> tcand_xtErr;
1093  std::vector<float> tcand_ytErr;
1094  std::vector<float> tcand_ndof; // sum(hit.dimention) - 5
1095  std::vector<int> tcand_q;
1096  std::vector<unsigned int> tcand_nValid;
1097  std::vector<unsigned int> tcand_nPixel;
1098  std::vector<unsigned int> tcand_nStrip;
1099  std::vector<unsigned int> tcand_nCluster;
1100  std::vector<unsigned int> tcand_algo;
1101  std::vector<unsigned short> tcand_stopReason;
1102  std::vector<int> tcand_seedIdx;
1103  std::vector<int> tcand_vtxIdx;
1104  std::vector<short> tcand_isTrue;
1105  std::vector<int> tcand_bestSimTrkIdx;
1106  std::vector<float> tcand_bestSimTrkShareFrac;
1109  std::vector<float> tcand_bestSimTrkNChi2;
1115  std::vector<std::vector<float>> tcand_simTrkShareFrac; // second index runs through matched TrackingParticles
1116  std::vector<std::vector<float>> tcand_simTrkNChi2; // second index runs through matched TrackingParticles
1117  std::vector<std::vector<int>> tcand_simTrkIdx; // second index runs through matched TrackingParticles
1118  std::vector<std::vector<int>> tcand_hitIdx; // second index runs through hits
1119  std::vector<std::vector<int>> tcand_hitType; // second index runs through hits
1121  // sim tracks
1122  // (first) index runs through TrackingParticles
1123  std::vector<int> sim_event;
1124  std::vector<int> sim_bunchCrossing;
1125  std::vector<int> sim_pdgId;
1126  std::vector<std::vector<int>> sim_genPdgIds;
1127  std::vector<int> sim_isFromBHadron;
1128  std::vector<float> sim_px;
1129  std::vector<float> sim_py;
1130  std::vector<float> sim_pz;
1131  std::vector<float> sim_pt;
1132  std::vector<float> sim_eta;
1133  std::vector<float> sim_phi;
1134  std::vector<float> sim_pca_pt;
1135  std::vector<float> sim_pca_eta;
1136  std::vector<float> sim_pca_lambda;
1137  std::vector<float> sim_pca_cotTheta;
1138  std::vector<float> sim_pca_phi;
1139  std::vector<float> sim_pca_dxy;
1140  std::vector<float> sim_pca_dz;
1141  std::vector<int> sim_q;
1142  // numbers of sim hits/layers
1143  std::vector<unsigned int> sim_nValid;
1144  std::vector<unsigned int> sim_nPixel;
1145  std::vector<unsigned int> sim_nStrip;
1146  std::vector<unsigned int> sim_nLay;
1147  std::vector<unsigned int> sim_nPixelLay;
1148  std::vector<unsigned int> sim_n3DLay;
1149  // number of sim hits as calculated in TrackingTruthAccumulator
1150  std::vector<unsigned int> sim_nTrackerHits;
1151  // number of clusters associated to TP
1152  std::vector<unsigned int> sim_nRecoClusters;
1153  // links to other objects
1154  std::vector<std::vector<int>> sim_trkIdx; // second index runs through matched tracks
1155  std::vector<std::vector<float>> sim_trkShareFrac; // second index runs through matched tracks
1156  std::vector<std::vector<int>> sim_seedIdx; // second index runs through matched seeds
1157  std::vector<int> sim_parentVtxIdx;
1158  std::vector<std::vector<int>> sim_decayVtxIdx; // second index runs through decay vertices
1159  std::vector<std::vector<int>> sim_simHitIdx; // second index runs through SimHits
1161  // pixel hits
1162  // (first) index runs through hits
1163  std::vector<short> pix_isBarrel;
1165  std::vector<std::vector<int>> pix_trkIdx; // second index runs through tracks containing this hit
1166  std::vector<std::vector<float>> pix_onTrk_x; // second index runs through tracks containing this hit
1167  std::vector<std::vector<float>> pix_onTrk_y; // same for all pix_onTrk_*
1168  std::vector<std::vector<float>> pix_onTrk_z; //
1169  std::vector<std::vector<float>> pix_onTrk_xx; //
1170  std::vector<std::vector<float>> pix_onTrk_xy; //
1171  std::vector<std::vector<float>> pix_onTrk_yy; //
1172  std::vector<std::vector<float>> pix_onTrk_yz; //
1173  std::vector<std::vector<float>> pix_onTrk_zz; //
1174  std::vector<std::vector<float>> pix_onTrk_zx; //
1175  std::vector<std::vector<int>> pix_tcandIdx; // second index runs through candidates containing this hit
1176  std::vector<std::vector<int>> pix_seeIdx; // second index runs through seeds containing this hit
1177  std::vector<std::vector<int>> pix_simHitIdx; // second index runs through SimHits inducing this hit
1178  std::vector<std::vector<float>> pix_xySignificance; // second index runs through SimHits inducing this hit
1179  std::vector<std::vector<float>> pix_chargeFraction; // second index runs through SimHits inducing this hit
1180  std::vector<unsigned short> pix_simType;
1181  std::vector<float> pix_x;
1182  std::vector<float> pix_y;
1183  std::vector<float> pix_z;
1184  std::vector<float> pix_xx;
1185  std::vector<float> pix_xy;
1186  std::vector<float> pix_yy;
1187  std::vector<float> pix_yz;
1188  std::vector<float> pix_zz;
1189  std::vector<float> pix_zx;
1190  std::vector<float>
1191  pix_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1192  std::vector<float> pix_bbxi;
1193  std::vector<int> pix_clustSizeCol;
1194  std::vector<int> pix_clustSizeRow;
1195  std::vector<uint64_t> pix_usedMask;
1197  // strip hits
1198  // (first) index runs through hits
1199  std::vector<short> str_isBarrel;
1201  std::vector<std::vector<int>> str_trkIdx; // second index runs through tracks containing this hit
1202  std::vector<std::vector<float>> str_onTrk_x; // second index runs through tracks containing this hit
1203  std::vector<std::vector<float>> str_onTrk_y; // same for all pix_onTrk_*
1204  std::vector<std::vector<float>> str_onTrk_z; //
1205  std::vector<std::vector<float>> str_onTrk_xx; //
1206  std::vector<std::vector<float>> str_onTrk_xy; //
1207  std::vector<std::vector<float>> str_onTrk_yy; //
1208  std::vector<std::vector<float>> str_onTrk_yz; //
1209  std::vector<std::vector<float>> str_onTrk_zz; //
1210  std::vector<std::vector<float>> str_onTrk_zx; //
1211  std::vector<std::vector<int>> str_tcandIdx; // second index runs through candidates containing this hit
1212  std::vector<std::vector<int>> str_seeIdx; // second index runs through seeds containing this hit
1213  std::vector<std::vector<int>> str_simHitIdx; // second index runs through SimHits inducing this hit
1214  std::vector<std::vector<float>> str_xySignificance; // second index runs through SimHits inducing this hit
1215  std::vector<std::vector<float>> str_chargeFraction; // second index runs through SimHits inducing this hit
1216  std::vector<unsigned short> str_simType;
1217  std::vector<float> str_x;
1218  std::vector<float> str_y;
1219  std::vector<float> str_z;
1220  std::vector<float> str_xx;
1221  std::vector<float> str_xy;
1222  std::vector<float> str_yy;
1223  std::vector<float> str_yz;
1224  std::vector<float> str_zz;
1225  std::vector<float> str_zx;
1226  std::vector<float>
1227  str_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1228  std::vector<float> str_bbxi;
1229  std::vector<float> str_chargePerCM;
1230  std::vector<int> str_clustSize;
1231  std::vector<uint64_t> str_usedMask;
1233  // strip matched hits
1234  // (first) index runs through hits
1235  std::vector<short> glu_isBarrel;
1237  std::vector<int> glu_monoIdx;
1238  std::vector<int> glu_stereoIdx;
1239  std::vector<std::vector<int>> glu_seeIdx; // second index runs through seeds containing this hit
1240  std::vector<float> glu_x;
1241  std::vector<float> glu_y;
1242  std::vector<float> glu_z;
1243  std::vector<float> glu_xx;
1244  std::vector<float> glu_xy;
1245  std::vector<float> glu_yy;
1246  std::vector<float> glu_yz;
1247  std::vector<float> glu_zz;
1248  std::vector<float> glu_zx;
1249  std::vector<float>
1250  glu_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1251  std::vector<float> glu_bbxi;
1252  std::vector<float> glu_chargePerCM;
1253  std::vector<int> glu_clustSizeMono;
1254  std::vector<int> glu_clustSizeStereo;
1255  std::vector<uint64_t> glu_usedMaskMono;
1256  std::vector<uint64_t> glu_usedMaskStereo;
1258  // phase2 Outer Tracker hits
1259  // (first) index runs through hits
1260  std::vector<short> ph2_isBarrel;
1262  std::vector<std::vector<int>> ph2_trkIdx; // second index runs through tracks containing this hit
1263  std::vector<std::vector<float>> ph2_onTrk_x; // second index runs through tracks containing this hit
1264  std::vector<std::vector<float>> ph2_onTrk_y; // same for all pix_onTrk_*
1265  std::vector<std::vector<float>> ph2_onTrk_z; //
1266  std::vector<std::vector<float>> ph2_onTrk_xx; //
1267  std::vector<std::vector<float>> ph2_onTrk_xy; //
1268  std::vector<std::vector<float>> ph2_onTrk_yy; //
1269  std::vector<std::vector<float>> ph2_onTrk_yz; //
1270  std::vector<std::vector<float>> ph2_onTrk_zz; //
1271  std::vector<std::vector<float>> ph2_onTrk_zx; //
1272  std::vector<std::vector<int>> ph2_tcandIdx; // second index runs through candidates containing this hit
1273  std::vector<std::vector<int>> ph2_seeIdx; // second index runs through seeds containing this hit
1274  std::vector<std::vector<int>> ph2_simHitIdx; // second index runs through SimHits inducing this hit
1275  std::vector<std::vector<float>> ph2_xySignificance; // second index runs through SimHits inducing this hit
1276  //std::vector<std::vector<float>> ph2_chargeFraction; // Not supported at the moment for Phase2
1277  std::vector<unsigned short> ph2_simType;
1278  std::vector<float> ph2_x;
1279  std::vector<float> ph2_y;
1280  std::vector<float> ph2_z;
1281  std::vector<float> ph2_xx;
1282  std::vector<float> ph2_xy;
1283  std::vector<float> ph2_yy;
1284  std::vector<float> ph2_yz;
1285  std::vector<float> ph2_zz;
1286  std::vector<float> ph2_zx;
1287  std::vector<float>
1288  ph2_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
1289  std::vector<float> ph2_bbxi;
1290 
1292  // invalid (missing/inactive/etc) hits
1293  // (first) index runs through hits
1294  std::vector<short> inv_isBarrel;
1297  std::vector<unsigned short> inv_type;
1299  // sim hits
1300  // (first) index runs through hits
1303  std::vector<float> simhit_x;
1304  std::vector<float> simhit_y;
1305  std::vector<float> simhit_z;
1306  std::vector<float> simhit_px;
1307  std::vector<float> simhit_py;
1308  std::vector<float> simhit_pz;
1309  std::vector<int> simhit_particle;
1310  std::vector<short> simhit_process;
1311  std::vector<float> simhit_eloss;
1312  std::vector<float> simhit_tof;
1313  //std::vector<unsigned int> simhit_simTrackId; // can be useful for debugging, but not much of general interest
1314  std::vector<int> simhit_simTrkIdx;
1315  std::vector<std::vector<int>> simhit_hitIdx; // second index runs through induced reco hits
1316  std::vector<std::vector<int>> simhit_hitType; // second index runs through induced reco hits
1318  // beam spot
1319  float bsp_x;
1320  float bsp_y;
1321  float bsp_z;
1322  float bsp_sigmax;
1323  float bsp_sigmay;
1324  float bsp_sigmaz;
1326  // seeds
1327  // (first) index runs through seeds
1328  std::vector<short> see_fitok;
1329  std::vector<float> see_px;
1330  std::vector<float> see_py;
1331  std::vector<float> see_pz;
1332  std::vector<float> see_pt;
1333  std::vector<float> see_eta;
1334  std::vector<float> see_phi;
1335  std::vector<float> see_dxy;
1336  std::vector<float> see_dz;
1337  std::vector<float> see_ptErr;
1338  std::vector<float> see_etaErr;
1339  std::vector<float> see_phiErr;
1340  std::vector<float> see_dxyErr;
1341  std::vector<float> see_dzErr;
1342  std::vector<float> see_chi2;
1343  std::vector<float> see_statePt;
1344  std::vector<float> see_stateTrajX;
1345  std::vector<float> see_stateTrajY;
1346  std::vector<float> see_stateTrajPx;
1347  std::vector<float> see_stateTrajPy;
1348  std::vector<float> see_stateTrajPz;
1349  std::vector<float> see_stateTrajGlbX;
1350  std::vector<float> see_stateTrajGlbY;
1351  std::vector<float> see_stateTrajGlbZ;
1352  std::vector<float> see_stateTrajGlbPx;
1353  std::vector<float> see_stateTrajGlbPy;
1354  std::vector<float> see_stateTrajGlbPz;
1355  std::vector<std::vector<float>> see_stateCurvCov;
1356  std::vector<int> see_q;
1357  std::vector<unsigned int> see_nValid;
1358  std::vector<unsigned int> see_nPixel;
1359  std::vector<unsigned int> see_nGlued;
1360  std::vector<unsigned int> see_nStrip;
1361  std::vector<unsigned int> see_nPhase2OT;
1362  std::vector<unsigned int> see_nCluster;
1363  std::vector<unsigned int> see_algo;
1364  std::vector<unsigned short> see_stopReason;
1365  std::vector<unsigned short> see_nCands;
1366  std::vector<int> see_trkIdx;
1367  std::vector<int> see_tcandIdx;
1368  std::vector<short> see_isTrue;
1369  std::vector<int> see_bestSimTrkIdx;
1370  std::vector<float> see_bestSimTrkShareFrac;
1373  std::vector<std::vector<float>> see_simTrkShareFrac; // second index runs through matched TrackingParticles
1374  std::vector<std::vector<int>> see_simTrkIdx; // second index runs through matched TrackingParticles
1375  std::vector<std::vector<int>> see_hitIdx; // second index runs through hits
1376  std::vector<std::vector<int>> see_hitType; // second index runs through hits
1377  //seed algo offset, index runs through iterations
1378  std::vector<unsigned int> see_offset;
1379 
1381  // Vertices
1382  // (first) index runs through vertices
1383  std::vector<float> vtx_x;
1384  std::vector<float> vtx_y;
1385  std::vector<float> vtx_z;
1386  std::vector<float> vtx_xErr;
1387  std::vector<float> vtx_yErr;
1388  std::vector<float> vtx_zErr;
1389  std::vector<float> vtx_ndof;
1390  std::vector<float> vtx_chi2;
1391  std::vector<short> vtx_fake;
1392  std::vector<short> vtx_valid;
1393  std::vector<std::vector<int>> vtx_trkIdx; // second index runs through tracks used in the vertex fit
1394 
1396  // Tracking vertices
1397  // (first) index runs through TrackingVertices
1398  std::vector<int> simvtx_event;
1399  std::vector<int> simvtx_bunchCrossing;
1400  std::vector<unsigned int> simvtx_processType; // only from first SimVertex of TrackingVertex
1401  std::vector<float> simvtx_x;
1402  std::vector<float> simvtx_y;
1403  std::vector<float> simvtx_z;
1404  std::vector<std::vector<int>> simvtx_sourceSimIdx; // second index runs through source TrackingParticles
1405  std::vector<std::vector<int>> simvtx_daughterSimIdx; // second index runs through daughter TrackingParticles
1406  std::vector<int> simpv_idx;
1407 };
1408 
1409 //
1410 // constructors and destructor
1411 //
1413  : mfToken_(esConsumes()),
1414  tTopoToken_(esConsumes()),
1415  tGeomToken_(esConsumes()),
1416  trackToken_(consumes<edm::View<reco::Track>>(iConfig.getUntrackedParameter<edm::InputTag>("tracks"))),
1417  clusterTPMapToken_(consumes<ClusterTPAssociation>(iConfig.getUntrackedParameter<edm::InputTag>("clusterTPMap"))),
1418  simHitTPMapToken_(consumes<SimHitTPAssociationProducer::SimHitTPAssociationList>(
1419  iConfig.getUntrackedParameter<edm::InputTag>("simHitTPMap"))),
1420  trackAssociatorToken_(consumes<reco::TrackToTrackingParticleAssociator>(
1421  iConfig.getUntrackedParameter<edm::InputTag>("trackAssociator"))),
1422  pixelSimLinkToken_(consumes<edm::DetSetVector<PixelDigiSimLink>>(
1423  iConfig.getUntrackedParameter<edm::InputTag>("pixelDigiSimLink"))),
1424  stripSimLinkToken_(consumes<edm::DetSetVector<StripDigiSimLink>>(
1425  iConfig.getUntrackedParameter<edm::InputTag>("stripDigiSimLink"))),
1426  siphase2OTSimLinksToken_(consumes<edm::DetSetVector<PixelDigiSimLink>>(
1427  iConfig.getUntrackedParameter<edm::InputTag>("phase2OTSimLink"))),
1428  includeStripHits_(!iConfig.getUntrackedParameter<edm::InputTag>("stripDigiSimLink").label().empty()),
1429  includePhase2OTHits_(!iConfig.getUntrackedParameter<edm::InputTag>("phase2OTSimLink").label().empty()),
1430  beamSpotToken_(consumes<reco::BeamSpot>(iConfig.getUntrackedParameter<edm::InputTag>("beamSpot"))),
1431  pixelRecHitToken_(
1432  consumes<SiPixelRecHitCollection>(iConfig.getUntrackedParameter<edm::InputTag>("pixelRecHits"))),
1433  stripRphiRecHitToken_(
1434  consumes<SiStripRecHit2DCollection>(iConfig.getUntrackedParameter<edm::InputTag>("stripRphiRecHits"))),
1435  stripStereoRecHitToken_(
1436  consumes<SiStripRecHit2DCollection>(iConfig.getUntrackedParameter<edm::InputTag>("stripStereoRecHits"))),
1437  stripMatchedRecHitToken_(consumes<SiStripMatchedRecHit2DCollection>(
1438  iConfig.getUntrackedParameter<edm::InputTag>("stripMatchedRecHits"))),
1439  phase2OTRecHitToken_(consumes<Phase2TrackerRecHit1DCollectionNew>(
1440  iConfig.getUntrackedParameter<edm::InputTag>("phase2OTRecHits"))),
1441  vertexToken_(consumes<reco::VertexCollection>(iConfig.getUntrackedParameter<edm::InputTag>("vertices"))),
1442  trackingVertexToken_(
1443  consumes<TrackingVertexCollection>(iConfig.getUntrackedParameter<edm::InputTag>("trackingVertices"))),
1444  tpNLayersToken_(consumes<edm::ValueMap<unsigned int>>(
1445  iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNlayers"))),
1446  tpNPixelLayersToken_(consumes<edm::ValueMap<unsigned int>>(
1447  iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNpixellayers"))),
1448  tpNStripStereoLayersToken_(consumes<edm::ValueMap<unsigned int>>(
1449  iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNstripstereolayers"))),
1450  includeSeeds_(iConfig.getUntrackedParameter<bool>("includeSeeds")),
1451  includeTrackCandidates_(iConfig.getUntrackedParameter<bool>("includeTrackCandidates")),
1452  addSeedCurvCov_(iConfig.getUntrackedParameter<bool>("addSeedCurvCov")),
1453  includeAllHits_(iConfig.getUntrackedParameter<bool>("includeAllHits")),
1454  includeOnTrackHitData_(iConfig.getUntrackedParameter<bool>("includeOnTrackHitData")),
1455  includeMVA_(iConfig.getUntrackedParameter<bool>("includeMVA")),
1456  includeTrackingParticles_(iConfig.getUntrackedParameter<bool>("includeTrackingParticles")),
1457  includeOOT_(iConfig.getUntrackedParameter<bool>("includeOOT")),
1458  keepEleSimHits_(iConfig.getUntrackedParameter<bool>("keepEleSimHits")),
1459  saveSimHitsP3_(iConfig.getUntrackedParameter<bool>("saveSimHitsP3")),
1460  simHitBySignificance_(iConfig.getUntrackedParameter<bool>("simHitBySignificance")),
1461  parametersDefiner_(iConfig.getUntrackedParameter<edm::InputTag>("beamSpot"), consumesCollector()) {
1462  if (includeSeeds_) {
1463  seedTokens_ =
1464  edm::vector_transform(iConfig.getUntrackedParameter<std::vector<edm::InputTag>>("seedTracks"),
1465  [&](const edm::InputTag& tag) { return consumes<edm::View<reco::Track>>(tag); });
1467  edm::vector_transform(iConfig.getUntrackedParameter<std::vector<edm::InputTag>>("trackCandidates"),
1468  [&](const edm::InputTag& tag) { return consumes<std::vector<SeedStopInfo>>(tag); });
1469  if (seedTokens_.size() != seedStopInfoTokens_.size()) {
1470  throw cms::Exception("Configuration") << "Got " << seedTokens_.size() << " seed collections, but "
1471  << seedStopInfoTokens_.size() << " track candidate collections";
1472  }
1473  }
1476  edm::vector_transform(iConfig.getUntrackedParameter<std::vector<edm::InputTag>>("trackCandidates"),
1477  [&](const edm::InputTag& tag) { return consumes<TrackCandidateCollection>(tag); });
1478 
1479  if (includeAllHits_) {
1481  throw cms::Exception("Configuration")
1482  << "Both stripDigiSimLink and phase2OTSimLink are set, please set only either one (this information is used "
1483  "to infer if you're running phase0/1 or phase2 detector)";
1484  }
1486  throw cms::Exception("Configuration")
1487  << "Neither stripDigiSimLink or phase2OTSimLink are set, please set either one.";
1488  }
1489 
1490  auto const& maskVPset = iConfig.getUntrackedParameterSetVector("clusterMasks");
1491  pixelUseMaskTokens_.reserve(maskVPset.size());
1492  stripUseMaskTokens_.reserve(maskVPset.size());
1493  for (auto const& mask : maskVPset) {
1494  auto index = mask.getUntrackedParameter<unsigned int>("index");
1495  assert(index < 64);
1496  pixelUseMaskTokens_.emplace_back(index,
1497  consumes<PixelMaskContainer>(mask.getUntrackedParameter<edm::InputTag>("src")));
1498  if (includeStripHits_)
1499  stripUseMaskTokens_.emplace_back(
1500  index, consumes<StripMaskContainer>(mask.getUntrackedParameter<edm::InputTag>("src")));
1501  }
1502  }
1503 
1504  const bool tpRef = iConfig.getUntrackedParameter<bool>("trackingParticlesRef");
1505  const auto tpTag = iConfig.getUntrackedParameter<edm::InputTag>("trackingParticles");
1506  if (tpRef) {
1507  trackingParticleRefToken_ = consumes<TrackingParticleRefVector>(tpTag);
1508  } else {
1509  trackingParticleToken_ = consumes<TrackingParticleCollection>(tpTag);
1510  }
1511 
1512  tracer_.depth(-2); // as in SimTracker/TrackHistory/src/TrackClassifier.cc
1513 
1514  if (includeMVA_) {
1516  iConfig.getUntrackedParameter<std::vector<std::string>>("trackMVAs"), [&](const std::string& tag) {
1517  return std::make_tuple(consumes<MVACollection>(edm::InputTag(tag, "MVAValues")),
1518  consumes<QualityMaskCollection>(edm::InputTag(tag, "QualityMasks")));
1519  });
1520  }
1521 
1522  usesResource(TFileService::kSharedResource);
1524  t = fs->make<TTree>("tree", "tree");
1525 
1526  t->Branch("event", &ev_event);
1527  t->Branch("lumi", &ev_lumi);
1528  t->Branch("run", &ev_run);
1529 
1530  //tracks
1531  t->Branch("trk_px", &trk_px);
1532  t->Branch("trk_py", &trk_py);
1533  t->Branch("trk_pz", &trk_pz);
1534  t->Branch("trk_pt", &trk_pt);
1535  t->Branch("trk_inner_px", &trk_inner_px);
1536  t->Branch("trk_inner_py", &trk_inner_py);
1537  t->Branch("trk_inner_pz", &trk_inner_pz);
1538  t->Branch("trk_inner_pt", &trk_inner_pt);
1539  t->Branch("trk_outer_px", &trk_outer_px);
1540  t->Branch("trk_outer_py", &trk_outer_py);
1541  t->Branch("trk_outer_pz", &trk_outer_pz);
1542  t->Branch("trk_outer_pt", &trk_outer_pt);
1543  t->Branch("trk_eta", &trk_eta);
1544  t->Branch("trk_lambda", &trk_lambda);
1545  t->Branch("trk_cotTheta", &trk_cotTheta);
1546  t->Branch("trk_phi", &trk_phi);
1547  t->Branch("trk_dxy", &trk_dxy);
1548  t->Branch("trk_dz", &trk_dz);
1549  t->Branch("trk_dxyPV", &trk_dxyPV);
1550  t->Branch("trk_dzPV", &trk_dzPV);
1551  t->Branch("trk_dxyClosestPV", &trk_dxyClosestPV);
1552  t->Branch("trk_dzClosestPV", &trk_dzClosestPV);
1553  t->Branch("trk_ptErr", &trk_ptErr);
1554  t->Branch("trk_etaErr", &trk_etaErr);
1555  t->Branch("trk_lambdaErr", &trk_lambdaErr);
1556  t->Branch("trk_phiErr", &trk_phiErr);
1557  t->Branch("trk_dxyErr", &trk_dxyErr);
1558  t->Branch("trk_dzErr", &trk_dzErr);
1559  t->Branch("trk_refpoint_x", &trk_refpoint_x);
1560  t->Branch("trk_refpoint_y", &trk_refpoint_y);
1561  t->Branch("trk_refpoint_z", &trk_refpoint_z);
1562  t->Branch("trk_nChi2", &trk_nChi2);
1563  t->Branch("trk_nChi2_1Dmod", &trk_nChi2_1Dmod);
1564  t->Branch("trk_ndof", &trk_ndof);
1565  if (includeMVA_) {
1566  trk_mvas.resize(mvaQualityCollectionTokens_.size());
1568  if (!trk_mvas.empty()) {
1569  t->Branch("trk_mva", &(trk_mvas[0]));
1570  t->Branch("trk_qualityMask", &(trk_qualityMasks[0]));
1571  for (size_t i = 1; i < trk_mvas.size(); ++i) {
1572  t->Branch(("trk_mva" + std::to_string(i + 1)).c_str(), &(trk_mvas[i]));
1573  t->Branch(("trk_qualityMask" + std::to_string(i + 1)).c_str(), &(trk_qualityMasks[i]));
1574  }
1575  }
1576  }
1577  t->Branch("trk_q", &trk_q);
1578  t->Branch("trk_nValid", &trk_nValid);
1579  t->Branch("trk_nLost", &trk_nLost);
1580  t->Branch("trk_nInactive", &trk_nInactive);
1581  t->Branch("trk_nPixel", &trk_nPixel);
1582  t->Branch("trk_nStrip", &trk_nStrip);
1583  t->Branch("trk_nOuterLost", &trk_nOuterLost);
1584  t->Branch("trk_nInnerLost", &trk_nInnerLost);
1585  t->Branch("trk_nOuterInactive", &trk_nOuterInactive);
1586  t->Branch("trk_nInnerInactive", &trk_nInnerInactive);
1587  t->Branch("trk_nPixelLay", &trk_nPixelLay);
1588  t->Branch("trk_nStripLay", &trk_nStripLay);
1589  t->Branch("trk_n3DLay", &trk_n3DLay);
1590  t->Branch("trk_nLostLay", &trk_nLostLay);
1591  t->Branch("trk_nCluster", &trk_nCluster);
1592  t->Branch("trk_algo", &trk_algo);
1593  t->Branch("trk_originalAlgo", &trk_originalAlgo);
1594  t->Branch("trk_algoMask", &trk_algoMask);
1595  t->Branch("trk_stopReason", &trk_stopReason);
1596  t->Branch("trk_isHP", &trk_isHP);
1597  if (includeSeeds_) {
1598  t->Branch("trk_seedIdx", &trk_seedIdx);
1599  }
1600  t->Branch("trk_vtxIdx", &trk_vtxIdx);
1602  t->Branch("trk_simTrkIdx", &trk_simTrkIdx);
1603  t->Branch("trk_simTrkShareFrac", &trk_simTrkShareFrac);
1604  t->Branch("trk_simTrkNChi2", &trk_simTrkNChi2);
1605  t->Branch("trk_bestSimTrkIdx", &trk_bestSimTrkIdx);
1606  t->Branch("trk_bestFromFirstHitSimTrkIdx", &trk_bestFromFirstHitSimTrkIdx);
1607  } else {
1608  t->Branch("trk_isTrue", &trk_isTrue);
1609  }
1610  t->Branch("trk_bestSimTrkShareFrac", &trk_bestSimTrkShareFrac);
1611  t->Branch("trk_bestSimTrkShareFracSimDenom", &trk_bestSimTrkShareFracSimDenom);
1612  t->Branch("trk_bestSimTrkShareFracSimClusterDenom", &trk_bestSimTrkShareFracSimClusterDenom);
1613  t->Branch("trk_bestSimTrkNChi2", &trk_bestSimTrkNChi2);
1614  t->Branch("trk_bestFromFirstHitSimTrkShareFrac", &trk_bestFromFirstHitSimTrkShareFrac);
1615  t->Branch("trk_bestFromFirstHitSimTrkShareFracSimDenom", &trk_bestFromFirstHitSimTrkShareFracSimDenom);
1616  t->Branch("trk_bestFromFirstHitSimTrkShareFracSimClusterDenom", &trk_bestFromFirstHitSimTrkShareFracSimClusterDenom);
1617  t->Branch("trk_bestFromFirstHitSimTrkNChi2", &trk_bestFromFirstHitSimTrkNChi2);
1618  if (includeAllHits_) {
1619  t->Branch("trk_hitIdx", &trk_hitIdx);
1620  t->Branch("trk_hitType", &trk_hitType);
1621  }
1623  t->Branch("tcand_pca_valid", &tcand_pca_valid);
1624  t->Branch("tcand_pca_px", &tcand_pca_px);
1625  t->Branch("tcand_pca_py", &tcand_pca_py);
1626  t->Branch("tcand_pca_pz", &tcand_pca_pz);
1627  t->Branch("tcand_pca_pt", &tcand_pca_pt);
1628  t->Branch("tcand_pca_eta", &tcand_pca_eta);
1629  t->Branch("tcand_pca_phi", &tcand_pca_phi);
1630  t->Branch("tcand_pca_dxy", &tcand_pca_dxy);
1631  t->Branch("tcand_pca_dz", &tcand_pca_dz);
1632  t->Branch("tcand_pca_ptErr", &tcand_pca_ptErr);
1633  t->Branch("tcand_pca_etaErr", &tcand_pca_etaErr);
1634  t->Branch("tcand_pca_lambdaErr", &tcand_pca_lambdaErr);
1635  t->Branch("tcand_pca_phiErr", &tcand_pca_phiErr);
1636  t->Branch("tcand_pca_dxyErr", &tcand_pca_dxyErr);
1637  t->Branch("tcand_pca_dzErr", &tcand_pca_dzErr);
1638  t->Branch("tcand_px", &tcand_px);
1639  t->Branch("tcand_py", &tcand_py);
1640  t->Branch("tcand_pz", &tcand_pz);
1641  t->Branch("tcand_pt", &tcand_pt);
1642  t->Branch("tcand_x", &tcand_x);
1643  t->Branch("tcand_y", &tcand_y);
1644  t->Branch("tcand_z", &tcand_z);
1645  t->Branch("tcand_qbpErr", &tcand_qbpErr);
1646  t->Branch("tcand_lambdaErr", &tcand_lambdaErr);
1647  t->Branch("tcand_phiErr", &tcand_phiErr);
1648  t->Branch("tcand_xtErr", &tcand_xtErr);
1649  t->Branch("tcand_ytErr", &tcand_ytErr);
1650  t->Branch("tcand_q", &tcand_q);
1651  t->Branch("tcand_ndof", &tcand_ndof);
1652  t->Branch("tcand_nValid", &tcand_nValid);
1653  t->Branch("tcand_nPixel", &tcand_nPixel);
1654  t->Branch("tcand_nStrip", &tcand_nStrip);
1655  t->Branch("tcand_nCluster", &tcand_nCluster);
1656  t->Branch("tcand_algo", &tcand_algo);
1657  t->Branch("tcand_stopReason", &tcand_stopReason);
1658  if (includeSeeds_) {
1659  t->Branch("tcand_seedIdx", &tcand_seedIdx);
1660  }
1661  t->Branch("tcand_vtxIdx", &tcand_vtxIdx);
1663  t->Branch("tcand_simTrkIdx", &tcand_simTrkIdx);
1664  t->Branch("tcand_simTrkShareFrac", &tcand_simTrkShareFrac);
1665  t->Branch("tcand_simTrkNChi2", &tcand_simTrkNChi2);
1666  t->Branch("tcand_bestSimTrkIdx", &tcand_bestSimTrkIdx);
1667  t->Branch("tcand_bestFromFirstHitSimTrkIdx", &tcand_bestFromFirstHitSimTrkIdx);
1668  } else {
1669  t->Branch("tcand_isTrue", &tcand_isTrue);
1670  }
1671  t->Branch("tcand_bestSimTrkShareFrac", &tcand_bestSimTrkShareFrac);
1672  t->Branch("tcand_bestSimTrkShareFracSimDenom", &tcand_bestSimTrkShareFracSimDenom);
1673  t->Branch("tcand_bestSimTrkShareFracSimClusterDenom", &tcand_bestSimTrkShareFracSimClusterDenom);
1674  t->Branch("tcand_bestSimTrkNChi2", &tcand_bestSimTrkNChi2);
1675  t->Branch("tcand_bestFromFirstHitSimTrkShareFrac", &tcand_bestFromFirstHitSimTrkShareFrac);
1676  t->Branch("tcand_bestFromFirstHitSimTrkShareFracSimDenom", &tcand_bestFromFirstHitSimTrkShareFracSimDenom);
1677  t->Branch("tcand_bestFromFirstHitSimTrkShareFracSimClusterDenom",
1679  t->Branch("tcand_bestFromFirstHitSimTrkNChi2", &tcand_bestFromFirstHitSimTrkNChi2);
1680  if (includeAllHits_) {
1681  t->Branch("tcand_hitIdx", &tcand_hitIdx);
1682  t->Branch("tcand_hitType", &tcand_hitType);
1683  }
1684  }
1686  //sim tracks
1687  t->Branch("sim_event", &sim_event);
1688  t->Branch("sim_bunchCrossing", &sim_bunchCrossing);
1689  t->Branch("sim_pdgId", &sim_pdgId);
1690  t->Branch("sim_genPdgIds", &sim_genPdgIds);
1691  t->Branch("sim_isFromBHadron", &sim_isFromBHadron);
1692  t->Branch("sim_px", &sim_px);
1693  t->Branch("sim_py", &sim_py);
1694  t->Branch("sim_pz", &sim_pz);
1695  t->Branch("sim_pt", &sim_pt);
1696  t->Branch("sim_eta", &sim_eta);
1697  t->Branch("sim_phi", &sim_phi);
1698  t->Branch("sim_pca_pt", &sim_pca_pt);
1699  t->Branch("sim_pca_eta", &sim_pca_eta);
1700  t->Branch("sim_pca_lambda", &sim_pca_lambda);
1701  t->Branch("sim_pca_cotTheta", &sim_pca_cotTheta);
1702  t->Branch("sim_pca_phi", &sim_pca_phi);
1703  t->Branch("sim_pca_dxy", &sim_pca_dxy);
1704  t->Branch("sim_pca_dz", &sim_pca_dz);
1705  t->Branch("sim_q", &sim_q);
1706  t->Branch("sim_nValid", &sim_nValid);
1707  t->Branch("sim_nPixel", &sim_nPixel);
1708  t->Branch("sim_nStrip", &sim_nStrip);
1709  t->Branch("sim_nLay", &sim_nLay);
1710  t->Branch("sim_nPixelLay", &sim_nPixelLay);
1711  t->Branch("sim_n3DLay", &sim_n3DLay);
1712  t->Branch("sim_nTrackerHits", &sim_nTrackerHits);
1713  t->Branch("sim_nRecoClusters", &sim_nRecoClusters);
1714  t->Branch("sim_trkIdx", &sim_trkIdx);
1715  t->Branch("sim_trkShareFrac", &sim_trkShareFrac);
1716  if (includeSeeds_) {
1717  t->Branch("sim_seedIdx", &sim_seedIdx);
1718  }
1719  t->Branch("sim_parentVtxIdx", &sim_parentVtxIdx);
1720  t->Branch("sim_decayVtxIdx", &sim_decayVtxIdx);
1721  if (includeAllHits_) {
1722  t->Branch("sim_simHitIdx", &sim_simHitIdx);
1723  }
1724  }
1725  if (includeAllHits_) {
1726  //pixels
1727  t->Branch("pix_isBarrel", &pix_isBarrel);
1728  pix_detId.book("pix", t);
1729  t->Branch("pix_trkIdx", &pix_trkIdx);
1730  if (includeOnTrackHitData_) {
1731  t->Branch("pix_onTrk_x", &pix_onTrk_x);
1732  t->Branch("pix_onTrk_y", &pix_onTrk_y);
1733  t->Branch("pix_onTrk_z", &pix_onTrk_z);
1734  t->Branch("pix_onTrk_xx", &pix_onTrk_xx);
1735  t->Branch("pix_onTrk_xy", &pix_onTrk_xy);
1736  t->Branch("pix_onTrk_yy", &pix_onTrk_yy);
1737  t->Branch("pix_onTrk_yz", &pix_onTrk_yz);
1738  t->Branch("pix_onTrk_zz", &pix_onTrk_zz);
1739  t->Branch("pix_onTrk_zx", &pix_onTrk_zx);
1740  }
1742  t->Branch("pix_tcandIdx", &pix_tcandIdx);
1743  if (includeSeeds_) {
1744  t->Branch("pix_seeIdx", &pix_seeIdx);
1745  }
1747  t->Branch("pix_simHitIdx", &pix_simHitIdx);
1748  if (simHitBySignificance_) {
1749  t->Branch("pix_xySignificance", &pix_xySignificance);
1750  }
1751  t->Branch("pix_chargeFraction", &pix_chargeFraction);
1752  t->Branch("pix_simType", &pix_simType);
1753  }
1754  t->Branch("pix_x", &pix_x);
1755  t->Branch("pix_y", &pix_y);
1756  t->Branch("pix_z", &pix_z);
1757  t->Branch("pix_xx", &pix_xx);
1758  t->Branch("pix_xy", &pix_xy);
1759  t->Branch("pix_yy", &pix_yy);
1760  t->Branch("pix_yz", &pix_yz);
1761  t->Branch("pix_zz", &pix_zz);
1762  t->Branch("pix_zx", &pix_zx);
1763  t->Branch("pix_radL", &pix_radL);
1764  t->Branch("pix_bbxi", &pix_bbxi);
1765  t->Branch("pix_clustSizeCol", &pix_clustSizeCol);
1766  t->Branch("pix_clustSizeRow", &pix_clustSizeRow);
1767  t->Branch("pix_usedMask", &pix_usedMask);
1768  //strips
1769  if (includeStripHits_) {
1770  t->Branch("str_isBarrel", &str_isBarrel);
1771  str_detId.book("str", t);
1772  t->Branch("str_trkIdx", &str_trkIdx);
1773  if (includeOnTrackHitData_) {
1774  t->Branch("str_onTrk_x", &str_onTrk_x);
1775  t->Branch("str_onTrk_y", &str_onTrk_y);
1776  t->Branch("str_onTrk_z", &str_onTrk_z);
1777  t->Branch("str_onTrk_xx", &str_onTrk_xx);
1778  t->Branch("str_onTrk_xy", &str_onTrk_xy);
1779  t->Branch("str_onTrk_yy", &str_onTrk_yy);
1780  t->Branch("str_onTrk_yz", &str_onTrk_yz);
1781  t->Branch("str_onTrk_zz", &str_onTrk_zz);
1782  t->Branch("str_onTrk_zx", &str_onTrk_zx);
1783  }
1785  t->Branch("str_tcandIdx", &str_tcandIdx);
1786  if (includeSeeds_) {
1787  t->Branch("str_seeIdx", &str_seeIdx);
1788  }
1790  t->Branch("str_simHitIdx", &str_simHitIdx);
1791  if (simHitBySignificance_) {
1792  t->Branch("str_xySignificance", &str_xySignificance);
1793  }
1794  t->Branch("str_chargeFraction", &str_chargeFraction);
1795  t->Branch("str_simType", &str_simType);
1796  }
1797  t->Branch("str_x", &str_x);
1798  t->Branch("str_y", &str_y);
1799  t->Branch("str_z", &str_z);
1800  t->Branch("str_xx", &str_xx);
1801  t->Branch("str_xy", &str_xy);
1802  t->Branch("str_yy", &str_yy);
1803  t->Branch("str_yz", &str_yz);
1804  t->Branch("str_zz", &str_zz);
1805  t->Branch("str_zx", &str_zx);
1806  t->Branch("str_radL", &str_radL);
1807  t->Branch("str_bbxi", &str_bbxi);
1808  t->Branch("str_chargePerCM", &str_chargePerCM);
1809  t->Branch("str_clustSize", &str_clustSize);
1810  t->Branch("str_usedMask", &str_usedMask);
1811  //matched hits
1812  t->Branch("glu_isBarrel", &glu_isBarrel);
1813  glu_detId.book("glu", t);
1814  t->Branch("glu_monoIdx", &glu_monoIdx);
1815  t->Branch("glu_stereoIdx", &glu_stereoIdx);
1816  if (includeSeeds_) {
1817  t->Branch("glu_seeIdx", &glu_seeIdx);
1818  }
1819  t->Branch("glu_x", &glu_x);
1820  t->Branch("glu_y", &glu_y);
1821  t->Branch("glu_z", &glu_z);
1822  t->Branch("glu_xx", &glu_xx);
1823  t->Branch("glu_xy", &glu_xy);
1824  t->Branch("glu_yy", &glu_yy);
1825  t->Branch("glu_yz", &glu_yz);
1826  t->Branch("glu_zz", &glu_zz);
1827  t->Branch("glu_zx", &glu_zx);
1828  t->Branch("glu_radL", &glu_radL);
1829  t->Branch("glu_bbxi", &glu_bbxi);
1830  t->Branch("glu_chargePerCM", &glu_chargePerCM);
1831  t->Branch("glu_clustSizeMono", &glu_clustSizeMono);
1832  t->Branch("glu_clustSizeStereo", &glu_clustSizeStereo);
1833  t->Branch("glu_usedMaskMono", &glu_usedMaskMono);
1834  t->Branch("glu_usedMaskStereo", &glu_usedMaskStereo);
1835  }
1836  //phase2 OT
1837  if (includePhase2OTHits_) {
1838  t->Branch("ph2_isBarrel", &ph2_isBarrel);
1839  ph2_detId.book("ph2", t);
1840  t->Branch("ph2_trkIdx", &ph2_trkIdx);
1841  if (includeOnTrackHitData_) {
1842  t->Branch("ph2_onTrk_x", &ph2_onTrk_x);
1843  t->Branch("ph2_onTrk_y", &ph2_onTrk_y);
1844  t->Branch("ph2_onTrk_z", &ph2_onTrk_z);
1845  t->Branch("ph2_onTrk_xx", &ph2_onTrk_xx);
1846  t->Branch("ph2_onTrk_xy", &ph2_onTrk_xy);
1847  t->Branch("ph2_onTrk_yy", &ph2_onTrk_yy);
1848  t->Branch("ph2_onTrk_yz", &ph2_onTrk_yz);
1849  t->Branch("ph2_onTrk_zz", &ph2_onTrk_zz);
1850  t->Branch("ph2_onTrk_zx", &ph2_onTrk_zx);
1851  }
1853  t->Branch("ph2_tcandIdx", &ph2_tcandIdx);
1854  if (includeSeeds_) {
1855  t->Branch("ph2_seeIdx", &ph2_seeIdx);
1856  }
1858  t->Branch("ph2_simHitIdx", &ph2_simHitIdx);
1859  if (simHitBySignificance_) {
1860  t->Branch("ph2_xySignificance", &ph2_xySignificance);
1861  }
1862  t->Branch("ph2_simType", &ph2_simType);
1863  }
1864  t->Branch("ph2_x", &ph2_x);
1865  t->Branch("ph2_y", &ph2_y);
1866  t->Branch("ph2_z", &ph2_z);
1867  t->Branch("ph2_xx", &ph2_xx);
1868  t->Branch("ph2_xy", &ph2_xy);
1869  t->Branch("ph2_yy", &ph2_yy);
1870  t->Branch("ph2_yz", &ph2_yz);
1871  t->Branch("ph2_zz", &ph2_zz);
1872  t->Branch("ph2_zx", &ph2_zx);
1873  t->Branch("ph2_radL", &ph2_radL);
1874  t->Branch("ph2_bbxi", &ph2_bbxi);
1875  t->Branch("ph2_bbxi", &ph2_bbxi);
1876  }
1877  //invalid hits
1878  t->Branch("inv_isBarrel", &inv_isBarrel);
1879  if (includeStripHits_)
1880  inv_detId.book("inv", t);
1881  else
1882  inv_detId_phase2.book("inv", t);
1883  t->Branch("inv_type", &inv_type);
1884  //simhits
1886  if (includeStripHits_)
1887  simhit_detId.book("simhit", t);
1888  else
1889  simhit_detId_phase2.book("simhit", t);
1890  t->Branch("simhit_x", &simhit_x);
1891  t->Branch("simhit_y", &simhit_y);
1892  t->Branch("simhit_z", &simhit_z);
1893  if (saveSimHitsP3_) {
1894  t->Branch("simhit_px", &simhit_px);
1895  t->Branch("simhit_py", &simhit_py);
1896  t->Branch("simhit_pz", &simhit_pz);
1897  }
1898  t->Branch("simhit_particle", &simhit_particle);
1899  t->Branch("simhit_process", &simhit_process);
1900  t->Branch("simhit_eloss", &simhit_eloss);
1901  t->Branch("simhit_tof", &simhit_tof);
1902  t->Branch("simhit_simTrkIdx", &simhit_simTrkIdx);
1903  t->Branch("simhit_hitIdx", &simhit_hitIdx);
1904  t->Branch("simhit_hitType", &simhit_hitType);
1905  }
1906  }
1907  //beam spot
1908  t->Branch("bsp_x", &bsp_x, "bsp_x/F");
1909  t->Branch("bsp_y", &bsp_y, "bsp_y/F");
1910  t->Branch("bsp_z", &bsp_z, "bsp_z/F");
1911  t->Branch("bsp_sigmax", &bsp_sigmax, "bsp_sigmax/F");
1912  t->Branch("bsp_sigmay", &bsp_sigmay, "bsp_sigmay/F");
1913  t->Branch("bsp_sigmaz", &bsp_sigmaz, "bsp_sigmaz/F");
1914  if (includeSeeds_) {
1915  //seeds
1916  t->Branch("see_fitok", &see_fitok);
1917  t->Branch("see_px", &see_px);
1918  t->Branch("see_py", &see_py);
1919  t->Branch("see_pz", &see_pz);
1920  t->Branch("see_pt", &see_pt);
1921  t->Branch("see_eta", &see_eta);
1922  t->Branch("see_phi", &see_phi);
1923  t->Branch("see_dxy", &see_dxy);
1924  t->Branch("see_dz", &see_dz);
1925  t->Branch("see_ptErr", &see_ptErr);
1926  t->Branch("see_etaErr", &see_etaErr);
1927  t->Branch("see_phiErr", &see_phiErr);
1928  t->Branch("see_dxyErr", &see_dxyErr);
1929  t->Branch("see_dzErr", &see_dzErr);
1930  t->Branch("see_chi2", &see_chi2);
1931  t->Branch("see_statePt", &see_statePt);
1932  t->Branch("see_stateTrajX", &see_stateTrajX);
1933  t->Branch("see_stateTrajY", &see_stateTrajY);
1934  t->Branch("see_stateTrajPx", &see_stateTrajPx);
1935  t->Branch("see_stateTrajPy", &see_stateTrajPy);
1936  t->Branch("see_stateTrajPz", &see_stateTrajPz);
1937  t->Branch("see_stateTrajGlbX", &see_stateTrajGlbX);
1938  t->Branch("see_stateTrajGlbY", &see_stateTrajGlbY);
1939  t->Branch("see_stateTrajGlbZ", &see_stateTrajGlbZ);
1940  t->Branch("see_stateTrajGlbPx", &see_stateTrajGlbPx);
1941  t->Branch("see_stateTrajGlbPy", &see_stateTrajGlbPy);
1942  t->Branch("see_stateTrajGlbPz", &see_stateTrajGlbPz);
1943  if (addSeedCurvCov_) {
1944  t->Branch("see_stateCurvCov", &see_stateCurvCov);
1945  }
1946  t->Branch("see_q", &see_q);
1947  t->Branch("see_nValid", &see_nValid);
1948  t->Branch("see_nPixel", &see_nPixel);
1949  t->Branch("see_nGlued", &see_nGlued);
1950  t->Branch("see_nStrip", &see_nStrip);
1951  t->Branch("see_nPhase2OT", &see_nPhase2OT);
1952  t->Branch("see_nCluster", &see_nCluster);
1953  t->Branch("see_algo", &see_algo);
1954  t->Branch("see_stopReason", &see_stopReason);
1955  t->Branch("see_nCands", &see_nCands);
1956  t->Branch("see_trkIdx", &see_trkIdx);
1958  t->Branch("see_tcandIdx", &see_tcandIdx);
1960  t->Branch("see_simTrkIdx", &see_simTrkIdx);
1961  t->Branch("see_simTrkShareFrac", &see_simTrkShareFrac);
1962  t->Branch("see_bestSimTrkIdx", &see_bestSimTrkIdx);
1963  t->Branch("see_bestFromFirstHitSimTrkIdx", &see_bestFromFirstHitSimTrkIdx);
1964  } else {
1965  t->Branch("see_isTrue", &see_isTrue);
1966  }
1967  t->Branch("see_bestSimTrkShareFrac", &see_bestSimTrkShareFrac);
1968  t->Branch("see_bestFromFirstHitSimTrkShareFrac", &see_bestFromFirstHitSimTrkShareFrac);
1969  if (includeAllHits_) {
1970  t->Branch("see_hitIdx", &see_hitIdx);
1971  t->Branch("see_hitType", &see_hitType);
1972  }
1973  //seed algo offset
1974  t->Branch("see_offset", &see_offset);
1975  }
1976 
1977  //vertices
1978  t->Branch("vtx_x", &vtx_x);
1979  t->Branch("vtx_y", &vtx_y);
1980  t->Branch("vtx_z", &vtx_z);
1981  t->Branch("vtx_xErr", &vtx_xErr);
1982  t->Branch("vtx_yErr", &vtx_yErr);
1983  t->Branch("vtx_zErr", &vtx_zErr);
1984  t->Branch("vtx_ndof", &vtx_ndof);
1985  t->Branch("vtx_chi2", &vtx_chi2);
1986  t->Branch("vtx_fake", &vtx_fake);
1987  t->Branch("vtx_valid", &vtx_valid);
1988  t->Branch("vtx_trkIdx", &vtx_trkIdx);
1989 
1990  // tracking vertices
1991  t->Branch("simvtx_event", &simvtx_event);
1992  t->Branch("simvtx_bunchCrossing", &simvtx_bunchCrossing);
1993  t->Branch("simvtx_processType", &simvtx_processType);
1994  t->Branch("simvtx_x", &simvtx_x);
1995  t->Branch("simvtx_y", &simvtx_y);
1996  t->Branch("simvtx_z", &simvtx_z);
1997  t->Branch("simvtx_sourceSimIdx", &simvtx_sourceSimIdx);
1998  t->Branch("simvtx_daughterSimIdx", &simvtx_daughterSimIdx);
1999 
2000  t->Branch("simpv_idx", &simpv_idx);
2001 
2002  //t->Branch("" , &);
2003 }
2004 
2006  // do anything here that needs to be done at desctruction time
2007  // (e.g. close files, deallocate resources etc.)
2008 }
2009 
2010 //
2011 // member functions
2012 //
2014  ev_run = 0;
2015  ev_lumi = 0;
2016  ev_event = 0;
2017 
2018  //tracks
2019  trk_px.clear();
2020  trk_py.clear();
2021  trk_pz.clear();
2022  trk_pt.clear();
2023  trk_inner_px.clear();
2024  trk_inner_py.clear();
2025  trk_inner_pz.clear();
2026  trk_inner_pt.clear();
2027  trk_outer_px.clear();
2028  trk_outer_py.clear();
2029  trk_outer_pz.clear();
2030  trk_outer_pt.clear();
2031  trk_eta.clear();
2032  trk_lambda.clear();
2033  trk_cotTheta.clear();
2034  trk_phi.clear();
2035  trk_dxy.clear();
2036  trk_dz.clear();
2037  trk_dxyPV.clear();
2038  trk_dzPV.clear();
2039  trk_dxyClosestPV.clear();
2040  trk_dzClosestPV.clear();
2041  trk_ptErr.clear();
2042  trk_etaErr.clear();
2043  trk_lambdaErr.clear();
2044  trk_phiErr.clear();
2045  trk_dxyErr.clear();
2046  trk_dzErr.clear();
2047  trk_refpoint_x.clear();
2048  trk_refpoint_y.clear();
2049  trk_refpoint_z.clear();
2050  trk_nChi2.clear();
2051  trk_nChi2_1Dmod.clear();
2052  trk_ndof.clear();
2053  for (auto& mva : trk_mvas) {
2054  mva.clear();
2055  }
2056  for (auto& mask : trk_qualityMasks) {
2057  mask.clear();
2058  }
2059  trk_q.clear();
2060  trk_nValid.clear();
2061  trk_nLost.clear();
2062  trk_nInactive.clear();
2063  trk_nPixel.clear();
2064  trk_nStrip.clear();
2065  trk_nOuterLost.clear();
2066  trk_nInnerLost.clear();
2067  trk_nOuterInactive.clear();
2068  trk_nInnerInactive.clear();
2069  trk_nPixelLay.clear();
2070  trk_nStripLay.clear();
2071  trk_n3DLay.clear();
2072  trk_nLostLay.clear();
2073  trk_nCluster.clear();
2074  trk_algo.clear();
2075  trk_originalAlgo.clear();
2076  trk_algoMask.clear();
2077  trk_stopReason.clear();
2078  trk_isHP.clear();
2079  trk_seedIdx.clear();
2080  trk_vtxIdx.clear();
2081  trk_isTrue.clear();
2082  trk_bestSimTrkIdx.clear();
2083  trk_bestSimTrkShareFrac.clear();
2086  trk_bestSimTrkNChi2.clear();
2092  trk_simTrkIdx.clear();
2093  trk_simTrkShareFrac.clear();
2094  trk_simTrkNChi2.clear();
2095  trk_hitIdx.clear();
2096  trk_hitType.clear();
2097  //track candidates
2098  tcand_pca_valid.clear();
2099  tcand_pca_px.clear();
2100  tcand_pca_py.clear();
2101  tcand_pca_pz.clear();
2102  tcand_pca_pt.clear();
2103  tcand_pca_eta.clear();
2104  tcand_pca_phi.clear();
2105  tcand_pca_dxy.clear();
2106  tcand_pca_dz.clear();
2107  tcand_pca_ptErr.clear();
2108  tcand_pca_etaErr.clear();
2109  tcand_pca_lambdaErr.clear();
2110  tcand_pca_phiErr.clear();
2111  tcand_pca_dxyErr.clear();
2112  tcand_pca_dzErr.clear();
2113  tcand_px.clear();
2114  tcand_py.clear();
2115  tcand_pz.clear();
2116  tcand_pt.clear();
2117  tcand_x.clear();
2118  tcand_y.clear();
2119  tcand_z.clear();
2120  tcand_qbpErr.clear();
2121  tcand_lambdaErr.clear();
2122  tcand_phiErr.clear();
2123  tcand_xtErr.clear();
2124  tcand_ytErr.clear();
2125  tcand_ndof.clear();
2126  tcand_q.clear();
2127  tcand_nValid.clear();
2128  tcand_nPixel.clear();
2129  tcand_nStrip.clear();
2130  tcand_nCluster.clear();
2131  tcand_algo.clear();
2132  tcand_stopReason.clear();
2133  tcand_seedIdx.clear();
2134  tcand_vtxIdx.clear();
2135  tcand_isTrue.clear();
2136  tcand_bestSimTrkIdx.clear();
2137  tcand_bestSimTrkShareFrac.clear();
2140  tcand_bestSimTrkNChi2.clear();
2146  tcand_simTrkShareFrac.clear();
2147  tcand_simTrkNChi2.clear();
2148  tcand_simTrkIdx.clear();
2149  tcand_hitIdx.clear();
2150  tcand_hitType.clear();
2151  //sim tracks
2152  sim_event.clear();
2153  sim_bunchCrossing.clear();
2154  sim_pdgId.clear();
2155  sim_genPdgIds.clear();
2156  sim_isFromBHadron.clear();
2157  sim_px.clear();
2158  sim_py.clear();
2159  sim_pz.clear();
2160  sim_pt.clear();
2161  sim_eta.clear();
2162  sim_phi.clear();
2163  sim_pca_pt.clear();
2164  sim_pca_eta.clear();
2165  sim_pca_lambda.clear();
2166  sim_pca_cotTheta.clear();
2167  sim_pca_phi.clear();
2168  sim_pca_dxy.clear();
2169  sim_pca_dz.clear();
2170  sim_q.clear();
2171  sim_nValid.clear();
2172  sim_nPixel.clear();
2173  sim_nStrip.clear();
2174  sim_nLay.clear();
2175  sim_nPixelLay.clear();
2176  sim_n3DLay.clear();
2177  sim_nTrackerHits.clear();
2178  sim_nRecoClusters.clear();
2179  sim_trkIdx.clear();
2180  sim_seedIdx.clear();
2181  sim_trkShareFrac.clear();
2182  sim_parentVtxIdx.clear();
2183  sim_decayVtxIdx.clear();
2184  sim_simHitIdx.clear();
2185  //pixels
2186  pix_isBarrel.clear();
2187  pix_detId.clear();
2188  pix_trkIdx.clear();
2189  pix_onTrk_x.clear();
2190  pix_onTrk_y.clear();
2191  pix_onTrk_z.clear();
2192  pix_onTrk_xx.clear();
2193  pix_onTrk_xy.clear();
2194  pix_onTrk_yy.clear();
2195  pix_onTrk_yz.clear();
2196  pix_onTrk_zz.clear();
2197  pix_onTrk_zx.clear();
2198  pix_tcandIdx.clear();
2199  pix_seeIdx.clear();
2200  pix_simHitIdx.clear();
2201  pix_xySignificance.clear();
2202  pix_chargeFraction.clear();
2203  pix_simType.clear();
2204  pix_x.clear();
2205  pix_y.clear();
2206  pix_z.clear();
2207  pix_xx.clear();
2208  pix_xy.clear();
2209  pix_yy.clear();
2210  pix_yz.clear();
2211  pix_zz.clear();
2212  pix_zx.clear();
2213  pix_radL.clear();
2214  pix_bbxi.clear();
2215  pix_clustSizeCol.clear();
2216  pix_clustSizeRow.clear();
2217  pix_usedMask.clear();
2218  //strips
2219  str_isBarrel.clear();
2220  str_detId.clear();
2221  str_trkIdx.clear();
2222  str_onTrk_x.clear();
2223  str_onTrk_y.clear();
2224  str_onTrk_z.clear();
2225  str_onTrk_xx.clear();
2226  str_onTrk_xy.clear();
2227  str_onTrk_yy.clear();
2228  str_onTrk_yz.clear();
2229  str_onTrk_zz.clear();
2230  str_onTrk_zx.clear();
2231  str_tcandIdx.clear();
2232  str_seeIdx.clear();
2233  str_simHitIdx.clear();
2234  str_xySignificance.clear();
2235  str_chargeFraction.clear();
2236  str_simType.clear();
2237  str_x.clear();
2238  str_y.clear();
2239  str_z.clear();
2240  str_xx.clear();
2241  str_xy.clear();
2242  str_yy.clear();
2243  str_yz.clear();
2244  str_zz.clear();
2245  str_zx.clear();
2246  str_radL.clear();
2247  str_bbxi.clear();
2248  str_chargePerCM.clear();
2249  str_clustSize.clear();
2250  str_usedMask.clear();
2251  //matched hits
2252  glu_isBarrel.clear();
2253  glu_detId.clear();
2254  glu_monoIdx.clear();
2255  glu_stereoIdx.clear();
2256  glu_seeIdx.clear();
2257  glu_x.clear();
2258  glu_y.clear();
2259  glu_z.clear();
2260  glu_xx.clear();
2261  glu_xy.clear();
2262  glu_yy.clear();
2263  glu_yz.clear();
2264  glu_zz.clear();
2265  glu_zx.clear();
2266  glu_radL.clear();
2267  glu_bbxi.clear();
2268  glu_chargePerCM.clear();
2269  glu_clustSizeMono.clear();
2270  glu_clustSizeStereo.clear();
2271  glu_usedMaskMono.clear();
2272  glu_usedMaskStereo.clear();
2273  //phase2 OT
2274  ph2_isBarrel.clear();
2275  ph2_detId.clear();
2276  ph2_trkIdx.clear();
2277  ph2_onTrk_x.clear();
2278  ph2_onTrk_y.clear();
2279  ph2_onTrk_z.clear();
2280  ph2_onTrk_xx.clear();
2281  ph2_onTrk_xy.clear();
2282  ph2_onTrk_yy.clear();
2283  ph2_onTrk_yz.clear();
2284  ph2_onTrk_zz.clear();
2285  ph2_onTrk_zx.clear();
2286  ph2_tcandIdx.clear();
2287  ph2_seeIdx.clear();
2288  ph2_xySignificance.clear();
2289  ph2_simHitIdx.clear();
2290  ph2_simType.clear();
2291  ph2_x.clear();
2292  ph2_y.clear();
2293  ph2_z.clear();
2294  ph2_xx.clear();
2295  ph2_xy.clear();
2296  ph2_yy.clear();
2297  ph2_yz.clear();
2298  ph2_zz.clear();
2299  ph2_zx.clear();
2300  ph2_radL.clear();
2301  ph2_bbxi.clear();
2302  //invalid hits
2303  inv_isBarrel.clear();
2304  inv_detId.clear();
2305  inv_detId_phase2.clear();
2306  inv_type.clear();
2307  // simhits
2308  simhit_detId.clear();
2309  simhit_detId_phase2.clear();
2310  simhit_x.clear();
2311  simhit_y.clear();
2312  simhit_z.clear();
2313  simhit_px.clear();
2314  simhit_py.clear();
2315  simhit_pz.clear();
2316  simhit_particle.clear();
2317  simhit_process.clear();
2318  simhit_eloss.clear();
2319  simhit_tof.clear();
2320  //simhit_simTrackId.clear();
2321  simhit_simTrkIdx.clear();
2322  simhit_hitIdx.clear();
2323  simhit_hitType.clear();
2324  //beamspot
2325  bsp_x = -9999.;
2326  bsp_y = -9999.;
2327  bsp_z = -9999.;
2328  bsp_sigmax = -9999.;
2329  bsp_sigmay = -9999.;
2330  bsp_sigmaz = -9999.;
2331  //seeds
2332  see_fitok.clear();
2333  see_px.clear();
2334  see_py.clear();
2335  see_pz.clear();
2336  see_pt.clear();
2337  see_eta.clear();
2338  see_phi.clear();
2339  see_dxy.clear();
2340  see_dz.clear();
2341  see_ptErr.clear();
2342  see_etaErr.clear();
2343  see_phiErr.clear();
2344  see_dxyErr.clear();
2345  see_dzErr.clear();
2346  see_chi2.clear();
2347  see_statePt.clear();
2348  see_stateTrajX.clear();
2349  see_stateTrajY.clear();
2350  see_stateTrajPx.clear();
2351  see_stateTrajPy.clear();
2352  see_stateTrajPz.clear();
2353  see_stateTrajGlbX.clear();
2354  see_stateTrajGlbY.clear();
2355  see_stateTrajGlbZ.clear();
2356  see_stateTrajGlbPx.clear();
2357  see_stateTrajGlbPy.clear();
2358  see_stateTrajGlbPz.clear();
2359  see_stateCurvCov.clear();
2360  see_q.clear();
2361  see_nValid.clear();
2362  see_nPixel.clear();
2363  see_nGlued.clear();
2364  see_nStrip.clear();
2365  see_nPhase2OT.clear();
2366  see_nCluster.clear();
2367  see_algo.clear();
2368  see_stopReason.clear();
2369  see_nCands.clear();
2370  see_trkIdx.clear();
2371  see_tcandIdx.clear();
2372  see_isTrue.clear();
2373  see_bestSimTrkIdx.clear();
2374  see_bestSimTrkShareFrac.clear();
2377  see_simTrkIdx.clear();
2378  see_simTrkShareFrac.clear();
2379  see_hitIdx.clear();
2380  see_hitType.clear();
2381  //seed algo offset
2382  see_offset.clear();
2383 
2384  // vertices
2385  vtx_x.clear();
2386  vtx_y.clear();
2387  vtx_z.clear();
2388  vtx_xErr.clear();
2389  vtx_yErr.clear();
2390  vtx_zErr.clear();
2391  vtx_ndof.clear();
2392  vtx_chi2.clear();
2393  vtx_fake.clear();
2394  vtx_valid.clear();
2395  vtx_trkIdx.clear();
2396 
2397  // Tracking vertices
2398  simvtx_event.clear();
2399  simvtx_bunchCrossing.clear();
2400  simvtx_processType.clear();
2401  simvtx_x.clear();
2402  simvtx_y.clear();
2403  simvtx_z.clear();
2404  simvtx_sourceSimIdx.clear();
2405  simvtx_daughterSimIdx.clear();
2406  simpv_idx.clear();
2407 }
2408 
2409 // ------------ method called for each event ------------
2411  using namespace edm;
2412  using namespace reco;
2413  using namespace std;
2414 
2415  const auto& mf = iSetup.getData(mfToken_);
2416  const TrackerTopology& tTopo = iSetup.getData(tTopoToken_);
2417  const TrackerGeometry& tracker = iSetup.getData(tGeomToken_);
2418 
2420  iEvent.getByToken(trackAssociatorToken_, theAssociator);
2421  const reco::TrackToTrackingParticleAssociator& associatorByHits = *theAssociator;
2422 
2423  LogDebug("TrackingNtuple") << "Analyzing new event";
2424 
2425  //initialize tree variables
2426  clearVariables();
2427 
2428  // FIXME: we really need to move to edm::View for reading the
2429  // TrackingParticles... Unfortunately it has non-trivial
2430  // consequences on the associator/association interfaces etc.
2432  const TrackingParticleRefVector* tmpTPptr = nullptr;
2434  edm::Handle<TrackingParticleRefVector> TPCollectionHRefVector;
2435 
2437  iEvent.getByToken(trackingParticleToken_, TPCollectionH);
2438  for (size_t i = 0, size = TPCollectionH->size(); i < size; ++i) {
2439  tmpTP.push_back(TrackingParticleRef(TPCollectionH, i));
2440  }
2441  tmpTPptr = &tmpTP;
2442  } else {
2443  iEvent.getByToken(trackingParticleRefToken_, TPCollectionHRefVector);
2444  tmpTPptr = TPCollectionHRefVector.product();
2445  }
2446  const TrackingParticleRefVector& tpCollection = *tmpTPptr;
2447 
2448  // Fill mapping from Ref::key() to index
2449  TrackingParticleRefKeyToIndex tpKeyToIndex;
2450  for (size_t i = 0; i < tpCollection.size(); ++i) {
2451  tpKeyToIndex[tpCollection[i].key()] = i;
2452  }
2453 
2454  // tracking vertices
2456  iEvent.getByToken(trackingVertexToken_, htv);
2457  const TrackingVertexCollection& tvs = *htv;
2458 
2459  // Fill mapping from Ref::key() to index
2460  TrackingVertexRefVector tvRefs;
2461  TrackingVertexRefKeyToIndex tvKeyToIndex;
2462  for (size_t i = 0; i < tvs.size(); ++i) {
2463  const TrackingVertex& v = tvs[i];
2464  if (!includeOOT_ && v.eventId().bunchCrossing() != 0) // Ignore OOTPU
2465  continue;
2466  tvKeyToIndex[i] = tvRefs.size();
2467  tvRefs.push_back(TrackingVertexRef(htv, i));
2468  }
2469 
2470  //get association maps, etc.
2471  Handle<ClusterTPAssociation> pCluster2TPListH;
2472  iEvent.getByToken(clusterTPMapToken_, pCluster2TPListH);
2473  const ClusterTPAssociation& clusterToTPMap = *pCluster2TPListH;
2475  iEvent.getByToken(simHitTPMapToken_, simHitsTPAssoc);
2476 
2477  // TP -> cluster count
2478  TrackingParticleRefKeyToCount tpKeyToClusterCount;
2479  for (const auto& clusterTP : clusterToTPMap) {
2480  tpKeyToClusterCount[clusterTP.second.key()] += 1;
2481  }
2482 
2483  // SimHit key -> index mapping
2484  SimHitRefKeyToIndex simHitRefKeyToIndex;
2485 
2486  //make a list to link TrackingParticles to its simhits
2487  std::vector<TPHitIndex> tpHitList;
2488 
2489  // Count the number of reco cluster per TP
2490 
2491  std::set<edm::ProductID> hitProductIds;
2492  std::map<edm::ProductID, size_t> seedCollToOffset;
2493 
2494  ev_run = iEvent.id().run();
2495  ev_lumi = iEvent.id().luminosityBlock();
2496  ev_event = iEvent.id().event();
2497 
2498  // Digi->Sim links for pixels and strips
2499  edm::Handle<edm::DetSetVector<PixelDigiSimLink>> pixelDigiSimLinksHandle;
2500  iEvent.getByToken(pixelSimLinkToken_, pixelDigiSimLinksHandle);
2501  const auto& pixelDigiSimLinks = *pixelDigiSimLinksHandle;
2502 
2503  edm::Handle<edm::DetSetVector<StripDigiSimLink>> stripDigiSimLinksHandle;
2504  iEvent.getByToken(stripSimLinkToken_, stripDigiSimLinksHandle);
2505 
2506  // Phase2 OT DigiSimLink
2507  edm::Handle<edm::DetSetVector<PixelDigiSimLink>> siphase2OTSimLinksHandle;
2508  iEvent.getByToken(siphase2OTSimLinksToken_, siphase2OTSimLinksHandle);
2509 
2510  //beamspot
2511  Handle<reco::BeamSpot> recoBeamSpotHandle;
2512  iEvent.getByToken(beamSpotToken_, recoBeamSpotHandle);
2513  BeamSpot const& bs = *recoBeamSpotHandle;
2514  fillBeamSpot(bs);
2515 
2516  //prapare list to link matched hits to collection
2517  vector<pair<int, int>> monoStereoClusterList;
2518  if (includeAllHits_) {
2519  // simhits, only if TPs are saved as well
2521  fillSimHits(tracker, tpKeyToIndex, *simHitsTPAssoc, tTopo, simHitRefKeyToIndex, tpHitList);
2522  }
2523 
2524  //pixel hits
2526  tracker,
2527  clusterToTPMap,
2528  tpKeyToIndex,
2529  *simHitsTPAssoc,
2530  pixelDigiSimLinks,
2531  tTopo,
2532  simHitRefKeyToIndex,
2533  hitProductIds);
2534 
2535  //strip hits
2536  if (includeStripHits_) {
2537  LogDebug("TrackingNtuple") << "foundStripSimLink";
2538  const auto& stripDigiSimLinks = *stripDigiSimLinksHandle;
2540  tracker,
2541  clusterToTPMap,
2542  tpKeyToIndex,
2543  *simHitsTPAssoc,
2544  stripDigiSimLinks,
2545  tTopo,
2546  simHitRefKeyToIndex,
2547  hitProductIds);
2548 
2549  //matched hits
2550  fillStripMatchedHits(iEvent, tracker, tTopo, monoStereoClusterList);
2551  }
2552 
2553  if (includePhase2OTHits_) {
2554  LogDebug("TrackingNtuple") << "foundPhase2OTSimLinks";
2555  const auto& phase2OTSimLinks = *siphase2OTSimLinksHandle;
2557  clusterToTPMap,
2558  tracker,
2559  tpKeyToIndex,
2560  *simHitsTPAssoc,
2561  phase2OTSimLinks,
2562  tTopo,
2563  simHitRefKeyToIndex,
2564  hitProductIds);
2565  }
2566  }
2567 
2568  //seeds
2569  if (includeSeeds_) {
2570  fillSeeds(iEvent,
2571  tpCollection,
2572  tpKeyToIndex,
2573  bs,
2574  tracker,
2575  associatorByHits,
2576  clusterToTPMap,
2577  mf,
2578  tTopo,
2579  monoStereoClusterList,
2580  hitProductIds,
2581  seedCollToOffset);
2582  }
2583 
2584  //tracks
2585  edm::Handle<edm::View<reco::Track>> tracksHandle;
2586  iEvent.getByToken(trackToken_, tracksHandle);
2587  const edm::View<reco::Track>& tracks = *tracksHandle;
2588  // The associator interfaces really need to be fixed...
2590  for (edm::View<Track>::size_type i = 0; i < tracks.size(); ++i) {
2591  trackRefs.push_back(tracks.refAt(i));
2592  }
2593  std::vector<const MVACollection*> mvaColls;
2594  std::vector<const QualityMaskCollection*> qualColls;
2595  if (includeMVA_) {
2598 
2599  for (const auto& tokenTpl : mvaQualityCollectionTokens_) {
2600  iEvent.getByToken(std::get<0>(tokenTpl), hmva);
2601  iEvent.getByToken(std::get<1>(tokenTpl), hqual);
2602 
2603  mvaColls.push_back(hmva.product());
2604  qualColls.push_back(hqual.product());
2605  if (mvaColls.back()->size() != tracks.size()) {
2606  throw cms::Exception("Configuration")
2607  << "Inconsistency in track collection and MVA sizes. Track collection has " << tracks.size()
2608  << " tracks, whereas the MVA " << (mvaColls.size() - 1) << " has " << mvaColls.back()->size()
2609  << " entries. Double-check your configuration.";
2610  }
2611  if (qualColls.back()->size() != tracks.size()) {
2612  throw cms::Exception("Configuration")
2613  << "Inconsistency in track collection and quality mask sizes. Track collection has " << tracks.size()
2614  << " tracks, whereas the quality mask " << (qualColls.size() - 1) << " has " << qualColls.back()->size()
2615  << " entries. Double-check your configuration.";
2616  }
2617  }
2618  }
2619 
2621  iEvent.getByToken(vertexToken_, vertices);
2622 
2623  fillTracks(trackRefs,
2624  tracker,
2625  tpCollection,
2626  tpKeyToIndex,
2627  tpKeyToClusterCount,
2628  mf,
2629  bs,
2630  *vertices,
2631  associatorByHits,
2632  clusterToTPMap,
2633  tTopo,
2634  hitProductIds,
2635  seedCollToOffset,
2636  mvaColls,
2637  qualColls);
2638 
2640  //candidates
2641  for (auto const& token : candidateTokens_) {
2642  auto const tCandsHandle = iEvent.getHandle(token);
2643 
2646  TString label = labels.module;
2647  label.ReplaceAll("TrackCandidates", "");
2648  label.ReplaceAll("muonSeeded", "muonSeededStep");
2649  int algo = reco::TrackBase::algoByName(label.Data());
2650 
2651  fillCandidates(tCandsHandle,
2652  algo,
2653  tpCollection,
2654  tpKeyToIndex,
2655  tpKeyToClusterCount,
2656  mf,
2657  bs,
2658  *vertices,
2659  associatorByHits,
2660  clusterToTPMap,
2661  tracker,
2662  tTopo,
2663  hitProductIds,
2664  seedCollToOffset);
2665  }
2666  }
2667 
2668  //tracking particles
2669  //sort association maps with simHits
2670  std::sort(tpHitList.begin(), tpHitList.end(), tpHitIndexListLessSort);
2672  iEvent, iSetup, trackRefs, bs, tpCollection, tvKeyToIndex, associatorByHits, tpHitList, tpKeyToClusterCount);
2673 
2674  // vertices
2675  fillVertices(*vertices, trackRefs);
2676 
2677  // tracking vertices
2678  fillTrackingVertices(tvRefs, tpKeyToIndex);
2679 
2680  t->Fill();
2681 }
2682 
2684  bsp_x = bs.x0();
2685  bsp_y = bs.y0();
2686  bsp_z = bs.x0();
2687  bsp_sigmax = bs.BeamWidthX();
2688  bsp_sigmay = bs.BeamWidthY();
2689  bsp_sigmaz = bs.sigmaZ();
2690 }
2691 
2692 namespace {
2693  template <typename SimLink>
2694  struct GetCluster;
2695  template <>
2696  struct GetCluster<PixelDigiSimLink> {
2697  static const SiPixelCluster& call(const OmniClusterRef& cluster) { return cluster.pixelCluster(); }
2698  };
2699  template <>
2700  struct GetCluster<StripDigiSimLink> {
2701  static const SiStripCluster& call(const OmniClusterRef& cluster) { return cluster.stripCluster(); }
2702  };
2703 } // namespace
2704 
2705 template <typename SimLink>
2707  const OmniClusterRef& cluster,
2708  DetId hitId,
2709  int clusterKey,
2710  const TrackingRecHit& hit,
2711  const ClusterTPAssociation& clusterToTPMap,
2712  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2715  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
2716  HitType hitType) {
2717  SimHitData ret;
2718 
2719  std::map<unsigned int, double> simTrackIdToChargeFraction;
2720  if (hitType == HitType::Phase2OT)
2721  simTrackIdToChargeFraction = chargeFraction(cluster.phase2OTCluster(), hitId, digiSimLinks);
2722  else
2723  simTrackIdToChargeFraction = chargeFraction(GetCluster<SimLink>::call(cluster), hitId, digiSimLinks);
2724 
2725  float h_x = 0, h_y = 0;
2726  float h_xx = 0, h_xy = 0, h_yy = 0;
2727  if (simHitBySignificance_) {
2728  h_x = hit.localPosition().x();
2729  h_y = hit.localPosition().y();
2730  h_xx = hit.localPositionError().xx();
2731  h_xy = hit.localPositionError().xy();
2732  h_yy = hit.localPositionError().yy();
2733  }
2734 
2735  ret.type = HitSimType::Noise;
2736  auto range = clusterToTPMap.equal_range(cluster);
2737  if (range.first != range.second) {
2738  for (auto ip = range.first; ip != range.second; ++ip) {
2739  const TrackingParticleRef& trackingParticle = ip->second;
2740 
2741  // Find out if the cluster is from signal/ITPU/OOTPU
2742  const auto event = trackingParticle->eventId().event();
2743  const auto bx = trackingParticle->eventId().bunchCrossing();
2745  if (bx == 0) {
2746  type = (event == 0 ? HitSimType::Signal : HitSimType::ITPileup);
2747  } else
2749  ret.type = static_cast<HitSimType>(std::min(static_cast<int>(ret.type), static_cast<int>(type)));
2750 
2751  // Limit to only input TrackingParticles (usually signal+ITPU)
2752  auto tpIndex = tpKeyToIndex.find(trackingParticle.key());
2753  if (tpIndex == tpKeyToIndex.end())
2754  continue;
2755 
2756  //now get the corresponding sim hit
2757  std::pair<TrackingParticleRef, TrackPSimHitRef> simHitTPpairWithDummyTP(trackingParticle, TrackPSimHitRef());
2758  //SimHit is dummy: for simHitTPAssociationListGreater sorting only the TP is needed
2759  auto range = std::equal_range(simHitsTPAssoc.begin(),
2760  simHitsTPAssoc.end(),
2761  simHitTPpairWithDummyTP,
2763  bool foundSimHit = false;
2764  bool foundElectron = false;
2765  int foundNonElectrons = 0;
2766  for (auto ip = range.first; ip != range.second; ++ip) {
2767  TrackPSimHitRef TPhit = ip->second;
2768  DetId dId = DetId(TPhit->detUnitId());
2769  if (dId.rawId() == hitId.rawId()) {
2770  // skip electron SimHits for non-electron TPs also here
2771  if (std::abs(TPhit->particleType()) == 11 && std::abs(trackingParticle->pdgId()) != 11) {
2772  continue; //electrons found
2773  } else {
2774  foundNonElectrons++;
2775  }
2776  }
2777  }
2778 
2779  float minSignificance = 1e12;
2780  if (simHitBySignificance_) { //save the best matching hit
2781 
2782  int simHitKey = -1;
2783  edm::ProductID simHitID;
2784  for (auto ip = range.first; ip != range.second; ++ip) {
2785  TrackPSimHitRef TPhit = ip->second;
2786  DetId dId = DetId(TPhit->detUnitId());
2787  if (dId.rawId() == hitId.rawId()) {
2788  // skip electron SimHits for non-electron TPs also here
2789  if (std::abs(TPhit->particleType()) == 11 && std::abs(trackingParticle->pdgId()) != 11) {
2790  foundElectron = true;
2791  if (!keepEleSimHits_)
2792  continue;
2793  }
2794 
2795  float sx = TPhit->localPosition().x();
2796  float sy = TPhit->localPosition().y();
2797  float dx = sx - h_x;
2798  float dy = sy - h_y;
2799  float sig = (dx * dx * h_yy - 2 * dx * dy * h_xy + dy * dy * h_xx) / (h_xx * h_yy - h_xy * h_xy);
2800 
2801  if (sig < minSignificance) {
2802  minSignificance = sig;
2803  foundSimHit = true;
2804  simHitKey = TPhit.key();
2805  simHitID = TPhit.id();
2806  }
2807  }
2808  } //loop over matching hits
2809 
2810  auto simHitIndex = simHitRefKeyToIndex.at(std::make_pair(simHitKey, simHitID));
2811  ret.matchingSimHit.push_back(simHitIndex);
2812 
2813  double chargeFraction = 0.;
2814  for (const SimTrack& simtrk : trackingParticle->g4Tracks()) {
2815  auto found = simTrackIdToChargeFraction.find(simtrk.trackId());
2816  if (found != simTrackIdToChargeFraction.end()) {
2817  chargeFraction += found->second;
2818  }
2819  }
2820  ret.xySignificance.push_back(minSignificance);
2821  ret.chargeFraction.push_back(chargeFraction);
2822 
2823  // only for debug prints
2824  ret.bunchCrossing.push_back(bx);
2825  ret.event.push_back(event);
2826 
2827  simhit_hitIdx[simHitIndex].push_back(clusterKey);
2828  simhit_hitType[simHitIndex].push_back(static_cast<int>(hitType));
2829 
2830  } else { //save all matching hits
2831  for (auto ip = range.first; ip != range.second; ++ip) {
2832  TrackPSimHitRef TPhit = ip->second;
2833  DetId dId = DetId(TPhit->detUnitId());
2834  if (dId.rawId() == hitId.rawId()) {
2835  // skip electron SimHits for non-electron TPs also here
2836  if (std::abs(TPhit->particleType()) == 11 && std::abs(trackingParticle->pdgId()) != 11) {
2837  foundElectron = true;
2838  if (!keepEleSimHits_)
2839  continue;
2840  if (foundNonElectrons > 0)
2841  continue; //prioritize: skip electrons if non-electrons are present
2842  }
2843 
2844  foundSimHit = true;
2845  auto simHitKey = TPhit.key();
2846  auto simHitID = TPhit.id();
2847 
2848  auto simHitIndex = simHitRefKeyToIndex.at(std::make_pair(simHitKey, simHitID));
2849  ret.matchingSimHit.push_back(simHitIndex);
2850 
2851  double chargeFraction = 0.;
2852  for (const SimTrack& simtrk : trackingParticle->g4Tracks()) {
2853  auto found = simTrackIdToChargeFraction.find(simtrk.trackId());
2854  if (found != simTrackIdToChargeFraction.end()) {
2855  chargeFraction += found->second;
2856  }
2857  }
2858  ret.xySignificance.push_back(minSignificance);
2859  ret.chargeFraction.push_back(chargeFraction);
2860 
2861  // only for debug prints
2862  ret.bunchCrossing.push_back(bx);
2863  ret.event.push_back(event);
2864 
2865  simhit_hitIdx[simHitIndex].push_back(clusterKey);
2866  simhit_hitType[simHitIndex].push_back(static_cast<int>(hitType));
2867  }
2868  }
2869  } //if/else simHitBySignificance_
2870  if (!foundSimHit) {
2871  // In case we didn't find a simhit because of filtered-out
2872  // electron SimHit, just ignore the missing SimHit.
2873  if (foundElectron && !keepEleSimHits_)
2874  continue;
2875 
2876  auto ex = cms::Exception("LogicError")
2877  << "Did not find SimHit for reco hit DetId " << hitId.rawId() << " for TP " << trackingParticle.key()
2878  << " bx:event " << bx << ":" << event << " PDGid " << trackingParticle->pdgId() << " q "
2879  << trackingParticle->charge() << " p4 " << trackingParticle->p4() << " nG4 "
2880  << trackingParticle->g4Tracks().size() << ".\nFound SimHits from detectors ";
2881  for (auto ip = range.first; ip != range.second; ++ip) {
2882  TrackPSimHitRef TPhit = ip->second;
2883  DetId dId = DetId(TPhit->detUnitId());
2884  ex << dId.rawId() << " ";
2885  }
2886  if (trackingParticle->eventId().event() != 0) {
2887  ex << "\nSince this is a TrackingParticle from pileup, check that you're running the pileup mixing in "
2888  "playback mode.";
2889  }
2890  throw ex;
2891  }
2892  }
2893  }
2894 
2895  return ret;
2896 }
2897 
2899  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2901  const TrackerTopology& tTopo,
2902  SimHitRefKeyToIndex& simHitRefKeyToIndex,
2903  std::vector<TPHitIndex>& tpHitList) {
2904  for (const auto& assoc : simHitsTPAssoc) {
2905  auto tpKey = assoc.first.key();
2906 
2907  // SimHitTPAssociationList can contain more TrackingParticles than
2908  // what are given to this EDAnalyzer, so we can filter those out here.
2909  auto found = tpKeyToIndex.find(tpKey);
2910  if (found == tpKeyToIndex.end())
2911  continue;
2912  const auto tpIndex = found->second;
2913 
2914  // skip non-tracker simhits (mostly muons)
2915  const auto& simhit = *(assoc.second);
2916  auto detId = DetId(simhit.detUnitId());
2917  if (detId.det() != DetId::Tracker)
2918  continue;
2919 
2920  // Skip electron SimHits for non-electron TrackingParticles to
2921  // filter out delta rays. The delta ray hits just confuse. If we
2922  // need them later, let's add them as a separate "collection" of
2923  // hits of a TP
2924  const TrackingParticle& tp = *(assoc.first);
2925  if (!keepEleSimHits_ && std::abs(simhit.particleType()) == 11 && std::abs(tp.pdgId()) != 11)
2926  continue;
2927 
2928  auto simHitKey = std::make_pair(assoc.second.key(), assoc.second.id());
2929 
2930  if (simHitRefKeyToIndex.find(simHitKey) != simHitRefKeyToIndex.end()) {
2931  for (const auto& assoc2 : simHitsTPAssoc) {
2932  if (std::make_pair(assoc2.second.key(), assoc2.second.id()) == simHitKey) {
2933 #ifdef EDM_ML_DEBUG
2934  auto range1 = std::equal_range(simHitsTPAssoc.begin(),
2935  simHitsTPAssoc.end(),
2936  std::make_pair(assoc.first, TrackPSimHitRef()),
2938  auto range2 = std::equal_range(simHitsTPAssoc.begin(),
2939  simHitsTPAssoc.end(),
2940  std::make_pair(assoc2.first, TrackPSimHitRef()),
2942 
2943  LogTrace("TrackingNtuple") << "Earlier TP " << assoc2.first.key() << " SimTrack Ids";
2944  for (const auto& simTrack : assoc2.first->g4Tracks()) {
2945  edm::LogPrint("TrackingNtuple") << " SimTrack " << simTrack.trackId() << " BX:event "
2946  << simTrack.eventId().bunchCrossing() << ":" << simTrack.eventId().event();
2947  }
2948  for (auto iHit = range2.first; iHit != range2.second; ++iHit) {
2949  LogTrace("TrackingNtuple") << " SimHit " << iHit->second.key() << " " << iHit->second.id() << " tof "
2950  << iHit->second->tof() << " trackId " << iHit->second->trackId() << " BX:event "
2951  << iHit->second->eventId().bunchCrossing() << ":"
2952  << iHit->second->eventId().event();
2953  }
2954  LogTrace("TrackingNtuple") << "Current TP " << assoc.first.key() << " SimTrack Ids";
2955  for (const auto& simTrack : assoc.first->g4Tracks()) {
2956  edm::LogPrint("TrackingNtuple") << " SimTrack " << simTrack.trackId() << " BX:event "
2957  << simTrack.eventId().bunchCrossing() << ":" << simTrack.eventId().event();
2958  }
2959  for (auto iHit = range1.first; iHit != range1.second; ++iHit) {
2960  LogTrace("TrackingNtuple") << " SimHit " << iHit->second.key() << " " << iHit->second.id() << " tof "
2961  << iHit->second->tof() << " trackId " << iHit->second->trackId() << " BX:event "
2962  << iHit->second->eventId().bunchCrossing() << ":"
2963  << iHit->second->eventId().event();
2964  }
2965 #endif
2966 
2967  throw cms::Exception("LogicError")
2968  << "Got second time the SimHit " << simHitKey.first << " of " << simHitKey.second
2969  << ", first time with TrackingParticle " << assoc2.first.key() << ", now with " << tpKey;
2970  }
2971  }
2972  throw cms::Exception("LogicError") << "Got second time the SimHit " << simHitKey.first << " of "
2973  << simHitKey.second << ", now with TrackingParticle " << tpKey
2974  << ", but I didn't find the first occurrance!";
2975  }
2976 
2977  auto det = tracker.idToDetUnit(detId);
2978  if (!det)
2979  throw cms::Exception("LogicError") << "Did not find a det unit for DetId " << simhit.detUnitId()
2980  << " from tracker geometry";
2981 
2982  const auto pos = det->surface().toGlobal(simhit.localPosition());
2983  const float tof = simhit.timeOfFlight();
2984 
2985  const auto simHitIndex = simhit_x.size();
2986  simHitRefKeyToIndex[simHitKey] = simHitIndex;
2987 
2988  if (includeStripHits_)
2989  simhit_detId.push_back(tracker, tTopo, detId);
2990  else
2991  simhit_detId_phase2.push_back(tracker, tTopo, detId);
2992  simhit_x.push_back(pos.x());
2993  simhit_y.push_back(pos.y());
2994  simhit_z.push_back(pos.z());
2995  if (saveSimHitsP3_) {
2996  const auto mom = det->surface().toGlobal(simhit.momentumAtEntry());
2997  simhit_px.push_back(mom.x());
2998  simhit_py.push_back(mom.y());
2999  simhit_pz.push_back(mom.z());
3000  }
3001  simhit_particle.push_back(simhit.particleType());
3002  simhit_process.push_back(simhit.processType());
3003  simhit_eloss.push_back(simhit.energyLoss());
3004  simhit_tof.push_back(tof);
3005  //simhit_simTrackId.push_back(simhit.trackId());
3006 
3007  simhit_simTrkIdx.push_back(tpIndex);
3008 
3009  simhit_hitIdx.emplace_back(); // filled in matchCluster
3010  simhit_hitType.emplace_back(); // filled in matchCluster
3011 
3012  tpHitList.emplace_back(tpKey, simHitIndex, tof, simhit.detUnitId());
3013  }
3014 }
3015 
3017  const TrackerGeometry& tracker,
3018  const ClusterTPAssociation& clusterToTPMap,
3019  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
3021  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
3022  const TrackerTopology& tTopo,
3023  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
3024  std::set<edm::ProductID>& hitProductIds) {
3025  std::vector<std::pair<uint64_t, PixelMaskContainer const*>> pixelMasks;
3026  pixelMasks.reserve(pixelUseMaskTokens_.size());
3027  for (const auto& itoken : pixelUseMaskTokens_) {
3029  iEvent.getByToken(itoken.second, aH);
3030  pixelMasks.emplace_back(1 << itoken.first, aH.product());
3031  }
3032  auto pixUsedMask = [&pixelMasks](size_t key) {
3033  uint64_t mask = 0;
3034  for (auto const& m : pixelMasks) {
3035  if (m.second->mask(key))
3036  mask |= m.first;
3037  }
3038  return mask;
3039  };
3040 
3042  iEvent.getByToken(pixelRecHitToken_, pixelHits);
3043  for (auto it = pixelHits->begin(); it != pixelHits->end(); it++) {
3044  const DetId hitId = it->detId();
3045  for (auto hit = it->begin(); hit != it->end(); hit++) {
3046  hitProductIds.insert(hit->cluster().id());
3047 
3048  const int key = hit->cluster().key();
3049  const int lay = tTopo.layer(hitId);
3050 
3051  pix_isBarrel.push_back(hitId.subdetId() == 1);
3052  pix_detId.push_back(tracker, tTopo, hitId);
3053  pix_trkIdx.emplace_back(); // filled in fillTracks
3054  pix_onTrk_x.emplace_back();
3055  pix_onTrk_y.emplace_back();
3056  pix_onTrk_z.emplace_back();
3057  pix_onTrk_xx.emplace_back();
3058  pix_onTrk_xy.emplace_back();
3059  pix_onTrk_yy.emplace_back();
3060  pix_onTrk_yz.emplace_back();
3061  pix_onTrk_zz.emplace_back();
3062  pix_onTrk_zx.emplace_back();
3063  pix_tcandIdx.emplace_back(); // filled in fillCandidates
3064  pix_seeIdx.emplace_back(); // filled in fillSeeds
3065  pix_x.push_back(hit->globalPosition().x());
3066  pix_y.push_back(hit->globalPosition().y());
3067  pix_z.push_back(hit->globalPosition().z());
3068  pix_xx.push_back(hit->globalPositionError().cxx());
3069  pix_xy.push_back(hit->globalPositionError().cyx());
3070  pix_yy.push_back(hit->globalPositionError().cyy());
3071  pix_yz.push_back(hit->globalPositionError().czy());
3072  pix_zz.push_back(hit->globalPositionError().czz());
3073  pix_zx.push_back(hit->globalPositionError().czx());
3074  pix_radL.push_back(hit->surface()->mediumProperties().radLen());
3075  pix_bbxi.push_back(hit->surface()->mediumProperties().xi());
3076  pix_clustSizeCol.push_back(hit->cluster()->sizeY());
3077  pix_clustSizeRow.push_back(hit->cluster()->sizeX());
3078  pix_usedMask.push_back(pixUsedMask(hit->firstClusterRef().key()));
3079 
3080  LogTrace("TrackingNtuple") << "pixHit cluster=" << key << " subdId=" << hitId.subdetId() << " lay=" << lay
3081  << " rawId=" << hitId.rawId() << " pos =" << hit->globalPosition();
3083  SimHitData simHitData = matchCluster(hit->firstClusterRef(),
3084  hitId,
3085  key,
3086  *hit,
3087  clusterToTPMap,
3088  tpKeyToIndex,
3089  simHitsTPAssoc,
3090  digiSimLink,
3091  simHitRefKeyToIndex,
3092  HitType::Pixel);
3093  pix_simHitIdx.push_back(simHitData.matchingSimHit);
3094  pix_simType.push_back(static_cast<int>(simHitData.type));
3095  pix_xySignificance.push_back(simHitData.xySignificance);
3096  pix_chargeFraction.push_back(simHitData.chargeFraction);
3097  LogTrace("TrackingNtuple") << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
3098  if (!simHitData.matchingSimHit.empty()) {
3099  const auto simHitIdx = simHitData.matchingSimHit[0];
3100  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx << " simHitPos="
3101  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
3102  << " energyLoss=" << simhit_eloss[simHitIdx]
3103  << " particleType=" << simhit_particle[simHitIdx]
3104  << " processType=" << simhit_process[simHitIdx]
3105  << " bunchCrossing=" << simHitData.bunchCrossing[0]
3106  << " event=" << simHitData.event[0];
3107  }
3108  }
3109  }
3110  }
3111 }
3112 
3114  const TrackerGeometry& tracker,
3115  const ClusterTPAssociation& clusterToTPMap,
3116  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
3118  const edm::DetSetVector<StripDigiSimLink>& digiSimLink,
3119  const TrackerTopology& tTopo,
3120  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
3121  std::set<edm::ProductID>& hitProductIds) {
3122  std::vector<std::pair<uint64_t, StripMaskContainer const*>> stripMasks;
3123  stripMasks.reserve(stripUseMaskTokens_.size());
3124  for (const auto& itoken : stripUseMaskTokens_) {
3126  iEvent.getByToken(itoken.second, aH);
3127  stripMasks.emplace_back(1 << itoken.first, aH.product());
3128  }
3129  auto strUsedMask = [&stripMasks](size_t key) {
3130  uint64_t mask = 0;
3131  for (auto const& m : stripMasks) {
3132  if (m.second->mask(key))
3133  mask |= m.first;
3134  }
3135  return mask;
3136  };
3137 
3138  //index strip hit branches by cluster index
3140  iEvent.getByToken(stripRphiRecHitToken_, rphiHits);
3142  iEvent.getByToken(stripStereoRecHitToken_, stereoHits);
3143  int totalStripHits = rphiHits->dataSize() + stereoHits->dataSize();
3144  str_isBarrel.resize(totalStripHits);
3145  str_detId.resize(totalStripHits);
3146  str_trkIdx.resize(totalStripHits); // filled in fillTracks
3147  str_onTrk_x.resize(totalStripHits);
3148  str_onTrk_y.resize(totalStripHits);
3149  str_onTrk_z.resize(totalStripHits);
3150  str_onTrk_xx.resize(totalStripHits);
3151  str_onTrk_xy.resize(totalStripHits);
3152  str_onTrk_yy.resize(totalStripHits);
3153  str_onTrk_yz.resize(totalStripHits);
3154  str_onTrk_zz.resize(totalStripHits);
3155  str_onTrk_zx.resize(totalStripHits);
3156  str_tcandIdx.resize(totalStripHits); // filled in fillCandidates
3157  str_seeIdx.resize(totalStripHits); // filled in fillSeeds
3158  str_simHitIdx.resize(totalStripHits);
3159  str_simType.resize(totalStripHits);
3160  str_chargeFraction.resize(totalStripHits);
3161  str_x.resize(totalStripHits);
3162  str_y.resize(totalStripHits);
3163  str_z.resize(totalStripHits);
3164  str_xx.resize(totalStripHits);
3165  str_xy.resize(totalStripHits);
3166  str_yy.resize(totalStripHits);
3167  str_yz.resize(totalStripHits);
3168  str_zz.resize(totalStripHits);
3169  str_zx.resize(totalStripHits);
3170  str_xySignificance.resize(totalStripHits);
3171  str_chargeFraction.resize(totalStripHits);
3172  str_radL.resize(totalStripHits);
3173  str_bbxi.resize(totalStripHits);
3174  str_chargePerCM.resize(totalStripHits);
3175  str_clustSize.resize(totalStripHits);
3176  str_usedMask.resize(totalStripHits);
3177 
3178  auto fill = [&](const SiStripRecHit2DCollection& hits, const char* name) {
3179  for (const auto& detset : hits) {
3180  const DetId hitId = detset.detId();
3181  for (const auto& hit : detset) {
3182  hitProductIds.insert(hit.cluster().id());
3183 
3184  const int key = hit.cluster().key();
3185  const int lay = tTopo.layer(hitId);
3187  str_detId.set(key, tracker, tTopo, hitId);
3188  str_x[key] = hit.globalPosition().x();
3189  str_y[key] = hit.globalPosition().y();
3190  str_z[key] = hit.globalPosition().z();
3191  str_xx[key] = hit.globalPositionError().cxx();
3192  str_xy[key] = hit.globalPositionError().cyx();
3193  str_yy[key] = hit.globalPositionError().cyy();
3194  str_yz[key] = hit.globalPositionError().czy();
3195  str_zz[key] = hit.globalPositionError().czz();
3196  str_zx[key] = hit.globalPositionError().czx();
3197  str_radL[key] = hit.surface()->mediumProperties().radLen();
3198  str_bbxi[key] = hit.surface()->mediumProperties().xi();
3199  str_chargePerCM[key] = siStripClusterTools::chargePerCM(hitId, hit.firstClusterRef().stripCluster());
3200  str_clustSize[key] = hit.cluster()->amplitudes().size();
3201  str_usedMask[key] = strUsedMask(key);
3202  LogTrace("TrackingNtuple") << name << " cluster=" << key << " subdId=" << hitId.subdetId() << " lay=" << lay
3203  << " rawId=" << hitId.rawId() << " pos =" << hit.globalPosition();
3204 
3206  SimHitData simHitData = matchCluster(hit.firstClusterRef(),
3207  hitId,
3208  key,
3209  hit,
3210  clusterToTPMap,
3211  tpKeyToIndex,
3212  simHitsTPAssoc,
3213  digiSimLink,
3214  simHitRefKeyToIndex,
3215  HitType::Strip);
3216  str_simHitIdx[key] = simHitData.matchingSimHit;
3217  str_simType[key] = static_cast<int>(simHitData.type);
3218  str_xySignificance[key] = simHitData.xySignificance;
3219  str_chargeFraction[key] = simHitData.chargeFraction;
3220  LogTrace("TrackingNtuple") << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
3221  if (!simHitData.matchingSimHit.empty()) {
3222  const auto simHitIdx = simHitData.matchingSimHit[0];
3223  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx << " simHitPos="
3224  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
3225  << " simHitPos="
3226  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
3227  << " energyLoss=" << simhit_eloss[simHitIdx]
3228  << " particleType=" << simhit_particle[simHitIdx]
3229  << " processType=" << simhit_process[simHitIdx]
3230  << " bunchCrossing=" << simHitData.bunchCrossing[0]
3231  << " event=" << simHitData.event[0];
3232  }
3233  }
3234  }
3235  }
3236  };
3237 
3238  fill(*rphiHits, "stripRPhiHit");
3239  fill(*stereoHits, "stripStereoHit");
3240 }
3241 
3243  const TrackerGeometry& tracker,
3244  const TrackerTopology& tTopo,
3245  const std::vector<std::pair<uint64_t, StripMaskContainer const*>>& stripMasks,
3246  std::vector<std::pair<int, int>>& monoStereoClusterList) {
3247  auto strUsedMask = [&stripMasks](size_t key) {
3248  uint64_t mask = 0;
3249  for (auto const& m : stripMasks) {
3250  if (m.second->mask(key))
3251  mask |= m.first;
3252  }
3253  return mask;
3254  };
3255 
3256  const auto hitId = hit.geographicalId();
3257  const int lay = tTopo.layer(hitId);
3258  monoStereoClusterList.emplace_back(hit.monoHit().cluster().key(), hit.stereoHit().cluster().key());
3259  glu_isBarrel.push_back((hitId.subdetId() == StripSubdetector::TIB || hitId.subdetId() == StripSubdetector::TOB));
3260  glu_detId.push_back(tracker, tTopo, hitId);
3261  glu_monoIdx.push_back(hit.monoHit().cluster().key());
3262  glu_stereoIdx.push_back(hit.stereoHit().cluster().key());
3263  glu_seeIdx.emplace_back(); // filled in fillSeeds
3264  glu_x.push_back(hit.globalPosition().x());
3265  glu_y.push_back(hit.globalPosition().y());
3266  glu_z.push_back(hit.globalPosition().z());
3267  glu_xx.push_back(hit.globalPositionError().cxx());
3268  glu_xy.push_back(hit.globalPositionError().cyx());
3269  glu_yy.push_back(hit.globalPositionError().cyy());
3270  glu_yz.push_back(hit.globalPositionError().czy());
3271  glu_zz.push_back(hit.globalPositionError().czz());
3272  glu_zx.push_back(hit.globalPositionError().czx());
3273  glu_radL.push_back(hit.surface()->mediumProperties().radLen());
3274  glu_bbxi.push_back(hit.surface()->mediumProperties().xi());
3275  glu_chargePerCM.push_back(siStripClusterTools::chargePerCM(hitId, hit.firstClusterRef().stripCluster()));
3276  glu_clustSizeMono.push_back(hit.monoHit().cluster()->amplitudes().size());
3277  glu_clustSizeStereo.push_back(hit.stereoHit().cluster()->amplitudes().size());
3278  glu_usedMaskMono.push_back(strUsedMask(hit.monoHit().cluster().key()));
3279  glu_usedMaskStereo.push_back(strUsedMask(hit.stereoHit().cluster().key()));
3280  LogTrace("TrackingNtuple") << "stripMatchedHit"
3281  << " cluster0=" << hit.stereoHit().cluster().key()
3282  << " cluster1=" << hit.monoHit().cluster().key() << " subdId=" << hitId.subdetId()
3283  << " lay=" << lay << " rawId=" << hitId.rawId() << " pos =" << hit.globalPosition();
3284  return glu_isBarrel.size() - 1;
3285 }
3286 
3288  const TrackerGeometry& tracker,
3289  const TrackerTopology& tTopo,
3290  std::vector<std::pair<int, int>>& monoStereoClusterList) {
3291  std::vector<std::pair<uint64_t, StripMaskContainer const*>> stripMasks;
3292  stripMasks.reserve(stripUseMaskTokens_.size());
3293  for (const auto& itoken : stripUseMaskTokens_) {
3295  iEvent.getByToken(itoken.second, aH);
3296  stripMasks.emplace_back(1 << itoken.first, aH.product());
3297  }
3298 
3300  iEvent.getByToken(stripMatchedRecHitToken_, matchedHits);
3301  for (auto it = matchedHits->begin(); it != matchedHits->end(); it++) {
3302  for (auto hit = it->begin(); hit != it->end(); hit++) {
3303  addStripMatchedHit(*hit, tracker, tTopo, stripMasks, monoStereoClusterList);
3304  }
3305  }
3306 }
3307 
3309  const ClusterTPAssociation& clusterToTPMap,
3310  const TrackerGeometry& tracker,
3311  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
3313  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
3314  const TrackerTopology& tTopo,
3315  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
3316  std::set<edm::ProductID>& hitProductIds) {
3318  iEvent.getByToken(phase2OTRecHitToken_, phase2OTHits);
3319  for (auto it = phase2OTHits->begin(); it != phase2OTHits->end(); it++) {
3320  const DetId hitId = it->detId();
3321  for (auto hit = it->begin(); hit != it->end(); hit++) {
3322  hitProductIds.insert(hit->cluster().id());
3323 
3324  const int key = hit->cluster().key();
3325  const int lay = tTopo.layer(hitId);
3326 
3327  ph2_isBarrel.push_back(hitId.subdetId() == 1);
3328  ph2_detId.push_back(tracker, tTopo, hitId);
3329  ph2_trkIdx.emplace_back(); // filled in fillTracks
3330  ph2_onTrk_x.emplace_back();
3331  ph2_onTrk_y.emplace_back();
3332  ph2_onTrk_z.emplace_back();
3333  ph2_onTrk_xx.emplace_back();
3334  ph2_onTrk_xy.emplace_back();
3335  ph2_onTrk_yy.emplace_back();
3336  ph2_onTrk_yz.emplace_back();
3337  ph2_onTrk_zz.emplace_back();
3338  ph2_onTrk_zx.emplace_back();
3339  ph2_tcandIdx.emplace_back(); // filled in fillCandidates
3340  ph2_seeIdx.emplace_back(); // filled in fillSeeds
3341  ph2_x.push_back(hit->globalPosition().x());
3342  ph2_y.push_back(hit->globalPosition().y());
3343  ph2_z.push_back(hit->globalPosition().z());
3344  ph2_xx.push_back(hit->globalPositionError().cxx());
3345  ph2_xy.push_back(hit->globalPositionError().cyx());
3346  ph2_yy.push_back(hit->globalPositionError().cyy());
3347  ph2_yz.push_back(hit->globalPositionError().czy());
3348  ph2_zz.push_back(hit->globalPositionError().czz());
3349  ph2_zx.push_back(hit->globalPositionError().czx());
3350  ph2_radL.push_back(hit->surface()->mediumProperties().radLen());
3351  ph2_bbxi.push_back(hit->surface()->mediumProperties().xi());
3352 
3353  LogTrace("TrackingNtuple") << "phase2 OT cluster=" << key << " subdId=" << hitId.subdetId() << " lay=" << lay
3354  << " rawId=" << hitId.rawId() << " pos =" << hit->globalPosition();
3355 
3357  SimHitData simHitData = matchCluster(hit->firstClusterRef(),
3358  hitId,
3359  key,
3360  *hit,
3361  clusterToTPMap,
3362  tpKeyToIndex,
3363  simHitsTPAssoc,
3364  digiSimLink,
3365  simHitRefKeyToIndex,
3367  ph2_xySignificance.push_back(simHitData.xySignificance);
3368  ph2_simHitIdx.push_back(simHitData.matchingSimHit);
3369  ph2_simType.push_back(static_cast<int>(simHitData.type));
3370  LogTrace("TrackingNtuple") << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
3371  if (!simHitData.matchingSimHit.empty()) {
3372  const auto simHitIdx = simHitData.matchingSimHit[0];
3373  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx << " simHitPos="
3374  << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
3375  << " energyLoss=" << simhit_eloss[simHitIdx]
3376  << " particleType=" << simhit_particle[simHitIdx]
3377  << " processType=" << simhit_process[simHitIdx]
3378  << " bunchCrossing=" << simHitData.bunchCrossing[0]
3379  << " event=" << simHitData.event[0];
3380  }
3381  }
3382  }
3383  }
3384 }
3385 
3387  const TrackingParticleRefVector& tpCollection,
3388  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
3389  const reco::BeamSpot& bs,
3390  const TrackerGeometry& tracker,
3391  const reco::TrackToTrackingParticleAssociator& associatorByHits,
3392  const ClusterTPAssociation& clusterToTPMap,
3393  const MagneticField& theMF,
3394  const TrackerTopology& tTopo,
3395  std::vector<std::pair<int, int>>& monoStereoClusterList,
3396  const std::set<edm::ProductID>& hitProductIds,
3397  std::map<edm::ProductID, size_t>& seedCollToOffset) {
3398  TSCBLBuilderNoMaterial tscblBuilder;
3399  for (size_t iColl = 0; iColl < seedTokens_.size(); ++iColl) {
3400  const auto& seedToken = seedTokens_[iColl];
3401 
3402  edm::Handle<edm::View<reco::Track>> seedTracksHandle;
3403  iEvent.getByToken(seedToken, seedTracksHandle);
3404  const auto& seedTracks = *seedTracksHandle;
3405 
3406  if (seedTracks.empty())
3407  continue;
3408 
3410  labelsForToken(seedToken, labels);
3411 
3412  const auto& seedStopInfoToken = seedStopInfoTokens_[iColl];
3413  edm::Handle<std::vector<SeedStopInfo>> seedStopInfoHandle;
3414  iEvent.getByToken(seedStopInfoToken, seedStopInfoHandle);
3415  const auto& seedStopInfos = *seedStopInfoHandle;
3416  if (seedTracks.size() != seedStopInfos.size()) {
3418  labelsForToken(seedStopInfoToken, labels2);
3419 
3420  throw cms::Exception("LogicError") << "Got " << seedTracks.size() << " seeds, but " << seedStopInfos.size()
3421  << " seed stopping infos for collections " << labels.module << ", "
3422  << labels2.module;
3423  }
3424 
3425  std::vector<std::pair<uint64_t, StripMaskContainer const*>> stripMasks;
3426  stripMasks.reserve(stripUseMaskTokens_.size());
3427  for (const auto& itoken : stripUseMaskTokens_) {
3429  iEvent.getByToken(itoken.second, aH);
3430  stripMasks.emplace_back(1 << itoken.first, aH.product());
3431  }
3432 
3433  // The associator interfaces really need to be fixed...
3434  edm::RefToBaseVector<reco::Track> seedTrackRefs;
3435  for (edm::View<reco::Track>::size_type i = 0; i < seedTracks.size(); ++i) {
3436  seedTrackRefs.push_back(seedTracks.refAt(i));
3437  }
3438  reco::RecoToSimCollection recSimColl = associatorByHits.associateRecoToSim(seedTrackRefs, tpCollection);
3439  reco::SimToRecoCollection simRecColl = associatorByHits.associateSimToReco(seedTrackRefs, tpCollection);
3440 
3441  TString label = labels.module;
3442  //format label to match algoName
3443  label.ReplaceAll("seedTracks", "");
3444  label.ReplaceAll("Seeds", "");
3445  label.ReplaceAll("muonSeeded", "muonSeededStep");
3446  //for HLT seeds
3447  label.ReplaceAll("FromPixelTracks", "");
3448  label.ReplaceAll("PFLowPixel", "");
3449  label.ReplaceAll("hltDoubletRecovery", "pixelPairStep"); //random choice
3450  int algo = reco::TrackBase::algoByName(label.Data());
3451 
3452  edm::ProductID id = seedTracks[0].seedRef().id();
3453  const auto offset = see_fitok.size();
3454  auto inserted = seedCollToOffset.emplace(id, offset);
3455  if (!inserted.second)
3456  throw cms::Exception("Configuration")
3457  << "Trying to add seeds with ProductID " << id << " for a second time from collection " << labels.module
3458  << ", seed algo " << label << ". Typically this is caused by a configuration problem.";
3459  see_offset.push_back(offset);
3460 
3461  LogTrace("TrackingNtuple") << "NEW SEED LABEL: " << label << " size: " << seedTracks.size() << " algo=" << algo
3462  << " ProductID " << id;
3463 
3464  for (size_t iSeed = 0; iSeed < seedTrackRefs.size(); ++iSeed) {
3465  const auto& seedTrackRef = seedTrackRefs[iSeed];
3466  const auto& seedTrack = *seedTrackRef;
3467  const auto& seedRef = seedTrack.seedRef();
3468  const auto& seed = *seedRef;
3469 
3470  const auto seedStopInfo = seedStopInfos[iSeed];
3471 
3472  if (seedRef.id() != id)
3473  throw cms::Exception("LogicError")
3474  << "All tracks in 'TracksFromSeeds' collection should point to seeds in the same collection. Now the "
3475  "element 0 had ProductID "
3476  << id << " while the element " << seedTrackRef.key() << " had " << seedTrackRef.id()
3477  << ". The source collection is " << labels.module << ".";
3478 
3479  std::vector<int> tpIdx;
3480  std::vector<float> sharedFraction;
3481  auto foundTPs = recSimColl.find(seedTrackRef);
3482  if (foundTPs != recSimColl.end()) {
3483  for (const auto& tpQuality : foundTPs->val) {
3484  tpIdx.push_back(tpKeyToIndex.at(tpQuality.first.key()));
3485  sharedFraction.push_back(tpQuality.second);
3486  }
3487  }
3488 
3489  // Search for a best-matching TrackingParticle for a seed
3490  const int nHits = seedTrack.numberOfValidHits();
3492  seedTrack.recHitsBegin(),
3493  seedTrack.recHitsEnd()); // TODO: this function is called 3 times per track, try to reduce
3494  const int nClusters = clusters.size();
3495  const auto bestKeyCount = findBestMatchingTrackingParticle(seedTrack.recHits(), clusterToTPMap, tpKeyToIndex);
3496  const float bestShareFrac =
3497  nClusters > 0 ? static_cast<float>(bestKeyCount.countClusters) / static_cast<float>(nClusters) : 0;
3498  // Another way starting from the first hit of the seed
3499  const auto bestFirstHitKeyCount =
3500  findMatchingTrackingParticleFromFirstHit(seedTrack.recHits(), clusterToTPMap, tpKeyToIndex);
3501  const float bestFirstHitShareFrac =
3502  nClusters > 0 ? static_cast<float>(bestFirstHitKeyCount.countClusters) / static_cast<float>(nClusters) : 0;
3503 
3504  const bool seedFitOk = !trackFromSeedFitFailed(seedTrack);
3505  const int charge = seedTrack.charge();
3506  const float pt = seedFitOk ? seedTrack.pt() : 0;
3507  const float eta = seedFitOk ? seedTrack.eta() : 0;
3508  const float phi = seedFitOk ? seedTrack.phi() : 0;
3509 
3510  const auto seedIndex = see_fitok.size();
3511 
3512  see_fitok.push_back(seedFitOk);
3513 
3514  see_px.push_back(seedFitOk ? seedTrack.px() : 0);
3515  see_py.push_back(seedFitOk ? seedTrack.py() : 0);
3516  see_pz.push_back(seedFitOk ? seedTrack.pz() : 0);
3517  see_pt.push_back(pt);
3518  see_eta.push_back(eta);
3519  see_phi.push_back(phi);
3520  see_q.push_back(charge);
3521  see_nValid.push_back(nHits);
3522 
3523  see_dxy.push_back(seedFitOk ? seedTrack.dxy(bs.position()) : 0);
3524  see_dz.push_back(seedFitOk ? seedTrack.dz(bs.position()) : 0);
3525  see_ptErr.push_back(seedFitOk ? seedTrack.ptError() : 0);
3526  see_etaErr.push_back(seedFitOk ? seedTrack.etaError() : 0);
3527  see_phiErr.push_back(seedFitOk ? seedTrack.phiError() : 0);
3528  see_dxyErr.push_back(seedFitOk ? seedTrack.dxyError() : 0);
3529  see_dzErr.push_back(seedFitOk ? seedTrack.dzError() : 0);
3530  see_algo.push_back(algo);
3531  see_stopReason.push_back(seedStopInfo.stopReasonUC());
3532  see_nCands.push_back(seedStopInfo.candidatesPerSeed());
3533 
3534  const auto& state = seedTrack.seedRef()->startingState();
3535  const auto& pos = state.parameters().position();
3536  const auto& mom = state.parameters().momentum();
3537  see_statePt.push_back(state.pt());
3538  see_stateTrajX.push_back(pos.x());
3539  see_stateTrajY.push_back(pos.y());
3540  see_stateTrajPx.push_back(mom.x());
3541  see_stateTrajPy.push_back(mom.y());
3542  see_stateTrajPz.push_back(mom.z());
3543 
3545  const TrackingRecHit* lastRecHit = &*(seed.recHits().end() - 1);
3547  trajectoryStateTransform::transientState(seed.startingState(), lastRecHit->surface(), &theMF);
3548  auto const& stateGlobal = tsos.globalParameters();
3549  see_stateTrajGlbX.push_back(stateGlobal.position().x());
3550  see_stateTrajGlbY.push_back(stateGlobal.position().y());
3551  see_stateTrajGlbZ.push_back(stateGlobal.position().z());
3552  see_stateTrajGlbPx.push_back(stateGlobal.momentum().x());
3553  see_stateTrajGlbPy.push_back(stateGlobal.momentum().y());
3554  see_stateTrajGlbPz.push_back(stateGlobal.momentum().z());
3555  if (addSeedCurvCov_) {
3556  auto const& stateCcov = tsos.curvilinearError().matrix();
3557  std::vector<float> cov(15);
3558  auto covP = cov.begin();
3559  for (auto const val : stateCcov)
3560  *(covP++) = val; //row-major
3561  see_stateCurvCov.push_back(std::move(cov));
3562  }
3563 
3564  see_trkIdx.push_back(-1); // to be set correctly in fillTracks
3565  see_tcandIdx.push_back(-1); // to be set correctly in fillCandidates
3567  see_simTrkIdx.push_back(tpIdx);
3568  see_simTrkShareFrac.push_back(sharedFraction);
3569  see_bestSimTrkIdx.push_back(bestKeyCount.key >= 0 ? tpKeyToIndex.at(bestKeyCount.key) : -1);
3571  bestFirstHitKeyCount.key >= 0 ? tpKeyToIndex.at(bestFirstHitKeyCount.key) : -1);
3572  } else {
3573  see_isTrue.push_back(!tpIdx.empty());
3574  }
3575  see_bestSimTrkShareFrac.push_back(bestShareFrac);
3576  see_bestFromFirstHitSimTrkShareFrac.push_back(bestFirstHitShareFrac);
3577 
3579  /*
3580  const TrackingRecHit* lastRecHit = &*(seed.recHits().second-1);
3581  TrajectoryStateOnSurface state = trajectoryStateTransform::transientState( itSeed->startingState(), lastRecHit->surface(), &theMF);
3582  float pt = state.globalParameters().momentum().perp();
3583  float eta = state.globalParameters().momentum().eta();
3584  float phi = state.globalParameters().momentum().phi();
3585  see_px .push_back( state.globalParameters().momentum().x() );
3586  see_py .push_back( state.globalParameters().momentum().y() );
3587  see_pz .push_back( state.globalParameters().momentum().z() );
3588  */
3589 
3590  std::vector<int> hitIdx;
3591  std::vector<int> hitType;
3592 
3593  for (auto const& hit : seed.recHits()) {
3594  int subid = hit.geographicalId().subdetId();
3595  if (subid == (int)PixelSubdetector::PixelBarrel || subid == (int)PixelSubdetector::PixelEndcap) {
3596  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&hit);
3597  const auto& clusterRef = bhit->firstClusterRef();
3598  const auto clusterKey = clusterRef.cluster_pixel().key();
3599  if (includeAllHits_) {
3600  checkProductID(hitProductIds, clusterRef.id(), "seed");
3601  pix_seeIdx[clusterKey].push_back(seedIndex);
3602  }
3603  hitIdx.push_back(clusterKey);
3604  hitType.push_back(static_cast<int>(HitType::Pixel));
3605  } else if (subid == (int)StripSubdetector::TOB || subid == (int)StripSubdetector::TID ||
3606  subid == (int)StripSubdetector::TIB || subid == (int)StripSubdetector::TEC) {
3608  const SiStripMatchedRecHit2D* matchedHit = dynamic_cast<const SiStripMatchedRecHit2D*>(&hit);
3609  if (includeAllHits_) {
3610  checkProductID(hitProductIds, matchedHit->monoClusterRef().id(), "seed");
3611  checkProductID(hitProductIds, matchedHit->stereoClusterRef().id(), "seed");
3612  }
3613  int monoIdx = matchedHit->monoClusterRef().key();
3614  int stereoIdx = matchedHit->stereoClusterRef().key();
3615 
3616  std::vector<std::pair<int, int>>::iterator pos =
3617  find(monoStereoClusterList.begin(), monoStereoClusterList.end(), std::make_pair(monoIdx, stereoIdx));
3618  size_t gluedIndex = -1;
3619  if (pos != monoStereoClusterList.end()) {
3620  gluedIndex = std::distance(monoStereoClusterList.begin(), pos);
3621  } else {
3622  // We can encounter glued hits not in the input
3623  // SiStripMatchedRecHit2DCollection, e.g. via muon
3624  // outside-in seeds (or anything taking hits from
3625  // MeasurementTrackerEvent). So let's add them here.
3626  gluedIndex = addStripMatchedHit(*matchedHit, tracker, tTopo, stripMasks, monoStereoClusterList);
3627  }
3628 
3629  if (includeAllHits_)
3630  glu_seeIdx[gluedIndex].push_back(seedIndex);
3631  hitIdx.push_back(gluedIndex);
3632  hitType.push_back(static_cast<int>(HitType::Glued));
3633  } else {
3634  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&hit);
3635  const auto& clusterRef = bhit->firstClusterRef();
3636  unsigned int clusterKey;
3637  if (clusterRef.isPhase2()) {
3638  clusterKey = clusterRef.cluster_phase2OT().key();
3639  } else {
3640  clusterKey = clusterRef.cluster_strip().key();
3641  }
3642 
3643  if (includeAllHits_) {
3644  checkProductID(hitProductIds, clusterRef.id(), "seed");
3645  if (clusterRef.isPhase2()) {
3646  ph2_seeIdx[clusterKey].push_back(seedIndex);
3647  } else {
3648  str_seeIdx[clusterKey].push_back(seedIndex);
3649  }
3650  }
3651 
3652  hitIdx.push_back(clusterKey);
3653  if (clusterRef.isPhase2()) {
3654  hitType.push_back(static_cast<int>(HitType::Phase2OT));
3655  } else {
3656  hitType.push_back(static_cast<int>(HitType::Strip));
3657  }
3658  }
3659  } else {
3660  LogTrace("TrackingNtuple") << " not pixel and not Strip detector";
3661  }
3662  }
3663  see_hitIdx.push_back(hitIdx);
3664  see_hitType.push_back(hitType);
3665  see_nPixel.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Pixel)));
3666  see_nGlued.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Glued)));
3667  see_nStrip.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Strip)));
3668  see_nPhase2OT.push_back(std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Phase2OT)));
3669  see_nCluster.push_back(nClusters);
3670  //the part below is not strictly needed
3671  float chi2 = -1;
3672  if (nHits == 2) {
3673  auto const recHit0 = seed.recHits().begin();
3674  auto const recHit1 = seed.recHits().begin() + 1;
3675  std::vector<GlobalPoint> gp(2);
3676  std::vector<GlobalError> ge(2);
3677  gp[0] = recHit0->globalPosition();
3678  ge[0] = recHit0->globalPositionError();
3679  gp[1] = recHit1->globalPosition();
3680  ge[1] = recHit1->globalPositionError();
3681  LogTrace("TrackingNtuple")
3682  << "seed " << seedTrackRef.key() << " pt=" << pt << " eta=" << eta << " phi=" << phi << " q=" << charge
3683  << " - PAIR - ids: " << recHit0->geographicalId().rawId() << " " << recHit1->geographicalId().rawId()
3684  << " hitpos: " << gp[0] << " " << gp[1] << " trans0: "
3685  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[0]->globalPosition()
3686  : GlobalPoint(0, 0, 0))
3687  << " "
3688  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[1]->globalPosition()
3689  : GlobalPoint(0, 0, 0))
3690  << " trans1: "
3691  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[0]->globalPosition()
3692  : GlobalPoint(0, 0, 0))
3693  << " "
3694  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[1]->globalPosition()
3695  : GlobalPoint(0, 0, 0))
3696  << " eta,phi: " << gp[0].eta() << "," << gp[0].phi();
3697  } else if (nHits == 3) {
3698  auto const recHit0 = seed.recHits().begin();
3699  auto const recHit1 = seed.recHits().begin() + 1;
3700  auto const recHit2 = seed.recHits().begin() + 2;
3702  declareDynArray(GlobalError, 4, ge);
3703  declareDynArray(bool, 4, bl);
3704  gp[0] = recHit0->globalPosition();
3705  ge[0] = recHit0->globalPositionError();
3706  int subid0 = recHit0->geographicalId().subdetId();
3707  bl[0] = (subid0 == StripSubdetector::TIB || subid0 == StripSubdetector::TOB ||
3708  subid0 == (int)PixelSubdetector::PixelBarrel);
3709  gp[1] = recHit1->globalPosition();
3710  ge[1] = recHit1->globalPositionError();
3711  int subid1 = recHit1->geographicalId().subdetId();
3712  bl[1] = (subid1 == StripSubdetector::TIB || subid1 == StripSubdetector::TOB ||
3713  subid1 == (int)PixelSubdetector::PixelBarrel);
3714  gp[2] = recHit2->globalPosition();
3715  ge[2] = recHit2->globalPositionError();
3716  int subid2 = recHit2->geographicalId().subdetId();
3717  bl[2] = (subid2 == StripSubdetector::TIB || subid2 == StripSubdetector::TOB ||
3718  subid2 == (int)PixelSubdetector::PixelBarrel);
3719  RZLine rzLine(gp, ge, bl);
3720  float seed_chi2 = rzLine.chi2();
3721  //float seed_pt = state.globalParameters().momentum().perp();
3722  float seed_pt = pt;
3723  LogTrace("TrackingNtuple")
3724  << "seed " << seedTrackRef.key() << " pt=" << pt << " eta=" << eta << " phi=" << phi << " q=" << charge
3725  << " - TRIPLET - ids: " << recHit0->geographicalId().rawId() << " " << recHit1->geographicalId().rawId()
3726  << " " << recHit2->geographicalId().rawId() << " hitpos: " << gp[0] << " " << gp[1] << " " << gp[2]
3727  << " trans0: "
3728  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[0]->globalPosition()
3729  : GlobalPoint(0, 0, 0))
3730  << " "
3731  << (recHit0->transientHits().size() > 1 ? recHit0->transientHits()[1]->globalPosition()
3732  : GlobalPoint(0, 0, 0))
3733  << " trans1: "
3734  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[0]->globalPosition()
3735  : GlobalPoint(0, 0, 0))
3736  << " "
3737  << (recHit1->transientHits().size() > 1 ? recHit1->transientHits()[1]->globalPosition()
3738  : GlobalPoint(0, 0, 0))
3739  << " trans2: "
3740  << (recHit2->transientHits().size() > 1 ? recHit2->transientHits()[0]->globalPosition()
3741  : GlobalPoint(0, 0, 0))
3742  << " "
3743  << (recHit2->transientHits().size() > 1 ? recHit2->transientHits()[1]->globalPosition()
3744  : GlobalPoint(0, 0, 0))
3745  << " local: "
3746  << recHit2->localPosition()
3747  //<< " tsos pos, mom: " << state.globalPosition()<<" "<<state.globalMomentum()
3748  << " eta,phi: " << gp[0].eta() << "," << gp[0].phi() << " pt,chi2: " << seed_pt << "," << seed_chi2;
3749  chi2 = seed_chi2;
3750  }
3751  see_chi2.push_back(chi2);
3752  }
3753 
3754  fillTrackingParticlesForSeeds(tpCollection, simRecColl, tpKeyToIndex, offset);
3755  }
3756 }
3757 
3759  const TrackerGeometry& tracker,
3760  const TrackingParticleRefVector& tpCollection,
3761  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
3762  const TrackingParticleRefKeyToCount& tpKeyToClusterCount,
3763  const MagneticField& mf,
3764  const reco::BeamSpot& bs,
3766  const reco::TrackToTrackingParticleAssociator& associatorByHits,
3767  const ClusterTPAssociation& clusterToTPMap,
3768  const TrackerTopology& tTopo,
3769  const std::set<edm::ProductID>& hitProductIds,
3770  const std::map<edm::ProductID, size_t>& seedCollToOffset,
3771  const std::vector<const MVACollection*>& mvaColls,
3772  const std::vector<const QualityMaskCollection*>& qualColls) {
3773  reco::RecoToSimCollection recSimColl = associatorByHits.associateRecoToSim(tracks, tpCollection);
3776  LogTrace("TrackingNtuple") << "NEW TRACK LABEL: " << labels.module;
3777 
3778  auto pvPosition = vertices[0].position();
3779 
3780  for (size_t iTrack = 0; iTrack < tracks.size(); ++iTrack) {
3781  const auto& itTrack = tracks[iTrack];
3782  int charge = itTrack->charge();
3783  float pt = itTrack->pt();
3784  float eta = itTrack->eta();
3785  const double lambda = itTrack->lambda();
3786  float chi2 = itTrack->normalizedChi2();
3787  float ndof = itTrack->ndof();
3788  float phi = itTrack->phi();
3789  int nHits = itTrack->numberOfValidHits();
3790  const reco::HitPattern& hp = itTrack->hitPattern();
3791 
3792  const auto& tkParam = itTrack->parameters();
3793  auto tkCov = itTrack->covariance();
3794  tkCov.Invert();
3795 
3796  // Standard track-TP matching
3797  int nSimHits = 0;
3798  bool isSimMatched = false;
3799  std::vector<int> tpIdx;
3800  std::vector<float> sharedFraction;
3801  std::vector<float> tpChi2;
3802  auto foundTPs = recSimColl.find(itTrack);
3803  if (foundTPs != recSimColl.end()) {
3804  if (!foundTPs->val.empty()) {
3805  nSimHits = foundTPs->val[0].first->numberOfTrackerHits();
3806  isSimMatched = true;
3807  }
3808  for (const auto& tpQuality : foundTPs->val) {
3809  tpIdx.push_back(tpKeyToIndex.at(tpQuality.first.key()));
3810  sharedFraction.push_back(tpQuality.second);
3811  tpChi2.push_back(track_associator::trackAssociationChi2(tkParam, tkCov, *(tpCollection[tpIdx.back()]), mf, bs));
3812  }
3813  }
3814 
3815  // Search for a best-matching TrackingParticle for a track
3817  itTrack->recHitsBegin(),
3818  itTrack->recHitsEnd()); // TODO: this function is called 3 times per track, try to reduce
3819  const int nClusters = clusters.size();
3820 
3821  const auto bestKeyCount = findBestMatchingTrackingParticle(itTrack->recHits(), clusterToTPMap, tpKeyToIndex);
3822  const float bestShareFrac = static_cast<float>(bestKeyCount.countClusters) / static_cast<float>(nClusters);
3823  float bestShareFracSimDenom = 0;
3824  float bestShareFracSimClusterDenom = 0;
3825  float bestChi2 = -1;
3826  if (bestKeyCount.key >= 0) {
3827  bestShareFracSimDenom =
3828  static_cast<float>(bestKeyCount.countClusters) /
3829  static_cast<float>(tpCollection[tpKeyToIndex.at(bestKeyCount.key)]->numberOfTrackerHits());
3830  bestShareFracSimClusterDenom =
3831  static_cast<float>(bestKeyCount.countClusters) / static_cast<float>(tpKeyToClusterCount.at(bestKeyCount.key));
3833  tkParam, tkCov, *(tpCollection[tpKeyToIndex.at(bestKeyCount.key)]), mf, bs);
3834  }
3835  // Another way starting from the first hit of the track
3836  const auto bestFirstHitKeyCount =
3837  findMatchingTrackingParticleFromFirstHit(itTrack->recHits(), clusterToTPMap, tpKeyToIndex);
3838  const float bestFirstHitShareFrac =
3839  static_cast<float>(bestFirstHitKeyCount.countClusters) / static_cast<float>(nClusters);
3840  float bestFirstHitShareFracSimDenom = 0;
3841  float bestFirstHitShareFracSimClusterDenom = 0;
3842  float bestFirstHitChi2 = -1;
3843  if (bestFirstHitKeyCount.key >= 0) {
3844  bestFirstHitShareFracSimDenom =
3845  static_cast<float>(bestFirstHitKeyCount.countClusters) /
3846  static_cast<float>(tpCollection[tpKeyToIndex.at(bestFirstHitKeyCount.key)]->numberOfTrackerHits());
3847  bestFirstHitShareFracSimClusterDenom = static_cast<float>(bestFirstHitKeyCount.countClusters) /
3848  static_cast<float>(tpKeyToClusterCount.at(bestFirstHitKeyCount.key));
3849  bestFirstHitChi2 = track_associator::trackAssociationChi2(
3850  tkParam, tkCov, *(tpCollection[tpKeyToIndex.at(bestFirstHitKeyCount.key)]), mf, bs);
3851  }
3852 
3853  float chi2_1Dmod = chi2;
3854  int count1dhits = 0;
3855  for (auto iHit = itTrack->recHitsBegin(), iEnd = itTrack->recHitsEnd(); iHit != iEnd; ++iHit) {
3856  const TrackingRecHit& hit = **iHit;
3857  if (hit.isValid() && typeid(hit) == typeid(SiStripRecHit1D))
3858  ++count1dhits;
3859  }
3860  if (count1dhits > 0) {
3861  chi2_1Dmod = (chi2 + count1dhits) / (ndof + count1dhits);
3862  }
3863 
3864  Point bestPV = getBestVertex(*itTrack, vertices);
3865 
3866  trk_px.push_back(itTrack->px());
3867  trk_py.push_back(itTrack->py());
3868  trk_pz.push_back(itTrack->pz());
3869  trk_pt.push_back(pt);
3870  trk_inner_px.push_back(itTrack->innerMomentum().x());
3871  trk_inner_py.push_back(itTrack->innerMomentum().y());
3872  trk_inner_pz.push_back(itTrack->innerMomentum().z());
3873  trk_inner_pt.push_back(itTrack->innerMomentum().rho());
3874  trk_outer_px.push_back(itTrack->outerMomentum().x());
3875  trk_outer_py.push_back(itTrack->outerMomentum().y());
3876  trk_outer_pz.push_back(itTrack->outerMomentum().z());
3877  trk_outer_pt.push_back(itTrack->outerMomentum().rho());
3878  trk_eta.push_back(eta);
3879  trk_lambda.push_back(lambda);
3880  trk_cotTheta.push_back(1 / tan(M_PI * 0.5 - lambda));
3881  trk_phi.push_back(phi);
3882  trk_dxy.push_back(itTrack->dxy(bs.position()));
3883  trk_dz.push_back(itTrack->dz(bs.position()));
3884  trk_dxyPV.push_back(itTrack->dxy(pvPosition));
3885  trk_dzPV.push_back(itTrack->dz(pvPosition));
3886  trk_dxyClosestPV.push_back(itTrack->dxy(bestPV));
3887  trk_dzClosestPV.push_back(itTrack->dz(bestPV));
3888  trk_ptErr.push_back(itTrack->ptError());
3889  trk_etaErr.push_back(itTrack->etaError());
3890  trk_lambdaErr.push_back(itTrack->lambdaError());
3891  trk_phiErr.push_back(itTrack->phiError());
3892  trk_dxyErr.push_back(itTrack->dxyError());
3893  trk_dzErr.push_back(itTrack->dzError());
3894  trk_refpoint_x.push_back(itTrack->vx());
3895  trk_refpoint_y.push_back(itTrack->vy());
3896  trk_refpoint_z.push_back(itTrack->vz());
3897  trk_nChi2.push_back(chi2);
3898  trk_nChi2_1Dmod.push_back(chi2_1Dmod);
3899  trk_ndof.push_back(ndof);
3900  trk_q.push_back(charge);
3901  trk_nValid.push_back(hp.numberOfValidHits());
3902  trk_nLost.push_back(hp.numberOfLostHits(reco::HitPattern::TRACK_HITS));
3903  trk_nInactive.push_back(hp.trackerLayersTotallyOffOrBad(reco::HitPattern::TRACK_HITS));
3904  trk_nPixel.push_back(hp.numberOfValidPixelHits());
3905  trk_nStrip.push_back(hp.numberOfValidStripHits());
3906  trk_nOuterLost.push_back(hp.numberOfLostTrackerHits(reco::HitPattern::MISSING_OUTER_HITS));
3907  trk_nInnerLost.push_back(hp.numberOfLostTrackerHits(reco::HitPattern::MISSING_INNER_HITS));
3908  trk_nOuterInactive.push_back(hp.trackerLayersTotallyOffOrBad(reco::HitPattern::MISSING_OUTER_HITS));
3909  trk_nInnerInactive.push_back(hp.trackerLayersTotallyOffOrBad(reco::HitPattern::MISSING_INNER_HITS));
3910  trk_nPixelLay.push_back(hp.pixelLayersWithMeasurement());
3911  trk_nStripLay.push_back(hp.stripLayersWithMeasurement());
3912  trk_n3DLay.push_back(hp.numberOfValidStripLayersWithMonoAndStereo() + hp.pixelLayersWithMeasurement());
3913  trk_nLostLay.push_back(hp.trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS));
3914  trk_nCluster.push_back(nClusters);
3915  trk_algo.push_back(itTrack->algo());
3916  trk_originalAlgo.push_back(itTrack->originalAlgo());
3917  trk_algoMask.push_back(itTrack->algoMaskUL());
3918  trk_stopReason.push_back(itTrack->stopReason());
3919  trk_isHP.push_back(itTrack->quality(reco::TrackBase::highPurity));
3920  if (includeMVA_) {
3921  for (size_t i = 0; i < trk_mvas.size(); ++i) {
3922  trk_mvas[i].push_back((*(mvaColls[i]))[iTrack]);
3923  trk_qualityMasks[i].push_back((*(qualColls[i]))[iTrack]);
3924  }
3925  }
3926  if (includeSeeds_) {
3927  auto offset = seedCollToOffset.find(itTrack->seedRef().id());
3928  if (offset == seedCollToOffset.end()) {
3929  throw cms::Exception("Configuration")
3930  << "Track algo '" << reco::TrackBase::algoName(itTrack->algo()) << "' originalAlgo '"
3931  << reco::TrackBase::algoName(itTrack->originalAlgo()) << "' refers to seed collection "
3932  << itTrack->seedRef().id()
3933  << ", but that seed collection is not given as an input. The following collections were given as an input "
3934  << make_ProductIDMapPrinter(seedCollToOffset);
3935  }
3936 
3937  const auto seedIndex = offset->second + itTrack->seedRef().key();
3938  trk_seedIdx.push_back(seedIndex);
3939  if (see_trkIdx[seedIndex] != -1) {
3940  throw cms::Exception("LogicError") << "Track index has already been set for seed " << seedIndex << " to "
3941  << see_trkIdx[seedIndex] << "; was trying to set it to " << iTrack;
3942  }
3943  see_trkIdx[seedIndex] = iTrack;
3944  }
3945  trk_vtxIdx.push_back(-1); // to be set correctly in fillVertices
3947  trk_simTrkIdx.push_back(tpIdx);
3948  trk_simTrkShareFrac.push_back(sharedFraction);
3949  trk_simTrkNChi2.push_back(tpChi2);
3950  trk_bestSimTrkIdx.push_back(bestKeyCount.key >= 0 ? tpKeyToIndex.at(bestKeyCount.key) : -1);
3951  trk_bestFromFirstHitSimTrkIdx.push_back(bestFirstHitKeyCount.key >= 0 ? tpKeyToIndex.at(bestFirstHitKeyCount.key)
3952  : -1);
3953  } else {
3954  trk_isTrue.push_back(!tpIdx.empty());
3955  }
3956  trk_bestSimTrkShareFrac.push_back(bestShareFrac);
3957  trk_bestSimTrkShareFracSimDenom.push_back(bestShareFracSimDenom);
3958  trk_bestSimTrkShareFracSimClusterDenom.push_back(bestShareFracSimClusterDenom);
3959  trk_bestSimTrkNChi2.push_back(bestChi2);
3960  trk_bestFromFirstHitSimTrkShareFrac.push_back(bestFirstHitShareFrac);
3961  trk_bestFromFirstHitSimTrkShareFracSimDenom.push_back(bestFirstHitShareFracSimDenom);
3962  trk_bestFromFirstHitSimTrkShareFracSimClusterDenom.push_back(bestFirstHitShareFracSimClusterDenom);
3963  trk_bestFromFirstHitSimTrkNChi2.push_back(bestFirstHitChi2);
3964 
3965  LogTrace("TrackingNtuple") << "Track #" << itTrack.key() << " with q=" << charge << ", pT=" << pt
3966  << " GeV, eta: " << eta << ", phi: " << phi << ", chi2=" << chi2 << ", Nhits=" << nHits
3967  << ", algo=" << itTrack->algoName(itTrack->algo()).c_str()
3968  << " hp=" << itTrack->quality(reco::TrackBase::highPurity)
3969  << " seed#=" << itTrack->seedRef().key() << " simMatch=" << isSimMatched
3970  << " nSimHits=" << nSimHits
3971  << " sharedFraction=" << (sharedFraction.empty() ? -1 : sharedFraction[0])
3972  << " tpIdx=" << (tpIdx.empty() ? -1 : tpIdx[0]);
3973  std::vector<int> hitIdx;
3974  std::vector<int> hitType;
3975 
3976  for (auto i = itTrack->recHitsBegin(); i != itTrack->recHitsEnd(); i++) {
3977  auto hit = *i;
3978  DetId hitId = hit->geographicalId();
3979  LogTrace("TrackingNtuple") << "hit #" << std::distance(itTrack->recHitsBegin(), i)
3980  << " subdet=" << hitId.subdetId();
3981  if (hitId.det() != DetId::Tracker)
3982  continue;
3983 
3984  LogTrace("TrackingNtuple") << " " << subdetstring(hitId.subdetId()) << " " << tTopo.layer(hitId);
3985 
3986  if (hit->isValid()) {
3987  //ugly... but works
3988  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*hit);
3989  const auto& clusterRef = bhit->firstClusterRef();
3990  unsigned int clusterKey;
3991  if (clusterRef.isPixel()) {
3992  clusterKey = clusterRef.cluster_pixel().key();
3993  } else if (clusterRef.isPhase2()) {
3994  clusterKey = clusterRef.cluster_phase2OT().key();
3995  } else {
3996  clusterKey = clusterRef.cluster_strip().key();
3997  }
3998 
3999  LogTrace("TrackingNtuple") << " id: " << hitId.rawId() << " - globalPos =" << hit->globalPosition()
4000  << " cluster=" << clusterKey << " clusterRef ID=" << clusterRef.id()
4001  << " eta,phi: " << hit->globalPosition().eta() << "," << hit->globalPosition().phi();
4002  if (includeAllHits_) {
4003  checkProductID(hitProductIds, clusterRef.id(), "track");
4004  if (clusterRef.isPixel()) {
4005  pix_trkIdx[clusterKey].push_back(iTrack);
4006  pix_onTrk_x[clusterKey].push_back(hit->globalPosition().x());
4007  pix_onTrk_y[clusterKey].push_back(hit->globalPosition().y());
4008  pix_onTrk_z[clusterKey].push_back(hit->globalPosition().z());
4009  pix_onTrk_xx[clusterKey].push_back(hit->globalPositionError().cxx());
4010  pix_onTrk_xy[clusterKey].push_back(hit->globalPositionError().cyx());
4011  pix_onTrk_yy[clusterKey].push_back(hit->globalPositionError().cyy());
4012  pix_onTrk_yz[clusterKey].push_back(hit->globalPositionError().czy());
4013  pix_onTrk_zz[clusterKey].push_back(hit->globalPositionError().czz());
4014  pix_onTrk_zx[clusterKey].push_back(hit->globalPositionError().czx());
4015  } else if (clusterRef.isPhase2()) {
4016  ph2_trkIdx[clusterKey].push_back(iTrack);
4017  ph2_onTrk_x[clusterKey].push_back(hit->globalPosition().x());
4018  ph2_onTrk_y[clusterKey].push_back(hit->globalPosition().y());
4019  ph2_onTrk_z[clusterKey].push_back(hit->globalPosition().z());
4020  ph2_onTrk_xx[clusterKey].push_back(hit->globalPositionError().cxx());
4021  ph2_onTrk_xy[clusterKey].push_back(hit->globalPositionError().cyx());
4022  ph2_onTrk_yy[clusterKey].push_back(hit->globalPositionError().cyy());
4023  ph2_onTrk_yz[clusterKey].push_back(hit->globalPositionError().czy());
4024  ph2_onTrk_zz[clusterKey].push_back(hit->globalPositionError().czz());
4025  ph2_onTrk_zx[clusterKey].push_back(hit->globalPositionError().czx());
4026  } else {
4027  str_trkIdx[clusterKey].push_back(iTrack);
4028  str_onTrk_x[clusterKey].push_back(hit->globalPosition().x());
4029  str_onTrk_y[clusterKey].push_back(hit->globalPosition().y());
4030  str_onTrk_z[clusterKey].push_back(hit->globalPosition().z());
4031  str_onTrk_xx[clusterKey].push_back(hit->globalPositionError().cxx());
4032  str_onTrk_xy[clusterKey].push_back(hit->globalPositionError().cyx());
4033  str_onTrk_yy[clusterKey].push_back(hit->globalPositionError().cyy());
4034  str_onTrk_yz[clusterKey].push_back(hit->globalPositionError().czy());
4035  str_onTrk_zz[clusterKey].push_back(hit->globalPositionError().czz());
4036  str_onTrk_zx[clusterKey].push_back(hit->globalPositionError().czx());
4037  }
4038  }
4039 
4040  hitIdx.push_back(clusterKey);
4041  if (clusterRef.isPixel()) {
4042  hitType.push_back(static_cast<int>(HitType::Pixel));
4043  } else if (clusterRef.isPhase2()) {
4044  hitType.push_back(static_cast<int>(HitType::Phase2OT));
4045  } else {
4046  hitType.push_back(static_cast<int>(HitType::Strip));
4047  }
4048  } else {
4049  LogTrace("TrackingNtuple") << " - invalid hit";
4050 
4051  hitIdx.push_back(inv_isBarrel.size());
4052  hitType.push_back(static_cast<int>(HitType::Invalid));
4053 
4054  inv_isBarrel.push_back(hitId.subdetId() == 1);
4055  if (includeStripHits_)
4056  inv_detId.push_back(tracker, tTopo, hitId);
4057  else
4058  inv_detId_phase2.push_back(tracker, tTopo, hitId);
4059  inv_type.push_back(hit->getType());
4060  }
4061  }
4062 
4063  trk_hitIdx.push_back(hitIdx);
4064  trk_hitType.push_back(hitType);
4065  }
4066 }
4067 
4069  int algo,
4070  const TrackingParticleRefVector& tpCollection,
4071  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
4072  const TrackingParticleRefKeyToCount& tpKeyToClusterCount,
4073  const MagneticField& mf,
4074  const reco::BeamSpot& bs,
4076  const reco::TrackToTrackingParticleAssociator& associatorByHits,
4077  const ClusterTPAssociation& clusterToTPMap,
4078  const TrackerGeometry& tracker,
4079  const TrackerTopology& tTopo,
4080  const std::set<edm::ProductID>& hitProductIds,
4081  const std::map<edm::ProductID, size_t>& seedCollToOffset) {
4082  reco::RecoToSimCollectionTCandidate recSimColl = associatorByHits.associateRecoToSim(candsHandle, tpCollection);
4083 
4084  TSCBLBuilderNoMaterial tscblBuilder;
4085 
4086  auto const& cands = *candsHandle;
4087  for (size_t iCand = 0; iCand < cands.size(); ++iCand) {
4088  const auto& aCand = cands[iCand];
4089  const edm::Ref<TrackCandidateCollection> aCandRef(candsHandle, iCand);
4090 
4091  //get parameters and errors from the candidate state
4092  auto const& pState = aCand.trajectoryStateOnDet();
4094  trajectoryStateTransform::transientState(pState, &(tracker.idToDet(pState.detId())->surface()), &mf);
4095  TrajectoryStateClosestToBeamLine tbStateAtPCA = tscblBuilder(*state.freeState(), bs);
4096  if (!tbStateAtPCA.isValid()) {
4097  edm::LogVerbatim("TrackBuilding") << "TrajectoryStateClosestToBeamLine not valid";
4098  }
4099 
4100  auto const& stateAtPCA = tbStateAtPCA.trackStateAtPCA();
4101  auto v0 = stateAtPCA.position();
4102  auto p = stateAtPCA.momentum();
4103  math::XYZPoint pos(v0.x(), v0.y(), v0.z());
4104  math::XYZVector mom(p.x(), p.y(), p.z());
4105 
4106  //pseduo track for access to easy methods
4107  static const reco::Track::CovarianceMatrix dummyCov = AlgebraicMatrixID();
4108  reco::Track trk(
4109  0, 0, pos, mom, stateAtPCA.charge(), tbStateAtPCA.isValid() ? stateAtPCA.curvilinearError().matrix() : dummyCov);
4110 
4111  const auto& tkParam = trk.parameters();
4112  auto tkCov = trk.covariance();
4113  tkCov.Invert();
4114 
4115  // Standard track-TP matching
4116  int nSimHits = 0;
4117  bool isSimMatched = false;
4118  std::vector<int> tpIdx;
4119  std::vector<float> sharedFraction;
4120  std::vector<float> tpChi2;
4121  auto foundTPs = recSimColl.find(aCandRef);
4122  if (foundTPs != recSimColl.end()) {
4123  if (!foundTPs->val.empty()) {
4124  nSimHits = foundTPs->val[0].first->numberOfTrackerHits();
4125  isSimMatched = true;
4126  }
4127  for (const auto& tpQuality : foundTPs->val) {
4128  tpIdx.push_back(tpKeyToIndex.at(tpQuality.first.key()));
4129  sharedFraction.push_back(tpQuality.second);
4130  tpChi2.push_back(track_associator::trackAssociationChi2(tkParam, tkCov, *(tpCollection[tpIdx.back()]), mf, bs));
4131  }
4132  }
4133 
4134  // Search for a best-matching TrackingParticle for a track
4135  const auto clusters = track_associator::hitsToClusterRefs(aCand.recHits().begin(), aCand.recHits().end());
4136  const int nClusters = clusters.size();
4137 
4138  const auto bestKeyCount = findBestMatchingTrackingParticle(aCand.recHits(), clusterToTPMap, tpKeyToIndex);
4139  const float bestCountF = bestKeyCount.countClusters;
4140  const float bestShareFrac = bestCountF / nClusters;
4141  float bestShareFracSimDenom = 0;
4142  float bestShareFracSimClusterDenom = 0;
4143  float bestChi2 = -1;
4144  if (bestKeyCount.key >= 0) {
4145  bestShareFracSimDenom = bestCountF / tpCollection[tpKeyToIndex.at(bestKeyCount.key)]->numberOfTrackerHits();
4146  bestShareFracSimClusterDenom = bestCountF / tpKeyToClusterCount.at(bestKeyCount.key);
4148  tkParam, tkCov, *(tpCollection[tpKeyToIndex.at(bestKeyCount.key)]), mf, bs);
4149  }
4150  // Another way starting from the first hit of the track
4151  const auto bestFirstHitKeyCount =
4152  findMatchingTrackingParticleFromFirstHit(aCand.recHits(), clusterToTPMap, tpKeyToIndex);
4153  const float bestFirstCountF = bestFirstHitKeyCount.countClusters;
4154  const float bestFirstHitShareFrac = bestFirstCountF / nClusters;
4155  float bestFirstHitShareFracSimDenom = 0;
4156  float bestFirstHitShareFracSimClusterDenom = 0;
4157  float bestFirstHitChi2 = -1;
4158  if (bestFirstHitKeyCount.key >= 0) {
4159  bestFirstHitShareFracSimDenom =
4160  bestFirstCountF / tpCollection[tpKeyToIndex.at(bestFirstHitKeyCount.key)]->numberOfTrackerHits();
4161  bestFirstHitShareFracSimClusterDenom = bestFirstCountF / tpKeyToClusterCount.at(bestFirstHitKeyCount.key);
4162  bestFirstHitChi2 = track_associator::trackAssociationChi2(
4163  tkParam, tkCov, *(tpCollection[tpKeyToIndex.at(bestFirstHitKeyCount.key)]), mf, bs);
4164  }
4165 
4166  auto iglobCand = tcand_pca_valid.size(); //global cand index
4167  tcand_pca_valid.push_back(tbStateAtPCA.isValid());
4168  tcand_pca_px.push_back(trk.px());
4169  tcand_pca_py.push_back(trk.py());
4170  tcand_pca_pz.push_back(trk.pz());
4171  tcand_pca_pt.push_back(trk.pt());
4172  tcand_pca_eta.push_back(trk.eta());
4173  tcand_pca_phi.push_back(trk.phi());
4174  tcand_pca_dxy.push_back(trk.dxy());
4175  tcand_pca_dz.push_back(trk.dz());
4176  tcand_pca_ptErr.push_back(trk.ptError());
4177  tcand_pca_etaErr.push_back(trk.etaError());
4178  tcand_pca_lambdaErr.push_back(trk.lambdaError());
4179  tcand_pca_phiErr.push_back(trk.phiError());
4180  tcand_pca_dxyErr.push_back(trk.dxyError());
4181  tcand_pca_dzErr.push_back(trk.dzError());
4182  tcand_px.push_back(state.globalMomentum().x());
4183  tcand_py.push_back(state.globalMomentum().y());
4184  tcand_pz.push_back(state.globalMomentum().z());
4185  tcand_pt.push_back(state.globalMomentum().perp());
4186  tcand_x.push_back(state.globalPosition().x());
4187  tcand_y.push_back(state.globalPosition().y());
4188  tcand_z.push_back(state.globalPosition().z());
4189 
4190  auto const& pStateCov = state.curvilinearError().matrix();
4191  tcand_qbpErr.push_back(sqrt(pStateCov(0, 0)));
4192  tcand_lambdaErr.push_back(sqrt(pStateCov(1, 1)));
4193  tcand_phiErr.push_back(sqrt(pStateCov(2, 2)));
4194  tcand_xtErr.push_back(sqrt(pStateCov(3, 3)));
4195  tcand_ytErr.push_back(sqrt(pStateCov(4, 4)));
4196 
4197  int ndof = -5;
4198  int nValid = 0;
4199  int nPixel = 0;
4200  int nStrip = 0;
4201  for (auto const& hit : aCand.recHits()) {
4202  if (hit.isValid()) {
4203  ndof += hit.dimension();
4204  nValid++;
4205 
4206  auto const subdet = hit.geographicalId().subdetId();
4208  nPixel++;
4209  else
4210  nStrip++;
4211  }
4212  }
4213  tcand_ndof.push_back(ndof);
4214  tcand_q.push_back(trk.charge());
4215  tcand_nValid.push_back(nValid);
4216  tcand_nPixel.push_back(nPixel);
4217  tcand_nStrip.push_back(nStrip);
4218  tcand_nCluster.push_back(nClusters);
4219  tcand_algo.push_back(algo);
4220  tcand_stopReason.push_back(aCand.stopReason());
4221  if (includeSeeds_) {
4222  auto offset = seedCollToOffset.find(aCand.seedRef().id());
4223  if (offset == seedCollToOffset.end()) {
4224  throw cms::Exception("Configuration")
4225  << "Track candidate refers to seed collection " << aCand.seedRef().id()
4226  << ", but that seed collection is not given as an input. The following collections were given as an input "
4227  << make_ProductIDMapPrinter(seedCollToOffset);
4228  }
4229 
4230  const auto seedIndex = offset->second + aCand.seedRef().key();
4231  tcand_seedIdx.push_back(seedIndex);
4232  if (see_tcandIdx[seedIndex] != -1) {
4233  throw cms::Exception("LogicError")
4234  << "Track cand index has already been set for seed " << seedIndex << " to " << see_tcandIdx[seedIndex]
4235  << "; was trying to set it to " << iglobCand << " current " << iCand;
4236  }
4237  see_tcandIdx[seedIndex] = iglobCand;
4238  }
4239  tcand_vtxIdx.push_back(-1); // to be set correctly in fillVertices
4241  tcand_simTrkIdx.push_back(tpIdx);
4242  tcand_simTrkShareFrac.push_back(sharedFraction);
4243  tcand_simTrkNChi2.push_back(tpChi2);
4244  tcand_bestSimTrkIdx.push_back(bestKeyCount.key >= 0 ? tpKeyToIndex.at(bestKeyCount.key) : -1);
4246  bestFirstHitKeyCount.key >= 0 ? tpKeyToIndex.at(bestFirstHitKeyCount.key) : -1);
4247  } else {
4248  tcand_isTrue.push_back(!tpIdx.empty());
4249  }
4250  tcand_bestSimTrkShareFrac.push_back(bestShareFrac);
4251  tcand_bestSimTrkShareFracSimDenom.push_back(bestShareFracSimDenom);
4252  tcand_bestSimTrkShareFracSimClusterDenom.push_back(bestShareFracSimClusterDenom);
4253  tcand_bestSimTrkNChi2.push_back(bestChi2);
4254  tcand_bestFromFirstHitSimTrkShareFrac.push_back(bestFirstHitShareFrac);
4255  tcand_bestFromFirstHitSimTrkShareFracSimDenom.push_back(bestFirstHitShareFracSimDenom);
4256  tcand_bestFromFirstHitSimTrkShareFracSimClusterDenom.push_back(bestFirstHitShareFracSimClusterDenom);
4257  tcand_bestFromFirstHitSimTrkNChi2.push_back(bestFirstHitChi2);
4258 
4259  LogTrace("TrackingNtuple") << "Track cand #" << iCand << " glob " << iglobCand << " with q=" << trk.charge()
4260  << ", pT=" << trk.pt() << " GeV, eta: " << trk.eta() << ", phi: " << trk.phi()
4261  << ", nValid=" << nValid << " seed#=" << aCand.seedRef().key()
4262  << " simMatch=" << isSimMatched << " nSimHits=" << nSimHits
4263  << " sharedFraction=" << (sharedFraction.empty() ? -1 : sharedFraction[0])
4264  << " tpIdx=" << (tpIdx.empty() ? -1 : tpIdx[0]);
4265  std::vector<int> hitIdx;
4266  std::vector<int> hitType;
4267 
4268  for (auto i = aCand.recHits().begin(); i != aCand.recHits().end(); i++) {
4269  const TrackingRecHit* hit = &*i;
4270  DetId hitId = hit->geographicalId();
4271  LogTrace("TrackingNtuple") << "hit #" << std::distance(aCand.recHits().begin(), i)
4272  << " subdet=" << hitId.subdetId();
4273  if (hitId.det() != DetId::Tracker)
4274  continue;
4275 
4276  LogTrace("TrackingNtuple") << " " << subdetstring(hitId.subdetId()) << " " << tTopo.layer(hitId);
4277 
4278  if (hit->isValid()) {
4279  //ugly... but works
4280  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*hit);
4281  const auto& clusterRef = bhit->firstClusterRef();
4282  unsigned int clusterKey;
4283  if (clusterRef.isPixel()) {
4284  clusterKey = clusterRef.cluster_pixel().key();
4285  } else if (clusterRef.isPhase2()) {
4286  clusterKey = clusterRef.cluster_phase2OT().key();
4287  } else {
4288  clusterKey = clusterRef.cluster_strip().key();
4289  }
4290 
4291  LogTrace("TrackingNtuple") << " id: " << hitId.rawId() << " - globalPos =" << hit->globalPosition()
4292  << " cluster=" << clusterKey << " clusterRef ID=" << clusterRef.id()
4293  << " eta,phi: " << hit->globalPosition().eta() << "," << hit->globalPosition().phi();
4294  if (includeAllHits_) {
4295  checkProductID(hitProductIds, clusterRef.id(), "track");
4296  if (clusterRef.isPixel()) {
4297  pix_tcandIdx[clusterKey].push_back(iglobCand);
4298  } else if (clusterRef.isPhase2()) {
4299  ph2_tcandIdx[clusterKey].push_back(iglobCand);
4300  } else {
4301  str_tcandIdx[clusterKey].push_back(iglobCand);
4302  }
4303  }
4304 
4305  hitIdx.push_back(clusterKey);
4306  if (clusterRef.isPixel()) {
4307  hitType.push_back(static_cast<int>(HitType::Pixel));
4308  } else if (clusterRef.isPhase2()) {
4309  hitType.push_back(static_cast<int>(HitType::Phase2OT));
4310  } else {
4311  hitType.push_back(static_cast<int>(HitType::Strip));
4312  }
4313  }
4314  }
4315 
4316  tcand_hitIdx.push_back(hitIdx);
4317  tcand_hitType.push_back(hitType);
4318  }
4319 }
4320 
4322  const edm::EventSetup& iSetup,
4324  const reco::BeamSpot& bs,
4325  const TrackingParticleRefVector& tpCollection,
4326  const TrackingVertexRefKeyToIndex& tvKeyToIndex,
4327  const reco::TrackToTrackingParticleAssociator& associatorByHits,
4328  const std::vector<TPHitIndex>& tpHitList,
4329  const TrackingParticleRefKeyToCount& tpKeyToClusterCount) {
4330  // Number of 3D layers for TPs
4332  iEvent.getByToken(tpNLayersToken_, tpNLayersH);
4333  const auto& nLayers_tPCeff = *tpNLayersH;
4334 
4335  iEvent.getByToken(tpNPixelLayersToken_, tpNLayersH);
4336  const auto& nPixelLayers_tPCeff = *tpNLayersH;
4337 
4338  iEvent.getByToken(tpNStripStereoLayersToken_, tpNLayersH);
4339  const auto& nStripMonoAndStereoLayers_tPCeff = *tpNLayersH;
4340 
4341  reco::SimToRecoCollection simRecColl = associatorByHits.associateSimToReco(tracks, tpCollection);
4342 
4343  for (const TrackingParticleRef& tp : tpCollection) {
4344  LogTrace("TrackingNtuple") << "tracking particle pt=" << tp->pt() << " eta=" << tp->eta() << " phi=" << tp->phi();
4345  bool isRecoMatched = false;
4346  std::vector<int> tkIdx;
4347  std::vector<float> sharedFraction;
4348  auto foundTracks = simRecColl.find(tp);
4349  if (foundTracks != simRecColl.end()) {
4350  isRecoMatched = true;
4351  for (const auto& trackQuality : foundTracks->val) {
4352  sharedFraction.push_back(trackQuality.second);
4353  tkIdx.push_back(trackQuality.first.key());
4354  }
4355  }
4356 
4357  sim_genPdgIds.emplace_back();
4358  for (const auto& genRef : tp->genParticles()) {
4359  if (genRef.isNonnull())
4360  sim_genPdgIds.back().push_back(genRef->pdgId());
4361  }
4362 
4363  bool isFromBHadron = false;
4364  // Logic is similar to SimTracker/TrackHistory
4365  if (tracer_.evaluate(tp)) { // ignore TP if history can not be traced
4366  // following is from TrackClassifier::processesAtGenerator()
4367  HistoryBase::RecoGenParticleTrail const& recoGenParticleTrail = tracer_.recoGenParticleTrail();
4368  for (const auto& particle : recoGenParticleTrail) {
4369  HepPDT::ParticleID particleID(particle->pdgId());
4370  if (particleID.hasBottom()) {
4371  isFromBHadron = true;
4372  break;
4373  }
4374  }
4375  }
4376 
4377  LogTrace("TrackingNtuple") << "matched to tracks = " << make_VectorPrinter(tkIdx)
4378  << " isRecoMatched=" << isRecoMatched;
4379  sim_event.push_back(tp->eventId().event());
4380  sim_bunchCrossing.push_back(tp->eventId().bunchCrossing());
4381  sim_pdgId.push_back(tp->pdgId());
4382  sim_isFromBHadron.push_back(isFromBHadron);
4383  sim_px.push_back(tp->px());
4384  sim_py.push_back(tp->py());
4385  sim_pz.push_back(tp->pz());
4386  sim_pt.push_back(tp->pt());
4387  sim_eta.push_back(tp->eta());
4388  sim_phi.push_back(tp->phi());
4389  sim_q.push_back(tp->charge());
4390  sim_trkIdx.push_back(tkIdx);
4391  sim_trkShareFrac.push_back(sharedFraction);
4392  sim_parentVtxIdx.push_back(tvKeyToIndex.at(tp->parentVertex().key()));
4393  std::vector<int> decayIdx;
4394  for (const auto& v : tp->decayVertices())
4395  decayIdx.push_back(tvKeyToIndex.at(v.key()));
4396  sim_decayVtxIdx.push_back(decayIdx);
4397 
4398  //Calcualte the impact parameters w.r.t. PCA
4401  auto dxySim = TrackingParticleIP::dxy(vertex, momentum, bs.position());
4402  auto dzSim = TrackingParticleIP::dz(vertex, momentum, bs.position());
4403  const double lambdaSim = M_PI / 2 - momentum.theta();
4404  sim_pca_pt.push_back(std::sqrt(momentum.perp2()));
4405  sim_pca_eta.push_back(momentum.Eta());
4406  sim_pca_lambda.push_back(lambdaSim);
4407  sim_pca_cotTheta.push_back(1 / tan(M_PI * 0.5 - lambdaSim));
4408  sim_pca_phi.push_back(momentum.phi());
4409  sim_pca_dxy.push_back(dxySim);
4410  sim_pca_dz.push_back(dzSim);
4411 
4412  std::vector<int> hitIdx;
4413  int nPixel = 0, nStrip = 0;
4414  auto rangeHit = std::equal_range(tpHitList.begin(), tpHitList.end(), TPHitIndex(tp.key()), tpHitIndexListLess);
4415  for (auto ip = rangeHit.first; ip != rangeHit.second; ++ip) {
4416  auto type = HitType::Unknown;
4417  if (!simhit_hitType[ip->simHitIdx].empty())
4418  type = static_cast<HitType>(simhit_hitType[ip->simHitIdx][0]);
4419  LogTrace("TrackingNtuple") << "simhit=" << ip->simHitIdx << " type=" << static_cast<int>(type);
4420  hitIdx.push_back(ip->simHitIdx);
4421  const auto detid = DetId(includeStripHits_ ? simhit_detId[ip->simHitIdx] : simhit_detId_phase2[ip->simHitIdx]);
4422  if (detid.det() != DetId::Tracker) {
4423  throw cms::Exception("LogicError") << "Encountered SimHit for TP " << tp.key() << " with DetId "
4424  << detid.rawId() << " whose det() is not Tracker but " << detid.det();
4425  }
4426  const auto subdet = detid.subdetId();
4427  switch (subdet) {
4430  ++nPixel;
4431  break;
4432  case StripSubdetector::TIB:
4433  case StripSubdetector::TID:
4434  case StripSubdetector::TOB:
4435  case StripSubdetector::TEC:
4436  ++nStrip;
4437  break;
4438  default:
4439  throw cms::Exception("LogicError") << "Encountered SimHit for TP " << tp.key() << " with DetId "
4440  << detid.rawId() << " whose subdet is not recognized, is " << subdet;
4441  };
4442  }
4443  sim_nValid.push_back(hitIdx.size());
4444  sim_nPixel.push_back(nPixel);
4445  sim_nStrip.push_back(nStrip);
4446 
4447  const auto nSimLayers = nLayers_tPCeff[tp];
4448  const auto nSimPixelLayers = nPixelLayers_tPCeff[tp];
4449  const auto nSimStripMonoAndStereoLayers = nStripMonoAndStereoLayers_tPCeff[tp];
4450  sim_nLay.push_back(nSimLayers);
4451  sim_nPixelLay.push_back(nSimPixelLayers);
4452  sim_n3DLay.push_back(nSimPixelLayers + nSimStripMonoAndStereoLayers);
4453 
4454  sim_nTrackerHits.push_back(tp->numberOfTrackerHits());
4455  auto found = tpKeyToClusterCount.find(tp.key());
4456  sim_nRecoClusters.push_back(found != cend(tpKeyToClusterCount) ? found->second : 0);
4457 
4458  sim_simHitIdx.push_back(hitIdx);
4459  }
4460 }
4461 
4462 // called from fillSeeds
4464  const reco::SimToRecoCollection& simRecColl,
4465  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
4466  const unsigned int seedOffset) {
4467  if (sim_seedIdx.empty()) // first call
4468  sim_seedIdx.resize(tpCollection.size());
4469 
4470  for (const auto& keyVal : simRecColl) {
4471  const auto& tpRef = keyVal.key;
4472  auto found = tpKeyToIndex.find(tpRef.key());
4473  if (found == tpKeyToIndex.end())
4474  throw cms::Exception("Assert") << __FILE__ << ":" << __LINE__ << " fillTrackingParticlesForSeeds: tpRef.key() "
4475  << tpRef.key() << " not found from tpKeyToIndex. tpKeyToIndex size "
4476  << tpKeyToIndex.size();
4477  const auto tpIndex = found->second;
4478  for (const auto& pair : keyVal.val) {
4479  const auto& seedRef = pair.first->seedRef();
4480  sim_seedIdx[tpIndex].push_back(seedOffset + seedRef.key());
4481  }
4482  }
4483 }
4484 
4487  for (size_t iVertex = 0, size = vertices.size(); iVertex < size; ++iVertex) {
4488  const reco::Vertex& vertex = vertices[iVertex];
4489  vtx_x.push_back(vertex.x());
4490  vtx_y.push_back(vertex.y());
4491  vtx_z.push_back(vertex.z());
4492  vtx_xErr.push_back(vertex.xError());
4493  vtx_yErr.push_back(vertex.yError());
4494  vtx_zErr.push_back(vertex.zError());
4495  vtx_chi2.push_back(vertex.chi2());
4496  vtx_ndof.push_back(vertex.ndof());
4497  vtx_fake.push_back(vertex.isFake());
4498  vtx_valid.push_back(vertex.isValid());
4499 
4500  std::vector<int> trkIdx;
4501  for (auto iTrack = vertex.tracks_begin(); iTrack != vertex.tracks_end(); ++iTrack) {
4502  // Ignore link if vertex was fit from a track collection different from the input
4503  if (iTrack->id() != tracks.id())
4504  continue;
4505 
4506  trkIdx.push_back(iTrack->key());
4507 
4508  if (trk_vtxIdx[iTrack->key()] != -1) {
4509  throw cms::Exception("LogicError") << "Vertex index has already been set for track " << iTrack->key() << " to "
4510  << trk_vtxIdx[iTrack->key()] << "; was trying to set it to " << iVertex;
4511  }
4512  trk_vtxIdx[iTrack->key()] = iVertex;
4513  }
4514  vtx_trkIdx.push_back(trkIdx);
4515  }
4516 }
4517 
4519  const TrackingParticleRefKeyToIndex& tpKeyToIndex) {
4520  int current_event = -1;
4521  for (const auto& ref : trackingVertices) {
4522  const TrackingVertex v = *ref;
4523  if (v.eventId().event() != current_event) {
4524  // next PV
4525  current_event = v.eventId().event();
4526  simpv_idx.push_back(simvtx_x.size());
4527  }
4528 
4529  unsigned int processType = std::numeric_limits<unsigned int>::max();
4530  if (!v.g4Vertices().empty()) {
4531  processType = v.g4Vertices()[0].processType();
4532  }
4533 
4534  simvtx_event.push_back(v.eventId().event());
4535  simvtx_bunchCrossing.push_back(v.eventId().bunchCrossing());
4536  simvtx_processType.push_back(processType);
4537 
4538  simvtx_x.push_back(v.position().x());
4539  simvtx_y.push_back(v.position().y());
4540  simvtx_z.push_back(v.position().z());
4541 
4542  auto fill = [&](const TrackingParticleRefVector& tps, std::vector<int>& idx) {
4543  for (const auto& tpRef : tps) {
4544  auto found = tpKeyToIndex.find(tpRef.key());
4545  if (found != tpKeyToIndex.end()) {
4546  idx.push_back(found->second);
4547  }
4548  }
4549  };
4550 
4551  std::vector<int> sourceIdx;
4552  std::vector<int> daughterIdx;
4553  fill(v.sourceTracks(), sourceIdx);
4554  fill(v.daughterTracks(), daughterIdx);
4555 
4556  simvtx_sourceSimIdx.push_back(sourceIdx);
4557  simvtx_daughterSimIdx.push_back(daughterIdx);
4558  }
4559 }
4560 
4561 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
4563  //The following says we do not know what parameters are allowed so do no validation
4564  // Please change this to state exactly what you do use, even if it is no parameters
4566  desc.addUntracked<std::vector<edm::InputTag>>(
4567  "seedTracks",
4568  std::vector<edm::InputTag>{edm::InputTag("seedTracksinitialStepSeeds"),
4569  edm::InputTag("seedTracksdetachedTripletStepSeeds"),
4570  edm::InputTag("seedTrackspixelPairStepSeeds"),
4571  edm::InputTag("seedTrackslowPtTripletStepSeeds"),
4572  edm::InputTag("seedTracksmixedTripletStepSeeds"),
4573  edm::InputTag("seedTrackspixelLessStepSeeds"),
4574  edm::InputTag("seedTrackstobTecStepSeeds"),
4575  edm::InputTag("seedTracksjetCoreRegionalStepSeeds"),
4576  edm::InputTag("seedTracksmuonSeededSeedsInOut"),
4577  edm::InputTag("seedTracksmuonSeededSeedsOutIn")});
4578  desc.addUntracked<std::vector<edm::InputTag>>(
4579  "trackCandidates",
4580  std::vector<edm::InputTag>{edm::InputTag("initialStepTrackCandidates"),
4581  edm::InputTag("detachedTripletStepTrackCandidates"),
4582  edm::InputTag("pixelPairStepTrackCandidates"),
4583  edm::InputTag("lowPtTripletStepTrackCandidates"),
4584  edm::InputTag("mixedTripletStepTrackCandidates"),
4585  edm::InputTag("pixelLessStepTrackCandidates"),
4586  edm::InputTag("tobTecStepTrackCandidates"),
4587  edm::InputTag("jetCoreRegionalStepTrackCandidates"),
4588  edm::InputTag("muonSeededTrackCandidatesInOut"),
4589  edm::InputTag("muonSeededTrackCandidatesOutIn")});
4590  desc.addUntracked<edm::InputTag>("tracks", edm::InputTag("generalTracks"));
4591  desc.addUntracked<std::vector<std::string>>("trackMVAs", std::vector<std::string>{{"generalTracks"}});
4592 
4593  edm::ParameterSetDescription cMaskDesc;
4594  cMaskDesc.addUntracked<unsigned int>("index");
4595  cMaskDesc.addUntracked<edm::InputTag>("src");
4596  std::vector<edm::ParameterSet> cMasks;
4597  auto addMask = [&cMasks](reco::Track::TrackAlgorithm algo) {
4598  edm::ParameterSet ps;
4599  ps.addUntrackedParameter<unsigned int>("index", static_cast<unsigned int>(algo));
4600  ps.addUntrackedParameter<edm::InputTag>("src", {reco::Track::algoName(algo) + "Clusters"});
4601  cMasks.push_back(ps);
4602  };
4606  addMask(reco::Track::lowPtQuadStep);
4609  addMask(reco::Track::pixelLessStep);
4610  addMask(reco::Track::pixelPairStep);
4611  addMask(reco::Track::tobTecStep);
4612  desc.addVPSetUntracked("clusterMasks", cMaskDesc, cMasks);
4613 
4614  desc.addUntracked<edm::InputTag>("trackingParticles", edm::InputTag("mix", "MergedTrackTruth"));
4615  desc.addUntracked<bool>("trackingParticlesRef", false);
4616  desc.addUntracked<edm::InputTag>("clusterTPMap", edm::InputTag("tpClusterProducer"));
4617  desc.addUntracked<edm::InputTag>("simHitTPMap", edm::InputTag("simHitTPAssocProducer"));
4618  desc.addUntracked<edm::InputTag>("trackAssociator", edm::InputTag("quickTrackAssociatorByHits"));
4619  desc.addUntracked<edm::InputTag>("pixelDigiSimLink", edm::InputTag("simSiPixelDigis"));
4620  desc.addUntracked<edm::InputTag>("stripDigiSimLink", edm::InputTag("simSiStripDigis"));
4621  desc.addUntracked<edm::InputTag>("phase2OTSimLink", edm::InputTag(""));
4622  desc.addUntracked<edm::InputTag>("beamSpot", edm::InputTag("offlineBeamSpot"));
4623  desc.addUntracked<edm::InputTag>("pixelRecHits", edm::InputTag("siPixelRecHits"));
4624  desc.addUntracked<edm::InputTag>("stripRphiRecHits", edm::InputTag("siStripMatchedRecHits", "rphiRecHit"));
4625  desc.addUntracked<edm::InputTag>("stripStereoRecHits", edm::InputTag("siStripMatchedRecHits", "stereoRecHit"));
4626  desc.addUntracked<edm::InputTag>("stripMatchedRecHits", edm::InputTag("siStripMatchedRecHits", "matchedRecHit"));
4627  desc.addUntracked<edm::InputTag>("phase2OTRecHits", edm::InputTag("siPhase2RecHits"));
4628  desc.addUntracked<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
4629  desc.addUntracked<edm::InputTag>("trackingVertices", edm::InputTag("mix", "MergedTrackTruth"));
4630  desc.addUntracked<edm::InputTag>("trackingParticleNlayers",
4631  edm::InputTag("trackingParticleNumberOfLayersProducer", "trackerLayers"));
4632  desc.addUntracked<edm::InputTag>("trackingParticleNpixellayers",
4633  edm::InputTag("trackingParticleNumberOfLayersProducer", "pixelLayers"));
4634  desc.addUntracked<edm::InputTag>("trackingParticleNstripstereolayers",
4635  edm::InputTag("trackingParticleNumberOfLayersProducer", "stripStereoLayers"));
4636  desc.addUntracked<std::string>("TTRHBuilder", "WithTrackAngle")
4637  ->setComment("currently not used: keep for possible future use");
4638  desc.addUntracked<bool>("includeSeeds", false);
4639  desc.addUntracked<bool>("includeTrackCandidates", false);
4640  desc.addUntracked<bool>("addSeedCurvCov", false);
4641  desc.addUntracked<bool>("includeAllHits", false);
4642  desc.addUntracked<bool>("includeOnTrackHitData", false);
4643  desc.addUntracked<bool>("includeMVA", true);
4644  desc.addUntracked<bool>("includeTrackingParticles", true);
4645  desc.addUntracked<bool>("includeOOT", false);
4646  desc.addUntracked<bool>("keepEleSimHits", false);
4647  desc.addUntracked<bool>("saveSimHitsP3", false);
4648  desc.addUntracked<bool>("simHitBySignificance", false);
4649  descriptions.add("trackingNtuple", desc);
4650 }
4651 
4652 //define this as a plug-in
std::vector< unsigned int > sim_nTrackerHits
std::vector< int > trk_bestSimTrkIdx
std::vector< std::vector< float > > ph2_onTrk_yz
reco::SimToRecoCollection associateSimToReco(const edm::Handle< edm::View< reco::Track >> &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
size
Write out results.
unsigned int tecPetalNumber(const DetId &id) const
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
edm::EDGetTokenT< TrackingParticleRefVector > trackingParticleRefToken_
std::vector< unsigned int > sim_nLay
Log< level::Info, true > LogVerbatim
std::vector< float > ph2_radL
bool isUpper(const DetId &id) const
std::vector< float > tcand_pca_phiErr
std::vector< float > trk_dxyPV
static constexpr auto TEC
unsigned int size_type
Definition: View.h:92
void fillTrackingVertices(const TrackingVertexRefVector &trackingVertices, const TrackingParticleRefKeyToIndex &tpKeyToIndex)
std::vector< float > see_bestSimTrkShareFrac
bool tibIsDoubleSide(const DetId &id) const
std::vector< std::vector< float > > see_simTrkShareFrac
edm::EDGetTokenT< SiStripMatchedRecHit2DCollection > stripMatchedRecHitToken_
std::vector< short > see_fitok
std::vector< short > vtx_fake
std::vector< float > simvtx_z
std::vector< std::vector< float > > trk_simTrkNChi2
bool tecIsDoubleSide(const DetId &id) const
std::vector< std::vector< int > > see_hitType
size_type dataSize() const
std::vector< float > trk_dzClosestPV
bool tidIsDoubleSide(const DetId &id) const
edm::EDGetTokenT< SiStripRecHit2DCollection > stripRphiRecHitToken_
std::vector< short > ph2_isBarrel
TrackAssociatorByHitsImpl::SimHitTPAssociationList SimHitTPAssociationList
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
DetIdStrip str_detId
std::vector< std::vector< float > > pix_onTrk_x
std::vector< float > trk_phi
void push_back(const TrackerGeometry &tracker, const TrackerTopology &tTopo, const DetId &id)
std::vector< float > sim_pca_cotTheta
unsigned int tibSide(const DetId &id) const
const bool simHitBySignificance_
std::vector< float > sim_pca_dxy
uint16_t firstStrip() const
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
std::vector< float > see_stateTrajPy
std::vector< float > pix_y
std::vector< int > trk_vtxIdx
Pixel pixel(int i) const
std::vector< std::vector< int > > str_trkIdx
std::vector< unsigned int > see_nValid
std::vector< float > str_yy
unsigned int tobSide(const DetId &id) const
iterator find(det_id_type id)
Definition: DetSetVector.h:255
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
bool trackFromSeedFitFailed(const reco::Track &track)
std::vector< float > trk_outer_py
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
std::vector< float > glu_chargePerCM
std::vector< float > pix_zz
std::vector< unsigned short > layer
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
std::vector< float > ph2_bbxi
reco::RecoToSimCollection associateRecoToSim(const edm::Handle< edm::View< reco::Track >> &tCH, const edm::Handle< TrackingParticleCollection > &tPCH) const
std::vector< float > tcand_ytErr
void fillPixelHits(const edm::Event &iEvent, const TrackerGeometry &tracker, const ClusterTPAssociation &clusterToTPMap, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< PixelDigiSimLink > &digiSimLink, const TrackerTopology &tTopo, const SimHitRefKeyToIndex &simHitRefKeyToIndex, std::set< edm::ProductID > &hitProductIds)
std::vector< uint64_t > str_usedMask
std::vector< int > glu_monoIdx
std::vector< float > trk_eta
std::vector< short > glu_isBarrel
const bool includeOOT_
std::vector< unsigned short > order
std::vector< std::vector< float > > ph2_onTrk_y
std::vector< std::vector< float > > str_onTrk_yz
std::vector< int > sim_bunchCrossing
std::vector< float > see_phiErr
std::vector< int > trk_bestFromFirstHitSimTrkIdx
std::vector< std::vector< int > > simhit_hitIdx
unsigned int pxfBlade(const DetId &id) const
static bool simHitTPAssociationListGreater(SimHitTPPair i, SimHitTPPair j)
std::vector< float > tcand_pca_pz
std::vector< float > str_x
std::vector< float > see_dzErr
std::vector< unsigned int > sim_n3DLay
unsigned int tibOrder(const DetId &id) const
std::vector< float > trk_cotTheta
std::vector< unsigned int > moduleType
std::vector< float > trk_bestSimTrkNChi2
CombineDetId< DetIdCommon, DetIdOTCommon, DetIdStripOnly > DetIdStrip
void push_back(const TrackerGeometry &tracker, const TrackerTopology &tTopo, const DetId &id)
std::vector< unsigned int > see_nStrip
std::vector< float > trk_px
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
range equal_range(const OmniClusterRef &key) const
std::vector< unsigned short > pix_simType
void push_back(const TrackerGeometry &tracker, const TrackerTopology &tTopo, const DetId &id)
std::vector< unsigned short > inv_type
std::vector< float > see_stateTrajPz
SiPixelCluster const & pixelCluster() const
std::vector< float > pix_zx
std::vector< std::vector< float > > ph2_onTrk_zx
SimHitData matchCluster(const OmniClusterRef &cluster, DetId hitId, int clusterKey, const TrackingRecHit &hit, const ClusterTPAssociation &clusterToTPMap, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< SimLink > &digiSimLinks, const SimHitRefKeyToIndex &simHitRefKeyToIndex, HitType hitType)
ret
prodAgent to be discontinued
TPHitIndex(unsigned int tp=0, unsigned int simHit=0, float to=0, unsigned int id=0)
std::vector< float > sim_phi
std::vector< unsigned int > tcand_algo
std::vector< std::vector< int > > trk_simTrkIdx
std::vector< float > trk_dzPV
ROOT::Math::SMatrixIdentity AlgebraicMatrixID
edm::EDGetTokenT< reco::TrackToTrackingParticleAssociator > trackAssociatorToken_
edm::EDGetTokenT< SiStripRecHit2DCollection > stripStereoRecHitToken_
std::vector< float > trk_dxyErr
std::vector< float > str_yz
std::vector< float > trk_pt
std::vector< float > glu_x
std::vector< float > tcand_bestFromFirstHitSimTrkShareFracSimDenom
std::vector< float > trk_inner_py
std::vector< float > see_px
std::vector< float > see_chi2
void fillStripRphiStereoHits(const edm::Event &iEvent, const TrackerGeometry &tracker, const ClusterTPAssociation &clusterToTPMap, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< StripDigiSimLink > &digiSimLink, const TrackerTopology &tTopo, const SimHitRefKeyToIndex &simHitRefKeyToIndex, std::set< edm::ProductID > &hitProductIds)
T const * product() const
Definition: Handle.h:70
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)
const GlobalTrajectoryParameters & globalParameters() const
constexpr bool isUninitialized() const noexcept
Definition: EDGetToken.h:104
const bool includeOnTrackHitData_
CombineDetId< DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdPhase2OTOnly > DetIdAllPhase2
CombineDetId< DetIdCommon, DetIdPixelOnly > DetIdPixel
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
void fillCandidates(const edm::Handle< TrackCandidateCollection > &candsHandle, int algo, 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 TrackerGeometry &tracker, const TrackerTopology &tTopo, const std::set< edm::ProductID > &hitProductIds, const std::map< edm::ProductID, size_t > &seedToCollIndex)
void fillBeamSpot(const reco::BeamSpot &bs)
std::vector< unsigned short > see_stopReason
std::vector< float > tcand_pca_ptErr
std::vector< float > trk_outer_px
std::vector< std::vector< int > > trk_hitType
OmniClusterRef const & stereoClusterRef() const
void fillTracks(const edm::RefToBaseVector< reco::Track > &tracks, const TrackerGeometry &tracker, 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 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)
std::vector< unsigned int > trk_nCluster
DetIdPixel pix_detId
std::vector< float > ph2_xx
unsigned int tibString(const DetId &id) const
std::vector< std::vector< float > > pix_onTrk_z
unsigned long long EventNumber_t
std::vector< std::vector< int > > ph2_trkIdx
#define BOOK(name)
edm::EDGetTokenT< Phase2TrackerRecHit1DCollectionNew > phase2OTRecHitToken_
void push_back(const TrackerGeometry &tracker, const TrackerTopology &tTopo, const DetId &id)
std::vector< OmniClusterRef > hitsToClusterRefs(iter begin, iter end)
std::vector< unsigned int > see_algo
std::vector< unsigned int > tcand_nStrip
const bool addSeedCurvCov_
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
std::vector< float > tcand_bestSimTrkShareFrac
std::vector< float > trk_inner_pt
std::vector< short > simhit_process
std::vector< unsigned short > module
std::vector< float > trk_bestSimTrkShareFracSimClusterDenom
CombineDetId< DetIdCommon, DetIdOTCommon, DetIdPhase2OTOnly > DetIdPhase2OT
std::vector< std::vector< float > > str_onTrk_xx
std::vector< float > tcand_pca_dxy
std::vector< std::vector< int > > str_seeIdx
std::vector< std::vector< int > > see_simTrkIdx
std::vector< int > simvtx_event
std::vector< float > str_radL
void fillSeeds(const edm::Event &iEvent, const TrackingParticleRefVector &tpCollection, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const reco::BeamSpot &bs, const TrackerGeometry &tracker, const reco::TrackToTrackingParticleAssociator &associatorByHits, const ClusterTPAssociation &clusterToTPMap, 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)
bool isStereo(const DetId &id) const
std::vector< int > simhit_simTrkIdx
bool isRPhi(const DetId &id) const
std::vector< unsigned short > trk_stopReason
value_type const at(size_type idx) const
Retrieve an element of the RefVector.
Definition: RefVector.h:83
std::vector< uint64_t > glu_usedMaskStereo
unsigned int pxbLadder(const DetId &id) const
std::vector< unsigned short > ladder
static bool tpHitIndexListLess(const TPHitIndex &i, const TPHitIndex &j)
TrackingNtuple(const edm::ParameterSet &)
std::vector< float > tcand_pca_eta
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
unsigned int side(const DetId &id) const
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:31
size_type size() const
assert(be >=bs)
std::vector< float > sim_px
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46
unsigned int LuminosityBlockNumber_t
std::vector< float > pix_xx
unsigned int tecRing(const DetId &id) const
ring id
std::vector< std::vector< int > > sim_decayVtxIdx
std::vector< float > trk_refpoint_x
std::vector< float > pix_radL
std::vector< float > xySignificance
std::vector< float > pix_bbxi
std::vector< std::vector< float > > sim_trkShareFrac
OmniClusterRef const & monoClusterRef() const
std::vector< std::vector< float > > trk_mvas
key_type key() const
Accessor for product key.
Definition: Ref.h:250
bool tobIsDoubleSide(const DetId &id) const
std::vector< float > ph2_zx
std::vector< float > tcand_pca_dzErr
std::vector< int > simpv_idx
std::vector< unsigned char > QualityMaskCollection
constexpr uint32_t mask
Definition: gpuClustering.h:26
const_iterator find(const key_type &k) const
find element with specified reference key
static std::string to_string(const XMLCh *ch)
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > pixelSimLinkToken_
unsigned int layer(const DetId &id) const
TrackAlgorithm
track algorithm
Definition: TrackBase.h:89
#define LogTrace(id)
edm::ProductID id() const
CombineDetId< DetIdCommon, DetIdPixelOnly, DetIdOTCommon, DetIdStripOnly > DetIdAll
std::vector< std::vector< float > > str_xySignificance
Parsed parse(const TrackerTopology &tTopo, const DetId &id) const
const_iterator end(bool update=false) const
std::vector< std::vector< int > > pix_seeIdx
std::vector< unsigned short > str_simType
std::vector< int > sim_q
std::vector< short > see_isTrue
const_iterator end() const
last iterator over the map (read only)
std::vector< short > inv_isBarrel
T getUntrackedParameter(std::string const &, T const &) const
std::vector< SimHitTPPair > SimHitTPAssociationList
std::vector< float > trk_bestSimTrkShareFracSimDenom
std::vector< unsigned short > ring
std::vector< float > trk_bestFromFirstHitSimTrkNChi2
math::XYZPointD Point
point in the space
std::vector< float > see_etaErr
std::vector< std::vector< float > > trk_simTrkShareFrac
ClusterPixelRef cluster_pixel() const
unsigned int module(const DetId &id) const
std::vector< float > simhit_z
std::vector< float > tcand_qbpErr
std::vector< float > ph2_z
std::vector< float > ph2_yy
std::vector< float > tcand_pz
std::vector< float > tcand_phiErr
std::vector< unsigned int > tcand_nPixel
std::vector< float > tcand_pca_etaErr
std::vector< float > trk_refpoint_y
std::vector< unsigned int > trk_nLostLay
std::vector< float > MVACollection
std::vector< int > sim_event
char const * label
std::vector< unsigned int > trk_nStrip
std::vector< unsigned int > tcand_nCluster
std::vector< const reco::GenParticle * > RecoGenParticleTrail
reco::GenParticle trail type.
Definition: HistoryBase.h:18
std::vector< int > see_bestSimTrkIdx
std::vector< float > chargeFraction
edm::EDGetTokenT< edm::ValueMap< unsigned int > > tpNStripStereoLayersToken_
std::vector< float > see_stateTrajGlbPz
std::vector< unsigned int > trk_nPixel
std::vector< float > glu_y
VParameterSet getUntrackedParameterSetVector(std::string const &name, VParameterSet const &defaultValue) const
std::vector< std::vector< float > > pix_xySignificance
std::vector< unsigned short > panel
std::vector< float > trk_pz
std::vector< std::vector< float > > pix_onTrk_yz
int iEvent
Definition: GenABIO.cc:224
std::vector< float > tcand_z
std::vector< float > trk_dzErr
std::vector< unsigned short > isStereo
std::vector< unsigned short > tcand_stopReason
std::vector< float > tcand_pca_pt
std::vector< float > trk_lambdaErr
std::vector< unsigned short > isUpper
std::vector< std::vector< float > > pix_onTrk_zz
void push_back(const TrackerGeometry &tracker, const TrackerTopology &tTopo, const DetId &id)
std::vector< std::vector< float > > see_stateCurvCov
std::vector< unsigned int > see_nCluster
edm::EDGetTokenT< SiPixelRecHitCollection > pixelRecHitToken_
std::vector< float > ph2_y
std::vector< std::tuple< edm::EDGetTokenT< MVACollection >, edm::EDGetTokenT< QualityMaskCollection > > > mvaQualityCollectionTokens_
unsigned int tidOrder(const DetId &id) const
std::vector< std::vector< int > > simvtx_sourceSimIdx
std::vector< int > tcand_vtxIdx
std::vector< float > trk_bestFromFirstHitSimTrkShareFracSimDenom
std::vector< float > trk_etaErr
void fillPhase2OTHits(const edm::Event &iEvent, const ClusterTPAssociation &clusterToTPMap, const TrackerGeometry &tracker, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const edm::DetSetVector< PixelDigiSimLink > &digiSimLink, const TrackerTopology &tTopo, const SimHitRefKeyToIndex &simHitRefKeyToIndex, std::set< edm::ProductID > &hitProductIds)
std::vector< short > pix_isBarrel
std::vector< std::vector< float > > str_onTrk_z
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > siphase2OTSimLinksToken_
std::vector< float > tcand_xtErr
std::vector< float > glu_yz
std::vector< float > sim_pca_phi
virtual const Surface * surface() const
std::vector< int > pix_clustSizeCol
auto dz(const T_Vertex &vertex, const T_Momentum &momentum, const T_Point &point)
SiStripCluster const & amplitudes() const
std::vector< unsigned int > trk_algo
std::vector< unsigned int > sim_nRecoClusters
std::vector< int > see_tcandIdx
std::vector< float > tcand_y
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
auto size() const
std::vector< float > trk_bestFromFirstHitSimTrkShareFracSimClusterDenom
std::vector< float > vtx_y
std::vector< float > pix_z
std::vector< int > see_bestFromFirstHitSimTrkIdx
std::vector< int > bunchCrossing
std::vector< float > sim_eta
std::vector< unsigned short > blade
std::vector< unsigned int > trk_originalAlgo
std::vector< unsigned int > trk_nInnerLost
std::vector< float > str_y
std::vector< int > sim_pdgId
std::vector< int > see_q
std::vector< std::vector< float > > pix_onTrk_zx
std::vector< std::vector< int > > simhit_hitType
std::vector< float > trk_refpoint_z
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
std::vector< int > trk_seedIdx
std::vector< std::vector< float > > pix_chargeFraction
edm::RunNumber_t ev_run
std::vector< std::vector< int > > tcand_hitType
std::vector< float > vtx_yErr
std::vector< std::vector< int > > pix_trkIdx
Phase2TrackerCluster1D const & phase2OTCluster() const
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
std::vector< std::vector< int > > ph2_simHitIdx
std::vector< float > simvtx_x
std::vector< std::vector< float > > ph2_onTrk_x
unsigned int operator[](size_t i) const
std::vector< float > str_zz
std::vector< std::vector< int > > tcand_simTrkIdx
DetIdAllPhase2 inv_detId_phase2
std::vector< float > tcand_pca_lambdaErr
std::vector< std::vector< float > > str_onTrk_y
std::vector< std::vector< float > > pix_onTrk_xx
std::vector< float > sim_pca_pt
key
prepare the HTCondor submission files and eventually submit them
DetIdPhase2OT ph2_detId
std::vector< float > see_dxyErr
std::vector< float > tcand_bestFromFirstHitSimTrkShareFrac
bool isMatched(TrackingRecHit const &hit)
std::vector< float > trk_bestFromFirstHitSimTrkShareFrac
std::vector< short > tcand_pca_valid
uint32_t stack(const DetId &id) const
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< float > see_pt
std::vector< unsigned int > see_nPhase2OT
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
edm::EDGetTokenT< TrackingVertexCollection > trackingVertexToken_
std::vector< float > see_dxy
std::vector< std::vector< int > > glu_seeIdx
std::vector< unsigned int > trk_n3DLay
std::vector< std::vector< int > > sim_trkIdx
Definition: Types.py:1
std::vector< float > trk_outer_pt
void fillStripMatchedHits(const edm::Event &iEvent, const TrackerGeometry &tracker, const TrackerTopology &tTopo, std::vector< std::pair< int, int >> &monoStereoClusterList)
static bool tpHitIndexListLessSort(const TPHitIndex &i, const TPHitIndex &j)
std::vector< int > matchingSimHit
unsigned int tecOrder(const DetId &id) const
std::vector< float > str_chargePerCM
const bool includeSeeds_
const bool includeTrackingParticles_
std::vector< float > trk_dz
static constexpr auto TOB
size_t addStripMatchedHit(const SiStripMatchedRecHit2D &hit, const TrackerGeometry &tracker, const TrackerTopology &tTopo, const std::vector< std::pair< uint64_t, StripMaskContainer const *>> &stripMasks, std::vector< std::pair< int, int >> &monoStereoClusterList)
std::vector< float > trk_ptErr
std::vector< unsigned int > trk_nStripLay
void fillSimHits(const TrackerGeometry &tracker, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const SimHitTPAssociationProducer::SimHitTPAssociationList &simHitsTPAssoc, const TrackerTopology &tTopo, SimHitRefKeyToIndex &simHitRefKeyToIndex, std::vector< TPHitIndex > &tpHitList)
std::vector< float > see_phi
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tGeomToken_
std::vector< float > vtx_z
char const * module
Definition: ProductLabels.h:5
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:316
std::vector< float > glu_zz
std::vector< float > tcand_bestSimTrkNChi2
std::vector< float > sim_pca_lambda
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 > see_stateTrajPx
std::vector< float > glu_zx
std::vector< std::vector< float > > str_onTrk_zx
std::string algoName() const
Definition: TrackBase.h:550
std::vector< int > tcand_seedIdx
#define M_PI
const bool saveSimHitsP3_
std::vector< std::vector< float > > str_onTrk_x
Definition: RZLine.h:12
std::vector< float > vtx_xErr
std::vector< float > tcand_bestSimTrkShareFracSimDenom
std::vector< std::vector< float > > tcand_simTrkShareFrac
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< float > tcand_pt
unsigned int id
std::vector< float > sim_pz
std::vector< float > see_stateTrajGlbY
std::vector< int > event
std::vector< std::vector< int > > sim_simHitIdx
unsigned int pxfPanel(const DetId &id) const
edm::Ref< TrackingVertexCollection > TrackingVertexRef
std::vector< unsigned short > isGlued
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > mfToken_
edm::EventNumber_t ev_event
std::vector< float > tcand_bestFromFirstHitSimTrkShareFracSimClusterDenom
Definition: DetId.h:17
std::vector< unsigned short > isRPhi
std::vector< float > ph2_x
edm::EDGetTokenT< reco::VertexCollection > vertexToken_
edm::EDGetTokenT< TrackingParticleCollection > trackingParticleToken_
std::vector< uint64_t > pix_usedMask
bool isLower(const DetId &id) const
std::vector< uint64_t > glu_usedMaskMono
std::vector< int > glu_stereoIdx
Phase2Cluster1DRef cluster_phase2OT() const
std::vector< float > trk_py
static constexpr auto TIB
const_iterator begin(bool update=false) const
std::vector< std::vector< int > > pix_simHitIdx
size_type size() const
Size of the RefVector.
Definition: RefVector.h:102
std::vector< float > trk_nChi2
TrajectoryStateOnSurface transientState(const PTrajectoryStateOnDet &ts, const Surface *surface, const MagneticField *field)
const CurvilinearTrajectoryError & curvilinearError() const
std::vector< std::vector< unsigned short > > trk_qualityMasks
void book(const std::string &prefix, TTree *tree)
unsigned long long uint64_t
Definition: Time.h:13
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
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
void addUntrackedParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:193
std::vector< short > tcand_isTrue
std::vector< float > str_zx
const bool includeTrackCandidates_
std::vector< std::vector< int > > tcand_hitIdx
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
int size() const
virtual OmniClusterRef const & firstClusterRef() const =0
std::vector< float > tcand_pca_dz
const AlgebraicSymMatrix55 & matrix() const
std::vector< TrackingVertex > TrackingVertexCollection
HistoryBase tracer_
std::vector< int > glu_clustSizeStereo
std::vector< float > tcand_bestSimTrkShareFracSimClusterDenom
std::vector< short > trk_isHP
std::vector< float > str_xy
virtual TrackingParticle::Point vertex(const edm::Event &iEvent, const edm::EventSetup &iSetup, const Charge ch, const Point &vtx, const LorentzVector &lv) const
std::vector< std::vector< float > > str_chargeFraction
float chi2() const
Definition: RZLine.h:95
void add(std::string const &label, ParameterSetDescription const &psetDescription)
~TrackingNtuple() override
std::vector< unsigned int > trk_nInnerInactive
std::vector< float > tcand_pca_py
std::vector< float > tcand_pca_dxyErr
std::vector< unsigned short > isLower
std::vector< std::pair< unsigned int, edm::EDGetTokenT< StripMaskContainer > > > stripUseMaskTokens_
unsigned int tobRod(const DetId &id) const
Base class to all the history types.
Definition: HistoryBase.h:12
std::vector< std::vector< float > > ph2_xySignificance
std::vector< std::vector< int > > trk_hitIdx
deadvectors [0] push_back({0.0175431, 0.538005, 6.80997, 13.29})
std::vector< std::vector< int > > str_tcandIdx
std::vector< int > trk_q
std::vector< unsigned int > sim_nPixel
std::vector< std::vector< float > > pix_onTrk_xy
const bool includeAllHits_
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::EDGetTokenT< ClusterTPAssociation > clusterTPMapToken_
std::vector< std::vector< float > > ph2_onTrk_xy
Pixel cluster – collection of neighboring pixels above threshold.
std::vector< unsigned int > tcand_nValid
fixed size matrix
std::vector< int > tcand_q
std::vector< std::vector< int > > vtx_trkIdx
HLT enums.
std::vector< short > str_isBarrel
auto dxy(const T_Vertex &vertex, const T_Momentum &momentum, const T_Point &point)
void analyze(const edm::Event &, const edm::EventSetup &) override
void depth(int d)
Set the depth of the history.
Definition: HistoryBase.h:49
Structure Point Contains parameters of Gaussian fits to DMRs.
std::vector< int > str_clustSize
std::vector< float > glu_bbxi
std::vector< int > simhit_particle
std::vector< float > tcand_ndof
SiStripCluster const & stripCluster() const
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< std::vector< float > > ph2_onTrk_z
std::vector< float > sim_pca_eta
void push_back(const RefToBase< T > &)
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
std::vector< float > simhit_y
void push_back(value_type const &ref)
Add a Ref<C, T> to the RefVector.
Definition: RefVector.h:67
std::vector< float > trk_dxyClosestPV
std::vector< float > see_stateTrajGlbPx
edm::Ref< edm::PSimHitContainer > TrackPSimHitRef
std::vector< std::vector< int > > str_simHitIdx
unsigned int tidRing(const DetId &id) const
std::vector< float > see_statePt
std::string builderName_
std::vector< float > tcand_lambdaErr
std::vector< float > trk_ndof
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< std::vector< float > > pix_onTrk_yy
std::vector< std::vector< int > > ph2_tcandIdx
ParameterVector parameters() const
Track parameters with one-to-one correspondence to the covariance matrix.
Definition: TrackBase.h:711
std::vector< unsigned int > trk_nPixelLay
std::vector< float > see_stateTrajGlbZ
std::vector< std::vector< float > > str_onTrk_xy
std::vector< float > simhit_x
std::vector< float > tcand_pca_px
std::vector< int > tcand_bestFromFirstHitSimTrkIdx
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
std::vector< float > simhit_py
std::vector< unsigned int > see_offset
RecoGenParticleTrail const & recoGenParticleTrail() const
Return all reco::GenParticle in the history.
Definition: HistoryBase.h:64
unsigned int key() const
Definition: tree.py:1
std::vector< std::vector< float > > pix_onTrk_y
std::vector< float > ph2_zz
void clear(EGIsoObj &c)
Definition: egamma.h:82
void book(const std::string &prefix, TTree *tree)
std::vector< float > tcand_bestFromFirstHitSimTrkNChi2
Parsed parse(const TrackerTopology &tTopo, const DetId &id) const
std::vector< int > see_trkIdx
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
math::XYZVectorD Vector
point in the space
TupleMultiplicity< TrackerTraits > const *__restrict__ uint32_t nHits
std::vector< int > tcand_bestSimTrkIdx
std::vector< float > tcand_x
std::vector< unsigned short > side
std::vector< std::vector< float > > ph2_onTrk_zz
std::vector< std::vector< int > > pix_tcandIdx
std::vector< float > simhit_tof
std::vector< std::vector< int > > sim_seedIdx
void fillVertices(const reco::VertexCollection &vertices, const edm::RefToBaseVector< reco::Track > &tracks)
T operator[](int i) const
std::vector< float > see_stateTrajGlbPy
std::vector< float > pix_xy
std::vector< unsigned short > subdet
std::vector< float > trk_dxy
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
std::vector< float > tcand_pca_phi
static constexpr auto TID
std::vector< decltype(reco::TrackBase().algoMaskUL())> trk_algoMask
std::vector< std::vector< int > > see_hitIdx
std::vector< std::vector< float > > str_onTrk_zz
std::vector< float > tcand_px
std::vector< float > vtx_x
std::vector< std::vector< float > > str_onTrk_yy
std::vector< float > simhit_pz
std::vector< std::vector< float > > tcand_simTrkNChi2
std::vector< unsigned int > see_nPixel
edm::Ref< TrackingParticleCollection > TrackingParticleRef
std::vector< unsigned short > petalNumber
std::vector< float > see_eta
DetIdAllPhase2 simhit_detId_phase2
std::vector< unsigned int > trk_nValid
std::vector< unsigned int > trk_nLost
std::vector< float > trk_inner_px
DetIdStrip glu_detId
def move(src, dest)
Definition: eostools.py:511
std::vector< float > vtx_zErr
std::vector< float > simhit_eloss
std::vector< float > see_bestFromFirstHitSimTrkShareFrac
std::vector< std::vector< float > > ph2_onTrk_yy
Definition: event.py:1
void labelsForToken(EDGetToken iToken, Labels &oLabels) const
std::vector< int > sim_isFromBHadron
std::vector< std::vector< float > > ph2_onTrk_xx
edm::EDGetTokenT< edm::DetSetVector< StripDigiSimLink > > stripSimLinkToken_
math::Error< dimension >::type CovarianceMatrix
5 parameter covariance matrix
Definition: TrackBase.h:74
uint16_t *__restrict__ uint16_t const *__restrict__ adc
std::vector< float > tcand_py
std::vector< int > pix_clustSizeRow
std::vector< edm::EDGetTokenT< TrackCandidateCollection > > candidateTokens_
std::vector< float > vtx_chi2
std::vector< int > simvtx_bunchCrossing
std::vector< float > str_bbxi
std::vector< float > see_dz
#define LogDebug(id)
std::vector< unsigned int > sim_nStrip