7#include "Acts/Surfaces/PerigeeSurface.hpp"
8#include "Acts/Surfaces/PlaneSurface.hpp"
9#include "Acts/Surfaces/detail/PlanarHelper.hpp"
18#include "GaudiKernel/PhysicalConstants.h"
23#include "GaudiKernel/PhysicalConstants.h"
27using namespace Acts::UnitLiterals;
28using namespace Acts::PlanarHelper;
51 m_seeder = std::make_unique<MsTrackSeeder>(name(), std::move(seederCfg));
52 return StatusCode::SUCCESS;
58 ATH_MSG_VERBOSE(
"Run track finding in event "<<ctx.eventID().event_number());
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");
83 auto lastTrack = cacheTrkContainer.getTrack(cacheTrkContainer.size() -1);
84 lastTrack.component<std::size_t, Acts::hashString(
"parentSeed")>() = seedIdx;
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));
98 return StatusCode::SUCCESS;
101 std::unique_ptr<MsTrackSeedContainer>
110 return seedContainer;
115 const Acts::MagneticFieldContext& mfContext,
116 const Acts::CalibrationContext& calContext,
118 const EventContext& ctx{*calContext.get<
const EventContext*>()};
120 measurements.reserve(100);
127 if (
msgLvl(MSG::VERBOSE)) {
128 std::stringstream sstr{};
132 <<
", "<<m->numDimensions()<<
", "
133 <<
", "<<surf.geometryId()<<
" @ "<<
Amg::toString(surf.localToGlobalTransform(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()));
151 if (refSeg != seed.segments().front()) {
153 const Acts::PlaneSurface& surf = innerPlane->
surface();
154 const Amg::Transform3D toInnerPlane = surf.localToGlobalTransform(tgContext).inverse();
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.localToGlobalTransform(tgContext) *
Amg::Vector3D{innerPars[Acts::toUnderlying(x0)],
171 innerPars[Acts::toUnderlying(y0)], 0};
172 seedDir = surf.localToGlobalTransform(tgContext).linear() * combSegDir;
180 assert(volume !=
nullptr);
183 using namespace Acts::PlanarHelper;
185 auto pIsect = intersectPlane(seedPos, seedDir,
186 targetSurf->localToGlobalTransform(tgContext).linear().col(2),
187 targetSurf->center(tgContext));
192 auto initialPars = Acts::BoundTrackParameters::create(tgContext, targetSurf, fourPos,
194 Acts::BoundMatrix::Identity(),
195 Acts::ParticleHypothesis::muon());
196 return std::make_pair(std::move(initialPars), std::move(measurements));
200 const Acts::MagneticFieldContext& mfContext,
201 const Acts::CalibrationContext& calContext,
205 ATH_MSG_DEBUG(__func__<<
"() "<<__LINE__<<
" - Attempt to fit a new track seed \n"<<seed);
206 const EventContext& ctx{*calContext.get<
const EventContext*>()};
207 const auto [initialPars, measurements] =
prepareFit(tgContext, mfContext, calContext, seed);
209 if (!initialPars.ok()) {
210 ATH_MSG_WARNING(__func__<<
"() "<<__LINE__<<
" - Failed to construct valid parameters for seed \n"<<seed);
217 tgContext, mfContext, calContext,
218 &(*initialPars).referenceSurface());
219 if (!fitTraject || fitTraject->size() == 0) {
226 outContainer.ensureDynamicColumns(*fitTraject);
227 auto destProxy = outContainer.getTrack(outContainer.addTrack());
228 destProxy.copyFrom(fitTraject->getTrack(0));
229 ATH_MSG_DEBUG(__func__<<
"() "<<__LINE__<<
" - Good track fit...");
232 destProxy.createParametersAtReference(),
"GoodFit");
234 for (
const auto state : destProxy.trackStates()) {
235 if (!state.hasUncalibratedSourceLink()){
Scalar phi() const
phi method
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
ATLAS-specific HepMC functions.
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
A spectrometer sector forms the envelope of all chambers that are placed in the same MS sector & laye...
const Acts::PlaneSurface & surface() const
Returns the associated surface.
Acts::Result< Acts::BoundTrackParameters > OptBoundPars_t
Gaudi::Property< double > m_seedHalfLength
Maximum search window to search segments for.
std::unique_ptr< MsTrackSeedContainer > findTrackSeeds(const EventContext &ctx, const xAOD::MuonSegmentContainer &segments) const
Iterates over the search tree and combines close-by segments to a track seed.
std::vector< const xAOD::UncalibratedMeasurement * > MeasVec_t
SG::WriteHandleKey< ActsTrk::TrackContainer > m_writeKey
Key to the output track container.
std::unique_ptr< MsTrackSeeder > m_seeder
Pointer to the actual seeder implementation.
SG::WriteHandleKey< MsTrackSeedContainer > m_msTrkSeedKey
Temporary container write handle to push the seeds to store gate for later efficiency analysis.
virtual StatusCode execute(const EventContext &ctx) const override final
Standard algorithm execution hook.
ToolHandle< ISpacePointCalibrator > m_calibTool
Calibration tool to fill the track states.
ToolHandle< MuonValR4::ITrackVisualizationTool > m_visualizationTool
Visualization tool to debug the track finding.
const MuonGMR4::MuonDetectorManager * m_detMgr
Pointer to the MuonDetectorManager.
virtual ~MsTrackFindingAlg()
ToolHandle< ActsTrk::IFitterTool > m_trackFitTool
Track fitting tool.
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
Tracking geometry tool.
virtual StatusCode initialize() override final
Standard algorithm hook to setup the extrapolator, retrieve the tools and declare algorithm's data de...
ToolHandle< ISegmentSelectionTool > m_segSelector
Segment selection tool to pick the good quality segments.
std::pair< OptBoundPars_t, MeasVec_t > prepareFit(const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const MsTrackSeed &seed) const
Prepares the input by the fit by collecting the measurements on the segment &.
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Track extrapolation tool.
SG::ReadHandleKey< xAOD::MuonSegmentContainer > m_segmentKey
Declare the data dependency on the standard Mdt+Rpc+Tgc segment container & on the NSW segment contai...
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
IdHelperSvc to decode the Identifiers.
bool fitSeedCandidate(const Acts::GeometryContext &gCtx, const Acts::MagneticFieldContext &mCtx, const Acts::CalibrationContext &cCtx, const MsTrackSeed &seed, ActsTrk::MutableTrackContainer &outContainer) const
Attempts to fit the track seed candidate to a full track and returns whether the fit succeeded.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Amg::Vector3D direction() const
Returns the direction as Amg::Vector.
Amg::Vector3D position() const
Returns the position as Amg::Vector.
constexpr double energyToActs(const double athenaE)
Converts an energy scalar from Athena to Acts units.
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
Acts::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...
Acts::Vector4 convertPosToActs(const Amg::Vector3D &athenaPos, const double athenaTime=0.)
Converts a position vector & time from Athena units into Acts units.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
const Acts::Surface * bottomBoundary(const Acts::TrackingVolume &volume)
Returns the boundary surface parallel to the x-y plane at negative local z.
SeedingAux::FitParIndex ParamDefs
Use the same parameter indices as used by the CompSpacePointAuxiliaries.
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
Acts::Experimental::CompositeSpacePointLineFitter::ParamVec_t Parameters
This header ties the generic definitions in this package.
double houghTanBeta(const Amg::Vector3D &v)
Returns the hough tanBeta [y] / [z].
std::vector< const xAOD::UncalibratedMeasurement * > collectMeasurements(const xAOD::MuonSegment &segment, bool skipOutlier=true)
Helper function to extract the measurements from the segment.
Acts::GeometryIdentifier volumeId(const Acts::Surface &surface)
Returns the identifier of the volume in which the surface is embedded.
double houghTanAlpha(const Amg::Vector3D &v)
: Returns the hough tanAlpha [x] / [z]
const Segment * detailedSegment(const xAOD::MuonSegment &seg)
Helper function to navigate from the xAOD::MuonSegment to the MuonR4::Segment.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
MuonSegmentContainer_v1 MuonSegmentContainer
Definition of the current "MuonSegment container version".
const Identifier & identify(const UncalibratedMeasurement *meas)
Returns the associated identifier from the muon measurement.
MuonSegment_v1 MuonSegment
Reference the current persistent version:
const Acts::Surface & muonSurface(const UncalibratedMeasurement *meas)
Returns the associated Acts surface to the measurement.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
const MuonGMR4::MuonDetectorManager * detMgr
Detector manager to fetch the sector enevelope transforms.
double seedHalfLength
Maximum separation of point on the cylinder to be picked up onto a seed.
const ISegmentSelectionTool * selector
Pointer to the segement selection tool which compares two segments for their compatibilitiy.