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