17 #include "GaudiKernel/PhysicalConstants.h"
19 #include "CLHEP/Random/RandGaussZiggurat.h"
25 #include "Acts/Surfaces/PlaneSurface.hpp"
28 using namespace Acts::UnitLiterals;
30 constexpr
double straightQoverP = 1. / (100._TeV);
37 using namespace SegmentFit;
46 ATH_CHECK(m_auxMeasProv.initialize(m_writeKey.key()));
50 ATH_CHECK(m_trackingGeometryTool.retrieve());
51 ATH_CHECK(m_extrapolationTool.retrieve());
55 auto trkGeo = m_trackingGeometryTool->trackingGeometry();
56 trkGeo->visitSurfaces([
this](
const Acts::Surface* surf){
57 const auto detEl = surf->associatedDetectorElement();
63 if (!m_idHelperSvc->isMuon(
det->identify())){
66 ATH_MSG_ALWAYS(
"Sensitive muon surface "<<m_idHelperSvc->toString(
det->identify())<<
" -> geoId: "
67 <<surf->geometryId());
70 return StatusCode::SUCCESS;
72 std::tuple<Amg::Vector3D, Amg::Vector3D>
75 CLHEP::HepRandomEngine* engine)
const{
78 auto smearedPars = segPars;
85 const unsigned idx = Acts::toUnderlying(precPar);
87 smearedPars[
idx] = CLHEP::RandGaussZiggurat::shoot(engine, segPars[
idx], uncert);
89 <<
" parameter -- cov: "<<uncert
90 <<
", original: "<<segPars[
idx]<<
", smeared: "<<smearedPars[
idx]<<
", deviation: "
91 <<(smearedPars[
idx] - segPars[
idx]) / uncert );
94 auto [smearLocPos, smearLocDir] =
makeLine(smearedPars);
98 SeedingAux::strawSigns(smearLocPos, smearLocDir, segment.
measurements())) {
100 <<
" changes the L/R ambiguity -> avoid for this test");
101 return smearSegment(gctx, segment, engine);
105 if (smearLocDir.z() < 0) {
106 smearLocDir = -smearLocDir;
108 return std::make_tuple(locToGlob * smearLocPos, locToGlob.linear() * smearLocDir);
116 const Acts::GeometryContext tgContext = gctx.
context();
117 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
123 CLHEP::HepRandomEngine* randEngine = rngWrapper->
getEngine(ctx);
126 ATH_CHECK(outHandle.record(std::make_unique<xAOD::MuonSegmentContainer>(),
127 std::make_unique<xAOD::MuonSegmentAuxContainer>()));
130 ATH_CHECK(surfaceHandle.record(std::make_unique<xAOD::TrackSurfaceContainer>(),
131 std::make_unique<xAOD::TrackStateAuxContainer>()));
134 auto auxMeasHandle = m_auxMeasProv.makeHandle(ctx, *surfaceHandle);
141 ParDecor_t dec_locPars{m_localParsKey, ctx};
142 ParDecor_t dec_seedPars{m_seedParsKey, ctx};
144 Acts::ObjVisualization3D visualHelper{};
148 const auto msSector = m_detMgr->getSectorEnvelope(reFitMe->chamberIndex(),
150 reFitMe->etaIndex());
157 auto invTrf = sectorTrf.inverse();
160 auto& seedPars = dec_seedPars(*reFitMe);
161 seedPars[Acts::toUnderlying(ParamDefs::x0)] = locSeedPos.x();
162 seedPars[Acts::toUnderlying(ParamDefs::y0)] = locSeedPos.y();
167 const GeoTrf::CoordEulerAngles sectorAngles = GeoTrf::getCoordRotationAngles(sectorTrf);
171 const auto* refMeas = startMeas.front();
173 const Amg::Vector3D firstSurfPos{surfAcc.get(refMeas)->transform(tgContext).translation()};
175 if (reFitMe->nPhiLayers() < 1) {
180 const Amg::Vector3D lastSurfPos = surfAcc.get(startMeas.back())->transform(tgContext).translation();
183 const Amg::Transform3D trfBeneath = GeoTrf::GeoTransformRT{sectorAngles, firstSurfPos - pseudoSurfDist * planeNormal};
184 const Amg::Transform3D trfAbove = GeoTrf::GeoTransformRT{sectorAngles, lastSurfPos + pseudoSurfDist * planeNormal};
186 auto surfBeneath = Acts::Surface::makeShared<Acts::PlaneSurface>(trfBeneath);
187 auto surfAbove = Acts::Surface::makeShared<Acts::PlaneSurface>(trfAbove);
189 startMeas.insert(startMeas.begin(), auxMeasHandle.newMeasurement<1>(surfBeneath, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
190 startMeas.insert(startMeas.end(), auxMeasHandle.newMeasurement<1>(surfAbove, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
196 Acts::ViewConfig{.color = {220, 0, 0}});
207 const double extDist = Amg::intersect<3>(seedPos, seedDir, trfZ,
216 std::stringstream sstr{};
218 <<reFitMe->chiSquared() / reFitMe->numberDoF()<<
", nDoF: "<<reFitMe->numberDoF()<<
", "
219 <<reFitMe->nPrecisionHits()<<
", "<<reFitMe->nPhiLayers()<<std::endl;
221 sstr<<
" **** "<<(*meas)<<
", chi2: "<<SeedingAux::chi2Term(locPos,
locDir, *meas)
222 <<
", sign: "<<(meas->isStraw() ?
223 (SeedingAux::strawSign(locPos,
locDir, *meas) == 1 ?
"R" :
"L") :
"-")
224 <<
", geoId: "<<(meas->spacePoint() ? surfAcc.get(meas->spacePoint()->primaryMeasurement())->geometryId()
225 : Acts::GeometryIdentifier{})<<std::endl;
230 ATH_MSG_VERBOSE(
"Run G2F fit on "<<msSector->identString()<<std::endl<<sstr.str());
233 auto target = Acts::Surface::makeShared<Acts::PlaneSurface>(
trf);
236 Acts::BoundMatrix initialCov{Acts::BoundMatrix::Identity()};
238 auto initialPars = Acts::BoundTrackParameters::create(tgContext,
target, fourPos, seedDir, straightQoverP,
240 if (!initialPars.ok()) {
246 Acts::ViewConfig{.color={0,220,0}});
249 auto fitTraject = m_trackFitTool->fit(startMeas, *initialPars,
250 tgContext, mfContext, calContext,
target.get());
254 visualHelper.write(
std::format(
"SegmentReFitTest_failed_{:}_{:}_{:}.obj",
255 ctx.eventID().event_number(), reFitMe->index(),
261 auto track = fitTraject->getTrack(0);
266 std::vector<const xAOD::UncalibratedMeasurement*> goodMeas{};
268 fitTraject->trackStateContainer().visitBackwards(
track.tipIndex(),[&](
const auto& state){
269 if (!state.hasUncalibratedSourceLink()){
272 goodMeas.insert(goodMeas.begin(),
275 <<
", id: "<<surfAcc.get(goodMeas.front())->geometryId());
284 summary.nEtaTrigHits += (m->type() != xAOD::UncalibMeasType::MdtDriftCircleType);
288 Acts::BoundTrackParameters
parameters =
track.createParametersAtReference();
291 Acts::ViewConfig{.color={0, 0, 220}});
293 visualHelper.write(
std::format(
"SegmentReFitTest_goodone_{:}_{:}_{:}.obj",
294 ctx.eventID().event_number(), reFitMe->index(),
304 const Amg::Vector3D refitSeg = refitPos + Amg::intersect<3>(refitPos, refitDir, Amg::Vector3D::UnitZ(), 0).value_or(0.) * refitDir;
305 const Amg::Vector3D globPos{msSector->localToGlobalTrans(gctx) * refitSeg};
307 auto newSegment = outHandle->push_back(std::make_unique<xAOD::MuonSegment>());
308 dec_segLink(*newSegment) = Link_t{*segments, reFitMe->index(), ctx};
310 newSegment->setDirection(globDir.x(), globDir.y(), globDir.z());
311 newSegment->setPosition(globPos.x(), globPos.y(), globPos.z());
313 newSegment->setFitQuality(
track.chi2(),
track.nDoF());
315 auto& locFitPars = dec_locPars(*newSegment);
316 locFitPars[Acts::toUnderlying(ParamDefs::x0)] = refitSeg.x();
317 locFitPars[Acts::toUnderlying(ParamDefs::y0)] = refitSeg.y();
321 return StatusCode::SUCCESS;