CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CollinearFitAtTM.cc
Go to the documentation of this file.
3 
5  valid_(false),chi2_(-1),ndof_(-1) {
6  //
7  // check input
8  //
9  if ( !tm.forwardPredictedState().isValid() ||
11  !tm.updatedState().isValid() ) {
12  edm::LogWarning("CollinearFitAtTM2") << "Invalid state in TrajectoryMeasurement";
13  return;
14  }
15  //
16  // prepare fit
17  //
18  initJacobian();
23 
24  LocalPoint hitPos(0.,0.,0.);
25  LocalError hitErr(-1.,-1.,-1.);
26  if ( tm.recHit()->isValid() ) {
27  hitPos = tm.recHit()->localPosition();
28  hitErr = tm.recHit()->localPositionError();
29  }
30 
31  fit(fwdPar,fwdCov,bwdPar,bwdCov,hitPos,hitErr);
32 }
33 
35  const AlgebraicSymMatrix55& fwdCovariance,
36  const AlgebraicVector5& bwdParameters,
37  const AlgebraicSymMatrix55& bwdCovariance,
38  const LocalPoint& hitPosition,
39  const LocalError& hitErrors) :
40  valid_(false),chi2_(-1),ndof_(-1) {
41  //
42  // prepare fit
43  //
44  initJacobian();
45 
46  fit(fwdParameters,fwdCovariance,bwdParameters,bwdCovariance,hitPosition,hitErrors);
47 }
48 
49 void
51 {
52  //
53  // Jacobian
54  //
55  for ( int i=0; i<12; ++i ) {
56  for ( int j=0; j<6; ++j ) jacobian_(i,j) = 0;
57  }
58  for ( int i=1; i<5; ++i ) {
60  }
61  jacobian_(0,ParQpIn) = 1.;
62  jacobian_(5,ParQpOut) = 1.;
63 }
64 
65 bool
67  const AlgebraicSymMatrix55& fwdCovariance,
68  const AlgebraicVector5& bwdParameters,
69  const AlgebraicSymMatrix55& bwdCovariance,
70  const LocalPoint& hitPos, const LocalError& hitErr)
71 {
72 
73  if ( hitErr.xx()>0 )
74  jacobian_(10,ParX) = jacobian_(11,ParY) = 1;
75  else
76  jacobian_(10,ParX) = jacobian_(11,ParY) = 0;
77 
78  for ( int i=0; i<12; ++i ) {
79  for ( int j=0; j<12; ++j ) weightMatrix_(i,j) = 0;
80  }
81 
82  for ( int i=0; i<5; ++i ) measurements_(i) = fwdParameters(i);
83  weightMatrix_.Place_at(fwdCovariance,0,0);
84  for ( int i=0; i<5; ++i ) measurements_(i+5) = bwdParameters(i);
85  weightMatrix_.Place_at(bwdCovariance,5,5);
86  if ( hitErr.xx()>0 ) {
87  measurements_(10) = hitPos.x();
88  measurements_(11) = hitPos.y();
89  weightMatrix_(10,10) = hitErr.xx();
90  weightMatrix_(10,11) = weightMatrix_(11,10) = hitErr.xy();
91  weightMatrix_(11,11) = hitErr.yy();
92  }
93  else {
94  measurements_(10) = measurements_(11) = 0.;
95  weightMatrix_(10,10) = weightMatrix_(11,11) = 1.;
96  weightMatrix_(10,11) = weightMatrix_(11,10) = 0.;
97  }
98  //
99  // invert covariance matrix
100  //
101  if ( !weightMatrix_.Invert() ) {
102  edm::LogWarning("CollinearFitAtTM2") << "Inversion of input covariance matrix failed";
103  return false;
104  }
105 
106  //
107  projectedMeasurements_ = ROOT::Math::Transpose(jacobian_)*(weightMatrix_*measurements_);
108  //
109  // Fitted parameters and covariance matrix
110  //
111  covariance_ = ROOT::Math::SimilarityT(jacobian_,weightMatrix_);
112  if ( !covariance_.Invert() ) {
113  edm::LogWarning("CollinearFitAtTM2") << "Inversion of resulting weight matrix failed";
114  return false;
115  }
116 
118 
119  //
120  // chi2
121  //
122  chi2_ = ROOT::Math::Similarity(measurements_,weightMatrix_) -
123  ROOT::Math::Similarity(projectedMeasurements_,covariance_);
124  ndof_ = hitErr.xx()>0 ? 6 : 4;
125 
126  valid_ = true;
127  return true;
128 }
129 
132  //
133  // check validity
134  //
135  if ( !valid_ ) return Measurement1D();
136  //
137  // deltaP = 1/qpout - 1/qpin ; uncertainty from linear error propagation
138  //
139  double qpIn = parameters_(0);
140  double sig2In = covariance_(0,0);
141  double qpOut = parameters_(1);
142  double sig2Out = covariance_(1,1);
143  double corrInOut = covariance_(0,1);
144  double pIn = 1./fabs(qpIn);
145  double pOut = 1./fabs(qpOut);
146  double sig2DeltaP = pIn/qpIn*pIn/qpIn*sig2In - 2*pIn/qpIn*pOut/qpOut*corrInOut +
147  pOut/qpOut*pOut/qpOut*sig2Out;
148 
149  return Measurement1D(pOut-pIn,sig2DeltaP?sqrt(sig2DeltaP):0.);
150 }
151 
int i
Definition: DBlmapReader.cc:9
float xx() const
Definition: LocalError.h:24
const LocalTrajectoryParameters & localParameters() const
TrajectoryStateOnSurface forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
T y() const
Definition: PV3DBase.h:62
ConstRecHitPointer recHit() const
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
CollinearFitAtTM2(const TrajectoryMeasurement &tm)
static const uint16_t valid_
Definition: Constants.h:18
bool fit(const AlgebraicVector5 &fwdParameters, const AlgebraicSymMatrix55 &fwdCovariance, const AlgebraicVector5 &bwdParameters, const AlgebraicSymMatrix55 &bwdCovariance, const LocalPoint &hitPosition, const LocalError &hitErrors)
Perform the fit. Return value &quot;true&quot; for success.
ResultVector parameters_
AlgebraicVector5 vector() const
float xy() const
Definition: LocalError.h:25
float yy() const
Definition: LocalError.h:26
T sqrt(T t)
Definition: SSEVec.h:46
Measurement1D deltaP() const
estimated deltaP (out-in) from fit parameters
int j
Definition: DBlmapReader.cc:9
TrajectoryStateOnSurface updatedState() const
const AlgebraicSymMatrix55 & matrix() const
const LocalTrajectoryError & localError() const
ResultMatrix covariance_
ROOT::Math::SMatrix< double, 12, 12, ROOT::Math::MatRepSym< double, 12 > > weightMatrix_
ROOT::Math::SVector< double, 5 > AlgebraicVector5
ROOT::Math::SVector< double, 6 > projectedMeasurements_
void initJacobian()
initialise the jacobian
ROOT::Math::SMatrix< double, 12, 6 > jacobian_
ROOT::Math::SVector< double, 12 > measurements_
T x() const
Definition: PV3DBase.h:61
TrajectoryStateOnSurface backwardPredictedState() const
Access to backward predicted state (from smoother)