test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DualReferenceTrajectory.cc
Go to the documentation of this file.
1 
3 
5 
8 
10 
12  const ConstRecHitContainer& forwardRecHits,
13  const ConstRecHitContainer& backwardRecHits,
14  const MagneticField* magField,
15  const reco::BeamSpot& beamSpot,
17  ReferenceTrajectoryBase(tsos.localParameters().mixedFormatVector().kSize,
18  numberOfUsedRecHits(forwardRecHits) + numberOfUsedRecHits(backwardRecHits) - 1,
19  0, 0),
20  mass_(config.mass),
21  materialEffects_(config.materialEffects),
22  propDir_(config.propDir),
23  useBeamSpot_(config.useBeamSpot)
24 {
25  theValidityFlag = this->construct(tsos, forwardRecHits, backwardRecHits, magField, beamSpot);
26 }
27 
28 
29 
30 DualReferenceTrajectory::DualReferenceTrajectory(unsigned int nPar, unsigned int nHits,
32  : ReferenceTrajectoryBase(nPar, nHits, 0, 0),
33  mass_(config.mass),
34  materialEffects_(config.materialEffects),
35  propDir_(config.propDir),
36  useBeamSpot_(config.useBeamSpot)
37 {}
38 
39 
41  const ConstRecHitContainer &forwardRecHits,
42  const ConstRecHitContainer &backwardRecHits,
43  const MagneticField *magField,
44  const reco::BeamSpot &beamSpot)
45 {
46  if (materialEffects_ >= breakPoints) throw cms::Exception("BadConfig")
47  << "[DualReferenceTrajectory::construct] Wrong MaterialEffects: " << materialEffects_;
48 
49  ReferenceTrajectoryBase* fwdTraj = construct(refTsos, forwardRecHits, magField, beamSpot);
50 
51  // set flag for opposite direction to true
52  ReferenceTrajectoryBase* bwdTraj = construct(refTsos, backwardRecHits, magField, beamSpot, true);
53 
54  if ( !( fwdTraj->isValid() && bwdTraj->isValid() ) )
55  {
56  delete fwdTraj;
57  delete bwdTraj;
58  return false;
59  }
60 
61  //
62  // Combine both reference trajactories to a dual reference trajectory
63  //
64 
65  const std::vector<TrajectoryStateOnSurface>& fwdTsosVec = fwdTraj->trajectoryStates();
66  const std::vector<TrajectoryStateOnSurface>& bwdTsosVec = bwdTraj->trajectoryStates();
67  theTsosVec.insert( theTsosVec.end(), fwdTsosVec.begin(), fwdTsosVec.end() );
68  theTsosVec.insert( theTsosVec.end(), ++bwdTsosVec.begin(), bwdTsosVec.end() );
69 
70  const ConstRecHitContainer &fwdRecHits = fwdTraj->recHits();
71  const ConstRecHitContainer &bwdRecHits = bwdTraj->recHits();
72  theRecHits.insert( theRecHits.end(), fwdRecHits.begin(), fwdRecHits.end() );
73  theRecHits.insert( theRecHits.end(), ++bwdRecHits.begin(), bwdRecHits.end() );
74 
75  theParameters = extractParameters( refTsos );
76 
77  unsigned int nParam = theNumberOfPars;
78  unsigned int nFwdMeas = fwdTraj->numberOfHitMeas();
79  unsigned int nBwdMeas = bwdTraj->numberOfHitMeas();
80  unsigned int nFwdBP = fwdTraj->numberOfVirtualMeas();
81  unsigned int nBwdBP = bwdTraj->numberOfVirtualMeas();
82  unsigned int nMeas = nFwdMeas+nBwdMeas-nMeasPerHit;
83 
84  theMeasurements.sub( 1, fwdTraj->measurements().sub( 1, nFwdMeas ) );
85  theMeasurements.sub( nFwdMeas+1, bwdTraj->measurements().sub( nMeasPerHit+1, nBwdMeas ) );
86 
87  theMeasurementsCov.sub( 1, fwdTraj->measurementErrors().sub( 1, nFwdMeas ) );
88  theMeasurementsCov.sub( nFwdMeas+1, bwdTraj->measurementErrors().sub( nMeasPerHit+1, nBwdMeas ) );
89 
90  theTrajectoryPositions.sub( 1, fwdTraj->trajectoryPositions() );
91  theTrajectoryPositions.sub( nFwdMeas+1, bwdTraj->trajectoryPositions().sub( nMeasPerHit+1, nBwdMeas ) );
92 
94  theTrajectoryPositionCov.sub( nFwdMeas+1, bwdTraj->trajectoryPositionErrors().sub( nMeasPerHit+1, nBwdMeas ) );
95 
96  theDerivatives.sub( 1, 1, fwdTraj->derivatives().sub( 1, nFwdMeas, 1, nParam ) );
97  theDerivatives.sub( nFwdMeas+1, 1, bwdTraj->derivatives().sub( nMeasPerHit+1, nBwdMeas, 1, nParam ) );
98 
99 // for the break points
100 // DUAL with break points makes no sense: (MS) correlations between the two parts are lost !
101  if (nFwdBP>0 )
102  {
103  theMeasurements.sub( nMeas+1, fwdTraj->measurements().sub( nFwdMeas+1, nFwdMeas+nFwdBP ) );
104  theMeasurementsCov.sub( nMeas+1, fwdTraj->measurementErrors().sub( nFwdMeas+1, nFwdMeas+nFwdBP ) );
105  theDerivatives.sub( 1, nParam+1, fwdTraj->derivatives().sub( 1, nFwdMeas, nParam+1, nParam+nFwdBP ) );
106  theDerivatives.sub( nMeas+1, nParam+1, fwdTraj->derivatives().sub( nFwdMeas+1, nFwdMeas+nFwdBP, nParam+1, nParam+nFwdBP ) );
107  }
108  if (nBwdBP>0 )
109  {
110  theMeasurements.sub( nMeas+nFwdBP+1, bwdTraj->measurements().sub( nBwdMeas+1, nBwdMeas+nBwdBP ) );
111  theMeasurementsCov.sub( nMeas+nFwdBP+1, bwdTraj->measurementErrors().sub( nBwdMeas+1, nBwdMeas+nBwdBP ) );
112  theDerivatives.sub( nFwdMeas+1, nParam+nFwdBP+1, bwdTraj->derivatives().sub( nMeasPerHit+1, nBwdMeas, nParam+1, nParam+nBwdBP ) );
113  theDerivatives.sub( nMeas+nFwdBP+1, nParam+nFwdBP+1, bwdTraj->derivatives().sub( nBwdMeas+1, nBwdMeas+nBwdBP, nParam+1, nParam+nBwdBP ) );
114  }
115 
116  delete fwdTraj;
117  delete bwdTraj;
118 
119  return true;
120 }
121 
122 
126  const MagneticField *magField,
127  const reco::BeamSpot &beamSpot,
128  const bool revertDirection) const
129 {
130  if (materialEffects_ >= breakPoints) throw cms::Exception("BadConfig")
131  << "[DualReferenceTrajectory::construct] Wrong MaterialEffects: " << materialEffects_;
132 
134  (revertDirection ? oppositeDirection(propDir_): propDir_),
135  mass_);
136  config.useBeamSpot = useBeamSpot_;
137  config.hitsAreReverse = false;
138  return new ReferenceTrajectory(referenceTsos, recHits, magField, beamSpot, config);
139 }
140 
141 
144 {
145  return asHepVector<5>( referenceTsos.localParameters().mixedFormatVector() );
146 }
const LocalTrajectoryParameters & localParameters() const
const PropagationDirection propDir_
static const unsigned int nMeasPerHit
unsigned int numberOfHitMeas() const
const TransientTrackingRecHit::ConstRecHitContainer & recHits() const
const PropagationDirection oppositeDirection(const PropagationDirection propDir) const
DualReferenceTrajectory(const TrajectoryStateOnSurface &tsos, const ConstRecHitContainer &forwardRecHits, const ConstRecHitContainer &backwardRecHits, const MagneticField *magField, const reco::BeamSpot &beamSpot, const ReferenceTrajectoryBase::Config &config)
const AlgebraicSymMatrix & measurementErrors() const
const AlgebraicSymMatrix & trajectoryPositionErrors() const
AlgebraicSymMatrix theTrajectoryPositionCov
const AlgebraicMatrix & derivatives() const
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
virtual AlgebraicVector extractParameters(const TrajectoryStateOnSurface &referenceTsos) const
TransientTrackingRecHit::ConstRecHitContainer theRecHits
AlgebraicSymMatrix theMeasurementsCov
CLHEP::HepVector AlgebraicVector
AlgebraicVector5 mixedFormatVector() const
unsigned int numberOfVirtualMeas() const
const AlgebraicVector & measurements() const
std::vector< TrajectoryStateOnSurface > theTsosVec
virtual bool construct(const TrajectoryStateOnSurface &referenceTsos, const ConstRecHitContainer &forwardRecHits, const ConstRecHitContainer &backwardRecHits, const MagneticField *magField, const reco::BeamSpot &beamSpot)
const AlgebraicVector & trajectoryPositions() const
const MaterialEffects materialEffects_
const std::vector< TrajectoryStateOnSurface > & trajectoryStates() const