CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PixelHitMatcher.cc
Go to the documentation of this file.
1 
12 
13 #include <typeinfo>
14 
15 using namespace reco ;
16 using namespace std ;
17 
19  ( float phi1min, float phi1max,
20  float phi2minB, float phi2maxB, float phi2minF, float phi2maxF,
21  float z2minB, float z2maxB, float r2minF, float r2maxF,
22  float rMinI, float rMaxI, bool searchInTIDTEC)
23  : //zmin1 and zmax1 are dummy at this moment, set from beamspot later
24  meas1stBLayer(phi1min,phi1max,0.,0.), meas2ndBLayer(phi2minB,phi2maxB,z2minB,z2maxB),
25  meas1stFLayer(phi1min,phi1max,0.,0.), meas2ndFLayer(phi2minF,phi2maxF,r2minF,r2maxF),
26  startLayers(),
27  prop1stLayer(0), prop2ndLayer(0),theGeometricSearchTracker(0),theLayerMeasurements(0),vertex_(0.),
28  searchInTIDTEC_(searchInTIDTEC), useRecoVertex_(false)
29  {
30  meas1stFLayer.setRRangeI(rMinI,rMaxI) ;
31  meas2ndFLayer.setRRangeI(rMinI,rMaxI) ;
32  }
33 
35  {
36  delete prop1stLayer ;
37  delete prop2ndLayer ;
38  delete theLayerMeasurements ;
39  }
40 
41 void PixelHitMatcher::set1stLayer( float dummyphi1min, float dummyphi1max )
42  {
43  meas1stBLayer.setPhiRange(dummyphi1min,dummyphi1max) ;
44  meas1stFLayer.setPhiRange(dummyphi1min,dummyphi1max) ;
45  }
46 
47 void PixelHitMatcher::set1stLayerZRange( float zmin1, float zmax1 )
48  {
49  meas1stBLayer.setZRange(zmin1,zmax1) ;
50  meas1stFLayer.setRRange(zmin1,zmax1) ;
51  }
52 
53 void PixelHitMatcher::set2ndLayer( float dummyphi2minB, float dummyphi2maxB, float dummyphi2minF, float dummyphi2maxF )
54  {
55  meas2ndBLayer.setPhiRange(dummyphi2minB,dummyphi2maxB) ;
56  meas2ndFLayer.setPhiRange(dummyphi2minF,dummyphi2maxF) ;
57  }
58 
60  { useRecoVertex_ = val ; }
61 
63  ( const MagneticField * magField,
64  const MeasurementTracker * theMeasurementTracker,
65  const TrackerGeometry * trackerGeometry )
66  {
67  if (theMeasurementTracker)
68  {
69  theGeometricSearchTracker=theMeasurementTracker->geometricSearchTracker() ;
70  startLayers.setup(theGeometricSearchTracker) ;
71  if (theLayerMeasurements ) delete theLayerMeasurements ;
72  theLayerMeasurements = new LayerMeasurements(theMeasurementTracker) ;
73  }
74 
75  theMagField = magField ;
76  theTrackerGeometry = trackerGeometry ;
77  float mass=.000511 ; // electron propagation
78  if (prop1stLayer) delete prop1stLayer ;
79  prop1stLayer = new PropagatorWithMaterial(oppositeToMomentum,mass,theMagField) ;
80  if (prop2ndLayer) delete prop2ndLayer ;
81  prop2ndLayer = new PropagatorWithMaterial(alongMomentum,mass,theMagField) ;
82  }
83 
84 vector<CLHEP::Hep3Vector> PixelHitMatcher::predicted1Hits()
85  { return pred1Meas ; }
86 
87 vector<CLHEP::Hep3Vector> PixelHitMatcher::predicted2Hits()
88  { return pred2Meas ; }
89 
91  { return vertex_ ; }
92 
93 //CLHEP::Hep3Vector point_to_vector( const GlobalPoint & p )
94 // { return CLHEP::Hep3Vector(p.x(),p.y(),p.z()) ; }
95 
96 std::vector<SeedWithInfo>
98  ( TrajectorySeedCollection * seeds, const GlobalPoint & xmeas,
99  const GlobalPoint & vprim, float energy, float fcharge )
100  {
101  int charge = int(fcharge) ;
102 
103  FreeTrajectoryState fts = myFTS(theMagField,xmeas, vprim, energy, charge);
105  TrajectoryStateOnSurface tsos(fts, *bpb(fts.position(), fts.momentum()));
106 
107  std::vector<SeedWithInfo> result ;
108  mapTsos_.clear() ;
109  mapTsos2_.clear() ;
110  mapTsos_.reserve(seeds->size()) ;
111  mapTsos2_.reserve(seeds->size()) ;
112 
113  for (unsigned int i=0;i<seeds->size();++i)
114  {
115  if ((*seeds)[i].nHits()>9)
116  {
117  edm::LogWarning("GsfElectronAlgo|UnexpectedSeed") <<"We cannot deal with seeds having more than 9 hits." ;
118  continue ;
119  }
120  TrajectorySeed::range rhits=(*seeds)[i].recHits() ;
121 
122  // build all possible pairs
123  unsigned char rank1, rank2, hitsMask ;
125  for ( rank1=0, it1=rhits.first ; it1!=rhits.second ; rank1++, it1++ )
126  {
127  for ( rank2=rank1+1, it2=it1+1 ; it2!=rhits.second ; rank2++, it2++ )
128  {
129  //TrajectorySeed::range r(it1,it2) ;
130 
131  // first Hit
133  if (!(*it).isValid()) continue;
134  DetId id=(*it).geographicalId();
135  const GeomDet *geomdet=theTrackerGeometry->idToDet((*it).geographicalId());
136  LocalPoint lp=(*it).localPosition() ;
137  GlobalPoint hitPos=geomdet->surface().toGlobal(lp) ;
138 
140  bool found = false;
141  std::vector<std::pair<const GeomDet *, TrajectoryStateOnSurface> >::iterator itTsos ;
142  for (itTsos=mapTsos_.begin();itTsos!=mapTsos_.end();++itTsos)
143  {
144  if ((*itTsos).first==geomdet)
145  { found=true ; break ; }
146  }
147  if (!found)
148  {
149  tsos1 = prop1stLayer->propagate(tsos,geomdet->surface()) ;
150  mapTsos_.push_back(std::pair<const GeomDet *, TrajectoryStateOnSurface>(geomdet,tsos1));
151  }
152  else
153  { tsos1=(*itTsos).second ; }
154 
155  if (tsos1.isValid())
156  {
157  std::pair<bool,double> est;
158  if (id.subdetId()%2==1) est=meas1stBLayer.estimate(vprim, tsos1,hitPos);
159  else est=meas1stFLayer.estimate(vprim, tsos1,hitPos);
160  if (!est.first) continue ;
161 
162  if (std::abs(normalized_phi(hitPos.phi()-xmeas.phi()))>2.5) continue ;
163  EleRelPointPair pp1(hitPos,tsos1.globalParameters().position(),vprim) ;
164  int subDet1 = id.subdetId() ;
165  float dRz1 = (subDet1%2==1)?pp1.dZ():pp1.dPerp() ;
166  float dPhi1 = pp1.dPhi() ;
167 
168  // now second Hit
169  //CC@@
170  //it++;
171  it=it2 ;
172  if (!(*it).isValid()) continue ;
173 
174  DetId id2=(*it).geographicalId();
175  const GeomDet *geomdet2=theTrackerGeometry->idToDet((*it).geographicalId());
177 
178  double zVertex;
179  if (!useRecoVertex_) // we don't know the z vertex position, get it from linear extrapolation
180  {
181  // compute the z vertex from the cluster point and the found pixel hit
182  double pxHit1z = hitPos.z();
183  double pxHit1x = hitPos.x();
184  double pxHit1y = hitPos.y();
185  double r1diff = (pxHit1x-vprim.x())*(pxHit1x-vprim.x()) + (pxHit1y-vprim.y())*(pxHit1y-vprim.y()) ;
186  r1diff=sqrt(r1diff) ;
187  double r2diff = (xmeas.x()-pxHit1x)*(xmeas.x()-pxHit1x) + (xmeas.y()-pxHit1y)*(xmeas.y()-pxHit1y) ;
188  r2diff=sqrt(r2diff);
189  zVertex = pxHit1z - r1diff*(xmeas.z()-pxHit1z)/r2diff;
190  }
191  else // here use rather the reco vertex z position
192  { zVertex = vprim.z() ; }
193 
194  GlobalPoint vertex(vprim.x(),vprim.y(),zVertex) ;
195  FreeTrajectoryState fts2 = myFTS(theMagField,hitPos,vertex,energy, charge) ;
196 
197  found = false;
198  std::vector<std::pair< std::pair<const GeomDet *,GlobalPoint>, TrajectoryStateOnSurface> >::iterator itTsos2 ;
199  for (itTsos2=mapTsos2_.begin();itTsos2!=mapTsos2_.end();++itTsos2)
200  {
201  if (((*itTsos2).first).first==geomdet2 &&
202  (((*itTsos2).first).second).x()==hitPos.x() &&
203  (((*itTsos2).first).second).y()==hitPos.y() &&
204  (((*itTsos2).first).second).z()==hitPos.z() )
205  {
206  found=true;
207  break;
208  }
209  }
210  if (!found)
211  {
212  tsos2 = prop2ndLayer->propagate(fts2,geomdet2->surface()) ;
213  std::pair<const GeomDet *,GlobalPoint> pair(geomdet2,hitPos);
214  mapTsos2_.push_back(std::pair<std::pair<const GeomDet *,GlobalPoint>, TrajectoryStateOnSurface> (pair,tsos2));
215  }
216  else
217  { tsos2=(*itTsos2).second ; }
218 
219  if (tsos2.isValid())
220  {
221  LocalPoint lp2=(*it).localPosition() ;
222  GlobalPoint hitPos2=geomdet2->surface().toGlobal(lp2) ;
223  std::pair<bool,double> est2 ;
224  if (id2.subdetId()%2==1) est2=meas2ndBLayer.estimate(vertex, tsos2,hitPos2) ;
225  else est2=meas2ndFLayer.estimate(vertex, tsos2,hitPos2) ;
226  if (est2.first)
227  {
228  EleRelPointPair pp2(hitPos2,tsos2.globalParameters().position(),vertex) ;
229  int subDet2 = id2.subdetId() ;
230  float dRz2 = (subDet2%2==1)?pp2.dZ():pp2.dPerp() ;
231  float dPhi2 = pp2.dPhi() ;
232  hitsMask = (1<<rank1)|(1<<rank2) ;
233  result.push_back(SeedWithInfo((*seeds)[i],hitsMask,subDet2,dRz2,dPhi2,subDet1,dRz1,dPhi1)) ;
234  }
235  }
236  } // end tsos1 is valid
237  } // end loop on second seed hit
238  } // end loop on first seed hit
239  } // end loop on seeds
240 
241  mapTsos_.clear() ;
242  mapTsos2_.clear() ;
243 
244  return result ;
245  }
246 
247 //========================= OBSOLETE ? =========================
248 
249 vector< pair< RecHitWithDist, PixelHitMatcher::ConstRecHitPointer > >
251  ( const GlobalPoint & xmeas,
252  const GlobalPoint & vprim,
253  float energy, float fcharge,
254  const TrackerTopology *tTopo)
255  {
256  float SCl_phi = xmeas.phi();
257 
258  int charge = int(fcharge);
259  // return all compatible RecHit pairs (vector< TSiPixelRecHit>)
260  vector<pair<RecHitWithDist, ConstRecHitPointer> > result;
261  LogDebug("") << "[PixelHitMatcher::compatibleHits] entering .. ";
262 
263  vector<TrajectoryMeasurement> validMeasurements;
264  vector<TrajectoryMeasurement> invalidMeasurements;
265 
266  typedef vector<TrajectoryMeasurement>::const_iterator aMeas;
267 
268  pred1Meas.clear();
269  pred2Meas.clear();
270 
271  typedef vector<BarrelDetLayer*>::const_iterator BarrelLayerIterator;
272  BarrelLayerIterator firstLayer = startLayers.firstBLayer();
273 
274  FreeTrajectoryState fts =myFTS(theMagField,xmeas, vprim,
275  energy, charge);
276 
278  TrajectoryStateOnSurface tsos(fts, *bpb(fts.position(), fts.momentum()));
279 
280  if (tsos.isValid()) {
281  vector<TrajectoryMeasurement> pixelMeasurements =
282  theLayerMeasurements->measurements(**firstLayer,tsos,
283  *prop1stLayer, meas1stBLayer);
284 
285  LogDebug("") <<"[PixelHitMatcher::compatibleHits] nbr of hits compatible with extrapolation to first layer: " << pixelMeasurements.size();
286  for (aMeas m=pixelMeasurements.begin(); m!=pixelMeasurements.end(); m++){
287  if (m->recHit()->isValid()) {
288  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().phi()) ;
289  if(std::abs(localDphi)>2.5)continue;
290  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
291  m->forwardPredictedState().globalPosition().y(),
292  m->forwardPredictedState().globalPosition().z());
293  LogDebug("") << "[PixelHitMatcher::compatibleHits] compatible hit position " << m->recHit()->globalPosition();
294  LogDebug("") << "[PixelHitMatcher::compatibleHits] predicted position " << m->forwardPredictedState().globalPosition();
295  pred1Meas.push_back( prediction);
296 
297  validMeasurements.push_back(*m);
298 
299  LogDebug("") <<"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
300  const BarrelDetLayer *bdetl = dynamic_cast<const BarrelDetLayer *>(*firstLayer);
301  if (bdetl) {
302  LogDebug("") <<" with radius "<<bdetl->specificSurface().radius();
303  }
304  else LogDebug("") <<"Could not downcast!!";
305  }
306  }
307 
308 
309  // check if there are compatible 1st hits in the second layer
310  firstLayer++;
311 
312  vector<TrajectoryMeasurement> pixel2Measurements =
313  theLayerMeasurements->measurements(**firstLayer,tsos,
314  *prop1stLayer, meas1stBLayer);
315 
316  for (aMeas m=pixel2Measurements.begin(); m!=pixel2Measurements.end(); m++){
317  if (m->recHit()->isValid()) {
318  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().phi()) ;
319  if(std::abs(localDphi)>2.5)continue;
320  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
321  m->forwardPredictedState().globalPosition().y(),
322  m->forwardPredictedState().globalPosition().z());
323  pred1Meas.push_back( prediction);
324  LogDebug("") << "[PixelHitMatcher::compatibleHits] compatible hit position " << m->recHit()->globalPosition() << endl;
325  LogDebug("") << "[PixelHitMatcher::compatibleHits] predicted position " << m->forwardPredictedState().globalPosition() << endl;
326 
327  validMeasurements.push_back(*m);
328  LogDebug("") <<"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
329  const BarrelDetLayer *bdetl = dynamic_cast<const BarrelDetLayer *>(*firstLayer);
330  if (bdetl) {
331  LogDebug("") <<" with radius "<<bdetl->specificSurface().radius();
332  }
333  else LogDebug("") <<"Could not downcast!!";
334  }
335 
336  }
337  }
338 
339 
340  // check if there are compatible 1st hits the forward disks
341  typedef vector<ForwardDetLayer*>::const_iterator ForwardLayerIterator;
342  ForwardLayerIterator flayer;
343 
344  TrajectoryStateOnSurface tsosfwd(fts, *bpb(fts.position(), fts.momentum()));
345  if (tsosfwd.isValid()) {
346 
347  for (int i=0; i<2; i++) {
348  i == 0 ? flayer = startLayers.pos1stFLayer() : flayer = startLayers.neg1stFLayer();
349 
350  if (i==0 && xmeas.z() < -100. ) continue;
351  if (i==1 && xmeas.z() > 100. ) continue;
352 
353  vector<TrajectoryMeasurement> pixelMeasurements =
354  theLayerMeasurements->measurements(**flayer, tsosfwd,
355  *prop1stLayer, meas1stFLayer);
356 
357  for (aMeas m=pixelMeasurements.begin(); m!=pixelMeasurements.end(); m++){
358  if (m->recHit()->isValid()) {
359  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().phi());
360  if(std::abs(localDphi)>2.5)continue;
361  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
362  m->forwardPredictedState().globalPosition().y(),
363  m->forwardPredictedState().globalPosition().z());
364  pred1Meas.push_back( prediction);
365 
366  validMeasurements.push_back(*m);
367  }
368  }
369 
370  //check if there are compatible 1st hits the outer forward disks
371  if (searchInTIDTEC_) {
372  flayer++;
373 
374  vector<TrajectoryMeasurement> pixel2Measurements =
375  theLayerMeasurements->measurements(**flayer, tsosfwd,
376  *prop1stLayer, meas1stFLayer);
377 
378  for (aMeas m=pixel2Measurements.begin(); m!=pixel2Measurements.end(); m++){
379  if (m->recHit()->isValid()) {
380  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().phi()) ;
381  if(std::abs(localDphi)>2.5)continue;
382  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
383  m->forwardPredictedState().globalPosition().y(),
384  m->forwardPredictedState().globalPosition().z());
385  pred1Meas.push_back( prediction);
386 
387  validMeasurements.push_back(*m);
388  }
389  // else{std::cout<<" hit non valid "<<std::endl; }
390  } //end 1st hit in outer f disk
391  }
392  }
393  }
394 
395  // now we have the vector of all valid measurements of the first point
396  for (unsigned i=0; i<validMeasurements.size(); i++){
397 
398  const DetLayer * newLayer = theGeometricSearchTracker->detLayer(validMeasurements[i].recHit()->det()->geographicalId());
399 
400  double zVertex ;
401  if (!useRecoVertex_)
402  {
403  // we don't know the z vertex position, get it from linear extrapolation
404  // compute the z vertex from the cluster point and the found pixel hit
405  double pxHit1z = validMeasurements[i].recHit()->det()->surface().toGlobal(
406  validMeasurements[i].recHit()->localPosition()).z();
407  double pxHit1x = validMeasurements[i].recHit()->det()->surface().toGlobal(
408  validMeasurements[i].recHit()->localPosition()).x();
409  double pxHit1y = validMeasurements[i].recHit()->det()->surface().toGlobal(
410  validMeasurements[i].recHit()->localPosition()).y();
411  double r1diff = (pxHit1x-vprim.x())*(pxHit1x-vprim.x()) + (pxHit1y-vprim.y())*(pxHit1y-vprim.y());
412  r1diff=sqrt(r1diff);
413  double r2diff = (xmeas.x()-pxHit1x)*(xmeas.x()-pxHit1x) + (xmeas.y()-pxHit1y)*(xmeas.y()-pxHit1y);
414  r2diff=sqrt(r2diff);
415  zVertex = pxHit1z - r1diff*(xmeas.z()-pxHit1z)/r2diff;
416  }
417  else
418  {
419  // here we use the reco vertex z position
420  zVertex = vprim.z();
421  }
422 
423  if (i==0)
424  { vertex_ = zVertex; }
425 
426  GlobalPoint vertexPred(vprim.x(),vprim.y(),zVertex) ;
427  GlobalPoint hitPos( validMeasurements[i].recHit()->det()->surface().toGlobal( validMeasurements[i].recHit()->localPosition() ) ) ;
428 
429  FreeTrajectoryState secondFTS=myFTS(theMagField,hitPos,vertexPred,energy, charge);
430 
431  PixelMatchNextLayers secondHit(theLayerMeasurements, newLayer, secondFTS,
432  prop2ndLayer, &meas2ndBLayer,&meas2ndFLayer,
433  tTopo,searchInTIDTEC_);
434  vector<CLHEP::Hep3Vector> predictions = secondHit.predictionInNextLayers();
435 
436  for (unsigned it = 0; it < predictions.size(); it++) pred2Meas.push_back(predictions[it]);
437 
438  // we may get more than one valid second measurements here even for single electrons:
439  // two hits from the same layer/disk (detector overlap) or from the loop over the
440  // next layers in EPMatchLoopNextLayers. Take only the 1st hit.
441 
442  if(!secondHit.measurementsInNextLayers().empty()){
443  for(unsigned int shit=0; shit<secondHit.measurementsInNextLayers().size(); shit++)
444  {
445  float dphi = normalized_phi(pred1Meas[i].phi()-validMeasurements[i].recHit()->globalPosition().phi()) ;
446  if (std::abs(dphi)<2.5)
447  {
448  ConstRecHitPointer pxrh = validMeasurements[i].recHit();
449  RecHitWithDist rh(pxrh,dphi);
450 
451  // pxrh = secondHit.measurementsInNextLayers()[0].recHit();
452  pxrh = secondHit.measurementsInNextLayers()[shit].recHit();
453 
454  pair<RecHitWithDist,ConstRecHitPointer> compatiblePair = pair<RecHitWithDist,ConstRecHitPointer>(rh,pxrh) ;
455  result.push_back(compatiblePair);
456  break;
457  }
458  }
459  }
460  }
461  return result;
462 }
463 
464 
#define LogDebug(id)
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:114
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
int i
Definition: DBlmapReader.cc:9
void setES(const MagneticField *, const MeasurementTracker *theMeasurementTracker, const TrackerGeometry *trackerGeometry)
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
T y() const
Definition: PV3DBase.h:63
#define abs(x)
Definition: mlp_lapack.h:159
std::vector< CLHEP::Hep3Vector > predictionInNextLayers() const
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:35
double charge(const std::vector< uint8_t > &Ampls)
void set2ndLayer(float dummyphi2minB, float dummyphi2maxB, float dummyphi2minF, float dummyphi2maxF)
U second(std::pair< T, U > const &p)
void set1stLayerZRange(float zmin1, float zmax1)
PixelHitMatcher(float phi1min, float phi1max, float phi2minB, float phi2maxB, float phi2minF, float phi2maxF, float z2minB, float z2maxB, float r2minF, float r2maxF, float rMinI, float rMaxI, bool searchInTIDTEC)
std::vector< TrajectorySeed > TrajectorySeedCollection
recHitContainer::const_iterator const_iterator
RealType normalized_phi(RealType phi)
T sqrt(T t)
Definition: SSEVec.h:48
T z() const
Definition: PV3DBase.h:64
tuple result
Definition: query.py:137
std::pair< const_iterator, const_iterator > range
std::vector< CLHEP::Hep3Vector > predicted1Hits()
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
GlobalVector momentum() const
Definition: DetId.h:20
GlobalPoint position() const
std::vector< TrajectoryMeasurement > measurementsInNextLayers() const
const GlobalTrajectoryParameters & globalParameters() const
void set1stLayer(float dummyphi1min, float dummyphi1max)
std::vector< std::pair< RecHitWithDist, ConstRecHitPointer > > compatibleHits(const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge, const TrackerTopology *tTopo)
virtual ~PixelHitMatcher()
std::vector< SeedWithInfo > compatibleSeeds(TrajectorySeedCollection *seeds, const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge)
std::vector< CLHEP::Hep3Vector > predicted2Hits()
T x() const
Definition: PV3DBase.h:62
virtual const BoundCylinder & specificSurface() const GCC11_FINAL
Extension of the interface.
void setUseRecoVertex(bool val)
Definition: DDAxes.h:10