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
189StatusCode Trk::EnergyLossExtrapolationValidation::execute(const EventContext& ctx)
190{
191 // get the overall dimensions
192 if (!m_highestVolume){
193 // get TrackingGeometry and highest volume
194 const Trk::TrackingGeometry* trackingGeometry = m_extrapolator->trackingGeometry();
195 m_highestVolume = trackingGeometry ? trackingGeometry->highestTrackingVolume() : nullptr;
196 const Trk::CylinderVolumeBounds* cylBounds = m_highestVolume ?
197 dynamic_cast<const Trk::CylinderVolumeBounds*>(&(m_highestVolume->volumeBounds())) : nullptr;
198 // bail out
199 if (!cylBounds){
200 ATH_MSG_WARNING( "execute() No highest TrackingVolume / no VolumeBounds ... pretty useless!" );
201 return StatusCode::SUCCESS;
202 }
203 }
204
205
206 m_entries = 0;
207 for (size_t par=0; par<TRKEXALGS_MAXPARAMETERS; ++par) {
208 // -----------> start parameters
209
210 m_parameterP[par] = 0.;
211 m_energy[par] = 0.;
212 m_energyLoss[par] = 0.;
213 m_parameterX0[par] = 0.;
214 m_radius[par] = 0.;
215 m_positionX[par] = 0.;
216 m_positionY[par] = 0.;
217 m_positionZ[par] = 0.;
218 m_parameterEta[par] = 0.;
219 m_parameterPhi[par] = 0.;
220 m_parameterTheta[par] = 0.;
221 m_layer[par] = 0;
222 }
223
224 // the local start parameters
225 // are adopted for planar and straight line surfaces
226 m_parameterPhi[0] = M_PI * (2 * m_flatDist->shoot() - 1);
228 m_parameterTheta[0] = 2.*std::atan(std::exp(-m_parameterEta[0]));
229
230 double charge = -1.;
232 // convert transverse momentum (pt) to momentum (p) if flag is set: p = pt/sin(theta)
233 if (m_usePt)
234 m_parameterP[0] /= std::sin(m_parameterTheta[0]);
236
238
239 double energy1 = sqrt(m_parameterP[0]*m_parameterP[0] + mass*mass);
240
241 double newX0 = 0;
242
243 const Trk::PerigeeSurface perigeeSurface;
244 // the initial perigee with random numbers
245 Trk::Perigee startParameters(0, // m_parameterLoc1[0],
246 0, // m_parameterLoc2[0],
250 perigeeSurface);
251
252 ATH_MSG_VERBOSE( "execute() Start Parameters : " << startParameters );
253 ATH_MSG_DEBUG( "execute() Start Parameters : [phi,eta] = [ " << startParameters.momentum().phi() << ", " << startParameters.eta() << " ]" );
254
255 // --------------- propagate to find an intersection ---------------------
256
257 // fill the TrackParameters vector with extrapolation from startParameters to dummy cylinder surface
258 const Trk::TrackParameters* lastParameters = nullptr;
259 const Trk::TrackParameters* newParameters = nullptr;
260
262
263 lastParameters = m_extrapolator->extrapolate(
264 ctx,
265 startParameters,
266 *(m_theCylinders->at(0)),
268 true,
269 static_cast<Trk::ParticleHypothesis>(m_particleType.value())).release();
270
271 } else { // material collection validation
272
273 // get the vector of TrackStateOnSurfaces back
274 const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
275 m_extrapolator->extrapolateM(
276 ctx,
277 startParameters,
278 *(m_theCylinders->at(0)),
280 true,
281 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
282
283 // get the last one and clone it
284 if (collectedMaterial && !collectedMaterial->empty()) {
285 // get the last track state on surface & clone the destination parameters
286 const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
287 lastParameters = destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr;
288 m_collectedLayerForward += collectedMaterial->size();
289 // delete the layers / cleanup
290 for (const auto* tsos : *collectedMaterial) {
291 newX0 += tsos->materialEffectsOnTrack() ? tsos->materialEffectsOnTrack()->thicknessInX0() : 0;
292 delete tsos;
293 }
294 ATH_MSG_VERBOSE( "execute() newX0 = " << newX0 );
295 }
296 }
297
298
299 for (size_t lay = 1; lay<m_cylinders+1; ++lay) {
300
301 if (!m_onion) newX0 = 0;
302
303 if (m_onion) {
304 // safety check
305 if (!lastParameters) {
306 ATH_MSG_WARNING( "execute() Layer " << lay << ": start parameters for cylinder NOT found - skip event !" );
307 break;
308 }
309 ATH_MSG_VERBOSE( "execute() Layer " << lay << ": start parameters for cylinder found: " << *lastParameters );
310 }
311
312 // trying to extrapolate to cylinder barrel
313 newParameters = nullptr;
315
316 newParameters = m_extrapolator->extrapolate(
317 ctx,
318 m_onion ? *lastParameters : startParameters,
319 *(m_theCylinders->at(lay)),
321 true,
322 static_cast<Trk::ParticleHypothesis>(m_particleType.value())).release();
323
324 } else { // material collection validation
325
326 // get the vector of TrackStateOnSurfaces back
327 const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
328 m_extrapolator->extrapolateM(ctx,
329 m_onion ? *lastParameters : startParameters,
330 *(m_theCylinders->at(lay)),
332 true,
333 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
334
335 // get the last one and clone it
336 if (collectedMaterial && !collectedMaterial->empty()){
337 // get the last track state on surface & clone the destination parameters
338 const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
339 newParameters = destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr;
340 if (m_onion)
341 m_collectedLayerForward += collectedMaterial->size();
342 else
343 m_collectedLayerForward = collectedMaterial->size(); // TODO: shouldn't there be something else here?
344 // delete the layers / cleanup
345 for (const auto* tsos : *collectedMaterial) {
346 newX0 += tsos->materialEffectsOnTrack() ? tsos->materialEffectsOnTrack()->thicknessInX0() : 0;
347 delete tsos;
348 }
349 ATH_MSG_VERBOSE( "execute() newX0 = " << newX0 );
350 }
351 }
352
353 // no intersection with cylinder barrel, now trying disc endcaps
354 if (!newParameters) {
355
357
358 newParameters = m_extrapolator->extrapolate(
359 ctx,
360 m_onion ? *lastParameters : startParameters,
361 (m_parameterEta[0] < 0) ? *(m_theDiscs1->at(lay))
362 : *(m_theDiscs2->at(lay)),
364 true,
365 static_cast<Trk::ParticleHypothesis>(m_particleType.value())).release();
366
367 } else { // material collection validation
368
369 // get the vector of TrackStateOnSurfaces back
370 const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
371 m_extrapolator->extrapolateM(ctx,
372 m_onion ? *lastParameters : startParameters,
373 (m_parameterEta[0] < 0) ? *(m_theDiscs1->at(lay)) : *(m_theDiscs2->at(lay)),
375 true,
376 static_cast<Trk::ParticleHypothesis>(m_particleType.value()));
377
378 // get the last one and clone it
379 if (collectedMaterial && !collectedMaterial->empty()){
380 // get the last track state on surface & clone the destination parameters
381 const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
382 newParameters = destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr;
383 if (m_onion)
384 m_collectedLayerForward += collectedMaterial->size();
385 else
386 m_collectedLayerForward = collectedMaterial->size(); // TODO: shouldn't there be something else here?
387 // delete the layers / cleanup
388 for (const auto* tsos : *collectedMaterial) {
389 newX0 += tsos->materialEffectsOnTrack() ? tsos->materialEffectsOnTrack()->thicknessInX0() : 0;
390 delete tsos;
391 }
392 ATH_MSG_VERBOSE( "execute() newX0 = " << newX0 );
393 }
394 }
395 }
396
397 // still no intersection
398 if (!newParameters) {
399 ATH_MSG_WARNING( "execute() Layer " << lay << " intersection did not work !" );
400 }
401
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 }
405
406 else {
407
408 // get the current surface intersection position
409 const Amg::Vector3D& newPosition = newParameters->position();
410 ATH_MSG_VERBOSE( "execute() Track Parameters at layer " << lay << ": " << *newParameters );
411 ATH_MSG_DEBUG( "execute() Track Parameters at layer " << lay << ": [r,z] = [ " << newPosition.perp() << ", " << newPosition.z() );
412
413 // record the surface parameters
415 ++m_entries;
416 m_parameterPhi[m_entries] = newParameters->parameters()[Trk::phi];
417 m_parameterEta[m_entries] = newParameters->momentum().eta();
418 m_parameterTheta[m_entries] = newParameters->parameters()[Trk::theta];
419 m_parameterP[m_entries] = newParameters->momentum().mag();
420 m_parameterX0[m_entries] = (float)newX0;
421 ATH_MSG_DEBUG( "execute() Layer " << lay << ": cumulated X0 = " << m_parameterX0[m_entries] );
422
423 // get the current energy and calculate energy loss
426 ATH_MSG_DEBUG( "execute() Layer " << lay << ": cumulated Energy Loss = " << m_energyLoss[m_entries] );
427
428 // record the current layer ID
429 m_layer[m_entries] = lay;
430 // record the current position
431 m_radius[m_entries] = newPosition.perp();
432 m_positionX[m_entries] = newPosition.x();
433 m_positionY[m_entries] = newPosition.y();
434 m_positionZ[m_entries] = newPosition.z();
435
436 }
437
438 lastParameters = newParameters;
439
440 }
441
442
444 ++m_events;
445 // increase m_entries once more before the fill (to account for the "start layer" at index 0 with initial track parameters)
446 ++m_entries;
447
448 // fill the event tree
450 m_validationTree->Fill();
451
452 // memory cleanup
453 ATH_MSG_DEBUG( "execute() deleting DataVector parameters ... " );
454
455 return StatusCode::SUCCESS;
456}
457
458//============================================================================================
460 double x, double y, double z, double phi, double theta, double alphaZ)
461{
462
463 if (phi!=0. && theta != 0.){
464 // create the Start Surface
465 Amg::Vector3D surfacePosition(x,y,z);
466 // z direction
467 Amg::Vector3D surfaceZdirection(cos(phi)*sin(theta),
468 sin(phi)*sin(theta),
469 cos(theta));
470 // the global z axis
471 Amg::Vector3D zAxis(0.,0.,1.);
472 // the y direction
473 Amg::Vector3D surfaceYdirection(zAxis.cross(surfaceZdirection));
474 // the x direction
475 Amg::Vector3D surfaceXdirection(surfaceYdirection.cross(surfaceZdirection));
476 // the rotation
477 Amg::RotationMatrix3D surfaceRotation;
478 surfaceRotation.col(0) = surfaceXdirection;
479 surfaceRotation.col(1) = surfaceYdirection;
480 surfaceRotation.col(2) = surfaceZdirection;
481 // return it
482 if (alphaZ==0.){
483 return std::make_unique<Amg::Transform3D>(surfaceRotation, surfacePosition);
484 }
485 Amg::Transform3D nominalTransform(surfaceRotation, surfacePosition);
486 return std::make_unique<Amg::Transform3D>(nominalTransform*Amg::AngleAxis3D(alphaZ,zAxis));
487
488 }
489
490 return std::make_unique<Amg::Transform3D>(Amg::Translation3D(x,y,z));
491}
492
#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.
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
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