101 const Acts::GeometryContext tgContext = gctx.
context();
102 const Acts::MagneticFieldContext mfContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
107 rngWrapper->
setSeed(name(), ctx);
108 CLHEP::HepRandomEngine* randEngine = rngWrapper->
getEngine(ctx);
111 ATH_CHECK(outHandle.
record(std::make_unique<xAOD::MuonSegmentContainer>(),
112 std::make_unique<xAOD::MuonSegmentAuxContainer>()));
115 ATH_CHECK(surfaceHandle.
record(std::make_unique<xAOD::TrackSurfaceContainer>(),
116 std::make_unique<xAOD::TrackStateAuxContainer>()));
119 auto auxMeasHandle =
m_auxMeasProv.makeHandle(ctx, *surfaceHandle);
129 Acts::ObjVisualization3D visualHelper{};
133 const auto msSector =
m_detMgr->getSectorEnvelope(reFitMe->chamberIndex(),
135 reFitMe->etaIndex());
144 auto invTrf = sectorTrf.inverse();
147 auto& seedPars = dec_seedPars(*reFitMe);
148 seedPars[Acts::toUnderlying(ParamDefs::x0)] = locSeedPos.x();
149 seedPars[Acts::toUnderlying(ParamDefs::y0)] = locSeedPos.y();
150 seedPars[Acts::toUnderlying(ParamDefs::theta)] = locSeedDir.theta();
151 seedPars[Acts::toUnderlying(ParamDefs::phi)] = locSeedDir.phi();
154 const GeoTrf::CoordEulerAngles sectorAngles = GeoTrf::getCoordRotationAngles(sectorTrf);
158 const auto* refMeas = startMeas.front();
160 const Amg::Vector3D firstSurfPos{surfAcc.
get(refMeas)->transform(tgContext).translation()};
162 if (reFitMe->nPhiLayers() < 1) {
165 const Amg::Vector3D lastSurfPos = surfAcc.
get(startMeas.back())->transform(tgContext).translation();
168 const Amg::Transform3D trfBeneath = GeoTrf::GeoTransformRT{sectorAngles, firstSurfPos - pseudoSurfDist * planeNormal};
169 const Amg::Transform3D trfAbove = GeoTrf::GeoTransformRT{sectorAngles, lastSurfPos + pseudoSurfDist * planeNormal};
171 auto surfBeneath = Acts::Surface::makeShared<Acts::PlaneSurface>(trfBeneath);
172 auto surfAbove = Acts::Surface::makeShared<Acts::PlaneSurface>(trfAbove);
173 const double covVal = std::pow(10.*Gaudi::Units::cm, 2);
174 startMeas.insert(startMeas.begin(), auxMeasHandle.newMeasurement<1>(surfBeneath, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
175 startMeas.insert(startMeas.end(), auxMeasHandle.newMeasurement<1>(surfAbove, ProjectorType::e1DimNoTime,
AmgSymMatrix(1){covVal}));
182 Acts::ViewConfig{.color = {220, 0, 0}});
188 firstSurfPos.dot(trfZ) - 10.*Gaudi::Units::cm).value_or(0.);
192 if (
msgLvl(MSG::VERBOSE)) {
195 std::stringstream sstr{};
197 <<reFitMe->chiSquared() / reFitMe->numberDoF()<<
", nDoF: "<<reFitMe->numberDoF()<<
", "
198 <<reFitMe->nPrecisionHits()<<
", "<<reFitMe->nPhiLayers()<<std::endl;
200 sstr<<
" **** "<<(*meas)<<
", chi2: "<<SeedingAux::chi2Term(locPos, locDir, *meas)
201 <<
", sign: "<<(meas->isStraw() ?
202 (SeedingAux::strawSign(locPos,locDir, *meas) == 1 ?
"R" :
"L") :
"-")
203 <<
", geoId: "<<(meas->spacePoint() ? surfAcc.
get(meas->spacePoint()->primaryMeasurement())->geometryId()
204 : Acts::GeometryIdentifier{})<<std::endl;
208 <<
", refPoint: "<<
Amg::toString(trf.inverse()*refPos)<<std::endl;
209 ATH_MSG_VERBOSE(
"Run G2F fit on "<<msSector->identString()<<std::endl<<sstr.str());
212 auto target = Acts::Surface::makeShared<Acts::PlaneSurface>(trf);
215 Acts::BoundMatrix initialCov{Acts::BoundMatrix::Identity()};
217 auto initialPars = Acts::BoundTrackParameters::create(tgContext, target, fourPos, seedDir, straightQoverP,
218 initialCov, Acts::ParticleHypothesis::muon());
219 if (!initialPars.ok()) {
225 Acts::ViewConfig{.color={0,220,0}});
229 tgContext, mfContext, calContext, target.get());
233 visualHelper.write(std::format(
"SegmentReFitTest_failed_{:}_{:}_{:}.obj",
234 ctx.eventID().event_number(), reFitMe->index(),
240 auto track = fitTraject->getTrack(0);
245 std::vector<const xAOD::UncalibratedMeasurement*> goodMeas{};
247 fitTraject->trackStateContainer().visitBackwards(track.tipIndex(),[&](
const auto& state){
248 if (!state.hasUncalibratedSourceLink()){
251 goodMeas.insert(goodMeas.begin(),
255 <<
", id: "<<surfAcc.
get(goodMeas.front())->geometryId());
268 summary.nEtaTrigHits += !isPrecHit;
272 Acts::BoundTrackParameters parameters = track.createParametersAtReference();
275 Acts::ViewConfig{.color={0, 0, 220}});
277 visualHelper.write(std::format(
"SegmentReFitTest_goodone_{:}_{:}_{:}.obj",
278 ctx.eventID().event_number(), reFitMe->index(),
285 const Amg::Vector3D refitPos = globToLoc * parameters.position(tgContext);
289 const Amg::Vector3D globPos{msSector->localToGlobalTrans(gctx) * refitSeg};
291 auto newSegment = outHandle->push_back(std::make_unique<xAOD::MuonSegment>());
292 dec_segLink(*newSegment) = Link_t{*segments, reFitMe->index(), ctx};
294 newSegment->setDirection(globDir.x(), globDir.y(), globDir.z());
295 newSegment->setPosition(globPos.x(), globPos.y(), globPos.z());
297 newSegment->setFitQuality(track.chi2(), track.nDoF());
298 newSegment->setNHits(summary.nPrecHits, summary.nPhiHits, summary.nEtaTrigHits);
299 auto& locFitPars = dec_locPars(*newSegment);
300 locFitPars[Acts::toUnderlying(ParamDefs::x0)] = refitSeg.x();
301 locFitPars[Acts::toUnderlying(ParamDefs::y0)] = refitSeg.y();
302 locFitPars[Acts::toUnderlying(ParamDefs::theta)] = refitDir.theta();
303 locFitPars[Acts::toUnderlying(ParamDefs::phi)] = refitDir.phi();
305 return StatusCode::SUCCESS;