CMS 3D CMS Logo

MRHChi2MeasurementEstimator.cc
Go to the documentation of this file.
11 
13  const TrackingRecHit& aRecHit) const {
14 
15  switch (aRecHit.dimension()) {
16  case 1: return estimate<1>(tsos,aRecHit);
17  case 2: return estimate<2>(tsos,aRecHit);
18  //avoid the not-(1D or 2D) hit due to the final sum
19  //supposing all the hits inside of a MRH have the same dimension
20  case 3:
21  case 4:
22  case 5:{
23  LogDebug("MRHChi2MeasurementEstimator") << "WARNING:The hit is not 1D either 2D:"
24  << " does not count in the MRH Chi2 estimation." ;
25  double est = 0.0;
26  return HitReturnType(false, est);
27  }
28  }
29  throw cms::Exception("Rec hit of invalid dimension (not 1,2,3,4,5)") <<
30  "The value was " << aRecHit.dimension() <<
31  ", type is " << typeid(aRecHit).name() << "\n";
32 }
33 
34 //---------------------------------------------------------------------------------------------------------------
35 template <unsigned int N>
37  const TrackingRecHit& aRecHit) const {
38 
39  LogDebug("MRHChi2MeasurementEstimator") << "Calling MRHChi2MeasurementEstimator" ;
40  SiTrackerMultiRecHit const & mHit = dynamic_cast<SiTrackerMultiRecHit const &>(aRecHit);
41  double est=0;
42 
43  double annealing = mHit.getAnnealingFactor();
44  LogDebug("MRHChi2MeasurementEstimator") << "Current annealing factor is " << annealing;
45 
46  std::vector<const TrackingRecHit*> components = mHit.recHits();
47  LogDebug("MRHChi2MeasurementEstimator") << "this hit has " << components.size() << " components";
48 
49  int iComp = 0;
50  for(std::vector<const TrackingRecHit*>::const_iterator iter = components.begin(); iter != components.end(); iter++, iComp++){
51 
52  // define variables that will be used to setup the KfComponentsHolder
54  typename AlgebraicROOTObject<N>::Vector r, rMeas;
55  typename AlgebraicROOTObject<N,N>::SymMatrix V, VMeas;
57  const AlgebraicSymMatrix55 &C = (tsos.localError().matrix());
58 
59  // setup the holder with the correct dimensions and get the values
60  KfComponentsHolder holder;
61  holder.template setup<N>(&r, &V, &pf, &rMeas, &VMeas, x, C);
62  (**iter).getKfComponents(holder);
63 
64  r -= rMeas;
65  V = V*annealing + VMeas;
66  bool ierr = invertPosDefMatrix(V);
67  if( !ierr ) {
68  edm::LogError("SiTrackerMultiRecHitUpdator")<<"SiTrackerMultiRecHitUpdator::ComputeParameters2dim: W not valid!"<<std::endl;
69  }
70 
71  LogDebug("MRHChi2MeasurementEstimator") << "Hit with weight " << mHit.weight(iComp);
72  est += ROOT::Math::Similarity(r, V)*mHit.weight(iComp);
73 
74  }
75 
76  return returnIt(est);
77 
78 }
79 
#define LogDebug(id)
ROOT::Math::SMatrix< double, D1, D1, ROOT::Math::MatRepSym< double, D1 > > SymMatrix
std::pair< bool, double > returnIt(double est) const
const LocalTrajectoryParameters & localParameters() const
virtual double getAnnealingFactor() const
std::vector< const TrackingRecHit * > recHits() const override
Access to component RecHits (if any)
std::pair< bool, double > estimate(const TrajectoryStateOnSurface &tsos, const TrackingRecHit &aRecHit) const override
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
float weight(unsigned int i) const
AlgebraicVector5 vector() const
virtual int dimension() const =0
bool invertPosDefMatrix(ROOT::Math::SMatrix< T, N, N, ROOT::Math::MatRepSym< T, N > > &m)
const AlgebraicSymMatrix55 & matrix() const
const LocalTrajectoryError & localError() const
std::pair< bool, double > HitReturnType
ROOT::Math::SVector< double, D1 > Vector
ROOT::Math::SVector< double, 5 > AlgebraicVector5