ATLAS Offline Software
EnergyLossExtrapolationValidation.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // EnergyLossValidation.cxx, (c) ATLAS Detector software
8 
9 // Tracking
20 // Validation mode - TTree includes
21 #include "TTree.h"
22 #include "GaudiKernel/ITHistSvc.h"
23 #include "GaudiKernel/MsgStream.h"
24 #include "GaudiKernel/SystemOfUnits.h"
25 // Framework
27 
28 
29 //================ Constructor =================================================
30 
32 : AthAlgorithm(name,pSvcLocator),
33  m_highestVolume(nullptr),
34  m_extrapolator("Trk::Extrapolator/AtlasExtrapolator"),
35  m_gaussDist(nullptr),
36  m_flatDist(nullptr),
37  m_materialCollectionValidation(false),
38  m_validationTree(nullptr),
39  m_validationRunTree(nullptr),
40  m_validationTreeFolder("/val/EventTreeTG"),
41  m_validationTreeName("EventTreeTG"),
42  m_validationTreeDescription("Event output of the EnergyLossExtrapolationValidation Algorithm"),
43  m_validationRunTreeFolder("/val/RunTreeTG"),
44  m_validationRunTreeName("RunTreeTG"),
45  m_validationRunTreeDescription("Run stats of the EnergyLossExtrapolationValidation Algorithm"),
46  m_maximumR(0.),
47  m_maximumZ(0.),
48  m_cylinders(6),
49  m_onion(true),
50  m_momentum(10.*Gaudi::Units::GeV),
51  m_usePt(true),
52  m_minEta(-3.),
53  m_maxEta(3.),
54  m_events(0),
55  m_totalRecordedLayers(0),
56  m_avgRecordedLayers(0.),
57  m_pdg(0),
58  m_particleType(2),
59  m_entries(0),
60  m_energy{},
61  m_energyLoss{},
62  m_parameterX0{},
63  m_radius{},
64  m_positionX{},
65  m_positionY{},
66  m_positionZ{},
67  m_parameterPhi{},
68  m_parameterEta{},
69  m_parameterTheta{},
70  m_parameterQoverP{},
71  m_parameterP{},
72  m_layer{},
73  m_triesForward(0),
74  m_breaksForward(0),
75  m_triesBack(0),
76  m_breaksBack(0),
77  m_collectedLayerForward(0),
78  m_collectedLayerBack(0),
79  m_cylinderR{},
80  m_cylinderZ{},
81  m_theCylinders(nullptr),
82  m_theDiscs1(nullptr),
83  m_theDiscs2(nullptr)
84 {
85  // used algorithms and alg tools
86  declareProperty("Extrapolator" , m_extrapolator);
87  declareProperty("UseMaterialCollection" , m_materialCollectionValidation);
88  // TTree handling
89  declareProperty("ValidationTreeName" , m_validationTreeName);
90  declareProperty("ValidationRunTreeName" , m_validationRunTreeName);
91  declareProperty("ValidationTreeDescription" , m_validationTreeDescription);
92  declareProperty("ValidationRunTreeDescription" , m_validationRunTreeDescription);
93  declareProperty("ValidationTreeFolder" , m_validationTreeFolder);
94  declareProperty("ValidationRunTreeFolder" , m_validationRunTreeFolder);
95 
96  declareProperty("StartPerigeeMinEta" , m_minEta);
97  declareProperty("StartPerigeeMaxEta" , m_maxEta);
98  declareProperty("StartPerigeeUsePt" , m_usePt);
99  declareProperty("StartPerigeeMomentum" , m_momentum);
100 
101  declareProperty("ValidationCylinders" , m_cylinders);
102  declareProperty("ValidationCylinderR" , m_cylinderVR);
103  declareProperty("ValidationCylinderZ" , m_cylinderVZ);
104  declareProperty("StrictOnionMode" , m_onion);
105 
106  declareProperty("ParticleType" , m_particleType);
107 
108 }
109 
110 //================ Destructor =================================================
111 
113 {
114  // clear random number generators
115  delete m_gaussDist;
116  delete m_flatDist;
117  // clear data vectors
118  delete m_theCylinders;
119  delete m_theDiscs1;
120  delete m_theDiscs2;
121 
122 }
123 
124 
125 //================ Initialization =================================================
126 
128 {
129  // Code entered here will be executed once at program start.
130  ATH_MSG_INFO( "initialize()" );
131  ATH_MSG_DEBUG( "initialize() m_materialCollectionValidation = " << m_materialCollectionValidation );
132 
133  // Get Extrapolator from ToolService
134  if (m_extrapolator.retrieve().isFailure()) {
135  ATH_MSG_FATAL( "initialize() Could not retrieve Tool " << m_extrapolator << ". Exiting." );
136  return StatusCode::FAILURE;
137  }
138 
139  // create the new Trees
140  m_validationTree = new TTree(m_validationTreeName.c_str(), m_validationTreeDescription.c_str());
141  m_validationRunTree = new TTree(m_validationRunTreeName.c_str(), m_validationRunTreeDescription.c_str());
142 
143  // the branches for the parameters
144  m_validationTree->Branch("Entries", &m_entries, "entries/i");
145  m_validationTree->Branch("Energy", m_energy, "energy[entries]/F");
146  m_validationTree->Branch("EnergyLoss", m_energyLoss, "eLoss[entries]/F");
147  m_validationTree->Branch("tInX0", m_parameterX0, "tinX0[entries]/F");
148  m_validationTree->Branch("Radius", m_radius, "radius[entries]/F");
149  m_validationTree->Branch("PosX", m_positionX, "posX[entries]/F");
150  m_validationTree->Branch("PosY", m_positionY, "posY[entries]/F");
151  m_validationTree->Branch("PosZ", m_positionZ, "posZ[entries]/F");
152  m_validationTree->Branch("Eta", m_parameterEta, "eta[entries]/F");
153  m_validationTree->Branch("Phi", m_parameterPhi, "phi[entries]/F");
154  m_validationTree->Branch("Layer", m_layer, "layer[entries]/i");
155 
156  m_validationRunTree->Branch("Layers", &m_cylinders, "layers/i");
157  m_validationRunTree->Branch("CylR", m_cylinderR, "cylR[layers]/F");
158  m_validationRunTree->Branch("CylZ", m_cylinderZ, "cylZ[layers]/F");
159  m_validationRunTree->Branch("Momentum",&m_momentum, "momentum/F");
160  m_validationRunTree->Branch("UsePt", &m_usePt, "usePt/O");
161  m_validationRunTree->Branch("MinEta", &m_minEta, "minEta/F");
162  m_validationRunTree->Branch("MaxEta", &m_maxEta, "maxEta/F");
163  m_validationRunTree->Branch("PDG", &m_pdg, "pdg/I");
164  m_validationRunTree->Branch("Events", &m_events, "events/i");
165  m_validationRunTree->Branch("AvgRecordedLayers", &m_avgRecordedLayers, "avgRecLayers/F");
166 
167  // now register the Trees
168  ITHistSvc* tHistSvc = nullptr;
169  if (service("THistSvc",tHistSvc).isFailure()){
170  ATH_MSG_ERROR( "initialize() Could not find Hist Service -> Switching ValidationMode Off !" );
171  delete m_validationTree; m_validationTree = nullptr;
172  delete m_validationRunTree; m_validationRunTree = nullptr;
173  }
174  if ((tHistSvc->regTree(m_validationTreeFolder, m_validationTree)).isFailure()
175  || (tHistSvc->regTree(m_validationRunTreeFolder, m_validationRunTree)).isFailure() ) {
176  ATH_MSG_ERROR( "initialize() Could not register the validation Trees -> Switching ValidationMode Off !" );
177  delete m_validationTree; m_validationTree = nullptr;
178  delete m_validationRunTree; m_validationRunTree = nullptr;
179  }
180 
181  // initialize the random number generators
182  ATH_MSG_INFO( "initialize() RandomService = " << randSvc()->name() );
183  m_gaussDist = new Rndm::Numbers(randSvc(), Rndm::Gauss(0.,1.));
184  m_flatDist = new Rndm::Numbers(randSvc(), Rndm::Flat(0.,1.));
185 
186  // initialize cylinders if they are not set in jobOptions
187  double const s_cylInitR[TRKEXALGS_MAXPARAMETERS] = { 0.5, 34.5, 250, 550, 1120, 4250, 13000, 0, 0, 0 };
188  double const s_cylInitZ[TRKEXALGS_MAXPARAMETERS] = { 100, 10e6, 680, 2820, 3120, 6500, 22000, 0, 0, 0 };
189 
190  // output of vector from jobOptions
191  ATH_MSG_INFO( "initialize() cylinder dimensions vector from jobOptions :" );
192  for (size_t lay=0; lay<m_cylinders+1; ++lay) {
193  ATH_MSG_INFO( "initialize() m_cylinderVR[" << lay << "] = " << m_cylinderVR[lay] << "\t ... m_cylinderVZ[" << lay << "] = " << m_cylinderVZ[lay] );
194  }
195  // transform vector (from jobOptions) into array (for ROOT tree)
196  ATH_MSG_INFO( "initialize() cylinder dimensions array for algorithm and ROOT tree :" );
197  for (size_t lay=0; lay<m_cylinders+1; ++lay) {
198  m_cylinderR[lay] = m_cylinderVR[lay] > 0 ? m_cylinderVR[lay] : s_cylInitR[lay];
199  m_cylinderZ[lay] = m_cylinderVZ[lay] > 0 ? m_cylinderVZ[lay] : s_cylInitZ[lay];
200  // in "strict onion mode", constrain m_cylinders if the values don't make sense
205  if (m_onion && lay>0 && (m_cylinderR[lay] < m_cylinderR[lay-1])) {
206  ATH_MSG_WARNING( "initialize() layer " << lay << "dimensions are smaller than those of layer " << lay-1 << " - constraining m_cylinders to " << lay-1 );
207  ATH_MSG_INFO( "initialize() cutting off here :" );
208  ATH_MSG_INFO( "initialize() m_cylinderR[" << lay << "] = " << m_cylinderR[lay] << "\t ... m_cylinderZ[" << lay << "] = " << m_cylinderZ[lay] );
209  m_cylinders = lay-1;
210  break;
211  }
212  ATH_MSG_INFO( "initialize() m_cylinderR[" << lay << "] = " << m_cylinderR[lay] << "\t ... m_cylinderZ[" << lay << "] = " << m_cylinderZ[lay] );
213  }
214 
215  // fill data vector with cylinders once (in order not to create them every time)
216  m_theCylinders = new DataVector<const Trk::CylinderSurface>();
217  m_theDiscs1 = new DataVector<const Trk::DiscSurface>();
218  m_theDiscs2 = new DataVector<const Trk::DiscSurface>();
219  for (size_t lay=0; lay<m_cylinders+1; ++lay) {
220  m_theCylinders->push_back(new Trk::CylinderSurface(Amg::Transform3D(), m_cylinderR[lay], m_cylinderZ[lay]));
221  ATH_MSG_INFO( "initialize() Cylinder " << lay << ": " << *m_theCylinders->at(lay) );
222  m_theDiscs1->push_back(new Trk::DiscSurface(*createTransform(0.,0.,-m_cylinderZ[lay]), 0., m_cylinderR[lay]));
223  ATH_MSG_INFO( "initialize() Disc1 " << lay << ": " << *m_theDiscs1->at(lay) );
224  m_theDiscs2->push_back(new Trk::DiscSurface(*createTransform(0.,0., m_cylinderZ[lay]), 0., m_cylinderR[lay]));
225  ATH_MSG_INFO( "initialize() Disc2 " << lay << ": " << *m_theDiscs2->at(lay) );
226  }
227 
228  if (m_particleType==0) m_pdg = 999; // geantino
229  else if (m_particleType==1) m_pdg = 11; // electron
230  else if (m_particleType==2) m_pdg = 13; // muon-
231  else if (m_particleType==3) m_pdg = 211; // pion+
232  else if (m_particleType==4) m_pdg = 321; // kaon+
233  ATH_MSG_INFO( "initialize() ParticleType = " << m_particleType << " ... PDG = " << m_pdg );
234 
235  ATH_MSG_INFO( "initialize() successful" );
236  return StatusCode::SUCCESS;
237 }
238 
239 //================ Finalisation =================================================
240 
242 {
243  // Code entered here will be executed once at the end of the program run.
244  ATH_MSG_INFO( "finalize() ================== Output Statistics =========================" );
245  ATH_MSG_INFO( "finalize() = Navigation : " );
246  ATH_MSG_INFO( "finalize() = - breaks fwd : " << double(m_breaksForward)/double(m_triesForward)
247  << " (" << m_breaksForward << "/" << m_triesForward << ")" );
248  ATH_MSG_INFO( "finalize() = - breaks bwd : " << double(m_breaksBack)/double(m_triesBack)
249  << " (" << m_breaksBack << "/" << m_triesBack << ")" );
250  if (m_materialCollectionValidation){
251  ATH_MSG_INFO( "finalize() = Material collection : " );
252  ATH_MSG_INFO( "finalize() = - layer collected fwd : " << m_collectedLayerForward );
253  ATH_MSG_INFO( "finalize() = - layer collected bwd : " << m_collectedLayerBack );
254  }
255  ATH_MSG_INFO( "finalize() ==============================================================" );
256 
257  m_avgRecordedLayers = m_events ? (float)m_totalRecordedLayers / (float)m_events : 0;
258  ++m_cylinders;
259  if (m_validationRunTree)
260  m_validationRunTree->Fill();
261  --m_cylinders;
262 
263  return StatusCode::SUCCESS;
264 }
265 
266 //================ Execution ====================================================
267 
269 {
270  const EventContext& ctx = Gaudi::Hive::currentContext();
271  // get the overall dimensions
272  if (!m_highestVolume){
273  // get TrackingGeometry and highest volume
274  const Trk::TrackingGeometry* trackingGeometry = m_extrapolator->trackingGeometry();
275  m_highestVolume = trackingGeometry ? trackingGeometry->highestTrackingVolume() : nullptr;
276  const Trk::CylinderVolumeBounds* cylBounds = m_highestVolume ?
277  dynamic_cast<const Trk::CylinderVolumeBounds*>(&(m_highestVolume->volumeBounds())) : nullptr;
278  // bail out
279  if (!cylBounds){
280  ATH_MSG_WARNING( "execute() No highest TrackingVolume / no VolumeBounds ... pretty useless!" );
281  return StatusCode::SUCCESS;
282  }
283  // get the numbers
284  m_maximumR = cylBounds->outerRadius();
285  m_maximumZ = cylBounds->halflengthZ();
286  }
287 
288 
289  m_entries = 0;
290  for (size_t par=0; par<TRKEXALGS_MAXPARAMETERS; ++par) {
291  // -----------> start parameters
292 
293  m_parameterP[par] = 0.;
294  m_energy[par] = 0.;
295  m_energyLoss[par] = 0.;
296  m_parameterX0[par] = 0.;
297  m_radius[par] = 0.;
298  m_positionX[par] = 0.;
299  m_positionY[par] = 0.;
300  m_positionZ[par] = 0.;
301  m_parameterEta[par] = 0.;
302  m_parameterPhi[par] = 0.;
303  m_parameterTheta[par] = 0.;
304 // m_parameterQoverP[par] = 0.;
305  m_layer[par] = 0;
306  }
307 
308  // the local start parameters
309  // are adopted for planar and straight line surfaces
310  m_parameterPhi[0] = M_PI * (2 * m_flatDist->shoot() - 1);
311  m_parameterEta[0] = m_minEta + m_flatDist->shoot()*(m_maxEta-m_minEta);
312  m_parameterTheta[0] = 2.*atan(exp(-m_parameterEta[0]));
313 
314  double charge = -1.;
315  m_parameterP[0] = m_momentum;
316  // convert transverse momentum (pt) to momentum (p) if flag is set: p = pt/sin(theta)
317  if (m_usePt)
318  m_parameterP[0] /= sin(m_parameterTheta[0]);
319  m_parameterQoverP[0] = charge/m_parameterP[0];
320 
321  double mass = Trk::ParticleMasses::mass[m_particleType];
322 
323  double energy1 = sqrt(m_parameterP[0]*m_parameterP[0] + mass*mass);
324 
325  double newX0 = 0;
326 
327  const Trk::PerigeeSurface perigeeSurface;
328  // the initial perigee with random numbers
329  Trk::Perigee startParameters(0, // m_parameterLoc1[0],
330  0, // m_parameterLoc2[0],
331  m_parameterPhi[0],
332  m_parameterTheta[0],
333  m_parameterQoverP[0],
334  perigeeSurface);
335 
336  ATH_MSG_VERBOSE( "execute() Start Parameters : " << startParameters );
337  ATH_MSG_DEBUG( "execute() Start Parameters : [phi,eta] = [ " << startParameters.momentum().phi() << ", " << startParameters.eta() << " ]" );
338 
339  // --------------- propagate to find an intersection ---------------------
340 
341  // fill the TrackParameters vector with extrapolation from startParameters to dummy cylinder surface
342  const Trk::TrackParameters* lastParameters = nullptr;
343  const Trk::TrackParameters* newParameters = nullptr;
344 
345  if (!m_materialCollectionValidation) {
346 
347  lastParameters = m_extrapolator->extrapolate(
348  ctx,
349  startParameters,
350  *(m_theCylinders->at(0)),
352  true,
353  (Trk::ParticleHypothesis)m_particleType).release();
354 
355  } else { // material collection validation
356 
357  // get the vector of TrackStateOnSurfaces back
358  const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
359  m_extrapolator->extrapolateM(
360  ctx,
361  startParameters,
362  *(m_theCylinders->at(0)),
364  true,
365  (Trk::ParticleHypothesis)m_particleType);
366 
367  // get the last one and clone it
368  if (collectedMaterial && !collectedMaterial->empty()) {
369  // get the last track state on surface & clone the destination parameters
370  const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
371  lastParameters = destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr;
372  m_collectedLayerForward += collectedMaterial->size();
373  // delete the layers / cleanup
374  std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIter = collectedMaterial->begin();
375  std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIterEnd = collectedMaterial->end();
376  for ( ; tsosIter != tsosIterEnd; ++tsosIter) {
377  newX0 += (*tsosIter)->materialEffectsOnTrack() ? (*tsosIter)->materialEffectsOnTrack()->thicknessInX0() : 0;
378  delete(*tsosIter);
379  }
380  ATH_MSG_VERBOSE( "execute() newX0 = " << newX0 );
381  }
382  }
383 
384 
385  for (size_t lay = 1; lay<m_cylinders+1; ++lay) {
386 
387  if (!m_onion) newX0 = 0;
388 
389  if (m_onion) {
390  // safety check
391  if (!lastParameters) {
392  ATH_MSG_WARNING( "execute() Layer " << lay << ": start parameters for cylinder NOT found - skip event !" );
393  break;
394  }
395  ATH_MSG_VERBOSE( "execute() Layer " << lay << ": start parameters for cylinder found: " << *lastParameters );
396  }
397 
398  // trying to extrapolate to cylinder barrel
399  newParameters = nullptr;
400  if (!m_materialCollectionValidation) {
401 
402  newParameters = m_extrapolator->extrapolate(
403  ctx,
404  m_onion ? *lastParameters : startParameters,
405  *(m_theCylinders->at(lay)),
407  true,
408  (Trk::ParticleHypothesis)m_particleType).release();
409 
410  } else { // material collection validation
411 
412  // get the vector of TrackStateOnSurfaces back
413  const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
414  m_extrapolator->extrapolateM(ctx,
415  m_onion ? *lastParameters : startParameters,
416  *(m_theCylinders->at(lay)),
418  true,
419  (Trk::ParticleHypothesis)m_particleType);
420 
421  // get the last one and clone it
422  if (collectedMaterial && !collectedMaterial->empty()){
423  // get the last track state on surface & clone the destination parameters
424  const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
425  newParameters = destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr;
426  if (m_onion)
427  m_collectedLayerForward += collectedMaterial->size();
428  else
429  m_collectedLayerForward = collectedMaterial->size(); // TODO: shouldn't there be something else here?
430  // delete the layers / cleanup
431  std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIter = collectedMaterial->begin();
432  std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIterEnd = collectedMaterial->end();
433  for ( ; tsosIter != tsosIterEnd; ++tsosIter) {
434  newX0 += (*tsosIter)->materialEffectsOnTrack() ? (*tsosIter)->materialEffectsOnTrack()->thicknessInX0() : 0;
435  delete(*tsosIter);
436  }
437  ATH_MSG_VERBOSE( "execute() newX0 = " << newX0 );
438  }
439  }
440 
441  // no intersection with cylinder barrel, now trying disc endcaps
442  if (!newParameters) {
443 
444  if (!m_materialCollectionValidation) {
445 
446  newParameters = m_extrapolator->extrapolate(
447  ctx,
448  m_onion ? *lastParameters : startParameters,
449  (m_parameterEta[0] < 0) ? *(m_theDiscs1->at(lay))
450  : *(m_theDiscs2->at(lay)),
452  true,
453  (Trk::ParticleHypothesis)m_particleType).release();
454 
455  } else { // material collection validation
456 
457  // get the vector of TrackStateOnSurfaces back
458  const std::vector<const Trk::TrackStateOnSurface*>* collectedMaterial =
459  m_extrapolator->extrapolateM(ctx,
460  m_onion ? *lastParameters : startParameters,
461  (m_parameterEta[0] < 0) ? *(m_theDiscs1->at(lay)) : *(m_theDiscs2->at(lay)),
463  true,
464  (Trk::ParticleHypothesis)m_particleType);
465 
466  // get the last one and clone it
467  if (collectedMaterial && !collectedMaterial->empty()){
468  // get the last track state on surface & clone the destination parameters
469  const Trk::TrackStateOnSurface* destinationState = collectedMaterial->back();
470  newParameters = destinationState->trackParameters() ? destinationState->trackParameters()->clone() : nullptr;
471  if (m_onion)
472  m_collectedLayerForward += collectedMaterial->size();
473  else
474  m_collectedLayerForward = collectedMaterial->size(); // TODO: shouldn't there be something else here?
475  // delete the layers / cleanup
476  std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIter = collectedMaterial->begin();
477  std::vector<const Trk::TrackStateOnSurface*>::const_iterator tsosIterEnd = collectedMaterial->end();
478  for ( ; tsosIter != tsosIterEnd; ++tsosIter) {
479  newX0 += (*tsosIter)->materialEffectsOnTrack() ? (*tsosIter)->materialEffectsOnTrack()->thicknessInX0() : 0;
480  delete(*tsosIter);
481  }
482  ATH_MSG_VERBOSE( "execute() newX0 = " << newX0 );
483  }
484  }
485  }
486 
487  // still no intersection
488  if (!newParameters) {
489  ATH_MSG_WARNING( "execute() Layer " << lay << " intersection did not work !" );
490  }
491 
492  else if (m_highestVolume && newParameters && !(m_highestVolume->inside(newParameters->position()))) {
493  ATH_MSG_WARNING( "execute() Layer " << lay << " intersection is outside the known world !" );
494  }
495 
496  else {
497 
498  // get the current surface intersection position
499  const Amg::Vector3D& newPosition = newParameters->position();
500  ATH_MSG_VERBOSE( "execute() Track Parameters at layer " << lay << ": " << *newParameters );
501  ATH_MSG_DEBUG( "execute() Track Parameters at layer " << lay << ": [r,z] = [ " << newPosition.perp() << ", " << newPosition.z() );
502 
503  // record the surface parameters
504  ++m_triesForward;
505  ++m_entries;
506  m_parameterPhi[m_entries] = newParameters->parameters()[Trk::phi];
507  m_parameterEta[m_entries] = newParameters->momentum().eta();
508  m_parameterTheta[m_entries] = newParameters->parameters()[Trk::theta];
509  m_parameterP[m_entries] = newParameters->momentum().mag();
510  m_parameterX0[m_entries] = (float)newX0;
511  ATH_MSG_DEBUG( "execute() Layer " << lay << ": cumulated X0 = " << m_parameterX0[m_entries] );
512 
513  // get the current energy and calculate energy loss
514  m_energy[m_entries] = sqrt(m_parameterP[m_entries]*m_parameterP[m_entries] + mass*mass);
515  m_energyLoss[m_entries] = energy1-m_energy[m_entries];
516  ATH_MSG_DEBUG( "execute() Layer " << lay << ": cumulated Energy Loss = " << m_energyLoss[m_entries] );
517 
518  // record the current layer ID
519  m_layer[m_entries] = lay;
520  // record the current position
521  m_radius[m_entries] = newPosition.perp();
522  m_positionX[m_entries] = newPosition.x();
523  m_positionY[m_entries] = newPosition.y();
524  m_positionZ[m_entries] = newPosition.z();
525 
526  }
527 
528  lastParameters = newParameters;
529 
530  }
531 
532 
533  m_totalRecordedLayers += m_entries;
534  ++m_events;
535  // increase m_entries once more before the fill (to account for the "start layer" at index 0 with initial track parameters)
536  ++m_entries;
537 
538  // fill the event tree
539  if (m_validationTree)
540  m_validationTree->Fill();
541 
542  // memory cleanup
543  ATH_MSG_DEBUG( "execute() deleting DataVector parameters ... " );
544 
545  return StatusCode::SUCCESS;
546 }
547 
548 //============================================================================================
550  double x, double y, double z, double phi, double theta, double alphaZ)
551 {
552 
553  if (phi!=0. && theta != 0.){
554  // create the Start Surface
555  Amg::Vector3D surfacePosition(x,y,z);
556  // z direction
557  Amg::Vector3D surfaceZdirection(cos(phi)*sin(theta),
558  sin(phi)*sin(theta),
559  cos(theta));
560  // the global z axis
561  Amg::Vector3D zAxis(0.,0.,1.);
562  // the y direction
563  Amg::Vector3D surfaceYdirection(zAxis.cross(surfaceZdirection));
564  // the x direction
565  Amg::Vector3D surfaceXdirection(surfaceYdirection.cross(surfaceZdirection));
566  // the rotation
567  Amg::RotationMatrix3D surfaceRotation;
568  surfaceRotation.col(0) = surfaceXdirection;
569  surfaceRotation.col(1) = surfaceYdirection;
570  surfaceRotation.col(2) = surfaceZdirection;
571  // return it
572  if (alphaZ==0.){
573  return std::make_unique<Amg::Transform3D>(surfaceRotation, surfacePosition);
574  }
575  Amg::Transform3D nominalTransform(surfaceRotation, surfacePosition);
576  return std::make_unique<Amg::Transform3D>(nominalTransform*Amg::AngleAxis3D(alphaZ,zAxis));
577 
578  }
579 
580  return std::make_unique<Amg::Transform3D>(Amg::Translation3D(x,y,z));
581 }
582 
Trk::EnergyLossExtrapolationValidation::initialize
StatusCode initialize()
standard Athena-Algorithm method
Definition: EnergyLossExtrapolationValidation.cxx:127
Trk::y
@ y
Definition: ParamDefs.h:62
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:63
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PlotCalibFromCool.zAxis
zAxis
Definition: PlotCalibFromCool.py:76
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:549
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
dqt_zlumi_pandas.mass
mass
Definition: dqt_zlumi_pandas.py:170
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:241
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:72
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::CylinderVolumeBounds::halflengthZ
double halflengthZ() const
This method returns the halflengthZ.
Definition: CylinderVolumeBounds.h:207
Trk::ParametersBase
Definition: ParametersBase.h:55
TRKEXALGS_MAXPARAMETERS
#define TRKEXALGS_MAXPARAMETERS
Definition: EnergyLossExtrapolationValidation.h:28
DataVector< const Trk::CylinderSurface >
ParticleHypothesis.h
AthAlgorithm
Definition: AthAlgorithm.h:47
Athena::Units
Definition: Units.h:45
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:112
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
createCoolChannelIdFile.par
par
Definition: createCoolChannelIdFile.py:29
Trk::CylinderVolumeBounds::outerRadius
double outerRadius() const
This method returns the outer radius.
Definition: CylinderVolumeBounds.h:191
charge
double charge(const T &p)
Definition: AtlasPID.h:494
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.
DataVector.h
An STL vector of pointers that by default owns its pointed-to elements.
TrackingVolume.h
Trk::EnergyLossExtrapolationValidation::EnergyLossExtrapolationValidation
EnergyLossExtrapolationValidation(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
Definition: EnergyLossExtrapolationValidation.cxx:31
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
Gaudi
=============================================================================
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:273
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
TrackingGeometry.h
Amg::AngleAxis3D
Eigen::AngleAxisd AngleAxis3D
Definition: GeoPrimitives.h:45
Trk::phi
@ phi
Definition: ParamDefs.h:81
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
Trk::x
@ x
Definition: ParamDefs.h:61
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
readCCLHist.float
float
Definition: readCCLHist.py:83
TrackStateOnSurface.h
Trk::EnergyLossExtrapolationValidation::execute
StatusCode execute()
standard Athena-Algorithm method
Definition: EnergyLossExtrapolationValidation.cxx:268
Trk::ParametersBase::clone
virtual ParametersBase< DIM, T > * clone() const override=0
clone method for polymorphic deep copy