CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackingParticleNumberOfLayers.cc
Go to the documentation of this file.
2 
4 
9 
10 namespace {
11  bool trackIdHitPairLess(const std::pair<unsigned int, const PSimHit *> &a,
12  const std::pair<unsigned int, const PSimHit *> &b) {
13  return a.first < b.first;
14  }
15 
16  bool trackIdHitPairLessSort(const std::pair<unsigned int, const PSimHit *> &a,
17  const std::pair<unsigned int, const PSimHit *> &b) {
18  if (a.first == b.first) {
19  const auto atof = edm::isFinite(a.second->timeOfFlight())
20  ? a.second->timeOfFlight()
21  : std::numeric_limits<decltype(a.second->timeOfFlight())>::max();
22  const auto btof = edm::isFinite(b.second->timeOfFlight())
23  ? b.second->timeOfFlight()
24  : std::numeric_limits<decltype(b.second->timeOfFlight())>::max();
25  return atof < btof;
26  }
27  return a.first < b.first;
28  }
29 } // namespace
30 
32  const edm::Event &iEvent, const std::vector<edm::EDGetTokenT<std::vector<PSimHit>>> &simHitTokens) {
33  // A multimap linking SimTrack::trackId() to a pointer to PSimHit
34  // Similar to TrackingTruthAccumulator
35  for (const auto &simHitToken : simHitTokens) {
37  iEvent.getByToken(simHitToken, hsimhits);
38  trackIdToHitPtr_.reserve(trackIdToHitPtr_.size() + hsimhits->size());
39  for (const auto &simHit : *hsimhits) {
40  trackIdToHitPtr_.emplace_back(simHit.trackId(), &simHit);
41  }
42  }
43  std::stable_sort(trackIdToHitPtr_.begin(), trackIdToHitPtr_.end(), trackIdHitPairLessSort);
44 }
45 
46 std::tuple<std::unique_ptr<edm::ValueMap<unsigned int>>,
47  std::unique_ptr<edm::ValueMap<unsigned int>>,
48  std::unique_ptr<edm::ValueMap<unsigned int>>>
50  const edm::EventSetup &iSetup) const {
51  // Retrieve tracker topology from geometry
53  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
54  const TrackerTopology &tTopo = *tTopoHandle;
55 
56  const TrackingParticleCollection &tps = *htps;
57  std::vector<unsigned int> valuesLayers(tps.size(), 0);
58  std::vector<unsigned int> valuesPixelLayers(tps.size(), 0);
59  std::vector<unsigned int> valuesStripMonoAndStereoLayers(tps.size(), 0);
60  for (size_t iTP = 0; iTP < tps.size(); ++iTP) {
61  const TrackingParticle &tp = tps[iTP];
62  const auto pdgId = tp.pdgId();
63 
64  // I would prefer a better way...
65  constexpr unsigned int maxSubdet = static_cast<unsigned>(StripSubdetector::TEC) + 1;
66  constexpr unsigned int maxLayer = 0xF + 1; // as in HitPattern.h
67  bool hasHit[maxSubdet][maxLayer];
68  bool hasPixel[maxSubdet][maxLayer];
69  bool hasMono[maxSubdet][maxLayer];
70  bool hasStereo[maxSubdet][maxLayer];
71  memset(hasHit, 0, sizeof(hasHit));
72  memset(hasPixel, 0, sizeof(hasPixel));
73  memset(hasMono, 0, sizeof(hasMono));
74  memset(hasStereo, 0, sizeof(hasStereo));
75 
76  for (const SimTrack &simTrack : tp.g4Tracks()) {
77  // Logic is from TrackingTruthAccumulator
78  auto range = std::equal_range(trackIdToHitPtr_.begin(),
79  trackIdToHitPtr_.end(),
80  std::pair<unsigned int, const PSimHit *>(simTrack.trackId(), nullptr),
81  trackIdHitPairLess);
82  if (range.first == range.second)
83  continue;
84 
85  auto iHitPtr = range.first;
86  for (; iHitPtr != range.second; ++iHitPtr) {
87  // prevent simhits with particleType != pdgId from being the "first hit"
88  if (iHitPtr->second->particleType() == pdgId)
89  break;
90  }
91  if (iHitPtr == range.second) // no simhits with particleType == pdgId
92  continue;
93  int processType = iHitPtr->second->processType();
94  int particleType = iHitPtr->second->particleType();
95 
96  for (; iHitPtr != range.second; ++iHitPtr) {
97  const PSimHit &simHit = *(iHitPtr->second);
98  if (simHit.eventId() != tp.eventId())
99  continue;
100  DetId newDetector = DetId(simHit.detUnitId());
101 
102  // Check for delta and interaction products discards
103  if (processType == simHit.processType() && particleType == simHit.particleType() &&
104  pdgId == simHit.particleType()) {
105  // The logic of this piece follows HitPattern
106  bool isPixel = false;
107  bool isStripStereo = false;
108  bool isStripMono = false;
109 
110  switch (newDetector.subdetId()) {
113  isPixel = true;
114  break;
116  isStripMono = tTopo.tibIsRPhi(newDetector);
117  isStripStereo = tTopo.tibIsStereo(newDetector);
118  break;
120  isStripMono = tTopo.tidIsRPhi(newDetector);
121  isStripStereo = tTopo.tidIsStereo(newDetector);
122  break;
124  isStripMono = tTopo.tobIsRPhi(newDetector);
125  isStripStereo = tTopo.tobIsStereo(newDetector);
126  break;
128  isStripMono = tTopo.tecIsRPhi(newDetector);
129  isStripStereo = tTopo.tecIsStereo(newDetector);
130  break;
131  }
132 
133  const auto subdet = newDetector.subdetId();
134  const auto layer = tTopo.layer(newDetector);
135 
136  hasHit[subdet][layer] = true;
137  if (isPixel)
138  hasPixel[subdet][layer] = isPixel;
139  else if (isStripMono)
140  hasMono[subdet][layer] = isStripMono;
141  else if (isStripStereo)
142  hasStereo[subdet][layer] = isStripStereo;
143  }
144  }
145  }
146 
147  unsigned int nLayers = 0;
148  unsigned int nPixelLayers = 0;
149  unsigned int nStripMonoAndStereoLayers = 0;
150  for (unsigned int i = 0; i < maxSubdet; ++i) {
151  for (unsigned int j = 0; j < maxLayer; ++j) {
152  nLayers += hasHit[i][j];
153  nPixelLayers += hasPixel[i][j];
154  nStripMonoAndStereoLayers += (hasMono[i][j] && hasStereo[i][j]);
155  }
156  }
157 
158  valuesLayers[iTP] = nLayers;
159  valuesPixelLayers[iTP] = nPixelLayers;
160  valuesStripMonoAndStereoLayers[iTP] = nStripMonoAndStereoLayers;
161  }
162 
163  auto ret0 = std::make_unique<edm::ValueMap<unsigned int>>();
164  {
166  filler.insert(htps, valuesLayers.begin(), valuesLayers.end());
167  filler.fill();
168  }
169  auto ret1 = std::make_unique<edm::ValueMap<unsigned int>>();
170  {
172  filler.insert(htps, valuesPixelLayers.begin(), valuesPixelLayers.end());
173  filler.fill();
174  }
175  auto ret2 = std::make_unique<edm::ValueMap<unsigned int>>();
176  {
178  filler.insert(htps, valuesStripMonoAndStereoLayers.begin(), valuesStripMonoAndStereoLayers.end());
179  filler.fill();
180  }
181 
182  return std::make_tuple(std::move(ret0), std::move(ret1), std::move(ret2));
183 }
static constexpr auto TEC
constexpr int nLayers
Definition: Common.h:13
const std::vector< SimTrack > & g4Tracks() const
TrackingParticleNumberOfLayers(const edm::Event &iEvent, const std::vector< edm::EDGetTokenT< std::vector< PSimHit >>> &simHitTokens)
std::vector< TrackingParticle > TrackingParticleCollection
bool tobIsStereo(const DetId &id) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
int pdgId() const
PDG ID.
void insert(const H &h, I begin, I end)
Definition: ValueMap.h:53
bool tobIsRPhi(const DetId &id) const
constexpr bool isFinite(T x)
bool tidIsStereo(const DetId &id) const
bool tecIsStereo(const DetId &id) const
int iEvent
Definition: GenABIO.cc:224
bool tibIsRPhi(const DetId &id) const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
EncodedEventId eventId() const
Definition: PSimHit.h:108
static constexpr auto TOB
bool tecIsRPhi(const DetId &id) const
std::vector< std::pair< unsigned int, const PSimHit * > > trackIdToHitPtr_
Definition: DetId.h:17
bool tidIsRPhi(const DetId &id) const
static constexpr auto TIB
bool tibIsStereo(const DetId &id) const
double b
Definition: hdecay.h:118
unsigned short processType() const
Definition: PSimHit.h:120
unsigned int layer(const DetId &id) const
EncodedEventId eventId() const
Signal source, crossing number.
std::tuple< std::unique_ptr< edm::ValueMap< unsigned int > >, std::unique_ptr< edm::ValueMap< unsigned int > >, std::unique_ptr< edm::ValueMap< unsigned int > > > calculate(const edm::Handle< TrackingParticleCollection > &tps, const edm::EventSetup &iSetup) const
int particleType() const
Definition: PSimHit.h:89
double a
Definition: hdecay.h:119
T get() const
Definition: EventSetup.h:73
bool isPixel(HitType hitType)
Monte Carlo truth information used for tracking validation.
static constexpr auto TID
def move(src, dest)
Definition: eostools.py:511
#define constexpr
unsigned int detUnitId() const
Definition: PSimHit.h:97