CMS 3D CMS Logo

AnalyticalTrajectoryExtrapolatorToLine.cc
Go to the documentation of this file.
2 
8 
11 
12 #include <cmath>
13 
14 
16  thePropagator(new AnalyticalPropagator(field, anyDirection)) {}
17 
19 (const Propagator& propagator) : thePropagator(propagator.clone())
20 {
22 }
23 
26  const Line& line) const
27 {
28  return extrapolateSingleState(fts,line);
29 }
30 
33  const Line& line) const
34 {
35  if ( tsos.isValid() ) return extrapolateFullState(tsos,line);
36  else return tsos;
37 }
38 
41  const Line& line) const
42 {
43  //
44  // first determine IP plane using propagation with (single) FTS
45  // could be optimised (will propagate errors even if duplicated below)
46  //
47  TrajectoryStateOnSurface singleState =
49  if ( !singleState.isValid() || tsos.singleState() ) return singleState;
50  //
51  // propagate multiTsos to plane found above
52  //
53  return thePropagator->propagate(tsos,singleState.surface());
54 }
55 
58  const Line& line) const
59 {
60 // static TimingReport::Item& timer = detailedDetTimer("AnalyticalTrajectoryExtrapolatorToLine");
61 // TimeMe t(timer,false);
62  //
63  // initialisation of position, momentum and transverse curvature
64  //
65  GlobalPoint x(fts.position());
66  GlobalVector p(fts.momentum());
67  double rho = fts.transverseCurvature();
68  //
69  // Straight line approximation? |rho|<1.e-10 equivalent to ~ 1um
70  // difference in transversal position at 10m.
71  //
72  double s(0);
73  if( fabs(rho)<1.e-10 ) {
74  Line tangent(x,p);
75  GlobalPoint xold(x);
76  x = tangent.closerPointToLine(line);
77  GlobalVector dx(x-xold);
78  float sign = p.dot(x-xold);
79  s = sign>0 ? dx.mag() : -dx.mag();
80  }
81  //
82  // Helix case
83  //
84  else {
87  IterativeHelixExtrapolatorToLine extrapolator(helixPos,helixDir,rho,anyDirection);
88  if ( !propagateWithHelix(extrapolator,line,x,p,s) ) return TrajectoryStateOnSurface();
89  }
90  //
91  // Define target surface: origin on line, x_local from line
92  // to helix at closest approach, z_local along the helix
93  // and y_local to complete right-handed system
94  //
95  GlobalPoint origin(line.closerPointToLine(Line(x,p)));
96  GlobalVector zLocal(p.unit());
97  GlobalVector yLocal(zLocal.cross(x-origin).unit());
98  GlobalVector xLocal(yLocal.cross(zLocal));
99  Surface::RotationType rot(xLocal,yLocal,zLocal);
100  PlaneBuilder::ReturnType surface = PlaneBuilder().plane(origin,rot);
101  //
102  // Compute propagated state
103  //
105  if (fts.hasError()) {
106  //
107  // compute jacobian
108  //
109  AnalyticalCurvilinearJacobian analyticalJacobian(fts.parameters(), gtp.position(), gtp.momentum(), s);
110  const AlgebraicMatrix55 &jacobian = analyticalJacobian.jacobian();
111  CurvilinearTrajectoryError cte( ROOT::Math::Similarity (jacobian, fts.curvilinearError().matrix()) );
112  return TrajectoryStateOnSurface(gtp,cte,*surface);
113  }
114  else {
115  //
116  // return state without errors
117  //
118  return TrajectoryStateOnSurface(gtp,*surface);
119  }
120 }
121 
122 bool
124  const Line& line,
125  GlobalPoint& x, GlobalVector& p, double& s) const {
126  //
127  // save absolute value of momentum
128  //
129  double pmag(p.mag());
130  //
131  // get path length to solution
132  //
133  std::pair<bool,double> propResult = extrapolator.pathLength(line);
134  if ( !propResult.first ) return false;
135  s = propResult.second;
136  //
137  // get point and (normalised) direction from path length
138  //
139  HelixLineExtrapolation::PositionType xGen = extrapolator.position(s);
140  HelixLineExtrapolation::DirectionType pGen = extrapolator.direction(s);
141  //
142  // Fix normalisation and convert back to GlobalPoint / GlobalVector
143  //
144  x = GlobalPoint(xGen);
145  pGen *= pmag/pGen.mag();
146  p = GlobalVector(pGen);
147  //
148  return true;
149 }
virtual void setPropagationDirection(PropagationDirection dir)
Definition: Propagator.h:140
AnalyticalTrajectoryExtrapolatorToLine(const MagneticField *field)
constructor with default geometrical propagator
virtual Propagator * clone() const =0
PositionType position(double s) const override
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
const GlobalTrajectoryParameters & parameters() const
Definition: Line.h:10
const AlgebraicMatrix55 & jacobian() const
ReturnType plane(const PositionType &pos, const RotationType &rot) const
Definition: PlaneBuilder.h:22
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
TrajectoryStateOnSurface extrapolate(const FreeTrajectoryState &fts, const Line &L) const
extrapolation from FreeTrajectoryState
DirectionType direction(double s) const override
TrackCharge charge() const
const CurvilinearTrajectoryError & curvilinearError() const
virtual const MagneticField * magneticField() const =0
const SurfaceType & surface() const
T mag() const
Definition: PV3DBase.h:67
TrajectoryStateOnSurface extrapolateFullState(const TrajectoryStateOnSurface tsos, const Line &line) const
extrapolation of (multi) TSOS
FreeTrajectoryState const * freeTrajectoryState(bool withErrors=true) const
TrajectoryStateOnSurface extrapolateSingleState(const FreeTrajectoryState &fts, const Line &line) const
extrapolation of (single) FTS
GlobalVector momentum() const
GlobalPoint position() const
GlobalPoint closerPointToLine(const Line &aLine) const
Definition: Line.h:29
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
double transverseCurvature() const
const AlgebraicSymMatrix55 & matrix() const
std::pair< bool, double > pathLength(const GlobalPoint &point) const override
bool propagateWithHelix(const IterativeHelixExtrapolatorToLine &extrapolator, const Line &line, GlobalPoint &x, GlobalVector &p, double &s) const
the actual propagation to a new point & momentum vector
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepStd< double, 5, 5 > > AlgebraicMatrix55
Global3DVector GlobalVector
Definition: GlobalVector.h:10