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