56 updateP(
double&
qOverP,
double deltaP)
58 double p = 1. / std::abs(
qOverP);
67 std::pair<const Trk::MaterialProperties*, double>
73 double pathCorrection(0.);
77 materialProperties = materialProperties
79 :
layer.fullUpdateMaterialProperties(*trackParameters);
81 if (!materialProperties) {
82 return {
nullptr, 0 };
88 :
layer.surfaceRepresentation().pathCorrection(
93 const double pathLength = pathCorrection * materialProperties->thickness();
94 return { materialProperties, pathLength };
98 std::vector<GsfMaterial::Combined>& caches,
99 const std::vector<std::pair<size_t, size_t>>&
indices,
103 size_t numComponents =
indices.size();
105 std::vector<char>
isMerged(numComponents, 0);
107 const int returnedMerges = merges.size();
108 for (
int i = 0;
i < returnedMerges; ++
i) {
109 const int mini = merges[
i].To;
110 const int minj = merges[
i].From;
112 const size_t stateIndex =
indices[mini].first;
113 const size_t materialIndex =
indices[mini].second;
118 const double firstWeight = caches[stateIndex].
weights[materialIndex];
127 caches[stateIndex].
weights[materialIndex],
128 caches[stateIndex2].
parameters[materialIndex2],
129 caches[stateIndex2].
weights[materialIndex2]);
132 firstParameters, caches[stateIndex].covariances[materialIndex],
133 firstWeight, caches[stateIndex2].
parameters[materialIndex2],
134 caches[stateIndex2].covariances[materialIndex2],
135 caches[stateIndex2].
weights[materialIndex2]);
137 caches[stateIndex2].
parameters[materialIndex2].setZero();
138 caches[stateIndex2].covariances[materialIndex2].setZero();
142 for (
size_t i(0);
i < numComponents; ++
i) {
147 const size_t stateIndex =
indices[
i].first;
148 const size_t materialIndex =
indices[
i].second;
150 caches[stateIndex].parameters[materialIndex];
152 caches[stateIndex].covariances[materialIndex];
154 std::unique_ptr<Trk::TrackParameters> updatedTrackParameters =
155 inputState[stateIndex]
156 .params->associatedSurface()
157 .createUniqueTrackParameters(
162 const double updatedWeight = caches[stateIndex].weights[materialIndex];
165 {std::move(updatedTrackParameters), updatedWeight});
169 std::move(assemblerCache));
174 const std::string&
type,
175 const std::string&
name,
179 declareInterface<IMaterialMixtureConvolution>(
this);
190 return StatusCode::FAILURE;
193 m_materialEffects = std::make_unique<ElectronCombinedMaterialEffects>(
194 m_parameterisationFileName, m_parameterisationFileNameHighX0);
195 return StatusCode::SUCCESS;
203 std::vector<GsfMaterial::Combined>& caches,
208 const double updateFactor = 1.0;
210 caches, multiComponentState,
layer, direction, updateFactor);
212 if (updatedMergedState.empty()) {
216 return updatedMergedState;
224 std::vector<GsfMaterial::Combined>& caches,
229 const double updateFactor =
230 layer.preUpdateMaterialFactor(*multiComponentState.front().params, direction);
237 if (updatedMergedState.empty()) {
241 return updatedMergedState;
249 std::vector<GsfMaterial::Combined>& caches,
254 const double updateFactor =
layer.postUpdateMaterialFactor(
255 *multiComponentState.front().params, direction);
258 update(caches, multiComponentState,
layer, direction, updateFactor);
260 if (updatedMergedState.empty()) {
264 return updatedMergedState;
269 std::vector<GsfMaterial::Combined>& caches,
273 double updateFactor)
const
277 if (inputState.empty()) {
280 if (updateFactor < 0.01) {
284 caches.resize(inputState.size());
287 size_t numComponents(0);
288 for (
size_t i(0);
i < inputState.size(); ++
i) {
289 const AmgSymMatrix(5)* measuredCov = inputState[
i].params->covariance();
292 dummyCacheElement(caches[
i]);
293 updateCacheElement(caches[
i], 0, inputState[
i].
params->parameters(), measuredCov);
294 caches[
i].weights[0] = inputState[
i].weight;
295 numComponents += caches[
i].numEntries;
299 std::pair<const Trk::MaterialProperties*, double> matPropPair =
300 getMaterialProperties(inputState[
i].
params.get(),
layer);
302 if (!matPropPair.first) {
303 dummyCacheElement(caches[
i]);
304 updateCacheElement(caches[
i], 0, inputState[
i].
params->parameters(), measuredCov);
305 caches[
i].weights[0] = inputState[
i].weight;
306 numComponents += caches[
i].numEntries;
311 matPropPair.second *= updateFactor;
312 m_materialEffects->compute(caches[
i],
322 for (
size_t j(0); j < caches[
i].numEntries; ++j) {
323 updateCacheElement(caches[
i], j, inputState[
i].
params->parameters(), measuredCov);
327 caches[
i].deltaPs[j])) {
332 caches[
i].weights[j] *= inputState[
i].weight;
340 numComponents += caches[
i].numEntries;
348 bool componentWithoutMeasurement =
false;
352 std::vector<std::pair<size_t, size_t>>
indices{};
356 for (
size_t i(0);
i < inputState.size(); ++
i) {
357 for (
size_t j(0); j < caches[
i].numEntries; ++j) {
358 const AmgSymMatrix(5)* measuredCov = inputState[
i].params->covariance();
364 componentWithoutMeasurement =
true;
366 componentsArray[
k].mean = caches[
i].parameters[j][
Trk::qOverP];
367 componentsArray[
k].cov =
cov;
368 componentsArray[
k].invCov =
cov > 0 ? 1. /
cov : 1e10;
369 componentsArray[
k].weight = caches[
i].weights[j];
376 if (componentWithoutMeasurement) {
377 auto*
result = std::max_element(
378 componentsArray.
begin(), componentsArray.
end(),
379 [](
const auto&
a,
const auto&
b) { return a.weight < b.weight; });
384 AmgVector(5)& updatedStateVector = caches[stateIndex].parameters[materialIndex];
385 const AmgSymMatrix(5)* measuredCov = inputState[stateIndex].params->covariance();
386 std::optional<
AmgSymMatrix(5)> updatedCovariance = std::nullopt;
387 if (measuredCov && caches[stateIndex].covariances.size() > materialIndex) {
389 AmgSymMatrix(5)(caches[stateIndex].covariances[materialIndex]);
391 std::unique_ptr<Trk::TrackParameters> updatedTrackParameters =
392 inputState[stateIndex]
397 updatedStateVector[
Trk::qOverP], std::move(updatedCovariance));
400 std::move(updatedTrackParameters), 1.};
402 returnMultiState.push_back(std::move(dummyCompParams));
403 return returnMultiState;
408 if (numComponents > m_maximumNumberOfComponents) {
409 merges =
findMerges(std::move(componentsArray), m_maximumNumberOfComponents);
411 auto mergedState = createMergedState(merges, caches,
indices, inputState);
413 if (mergedState.size() > m_maximumNumberOfComponents) {
414 ATH_MSG_ERROR(
"Merging failed, target size: " << m_maximumNumberOfComponents
416 << mergedState.size());