7 #include "Acts/Surfaces/PerigeeSurface.hpp"
8 #include "Acts/Surfaces/PlaneSurface.hpp"
9 #include "Acts/Surfaces/detail/PlanarHelper.hpp"
17 #include "GaudiKernel/PhysicalConstants.h"
22 #include "GaudiKernel/PhysicalConstants.h"
26 using namespace Acts::UnitLiterals;
27 using namespace Acts::PlanarHelper;
37 ATH_CHECK(m_visualizationTool.retrieve(EnableTool{!m_visualizationTool.empty()}));
39 ATH_CHECK(m_trackingGeometryTool.retrieve());
40 ATH_CHECK(m_extrapolationTool.retrieve());
48 seederCfg.selector = m_segSelector.get();
49 seederCfg.detMgr = m_detMgr;
51 m_seeder = std::make_unique<MsTrackSeeder>(
name(), std::move(seederCfg));
52 return StatusCode::SUCCESS;
55 MsTrackFindingAlg::~MsTrackFindingAlg() =
default;
58 ATH_MSG_VERBOSE(
"Run track finding in event "<<ctx.eventID().event_number());
63 auto seedContainer = findTrackSeeds(ctx, *allEventSegs);
65 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
66 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
70 Acts::VectorTrackContainer trackBackend{};
71 Acts::VectorMultiTrajectory trackStateBackend{};
73 std::move(trackStateBackend)};
75 cacheTrkContainer.addColumn<std::size_t>(
"parentSeed");
78 if (!fitSeedCandidate(tgContext, mfContext, calContext, seed,
83 auto lastTrack = cacheTrkContainer.getTrack(cacheTrkContainer.size() -1);
84 lastTrack.component<std::size_t, Acts::hashString(
"parentSeed")>() = seedIdx;
88 ATH_CHECK(writeHandleSeed.record(std::move(seedContainer)));
91 Acts::ConstVectorTrackContainer ctrackBackend{std::move(cacheTrkContainer.container())};
92 Acts::ConstVectorMultiTrajectory ctrackStateBackend{std::move(cacheTrkContainer.trackStateContainer())};
93 auto ctc = std::make_unique<ActsTrk::TrackContainer>(std::move(ctrackBackend),
94 std::move(ctrackStateBackend));
97 ATH_CHECK(writeHandle.record(std::move(ctc)));
98 return StatusCode::SUCCESS;
101 std::unique_ptr<MsTrackSeedContainer>
102 MsTrackFindingAlg::findTrackSeeds(
const EventContext& ctx,
105 auto seedContainer = m_seeder->findTrackSeeds(ctx, m_trackingGeometryTool->getGeometryContext(ctx), segments);
107 if (!m_visualizationTool.empty()) {
108 m_visualizationTool->displaySeeds(ctx, *m_seeder, segments, *seedContainer,
"all seeds");
110 return seedContainer;
114 MsTrackFindingAlg::prepareFit(
const Acts::GeometryContext& tgContext,
115 const Acts::MagneticFieldContext& mfContext,
116 const Acts::CalibrationContext& calContext,
118 const EventContext& ctx{*calContext.get<
const EventContext*>()};
120 measurements.reserve(100);
125 m_calibTool->stampSignsOnMeasurements(*segment);
128 std::stringstream sstr{};
132 <<
", "<<
m->numDimensions()<<
", "
133 <<
", "<<surf.geometryId()<<
" @ "<<
Amg::toString(surf.transform(tgContext))<<std::endl;
136 <<
", direction: "<<
Amg::toString(segment->direction())<<
"\n"<<sstr.str());
138 measurements.insert(measurements.end(),
139 std::make_move_iterator(segMeasurements.begin()),
140 std::make_move_iterator(segMeasurements.end()));
142 if (!refSeg && m_segSelector->passSeedingQuality(ctx, *
detailedSegment(*segment))) {
151 if (
false && refSeg != seed.segments().front()) {
153 const Acts::PlaneSurface& surf = innerPlane->
surface();
156 const Amg::Vector3D locSeedDir = toInnerPlane.linear() * seedDir;
158 auto seedOnInner = Acts::PlanarHelper::intersectPlane(locSeedPos, locSeedDir,
159 Amg::Vector3D::UnitZ(), 0.);
163 innerPars[Acts::toUnderlying(x0)] = seedOnInner.position().x();
165 Acts::makeDirectionFromPhiTheta(innerPars[Acts::toUnderlying(
phi)],
166 innerPars[Acts::toUnderlying(
theta)]);
168 Acts::makeDirectionFromAxisTangents(
houghTanAlpha(locSeedDir),
170 seedPos = surf.transform(tgContext) *
Amg::Vector3D{innerPars[Acts::toUnderlying(x0)],
171 innerPars[Acts::toUnderlying(y0)], 0};
172 seedDir = surf.transform(tgContext).linear() * combSegDir;
175 const double propDistance = (
xAOD::muonSurface(measurements[0]).center(tgContext) -
177 const Amg::Vector3D refPos = seedPos + propDistance * seedDir;
178 auto target = Acts::Surface::makeShared<Acts::PerigeeSurface>(refPos);
183 auto initialPars = Acts::BoundTrackParameters::create(tgContext,
target, fourPos,
186 Acts::BoundSquareMatrix::Identity(),
188 return std::make_pair(std::move(initialPars), std::move(measurements));
191 void MsTrackFindingAlg::visualizeObj(
const Acts::GeometryContext& tgContext,
192 const Acts::CalibrationContext& calContext,
198 const EventContext& ctx {*calContext.get<
const EventContext*>()};
200 Acts::ObjVisualization3D visualHelper{};
201 if (parsToExt.ok()) {
205 std::string saveStr =
std::format(
"MsTrackFinding_{:}", ctx.eventID().event_number());
212 visualHelper.write(saveStr);
216 bool MsTrackFindingAlg::fitSeedCandidate(
const Acts::GeometryContext& tgContext,
217 const Acts::MagneticFieldContext& mfContext,
218 const Acts::CalibrationContext& calContext,
222 ATH_MSG_DEBUG(__func__<<
"() "<<__LINE__<<
" - Attempt to fit a new track seed \n"<<seed);
224 const auto [initialPars, measurements] = prepareFit(tgContext, mfContext, calContext, seed);
226 if (!initialPars.ok()) {
227 ATH_MSG_WARNING(__func__<<
"() "<<__LINE__<<
" - Failed to construct valid parameters for seed \n"<<seed);
228 visualizeObj(tgContext, calContext, seed, initialPars);
231 auto fitTraject = m_trackFitTool->fit(measurements, *initialPars,
232 tgContext, mfContext, calContext,
233 &(*initialPars).referenceSurface());
234 if (!fitTraject || fitTraject->size() == 0) {
236 visualizeObj(tgContext, calContext, seed, initialPars);
239 outContainer.ensureDynamicColumns(*fitTraject);
240 auto destProxy = outContainer.getTrack(outContainer.addTrack());
241 destProxy.copyFrom(fitTraject->getTrack(0));
242 ATH_MSG_DEBUG(__func__<<
"() "<<__LINE__<<
" - Good track fit...");
243 for (
const auto state : destProxy.trackStates()) {
244 if (!state.hasUncalibratedSourceLink()){