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  LogWarning("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  LogWarning("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  LogWarning("RecoVertex/AdaptiveVertexFitter") << "Weight " << weight << " > 1.0!";
384  weight=1.0;
385  };
386 
387  if ( weight < 1e-20 )
388  {
389  // LogWarning("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  theNr++;
402  // GlobalPoint pos = seed.position();
403 
404  vector<RefCountedVertexTrack> finalTracks;
405  VertexTrackFactory<5> vTrackFactory;
406  #ifdef STORE_WEIGHTS
407  iter++;
408  #endif
409  for(vector<RefCountedLinearizedTrackState>::const_iterator i
410  = lTracks.begin(); i != lTracks.end(); i++)
411  {
412  double weight=0.;
413  pair<bool, double> chi2Res = theComp->estimate ( vertex, *i );
414  if (!chi2Res.first) {
415  cout << "[AdaptiveVertexFitter] aie... vertex candidate is at " << vertex.position() << endl;
416  LogWarning("AdaptiveVertexFitter" ) << "When reweighting, chi2<0. Will add this track with w=0.";
417  // edm::LogWarning("AdaptiveVertexFitter" ) << "pt=" << (**i).track().pt();
418  }else {
419  weight = getWeight ( chi2Res.second );
420  }
421 
422  RefCountedVertexTrack vTrData
423  = vTrackFactory.vertexTrack(*i, seed, weight );
424 
425  #ifdef STORE_WEIGHTS
426  map < string, dataharvester::MultiType > m;
427  m["chi2"]=chi2;
428  m["w"]=theAssProbComputer->weight(chi2);
430  m["n"]=iter;
431  m["pos"]="reweight";
432  m["id"]=getId ( *i );
433  dataharvester::Writer::file("w.txt").save ( m );
434  #endif
435 
436  finalTracks.push_back(vTrData);
437  }
438  sort ( finalTracks.begin(), finalTracks.end(),
439  DistanceToRefPoint ( vertex.position() ) );
440  return finalTracks;
441 }
442 
443 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
445  const vector<RefCountedLinearizedTrackState> & lTracks,
446  const VertexState & seed ) const
447 {
448  theNr++;
449  CachingVertex<5> seedvtx ( seed, vector<RefCountedVertexTrack> (), 0. );
453 
454  vector<RefCountedVertexTrack> finalTracks;
455  VertexTrackFactory<5> vTrackFactory;
456  #ifdef STORE_WEIGHTS
457  iter++;
458  #endif
459  for(vector<RefCountedLinearizedTrackState>::const_iterator i
460  = lTracks.begin(); i != lTracks.end(); i++)
461  {
462 
463  double weight = 0.;
464  pair<bool, double> chi2Res = theComp->estimate ( seedvtx, *i );
465  if (!chi2Res.first) {
466  cout << "[AdaptiveVertexFitter] Aiee! " << endl;
467  LogWarning ("AdaptiveVertexFitter" ) << "When weighting a track, chi2 calculation failed;"
468  << " will add with w=0.";
469  } else {
470  weight = getWeight ( chi2Res.second );
471  }
472  RefCountedVertexTrack vTrData
473  = vTrackFactory.vertexTrack(*i, seed, weight );
474  #ifdef STORE_WEIGHTS
475  map < string, dataharvester::MultiType > m;
476  m["chi2"]=chi2;
477  m["w"]=theAssProbComputer->weight(chi2);
479  m["n"]=iter;
480  m["id"]=getId ( *i );
481  m["pos"]="weight";
482  dataharvester::Writer::file("w.txt").save ( m );
483  #endif
484  finalTracks.push_back(vTrData);
485  }
486  return finalTracks;
487 }
488 
494 vector<AdaptiveVertexFitter::RefCountedVertexTrack>
496  const vector<RefCountedVertexTrack> & tracks,
497  const CachingVertex<5> & seed) const
498 {
499  vector<RefCountedLinearizedTrackState> lTracks;
500  for(vector<RefCountedVertexTrack>::const_iterator i = tracks.begin();
501  i != tracks.end(); i++)
502  {
503  lTracks.push_back((**i).linearizedTrack());
504  }
505 
506  return reWeightTracks(lTracks, seed);
507 }
508 
509 
510 /*
511  * The method where the vertex fit is actually done!
512  */
513 
515 AdaptiveVertexFitter::fit( const vector<RefCountedVertexTrack> & tracks,
516  const VertexState & priorSeed,
517  bool withPrior) const
518 {
520 
521  vector<RefCountedVertexTrack> initialTracks;
522  GlobalPoint priorVertexPosition = priorSeed.position();
523  GlobalError priorVertexError = priorSeed.error();
524 
525  CachingVertex<5> returnVertex( priorVertexPosition,priorVertexError,
526  initialTracks,0);
527  if (withPrior)
528  {
529  returnVertex = CachingVertex<5>(priorVertexPosition,priorVertexError,
530  priorVertexPosition,priorVertexError,initialTracks,0);
531  }
532 
533  // vector<RefCountedVertexTrack> globalVTracks = tracks;
534  // sort the tracks, according to distance to seed!
535  vector<RefCountedVertexTrack> globalVTracks ( tracks.size() );
536 
537  partial_sort_copy ( tracks.begin(), tracks.end(),
538  globalVTracks.begin(), globalVTracks.end(), DistanceToRefPoint ( priorSeed.position() ) );
539 
540  // main loop through all the VTracks
541  int lpStep = 0; int step = 0;
542 
543  CachingVertex<5> initialVertex = returnVertex;
544 
545  GlobalPoint newPosition = priorVertexPosition;
546  GlobalPoint previousPosition = newPosition;
547 
548  int ns_trks=0; // number of significant tracks.
549  // If we have only two significant tracks, we return an invalid vertex
550 
551  do {
552  ns_trks=0;
553  CachingVertex<5> fVertex = initialVertex;
554  if ((previousPosition - newPosition).transverse() > theMaxLPShift)
555  {
556  // relinearize and reweight.
557  // (reLinearizeTracks also reweights tracks)
558  if (gsfIntermediarySmoothing_) returnVertex = theSmoother->smooth(returnVertex);
559  globalVTracks = reLinearizeTracks( globalVTracks, returnVertex );
560  lpStep++;
561  } else if (step) {
562  // reweight, if it is not the first step
563  if (gsfIntermediarySmoothing_) returnVertex = theSmoother->smooth(returnVertex);
564  globalVTracks = reWeightTracks( globalVTracks, returnVertex );
565  }
566  // update sequentially the vertex estimate
567  CachingVertex<5> nVertex;
568  for(vector<RefCountedVertexTrack>::const_iterator i
569  = globalVTracks.begin(); i != globalVTracks.end(); i++)
570  {
571  if ((**i).weight() > 0.) nVertex = theUpdator->add( fVertex, *i );
572  else nVertex = fVertex;
573  if (nVertex.isValid()) {
574  if ( (**i).weight() >= theWeightThreshold )
575  {
576  ns_trks++;
577  };
578 
579  if ( fabs ( nVertex.position().z() ) > 10000. ||
580  nVertex.position().perp()>120.)
581  {
582  // were more than 100 m off!!
583  LogWarning ("AdaptiveVertexFitter" ) << "Vertex candidate just took off to " << nVertex.position()
584  << "! Will discard this update!";
585 // //<< "track pt was " << (**i).linearizedTrack()->track().pt()
586 // << "track momentum was " << (**i).linearizedTrack()->track().initialFreeState().momentum()
587 // << "track position was " << (**i).linearizedTrack()->track().initialFreeState().position()
588 // << "track chi2 was " << (**i).linearizedTrack()->track().chi2()
589 // << "track ndof was " << (**i).linearizedTrack()->track().ndof()
590 // << "track w was " << (**i).weight()
591 // << "track schi2 was " << (**i).smoothedChi2();
592  } else {
593  fVertex = nVertex;
594  }
595  } else {
596  LogWarning("RecoVertex/AdaptiveVertexFitter")
597  << "The updator returned an invalid vertex when adding track "
598  << i-globalVTracks.begin()
599  << ".\n Your vertex might just have lost one good track.";
600  };
601  }
602  previousPosition = newPosition;
603  newPosition = fVertex.position();
604  returnVertex = fVertex;
606  step++;
607  if ( step >= theMaxStep ) break;
608 
609  } while (
610  // repeat as long as
611  // - vertex moved too much or
612  // - we're not yet annealed
613  ( ((previousPosition - newPosition).mag() > theMaxShift) ||
614  (!(theAssProbComputer->isAnnealed()) ) ) ) ;
615 
616  if ( theWeightThreshold > 0. && ns_trks < 2 && !withPrior )
617  {
618  LogDebug("AdaptiveVertexFitter")
619  << "fewer than two significant tracks (w>" << theWeightThreshold << ")."
620  << " Fitted vertex is invalid.";
621  return CachingVertex<5>(); // return invalid vertex
622  }
623 
624  #ifdef STORE_WEIGHTS
625  map < string, dataharvester::MultiType > m;
626  m["chi2"]=chi2;
627  m["w"]=theAssProbComputer->weight(chi2);
629  m["n"]=iter;
630  m["id"]=getId ( *i );
631  m["pos"]="final";
632  dataharvester::Writer::file("w.txt").save ( m );
633  #endif
634  return theSmoother->smooth( returnVertex );
635 }
#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
list step
Definition: launcher.py:15
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
T z() const
Definition: PV3DBase.h:58
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
T * clone(const T *tp)
Definition: Ptr.h:42
virtual CachingVertex< N > smooth(const CachingVertex< N > &vertex) const =0
double b
Definition: hdecay.h:120
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
tuple cout
Definition: gather_cfg.py:41
TrajectoryStateOnSurface impactPointState() const
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