16 #include "GaudiKernel/PhysicalConstants.h"
18 #include "CLHEP/Random/RandGaussZiggurat.h"
24 #include "Acts/Surfaces/PlaneSurface.hpp"
32 using namespace SegmentFit;
41 ATH_CHECK(m_auxMeasProv.initialize(m_writeKey.key()));
45 ATH_CHECK(m_trackingGeometryTool.retrieve());
46 ATH_CHECK(m_extrapolationTool.retrieve());
49 return StatusCode::SUCCESS;
51 std::tuple<Amg::Vector3D, Amg::Vector3D>
54 CLHEP::HepRandomEngine* engine)
const{
63 segPars[
idx] = CLHEP::RandGaussZiggurat::shoot(engine, segPars[
idx],
68 return std::make_tuple(locToGlob*locPos, locToGlob.linear() *
locDir);
76 const Acts::GeometryContext tgContext = gctx.
context();
77 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
83 CLHEP::HepRandomEngine* randEngine = rngWrapper->
getEngine(ctx);
86 ATH_CHECK(outHandle.record(std::make_unique<xAOD::MuonSegmentContainer>(),
87 std::make_unique<xAOD::MuonSegmentAuxContainer>()));
90 ATH_CHECK(surfaceHandle.record(std::make_unique<xAOD::TrackSurfaceContainer>(),
91 std::make_unique<xAOD::TrackStateAuxContainer>()));
94 auto auxMeasHandle = m_auxMeasProv.makeHandle(ctx, *surfaceHandle);
101 ParDecor_t dec_locPars{m_localParsKey, ctx};
102 ParDecor_t dec_seedPars{m_seedParsKey, ctx};
107 const GeoTrf::CoordEulerAngles sectorAngles = GeoTrf::getCoordRotationAngles(sectorTrf);
111 const auto* refMeas = startMeas.front();
113 const Amg::Vector3D firstSurfPos{surfAcc.get(refMeas)->transform(tgContext).translation()};
117 const Amg::Vector3D lastSurfPos = surfAcc.get(startMeas.back())->transform(tgContext).translation();
120 const Amg::Transform3D trfBeneath = GeoTrf::GeoTransformRT{sectorAngles, firstSurfPos - pseudoSurfDist * planeNormal};
121 const Amg::Transform3D trfAbove = GeoTrf::GeoTransformRT{sectorAngles, lastSurfPos + pseudoSurfDist * planeNormal};
123 auto surfBeneath = Acts::Surface::makeShared<Acts::PlaneSurface>(trfBeneath);
124 auto surfAbove = Acts::Surface::makeShared<Acts::PlaneSurface>(trfAbove);
126 startMeas.insert(startMeas.begin(), auxMeasHandle.newMeasurement<1>(surfBeneath, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
127 startMeas.insert(startMeas.end(), auxMeasHandle.newMeasurement<1>(surfAbove, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
130 auto pseudoSurf = Acts::Surface::makeShared<Acts::PlaneSurface>(
132 startMeas.insert(startMeas.begin(), auxMeasHandle.newMeasurement<2>(pseudoSurf, ProjectorType::e2DimNoTime,
AmgSymMatrix(2)::Identity()));
135 if (startMeas.size() < 5){
139 const auto [
pos,
dir] = smearSegment(gctx,*reFitMe, randEngine);
150 std::stringstream sstr{};
152 <<reFitMe->
chi2() / reFitMe->
nDoF()<<
", nDoF: "<<reFitMe->
nDoF()<<
", "
156 if (!sp->spacePoint()) return false;
157 return sp->spacePoint()->primaryMeasurement() == meas ||
158 sp->spacePoint()->secondaryMeasurement() == meas;
160 sstr<<
" **** "<<m_idHelperSvc->toString(
xAOD::identify(meas))<<
" @ "
161 <<
Amg::toString(surfAcc.get(meas)->transform(tgContext).translation())
162 <<
", "<<surfAcc.get(meas)->geometryId()<<
", "
173 auto target = Acts::Surface::makeShared<Acts::PlaneSurface>(
trf);
175 Acts::ActsVector<4> fourPos{};
176 fourPos.block<3,1>(Acts::ePos0, 0) = refPos;
178 Acts::BoundMatrix initialCov{Acts::BoundMatrix::Identity()};
180 auto initialPars = Acts::BoundTrackParameters::create(tgContext,
target, fourPos,
dir, straightQoverP,
182 if (!initialPars.ok()) {
186 auto fitTraject = m_trackFitTool->fit(startMeas, *initialPars, tgContext, mfContext, calContext,
target.get());
191 auto track = fitTraject->getTrack(0);
196 std::vector<const xAOD::UncalibratedMeasurement*> goodMeas{};
198 fitTraject->trackStateContainer().visitBackwards(
track.tipIndex(),[&](
const auto& state){
199 if (!state.hasUncalibratedSourceLink()){
202 goodMeas.insert(goodMeas.begin(),
205 <<
", id: "<<surfAcc.get(goodMeas.front())->geometryId());
211 summary.nEtaTrigHits += (goodMeas.front()->type() != xAOD::UncalibMeasType::MdtDriftCircleType);
215 Acts::BoundTrackParameters
parameters =
track.createParametersAtReference();
220 const Amg::Transform3D globToLoc{reFitMe->msSector()->globalToLocalTrans(gctx)};
224 const Amg::Vector3D refitSeg = refitPos + Amg::intersect<3>(refitPos, refitDir, Amg::Vector3D::UnitZ(), 0).value_or(0.) * refitDir;
225 const Amg::Vector3D globPos{reFitMe->msSector()->localToGlobalTrans(gctx) * refitSeg};
227 auto newSegment = outHandle->push_back(std::make_unique<xAOD::MuonSegment>());
228 dec_segLink(*newSegment) = Link_t{*segments, seg->index(), ctx};
230 newSegment->setDirection(globDir.x(), globDir.y(), globDir.z());
231 newSegment->setPosition(globPos.x(), globPos.y(), globPos.z());
233 newSegment->setFitQuality(
track.chi2(),
track.nDoF());
248 return StatusCode::SUCCESS;