CMS 3D CMS Logo

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,
20  0),
21  mass_(config.mass),
22  materialEffects_(config.materialEffects),
23  propDir_(config.propDir),
24  useBeamSpot_(config.useBeamSpot) {
25  theValidityFlag = this->construct(tsos, forwardRecHits, backwardRecHits, magField, beamSpot);
26 }
27 
29  unsigned int nHits,
32  mass_(config.mass),
33  materialEffects_(config.materialEffects),
34  propDir_(config.propDir),
35  useBeamSpot_(config.useBeamSpot) {}
36 
38  const ConstRecHitContainer& forwardRecHits,
39  const ConstRecHitContainer& backwardRecHits,
40  const MagneticField* magField,
41  const reco::BeamSpot& beamSpot) {
43  throw cms::Exception("BadConfig") << "[DualReferenceTrajectory::construct] Wrong MaterialEffects: "
45 
46  ReferenceTrajectoryBase* fwdTraj = construct(refTsos, forwardRecHits, magField, beamSpot);
47 
48  // set flag for opposite direction to true
49  ReferenceTrajectoryBase* bwdTraj = construct(refTsos, backwardRecHits, magField, beamSpot, true);
50 
51  if (!(fwdTraj->isValid() && bwdTraj->isValid())) {
52  delete fwdTraj;
53  delete bwdTraj;
54  return false;
55  }
56 
57  //
58  // Combine both reference trajactories to a dual reference trajectory
59  //
60 
61  const std::vector<TrajectoryStateOnSurface>& fwdTsosVec = fwdTraj->trajectoryStates();
62  const std::vector<TrajectoryStateOnSurface>& bwdTsosVec = bwdTraj->trajectoryStates();
63  theTsosVec.insert(theTsosVec.end(), fwdTsosVec.begin(), fwdTsosVec.end());
64  theTsosVec.insert(theTsosVec.end(), ++bwdTsosVec.begin(), bwdTsosVec.end());
65 
66  const ConstRecHitContainer& fwdRecHits = fwdTraj->recHits();
67  const ConstRecHitContainer& bwdRecHits = bwdTraj->recHits();
68  theRecHits.insert(theRecHits.end(), fwdRecHits.begin(), fwdRecHits.end());
69  theRecHits.insert(theRecHits.end(), ++bwdRecHits.begin(), bwdRecHits.end());
70 
72 
73  unsigned int nParam = theNumberOfPars;
74  unsigned int nFwdMeas = fwdTraj->numberOfHitMeas();
75  unsigned int nBwdMeas = bwdTraj->numberOfHitMeas();
76  unsigned int nFwdBP = fwdTraj->numberOfVirtualMeas();
77  unsigned int nBwdBP = bwdTraj->numberOfVirtualMeas();
78  unsigned int nMeas = nFwdMeas + nBwdMeas - nMeasPerHit;
79 
80  theMeasurements.sub(1, fwdTraj->measurements().sub(1, nFwdMeas));
81  theMeasurements.sub(nFwdMeas + 1, bwdTraj->measurements().sub(nMeasPerHit + 1, nBwdMeas));
82 
83  theMeasurementsCov.sub(1, fwdTraj->measurementErrors().sub(1, nFwdMeas));
84  theMeasurementsCov.sub(nFwdMeas + 1, bwdTraj->measurementErrors().sub(nMeasPerHit + 1, nBwdMeas));
85 
87  theTrajectoryPositions.sub(nFwdMeas + 1, bwdTraj->trajectoryPositions().sub(nMeasPerHit + 1, nBwdMeas));
88 
90  theTrajectoryPositionCov.sub(nFwdMeas + 1, bwdTraj->trajectoryPositionErrors().sub(nMeasPerHit + 1, nBwdMeas));
91 
92  theDerivatives.sub(1, 1, fwdTraj->derivatives().sub(1, nFwdMeas, 1, nParam));
93  theDerivatives.sub(nFwdMeas + 1, 1, bwdTraj->derivatives().sub(nMeasPerHit + 1, nBwdMeas, 1, nParam));
94 
95  // for the break points
96  // DUAL with break points makes no sense: (MS) correlations between the two parts are lost !
97  if (nFwdBP > 0) {
98  theMeasurements.sub(nMeas + 1, fwdTraj->measurements().sub(nFwdMeas + 1, nFwdMeas + nFwdBP));
99  theMeasurementsCov.sub(nMeas + 1, fwdTraj->measurementErrors().sub(nFwdMeas + 1, nFwdMeas + nFwdBP));
100  theDerivatives.sub(1, nParam + 1, fwdTraj->derivatives().sub(1, nFwdMeas, nParam + 1, nParam + nFwdBP));
101  theDerivatives.sub(nMeas + 1,
102  nParam + 1,
103  fwdTraj->derivatives().sub(nFwdMeas + 1, nFwdMeas + nFwdBP, nParam + 1, nParam + nFwdBP));
104  }
105  if (nBwdBP > 0) {
106  theMeasurements.sub(nMeas + nFwdBP + 1, bwdTraj->measurements().sub(nBwdMeas + 1, nBwdMeas + nBwdBP));
107  theMeasurementsCov.sub(nMeas + nFwdBP + 1, bwdTraj->measurementErrors().sub(nBwdMeas + 1, nBwdMeas + nBwdBP));
108  theDerivatives.sub(nFwdMeas + 1,
109  nParam + nFwdBP + 1,
110  bwdTraj->derivatives().sub(nMeasPerHit + 1, nBwdMeas, nParam + 1, nParam + nBwdBP));
111  theDerivatives.sub(nMeas + nFwdBP + 1,
112  nParam + nFwdBP + 1,
113  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 
124  const MagneticField* magField,
125  const reco::BeamSpot& beamSpot,
126  const bool revertDirection) const {
128  throw cms::Exception("BadConfig") << "[DualReferenceTrajectory::construct] Wrong MaterialEffects: "
129  << materialEffects_;
130 
132  materialEffects_, (revertDirection ? oppositeDirection(propDir_) : propDir_), mass_);
133  config.useBeamSpot = useBeamSpot_;
134  config.hitsAreReverse = false;
135  return new ReferenceTrajectory(referenceTsos, recHits, magField, beamSpot, config);
136 }
137 
139  return asHepVector<5>(referenceTsos.localParameters().mixedFormatVector());
140 }
const AlgebraicSymMatrix & measurementErrors() const
const PropagationDirection propDir_
const PropagationDirection oppositeDirection(const PropagationDirection propDir) const
unsigned int numberOfHitMeas() const
unsigned int numberOfVirtualMeas() const
dictionary config
Read in AllInOne config in JSON format.
Definition: DMR_cfg.py:21
const AlgebraicVector & measurements() const
const LocalTrajectoryParameters & localParameters() const
DualReferenceTrajectory(const TrajectoryStateOnSurface &tsos, const ConstRecHitContainer &forwardRecHits, const ConstRecHitContainer &backwardRecHits, const MagneticField *magField, const reco::BeamSpot &beamSpot, const ReferenceTrajectoryBase::Config &config)
Definition: config.py:1
const std::vector< TrajectoryStateOnSurface > & trajectoryStates() const
AlgebraicSymMatrix theTrajectoryPositionCov
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
virtual AlgebraicVector extractParameters(const TrajectoryStateOnSurface &referenceTsos) const
const AlgebraicVector & trajectoryPositions() const
TransientTrackingRecHit::ConstRecHitContainer theRecHits
AlgebraicSymMatrix theMeasurementsCov
CLHEP::HepVector AlgebraicVector
AlgebraicVector5 mixedFormatVector() const
static constexpr unsigned int nMeasPerHit
const AlgebraicSymMatrix & trajectoryPositionErrors() 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 TransientTrackingRecHit::ConstRecHitContainer & recHits() const
TupleMultiplicity< TrackerTraits > const *__restrict__ uint32_t nHits
const MaterialEffects materialEffects_
const AlgebraicMatrix & derivatives() const