124 {
125 using namespace Acts::UnitLiterals;
126
127 const AtlasFieldCacheCondObj* field_cond_data{nullptr};
129 MagField::AtlasFieldCache fieldCache;
131
134 track_particle);
135 }
137
140
141
142 std::vector<float> tmp_cov_vector;
143 std::vector<ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType> tmp_param_state_idx;
144 tmp_param_state_idx.reserve(30);
146 std::vector<std::vector<float>> parametersVec;
147 ActsTrk::detail::HitSummaryData hitInfo;
148
149
150 Acts::BoundTrackParameters perigeeParam = [&] {
151 if (&perigeeSurface == &
track.referenceSurface()) {
152 return track.createParametersAtReference();
153 } else {
155 }
156 }();
157
158 Acts::BoundVector boundParams = perigeeParam.parameters();
159 track_particle.setDefiningParameters(boundParams[Acts::eBoundLoc0],
160 boundParams[Acts::eBoundLoc1],
161 boundParams[Acts::eBoundPhi],
162 boundParams[Acts::eBoundTheta],
163 boundParams[Acts::eBoundQOverP] * 1_MeV);
164
165 if (perigeeParam.covariance().has_value()) {
166 lowerTriangleToVectorScaleLastRow<5>(perigeeParam.covariance().value(), tmp_cov_vector, 1_MeV);
167 track_particle.setDefiningParametersCovMatrixVec(tmp_cov_vector);
168 }
169
170
171 if (beamspot_data) {
172 track_particle.setBeamlineTiltX(beamspot_data->beamTilt(0));
173 track_particle.setBeamlineTiltY(beamspot_data->beamTilt(1));
174 }
175
176
177 track_particle.setFitQuality(
track.chi2(),
track.nDoF());
180
181 const Acts::ParticleHypothesis& hypothesis =
track.particleHypothesis();
183 constexpr float inv_1_MeV = 1 / 1_MeV;
184
187
188 ActsTrk::detail::SumOfValues chi2_stat;
190 measurementToSummaryType,
191 chi2_stat,
192 hitInfo,
193 tmp_param_state_idx,
194 specialHitCounts);
195
196
197 std::array<std::tuple<uint8_t, uint8_t, uint8_t, bool>, 4> copy_summary {
201 false),
202
206 true),
207
211 true),
212
216 true) };
217
218 for (auto [src_region, dest_xaod_summary_layer, dest_xaod_summary_hits, add_outlier] : copy_summary) {
219 setSummaryValue(track_particle,
222 setSummaryValue(track_particle,
224 + (add_outlier
226 : 0),
228 }
229 setSummaryValue(track_particle,
233 setSummaryValue(track_particle,
236 setSummaryValue(track_particle,
242 setSummaryValue(track_particle,
246 setSummaryValue(track_particle,
249 setSummaryValue(track_particle,
252 setSummaryValue(track_particle,
255 setSummaryValue(track_particle,
259 setSummaryValue(track_particle,
262
263
264 std::array<unsigned int, 4> expect_layer_pattern{};
267 } else {
273 perigeeParam,
275 : std::array<unsigned int, 4>{0u, 0u, 0u, 0u});
276 }
277
278
279 setSummaryValue(track_particle,
280 static_cast<uint8_t>((expect_layer_pattern[0] & (1<<0)) != 0),
282 setSummaryValue(track_particle,
283 static_cast<uint8_t>((expect_layer_pattern[0] & (1<<1)) != 0),
285 setSummaryValue(track_particle,
288 setSummaryValue(track_particle,
291 setSummaryValue(track_particle,
294 setSummaryValue(track_particle,
297 setSummaryValue(track_particle,
300 setSummaryValue(track_particle,
303
304
305 setSummaryValue(track_particle,
308 setSummaryValue(track_particle,
311 setSummaryValue(track_particle,
314 setSummaryValue(track_particle,
317
319 setSummaryValue(track_particle,
320 static_cast<uint8_t>(biased_chi2_variance > 0.
321 ? std::min(static_cast<unsigned int>(std::sqrt(biased_chi2_variance) * 100), 255u)
322 : 0u),
324
325 setSummaryValue(track_particle,
329
330
332 tmp_param_state_idx[1] = tmp_param_state_idx.back();
333 tmp_param_state_idx.erase(tmp_param_state_idx.begin() + 2, tmp_param_state_idx.end());
334 }
335
336
337 parametersVec.clear();
338 parametersVec.reserve(tmp_param_state_idx.size());
339
340 for (std::vector<ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType>::const_reverse_iterator
341 idx_iter = tmp_param_state_idx.rbegin();
342 idx_iter != tmp_param_state_idx.rend();
343 ++idx_iter) {
344 ActsTrk::TrackStateBackend::ConstTrackStateProxy
345 state =
track.container().trackStateContainer().getTrackState(*idx_iter);
346 const Acts::BoundTrackParameters actsParam =
track.createParametersFromState(state);
347
348 Acts::Vector3
position = actsParam.position(gctx.context());
349 Acts::Vector3
momentum = actsParam.momentum();
350
351
352 for (
unsigned int i = 0;
i <
momentum.rows(); ++
i) {
354 }
355
356 if (actsParam.covariance()) {
358 Acts::GeometryContext tgContext = gctx.context();
359
360 magnFieldVect.setZero();
362
363 {
364 using namespace Acts::UnitLiterals;
365 magnFieldVect *= 1000_T;
366 }
367
369 if (curvilinear_cov_result.has_value()) {
370 Acts::BoundMatrix& curvilinear_cov = curvilinear_cov_result.value();
371
372
373 for (unsigned int col_i = 0; col_i < 4; ++col_i) {
374 curvilinear_cov(col_i, 4) *= 1_MeV;
375 curvilinear_cov(4, col_i) *= 1_MeV;
376 }
377 curvilinear_cov(4, 4) *= (1_MeV * 1_MeV);
378
379 std::size_t param_idx = parametersVec.size();
380
381 lowerTriangleToVector<5>(curvilinear_cov, tmp_cov_vector);
382 if (tmp_cov_vector.size() != 15) {
383 ATH_MSG_ERROR(
"Invalid size of lower triangle cov " << tmp_cov_vector.size() <<
" != 15"
384 << " input matrix : " << curvilinear_cov.rows() << " x " << curvilinear_cov.cols());
385 }
386 track_particle.setTrackParameterCovarianceMatrix(param_idx, tmp_cov_vector);
387 }
388 }
389 parametersVec.emplace_back(std::vector<float>{
390 static_cast<float>(
position[0]),
static_cast<float>(position[1]),
static_cast<float>(
position[2]),
391 static_cast<float>(momentum[0]),
static_cast<float>(
momentum[1]),
static_cast<float>(momentum[2]) });
392 }
393 for (const std::vector<float>& param : parametersVec) {
394 if (param.size() != 6) {
395 ATH_MSG_ERROR(
"Invalid size of param element " << param.size() <<
" != 6");
396 }
397 }
398
399 track_particle.setTrackParameters(parametersVec);
400 if( !parametersVec.empty() ) {
403 }
404
405
406 return StatusCode::SUCCESS;
407 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATLAS_THREAD_SAFE
Acts::BoundTrackParameters parametersAtPerigee(const EventContext &ctx, const ActsTrk::TrackContainer::ConstTrackProxy &track, const Acts::Surface &perigee_surface) const
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Gaudi::Property< bool > m_firstAndLastParamOnly
Gaudi::Property< bool > m_expectIfPixelContributes
Gaudi::Property< double > m_pixelExpectLayerPathLimitInMM
Gaudi::Property< int > m_trackFitter
PublicToolHandle< MuonR4::ITrackSummaryTool > m_muonSummaryTool
Gaudi::Property< unsigned long > m_patternRecognitionInfo
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
Gaudi::Property< bool > m_computeExpectedLayerPattern
DetectorRegion
Regions for which hit counts are computed.
uint8_t contributingSharedHits(DetectorRegion region) const
return the number of shared hits in a certain detector region.
uint8_t sum(DetectorRegion region, uint8_t layer) const
return the total number of hits, outliers, and/or shared hits in the givrn detector region and layer.
uint8_t contributingOutlierHits(DetectorRegion region) const
return the number of outliers in a certain detector region.
uint8_t contributingHits(DetectorRegion region) const
return the number of hits in a certain detector region.
uint8_t contributingLayers(DetectorRegion region) const
return the number of layers contributing to the hit collection in the given detector region.
double biasedVariance() const
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
void getField(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field value at given position xyz[3] is in mm, bxyz[3] is in kT if deriv[9] is given,...
xAOD::ParticleHypothesis convert(Acts::ParticleHypothesis h)
void gatherTrackSummaryData(const typename ActsTrk::TrackContainer::ConstTrackProxy &track, const std::array< unsigned short, Acts::toUnderlying(xAOD::UncalibMeasType::nTypes)> &measurement_to_summary_type, SumOfValues &chi2_stat_out, HitSummaryData &hit_info_out, std::vector< ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType > ¶m_state_idx_out, std::array< std::array< uint8_t, Acts::toUnderlying(HitCategory::N)>, Acts::toUnderlying(xAOD::UncalibMeasType::nTypes)> &special_hit_counts_out)
Helper to gather track summary information from the track states of the specified track.
std::array< unsigned int, 4 > expectedLayerPattern(const EventContext &ctx, const ActsTrk::IExtrapolationTool &extrapolator, const Acts::BoundTrackParameters &perigee_parameters, double pathLimit)
Extrapolate from the perigee outwards and gather information which detector layers should have hits.
std::optional< Acts::BoundMatrix > convertActsBoundCovToCurvilinearParam(const Acts::GeometryContext &tgContext, const Acts::BoundTrackParameters ¶m, const Acts::Vector3 &magnFieldVect, const Acts::ParticleHypothesis &particle_hypothesis)
Convert the covariance of the given Acts track parameters into curvilinear parameterisation.
Eigen::Matrix< double, 3, 1 > Vector3D
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.
TrackFitter
Enums to identify who created this track and which properties does it have.
SummaryType
Enumerates the different types of information stored in Summary.
@ numberOfInnermostPixelLayerSharedEndcapHits
number of Pixel 0th layer endcap hits shared by several tracks.
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfInnermostPixelLayerEndcapHits
these are the hits in the 0th pixel layer endcap [unit8_t].
@ numberOfNextToInnermostPixelLayerSharedHits
number of Pixel 1st layer barrel hits shared by several tracks.
@ numberOfNextToInnermostPixelLayerSharedEndcapHits
number of Pixel 1st layer endcap hits shared by several tracks.
@ numberOfContribPixelLayers
number of contributing layers of the pixel detector [unit8_t].
@ standardDeviationOfChi2OS
100 times the standard deviation of the chi2 from the surfaces [unit8_t].
@ numberOfInnermostPixelLayerEndcapOutliers
number of 0th layer endcap outliers
@ numberOfInnermostPixelLayerSharedHits
number of Pixel 0th layer barrel hits shared by several tracks.
@ numberOfPixelOutliers
these are the pixel outliers, including the b-layer [unit8_t].
@ numberOfContribPixelBarrelFlatLayers
number of contributing barrel flat layers of the pixel detector [unit8_t].
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ numberOfContribPixelBarrelInclinedLayers
number of contributing barrel inclined layers of the pixel detector [unit8_t].
@ numberOfPixelEndcapHits
these are the pixel hits, in the endcap layers [unit8_t].
@ numberOfInnermostPixelLayerOutliers
number of 0th layer barrel outliers
@ numberOfOutliersOnTrack
number of measurements flaged as outliers in TSOS [unit8_t].
@ numberOfNextToInnermostPixelLayerEndcapHits
these are the hits in the 0.5th and 1st pixel layer endcap rings [unit8_t].
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
@ numberOfContribPixelEndcap
number of contributing endcap layers of the pixel detector [unit8_t].
@ numberOfNextToInnermostPixelLayerEndcapOutliers
number of 1st layer endcap disk outliers
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelBarrelInclinedHits
these are the pixel hits, in the barrel inclined layers [unit8_t].
@ numberOfSCTOutliers
number of SCT outliers [unit8_t].
@ numberOfPixelBarrelFlatHits
these are the pixel hits, in the barrel flat layers [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfNextToInnermostPixelLayerOutliers
number of 1st pixel layer barrel outliers
@ numberOfSCTHoles
number of SCT holes [unit8_t].
@ FirstMeasurement
Parameter defined at the position of the 1st measurement.
@ LastMeasurement
Parameter defined at the position of the last measurement.
static std::array< unsigned int, 4 > get(const track_proxy_t &track)
static bool exists(track_container_t &trackContainer)