CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackingNtuple.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: NtupleDump/TrackingNtuple
4 // Class: TrackingNtuple
5 //
13 //
14 // Original Author: Giuseppe Cerati
15 // Created: Tue, 25 Aug 2015 13:22:49 GMT
16 //
17 //
18 
19 
20 // system include files
21 #include <memory>
22 
23 // user include files
26 
36 
39 
42 
46 
53 
56 
62 
67 
70 
78 
81 
83 
84 #include <set>
85 #include <map>
86 #include <unordered_set>
87 #include <unordered_map>
88 
89 #include "TTree.h"
90 
91 /*
92 todo:
93 add refitted hit position after track/seed fit
94 add local angle, path length!
95 */
96 
97 namespace {
98  std::string subdetstring(int subdet) {
99  switch(subdet) {
100  case StripSubdetector::TIB: return "- TIB";
101  case StripSubdetector::TOB: return "- TOB";
102  case StripSubdetector::TEC: return "- TEC";
103  case StripSubdetector::TID: return "- TID";
104  case PixelSubdetector::PixelBarrel: return "- PixBar";
105  case PixelSubdetector::PixelEndcap: return "- PixFwd";
106  default: return "UNKNOWN TRACKER HIT TYPE";
107  }
108  }
109 
110  struct ProductIDSetPrinter {
111  ProductIDSetPrinter(const std::set<edm::ProductID>& set): set_(set) {}
112 
113  void print(std::ostream& os) const {
114  for(const auto& item: set_) {
115  os << item << " ";
116  }
117  }
118 
119  const std::set<edm::ProductID>& set_;
120  };
121  std::ostream& operator<<(std::ostream& os, const ProductIDSetPrinter& o) {
122  o.print(os);
123  return os;
124  }
125  template <typename T>
126  struct ProductIDMapPrinter {
127  ProductIDMapPrinter(const std::map<edm::ProductID, T>& map): map_(map) {}
128 
129  void print(std::ostream& os) const {
130  for(const auto& item: map_) {
131  os << item.first << " ";
132  }
133  }
134 
135  const std::map<edm::ProductID, T>& map_;
136  };
137  template <typename T>
138  auto make_ProductIDMapPrinter(const std::map<edm::ProductID, T>& map) {
139  return ProductIDMapPrinter<T>(map);
140  }
141  template <typename T>
142  std::ostream& operator<<(std::ostream& os, const ProductIDMapPrinter<T>& o) {
143  o.print(os);
144  return os;
145  }
146 
147  template <typename T>
148  struct VectorPrinter {
149  VectorPrinter(const std::vector<T>& vec): vec_(vec) {}
150 
151  void print(std::ostream& os) const {
152  for(const auto& item: vec_) {
153  os << item << " ";
154  }
155  }
156 
157  const std::vector<T>& vec_;
158  };
159  template <typename T>
160  auto make_VectorPrinter(const std::vector<T>& vec) {
161  return VectorPrinter<T>(vec);
162  }
163  template <typename T>
164  std::ostream& operator<<(std::ostream& os, const VectorPrinter<T>& o) {
165  o.print(os);
166  return os;
167  }
168 
169  void checkProductID(const std::set<edm::ProductID>& set, const edm::ProductID& id, const char *name) {
170  if(set.find(id) == set.end())
171  throw cms::Exception("Configuration") << "Got " << name << " with a hit with ProductID " << id
172  << " which does not match to the set of ProductID's for the hits: "
173  << ProductIDSetPrinter(set)
174  << ". Usually this is caused by a wrong hit collection in the configuration.";
175  }
176 
177  template <typename SimLink, typename Func>
178  void forEachMatchedSimLink(const edm::DetSet<SimLink>& digiSimLinks, uint32_t channel, Func func) {
179  for(const auto& link: digiSimLinks) {
180  if(link.channel() == channel) {
181  func(link);
182  }
183  }
184  }
185 
186  std::map<unsigned int, double> chargeFraction(const SiPixelCluster& cluster, const DetId& detId,
187  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink) {
188  std::map<unsigned int, double> simTrackIdToAdc;
189 
190  auto idetset = digiSimLink.find(detId);
191  if(idetset == digiSimLink.end())
192  return simTrackIdToAdc;
193 
194  double adcSum = 0;
196  for(int iPix=0; iPix != cluster.size(); ++iPix) {
197  const SiPixelCluster::Pixel& pixel = cluster.pixel(iPix);
198  adcSum += pixel.adc;
199  uint32_t channel = PixelChannelIdentifier::pixelToChannel(pixel.x, pixel.y);
200  forEachMatchedSimLink(*idetset, channel, [&](const PixelDigiSimLink& simLink){
201  double& adc = simTrackIdToAdc[simLink.SimTrackId()];
202  adc += pixel.adc*simLink.fraction();
203  });
204  }
205 
206  for(auto& pair: simTrackIdToAdc) {
207  if(adcSum == 0.)
208  pair.second = 0.;
209  else
210  pair.second /= adcSum;
211  }
212 
213  return simTrackIdToAdc;
214  }
215 
216  std::map<unsigned int, double> chargeFraction(const SiStripCluster& cluster, const DetId& detId,
217  const edm::DetSetVector<StripDigiSimLink>& digiSimLink) {
218  std::map<unsigned int, double> simTrackIdToAdc;
219 
220  auto idetset = digiSimLink.find(detId);
221  if(idetset == digiSimLink.end())
222  return simTrackIdToAdc;
223 
224  double adcSum = 0;
226  int first = cluster.firstStrip();
227  for(size_t i=0; i<cluster.amplitudes().size(); ++i) {
228  adcSum += cluster.amplitudes()[i];
229  forEachMatchedSimLink(*idetset, first+i, [&](const StripDigiSimLink& simLink){
230  double& adc = simTrackIdToAdc[simLink.SimTrackId()];
231  adc += cluster.amplitudes()[i]*simLink.fraction();
232  });
233 
234  for(const auto& pair: simTrackIdToAdc) {
235  simTrackIdToAdc[pair.first] = (adcSum != 0. ? pair.second/adcSum : 0.);
236  }
237 
238  }
239  return simTrackIdToAdc;
240  }
241 
242 
243  std::map<unsigned int, double> chargeFraction(const Phase2TrackerCluster1D& cluster, const DetId& detId,
244  const edm::DetSetVector<StripDigiSimLink>& digiSimLink) {
245  std::map<unsigned int, double> simTrackIdToAdc;
246  throw cms::Exception("LogicError") << "Not possible to use StripDigiSimLink with Phase2TrackerCluster1D! ";
247  return simTrackIdToAdc;
248  }
249 
250  //In the OT, there is no measurement of the charge, so no ADC value.
251  //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.
252  std::map<unsigned int, double> chargeFraction(const Phase2TrackerCluster1D& cluster, const DetId& detId,
253  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink) {
254  std::map<unsigned int, double> simTrackIdToAdc;
255  return simTrackIdToAdc;
256  }
257 
258 }
259 
260 //
261 // class declaration
262 //
263 
264 class TrackingNtuple : public edm::one::EDAnalyzer<edm::one::SharedResources> {
265 public:
266  explicit TrackingNtuple(const edm::ParameterSet&);
267  ~TrackingNtuple();
268 
269  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
270 
271 
272 private:
273  virtual void analyze(const edm::Event&, const edm::EventSetup&) override;
274 
275  void clearVariables();
276 
277  // This pattern is copied from QuickTrackAssociatorByHitsImpl. If
278  // further needs arises, it wouldn't hurt to abstract it somehow.
279  typedef std::unordered_set<reco::RecoToSimCollection::index_type> TrackingParticleRefKeySet;
280  typedef std::unordered_map<reco::RecoToSimCollection::index_type, size_t> TrackingParticleRefKeyToIndex;
281  typedef TrackingParticleRefKeyToIndex TrackingVertexRefKeyToIndex;
282  typedef std::pair<TrackPSimHitRef::key_type, edm::ProductID> SimHitFullKey;
283  typedef std::map<SimHitFullKey, size_t> SimHitRefKeyToIndex;
284 
285  enum class HitType {
286  Pixel = 0,
287  Strip = 1,
288  Glued = 2,
289  Invalid = 3,
290  Phase2OT = 4,
291  Unknown = 99
292  };
293 
294  // This gives the "best" classification of a reco hit
295  // In case of reco hit mathing to multiple sim, smaller number is
296  // considered better
297  // To be kept in synch with class HitSimType in ntuple.py
298  enum class HitSimType {
299  Signal = 0,
300  ITPileup = 1,
301  OOTPileup = 2,
302  Noise = 3,
303  Unknown = 99
304  };
305 
306  struct TPHitIndex {
307  TPHitIndex(unsigned int tp=0, unsigned int simHit=0, float to=0, unsigned int id=0): tpKey(tp), simHitIdx(simHit), tof(to), detId(id) {}
308  unsigned int tpKey;
309  unsigned int simHitIdx;
310  float tof;
311  unsigned int detId;
312  };
313  static bool tpHitIndexListLess(const TPHitIndex& i, const TPHitIndex& j) { return (i.tpKey < j.tpKey); }
314  static bool tpHitIndexListLessSort(const TPHitIndex& i, const TPHitIndex& j) {
315  if(i.tpKey == j.tpKey) {
317  return i.detId < j.detId;
318  }
319  return i.tof < j.tof; // works as intended if either one is NaN
320  }
321  return i.tpKey < j.tpKey;
322  }
323 
324  void fillBeamSpot(const reco::BeamSpot& bs);
325  void fillPixelHits(const edm::Event& iEvent,
326  const ClusterTPAssociation& clusterToTPMap,
327  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
329  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
330  const TransientTrackingRecHitBuilder& theTTRHBuilder,
331  const TrackerTopology& tTopo,
332  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
333  std::set<edm::ProductID>& hitProductIds
334  );
335 
336  void fillStripRphiStereoHits(const edm::Event& iEvent,
337  const ClusterTPAssociation& clusterToTPMap,
338  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
340  const edm::DetSetVector<StripDigiSimLink>& digiSimLink,
341  const TransientTrackingRecHitBuilder& theTTRHBuilder,
342  const TrackerTopology& tTopo,
343  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
344  std::set<edm::ProductID>& hitProductIds
345  );
346 
347  void fillStripMatchedHits(const edm::Event& iEvent,
348  const TransientTrackingRecHitBuilder& theTTRHBuilder,
349  const TrackerTopology& tTopo,
350  std::vector<std::pair<int, int> >& monoStereoClusterList
351  );
352 
353  void fillPhase2OTHits(const edm::Event& iEvent,
354  const ClusterTPAssociation& clusterToTPMap,
355  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
357  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
358  const TransientTrackingRecHitBuilder& theTTRHBuilder,
359  const TrackerTopology& tTopo,
360  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
361  std::set<edm::ProductID>& hitProductIds
362  );
363 
364  void fillSeeds(const edm::Event& iEvent,
365  const TrackingParticleRefVector& tpCollection,
366  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
367  const reco::BeamSpot& bs,
368  const reco::TrackToTrackingParticleAssociator& associatorByHits,
369  const TransientTrackingRecHitBuilder& theTTRHBuilder,
370  const MagneticField *theMF,
371  const std::vector<std::pair<int, int> >& monoStereoClusterList,
372  const std::set<edm::ProductID>& hitProductIds,
373  std::map<edm::ProductID, size_t>& seedToCollIndex
374  );
375 
377  const TrackingParticleRefVector& tpCollection,
378  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
379  const reco::BeamSpot& bs,
380  const reco::TrackToTrackingParticleAssociator& associatorByHits,
381  const TransientTrackingRecHitBuilder& theTTRHBuilder,
382  const TrackerTopology& tTopo,
383  const std::set<edm::ProductID>& hitProductIds,
384  const std::map<edm::ProductID, size_t>& seedToCollIndex
385  );
386 
387  void fillSimHits(const TrackerGeometry& tracker,
388  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
390  const TrackerTopology& tTopo,
391  SimHitRefKeyToIndex& simHitRefKeyToIndex,
392  std::vector<TPHitIndex>& tpHitList);
393 
394  void fillTrackingParticles(const edm::Event& iEvent, const edm::EventSetup& iSetup,
395  const edm::RefToBaseVector<reco::Track>& tracks,
396  const TrackingParticleRefVector& tpCollection,
397  const TrackingVertexRefKeyToIndex& tvKeyToIndex,
398  const reco::TrackToTrackingParticleAssociator& associatorByHits,
399  const std::vector<TPHitIndex>& tpHitList
400  );
401 
402  void fillVertices(const reco::VertexCollection& vertices,
403  const edm::RefToBaseVector<reco::Track>& tracks);
404 
405  void fillTrackingVertices(const TrackingVertexRefVector& trackingVertices,
406  const TrackingParticleRefKeyToIndex& tpKeyToIndex
407  );
408 
409 
410 
411  struct SimHitData {
412  std::vector<int> matchingSimHit;
413  std::vector<float> chargeFraction;
414  std::vector<int> bunchCrossing;
415  std::vector<int> event;
417  };
418 
419  template <typename SimLink>
420  SimHitData matchCluster(const OmniClusterRef& cluster,
421  DetId hitId, int clusterKey,
423  const ClusterTPAssociation& clusterToTPMap,
424  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
426  const edm::DetSetVector<SimLink>& digiSimLinks,
427  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
428  HitType hitType
429  );
430 
431  // ----------member data ---------------------------
432  std::vector<edm::EDGetTokenT<edm::View<reco::Track> > > seedTokens_;
442  bool includeStripHits_, includePhase2OTHits_;
456  const bool includeSeeds_;
457  const bool includeAllHits_;
458 
459  TTree* t;
460  // event
464 
466  // tracks
467  // (first) index runs through tracks
468  std::vector<float> trk_px ;
469  std::vector<float> trk_py ;
470  std::vector<float> trk_pz ;
471  std::vector<float> trk_pt ;
472  std::vector<float> trk_inner_px ;
473  std::vector<float> trk_inner_py ;
474  std::vector<float> trk_inner_pz ;
475  std::vector<float> trk_inner_pt ;
476  std::vector<float> trk_outer_px ;
477  std::vector<float> trk_outer_py ;
478  std::vector<float> trk_outer_pz ;
479  std::vector<float> trk_outer_pt ;
480  std::vector<float> trk_eta ;
481  std::vector<float> trk_lambda ;
482  std::vector<float> trk_cotTheta ;
483  std::vector<float> trk_phi ;
484  std::vector<float> trk_dxy ;
485  std::vector<float> trk_dz ;
486  std::vector<float> trk_ptErr ;
487  std::vector<float> trk_etaErr ;
488  std::vector<float> trk_lambdaErr;
489  std::vector<float> trk_phiErr ;
490  std::vector<float> trk_dxyErr ;
491  std::vector<float> trk_dzErr ;
492  std::vector<float> trk_refpoint_x;
493  std::vector<float> trk_refpoint_y;
494  std::vector<float> trk_refpoint_z;
495  std::vector<float> trk_nChi2 ;
496  std::vector<int> trk_q ;
497  std::vector<unsigned int> trk_nValid ;
498  std::vector<unsigned int> trk_nInvalid;
499  std::vector<unsigned int> trk_nPixel ;
500  std::vector<unsigned int> trk_nStrip ;
501  std::vector<unsigned int> trk_nPixelLay;
502  std::vector<unsigned int> trk_nStripLay;
503  std::vector<unsigned int> trk_n3DLay ;
504  std::vector<unsigned int> trk_nOuterLost;
505  std::vector<unsigned int> trk_nInnerLost;
506  std::vector<unsigned int> trk_algo ;
507  std::vector<unsigned int> trk_originalAlgo;
508  std::vector<decltype(reco::TrackBase().algoMaskUL())> trk_algoMask;
509  std::vector<unsigned int> trk_stopReason;
510  std::vector<short> trk_isHP ;
511  std::vector<int> trk_seedIdx ;
512  std::vector<int> trk_vtxIdx;
513  std::vector<std::vector<float> > trk_shareFrac; // second index runs through matched TrackingParticles
514  std::vector<std::vector<int> > trk_simTrkIdx; // second index runs through matched TrackingParticles
515  std::vector<std::vector<int> > trk_hitIdx; // second index runs through hits
516  std::vector<std::vector<int> > trk_hitType; // second index runs through hits
518  // sim tracks
519  // (first) index runs through TrackingParticles
520  std::vector<int> sim_event ;
521  std::vector<int> sim_bunchCrossing;
522  std::vector<int> sim_pdgId ;
523  std::vector<float> sim_px ;
524  std::vector<float> sim_py ;
525  std::vector<float> sim_pz ;
526  std::vector<float> sim_pt ;
527  std::vector<float> sim_eta ;
528  std::vector<float> sim_phi ;
529  std::vector<float> sim_pca_pt ;
530  std::vector<float> sim_pca_eta ;
531  std::vector<float> sim_pca_lambda;
532  std::vector<float> sim_pca_cotTheta;
533  std::vector<float> sim_pca_phi ;
534  std::vector<float> sim_pca_dxy ;
535  std::vector<float> sim_pca_dz ;
536  std::vector<int> sim_q ;
537  std::vector<unsigned int> sim_nValid ;
538  std::vector<unsigned int> sim_nPixel ;
539  std::vector<unsigned int> sim_nStrip ;
540  std::vector<unsigned int> sim_nLay;
541  std::vector<unsigned int> sim_nPixelLay;
542  std::vector<unsigned int> sim_n3DLay ;
543  std::vector<std::vector<int> > sim_trkIdx; // second index runs through matched tracks
544  std::vector<std::vector<float> > sim_shareFrac; // second index runs through matched tracks
545  std::vector<int> sim_parentVtxIdx;
546  std::vector<std::vector<int> > sim_decayVtxIdx; // second index runs through decay vertices
547  std::vector<std::vector<int> > sim_simHitIdx; // second index runs through SimHits
549  // pixel hits
550  // (first) index runs through hits
551  std::vector<short> pix_isBarrel ;
552  std::vector<unsigned short> pix_det ;
553  std::vector<unsigned short> pix_lay ;
554  std::vector<unsigned int> pix_detId ;
555  std::vector<std::vector<int> > pix_trkIdx; // second index runs through tracks containing this hit
556  std::vector<std::vector<int> > pix_seeIdx; // second index runs through seeds containing this hit
557  std::vector<std::vector<int> > pix_simHitIdx; // second index runs through SimHits inducing this hit
558  std::vector<std::vector<float> > pix_chargeFraction; // second index runs through SimHits inducing this hit
559  std::vector<unsigned short> pix_simType;
560  std::vector<float> pix_x ;
561  std::vector<float> pix_y ;
562  std::vector<float> pix_z ;
563  std::vector<float> pix_xx ;
564  std::vector<float> pix_xy ;
565  std::vector<float> pix_yy ;
566  std::vector<float> pix_yz ;
567  std::vector<float> pix_zz ;
568  std::vector<float> pix_zx ;
569  std::vector<float> pix_radL ; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
570  std::vector<float> pix_bbxi ;
572  // strip hits
573  // (first) index runs through hits
574  std::vector<short> str_isBarrel ;
575  std::vector<short> str_isStereo ;
576  std::vector<unsigned short> str_det ;
577  std::vector<unsigned short> str_lay ;
578  std::vector<unsigned int> str_detId ;
579  std::vector<std::vector<int> > str_trkIdx; // second index runs through tracks containing this hit
580  std::vector<std::vector<int> > str_seeIdx; // second index runs through seeds containing this hitw
581  std::vector<std::vector<int> > str_simHitIdx; // second index runs through SimHits inducing this hit
582  std::vector<std::vector<float> > str_chargeFraction; // second index runs through SimHits inducing this hit
583  std::vector<unsigned short> str_simType;
584  std::vector<float> str_x ;
585  std::vector<float> str_y ;
586  std::vector<float> str_z ;
587  std::vector<float> str_xx ;
588  std::vector<float> str_xy ;
589  std::vector<float> str_yy ;
590  std::vector<float> str_yz ;
591  std::vector<float> str_zz ;
592  std::vector<float> str_zx ;
593  std::vector<float> str_radL ; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
594  std::vector<float> str_bbxi ;
596  // strip matched hits
597  // (first) index runs through hits
598  std::vector<short> glu_isBarrel ;
599  std::vector<unsigned int> glu_det ;
600  std::vector<unsigned int> glu_lay ;
601  std::vector<unsigned int> glu_detId ;
602  std::vector<int> glu_monoIdx ;
603  std::vector<int> glu_stereoIdx;
604  std::vector<std::vector<int> > glu_seeIdx; // second index runs through seeds containing this hit
605  std::vector<float> glu_x ;
606  std::vector<float> glu_y ;
607  std::vector<float> glu_z ;
608  std::vector<float> glu_xx ;
609  std::vector<float> glu_xy ;
610  std::vector<float> glu_yy ;
611  std::vector<float> glu_yz ;
612  std::vector<float> glu_zz ;
613  std::vector<float> glu_zx ;
614  std::vector<float> glu_radL ; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
615  std::vector<float> glu_bbxi ;
617  // phase2 Outer Tracker hits
618  // (first) index runs through hits
619  std::vector<short> ph2_isBarrel ;
620  std::vector<unsigned short> ph2_det ;
621  std::vector<unsigned short> ph2_lay ;
622  std::vector<unsigned int> ph2_detId ;
623  std::vector<std::vector<int> > ph2_trkIdx; // second index runs through tracks containing this hit
624  std::vector<std::vector<int> > ph2_seeIdx; // second index runs through seeds containing this hit
625  std::vector<std::vector<int> > ph2_simHitIdx; // second index runs through SimHits inducing this hit
626  //std::vector<std::vector<float> > ph2_chargeFraction; // Not supported at the moment for Phase2
627  std::vector<unsigned short> ph2_simType;
628  std::vector<float> ph2_x ;
629  std::vector<float> ph2_y ;
630  std::vector<float> ph2_z ;
631  std::vector<float> ph2_xx ;
632  std::vector<float> ph2_xy ;
633  std::vector<float> ph2_yy ;
634  std::vector<float> ph2_yz ;
635  std::vector<float> ph2_zz ;
636  std::vector<float> ph2_zx ;
637  std::vector<float> ph2_radL ; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h
638  std::vector<float> ph2_bbxi ;
639 
641  // invalid (missing/inactive/etc) hits
642  // (first) index runs through hits
643  std::vector<short> inv_isBarrel;
644  std::vector<unsigned short> inv_det;
645  std::vector<unsigned short> inv_lay;
646  std::vector<unsigned int> inv_detId;
647  std::vector<unsigned short> inv_type;
649  // sim hits
650  // (first) index runs through hits
651  std::vector<unsigned short> simhit_det;
652  std::vector<unsigned short> simhit_lay;
653  std::vector<unsigned int> simhit_detId;
654  std::vector<float> simhit_x;
655  std::vector<float> simhit_y;
656  std::vector<float> simhit_z;
657  std::vector<int> simhit_particle;
658  std::vector<short> simhit_process;
659  std::vector<float> simhit_eloss;
660  std::vector<float> simhit_tof;
661  //std::vector<unsigned int> simhit_simTrackId; // can be useful for debugging, but not much of general interest
662  std::vector<int> simhit_simTrkIdx;
663  std::vector<std::vector<int> > simhit_hitIdx; // second index runs through induced reco hits
664  std::vector<std::vector<int> > simhit_hitType; // second index runs through induced reco hits
666  // beam spot
667  float bsp_x;
668  float bsp_y;
669  float bsp_z;
670  float bsp_sigmax;
671  float bsp_sigmay;
672  float bsp_sigmaz;
674  // seeds
675  // (first) index runs through seeds
676  std::vector<short> see_fitok ;
677  std::vector<float> see_px ;
678  std::vector<float> see_py ;
679  std::vector<float> see_pz ;
680  std::vector<float> see_pt ;
681  std::vector<float> see_eta ;
682  std::vector<float> see_phi ;
683  std::vector<float> see_dxy ;
684  std::vector<float> see_dz ;
685  std::vector<float> see_ptErr ;
686  std::vector<float> see_etaErr ;
687  std::vector<float> see_phiErr ;
688  std::vector<float> see_dxyErr ;
689  std::vector<float> see_dzErr ;
690  std::vector<float> see_chi2 ;
691  std::vector<int> see_q ;
692  std::vector<unsigned int> see_nValid ;
693  std::vector<unsigned int> see_nPixel ;
694  std::vector<unsigned int> see_nGlued ;
695  std::vector<unsigned int> see_nStrip ;
696  std::vector<unsigned int> see_nPhase2OT;
697  std::vector<unsigned int> see_algo ;
698  std::vector<int> see_trkIdx;
699  std::vector<std::vector<float> > see_shareFrac; // second index runs through matched TrackingParticles
700  std::vector<std::vector<int> > see_simTrkIdx; // second index runs through matched TrackingParticles
701  std::vector<std::vector<int> > see_hitIdx; // second index runs through hits
702  std::vector<std::vector<int> > see_hitType; // second index runs through hits
703  //seed algo offset, index runs through iterations
704  std::vector<unsigned int> see_offset ;
705 
706 
708  // Vertices
709  // (first) index runs through vertices
710  std::vector<float> vtx_x;
711  std::vector<float> vtx_y;
712  std::vector<float> vtx_z;
713  std::vector<float> vtx_xErr;
714  std::vector<float> vtx_yErr;
715  std::vector<float> vtx_zErr;
716  std::vector<float> vtx_ndof;
717  std::vector<float> vtx_chi2;
718  std::vector<short> vtx_fake;
719  std::vector<short> vtx_valid;
720  std::vector<std::vector<int> > vtx_trkIdx; // second index runs through tracks used in the vertex fit
721 
723  // Tracking vertices
724  // (first) index runs through TrackingVertices
725  std::vector<int> simvtx_event;
726  std::vector<int> simvtx_bunchCrossing;
727  std::vector<unsigned int> simvtx_processType; // only from first SimVertex of TrackingVertex
728  std::vector<float> simvtx_x;
729  std::vector<float> simvtx_y;
730  std::vector<float> simvtx_z;
731  std::vector<std::vector<int> > simvtx_sourceSimIdx; // second index runs through source TrackingParticles
732  std::vector<std::vector<int> > simvtx_daughterSimIdx; // second index runs through daughter TrackingParticles
733  std::vector<int> simpv_idx;
734 };
735 
736 //
737 // constructors and destructor
738 //
740  seedTokens_(edm::vector_transform(iConfig.getUntrackedParameter<std::vector<edm::InputTag> >("seedTracks"), [&](const edm::InputTag& tag) {
741  return consumes<edm::View<reco::Track> >(tag);
742  })),
743  trackToken_(consumes<edm::View<reco::Track> >(iConfig.getUntrackedParameter<edm::InputTag>("tracks"))),
744  clusterTPMapToken_(consumes<ClusterTPAssociation>(iConfig.getUntrackedParameter<edm::InputTag>("clusterTPMap"))),
745  simHitTPMapToken_(consumes<SimHitTPAssociationProducer::SimHitTPAssociationList>(iConfig.getUntrackedParameter<edm::InputTag>("simHitTPMap"))),
746  trackAssociatorToken_(consumes<reco::TrackToTrackingParticleAssociator>(iConfig.getUntrackedParameter<edm::InputTag>("trackAssociator"))),
747  pixelSimLinkToken_(consumes<edm::DetSetVector<PixelDigiSimLink> >(iConfig.getUntrackedParameter<edm::InputTag>("pixelDigiSimLink"))),
748  stripSimLinkToken_(consumes<edm::DetSetVector<StripDigiSimLink> >(iConfig.getUntrackedParameter<edm::InputTag>("stripDigiSimLink"))),
749  siphase2OTSimLinksToken_(consumes<edm::DetSetVector<PixelDigiSimLink> >(iConfig.getUntrackedParameter<edm::InputTag>("phase2OTSimLink"))),
750  includeStripHits_(iConfig.getUntrackedParameter<edm::InputTag>("stripDigiSimLink").label() != ""),
751  includePhase2OTHits_(iConfig.getUntrackedParameter<edm::InputTag>("phase2OTSimLink").label() != ""),
752  beamSpotToken_(consumes<reco::BeamSpot>(iConfig.getUntrackedParameter<edm::InputTag>("beamSpot"))),
753  pixelRecHitToken_(consumes<SiPixelRecHitCollection>(iConfig.getUntrackedParameter<edm::InputTag>("pixelRecHits"))),
754  stripRphiRecHitToken_(consumes<SiStripRecHit2DCollection>(iConfig.getUntrackedParameter<edm::InputTag>("stripRphiRecHits"))),
755  stripStereoRecHitToken_(consumes<SiStripRecHit2DCollection>(iConfig.getUntrackedParameter<edm::InputTag>("stripStereoRecHits"))),
756  stripMatchedRecHitToken_(consumes<SiStripMatchedRecHit2DCollection>(iConfig.getUntrackedParameter<edm::InputTag>("stripMatchedRecHits"))),
757  phase2OTRecHitToken_(consumes<Phase2TrackerRecHit1DCollectionNew>(iConfig.getUntrackedParameter<edm::InputTag>("phase2OTRecHits"))),
758  vertexToken_(consumes<reco::VertexCollection>(iConfig.getUntrackedParameter<edm::InputTag>("vertices"))),
759  trackingVertexToken_(consumes<TrackingVertexCollection>(iConfig.getUntrackedParameter<edm::InputTag>("trackingVertices"))),
760  tpNLayersToken_(consumes<edm::ValueMap<unsigned int> >(iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNlayers"))),
761  tpNPixelLayersToken_(consumes<edm::ValueMap<unsigned int> >(iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNpixellayers"))),
762  tpNStripStereoLayersToken_(consumes<edm::ValueMap<unsigned int> >(iConfig.getUntrackedParameter<edm::InputTag>("trackingParticleNstripstereolayers"))),
763  builderName_(iConfig.getUntrackedParameter<std::string>("TTRHBuilder")),
764  parametersDefinerName_(iConfig.getUntrackedParameter<std::string>("parametersDefiner")),
765  includeSeeds_(iConfig.getUntrackedParameter<bool>("includeSeeds")),
766  includeAllHits_(iConfig.getUntrackedParameter<bool>("includeAllHits"))
767 {
768  const bool tpRef = iConfig.getUntrackedParameter<bool>("trackingParticlesRef");
769  const auto tpTag = iConfig.getUntrackedParameter<edm::InputTag>("trackingParticles");
770  if(tpRef) {
771  trackingParticleRefToken_ = consumes<TrackingParticleRefVector>(tpTag);
772  }
773  else {
774  trackingParticleToken_ = consumes<TrackingParticleCollection>(tpTag);
775  }
776 
777  usesResource(TFileService::kSharedResource);
779  t = fs->make<TTree>("tree","tree");
780 
781  t->Branch("event" , &ev_event);
782  t->Branch("lumi" , &ev_lumi);
783  t->Branch("run" , &ev_run);
784 
785  //tracks
786  t->Branch("trk_px" , &trk_px);
787  t->Branch("trk_py" , &trk_py);
788  t->Branch("trk_pz" , &trk_pz);
789  t->Branch("trk_pt" , &trk_pt);
790  t->Branch("trk_inner_px" , &trk_inner_px);
791  t->Branch("trk_inner_py" , &trk_inner_py);
792  t->Branch("trk_inner_pz" , &trk_inner_pz);
793  t->Branch("trk_inner_pt" , &trk_inner_pt);
794  t->Branch("trk_outer_px" , &trk_outer_px);
795  t->Branch("trk_outer_py" , &trk_outer_py);
796  t->Branch("trk_outer_pz" , &trk_outer_pz);
797  t->Branch("trk_outer_pt" , &trk_outer_pt);
798  t->Branch("trk_eta" , &trk_eta);
799  t->Branch("trk_lambda" , &trk_lambda);
800  t->Branch("trk_cotTheta" , &trk_cotTheta);
801  t->Branch("trk_phi" , &trk_phi);
802  t->Branch("trk_dxy" , &trk_dxy );
803  t->Branch("trk_dz" , &trk_dz );
804  t->Branch("trk_ptErr" , &trk_ptErr );
805  t->Branch("trk_etaErr" , &trk_etaErr );
806  t->Branch("trk_lambdaErr", &trk_lambdaErr);
807  t->Branch("trk_phiErr" , &trk_phiErr );
808  t->Branch("trk_dxyErr" , &trk_dxyErr );
809  t->Branch("trk_dzErr" , &trk_dzErr );
810  t->Branch("trk_refpoint_x", &trk_refpoint_x);
811  t->Branch("trk_refpoint_y", &trk_refpoint_y);
812  t->Branch("trk_refpoint_z", &trk_refpoint_z);
813  t->Branch("trk_nChi2" , &trk_nChi2);
814  t->Branch("trk_q" , &trk_q);
815  t->Branch("trk_nValid" , &trk_nValid );
816  t->Branch("trk_nInvalid" , &trk_nInvalid);
817  t->Branch("trk_nPixel" , &trk_nPixel );
818  t->Branch("trk_nStrip" , &trk_nStrip );
819  t->Branch("trk_nPixelLay", &trk_nPixelLay);
820  t->Branch("trk_nStripLay", &trk_nStripLay);
821  t->Branch("trk_n3DLay" , &trk_n3DLay );
822  t->Branch("trk_nOuterLost", &trk_nOuterLost );
823  t->Branch("trk_nInnerLost", &trk_nInnerLost );
824  t->Branch("trk_algo" , &trk_algo );
825  t->Branch("trk_originalAlgo", &trk_originalAlgo);
826  t->Branch("trk_algoMask" , &trk_algoMask);
827  t->Branch("trk_stopReason", &trk_stopReason);
828  t->Branch("trk_isHP" , &trk_isHP );
829  if(includeSeeds_) {
830  t->Branch("trk_seedIdx" , &trk_seedIdx );
831  }
832  t->Branch("trk_vtxIdx" , &trk_vtxIdx);
833  t->Branch("trk_shareFrac", &trk_shareFrac);
834  t->Branch("trk_simTrkIdx", &trk_simTrkIdx );
835  if(includeAllHits_) {
836  t->Branch("trk_hitIdx" , &trk_hitIdx);
837  t->Branch("trk_hitType", &trk_hitType);
838  }
839  //sim tracks
840  t->Branch("sim_event" , &sim_event );
841  t->Branch("sim_bunchCrossing", &sim_bunchCrossing);
842  t->Branch("sim_pdgId" , &sim_pdgId );
843  t->Branch("sim_px" , &sim_px );
844  t->Branch("sim_py" , &sim_py );
845  t->Branch("sim_pz" , &sim_pz );
846  t->Branch("sim_pt" , &sim_pt );
847  t->Branch("sim_eta" , &sim_eta );
848  t->Branch("sim_phi" , &sim_phi );
849  t->Branch("sim_pca_pt" , &sim_pca_pt );
850  t->Branch("sim_pca_eta" , &sim_pca_eta );
851  t->Branch("sim_pca_lambda", &sim_pca_lambda);
852  t->Branch("sim_pca_cotTheta", &sim_pca_cotTheta);
853  t->Branch("sim_pca_phi" , &sim_pca_phi );
854  t->Branch("sim_pca_dxy" , &sim_pca_dxy );
855  t->Branch("sim_pca_dz" , &sim_pca_dz );
856  t->Branch("sim_q" , &sim_q );
857  t->Branch("sim_nValid" , &sim_nValid );
858  t->Branch("sim_nPixel" , &sim_nPixel );
859  t->Branch("sim_nStrip" , &sim_nStrip );
860  t->Branch("sim_nLay" , &sim_nLay );
861  t->Branch("sim_nPixelLay", &sim_nPixelLay);
862  t->Branch("sim_n3DLay" , &sim_n3DLay );
863  t->Branch("sim_trkIdx" , &sim_trkIdx );
864  t->Branch("sim_shareFrac", &sim_shareFrac);
865  t->Branch("sim_parentVtxIdx", &sim_parentVtxIdx);
866  t->Branch("sim_decayVtxIdx", &sim_decayVtxIdx);
867  if(includeAllHits_) {
868  t->Branch("sim_simHitIdx" , &sim_simHitIdx );
869  }
870  if(includeAllHits_) {
871  //pixels
872  t->Branch("pix_isBarrel" , &pix_isBarrel );
873  t->Branch("pix_det" , &pix_det );
874  t->Branch("pix_lay" , &pix_lay );
875  t->Branch("pix_detId" , &pix_detId );
876  t->Branch("pix_trkIdx" , &pix_trkIdx );
877  if(includeSeeds_) {
878  t->Branch("pix_seeIdx" , &pix_seeIdx );
879  }
880  t->Branch("pix_simHitIdx" , &pix_simHitIdx);
881  t->Branch("pix_chargeFraction", &pix_chargeFraction);
882  t->Branch("pix_simType", &pix_simType);
883  t->Branch("pix_x" , &pix_x );
884  t->Branch("pix_y" , &pix_y );
885  t->Branch("pix_z" , &pix_z );
886  t->Branch("pix_xx" , &pix_xx );
887  t->Branch("pix_xy" , &pix_xy );
888  t->Branch("pix_yy" , &pix_yy );
889  t->Branch("pix_yz" , &pix_yz );
890  t->Branch("pix_zz" , &pix_zz );
891  t->Branch("pix_zx" , &pix_zx );
892  t->Branch("pix_radL" , &pix_radL );
893  t->Branch("pix_bbxi" , &pix_bbxi );
894  t->Branch("pix_bbxi" , &pix_bbxi );
895  //strips
896  if(includeStripHits_){
897  t->Branch("str_isBarrel" , &str_isBarrel );
898  t->Branch("str_isStereo" , &str_isStereo );
899  t->Branch("str_det" , &str_det );
900  t->Branch("str_lay" , &str_lay );
901  t->Branch("str_detId" , &str_detId );
902  t->Branch("str_trkIdx" , &str_trkIdx );
903  if(includeSeeds_) {
904  t->Branch("str_seeIdx" , &str_seeIdx );
905  }
906  t->Branch("str_simHitIdx" , &str_simHitIdx);
907  t->Branch("str_chargeFraction", &str_chargeFraction);
908  t->Branch("str_simType", &str_simType);
909  t->Branch("str_x" , &str_x );
910  t->Branch("str_y" , &str_y );
911  t->Branch("str_z" , &str_z );
912  t->Branch("str_xx" , &str_xx );
913  t->Branch("str_xy" , &str_xy );
914  t->Branch("str_yy" , &str_yy );
915  t->Branch("str_yz" , &str_yz );
916  t->Branch("str_zz" , &str_zz );
917  t->Branch("str_zx" , &str_zx );
918  t->Branch("str_radL" , &str_radL );
919  t->Branch("str_bbxi" , &str_bbxi );
920  //matched hits
921  t->Branch("glu_isBarrel" , &glu_isBarrel );
922  t->Branch("glu_det" , &glu_det );
923  t->Branch("glu_lay" , &glu_lay );
924  t->Branch("glu_detId" , &glu_detId );
925  t->Branch("glu_monoIdx" , &glu_monoIdx );
926  t->Branch("glu_stereoIdx" , &glu_stereoIdx);
927  if(includeSeeds_) {
928  t->Branch("glu_seeIdx" , &glu_seeIdx );
929  }
930  t->Branch("glu_x" , &glu_x );
931  t->Branch("glu_y" , &glu_y );
932  t->Branch("glu_z" , &glu_z );
933  t->Branch("glu_xx" , &glu_xx );
934  t->Branch("glu_xy" , &glu_xy );
935  t->Branch("glu_yy" , &glu_yy );
936  t->Branch("glu_yz" , &glu_yz );
937  t->Branch("glu_zz" , &glu_zz );
938  t->Branch("glu_zx" , &glu_zx );
939  t->Branch("glu_radL" , &glu_radL );
940  t->Branch("glu_bbxi" , &glu_bbxi );
941  }
942  //phase2 OT
943  if(includePhase2OTHits_){
944  t->Branch("ph2_isBarrel" , &ph2_isBarrel );
945  t->Branch("ph2_det" , &ph2_det );
946  t->Branch("ph2_lay" , &ph2_lay );
947  t->Branch("ph2_detId" , &ph2_detId );
948  t->Branch("ph2_trkIdx" , &ph2_trkIdx );
949  if(includeSeeds_) {
950  t->Branch("ph2_seeIdx" , &ph2_seeIdx );
951  }
952  t->Branch("ph2_simHitIdx" , &ph2_simHitIdx);
953  t->Branch("ph2_simType", &ph2_simType);
954  t->Branch("ph2_x" , &ph2_x );
955  t->Branch("ph2_y" , &ph2_y );
956  t->Branch("ph2_z" , &ph2_z );
957  t->Branch("ph2_xx" , &ph2_xx );
958  t->Branch("ph2_xy" , &ph2_xy );
959  t->Branch("ph2_yy" , &ph2_yy );
960  t->Branch("ph2_yz" , &ph2_yz );
961  t->Branch("ph2_zz" , &ph2_zz );
962  t->Branch("ph2_zx" , &ph2_zx );
963  t->Branch("ph2_radL" , &ph2_radL );
964  t->Branch("ph2_bbxi" , &ph2_bbxi );
965  t->Branch("ph2_bbxi" , &ph2_bbxi );
966  }
967  //invalid hits
968  t->Branch("inv_isBarrel" , &inv_isBarrel );
969  t->Branch("inv_det" , &inv_det );
970  t->Branch("inv_lay" , &inv_lay );
971  t->Branch("inv_detId" , &inv_detId );
972  t->Branch("inv_type" , &inv_type );
973  //simhits
974  t->Branch("simhit_det" , &simhit_det);
975  t->Branch("simhit_lay" , &simhit_lay);
976  t->Branch("simhit_detId" , &simhit_detId);
977  t->Branch("simhit_x" , &simhit_x);
978  t->Branch("simhit_y" , &simhit_y);
979  t->Branch("simhit_z" , &simhit_z);
980  t->Branch("simhit_particle", &simhit_particle);
981  t->Branch("simhit_process" , &simhit_process);
982  t->Branch("simhit_eloss" , &simhit_eloss);
983  t->Branch("simhit_tof" , &simhit_tof);
984  //t->Branch("simhit_simTrackId", &simhit_simTrackId);
985  t->Branch("simhit_simTrkIdx", &simhit_simTrkIdx);
986  t->Branch("simhit_hitIdx" , &simhit_hitIdx);
987  t->Branch("simhit_hitType" , &simhit_hitType);
988  }
989  //beam spot
990  t->Branch("bsp_x" , &bsp_x , "bsp_x/F");
991  t->Branch("bsp_y" , &bsp_y , "bsp_y/F");
992  t->Branch("bsp_z" , &bsp_z , "bsp_z/F");
993  t->Branch("bsp_sigmax" , &bsp_sigmax , "bsp_sigmax/F");
994  t->Branch("bsp_sigmay" , &bsp_sigmay , "bsp_sigmay/F");
995  t->Branch("bsp_sigmaz" , &bsp_sigmaz , "bsp_sigmaz/F");
996  if(includeSeeds_) {
997  //seeds
998  t->Branch("see_fitok" , &see_fitok );
999  t->Branch("see_px" , &see_px );
1000  t->Branch("see_py" , &see_py );
1001  t->Branch("see_pz" , &see_pz );
1002  t->Branch("see_pt" , &see_pt );
1003  t->Branch("see_eta" , &see_eta );
1004  t->Branch("see_phi" , &see_phi );
1005  t->Branch("see_dxy" , &see_dxy );
1006  t->Branch("see_dz" , &see_dz );
1007  t->Branch("see_ptErr" , &see_ptErr );
1008  t->Branch("see_etaErr" , &see_etaErr );
1009  t->Branch("see_phiErr" , &see_phiErr );
1010  t->Branch("see_dxyErr" , &see_dxyErr );
1011  t->Branch("see_dzErr" , &see_dzErr );
1012  t->Branch("see_chi2" , &see_chi2 );
1013  t->Branch("see_q" , &see_q );
1014  t->Branch("see_nValid" , &see_nValid );
1015  t->Branch("see_nPixel" , &see_nPixel );
1016  t->Branch("see_nGlued" , &see_nGlued );
1017  t->Branch("see_nStrip" , &see_nStrip );
1018  t->Branch("see_nPhase2OT", &see_nPhase2OT);
1019  t->Branch("see_algo" , &see_algo );
1020  t->Branch("see_trkIdx" , &see_trkIdx );
1021  t->Branch("see_shareFrac", &see_shareFrac);
1022  t->Branch("see_simTrkIdx", &see_simTrkIdx );
1023  if(includeAllHits_) {
1024  t->Branch("see_hitIdx" , &see_hitIdx );
1025  t->Branch("see_hitType", &see_hitType );
1026  }
1027  //seed algo offset
1028  t->Branch("see_offset" , &see_offset );
1029  }
1030 
1031  //vertices
1032  t->Branch("vtx_x" , &vtx_x);
1033  t->Branch("vtx_y" , &vtx_y);
1034  t->Branch("vtx_z" , &vtx_z);
1035  t->Branch("vtx_xErr" , &vtx_xErr);
1036  t->Branch("vtx_yErr" , &vtx_yErr);
1037  t->Branch("vtx_zErr" , &vtx_zErr);
1038  t->Branch("vtx_ndof" , &vtx_ndof);
1039  t->Branch("vtx_chi2" , &vtx_chi2);
1040  t->Branch("vtx_fake" , &vtx_fake);
1041  t->Branch("vtx_valid" , &vtx_valid);
1042  t->Branch("vtx_trkIdx" , &vtx_trkIdx);
1043 
1044  // tracking vertices
1045  t->Branch("simvtx_event" , &simvtx_event );
1046  t->Branch("simvtx_bunchCrossing", &simvtx_bunchCrossing);
1047  t->Branch("simvtx_processType", &simvtx_processType);
1048  t->Branch("simvtx_x" , &simvtx_x);
1049  t->Branch("simvtx_y" , &simvtx_y);
1050  t->Branch("simvtx_z" , &simvtx_z);
1051  t->Branch("simvtx_sourceSimIdx", &simvtx_sourceSimIdx);
1052  t->Branch("simvtx_daughterSimIdx", &simvtx_daughterSimIdx);
1053 
1054  t->Branch("simpv_idx" , &simpv_idx);
1055 
1056  //t->Branch("" , &);
1057 }
1058 
1059 
1061  // do anything here that needs to be done at desctruction time
1062  // (e.g. close files, deallocate resources etc.)
1063 }
1064 
1065 
1066 //
1067 // member functions
1068 //
1070 
1071  ev_run = 0;
1072  ev_lumi = 0;
1073  ev_event = 0;
1074 
1075  //tracks
1076  trk_px .clear();
1077  trk_py .clear();
1078  trk_pz .clear();
1079  trk_pt .clear();
1080  trk_inner_px .clear();
1081  trk_inner_py .clear();
1082  trk_inner_pz .clear();
1083  trk_inner_pt .clear();
1084  trk_outer_px .clear();
1085  trk_outer_py .clear();
1086  trk_outer_pz .clear();
1087  trk_outer_pt .clear();
1088  trk_eta .clear();
1089  trk_lambda .clear();
1090  trk_cotTheta .clear();
1091  trk_phi .clear();
1092  trk_dxy .clear();
1093  trk_dz .clear();
1094  trk_ptErr .clear();
1095  trk_etaErr .clear();
1096  trk_lambdaErr.clear();
1097  trk_phiErr .clear();
1098  trk_dxyErr .clear();
1099  trk_dzErr .clear();
1100  trk_refpoint_x.clear();
1101  trk_refpoint_y.clear();
1102  trk_refpoint_z.clear();
1103  trk_nChi2 .clear();
1104  trk_q .clear();
1105  trk_nValid .clear();
1106  trk_nInvalid .clear();
1107  trk_nPixel .clear();
1108  trk_nStrip .clear();
1109  trk_nPixelLay.clear();
1110  trk_nStripLay.clear();
1111  trk_n3DLay .clear();
1112  trk_nOuterLost.clear();
1113  trk_nInnerLost.clear();
1114  trk_algo .clear();
1115  trk_originalAlgo.clear();
1116  trk_algoMask .clear();
1117  trk_stopReason.clear();
1118  trk_isHP .clear();
1119  trk_seedIdx .clear();
1120  trk_vtxIdx .clear();
1121  trk_shareFrac.clear();
1122  trk_simTrkIdx.clear();
1123  trk_hitIdx .clear();
1124  trk_hitType .clear();
1125  //sim tracks
1126  sim_event .clear();
1127  sim_bunchCrossing.clear();
1128  sim_pdgId .clear();
1129  sim_px .clear();
1130  sim_py .clear();
1131  sim_pz .clear();
1132  sim_pt .clear();
1133  sim_eta .clear();
1134  sim_phi .clear();
1135  sim_pca_pt .clear();
1136  sim_pca_eta .clear();
1137  sim_pca_lambda.clear();
1138  sim_pca_cotTheta.clear();
1139  sim_pca_phi .clear();
1140  sim_pca_dxy .clear();
1141  sim_pca_dz .clear();
1142  sim_q .clear();
1143  sim_nValid .clear();
1144  sim_nPixel .clear();
1145  sim_nStrip .clear();
1146  sim_nLay .clear();
1147  sim_nPixelLay.clear();
1148  sim_n3DLay .clear();
1149  sim_trkIdx .clear();
1150  sim_shareFrac.clear();
1151  sim_parentVtxIdx.clear();
1152  sim_decayVtxIdx.clear();
1153  sim_simHitIdx .clear();
1154  //pixels
1155  pix_isBarrel .clear();
1156  pix_det .clear();
1157  pix_lay .clear();
1158  pix_detId .clear();
1159  pix_trkIdx .clear();
1160  pix_seeIdx .clear();
1161  pix_simHitIdx.clear();
1162  pix_chargeFraction.clear();
1163  pix_simType.clear();
1164  pix_x .clear();
1165  pix_y .clear();
1166  pix_z .clear();
1167  pix_xx .clear();
1168  pix_xy .clear();
1169  pix_yy .clear();
1170  pix_yz .clear();
1171  pix_zz .clear();
1172  pix_zx .clear();
1173  pix_radL .clear();
1174  pix_bbxi .clear();
1175  //strips
1176  str_isBarrel .clear();
1177  str_isStereo .clear();
1178  str_det .clear();
1179  str_lay .clear();
1180  str_detId .clear();
1181  str_trkIdx .clear();
1182  str_seeIdx .clear();
1183  str_simHitIdx.clear();
1184  str_chargeFraction.clear();
1185  str_simType.clear();
1186  str_x .clear();
1187  str_y .clear();
1188  str_z .clear();
1189  str_xx .clear();
1190  str_xy .clear();
1191  str_yy .clear();
1192  str_yz .clear();
1193  str_zz .clear();
1194  str_zx .clear();
1195  str_radL .clear();
1196  str_bbxi .clear();
1197  //matched hits
1198  glu_isBarrel .clear();
1199  glu_det .clear();
1200  glu_lay .clear();
1201  glu_detId .clear();
1202  glu_monoIdx .clear();
1203  glu_stereoIdx.clear();
1204  glu_seeIdx .clear();
1205  glu_x .clear();
1206  glu_y .clear();
1207  glu_z .clear();
1208  glu_xx .clear();
1209  glu_xy .clear();
1210  glu_yy .clear();
1211  glu_yz .clear();
1212  glu_zz .clear();
1213  glu_zx .clear();
1214  glu_radL .clear();
1215  glu_bbxi .clear();
1216  //phase2 OT
1217  ph2_isBarrel .clear();
1218  ph2_det .clear();
1219  ph2_lay .clear();
1220  ph2_detId .clear();
1221  ph2_trkIdx .clear();
1222  ph2_seeIdx .clear();
1223  ph2_simHitIdx.clear();
1224  ph2_simType.clear();
1225  ph2_x .clear();
1226  ph2_y .clear();
1227  ph2_z .clear();
1228  ph2_xx .clear();
1229  ph2_xy .clear();
1230  ph2_yy .clear();
1231  ph2_yz .clear();
1232  ph2_zz .clear();
1233  ph2_zx .clear();
1234  ph2_radL .clear();
1235  ph2_bbxi .clear();
1236  //invalid hits
1237  inv_isBarrel .clear();
1238  inv_det .clear();
1239  inv_lay .clear();
1240  inv_detId .clear();
1241  inv_type .clear();
1242  // simhits
1243  simhit_det.clear();
1244  simhit_lay.clear();
1245  simhit_detId.clear();
1246  simhit_x.clear();
1247  simhit_y.clear();
1248  simhit_z.clear();
1249  simhit_particle.clear();
1250  simhit_process.clear();
1251  simhit_eloss.clear();
1252  simhit_tof.clear();
1253  //simhit_simTrackId.clear();
1254  simhit_simTrkIdx.clear();
1255  simhit_hitIdx.clear();
1256  simhit_hitType.clear();
1257  //beamspot
1258  bsp_x = -9999.;
1259  bsp_y = -9999.;
1260  bsp_z = -9999.;
1261  bsp_sigmax = -9999.;
1262  bsp_sigmay = -9999.;
1263  bsp_sigmaz = -9999.;
1264  //seeds
1265  see_fitok .clear();
1266  see_px .clear();
1267  see_py .clear();
1268  see_pz .clear();
1269  see_pt .clear();
1270  see_eta .clear();
1271  see_phi .clear();
1272  see_dxy .clear();
1273  see_dz .clear();
1274  see_ptErr .clear();
1275  see_etaErr .clear();
1276  see_phiErr .clear();
1277  see_dxyErr .clear();
1278  see_dzErr .clear();
1279  see_chi2 .clear();
1280  see_q .clear();
1281  see_nValid .clear();
1282  see_nPixel .clear();
1283  see_nGlued .clear();
1284  see_nStrip .clear();
1285  see_nPhase2OT.clear();
1286  see_algo .clear();
1287  see_trkIdx .clear();
1288  see_shareFrac.clear();
1289  see_simTrkIdx.clear();
1290  see_hitIdx .clear();
1291  see_hitType .clear();
1292  //seed algo offset
1293  see_offset.clear();
1294 
1295  // vertices
1296  vtx_x.clear();
1297  vtx_y.clear();
1298  vtx_z.clear();
1299  vtx_xErr.clear();
1300  vtx_yErr.clear();
1301  vtx_zErr.clear();
1302  vtx_ndof.clear();
1303  vtx_chi2.clear();
1304  vtx_fake.clear();
1305  vtx_valid.clear();
1306  vtx_trkIdx.clear();
1307 
1308  // Tracking vertices
1309  simvtx_event.clear();
1310  simvtx_bunchCrossing.clear();
1311  simvtx_x.clear();
1312  simvtx_y.clear();
1313  simvtx_z.clear();
1314  simvtx_sourceSimIdx.clear();
1315  simvtx_daughterSimIdx.clear();
1316  simpv_idx.clear();
1317 }
1318 
1319 
1320 // ------------ method called for each event ------------
1321 void TrackingNtuple::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
1322 
1323  using namespace edm;
1324  using namespace reco;
1325  using namespace std;
1326 
1328  iSetup.get<IdealMagneticFieldRecord>().get(theMF);
1329 
1331  iSetup.get<TransientRecHitRecord>().get(builderName_,theTTRHBuilder);
1332 
1333  edm::ESHandle<TrackerTopology> tTopoHandle;
1334  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
1335  const TrackerTopology& tTopo = *tTopoHandle;
1336 
1337  edm::ESHandle<TrackerGeometry> geometryHandle;
1338  iSetup.get<TrackerDigiGeometryRecord>().get(geometryHandle);
1339  const TrackerGeometry &tracker = *geometryHandle;
1340 
1342  iEvent.getByToken(trackAssociatorToken_, theAssociator);
1343  const reco::TrackToTrackingParticleAssociator& associatorByHits = *theAssociator;
1344 
1345  LogDebug("TrackingNtuple") << "Analyzing new event";
1346 
1347  //initialize tree variables
1348  clearVariables();
1349 
1350  // FIXME: we really need to move to edm::View for reading the
1351  // TrackingParticles... Unfortunately it has non-trivial
1352  // consequences on the associator/association interfaces etc.
1354  TrackingParticleRefKeySet tmpTPkeys;
1355  const TrackingParticleRefVector *tmpTPptr = nullptr;
1357  edm::Handle<TrackingParticleRefVector> TPCollectionHRefVector;
1358 
1359  if(!trackingParticleToken_.isUninitialized()) {
1360  iEvent.getByToken(trackingParticleToken_, TPCollectionH);
1361  for(size_t i=0, size=TPCollectionH->size(); i<size; ++i) {
1362  tmpTP.push_back(TrackingParticleRef(TPCollectionH, i));
1363  }
1364  tmpTPptr = &tmpTP;
1365  }
1366  else {
1367  iEvent.getByToken(trackingParticleRefToken_, TPCollectionHRefVector);
1368  tmpTPptr = TPCollectionHRefVector.product();
1369  for(const auto& ref: *tmpTPptr) {
1370  tmpTPkeys.insert(ref.key());
1371  }
1372  }
1373  const TrackingParticleRefVector& tpCollection = *tmpTPptr;
1374 
1375  // Fill mapping from Ref::key() to index
1376  TrackingParticleRefKeyToIndex tpKeyToIndex;
1377  for(size_t i=0; i<tpCollection.size(); ++i) {
1378  tpKeyToIndex[tpCollection[i].key()] = i;
1379  }
1380 
1381  // tracking vertices
1383  iEvent.getByToken(trackingVertexToken_, htv);
1384  const TrackingVertexCollection& tvs = *htv;
1385 
1386  // Fill mapping from Ref::key() to index
1387  TrackingVertexRefVector tvRefs;
1388  TrackingVertexRefKeyToIndex tvKeyToIndex;
1389  for(size_t i=0; i<tvs.size(); ++i) {
1390  const TrackingVertex& v = tvs[i];
1391  if(v.eventId().bunchCrossing() != 0) // Ignore OOTPU; would be better to not to hardcode?
1392  continue;
1393  tvKeyToIndex[i] = tvRefs.size();
1394  tvRefs.push_back(TrackingVertexRef(htv, i));
1395  }
1396 
1397  //get association maps, etc.
1398  Handle<ClusterTPAssociation> pCluster2TPListH;
1399  iEvent.getByToken(clusterTPMapToken_, pCluster2TPListH);
1400  const ClusterTPAssociation& clusterToTPMap = *pCluster2TPListH;
1402  iEvent.getByToken(simHitTPMapToken_, simHitsTPAssoc);
1403 
1404  // SimHit key -> index mapping
1405  SimHitRefKeyToIndex simHitRefKeyToIndex;
1406 
1407  //make a list to link TrackingParticles to its simhits
1408  std::vector<TPHitIndex> tpHitList;
1409 
1410  std::set<edm::ProductID> hitProductIds;
1411  std::map<edm::ProductID, size_t> seedCollToOffset;
1412 
1413  ev_run = iEvent.id().run();
1414  ev_lumi = iEvent.id().luminosityBlock();
1415  ev_event = iEvent.id().event();
1416 
1417  // Digi->Sim links for pixels and strips
1418  edm::Handle<edm::DetSetVector<PixelDigiSimLink> > pixelDigiSimLinksHandle;
1419  iEvent.getByToken(pixelSimLinkToken_, pixelDigiSimLinksHandle);
1420  const auto& pixelDigiSimLinks = *pixelDigiSimLinksHandle;
1421 
1422  edm::Handle<edm::DetSetVector<StripDigiSimLink> > stripDigiSimLinksHandle;
1423  iEvent.getByToken(stripSimLinkToken_, stripDigiSimLinksHandle);
1424 
1425  // Phase2 OT DigiSimLink
1426  edm::Handle<edm::DetSetVector<PixelDigiSimLink> > siphase2OTSimLinksHandle;
1427  iEvent.getByToken(siphase2OTSimLinksToken_, siphase2OTSimLinksHandle);
1428 
1429  //beamspot
1430  Handle<reco::BeamSpot> recoBeamSpotHandle;
1431  iEvent.getByToken(beamSpotToken_, recoBeamSpotHandle);
1432  BeamSpot const & bs = *recoBeamSpotHandle;
1433  fillBeamSpot(bs);
1434 
1435 
1436  //prapare list to link matched hits to collection
1437  vector<pair<int,int> > monoStereoClusterList;
1438  if(includeAllHits_) {
1439  // simhits
1440  fillSimHits(tracker, tpKeyToIndex, *simHitsTPAssoc, tTopo, simHitRefKeyToIndex, tpHitList);
1441 
1442  //pixel hits
1443  fillPixelHits(iEvent, clusterToTPMap, tpKeyToIndex, *simHitsTPAssoc, pixelDigiSimLinks, *theTTRHBuilder, tTopo, simHitRefKeyToIndex, hitProductIds);
1444 
1445  //strip hits
1446  if(includeStripHits_){
1447  LogDebug("TrackingNtuple") << "foundStripSimLink" ;
1448  const auto& stripDigiSimLinks = *stripDigiSimLinksHandle;
1449  fillStripRphiStereoHits(iEvent, clusterToTPMap, tpKeyToIndex, *simHitsTPAssoc, stripDigiSimLinks, *theTTRHBuilder, tTopo, simHitRefKeyToIndex, hitProductIds);
1450 
1451  //matched hits
1452  fillStripMatchedHits(iEvent, *theTTRHBuilder, tTopo, monoStereoClusterList);
1453  }
1454 
1455  if(includePhase2OTHits_){
1456  LogDebug("TrackingNtuple") << "foundPhase2OTSimLinks" ;
1457  const auto& phase2OTSimLinks = *siphase2OTSimLinksHandle;
1458  fillPhase2OTHits(iEvent, clusterToTPMap, tpKeyToIndex, *simHitsTPAssoc, phase2OTSimLinks, *theTTRHBuilder, tTopo, simHitRefKeyToIndex, hitProductIds);
1459  }
1460  }
1461 
1462  //seeds
1463  if(includeSeeds_) {
1464  fillSeeds(iEvent, tpCollection, tpKeyToIndex, bs, associatorByHits, *theTTRHBuilder, theMF.product(), monoStereoClusterList, hitProductIds, seedCollToOffset);
1465  }
1466 
1467  //tracks
1468  edm::Handle<edm::View<reco::Track> > tracksHandle;
1469  iEvent.getByToken(trackToken_, tracksHandle);
1470  const edm::View<reco::Track>& tracks = *tracksHandle;
1471  // The associator interfaces really need to be fixed...
1473  for(edm::View<Track>::size_type i=0; i<tracks.size(); ++i) {
1474  trackRefs.push_back(tracks.refAt(i));
1475  }
1476  fillTracks(trackRefs, tpCollection, tpKeyToIndex, bs, associatorByHits, *theTTRHBuilder, tTopo, hitProductIds, seedCollToOffset);
1477 
1478  //tracking particles
1479  //sort association maps with simHits
1480  std::sort( tpHitList.begin(), tpHitList.end(), tpHitIndexListLessSort );
1481  fillTrackingParticles(iEvent, iSetup, trackRefs, tpCollection, tvKeyToIndex, associatorByHits, tpHitList);
1482 
1483  // vertices
1485  iEvent.getByToken(vertexToken_, vertices);
1486  fillVertices(*vertices, trackRefs);
1487 
1488  // tracking vertices
1489  fillTrackingVertices(tvRefs, tpKeyToIndex);
1490 
1491  t->Fill();
1492 
1493 }
1494 
1496  bsp_x = bs.x0();
1497  bsp_y = bs.y0();
1498  bsp_z = bs.x0();
1499  bsp_sigmax = bs.BeamWidthX();
1500  bsp_sigmay = bs.BeamWidthY();
1501  bsp_sigmaz = bs.sigmaZ();
1502 }
1503 
1504 namespace {
1505  template <typename SimLink> struct GetCluster;
1506  template <>
1507  struct GetCluster<PixelDigiSimLink> {
1508  static const SiPixelCluster& call(const OmniClusterRef& cluster) { return cluster.pixelCluster(); }
1509  };
1510  template <>
1511  struct GetCluster<StripDigiSimLink> {
1512  static const SiStripCluster& call(const OmniClusterRef& cluster) { return cluster.stripCluster(); }
1513  };
1514 }
1515 
1516 template <typename SimLink>
1518  DetId hitId, int clusterKey,
1520  const ClusterTPAssociation& clusterToTPMap,
1521  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
1523  const edm::DetSetVector<SimLink>& digiSimLinks,
1524  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
1525  HitType hitType
1526  ) {
1527  SimHitData ret;
1528 
1529  std::map<unsigned int, double> simTrackIdToChargeFraction;
1530  if(hitType == HitType::Phase2OT) simTrackIdToChargeFraction = chargeFraction(cluster.phase2OTCluster(), hitId, digiSimLinks);
1531  else simTrackIdToChargeFraction = chargeFraction(GetCluster<SimLink>::call(cluster), hitId, digiSimLinks);
1532 
1533  ret.type = HitSimType::Noise;
1534  auto range = clusterToTPMap.equal_range( cluster );
1535  if( range.first != range.second ) {
1536  for( auto ip=range.first; ip != range.second; ++ip ) {
1537  const TrackingParticleRef& trackingParticle = ip->second;
1538 
1539  // Find out if the cluster is from signal/ITPU/OOTPU
1540  const auto event = trackingParticle->eventId().event();
1541  const auto bx = trackingParticle->eventId().bunchCrossing();
1543  if(bx == 0) {
1544  type = (event == 0 ? HitSimType::Signal : HitSimType::ITPileup);
1545  }
1546  ret.type = static_cast<HitSimType>(std::min(static_cast<int>(ret.type), static_cast<int>(type)));
1547 
1548  // Limit to only input TrackingParticles (usually signal+ITPU)
1549  auto tpIndex = tpKeyToIndex.find(trackingParticle.key());
1550  if( tpIndex == tpKeyToIndex.end())
1551  continue;
1552 
1553  //now get the corresponding sim hit
1554  std::pair<TrackingParticleRef, TrackPSimHitRef> simHitTPpairWithDummyTP(trackingParticle,TrackPSimHitRef());
1555  //SimHit is dummy: for simHitTPAssociationListGreater sorting only the TP is needed
1556  auto range = std::equal_range(simHitsTPAssoc.begin(), simHitsTPAssoc.end(),
1558  int simHitKey = -1;
1559  bool foundElectron = false;
1560  edm::ProductID simHitID;
1561  for(auto ip = range.first; ip != range.second; ++ip) {
1562  TrackPSimHitRef TPhit = ip->second;
1563  DetId dId = DetId(TPhit->detUnitId());
1564  if (dId.rawId()==hitId.rawId()) {
1565  // skip electron SimHits for non-electron TPs also here
1566  if(std::abs(TPhit->particleType()) == 11 && std::abs(trackingParticle->pdgId()) != 11) {
1567  foundElectron = true;
1568  continue;
1569  }
1570 
1571  simHitKey = TPhit.key();
1572  simHitID = TPhit.id();
1573  break;
1574  }
1575  }
1576  if(simHitKey < 0) {
1577  // In case we didn't find a simhit because of filtered-out
1578  // electron SimHit, just ignore the missing SimHit.
1579  if(foundElectron)
1580  continue;
1581 
1582  auto ex = cms::Exception("LogicError") << "Did not find SimHit for reco hit DetId " << hitId.rawId()
1583  << " for TP " << trackingParticle.key() << " bx:event " << bx << ":" << event
1584  << ".\nFound SimHits from detectors ";
1585  for(auto ip = range.first; ip != range.second; ++ip) {
1586  TrackPSimHitRef TPhit = ip->second;
1587  DetId dId = DetId(TPhit->detUnitId());
1588  ex << dId.rawId() << " ";
1589  }
1590  if(trackingParticle->eventId().event() != 0) {
1591  ex << "\nSince this is a TrackingParticle from pileup, check that you're running the pileup mixing in playback mode.";
1592  }
1593  throw ex;
1594  }
1595  auto simHitIndex = simHitRefKeyToIndex.at(std::make_pair(simHitKey, simHitID));
1596  ret.matchingSimHit.push_back(simHitIndex);
1597 
1598  double chargeFraction = 0.;
1599  for(const SimTrack& simtrk: trackingParticle->g4Tracks()) {
1600  auto found = simTrackIdToChargeFraction.find(simtrk.trackId());
1601  if(found != simTrackIdToChargeFraction.end()) {
1602  chargeFraction += found->second;
1603  }
1604  }
1605  ret.chargeFraction.push_back(chargeFraction);
1606 
1607  // only for debug prints
1608  ret.bunchCrossing.push_back(bx);
1609  ret.event.push_back(event);
1610 
1611  simhit_hitIdx[simHitIndex].push_back(clusterKey);
1612  simhit_hitType[simHitIndex].push_back(static_cast<int>(hitType));
1613  }
1614  }
1615 
1616  return ret;
1617 }
1618 
1620  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
1622  const TrackerTopology& tTopo,
1623  SimHitRefKeyToIndex& simHitRefKeyToIndex,
1624  std::vector<TPHitIndex>& tpHitList) {
1625 
1626  for(const auto& assoc: simHitsTPAssoc) {
1627  auto tpKey = assoc.first.key();
1628 
1629  // SimHitTPAssociationList can contain more TrackingParticles than
1630  // what are given to this EDAnalyzer, so we can filter those out here.
1631  auto found = tpKeyToIndex.find(tpKey);
1632  if(found == tpKeyToIndex.end())
1633  continue;
1634  const auto tpIndex = found->second;
1635 
1636  // skip non-tracker simhits (mostly muons)
1637  const auto& simhit = *(assoc.second);
1638  auto detId = DetId(simhit.detUnitId());
1639  if(detId.det() != DetId::Tracker) continue;
1640 
1641  // Skip electron SimHits for non-electron TrackingParticles to
1642  // filter out delta rays. The delta ray hits just confuse. If we
1643  // need them later, let's add them as a separate "collection" of
1644  // hits of a TP
1645  const TrackingParticle& tp = *(assoc.first);
1646  if(std::abs(simhit.particleType()) == 11 && std::abs(tp.pdgId()) != 11) continue;
1647 
1648  auto simHitKey = std::make_pair(assoc.second.key(), assoc.second.id());
1649 
1650  if(simHitRefKeyToIndex.find(simHitKey) != simHitRefKeyToIndex.end()) {
1651  for(const auto& assoc2: simHitsTPAssoc) {
1652  if(std::make_pair(assoc2.second.key(), assoc2.second.id()) == simHitKey) {
1653 
1654 #ifdef EDM_ML_DEBUG
1655  auto range1 = std::equal_range(simHitsTPAssoc.begin(), simHitsTPAssoc.end(),
1656  std::make_pair(assoc.first, TrackPSimHitRef()),
1658  auto range2 = std::equal_range(simHitsTPAssoc.begin(), simHitsTPAssoc.end(),
1659  std::make_pair(assoc2.first, TrackPSimHitRef()),
1661 
1662  LogTrace("TrackingNtuple") << "Earlier TP " << assoc2.first.key() << " SimTrack Ids";
1663  for(const auto& simTrack: assoc2.first->g4Tracks()) {
1664  edm::LogPrint("TrackingNtuple") << " SimTrack " << simTrack.trackId() << " BX:event " << simTrack.eventId().bunchCrossing() << ":" << simTrack.eventId().event();
1665  }
1666  for(auto iHit = range2.first; iHit != range2.second; ++iHit) {
1667  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();
1668  }
1669  LogTrace("TrackingNtuple") << "Current TP " << assoc.first.key() << " SimTrack Ids";
1670  for(const auto& simTrack: assoc.first->g4Tracks()) {
1671  edm::LogPrint("TrackingNtuple") << " SimTrack " << simTrack.trackId() << " BX:event " << simTrack.eventId().bunchCrossing() << ":" << simTrack.eventId().event();
1672  }
1673  for(auto iHit = range1.first; iHit != range1.second; ++iHit) {
1674  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();
1675  }
1676 #endif
1677 
1678  throw cms::Exception("LogicError") << "Got second time the SimHit " << simHitKey.first << " of " << simHitKey.second << ", first time with TrackingParticle " << assoc2.first.key() << ", now with " << tpKey;
1679  }
1680  }
1681  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!";
1682  }
1683 
1684  auto det = tracker.idToDetUnit(detId);
1685  if(!det)
1686  throw cms::Exception("LogicError") << "Did not find a det unit for DetId " << simhit.detUnitId() << " from tracker geometry";
1687 
1688  const auto pos = det->surface().toGlobal(simhit.localPosition());
1689  const float tof = simhit.timeOfFlight();
1690 
1691  const auto simHitIndex = simhit_detId.size();
1692  simHitRefKeyToIndex[simHitKey] = simHitIndex;
1693 
1694  simhit_det.push_back(detId.subdetId());
1695  simhit_lay.push_back(tTopo.layer(detId));
1696  simhit_detId.push_back(detId.rawId());
1697  simhit_x.push_back(pos.x());
1698  simhit_y.push_back(pos.y());
1699  simhit_z.push_back(pos.z());
1700  simhit_particle.push_back(simhit.particleType());
1701  simhit_process.push_back(simhit.processType());
1702  simhit_eloss.push_back(simhit.energyLoss());
1703  simhit_tof.push_back(tof);
1704  //simhit_simTrackId.push_back(simhit.trackId());
1705 
1706  simhit_simTrkIdx.push_back(tpIndex);
1707 
1708  simhit_hitIdx.emplace_back(); // filled in matchCluster
1709  simhit_hitType.emplace_back(); // filled in matchCluster
1710 
1711  tpHitList.emplace_back(tpKey, simHitIndex, tof, simhit.detUnitId());
1712  }
1713 }
1714 
1716  const ClusterTPAssociation& clusterToTPMap,
1717  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
1719  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
1720  const TransientTrackingRecHitBuilder& theTTRHBuilder,
1721  const TrackerTopology& tTopo,
1722  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
1723  std::set<edm::ProductID>& hitProductIds
1724  ) {
1726  iEvent.getByToken(pixelRecHitToken_, pixelHits);
1727  for (auto it = pixelHits->begin(); it!=pixelHits->end(); it++ ) {
1728  const DetId hitId = it->detId();
1729  for (auto hit = it->begin(); hit!=it->end(); hit++ ) {
1730  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&*hit);
1731 
1732  hitProductIds.insert(hit->cluster().id());
1733 
1734  const int key = hit->cluster().key();
1735  const int lay = tTopo.layer(hitId);
1736  SimHitData simHitData = matchCluster(hit->firstClusterRef(), hitId, key, ttrh,
1737  clusterToTPMap, tpKeyToIndex, simHitsTPAssoc, digiSimLink, simHitRefKeyToIndex, HitType::Pixel);
1738 
1739  pix_isBarrel .push_back( hitId.subdetId()==1 );
1740  pix_det .push_back( hitId.subdetId() );
1741  pix_lay .push_back( lay );
1742  pix_detId .push_back( hitId.rawId() );
1743  pix_trkIdx .emplace_back(); // filled in fillTracks
1744  pix_seeIdx .emplace_back(); // filled in fillSeeds
1745  pix_simHitIdx.push_back( simHitData.matchingSimHit );
1746  pix_simType.push_back( static_cast<int>(simHitData.type) );
1747  pix_x .push_back( ttrh->globalPosition().x() );
1748  pix_y .push_back( ttrh->globalPosition().y() );
1749  pix_z .push_back( ttrh->globalPosition().z() );
1750  pix_xx .push_back( ttrh->globalPositionError().cxx() );
1751  pix_xy .push_back( ttrh->globalPositionError().cyx() );
1752  pix_yy .push_back( ttrh->globalPositionError().cyy() );
1753  pix_yz .push_back( ttrh->globalPositionError().czy() );
1754  pix_zz .push_back( ttrh->globalPositionError().czz() );
1755  pix_zx .push_back( ttrh->globalPositionError().czx() );
1756  pix_chargeFraction.push_back( simHitData.chargeFraction );
1757  pix_radL .push_back( ttrh->surface()->mediumProperties().radLen() );
1758  pix_bbxi .push_back( ttrh->surface()->mediumProperties().xi() );
1759  LogTrace("TrackingNtuple") << "pixHit cluster=" << key
1760  << " subdId=" << hitId.subdetId()
1761  << " lay=" << lay
1762  << " rawId=" << hitId.rawId()
1763  << " pos =" << ttrh->globalPosition()
1764  << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
1765  if(!simHitData.matchingSimHit.empty()) {
1766  const auto simHitIdx = simHitData.matchingSimHit[0];
1767  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx
1768  << " simHitPos=" << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
1769  << " energyLoss=" << simhit_eloss[simHitIdx]
1770  << " particleType=" << simhit_particle[simHitIdx]
1771  << " processType=" << simhit_process[simHitIdx]
1772  << " bunchCrossing=" << simHitData.bunchCrossing[0]
1773  << " event=" << simHitData.event[0];
1774  }
1775  }
1776  }
1777 }
1778 
1779 
1781  const ClusterTPAssociation& clusterToTPMap,
1782  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
1784  const edm::DetSetVector<StripDigiSimLink>& digiSimLink,
1785  const TransientTrackingRecHitBuilder& theTTRHBuilder,
1786  const TrackerTopology& tTopo,
1787  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
1788  std::set<edm::ProductID>& hitProductIds
1789  ) {
1790  //index strip hit branches by cluster index
1792  iEvent.getByToken(stripRphiRecHitToken_, rphiHits);
1794  iEvent.getByToken(stripStereoRecHitToken_, stereoHits);
1795  int totalStripHits = rphiHits->dataSize()+stereoHits->dataSize();
1796  str_isBarrel .resize(totalStripHits);
1797  str_isStereo .resize(totalStripHits);
1798  str_det .resize(totalStripHits);
1799  str_lay .resize(totalStripHits);
1800  str_detId .resize(totalStripHits);
1801  str_trkIdx .resize(totalStripHits); // filled in fillTracks
1802  str_seeIdx .resize(totalStripHits); // filled in fillSeeds
1803  str_simHitIdx.resize(totalStripHits);
1804  str_simType .resize(totalStripHits);
1805  str_x .resize(totalStripHits);
1806  str_y .resize(totalStripHits);
1807  str_z .resize(totalStripHits);
1808  str_xx .resize(totalStripHits);
1809  str_xy .resize(totalStripHits);
1810  str_yy .resize(totalStripHits);
1811  str_yz .resize(totalStripHits);
1812  str_zz .resize(totalStripHits);
1813  str_zx .resize(totalStripHits);
1814  str_chargeFraction.resize(totalStripHits);
1815  str_radL .resize(totalStripHits);
1816  str_bbxi .resize(totalStripHits);
1817 
1818  auto fill = [&](const SiStripRecHit2DCollection& hits, const char *name, bool isStereo) {
1819  for(const auto& detset: hits) {
1820  const DetId hitId = detset.detId();
1821  for(const auto& hit: detset) {
1822  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&hit);
1823 
1824  hitProductIds.insert(hit.cluster().id());
1825 
1826  const int key = hit.cluster().key();
1827  const int lay = tTopo.layer(hitId);
1828  SimHitData simHitData = matchCluster(hit.firstClusterRef(), hitId, key, ttrh,
1829  clusterToTPMap, tpKeyToIndex, simHitsTPAssoc, digiSimLink, simHitRefKeyToIndex, HitType::Strip);
1831  str_isStereo [key] = isStereo;
1832  str_det [key] = hitId.subdetId();
1833  str_lay [key] = lay;
1834  str_detId [key] = hitId.rawId();
1835  str_simHitIdx[key] = simHitData.matchingSimHit;
1836  str_simType [key] = static_cast<int>(simHitData.type);
1837  str_x [key] = ttrh->globalPosition().x();
1838  str_y [key] = ttrh->globalPosition().y();
1839  str_z [key] = ttrh->globalPosition().z();
1840  str_xx [key] = ttrh->globalPositionError().cxx();
1841  str_xy [key] = ttrh->globalPositionError().cyx();
1842  str_yy [key] = ttrh->globalPositionError().cyy();
1843  str_yz [key] = ttrh->globalPositionError().czy();
1844  str_zz [key] = ttrh->globalPositionError().czz();
1845  str_zx [key] = ttrh->globalPositionError().czx();
1846  str_chargeFraction[key] = simHitData.chargeFraction;
1847  str_radL [key] = ttrh->surface()->mediumProperties().radLen();
1848  str_bbxi [key] = ttrh->surface()->mediumProperties().xi();
1849  LogTrace("TrackingNtuple") << name << " cluster=" << key
1850  << " subdId=" << hitId.subdetId()
1851  << " lay=" << lay
1852  << " rawId=" << hitId.rawId()
1853  << " pos =" << ttrh->globalPosition()
1854  << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
1855  if(!simHitData.matchingSimHit.empty()) {
1856  const auto simHitIdx = simHitData.matchingSimHit[0];
1857  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx
1858  << " simHitPos=" << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
1859  << " simHitPos=" << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
1860  << " energyLoss=" << simhit_eloss[simHitIdx]
1861  << " particleType=" << simhit_particle[simHitIdx]
1862  << " processType=" << simhit_process[simHitIdx]
1863  << " bunchCrossing=" << simHitData.bunchCrossing[0]
1864  << " event=" << simHitData.event[0];
1865  }
1866  }
1867  }
1868  };
1869 
1870  fill(*rphiHits, "stripRPhiHit", false);
1871  fill(*stereoHits, "stripStereoHit", true);
1872 }
1873 
1875  const TransientTrackingRecHitBuilder& theTTRHBuilder,
1876  const TrackerTopology& tTopo,
1877  std::vector<std::pair<int, int> >& monoStereoClusterList
1878  ) {
1880  iEvent.getByToken(stripMatchedRecHitToken_, matchedHits);
1881  for (auto it = matchedHits->begin(); it!=matchedHits->end(); it++ ) {
1882  const DetId hitId = it->detId();
1883  for (auto hit = it->begin(); hit!=it->end(); hit++ ) {
1884  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&*hit);
1885  const int lay = tTopo.layer(hitId);
1886  monoStereoClusterList.emplace_back(hit->monoHit().cluster().key(),hit->stereoHit().cluster().key());
1887  glu_isBarrel .push_back( (hitId.subdetId()==StripSubdetector::TIB || hitId.subdetId()==StripSubdetector::TOB) );
1888  glu_det .push_back( hitId.subdetId() );
1889  glu_lay .push_back( tTopo.layer(hitId) );
1890  glu_detId .push_back( hitId.rawId() );
1891  glu_monoIdx .push_back( hit->monoHit().cluster().key() );
1892  glu_stereoIdx.push_back( hit->stereoHit().cluster().key() );
1893  glu_seeIdx .emplace_back(); // filled in fillSeeds
1894  glu_x .push_back( ttrh->globalPosition().x() );
1895  glu_y .push_back( ttrh->globalPosition().y() );
1896  glu_z .push_back( ttrh->globalPosition().z() );
1897  glu_xx .push_back( ttrh->globalPositionError().cxx() );
1898  glu_xy .push_back( ttrh->globalPositionError().cyx() );
1899  glu_yy .push_back( ttrh->globalPositionError().cyy() );
1900  glu_yz .push_back( ttrh->globalPositionError().czy() );
1901  glu_zz .push_back( ttrh->globalPositionError().czz() );
1902  glu_zx .push_back( ttrh->globalPositionError().czx() );
1903  glu_radL .push_back( ttrh->surface()->mediumProperties().radLen() );
1904  glu_bbxi .push_back( ttrh->surface()->mediumProperties().xi() );
1905  LogTrace("TrackingNtuple") << "stripMatchedHit"
1906  << " cluster0=" << hit->stereoHit().cluster().key()
1907  << " cluster1=" << hit->monoHit().cluster().key()
1908  << " subdId=" << hitId.subdetId()
1909  << " lay=" << lay
1910  << " rawId=" << hitId.rawId()
1911  << " pos =" << ttrh->globalPosition();
1912  }
1913  }
1914 }
1915 
1917  const ClusterTPAssociation& clusterToTPMap,
1918  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
1920  const edm::DetSetVector<PixelDigiSimLink>& digiSimLink,
1921  const TransientTrackingRecHitBuilder& theTTRHBuilder,
1922  const TrackerTopology& tTopo,
1923  const SimHitRefKeyToIndex& simHitRefKeyToIndex,
1924  std::set<edm::ProductID>& hitProductIds
1925  ) {
1927  iEvent.getByToken(phase2OTRecHitToken_, phase2OTHits);
1928  for (auto it = phase2OTHits->begin(); it!=phase2OTHits->end(); it++ ) {
1929  const DetId hitId = it->detId();
1930  for (auto hit = it->begin(); hit!=it->end(); hit++ ) {
1931  TransientTrackingRecHit::RecHitPointer ttrh = theTTRHBuilder.build(&*hit);
1932 
1933  hitProductIds.insert(hit->cluster().id());
1934 
1935  const int key = hit->cluster().key();
1936  const int lay = tTopo.layer(hitId);
1937  SimHitData simHitData = matchCluster(hit->firstClusterRef(), hitId, key, ttrh,
1938  clusterToTPMap, tpKeyToIndex, simHitsTPAssoc, digiSimLink, simHitRefKeyToIndex, HitType::Phase2OT);
1939 
1940  ph2_isBarrel .push_back( hitId.subdetId()==1 );
1941  ph2_det .push_back( hitId.subdetId() );
1942  ph2_lay .push_back( lay );
1943  ph2_detId .push_back( hitId.rawId() );
1944  ph2_trkIdx .emplace_back(); // filled in fillTracks
1945  ph2_seeIdx .emplace_back(); // filled in fillSeeds
1946  ph2_simHitIdx.push_back( simHitData.matchingSimHit );
1947  ph2_simType.push_back( static_cast<int>(simHitData.type) );
1948  ph2_x .push_back( ttrh->globalPosition().x() );
1949  ph2_y .push_back( ttrh->globalPosition().y() );
1950  ph2_z .push_back( ttrh->globalPosition().z() );
1951  ph2_xx .push_back( ttrh->globalPositionError().cxx() );
1952  ph2_xy .push_back( ttrh->globalPositionError().cyx() );
1953  ph2_yy .push_back( ttrh->globalPositionError().cyy() );
1954  ph2_yz .push_back( ttrh->globalPositionError().czy() );
1955  ph2_zz .push_back( ttrh->globalPositionError().czz() );
1956  ph2_zx .push_back( ttrh->globalPositionError().czx() );
1957  ph2_radL .push_back( ttrh->surface()->mediumProperties().radLen() );
1958  ph2_bbxi .push_back( ttrh->surface()->mediumProperties().xi() );
1959 
1960  LogTrace("TrackingNtuple") << "phase2 OT cluster=" << key
1961  << " subdId=" << hitId.subdetId()
1962  << " lay=" << lay
1963  << " rawId=" << hitId.rawId()
1964  << " pos =" << ttrh->globalPosition()
1965  << " nMatchingSimHit=" << simHitData.matchingSimHit.size();
1966 
1967  if(!simHitData.matchingSimHit.empty()) {
1968  const auto simHitIdx = simHitData.matchingSimHit[0];
1969  LogTrace("TrackingNtuple") << " firstMatchingSimHit=" << simHitIdx
1970  << " simHitPos=" << GlobalPoint(simhit_x[simHitIdx], simhit_y[simHitIdx], simhit_z[simHitIdx])
1971  << " energyLoss=" << simhit_eloss[simHitIdx]
1972  << " particleType=" << simhit_particle[simHitIdx]
1973  << " processType=" << simhit_process[simHitIdx]
1974  << " bunchCrossing=" << simHitData.bunchCrossing[0]
1975  << " event=" << simHitData.event[0];
1976  }
1977  }
1978  }
1979 }
1980 
1981 
1983  const TrackingParticleRefVector& tpCollection,
1984  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
1985  const reco::BeamSpot& bs,
1986  const reco::TrackToTrackingParticleAssociator& associatorByHits,
1987  const TransientTrackingRecHitBuilder& theTTRHBuilder,
1988  const MagneticField *theMF,
1989  const std::vector<std::pair<int, int> >& monoStereoClusterList,
1990  const std::set<edm::ProductID>& hitProductIds,
1991  std::map<edm::ProductID, size_t>& seedCollToOffset
1992  ) {
1993  TSCBLBuilderNoMaterial tscblBuilder;
1994  for(const auto& seedToken: seedTokens_) {
1995  edm::Handle<edm::View<reco::Track> > seedTracksHandle;
1996  iEvent.getByToken(seedToken, seedTracksHandle);
1997  const auto& seedTracks = *seedTracksHandle;
1998 
1999  if(seedTracks.empty())
2000  continue;
2001 
2002  // The associator interfaces really need to be fixed...
2003  edm::RefToBaseVector<reco::Track> seedTrackRefs;
2004  for(edm::View<reco::Track>::size_type i=0; i<seedTracks.size(); ++i) {
2005  seedTrackRefs.push_back(seedTracks.refAt(i));
2006  }
2007  reco::RecoToSimCollection recSimColl = associatorByHits.associateRecoToSim(seedTrackRefs, tpCollection);
2008 
2010  labelsForToken(seedToken, labels);
2011  TString label = labels.module;
2012  //format label to match algoName
2013  label.ReplaceAll("seedTracks", "");
2014  label.ReplaceAll("Seeds","");
2015  label.ReplaceAll("muonSeeded","muonSeededStep");
2016  int algo = reco::TrackBase::algoByName(label.Data());
2017 
2018  edm::ProductID id = seedTracks[0].seedRef().id();
2019  auto inserted = seedCollToOffset.emplace(id, see_fitok.size());
2020  if(!inserted.second)
2021  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.";
2022  see_offset.push_back(see_fitok.size());
2023 
2024  LogTrace("TrackingNtuple") << "NEW SEED LABEL: " << label << " size: " << seedTracks.size() << " algo=" << algo
2025  << " ProductID " << id;
2026 
2027  for(const auto& seedTrackRef: seedTrackRefs) {
2028 
2029  const auto& seedTrack = *seedTrackRef;
2030  const auto& seedRef = seedTrack.seedRef();
2031  const auto& seed = *seedRef;
2032 
2033  if(seedRef.id() != id)
2034  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 << ".";
2035 
2036  std::vector<float> sharedFraction;
2037  std::vector<int> tpIdx;
2038  auto foundTPs = recSimColl.find(seedTrackRef);
2039  if (foundTPs != recSimColl.end()) {
2040  for(const auto tpQuality: foundTPs->val) {
2041  sharedFraction.push_back(tpQuality.second);
2042  tpIdx.push_back( tpKeyToIndex.at( tpQuality.first.key() ) );
2043  }
2044  }
2045 
2046 
2047  const bool seedFitOk = !trackFromSeedFitFailed(seedTrack);
2048  const int charge = seedTrack.charge();
2049  const float pt = seedFitOk ? seedTrack.pt() : 0;
2050  const float eta = seedFitOk ? seedTrack.eta() : 0;
2051  const float phi = seedFitOk ? seedTrack.phi() : 0;
2052  const int nHits = seedTrack.numberOfValidHits();
2053 
2054  const auto seedIndex = see_fitok.size();
2055 
2056  see_fitok .push_back(seedFitOk);
2057 
2058  see_px .push_back( seedFitOk ? seedTrack.px() : 0 );
2059  see_py .push_back( seedFitOk ? seedTrack.py() : 0 );
2060  see_pz .push_back( seedFitOk ? seedTrack.pz() : 0 );
2061  see_pt .push_back( pt );
2062  see_eta .push_back( eta );
2063  see_phi .push_back( phi );
2064  see_q .push_back( charge );
2065  see_nValid .push_back( nHits );
2066 
2067  see_dxy .push_back( seedFitOk ? seedTrack.dxy(bs.position()) : 0);
2068  see_dz .push_back( seedFitOk ? seedTrack.dz(bs.position()) : 0);
2069  see_ptErr .push_back( seedFitOk ? seedTrack.ptError() : 0);
2070  see_etaErr .push_back( seedFitOk ? seedTrack.etaError() : 0);
2071  see_phiErr .push_back( seedFitOk ? seedTrack.phiError() : 0);
2072  see_dxyErr .push_back( seedFitOk ? seedTrack.dxyError() : 0);
2073  see_dzErr .push_back( seedFitOk ? seedTrack.dzError() : 0);
2074  see_algo .push_back( algo );
2075 
2076  see_trkIdx .push_back(-1); // to be set correctly in fillTracks
2077  see_shareFrac.push_back( sharedFraction );
2078  see_simTrkIdx.push_back( tpIdx );
2079 
2081  /*
2082  TransientTrackingRecHit::RecHitPointer lastRecHit = theTTRHBuilder.build(&*(seed.recHits().second-1));
2083  TrajectoryStateOnSurface state = trajectoryStateTransform::transientState( itSeed->startingState(), lastRecHit->surface(), theMF);
2084  float pt = state.globalParameters().momentum().perp();
2085  float eta = state.globalParameters().momentum().eta();
2086  float phi = state.globalParameters().momentum().phi();
2087  see_px .push_back( state.globalParameters().momentum().x() );
2088  see_py .push_back( state.globalParameters().momentum().y() );
2089  see_pz .push_back( state.globalParameters().momentum().z() );
2090  */
2091 
2092  std::vector<int> hitIdx;
2093  std::vector<int> hitType;
2094 
2095  for (auto hit=seed.recHits().first; hit!=seed.recHits().second; ++hit) {
2097  int subid = recHit->geographicalId().subdetId();
2098  if (subid == (int) PixelSubdetector::PixelBarrel || subid == (int) PixelSubdetector::PixelEndcap) {
2099  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*recHit);
2100  const auto& clusterRef = bhit->firstClusterRef();
2101  const auto clusterKey = clusterRef.cluster_pixel().key();
2102  if(includeAllHits_) {
2103  checkProductID(hitProductIds, clusterRef.id(), "seed");
2104  pix_seeIdx[clusterKey].push_back(seedIndex);
2105  }
2106  hitIdx.push_back( clusterKey );
2107  hitType.push_back( static_cast<int>(HitType::Pixel) );
2108  } else if (subid == (int) StripSubdetector::TOB || subid == (int) StripSubdetector::TID ||
2109  subid == (int) StripSubdetector::TIB || subid == (int) StripSubdetector::TEC) {
2110  if (trackerHitRTTI::isMatched(*recHit)) {
2111  const SiStripMatchedRecHit2D * matchedHit = dynamic_cast<const SiStripMatchedRecHit2D *>(&*recHit);
2112  if(includeAllHits_) {
2113  checkProductID(hitProductIds, matchedHit->monoClusterRef().id(), "seed");
2114  checkProductID(hitProductIds, matchedHit->stereoClusterRef().id(), "seed");
2115  }
2116  int monoIdx = matchedHit->monoClusterRef().key();
2117  int stereoIdx = matchedHit->stereoClusterRef().key();
2118 
2119  std::vector<std::pair<int,int> >::const_iterator pos = find( monoStereoClusterList.begin(), monoStereoClusterList.end(), std::make_pair(monoIdx,stereoIdx) );
2120  const auto gluedIndex = std::distance(monoStereoClusterList.begin(), pos);
2121  if(includeAllHits_) glu_seeIdx[gluedIndex].push_back(seedIndex);
2122  hitIdx.push_back( gluedIndex );
2123  hitType.push_back( static_cast<int>(HitType::Glued) );
2124  } else {
2125  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*recHit);
2126  const auto& clusterRef = bhit->firstClusterRef();
2127  unsigned int clusterKey;
2128  if(clusterRef.isPhase2()){
2129  clusterKey = clusterRef.cluster_phase2OT().key();
2130  } else {
2131  clusterKey = clusterRef.cluster_strip().key();
2132  }
2133 
2134  if(includeAllHits_) {
2135  checkProductID(hitProductIds, clusterRef.id(), "seed");
2136  if(clusterRef.isPhase2()){
2137  ph2_seeIdx[clusterKey].push_back(seedIndex);
2138  } else {
2139  str_seeIdx[clusterKey].push_back(seedIndex);
2140  }
2141  }
2142 
2143  hitIdx.push_back( clusterKey );
2144  if(clusterRef.isPhase2()){
2145  hitType.push_back( static_cast<int>(HitType::Phase2OT) );
2146  } else {
2147  hitType.push_back( static_cast<int>(HitType::Strip) );
2148  }
2149  }
2150  } else {
2151  LogTrace("TrackingNtuple") << " not pixel and not Strip detector";
2152  }
2153  }
2154  see_hitIdx .push_back( hitIdx );
2155  see_hitType .push_back( hitType );
2156  see_nPixel .push_back( std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Pixel)) );
2157  see_nGlued .push_back( std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Glued)) );
2158  see_nStrip .push_back( std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Strip)) );
2159  see_nPhase2OT.push_back( std::count(hitType.begin(), hitType.end(), static_cast<int>(HitType::Phase2OT)) );
2160  //the part below is not strictly needed
2161  float chi2 = -1;
2162  if (nHits==2) {
2163  TransientTrackingRecHit::RecHitPointer recHit0 = theTTRHBuilder.build(&*(seed.recHits().first));
2164  TransientTrackingRecHit::RecHitPointer recHit1 = theTTRHBuilder.build(&*(seed.recHits().first+1));
2165  std::vector<GlobalPoint> gp(2);
2166  std::vector<GlobalError> ge(2);
2167  gp[0] = recHit0->globalPosition();
2168  ge[0] = recHit0->globalPositionError();
2169  gp[1] = recHit1->globalPosition();
2170  ge[1] = recHit1->globalPositionError();
2171  LogTrace("TrackingNtuple") << "seed " << seedTrackRef.key()
2172  << " pt=" << pt << " eta=" << eta << " phi=" << phi << " q=" << charge
2173  << " - PAIR - ids: " << recHit0->geographicalId().rawId() << " " << recHit1->geographicalId().rawId()
2174  << " hitpos: " << gp[0] << " " << gp[1]
2175  << " trans0: " << (recHit0->transientHits().size()>1 ? recHit0->transientHits()[0]->globalPosition() : GlobalPoint(0,0,0))
2176  << " " << (recHit0->transientHits().size()>1 ? recHit0->transientHits()[1]->globalPosition() : GlobalPoint(0,0,0))
2177  << " trans1: " << (recHit1->transientHits().size()>1 ? recHit1->transientHits()[0]->globalPosition() : GlobalPoint(0,0,0))
2178  << " " << (recHit1->transientHits().size()>1 ? recHit1->transientHits()[1]->globalPosition() : GlobalPoint(0,0,0))
2179  << " eta,phi: " << gp[0].eta() << "," << gp[0].phi();
2180  } else if (nHits==3) {
2181  TransientTrackingRecHit::RecHitPointer recHit0 = theTTRHBuilder.build(&*(seed.recHits().first));
2182  TransientTrackingRecHit::RecHitPointer recHit1 = theTTRHBuilder.build(&*(seed.recHits().first+1));
2183  TransientTrackingRecHit::RecHitPointer recHit2 = theTTRHBuilder.build(&*(seed.recHits().first+2));
2186  declareDynArray(bool,4, bl);
2187  gp[0] = recHit0->globalPosition();
2188  ge[0] = recHit0->globalPositionError();
2189  int subid0 = recHit0->geographicalId().subdetId();
2190  bl[0] = (subid0 == StripSubdetector::TIB || subid0 == StripSubdetector::TOB || subid0 == (int) PixelSubdetector::PixelBarrel);
2191  gp[1] = recHit1->globalPosition();
2192  ge[1] = recHit1->globalPositionError();
2193  int subid1 = recHit1->geographicalId().subdetId();
2194  bl[1] = (subid1 == StripSubdetector::TIB || subid1 == StripSubdetector::TOB || subid1 == (int) PixelSubdetector::PixelBarrel);
2195  gp[2] = recHit2->globalPosition();
2196  ge[2] = recHit2->globalPositionError();
2197  int subid2 = recHit2->geographicalId().subdetId();
2198  bl[2] = (subid2 == StripSubdetector::TIB || subid2 == StripSubdetector::TOB || subid2 == (int) PixelSubdetector::PixelBarrel);
2199  RZLine rzLine(gp,ge,bl);
2200  float seed_chi2 = rzLine.chi2();
2201  //float seed_pt = state.globalParameters().momentum().perp();
2202  float seed_pt = pt;
2203  LogTrace("TrackingNtuple") << "seed " << seedTrackRef.key()
2204  << " pt=" << pt << " eta=" << eta << " phi=" << phi << " q=" << charge
2205  << " - TRIPLET - ids: " << recHit0->geographicalId().rawId() << " " << recHit1->geographicalId().rawId() << " " << recHit2->geographicalId().rawId()
2206  << " hitpos: " << gp[0] << " " << gp[1] << " " << gp[2]
2207  << " trans0: " << (recHit0->transientHits().size()>1 ? recHit0->transientHits()[0]->globalPosition() : GlobalPoint(0,0,0))
2208  << " " << (recHit0->transientHits().size()>1 ? recHit0->transientHits()[1]->globalPosition() : GlobalPoint(0,0,0))
2209  << " trans1: " << (recHit1->transientHits().size()>1 ? recHit1->transientHits()[0]->globalPosition() : GlobalPoint(0,0,0))
2210  << " " << (recHit1->transientHits().size()>1 ? recHit1->transientHits()[1]->globalPosition() : GlobalPoint(0,0,0))
2211  << " trans2: " << (recHit2->transientHits().size()>1 ? recHit2->transientHits()[0]->globalPosition() : GlobalPoint(0,0,0))
2212  << " " << (recHit2->transientHits().size()>1 ? recHit2->transientHits()[1]->globalPosition() : GlobalPoint(0,0,0))
2213  << " local: " << recHit2->localPosition()
2214  //<< " tsos pos, mom: " << state.globalPosition()<<" "<<state.globalMomentum()
2215  << " eta,phi: " << gp[0].eta() << "," << gp[0].phi()
2216  << " pt,chi2: " << seed_pt << "," << seed_chi2;
2217  chi2 = seed_chi2;
2218  }
2219  see_chi2 .push_back( chi2 );
2220  }
2221  }
2222 }
2223 
2225  const TrackingParticleRefVector& tpCollection,
2226  const TrackingParticleRefKeyToIndex& tpKeyToIndex,
2227  const reco::BeamSpot& bs,
2228  const reco::TrackToTrackingParticleAssociator& associatorByHits,
2229  const TransientTrackingRecHitBuilder& theTTRHBuilder,
2230  const TrackerTopology& tTopo,
2231  const std::set<edm::ProductID>& hitProductIds,
2232  const std::map<edm::ProductID, size_t>& seedCollToOffset
2233  ) {
2234  reco::RecoToSimCollection recSimColl = associatorByHits.associateRecoToSim(tracks, tpCollection);
2236  labelsForToken(trackToken_, labels);
2237  LogTrace("TrackingNtuple") << "NEW TRACK LABEL: " << labels.module;
2238  for(size_t iTrack = 0; iTrack<tracks.size(); ++iTrack) {
2239  const auto& itTrack = tracks[iTrack];
2240  int nSimHits = 0;
2241  bool isSimMatched = false;
2242  std::vector<float> sharedFraction;
2243  std::vector<int> tpIdx;
2244  auto foundTPs = recSimColl.find(itTrack);
2245  if (foundTPs != recSimColl.end()) {
2246  if (!foundTPs->val.empty()) {
2247  nSimHits = foundTPs->val[0].first->numberOfTrackerHits();
2248  isSimMatched = true;
2249  }
2250  for(const auto tpQuality: foundTPs->val) {
2251  sharedFraction.push_back(tpQuality.second);
2252  tpIdx.push_back( tpKeyToIndex.at( tpQuality.first.key() ) );
2253  }
2254  }
2255  int charge = itTrack->charge();
2256  float pt = itTrack->pt();
2257  float eta = itTrack->eta();
2258  const double lambda = itTrack->lambda();
2259  float chi2 = itTrack->normalizedChi2();
2260  float phi = itTrack->phi();
2261  int nHits = itTrack->numberOfValidHits();
2262  const reco::HitPattern& hp = itTrack->hitPattern();
2263  trk_px .push_back(itTrack->px());
2264  trk_py .push_back(itTrack->py());
2265  trk_pz .push_back(itTrack->pz());
2266  trk_pt .push_back(pt);
2267  trk_inner_px.push_back(itTrack->innerMomentum().x());
2268  trk_inner_py.push_back(itTrack->innerMomentum().y());
2269  trk_inner_pz.push_back(itTrack->innerMomentum().z());
2270  trk_inner_pt.push_back(itTrack->innerMomentum().rho());
2271  trk_outer_px.push_back(itTrack->outerMomentum().x());
2272  trk_outer_py.push_back(itTrack->outerMomentum().y());
2273  trk_outer_pz.push_back(itTrack->outerMomentum().z());
2274  trk_outer_pt.push_back(itTrack->outerMomentum().rho());
2275  trk_eta .push_back(eta);
2276  trk_lambda .push_back(lambda);
2277  trk_cotTheta .push_back(1/tan(M_PI*0.5-lambda));
2278  trk_phi .push_back(phi);
2279  trk_dxy .push_back(itTrack->dxy(bs.position()));
2280  trk_dz .push_back(itTrack->dz(bs.position()));
2281  trk_ptErr .push_back(itTrack->ptError());
2282  trk_etaErr .push_back(itTrack->etaError());
2283  trk_lambdaErr.push_back(itTrack->lambdaError());
2284  trk_phiErr .push_back(itTrack->phiError());
2285  trk_dxyErr .push_back(itTrack->dxyError());
2286  trk_dzErr .push_back(itTrack->dzError());
2287  trk_refpoint_x.push_back(itTrack->vx());
2288  trk_refpoint_y.push_back(itTrack->vy());
2289  trk_refpoint_z.push_back(itTrack->vz());
2290  trk_nChi2 .push_back( itTrack->normalizedChi2());
2291  trk_shareFrac.push_back(sharedFraction);
2292  trk_q .push_back(charge);
2293  trk_nValid .push_back(hp.numberOfValidHits());
2294  trk_nInvalid .push_back(hp.numberOfLostHits(reco::HitPattern::TRACK_HITS));
2295  trk_nPixel .push_back(hp.numberOfValidPixelHits());
2296  trk_nStrip .push_back(hp.numberOfValidStripHits());
2297  trk_nPixelLay.push_back(hp.pixelLayersWithMeasurement());
2298  trk_nStripLay.push_back(hp.stripLayersWithMeasurement());
2300  trk_nOuterLost.push_back(hp.numberOfLostTrackerHits(reco::HitPattern::MISSING_OUTER_HITS));
2301  trk_nInnerLost.push_back(hp.numberOfLostTrackerHits(reco::HitPattern::MISSING_INNER_HITS));
2302  trk_algo .push_back(itTrack->algo());
2303  trk_originalAlgo.push_back(itTrack->originalAlgo());
2304  trk_algoMask .push_back(itTrack->algoMaskUL());
2305  trk_stopReason.push_back(itTrack->stopReason());
2306  trk_isHP .push_back(itTrack->quality(reco::TrackBase::highPurity));
2307  if(includeSeeds_) {
2308  auto offset = seedCollToOffset.find(itTrack->seedRef().id());
2309  if(offset == seedCollToOffset.end()) {
2310  throw cms::Exception("Configuration") << "Track algo '" << reco::TrackBase::algoName(itTrack->algo())
2311  << "' originalAlgo '" << reco::TrackBase::algoName(itTrack->originalAlgo())
2312  << "' refers to seed collection " << itTrack->seedRef().id()
2313  << ", but that seed collection is not given as an input. The following collections were given as an input " << make_ProductIDMapPrinter(seedCollToOffset);
2314  }
2315 
2316  const auto seedIndex = offset->second + itTrack->seedRef().key();
2317  trk_seedIdx .push_back(seedIndex);
2318  if(see_trkIdx[seedIndex] != -1) {
2319  throw cms::Exception("LogicError") << "Track index has already been set for seed " << seedIndex << " to " << see_trkIdx[seedIndex] << "; was trying to set it to " << iTrack;
2320  }
2321  see_trkIdx[seedIndex] = iTrack;
2322  }
2323  trk_vtxIdx .push_back(-1); // to be set correctly in fillVertices
2324  trk_simTrkIdx.push_back(tpIdx);
2325  LogTrace("TrackingNtuple") << "Track #" << itTrack.key() << " with q=" << charge
2326  << ", pT=" << pt << " GeV, eta: " << eta << ", phi: " << phi
2327  << ", chi2=" << chi2
2328  << ", Nhits=" << nHits
2329  << ", algo=" << itTrack->algoName(itTrack->algo()).c_str()
2330  << " hp=" << itTrack->quality(reco::TrackBase::highPurity)
2331  << " seed#=" << itTrack->seedRef().key()
2332  << " simMatch=" << isSimMatched
2333  << " nSimHits=" << nSimHits
2334  << " sharedFraction=" << (sharedFraction.empty()?-1:sharedFraction[0])
2335  << " tpIdx=" << (tpIdx.empty()?-1:tpIdx[0]);
2336  std::vector<int> hitIdx;
2337  std::vector<int> hitType;
2338 
2339  for(auto i=itTrack->recHitsBegin(); i!=itTrack->recHitsEnd(); i++) {
2340  TransientTrackingRecHit::RecHitPointer hit=theTTRHBuilder.build(&**i );
2341  DetId hitId = hit->geographicalId();
2342  LogTrace("TrackingNtuple") << "hit #" << std::distance(itTrack->recHitsBegin(), i) << " subdet=" << hitId.subdetId();
2343  if(hitId.det() != DetId::Tracker)
2344  continue;
2345 
2346  LogTrace("TrackingNtuple") << " " << subdetstring(hitId.subdetId()) << " " << tTopo.layer(hitId);
2347 
2348  if (hit->isValid()) {
2349  //ugly... but works
2350  const BaseTrackerRecHit* bhit = dynamic_cast<const BaseTrackerRecHit*>(&*hit);
2351  const auto& clusterRef = bhit->firstClusterRef();
2352  unsigned int clusterKey;
2353  if(clusterRef.isPixel()){
2354  clusterKey = clusterRef.cluster_pixel().key();
2355  } else if(clusterRef.isPhase2()){
2356  clusterKey = clusterRef.cluster_phase2OT().key();
2357  } else {
2358  clusterKey = clusterRef.cluster_strip().key();
2359  }
2360 
2361  LogTrace("TrackingNtuple") << " id: " << hitId.rawId() << " - globalPos =" << hit->globalPosition()
2362  << " cluster=" << clusterKey
2363  << " clusterRef ID=" << clusterRef.id()
2364  << " eta,phi: " << hit->globalPosition().eta() << "," << hit->globalPosition().phi();
2365  if(includeAllHits_) {
2366  checkProductID(hitProductIds, clusterRef.id(), "track");
2367  if(clusterRef.isPixel()){
2368  pix_trkIdx[clusterKey].push_back(iTrack);
2369  } else if(clusterRef.isPhase2()){
2370  ph2_trkIdx[clusterKey].push_back(iTrack);
2371  } else {
2372  str_trkIdx[clusterKey].push_back(iTrack);
2373  }
2374 
2375  }
2376 
2377  hitIdx.push_back(clusterKey);
2378  if(clusterRef.isPixel()){
2379  hitType.push_back( static_cast<int>(HitType::Pixel));
2380  } else if(clusterRef.isPhase2()){
2381  hitType.push_back( static_cast<int>(HitType::Phase2OT));
2382  } else {
2383  hitType.push_back( static_cast<int>(HitType::Strip));
2384  }
2385  } else {
2386  LogTrace("TrackingNtuple") << " - invalid hit";
2387 
2388  hitIdx.push_back( inv_isBarrel.size() );
2389  hitType.push_back( static_cast<int>(HitType::Invalid) );
2390 
2391  inv_isBarrel.push_back( hitId.subdetId()==1 );
2392  inv_det .push_back( hitId.subdetId() );
2393  inv_lay .push_back( tTopo.layer(hitId) );
2394  inv_detId .push_back( hitId.rawId() );
2395  inv_type .push_back( hit->getType() );
2396 
2397  }
2398  }
2399 
2400  trk_hitIdx.push_back(hitIdx);
2401  trk_hitType.push_back(hitType);
2402  }
2403 }
2404 
2405 
2407  const edm::RefToBaseVector<reco::Track>& tracks,
2408  const TrackingParticleRefVector& tpCollection,
2409  const TrackingVertexRefKeyToIndex& tvKeyToIndex,
2410  const reco::TrackToTrackingParticleAssociator& associatorByHits,
2411  const std::vector<TPHitIndex>& tpHitList
2412  ) {
2413  edm::ESHandle<ParametersDefinerForTP> parametersDefinerH;
2414  iSetup.get<TrackAssociatorRecord>().get(parametersDefinerName_, parametersDefinerH);
2415  const ParametersDefinerForTP *parametersDefiner = parametersDefinerH.product();
2416 
2417  // Number of 3D layers for TPs
2419  iEvent.getByToken(tpNLayersToken_, tpNLayersH);
2420  const auto& nLayers_tPCeff = *tpNLayersH;
2421 
2422  iEvent.getByToken(tpNPixelLayersToken_, tpNLayersH);
2423  const auto& nPixelLayers_tPCeff = *tpNLayersH;
2424 
2425  iEvent.getByToken(tpNStripStereoLayersToken_, tpNLayersH);
2426  const auto& nStripMonoAndStereoLayers_tPCeff = *tpNLayersH;
2427 
2428  reco::SimToRecoCollection simRecColl = associatorByHits.associateSimToReco(tracks, tpCollection);
2429 
2430  for(const TrackingParticleRef& tp: tpCollection) {
2431  LogTrace("TrackingNtuple") << "tracking particle pt=" << tp->pt() << " eta=" << tp->eta() << " phi=" << tp->phi();
2432  bool isRecoMatched = false;
2433  std::vector<int> tkIdx;
2434  std::vector<float> sharedFraction;
2435  auto foundTracks = simRecColl.find(tp);
2436  if(foundTracks != simRecColl.end()) {
2437  isRecoMatched = true;
2438  for(const auto trackQuality: foundTracks->val) {
2439  sharedFraction.push_back(trackQuality.second);
2440  tkIdx.push_back(trackQuality.first.key());
2441  }
2442  }
2443  LogTrace("TrackingNtuple") << "matched to tracks = " << make_VectorPrinter(tkIdx) << " isRecoMatched=" << isRecoMatched;
2444  sim_event .push_back(tp->eventId().event());
2445  sim_bunchCrossing.push_back(tp->eventId().bunchCrossing());
2446  sim_pdgId .push_back(tp->pdgId());
2447  sim_px .push_back(tp->px());
2448  sim_py .push_back(tp->py());
2449  sim_pz .push_back(tp->pz());
2450  sim_pt .push_back(tp->pt());
2451  sim_eta .push_back(tp->eta());
2452  sim_phi .push_back(tp->phi());
2453  sim_q .push_back(tp->charge());
2454  sim_trkIdx .push_back(tkIdx);
2455  sim_shareFrac.push_back(sharedFraction);
2456  sim_parentVtxIdx.push_back( tvKeyToIndex.at(tp->parentVertex().key()) );
2457  std::vector<int> decayIdx;
2458  for(const auto& v: tp->decayVertices())
2459  decayIdx.push_back( tvKeyToIndex.at(v.key()) );
2460  sim_decayVtxIdx.push_back(decayIdx);
2461 
2462  //Calcualte the impact parameters w.r.t. PCA
2463  TrackingParticle::Vector momentum = parametersDefiner->momentum(iEvent,iSetup,tp);
2464  TrackingParticle::Point vertex = parametersDefiner->vertex(iEvent,iSetup,tp);
2465  float dxySim = (-vertex.x()*sin(momentum.phi())+vertex.y()*cos(momentum.phi()));
2466  float dzSim = vertex.z() - (vertex.x()*momentum.x()+vertex.y()*momentum.y())/sqrt(momentum.perp2())
2467  * momentum.z()/sqrt(momentum.perp2());
2468  const double lambdaSim = M_PI/2 - momentum.theta();
2469  sim_pca_pt .push_back(std::sqrt(momentum.perp2()));
2470  sim_pca_eta .push_back(momentum.Eta());
2471  sim_pca_lambda .push_back(lambdaSim);
2472  sim_pca_cotTheta .push_back(1/tan(M_PI*0.5-lambdaSim));
2473  sim_pca_phi .push_back(momentum.phi());
2474  sim_pca_dxy .push_back(dxySim);
2475  sim_pca_dz .push_back(dzSim);
2476 
2477  std::vector<int> hitIdx;
2478  int nPixel=0, nStrip=0;
2479  auto rangeHit = std::equal_range(tpHitList.begin(), tpHitList.end(), TPHitIndex(tp.key()), tpHitIndexListLess);
2480  for(auto ip = rangeHit.first; ip != rangeHit.second; ++ip) {
2481  auto type = HitType::Unknown;
2482  if(!simhit_hitType[ip->simHitIdx].empty())
2483  type = static_cast<HitType>(simhit_hitType[ip->simHitIdx][0]);
2484  LogTrace("TrackingNtuple") << "simhit=" << ip->simHitIdx << " type=" << static_cast<int>(type);
2485  hitIdx.push_back(ip->simHitIdx);
2486  const auto detid = DetId(simhit_detId[ip->simHitIdx]);
2487  if(detid.det() != DetId::Tracker) {
2488  throw cms::Exception("LogicError") << "Encountered SimHit for TP " << tp.key() << " with DetId " << detid.rawId() << " whose det() is not Tracker but " << detid.det();
2489  }
2490  const auto subdet = detid.subdetId();
2491  switch(subdet) {
2494  ++nPixel;
2495  break;
2496  case StripSubdetector::TIB:
2497  case StripSubdetector::TID:
2498  case StripSubdetector::TOB:
2499  case StripSubdetector::TEC:
2500  ++nStrip;
2501  break;
2502  default:
2503  throw cms::Exception("LogicError") << "Encountered SimHit for TP " << tp.key() << " with DetId " << detid.rawId() << " whose subdet is not recognized, is " << subdet;
2504  };
2505  }
2506  sim_nValid .push_back( hitIdx.size() );
2507  sim_nPixel .push_back( nPixel );
2508  sim_nStrip .push_back( nStrip );
2509 
2510  const auto nSimLayers = nLayers_tPCeff[tp];
2511  const auto nSimPixelLayers = nPixelLayers_tPCeff[tp];
2512  const auto nSimStripMonoAndStereoLayers = nStripMonoAndStereoLayers_tPCeff[tp];
2513  sim_nLay .push_back( nSimLayers );
2514  sim_nPixelLay.push_back( nSimPixelLayers );
2515  sim_n3DLay .push_back( nSimPixelLayers+nSimStripMonoAndStereoLayers );
2516 
2517  sim_simHitIdx.push_back(hitIdx);
2518  }
2519 }
2520 
2522  const edm::RefToBaseVector<reco::Track>& tracks) {
2523  for(size_t iVertex=0, size=vertices.size(); iVertex<size; ++iVertex) {
2524  const reco::Vertex& vertex = vertices[iVertex];
2525  vtx_x.push_back(vertex.x());
2526  vtx_y.push_back(vertex.y());
2527  vtx_z.push_back(vertex.z());
2528  vtx_xErr.push_back(vertex.xError());
2529  vtx_yErr.push_back(vertex.yError());
2530  vtx_zErr.push_back(vertex.zError());
2531  vtx_chi2.push_back(vertex.chi2());
2532  vtx_ndof.push_back(vertex.ndof());
2533  vtx_fake.push_back(vertex.isFake());
2534  vtx_valid.push_back(vertex.isValid());
2535 
2536  std::vector<int> trkIdx;
2537  for(auto iTrack = vertex.tracks_begin(); iTrack != vertex.tracks_end(); ++iTrack) {
2538  // Ignore link if vertex was fit from a track collection different from the input
2539  if(iTrack->id() != tracks.id())
2540  continue;
2541 
2542  trkIdx.push_back(iTrack->key());
2543 
2544  if(trk_vtxIdx[iTrack->key()] != -1) {
2545  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;
2546  }
2547  trk_vtxIdx[iTrack->key()] = iVertex;
2548  }
2549  vtx_trkIdx.push_back(trkIdx);
2550  }
2551 }
2552 
2554  const TrackingParticleRefKeyToIndex& tpKeyToIndex
2555  ) {
2556  int current_event = -1;
2557  for(const auto& ref: trackingVertices) {
2558  const TrackingVertex v = *ref;
2559  if(v.eventId().event() != current_event) {
2560  // next PV
2561  current_event = v.eventId().event();
2562  simpv_idx.push_back(simvtx_x.size());
2563  }
2564 
2565  unsigned int processType = std::numeric_limits<unsigned int>::max();
2566  if(!v.g4Vertices().empty()) {
2567  processType = v.g4Vertices()[0].processType();
2568  }
2569 
2570  simvtx_event.push_back(v.eventId().event());
2571  simvtx_bunchCrossing.push_back(v.eventId().bunchCrossing());
2572  simvtx_processType.push_back(processType);
2573 
2574  simvtx_x.push_back(v.position().x());
2575  simvtx_y.push_back(v.position().y());
2576  simvtx_z.push_back(v.position().z());
2577 
2578  auto fill = [&](const TrackingParticleRefVector& tps, std::vector<int>& idx) {
2579  for(const auto& tpRef: tps) {
2580  auto found = tpKeyToIndex.find(tpRef.key());
2581  if(found != tpKeyToIndex.end()) {
2582  idx.push_back(tpRef.key());
2583  }
2584  }
2585  };
2586 
2587  std::vector<int> sourceIdx;
2588  std::vector<int> daughterIdx;
2589  fill(v.sourceTracks(), sourceIdx);
2590  fill(v.daughterTracks(), daughterIdx);
2591 
2592  simvtx_sourceSimIdx.push_back(sourceIdx);
2593  simvtx_daughterSimIdx.push_back(daughterIdx);
2594  }
2595 }
2596 
2597 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
2599  //The following says we do not know what parameters are allowed so do no validation
2600  // Please change this to state exactly what you do use, even if it is no parameters
2602  desc.addUntracked<std::vector<edm::InputTag> >("seedTracks", std::vector<edm::InputTag>{
2603  edm::InputTag("seedTracksinitialStepSeeds"),
2604  edm::InputTag("seedTracksdetachedTripletStepSeeds"),
2605  edm::InputTag("seedTrackspixelPairStepSeeds"),
2606  edm::InputTag("seedTrackslowPtTripletStepSeeds"),
2607  edm::InputTag("seedTracksmixedTripletStepSeeds"),
2608  edm::InputTag("seedTrackspixelLessStepSeeds"),
2609  edm::InputTag("seedTrackstobTecStepSeeds"),
2610  edm::InputTag("seedTracksjetCoreRegionalStepSeeds"),
2611  edm::InputTag("seedTracksmuonSeededSeedsInOut"),
2612  edm::InputTag("seedTracksmuonSeededSeedsOutIn")
2613  });
2614  desc.addUntracked<edm::InputTag>("tracks", edm::InputTag("generalTracks"));
2615  desc.addUntracked<edm::InputTag>("trackingParticles", edm::InputTag("mix", "MergedTrackTruth"));
2616  desc.addUntracked<bool>("trackingParticlesRef", false);
2617  desc.addUntracked<edm::InputTag>("clusterTPMap", edm::InputTag("tpClusterProducer"));
2618  desc.addUntracked<edm::InputTag>("simHitTPMap", edm::InputTag("simHitTPAssocProducer"));
2619  desc.addUntracked<edm::InputTag>("trackAssociator", edm::InputTag("quickTrackAssociatorByHits"));
2620  desc.addUntracked<edm::InputTag>("pixelDigiSimLink", edm::InputTag("simSiPixelDigis"));
2621  desc.addUntracked<edm::InputTag>("stripDigiSimLink", edm::InputTag("simSiStripDigis"));
2622  desc.addUntracked<edm::InputTag>("phase2OTSimLink", edm::InputTag(""));
2623  desc.addUntracked<edm::InputTag>("beamSpot", edm::InputTag("offlineBeamSpot"));
2624  desc.addUntracked<edm::InputTag>("pixelRecHits", edm::InputTag("siPixelRecHits"));
2625  desc.addUntracked<edm::InputTag>("stripRphiRecHits", edm::InputTag("siStripMatchedRecHits", "rphiRecHit"));
2626  desc.addUntracked<edm::InputTag>("stripStereoRecHits", edm::InputTag("siStripMatchedRecHits", "stereoRecHit"));
2627  desc.addUntracked<edm::InputTag>("stripMatchedRecHits", edm::InputTag("siStripMatchedRecHits", "matchedRecHit"));
2628  desc.addUntracked<edm::InputTag>("phase2OTRecHits", edm::InputTag("siPhase2RecHits"));
2629  desc.addUntracked<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
2630  desc.addUntracked<edm::InputTag>("trackingVertices", edm::InputTag("mix", "MergedTrackTruth"));
2631  desc.addUntracked<edm::InputTag>("trackingParticleNlayers", edm::InputTag("trackingParticleNumberOfLayersProducer", "trackerLayers"));
2632  desc.addUntracked<edm::InputTag>("trackingParticleNpixellayers", edm::InputTag("trackingParticleNumberOfLayersProducer", "pixelLayers"));
2633  desc.addUntracked<edm::InputTag>("trackingParticleNstripstereolayers", edm::InputTag("trackingParticleNumberOfLayersProducer", "stripStereoLayers"));
2634  desc.addUntracked<std::string>("TTRHBuilder", "WithTrackAngle");
2635  desc.addUntracked<std::string>("parametersDefiner", "LhcParametersDefinerForTP");
2636  desc.addUntracked<bool>("includeSeeds", false);
2637  desc.addUntracked<bool>("includeAllHits", false);
2638  descriptions.add("trackingNtuple",desc);
2639 }
2640 
2641 //define this as a plug-in
#define LogDebug(id)
int adc(sample_type sample)
get the ADC sample (12 bits)
std::vector< unsigned short > str_lay
RunNumber_t run() const
Definition: EventID.h:39
size
Write out results.
std::vector< float > sim_pca_dz
edm::LuminosityBlockNumber_t ev_lumi
static const std::string kSharedResource
Definition: TFileService.h:76
std::vector< unsigned int > simvtx_processType
edm::EDGetTokenT< TrackingParticleRefVector > trackingParticleRefToken_
std::vector< unsigned int > sim_nLay
type
Definition: HCALResponse.h:21
std::vector< float > ph2_radL
EventNumber_t event() const
Definition: EventID.h:41
Map map_
unsigned int size_type
Definition: View.h:85
void fillTrackingVertices(const TrackingVertexRefVector &trackingVertices, const TrackingParticleRefKeyToIndex &tpKeyToIndex)
const TrackerGeomDet * idToDetUnit(DetId) const
Return the pointer to the GeomDetUnit corresponding to a given DetId.
edm::EDGetTokenT< SiStripMatchedRecHit2DCollection > stripMatchedRecHitToken_
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
int i
Definition: DBlmapReader.cc:9
edm::EDGetTokenT< SiStripRecHit2DCollection > stripRphiRecHitToken_
Phase2TrackerCluster1D const & phase2OTCluster() const
const TrackingParticleRefVector & sourceTracks() const
std::vector< short > ph2_isBarrel
std::vector< float > trk_phi
SiPixelCluster const & pixelCluster() const
std::vector< float > sim_pca_cotTheta
const_iterator end(bool update=false) const
std::vector< float > sim_pca_dxy
std::vector< unsigned int > trk_nOuterLost
size_type dataSize() const
std::vector< float > glu_xy
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 > 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 trackFromSeedFitFailed(const reco::Track &track)
std::vector< float > trk_outer_py
std::unordered_map< reco::RecoToSimCollection::index_type, size_t > TrackingParticleRefKeyToIndex
std::vector< float > pix_zz
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
std::vector< float > ph2_bbxi
std::vector< int > glu_monoIdx
std::vector< float > trk_eta
std::vector< short > glu_isBarrel
std::vector< int > sim_bunchCrossing
std::vector< unsigned int > glu_lay
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< unsigned short > inv_lay
std::vector< float > str_x
std::vector< float > see_dzErr
std::vector< unsigned int > sim_n3DLay
std::vector< float > trk_cotTheta
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
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 > 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
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
std::vector< float > trk_pt
std::vector< float > glu_x
std::vector< unsigned int > glu_det
std::vector< float > trk_inner_py
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
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
edm::EDGetTokenT< edm::View< reco::Track > > trackToken_
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
void fillBeamSpot(const reco::BeamSpot &bs)
std::vector< float > trk_outer_px
void fillTracks(const edm::RefToBaseVector< reco::Track > &tracks, const TrackingParticleRefVector &tpCollection, const TrackingParticleRefKeyToIndex &tpKeyToIndex, const reco::BeamSpot &bs, const reco::TrackToTrackingParticleAssociator &associatorByHits, const TransientTrackingRecHitBuilder &theTTRHBuilder, const TrackerTopology &tTopo, const std::set< edm::ProductID > &hitProductIds, const std::map< edm::ProductID, size_t > &seedToCollIndex)
std::vector< std::vector< int > > trk_hitType
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
edm::EDGetTokenT< Phase2TrackerRecHit1DCollectionNew > phase2OTRecHitToken_
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::pair< TrackPSimHitRef::key_type, edm::ProductID > SimHitFullKey
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< unsigned short > simhit_det
std::vector< unsigned int > inv_detId
std::vector< int > simhit_simTrkIdx
key_type key() const
Accessor for product key.
Definition: Ref.h:264
std::vector< std::vector< float > > sim_shareFrac
std::vector< short > str_isStereo
int pixelLayersWithMeasurement() const
Definition: HitPattern.cc:499
static bool tpHitIndexListLess(const TPHitIndex &i, const TPHitIndex &j)
TrackingNtuple(const edm::ParameterSet &)
void fillTrackingParticles(const edm::Event &iEvent, const edm::EventSetup &iSetup, const edm::RefToBaseVector< reco::Track > &tracks, const TrackingParticleRefVector &tpCollection, const TrackingVertexRefKeyToIndex &tvKeyToIndex, const reco::TrackToTrackingParticleAssociator &associatorByHits, const std::vector< TPHitIndex > &tpHitList)
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:7
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
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:258
std::vector< int > simpv_idx
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > pixelSimLinkToken_
std::vector< unsigned int > trk_stopReason
std::vector< std::vector< int > > pix_seeIdx
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
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 > inv_isBarrel
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
RefToBase< value_type > refAt(size_type i) 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
std::vector< float > trk_refpoint_y
std::vector< int > sim_event
std::vector< unsigned int > trk_nStrip
SiStripCluster const & stripCluster() const
std::vector< float > chargeFraction
edm::EDGetTokenT< edm::ValueMap< unsigned int > > tpNStripStereoLayersToken_
std::string parametersDefinerName_
std::vector< unsigned int > trk_nPixel
std::vector< float > glu_y
std::vector< float > trk_pz
int iEvent
Definition: GenABIO.cc:230
std::vector< float > trk_dzErr
std::vector< unsigned short > ph2_lay
std::vector< float > trk_lambdaErr
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< unsigned short > pix_lay
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
std::vector< unsigned int > trk_algo
simTrack
per collection params
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
int bunchCrossing() const
get the detector field from this detid
std::vector< int > bunchCrossing
std::vector< float > sim_eta
std::vector< unsigned int > trk_originalAlgo
std::vector< unsigned int > trk_nInnerLost
std::vector< float > str_y
std::vector< unsigned short > pix_det
std::vector< int > sim_pdgId
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
std::vector< int > see_q
std::vector< std::vector< int > > simhit_hitType
std::vector< float > trk_refpoint_z
std::vector< edm::EDGetTokenT< edm::View< reco::Track > > > seedTokens_
edm::EDGetTokenT< SimHitTPAssociationProducer::SimHitTPAssociationList > simHitTPMapToken_
std::vector< float > pix_yz
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
int j
Definition: DBlmapReader.cc:9
std::vector< std::vector< int > > ph2_simHitIdx
std::vector< float > simvtx_x
double z() const
z coordinate
Definition: Vertex.h:115
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
std::vector< float > sim_pca_pt
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
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_
size_type size() const
std::vector< float > trk_dz
std::vector< float > trk_ptErr
std::vector< unsigned int > simhit_detId
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
std::vector< float > trk_phiErr
std::vector< unsigned int > sim_nPixelLay
std::vector< float > trk_lambda
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 > 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
std::vector< float > sim_pz
std::vector< int > event
std::vector< std::vector< int > > sim_simHitIdx
edm::Ref< TrackingVertexCollection > TrackingVertexRef
std::vector< unsigned short > inv_det
std::vector< unsigned short > ph2_det
edm::EventNumber_t ev_event
Definition: DetId.h:18
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< unsigned short > simhit_lay
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
T const * product() const
Definition: Handle.h:81
std::vector< unsigned short > str_det
std::vector< unsigned int > see_nGlued
std::vector< float > see_py
std::vector< float > pix_x
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
std::vector< float > str_z
std::vector< float > str_zx
std::vector< TrackingVertex > TrackingVertexCollection
const T & get() const
Definition: EventSetup.h:56
double sigmaZ() const
sigma z
Definition: BeamSpot.h:80
std::string algoName() const
Definition: TrackBase.h:503
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
void add(std::string const &label, ParameterSetDescription const &psetDescription)
int numberOfLostHits(HitCategory category) const
Definition: HitPattern.h:902
std::vector< std::vector< int > > trk_hitIdx
std::vector< unsigned int > ph2_detId
unsigned int layer(const DetId &id) const
void labelsForToken(EDGetToken iToken, Labels &oLabels) const
std::string const & label() const
Definition: InputTag.h:36
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_
std::vector< short > vtx_valid
edm::EventID id() const
Definition: EventBase.h:58
const EncodedEventId & eventId() const
edm::EDGetTokenT< ClusterTPAssociation > clusterTPMapToken_
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
std::vector< short > str_isBarrel
virtual void analyze(const edm::Event &, const edm::EventSetup &) override
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::map< SimHitFullKey, size_t > SimHitRefKeyToIndex
static int pixelToChannel(int row, int col)
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
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
int numberOfValidPixelHits() const
Definition: HitPattern.h:838
edm::Ref< edm::PSimHitContainer > TrackPSimHitRef
std::vector< std::vector< int > > str_simHitIdx
std::string builderName_
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
std::vector< float > simhit_x
const Point & position() const
position
Definition: BeamSpot.h:62
std::vector< float > simvtx_y
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
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
std::vector< int > see_trkIdx
math::XYZVectorD Vector
point in the space
std::vector< float > simhit_tof
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
void fillVertices(const reco::VertexCollection &vertices, const edm::RefToBaseVector< reco::Track > &tracks)
std::vector< float > pix_xy
std::vector< float > trk_dxy
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
std::vector< float > vtx_x
std::vector< unsigned int > see_nPixel
edm::Ref< TrackingParticleCollection > TrackingParticleRef
ProductID id() const
std::vector< float > see_eta
const std::vector< uint8_t > & amplitudes() const
std::vector< unsigned int > trk_nValid
std::vector< float > trk_inner_px
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
std::vector< unsigned int > pix_detId
std::vector< float > simhit_eloss
Definition: event.py:1
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
std::vector< unsigned int > glu_detId
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
std::vector< unsigned int > str_detId