CMS 3D CMS Logo

KalmanVertexTrackUpdator.cc
Go to the documentation of this file.
3 //#include "Utilities/GenUtil/interface/ReferenceCountingPointer.h"
8 
9 #include <iostream>
10 
11 template <unsigned int N>
14 
15 {
16  trackMatrixPair thePair = trackRefit(vertex.vertexState(), track->linearizedTrack(), track->weight());
17 
18  VertexState rVert = updator.positionUpdate(vertex.vertexState(), track->linearizedTrack(), track->weight(), -1);
19 
20  std::pair<bool, double> result = helper.trackParameterChi2(track->linearizedTrack(), thePair.first);
21  float smoothedChi2 = helper.vertexChi2(rVert, vertex.vertexState()) + result.second;
22 
23  return theVTFactory.vertexTrack(
24  track->linearizedTrack(), vertex.vertexState(), thePair.first, smoothedChi2, thePair.second, track->weight());
25 }
26 
27 template <unsigned int N>
29  const VertexState& vertex,
31  float weight) const {
32  typedef ROOT::Math::SVector<double, N> AlgebraicVectorN;
33  typedef ROOT::Math::SVector<double, N - 2> AlgebraicVectorM;
34  typedef ROOT::Math::SMatrix<double, N, 3, ROOT::Math::MatRepStd<double, N, 3> > AlgebraicMatrixN3;
35  typedef ROOT::Math::SMatrix<double, 3, N, ROOT::Math::MatRepStd<double, 3, N> > AlgebraicMatrix3N;
36  typedef ROOT::Math::SMatrix<double, 3, N - 2, ROOT::Math::MatRepStd<double, 3, N - 2> > AlgebraicMatrix3M;
37  typedef ROOT::Math::SMatrix<double, N, N - 2, ROOT::Math::MatRepStd<double, N, N - 2> > AlgebraicMatrixNM;
38  typedef ROOT::Math::SMatrix<double, N - 2, 3, ROOT::Math::MatRepStd<double, N - 2, 3> > AlgebraicMatrixM3;
39  typedef ROOT::Math::SMatrix<double, N, N, ROOT::Math::MatRepSym<double, N> > AlgebraicSymMatrixNN;
40  // typedef ROOT::Math::SMatrix<double,N+1,N+1,ROOT::Math::MatRepSym<double,N+1> > AlgebraicSymMatrixOO;
41  typedef ROOT::Math::SMatrix<double, N + 1, N + 1, ROOT::Math::MatRepStd<double, N + 1, N + 1> > AlgebraicMatrixOO;
42  typedef ROOT::Math::SMatrix<double, N - 2, N - 2, ROOT::Math::MatRepSym<double, N - 2> > AlgebraicSymMatrixMM;
43 
44  //Vertex position
45  GlobalPoint vertexPosition = vertex.position();
46 
47  AlgebraicVector3 vertexCoord;
48  vertexCoord(0) = vertexPosition.x();
49  vertexCoord(1) = vertexPosition.y();
50  vertexCoord(2) = vertexPosition.z();
51  const AlgebraicSymMatrix33 vertexErrorMatrix = vertex.error().matrix();
52 
53  //track information
54  const AlgebraicMatrixN3 a = linTrackState->positionJacobian();
55  const AlgebraicMatrixNM b = linTrackState->momentumJacobian();
56 
57  // AlgebraicVectorN trackParameters =
58  // linTrackState->predictedStateParameters();
59 
60  int ifail;
61  AlgebraicSymMatrixNN trackParametersWeight = linTrackState->predictedStateWeight(ifail);
62 
63  AlgebraicSymMatrixMM s = ROOT::Math::SimilarityT(b, trackParametersWeight);
64 
65  if (!invertPosDefMatrix(s))
66  throw VertexException("KalmanVertexTrackUpdator::S matrix inversion failed");
67 
68  // NN NM MM
69  AlgebraicMatrixNM twbs = trackParametersWeight * b * s;
70 
71  AlgebraicVectorN vv = linTrackState->predictedStateParameters() - linTrackState->constantTerm() - a * vertexCoord;
72  // MM MN NN
73  // AlgebraicVectorM newTrackMomentumP = s * (ROOT::Math::Transpose(b)) * trackParametersWeight * vv;
74  AlgebraicVectorM newTrackMomentumP = ROOT::Math::Transpose(twbs) * vv;
75 
76  //AlgebraicMatrix3M refittedPositionMomentumConvariance =
77  // 33 3N NN NM MM
78  // -vertexErrorMatrix * (ROOT::Math::Transpose(a)) * trackParametersWeight * b * s;
79 
80  AlgebraicMatrix3N tmpM1 = -vertexErrorMatrix * (ROOT::Math::Transpose(a));
81  AlgebraicMatrix3M refittedPositionMomentumConvariance = tmpM1 * twbs;
82 
83  AlgebraicSymMatrixMM refittedMomentumConvariance =
84  s / weight + ROOT::Math::SimilarityT(refittedPositionMomentumConvariance, vertex.weight().matrix());
85 
86  // int matrixSize = 3+3; //refittedMomentumConvariance.num_col();
87  AlgebraicMatrixOO covMatrix; //(matrixSize, matrixSize);
88  covMatrix.Place_at(refittedPositionMomentumConvariance, 0, 3);
89  covMatrix.Place_at(ROOT::Math::Transpose(refittedPositionMomentumConvariance), 3, 0);
90  covMatrix.Place_at(vertexErrorMatrix, 0, 0);
91  covMatrix.Place_at(refittedMomentumConvariance, 3, 3);
92 
93  AlgebraicSymMatrixOO covSymMatrix(covMatrix.LowerBlock());
94 
95  RefCountedRefittedTrackState refittedTrackState =
96  linTrackState->createRefittedTrackState(vertexPosition, newTrackMomentumP, covSymMatrix);
97 
98  return trackMatrixPair(refittedTrackState, covSymMatrix);
99  // (refittedTrackState, refittedPositionMomentumConvariance);
100 }
101 
102 template class KalmanVertexTrackUpdator<5>;
103 template class KalmanVertexTrackUpdator<6>;
ROOT::Math::SMatrix< double, 3, N - 2, ROOT::Math::MatRepStd< double, 3, N - 2 > > AlgebraicMatrix3M
Definition: helper.py:1
T z() const
Definition: PV3DBase.h:61
Common base class.
Definition: weight.py:1
std::pair< RefCountedRefittedTrackState, AlgebraicSymMatrixOO > trackMatrixPair
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
ROOT::Math::SMatrix< double, N+1, N+1, ROOT::Math::MatRepSym< double, N+1 > > AlgebraicSymMatrixOO
RefCountedVertexTrack update(const CachingVertex< N > &vertex, RefCountedVertexTrack track) const override
bool invertPosDefMatrix(ROOT::Math::SMatrix< T, N, N, ROOT::Math::MatRepSym< T, N > > &m)
#define N
Definition: blowfish.cc:9
double b
Definition: hdecay.h:120
trackMatrixPair trackRefit(const VertexState &vertex, RefCountedLinearizedTrackState linTrackState, float weight) const
double a
Definition: hdecay.h:121
ROOT::Math::SVector< double, 3 > AlgebraicVector3
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > AlgebraicSymMatrix33