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 ATH_CHECK(m_ctxProvider.initialize());
56
57 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_trackingGeometrySvc->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>
78 SegmentActsRefitAlg::smearSegment(const Acts::GeometryContext& tgContext,
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(tgContext, segment);
85 SegmentFit::Parameters smearedPars = segPars;
87 for (ParamDefs precPar : {ParamDefs::y0, ParamDefs::theta,
88 ParamDefs::x0, ParamDefs::phi}) {
89 if (precPar == ParamDefs::x0 &&
90 std::ranges::none_of(segment.measurements(),
91 [](const auto& meas) {
92 return meas->measuresPhi();
93 })) {
94 break;
95 }
96 const unsigned idx = Acts::toUnderlying(precPar);
97 const double uncert = Amg::error(segment.covariance(), idx) * m_smearRange;
98 smearedPars[idx] = CLHEP::RandGaussZiggurat::shoot(engine, segPars[idx], uncert);
99 ATH_MSG_VERBOSE("Apply smearing to "<<SeedingAux::parName(precPar)
100 <<" parameter -- cov: "<<uncert
101 <<", original: "<<segPars[idx]<<", smeared: "<<smearedPars[idx]
102 <<", deviation: "
103 <<(smearedPars[idx] - segPars[idx]) / uncert );
104 }
105 auto [smearLocPos, smearLocDir] = makeLine(smearedPars);
106 const auto [locPos, locDir] = makeLine(segPars);
108 if (SeedingAux::strawSigns(locPos,locDir, segment.measurements()) !=
109 SeedingAux::strawSigns(smearLocPos, smearLocDir, segment.measurements())) {
110 ATH_MSG_DEBUG("Parameter smearng from "<<toString(segPars)<<" -> "<<toString(smearedPars)
111 <<" changes the L/R ambiguity -> avoid for this test");
112 return smearSegment(tgContext, segment, engine);
113 }
114
115 const Amg::Transform3D& locToGlob{segment.msSector()->localToGlobalTransform(tgContext)};
116 if (smearLocDir.z() < 0) {
117 smearLocDir = -smearLocDir;
118 }
119 return std::make_tuple(locToGlob * smearLocPos, locToGlob.linear() * smearLocDir);
120 }
121
123 bool entrance) const {
124
125 const Acts::GeometryIdentifier volId = m_surfAccessor.get(measurement)->geometryId().withSensitive(0);
126 const Acts::TrackingVolume* volume = m_trackingGeometrySvc->trackingGeometry()->findVolume(volId);
127 return entrance ? MuonGMR4::bottomBoundary(*volume) : MuonGMR4::topBoundary(*volume);
128 }
129 StatusCode SegmentActsRefitAlg::execute(const EventContext& ctx) const {
130
131 const xAOD::MuonSegmentContainer* segments{nullptr};
132 ATH_CHECK(SG::get(segments, m_readKey, ctx));
134 const std::shared_ptr<const Acts::TrackingGeometry> trackingGeo = m_trackingGeometrySvc->trackingGeometry();
135 const Acts::GeometryContext tgContext = m_ctxProvider.getGeometryContext(ctx);
136 const Acts::MagneticFieldContext mfContext = m_ctxProvider.getMagneticFieldContext(ctx);
137 const Acts::CalibrationContext calContext = m_ctxProvider.getCalibrationContext(ctx);
138
140 ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this, name());
141 rngWrapper->setSeed(name(), ctx);
142 CLHEP::HepRandomEngine* randEngine = rngWrapper->getEngine(ctx);
143
144 SG::WriteHandle outHandle{m_writeKey, ctx};
145 ATH_CHECK(outHandle.record(std::make_unique<xAOD::MuonSegmentContainer>(),
146 std::make_unique<xAOD::MuonSegmentAuxContainer>()));
147
148
149 auto handleCreation = m_auxMeasProv.makeHandle(ctx, tgContext);
150 if (!handleCreation.ok()){
151 ATH_MSG_ERROR("Auxiliary measurement containers cannot be made");
152 return StatusCode::FAILURE;
153 }
154 auto& auxMeasHandle{*handleCreation};
157
158 using SegPars_t = xAOD::PosAccessor<Acts::toUnderlying(ParamDefs::nPars)>::element_type;
160
161 ParDecor_t dec_locPars{m_localParsKey, ctx};
162 ParDecor_t dec_seedPars{m_seedParsKey, ctx};
163
164 SeedingAux::Config cfg{};
165 cfg.parsToUse.clear();
166 SeedingAux pullCalculator{cfg, makeActsAthenaLogger(this, "PullCalculator")};
167
168 SeedingAux::Line_t line{};
169
170 Acts::PropagatorPlainOptions propagationOption{tgContext, mfContext};
171 propagationOption.maxSteps = m_maxPropSteps;
172 propagationOption.maxTargetSkipping = m_maxTargetSurfSkip;
173 constexpr bool doScat = false;
174 constexpr bool doEloss = false;
175 Gx2FitterOptions_t fitOptions{tgContext, mfContext, calContext, m_fitExtension,
176 std::move(propagationOption),
177 nullptr, doScat, doEloss,
178 Acts::FreeToBoundCorrection{m_doJacobianCorr},
179 m_maxIter};
180
184 Acts::ObjVisualization3D visualHelper{};
185
186
187 for (const xAOD::MuonSegment* reFitMe: *segments){
188 auto saveDisplay = [&](const std::string& state) {
189 if (!m_drawEvent) {
190 return;
191 }
192 const auto objFile = std::format("SegmentReFitTest_{:}_{:}_{:}_{:}.obj",
193 state, ctx.eventID().event_number(), reFitMe->index(),
194 MuonR4::printID(*reFitMe));
195 visualHelper.write(objFile);
196 ATH_MSG_DEBUG("Save event display under "<<objFile);
197 visualHelper = Acts::ObjVisualization3D{};
198 };
199
200 const MuonGMR4::SpectrometerSector* msSector =
201 m_detMgr->getSectorEnvelope(reFitMe->chamberIndex(),
202 reFitMe->sector(),
203 reFitMe->etaIndex());
204 const Amg::Transform3D& sectorTrf{msSector->localToGlobalTransform(tgContext)};
205 const Amg::Vector3D planeNormal = sectorTrf.linear().col(2);
206
207 m_calibTool->stampSignsOnMeasurements(*reFitMe);
208 line.updateParameters(localSegmentPars(*reFitMe));
210 const auto [seedPos, seedDir] = smearSegment(tgContext, *MuonR4::detailedSegment(*reFitMe), randEngine);
212 {
213 const Amg::Transform3D invTrf = sectorTrf.inverse();
214 const Amg::Vector3D locSeedPos = invTrf * seedPos;
215 const Amg::Vector3D locSeedDir = invTrf.linear() * seedDir;
216 auto& seedPars = dec_seedPars(*reFitMe);
217 seedPars[Acts::toUnderlying(ParamDefs::x0)] = locSeedPos.x();
218 seedPars[Acts::toUnderlying(ParamDefs::y0)] = locSeedPos.y();
219 seedPars[Acts::toUnderlying(ParamDefs::theta)] = locSeedDir.theta();
220 seedPars[Acts::toUnderlying(ParamDefs::phi)] = locSeedDir.phi();
221 }
222
223 const GeoTrf::CoordEulerAngles sectorAngles = GeoTrf::getCoordRotationAngles(sectorTrf);
225 std::vector<const xAOD::UncalibratedMeasurement*> hitsToFit = MuonR4::collectMeasurements(*reFitMe);
226
227 // Identify the first measurement in the chamber volume. Skip the first one if it
228 // is the beamspot
229 const xAOD::UncalibratedMeasurement* entrance =
230 hitsToFit.front()->type() != xAOD::UncalibMeasType::Other ?
231 hitsToFit.front() : hitsToFit.at(1);
232 // Fetch the entrance & exit portals from the geometry
233 const Acts::Surface* entrancePortal = portalSurface(entrance, true);
234 const Acts::Surface* exitPortal = portalSurface(hitsToFit.back(), false);
235 ATH_MSG_DEBUG("Entrance portal: "
236 <<entrancePortal->geometryId()<<"/"<<m_idHelperSvc->toString(xAOD::identify(entrance))
237 <<", exit portal: "<<exitPortal->geometryId()<<"/"<<m_idHelperSvc->toString(xAOD::identify(hitsToFit.back())));
238
239 using namespace Acts::PlanarHelper;
240
241 const Acts::Intersection3D isectEntrance = intersectPlane(seedPos, seedDir, planeNormal,
242 entrancePortal->center(tgContext));
243 const Acts::Intersection3D isectFirst = intersectPlane(seedPos, seedDir, planeNormal,
244 m_surfAccessor.get(hitsToFit.front())->center(tgContext));
245
246 if (reFitMe->nPhiLayers() < 1) {
247
248 const Acts::Intersection3D isectExit = intersectPlane(seedPos, seedDir, planeNormal,
249 exitPortal->center(tgContext));
250 const Acts::Intersection3D isectLast = intersectPlane(seedPos, seedDir, planeNormal,
251 m_surfAccessor.get(hitsToFit.back())->center(tgContext));
252
254
255 const Amg::Transform3D trfBeneath = GeoTrf::GeoTransformRT{sectorAngles, 0.5*isectFirst.position() +
256 0.5*isectEntrance.position()};
257 const Amg::Transform3D trfAbove = GeoTrf::GeoTransformRT{sectorAngles, 0.85*isectExit.position() +
258 0.15*isectLast.position() };
259
260 auto surfBeneath = Acts::Surface::makeShared<Acts::PlaneSurface>(trfBeneath);
261 auto surfAbove = Acts::Surface::makeShared<Acts::PlaneSurface>(trfAbove);
262 ATH_MSG_DEBUG("Add auxiliary measurements @ "<<Amg::toString(surfBeneath->center(tgContext))
263 <<" and @"<<Amg::toString(surfAbove->center(tgContext)));
264
265 constexpr double covVal = Acts::square(1._cm);
266 hitsToFit.push_back(auxMeasHandle.newMeasurement<1>(surfBeneath, ProjectorType::e1DimNoTime, AmgSymMatrix(1){covVal}));
267 if (m_drawEvent) {
268 MuonValR4::drawMeasurement(tgContext, hitsToFit.back(), visualHelper, Acts::s_viewGrid);
269 }
270 hitsToFit.push_back(auxMeasHandle.newMeasurement<1>(surfAbove, ProjectorType::e1DimNoTime, AmgSymMatrix(1){covVal}));
271 if (m_drawEvent) {
272 MuonValR4::drawMeasurement(tgContext, hitsToFit.back(), visualHelper, Acts::s_viewGrid);
273 }
274 }
275
276 if (m_drawEvent) {
277 Acts::GeometryView3D::drawSurface(visualHelper, *entrancePortal, tgContext,
278 Amg::Transform3D::Identity(), Acts::s_viewPortal);
279 Acts::GeometryView3D::drawSurface(visualHelper, *exitPortal, tgContext,
280 Amg::Transform3D::Identity(), Acts::s_viewPortal);
281
283 MuonValR4::drawSegmentLine(tgContext, *reFitMe, visualHelper,
284 Acts::ViewConfig{.color = {220, 0, 0}});
285 MuonValR4::drawSegmentMeasurements(tgContext, *reFitMe, visualHelper, Acts::s_viewSurface);
286 }
287 ATH_MSG_VERBOSE("Entrance position "<<Amg::toString(isectEntrance.position())
288 <<", path length: "<<isectEntrance.pathLength()<<", "
289 <<" - First surface position: "<<Amg::toString(isectFirst.position())
290 <<", path length: "<<isectFirst.pathLength());
292
293 Amg::Vector3D refPos = 0.85 * isectEntrance.position()
294 + 0.15 * isectFirst.position();
295 const Amg::Transform3D trf{GeoTrf::GeoTransformRT{sectorAngles, refPos}};
296 if (msgLvl(MSG::VERBOSE)) {
297 const auto [locPos, locDir] = makeLine(localSegmentPars(*reFitMe));
298
299 std::stringstream sstr{};
300 sstr<<"pos: "<<Amg::toString(seedPos)<<", dir: "<<Amg::toString(seedDir)<<", chi2/nDoF: "
301 <<reFitMe->chiSquared() / reFitMe->numberDoF()<<", nDoF: "<<reFitMe->numberDoF()
302 <<", prec: "<<reFitMe->nPrecisionHits()<<", phi: "<<reFitMe->nPhiLayers()<<std::endl;
303 for (const auto& meas : MuonR4::detailedSegment(*reFitMe)->measurements()) {
304 pullCalculator.updateSpatialResidual(line, *meas);
305 const Acts::Surface* surface = meas->spacePoint() ? m_surfAccessor.get(meas->spacePoint()->primaryMeasurement()) : nullptr;
306 const Acts::GeometryIdentifier geoId = surface ? surface->geometryId() : Acts::GeometryIdentifier{};
307 sstr<<" **** "<<(*meas)<<", chi2: "<<SeedingAux::chi2Term(locPos, locDir, *meas)
308 <<", sign: "<<(meas->isStraw() ?
309 (SeedingAux::strawSign(locPos,locDir, *meas) == 1 ? "R" : "L") : "X")
310 <<", geoId: "<<geoId;
311 if (geoId != Acts::GeometryIdentifier{}){
312 const Amg::Vector3D globPos = meas->spacePoint()->msSector()->localToGlobalTransform(tgContext) *
313 meas->localPosition();
314 const Acts::GeometryIdentifier volId = geoId.withSensitive(0);
315 const Acts::TrackingVolume* volume = m_trackingGeometrySvc->trackingGeometry()->findVolume(volId);
316 const Acts::Vector2 lPos = (*surface->globalToLocal(tgContext,globPos, reFitMe->direction()));
317 sstr<<", inside volume: "<<volume->inside(tgContext, globPos);
318 sstr<<", inside surface: "<<surface->bounds().inside(lPos);
319
320 }
321 sstr<<std::endl;
322 }
323
324 sstr<<" Target surf: "<<Amg::toString(trf)<<", firstSurf: "
325 << Amg::toString(trf.inverse()*isectFirst.position())
326 <<", refPoint: "<<Amg::toString(trf.inverse()*refPos)<<std::endl;
327 ATH_MSG_VERBOSE("Run G2F fit on "<<msSector->identString()<<std::endl<<sstr.str());
328 }
329 // Specify the surface on which the segment will be expressed.
330 std::shared_ptr<const Acts::Surface> target{};
331 if (hitsToFit.front()->type() == xAOD::UncalibMeasType::Other) {
332 target = m_surfAccessor.get(hitsToFit.front())->getSharedPtr();
333 using namespace Acts::detail::LineHelper;
334 const Acts::Intersection3D lineIsect =
335 lineIntersect<3>(target->center(tgContext),
336 Amg::Vector3D::UnitZ(),
337 seedPos, seedDir);
338 // Also update the start position to be the closest point of approach
339 // to the beamspot
340 refPos = lineIsect.position();
341 } else {
343 target = Acts::Surface::makeShared<Acts::PlaneSurface>(trf,
344 std::make_unique<Acts::RectangleBounds>(1._m, 1._m));
345 }
346 if (m_drawEvent) {
347 Acts::GeometryView3D::drawSurface(visualHelper, *target,
348 tgContext, Amg::Transform3D::Identity(),
349 Acts::ViewConfig{.color={0,0,220}});
350 }
351
352 Acts::Vector<4> fourPos{ActsTrk::convertPosToActs(refPos, refPos.mag() / Gaudi::Units::c_light)};
353 Acts::BoundMatrix initialCov{Acts::BoundMatrix::Identity()};
354
355 auto initialPars = Acts::BoundTrackParameters::create(tgContext, target, fourPos, seedDir, straightQoverP,
356 initialCov, Acts::ParticleHypothesis::muon());
357 if (!initialPars.ok()) {
358 ATH_MSG_WARNING("Initial estimate of the parameters failed");
359 saveDisplay("invalidPars");
360 continue;
361 }
362 if (m_drawEvent) {
363 MuonValR4::drawBoundParameters(tgContext, *initialPars, visualHelper,
364 Acts::ViewConfig{.color={0,220,0}});
365 }
366 ATH_MSG_DEBUG("Initial parameters -- (loc0, loc1): "<<Amg::toString((*initialPars).localPosition())
367 <<", "<<std::format("theta: {:.2f}, ", (*initialPars).theta() / 1._degree)
368 <<std::format("phi: {:.2f}", (*initialPars).phi() / 1._degree));
369
370 std::vector<Acts::SourceLink> sourceLinks{};
371 std::ranges::transform(hitsToFit, std::back_inserter(sourceLinks),
372 [](const xAOD::UncalibratedMeasurement* meas) {
374 });
375 fitOptions.referenceSurface = target.get();
376
377 auto fitTraject = m_fitter->fit(sourceLinks.begin(), sourceLinks.end(),
378 *initialPars, fitOptions, tracks);
379 if (!fitTraject.ok()) {
380 saveDisplay("failed");
381 if (m_smearSegPars) {
382 ATH_MSG_WARNING("Track fit failed.");
383 continue;
384 } else {
385 ATH_MSG_ERROR("Segment refit failed. Albeit start parameters are taken from segment");
386 return StatusCode::FAILURE;
387 }
388 }
389
390 auto track = *fitTraject;
391 ATH_MSG_DEBUG("Track fit succeeded. ");
392
393 Acts::BoundTrackParameters parameters = track.createParametersAtReference();
394 if (m_drawEvent) {
395 MuonValR4::drawBoundParameters(tgContext, parameters, visualHelper,
396 Acts::ViewConfig{.color={0,220,220}});
397
398 }
399 saveDisplay("goodone");
400
401 std::uint8_t nPrecHits{0}, nTrigEtaHits{0}, nTrigPhiHits{0};
403 std::vector<const xAOD::UncalibratedMeasurement*> goodMeas{};
404 unsigned int itr{0};
405 for (const auto state :track.trackStatesReversed()) {
406 if (!state.hasUncalibratedSourceLink()){
407 continue;
408 }
409 goodMeas.insert(goodMeas.begin(),
410 ActsTrk::detail::xAODUncalibMeasCalibrator::unpack(state.getUncalibratedSourceLink()));
411
412 ATH_MSG_VERBOSE("Loop over track state: "<<(itr++)<<", "<<m_idHelperSvc->toString(xAOD::identify(goodMeas.front()))
413 <<", id: "<<m_surfAccessor.get(goodMeas.front())->geometryId());
414
415 const xAOD::UncalibratedMeasurement* m = goodMeas.front();
416 if (xAOD::isPrecisionHit(m)) {
417 ++nPrecHits;
418 nTrigPhiHits += m->numDimensions() == 2;
419 } else if (m->type() == xAOD::UncalibMeasType::Other) {
420 ++nTrigEtaHits;
421 ++nTrigPhiHits;
422 } else {
423 const auto* M = dynamic_cast<const xAOD::MuonMeasurement*>(m);
424 assert(M != nullptr);
425 //coverity[FORWARD_NULL]
426 nTrigEtaHits += (M->numDimensions() == 2 || !M->measuresPhi());
427 nTrigPhiHits += (M->numDimensions() == 2 || M->measuresPhi());
428
429 }
430 }
431
433 const Amg::Vector3D globDir = parameters.direction();
435 const Amg::Transform3D globToLoc{sectorTrf.inverse()};
436 const Amg::Vector3D refitPos = globToLoc * parameters.position(tgContext);
437 const Amg::Vector3D refitDir = globToLoc.linear() * globDir;
439 const Amg::Vector3D refitSeg = refitPos + Amg::intersect<3>(refitPos, refitDir, Amg::Vector3D::UnitZ(), 0).value_or(0.) * refitDir;
440 const Amg::Vector3D globPos{msSector->localToGlobalTransform(tgContext) * refitSeg};
441
442 xAOD::MuonSegment* newSegment = outHandle->push_back(std::make_unique<xAOD::MuonSegment>());
443 dec_segLink(*newSegment) = Link_t{*segments, reFitMe->index(), ctx};
444
445 newSegment->setDirection(globDir.x(), globDir.y(), globDir.z());
446 newSegment->setPosition(globPos.x(), globPos.y(), globPos.z());
447
448 newSegment->setFitQuality(track.chi2(), track.nDoF());
449 newSegment->setNHits(nPrecHits, nTrigPhiHits, nTrigEtaHits);
450 newSegment->setIdentifier(reFitMe->sector(), reFitMe->chamberIndex(),
451 reFitMe->etaIndex(), reFitMe->technology());
452
453 auto& locFitPars = dec_locPars(*newSegment);
454 locFitPars[Acts::toUnderlying(ParamDefs::x0)] = refitSeg.x();
455 locFitPars[Acts::toUnderlying(ParamDefs::y0)] = refitSeg.y();
456 locFitPars[Acts::toUnderlying(ParamDefs::theta)] = refitDir.theta();
457 locFitPars[Acts::toUnderlying(ParamDefs::phi)] = refitDir.phi();
458 }
459 return StatusCode::SUCCESS;
460 }
461}
#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
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
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.
ActsTrk::ContextUtility m_ctxProvider
Auxiliary class to access the magnetic field, geometry and calibration context.
Gaudi::Property< double > m_smearRange
Smear interval in terms of standard deviations.
ToolHandle< ISpacePointCalibrator > m_calibTool
Handle to the space point calibrator.
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.
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
ServiceHandle< ActsTrk::ITrackingGeometrySvc > m_trackingGeometrySvc
Tracking geometry tool.
Gx2FitterExtension_t m_fitExtension
Fitter setup.
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.
std::tuple< Amg::Vector3D, Amg::Vector3D > smearSegment(const Acts::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.
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(const std::uint8_t nPrecisionHits, const std::uint8_t nPhiLayers, const std::uint8_t nTrigEtaLayers)
Assign the segment hit summary.
void setPosition(float x, float y, float z)
Sets the global position.
void setIdentifier(const std::uint8_t sector, const ::Muon::MuonStationIndex::ChIndex chamberIndex, const std::int8_t etaIndex, const ::Muon::MuonStationIndex::TechnologyIndex technology)
Set the Identifier fields of the Segment.
static Root::TMsgLogger logger("iLumiCalc")
Acts::VectorMultiTrajectory MutableTrackStateBackend
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
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 drawSegmentMeasurements(const Acts::GeometryContext &tgContext, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw all uncalibrated measurements associated to the segment.
void drawBoundParameters(const Acts::GeometryContext &tgContext, 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 drawSegmentLine(const Acts::GeometryContext &tgContext, 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.
void drawMeasurement(const Acts::GeometryContext &tgContext, const xAOD::UncalibratedMeasurement *meas, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw an uncalibrated measurement 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".
MuonMeasurement_v1 MuonMeasurement
bool isPrecisionHit(const UncalibratedMeasurement *meas)
Returns whether the measurement is a precision hit.
const Identifier & identify(const UncalibratedMeasurement *meas)
Returns the associated identifier from the muon measurement.
MuonSegment_v1 MuonSegment
Reference the current persistent version: