20     using namespace SegmentFit;
 
   26     SegmentFittingAlg::~SegmentFittingAlg() = 
default;
 
   33         ATH_CHECK(m_visionTool.retrieve(EnableTool{!m_visionTool.empty()}));
 
   35         m_ambiSolver = std::make_unique<SegmentAmbiSolver>(
name(), std::move(
cfg));
 
   39         fitCfg.visionTool = m_visionTool.get();
 
   40         fitCfg.idHelperSvc = m_idHelperSvc.get();
 
   41         fitCfg.fitT0 = m_doT0Fit;
 
   42         fitCfg.recalibrate = m_recalibInFit;
 
   43         fitCfg.useFastFitter = m_useFastFitter;
 
   44         fitCfg.useHessian = m_hessianResidual;
 
   46         fitCfg.doBeamSpot = m_doBeamspotConstraint;
 
   47         fitCfg.beamSpotRadius = m_beamSpotR;
 
   48         fitCfg.beamSpotLength = m_beamSpotL;
 
   50         fitCfg.outlierRemovalCut = m_outlierRemovalCut;
 
   51         fitCfg.recoveryPull = m_recoveryPull;
 
   52         fitCfg.nPrecHitCut = m_precHitCut;
 
   53         fitCfg.maxIter = m_maxIter;
 
   55         m_fitter = std::make_unique<SegmentFit::SegmentLineFitter>(
name(), std::move(fitCfg));
 
   57         return StatusCode::SUCCESS;
 
   66         ATH_CHECK(writeSegments.record(std::make_unique<SegmentContainer>()));
 
   67         std::vector<std::unique_ptr<Segment>> allSegments{};
 
   69             std::vector<std::unique_ptr<Segment>> segments = fitSegmentSeed(ctx, *gctx, seed);
 
   70              if (m_visionTool.isEnabled() && segments.size() > 1) {
 
   71                 auto drawFinalReco = [
this, &segments, &gctx, &ctx,&seed](
const std::string& nameTag) {
 
   74                     segmentLines.push_back(
drawLabel(
std::format(
"# segments: {:d}",  segments.size()), 0.2, yLegend, 14));
 
   76                     for (
const std::unique_ptr<Segment>& seg : segments) {
 
   80                         std::stringstream signStream{};
 
   81                         signStream<<
std::format(
"#chi^{{2}}/nDoF: {:.2f} ({:}), ", seg->chi2() / seg->nDoF(), seg->nDoF());
 
   82                         signStream<<
std::format(
"y_{{0}}={:.2f}",
pars[toUnderlying(ParamDefs::y0)])<<
", ";
 
   86                                 signStream<<(SeedingAux::strawSign(
pos, 
dir, *
m) == -1 ? 
"L" : 
"R");
 
   89                         segmentLines.push_back(
drawLabel(signStream.str(), 0.2, yLegend, 13));
 
   93                     m_visionTool->visualizeBucket(ctx, *seed->parentBucket(), nameTag, std::move(segmentLines));
 
   95                 drawFinalReco(
"all segments");
 
   96                 const unsigned int nBeforeAmbi = segments.size();
 
   97                 segments = m_ambiSolver->resolveAmbiguity(*gctx, std::move(segments));
 
   98                 if (nBeforeAmbi != segments.size()) {
 
   99                     drawFinalReco(
"post ambiguity");
 
  101             } 
else if (m_visionTool.isEnabled() && segments.empty() &&
 
  102                       std::ranges::count_if(seed->getHitsInMax(),[
this](
const SpacePoint* hit){
 
  103                             return  m_visionTool->isLabeled(*hit);
 
  105                 m_visionTool->visualizeSeed(ctx, *seed, 
"Failed fit");
 
  107             allSegments.insert(allSegments.end(), std::make_move_iterator(segments.begin()),
 
  108                                                   std::make_move_iterator(segments.end()));
 
  110         resolveAmbiguities(*gctx, allSegments);
 
  111         writeSegments->insert(writeSegments->end(),
 
  112                                   std::make_move_iterator(allSegments.begin()),
 
  113                                   std::make_move_iterator(allSegments.end()));
 
  114         ATH_MSG_VERBOSE(
"Found in total "<<writeSegments->size()<<
" segments. ");
 
  115         return StatusCode::SUCCESS; 
 
  118     std::vector<std::unique_ptr<Segment>>
 
  119          SegmentFittingAlg::fitSegmentSeed(
const EventContext& ctx,
 
  124         std::vector<std::unique_ptr<Segment>> segments{};
 
  128         genCfg.recalibSeedCircles = m_recalibSeed;
 
  129         genCfg.calibrator = m_calibTool.get();
 
  130         genCfg.startWithPattern = m_tryPatternPars;
 
  135          if (m_visionTool.isEnabled()) { 
 
  138             while(
auto s = drawMe.nextSeed(ctx)) {
 
  141             seedLines.push_back(
drawLabel(
std::format(
"possible seeds: {:d}",  drawMe.numGenerated()), 0.2, 0.85, 14));
 
  142             m_visionTool->visualizeSeed(ctx, *patternSeed, 
"pattern", std::move(seedLines));
 
  147         while (
auto seed = seedGen.nextSeed(ctx)) {
 
  148             auto segment = m_fitter->fitSegment(ctx, patternSeed, seed->parameters,
 
  149                                                 locToGlob, std::move(seed->measurements));
 
  151                 segments.push_back(std::move(segment));
 
  154         ATH_MSG_VERBOSE(
"fitSegmentHits() - In total "<<segments.size()<<
" segment were constructed ");
 
  159                                                std::vector<std::unique_ptr<Segment>>& segmentCandidates)
 const {
 
  160         if (segmentCandidates.empty()) {
 
  163         using SegmentVec = std::vector<std::unique_ptr<Segment>>;
 
  164         ATH_MSG_VERBOSE(
"Resolve ambiguities amongst "<<segmentCandidates.size()<<
" segment candidates. ");
 
  165         std::unordered_map<const MuonGMR4::SpectrometerSector*, SegmentVec> candidatesPerChamber{};
 
  167         for (std::unique_ptr<Segment>& sortMe : segmentCandidates) {
 
  169             candidatesPerChamber[chamb].push_back(std::move(sortMe));
 
  171         segmentCandidates.clear();
 
  172         for (
auto& [
chamber, resolveMe] : candidatesPerChamber) {
 
  173             SegmentVec resolvedSegments = m_ambiSolver->resolveAmbiguity(gctx, std::move(resolveMe));
 
  174             segmentCandidates.insert(segmentCandidates.end(), 
 
  175                                      std::make_move_iterator(resolvedSegments.begin()),
 
  176                                      std::make_move_iterator(resolvedSegments.end()));