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()));