CMS 3D CMS Logo

PixelHitMatcher.cc
Go to the documentation of this file.
12 
13 #include <typeinfo>
14 #include <bitset>
15 
16 using namespace reco ;
17 using namespace std ;
18 
20  ( float phi1min, float phi1max,
21  float phi2minB, float phi2maxB, float phi2minF, float phi2maxF,
22  float z2minB, float z2maxB, float r2minF, float r2maxF,
23  float rMinI, float rMaxI, bool searchInTIDTEC)
24  : //zmin1 and zmax1 are dummy at this moment, set from beamspot later
25  meas1stBLayer(phi1min,phi1max,0.,0.), meas2ndBLayer(phi2minB,phi2maxB,z2minB,z2maxB),
26  meas1stFLayer(phi1min,phi1max,0.,0.), meas2ndFLayer(phi2minF,phi2maxF,r2minF,r2maxF),
27  startLayers(),
28  prop1stLayer(nullptr), prop2ndLayer(nullptr),theGeometricSearchTracker(nullptr),theTrackerEvent(nullptr),theTracker(nullptr),vertex_(0.),
29  searchInTIDTEC_(searchInTIDTEC), useRecoVertex_(false)
30  {
31  meas1stFLayer.setRRangeI(rMinI,rMaxI) ;
32  meas2ndFLayer.setRRangeI(rMinI,rMaxI) ;
33  }
34 
36  {
37  delete prop1stLayer ;
38  delete prop2ndLayer ;
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  {
64  theTrackerEvent = & trackerData;
65  theLayerMeasurements = LayerMeasurements(*theTracker,*theTrackerEvent);
66  }
68  ( const MagneticField * magField,
69  const MeasurementTracker * theMeasurementTracker,
70  const TrackerGeometry * trackerGeometry )
71  {
72  if (theMeasurementTracker)
73  {
74  theTracker = theMeasurementTracker;
75  theGeometricSearchTracker=theMeasurementTracker->geometricSearchTracker() ;
76  startLayers.setup(theGeometricSearchTracker) ;
77  }
78 
79  theMagField = magField ;
80  theTrackerGeometry = trackerGeometry ;
81  float mass=.000511 ; // electron propagation
82  if (prop1stLayer) delete prop1stLayer ;
83  prop1stLayer = new PropagatorWithMaterial(oppositeToMomentum,mass,theMagField) ;
84  if (prop2ndLayer) delete prop2ndLayer ;
85  prop2ndLayer = new PropagatorWithMaterial(alongMomentum,mass,theMagField) ;
86  }
87 
88 vector<CLHEP::Hep3Vector> PixelHitMatcher::predicted1Hits()
89  { return pred1Meas ; }
90 
91 vector<CLHEP::Hep3Vector> PixelHitMatcher::predicted2Hits()
92  { return pred2Meas ; }
93 
95  { return vertex_ ; }
96 
97 
98 std::vector<SeedWithInfo>
100  ( TrajectorySeedCollection * seeds, const GlobalPoint & xmeas,
101  const GlobalPoint & vprim, float energy, float fcharge )
102  {
103  typedef std::unordered_map<const GeomDet *, TrajectoryStateOnSurface> DetTsosAssoc;
104  typedef std::unordered_map<std::pair<const GeomDet*,GlobalPoint>, TrajectoryStateOnSurface> PosTsosAssoc;
105  const int charge = int(fcharge) ;
106 
107  // auto xmeas_phi = xmeas.barePhi();
108  auto xmeas_r = xmeas.perp();
109 
110  const float phicut = std::cos(2.5);
111 
112 
113  FreeTrajectoryState fts = FTSFromVertexToPointFactory::get(*theMagField, xmeas, vprim, energy, charge);
115  TrajectoryStateOnSurface tsos(fts, *bpb(fts.position(), fts.momentum()));
116 
117  std::vector<SeedWithInfo> result ;
118 
119  //mapTsos_fast_.clear();
120  mapTsos2_fast_.clear();
121  // mapTsos_fast_.reserve(seeds->size()) ;
122  mapTsos2_fast_.reserve(seeds->size()) ;
123 
124  // std::vector<TrajectoryStateOnSurface> vTsos(theTrackerGeometry->dets().size());
125  // TrajectoryStateOnSurface vTsos[theTrackerGeometry->dets().size()];
126 
127  auto ndets = theTrackerGeometry->dets().size();
128 
129  int iTsos[ndets];
130  for ( auto & i : iTsos) i=-1;
131  std::vector<TrajectoryStateOnSurface> vTsos; vTsos.reserve(seeds->size());
132 
133  for(const auto& seed : *seeds) {
134  hit_gp_map_.clear();
135  if( seed.nHits() > 9 ) {
136  edm::LogWarning("GsfElectronAlgo|UnexpectedSeed") <<"We cannot deal with seeds having more than 9 hits." ;
137  continue;
138  }
139 
140  const TrajectorySeed::range& hits = seed.recHits();
141  // cache the global points
142 
143  for( auto it = hits.first; it != hits.second; ++it ) {
144  hit_gp_map_.emplace_back(it->globalPosition());
145  }
146 
147  //iterate on the hits
148  auto he = hits.second -1;
149  for( auto it1 = hits.first; it1 < he; ++it1 ) {
150  if( !it1->isValid() ) continue;
151  auto idx1 = std::distance(hits.first,it1);
152  const DetId id1 = it1->geographicalId();
153  const GeomDet *geomdet1 = it1->det();
154 
155  auto ix1 = geomdet1->gdetIndex();
156 
157  /* VI: this generates regression (other cut is just in phi). in my opinion it is safe and makes sense
158  auto away = geomdet1->position().basicVector().dot(xmeas.basicVector()) <0;
159  if (away) continue;
160  */
161 
162  const GlobalPoint& hit1Pos = hit_gp_map_[idx1];
163  auto dt = hit1Pos.x()*xmeas.x()+hit1Pos.y()*xmeas.y();
164  if (dt<0) continue;
165  if (dt<phicut*(xmeas_r*hit1Pos.perp())) continue;
166 
167  if(iTsos[ix1]<0) {
168  iTsos[ix1] = vTsos.size();
169  vTsos.push_back(prop1stLayer->propagate(tsos,geomdet1->surface()));
170  }
171  auto tsos1 = &vTsos[iTsos[ix1]];
172 
173  if( !tsos1->isValid() ) continue;
174  std::pair<bool, double> est = ( id1.subdetId() % 2 ?
175  meas1stBLayer.estimate(vprim, *tsos1, hit1Pos) :
176  meas1stFLayer.estimate(vprim, *tsos1, hit1Pos) );
177  if( !est.first ) continue;
178  EleRelPointPair pp1(hit1Pos,tsos1->globalParameters().position(),vprim);
179  const math::XYZPoint relHit1Pos(hit1Pos-vprim), relTSOSPos(tsos1->globalParameters().position() - vprim);
180  const int subDet1 = id1.subdetId();
181  const float dRz1 = ( id1.subdetId()%2 ? pp1.dZ() : pp1.dPerp() );
182  const float dPhi1 = pp1.dPhi();
183  // setup our vertex
184  double zVertex;
185  if (!useRecoVertex_) {
186  // we don't know the z vertex position, get it from linear extrapolation
187  // compute the z vertex from the cluster point and the found pixel hit
188  const double pxHit1z = hit1Pos.z();
189  const double pxHit1x = hit1Pos.x();
190  const double pxHit1y = hit1Pos.y();
191  const double r1diff = std::sqrt( (pxHit1x-vprim.x())*(pxHit1x-vprim.x()) +
192  (pxHit1y-vprim.y())*(pxHit1y-vprim.y()) );
193  const double r2diff = std::sqrt( (xmeas.x()-pxHit1x)*(xmeas.x()-pxHit1x) +
194  (xmeas.y()-pxHit1y)*(xmeas.y()-pxHit1y) );
195  zVertex = pxHit1z - r1diff*(xmeas.z()-pxHit1z)/r2diff;
196  } else {
197  // here use rather the reco vertex z position
198  zVertex = vprim.z();
199  }
200  GlobalPoint vertex(vprim.x(),vprim.y(),zVertex);
201  FreeTrajectoryState fts2 = FTSFromVertexToPointFactory::get(*theMagField, hit1Pos, vertex, energy, charge) ;
202  // now find the matching hit
203  for( auto it2 = it1+1; it2 != hits.second; ++it2 ) {
204  if( !it2->isValid() ) continue;
205  auto idx2 = std::distance(hits.first,it2);
206  const DetId id2 = it2->geographicalId();
207  const GeomDet *geomdet2 = it2->det();
208  const std::pair<const GeomDet *,GlobalPoint> det_key(geomdet2,hit1Pos);
209  const TrajectoryStateOnSurface* tsos2;
210  auto tsos2_itr = mapTsos2_fast_.find(det_key);
211  if( tsos2_itr != mapTsos2_fast_.end() ) {
212  tsos2 = &(tsos2_itr->second);
213  } else {
214  auto empl_result =
215  mapTsos2_fast_.emplace(det_key,prop2ndLayer->propagate(fts2,geomdet2->surface()));
216  tsos2 = &(empl_result.first->second);
217  }
218  if( !tsos2->isValid() ) continue;
219  const GlobalPoint& hit2Pos = hit_gp_map_[idx2];
220  std::pair<bool,double> est2 = ( id2.subdetId()%2 ?
221  meas2ndBLayer.estimate(vertex, *tsos2,hit2Pos) :
222  meas2ndFLayer.estimate(vertex, *tsos2,hit2Pos) );
223  if (est2.first) {
224  EleRelPointPair pp2(hit2Pos,tsos2->globalParameters().position(),vertex) ;
225  const int subDet2 = id2.subdetId();
226  const float dRz2 = (subDet2%2==1)?pp2.dZ():pp2.dPerp();
227  const float dPhi2 = pp2.dPhi();
228  const unsigned char hitsMask = (1<<idx1)|(1<<idx2);
229  result.push_back(SeedWithInfo(seed,hitsMask,subDet2,dRz2,dPhi2,subDet1,dRz1,dPhi1)) ;
230  }
231  }// inner loop on hits
232  }// outer loop on hits
233  }// loop on seeds
234 
235  mapTsos2_fast_.clear() ;
236 
237  return result ;
238  }
239 
240 //========================= OBSOLETE ? =========================
241 
242 vector< pair< RecHitWithDist, PixelHitMatcher::ConstRecHitPointer > >
244  ( const GlobalPoint & xmeas,
245  const GlobalPoint & vprim,
246  float energy, float fcharge,
247  const TrackerTopology *tTopo,
248  const NavigationSchool& navigationSchool)
249  {
250  float SCl_phi = xmeas.phi();
251 
252  int charge = int(fcharge);
253  // return all compatible RecHit pairs (vector< TSiPixelRecHit>)
254  vector<pair<RecHitWithDist, ConstRecHitPointer> > result;
255  LogDebug("") << "[PixelHitMatcher::compatibleHits] entering .. ";
256 
257  vector<TrajectoryMeasurement> validMeasurements;
258  vector<TrajectoryMeasurement> invalidMeasurements;
259 
260  typedef vector<TrajectoryMeasurement>::const_iterator aMeas;
261 
262  pred1Meas.clear();
263  pred2Meas.clear();
264 
265  typedef vector<const BarrelDetLayer*>::const_iterator BarrelLayerIterator;
266  BarrelLayerIterator firstLayer = startLayers.firstBLayer();
267 
268  FreeTrajectoryState fts = FTSFromVertexToPointFactory::get(*theMagField,xmeas, vprim, energy, charge);
269 
271  TrajectoryStateOnSurface tsos(fts, *bpb(fts.position(), fts.momentum()));
272 
273  if (tsos.isValid()) {
274  vector<TrajectoryMeasurement> pixelMeasurements =
275  theLayerMeasurements.measurements(**firstLayer,tsos,
276  *prop1stLayer, meas1stBLayer);
277 
278  LogDebug("") <<"[PixelHitMatcher::compatibleHits] nbr of hits compatible with extrapolation to first layer: " << pixelMeasurements.size();
279  for (aMeas m=pixelMeasurements.begin(); m!=pixelMeasurements.end(); m++){
280  if (m->recHit()->isValid()) {
281  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().barePhi()) ;
282  if(std::abs(localDphi)>2.5)continue;
283  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
284  m->forwardPredictedState().globalPosition().y(),
285  m->forwardPredictedState().globalPosition().z());
286  LogDebug("") << "[PixelHitMatcher::compatibleHits] compatible hit position " << m->recHit()->globalPosition();
287  LogDebug("") << "[PixelHitMatcher::compatibleHits] predicted position " << m->forwardPredictedState().globalPosition();
288  pred1Meas.push_back( prediction);
289 
290  validMeasurements.push_back(*m);
291 
292  LogDebug("") <<"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
293  const BarrelDetLayer *bdetl = dynamic_cast<const BarrelDetLayer *>(*firstLayer);
294  if (bdetl) {
295  LogDebug("") <<" with radius "<<bdetl->specificSurface().radius();
296  }
297  else LogDebug("") <<"Could not downcast!!";
298  }
299  }
300 
301 
302  // check if there are compatible 1st hits in the second layer
303  firstLayer++;
304 
305  vector<TrajectoryMeasurement> pixel2Measurements =
306  theLayerMeasurements.measurements(**firstLayer,tsos,
307  *prop1stLayer, meas1stBLayer);
308 
309  for (aMeas m=pixel2Measurements.begin(); m!=pixel2Measurements.end(); m++){
310  if (m->recHit()->isValid()) {
311  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().barePhi()) ;
312  if(std::abs(localDphi)>2.5)continue;
313  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
314  m->forwardPredictedState().globalPosition().y(),
315  m->forwardPredictedState().globalPosition().z());
316  pred1Meas.push_back( prediction);
317  LogDebug("") << "[PixelHitMatcher::compatibleHits] compatible hit position " << m->recHit()->globalPosition() << endl;
318  LogDebug("") << "[PixelHitMatcher::compatibleHits] predicted position " << m->forwardPredictedState().globalPosition() << endl;
319 
320  validMeasurements.push_back(*m);
321  LogDebug("") <<"[PixelHitMatcher::compatibleHits] Found a rechit in layer ";
322  const BarrelDetLayer *bdetl = dynamic_cast<const BarrelDetLayer *>(*firstLayer);
323  if (bdetl) {
324  LogDebug("") <<" with radius "<<bdetl->specificSurface().radius();
325  }
326  else LogDebug("") <<"Could not downcast!!";
327  }
328 
329  }
330  }
331 
332 
333  // check if there are compatible 1st hits the forward disks
334  typedef vector<const ForwardDetLayer*>::const_iterator ForwardLayerIterator;
335  ForwardLayerIterator flayer;
336 
337  TrajectoryStateOnSurface tsosfwd(fts, *bpb(fts.position(), fts.momentum()));
338  if (tsosfwd.isValid()) {
339 
340  for (int i=0; i<2; i++) {
341  i == 0 ? flayer = startLayers.pos1stFLayer() : flayer = startLayers.neg1stFLayer();
342 
343  if (i==0 && xmeas.z() < -100. ) continue;
344  if (i==1 && xmeas.z() > 100. ) continue;
345 
346  vector<TrajectoryMeasurement> pixelMeasurements =
347  theLayerMeasurements.measurements(**flayer, tsosfwd,
348  *prop1stLayer, meas1stFLayer);
349 
350  for (aMeas m=pixelMeasurements.begin(); m!=pixelMeasurements.end(); m++){
351  if (m->recHit()->isValid()) {
352  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().barePhi());
353  if(std::abs(localDphi)>2.5)continue;
354  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
355  m->forwardPredictedState().globalPosition().y(),
356  m->forwardPredictedState().globalPosition().z());
357  pred1Meas.push_back( prediction);
358 
359  validMeasurements.push_back(*m);
360  }
361  }
362 
363  //check if there are compatible 1st hits the outer forward disks
364  if (searchInTIDTEC_) {
365  flayer++;
366 
367  vector<TrajectoryMeasurement> pixel2Measurements =
368  theLayerMeasurements.measurements(**flayer, tsosfwd,
369  *prop1stLayer, meas1stFLayer);
370 
371  for (aMeas m=pixel2Measurements.begin(); m!=pixel2Measurements.end(); m++){
372  if (m->recHit()->isValid()) {
373  float localDphi = normalized_phi(SCl_phi-m->forwardPredictedState().globalPosition().barePhi()) ;
374  if(std::abs(localDphi)>2.5)continue;
375  CLHEP::Hep3Vector prediction(m->forwardPredictedState().globalPosition().x(),
376  m->forwardPredictedState().globalPosition().y(),
377  m->forwardPredictedState().globalPosition().z());
378  pred1Meas.push_back( prediction);
379 
380  validMeasurements.push_back(*m);
381  }
382  // else{std::cout<<" hit non valid "<<std::endl; }
383  } //end 1st hit in outer f disk
384  }
385  }
386  }
387 
388  // now we have the vector of all valid measurements of the first point
389  for (unsigned i=0; i<validMeasurements.size(); i++){
390 
391  const DetLayer * newLayer = theGeometricSearchTracker->detLayer(validMeasurements[i].recHit()->det()->geographicalId());
392 
393  double zVertex ;
394  if (!useRecoVertex_)
395  {
396  // we don't know the z vertex position, get it from linear extrapolation
397  // compute the z vertex from the cluster point and the found pixel hit
398  double pxHit1z = validMeasurements[i].recHit()->det()->surface().toGlobal(
399  validMeasurements[i].recHit()->localPosition()).z();
400  double pxHit1x = validMeasurements[i].recHit()->det()->surface().toGlobal(
401  validMeasurements[i].recHit()->localPosition()).x();
402  double pxHit1y = validMeasurements[i].recHit()->det()->surface().toGlobal(
403  validMeasurements[i].recHit()->localPosition()).y();
404  double r1diff = (pxHit1x-vprim.x())*(pxHit1x-vprim.x()) + (pxHit1y-vprim.y())*(pxHit1y-vprim.y());
405  r1diff=sqrt(r1diff);
406  double r2diff = (xmeas.x()-pxHit1x)*(xmeas.x()-pxHit1x) + (xmeas.y()-pxHit1y)*(xmeas.y()-pxHit1y);
407  r2diff=sqrt(r2diff);
408  zVertex = pxHit1z - r1diff*(xmeas.z()-pxHit1z)/r2diff;
409  }
410  else
411  {
412  // here we use the reco vertex z position
413  zVertex = vprim.z();
414  }
415 
416  if (i==0)
417  { vertex_ = zVertex; }
418 
419  GlobalPoint vertexPred(vprim.x(),vprim.y(),zVertex) ;
420  GlobalPoint hitPos( validMeasurements[i].recHit()->det()->surface().toGlobal( validMeasurements[i].recHit()->localPosition() ) ) ;
421 
422  FreeTrajectoryState secondFTS = FTSFromVertexToPointFactory::get(*theMagField, hitPos, vertexPred, energy, charge);
423 
424  PixelMatchNextLayers secondHit(&theLayerMeasurements, newLayer, secondFTS,
425  prop2ndLayer, &meas2ndBLayer,&meas2ndFLayer,
426  tTopo,navigationSchool,searchInTIDTEC_);
427  vector<CLHEP::Hep3Vector> predictions = secondHit.predictionInNextLayers();
428 
429  for (unsigned it = 0; it < predictions.size(); it++) pred2Meas.push_back(predictions[it]);
430 
431  // we may get more than one valid second measurements here even for single electrons:
432  // two hits from the same layer/disk (detector overlap) or from the loop over the
433  // next layers in EPMatchLoopNextLayers. Take only the 1st hit.
434 
435  if(!secondHit.measurementsInNextLayers().empty()){
436  for(unsigned int shit=0; shit<secondHit.measurementsInNextLayers().size(); shit++)
437  {
438  float dphi = normalized_phi(pred1Meas[i].phi()-validMeasurements[i].recHit()->globalPosition().barePhi()) ;
439  if (std::abs(dphi)<2.5)
440  {
441  ConstRecHitPointer pxrh = validMeasurements[i].recHit();
442  RecHitWithDist rh(pxrh,dphi);
443 
444  // pxrh = secondHit.measurementsInNextLayers()[0].recHit();
445  pxrh = secondHit.measurementsInNextLayers()[shit].recHit();
446 
447  pair<RecHitWithDist,ConstRecHitPointer> compatiblePair = pair<RecHitWithDist,ConstRecHitPointer>(rh,pxrh) ;
448  result.push_back(compatiblePair);
449  break;
450  }
451  }
452  }
453  }
454  return result;
455 }
456 
#define LogDebug(id)
T barePhi() const
float dt
Definition: AMPTWrapper.h:126
static FreeTrajectoryState get(MagneticField const &magField, GlobalPoint const &xmeas, GlobalPoint const &xvert, float momentum, TrackCharge charge)
T perp() const
Definition: PV3DBase.h:72
int gdetIndex() const
Definition: GeomDet.h:103
void setEvent(const MeasurementTrackerEvent &event)
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
std::vector< CLHEP::Hep3Vector > predictionInNextLayers() const
virtual const BoundCylinder & specificSurface() const final
Extension of the interface.
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:42
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
void set2ndLayer(float dummyphi2minB, float dummyphi2maxB, float dummyphi2minF, float dummyphi2maxF)
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
RealType normalized_phi(RealType phi)
T sqrt(T t)
Definition: SSEVec.h:18
rMaxI
intermediate region SC in EB and 2nd hits in PXF
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
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:37
GlobalVector momentum() const
Definition: DetId.h:18
GlobalPoint position() const
std::vector< TrajectoryMeasurement > measurementsInNextLayers() const
const GlobalTrajectoryParameters & globalParameters() const
void set1stLayer(float dummyphi1min, float dummyphi1max)
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
virtual ~PixelHitMatcher()
fixed size matrix
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
std::vector< std::pair< RecHitWithDist, ConstRecHitPointer > > compatibleHits(const GlobalPoint &xmeas, const GlobalPoint &vprim, float energy, float charge, const TrackerTopology *tTopo, const NavigationSchool &navigationSchool)
void setUseRecoVertex(bool val)