ATLAS Offline Software
ElectronMaterialMixtureConvolution.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2020-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
17 
19 #include "CxxUtils/inline_hints.h"
20 //
21 #include "TrkGeometry/Layer.h"
24 
25 #include <array>
26 namespace {
27 
29 inline void
30 dummyCacheElement(GsfMaterial::Combined& elem)
31 {
32  elem.numEntries = 1;
33  elem.deltaPs[0] = 0;
34  elem.deltaParameters[0] = AmgVector(5)::Zero();
35  elem.deltaCovariances[0] = AmgSymMatrix(5)::Zero();
36 }
37 
38 // Avoid out-of-line Eigen calls
40 inline void
41 updateCacheElement(GsfMaterial::Combined& update,
42  size_t index,
43  const AmgVector(5) & parameters,
44  const AmgSymMatrix(5) * covariance)
45 {
46  update.deltaParameters[index] = parameters;
47  if (covariance) {
48  update.deltaCovariances[index] += *covariance;
49  } else {
50  update.deltaCovariances[index].setZero();
51  }
52 }
53 
54 bool
55 updateP(double& qOverP, double deltaP)
56 {
57  double p = 1. / std::abs(qOverP);
58  p += deltaP;
59  if (p <= 0.) {
60  return false;
61  }
62  qOverP = qOverP > 0. ? 1. / p : -1. / p;
63  return true;
64 }
65 
66 std::pair<const Trk::MaterialProperties*, double>
67 getMaterialProperties(const Trk::TrackParameters* trackParameters,
68  const Trk::Layer& layer)
69 {
70 
71  const Trk::MaterialProperties* materialProperties(nullptr);
72  double pathCorrection(0.);
73 
74  // Check that the material properties have been defined - if not define them
75  // from the layer information
76  materialProperties = materialProperties
77  ? materialProperties
78  : layer.fullUpdateMaterialProperties(*trackParameters);
79  // Bail out if still no material properties can be found
80  if (!materialProperties) {
81  return { nullptr, 0 };
82  }
83  // Define the path correction
84  pathCorrection =
85  pathCorrection > 0.
86  ? pathCorrection
87  : layer.surfaceRepresentation().pathCorrection(
88  trackParameters->position(), trackParameters->momentum());
89 
90  // The pathlength ( in mm ) is the path correction * the thickness of the
91  // material
92  double pathLength = pathCorrection * materialProperties->thickness();
93  return { materialProperties, pathLength };
94 }
95 
96 } // end of anonymous namespace
97 
99  const std::string& type,
100  const std::string& name,
101  const IInterface* parent)
103 {
104  declareInterface<IMaterialMixtureConvolution>(this);
105 }
106 
108  default;
109 
112 {
113  if (m_maximumNumberOfComponents > GSFConstants::maxNumberofStateComponents) {
114  ATH_MSG_FATAL("Requested MaximumNumberOfComponents > "
116  return StatusCode::FAILURE;
117  }
118 
119  m_materialEffects = ElectronCombinedMaterialEffects(
120  m_parameterisationFileName, m_parameterisationFileNameHighX0);
121  return StatusCode::SUCCESS;
122 }
123 
124 /* ==========================================
125  Update with full material effects
126  ========================================== */
127 
130  std::vector<GsfMaterial::Combined>& caches,
131  const Trk::MultiComponentState& multiComponentState,
132  const Trk::Layer& layer,
133  Trk::PropDirection direction,
134  Trk::ParticleHypothesis particleHypothesis) const
135 {
136 
137  Trk::MultiComponentState updatedMergedState = update(
138  caches, multiComponentState, layer, direction, particleHypothesis, Normal);
139 
140  if (updatedMergedState.empty()) {
141  return {};
142  }
143  // Renormalise state
145 
146  return updatedMergedState;
147 }
148 
149 /* ==========================================
150  Update with pre-update material effects
151 ========================================== */
152 
155  std::vector<GsfMaterial::Combined>& caches,
156  const Trk::MultiComponentState& multiComponentState,
157  const Trk::Layer& layer,
158  Trk::PropDirection direction,
159  Trk::ParticleHypothesis particleHypothesis) const
160 {
161  /* -------------------------------------
162  Preliminary checks
163  ------------------------------------- */
164  Trk::MultiComponentState updatedMergedState = update(caches,
165  multiComponentState,
166  layer,
167  direction,
168  particleHypothesis,
169  Preupdate);
170  if (updatedMergedState.empty()) {
171  return {};
172  }
173  // Renormalise state
175 
176  return updatedMergedState;
177 }
178 
179 /* ==========================================
180  Update with post-update material effects
181  ========================================== */
182 
185  std::vector<GsfMaterial::Combined>& caches,
186  const Trk::MultiComponentState& multiComponentState,
187  const Trk::Layer& layer,
188  Trk::PropDirection direction,
189  Trk::ParticleHypothesis particleHypothesis) const
190 {
191 
192  /* -------------------------------------
193  Preliminary checks
194  ------------------------------------- */
195 
196  Trk::MultiComponentState updatedMergedState = update(caches,
197  multiComponentState,
198  layer,
199  direction,
200  particleHypothesis,
201  Postupdate);
202 
203  if (updatedMergedState.empty()) {
204  return {};
205  }
206  // Renormalise state
208 
209  return updatedMergedState;
210 }
211 
214  std::vector<GsfMaterial::Combined>& caches,
215  const Trk::MultiComponentState& inputState,
216  const Trk::Layer& layer,
217  Trk::PropDirection direction,
219  MaterialUpdateType updateType) const
220 {
221 
222  // Check the multi-component state is populated
223  if (inputState.empty()) {
224  return {};
225  }
226 
227  double updateFactor(1.);
228  // Full method does this for each component which i don't think this is needed
229  if (updateType == Preupdate) {
230  updateFactor =
231  layer.preUpdateMaterialFactor(*inputState.front().params, direction);
232  } else if (updateType == Postupdate) {
233  updateFactor =
234  layer.postUpdateMaterialFactor(*inputState.front().params, direction);
235  }
236 
237  if (updateFactor < 0.01) {
238  // Bail out as factor is too small to bother about
239  return {};
240  }
241 
242  caches.resize(inputState.size());
243 
244  // Fill cache and work out how many final components there should be
245  size_t n(0);
246  for (size_t i(0); i < inputState.size(); ++i) {
247  const AmgSymMatrix(5)* measuredCov = inputState[i].params->covariance();
248  // If the momentum is too dont apply material effects
249  if (inputState[i].params->momentum().mag() <= 250. * Gaudi::Units::MeV) {
250  dummyCacheElement(caches[i]);
251  updateCacheElement(
252  caches[i], 0, inputState[i].params->parameters(), measuredCov);
253  caches[i].weights[0] = inputState[i].weight;
254  n += caches[i].numEntries;
255  continue;
256  }
257 
258  // Get the material effects and store them in the cache
259  std::pair<const Trk::MaterialProperties*, double> matPropPair =
260  getMaterialProperties(inputState[i].params.get(), layer);
261 
262  if (!matPropPair.first) {
263  dummyCacheElement(caches[i]);
264  updateCacheElement(
265  caches[i], 0, inputState[i].params->parameters(), measuredCov);
266  caches[i].weights[0] = inputState[i].weight;
267  n += caches[i].numEntries;
268  continue;
269  }
270  // Now we can compute/apply actual material effects
271  // Apply the update factor
272  matPropPair.second *= updateFactor;
273  m_materialEffects.compute(caches[i],
274  inputState[i],
275  *matPropPair.first,
276  matPropPair.second,
277  direction);
278 
279  // Apply material effects to input state and store results in cache
280  for (size_t j(0); j < caches[i].numEntries; ++j) {
281  updateCacheElement(
282  caches[i], j, inputState[i].params->parameters(), measuredCov);
283  // Adjust q/p of the (delta) Parameters
284  // make sure update is good.
285  if (!updateP(caches[i].deltaParameters[j][Trk::qOverP],
286  caches[i].deltaPs[j])) {
287  ATH_MSG_ERROR("Cannot update state vector momentum!!!");
288  return {};
289  }
290  // Store component weight
291  caches[i].weights[j] *= inputState[i].weight;
292  // Ensure weight of component is not too small to save us from potential
293  // FPE's Value. Weights are double so the min of float should
294  // be small enough and should be handled
295  if (caches[i].weights[j] < std::numeric_limits<float>::min()) {
296  caches[i].weights[j] = std::numeric_limits<float>::min();
297  }
298  }
299  n += caches[i].numEntries;
300  } // End of loop filling the cache
301 
302  // Fill information for calculating which components to merge
303  // In addition scan all components for covariance matrices. If one or more
304  // component is missing an error matrix, component reduction is impossible.
305  bool componentWithoutMeasurement = false;
306 
307  GSFUtils::Component1DArray componentsArray;
308  componentsArray.numComponents = n;
309  std::array<std::pair<size_t, size_t>,
311  indices{};
312 
313  size_t k(0);
314  for (size_t i(0); i < inputState.size(); ++i) {
315  for (size_t j(0); j < caches[i].numEntries; ++j) {
316  const AmgSymMatrix(5)* measuredCov = inputState[i].params->covariance();
317  // Fill in infomation
318  const double cov =
319  measuredCov ? caches[i].deltaCovariances[j](Trk::qOverP, Trk::qOverP)
320  : -1.;
321  if (!measuredCov) {
322  componentWithoutMeasurement = true;
323  }
324 
325  componentsArray.components[k].mean =
326  caches[i].deltaParameters[j][Trk::qOverP];
327  componentsArray.components[k].cov = cov;
328  componentsArray.components[k].invCov = cov > 0 ? 1. / cov : 1e10;
329  componentsArray.components[k].weight = caches[i].weights[j];
330  indices[k] = { i, j };
331  ++k;
332  }
333  }
334 
335  // fallback if we have a component without measurement
336  if (componentWithoutMeasurement) {
337  auto* result = std::max_element(
338  componentsArray.components.data(),
339  componentsArray.components.data() + componentsArray.numComponents,
340  [](const auto& a, const auto& b) { return a.weight < b.weight; });
341  auto index = std::distance(componentsArray.components.data(), result);
342 
343  // Build the first TP
344  size_t stateIndex = indices[index].first;
345  size_t materialIndex = indices[index].second;
346 
347  AmgVector(5)& updatedStateVector =
348  caches[stateIndex].deltaParameters[materialIndex];
349  const AmgSymMatrix(5)* measuredCov =
350  inputState[stateIndex].params->covariance();
351  std::optional<AmgSymMatrix(5)> updatedCovariance = std::nullopt;
352  if (measuredCov &&
353  caches[stateIndex].deltaCovariances.size() > materialIndex) {
354  updatedCovariance =
355  AmgSymMatrix(5)(caches[stateIndex].deltaCovariances[materialIndex]);
356  }
357  std::unique_ptr<Trk::TrackParameters> updatedTrackParameters =
358  inputState[stateIndex]
359  .params->associatedSurface()
360  .createUniqueTrackParameters(updatedStateVector[Trk::loc1],
361  updatedStateVector[Trk::loc2],
362  updatedStateVector[Trk::phi],
363  updatedStateVector[Trk::theta],
364  updatedStateVector[Trk::qOverP],
365  std::move(updatedCovariance));
366 
367  Trk::ComponentParameters dummyCompParams = {std::move(updatedTrackParameters),
368  1.};
369  Trk::MultiComponentState returnMultiState;
370  returnMultiState.push_back(std::move(dummyCompParams));
371  return returnMultiState;
372  }
373 
374  // Gather the merges we need
376  if (n > m_maximumNumberOfComponents) {
377  KL = findMerges(componentsArray, m_maximumNumberOfComponents);
378  }
379 
380  // Merge components "From" to components "To"
382  std::array<bool, GSFConstants::maxComponentsAfterConvolution> isMerged = {};
383  int returnedMerges = KL.numMerges;
384 
385  for (int i = 0; i < returnedMerges; ++i) {
386  const int8_t mini = KL.merges[i].To;
387  const int8_t minj = KL.merges[i].From;
388  if (isMerged[minj]) {
389  ATH_MSG_WARNING("Component is already merged " << static_cast<int>(minj));
390  continue;
391  }
392  // Get the first TP
393  size_t stateIndex = indices[mini].first;
394  size_t materialIndex = indices[mini].second;
395  // Copy weight and first parameters as they are needed later on
396  // for updating the covariance
397  AmgVector(5) firstParameters =
398  caches[stateIndex].deltaParameters[materialIndex];
399  double firstWeight = caches[stateIndex].weights[materialIndex];
400 
401  // Get the second TP
402  size_t stateIndex2 = indices[minj].first;
403  size_t materialIndex2 = indices[minj].second;
404 
405  // Some values for sanity checks
406  isMerged[minj] = true;
407 
408  // Update first parameters and weight
410  caches[stateIndex].deltaParameters[materialIndex],
411  caches[stateIndex].weights[materialIndex],
412  caches[stateIndex2].deltaParameters[materialIndex2],
413  caches[stateIndex2].weights[materialIndex2]);
414 
415  // Update covariance
417  firstParameters,
418  caches[stateIndex].deltaCovariances[materialIndex],
419  firstWeight,
420  caches[stateIndex2].deltaParameters[materialIndex2],
421  caches[stateIndex2].deltaCovariances[materialIndex2],
422  caches[stateIndex2].weights[materialIndex2]);
423 
424  // Reset 2nd parameters values just for clarity
425  caches[stateIndex2].deltaParameters[materialIndex2].setZero();
426  caches[stateIndex2].deltaCovariances[materialIndex2].setZero();
427  }
428 
429  // Loop over remaining unmerged components
430  for (size_t i(0); i < n; ++i) {
431  if (isMerged[i]) {
432  continue;
433  }
434 
435  // Build the TP
436  size_t stateIndex = indices[i].first;
437  size_t materialIndex = indices[i].second;
438  AmgVector(5)& stateVector =
439  caches[stateIndex].deltaParameters[materialIndex];
440  AmgSymMatrix(5)& measuredCov =
441  caches[stateIndex].deltaCovariances[materialIndex];
442 
443  std::unique_ptr<Trk::TrackParameters> updatedTrackParameters =
444  inputState[stateIndex]
445  .params->associatedSurface()
446  .createUniqueTrackParameters(stateVector[Trk::loc1],
447  stateVector[Trk::loc2],
448  stateVector[Trk::phi],
449  stateVector[Trk::theta],
450  stateVector[Trk::qOverP],
451  measuredCov);
452 
453  double updatedWeight = caches[stateIndex].weights[materialIndex];
454 
455  assemblerCache.multiComponentState.push_back({
456  std::move(updatedTrackParameters), updatedWeight});
457  assemblerCache.validWeightSum += updatedWeight;
458  }
459 
460  // Check all weights
461  Trk::MultiComponentState mergedState =
462  MultiComponentStateAssembler::assembledState(std::move(assemblerCache));
463 
464  if (mergedState.size() > m_maximumNumberOfComponents)
465  ATH_MSG_ERROR("Merging failed, target size: " << m_maximumNumberOfComponents
466  << " final size: "
467  << mergedState.size());
468  return mergedState;
469 }
470 
Trk::ElectronMaterialMixtureConvolution::initialize
virtual StatusCode initialize() override final
Convolution with full material properties.
Definition: ElectronMaterialMixtureConvolution.cxx:111
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MultiComponentStateCombiner.h
inline_hints.h
get_generator_info.result
result
Definition: get_generator_info.py:21
GSFUtils::MergeArray
struct representing an array or the merges.
Definition: KLGaussianMixtureReduction.h:54
Trk::MultiComponentStateAssembler::assembledState
MultiComponentState assembledState(MultiComponentStateAssembler::Cache &&cache)
Method to return the cached state object - it performs a reweighting before returning the object base...
Definition: MultiComponentStateAssembler.cxx:120
GSFUtils::Component1DArray::numComponents
int numComponents
Definition: KLGaussianMixtureReduction.h:46
PerigeeSurface.h
MaterialProperties.h
Trk::ParametersBase::position
const Amg::Vector3D & position() const
Access method for the position.
index
Definition: index.py:1
Trk::indices
std::pair< long int, long int > indices
Definition: AlSymMatBase.h:24
Trk::ElectronMaterialMixtureConvolution::postUpdate
virtual MultiComponentState postUpdate(std::vector< GsfMaterial::Combined > &, const MultiComponentState &, const Layer &, PropDirection direction=anyDirection, ParticleHypothesis particleHypothesis=nonInteracting) const override final
Definition: ElectronMaterialMixtureConvolution.cxx:184
python.SystemOfUnits.MeV
int MeV
Definition: SystemOfUnits.py:154
plotBeamSpotVxVal.cov
cov
Definition: plotBeamSpotVxVal.py:201
InDetSecVtxTruthMatchUtils::isMerged
bool isMerged(int matchInfo)
Definition: InDetSecVtxTruthMatchTool.h:52
Trk::loc2
@ loc2
generic first and second local coordinate
Definition: ParamDefs.h:35
Layer.h
ORAlgo::Normal
@ Normal
GsfMaterial::Combined::deltaCovariances
std::array< AmgSymMatrix(5), GSFConstants::maxNumberofMatComponents > deltaCovariances
Definition: GsfMaterial.h:56
ElectronMaterialMixtureConvolution.h
Class description for convolution of GSF material mixture.
Trk::MultiComponentStateAssembler::Cache
Definition: MultiComponentStateAssembler.h:35
InDetAccessor::qOverP
@ qOverP
perigee
Definition: InDetAccessor.h:35
Trk::ElectronMaterialMixtureConvolution::update
virtual MultiComponentState update(std::vector< GsfMaterial::Combined > &, const MultiComponentState &, const Layer &, PropDirection direction=anyDirection, ParticleHypothesis particleHypothesis=nonInteracting) const override final
Convolution with pre-measurement-update material properties.
Definition: ElectronMaterialMixtureConvolution.cxx:129
Trk::ElectronMaterialMixtureConvolution::~ElectronMaterialMixtureConvolution
virtual ~ElectronMaterialMixtureConvolution()
AlgTool initialise method.
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:50
Trk::MultiComponentStateCombiner::combineCovWithWeight
void combineCovWithWeight(const AmgVector(5) &firstParameters, AmgSymMatrix(5) &firstMeasuredCov, const double firstWeight, const AmgVector(5) &secondParameters, const AmgSymMatrix(5) &secondMeasuredCov, const double secondWeight)
Update cov matrix.
Definition: MultiComponentStateCombiner.cxx:385
GSFConstants::maxNumberofStateComponents
constexpr int8_t maxNumberofStateComponents
Note the Gaussian sum approach as describe e.g in " Optimal Filtering" Anderson and Moore "Track Fitt...
Definition: GsfConstants.h:47
Trk::AmgSymMatrix
AmgSymMatrix(5) &GXFTrackState
Definition: GXFTrackState.h:156
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:25
GsfMaterial::Combined::numEntries
size_t numEntries
Definition: GsfMaterial.h:58
MultiComponentStateAssembler.h
Trk::PropDirection
PropDirection
Definition: PropDirection.h:19
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
Trk::ElectronCombinedMaterialEffects
Definition: ElectronCombinedMaterialEffects.h:26
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
ATH_FLATTEN
#define ATH_FLATTEN
Definition: inline_hints.h:52
beamspotman.n
n
Definition: beamspotman.py:731
Trk::theta
@ theta
Definition: ParamDefs.h:66
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
GSFConstants::maxComponentsAfterConvolution
constexpr int8_t maxComponentsAfterConvolution
The maximum size State x Bethe-Heitler components The typical number we use is the max 6x12 = 72 i....
Definition: GsfConstants.h:61
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Trk::ElectronMaterialMixtureConvolution::preUpdate
virtual MultiComponentState preUpdate(std::vector< GsfMaterial::Combined > &, const MultiComponentState &, const Layer &, PropDirection direction=anyDirection, ParticleHypothesis particleHypothesis=nonInteracting) const override final
Convolution with post-measurement-update material properties.
Definition: ElectronMaterialMixtureConvolution.cxx:154
test_pyathena.parent
parent
Definition: test_pyathena.py:15
Trk::MultiComponentState
std::vector< ComponentParameters > MultiComponentState
Definition: ComponentParameters.h:27
Trk::ParametersBase
Definition: ParametersBase.h:55
GsfMaterial::Combined
Helper struct for combined material effects, multicomponent description.
Definition: GsfMaterial.h:48
min
#define min(a, b)
Definition: cfImp.cxx:40
Trk::MultiComponentStateCombiner::combineParametersWithWeight
void combineParametersWithWeight(AmgVector(5) &firstParameters, double &firstWeight, const AmgVector(5) &secondParameters, const double secondWeight)
Update parameters.
Definition: MultiComponentStateCombiner.cxx:358
GsfMaterial::Combined::deltaPs
std::array< double, GSFConstants::maxNumberofMatComponents > deltaPs
Definition: GsfMaterial.h:50
Trk::MultiComponentStateHelpers::renormaliseState
void renormaliseState(MultiComponentState &, double norm=1)
Performing renormalisation of total state weighting to one.
Definition: ComponentParameters.cxx:80
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
weights
Definition: herwig7_interface.h:44
GSFUtils::Component1DArray::components
std::array< Component1D, GSFConstants::maxComponentsAfterConvolution > components
Definition: KLGaussianMixtureReduction.h:45
Trk::ComponentParameters
Definition: ComponentParameters.h:22
KLGaussianMixtureReduction.h
Utilities to facilitate the calculation of the KL divergence/distance between components of the mixtu...
Trk::ParametersBase::momentum
const Amg::Vector3D & momentum() const
Access method for the momentum.
ComponentParameters.h
Definition of component parameters for use in a mixture of many components. In this regime each track...
DeMoScan.index
string index
Definition: DeMoScan.py:364
Trk::MaterialProperties
Definition: MaterialProperties.h:40
a
TList * a
Definition: liststreamerinfos.cxx:10
Trk::MultiComponentStateAssembler::Cache::multiComponentState
Trk::MultiComponentState multiComponentState
Definition: MultiComponentStateAssembler.h:39
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
Trk::qOverP
@ qOverP
perigee
Definition: ParamDefs.h:67
GsfMaterial::Combined::deltaParameters
std::array< AmgVector(5), GSFConstants::maxNumberofMatComponents > deltaParameters
Definition: GsfMaterial.h:53
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
GsfConstants.h
Trk::phi
@ phi
Definition: ParamDefs.h:75
PowhegControl_ttFCNC_NLO.params
params
Definition: PowhegControl_ttFCNC_NLO.py:226
AthAlgTool
Definition: AthAlgTool.h:26
Trk::ElectronMaterialMixtureConvolution::MaterialUpdateType
MaterialUpdateType
Definition: ElectronMaterialMixtureConvolution.h:35
Trk::loc1
@ loc1
Definition: ParamDefs.h:34
GSFUtils::MergeArray::numMerges
int numMerges
Definition: KLGaussianMixtureReduction.h:61
Trk::MultiComponentStateAssembler::Cache::validWeightSum
double validWeightSum
Definition: MultiComponentStateAssembler.h:40
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
Trk::ElectronMaterialMixtureConvolution::ElectronMaterialMixtureConvolution
ElectronMaterialMixtureConvolution(const std::string &, const std::string &, const IInterface *)
Destructor.
Definition: ElectronMaterialMixtureConvolution.cxx:98
WriteBchToCool.update
update
Definition: WriteBchToCool.py:67
fitman.k
k
Definition: fitman.py:528
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
Trk::Layer
Definition: Layer.h:73
GSFUtils::findMerges
MergeArray findMerges(const Component1DArray &componentsIn, const int8_t reducedSize)
Find the order in which the components need to be merged.
Definition: KLGaussianMixtureReduction.cxx:391
GSFUtils::Component1DArray
struct representing an array of 1D component.
Definition: KLGaussianMixtureReduction.h:42
GSFUtils::MergeArray::merges
std::array< merge, GSFConstants::maxComponentsAfterConvolution > merges
Definition: KLGaussianMixtureReduction.h:60