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