8#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory3D.h>
10#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory2D.h>
11#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectorySZ.h>
13#include <tracking/trackingUtilities/eventdata/trajectories/CDCBFieldUtil.h>
15#include <cdc/topology/CDCWireTopology.h>
17#include <tracking/trackingUtilities/geometry/UncertainHelix.h>
18#include <tracking/trackingUtilities/geometry/Helix.h>
19#include <tracking/trackingUtilities/geometry/HelixParameters.h>
20#include <tracking/trackingUtilities/geometry/UncertainPerigeeCircle.h>
21#include <tracking/trackingUtilities/geometry/UncertainSZLine.h>
22#include <tracking/trackingUtilities/geometry/PerigeeCircle.h>
24#include <tracking/trackingUtilities/geometry/VectorUtil.h>
26#include <tracking/trackingUtilities/numerics/ESign.h>
27#include <tracking/trackingUtilities/numerics/Quadratic.h>
29#include <tracking/trackingUtilities/numerics/CovarianceMatrixUtil.h>
30#include <tracking/trackingUtilities/numerics/JacobianMatrixUtil.h>
31#include <tracking/trackingUtilities/numerics/TMatrixConversion.h>
33#include <genfit/TrackCand.h>
35#include <mdst/dataobjects/MCParticle.h>
37#include <framework/gearbox/Const.h>
38#include <framework/geometry/VectorUtil.h>
40#include <TMatrixDSym.h>
46using namespace TrackingUtilities;
64 const ROOT::Math::XYZVector& mom3D,
69 VectorUtil::unit(VectorUtil::getXYVector(mom3D)),
71 (mom3D.Z() / mom3D.Rho()),
79 const ROOT::Math::XYZVector& mom3D,
86 :
CDCTrajectory3D(ROOT::Math::XYZVector{mcParticle.getProductionVertex()},
87 mcParticle.getProductionTime(),
88 ROOT::Math::XYZVector{mcParticle.getMomentum()},
89 mcParticle.getCharge(),
95 :
CDCTrajectory3D(ROOT::Math::XYZVector{mcParticle.getProductionVertex()},
96 mcParticle.getProductionTime(),
97 ROOT::Math::XYZVector{mcParticle.getMomentum()},
98 mcParticle.getCharge())
104 gfTrackCand.getTimeSeed(),
105 ROOT::Math::XYZVector{gfTrackCand.getMomSeed()},
106 gfTrackCand.getChargeSeed(),
118 const TMatrixDSym& seedCov = gfTrackCand.getCovSeed();
124 const double px = gfTrackCand.getStateSeed()[iPx];
125 const double py = gfTrackCand.getStateSeed()[iPy];
126 const double pt = hypot2(px, py);
128 const double cosPhi0 = px / pt;
129 const double sinPhi0 = py / pt;
132 jacobianRot(iX, iX) = cosPhi0;
133 jacobianRot(iX, iY) = sinPhi0;
134 jacobianRot(iY, iX) = -sinPhi0;
135 jacobianRot(iY, iY) = cosPhi0;
136 jacobianRot(iZ, iZ) = 1.0;
138 jacobianRot(iPx, iPx) = cosPhi0;
139 jacobianRot(iPx, iPy) = sinPhi0;
140 jacobianRot(iPy, iPx) = -sinPhi0;
141 jacobianRot(iPy, iPy) = cosPhi0;
142 jacobianRot(iPz, iPz) = 1.0;
150 const double invPt = 1 / pt;
151 const double invPtSquared = invPt * invPt;
152 const double pz = gfTrackCand.getStateSeed()[iPz];
154 const double charge = gfTrackCand.getChargeSeed();
157 jacobianReduce(c_Curv, iPx) = charge * invPtSquared / alpha ;
158 jacobianReduce(c_Phi0, iPy) = invPt;
159 jacobianReduce(c_I, iY) = 1;
160 jacobianReduce(c_TanL, iPx) = - pz * invPtSquared;
161 jacobianReduce(c_TanL, iPz) = invPt;
162 jacobianReduce(c_Z0, iZ) = 1;
166 const HelixCovariance& helixCovariance = cov5;
178 CovarianceMatrix<6> calculateCovarianceMatrix(
const UncertainHelix& localHelix,
179 const ROOT::Math::XYZVector& momentum,
183 const double impactXY = localHelix->
impactXY();
184 const ROOT::Math::XYVector& phi0Vec = localHelix->
phi0Vec();
186 const double cosPhi0 = phi0Vec.x();
187 const double sinPhi0 = phi0Vec.y();
189 const double curvatureXY = localHelix->
curvatureXY();
190 const double tanLambda = localHelix->
tanLambda();
209 const double chargeAlphaCurv =
static_cast<double>(charge) * alpha * curvatureXY;
210 const double chargeAlphaCurv2 =
static_cast<double>(charge) * alpha * std::pow(curvatureXY, 2);
212 const double invChargeAlphaCurv = 1.0 / chargeAlphaCurv;
213 const double invChargeAlphaCurv2 = 1.0 / chargeAlphaCurv2;
217 jacobianInflate(iX, c_Phi0) = -impactXY;
218 jacobianInflate(iY, c_I) = 1.0;
219 jacobianInflate(iZ, c_Z0) = 1.0;
223 jacobianInflate(iPx, c_Curv) = 0;
224 jacobianInflate(iPy, c_Phi0) = momentum.Rho();
225 jacobianInflate(iPz, c_Curv) = 0;
226 jacobianInflate(iPz, c_TanL) = momentum.Rho();
228 jacobianInflate(iPx, c_Curv) = invChargeAlphaCurv2;
229 jacobianInflate(iPy, c_Phi0) = - invChargeAlphaCurv;
230 jacobianInflate(iPz, c_Curv) = tanLambda * invChargeAlphaCurv2;
231 jacobianInflate(iPz, c_TanL) = - invChargeAlphaCurv;
241 jacobianRot(iX, iX) = cosPhi0;
242 jacobianRot(iX, iY) = -sinPhi0;
243 jacobianRot(iY, iX) = sinPhi0;
244 jacobianRot(iY, iY) = cosPhi0;
245 jacobianRot(iZ, iZ) = 1.0;
247 jacobianRot(iPx, iPx) = cosPhi0;
248 jacobianRot(iPx, iPy) = -sinPhi0;
249 jacobianRot(iPy, iPx) = sinPhi0;
250 jacobianRot(iPy, iPy) = cosPhi0;
251 jacobianRot(iPz, iPz) = 1.0;
264 ROOT::Math::XYZVector position =
getSupport();
271 ROOT::Math::XYZVector position =
getSupport();
276 if (not
ESignUtil::isValid(charge) or VectorUtil::hasNAN(momentum) or VectorUtil::hasNAN(position)) {
282 const CovarianceMatrix<6> cov6 = calculateCovarianceMatrix(
getLocalHelix(), momentum, charge, bZ);
285 gfTrackCand.setCovSeed(covSeed);
295 return calculateCovarianceMatrix(
getLocalHelix(), momentum, charge, bZ);
312 double factor2DTo3D = hypot2(1, tanLambda);
315 return factor2DTo3D * absMom2D;
320 ROOT::Math::XYZVector position =
getSupport();
322 double factor2DTo3D = hypot2(1, tanLambda);
325 return factor2DTo3D * absMom2D;
330 double arcLength2D =
m_localHelix.shiftPeriod(nPeriods);
372 double arcLength3D = arcLength2D * factor2DTo3D;
379std::ostream& TrackingUtilities::operator<<(std::ostream& output,
const CDCTrajectory3D& trajectory3D)
381 return output <<
"Local origin : " << trajectory3D.
getLocalOrigin() <<
", "
Class representing the sense wire arrangement in the whole of the central drift chamber.
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
double getOuterCylindricalR() const
Getter for the outer radius of the outer most wire layer.
static const double speedOfLight
[cm/ns]
A Class to store the Monte Carlo particle information.
Helper functions to interact with the magnetic field.
static double curvatureToAbsMom2D(double curvature, double bZ)
Conversion helper for two dimensional curvature to momenta.
static ESign ccwInfoToChargeSign(ERotation ccwInfo)
Conversion helper from clockwise or counterclockwise travel to the charge sign.
static double getBFieldZ()
Getter for the signed magnetic field strength in z direction at the origin ( in Tesla )
static double getAlphaFromBField(double bField)
Translator from magnetic field strength in Tesla to the alpha value.
Particle trajectory as it is seen in xy projection represented as a circle.
const ROOT::Math::XYVector & getLocalOrigin() const
Getter for the origin of the local coordinate system.
Particle full three dimensional trajectory.
UncertainPerigeeCircle getLocalCircle() const
Getter for the circle in local coordinates.
double setLocalOrigin(const ROOT::Math::XYZVector &localOrigin)
Setter for the origin of the local coordinate system.
double getMaximalCylindricalR() const
Getter for the maximal distance from the origin.
bool fillInto(genfit::TrackCand &trackCand) const
Copies the trajectory information to the Genfit track candidate.
double getAbsMom3D() const
Get the estimation for the absolute value of the transvers momentum.
CovarianceMatrix< 6 > getCartesianCovariance(double bZ) const
Convert the helix parameters to the cartesian coordinates x,y,z,px,py,pz.
PerigeeCircle getGlobalCircle() const
Getter for the circle in global coordinates.
ROOT::Math::XYZVector getMom3DAtSupport() const
Get the momentum at the start point of the trajectory.
double getFlightTime() const
Getter for the time when the particle reached the support point position.
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional trajectory.
ESign getChargeSign() const
Gets the charge sign of the trajectory.
double shiftPeriod(int nPeriods)
Adjusts the z0 to the one that lies n periods forward.
bool isCurler(double factor=1) const
Checks if the trajectory leaves the outer radius of the CDC times the given tolerance factor.
UncertainSZLine getLocalSZLine() const
Getter for the sz line starting from the local origin.
CDCTrajectory3D()
Default constructor for ROOT compatibility.
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz trajectory.
const UncertainHelix & getLocalHelix() const
Getter for the helix in local coordinates.
double getTanLambda() const
Getter for the slope of z over the transverse travel distance s.
ROOT::Math::XYZVector m_localOrigin
Memory for local coordinate origin of the circle representing the trajectory in global coordinates.
UncertainHelix m_localHelix
Memory for the generalized circle describing the trajectory in coordinates from the local origin.
const ROOT::Math::XYZVector & getLocalOrigin() const
Getter for the origin of the local coordinate system.
double calcArcLength2D(const ROOT::Math::XYZVector &point) const
Calculate the travel distance from the start position of the trajectory.
ROOT::Math::XYZVector getFlightDirection3DAtSupport() const
Get the unit momentum at the start point of the trajectory.
ROOT::Math::XYZVector getSupport() const
Getter for the support point of the trajectory in global coordinates, where arcLength2D = 0.
double m_flightTime
Memory for the estimation of the time at which the particle arrived at the support point.
Linear trajectory in sz space.
double impactXY() const
Getter for the signed distance to the z axes at the perigee point.
double tanLambda() const
Getter for the proportinality factor from arc length in xy space to z.
double curvatureXY() const
Getter for the signed curvature in the xy projection.
const ROOT::Math::XYVector & phi0Vec() const
Getter for the direction vector in the xy projection at the perigee of the helix.
Extension of the generalized circle also caching the perigee coordinates.
A general helix class including a covariance matrix.
const HelixCovariance & helixCovariance() const
Getter for the whole covariance matrix of the perigee parameters.
UncertainSZLine uncertainSZLine() const
Reduces the helix to an sz line carrying over the relevant parts of the convariance matrix.
UncertainPerigeeCircle uncertainCircleXY() const
Projects the helix into the xy plain carrying over the relevant parts of the convariance matrix.
Adds an uncertainty matrix to the circle in perigee parameterisation.
A line in sz where s is the transverse travel distance as seen in the xy projection with uncertaintie...
void passiveMoveBy(const ROOT::Math::XYVector &bySZ)
Moves the coordinate system by the vector by and calculates the new sz line and its covariance matrix...
static constexpr auto XYZToTVector
Helper function to convert XYZVector to TVector3.
bool isValid(ESign s)
Returns true if sign is ESign::c_Plus, ESign::c_Minus or ESign::c_Zero.
Namespace to hide the contained enum constants.
Abstract base class for different kinds of events.
static CovarianceMatrix< M > transported(const JacobianMatrix< M, N > &jacobian, const CovarianceMatrix< N > &cov)
Return a copy of the covariance matrix transported with the given jacobian matrix.
static void transport(const JacobianMatrix< N, N > &jacobian, CovarianceMatrix< N > &cov)
Transport the covariance matrix inplace with the given jacobian matrix.
static JacobianMatrix< M, N > zero()
Construct a zero matrix.
static CovarianceMatrix< N > fromTMatrix(const TMatrixDSym &tCov)
Create a covariance matrix from a TMatrix representation.
static TMatrixDSym toTMatrix(const CovarianceMatrix< N > &cov)
Translate the covariance matrix to the TMatrix representation.