ATLAS Offline Software
ElectronCombinedMaterialEffects.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
12 //
18 //
19 #include <cmath>
20 #include <exception>
21 #include <fstream>
22 #include <sstream>
23 
24 namespace {
25 constexpr double s_singleGaussianRange = 0.0001;
26 constexpr double s_lowerRange = 0.002;
27 constexpr double s_xOverRange = 0.10;
28 constexpr double s_upperRange = 0.20;
29 constexpr double s_componentMeanCut = 0.0;
30 
35 template<size_t N>
36 inline constexpr double
37 hornerEvaluate(const std::array<double, N>& a, const double& x)
38 {
39  constexpr size_t order = N - 1;
40  if constexpr (order == 0) {
41  return a[0];
42  } else if constexpr (order == 1) {
43  return a[0] * x + a[1];
44  } else if constexpr (order == 2) {
45  return (a[0] * x + a[1]) * x + a[2];
46  } else if constexpr (order == 3) {
47  return ((a[0] * x + a[1]) * x + a[2]) * x + a[3];
48  } else if constexpr (order == 4) {
49  return (((a[0] * x + a[1]) * x + a[2]) * x + a[3]) * x + a[4];
50  } else if constexpr (order == 5) {
51  return ((((a[0] * x + a[1]) * x + a[2]) * x + a[3]) * x + a[4]) * x + a[5];
52  } else { // start from the last one we have
53  double result =
54  ((((a[0] * x + a[1]) * x + a[2]) * x + a[3]) * x + a[4]) * x + a[5];
55  for (size_t i = 6; i < N; ++i) {
56  result = result * x + a[i];
57  }
58  return result;
59  }
60 }
61 inline constexpr bool
62 inRange(int var, int lo, int hi)
63 {
64  return ((var <= hi) and (var >= lo));
65 }
66 
67 // Logistic function - needed for transformation of weight and mean
68 inline double
69 logisticFunction(const double x)
70 {
71  return 1. / (1. + std::exp(-x));
72 }
73 
75 // Correct weights of components
76 void
77 correctWeights(BH::MixtureParameters& mixture, const int numberOfComponents)
78 {
79  if (numberOfComponents < 1) {
80  return;
81  }
82  // Obtain the sum of weights
83  double weightSum(0.);
84  for (int i = 0; i < numberOfComponents; ++i) {
85  weightSum += mixture[i].weight;
86  }
87  double norm = 1. / weightSum;
88  // Rescale so that total weighting is 1
89  for (int i = 0; i < numberOfComponents; ++i) {
90  mixture[i].weight *= norm;
91  }
92 }
93 
94 BH::MixtureParameters
95 getTransformedMixtureParameters(
96  const std::array<BH::Polynomial, GSFConstants::maxNumberofMatComponents>&
97  polynomialWeights,
98  const std::array<BH::Polynomial, GSFConstants::maxNumberofMatComponents>&
99  polynomialMeans,
100  const std::array<BH::Polynomial, GSFConstants::maxNumberofMatComponents>&
101  polynomialVariances,
102  const double pathlengthInX0,
103  const int numberOfComponents)
104 {
105  BH::MixtureParameters mixture{};
106  for (int i = 0; i < numberOfComponents; ++i) {
107  const double updatedWeight =
108  hornerEvaluate(polynomialWeights[i], pathlengthInX0);
109  const double updatedMean =
110  hornerEvaluate(polynomialMeans[i], pathlengthInX0);
111  const double updatedVariance =
112  hornerEvaluate(polynomialVariances[i], pathlengthInX0);
113  mixture[i] = { logisticFunction(updatedWeight),
114  logisticFunction(updatedMean),
115  std::exp(updatedVariance) };
116  }
117  return mixture;
118 }
119 
120 BH::MixtureParameters
121 getMixtureParameters(
122  const std::array<BH::Polynomial, GSFConstants::maxNumberofMatComponents>&
123  polynomialWeights,
124  const std::array<BH::Polynomial, GSFConstants::maxNumberofMatComponents>&
125  polynomialMeans,
126  const std::array<BH::Polynomial, GSFConstants::maxNumberofMatComponents>&
127  polynomialVariances,
128  const double pathlengthInX0,
129  const int numberOfComponents)
130 {
131  BH::MixtureParameters mixture{};
132  for (int i = 0; i < numberOfComponents; ++i) {
133  const double updatedWeight =
134  hornerEvaluate(polynomialWeights[i], pathlengthInX0);
135  const double updatedMean =
136  hornerEvaluate(polynomialMeans[i], pathlengthInX0);
137  const double updatedVariance =
138  hornerEvaluate(polynomialVariances[i], pathlengthInX0);
139  mixture[i] = { updatedWeight,
140  updatedMean,
141  updatedVariance * updatedVariance };
142  }
143  return mixture;
144 }
145 
146 inline void
147 scattering(GsfMaterial::Scattering& cache,
148  const Trk::ComponentParameters& componentParameters,
149  const Trk::MaterialProperties& materialProperties,
150  double pathLength)
151 {
152  // Reset the cache
153  cache.reset();
154 
155  // Request track parameters from component parameters
156  const Trk::TrackParameters* trackParameters = componentParameters.params.get();
157  const AmgSymMatrix(5)* measuredTrackCov = trackParameters->covariance();
158 
159  if (!measuredTrackCov) {
160  return;
161  }
162 
163  const Amg::Vector3D& globalMomentum = trackParameters->momentum();
164  const double p = globalMomentum.mag();
165  double pathcorrection = 1.;
166  if (materialProperties.thickness() != 0) {
167  pathcorrection = pathLength / materialProperties.thickness();
168  }
169  const double t = pathcorrection * materialProperties.thicknessInX0();
170  constexpr double m = Trk::ParticleMasses::mass[Trk::electron];
171  const double E = sqrt(p * p + m * m);
172  const double beta = p / E;
173  const double sigma = Trk::MaterialInteraction::sigmaMS(t, p, beta);
174  const double angularVariation = sigma * sigma;
175 
176  const double sinTheta = std::sin(trackParameters->parameters()[Trk::theta]);
177  cache.deltaThetaCov = angularVariation;
178  cache.deltaPhiCov = angularVariation / (sinTheta * sinTheta);
179 }
180 
181 // Helper to read in polynomials
183 readPolynomial(std::ifstream& fin)
184 {
186  for (size_t i = 0; i < GSFConstants::polynomialCoefficients; ++i) {
187  if (!fin) {
188  throw std::logic_error("Reached end of stream but still expecting data.");
189  }
190  fin >> poly[i];
191  }
192  return poly;
193 }
194 
195 } // end of anonymous namespace
196 
197 // ElectronCombinedMaterialEffects methods
199  const std::string& parameterisationFileName,
200  const std::string& parameterisationFileNameHighX0)
201 {
202  // The following is a bit repetitive code
203  // we could consider refactoring
204  // The low X0 polynomials
205  {
206  std::string resolvedFileName =
207  PathResolver::find_file(parameterisationFileName, "DATAPATH");
208  if (resolvedFileName.empty()) {
209  std::ostringstream ss;
210  ss << "Parameterisation file : " << parameterisationFileName
211  << " not found";
212  throw std::logic_error(ss.str());
213  }
214 
215  const char* filename = resolvedFileName.c_str();
216  std::ifstream fin(filename);
217  if (fin.bad()) {
218  std::ostringstream ss;
219  ss << "Error opening file: " << resolvedFileName;
220  throw std::logic_error(ss.str());
221  }
222 
224  int orderPolynomial = 0;
225  fin >> orderPolynomial;
227  if (not inRange(
229  std::ostringstream ss;
230  ss << "numberOfComponents Parameter out of range 0- "
233  throw std::logic_error(ss.str());
234  }
235  if (orderPolynomial != (GSFConstants::polynomialCoefficients - 1)) {
236  std::ostringstream ss;
237  ss << "orderPolynomial order != "
239  throw std::logic_error(ss.str());
240  }
241  if (not inRange(m_BHtransformationCode, 0, 1)) {
242  std::ostringstream ss;
243  ss << "transformationCode Parameter out of range 0-1: "
245  throw std::logic_error(ss.str());
246  }
247  if (!fin) {
248  std::ostringstream ss;
249  ss << "Error while reading file : " << resolvedFileName;
250  throw std::logic_error(ss.str());
251  }
252  // Fill the polynomials
253  int componentIndex = 0;
254  for (; componentIndex < m_BHnumberOfComponents; ++componentIndex) {
255  m_BHpolynomialWeights[componentIndex] = readPolynomial(fin);
256  m_BHpolynomialMeans[componentIndex] = readPolynomial(fin);
257  m_BHpolynomialVariances[componentIndex] = readPolynomial(fin);
258  }
259  }
260  // Read the high X0 polynomials
261  {
262  std::string resolvedFileName =
263  PathResolver::find_file(parameterisationFileNameHighX0, "DATAPATH");
264  if (resolvedFileName.empty()) {
265  std::ostringstream ss;
266  ss << "Parameterisation file : " << parameterisationFileNameHighX0
267  << " not found";
268  throw std::logic_error(ss.str());
269  }
270 
271  const char* filename = resolvedFileName.c_str();
272  std::ifstream fin(filename);
273  if (fin.bad()) {
274  std::ostringstream ss;
275  ss << "Error opening file: " << resolvedFileName;
276  throw std::logic_error(ss.str());
277  }
279  int orderPolynomial = 0;
280  fin >> orderPolynomial;
282  //
284  0,
286  std::ostringstream ss;
287  ss << "numberOfComponentsHighX0 Parameter out of range 0- "
290  throw std::logic_error(ss.str());
291  }
293  std::ostringstream ss;
294  ss << " numberOfComponentsHighX0 != numberOfComponents";
295  throw std::logic_error(ss.str());
296  }
297  if (orderPolynomial != (GSFConstants::polynomialCoefficients - 1)) {
298  std::ostringstream ss;
299  ss << "orderPolynomial order != "
301  throw std::logic_error(ss.str());
302  }
303  if (not inRange(m_BHtransformationCodeHighX0, 0, 1)) {
304  std::ostringstream ss;
305  ss << "transformationCode Parameter out of range "
306  "0-1: "
308  throw std::logic_error(ss.str());
309  }
310 
311  // Fill the polynomials
312  int componentIndex = 0;
313  for (; componentIndex < m_BHnumberOfComponentsHighX0; ++componentIndex) {
314  m_BHpolynomialWeightsHighX0[componentIndex] = readPolynomial(fin);
315  m_BHpolynomialMeansHighX0[componentIndex] = readPolynomial(fin);
316  m_BHpolynomialVariancesHighX0[componentIndex] = readPolynomial(fin);
317  }
318  }
319 }
320 
321 void
323  GsfMaterial::Combined& cache,
324  const Trk::ComponentParameters& componentParameters,
325  const Trk::MaterialProperties& materialProperties,
326  double pathLength,
327  Trk::PropDirection direction) const
328 {
329  const AmgSymMatrix(5)* measuredCov = componentParameters.params->covariance();
330  /*
331  * 1. Retrieve multiple scattering corrections
332  */
333  GsfMaterial::Scattering cache_multipleScatter;
334  scattering(
335  cache_multipleScatter, componentParameters, materialProperties, pathLength);
336  /*
337  * 2. Retrieve energy loss corrections
338  */
339  GsfMaterial::EnergyLoss cache_energyLoss;
340  this->BetheHeitler(cache_energyLoss,
341  componentParameters,
342  materialProperties,
343  pathLength,
344  direction);
345  // Protect if there are no new energy loss
346  // components
347  // we want at least on dummy to "combine"
348  // with scattering
349  if (cache_energyLoss.numElements == 0) {
350  cache_energyLoss.elements[0] = { 1, 0, 0 };
351  cache_energyLoss.numElements = 1;
352  }
353  /*
354  * 3. Combine the multiple scattering with each of the energy loss components
355  */
356  // Cache is to be filled so 0 entries here
357  cache.numEntries = 0;
358  for (int i = 0; i < cache_energyLoss.numElements; ++i) {
359  double combinedWeight = cache_energyLoss.elements[i].weight;
360  double combinedDeltaP = cache_energyLoss.elements[i].deltaP;
361  cache.weights[i] = combinedWeight;
362  cache.deltaPs[i] = combinedDeltaP;
363  if (measuredCov) {
364  // Create the covariance
365  const double covPhi = cache_multipleScatter.deltaPhiCov;
366  const double covTheta = cache_multipleScatter.deltaThetaCov;
367  const double covQoverP = cache_energyLoss.elements[i].deltaQOvePCov;
368  cache.deltaCovariances[i] << 0, 0, 0, 0, 0, // 5
369  0, 0, 0, 0, 0, // 10
370  0, 0, covPhi, 0, 0, // 15
371  0, 0, 0, covTheta, 0, // 20
372  0, 0, 0, 0, covQoverP;
373  } else {
374  cache.deltaCovariances[i].setZero();
375  }
376  ++cache.numEntries;
377  } // end for loop over energy loss components
378 }
379 
380 /*
381  * Use polynomials to get the BetheHeitler
382  * energy loss
383  */
384 void
387  const Trk::ComponentParameters& componentParameters,
388  const Trk::MaterialProperties& materialProperties,
389  double pathLength,
390  Trk::PropDirection direction) const
391 {
392  cache.numElements = 0;
393 
394  const Trk::TrackParameters* trackParameters = componentParameters.params.get();
395  const Amg::Vector3D& globalMomentum = trackParameters->momentum();
396 
397  const double radiationLength = materialProperties.x0();
398  const double momentum = globalMomentum.mag();
399  double pathlengthInX0 = pathLength / radiationLength;
400 
401  if (pathlengthInX0 < s_singleGaussianRange) {
402  cache.elements[0] = { 1., 0., 0. };
403  cache.numElements = 1;
404  return;
405  }
406 
407  // If the amount of material is between 0.0001 and 0.01 return the gaussian
408  // approximation to the Bethe-Heitler distribution
409  if (pathlengthInX0 < s_lowerRange) {
410  const double meanZ = std::exp(-1. * pathlengthInX0);
411  const double sign = (direction == Trk::oppositeMomentum) ? 1. : -1.;
412  const double varZ =
413  std::exp(-1. * pathlengthInX0 * std::log(3.) / std::log(2.)) -
414  std::exp(-2. * pathlengthInX0);
415  double deltaP(0.);
416  double varQoverP(0.);
417  if (direction == Trk::alongMomentum) {
418  deltaP = sign * momentum * (1. - meanZ);
419  varQoverP = 1. / (meanZ * meanZ * momentum * momentum) * varZ;
420  } else {
421  deltaP = sign * momentum * (1. / meanZ - 1.);
422  varQoverP = varZ / (momentum * momentum);
423  }
424  cache.elements[0] = { 1., deltaP, varQoverP };
425  cache.numElements = 1;
426  return;
427  }
428 
429  // Now we do the full calculation
430  if (pathlengthInX0 > s_upperRange) {
431  pathlengthInX0 = s_upperRange;
432  }
433 
434  // Get proper mixture parameters
435  MixtureParameters mixture;
436  if (pathlengthInX0 > s_xOverRange) {
437  if (m_BHtransformationCodeHighX0) {
438  mixture = getTransformedMixtureParameters(m_BHpolynomialWeightsHighX0,
439  m_BHpolynomialMeansHighX0,
440  m_BHpolynomialVariancesHighX0,
441  pathlengthInX0,
442  m_BHnumberOfComponents);
443  } else {
444  mixture = getMixtureParameters(m_BHpolynomialWeightsHighX0,
445  m_BHpolynomialMeansHighX0,
446  m_BHpolynomialVariancesHighX0,
447  pathlengthInX0,
448  m_BHnumberOfComponents);
449  }
450  } else {
451  if (m_BHtransformationCode) {
452  mixture = getTransformedMixtureParameters(m_BHpolynomialWeights,
453  m_BHpolynomialMeans,
454  m_BHpolynomialVariances,
455  pathlengthInX0,
456  m_BHnumberOfComponents);
457  } else {
458  mixture = getMixtureParameters(m_BHpolynomialWeights,
459  m_BHpolynomialMeans,
460  m_BHpolynomialVariances,
461  pathlengthInX0,
462  m_BHnumberOfComponents);
463  }
464  }
465  // Correct the mixture
466  correctWeights(mixture, m_BHnumberOfComponents);
467  int componentIndex = 0;
468  double weightToBeRemoved(0.);
469  int componentWithHighestMean(0);
470  for (; componentIndex < m_BHnumberOfComponents; ++componentIndex) {
471  if (mixture[componentIndex].mean > mixture[componentWithHighestMean].mean) {
472  componentWithHighestMean = componentIndex;
473  }
474  if (mixture[componentIndex].mean >= s_componentMeanCut) {
475  continue;
476  }
477  weightToBeRemoved += mixture[componentIndex].weight;
478  }
479  // Fill the cache to be returned
480  componentIndex = 0;
481  for (; componentIndex < m_BHnumberOfComponents; ++componentIndex) {
482  double varianceInverseMomentum = 0;
483  // This is not mathematically correct but it does stabilize the GSF
484  if (mixture[componentIndex].mean < s_componentMeanCut) {
485  continue;
486  }
487  double weight = mixture[componentIndex].weight;
488  if (componentIndex == componentWithHighestMean) {
489  weight += weightToBeRemoved;
490  }
491  double deltaP(0.);
492  if (direction == alongMomentum) {
493  // For forward propagation
494  deltaP = momentum * (mixture[componentIndex].mean - 1.);
495  const double f = 1. / (momentum * mixture[componentIndex].mean);
496  varianceInverseMomentum = f * f * mixture[componentIndex].variance;
497  } // end forward propagation if clause
498  else {
499  // For backwards propagation
500  deltaP = momentum * (1. / mixture[componentIndex].mean - 1.);
501  varianceInverseMomentum =
502  mixture[componentIndex].variance / (momentum * momentum);
503  } // end backwards propagation if clause
504 
505  // set in the cache and increase the elements
506  cache.elements[cache.numElements] = { weight,
507  deltaP,
508  varianceInverseMomentum };
509  ++cache.numElements;
510  } // end for loop over all components
511 }
512 
Trk::ElectronCombinedMaterialEffects::m_BHpolynomialWeightsHighX0
std::array< Polynomial, GSFConstants::maxNumberofMatComponents > m_BHpolynomialWeightsHighX0
Definition: ElectronCombinedMaterialEffects.h:82
beamspotnt.var
var
Definition: bin/beamspotnt.py:1394
EnergyLoss.h
PlotCalibFromCool.norm
norm
Definition: PlotCalibFromCool.py:100
Trk::MaterialInteraction::sigmaMS
static double sigmaMS(double dInX0, double p, double beta)
multiple scattering as function of dInX0
Definition: MaterialInteraction.cxx:278
pdg_comparison.sigma
sigma
Definition: pdg_comparison.py:324
mean
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
Definition: dependence.cxx:254
get_generator_info.result
result
Definition: get_generator_info.py:21
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
GsfMaterial::Combined::weights
std::array< double, GSFConstants::maxNumberofMatComponents > weights
Definition: GsfMaterial.h:49
TrackParameters.h
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
GsfMaterial::Scattering
Helper struct for multiple scattering effects single component description.
Definition: GsfMaterial.h:36
Trk::ElectronCombinedMaterialEffects::BetheHeitler
void BetheHeitler(GsfMaterial::EnergyLoss &cache, const ComponentParameters &componentParameters, const MaterialProperties &materialProperties, double pathLenght, PropDirection direction=anyDirection) const
Definition: ElectronCombinedMaterialEffects.cxx:385
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
GsfMaterial::EnergyLoss::elements
std::array< element, GSFConstants::maxNumberofMatComponents > elements
Definition: GsfMaterial.h:30
Trk::ElectronCombinedMaterialEffects::Polynomial
std::array< double, GSFConstants::polynomialCoefficients > Polynomial
Definition: ElectronCombinedMaterialEffects.h:38
GsfMaterial::EnergyLoss
Helper struct for energy loss effects, multicomponent description.
Definition: GsfMaterial.h:23
Trk::ElectronCombinedMaterialEffects::m_BHtransformationCode
int m_BHtransformationCode
Definition: ElectronCombinedMaterialEffects.h:71
Trk::oppositeMomentum
@ oppositeMomentum
Definition: PropDirection.h:21
Trk::MaterialProperties::thicknessInX0
float thicknessInX0() const
Return the radiationlength fraction.
Trk::ElectronCombinedMaterialEffects::m_BHnumberOfComponents
int m_BHnumberOfComponents
Definition: ElectronCombinedMaterialEffects.h:70
Trk::ElectronCombinedMaterialEffects::ElectronCombinedMaterialEffects
ElectronCombinedMaterialEffects()=default
GsfMaterial::Combined::deltaCovariances
std::array< AmgSymMatrix(5), GSFConstants::maxNumberofMatComponents > deltaCovariances
Definition: GsfMaterial.h:56
Trk::alongMomentum
@ alongMomentum
Definition: PropDirection.h:20
Trk::MaterialProperties::x0
float x0() const
Return the radiation length.
JetTiledMap::N
@ N
Definition: TiledEtaPhiMap.h:44
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
x
#define x
ParamDefs.h
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:50
GsfMaterial::Scattering::deltaPhiCov
double deltaPhiCov
Definition: GsfMaterial.h:38
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:189
Trk::ElectronCombinedMaterialEffects::MixtureParameters
std::array< ComponentValues, GSFConstants::maxNumberofMatComponents > MixtureParameters
Definition: ElectronCombinedMaterialEffects.h:36
Trk::ElectronCombinedMaterialEffects::compute
void compute(GsfMaterial::Combined &, const Trk::ComponentParameters &, const Trk::MaterialProperties &, double, Trk::PropDirection=anyDirection) const
Definition: ElectronCombinedMaterialEffects.cxx:322
Trk::MaterialProperties::thickness
float thickness() const
Return the thickness in mm.
Trk::AmgSymMatrix
AmgSymMatrix(5) &GXFTrackState
Definition: GXFTrackState.h:156
MuonCalib::Legendre::poly
constexpr double poly(const double x)
Definition: LegendrePoly.h:116
GsfMaterial::Combined::numEntries
size_t numEntries
Definition: GsfMaterial.h:58
Trk::PropDirection
PropDirection
Definition: PropDirection.h:19
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
Trk::ElectronCombinedMaterialEffects
Definition: ElectronCombinedMaterialEffects.h:26
GSFConstants::maxNumberofMatComponents
constexpr int8_t maxNumberofMatComponents
Maximum number of Gaussian components for the material effects description.
Definition: GsfConstants.h:50
ParticleGun_EoverP_Config.momentum
momentum
Definition: ParticleGun_EoverP_Config.py:63
lumiFormat.i
int i
Definition: lumiFormat.py:85
Trk::theta
@ theta
Definition: ParamDefs.h:66
Trk::electron
@ electron
Definition: ParticleHypothesis.h:27
Trk::ElectronCombinedMaterialEffects::m_BHpolynomialVariances
std::array< Polynomial, GSFConstants::maxNumberofMatComponents > m_BHpolynomialVariances
Definition: ElectronCombinedMaterialEffects.h:80
Trk::ElectronCombinedMaterialEffects::m_BHpolynomialMeansHighX0
std::array< Polynomial, GSFConstants::maxNumberofMatComponents > m_BHpolynomialMeansHighX0
Definition: ElectronCombinedMaterialEffects.h:84
mc.order
order
Configure Herwig7.
Definition: mc.Herwig7_Dijet.py:12
sign
int sign(int a)
Definition: TRT_StrawNeighbourSvc.h:107
GsfMaterial::Scattering::deltaThetaCov
double deltaThetaCov
Definition: GsfMaterial.h:37
hist_file_dump.f
f
Definition: hist_file_dump.py:135
Trk::ParametersBase
Definition: ParametersBase.h:55
GsfMaterial::Combined
Helper struct for combined material effects, multicomponent description.
Definition: GsfMaterial.h:48
inRange
bool inRange(const double *boundaries, const double value, const double tolerance=0.02)
Definition: LArSCIdVsIdTest.cxx:5
Trk::ParticleMasses::mass
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:53
GsfMaterial::Combined::deltaPs
std::array< double, GSFConstants::maxNumberofMatComponents > deltaPs
Definition: GsfMaterial.h:50
PathResolver.h
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
Trk::ElectronCombinedMaterialEffects::m_BHtransformationCodeHighX0
int m_BHtransformationCodeHighX0
Definition: ElectronCombinedMaterialEffects.h:73
ElectronCombinedMaterialEffects.h
Trk::ComponentParameters
Definition: ComponentParameters.h:22
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MaterialInteraction.h
GSFConstants::polynomialCoefficients
constexpr int8_t polynomialCoefficients
Number of coefficients for the polynomials, parametrizing the mean,variace, weights of the Gaussian c...
Definition: GsfConstants.h:54
Trk::ParametersBase::momentum
const Amg::Vector3D & momentum() const
Access method for the momentum.
Trk::ElectronCombinedMaterialEffects::m_BHnumberOfComponentsHighX0
int m_BHnumberOfComponentsHighX0
Definition: ElectronCombinedMaterialEffects.h:72
Trk::MaterialProperties
Definition: MaterialProperties.h:40
a
TList * a
Definition: liststreamerinfos.cxx:10
Trk::ElectronCombinedMaterialEffects::m_BHpolynomialVariancesHighX0
std::array< Polynomial, GSFConstants::maxNumberofMatComponents > m_BHpolynomialVariancesHighX0
Definition: ElectronCombinedMaterialEffects.h:86
GsfMaterial::Scattering::reset
void reset()
Definition: GsfMaterial.h:39
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:24
GsfMaterial::EnergyLoss::numElements
int numElements
Definition: GsfMaterial.h:31
Trk::ElectronCombinedMaterialEffects::m_BHpolynomialWeights
std::array< Polynomial, GSFConstants::maxNumberofMatComponents > m_BHpolynomialWeights
Definition: ElectronCombinedMaterialEffects.h:76
compute_lumi.fin
fin
Definition: compute_lumi.py:19
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
MuonParameters::beta
@ beta
Definition: MuonParamDefs.h:144
Trk::ElectronCombinedMaterialEffects::m_BHpolynomialMeans
std::array< Polynomial, GSFConstants::maxNumberofMatComponents > m_BHpolynomialMeans
Definition: ElectronCombinedMaterialEffects.h:78
Trk::ComponentParameters::params
std::unique_ptr< Trk::TrackParameters > params
Definition: ComponentParameters.h:23