14 #include "Acts/Surfaces/PerigeeSurface.hpp"
17 struct TrackFindingBaseAlg::CKF_pimpl :
public detail::CKF_config {};
83 auto magneticField = std::make_unique<ATLASMagneticFieldWrapper>();
87 detail::Navigator::Config
config{trackingGeometry};
88 config.resolvePassive =
false;
89 config.resolveMaterial =
true;
90 config.resolveSensitive =
true;
98 std::vector<double> absEtaEdges;
101 absEtaEdges.reserve(2
ul);
102 absEtaEdges.push_back(0.0);
103 absEtaEdges.push_back(std::numeric_limits<double>::infinity());
113 auto setCut = [](
auto &cfgVal,
const auto &
cuts,
size_t ind) ->
void
120 Acts::TrackSelector::EtaBinnedConfig trackSelectorCfg{std::move(absEtaEdges)};
123 assert(trackSelectorCfg.cutSets.size() == 1);
124 trackSelectorCfg.cutSets[0].absEtaMin =
m_absEtaMin;
125 trackSelectorCfg.cutSets[0].absEtaMax =
m_absEtaMax;
128 for (
auto &
cfg : trackSelectorCfg.cutSets)
154 std::move(extrapolator),
157 Acts::TrackSelector{trackSelectorCfg}};
159 m_trackFinder = std::make_unique<CKF_pimpl>(std::move(ckfConfig));
161 trackFinder().
ckfExtensions.updater.connect<&ActsTrk::detail::FitterHelperFunctions::gainMatrixUpdate<detail::RecoTrackStateContainer>>();
167 return StatusCode::SUCCESS;
171 ATH_MSG_FATAL(
"execute() method from the base class was called! Implement proper execute() method in the derived class!");
173 return StatusCode::FAILURE;
179 return StatusCode::SUCCESS;
194 measurementSelector->
connect(&
options.extensions.createTrackStates);
196 return measurementSelector;
202 const Acts::PerigeeSurface* pSurface)
const {
203 Acts::PropagatorPlainOptions plainOptions{detContext.
geometry, detContext.
magField};
205 plainOptions.direction = Acts::Direction::Forward();
210 trackFinder().ckfExtensions, plainOptions, pSurface);
214 Acts::PropagatorPlainOptions plainSecondOptions{detContext.
geometry, detContext.
magField};
216 plainSecondOptions.direction = plainOptions.direction.invert();
219 options.extensions, plainSecondOptions, pSurface);
220 secondOptions.targetSurface = pSurface;
221 secondOptions.skipPrePropagationUpdate =
true;
223 return {std::move(
options), std::move(secondOptions), std::move(measurementSelector)};
229 return (!(std::abs(eta) < trackSelectorCfg.absEtaEdges.back())) ? trackSelectorCfg.cutSets.back()
230 : (std::abs(eta) < trackSelectorCfg.absEtaEdges.front()) ? trackSelectorCfg.cutSets.front()
231 : trackSelectorCfg.getCuts(eta);
234 std::vector<typename detail::RecoTrackContainer::TrackProxy>
243 if (!secondInitialParameters.referenceSurface().insideBounds(secondInitialParameters.localPosition())) {
247 auto rootBranch = tracksContainerTemp.makeTrack();
248 rootBranch.copyFrom(trackProxy,
false);
256 if (not secondResult.ok()) {
259 return secondResult.value();
263 if (trackState.hasReferenceSurface()) {
264 if (
const auto *actsDetElem =
dynamic_cast<const IDetectorElementBase *
>(trackState.referenceSurface().associatedDetectorElement())) {
265 switch (actsDetElem->detectorType()) {
280 const detail::RecoTrackContainer::TrackProxy &
track,
281 const detail::RecoTrackContainer::TrackStateProxy &trackState,
282 const Acts::TrackSelector::EtaBinnedConfig &trackSelectorCfg,
283 const Acts::GeometryContext &tgContext,
285 const std::size_t typeIndex,
286 EventStats::value_type &event_stat_category_i)
const {
295 measurementIndex,
true);
299 return BranchStopperResult::Continue;
302 const auto &
parameters = trackState.hasFiltered() ? trackState.filtered()
303 : trackState.predicted();
305 const auto &cutSet =
getCuts(eta);
314 <<
pT <<
" after " <<
track.nMeasurements()
316 return BranchStopperResult::StopAndDrop;
322 !(std::abs(eta) < trackSelectorCfg.absEtaEdges.back() +
326 << eta <<
" after " <<
track.nMeasurements()
328 return BranchStopperResult::StopAndDrop;
334 bool enoughMeasurements = (
track.nMeasurements() >= minMeasurementsBranchStop);
335 bool tooManyHoles = (
track.nHoles() > cutSet.maxHoles);
336 bool tooManyOutliers = (
track.nOutliers() > cutSet.maxOutliers);
339 auto [enoughMeasurementsPS, tooManyHolesPS, tooManyOutliersPS] =
341 enoughMeasurements = enoughMeasurements && enoughMeasurementsPS;
342 tooManyHoles = tooManyHoles || tooManyHolesPS;
343 tooManyOutliers = tooManyOutliers || tooManyOutliersPS;
346 if (!(tooManyHoles || tooManyOutliers)) {
347 return BranchStopperResult::Continue;
350 if (!enoughMeasurements) {
356 << (enoughMeasurements ?
"keep" :
"drop")
357 <<
" branch with nHoles=" <<
track.nHoles() <<
" ("
360 <<
" strip), nOutliers=" <<
track.nOutliers() <<
" ("
363 <<
"), nMeasurements=" <<
track.nMeasurements() <<
" ("
368 << (enoughMeasurements ?
"keep" :
"drop")
369 <<
" branch with nHoles=" <<
track.nHoles()
370 <<
", nOutliers=" <<
track.nOutliers()
371 <<
", nMeasurements=" <<
track.nMeasurements());
374 return enoughMeasurements ? BranchStopperResult::StopAndKeep
375 : BranchStopperResult::StopAndDrop;
381 tracksContainer.addColumn<
unsigned int>(
"nPixelHits");
382 tracksContainer.addColumn<
unsigned int>(
"nStripHits");
383 tracksContainer.addColumn<
unsigned int>(
"nPixelHoles");
384 tracksContainer.addColumn<
unsigned int>(
"nStripHoles");
385 tracksContainer.addColumn<
unsigned int>(
"nPixelOutliers");
386 tracksContainer.addColumn<
unsigned int>(
"nStripOutliers");
400 const detail::RecoTrackContainer::TrackProxy &
track,
403 if (typeFlags.test(Acts::TrackStateFlag::HoleFlag)) {
405 }
else if (typeFlags.test(Acts::TrackStateFlag::OutlierFlag)) {
407 }
else if (typeFlags.test(Acts::TrackStateFlag::MeasurementFlag)) {
411 if (typeFlags.test(Acts::TrackStateFlag::HoleFlag)) {
413 }
else if (typeFlags.test(Acts::TrackStateFlag::OutlierFlag)) {
415 }
else if (typeFlags.test(Acts::TrackStateFlag::MeasurementFlag)) {
422 const detail::RecoTrackContainer::TrackProxy &
track,
423 const detail::RecoTrackContainer::TrackProxy &
other) {
450 bool enoughMeasurements =
true, tooManyHoles =
false, tooManyOutliers =
false;
452 std::size_t
etaBin = (std::abs(eta) < trackSelectorCfg.absEtaEdges.front()) ? 0
453 : (std::abs(eta) >= trackSelectorCfg.absEtaEdges.back()) ? trackSelectorCfg.absEtaEdges.size() - 1
454 : trackSelectorCfg.binIndex(eta);
455 auto cutMin = [
etaBin](std::size_t
val,
const std::vector<std::size_t> &cutSet) {
456 return !cutSet.empty() && (
val < (
etaBin < cutSet.size() ? cutSet[
etaBin] : cutSet.back()));
458 auto cutMax = [
etaBin](std::size_t
val,
const std::vector<std::size_t> &cutSet) {
459 return !cutSet.empty() && (
val > (
etaBin < cutSet.size() ? cutSet[
etaBin] : cutSet.back()));
469 return {enoughMeasurements, tooManyHoles, tooManyOutliers};
477 ATH_MSG_ERROR(
"Outlier chi2 cut off provided but number of elements does not agree with"
478 " chi2 cut off for measurements which however is required: "
480 return StatusCode::FAILURE;
485 chi2CutOffOutlier.push_back( std::make_pair(
static_cast<float>(elm),
496 return StatusCode::SUCCESS ;
510 ATH_MSG_FATAL(
"Eta bins for statistics counter not in ascending order.");
520 std::lock_guard<std::mutex>
lock(m_mutex);
521 std::size_t category_i = 0;
522 for (
const std::array<unsigned int, kNStat> &src_stat : event_stat)
524 std::array<std::size_t, kNStat> &dest_stat = m_stat[category_i++];
525 for (std::size_t
i = 0;
i < src_stat.size(); ++
i)
527 assert(
i < dest_stat.size());
528 dest_stat[
i] += src_stat[
i];
537 std::vector<std::string> stat_labels =
543 std::make_pair(
kNoTrack,
"Cannot find track"),
551 std::make_pair(
kNoSecond,
"Tracks failing second CKF"),
556 assert(stat_labels.size() ==
kNStat);
562 std::vector<std::string> eta_labels;
564 for (std::size_t eta_bin_i = 0; eta_bin_i <
m_statEtaBins.size() + 2; ++eta_bin_i)
573 std::vector<std::size_t>
stat =
574 TableUtils::createCounterArrayWithProjections<std::size_t>(
nSeedCollections(),
579 std::size_t stat_stride =
583 std::size_t eta_stride =
587 std::stringstream table_out;
593 for (std::size_t stat_i = 0; stat_i <
kNStat; ++stat_i)
595 std::size_t dest_idx_offset = stat_i * stat_stride;
601 .dumpHeader(stat_i == 0)
602 .dumpFooter(stat_i + 1 ==
kNStat)
603 .separateLastRow(
true)
604 .minLabelWidth(max_label_width)
605 .labelPrefix(stat_labels.at(stat_i));
615 std::size_t dest_idx_offset = eta_bin_i * eta_stride;
619 eta_labels.at(eta_bin_i))
632 auto [ratio_labels, ratio_def] =
634 std::vector<TableUtils::SummandDefinition>{
667 for (std::size_t ratio_i = 0; ratio_i < ratio_labels.size(); ++ratio_i)
670 ratio_i * ratio_stride,
676 .dumpHeader(ratio_i == 0)
677 .dumpFooter(ratio_i + 1 == ratio_labels.size())
678 .separateLastRow(
true)
679 .minLabelWidth(max_label_width)
680 .labelPrefix(ratio_labels.at(ratio_i));
687 (
m_statEtaBins.size() + 1) * ratio_eta_stride + 0 * ratio_stride,
693 .minLabelWidth(max_label_width)
697 eta_labels.erase(eta_labels.end() - 1);
698 constexpr std::size_t ratio_i = 3;
700 ratio_i * ratio_stride,
708 .separateLastRow(
false)
709 .minLabelWidth(max_label_width)
710 .labelPrefix(ratio_labels.at(ratio_i));
719 std::vector<float>::const_iterator bin_iter = std::upper_bound(
m_statEtaBins.begin(),
723 assert(category_i < m_stat.size());
728 std::size_t
out = 0
u;
733 assert(category_i <
stat.size());
734 out +=
stat[category_i][counter_i];
743 return enoughMeasurementsPS && !tooManyHolesPS && !tooManyOutliersPS;