CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
AdaptiveVertexFitter.cc
Go to the documentation of this file.
8 
9 #include <algorithm>
10 
11 using namespace edm;
12 
13 // #define STORE_WEIGHTS
14 #ifdef STORE_WEIGHTS
15 #include <dataharvester/Writer.h>
16 #endif
17 
18 using namespace std;
19 
20 namespace {
21  // typedef ReferenceCountingPointer<VertexTrack<5> > RefCountedVertexTrack;
22  typedef AdaptiveVertexFitter::RefCountedVertexTrack RefCountedVertexTrack;
23 
24  GlobalError fitError()
25  {
26  static GlobalError err;
27  static bool once=true;
28  if (once)
29  {
30  // that's how we model the lin pt error for the initial seed!
31  static const float initialError = 10000;
33  ret(0,0)=initialError;
34  ret(1,1)=initialError;
35  ret(2,2)=initialError;
36  err=GlobalError ( ret );
37  once=false;
38  }
39  return err;
40  }
41 
42  GlobalError linPointError()
43  {
44  static GlobalError err;
45  static bool once=true;
46  if (once)
47  {
48  // that's how we model the error of the linearization point.
49  // for track weighting!
51  ret(0,0)=.3; ret(1,1)=.3; ret(2,2)=3.;
52  // ret(0,0)=1e-7; ret(1,1)=1e-7; ret(2,2)=1e-7;
53  err=GlobalError ( ret );
54  once=false;
55  }
56  return err;
57  }
58 
59  struct DistanceToRefPoint {
60  DistanceToRefPoint ( const GlobalPoint & ref ) : theRef ( ref ) {}
61 
62  bool operator() ( const RefCountedVertexTrack & v1, const RefCountedVertexTrack & v2 )
63  {
64  return ( distance ( v1 ) < distance ( v2 ) );
65  }
66 
67  float distance ( const RefCountedVertexTrack & v1 )
68  {
69  return ( v1->linearizedTrack()->track().initialFreeState().position() - theRef ).mag2();
70  }
71 
72  private:
73  GlobalPoint theRef;
74  };
75 
76  #ifdef STORE_WEIGHTS
77  map < RefCountedLinearizedTrackState, int > ids;
78  int iter=0;
79 
80  int getId ( const RefCountedLinearizedTrackState & r )
81  {
82  static int ctr=1;
83  if ( ids.count(r) == 0 )
84  {
85  ids[r]=ctr++;
86  }
87  return ids[r];
88  }
89  #endif
90 }
91 
93  const AnnealingSchedule & ann,
94  const LinearizationPointFinder & linP,
95  const VertexUpdator<5> & updator,
97  const VertexSmoother<5> & smoother,
98  const AbstractLTSFactory<5> & ltsf ) :
99  theNr(0),
100  theLinP(linP.clone()), theUpdator( updator.clone()),
101  theSmoother ( smoother.clone() ), theAssProbComputer( ann.clone() ),
102  theComp ( crit.clone() ), theLinTrkFactory ( ltsf.clone() ),
103  gsfIntermediarySmoothing_(false)
104 {
105  setParameters();
106 }
107 
109 {
111 }
112 
114  (const AdaptiveVertexFitter & o ) :
115  theMaxShift ( o.theMaxShift ), theMaxLPShift ( o.theMaxLPShift ),
116  theMaxStep ( o.theMaxStep ), theWeightThreshold ( o.theWeightThreshold ),
117  theNr ( o.theNr ),
118  theLinP ( o.theLinP->clone() ), theUpdator ( o.theUpdator->clone() ),
119  theSmoother ( o.theSmoother->clone() ),
120  theAssProbComputer ( o.theAssProbComputer->clone() ),
121  theComp ( o.theComp->clone() ),
122  theLinTrkFactory ( o.theLinTrkFactory->clone() ),
123  gsfIntermediarySmoothing_(o.gsfIntermediarySmoothing_)
124 {}
125 
127 {
128  delete theLinP;
129  delete theUpdator;
130  delete theSmoother;
131  delete theAssProbComputer;
132  delete theComp;
133  delete theLinTrkFactory;
134 }
135 
136 void AdaptiveVertexFitter::setParameters( double maxshift, double maxlpshift,
137  unsigned maxstep, double weightthreshold )
138 {
139  theMaxShift = maxshift;
140  theMaxLPShift = maxlpshift;
141  theMaxStep = maxstep;
142  theWeightThreshold=weightthreshold;
143 }
144 
145 
147 {
148  setParameters ( s.getParameter<double>("maxshift"),
149  s.getParameter<double>("maxlpshift"),
150  s.getParameter<int>("maxstep"),
151  s.getParameter<double>("weightthreshold") );
152 }
153 
155 AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & tracks) const
156 {
157  if ( tracks.size() < 2 )
158  {
159  LogError("RecoVertex|AdaptiveVertexFitter")
160  << "Supplied fewer than two tracks. Vertex is invalid.";
161  return CachingVertex<5>(); // return invalid vertex
162  };
163  // Linearization Point
164  GlobalPoint linP = theLinP->getLinearizationPoint(tracks);
165  // Initial vertex seed, with a very large error matrix
166  VertexState lseed (linP, linPointError() );
167  vector<RefCountedVertexTrack> vtContainer = linearizeTracks(tracks, lseed);
168 
169  VertexState seed (linP, fitError() );
170  return fit(vtContainer, seed, false);
171 }
172 
174 AdaptiveVertexFitter::vertex(const vector<RefCountedVertexTrack> & tracks) const
175 {
176  if ( tracks.size() < 2 )
177  {
178  LogError("RecoVertex|AdaptiveVertexFitter")
179  << "Supplied fewer than two tracks. Vertex is invalid.";
180  return CachingVertex<5>(); // return invalid vertex
181  };
182  // Initial vertex seed, with a very small weight matrix
183  GlobalPoint linP = tracks[0]->linearizedTrack()->linearizationPoint();
184  VertexState seed (linP, fitError() );
185  return fit(tracks, seed, false);
186 }
187 
189 AdaptiveVertexFitter::vertex(const vector<RefCountedVertexTrack> & tracks, const reco::BeamSpot & spot ) const
190 {
191  if ( tracks.size() < 1 )
192  {
193  LogError("RecoVertex|AdaptiveVertexFitter")
194  << "Supplied no tracks. Vertex is invalid.";
195  return CachingVertex<5>(); // return invalid vertex
196  };
197  VertexState beamSpotState(spot);
198  return fit(tracks, beamSpotState, true );
199 }
200 
201 
202 
207 AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & tracks,
208  const GlobalPoint& linPoint) const
209 {
210  if ( tracks.size() < 2 )
211  {
212  LogError("RecoVertex|AdaptiveVertexFitter")
213  << "Supplied fewer than two tracks. Vertex is invalid.";
214  return CachingVertex<5>(); // return invalid vertex
215  };
216  // Initial vertex seed, with a very large error matrix
217  VertexState seed (linPoint, linPointError() );
218  vector<RefCountedVertexTrack> vtContainer = linearizeTracks(tracks, seed);
219  VertexState fitseed (linPoint, fitError() );
220  return fit(vtContainer, fitseed, false);
221 }
222 
223 
229 AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & tracks,
230  const reco::BeamSpot& beamSpot) const
231 {
232  if ( tracks.size() < 1 )
233  {
234  LogError("RecoVertex|AdaptiveVertexFitter")
235  << "Supplied no tracks. Vertex is invalid.";
236  return CachingVertex<5>(); // return invalid vertex
237  };
238 
239  VertexState beamSpotState(beamSpot);
240  vector<RefCountedVertexTrack> vtContainer;
241 
242  if (tracks.size() > 1) {
243  // Linearization Point search if there are more than 1 track
244  GlobalPoint linP = theLinP->getLinearizationPoint(tracks);
245  VertexState lpState(linP, linPointError() );
246  vtContainer = linearizeTracks(tracks, lpState);
247  } else {
248  // otherwise take the beamspot position.
249  vtContainer = linearizeTracks(tracks, beamSpotState);
250  }
251 
252  return fit(vtContainer, beamSpotState, true);
253 }
254 
255 
261 CachingVertex<5> AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & tracks,
262  const GlobalPoint& priorPos,
263  const GlobalError& priorError) const
264 
265 {
266  if ( tracks.size() < 1 )
267  {
268  LogError("RecoVertex|AdaptiveVertexFitter")
269  << "Supplied no tracks. Vertex is invalid.";
270  return CachingVertex<5>(); // return invalid vertex
271  };
272  VertexState seed (priorPos, priorError);
273  vector<RefCountedVertexTrack> vtContainer = linearizeTracks(tracks, seed);
274  return fit( vtContainer, seed, true );
275 }
276 
277 
283  const vector<RefCountedVertexTrack> & tracks,
284  const GlobalPoint& priorPos,
285  const GlobalError& priorError) const
286 {
287  if ( tracks.size() < 1 )
288  {
289  LogError("RecoVertex|AdaptiveVertexFitter")
290  << "Supplied no tracks. Vertex is invalid.";
291  return CachingVertex<5>(); // return invalid vertex
292  };
293  VertexState seed (priorPos, priorError);
294  return fit(tracks, seed, true);
295 }
296 
297 
305 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
306 AdaptiveVertexFitter::linearizeTracks(const vector<reco::TransientTrack> & tracks,
307  const VertexState & seed ) const
308 {
309  const GlobalPoint & linP ( seed.position() );
310  vector<RefCountedLinearizedTrackState> lTracks;
311  for(vector<reco::TransientTrack>::const_iterator i = tracks.begin();
312  i != tracks.end(); ++i )
313  {
314  try {
317  lTracks.push_back(lTrData);
318  } catch ( exception & e ) {
319  LogWarning("RecoVertex/AdaptiveVertexFitter")
320  << "Exception " << e.what() << " in ::linearizeTracks."
321  << "Your future vertex has just lost a track.";
322  };
323  }
324  return weightTracks(lTracks, seed );
325 }
326 
332 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
334  const vector<RefCountedVertexTrack> & tracks,
335  const CachingVertex<5> & vertex ) const
336 {
337  VertexState seed = vertex.vertexState();
338  GlobalPoint linP = seed.position();
339  vector<RefCountedLinearizedTrackState> lTracks;
340  for(vector<RefCountedVertexTrack>::const_iterator i = tracks.begin();
341  i != tracks.end(); i++)
342  {
343  try {
345  = theLinTrkFactory->linearizedTrackState( linP, (**i).linearizedTrack()->track() );
346  /*
347  RefCountedLinearizedTrackState lTrData =
348  (**i).linearizedTrack()->stateWithNewLinearizationPoint(linP);
349  */
350  lTracks.push_back(lTrData);
351  } catch ( exception & e ) {
352  LogWarning("RecoVertex/AdaptiveVertexFitter")
353  << "Exception " << e.what() << " in ::relinearizeTracks. "
354  << "Will not relinearize this track.";
355  lTracks.push_back ( (**i).linearizedTrack() );
356  };
357  };
358  return reWeightTracks(lTracks, vertex );
359 }
360 
362 {
363  return new AdaptiveVertexFitter( * this );
364 }
365 
366 double AdaptiveVertexFitter::getWeight ( float chi2 ) const
367 {
368  double weight = theAssProbComputer->weight(chi2);
369 
370  if ( weight > 1.0 )
371  {
372  LogWarning("RecoVertex/AdaptiveVertexFitter") << "Weight " << weight << " > 1.0!";
373  weight=1.0;
374  };
375 
376  if ( weight < 1e-20 )
377  {
378  // LogWarning("RecoVertex/AdaptiveVertexFitter") << "Weight " << weight << " < 0.0!";
379  weight=1e-20;
380  };
381  return weight;
382 }
383 
384 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
386  const vector<RefCountedLinearizedTrackState> & lTracks,
387  const CachingVertex<5> & vertex ) const
388 {
389  VertexState seed = vertex.vertexState();
390  theNr++;
391  // GlobalPoint pos = seed.position();
392 
393  vector<RefCountedVertexTrack> finalTracks;
394  VertexTrackFactory<5> vTrackFactory;
395  #ifdef STORE_WEIGHTS
396  iter++;
397  #endif
398  for(vector<RefCountedLinearizedTrackState>::const_iterator i
399  = lTracks.begin(); i != lTracks.end(); i++)
400  {
401  double weight=0.;
402  pair<bool, double> chi2Res = theComp->estimate ( vertex, *i );
403  if (!chi2Res.first) {
404  cout << "[AdaptiveVertexFitter] aie... vertex candidate is at " << vertex.position() << endl;
405  LogWarning("AdaptiveVertexFitter" ) << "When reweighting, chi2<0. Will add this track with w=0.";
406  // edm::LogWarning("AdaptiveVertexFitter" ) << "pt=" << (**i).track().pt();
407  }else {
408  weight = getWeight ( chi2Res.second );
409  }
410 
411  RefCountedVertexTrack vTrData
412  = vTrackFactory.vertexTrack(*i, seed, weight );
413 
414  #ifdef STORE_WEIGHTS
415  map < string, dataharvester::MultiType > m;
416  m["chi2"]=chi2;
417  m["w"]=theAssProbComputer->weight(chi2);
419  m["n"]=iter;
420  m["pos"]="reweight";
421  m["id"]=getId ( *i );
422  dataharvester::Writer::file("w.txt").save ( m );
423  #endif
424 
425  finalTracks.push_back(vTrData);
426  }
427  return finalTracks;
428 }
429 
430 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
432  const vector<RefCountedLinearizedTrackState> & lTracks,
433  const VertexState & seed ) const
434 {
435  theNr++;
436  CachingVertex<5> seedvtx ( seed, vector<RefCountedVertexTrack> (), 0. );
440 
441  vector<RefCountedVertexTrack> finalTracks;
442  VertexTrackFactory<5> vTrackFactory;
443  #ifdef STORE_WEIGHTS
444  iter++;
445  #endif
446  for(vector<RefCountedLinearizedTrackState>::const_iterator i
447  = lTracks.begin(); i != lTracks.end(); i++)
448  {
449 
450  double weight = 0.;
451  pair<bool, double> chi2Res = theComp->estimate ( seedvtx, *i );
452  if (!chi2Res.first) {
453  cout << "[AdaptiveVertexFitter] Aiee! " << endl;
454  LogWarning ("AdaptiveVertexFitter" ) << "When weighting a track, chi2 calculation failed;"
455  << " will add with w=0.";
456  } else {
457  weight = getWeight ( chi2Res.second );
458  }
459  RefCountedVertexTrack vTrData
460  = vTrackFactory.vertexTrack(*i, seed, weight );
461  #ifdef STORE_WEIGHTS
462  map < string, dataharvester::MultiType > m;
463  m["chi2"]=chi2;
464  m["w"]=theAssProbComputer->weight(chi2);
466  m["n"]=iter;
467  m["id"]=getId ( *i );
468  m["pos"]="weight";
469  dataharvester::Writer::file("w.txt").save ( m );
470  #endif
471  finalTracks.push_back(vTrData);
472  }
473  return finalTracks;
474 }
475 
481 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
483  const vector<RefCountedVertexTrack> & tracks,
484  const CachingVertex<5> & seed) const
485 {
486  vector<RefCountedLinearizedTrackState> lTracks;
487  for(vector<RefCountedVertexTrack>::const_iterator i = tracks.begin();
488  i != tracks.end(); i++)
489  {
490  lTracks.push_back((**i).linearizedTrack());
491  }
492 
493  return reWeightTracks(lTracks, seed);
494 }
495 
496 
497 /*
498  * The method where the vertex fit is actually done!
499  */
500 
502 AdaptiveVertexFitter::fit( const vector<RefCountedVertexTrack> & tracks,
503  const VertexState & priorSeed,
504  bool withPrior) const
505 {
507 
508  vector<RefCountedVertexTrack> initialTracks;
509  GlobalPoint priorVertexPosition = priorSeed.position();
510  GlobalError priorVertexError = priorSeed.error();
511 
512  CachingVertex<5> returnVertex( priorVertexPosition,priorVertexError,
513  initialTracks,0);
514  if (withPrior)
515  {
516  returnVertex = CachingVertex<5>(priorVertexPosition,priorVertexError,
517  priorVertexPosition,priorVertexError,initialTracks,0);
518  }
519 
520  // vector<RefCountedVertexTrack> globalVTracks = tracks;
521  // sort the tracks, according to distance to seed!
522  vector<RefCountedVertexTrack> globalVTracks ( tracks.size() );
523 
524  partial_sort_copy ( tracks.begin(), tracks.end(),
525  globalVTracks.begin(), globalVTracks.end(), DistanceToRefPoint ( priorSeed.position() ) );
526 
527  // main loop through all the VTracks
528  int lpStep = 0; int step = 0;
529 
530  CachingVertex<5> initialVertex = returnVertex;
531 
532  GlobalPoint newPosition = priorVertexPosition;
533  GlobalPoint previousPosition = newPosition;
534 
535  int ns_trks=0; // number of significant tracks.
536  // If we have only two significant tracks, we return an invalid vertex
537 
538  do {
539  ns_trks=0;
540  CachingVertex<5> fVertex = initialVertex;
541  if ((previousPosition - newPosition).transverse() > theMaxLPShift)
542  {
543  // relinearize and reweight.
544  // (reLinearizeTracks also reweights tracks)
545  if (gsfIntermediarySmoothing_) returnVertex = theSmoother->smooth(returnVertex);
546  globalVTracks = reLinearizeTracks( globalVTracks, returnVertex );
547  lpStep++;
548  } else if (step) {
549  // reweight, if it is not the first step
550  if (gsfIntermediarySmoothing_) returnVertex = theSmoother->smooth(returnVertex);
551  globalVTracks = reWeightTracks( globalVTracks, returnVertex );
552  }
553  // update sequentially the vertex estimate
554  CachingVertex<5> nVertex;
555  for(vector<RefCountedVertexTrack>::const_iterator i
556  = globalVTracks.begin(); i != globalVTracks.end(); i++)
557  {
558  if ((**i).weight() > 0.) nVertex = theUpdator->add( fVertex, *i );
559  else nVertex = fVertex;
560  if (nVertex.isValid()) {
561  if ( (**i).weight() >= theWeightThreshold )
562  {
563  ns_trks++;
564  };
565 
566  if ( fabs ( nVertex.position().z() ) > 10000. ||
567  nVertex.position().perp()>120.)
568  {
569  // were more than 100 m off!!
570  LogWarning ("AdaptiveVertexFitter" ) << "Help! Vertex candidate just took off to " << nVertex.position()
571  << "! Will discard this update!";
572 // //<< "track pt was " << (**i).linearizedTrack()->track().pt()
573 // << "track momentum was " << (**i).linearizedTrack()->track().initialFreeState().momentum()
574 // << "track position was " << (**i).linearizedTrack()->track().initialFreeState().position()
575 // << "track chi2 was " << (**i).linearizedTrack()->track().chi2()
576 // << "track ndof was " << (**i).linearizedTrack()->track().ndof()
577 // << "track w was " << (**i).weight()
578 // << "track schi2 was " << (**i).smoothedChi2();
579  } else {
580  fVertex = nVertex;
581  }
582  } else {
583  LogWarning("RecoVertex|AdaptiveVertexFitter")
584  << "The updator returned an invalid vertex when adding track "
585  << i-globalVTracks.begin()
586  << ".\n Your vertex might just have lost one good track.";
587  };
588  }
589  previousPosition = newPosition;
590  newPosition = fVertex.position();
591  returnVertex = fVertex;
593  step++;
594  if ( step >= theMaxStep ) break;
595 
596  } while (
597  // repeat as long as
598  // - vertex moved too much or
599  // - we're not yet annealed
600  ( ((previousPosition - newPosition).mag() > theMaxShift) ||
601  (!(theAssProbComputer->isAnnealed()) ) ) ) ;
602 
603  if ( theWeightThreshold > 0. && ns_trks < 2 && !withPrior )
604  {
605  LogDebug("AdaptiveVertexFitter")
606  << "fewer than two significant tracks (w>" << theWeightThreshold << ")."
607  << " Fitted vertex is invalid.";
608  return CachingVertex<5>(); // return invalid vertex
609  }
610 
611  #ifdef STORE_WEIGHTS
612  map < string, dataharvester::MultiType > m;
613  m["chi2"]=chi2;
614  m["w"]=theAssProbComputer->weight(chi2);
616  m["n"]=iter;
617  m["id"]=getId ( *i );
618  m["pos"]="final";
619  dataharvester::Writer::file("w.txt").save ( m );
620  #endif
621  return theSmoother->smooth( returnVertex );
622 }
#define LogDebug(id)
virtual bool isAnnealed() const =0
virtual BDpair estimate(const CachingVertex< N > &v, const RefCountedLinearizedTrackState track) const =0
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
VertexState vertexState() const
Definition: CachingVertex.h:86
T perp() const
Definition: PV3DBase.h:66
std::vector< RefCountedVertexTrack > reWeightTracks(const std::vector< RefCountedLinearizedTrackState > &, const CachingVertex< 5 > &seed) const
virtual RefCountedLinearizedTrackState linearizedTrackState(const GlobalPoint &linP, const reco::TransientTrack &track) const =0
RefCountedVertexTrack vertexTrack(const RefCountedLinearizedTrackState lt, const VertexState vs, float weight=1.0) const
LinearizationPointFinder * theLinP
list file
Definition: dbtoweb.py:253
VertexUpdator< 5 > * theUpdator
virtual AnnealingSchedule * clone() const =0
virtual VertexSmoother * clone() const =0
CachingVertex< 5 > fit(const std::vector< RefCountedVertexTrack > &tracks, const VertexState &priorSeed, bool withPrior) const
T transverse() const
Another name for perp()
virtual VertexTrackCompatibilityEstimator< N > * clone() const =0
virtual const AbstractLTSFactory * clone() const =0
GlobalPoint position() const
Definition: VertexState.h:29
std::vector< RefCountedVertexTrack > reLinearizeTracks(const std::vector< RefCountedVertexTrack > &tracks, const CachingVertex< 5 > &vertex) const
AdaptiveVertexFitter * clone() const
GlobalErrorBase< double, ErrorMatrixTag > GlobalError
Definition: GlobalError.h:11
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
virtual CachingVertex< N > add(const CachingVertex< N > &v, const typename CachingVertex< N >::RefCountedVertexTrack t) const =0
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > AlgebraicSymMatrix33
T z() const
Definition: PV3DBase.h:58
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &) const
VertexSmoother< 5 > * theSmoother
AnnealingSchedule * theAssProbComputer
DetId getId(const std::vector< std::string > &items)
virtual double currentTemp() const =0
void setParameters(double maxshift=0.0001, double maxlpshift=0.1, unsigned maxstep=30, double weightthreshold=.001)
double getWeight(float chi2) const
AdaptiveVertexFitter(const AnnealingSchedule &ann=GeometricAnnealing(), const LinearizationPointFinder &linP=DefaultLinearizationPointFinder(), const VertexUpdator< 5 > &updator=KalmanVertexUpdator< 5 >(), const VertexTrackCompatibilityEstimator< 5 > &estor=KalmanVertexTrackCompatibilityEstimator< 5 >(), const VertexSmoother< 5 > &smoother=DummyVertexSmoother< 5 >(), const AbstractLTSFactory< 5 > &ltsf=LinearizedTrackStateFactory())
tuple tracks
Definition: testEve_cfg.py:39
T * clone(const T *tp)
Definition: Ptr.h:42
virtual CachingVertex< N > smooth(const CachingVertex< N > &vertex) const =0
GlobalPoint position() const
virtual GlobalPoint getLinearizationPoint(const std::vector< reco::TransientTrack > &) const =0
virtual LinearizationPointFinder * clone() const =0
virtual VertexUpdator * clone() const =0
bool isValid() const
Definition: CachingVertex.h:96
virtual void anneal()=0
virtual void resetAnnealing()=0
GlobalError error() const
Definition: VertexState.h:34
std::vector< RefCountedVertexTrack > linearizeTracks(const std::vector< reco::TransientTrack > &, const VertexState &) const
tuple cout
Definition: gather_cfg.py:41
string s
Definition: asciidump.py:422
std::vector< RefCountedVertexTrack > weightTracks(const std::vector< RefCountedLinearizedTrackState > &, const VertexState &seed) const
virtual double weight(double chi2) const =0
const AbstractLTSFactory< 5 > * theLinTrkFactory
VertexTrackCompatibilityEstimator< 5 > * theComp