CMS 3D CMS Logo

SiPixelPhase1TrackingParticleV.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelPhase1TrackingParticleV
4 // Class: SiPixelPhase1TrackingParticleV
5 //
6 
7 // Original Author: Marcel Schneider
8 // Additional Authors: Alexander Morton - modifying code for validation use
9 
12 
15 
18 
21 
22 class TrackAssociatorByHits;
23 
24 namespace {
25  bool trackIdHitPairLess(const std::pair<unsigned int, const PSimHit*>& a, const std::pair<unsigned int, const PSimHit*>& b) {
26  return a.first < b.first;
27  }
28 
29  bool trackIdHitPairLessSort(const std::pair<unsigned int, const PSimHit*>& a, const std::pair<unsigned int, const PSimHit*>& b) {
30  if(a.first == b.first) {
31  const auto atof = edm::isFinite(a.second->timeOfFlight()) ? a.second->timeOfFlight() : std::numeric_limits<decltype(a.second->timeOfFlight())>::max();
32  const auto btof = edm::isFinite(b.second->timeOfFlight()) ? b.second->timeOfFlight() : std::numeric_limits<decltype(b.second->timeOfFlight())>::max();
33  return atof < btof;
34  }
35  return a.first < b.first;
36  }
37 }
38 
39 
41  SiPixelPhase1Base(iConfig),
42  vec_TrackingParticle_Token_( consumes<TrackingParticleCollection>( iConfig.getParameter<edm::InputTag>( "src" ) ) )
43 {
44  for(const auto& tag: iConfig.getParameter<std::vector<edm::InputTag>>("simHitToken")) {
45  simHitTokens_.push_back(consumes<std::vector<PSimHit>>(tag));
46  }
47 }
48 
50 
51  edm::Handle<TrackingParticleCollection> TruthTrackContainer;
52  iEvent.getByToken( vec_TrackingParticle_Token_, TruthTrackContainer );
53  const TrackingParticleCollection *tPC = TruthTrackContainer.product();
54  std::vector<std::pair<unsigned int, const PSimHit *>> trackIdToHitPtr;
55 
56  // A multimap linking SimTrack::trackId() to a pointer to PSimHit
57  // Similar to TrackingTruthAccumulator
58  for(const auto& simHitToken: simHitTokens_) {
60  iEvent.getByToken(simHitToken, hsimhits);
61  trackIdToHitPtr.reserve(trackIdToHitPtr.size()+hsimhits->size());
62  for(const auto& simHit: *hsimhits) {
63  trackIdToHitPtr.emplace_back(simHit.trackId(), &simHit);
64  }
65  }
66  std::stable_sort(trackIdToHitPtr.begin(), trackIdToHitPtr.end(), trackIdHitPairLessSort);
67 
68 
69  // Loop over TrackingParticle's
70  for (TrackingParticleCollection::const_iterator t = tPC -> begin(); t != tPC -> end(); ++t) {
71 
72  // histo manager requires a det ID, use first tracker hit
73 
74  bool isBpixtrack = false, isFpixtrack = false;
75  DetId id;
76 
77  for(const SimTrack& simTrack: t->g4Tracks()) {
78  // Logic is from TrackingTruthAccumulator
79  auto range = std::equal_range(trackIdToHitPtr.begin(), trackIdToHitPtr.end(), std::pair<unsigned int, const PSimHit *>(simTrack.trackId(), nullptr), trackIdHitPairLess);
80  if(range.first == range.second) continue;
81 
82  auto iHitPtr = range.first;
83  for(; iHitPtr != range.second; ++iHitPtr) {
84  const PSimHit& simHit = *(iHitPtr->second);
85  if(simHit.eventId() != t->eventId())
86  continue;
87  id = DetId( simHit.detUnitId() );
88 
89  // check we are in pixel
90  uint32_t subdetid = (id.subdetId());
91  if (subdetid == PixelSubdetector::PixelBarrel) isBpixtrack = true;
92  if (subdetid == PixelSubdetector::PixelEndcap) isFpixtrack = true;
93  if (subdetid != PixelSubdetector::PixelBarrel && subdetid != PixelSubdetector::PixelEndcap) continue;
94  }
95  }
96 
97  if ( isBpixtrack || isFpixtrack ) {
98  histo[MASS].fill(t->mass(), id, &iEvent);
99  histo[CHARGE].fill(t->charge(), id, &iEvent);
100  histo[ID].fill(t->pdgId(), id, &iEvent);
101  histo[NHITS].fill(t->numberOfTrackerHits(), id, &iEvent);
102  histo[MATCHED].fill(t->numberOfTrackerLayers(), id, &iEvent);
103  histo[PT].fill(sqrt(t->momentum().perp2()), id, &iEvent);
104  histo[PHI].fill(t->momentum().Phi(), id, &iEvent);
105  histo[ETA].fill(t->momentum().eta(), id, &iEvent);
106  histo[VTX].fill(t->vx(), id, &iEvent);
107  histo[VTY].fill(t->vy(), id, &iEvent);
108  histo[VYZ].fill(t->vz(), id, &iEvent);
109  histo[TIP].fill(sqrt(t->vertex().perp2()), id, &iEvent);
110  histo[LIP].fill(t->vz(), id, &iEvent);
111  }
112  }
113 }
114 
116 
T getParameter(std::string const &) const
std::vector< TrackingParticle > TrackingParticleCollection
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
bool isFinite(T x)
int iEvent
Definition: GenABIO.cc:230
simTrack
per collection params
T sqrt(T t)
Definition: SSEVec.h:18
EncodedEventId eventId() const
Definition: PSimHit.h:105
#define end
Definition: vmac.h:39
edm::EDGetTokenT< TrackingParticleCollection > vec_TrackingParticle_Token_
Definition: DetId.h:18
T const * product() const
Definition: Handle.h:81
double b
Definition: hdecay.h:120
std::vector< HistogramManager > histo
#define begin
Definition: vmac.h:32
HLT enums.
double a
Definition: hdecay.h:121
void analyze(const edm::Event &, const edm::EventSetup &) override
SiPixelPhase1TrackingParticleV(const edm::ParameterSet &conf)
std::vector< edm::EDGetTokenT< std::vector< PSimHit > > > simHitTokens_
unsigned int detUnitId() const
Definition: PSimHit.h:93