ATLAS Offline Software
Loading...
Searching...
No Matches
EnergyLossExtrapolationValidation.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3 */
4
6// EnergyLossValidation.cxx, (c) ATLAS Detector software
8
9// Tracking
10
11
22// Validation mode - TTree includes
23#include "TTree.h"
24#include "GaudiKernel/ITHistSvc.h"
25#include "GaudiKernel/MsgStream.h"
26#include <cmath>
27
28//================ Constructor =================================================
29
31 ISvcLocator* pSvcLocator)
32 : AthAlgorithm(name, pSvcLocator) {}
33
34//================ Destructor =================================================
35
37 // clear random number generators
38 delete m_gaussDist;
39 delete m_flatDist;
40 // clear data vectors
41 delete m_theCylinders;
42 delete m_theDiscs1;
43 delete m_theDiscs2;
44}
45
46//================ Initialization =================================================
47
49 // Code entered here will be executed once at program start.
50 ATH_MSG_INFO("initialize()");
51 ATH_MSG_DEBUG("initialize() m_materialCollectionValidation = " << m_materialCollectionValidation);
52
53 // Get Extrapolator from ToolService
54 if (m_extrapolator.retrieve().isFailure()) {
55 ATH_MSG_FATAL("initialize() Could not retrieve Tool " << m_extrapolator << ". Exiting.");
56 return StatusCode::FAILURE;
57 }
58
59 // create the new Trees
60 m_validationTree = new TTree(m_validationTreeName.value().c_str(),
61 m_validationTreeDescription.value().c_str());
62 m_validationRunTree = new TTree(m_validationRunTreeName.value().c_str(),
63 m_validationRunTreeDescription.value().c_str());
64
65 // the branches for the parameters
66 m_validationTree->Branch("Entries", &m_entries, "entries/i");
67 m_validationTree->Branch("Energy", m_energy, "energy[entries]/F");
68 m_validationTree->Branch("EnergyLoss", m_energyLoss, "eLoss[entries]/F");
69 m_validationTree->Branch("tInX0", m_parameterX0, "tinX0[entries]/F");
70 m_validationTree->Branch("Radius", m_radius, "radius[entries]/F");
71 m_validationTree->Branch("PosX", m_positionX, "posX[entries]/F");
72 m_validationTree->Branch("PosY", m_positionY, "posY[entries]/F");
73 m_validationTree->Branch("PosZ", m_positionZ, "posZ[entries]/F");
74 m_validationTree->Branch("Eta", m_parameterEta, "eta[entries]/F");
75 m_validationTree->Branch("Phi", m_parameterPhi, "phi[entries]/F");
76 m_validationTree->Branch("Layer", m_layer, "layer[entries]/i");
77
78 m_validationRunTree->Branch("Layers", &m_cylinders, "layers/i");
79 m_validationRunTree->Branch("CylR", m_cylinderR, "cylR[layers]/F");
80 m_validationRunTree->Branch("CylZ", m_cylinderZ, "cylZ[layers]/F");
81 m_validationRunTree->Branch("Momentum", &m_momentum, "momentum/F");
82 m_validationRunTree->Branch("UsePt", &m_usePt, "usePt/O");
83 m_validationRunTree->Branch("MinEta", &m_minEta, "minEta/F");
84 m_validationRunTree->Branch("MaxEta", &m_maxEta, "maxEta/F");
85 m_validationRunTree->Branch("PDG", &m_pdg, "pdg/I");
86 m_validationRunTree->Branch("Events", &m_events, "events/i");
87 m_validationRunTree->Branch("AvgRecordedLayers", &m_avgRecordedLayers, "avgRecLayers/F");
88
89 // now register the Trees
90 SmartIF<ITHistSvc> tHistSvc {
91 service("THistSvc")
92 };
93 if (!tHistSvc) {
94 ATH_MSG_ERROR("initialize() Could not find Hist Service -> Switching ValidationMode Off !");
95 delete m_validationTree;
96 m_validationTree = nullptr;
98 m_validationRunTree = nullptr;
99 }
100 if ((tHistSvc->regTree(m_validationTreeFolder, m_validationTree)).isFailure()
101 || (tHistSvc->regTree(m_validationRunTreeFolder, m_validationRunTree)).isFailure()) {
102 ATH_MSG_ERROR("initialize() Could not register the validation Trees -> Switching ValidationMode Off !");
103 delete m_validationTree;
104 m_validationTree = nullptr;
105 delete m_validationRunTree;
106 m_validationRunTree = nullptr;
107 }
108
109 // initialize the random number generators
110 ATH_MSG_INFO("initialize() RandomService = " << randSvc()->name());
111 m_gaussDist = new Rndm::Numbers(randSvc(), Rndm::Gauss(0., 1.));
112 m_flatDist = new Rndm::Numbers(randSvc(), Rndm::Flat(0., 1.));
113
114 // initialize cylinders if they are not set in jobOptions
115 double const s_cylInitR[TRKEXALGS_MAXPARAMETERS] = {
116 0.5, 34.5, 250, 550, 1120, 4250, 13000, 0, 0, 0
117 };
118 double const s_cylInitZ[TRKEXALGS_MAXPARAMETERS] = {
119 100, 10e6, 680, 2820, 3120, 6500, 22000, 0, 0, 0
120 };
121
122 // output of vector from jobOptions
123 ATH_MSG_INFO("initialize() cylinder dimensions vector from jobOptions :");
124 for (size_t lay = 0; lay < m_cylinders + 1; ++lay) {
126 "initialize() m_cylinderVR[" << lay << "] = " << m_cylinderVR[lay] << "\t ... m_cylinderVZ[" << lay << "] = " <<
127 m_cylinderVZ[lay]);
128 }
129 // transform vector (from jobOptions) into array (for ROOT tree)
130 ATH_MSG_INFO("initialize() cylinder dimensions array for algorithm and ROOT tree :");
131 for (size_t lay = 0; lay < m_cylinders + 1; ++lay) {
132 m_cylinderR[lay] = m_cylinderVR[lay] > 0 ? m_cylinderVR[lay] : s_cylInitR[lay];
133 m_cylinderZ[lay] = m_cylinderVZ[lay] > 0 ? m_cylinderVZ[lay] : s_cylInitZ[lay];
134 // in "strict onion mode", constrain m_cylinders if the values don't make sense
135 if (m_onion && lay > 0 && (m_cylinderR[lay] < m_cylinderR[lay - 1])) {
137 "initialize() layer " << lay << "dimensions are smaller than those of layer " << lay - 1 << " - constraining m_cylinders to " << lay -
138 1);
139 ATH_MSG_INFO("initialize() cutting off here :");
141 "initialize() m_cylinderR[" << lay << "] = " << m_cylinderR[lay] << "\t ... m_cylinderZ[" << lay << "] = " <<
142 m_cylinderZ[lay]);
143 m_cylinders = lay - 1;
144 break;
145 }
147 "initialize() m_cylinderR[" << lay << "] = " << m_cylinderR[lay] << "\t ... m_cylinderZ[" << lay << "] = " <<
148 m_cylinderZ[lay]);
149 }
150
151 // fill data vector with cylinders once (in order not to create them every time)
155 for (size_t lay = 0; lay < m_cylinders + 1; ++lay) {
157 ATH_MSG_INFO("initialize() Cylinder " << lay << ": " << *m_theCylinders->at(lay));
158 m_theDiscs1->push_back(new Trk::DiscSurface(*createTransform(0., 0., -m_cylinderZ[lay]), 0., m_cylinderR[lay]));
159 ATH_MSG_INFO("initialize() Disc1 " << lay << ": " << *m_theDiscs1->at(lay));
160 m_theDiscs2->push_back(new Trk::DiscSurface(*createTransform(0., 0., m_cylinderZ[lay]), 0., m_cylinderR[lay]));
161 ATH_MSG_INFO("initialize() Disc2 " << lay << ": " << *m_theDiscs2->at(lay));
162 }
163
164 if (m_particleType == 0) m_pdg = 999; // geantino
165 else if (m_particleType == 1) m_pdg = 11; // electron
166 else if (m_particleType == 2) m_pdg = 13; // muon-
167 else if (m_particleType == 3) m_pdg = 211; // pion+
168 else if (m_particleType == 4) m_pdg = 321; // kaon+
169 ATH_MSG_INFO("initialize() ParticleType = " << m_particleType << " ... PDG = " << m_pdg);
170
171 ATH_MSG_INFO("initialize() successful");
172 return StatusCode::SUCCESS;
173}
174
175//================ Finalisation =================================================
176
178 // Code entered here will be executed once at the end of the program run.
179 ATH_MSG_INFO("finalize() ================== Output Statistics =========================");
180 ATH_MSG_INFO("finalize() = Navigation : ");
181 ATH_MSG_INFO("finalize() = - breaks fwd : " << static_cast<double>(m_breaksForward) /
182 static_cast<double>(m_triesForward)
183 << " (" << m_breaksForward << "/" << m_triesForward << ")");
184 ATH_MSG_INFO("finalize() = - breaks bwd : " << static_cast<double>(m_breaksBack) / static_cast<double>(m_triesBack)
185 << " (" << m_breaksBack << "/" << m_triesBack << ")");
187 ATH_MSG_INFO("finalize() = Material collection : ");
188 ATH_MSG_INFO("finalize() = - layer collected fwd : " << m_collectedLayerForward);
189 ATH_MSG_INFO("finalize() = - layer collected bwd : " << m_collectedLayerBack);
190 }
191 ATH_MSG_INFO("finalize() ==============================================================");
192
193 m_avgRecordedLayers = m_events ? static_cast<float>(m_totalRecordedLayers) / static_cast<float>(m_events) : 0;
194 ++m_cylinders;
196 --m_cylinders;
197
198 return StatusCode::SUCCESS;
199}
200
201//================ Execution ====================================================
202
203StatusCode Trk::EnergyLossExtrapolationValidation::execute(const EventContext& ctx) {
204 // get the overall dimensions
205 if (!m_highestVolume) {
206 // get TrackingGeometry and highest volume
207 const Trk::TrackingGeometry* trackingGeometry = m_extrapolator->trackingGeometry();
208 m_highestVolume = trackingGeometry ? trackingGeometry->highestTrackingVolume() : nullptr;
209 const Trk::CylinderVolumeBounds* cylBounds = m_highestVolume ?
210 dynamic_cast<const Trk::CylinderVolumeBounds*>(&(m_highestVolume->
211 volumeBounds())) :
212 nullptr;
213 // bail out
214 if (!cylBounds) {
215 ATH_MSG_WARNING("execute() No highest TrackingVolume / no VolumeBounds ... pretty useless!");
216 return StatusCode::SUCCESS;
217 }
218 }
219
220
221 m_entries = 0;
222 for (size_t par = 0; par < TRKEXALGS_MAXPARAMETERS; ++par) {
223 // -----------> start parameters
224
225 m_parameterP[par] = 0.;
226 m_energy[par] = 0.;
227 m_energyLoss[par] = 0.;
228 m_parameterX0[par] = 0.;
229 m_radius[par] = 0.;
230 m_positionX[par] = 0.;
231 m_positionY[par] = 0.;
232 m_positionZ[par] = 0.;
233 m_parameterEta[par] = 0.;
234 m_parameterPhi[par] = 0.;
235 m_parameterTheta[par] = 0.;
236 m_layer[par] = 0;
237 }
238
239 // the local start parameters
240 // are adopted for planar and straight line surfaces
241 m_parameterPhi[0] = M_PI * (2 * m_flatDist->shoot() - 1);
242 m_parameterEta[0] = m_minEta + m_flatDist->shoot() * (m_maxEta - m_minEta);
243 m_parameterTheta[0] = 2. * std::atan(std::exp(-m_parameterEta[0]));
244
245 double charge = -1.;
247 // convert transverse momentum (pt) to momentum (p) if flag is set: p = pt/sin(theta)
248 if (m_usePt) m_parameterP[0] /= std::sin(m_parameterTheta[0]);
250
252
253 double energy1 = sqrt(m_parameterP[0] * m_parameterP[0] + mass * mass);
254
255 double newX0 = 0;
256
257 const Trk::PerigeeSurface perigeeSurface;
258 // the initial perigee with random numbers
259 Trk::Perigee startParameters(0, // m_parameterLoc1[0],
260 0, // m_parameterLoc2[0],
264 perigeeSurface);
265
266 ATH_MSG_VERBOSE("execute() Start Parameters : " << startParameters);
268 "execute() Start Parameters : [phi,eta] = [ " << startParameters.momentum().phi() << ", " << startParameters.eta() <<
269 " ]");
270
271 // --------------- propagate to find an intersection ---------------------
272
273 // fill the TrackParameters vector with extrapolation from startParameters to dummy cylinder surface
274 std::unique_ptr<Trk::TrackParameters> lastParameters {};
275 std::unique_ptr<Trk::TrackParameters> newParameters {};
276
278 lastParameters = m_extrapolator->extrapolate(
279 ctx,
280 startParameters,
281 *(m_theCylinders->at(0)),
283 true,
284 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
285 } else { // material collection validation
286 // get the vector of TrackStateOnSurfaces back
287 const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
288 m_extrapolator->extrapolateM(
289 ctx,
290 startParameters,
291 *(m_theCylinders->at(0)),
293 true,
294 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
295
296 // get the last one and clone it
297 if (collectedMaterial && !collectedMaterial->empty()) {
298 // get the last track state on surface & clone the destination parameters
299 const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
300 lastParameters.reset(destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr);
301 m_collectedLayerForward += collectedMaterial->size();
302 // delete the layers / cleanup
303 for (const auto* tsos : *collectedMaterial) {
304 newX0 += tsos->materialEffectsOnTrack() ? tsos->materialEffectsOnTrack()->thicknessInX0() : 0;
305 delete tsos;
306 }
307 ATH_MSG_VERBOSE("execute() newX0 = " << newX0);
308 }
309 }
310
311
312 for (size_t lay = 1; lay < m_cylinders + 1; ++lay) {
313 if (!m_onion) newX0 = 0;
314
315 if (m_onion) {
316 // safety check
317 if (!lastParameters) {
318 ATH_MSG_WARNING("execute() Layer " << lay << ": start parameters for cylinder NOT found - skip event !");
319 break;
320 }
321 ATH_MSG_VERBOSE("execute() Layer " << lay << ": start parameters for cylinder found: " << *lastParameters);
322 }
323
324 // trying to extrapolate to cylinder barrel
325 newParameters.reset();
327 newParameters = m_extrapolator->extrapolate(
328 ctx,
329 m_onion ? *lastParameters : startParameters,
330 *(m_theCylinders->at(lay)),
332 true,
333 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
334 } else { // material collection validation
335 // get the vector of TrackStateOnSurfaces back
336 const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
337 m_extrapolator->extrapolateM(ctx,
338 m_onion ? *lastParameters : startParameters,
339 *(m_theCylinders->at(lay)),
341 true,
342 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
343
344 // get the last one and clone it
345 if (collectedMaterial && !collectedMaterial->empty()) {
346 // get the last track state on surface & clone the destination parameters
347 const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
348 newParameters.reset(destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr);
349 if (m_onion) m_collectedLayerForward += collectedMaterial->size();
350 else m_collectedLayerForward = collectedMaterial->size(); // TODO: shouldn't there be something else here?
351 // delete the layers / cleanup
352 for (const auto* tsos : *collectedMaterial) {
353 newX0 += tsos->materialEffectsOnTrack() ? tsos->materialEffectsOnTrack()->thicknessInX0() : 0;
354 delete tsos;
355 }
356 ATH_MSG_VERBOSE("execute() newX0 = " << newX0);
357 }
358 }
359
360 // no intersection with cylinder barrel, now trying disc endcaps
361 if (!newParameters) {
363 newParameters = m_extrapolator->extrapolate(
364 ctx,
365 m_onion ? *lastParameters : startParameters,
366 (m_parameterEta[0] < 0) ? *(m_theDiscs1->at(lay))
367 : *(m_theDiscs2->at(lay)),
369 true,
370 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
371 } else { // material collection validation
372 // get the vector of TrackStateOnSurfaces back
373 const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
374 m_extrapolator->extrapolateM(ctx,
375 m_onion ? *lastParameters : startParameters,
376 (m_parameterEta[0] < 0) ? *(m_theDiscs1->at(lay)) : *(m_theDiscs2->at(lay)),
378 true,
379 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
380
381 // get the last one and clone it
382 if (collectedMaterial && !collectedMaterial->empty()) {
383 // get the last track state on surface & clone the destination parameters
384 const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
385 newParameters.reset(
386 destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr);
387 if (m_onion) m_collectedLayerForward += collectedMaterial->size();
388 else m_collectedLayerForward = collectedMaterial->size(); // TODO: shouldn't there be something else here?
389 // delete the layers / cleanup
390 for (const auto* tsos : *collectedMaterial) {
391 newX0 += tsos->materialEffectsOnTrack() ? tsos->materialEffectsOnTrack()->thicknessInX0() : 0;
392 delete tsos;
393 }
394 ATH_MSG_VERBOSE("execute() newX0 = " << newX0);
395 }
396 }
397 }
398
399 // still no intersection
400 if (!newParameters) {
401 ATH_MSG_WARNING("execute() Layer " << lay << " intersection did not work !");
402 } else if (m_highestVolume && newParameters && !(m_highestVolume->inside(newParameters->position()))) {
403 ATH_MSG_WARNING("execute() Layer " << lay << " intersection is outside the known world !");
404 } else {
405 // get the current surface intersection position
406 const Amg::Vector3D& newPosition = newParameters->position();
407 ATH_MSG_VERBOSE("execute() Track Parameters at layer " << lay << ": " << *newParameters);
409 "execute() Track Parameters at layer " << lay << ": [r,z] = [ " << newPosition.perp() << ", " <<
410 newPosition.z());
411
412 // record the surface parameters
414 ++m_entries;
415 m_parameterPhi[m_entries] = newParameters->parameters()[Trk::phi];
416 m_parameterEta[m_entries] = newParameters->momentum().eta();
417 m_parameterTheta[m_entries] = newParameters->parameters()[Trk::theta];
418 m_parameterP[m_entries] = newParameters->momentum().mag();
419 m_parameterX0[m_entries] = (float) newX0;
420 ATH_MSG_DEBUG("execute() Layer " << lay << ": cumulated X0 = " << m_parameterX0[m_entries]);
421
422 // get the current energy and calculate energy loss
425 ATH_MSG_DEBUG("execute() Layer " << lay << ": cumulated Energy Loss = " << m_energyLoss[m_entries]);
426
427 // record the current layer ID
428 m_layer[m_entries] = lay;
429 // record the current position
430 m_radius[m_entries] = newPosition.perp();
431 m_positionX[m_entries] = newPosition.x();
432 m_positionY[m_entries] = newPosition.y();
433 m_positionZ[m_entries] = newPosition.z();
434 }
435 lastParameters = std::move(newParameters);
436 }
437
438
440 ++m_events;
441 // increase m_entries once more before the fill (to account for the "start layer" at index 0 with initial track
442 // parameters)
443 ++m_entries;
444
445 // fill the event tree
447
448 // memory cleanup
449 ATH_MSG_DEBUG("execute() deleting DataVector parameters ... ");
450
451 return StatusCode::SUCCESS;
452}
453
454//============================================================================================
456 double x, double y, double z, double phi, double theta, double alphaZ) {
457 if (phi != 0. && theta != 0.) {
458 // create the Start Surface
459 Amg::Vector3D surfacePosition(x, y, z);
460 // z direction
461 Amg::Vector3D surfaceZdirection(cos(phi) * sin(theta),
462 sin(phi) * sin(theta),
463 cos(theta));
464 // the global z axis
465 Amg::Vector3D zAxis(0., 0., 1.);
466 // the y direction
467 Amg::Vector3D surfaceYdirection(zAxis.cross(surfaceZdirection));
468 // the x direction
469 Amg::Vector3D surfaceXdirection(surfaceYdirection.cross(surfaceZdirection));
470 // the rotation
471 Amg::RotationMatrix3D surfaceRotation;
472 surfaceRotation.col(0) = surfaceXdirection;
473 surfaceRotation.col(1) = surfaceYdirection;
474 surfaceRotation.col(2) = surfaceZdirection;
475 // return it
476 if (alphaZ == 0.) {
477 return std::make_unique<Amg::Transform3D>(surfaceRotation, surfacePosition);
478 }
479 Amg::Transform3D nominalTransform(surfaceRotation, surfacePosition);
480 return std::make_unique<Amg::Transform3D>(nominalTransform * Amg::AngleAxis3D(alphaZ, zAxis));
481 }
482
483 return std::make_unique<Amg::Transform3D>(Amg::Translation3D(x, y, z));
484}
#define M_PI
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
double charge(const T &p)
Definition AtlasPID.h:1003
#define TRKEXALGS_MAXPARAMETERS
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Derived DataVector<T>.
Definition DataVector.h:795
Class for a CylinderSurface in the ATLAS detector.
Bounds for a cylindrical Volume, the decomposeToSurfaces method creates a vector of up to 6 surfaces:
Class for a DiscSurface in the ATLAS detector.
Definition DiscSurface.h:54
static std::unique_ptr< Amg::Transform3D > createTransform(double x, double y, double z, double phi=0., double theta=0., double alphaZ=0.)
private helper method to create a Transform
ToolHandle< IExtrapolator > m_extrapolator
The Extrapolator to be retrieved.
float m_avgRecordedLayers
average recorded layers per event
int m_pdg
PDG code corresponding to m_particleType.
float m_cylinderZ[TRKEXALGS_MAXPARAMETERS]
length of cylinder layers (for ROOT tree)
float m_parameterX0[TRKEXALGS_MAXPARAMETERS]
thickness in X0
size_t m_collectedLayerForward
collected material layers forward
size_t m_entries
effective number of used entries (recorded layers) in this event
DataVector< const Trk::CylinderSurface > * m_theCylinders
float m_positionZ[TRKEXALGS_MAXPARAMETERS]
position Z
int m_totalRecordedLayers
total number of recorded layers
const TrackingVolume * m_highestVolume
the highest volume
size_t m_layer[TRKEXALGS_MAXPARAMETERS]
layer id
float m_positionX[TRKEXALGS_MAXPARAMETERS]
position X
float m_positionY[TRKEXALGS_MAXPARAMETERS]
position Y
float m_energyLoss[TRKEXALGS_MAXPARAMETERS]
energy loss
StatusCode execute(const EventContext &ctx)
standard Athena-Algorithm method
float m_cylinderR[TRKEXALGS_MAXPARAMETERS]
radius of cylinder layers (for ROOT tree)
DataVector< const Trk::DiscSurface > * m_theDiscs1
size_t m_collectedLayerBack
collected material layers backward
float m_parameterQoverP[TRKEXALGS_MAXPARAMETERS]
qOverP
StatusCode initialize()
standard Athena-Algorithm method
float m_radius[TRKEXALGS_MAXPARAMETERS]
position radius
EnergyLossExtrapolationValidation(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
StatusCode finalize()
standard Athena-Algorithm method
DataVector< const Trk::DiscSurface > * m_theDiscs2
double eta() const
Access method for pseudorapidity - from momentum.
const Amg::Vector3D & momentum() const
Access method for the momentum.
virtual ParametersBase< DIM, T > * clone() const override=0
clone method for polymorphic deep copy
Class describing the Line to which the Perigee refers to.
represents the track state (measurement, material, fit parameters and quality) at a surface.
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
The TrackingGeometry class is the owner of the constructed TrackingVolumes.
const TrackingVolume * highestTrackingVolume() const
return the world
Eigen::AngleAxisd AngleAxis3D
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
@ alongMomentum
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ x
Definition ParamDefs.h:55
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ theta
Definition ParamDefs.h:66
@ y
Definition ParamDefs.h:56
@ phi
Definition ParamDefs.h:75
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.