29 const AmgVector(5)& firstParameters = firstTrackParameters->parameters();
30 double const firstWeight = mergeTo.
weight;
33 const AmgVector(5)& secondParameters = secondTrackParameters->parameters();
34 double const secondWeight = addThis.
weight;
37 AmgVector(5) finalParameters(firstParameters);
38 double finalWeight = firstWeight;
40 finalParameters, finalWeight, secondParameters, secondWeight);
45 if (firstMeasuredCov && secondMeasuredCov) {
48 firstParameters, finalMeasuredCov, firstWeight, secondParameters,
49 *secondMeasuredCov, secondWeight);
50 mergeTo.
params->updateParameters(finalParameters, finalMeasuredCov);
51 mergeTo.
weight = finalWeight;
53 mergeTo.
params->updateParameters(finalParameters);
54 mergeTo.
weight = finalWeight;
62 const unsigned int maximumNumberOfComponents) {
64 const int n = statesToMerge.size();
66 for (
int i = 0;
i <
n; ++
i) {
67 const AmgSymMatrix(5)* measuredCov = statesToMerge[
i].params->covariance();
72 componentsArray[
i].cov =
cov;
73 componentsArray[
i].invCov =
cov > 0 ? 1. /
cov : 1e10;
74 componentsArray[
i].weight = statesToMerge[
i].weight;
81 const int numMerges = merges.size();
82 for (
int i = 0;
i < numMerges; ++
i) {
83 const int mini = merges[
i].To;
84 const int minj = merges[
i].From;
85 combineWithWeight(statesToMerge[mini], statesToMerge[minj]);
86 statesToMerge[minj].params.reset();
87 statesToMerge[minj].weight = 0.;
90 for (
auto& state : statesToMerge) {
107 const unsigned int maximumNumberOfComponents) {
111 if (statesToMerge.size() <= maximumNumberOfComponents) {
118 bool componentWithoutMeasurement =
false;
119 Trk::MultiComponentState::const_iterator component = statesToMerge.cbegin();
120 for (; component != statesToMerge.cend(); ++component) {
121 if (!component->params->covariance()) {
122 componentWithoutMeasurement =
true;
126 if (componentWithoutMeasurement) {
129 statesToMerge.begin(), statesToMerge.end(),
135 returnMultiState.push_back(std::move(dummyCompParams));
136 return returnMultiState;
139 return mergeFullDistArray(cache, std::move(statesToMerge),maximumNumberOfComponents);
152 unsigned int maximumNumberOfComponents)
154 auto combinedMultiState = std::make_unique<Trk::MultiComponentState>();
157 for (
const auto& forwardsComponent : forwardsMultiState) {
158 const AmgSymMatrix(5)* forwardCov = forwardsComponent.params->covariance();
160 for (
const auto& smootherComponent : smootherMultiState) {
161 const AmgSymMatrix(5)* smootherCov = smootherComponent.params->covariance();
164 if (!smootherCov && !forwardCov) {
170 smootherComponent.
params->uniqueClone(), smootherComponent.weight};
171 combinedMultiState->push_back(std::move(smootherComponentOnly));
177 forwardsComponent.
params->uniqueClone(), forwardsComponent.weight};
178 combinedMultiState->push_back(std::move(forwardComponentOnly));
205 const AmgVector(5) smootherParams = smootherComponent.params->parameters();
206 const AmgVector(5) forwardParams = forwardsComponent.params->parameters();
207 const AmgSymMatrix(5) summedCovariance = *forwardCov + *smootherCov;
208 const AmgSymMatrix(5) invertedSummedCovariance = summedCovariance.inverse();
209 const AmgSymMatrix(5) K = *forwardCov * invertedSummedCovariance;
210 const AmgVector(5) newParameters = forwardParams + K * (smootherParams - forwardParams);
211 AmgSymMatrix(5) covarianceOfNewParameters = K * (*smootherCov);
213 std::unique_ptr<Trk::TrackParameters> combinedTrackParameters =
214 (forwardsComponent.params)
215 ->associatedSurface()
216 .createUniqueTrackParameters(
222 std::move(covarianceOfNewParameters));
227 const AmgVector(5) parametersDiff = forwardParams - smootherParams;
228 double const exponent = parametersDiff.transpose() *
229 invertedSummedCovariance * parametersDiff;
230 double const weightScalingFactor =
exp(-0.5 * exponent);
231 double const combinedWeight = smootherComponent.weight *
232 forwardsComponent.weight *
235 std::move(combinedTrackParameters), combinedWeight};
236 combinedMultiState->push_back(std::move(combinedComponent));
242 merge(std::move(*combinedMultiState), maximumNumberOfComponents);