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/Vector3D.h>
25#include <tracking/trackingUtilities/geometry/Vector2D.h>
27#include <tracking/trackingUtilities/numerics/ESign.h>
28#include <tracking/trackingUtilities/numerics/Quadratic.h>
30#include <tracking/trackingUtilities/numerics/CovarianceMatrixUtil.h>
31#include <tracking/trackingUtilities/numerics/JacobianMatrixUtil.h>
32#include <tracking/trackingUtilities/numerics/TMatrixConversion.h>
34#include <genfit/TrackCand.h>
36#include <mdst/dataobjects/MCParticle.h>
38#include <framework/gearbox/Const.h>
40#include <TMatrixDSym.h>
46using namespace TrackingUtilities;
86 mcParticle.getProductionTime(),
88 mcParticle.getCharge(),
95 mcParticle.getProductionTime(),
97 mcParticle.getCharge())
103 gfTrackCand.getTimeSeed(),
105 gfTrackCand.getChargeSeed(),
117 const TMatrixDSym& seedCov = gfTrackCand.getCovSeed();
123 const double px = gfTrackCand.getStateSeed()[iPx];
124 const double py = gfTrackCand.getStateSeed()[iPy];
125 const double pt = hypot2(px, py);
127 const double cosPhi0 = px / pt;
128 const double sinPhi0 = py / pt;
131 jacobianRot(iX, iX) = cosPhi0;
132 jacobianRot(iX, iY) = sinPhi0;
133 jacobianRot(iY, iX) = -sinPhi0;
134 jacobianRot(iY, iY) = cosPhi0;
135 jacobianRot(iZ, iZ) = 1.0;
137 jacobianRot(iPx, iPx) = cosPhi0;
138 jacobianRot(iPx, iPy) = sinPhi0;
139 jacobianRot(iPy, iPx) = -sinPhi0;
140 jacobianRot(iPy, iPy) = cosPhi0;
141 jacobianRot(iPz, iPz) = 1.0;
149 const double invPt = 1 / pt;
150 const double invPtSquared = invPt * invPt;
151 const double pz = gfTrackCand.getStateSeed()[iPz];
153 const double charge = gfTrackCand.getChargeSeed();
156 jacobianReduce(c_Curv, iPx) = charge * invPtSquared / alpha ;
157 jacobianReduce(c_Phi0, iPy) = invPt;
158 jacobianReduce(c_I, iY) = 1;
159 jacobianReduce(c_TanL, iPx) = - pz * invPtSquared;
160 jacobianReduce(c_TanL, iPz) = invPt;
161 jacobianReduce(c_Z0, iZ) = 1;
165 const HelixCovariance& helixCovariance = cov5;
177 CovarianceMatrix<6> calculateCovarianceMatrix(
const UncertainHelix& localHelix,
182 const double impactXY = localHelix->
impactXY();
185 const double cosPhi0 = phi0Vec.
x();
186 const double sinPhi0 = phi0Vec.
y();
188 const double curvatureXY = localHelix->
curvatureXY();
189 const double tanLambda = localHelix->
tanLambda();
208 const double chargeAlphaCurv =
static_cast<double>(charge) * alpha * curvatureXY;
209 const double chargeAlphaCurv2 =
static_cast<double>(charge) * alpha * std::pow(curvatureXY, 2);
211 const double invChargeAlphaCurv = 1.0 / chargeAlphaCurv;
212 const double invChargeAlphaCurv2 = 1.0 / chargeAlphaCurv2;
216 jacobianInflate(iX, c_Phi0) = -impactXY;
217 jacobianInflate(iY, c_I) = 1.0;
218 jacobianInflate(iZ, c_Z0) = 1.0;
222 jacobianInflate(iPx, c_Curv) = 0;
223 jacobianInflate(iPy, c_Phi0) = momentum.cylindricalR();
224 jacobianInflate(iPz, c_Curv) = 0;
225 jacobianInflate(iPz, c_TanL) = momentum.cylindricalR();
227 jacobianInflate(iPx, c_Curv) = invChargeAlphaCurv2;
228 jacobianInflate(iPy, c_Phi0) = - invChargeAlphaCurv;
229 jacobianInflate(iPz, c_Curv) = tanLambda * invChargeAlphaCurv2;
230 jacobianInflate(iPz, c_TanL) = - invChargeAlphaCurv;
240 jacobianRot(iX, iX) = cosPhi0;
241 jacobianRot(iX, iY) = -sinPhi0;
242 jacobianRot(iY, iX) = sinPhi0;
243 jacobianRot(iY, iY) = cosPhi0;
244 jacobianRot(iZ, iZ) = 1.0;
246 jacobianRot(iPx, iPx) = cosPhi0;
247 jacobianRot(iPx, iPy) = -sinPhi0;
248 jacobianRot(iPy, iPx) = sinPhi0;
249 jacobianRot(iPy, iPy) = cosPhi0;
250 jacobianRot(iPz, iPz) = 1.0;
279 gfTrackCand.setPosMomSeed(position, momentum, charge);
281 const CovarianceMatrix<6> cov6 = calculateCovarianceMatrix(
getLocalHelix(), momentum, charge, bZ);
284 gfTrackCand.setCovSeed(covSeed);
294 return calculateCovarianceMatrix(
getLocalHelix(), momentum, charge, bZ);
311 double factor2DTo3D = hypot2(1, tanLambda);
314 return factor2DTo3D * absMom2D;
321 double factor2DTo3D = hypot2(1, tanLambda);
324 return factor2DTo3D * absMom2D;
329 double arcLength2D =
m_localHelix.shiftPeriod(nPeriods);
371 double arcLength3D = arcLength2D * factor2DTo3D;
378std::ostream& TrackingUtilities::operator<<(std::ostream& output,
const CDCTrajectory3D& trajectory3D)
380 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.
Particle full three dimensional trajectory.
UncertainPerigeeCircle getLocalCircle() const
Getter for the circle in local coordinates.
double calcArcLength2D(const Vector3D &point) const
Calculate the travel distance from the start position of the trajectory.
Vector3D m_localOrigin
Memory for local coordinate origin of the circle representing the trajectory in global coordinates.
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.
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.
Vector3D getFlightDirection3DAtSupport() const
Get the unit momentum at the start point of the trajectory.
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.
Vector3D getMom3DAtSupport() const
Get the momentum at the start point of the trajectory.
UncertainHelix m_localHelix
Memory for the generalized circle describing the trajectory in coordinates from the local origin.
double setLocalOrigin(const Vector3D &localOrigin)
Setter for the origin of the local coordinate system.
const Vector3D & getLocalOrigin() const
Getter for the origin of the local coordinate system.
double m_flightTime
Memory for the estimation of the time at which the particle arrived at the support point.
Vector3D getSupport() const
Getter for the support point of the trajectory in global coordinates, where arcLength2D = 0.
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 Vector2D & 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 Vector2D &bySZ)
Moves the coordinate system by the vector by and calculates the new sz line and its covariance matrix...
A two dimensional vector which is equipped with functions for correct handling of orientation relate...
double x() const
Getter for the x coordinate.
double y() const
Getter for the y coordinate.
A three dimensional vector.
bool hasNAN() const
Checks if one of the coordinates is NAN.
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.