ATLAS Offline Software
Loading...
Searching...
No Matches
SegmentActsRefitAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
5
11
15
17
18
19#include "GaudiKernel/PhysicalConstants.h"
21#include "CLHEP/Random/RandGaussZiggurat.h"
22
23
24#include "Acts/Surfaces/PlaneSurface.hpp"
25#include "Acts/Surfaces/RectangleBounds.hpp"
26
28
29
31#include "ActsInterop/Logger.h"
32
33#include "Acts/Visualization/GeometryView3D.hpp"
34
35
36
37using namespace Acts::UnitLiterals;
38namespace{
39 constexpr double straightQoverP = 1. / (20._TeV);
41}
42
43
44namespace MuonR4{
45 using namespace SegmentFit;
46
48 ATH_CHECK(m_readKey.initialize());
49 ATH_CHECK(m_writeKey.initialize());
50 ATH_CHECK(m_linkKey.initialize());
51 ATH_CHECK(m_localParsKey.initialize());
52 ATH_CHECK(m_seedParsKey.initialize());
53 ATH_CHECK(m_auxMeasProv.initialize(m_writeKey.key()));
54 ATH_CHECK(m_calibTool.retrieve());
55
56 ATH_CHECK(m_idHelperSvc.retrieve());
59 ATH_CHECK(m_segSelector.retrieve());
60 ATH_CHECK(detStore()->retrieve(m_detMgr));
61
62 auto logger = makeActsAthenaLogger(this, "Fitter");
63
64 Acts::StraightLineStepper stepper{};
65 Acts::Navigator::Config navConfig{m_trackingGeometryTool->trackingGeometry()};
66 Acts::Navigator navigator(std::move(navConfig), logger->clone());
67
68 Propagator_t propagator{std::move(stepper), std::move(navigator), logger->clone()};
69
70 m_fitter = std::make_unique<Fitter_t>(std::move(propagator), logger->clone());
71
73 m_fitExtension.surfaceAccessor.connect<&ActsTrk::detail::xAODUncalibMeasSurfAcc::operator()>(&m_surfAccessor);
75 return StatusCode::SUCCESS;
76 }
77 std::tuple<Amg::Vector3D, Amg::Vector3D>
79 const MuonR4::Segment& segment,
80 CLHEP::HepRandomEngine* engine) const{
81 if (!m_smearSegPars) {
82 return std::make_pair(segment.position(), segment.direction());
83 }
84 const SegmentFit::Parameters segPars = localSegmentPars(gctx, segment);
85 SegmentFit::Parameters smearedPars = segPars;
87 for (ParamDefs precPar : {ParamDefs::y0, ParamDefs::theta,
88 ParamDefs::x0, ParamDefs::phi}) {
89 if (precPar == ParamDefs::phi && !segment.summary().nPhiHits) {
90 break;
91 }
92 const unsigned idx = Acts::toUnderlying(precPar);
93 const double uncert = Amg::error(segment.covariance(), idx) * m_smearRange;
94 smearedPars[idx] = CLHEP::RandGaussZiggurat::shoot(engine, segPars[idx], uncert);
95 ATH_MSG_VERBOSE("Apply smearing to "<<SeedingAux::parName(precPar)
96 <<" parameter -- cov: "<<uncert
97 <<", original: "<<segPars[idx]<<", smeared: "<<smearedPars[idx]
98 <<", deviation: "
99 <<(smearedPars[idx] - segPars[idx]) / uncert );
100 }
101 auto [smearLocPos, smearLocDir] = makeLine(smearedPars);
102 const auto [locPos, locDir] = makeLine(segPars);
104 if (SeedingAux::strawSigns(locPos,locDir, segment.measurements()) !=
105 SeedingAux::strawSigns(smearLocPos, smearLocDir, segment.measurements())) {
106 ATH_MSG_DEBUG("Parameter smearng from "<<toString(segPars)<<" -> "<<toString(smearedPars)
107 <<" changes the L/R ambiguity -> avoid for this test");
108 return smearSegment(gctx, segment, engine);
109 }
110
111 const Amg::Transform3D& locToGlob{segment.msSector()->localToGlobalTransform(gctx)};
112 if (smearLocDir.z() < 0) {
113 smearLocDir = -smearLocDir;
114 }
115 return std::make_tuple(locToGlob * smearLocPos, locToGlob.linear() * smearLocDir);
116 }
117
119 bool entrance) const {
120
121 const Acts::GeometryIdentifier volId = m_surfAccessor.get(measurement)->geometryId().withSensitive(0);
122 const Acts::TrackingVolume* volume = m_trackingGeometryTool->trackingGeometry()->findVolume(volId);
123 return entrance ? MuonGMR4::bottomBoundary(*volume) : MuonGMR4::topBoundary(*volume);
124 }
125 StatusCode SegmentActsRefitAlg::execute(const EventContext& ctx) const {
126
127 const xAOD::MuonSegmentContainer* segments{nullptr};
128 ATH_CHECK(SG::get(segments, m_readKey, ctx));
130 const ActsTrk::GeometryContext& gctx{m_trackingGeometryTool->getGeometryContext(ctx)};
131 const std::shared_ptr<const Acts::TrackingGeometry> trackingGeo = m_trackingGeometryTool->trackingGeometry();
132 const Acts::GeometryContext tgContext = gctx.context();
133 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
134 const Acts::CalibrationContext calContext = ActsTrk::getCalibrationContext(ctx);
135
137 ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this, name());
138 rngWrapper->setSeed(name(), ctx);
139 CLHEP::HepRandomEngine* randEngine = rngWrapper->getEngine(ctx);
140
141 SG::WriteHandle outHandle{m_writeKey, ctx};
142 ATH_CHECK(outHandle.record(std::make_unique<xAOD::MuonSegmentContainer>(),
143 std::make_unique<xAOD::MuonSegmentAuxContainer>()));
144
145
146 auto handleCreation = m_auxMeasProv.makeHandle(ctx, tgContext);
147 if (!handleCreation.ok()){
148 ATH_MSG_ERROR("Auxiliary measurement containers cannot be made");
149 return StatusCode::FAILURE;
150 }
151 auto& auxMeasHandle{*handleCreation};
154
155 using SegPars_t = xAOD::PosAccessor<Acts::toUnderlying(ParamDefs::nPars)>::element_type;
157
158 ParDecor_t dec_locPars{m_localParsKey, ctx};
159 ParDecor_t dec_seedPars{m_seedParsKey, ctx};
160
161 SeedingAux::Config cfg{};
162 cfg.parsToUse.clear();
163 SeedingAux pullCalculator{cfg, makeActsAthenaLogger(this, "PullCalculator")};
164
165 SeedingAux::Line_t line{};
166
167 Acts::PropagatorPlainOptions propagationOption{tgContext, mfContext};
168 propagationOption.maxSteps = m_maxPropSteps;
169 propagationOption.maxTargetSkipping = m_maxTargetSurfSkip;
170 constexpr bool doScat = false;
171 constexpr bool doEloss = false;
172 Gx2FitterOptions_t fitOptions{tgContext, mfContext, calContext, m_fitExtension,
173 std::move(propagationOption),
174 nullptr, doScat, doEloss,
175 Acts::FreeToBoundCorrection{m_doJacobianCorr},
176 m_maxIter};
177
181 Acts::ObjVisualization3D visualHelper{};
182
183
184 for (const xAOD::MuonSegment* reFitMe: *segments){
185 auto saveDisplay = [&](const std::string& state) {
186 if (!m_drawEvent) {
187 return;
188 }
189 const auto objFile = std::format("SegmentReFitTest_{:}_{:}_{:}_{:}.obj",
190 state, ctx.eventID().event_number(), reFitMe->index(),
191 MuonR4::printID(*reFitMe));
192 visualHelper.write(objFile);
193 ATH_MSG_DEBUG("Save event display under "<<objFile);
194 visualHelper = Acts::ObjVisualization3D{};
195 };
196
197 const MuonGMR4::SpectrometerSector* msSector =
198 m_detMgr->getSectorEnvelope(reFitMe->chamberIndex(),
199 reFitMe->sector(),
200 reFitMe->etaIndex());
201 const Amg::Transform3D& sectorTrf{msSector->localToGlobalTransform(gctx)};
202 const Amg::Vector3D planeNormal = sectorTrf.linear().col(2);
203
204 m_calibTool->stampSignsOnMeasurements(*reFitMe);
205 line.updateParameters(localSegmentPars(gctx, *MuonR4::detailedSegment(*reFitMe)));
207 const auto [seedPos, seedDir] = smearSegment(gctx, *MuonR4::detailedSegment(*reFitMe), randEngine);
209 {
210 const Amg::Transform3D invTrf = sectorTrf.inverse();
211 const Amg::Vector3D locSeedPos = invTrf * seedPos;
212 const Amg::Vector3D locSeedDir = invTrf.linear() * seedDir;
213 auto& seedPars = dec_seedPars(*reFitMe);
214 seedPars[Acts::toUnderlying(ParamDefs::x0)] = locSeedPos.x();
215 seedPars[Acts::toUnderlying(ParamDefs::y0)] = locSeedPos.y();
216 seedPars[Acts::toUnderlying(ParamDefs::theta)] = locSeedDir.theta();
217 seedPars[Acts::toUnderlying(ParamDefs::phi)] = locSeedDir.phi();
218 }
219
220 const GeoTrf::CoordEulerAngles sectorAngles = GeoTrf::getCoordRotationAngles(sectorTrf);
222 std::vector<const xAOD::UncalibratedMeasurement*> hitsToFit = MuonR4::collectMeasurements(*reFitMe);
223
224 // Identify the first measurement in the chamber volume. Skip the first one if it
225 // is the beamspot
226 const xAOD::UncalibratedMeasurement* entrance =
227 hitsToFit.front()->type() != xAOD::UncalibMeasType::Other ?
228 hitsToFit.front() : hitsToFit.at(1);
229 // Fetch the entrance & exit portals from the geometry
230 const Acts::Surface* entrancePortal = portalSurface(entrance, true);
231 const Acts::Surface* exitPortal = portalSurface(hitsToFit.back(), false);
232 ATH_MSG_DEBUG("Entrance portal: "
233 <<entrancePortal->geometryId()<<"/"<<m_idHelperSvc->toString(xAOD::identify(entrance))
234 <<", exit portal: "<<exitPortal->geometryId()<<"/"<<m_idHelperSvc->toString(xAOD::identify(hitsToFit.back())));
235
236 using namespace Acts::PlanarHelper;
237
238 const Acts::Intersection3D isectEntrance = intersectPlane(seedPos, seedDir, planeNormal,
239 entrancePortal->center(tgContext));
240 const Acts::Intersection3D isectFirst = intersectPlane(seedPos, seedDir, planeNormal,
241 m_surfAccessor.get(hitsToFit.front())->center(tgContext));
242
243 if (reFitMe->nPhiLayers() < 1) {
244
245 const Acts::Intersection3D isectExit = intersectPlane(seedPos, seedDir, planeNormal,
246 exitPortal->center(tgContext));
247 const Acts::Intersection3D isectLast = intersectPlane(seedPos, seedDir, planeNormal,
248 m_surfAccessor.get(hitsToFit.back())->center(tgContext));
249
251
252 const Amg::Transform3D trfBeneath = GeoTrf::GeoTransformRT{sectorAngles, 0.5*isectFirst.position() +
253 0.5*isectEntrance.position()};
254 const Amg::Transform3D trfAbove = GeoTrf::GeoTransformRT{sectorAngles, 0.85*isectExit.position() +
255 0.15*isectLast.position() };
256
257 auto surfBeneath = Acts::Surface::makeShared<Acts::PlaneSurface>(trfBeneath);
258 auto surfAbove = Acts::Surface::makeShared<Acts::PlaneSurface>(trfAbove);
259 ATH_MSG_DEBUG("Add auxiliary measurements @ "<<Amg::toString(surfBeneath->center(tgContext))
260 <<" and @"<<Amg::toString(surfAbove->center(tgContext)));
261
262 constexpr double covVal = Acts::square(1._cm);
263 hitsToFit.push_back(auxMeasHandle.newMeasurement<1>(surfBeneath, ProjectorType::e1DimNoTime, AmgSymMatrix(1){covVal}));
264 if (m_drawEvent) {
265 MuonValR4::drawMeasurement(gctx, hitsToFit.back(), visualHelper, Acts::s_viewGrid);
266 }
267 hitsToFit.push_back(auxMeasHandle.newMeasurement<1>(surfAbove, ProjectorType::e1DimNoTime, AmgSymMatrix(1){covVal}));
268 if (m_drawEvent) {
269 MuonValR4::drawMeasurement(gctx, hitsToFit.back(), visualHelper, Acts::s_viewGrid);
270 }
271 }
272
273 if (m_drawEvent) {
274 Acts::GeometryView3D::drawSurface(visualHelper, *entrancePortal, tgContext,
275 Amg::Transform3D::Identity(), Acts::s_viewPortal);
276 Acts::GeometryView3D::drawSurface(visualHelper, *exitPortal, tgContext,
277 Amg::Transform3D::Identity(), Acts::s_viewPortal);
278
280 MuonValR4::drawSegmentLine(gctx, *reFitMe, visualHelper,
281 Acts::ViewConfig{.color = {220, 0, 0}});
282 MuonValR4::drawSegmentMeasurements(gctx, *reFitMe, visualHelper, Acts::s_viewSurface);
283 }
284 ATH_MSG_VERBOSE("Entrance position "<<Amg::toString(isectEntrance.position())
285 <<", path length: "<<isectEntrance.pathLength()<<", "
286 <<" - First surface position: "<<Amg::toString(isectFirst.position())
287 <<", path length: "<<isectFirst.pathLength());
289
290 Amg::Vector3D refPos = 0.85 * isectEntrance.position()
291 + 0.15 * isectFirst.position();
292 const Amg::Transform3D trf{GeoTrf::GeoTransformRT{sectorAngles, refPos}};
293 if (msgLvl(MSG::VERBOSE)) {
294 const auto [locPos, locDir] = makeLine(localSegmentPars(*reFitMe));
295
296 std::stringstream sstr{};
297 sstr<<"pos: "<<Amg::toString(seedPos)<<", dir: "<<Amg::toString(seedDir)<<", chi2/nDoF: "
298 <<reFitMe->chiSquared() / reFitMe->numberDoF()<<", nDoF: "<<reFitMe->numberDoF()
299 <<", prec: "<<reFitMe->nPrecisionHits()<<", phi: "<<reFitMe->nPhiLayers()<<std::endl;
300 for (const auto& meas : MuonR4::detailedSegment(*reFitMe)->measurements()) {
301 pullCalculator.updateSpatialResidual(line, *meas);
302 const Acts::Surface* surface = meas->spacePoint() ? m_surfAccessor.get(meas->spacePoint()->primaryMeasurement()) : nullptr;
303 const Acts::GeometryIdentifier geoId = surface ? surface->geometryId() : Acts::GeometryIdentifier{};
304 sstr<<" **** "<<(*meas)<<", chi2: "<<SeedingAux::chi2Term(locPos, locDir, *meas)
305 <<", sign: "<<(meas->isStraw() ?
306 (SeedingAux::strawSign(locPos,locDir, *meas) == 1 ? "R" : "L") : "X")
307 <<", geoId: "<<geoId;
308 if (geoId != Acts::GeometryIdentifier{}){
309 const Amg::Vector3D globPos = meas->spacePoint()->msSector()->localToGlobalTransform(gctx) *
310 meas->localPosition();
311 const Acts::GeometryIdentifier volId = geoId.withSensitive(0);
312 const Acts::TrackingVolume* volume = m_trackingGeometryTool->trackingGeometry()->findVolume(volId);
313 const Acts::Vector2 lPos = (*surface->globalToLocal(tgContext,globPos, reFitMe->direction()));
314 sstr<<", inside volume: "<<volume->inside(tgContext, globPos);
315 sstr<<", inside surface: "<<surface->bounds().inside(lPos);
316
317 }
318 sstr<<std::endl;
319 }
320
321 sstr<<" Target surf: "<<Amg::toString(trf)<<", firstSurf: "
322 << Amg::toString(trf.inverse()*isectFirst.position())
323 <<", refPoint: "<<Amg::toString(trf.inverse()*refPos)<<std::endl;
324 ATH_MSG_VERBOSE("Run G2F fit on "<<msSector->identString()<<std::endl<<sstr.str());
325 }
326 // Specify the surface on which the segment will be expressed.
327 std::shared_ptr<const Acts::Surface> target{};
328 if (hitsToFit.front()->type() == xAOD::UncalibMeasType::Other) {
329 target = m_surfAccessor.get(hitsToFit.front())->getSharedPtr();
330 using namespace Acts::detail::LineHelper;
331 const Acts::Intersection3D lineIsect =
332 lineIntersect<3>(target->center(tgContext),
333 Amg::Vector3D::UnitZ(),
334 seedPos, seedDir);
335 // Also update the start position to be the closest point of approach
336 // to the beamspot
337 refPos = lineIsect.position();
338 } else {
340 target = Acts::Surface::makeShared<Acts::PlaneSurface>(trf,
341 std::make_unique<Acts::RectangleBounds>(1._m, 1._m));
342 }
343 if (m_drawEvent) {
344 Acts::GeometryView3D::drawSurface(visualHelper, *target,
345 tgContext, Amg::Transform3D::Identity(),
346 Acts::ViewConfig{.color={0,0,220}});
347 }
348
349 Acts::Vector<4> fourPos{ActsTrk::convertPosToActs(refPos, refPos.mag() / Gaudi::Units::c_light)};
350 Acts::BoundMatrix initialCov{Acts::BoundMatrix::Identity()};
351
352 auto initialPars = Acts::BoundTrackParameters::create(tgContext, target, fourPos, seedDir, straightQoverP,
353 initialCov, Acts::ParticleHypothesis::muon());
354 if (!initialPars.ok()) {
355 ATH_MSG_WARNING("Initial estimate of the parameters failed");
356 saveDisplay("invalidPars");
357 continue;
358 }
359 if (m_drawEvent) {
360 MuonValR4::drawBoundParameters(gctx, *initialPars, visualHelper,
361 Acts::ViewConfig{.color={0,220,0}});
362 }
363 ATH_MSG_DEBUG("Initial parameters -- (loc0, loc1): "<<Amg::toString((*initialPars).localPosition())
364 <<", "<<std::format("theta: {:.2f}, ", (*initialPars).theta() / 1._degree)
365 <<std::format("phi: {:.2f}", (*initialPars).phi() / 1._degree));
366
367 std::vector<Acts::SourceLink> sourceLinks{};
368 std::ranges::transform(hitsToFit, std::back_inserter(sourceLinks),
369 [](const xAOD::UncalibratedMeasurement* meas) {
371 });
372 fitOptions.referenceSurface = target.get();
373
374 auto fitTraject = m_fitter->fit(sourceLinks.begin(), sourceLinks.end(),
375 *initialPars, fitOptions, tracks);
376 if (!fitTraject.ok()) {
377 saveDisplay("failed");
378 if (m_smearSegPars) {
379 ATH_MSG_WARNING("Track fit failed.");
380 continue;
381 } else {
382 ATH_MSG_ERROR("Segment refit failed. Albeit start parameters are taken from segment");
383 return StatusCode::FAILURE;
384 }
385 }
386
387 auto track = *fitTraject;
388 ATH_MSG_DEBUG("Track fit succeeded. ");
389
390 Acts::BoundTrackParameters parameters = track.createParametersAtReference();
391 if (m_drawEvent) {
392 MuonValR4::drawBoundParameters(gctx, parameters, visualHelper,
393 Acts::ViewConfig{.color={0,220,220}});
394
395 }
396 saveDisplay("goodone");
397
400 std::vector<const xAOD::UncalibratedMeasurement*> goodMeas{};
401 unsigned int itr{0};
402 tracks.trackStateContainer().visitBackwards(track.tipIndex(),[&](const auto& state){
403 if (!state.hasUncalibratedSourceLink()){
404 return;
405 }
406 goodMeas.insert(goodMeas.begin(),
407 ActsTrk::detail::xAODUncalibMeasCalibrator::unpack(state.getUncalibratedSourceLink()));
408
409 ATH_MSG_VERBOSE("Loop over track state: "<<(itr++)<<", "<<m_idHelperSvc->toString(xAOD::identify(goodMeas.front()))
410 <<", id: "<<m_surfAccessor.get(goodMeas.front())->geometryId());
411
412 const xAOD::UncalibratedMeasurement* m = goodMeas.front();
413 const bool isPrecHit = (m->type() == xAOD::UncalibMeasType::MdtDriftCircleType ||
416 !m_idHelperSvc->measuresPhi(xAOD::identify(m))));
417
418 summary.nPrecHits += isPrecHit;
419 if (m->type() == xAOD::UncalibMeasType::Other ||
420 m_idHelperSvc->measuresPhi(xAOD::identify(m))){
421 ++summary.nPhiHits;
422 } else {
423 summary.nEtaTrigHits += !isPrecHit;
424 }
425 });
426
428 const Amg::Vector3D globDir = parameters.direction();
430 const Amg::Transform3D globToLoc{sectorTrf.inverse()};
431 const Amg::Vector3D refitPos = globToLoc * parameters.position(tgContext);
432 const Amg::Vector3D refitDir = globToLoc.linear() * globDir;
434 const Amg::Vector3D refitSeg = refitPos + Amg::intersect<3>(refitPos, refitDir, Amg::Vector3D::UnitZ(), 0).value_or(0.) * refitDir;
435 const Amg::Vector3D globPos{msSector->localToGlobalTransform(gctx) * refitSeg};
436
437 xAOD::MuonSegment* newSegment = outHandle->push_back(std::make_unique<xAOD::MuonSegment>());
438 dec_segLink(*newSegment) = Link_t{*segments, reFitMe->index(), ctx};
439
440 newSegment->setDirection(globDir.x(), globDir.y(), globDir.z());
441 newSegment->setPosition(globPos.x(), globPos.y(), globPos.z());
442
443 newSegment->setFitQuality(track.chi2(), track.nDoF());
444 newSegment->setNHits(summary.nPrecHits, summary.nPhiHits, summary.nEtaTrigHits);
445 auto& locFitPars = dec_locPars(*newSegment);
446 locFitPars[Acts::toUnderlying(ParamDefs::x0)] = refitSeg.x();
447 locFitPars[Acts::toUnderlying(ParamDefs::y0)] = refitSeg.y();
448 locFitPars[Acts::toUnderlying(ParamDefs::theta)] = refitDir.theta();
449 locFitPars[Acts::toUnderlying(ParamDefs::phi)] = refitDir.phi();
450 }
451 return StatusCode::SUCCESS;
452 }
453}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
ElementLink< xAOD::TruthParticleContainer > Link_t
if(pathvar)
Handle class for adding a decoration to an object.
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
A wrapper class for event-slot-local random engines.
Definition RNGWrapper.h:56
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Definition RNGWrapper.h:154
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition RNGWrapper.h:108
Acts::GeometryContext context() const
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
ProjectorType
Enum encoding the possible projectors used in ATLAS.
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
Helper class to access the Acts::surface associated with an Uncalibrated xAOD 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 Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &gctx) const
Returns the local -> global tarnsformation from the sector.
std::string identString() const
Returns a string encoding the chamber index & the sector of the MS sector.
virtual void calibrateSourceLink(const Acts::GeometryContext &geoctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &link, ActsTrk::MutableTrackStateBackend::TrackStateProxy state) const =0
Function that's hooked to the calibration delegate of the implemented Acts fitters.
ServiceHandle< IAthRNGSvc > m_rndmSvc
Range service to smear the segment parameters.
virtual StatusCode execute(const EventContext &ctx) const override final
SG::WriteDecorHandleKey< xAOD::MuonSegmentContainer > m_localParsKey
Decorate directly the local segment parameters on to the object.
const MuonGMR4::MuonDetectorManager * m_detMgr
Detector manager to access the spectrometer sector surfaces.
Gaudi::Property< double > m_smearRange
Smear interval in terms of standard deviations.
ToolHandle< ISpacePointCalibrator > m_calibTool
Handle to the space point calibrator.
std::tuple< Amg::Vector3D, Amg::Vector3D > smearSegment(const ActsTrk::GeometryContext &gctx, const MuonR4::Segment &segment, CLHEP::HepRandomEngine *engine) const
Smear the segment's position and direction by one sigma defined by the segment's covariance.
ActsTrk::detail::xAODUncalibMeasSurfAcc m_surfAccessor
Surface accessor delegate for xAOD::UncalibratedMeasurement objects.
SG::WriteHandleKey< xAOD::MuonSegmentContainer > m_writeKey
Declare the key for the refitted segment container.
SG::WriteDecorHandleKey< xAOD::MuonSegmentContainer > m_seedParsKey
Decorate the seed parameters entering the fit.
Acts::Propagator< Acts::StraightLineStepper, Acts::Navigator > Propagator_t
Type erased track fitter function.
ToolHandle< MuonR4::ISegmentSelectionTool > m_segSelector
Segment selection tool to pick the good quality segments.
std::unique_ptr< Fitter_t > m_fitter
Gaudi::Property< bool > m_drawEvent
Dump the segment line in obj files.
SG::WriteDecorHandleKey< xAOD::MuonSegmentContainer > m_linkKey
Construct a link from the refitted segment to the input segment.
Gaudi::Property< unsigned > m_maxPropSteps
Maximum number of propagation steps.
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Track extrapolation tool.
SG::ReadHandleKey< xAOD::MuonSegmentContainer > m_readKey
Declare the data dependency on the standard Mdt+Rpc+Tgc segment container.
Gaudi::Property< bool > m_smearSegPars
ActsTrk::AuxiliaryMeasurementHandler m_auxMeasProv
Gaudi::Property< unsigned > m_maxTargetSurfSkip
Maximum number of target surfaces.
Acts::Experimental::Gx2FitterOptions< ActsTrk::MutableTrackStateBackend > Gx2FitterOptions_t
Abbrivation of the configuration to launch the fit.
Gaudi::Property< bool > m_doJacobianCorr
Free to bound Jacobian correction.
virtual StatusCode initialize() override final
Gx2FitterExtension_t m_fitExtension
Fitter setup.
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
Tracking geometry tool.
const Acts::Surface * portalSurface(const xAOD::UncalibratedMeasurement *measurement, bool entrance) const
Returns the entrance / exit portal surface of the tracking volume associated with the measurement sur...
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
IdHelperSvc to decode the Identifiers.
Gaudi::Property< unsigned > m_maxIter
Maximum number of iterations.
Placeholder for what will later be the muon segment EDM representation.
const SegmentFit::Covariance & covariance() const
Returns the uncertainties of the defining parameters.
const MuonGMR4::SpectrometerSector * msSector() const
Returns the associated MS sector.
const MeasVec & measurements() const
Returns the associated measurements.
const Amg::Vector3D & position() const
Returns the global segment position.
const Amg::Vector3D & direction() const
Returns the global segment direction.
Handle class for adding a decoration to an object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
void setDirection(float px, float py, float pz)
Sets the direction.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
void setNHits(int nPrecisionHits, int nPhiLayers, int nTrigEtaLayers)
Set the number of hits/layers.
void setPosition(float x, float y, float z)
Sets the global position.
static Root::TMsgLogger logger("iLumiCalc")
Acts::VectorMultiTrajectory MutableTrackStateBackend
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::VectorTrackContainer MutableTrackBackend
Acts::Vector4 convertPosToActs(const Amg::Vector3D &athenaPos, const double athenaTime=0.)
Converts a position vector & time from Athena units into Acts units.
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
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.
const Acts::Surface * topBoundary(const Acts::TrackingVolume &volume)
Returns the boundary surface parallel to the x-y plane at positive local z.
SpacePoint::SeedingAux SeedingAux
Abrivation of the CompSpacePointAuxiliaries.
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.
std::pair< Amg::Vector3D, Amg::Vector3D > makeLine(const Parameters &pars)
Returns the parsed parameters into an Eigen line parametrization.
Acts::Experimental::CompositeSpacePointLineFitter::ParamVec_t Parameters
std::string toString(const Parameters &pars)
Dumps the parameters into a string with labels in front of each number.
This header ties the generic definitions in this package.
std::string printID(const xAOD::MuonSegment &seg)
Print the chamber ID of a segment, e.g.
std::vector< const xAOD::UncalibratedMeasurement * > collectMeasurements(const xAOD::MuonSegment &segment, bool skipOutlier=true)
Helper function to extract the measurements from the segment.
const Segment * detailedSegment(const xAOD::MuonSegment &seg)
Helper function to navigate from the xAOD::MuonSegment to the MuonR4::Segment.
xAOD::PosAccessor< Acts::toUnderlying(ParamDefs::nPars)>::element_type SegPars_t
Abrivation of the decorated local segment parameters.
void drawBoundParameters(const ActsTrk::GeometryContext &gctx, const Acts::BoundTrackParameters &pars, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewLine, const double standardLength=3.*Gaudi::Units::cm)
Draw a line representing the bound track parameters.
void drawMeasurement(const ActsTrk::GeometryContext &gctx, const xAOD::UncalibratedMeasurement *meas, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw an uncalibrated measurement inside the obj file.
void drawSegmentMeasurements(const ActsTrk::GeometryContext &gctx, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw all uncalibrated measurements associated to the segment.
void drawSegmentLine(const ActsTrk::GeometryContext &gctx, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewLine, const double standardLength=1.*Gaudi::Units::m)
Draw a segment line inside the obj file.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
SG::AuxElement::Accessor< std::array< float, N > > PosAccessor
xAOD Accessor to the position
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
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: