17 #include "GaudiKernel/PhysicalConstants.h"
19 #include "CLHEP/Random/RandGaussZiggurat.h"
25 #include "Acts/Surfaces/PlaneSurface.hpp"
34 using namespace SegmentFit;
43 ATH_CHECK(m_auxMeasProv.initialize(m_writeKey.key()));
47 ATH_CHECK(m_trackingGeometryTool.retrieve());
48 ATH_CHECK(m_extrapolationTool.retrieve());
51 return StatusCode::SUCCESS;
53 std::tuple<Amg::Vector3D, Amg::Vector3D>
56 CLHEP::HepRandomEngine* engine)
const{
61 if (precPar == ParamDefs::x0 && !
segment.summary().nPhiHits) {
64 const unsigned idx = Acts::toUnderlying(precPar);
65 segPars[
idx] = CLHEP::RandGaussZiggurat::shoot(engine, segPars[
idx],
70 return std::make_tuple(locToGlob*locPos, locToGlob.linear() *
locDir);
78 const Acts::GeometryContext tgContext = gctx.
context();
79 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
85 CLHEP::HepRandomEngine* randEngine = rngWrapper->
getEngine(ctx);
88 ATH_CHECK(outHandle.record(std::make_unique<xAOD::MuonSegmentContainer>(),
89 std::make_unique<xAOD::MuonSegmentAuxContainer>()));
92 ATH_CHECK(surfaceHandle.record(std::make_unique<xAOD::TrackSurfaceContainer>(),
93 std::make_unique<xAOD::TrackStateAuxContainer>()));
96 auto auxMeasHandle = m_auxMeasProv.makeHandle(ctx, *surfaceHandle);
103 ParDecor_t dec_locPars{m_localParsKey, ctx};
104 ParDecor_t dec_seedPars{m_seedParsKey, ctx};
109 const GeoTrf::CoordEulerAngles sectorAngles = GeoTrf::getCoordRotationAngles(sectorTrf);
113 const auto* refMeas = startMeas.front();
115 const Amg::Vector3D firstSurfPos{surfAcc.get(refMeas)->transform(tgContext).translation()};
119 const Amg::Vector3D lastSurfPos = surfAcc.get(startMeas.back())->transform(tgContext).translation();
122 const Amg::Transform3D trfBeneath = GeoTrf::GeoTransformRT{sectorAngles, firstSurfPos - pseudoSurfDist * planeNormal};
123 const Amg::Transform3D trfAbove = GeoTrf::GeoTransformRT{sectorAngles, lastSurfPos + pseudoSurfDist * planeNormal};
125 auto surfBeneath = Acts::Surface::makeShared<Acts::PlaneSurface>(trfBeneath);
126 auto surfAbove = Acts::Surface::makeShared<Acts::PlaneSurface>(trfAbove);
128 startMeas.insert(startMeas.begin(), auxMeasHandle.newMeasurement<1>(surfBeneath, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
129 startMeas.insert(startMeas.end(), auxMeasHandle.newMeasurement<1>(surfAbove, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
132 auto pseudoSurf = Acts::Surface::makeShared<Acts::PlaneSurface>(
134 startMeas.insert(startMeas.begin(), auxMeasHandle.newMeasurement<2>(pseudoSurf, ProjectorType::e2DimNoTime,
AmgSymMatrix(2)::Identity()));
137 if (startMeas.size() < 5){
141 const auto [
pos,
dir] = smearSegment(gctx,*reFitMe, randEngine);
152 std::stringstream sstr{};
154 <<reFitMe->
chi2() / reFitMe->
nDoF()<<
", nDoF: "<<reFitMe->
nDoF()<<
", "
158 if (!sp->spacePoint()) return false;
159 return sp->spacePoint()->primaryMeasurement() == meas ||
160 sp->spacePoint()->secondaryMeasurement() == meas;
162 sstr<<
" **** "<<m_idHelperSvc->toString(
xAOD::identify(meas))<<
" @ "
163 <<
Amg::toString(surfAcc.get(meas)->transform(tgContext).translation())
164 <<
", "<<surfAcc.get(meas)->geometryId()<<
", "
174 auto target = Acts::Surface::makeShared<Acts::PlaneSurface>(
trf);
176 Acts::ActsVector<4> fourPos{};
177 fourPos.block<3,1>(Acts::ePos0, 0) = refPos;
179 Acts::BoundMatrix initialCov{Acts::BoundMatrix::Identity()};
181 auto initialPars = Acts::BoundTrackParameters::create(tgContext,
target, fourPos,
dir, straightQoverP,
183 if (!initialPars.ok()) {
187 auto fitTraject = m_trackFitTool->fit(startMeas, *initialPars, tgContext, mfContext, calContext,
target.get());
192 auto track = fitTraject->getTrack(0);
197 std::vector<const xAOD::UncalibratedMeasurement*> goodMeas{};
199 fitTraject->trackStateContainer().visitBackwards(
track.tipIndex(),[&](
const auto& state){
200 if (!state.hasUncalibratedSourceLink()){
203 goodMeas.insert(goodMeas.begin(),
206 <<
", id: "<<surfAcc.get(goodMeas.front())->geometryId());
212 summary.nEtaTrigHits += (goodMeas.front()->type() != xAOD::UncalibMeasType::MdtDriftCircleType);
216 Acts::BoundTrackParameters
parameters =
track.createParametersAtReference();
221 const Amg::Transform3D globToLoc{reFitMe->msSector()->globalToLocalTrans(gctx)};
225 const Amg::Vector3D refitSeg = refitPos + Amg::intersect<3>(refitPos, refitDir, Amg::Vector3D::UnitZ(), 0).value_or(0.) * refitDir;
226 const Amg::Vector3D globPos{reFitMe->msSector()->localToGlobalTrans(gctx) * refitSeg};
228 auto newSegment = outHandle->push_back(std::make_unique<xAOD::MuonSegment>());
229 dec_segLink(*newSegment) = Link_t{*segments, seg->index(), ctx};
231 newSegment->setDirection(globDir.x(), globDir.y(), globDir.z());
232 newSegment->setPosition(globPos.x(), globPos.y(), globPos.z());
234 newSegment->setFitQuality(
track.chi2(),
track.nDoF());
236 dec_locPars(*newSegment)[Acts::toUnderlying(ParamDefs::x0)] = refitSeg.x();
237 dec_locPars(*newSegment)[Acts::toUnderlying(ParamDefs::y0)] = refitSeg.y();
238 dec_locPars(*newSegment)[Acts::toUnderlying(
ParamDefs::theta)] = refitDir.theta();
239 dec_locPars(*newSegment)[Acts::toUnderlying(
ParamDefs::phi)] = refitDir.phi();
243 dec_seedPars(*newSegment)[Acts::toUnderlying(ParamDefs::x0)] = locSeedPos.x();
244 dec_seedPars(*newSegment)[Acts::toUnderlying(ParamDefs::y0)] = locSeedPos.y();
245 dec_seedPars(*newSegment)[Acts::toUnderlying(
ParamDefs::theta)] = locSeedDir.theta();
246 dec_seedPars(*newSegment)[Acts::toUnderlying(
ParamDefs::phi)] = locSeedDir.phi();
249 return StatusCode::SUCCESS;