CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ValidHitPairFilter.cc
Go to the documentation of this file.
3 
7 
9 
11 
14 
17 
20 
23 
25 
28 
30 
34 
36 
37 using namespace std;
38 
39 enum { BPix1=1, BPix2=2, BPix3=3,
42 
43 /*****************************************************************************/
44 float spin(float ph)
45 {
46  if(ph < 0) ph += 2 * M_PI;
47  return ph;
48 }
49 
50 /*****************************************************************************/
52  (const edm::ParameterSet& ps, const edm::EventSetup& es)
53 {
54  // Get tracker
55  edm::ESHandle<TrackerGeometry> trackerHandle;
56  es.get<TrackerDigiGeometryRecord>().get(trackerHandle);
57  theTracker = trackerHandle.product();
58 
59  // Get geometric search tracker
60  edm::ESHandle<GeometricSearchTracker> geometricSearchTrackerHandle;
61  es.get<TrackerRecoGeometryRecord>().get(geometricSearchTrackerHandle);
62  theGSTracker = geometricSearchTrackerHandle.product();
63 
64  // Get magnetic field
65  edm::ESHandle<MagneticField> magneticFieldHandle;
66  es.get<IdealMagneticFieldRecord>().get(magneticFieldHandle);
67  theMagneticField = magneticFieldHandle.product();
68 
69  // Get propagator
70  edm::ESHandle<Propagator> thePropagatorHandle;
71  es.get<TrackingComponentsRecord>().get("AnalyticalPropagator",
72  thePropagatorHandle);
73  thePropagator = thePropagatorHandle.product();
74 
75  // Bounds, hardwired FIXME
76  rzBounds[0].resize(8); phBounds[0].resize(20);
77  rzBounds[1].resize(8); phBounds[1].resize(32);
78  rzBounds[2].resize(8); phBounds[2].resize(44);
79 
80  rzBounds[3].resize(7); phBounds[3].resize(24);
81  rzBounds[4].resize(7); phBounds[4].resize(24);
82  rzBounds[5].resize(7); phBounds[5].resize(24);
83  rzBounds[6].resize(7); phBounds[6].resize(24);
84 
85  LogTrace("MinBiasTracking")
86  << " [ValidHitPairFilter] initializing pixel barrel";
87 
88  for(TrackerGeometry::DetContainer::const_iterator
89  det = theTracker->detsPXB().begin();
90  det!= theTracker->detsPXB().end(); det++)
91  {
92  PXBDetId pid((*det)->geographicalId());
93 
94  int il = pid.layer() - 1;
95  int irz = pid.module() - 1;
96  int iph = pid.ladder() - 1;
97 
98  rzBounds[il][irz] = (*det)->position().z();
99  phBounds[il][iph] = spin((*det)->position().phi());
100  }
101 
102  LogTrace("MinBiasTracking")
103  << " [ValidHitPairFilter] initializing pixel endcap";
104 
105  for(TrackerGeometry::DetContainer::const_iterator
106  det = theTracker->detsPXF().begin();
107  det!= theTracker->detsPXF().end(); det++)
108  {
109  PXFDetId pid((*det)->geographicalId());
110 
111  int il = BPix3 + ((pid.side() -1) << 1) + (pid.disk() -1);
112  int irz = ((pid.module()-1) << 1) + (pid.panel()-1);
113  int iph = (pid.blade() -1);
114 
115  rzBounds[il][irz] = (*det)->position().perp();
116  phBounds[il][iph] = spin((*det)->position().phi());
117  }
118 
119  for(int i = 0; i < 7; i++)
120  {
121  sort(rzBounds[i].begin(), rzBounds[i].end());
122  sort(phBounds[i].begin(), phBounds[i].end());
123  }
124 }
125 
126 /*****************************************************************************/
128 {
129 }
130 /*****************************************************************************/
132 {
133  DetId id(recHit.geographicalId());
134 
135  if(id.subdetId() == int(PixelSubdetector::PixelBarrel))
136  {
137  PXBDetId pid(id);
138  return pid.layer();
139  }
140  else
141  {
142  PXFDetId pid(id);
143  return BPix3 + ((pid.side()-1) << 1) + pid.disk();
144  }
145 }
146 
147 /*****************************************************************************/
148 vector<int> ValidHitPairFilter::getMissingLayers(int a, int b) const
149 {
150  vector<int> l;
151  pair<int,int> c(a,b);
152 
153  if(c == pair<int,int>(BPix1,BPix2)) { l.push_back(int(BPix3));
154  l.push_back(int(FPix1_pos));
155  l.push_back(int(FPix1_neg)); return l; }
156  if(c == pair<int,int>(BPix1,BPix3)) { l.push_back(int(BPix2)); return l; }
157  if(c == pair<int,int>(BPix2,BPix3)) { l.push_back(int(BPix1)); return l; }
158  if(c == pair<int,int>(BPix1,FPix1_pos)) { l.push_back(int(BPix2));
159  l.push_back(int(FPix2_pos)); return l; }
160  if(c == pair<int,int>(BPix1,FPix1_neg)) { l.push_back(int(BPix2));
161  l.push_back(int(FPix2_neg)); return l; }
162  if(c == pair<int,int>(BPix1,FPix2_pos)) { l.push_back(int(BPix2));
163  l.push_back(int(FPix1_pos)); return l; }
164  if(c == pair<int,int>(BPix1,FPix2_neg)) { l.push_back(int(BPix2));
165  l.push_back(int(FPix1_neg)); return l; }
166  if(c == pair<int,int>(BPix2,FPix1_pos)) { l.push_back(int(BPix1));
167  l.push_back(int(FPix2_pos)); return l; }
168  if(c == pair<int,int>(BPix2,FPix1_neg)) { l.push_back(int(BPix1));
169  l.push_back(int(FPix2_neg)); return l; }
170  if(c == pair<int,int>(BPix2,FPix2_pos)) { l.push_back(int(BPix1));
171  l.push_back(int(FPix1_pos)); return l; }
172  if(c == pair<int,int>(BPix2,FPix2_neg)) { l.push_back(int(BPix1));
173  l.push_back(int(FPix1_neg)); return l; }
174  if(c == pair<int,int>(FPix1_pos,FPix2_pos)) { l.push_back(int(BPix1)); return l; }
175  if(c == pair<int,int>(FPix1_neg,FPix2_neg)) { l.push_back(int(BPix1)); return l; }
176 
177  return l;
178 }
179 
180 /*****************************************************************************/
182  (const reco::Track & track) const
183 {
184  GlobalPoint position(track.vertex().x(),
185  track.vertex().y(),
186  track.vertex().z());
187 
188  GlobalVector momentum(track.momentum().x(),
189  track.momentum().y(),
190  track.momentum().z());
191 
192  GlobalTrajectoryParameters gtp(position, momentum,
193  track.charge(), theMagneticField);
194 
195  FreeTrajectoryState fts(gtp);
196 
197  return fts;
198 }
199 
200 /*****************************************************************************/
201 vector<const GeomDet *> ValidHitPairFilter::getCloseDets
202  (int il,
203  float rz, const vector<float>& rzB,
204  float ph, const vector<float>& phB) const
205 {
206  vector<int> rzVec, phVec;
207 
208  // Radius or z
209  vector<float>::const_iterator irz = lower_bound(rzB.begin(),rzB.end(), rz);
210  if(irz > rzB.begin()) rzVec.push_back(irz - rzB.begin() - 1);
211  if(irz < rzB.end() ) rzVec.push_back(irz - rzB.begin() );
212 
213  // Phi, circular
214  vector<float>::const_iterator iph = lower_bound(phB.begin(),phB.end(), ph);
215  if(iph > phB.begin()) phVec.push_back(iph - phB.begin() - 1);
216  else phVec.push_back(phB.end() - phB.begin() - 1);
217  if(iph < phB.end() ) phVec.push_back(iph - phB.begin() );
218  else phVec.push_back(phB.begin() - phB.begin() );
219 
220  // Detectors
221  vector<const GeomDet *> dets;
222 
223  for(vector<int>::const_iterator irz = rzVec.begin(); irz!= rzVec.end(); irz++)
224  for(vector<int>::const_iterator iph = phVec.begin(); iph!= phVec.end(); iph++)
225  {
226  if(il+1 <= BPix3)
227  {
228  int layer = il + 1;
229  int ladder = *iph + 1;
230  int module = *irz + 1;
231 
232  LogTrace("MinBiasTracking")
233  << " [ValidHitPairFilter] third ("<<layer<< "|"<<ladder<<"|"<<module<<")";
234 
235  PXBDetId id(layer,ladder,module);
236  dets.push_back(theTracker->idToDet(id));
237  }
238  else
239  {
240  int side = (il - BPix3) / 2 + 1;
241  int disk = (il - BPix3) % 2 + 1;
242  int blade = *iph + 1;
243  int panel = (*irz) % 2 + 1;
244  int module = (*irz) / 2 + 1;
245 
246  LogTrace("MinBiasTracking")
247  << " [ValidHitPairFilter] third ("<<side<<"|"<<disk<<"|"<<blade<<"|"<<panel<<"|"<<module<<")";
248 
249  PXFDetId id(side,disk,blade,panel,module);
250  dets.push_back(theTracker->idToDet(id));
251  }
252  }
253 
254  return dets;
255 }
256 
257 /*****************************************************************************/
259  (const reco::Track * track, vector<const TrackingRecHit *> recHits) const
260 {
261  bool hasGap = true;
262 
263  if(recHits.size() == 2)
264  {
265  LogTrace("MinBiasTracking")
266  << " [ValidHitPairFilter] pair" << HitInfo::getInfo(*(recHits[0]))
267  << HitInfo::getInfo(*(recHits[1]));
268 
269  float tol = 0.1; // cm
270  float sc = -1.; // scale, allow 'tol' of edge to count as outside
271  LocalError le(tol*tol, tol*tol, tol*tol);
272 
273  // determine missing layers
274  vector<int> missingLayers = getMissingLayers(getLayer(*(recHits[0])),
275  getLayer(*(recHits[1])));
276 
277  for(vector<int>::const_iterator missingLayer = missingLayers.begin();
278  missingLayer!= missingLayers.end();
279  missingLayer++)
280  {
281  int il = *missingLayer - 1;
282 
283  // propagate to missing layer
284  FreeTrajectoryState fts = getTrajectory(*track);
286  float rz = 0.;
287 
288  if(il < BPix3)
289  { // barrel
290  const BarrelDetLayer * layer =
291  (theGSTracker->pixelBarrelLayers())[il];
292 
293  tsos = thePropagator->propagate(fts, layer->surface());
294 
295  if(tsos.isValid())
296  rz = tsos.globalPosition().z();
297  }
298  else
299  { // endcap
300  const ForwardDetLayer * layer;
301  if(il - BPix3 < 2)
302  layer = (theGSTracker->negPixelForwardLayers())[il - BPix3 ];
303  else
304  layer = (theGSTracker->posPixelForwardLayers())[il - BPix3 - 2];
305 
306  tsos = thePropagator->propagate(fts, layer->surface());
307 
308  if(tsos.isValid())
309  rz = tsos.globalPosition().perp();
310  }
311 
312  if(tsos.isValid())
313  {
314  float phi = spin(tsos.globalPosition().phi());
315 
316  // check close dets
317  vector<const GeomDet *> closeDets =
318  getCloseDets(il, rz ,rzBounds[il], phi,phBounds[il]);
319 
320  for(vector<const GeomDet *>::const_iterator det = closeDets.begin();
321  det!= closeDets.end();
322  det++)
323  {
325  thePropagator->propagate(fts, (*det)->surface());
326 
327  if(tsos.isValid())
328  if((*det)->surface().bounds().inside(tsos.localPosition(), le, sc))
329  hasGap = false;
330  }
331  }
332  }
333  }
334 
335 
336  if(hasGap)
337  LogTrace("MinBiasTracking") << " [ValidHitPairFilter] has gap --> good";
338  else
339  LogTrace("MinBiasTracking") << " [ValidHitPairFilter] no gap --> rejected";
340 
341  return hasGap;
342 }
343 
static std::string getInfo(const DetId &id)
Definition: HitInfo.cc:24
int i
Definition: DBlmapReader.cc:9
T perp() const
Definition: PV3DBase.h:71
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:150
int getLayer(const TrackingRecHit &recHit) const
virtual const BoundSurface & surface() const
The surface of the GeometricSearchDet.
Geom::Phi< T > phi() const
Definition: PV3DBase.h:68
GlobalPoint globalPosition() const
ValidHitPairFilter(const edm::ParameterSet &ps, const edm::EventSetup &es)
unsigned int layer() const
layer id
Definition: PXBDetId.h:35
T z() const
Definition: PV3DBase.h:63
#define end
Definition: vmac.h:38
std::vector< int > getMissingLayers(int a, int b) const
#define LogTrace(id)
unsigned int disk() const
disk id
Definition: PXFDetId.h:43
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
Definition: TrackBase.h:156
Definition: DetId.h:20
#define M_PI
Definition: BFit3D.cc:3
virtual const BoundSurface & surface() const
GeometricSearchDet interface.
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
double b
Definition: hdecay.h:120
#define begin
Definition: vmac.h:31
double a
Definition: hdecay.h:121
static int position[264][3]
Definition: ReadPGInfo.cc:509
unsigned int side() const
positive or negative id
Definition: PXFDetId.h:38
int charge() const
track electric charge
Definition: TrackBase.h:113
DetId geographicalId() const
Definition: vlib.h:209
float spin(float ph)
FreeTrajectoryState getTrajectory(const reco::Track &track) const
unsigned long long le
Definition: VDTMath.h:202
Definition: DDAxes.h:10
std::vector< const GeomDet * > getCloseDets(int il, float rz, const std::vector< float > &rzB, float ph, const std::vector< float > &phB) const