CMS 3D CMS Logo

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 }
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
mps_fire.i
i
Definition: mps_fire.py:355
PixelSubdetector::PixelEndcap
Definition: PixelSubdetector.h:11
PixelSubdetector::PixelBarrel
Definition: PixelSubdetector.h:11
SiPixelPhase1TrackingParticleV_cfi.simHitToken
simHitToken
Definition: SiPixelPhase1TrackingParticleV_cfi.py:122
ESHandle.h
TrackerTopology::tobIsStereo
bool tobIsStereo(const DetId &id) const
Definition: TrackerTopology.h:264
edm::EDGetTokenT
Definition: EDGetToken.h:33
TrackerTopology
Definition: TrackerTopology.h:16
TrackerTopology::tidIsRPhi
bool tidIsRPhi(const DetId &id) const
Definition: TrackerTopology.h:272
TrackingParticleNumberOfLayers::nStripMonoAndStereoLayers
Definition: TrackingParticleNumberOfLayers.h:49
TrackerTopology::tecIsStereo
bool tecIsStereo(const DetId &id) const
Definition: TrackerTopology.h:265
TrackerTopology::layer
unsigned int layer(const DetId &id) const
Definition: TrackerTopology.cc:47
TrackingParticleNumberOfLayers.h
TrackingParticleNumberOfLayers::nPixelLayers
Definition: TrackingParticleNumberOfLayers.h:49
edm::Handle
Definition: AssociativeIterator.h:50
TrackerTopology::tobIsRPhi
bool tobIsRPhi(const DetId &id) const
Definition: TrackerTopology.h:269
TrackerTopology::tidIsStereo
bool tidIsStereo(const DetId &id) const
Definition: TrackerTopology.h:267
DetId
Definition: DetId.h:17
TrackerTopology.h
TrackerTopology::tecIsRPhi
bool tecIsRPhi(const DetId &id) const
Definition: TrackerTopology.h:270
TrackerTopologyRcd.h
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
rpcPointValidation_cfi.simHit
simHit
Definition: rpcPointValidation_cfi.py:24
TrackingParticle
Monte Carlo truth information used for tracking validation.
Definition: TrackingParticle.h:29
edm::ESHandle< TrackerTopology >
TrackerTopology::tibIsStereo
bool tibIsStereo(const DetId &id) const
Definition: TrackerTopology.h:266
StripSubdetector::TIB
static constexpr auto TIB
Definition: StripSubdetector.h:16
b
double b
Definition: hdecay.h:118
cmsswSequenceInfo.tp
tp
Definition: cmsswSequenceInfo.py:17
DetId::subdetId
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum)
Definition: DetId.h:48
MuonTCMETValueMapProducer_cff.nLayers
nLayers
Definition: MuonTCMETValueMapProducer_cff.py:38
TrackingParticleNumberOfLayers::calculate
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
Definition: TrackingParticleNumberOfLayers.cc:49
a
double a
Definition: hdecay.h:119
fastTrackerRecHitType::isPixel
bool isPixel(HitType hitType)
Definition: FastTrackerRecHit.h:37
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
trigObjTnPSource_cfi.filler
filler
Definition: trigObjTnPSource_cfi.py:21
muonSimHitMatcherPSet.simTrack
simTrack
Definition: muonSimHitMatcherPSet.py:4
iEvent
int iEvent
Definition: GenABIO.cc:224
EgammaValidation_cff.pdgId
pdgId
Definition: EgammaValidation_cff.py:118
edm::EventSetup
Definition: EventSetup.h:57
get
#define get
eostools.move
def move(src, dest)
Definition: eostools.py:511
StripSubdetector::TEC
static constexpr auto TEC
Definition: StripSubdetector.h:19
isFinite.h
SimTrack
Definition: SimTrack.h:6
TrackingParticleNumberOfLayers::trackIdToHitPtr_
std::vector< std::pair< unsigned int, const PSimHit * > > trackIdToHitPtr_
Definition: TrackingParticleNumberOfLayers.h:57
StripSubdetector::TOB
static constexpr auto TOB
Definition: StripSubdetector.h:18
TrackingParticleCollection
std::vector< TrackingParticle > TrackingParticleCollection
Definition: TrackingParticleFwd.h:8
edm::helper::Filler
Definition: ValueMap.h:22
edm::isFinite
constexpr bool isFinite(T x)
TrackerTopologyRcd
Definition: TrackerTopologyRcd.h:10
PSimHit
Definition: PSimHit.h:15
PbPb_ZMuSkimMuonDPG_cff.particleType
particleType
Definition: PbPb_ZMuSkimMuonDPG_cff.py:27
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
TrackerTopology::tibIsRPhi
bool tibIsRPhi(const DetId &id) const
Definition: TrackerTopology.h:271
edm::Event
Definition: Event.h:73
StripSubdetector.h
TrackingParticleNumberOfLayers::TrackingParticleNumberOfLayers
TrackingParticleNumberOfLayers(const edm::Event &iEvent, const std::vector< edm::EDGetTokenT< std::vector< PSimHit >>> &simHitTokens)
Definition: TrackingParticleNumberOfLayers.cc:31
StripSubdetector::TID
static constexpr auto TID
Definition: StripSubdetector.h:17