CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TwoBodyDecayTrajectory.cc
Go to the documentation of this file.
2 
9 
11 
12 
14 
16  const ConstRecHitCollection & recHits,
17  const MagneticField* magField,
18  MaterialEffects materialEffects,
19  PropagationDirection propDir,
20  bool hitsAreReverse,
21  const reco::BeamSpot &beamSpot,
22  bool useRefittedState,
23  bool constructTsosWithErrors )
24 
26  TwoBodyDecayParameters::dimension, recHits.first.size() + recHits.second.size(),
27  (materialEffects >= breakPoints) ? 2*(recHits.first.size() + recHits.second.size())-4 : 0,
28  (materialEffects >= breakPoints) ? 2*(recHits.first.size() + recHits.second.size())-3 : 1 )
29 {
30  if ( hitsAreReverse )
31  {
32  TransientTrackingRecHit::ConstRecHitContainer::const_reverse_iterator itRecHits;
33  ConstRecHitCollection fwdRecHits;
34 
35  fwdRecHits.first.reserve( recHits.first.size() );
36  for ( itRecHits = recHits.first.rbegin(); itRecHits != recHits.first.rend(); ++itRecHits )
37  {
38  fwdRecHits.first.push_back( *itRecHits );
39  }
40 
41  fwdRecHits.second.reserve( recHits.second.size() );
42  for ( itRecHits = recHits.second.rbegin(); itRecHits != recHits.second.rend(); ++itRecHits )
43  {
44  fwdRecHits.second.push_back( *itRecHits );
45  }
46 
47  theValidityFlag = this->construct( trajectoryState, fwdRecHits, magField, materialEffects, propDir,
48  beamSpot, useRefittedState, constructTsosWithErrors );
49  }
50  else
51  {
52  theValidityFlag = this->construct( trajectoryState, recHits, magField, materialEffects, propDir,
53  beamSpot, useRefittedState, constructTsosWithErrors );
54  }
55 }
56 
57 
59  : ReferenceTrajectoryBase( 0, 0, 0, 0)
60 {}
61 
62 
64  const ConstRecHitCollection& recHits,
65  const MagneticField* field,
66  MaterialEffects materialEffects,
67  PropagationDirection propDir,
68  const reco::BeamSpot &beamSpot,
69  bool useRefittedState,
70  bool constructTsosWithErrors )
71 {
72  const TwoBodyDecayTrajectoryState::TsosContainer& tsos = state.trajectoryStates( useRefittedState );
74  double mass = state.particleMass();
75 
76  //
77  // first track
78  //
79 
80  // construct a trajectory (hits should be already in correct order)
81  ReferenceTrajectory trajectory1( tsos.first, recHits.first, false, field, materialEffects,
82  propDir, mass, false, beamSpot);
83 
84  // check if construction of trajectory was successful
85  if ( !trajectory1.isValid() ) return false;
86 
87  int nLocal = deriv.first.num_row();
88  int nTbd = deriv.first.num_col();
89  unsigned int nHitMeas1 = trajectory1.numberOfHitMeas();
90  unsigned int nVirtualMeas1 = trajectory1.numberOfVirtualMeas();
91  unsigned int nPar1 = trajectory1.numberOfPar();
92  unsigned int nVirtualPar1 = trajectory1.numberOfVirtualPar();
93 
94  // derivatives of the trajectory w.r.t. to the decay parameters
95  AlgebraicMatrix fullDeriv1 = trajectory1.derivatives().sub(1,nHitMeas1+nVirtualMeas1,1,nLocal) * trajectory1.localToTrajectory() * deriv.first;
96 
97  //
98  // second track
99  //
100 
101  ReferenceTrajectory trajectory2( tsos.second, recHits.second, false, field, materialEffects,
102  propDir, mass, false, beamSpot );
103 
104  if ( !trajectory2.isValid() ) return false;
105 
106  unsigned int nHitMeas2 = trajectory2.numberOfHitMeas();
107  unsigned int nVirtualMeas2 = trajectory2.numberOfVirtualMeas();
108  unsigned int nPar2 = trajectory2.numberOfPar();
109  unsigned int nVirtualPar2 = trajectory2.numberOfVirtualPar();
110 
111  AlgebraicMatrix fullDeriv2 = trajectory2.derivatives().sub(1,nHitMeas2+nVirtualMeas2,1,nLocal) * trajectory2.localToTrajectory() * deriv.second;
112 
113  //
114  // combine both tracks
115  //
116 
117  theNumberOfRecHits.first = recHits.first.size();
118  theNumberOfRecHits.second = recHits.second.size();
119 
120  theNumberOfHits = trajectory1.numberOfHits() + trajectory2.numberOfHits();
121  theNumberOfPars = nPar1 + nPar2;
122  theNumberOfVirtualPars = nVirtualPar1 + nVirtualPar2;
123  theNumberOfVirtualMeas = nVirtualMeas1 + nVirtualMeas2 + 1; // add virtual mass measurement
124 
125  // hit measurements from trajectory 1
126  int rowOffset = 1;
127  int colOffset = 1;
128  theDerivatives.sub( rowOffset, colOffset, fullDeriv1.sub( 1, nHitMeas1, 1, nTbd ) );
129  colOffset += nTbd;
130  theDerivatives.sub( rowOffset, colOffset, trajectory1.derivatives().sub( 1, nHitMeas1, nLocal + 1, nPar1 + nVirtualPar1 ) );
131  // hit measurements from trajectory 2
132  rowOffset += nHitMeas1;
133  colOffset = 1;
134  theDerivatives.sub( rowOffset, colOffset, fullDeriv2.sub( 1, nHitMeas2, 1, nTbd ) );
135  colOffset += (nPar1 + nVirtualPar1 + nTbd - nLocal);
136  theDerivatives.sub( rowOffset, colOffset, trajectory2.derivatives().sub( 1, nHitMeas2, nLocal + 1, nPar2 + nVirtualPar2 ) );
137  // MS measurements from trajectory 1
138  rowOffset += nHitMeas2;
139  colOffset = 1;
140  theDerivatives.sub( rowOffset, colOffset, fullDeriv1.sub(nHitMeas1 + 1, nHitMeas1 + nVirtualMeas1, 1, nTbd ) );
141  colOffset += nTbd;
142  theDerivatives.sub( rowOffset, colOffset, trajectory1.derivatives().sub(nHitMeas1 + 1, nHitMeas1 + nVirtualMeas1, nLocal + 1, nPar1 + nVirtualPar1 ) );
143  // MS measurements from trajectory 2
144  rowOffset += nVirtualMeas1;
145  colOffset = 1;
146  theDerivatives.sub( rowOffset, colOffset, fullDeriv2.sub(nHitMeas2 + 1, nHitMeas2 + nVirtualMeas2, 1, nTbd ) );
147  colOffset += (nPar1 + nVirtualPar1 + nTbd - nLocal);
148  theDerivatives.sub( rowOffset, colOffset, trajectory2.derivatives().sub(nHitMeas2 + 1, nHitMeas2 + nVirtualMeas2, nLocal + 1, nPar2 + nVirtualPar2 ) );
149 
150  theMeasurements.sub( 1, trajectory1.measurements().sub( 1, nHitMeas1 ) );
151  theMeasurements.sub( nHitMeas1 + 1, trajectory2.measurements().sub( 1, nHitMeas2 ) );
152  theMeasurements.sub( nHitMeas1 + nHitMeas2 + 1, trajectory1.measurements().sub(nHitMeas1 + 1, nHitMeas1 + nVirtualMeas1 ) );
153  theMeasurements.sub( nHitMeas1 + nHitMeas2 + nVirtualMeas1 + 1, trajectory2.measurements().sub(nHitMeas2 + 1, nHitMeas2 + nVirtualMeas2 ) );
154 
155  theMeasurementsCov.sub( 1, trajectory1.measurementErrors().sub( 1, nHitMeas1 ) );
156  theMeasurementsCov.sub( nHitMeas1 + 1, trajectory2.measurementErrors().sub( 1, nHitMeas2 ) );
157  theMeasurementsCov.sub( nHitMeas1 + nHitMeas2 + 1, trajectory1.measurementErrors().sub(nHitMeas1 + 1, nHitMeas1 + nVirtualMeas1 ) );
158  theMeasurementsCov.sub( nHitMeas1 + nHitMeas2 + nVirtualMeas1 + 1, trajectory2.measurementErrors().sub(nHitMeas2 + 1, nHitMeas2 + nVirtualMeas2 ) );
159 
160  theTrajectoryPositions.sub( 1, trajectory1.trajectoryPositions() );
161  theTrajectoryPositions.sub( nHitMeas1 + 1, trajectory2.trajectoryPositions() );
162 
163  theTrajectoryPositionCov = state.decayParameters().covariance().similarity( theDerivatives.sub(1, nHitMeas1 + nHitMeas2, 1, 9) );
164 
166 
167  theRecHits.insert( theRecHits.end(), recHits.first.begin(), recHits.first.end() );
168  theRecHits.insert( theRecHits.end(), recHits.second.begin(), recHits.second.end() );
169 
170  // add virtual mass measurement
171  rowOffset += nVirtualMeas2;
172  int indMass = rowOffset-1;
174  theMeasurementsCov[indMass][indMass] = state.primaryWidth() * state.primaryWidth();
176 
177  if ( constructTsosWithErrors )
178  {
179  constructTsosVecWithErrors( trajectory1, trajectory2, field );
180  }
181  else
182  {
183  theTsosVec.insert( theTsosVec.end(),
184  trajectory1.trajectoryStates().begin(),
185  trajectory1.trajectoryStates().end() );
186 
187  theTsosVec.insert( theTsosVec.end(),
188  trajectory2.trajectoryStates().begin(),
189  trajectory2.trajectoryStates().end() );
190  }
191 
192  return true;
193 }
194 
195 
197  const ReferenceTrajectory& traj2,
198  const MagneticField* field )
199 {
200  int iTsos = 0;
201 
202  std::vector< TrajectoryStateOnSurface >::const_iterator itTsos;
203 
204  for ( itTsos = traj1.trajectoryStates().begin(); itTsos != traj1.trajectoryStates().end(); itTsos++ )
205  {
206  constructSingleTsosWithErrors( *itTsos, iTsos, field );
207  iTsos++;
208  }
209 
210  for ( itTsos = traj2.trajectoryStates().begin(); itTsos != traj2.trajectoryStates().end(); itTsos++ )
211  {
212  constructSingleTsosWithErrors( *itTsos, iTsos, field );
213  iTsos++;
214  }
215 }
216 
217 
219  int iTsos,
220  const MagneticField* field )
221 {
222  AlgebraicSymMatrix55 localErrors;
223  const double coeff = 1e-2;
224 
225  double invP = tsos.localParameters().signedInverseMomentum();
227 
228  // rough estimate for the errors of q/p, dx/dz and dy/dz, assuming that
229  // sigma(px) = sigma(py) = sigma(pz) = coeff*p.
230  float dpinv = coeff*( fabs(p.x()) + fabs(p.y()) + fabs(p.z()) )*invP*invP;
231  float dxdir = coeff*( fabs(p.x()) + fabs(p.z()) )/p.z()/p.z();
232  float dydir = coeff*( fabs(p.y()) + fabs(p.z()) )/p.z()/p.z();
233  localErrors[0][0] = dpinv*dpinv;
234  localErrors[1][1] = dxdir*dxdir;
235  localErrors[2][2] = dydir*dydir;
236 
237  // exact values for the errors on local x and y
238  localErrors[3][3] = theTrajectoryPositionCov[nMeasPerHit*iTsos][nMeasPerHit*iTsos];
239  localErrors[3][4] = theTrajectoryPositionCov[nMeasPerHit*iTsos][nMeasPerHit*iTsos+1];
240  localErrors[4][4] = theTrajectoryPositionCov[nMeasPerHit*iTsos+1][nMeasPerHit*iTsos+1];
241 
242  // construct tsos with local errors
244  LocalTrajectoryError( localErrors ),
245  tsos.surface(),
246  field,
247  tsos.surfaceSide() );
248 }
unsigned int numberOfHits() const
const LocalTrajectoryParameters & localParameters() const
static const unsigned int nMeasPerHit
const AlgebraicVector & parameters(void) const
Get decay parameters.
void constructSingleTsosWithErrors(const TrajectoryStateOnSurface &tsos, int iTsos, const MagneticField *field)
unsigned int numberOfHitMeas() const
T y() const
Definition: PV3DBase.h:63
unsigned int numberOfVirtualPar() const
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
PropagationDirection
std::pair< ConstRecHitContainer, ConstRecHitContainer > ConstRecHitCollection
const TsosContainer & trajectoryStates(bool useRefittedState=true) const
const AlgebraicSymMatrix & measurementErrors() const
tuple field
Definition: statics.py:62
U second(std::pair< T, U > const &p)
AlgebraicSymMatrix theTrajectoryPositionCov
const AlgebraicMatrix & derivatives() const
const SurfaceType & surface() const
const Derivatives & derivatives(void) const
CLHEP::HepMatrix AlgebraicMatrix
bool construct(const TwoBodyDecayTrajectoryState &state, const ConstRecHitCollection &recHits, const MagneticField *field, MaterialEffects materialEffects, PropagationDirection propDir, const reco::BeamSpot &beamSpot, bool useRefittedState, bool constructTsosWithErrors)
SurfaceSide surfaceSide() const
Position relative to material, defined relative to momentum vector.
T z() const
Definition: PV3DBase.h:64
std::pair< TrajectoryStateOnSurface, TrajectoryStateOnSurface > TsosContainer
LocalVector momentum() const
Momentum vector in the local frame.
bool first
Definition: L1TdeRCT.cc:79
std::pair< int, int > theNumberOfRecHits
TransientTrackingRecHit::ConstRecHitContainer theRecHits
const AlgebraicMatrix & localToTrajectory() const
AlgebraicSymMatrix theMeasurementsCov
const TwoBodyDecayParameters & decayParameters(void) const
std::pair< AlgebraicMatrix, AlgebraicMatrix > Derivatives
unsigned int numberOfPar() const
void constructTsosVecWithErrors(const ReferenceTrajectory &traj1, const ReferenceTrajectory &traj2, const MagneticField *field)
const AlgebraicSymMatrix & covariance(void) const
Get error matrix.
unsigned int numberOfVirtualMeas() const
const AlgebraicVector & measurements() const
std::vector< TrajectoryStateOnSurface > theTsosVec
const AlgebraicVector & trajectoryPositions() const
uint32_t dimension(pat::CandKinResolution::Parametrization parametrization)
Returns the number of free parameters in a parametrization (3 or 4)
T x() const
Definition: PV3DBase.h:62
double signedInverseMomentum() const
Signed inverse momentum q/p (zero for neutrals).
tuple size
Write out results.
const std::vector< TrajectoryStateOnSurface > & trajectoryStates() const