ATLAS Offline Software
Loading...
Searching...
No Matches
CombinedFitAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4#include "CombinedFitAlg.h"
5
10namespace {
13 std::string print(const xAOD::TrackParticle& p) {
14 std::stringstream sstr{};
15 sstr<<"particle with " <<(p.pt()*1.e-3)<<" [GeV], eta: "<<p.eta()<<", phi: "
16 <<p.phi()<<", q:"<<p.charge()<<", author: "<<p.trackFitter()<<std::endl;
17 return sstr.str();
18 }
19
20}
21
22
23namespace MuonCombinedR4 {
25 ATH_CHECK(m_cnvTool.retrieve());
26 ATH_CHECK(m_trackFitTool.retrieve());
28
29 ATH_CHECK(m_ctxProvider.initialize());
30 ATH_CHECK(m_stacoKey.initialize());
31 ATH_CHECK(m_outTagKey.initialize());
32 ATH_CHECK(m_beamSpotKey.initialize(false));
33
34 ATH_CHECK(m_CmbParticleKey.initialize());
36
37 ATH_CHECK(m_cmbTrackKey.initialize());
39
41 ATH_CHECK(m_cmbTrackLinkKey.initialize());
42 return StatusCode::SUCCESS;
43 }
44 StatusCode CombinedFitAlg::prepareDataShip(const EventContext& ctx, DataShip& ship) const {
45 const MuonR4::MuonTagContainer* stacoTags{nullptr};
46 ATH_CHECK(SG::get(stacoTags, m_stacoKey, ctx));
48 for (const MuonR4::MuonTag* tag : *stacoTags) {
49 ship.preMatchedTags[tag->msTrack()].push_back(tag);
50 }
51 for (auto & [_, assocTags] : ship.preMatchedTags) {
53 std::ranges::sort(assocTags, [](const MuonR4::MuonTag* a,
54 const MuonR4::MuonTag* b) {
56 constexpr float max = std::numeric_limits<float>::max();
57 return a->parameter<float>(msInnerMatchChi2).value_or(max) <
58 b->parameter<float>(msInnerMatchChi2).value_or(max);
59 });
60 }
61 ATH_CHECK(ship.outputTags.record(m_outTagKey, ctx));
62 ATH_CHECK(ship.cmbParticles.record(m_CmbParticleKey, ctx));
63 ATH_CHECK(ship.meParticles.record(m_MeParticleKey, ctx));
64
65 ship.calContext = m_ctxProvider.getCalibrationContext(ctx);
66 ship.mfContext = m_ctxProvider.getMagneticFieldContext(ctx);
67 ship.tgContext = m_ctxProvider.getGeometryContext(ctx);
68 return StatusCode::SUCCESS;
69 }
70 StatusCode CombinedFitAlg::execute(const EventContext& ctx) const {
71 DataShip ship{};
72 ATH_CHECK(prepareDataShip(ctx, ship));
73
74 for (const auto& [msTrack, tags] : ship.preMatchedTags) {
75 ATH_MSG_DEBUG(__func__<<"() "<<__LINE__<<" - Process MS track "<<print(*msTrack));
76 for (const MuonR4::MuonTag* candiate: tags) {
77 if (!fitMuonTag(*candiate, ship)) {
78 ATH_MSG_DEBUG(__func__<<"() "<<__LINE__<<" - Fit failed.");
79 continue;
80 }
81 }
82 }
83
86 *ship.cmbParticles, std::move(ship.actsCmbTracks)));
88 *ship.meParticles, std::move(ship.actsMeTracks)));
89 return StatusCode::SUCCESS;
90 }
91
93 DataShip& ship) const {
94 std::vector<Acts::SourceLink> measurements = extractMeasurements(tag);
95 if (measurements.empty()) {
96 ATH_MSG_WARNING(__func__<<"() "<<__LINE__<<" - No associated measurmeents");
97 return nullptr;
98 }
99 auto idTrack = ActsTrk::getActsTrack(*tag.idTrack());
101 Acts::BoundTrackParameters startPars = idTrack->createParametersAtReference();
102
103 auto fitResult = m_trackFitTool->fit(measurements, startPars,
104 ship.tgContext, ship.mfContext,
105 ship.calContext, &startPars.referenceSurface());
106 if (!fitResult) {
107 ATH_MSG_DEBUG(__func__<<"() "<<__LINE__<<" - Fit failed");
108 return nullptr;
109 }
111 ship.actsCmbTracks.ensureDynamicColumns(*fitResult);
112 auto destProxy = ship.actsCmbTracks.getTrack(ship.actsCmbTracks.addTrack());
113 destProxy.copyFrom(fitResult->getTrack(0));
115 auto* combParticle = ship.cmbParticles->push_back(std::make_unique<xAOD::TrackParticle>());
116 auto* combTag = ship.outputTags->push_back(std::make_unique<MuonR4::MuonTag>());
117 combTag->setAuthor(MuonR4::MuonTag::Author::MuidCo);
118 combTag->setCbTrack(combParticle);
119 combTag->setIdTrack(tag.idTrack());
120 combTag->setMsTrack(tag.msTrack());
121 return combTag;
122 }
124 DataShip& ship) const {
125 if (!m_fitMEtrack) {
126 return;
127 }
129 auto combinedTrk = ship.actsCmbTracks.at(combinedTag.cbTrack()->index());
131 std::vector<Acts::SourceLink> measurements{};
132 for (const auto state : combinedTrk.trackStates()) {
133 if (!state.hasUncalibratedSourceLink()) {
134 continue;
135 }
136 Acts::SourceLink sl = state.getUncalibratedSourceLink();
138 measurements.push_back(std::move(sl));
139 }
140 }
142 Acts::BoundTrackParameters startPars = combinedTrk.createParametersAtReference();
143
144 auto fitResult = m_trackFitTool->fit(measurements, startPars,
145 ship.tgContext, ship.mfContext,
146 ship.calContext, &startPars.referenceSurface());
147 if (!fitResult) {
148 ATH_MSG_DEBUG(__func__<<"() "<<__LINE__<<" - Fit failed");
149 return;
150 }
151 ship.actsMeTracks.ensureDynamicColumns(*fitResult);
152 auto destProxy = ship.actsMeTracks.getTrack(ship.actsMeTracks.addTrack());
153 destProxy.copyFrom(fitResult->getTrack(0));
155 auto* meParticle = ship.meParticles->push_back(std::make_unique<xAOD::TrackParticle>());
156 combinedTag.setMeTrack(meParticle);
157 }
158
159 StatusCode
163 xAOD::TrackParticleContainer& particleContainer,
164 ActsTrk::MutableTrackContainer&& fittedTracks) const {
165 if (key.empty()) {
166 ATH_MSG_DEBUG(__func__<<"() "<<__LINE__<<" - Empty key do nothing");
167 return StatusCode::SUCCESS;
168 }
169 Acts::ConstVectorTrackContainer ctrackBackend{std::move(fittedTracks.container())};
170 Acts::ConstVectorMultiTrajectory ctrackStateBackend{std::move(fittedTracks.trackStateContainer())};
171 auto ctc = std::make_unique<ActsTrk::TrackContainer>(std::move(ctrackBackend),
172 std::move(ctrackStateBackend));
173
174 SG::WriteHandle writeHandle{key, ctx};
175 ATH_CHECK(writeHandle.record(std::move(ctc)));
176
177 xAOD::ContainerDecorator dec_trackLink{decorKey, ctx,
179 for (std::size_t trk = 0 ; trk < particleContainer.size(); ++trk) {
180 const ActsTrk::TrackContainer::ConstTrackProxy convMe = writeHandle->getTrack(trk);
181 xAOD::TrackParticle* convTo = particleContainer.at(trk);
182 ATH_CHECK(m_cnvTool->convert(*convTo, ctx, convMe, convMe.referenceSurface()));
183 dec_trackLink(*convTo) = ElementLink<ActsTrk::TrackContainer>(*writeHandle, convMe.index(), ctx);
184 }
185 return StatusCode::SUCCESS;
186 }
187
188 std::vector<Acts::SourceLink>
190 std::vector<Acts::SourceLink> measurements{};
191 measurements.append_range(extractMeasurements(*muonTag.idTrack()));
192 measurements.append_range(extractMeasurements(*muonTag.msTrack()));
193 return measurements;
194 }
195 std::vector<Acts::SourceLink>
197 std::vector<Acts::SourceLink> measurements{};
198 auto track = ActsTrk::getActsTrack(trackPart);
199 if (!track) {
200 ATH_MSG_WARNING(__func__<<"() "<<__LINE__<<" - Failed to retrieve the associated ACTS track from "
201 <<print(trackPart));
202 return measurements;
203 }
204 for (const auto state : track->trackStates()) {
205 if (!state.hasUncalibratedSourceLink()) {
206 continue;
207 }
208 Acts::SourceLink sl = state.getUncalibratedSourceLink();
212 continue;
213 }
214 measurements.push_back(std::move(sl));
215 }
216 ATH_MSG_VERBOSE(__func__<<"() "<<__LINE__<<" - Extracted "<<measurements.size()<<" measurments from "
217 <<print(trackPart));
218 return measurements;
219 }
220}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
static Double_t a
void print(char *figname, TCanvas *c1)
#define max(a, b)
Definition cfImp.cxx:41
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
SG::WriteHandleKey< MuonR4::MuonTagContainer > m_outTagKey
Write key of the created combined tags.
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_MeParticleKey
Write key of the created ME track particles.
SG::WriteHandleKey< ActsTrk::TrackContainer > m_cmbTrackKey
Write key to store the fitted Acts combined tracks.
SG::ReadHandleKey< MuonR4::MuonTagContainer > m_stacoKey
Use STACO as input to the MuidCo chain as the track pair is already done upstream.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_cmbTrackLinkKey
Element link to the produced extrapolated Acts track.
SG::WriteHandleKey< ActsTrk::TrackContainer > m_meTrackKey
Write key to store the fitted Acts ME tracks.
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_CmbParticleKey
Write key of the created combined track particles.
void buildMETrack(MuonR4::MuonTag &combinedTag, DataShip &ship) const
ToolHandle< ActsTrk::IFitterTool > m_trackFitTool
Track fitting tool.
Gaudi::Property< bool > m_fitMEtrack
Toggle whether the ME track is formed after the combined fit.
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Track extrapolation tool.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_meTrackLinkKey
StatusCode prepareDataShip(const EventContext &ctx, DataShip &ship) const
Load the input containers from store gate and setup the write Handles for the output.
StatusCode writeTracksToStoreGate(const EventContext &ctx, const SG::WriteHandleKey< ActsTrk::TrackContainer > &key, const SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > &decorKey, xAOD::TrackParticleContainer &particleContainer, ActsTrk::MutableTrackContainer &&fittedTracks) const
Convert the ActsTracks to track particles and write the Acts track container to store gate.
ActsTrk::ContextUtility m_ctxProvider
Context provider for geometry, magnetic field and calibration contexts.
virtual StatusCode initialize() override final
ToolHandle< ActsTrk::ITrackToTrackParticleCnvTool > m_cnvTool
Conversion tool from Acts -> xAOD:TrackParticle.
std::vector< Acts::SourceLink > extractMeasurements(const MuonR4::MuonTag &muonTag) const
Retrieve the ID & Muon measurements from the associated ID & MS track particles.
SG::ReadHandleKey< xAOD::UncalibratedMeasurementContainer > m_beamSpotKey
Data dependency on the beam spot.
virtual StatusCode execute(const EventContext &ctx) const override final
MuonR4::MuonTag * fitMuonTag(const MuonR4::MuonTag &tag, DataShip &ship) const
Attempt to fit the muon tag to a combined track particle.
Baseline EDM object to gather all relevant information about a reconstructed muon candidate which can...
Definition MuonTag.h:25
xAOD::Muon::ParamDef ParamDef
Recylce the Parameter definition enum from the Muon.
Definition MuonTag.h:33
void setMeTrack(const xAOD::TrackParticle *meTrack)
Sets the extrapolated MS track particle.
Definition MuonTag.cxx:54
const xAOD::TrackParticle * idTrack() const
Returns the id track candidate from which the tag was built.
Definition MuonTag.cxx:17
const xAOD::TrackParticle * cbTrack() const
Returns the combined track candidate from which the tag was built.
Definition MuonTag.cxx:18
const xAOD::TrackParticle * msTrack() const
Returns the ms track candidate from which the tag was built.
Definition MuonTag.cxx:19
Property holding a SG store/key/clid/attr name from which a WriteDecorHandle is made.
Property holding a SG store/key/clid from which a WriteHandle is made.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Auxiliary class to instantiate WriteDecorHandles.The handles can be created in an empty state.
std::vector< std::string > tags
Definition hcg.cxx:107
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
std::optional< ActsTrk::TrackContainer::ConstTrackProxy > getActsTrack(const xAOD::TrackParticle &trkPart)
Return the proxy to the Acts track from which the track particle was made frome.
Definition Decoration.cxx:9
DataVector< MuonTag > MuonTagContainer
Definition MuonTag.h:125
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
bool isMuon(const xAOD::UncalibratedMeasurement *meas)
Returns whether the measurement is from a muon detector.
Helper struct to ship the input output data during the combined track fit.
xAOD::FillContainer< MuonR4::MuonTagContainer, void * > outputTags
The output combined tag collection.
Acts::MagneticFieldContext mfContext
The magnetic field context.
ActsTrk::MutableTrackContainer actsMeTracks
The ME track container.
std::map< const xAOD::TrackParticle *, std::vector< const MuonR4::MuonTag * >, MuonR4::ParticleSorter > preMatchedTags
The prematched combined muon tags.
xAOD::FillContainer< xAOD::TrackParticleContainer, xAOD::TrackParticleAuxContainer > cmbParticles
The output combined particle container.
Acts::GeometryContext tgContext
The geometry context to align the surfaces during the fit.
Acts::CalibrationContext calContext
The calibration context.
ActsTrk::MutableTrackContainer actsCmbTracks
The combined acts track container.
xAOD::FillContainer< xAOD::TrackParticleContainer, xAOD::TrackParticleAuxContainer > meParticles
The output ME particle container.