CMS 3D CMS Logo

PFCheckHitPattern.cc
Go to the documentation of this file.
2 
3 // To get Tracker Geometry
9 
10 // To convert detId to subdet/layer number.
14 
15 #include <map>
16 
17 using namespace reco;
18 using namespace std;
19 
20 void PFCheckHitPattern::init(const TrackerTopology* tkerTopo, const TrackerGeometry* tkerGeom) {
21 
22  //
23  // Note min/max radius (z) of each barrel layer (endcap disk).
24  //
25 
26  geomInitDone_ = true;
27 
28  // Get Tracker geometry
29  const TrackingGeometry::DetContainer& dets = tkerGeom->dets();
30 
31  // Loop over all modules in the Tracker.
32  for (unsigned int i = 0; i < dets.size(); i++) {
33 
34  // Get subdet and layer of this module
35  auto detId = dets[i]->geographicalId();
36  auto detInfo = DetInfo(detId.subdetId(), tkerTopo->layer(detId));
37  uint32_t subDet = detInfo.first;
38 
39  // Note r (or z) of module if barrel (or endcap).
40  double r_or_z;
41  if (this->barrel(subDet)) {
42  r_or_z = dets[i]->position().perp();
43  } else {
44  r_or_z = fabs(dets[i]->position().z());
45  }
46 
47  // Recover min/max r/z value of this layer/disk found so far.
48  double minRZ = 999.;
49  double maxRZ = 0.;
50  if (rangeRorZ_.find(detInfo) != rangeRorZ_.end()) {
51  minRZ = rangeRorZ_[detInfo].first;
52  maxRZ = rangeRorZ_[detInfo].second;
53  }
54 
55  // Update with those of this module if it exceeds them.
56  if (minRZ > r_or_z) minRZ = r_or_z;
57  if (maxRZ < r_or_z) maxRZ = r_or_z;
58  rangeRorZ_[detInfo] = pair<double, double>(minRZ, maxRZ);
59  }
60 
61 #if 0
62  //def DEBUG_CHECKHITPATTERN
63  RZrangeMap::const_iterator d;
64  for (d = rangeRorZ_.begin(); d != rangeRorZ_.end(); d++) {
65  DetInfo detInfo = d->first;
66  pair<double, double> rangeRZ = d->second;
67  }
68 #endif
69 }
70 
71 bool PFCheckHitPattern::barrel(uint32_t subDet) {
72  // Determines if given sub-detector is in the barrel.
73  return (subDet == StripSubdetector::TIB || subDet == StripSubdetector::TOB ||
75 }
76 
77 
78 pair< PFCheckHitPattern::PFTrackHitInfo, PFCheckHitPattern::PFTrackHitInfo>
80  const TrackBaseRef track, const TransientVertex& vert)
81 {
82 
83  // PFCheck if hit pattern of this track is consistent with it being produced
84  // at given vertex. Pair.first gives number of hits on track in front of vertex.
85  // Pair.second gives number of missing hits between vertex and innermost hit
86  // on track.
87 
88  // Initialise geometry info if not yet done.
89  if (!geomInitDone_) this->init(tkerTopo, tkerGeom);
90 
91  // Get hit patterns of this track
92  const reco::HitPattern& hp = track.get()->hitPattern();
93 
94  // Count number of valid hits on track definately in front of the vertex,
95  // taking into account finite depth of each layer.
96  unsigned int nHitBefore = 0;
97  unsigned int nHitAfter = 0;
98 
99  for (int i = 0; i < hp.numberOfAllHits(HitPattern::TRACK_HITS); i++) {
100  uint32_t hit = hp.getHitPattern(HitPattern::TRACK_HITS, i);
101  if (hp.trackerHitFilter(hit) && hp.validHitFilter(hit)) {
102  uint32_t subDet = hp.getSubStructure(hit);
103  uint32_t layer = hp.getLayer(hit);
104  DetInfo detInfo(subDet, layer);
105  double maxRZ = rangeRorZ_[detInfo].second;
106 
107  if (this->barrel(subDet)) {
108  if (vert.position().perp() > maxRZ) nHitBefore++;
109  else nHitAfter++;
110  } else {
111  if (fabs(vert.position().z()) > maxRZ) nHitBefore++;
112  else nHitAfter++;
113  }
114  }
115  }
116 
117  // Count number of missing hits before the innermost hit on the track,
118  // taking into account finite depth of each layer.
119  unsigned int nMissHitAfter = 0;
120  unsigned int nMissHitBefore = 0;
121 
122  for (int i = 0; i < hp.numberOfAllHits(HitPattern::MISSING_INNER_HITS); i++) {
125  uint32_t subDet = reco::HitPattern::getSubStructure(hit);
126  uint32_t layer = reco::HitPattern::getLayer(hit);
127  DetInfo detInfo(subDet, layer);
128  double minRZ = rangeRorZ_[detInfo].first;
129 
130  // cout << "subDet = " << subDet << " layer = " << layer << " minRZ = " << minRZ << endl;
131 
132  if (this->barrel(subDet)) {
133  if (vert.position().perp() < minRZ) nMissHitAfter++;
134  else nMissHitBefore++;
135  } else {
136  if (fabs(vert.position().z()) < minRZ) nMissHitAfter++;
137  else nMissHitBefore++;
138  }
139  }
140  }
141 
142 
143  PFTrackHitInfo trackToVertex(nHitBefore, nMissHitBefore);
144  PFTrackHitInfo trackFromVertex(nHitAfter, nMissHitAfter);
145 
146 
147  return pair< PFTrackHitInfo, PFTrackHitInfo>(trackToVertex, trackFromVertex);
148 }
149 
151  // Get hit patterns of this track
152  const reco::HitPattern &hp = track.get()->hitPattern();
153 
154  cout<<"=== Hits on Track ==="<<endl;
156  cout<<"=== Hits before track ==="<<endl;
158 }
159 
161  for (int i = 0; i < hp.numberOfAllHits(category); i++) {
162  uint32_t hit = hp.getHitPattern(category, i);
163  if (hp.trackerHitFilter(hit)) {
164  uint32_t subdet = hp.getSubStructure(hit);
165  uint32_t layer = hp.getLayer(hit);
166  cout<<"hit "<<i<<" subdet="<<subdet<<" layer="<<layer<<" type "<<hp.getHitType(hit)<<endl;
167  }
168  }
169 }
value_type const * get() const
Definition: RefToBase.h:234
static uint32_t getLayer(uint16_t pattern)
Definition: HitPattern.h:751
T perp() const
Definition: PV3DBase.h:72
int init
Definition: HydjetWrapper.h:67
void print(const reco::TrackBaseRef track) const
Print hit pattern on track.
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
static bool missingHitFilter(uint16_t pattern)
Definition: HitPattern.h:852
static bool validHitFilter(uint16_t pattern)
Definition: HitPattern.h:847
std::pair< unsigned int, unsigned int > PFTrackHitInfo
const DetContainer & dets() const override
Returm a vector of all GeomDet (including all GeomDetUnits)
PFTrackHitFullInfo analyze(const TrackerTopology *tkerTopo, const TrackerGeometry *tkerGeom, const reco::TrackBaseRef track, const TransientVertex &vert)
static uint32_t getHitType(uint16_t pattern)
Definition: HitPattern.h:784
susybsm::HSCParticleRefProd hp
Definition: classes.h:27
GlobalPoint position() const
T z() const
Definition: PV3DBase.h:64
int numberOfAllHits(HitCategory category) const
Definition: HitPattern.h:867
void init(const TrackerTopology *, const TrackerGeometry *)
Create map indicating r/z values of all layers/disks.
static uint32_t getSubStructure(uint16_t pattern)
Definition: HitPattern.h:742
static bool trackerHitFilter(uint16_t pattern)
Definition: HitPattern.h:707
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:479
unsigned int layer(const DetId &id) const
fixed size matrix
std::vector< const GeomDet * > DetContainer
std::pair< uint32_t, uint32_t > DetInfo
static int position[264][3]
Definition: ReadPGInfo.cc:509
uint16_t getHitPattern(HitCategory category, int position) const
Definition: HitPattern.h:545
static bool barrel(uint32_t subDet)
Return a bool indicating if a given subdetector is in the barrel.