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  struct CompareTwoTracks {
22  int operator() ( const reco::TransientTrack & a, const reco::TransientTrack & b ) {
23  return ( a.impactPointState().globalMomentum().perp() >
25  };
26  };
27  // typedef ReferenceCountingPointer<VertexTrack<5> > RefCountedVertexTrack;
28  typedef AdaptiveVertexFitter::RefCountedVertexTrack RefCountedVertexTrack;
29 
30  GlobalError fitError()
31  {
32  static GlobalError err;
33  static bool once=true;
34  if (once)
35  {
36  // that's how we model the lin pt error for the initial seed!
37  static const float initialError = 10000;
39  ret(0,0)=initialError;
40  ret(1,1)=initialError;
41  ret(2,2)=initialError;
42  err=GlobalError ( ret );
43  once=false;
44  }
45  return err;
46  }
47 
48  GlobalError linPointError()
49  {
50  static GlobalError err;
51  static bool once=true;
52  if (once)
53  {
54  // that's how we model the error of the linearization point.
55  // for track weighting!
57  ret(0,0)=.3; ret(1,1)=.3; ret(2,2)=3.;
58  // ret(0,0)=1e-7; ret(1,1)=1e-7; ret(2,2)=1e-7;
59  err=GlobalError ( ret );
60  once=false;
61  }
62  return err;
63  }
64 
65  struct DistanceToRefPoint {
66  DistanceToRefPoint ( const GlobalPoint & ref ) : theRef ( ref ) {}
67 
68  bool operator() ( const RefCountedVertexTrack & v1, const RefCountedVertexTrack & v2 )
69  {
70  return ( distance ( v1 ) < distance ( v2 ) );
71  }
72 
73  float distance ( const RefCountedVertexTrack & v1 )
74  {
75  return ( v1->linearizedTrack()->track().initialFreeState().position() - theRef ).mag2();
76  }
77 
78  private:
79  GlobalPoint theRef;
80  };
81 
82  #ifdef STORE_WEIGHTS
83  map < RefCountedLinearizedTrackState, int > ids;
84  int iter=0;
85 
86  int getId ( const RefCountedLinearizedTrackState & r )
87  {
88  static int ctr=1;
89  if ( ids.count(r) == 0 )
90  {
91  ids[r]=ctr++;
92  }
93  return ids[r];
94  }
95  #endif
96 }
97 
99  const AnnealingSchedule & ann,
100  const LinearizationPointFinder & linP,
101  const VertexUpdator<5> & updator,
103  const VertexSmoother<5> & smoother,
104  const AbstractLTSFactory<5> & ltsf ) :
105  theNr(0),
106  theLinP(linP.clone()), theUpdator( updator.clone()),
107  theSmoother ( smoother.clone() ), theAssProbComputer( ann.clone() ),
108  theComp ( crit.clone() ), theLinTrkFactory ( ltsf.clone() ),
109  gsfIntermediarySmoothing_(false)
110 {
111  setParameters();
112 }
113 
115 {
117 }
118 
120  (const AdaptiveVertexFitter & o ) :
121  theMaxShift ( o.theMaxShift ), theMaxLPShift ( o.theMaxLPShift ),
122  theMaxStep ( o.theMaxStep ), theWeightThreshold ( o.theWeightThreshold ),
123  theNr ( o.theNr ),
124  theLinP ( o.theLinP->clone() ), theUpdator ( o.theUpdator->clone() ),
125  theSmoother ( o.theSmoother->clone() ),
126  theAssProbComputer ( o.theAssProbComputer->clone() ),
127  theComp ( o.theComp->clone() ),
128  theLinTrkFactory ( o.theLinTrkFactory->clone() ),
129  gsfIntermediarySmoothing_(o.gsfIntermediarySmoothing_)
130 {}
131 
133 {
134  delete theLinP;
135  delete theUpdator;
136  delete theSmoother;
137  delete theAssProbComputer;
138  delete theComp;
139  delete theLinTrkFactory;
140 }
141 
142 void AdaptiveVertexFitter::setParameters( double maxshift, double maxlpshift,
143  unsigned maxstep, double weightthreshold )
144 {
145  theMaxShift = maxshift;
146  theMaxLPShift = maxlpshift;
147  theMaxStep = maxstep;
148  theWeightThreshold=weightthreshold;
149 }
150 
151 
153 {
154  setParameters ( s.getParameter<double>("maxshift"),
155  s.getParameter<double>("maxlpshift"),
156  s.getParameter<int>("maxstep"),
157  s.getParameter<double>("weightthreshold") );
158 }
159 
161 AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & unstracks) const
162 {
163  if ( unstracks.size() < 2 )
164  {
165  LogError("RecoVertex|AdaptiveVertexFitter")
166  << "Supplied fewer than two tracks. Vertex is invalid.";
167  return CachingVertex<5>(); // return invalid vertex
168  };
169  vector < reco::TransientTrack > tracks = unstracks;
170  sort ( tracks.begin(), tracks.end(), CompareTwoTracks() );
171  // Linearization Point
172  GlobalPoint linP = theLinP->getLinearizationPoint(tracks);
173  // Initial vertex seed, with a very large error matrix
174  VertexState lseed (linP, linPointError() );
175  vector<RefCountedVertexTrack> vtContainer = linearizeTracks(tracks, lseed);
176 
177  VertexState seed (linP, fitError() );
178  return fit(vtContainer, seed, false);
179 }
180 
182 AdaptiveVertexFitter::vertex(const vector<RefCountedVertexTrack> & tracks) const
183 {
184  if ( tracks.size() < 2 )
185  {
186  LogError("RecoVertex|AdaptiveVertexFitter")
187  << "Supplied fewer than two tracks. Vertex is invalid.";
188  return CachingVertex<5>(); // return invalid vertex
189  };
190  // Initial vertex seed, with a very small weight matrix
191  GlobalPoint linP = tracks[0]->linearizedTrack()->linearizationPoint();
192  VertexState seed (linP, fitError() );
193  return fit(tracks, seed, false);
194 }
195 
197 AdaptiveVertexFitter::vertex(const vector<RefCountedVertexTrack> & tracks, const reco::BeamSpot & spot ) const
198 {
199  if ( tracks.size() < 1 )
200  {
201  LogError("RecoVertex|AdaptiveVertexFitter")
202  << "Supplied no tracks. Vertex is invalid.";
203  return CachingVertex<5>(); // return invalid vertex
204  };
205  VertexState beamSpotState(spot);
206  return fit(tracks, beamSpotState, true );
207 }
208 
209 
210 
215 AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & tracks,
216  const GlobalPoint& linPoint) const
217 {
218  if ( tracks.size() < 2 )
219  {
220  LogError("RecoVertex|AdaptiveVertexFitter")
221  << "Supplied fewer than two tracks. Vertex is invalid.";
222  return CachingVertex<5>(); // return invalid vertex
223  };
224  // Initial vertex seed, with a very large error matrix
225  VertexState seed (linPoint, linPointError() );
226  vector<RefCountedVertexTrack> vtContainer = linearizeTracks(tracks, seed);
227  VertexState fitseed (linPoint, fitError() );
228  return fit(vtContainer, fitseed, false);
229 }
230 
231 
237 AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & unstracks,
238  const reco::BeamSpot& beamSpot) const
239 {
240  if ( unstracks.size() < 1 )
241  {
242  LogError("RecoVertex|AdaptiveVertexFitter")
243  << "Supplied no tracks. Vertex is invalid.";
244  return CachingVertex<5>(); // return invalid vertex
245  };
246 
247  VertexState beamSpotState(beamSpot);
248  vector<RefCountedVertexTrack> vtContainer;
249 
250  vector < reco::TransientTrack > tracks = unstracks;
251  sort ( tracks.begin(), tracks.end(), CompareTwoTracks() );
252 
253  if (tracks.size() > 1) {
254  // Linearization Point search if there are more than 1 track
255  GlobalPoint linP = theLinP->getLinearizationPoint(tracks);
256  VertexState lpState(linP, linPointError() );
257  vtContainer = linearizeTracks(tracks, lpState);
258  } else {
259  // otherwise take the beamspot position.
260  vtContainer = linearizeTracks(tracks, beamSpotState);
261  }
262 
263  return fit(vtContainer, beamSpotState, true);
264 }
265 
266 
272 CachingVertex<5> AdaptiveVertexFitter::vertex(const vector<reco::TransientTrack> & tracks,
273  const GlobalPoint& priorPos,
274  const GlobalError& priorError) const
275 
276 {
277  if ( tracks.size() < 1 )
278  {
279  LogError("RecoVertex|AdaptiveVertexFitter")
280  << "Supplied no tracks. Vertex is invalid.";
281  return CachingVertex<5>(); // return invalid vertex
282  };
283  VertexState seed (priorPos, priorError);
284  vector<RefCountedVertexTrack> vtContainer = linearizeTracks(tracks, seed);
285  return fit( vtContainer, seed, true );
286 }
287 
288 
294  const vector<RefCountedVertexTrack> & tracks,
295  const GlobalPoint& priorPos,
296  const GlobalError& priorError) const
297 {
298  if ( tracks.size() < 1 )
299  {
300  LogError("RecoVertex|AdaptiveVertexFitter")
301  << "Supplied no tracks. Vertex is invalid.";
302  return CachingVertex<5>(); // return invalid vertex
303  };
304  VertexState seed (priorPos, priorError);
305  return fit(tracks, seed, true);
306 }
307 
308 
316 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
317 AdaptiveVertexFitter::linearizeTracks(const vector<reco::TransientTrack> & tracks,
318  const VertexState & seed ) const
319 {
320  const GlobalPoint & linP ( seed.position() );
321  vector<RefCountedLinearizedTrackState> lTracks;
322  for(vector<reco::TransientTrack>::const_iterator i = tracks.begin();
323  i != tracks.end(); ++i )
324  {
325  try {
328  lTracks.push_back(lTrData);
329  } catch ( exception & e ) {
330  LogInfo("RecoVertex/AdaptiveVertexFitter")
331  << "Exception " << e.what() << " in ::linearizeTracks."
332  << "Your future vertex has just lost a track.";
333  };
334  }
335  return weightTracks(lTracks, seed );
336 }
337 
343 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
345  const vector<RefCountedVertexTrack> & tracks,
346  const CachingVertex<5> & vertex ) const
347 {
348  VertexState seed = vertex.vertexState();
349  GlobalPoint linP = seed.position();
350  vector<RefCountedLinearizedTrackState> lTracks;
351  for(vector<RefCountedVertexTrack>::const_iterator i = tracks.begin();
352  i != tracks.end(); i++)
353  {
354  try {
356  = theLinTrkFactory->linearizedTrackState( linP, (**i).linearizedTrack()->track() );
357  /*
358  RefCountedLinearizedTrackState lTrData =
359  (**i).linearizedTrack()->stateWithNewLinearizationPoint(linP);
360  */
361  lTracks.push_back(lTrData);
362  } catch ( exception & e ) {
363  LogInfo("RecoVertex/AdaptiveVertexFitter")
364  << "Exception " << e.what() << " in ::relinearizeTracks. "
365  << "Will not relinearize this track.";
366  lTracks.push_back ( (**i).linearizedTrack() );
367  };
368  };
369  return reWeightTracks(lTracks, vertex );
370 }
371 
373 {
374  return new AdaptiveVertexFitter( * this );
375 }
376 
377 double AdaptiveVertexFitter::getWeight ( float chi2 ) const
378 {
379  double weight = theAssProbComputer->weight(chi2);
380 
381  if ( weight > 1.0 )
382  {
383  LogInfo("RecoVertex/AdaptiveVertexFitter") << "Weight " << weight << " > 1.0!";
384  weight=1.0;
385  };
386 
387  if ( weight < 1e-20 )
388  {
389  // LogInfo("RecoVertex/AdaptiveVertexFitter") << "Weight " << weight << " < 0.0!";
390  weight=1e-20;
391  };
392  return weight;
393 }
394 
395 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
397  const vector<RefCountedLinearizedTrackState> & lTracks,
398  const CachingVertex<5> & vertex ) const
399 {
400  VertexState seed = vertex.vertexState();
401  // cout << "[AdaptiveVertexFitter] now reweight around " << seed.position() << endl;
402  theNr++;
403  // GlobalPoint pos = seed.position();
404 
405  vector<RefCountedVertexTrack> finalTracks;
406  VertexTrackFactory<5> vTrackFactory;
407  #ifdef STORE_WEIGHTS
408  iter++;
409  #endif
410  for(vector<RefCountedLinearizedTrackState>::const_iterator i
411  = lTracks.begin(); i != lTracks.end(); i++)
412  {
413  double weight=0.;
414  // cout << "[AdaptiveVertexFitter] estimate " << endl;
415  pair < bool, double > chi2Res ( false, 0. );
416  try {
417  chi2Res = theComp->estimate ( vertex, *i, std::distance(lTracks.begin(),i) );
418  } catch ( exception const & e ) {};
419  // cout << "[AdaptiveVertexFitter] /estimate " << endl;
420  if (!chi2Res.first) {
421  // cout << "[AdaptiveVertexFitter] aie... vertex candidate is at " << vertex.position() << endl;
422  LogInfo("AdaptiveVertexFitter" ) << "When reweighting, chi2<0. Will add this track with w=0.";
423  // edm::LogInfo("AdaptiveVertexFitter" ) << "pt=" << (**i).track().pt();
424  }else {
425  weight = getWeight ( chi2Res.second );
426  }
427 
428  RefCountedVertexTrack vTrData
429  = vTrackFactory.vertexTrack(*i, seed, weight );
430 
431  #ifdef STORE_WEIGHTS
432  map < string, dataharvester::MultiType > m;
433  m["chi2"]=chi2;
434  m["w"]=theAssProbComputer->weight(chi2);
436  m["n"]=iter;
437  m["pos"]="reweight";
438  m["id"]=getId ( *i );
439  dataharvester::Writer::file("w.txt").save ( m );
440  #endif
441 
442  finalTracks.push_back(vTrData);
443  }
444  sort ( finalTracks.begin(), finalTracks.end(),
445  DistanceToRefPoint ( vertex.position() ) );
446  // cout << "[AdaptiveVertexFitter] /now reweight" << endl;
447  return finalTracks;
448 }
449 
450 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
452  const vector<RefCountedLinearizedTrackState> & lTracks,
453  const VertexState & seed ) const
454 {
455  theNr++;
456  CachingVertex<5> seedvtx ( seed, vector<RefCountedVertexTrack> (), 0. );
460 
461  vector<RefCountedVertexTrack> finalTracks;
462  VertexTrackFactory<5> vTrackFactory;
463  #ifdef STORE_WEIGHTS
464  iter++;
465  #endif
466  for(vector<RefCountedLinearizedTrackState>::const_iterator i
467  = lTracks.begin(); i != lTracks.end(); i++)
468  {
469 
470  double weight = 0.;
471  pair<bool, double> chi2Res = theComp->estimate ( seedvtx, *i, std::distance(lTracks.begin(),i) );
472  if (!chi2Res.first) {
473  // cout << "[AdaptiveVertexFitter] Aiee! " << endl;
474  LogInfo ("AdaptiveVertexFitter" ) << "When weighting a track, chi2 calculation failed;"
475  << " will add with w=0.";
476  } else {
477  weight = getWeight ( chi2Res.second );
478  }
479  RefCountedVertexTrack vTrData
480  = vTrackFactory.vertexTrack(*i, seed, weight );
481  #ifdef STORE_WEIGHTS
482  map < string, dataharvester::MultiType > m;
483  m["chi2"]=chi2;
484  m["w"]=theAssProbComputer->weight(chi2);
486  m["n"]=iter;
487  m["id"]=getId ( *i );
488  m["pos"]="weight";
489  dataharvester::Writer::file("w.txt").save ( m );
490  #endif
491  finalTracks.push_back(vTrData);
492  }
493  return finalTracks;
494 }
495 
501 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
503  const vector<RefCountedVertexTrack> & tracks,
504  const CachingVertex<5> & seed) const
505 {
506  vector<RefCountedLinearizedTrackState> lTracks;
507  for(vector<RefCountedVertexTrack>::const_iterator i = tracks.begin();
508  i != tracks.end(); i++)
509  {
510  lTracks.push_back((**i).linearizedTrack());
511  }
512 
513  return reWeightTracks(lTracks, seed);
514 }
515 
516 
517 /*
518  * The method where the vertex fit is actually done!
519  */
520 
522 AdaptiveVertexFitter::fit( const vector<RefCountedVertexTrack> & tracks,
523  const VertexState & priorSeed,
524  bool withPrior) const
525 {
526  // cout << "[AdaptiveVertexFit] fit with " << tracks.size() << endl;
528 
529  vector<RefCountedVertexTrack> initialTracks;
530  GlobalPoint priorVertexPosition = priorSeed.position();
531  GlobalError priorVertexError = priorSeed.error();
532 
533  CachingVertex<5> returnVertex( priorVertexPosition,priorVertexError,
534  initialTracks,0);
535  if (withPrior)
536  {
537  returnVertex = CachingVertex<5>(priorVertexPosition,priorVertexError,
538  priorVertexPosition,priorVertexError,initialTracks,0);
539  }
540 
541  // vector<RefCountedVertexTrack> globalVTracks = tracks;
542  // sort the tracks, according to distance to seed!
543  vector<RefCountedVertexTrack> globalVTracks ( tracks.size() );
544 
545  partial_sort_copy ( tracks.begin(), tracks.end(),
546  globalVTracks.begin(), globalVTracks.end(), DistanceToRefPoint ( priorSeed.position() ) );
547 
548  // main loop through all the VTracks
549  int lpStep = 0; int step = 0;
550 
551  CachingVertex<5> initialVertex = returnVertex;
552 
553  GlobalPoint newPosition = priorVertexPosition;
554  GlobalPoint previousPosition = newPosition;
555 
556  int ns_trks=0; // number of significant tracks.
557  // If we have only two significant tracks, we return an invalid vertex
558 
559  // cout << "[AdaptiveVertexFit] start " << tracks.size() << endl;
560  /*
561  for ( vector< RefCountedVertexTrack >::const_iterator
562  i=globalVTracks.begin(); i!=globalVTracks.end() ; ++i )
563  {
564  cout << " " << (**i).linearizedTrack()->track().initialFreeState().momentum() << endl;
565  }*/
566  do {
567  ns_trks=0;
568  CachingVertex<5> fVertex = initialVertex;
569  // cout << "[AdaptiveVertexFit] step " << step << " at " << fVertex.position() << endl;
570  if ((previousPosition - newPosition).transverse() > theMaxLPShift)
571  {
572  // relinearize and reweight.
573  // (reLinearizeTracks also reweights tracks)
574  // cout << "[AdaptiveVertexFit] relinearize at " << returnVertex.position() << endl;
575  if (gsfIntermediarySmoothing_) returnVertex = theSmoother->smooth(returnVertex);
576  globalVTracks = reLinearizeTracks( globalVTracks, returnVertex );
577  lpStep++;
578  } else if (step) {
579  // reweight, if it is not the first step
580  // cout << "[AdaptiveVertexFit] reweight at " << returnVertex.position() << endl;
581  if (gsfIntermediarySmoothing_) returnVertex = theSmoother->smooth(returnVertex);
582  globalVTracks = reWeightTracks( globalVTracks, returnVertex );
583  }
584  // cout << "[AdaptiveVertexFit] relinarized, reweighted" << endl;
585  // update sequentially the vertex estimate
586  CachingVertex<5> nVertex;
587  for(vector<RefCountedVertexTrack>::const_iterator i
588  = globalVTracks.begin(); i != globalVTracks.end(); i++)
589  {
590  if ((**i).weight() > 0.) nVertex = theUpdator->add( fVertex, *i );
591  else nVertex = fVertex;
592  if (nVertex.isValid()) {
593  if ( (**i).weight() >= theWeightThreshold )
594  {
595  ns_trks++;
596  };
597 
598  if ( fabs ( nVertex.position().z() ) > 10000. ||
599  nVertex.position().perp()>120.)
600  {
601  // were more than 100 m off!!
602  LogInfo ("AdaptiveVertexFitter" ) << "Vertex candidate just took off to " << nVertex.position()
603  << "! Will discard this update!";
604 // //<< "track pt was " << (**i).linearizedTrack()->track().pt()
605 // << "track momentum was " << (**i).linearizedTrack()->track().initialFreeState().momentum()
606 // << "track position was " << (**i).linearizedTrack()->track().initialFreeState().position()
607 // << "track chi2 was " << (**i).linearizedTrack()->track().chi2()
608 // << "track ndof was " << (**i).linearizedTrack()->track().ndof()
609 // << "track w was " << (**i).weight()
610 // << "track schi2 was " << (**i).smoothedChi2();
611  } else {
612  fVertex = nVertex;
613  }
614  } else {
615  LogInfo("RecoVertex/AdaptiveVertexFitter")
616  << "The updator returned an invalid vertex when adding track "
617  << i-globalVTracks.begin()
618  << ".\n Your vertex might just have lost one good track.";
619  };
620  }
621  previousPosition = newPosition;
622  newPosition = fVertex.position();
623  returnVertex = fVertex;
625  step++;
626  if ( step >= theMaxStep ) break;
627 
628  } while (
629  // repeat as long as
630  // - vertex moved too much or
631  // - we're not yet annealed
632  ( ((previousPosition - newPosition).mag() > theMaxShift) ||
633  (!(theAssProbComputer->isAnnealed()) ) ) ) ;
634 
635  if ( theWeightThreshold > 0. && ns_trks < 2 && !withPrior )
636  {
637  LogDebug("AdaptiveVertexFitter")
638  << "fewer than two significant tracks (w>" << theWeightThreshold << ")."
639  << " Fitted vertex is invalid.";
640  return CachingVertex<5>(); // return invalid vertex
641  }
642 
643  #ifdef STORE_WEIGHTS
644  map < string, dataharvester::MultiType > m;
645  m["chi2"]=chi2;
646  m["w"]=theAssProbComputer->weight(chi2);
648  m["n"]=iter;
649  m["id"]=getId ( *i );
650  m["pos"]="final";
651  dataharvester::Writer::file("w.txt").save ( m );
652  #endif
653  // cout << "[AdaptiveVertexFit] /fit" << endl;
654  return theSmoother->smooth( returnVertex );
655 }
#define LogDebug(id)
virtual bool isAnnealed() const =0
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
VertexState vertexState() const
Definition: CachingVertex.h:85
T perp() const
Definition: PV3DBase.h:72
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
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
static unsigned int getId(void)
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
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
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
virtual BDpair estimate(const CachingVertex< N > &v, const RefCountedLinearizedTrackState track, unsigned int hint=UINT_MAX) const =0
T z() const
Definition: PV3DBase.h:64
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &) const
VertexSmoother< 5 > * theSmoother
AnnealingSchedule * theAssProbComputer
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
virtual CachingVertex< N > smooth(const CachingVertex< N > &vertex) const =0
double b
Definition: hdecay.h:120
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
GlobalPoint position() const
virtual GlobalPoint getLinearizationPoint(const std::vector< reco::TransientTrack > &) const =0
GlobalVector globalMomentum() const
virtual LinearizationPointFinder * clone() const =0
double a
Definition: hdecay.h:121
virtual VertexUpdator * clone() const =0
T transverse() const
Another name for perp()
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
TrajectoryStateOnSurface impactPointState() const
T w() const
int weight
Definition: histoStyle.py:50
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