153 {
154 using namespace Acts::UnitLiterals;
155
158 const AtlasFieldCacheCondObj* field_cond_data = fieldHandle.
cptr();
159 MagField::AtlasFieldCache fieldCache;
161
163
169 }
170
173
174
175 std::vector<float> tmp_cov_vector;
176 std::vector<ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType> tmp_param_state_idx;
177 tmp_param_state_idx.reserve(30);
179 std::vector<std::vector<float>> parametersVec;
180 ActsTrk::detail::HitSummaryData hitInfo;
181
182
183 Acts::BoundTrackParameters perigeeParam = [&] {
184 if (perigeeSurface == nullptr) {
185 return track.createParametersAtReference();
186 } else {
188 }
189 }();
190
191 Acts::BoundVector boundParams = perigeeParam.parameters();
192 track_particle.setDefiningParameters(boundParams[Acts::eBoundLoc0],
193 boundParams[Acts::eBoundLoc1],
194 boundParams[Acts::eBoundPhi],
195 boundParams[Acts::eBoundTheta],
196 boundParams[Acts::eBoundQOverP] * 1_MeV);
197
198 if (perigeeParam.covariance().has_value()) {
199 lowerTriangleToVectorScaleLastRow(perigeeParam.covariance().value(), tmp_cov_vector, 5, 1_MeV);
200 track_particle.setDefiningParametersCovMatrixVec(tmp_cov_vector);
201 }
202
203
204 if (beamspot_data) {
205 track_particle.setBeamlineTiltX(beamspot_data->beamTilt(0));
206 track_particle.setBeamlineTiltY(beamspot_data->beamTilt(1));
207 }
208
209
210 track_particle.setFitQuality(
track.chi2(),
track.nDoF());
213
214 const Acts::ParticleHypothesis& hypothesis =
track.particleHypothesis();
216 constexpr float inv_1_MeV = 1 / 1_MeV;
217
220
221 ActsTrk::detail::SumOfValues chi2_stat;
223 siDetEleColl,
224 measurementToSummaryType,
225 chi2_stat,
226 hitInfo,
227 tmp_param_state_idx,
228 specialHitCounts);
229
230
231 std::array<std::tuple<uint8_t, uint8_t, uint8_t, bool>, 4> copy_summary {
235 false),
236
240 true),
241
245 true),
246
250 true) };
251
252 for (auto [src_region, dest_xaod_summary_layer, dest_xaod_summary_hits, add_outlier] : copy_summary) {
253 setSummaryValue(track_particle,
256 setSummaryValue(track_particle,
258 + (add_outlier
260 : 0),
262 }
263 setSummaryValue(track_particle,
267 setSummaryValue(track_particle,
270 setSummaryValue(track_particle,
276 setSummaryValue(track_particle,
280 setSummaryValue(track_particle,
283 setSummaryValue(track_particle,
286 setSummaryValue(track_particle,
289 setSummaryValue(track_particle,
293 setSummaryValue(track_particle,
296
297
298 std::array<unsigned int, 4> expect_layer_pattern{};
301 } else {
307 perigeeParam,
309 : std::array<unsigned int, 4>{0u, 0u, 0u, 0u});
310 }
311
312
313 setSummaryValue(track_particle,
314 static_cast<uint8_t>((expect_layer_pattern[0] & (1<<0)) != 0),
316 setSummaryValue(track_particle,
317 static_cast<uint8_t>((expect_layer_pattern[0] & (1<<1)) != 0),
319 setSummaryValue(track_particle,
322 setSummaryValue(track_particle,
325 setSummaryValue(track_particle,
328 setSummaryValue(track_particle,
331 setSummaryValue(track_particle,
334 setSummaryValue(track_particle,
337
338
339 setSummaryValue(track_particle,
342 setSummaryValue(track_particle,
345 setSummaryValue(track_particle,
348 setSummaryValue(track_particle,
351
353 setSummaryValue(track_particle,
354 static_cast<uint8_t>(biased_chi2_variance > 0.
355 ? std::min(static_cast<unsigned int>(std::sqrt(biased_chi2_variance) * 100), 255u)
356 : 0u),
358
359 setSummaryValue(track_particle,
363
364
366 tmp_param_state_idx[1] = tmp_param_state_idx.back();
367 tmp_param_state_idx.erase(tmp_param_state_idx.begin() + 2, tmp_param_state_idx.end());
368 }
369
370
371 parametersVec.clear();
372 parametersVec.reserve(tmp_param_state_idx.size());
373
374 for (std::vector<ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType>::const_reverse_iterator
375 idx_iter = tmp_param_state_idx.rbegin();
376 idx_iter != tmp_param_state_idx.rend();
377 ++idx_iter) {
378 ActsTrk::TrackStateBackend::ConstTrackStateProxy
379 state =
track.container().trackStateContainer().getTrackState(*idx_iter);
380 const Acts::BoundTrackParameters actsParam =
track.createParametersFromState(state);
381
382 Acts::Vector3 position = actsParam.position(gctx.context());
383 Acts::Vector3
momentum = actsParam.momentum();
384
385
386 for (
unsigned int i = 0;
i <
momentum.rows(); ++
i) {
388 }
389
390 if (actsParam.covariance()) {
392 Acts::GeometryContext tgContext = gctx.context();
393
394 magnFieldVect.setZero();
395 fieldCache.
getField(position.data(), magnFieldVect.data());
396
397 {
398 using namespace Acts::UnitLiterals;
399 magnFieldVect *= 1000_T;
400 }
401
403 if (curvilinear_cov_result.has_value()) {
404 Acts::BoundMatrix& curvilinear_cov = curvilinear_cov_result.value();
405
406
407 for (unsigned int col_i = 0; col_i < 4; ++col_i) {
408 curvilinear_cov(col_i, 4) *= 1_MeV;
409 curvilinear_cov(4, col_i) *= 1_MeV;
410 }
411 curvilinear_cov(4, 4) *= (1_MeV * 1_MeV);
412
413 std::size_t param_idx = parametersVec.size();
414
415 lowerTriangleToVector(curvilinear_cov, tmp_cov_vector, 5);
416 if (tmp_cov_vector.size() != 15) {
417 ATH_MSG_ERROR(
"Invalid size of lower triangle cov " << tmp_cov_vector.size() <<
" != 15"
418 << " input matrix : " << curvilinear_cov.rows() << " x " << curvilinear_cov.cols());
419 }
420 track_particle.setTrackParameterCovarianceMatrix(param_idx, tmp_cov_vector);
421 }
422 }
423 parametersVec.emplace_back(std::vector<float>{
424 static_cast<float>(position[0]), static_cast<float>(position[1]), static_cast<float>(position[2]),
425 static_cast<float>(momentum[0]),
static_cast<float>(
momentum[1]),
static_cast<float>(momentum[2]) });
426 }
427 for (const std::vector<float>& param : parametersVec) {
428 if (param.size() != 6) {
429 ATH_MSG_ERROR(
"Invalid size of param element " << param.size() <<
" != 6");
430 }
431 }
432
433 track_particle.setTrackParameters(parametersVec);
434
435 return StatusCode::SUCCESS;
436 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATLAS_THREAD_SAFE
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Acts::BoundTrackParameters parametersAtPerigee(const EventContext &ctx, const ActsTrk::TrackContainer::ConstTrackProxy &track, const Acts::PerigeeSurface &perigee_surface) const
Gaudi::Property< bool > m_firstAndLastParamOnly
Gaudi::Property< bool > m_expectIfPixelContributes
Gaudi::Property< double > m_pixelExpectLayerPathLimitInMM
Gaudi::Property< int > m_trackFitter
SG::ReadCondHandleKeyArray< InDetDD::SiDetectorElementCollection > m_siDetEleCollKey
Gaudi::Property< unsigned long > m_patternRecognitionInfo
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
Gaudi::Property< std::vector< unsigned int > > m_siDetEleCollToMeasurementType
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
static xAOD::ParticleHypothesis convertParticleHypothesis(Acts::PdgParticle abs_pdg_id)
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,...
const_pointer_type cptr()
void gatherTrackSummaryData(const typename ActsTrk::TrackContainer::ConstTrackProxy &track, const std::array< const InDetDD::SiDetectorElementCollection *, to_underlying(xAOD::UncalibMeasType::nTypes)> &siDetEleColl, const std::array< unsigned short, to_underlying(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, to_underlying(HitCategory::N)>, to_underlying(xAOD::UncalibMeasType::nTypes)> &special_hit_counts_out)
Helper to gather track summary information from the track states of the specified track.
constexpr std::underlying_type< T_EnumClass >::type to_underlying(T_EnumClass an_enum)
Helper to convert class enum into an integer.
std::array< unsigned int, 4 > expectedLayerPattern(const EventContext &ctx, const 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
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
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].
static std::array< unsigned int, 4 > get(const track_proxy_t &track)
static bool exists(track_container_t &trackContainer)