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