CMS 3D CMS Logo

PerigeeConversions.cc
Go to the documentation of this file.
4 #include <cmath>
5 #include <vdt/vdtMath.h>
6 
7 std::optional<PerigeeTrajectoryParameters> PerigeeConversions::ftsToPerigeeParameters(const FTS& originalFTS,
8  const GlobalPoint& referencePoint,
9  double& pt)
10 
11 {
12  GlobalVector impactDistance = originalFTS.position() - referencePoint;
13 
14  pt = originalFTS.momentum().perp();
15  if (pt == 0.)
16  return std::nullopt;
17 
18  double theta = originalFTS.momentum().theta();
19  double phi = originalFTS.momentum().phi();
20  double field = originalFTS.parameters().magneticFieldInInverseGeV().z();
21  // if (field==0.) throw cms::Exception("PerigeeConversions", "Field is 0") << " at " << originalFTS.position() << "\n" ;
22 
23  double positiveMomentumPhi = ((phi > 0) ? phi : (2 * M_PI + phi));
24  double positionPhi = impactDistance.phi();
25  double positivePositionPhi = ((positionPhi > 0) ? positionPhi : (2 * M_PI + positionPhi));
26  double phiDiff = positiveMomentumPhi - positivePositionPhi;
27  if (phiDiff < 0.0)
28  phiDiff += (2 * M_PI);
29  double signEpsilon = ((phiDiff > M_PI) ? -1.0 : 1.0);
30 
31  double epsilon =
32  signEpsilon * sqrt(impactDistance.x() * impactDistance.x() + impactDistance.y() * impactDistance.y());
33 
34  // The track parameters:
35  AlgebraicVector5 theTrackParameters;
36 
37  double signTC = -originalFTS.charge();
38  bool isCharged = (signTC != 0) && (std::abs(field) > 1.e-10);
39  if (isCharged) {
40  theTrackParameters[0] = field / pt * signTC;
41  } else {
42  theTrackParameters[0] = 1 / pt;
43  }
44  theTrackParameters[1] = theta;
45  theTrackParameters[2] = phi;
46  theTrackParameters[3] = epsilon;
47  theTrackParameters[4] = impactDistance.z();
48  return PerigeeTrajectoryParameters(theTrackParameters, isCharged);
49 }
50 
52  AlgebraicSymMatrix55 errorMatrix = originalFTS.curvilinearError().matrix();
53  AlgebraicMatrix55 curv2perigee = jacobianCurvilinear2Perigee(originalFTS);
54  return PerigeeTrajectoryError(ROOT::Math::Similarity(curv2perigee, errorMatrix));
55 }
56 
58  const GlobalTrajectoryParameters& gtp) {
60  return CurvilinearTrajectoryError(ROOT::Math::Similarity(perigee2curv, perigeeError.covarianceMatrix()));
61 }
62 
64  const GlobalPoint& referencePoint) {
65  AlgebraicVector5 theVector = parameters.vector();
66  return GlobalPoint(theVector[3] * vdt::fast_sin(theVector[2]) + referencePoint.x(),
67  -theVector[3] * vdt::fast_cos(theVector[2]) + referencePoint.y(),
68  theVector[4] + referencePoint.z());
69 }
70 
72  double pt,
73  const GlobalPoint& referencePoint) {
74  return GlobalVector(vdt::fast_cos(parameters.phi()) * pt,
75  vdt::fast_sin(parameters.phi()) * pt,
76  pt / vdt::fast_tan(parameters.theta()));
77 }
78 
80  const TrackCharge& charge,
81  const GlobalPoint& referencePoint,
82  const MagneticField* field) {
83  double pt;
84 
85  double bz = fabs(field->inInverseGeV(referencePoint).z());
86  if (charge != 0 && std::abs(bz) > 1.e-10) {
87  pt = std::abs(bz / momentum[0]);
88  // if (pt<1.e-10) throw cms::Exception("PerigeeConversions", "pt is 0");
89  } else {
90  pt = 1 / momentum[0];
91  }
92 
93  return GlobalVector(
94  vdt::fast_cos(momentum[2]) * pt, vdt::fast_sin(momentum[2]) * pt, pt / vdt::fast_tan(momentum[1]));
95 }
96 
98  const AlgebraicVector3& momentum,
99  const GlobalPoint& referencePoint,
100  const TrackCharge& charge,
101  const AlgebraicSymMatrix66& theCovarianceMatrix,
102  const MagneticField* field) {
103  AlgebraicMatrix66 param2cart = jacobianParameters2Cartesian(momentum, referencePoint, charge, field);
104  CartesianTrajectoryError cartesianTrajErr(ROOT::Math::Similarity(param2cart, theCovarianceMatrix));
105 
107  referencePoint, momentumFromPerigee(momentum, charge, referencePoint, field), charge, field),
108  cartesianTrajErr);
109 
110  return TrajectoryStateClosestToPoint(theFTS, referencePoint);
111 }
112 
114  const GlobalPoint& position,
115  const TrackCharge& charge,
116  const MagneticField* field) {
117  float factor = -1.;
118  float bField = field->inInverseGeV(position).z();
119  if (charge != 0 && std::abs(bField) > 1.e-10f)
120  factor = bField * charge;
121 
122  float s1, c1;
123  vdt::fast_sincosf(momentum[1], s1, c1);
124  float s2, c2;
125  vdt::fast_sincosf(momentum[2], s2, c2);
126  float f1 = factor / (momentum[0] * momentum[0]);
127  float f2 = factor / momentum[0];
128 
129  AlgebraicMatrix66 frameTransJ;
130  frameTransJ(0, 0) = 1;
131  frameTransJ(1, 1) = 1;
132  frameTransJ(2, 2) = 1;
133  frameTransJ(3, 3) = (f1 * c2);
134  frameTransJ(4, 3) = (f1 * s2);
135  frameTransJ(5, 3) = (f1 * c1 / s1);
136 
137  frameTransJ(3, 5) = (f2 * s2);
138  frameTransJ(4, 5) = -(f2 * c2);
139  frameTransJ(5, 4) = (f2 / (s1 * s1));
140 
141  return frameTransJ;
142 }
143 
145  GlobalVector p = fts.momentum();
146 
147  GlobalVector Z = GlobalVector(0., 0., 1.);
148  GlobalVector T = p.unit();
149  GlobalVector U = Z.cross(T).unit();
150  ;
151  GlobalVector V = T.cross(U);
152 
153  GlobalVector I = GlobalVector(-p.x(), -p.y(), 0.); //opposite to track dir.
154  I = I.unit();
155  GlobalVector J(-I.y(), I.x(), 0.); //counterclockwise rotation
156  const GlobalVector& K(Z);
158  GlobalVector H = B.unit();
159  GlobalVector HxT = H.cross(T);
160  GlobalVector N = HxT.unit();
161  double alpha = HxT.mag();
162  double qbp = fts.signedInverseMomentum();
163  double Q = -B.mag() * qbp;
164  double alphaQ = alpha * Q;
165 
166  double lambda = 0.5 * M_PI - p.theta();
167  double sinlambda, coslambda;
168  vdt::fast_sincos(lambda, sinlambda, coslambda);
169  double seclambda = 1. / coslambda;
170 
171  double ITI = 1. / T.dot(I);
172  double NU = N.dot(U);
173  double NV = N.dot(V);
174  double UI = U.dot(I);
175  double VI = V.dot(I);
176  double UJ = U.dot(J);
177  double VJ = V.dot(J);
178  double UK = U.dot(K);
179  double VK = V.dot(K);
180 
181  AlgebraicMatrix55 jac;
182 
183  if (fabs(fts.transverseCurvature()) < 1.e-10) {
184  jac(0, 0) = seclambda;
185  jac(0, 1) = sinlambda * seclambda * seclambda * std::abs(qbp);
186  } else {
187  double Bz = B.z();
188  jac(0, 0) = -Bz * seclambda;
189  jac(0, 1) = -Bz * sinlambda * seclambda * seclambda * qbp;
190  jac(1, 3) = alphaQ * NV * UI * ITI;
191  jac(1, 4) = alphaQ * NV * VI * ITI;
192  jac(0, 3) = -jac(0, 1) * jac(1, 3);
193  jac(0, 4) = -jac(0, 1) * jac(1, 4);
194  jac(2, 3) = -alphaQ * seclambda * NU * UI * ITI;
195  jac(2, 4) = -alphaQ * seclambda * NU * VI * ITI;
196  }
197  jac(1, 1) = -1.;
198  jac(2, 2) = 1.;
199  jac(3, 3) = VK * ITI;
200  jac(3, 4) = -UK * ITI;
201  jac(4, 3) = -VJ * ITI;
202  jac(4, 4) = UJ * ITI;
203 
204  return jac;
205 }
206 
208  GlobalVector p = gtp.momentum();
209 
210  GlobalVector Z = GlobalVector(0.f, 0.f, 1.f);
211  GlobalVector T = p.unit();
212  GlobalVector U = Z.cross(T).unit();
213  ;
214  GlobalVector V = T.cross(U);
215 
216  GlobalVector I = GlobalVector(-p.x(), -p.y(), 0.f); //opposite to track dir.
217  I = I.unit();
218  GlobalVector J(-I.y(), I.x(), 0.f); //counterclockwise rotation
219  const GlobalVector& K(Z);
221  GlobalVector H = B.unit();
222  GlobalVector HxT = H.cross(T);
223  GlobalVector N = HxT.unit();
224  double alpha = HxT.mag();
225  double qbp = gtp.signedInverseMomentum();
226  double Q = -B.mag() * qbp;
227  double alphaQ = alpha * Q;
228 
229  double lambda = 0.5 * M_PI - p.theta();
230  double sinlambda, coslambda;
231  vdt::fast_sincos(lambda, sinlambda, coslambda);
232  double seclambda = 1. / coslambda;
233 
234  double mqbpt = -1. / coslambda * qbp;
235 
236  double TJ = T.dot(J);
237  double TK = T.dot(K);
238  double NU = N.dot(U);
239  double NV = N.dot(V);
240  double UJ = U.dot(J);
241  double VJ = V.dot(J);
242  double UK = U.dot(K);
243  double VK = V.dot(K);
244 
245  AlgebraicMatrix55 jac;
246 
247  if (fabs(gtp.transverseCurvature()) < 1.e-10f) {
248  jac(0, 0) = coslambda;
249  jac(0, 1) = sinlambda / coslambda / gtp.momentum().mag();
250  } else {
251  jac(0, 0) = -coslambda / B.z();
252  jac(0, 1) = -sinlambda * mqbpt;
253  jac(1, 3) = -alphaQ * NV * TJ;
254  jac(1, 4) = -alphaQ * NV * TK;
255  jac(2, 3) = -alphaQ * seclambda * NU * TJ;
256  jac(2, 4) = -alphaQ * seclambda * NU * TK;
257  }
258  jac(1, 1) = -1.;
259  jac(2, 2) = 1.;
260  jac(3, 3) = UJ;
261  jac(3, 4) = UK;
262  jac(4, 3) = VJ;
263  jac(4, 4) = VK;
264 
265  return jac;
266 }
TrajectoryStateClosestToPoint trajectoryStateClosestToPoint(const AlgebraicVector3 &momentum, const GlobalPoint &referencePoint, const TrackCharge &charge, const AlgebraicSymMatrix66 &theCovarianceMatrix, const MagneticField *field)
const AlgebraicSymMatrix55 & covarianceMatrix() const
T perp() const
Definition: PV3DBase.h:69
const CurvilinearTrajectoryError & curvilinearError() const
Definition: APVGainStruct.h:7
T z() const
Definition: PV3DBase.h:61
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
GlobalVector inInverseGeV(const GlobalPoint &gp) const
Field value ad specified global point, in 1/Gev.
Definition: MagneticField.h:36
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepStd< double, 5, 5 > > AlgebraicMatrix55
std::optional< PerigeeTrajectoryParameters > ftsToPerigeeParameters(const FTS &originalFTS, const GlobalPoint &referencePoint, double &pt)
const GlobalTrajectoryParameters & parameters() const
GlobalPoint position() const
int TrackCharge
Definition: TrackCharge.h:4
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
uint32_t T const *__restrict__ uint32_t const *__restrict__ int32_t int Histo::index_type cudaStream_t V
T sqrt(T t)
Definition: SSEVec.h:23
TrackCharge charge() const
AlgebraicMatrix66 jacobianParameters2Cartesian(const AlgebraicVector3 &momentum, const GlobalPoint &position, const TrackCharge &charge, const MagneticField *field)
MPF fast_tan(const MPF &a)
T mag() const
Definition: PV3DBase.h:64
GlobalVector momentum() const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ROOT::Math::SVector< double, 5 > AlgebraicVector5
double signedInverseMomentum() const
const std::complex< double > I
Definition: I.h:8
double f[11][100]
AlgebraicMatrix55 jacobianPerigee2Curvilinear(const GlobalTrajectoryParameters &gtp)
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepStd< double, 6, 6 > > AlgebraicMatrix66
GlobalVector magneticFieldInInverseGeV(const GlobalPoint &x) const
#define M_PI
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
GlobalPoint positionFromPerigee(const PerigeeTrajectoryParameters &parameters, const GlobalPoint &referencePoint)
double transverseCurvature() const
GlobalVector momentumFromPerigee(const AlgebraicVector3 &momentum, const TrackCharge &charge, const GlobalPoint &referencePoint, const MagneticField *field)
#define N
Definition: blowfish.cc:9
const AlgebraicSymMatrix55 & matrix() const
CurvilinearTrajectoryError curvilinearError(const PerigeeTrajectoryError &perigeeError, const GlobalTrajectoryParameters &gtp)
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
AlgebraicMatrix55 jacobianCurvilinear2Perigee(const FreeTrajectoryState &fts)
static int position[264][3]
Definition: ReadPGInfo.cc:289
ROOT::Math::SVector< double, 3 > AlgebraicVector3
PerigeeTrajectoryError ftsToPerigeeError(const FTS &originalFTS)
Vector3DBase unit() const
Definition: Vector3DBase.h:54
void fast_sincos(const MPF &a, MPF &s, MPF &c)
long double T
Global3DVector GlobalVector
Definition: GlobalVector.h:10
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72