Helper to combine forward with smoother MultiComponentStates.
153{
154 auto combinedMultiState = std::make_unique<Trk::MultiComponentState>();
155
156
157 for (const auto& forwardsComponent : forwardsMultiState) {
158 const AmgSymMatrix(5)* forwardCov = forwardsComponent.params->covariance();
159
160 for (const auto& smootherComponent : smootherMultiState) {
161 const AmgSymMatrix(5)* smootherCov = smootherComponent.params->covariance();
162
163
164 if (!smootherCov && !forwardCov) {
165 return {};
166 }
167
168 if (!forwardCov) {
170 smootherComponent.params->uniqueClone(), smootherComponent.weight};
171 combinedMultiState->push_back(std::move(smootherComponentOnly));
172 continue;
173 }
174
175 if (!smootherCov) {
176 Trk::ComponentParameters forwardComponentOnly = {
177 forwardsComponent.params->uniqueClone(), forwardsComponent.weight};
178 combinedMultiState->push_back(std::move(forwardComponentOnly));
179 continue;
180 }
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
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);
212
214 (forwardsComponent.params)
215 ->associatedSurface()
216 .createUniqueTrackParameters(
217 newParameters[Trk::
loc1],
218 newParameters[Trk::
loc2],
219 newParameters[Trk::
phi],
220 newParameters[Trk::
theta],
221 newParameters[Trk::
qOverP],
222 std::move(covarianceOfNewParameters));
223
224
225
226
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 *
233 weightScalingFactor;
234 Trk::ComponentParameters combinedComponent = {
235 std::move(combinedTrackParameters), combinedWeight};
236 combinedMultiState->push_back(std::move(combinedComponent));
237 }
238 }
239
240
242 merge(std::move(*combinedMultiState), maximumNumberOfComponents);
243
245
246 return mergedState;
247}
#define AmgSymMatrix(dim)
void renormaliseState(MultiComponentState &, double norm=1)
Performing renormalisation of total state weighting to one.
std::vector< ComponentParameters > MultiComponentState
@ loc2
generic first and second local coordinate
ParametersBase< TrackParametersDim, Charged > TrackParameters
merge(input_file_pattern, output_file)
Merge many input LHE files into a single output file.