Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 
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;
97  delete m_validationRunTree; m_validationRunTree = 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;
103  delete m_validationRunTree; m_validationRunTree = 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)
137  m_theCylinders = new DataVector<const Trk::CylinderSurface>();
138  m_theDiscs1 = new DataVector<const Trk::DiscSurface>();
139  m_theDiscs2 = new DataVector<const Trk::DiscSurface>();
140  for (size_t lay=0; lay<m_cylinders+1; ++lay) {
141  m_theCylinders->push_back(new Trk::CylinderSurface(Amg::Transform3D(), m_cylinderR[lay], m_cylinderZ[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 << ")" );
171  if (m_materialCollectionValidation){
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;
180  if (m_validationRunTree)
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);
228  m_parameterEta[0] = m_minEta + m_flatDist->shoot()*(m_maxEta-m_minEta);
229  m_parameterTheta[0] = 2.*std::atan(std::exp(-m_parameterEta[0]));
230 
231  double charge = -1.;
232  m_parameterP[0] = m_momentum;
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]);
236  m_parameterQoverP[0] = charge/m_parameterP[0];
237 
238  double mass = Trk::ParticleMasses::mass[m_particleType];
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],
248  m_parameterPhi[0],
249  m_parameterTheta[0],
250  m_parameterQoverP[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 
262  if (!m_materialCollectionValidation) {
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;
315  if (!m_materialCollectionValidation) {
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 
357  if (!m_materialCollectionValidation) {
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
415  ++m_triesForward;
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
425  m_energy[m_entries] = sqrt(m_parameterP[m_entries]*m_parameterP[m_entries] + mass*mass);
426  m_energyLoss[m_entries] = energy1-m_energy[m_entries];
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 
444  m_totalRecordedLayers += m_entries;
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
450  if (m_validationTree)
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 
Trk::EnergyLossExtrapolationValidation::initialize
StatusCode initialize()
standard Athena-Algorithm method
Definition: EnergyLossExtrapolationValidation.cxx:50
Trk::y
@ y
Definition: ParamDefs.h:56
Trk::TrackStateOnSurface::trackParameters
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
Trk::z
@ z
global position (cartesian)
Definition: ParamDefs.h:57
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PlotCalibFromCool.zAxis
zAxis
Definition: PlotCalibFromCool.py:76
Base_Fragment.mass
mass
Definition: Sherpa_i/share/common/Base_Fragment.py:59
Trk::PerigeeSurface
Definition: PerigeeSurface.h:43
Trk::ParametersBase::position
const Amg::Vector3D & position() const
Access method for the position.
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
M_PI
#define M_PI
Definition: ActiveFraction.h:11
Trk::EnergyLossExtrapolationValidation::createTransform
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
Definition: EnergyLossExtrapolationValidation.cxx:460
IExtrapolator.h
Trk::alongMomentum
@ alongMomentum
Definition: PropDirection.h:20
Trk::DiscSurface
Definition: DiscSurface.h:54
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:25
Trk::EnergyLossExtrapolationValidation::finalize
StatusCode finalize()
standard Athena-Algorithm method
Definition: EnergyLossExtrapolationValidation.cxx:162
CylinderVolumeBounds.h
Trk::TrackingGeometry::highestTrackingVolume
const TrackingVolume * highestTrackingVolume() const
return the world
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Trk::theta
@ theta
Definition: ParamDefs.h:66
Trk::TrackingGeometry
Definition: TrackingGeometry.h:67
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Trk::CylinderSurface
Definition: CylinderSurface.h:55
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
CylinderSurface.h
Trk::ParametersBase
Definition: ParametersBase.h:55
TRKEXALGS_MAXPARAMETERS
#define TRKEXALGS_MAXPARAMETERS
Definition: EnergyLossExtrapolationValidation.h:29
DataVector< const Trk::CylinderSurface >
ParticleHypothesis.h
AthAlgorithm
Definition: AthAlgorithm.h:47
Trk::ParticleMasses::mass
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:53
Trk::CylinderVolumeBounds
Definition: CylinderVolumeBounds.h:70
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
Trk::EnergyLossExtrapolationValidation::~EnergyLossExtrapolationValidation
~EnergyLossExtrapolationValidation()
Default Destructor.
Definition: EnergyLossExtrapolationValidation.cxx:35
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
createCoolChannelIdFile.par
par
Definition: createCoolChannelIdFile.py:29
charge
double charge(const T &p)
Definition: AtlasPID.h:931
EnergyLossExtrapolationValidation.h
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
Trk::ParametersBase::momentum
const Amg::Vector3D & momentum() const
Access method for the momentum.
TrackingVolume.h
Trk::EnergyLossExtrapolationValidation::EnergyLossExtrapolationValidation
EnergyLossExtrapolationValidation(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
Definition: EnergyLossExtrapolationValidation.cxx:30
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Amg::RotationMatrix3D
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
Definition: GeoPrimitives.h:49
PlaneSurface.h
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
DiscSurface.h
TrackingGeometry.h
Amg::AngleAxis3D
Eigen::AngleAxisd AngleAxis3D
Definition: GeoPrimitives.h:45
Trk::phi
@ phi
Definition: ParamDefs.h:75
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
Trk::x
@ x
Definition: ParamDefs.h:55
TrackStateOnSurface.h
Trk::EnergyLossExtrapolationValidation::execute
StatusCode execute()
standard Athena-Algorithm method
Definition: EnergyLossExtrapolationValidation.cxx:189
Trk::ParametersBase::clone
virtual ParametersBase< DIM, T > * clone() const override=0
clone method for polymorphic deep copy
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65