CMS 3D CMS Logo

RKPropagatorInS.cc
Go to the documentation of this file.
2 #include "RKCartesianDistance.h"
4 #include "RKLocalFieldProvider.h"
7 #include "RKAdaptiveSolver.h"
8 #include "RKOne4OrderStep.h"
9 #include "RKOneCashKarpStep.h"
10 #include "PathToPlane2Order.h"
11 #include "CartesianStateAdaptor.h"
16 #include "FrameChanger.h"
21 
24 
25 std::pair<TrajectoryStateOnSurface, double> RKPropagatorInS::propagateWithPath(const FreeTrajectoryState& fts,
26  const Plane& plane) const {
28  if
30 
35  return analyticalErrorPropagation(fts, plane, side, gp.parameters(), gp.s());
36 }
37 
38 std::pair<TrajectoryStateOnSurface, double> RKPropagatorInS::propagateWithPath(const FreeTrajectoryState& fts,
39  const Cylinder& cyl) const {
41  if
43 
48  return analyticalErrorPropagation(fts, cyl, side, gp.parameters(), gp.s());
49 }
50 
52  const Plane& plane) const {
53  GlobalPoint gpos(ts.position());
54  GlobalVector gmom(ts.momentum());
55  double startZ = plane.localZ(gpos);
56  // (transverse) curvature
57  double rho = ts.transverseCurvature();
58  //
59  // Straight line approximation? |rho|<1.e-10 equivalent to ~ 1um
60  // difference in transversal position at 10m.
61  //
62  if
63  UNLIKELY(fabs(rho) < 1.e-10) {
64  //
65  // Instantiate auxiliary object for finding intersection.
66  // Frame-independant point and vector are created explicitely to
67  // avoid confusing gcc (refuses to compile with temporary objects
68  // in the constructor).
69  //
70  LogDebug("RKPropagatorInS") << " startZ = " << startZ;
71 
72  if
73  UNLIKELY(fabs(startZ) < 1e-5) {
74  LogDebug("RKPropagatorInS") << "Propagation is not performed: state is already on final surface.";
76  return GlobalParametersWithPath(res, 0.0);
77  }
78 
82  //
83  // get solution
84  //
85  std::pair<bool, double> propResult = planeCrossing.pathLength(plane);
86  if
87  LIKELY(propResult.first && theVolume != nullptr) {
88  double s = propResult.second;
89  // point (reconverted to GlobalPoint)
90  GlobalPoint x(planeCrossing.position(s));
93  }
94  //do someting
95  LogDebug("RKPropagatorInS") << "Straight line propgation to plane failed !!";
96  return GlobalParametersWithPath();
97  }
98 
99 #ifdef EDM_ML_DEBUG
100  if (theVolume != 0) {
101  LogDebug("RKPropagatorInS") << "RKPropagatorInS: starting prop to plane in volume with pos "
102  << theVolume->position() << " Z axis " << theVolume->toGlobal(LocalVector(0, 0, 1));
103 
104  LogDebug("RKPropagatorInS") << "The starting position is " << ts.position() << " (global) "
105  << theVolume->toLocal(ts.position()) << " (local) ";
106 
107  FrameChanger changer;
108  auto localPlane = changer.transformPlane(plane, *theVolume);
109  LogDebug("RKPropagatorInS") << "The plane position is " << plane.position() << " (global) " << localPlane.position()
110  << " (local) ";
111 
112  LogDebug("RKPropagatorInS") << "The initial distance to plane is " << plane.localZ(ts.position());
113 
115  std::pair<bool, double> res3 = cross.pathLength(plane);
116  LogDebug("RKPropagatorInS") << "straight line distance " << res3.first << " " << res3.second;
117  }
118 #endif
119 
121  typedef Solver::Vector RKVector;
122 
124  PathToPlane2Order pathLength(field, &field.frame());
125  CartesianLorentzForce deriv(field, ts.charge());
126 
127  RKCartesianDistance dist;
128  double eps = theTolerance;
129  Solver solver;
130  double stot = 0;
131  PropagationDirection currentDirection = propagationDirection();
132 
133  // in magVolume frame
135  int safeGuard = 0;
136  while (safeGuard++ < 100) {
137  CartesianStateAdaptor startState(start);
138 
139  std::pair<bool, double> path =
140  pathLength(plane, startState.position(), startState.momentum(), (double)ts.charge(), currentDirection);
141  if
142  UNLIKELY(!path.first) {
143  LogDebug("RKPropagatorInS") << "RKPropagatorInS: Path length calculation to plane failed!"
144  << "...distance to plane " << plane.localZ(globalPosition(startState.position()))
145  << "...Local starting position in volume " << startState.position()
146  << "...Magnetic field " << field.inTesla(startState.position());
147 
148  return GlobalParametersWithPath();
149  }
150 
151  LogDebug("RKPropagatorInS") << "RKPropagatorInS: Path lenght to plane is " << path.second;
152 
153  double sstep = path.second;
154  if
155  UNLIKELY(std::abs(sstep) < eps) {
156  LogDebug("RKPropagatorInS") << "On-surface accuracy not reached, but pathLength calculation says we are there! "
157  << "path " << path.second << " distance to plane is " << startZ;
159  return GlobalParametersWithPath(res, stot);
160  }
161 
162  LogDebug("RKPropagatorInS") << "RKPropagatorInS: Solving for " << sstep << " current distance to plane is "
163  << startZ;
164 
165  RKVector rkresult = solver(0, start, sstep, deriv, dist, eps);
166  stot += sstep;
167  CartesianStateAdaptor cur(rkresult);
168  double remainingZ = plane.localZ(globalPosition(cur.position()));
169 
170  if (fabs(remainingZ) < eps) {
171  LogDebug("RKPropagatorInS") << "On-surface accuracy reached! " << remainingZ;
173  return GlobalParametersWithPath(res, stot);
174  }
175 
176  start = rkresult;
177 
178  if (remainingZ * startZ > 0) {
179  LogDebug("RKPropagatorInS") << "Accuracy not reached yet, trying in same direction again " << remainingZ;
180  } else {
181  LogDebug("RKPropagatorInS") << "Accuracy not reached yet, trying in opposite direction " << remainingZ;
182  currentDirection = invertDirection(currentDirection);
183  }
184  startZ = remainingZ;
185  }
186 
187  edm::LogError("FailedPropagation") << " too many iterations trying to reach plane ";
188  return GlobalParametersWithPath();
189 }
190 
192  const Cylinder& cyl) const {
194  typedef Solver::Vector RKVector;
195 
196  const GlobalPoint& sp = cyl.position();
197  if
198  UNLIKELY(sp.x() != 0. || sp.y() != 0.) { throw PropagationException("Cannot propagate to an arbitrary cylinder"); }
199 
200  GlobalPoint gpos(ts.position());
201  GlobalVector gmom(ts.momentum());
202  LocalPoint pos(cyl.toLocal(gpos));
203  LocalVector mom(cyl.toLocal(gmom));
204  double startR = cyl.radius() - pos.perp();
205 
206  // LogDebug("RKPropagatorInS") << "RKPropagatorInS: starting from FTS " << ts ;
207 
208  // (transverse) curvature
209  double rho = ts.transverseCurvature();
210  //
211  // Straight line approximation? |rho|<1.e-10 equivalent to ~ 1um
212  // difference in transversal position at 10m.
213  //
214  if
215  UNLIKELY(fabs(rho) < 1.e-10) {
216  //
217  // Instantiate auxiliary object for finding intersection.
218  // Frame-independant point and vector are created explicitely to
219  // avoid confusing gcc (refuses to compile with temporary objects
220  // in the constructor).
221  //
222 
223  StraightLineBarrelCylinderCrossing cylCrossing(gpos, gmom, propagationDirection());
224 
225  //
226  // get solution
227  //
228  std::pair<bool, double> propResult = cylCrossing.pathLength(cyl);
229  if
230  LIKELY(propResult.first && theVolume != nullptr) {
231  double s = propResult.second;
232  // point (reconverted to GlobalPoint)
233  GlobalPoint x(cylCrossing.position(s));
235  LogDebug("RKPropagatorInS") << "Straight line propagation to cylinder succeeded !!";
236  return GlobalParametersWithPath(res, s);
237  }
238 
239  //do someting
240  edm::LogError("RKPropagatorInS") << "Straight line propagation to cylinder failed !!";
241  return GlobalParametersWithPath();
242  }
243 
245  // StraightLineCylinderCrossing pathLength( pos, mom, propagationDirection());
246  CartesianLorentzForce deriv(field, ts.charge());
247 
248  RKCartesianDistance dist;
249  double eps = theTolerance;
250  Solver solver;
251  double stot = 0;
252  PropagationDirection currentDirection = propagationDirection();
253 
254  RKVector start(CartesianStateAdaptor::rkstate(pos.basicVector(), mom.basicVector()));
255  int safeGuard = 0;
256  while (safeGuard++ < 100) {
257  CartesianStateAdaptor startState(start);
258  StraightLineCylinderCrossing pathLength(
259  LocalPoint(startState.position()), LocalVector(startState.momentum()), currentDirection, eps);
260 
261  std::pair<bool, double> path = pathLength.pathLength(cyl);
262  if
263  UNLIKELY(!path.first) {
264  LogDebug("RKPropagatorInS") << "RKPropagatorInS: Path length calculation to cylinder failed!"
265  << "Radius " << cyl.radius() << " pos.perp() "
266  << LocalPoint(startState.position()).perp();
267  return GlobalParametersWithPath();
268  }
269 
270  LogDebug("RKPropagatorInS") << "RKPropagatorInS: Path lenght to cylinder is " << path.second << " from point (R,z) "
271  << startState.position().perp() << ", " << startState.position().z() << " to R "
272  << cyl.radius();
273 
274  double sstep = path.second;
275  if
276  UNLIKELY(std::abs(sstep) < eps) {
277  LogDebug("RKPropagatorInS") << "accuracy not reached, but pathLength calculation says we are there! "
278  << path.second;
279 
280  GlobalTrajectoryParameters res(gtpFromLocal(startState.position(), startState.momentum(), ts.charge(), cyl));
281  return GlobalParametersWithPath(res, stot);
282  }
283 
284  LogDebug("RKPropagatorInS") << "RKPropagatorInS: Solving for " << sstep << " current distance to cylinder is "
285  << startR;
286 
287  RKVector rkresult = solver(0, start, sstep, deriv, dist, eps);
288  stot += sstep;
289  CartesianStateAdaptor cur(rkresult);
290  double remainingR = cyl.radius() - cur.position().perp();
291 
292  if (fabs(remainingR) < eps) {
293  LogDebug("RKPropagatorInS") << "Accuracy reached! " << remainingR;
295  return GlobalParametersWithPath(res, stot);
296  }
297 
298  start = rkresult;
299  if (remainingR * startR > 0) {
300  LogDebug("RKPropagatorInS") << "Accuracy not reached yet, trying in same direction again " << remainingR;
301  } else {
302  LogDebug("RKPropagatorInS") << "Accuracy not reached yet, trying in opposite direction " << remainingR;
303  currentDirection = invertDirection(currentDirection);
304  }
305  startR = remainingR;
306  }
307 
308  edm::LogError("FailedPropagation") << " too many iterations trying to reach cylinder ";
309  return GlobalParametersWithPath();
310 }
311 
312 Propagator* RKPropagatorInS::clone() const { return new RKPropagatorInS(*this); }
313 
315  const Basic3DVector<float>& lmom,
316  TrackCharge ch,
317  const Surface& surf) const {
318  return GlobalTrajectoryParameters(surf.toGlobal(LocalPoint(lpos)), surf.toGlobal(LocalVector(lmom)), ch, theVolume);
319 }
320 
322 
324  return RKLocalFieldProvider(*theVolume, cyl);
325 }
326 
328  if (dir == anyDirection)
329  return dir;
331 }
332 
334  if (theVolume != nullptr)
335  return theVolume->toLocal(pos).basicVector();
336  else
337  return pos.basicVector();
338 }
339 
341  if (theVolume != nullptr)
342  return theVolume->toLocal(mom).basicVector();
343  else
344  return mom.basicVector();
345 }
346 
348  if (theVolume != nullptr)
349  return theVolume->toGlobal(LocalPoint(pos));
350  else
351  return GlobalPoint(pos);
352 }
353 
355 
356 {
357  if (theVolume != nullptr)
358  return theVolume->toGlobal(LocalVector(mom));
359  else
360  return GlobalVector(mom);
361 }
362 
364  TrackCharge charge) const {
367 }
StraightLineCylinderCrossing.h
Vector3DBase
Definition: Vector3DBase.h:8
MagVolume.h
Likely.h
FreeTrajectoryState::momentum
GlobalVector momentum() const
Definition: FreeTrajectoryState.h:68
RKPropagatorInS::rkMomentum
Basic3DVector< double > rkMomentum(const GlobalVector &mom) const
Definition: RKPropagatorInS.cc:340
anyDirection
Definition: PropagationDirection.h:4
start
Definition: start.py:1
MessageLogger.h
Cylinder.h
Cylinder::radius
Scalar radius() const
Radius of the cylinder.
Definition: Cylinder.h:64
TrackCharge
int TrackCharge
Definition: TrackCharge.h:4
RKPropagatorInS::globalMomentum
GlobalVector globalMomentum(const Basic3DVector< float > &mom) const
Definition: RKPropagatorInS.cc:354
RKPropagatorInS::propagateWithPath
std::pair< TrajectoryStateOnSurface, double > propagateWithPath(const FreeTrajectoryState &, const Plane &) const override
Definition: RKPropagatorInS.cc:25
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
RKOne4OrderStep.h
PropagationException
Common base class.
Definition: PropagationExceptions.h:14
PropagationDirectionFromPath
Definition: PropagationDirectionFromPath.h:8
RKPropagatorInS::propagateParametersOnPlane
GlobalParametersWithPath propagateParametersOnPlane(const FreeTrajectoryState &ts, const Plane &plane) const
Definition: RKPropagatorInS.cc:51
pos
Definition: PixelAliasList.h:18
FreeTrajectoryState::charge
TrackCharge charge() const
Definition: FreeTrajectoryState.h:69
RKPropagatorInS::theTolerance
double theTolerance
Definition: RKPropagatorInS.h:49
oppositeToMomentum
Definition: PropagationDirection.h:4
RKLocalFieldProvider::inTesla
Vector inTesla(const LocalPoint &lp) const
the argument lp is in the local frame specified in the constructor
Definition: RKLocalFieldProvider.cc:11
Surface
Definition: Surface.h:36
SurfaceSideDefinition::SurfaceSide
SurfaceSide
Definition: SurfaceSideDefinition.h:8
RKAdaptiveSolver
Definition: RKAdaptiveSolver.h:11
SurfaceSideDefinition::afterSurface
Definition: SurfaceSideDefinition.h:8
DDAxes::x
FreeTrajectoryState::position
GlobalPoint position() const
Definition: FreeTrajectoryState.h:67
align::LocalPoint
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
GlobalVector
Global3DVector GlobalVector
Definition: GlobalVector.h:10
RKPropagatorInS.h
CartesianStateAdaptor.h
perp
T perp() const
Magnitude of transverse component.
Definition: Basic3DVectorLD.h:133
RKPropagatorInS::fieldProvider
RKLocalFieldProvider fieldProvider() const
Definition: RKPropagatorInS.cc:321
analyticalErrorPropagation
std::pair< TrajectoryStateOnSurface, double > analyticalErrorPropagation(const FreeTrajectoryState &startingState, const Surface &surface, SurfaceSideDefinition::SurfaceSide side, const GlobalTrajectoryParameters &destParameters, const double &s)
Definition: AnalyticalErrorPropagation.h:14
Vector
ROOT::Math::Plane3D::Vector Vector
Definition: EcalHitMaker.cc:29
RKLocalFieldProvider
Definition: RKLocalFieldProvider.h:10
RKPropagatorInS::gtpFromLocal
GlobalTrajectoryParameters gtpFromLocal(const Basic3DVector< float > &lpos, const Basic3DVector< float > &lmom, TrackCharge ch, const Surface &surf) const
Definition: RKPropagatorInS.cc:314
Propagator
Definition: Propagator.h:44
Plane.h
UNLIKELY
#define UNLIKELY(x)
Definition: Likely.h:21
TrajectoryStateOnSurface
Definition: TrajectoryStateOnSurface.h:16
alignCSCRings.s
s
Definition: alignCSCRings.py:92
StraightLineCylinderCrossing::pathLength
std::pair< bool, double > pathLength(const Cylinder &cyl) const
Definition: StraightLineCylinderCrossing.cc:16
CartesianLorentzForce.h
RKLocalFieldProvider.h
FrameChanger.h
PathToPlane2Order.h
RKPropagatorInS::TsosWP
std::pair< TrajectoryStateOnSurface, double > TsosWP
Definition: RKPropagatorInS.h:46
SurfaceSideDefinition::beforeSurface
Definition: SurfaceSideDefinition.h:8
Propagator::propagationDirection
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
Surface::toGlobal
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:79
GlobalParametersWithPath
Definition: GlobalParametersWithPath.h:7
RKPropagatorInS::clone
Propagator * clone() const override
Definition: RKPropagatorInS.cc:312
GlobalTrajectoryParameters
Definition: GlobalTrajectoryParameters.h:15
GlobalPoint
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
Point3DBase< float, GlobalTag >
FrameChanger
Definition: FrameChanger.h:8
DDAxes::rho
RKPropagatorInS::propagateParametersOnCylinder
GlobalParametersWithPath propagateParametersOnCylinder(const FreeTrajectoryState &ts, const Cylinder &cyl) const
Definition: RKPropagatorInS.cc:191
StraightLinePlaneCrossing.h
RKCartesianDistance
Estimator of the distance between two state vectors, e.g. for convergence test.
Definition: RKCartesianDistance.h:14
StraightLineBarrelCylinderCrossing::position
GlobalPoint position(const double s) const
Definition: StraightLineBarrelCylinderCrossing.h:36
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
runTauDisplay.gp
gp
Definition: runTauDisplay.py:431
FrameChanger::transformPlane
static Plane transformPlane(const Plane &plane, const GloballyPositioned< T > &frame)
Definition: FrameChanger.h:14
CartesianStateAdaptor::position
const Vector3D & position() const
Definition: CartesianStateAdaptor.h:15
cross
Basic3DVector cross(const Basic3DVector &v) const
Vector product, or "cross" product, with a vector of same type.
Definition: Basic3DVectorLD.h:225
CartesianLorentzForce
Derivative calculation for the 6D cartesian case.
Definition: CartesianLorentzForce.h:10
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
edm::LogError
Definition: MessageLogger.h:183
CartesianStateAdaptor::rkstate
static RKSmallVector< double, 6 > rkstate(const Vector3D &pos, const Vector3D &mom)
Definition: CartesianStateAdaptor.h:22
StraightLineBarrelCylinderCrossing.h
StraightLineCylinderCrossing
Definition: StraightLineCylinderCrossing.h:17
Plane::localZ
float localZ(const GlobalPoint &gp) const
Definition: Plane.h:45
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
LocalVector
Local3DVector LocalVector
Definition: LocalVector.h:12
RKPropagatorInS::invertDirection
PropagationDirection invertDirection(PropagationDirection dir) const
Definition: RKPropagatorInS.cc:327
RKCartesianDistance.h
res
Definition: Electron.h:6
RKPropagatorInS::rkPosition
Basic3DVector< double > rkPosition(const GlobalPoint &pos) const
Definition: RKPropagatorInS.cc:333
CartesianStateAdaptor
Definition: CartesianStateAdaptor.h:8
PV3DBase::basicVector
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:53
GloballyPositioned::position
const PositionType & position() const
Definition: GloballyPositioned.h:36
StraightLineBarrelCylinderCrossing::pathLength
std::pair< bool, double > pathLength(const Cylinder &cyl) const
Definition: StraightLineBarrelCylinderCrossing.cc:12
GlobalParametersWithPath.h
CartesianStateAdaptor::momentum
const Vector3D & momentum() const
Definition: CartesianStateAdaptor.h:16
FreeTrajectoryState
Definition: FreeTrajectoryState.h:27
LIKELY
#define LIKELY(x)
Definition: Likely.h:20
GloballyPositioned::toLocal
LocalPoint toLocal(const GlobalPoint &gp) const
Definition: GloballyPositioned.h:98
PropagationDirection
PropagationDirection
Definition: PropagationDirection.h:4
RKPropagatorInS::RKPropagatorInS
RKPropagatorInS(const MagVolume &vol, PropagationDirection dir=alongMomentum, double tolerance=5.e-5)
Definition: RKPropagatorInS.h:25
Plane
Definition: Plane.h:16
PathToPlane2Order
Definition: PathToPlane2Order.h:21
RKAdaptiveSolver.h
PropagationDirectionFromPath.h
RKPropagatorInS::gtpFromVolumeLocal
GlobalTrajectoryParameters gtpFromVolumeLocal(const CartesianStateAdaptor &state, TrackCharge charge) const
Definition: RKPropagatorInS.cc:363
Cylinder
Definition: Cylinder.h:19
StraightLinePlaneCrossing::position
PositionType position(float s) const
Definition: StraightLinePlaneCrossing.h:42
RKOneCashKarpStep.h
AnalyticalErrorPropagation.h
castor_dqm_sourceclient_file_cfg.path
path
Definition: castor_dqm_sourceclient_file_cfg.py:37
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
RKLocalFieldProvider::frame
const Frame & frame() const
The reference frame in which the field is defined.
Definition: RKLocalFieldProvider.h:35
Basic3DVector::perp
T perp() const
Magnitude of transverse component.
Definition: extBasic3DVector.h:122
command_line.start
start
Definition: command_line.py:167
RKPropagatorInS::globalPosition
GlobalPoint globalPosition(const Basic3DVector< float > &pos) const
Definition: RKPropagatorInS.cc:347
StraightLinePlaneCrossing::pathLength
std::pair< bool, double > pathLength(const Plane &plane) const
Definition: StraightLinePlaneCrossing.cc:8
PropagationExceptions.h
StraightLinePlaneCrossing
Definition: StraightLinePlaneCrossing.h:14
StraightLineBarrelCylinderCrossing
Definition: StraightLineBarrelCylinderCrossing.h:17
Basic3DVector::z
T z() const
Cartesian z coordinate.
Definition: extBasic3DVector.h:100
alongMomentum
Definition: PropagationDirection.h:4
FreeTrajectoryState::transverseCurvature
double transverseCurvature() const
Definition: FreeTrajectoryState.h:71
Basic3DVector< float >
GloballyPositioned::toGlobal
GlobalPoint toGlobal(const LocalPoint &lp) const
Definition: GloballyPositioned.h:66
DeadROC_duringRun.dir
dir
Definition: DeadROC_duringRun.py:23
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
RKPropagatorInS::theVolume
const MagVolume * theVolume
Definition: RKPropagatorInS.h:48