17#include "Acts/Definitions/Units.hpp"
22using namespace Acts::UnitLiterals;
26 using namespace MuonValR4;
39 m_ambiSolver = std::make_unique<SegmentAmbiSolver>(name(), std::move(cfg));
59 std::ranges::min(prop->value()) < 0.) {
61 return StatusCode::FAILURE;
75 m_fitter = std::make_unique<SegmentFit::SegmentLineFitter>(name(), std::move(fitCfg));
77 MdtSegmentSeedGenerator::Config genCfg{};
85 genCfg.busyLayerLimit += 2;
88 return StatusCode::SUCCESS;
99 ATH_MSG_VERBOSE(
"execute() - Start processing " << segmentSeeds->
size() <<
" pattern seeds.");
103 auto drawFinalReco = [
this, &segments, &gctx, &ctx,&seed](
const std::string& nameTag) {
105 double yLegend{0.85};
106 segmentLines.push_back(
drawLabel(std::format(
"# segments: {:d}", segments.size()), 0.2, yLegend, 14));
108 for (
const std::unique_ptr<Segment>& seg : segments) {
110 const auto [pos, dir] =
makeLine(pars);
111 segmentLines.emplace_back(
drawLine(pars, -Gaudi::Units::m, Gaudi::Units::m, kRed));
112 std::stringstream signStream{};
113 const auto& cov = seg->covariance();
114 signStream<<std::format(
"#chi^{{2}}/nDoF: {:.2f} ({:}), ", seg->chi2() / seg->nDoF(), seg->nDoF());
115 signStream<<std::format(
"y_{{0}}={:.2f}#pm{:.2f}",
116 pars[toUnderlying(ParamDefs::y0)],
117 Amg::error(cov, toUnderlying(ParamDefs::y0)))<<
", ";
118 signStream<<std::format(
"#theta={:.2f}#pm{:.2f}^{{#circ}}",
119 pars[toUnderlying(ParamDefs::theta)]/ 1._degree,
120 Amg::error(cov, toUnderlying(ParamDefs::theta)) / 1._degree )<<
", ";
123 m->fitState() == CalibratedSpacePoint::State::Valid) {
124 signStream<<(SeedingAux::strawSign(pos, dir, *m) == -1 ?
"L" :
"R");
127 segmentLines.push_back(
drawLabel(signStream.str(), 0.2, yLegend, 13));
131 m_visionTool->visualizeBucket(ctx, *seed->parentBucket(), nameTag, std::move(segmentLines));
133 drawFinalReco(
"all segments");
134 const unsigned int nBeforeAmbi = segments.size();
135 segments =
m_ambiSolver->resolveAmbiguity(*gctx, std::move(segments));
136 if (nBeforeAmbi != segments.size()) {
137 drawFinalReco(
"post ambiguity");
139 }
else if (
m_visionTool.isEnabled() && segments.empty() &&
140 std::ranges::any_of(seed->getHitsInMax(),[
this](
const SpacePoint*
hit){
141 return m_visionTool->isLabeled(*hit);
145 allSegments.insert(allSegments.end(), std::make_move_iterator(segments.begin()),
146 std::make_move_iterator(segments.end()));
149 writeSegments->insert(writeSegments->end(),
150 std::make_move_iterator(allSegments.begin()),
151 std::make_move_iterator(allSegments.end()));
152 ATH_MSG_VERBOSE(
"Found in total "<<writeSegments->size()<<
" segments. ");
153 return StatusCode::SUCCESS;
162 std::vector<std::unique_ptr<Segment>> segments{};
175 const Amg::Vector3D globDir{locToGlob.linear()*tangentSeedDir};
183 if (std::abs(globPos.eta()) > 2.35 &&
184 std::abs(globPos.theta() - globDir.theta()) < 5.8_degree) {
190 if (std::abs(globPos.eta()) > 2.35 &&
191 std::abs(globPos.theta() - globDir.theta()) < 3._degree) {
199 using namespace Acts::detail::LineHelper;
200 const Acts::Intersection3D bsExtp = lineIntersect<3>(Amg::Vector3D::Zero(),
201 Amg::Vector3D::UnitZ(),
204 const auto rawStIdx = Acts::toUnderlying(stIdx);
210 <<
" as extrapolation to beamspot is too far "<<
Amg::toString(closePoint)
211 <<
", r: "<<closePoint.perp());
223 State_t drawMe{seedState};
224 while(
auto s = seeder->nextSeed(cctx, drawMe)) {
225 seedLines.push_back(
drawLine(s->parameters, -Gaudi::Units::m, Gaudi::Units::m, kViolet));
227 seedLines.push_back(
drawLabel(std::format(
"possible seeds: {:d}", drawMe.nGenSeeds()), 0.2, 0.85, 14));
228 m_visionTool->visualizeSeed(ctx, *patternSeed, std::format(
"pattern_{:}{:}{:}",
235 while (
auto seed = seeder->nextSeed(cctx, seedState)) {
236 ATH_MSG_VERBOSE(
"fitSegmentHits() - Found a seed. Try to fit the segment...");
238 seed->parameters[toUnderlying(ParamDefs::t0)] =
ActsTrk::timeToAthena(seed->parameters[toUnderlying(ParamDefs::t0)]);
240 auto segment =
m_fitter->fitSegment(ctx, patternSeed, seed->parameters,
241 locToGlob, std::move(seed->hits));
243 segments.push_back(std::move(segment));
246 ATH_MSG_VERBOSE(
"fitSegmentHits() - In total "<<segments.size()<<
" segment were constructed ");
253 if (segmentCandidates.empty()) {
257 <<segmentCandidates.size()<<
" segment candidates.");
261 for (std::unique_ptr<Segment>& sortMe : segmentCandidates) {
263 candidatesPerChamber[chamb].push_back(std::move(sortMe));
265 segmentCandidates.clear();
266 for (
auto& [chamber, resolveMe] : candidatesPerChamber) {
267 const std::size_t nBefore = resolveMe.size();
269 ATH_MSG_DEBUG(
"resolveAmbiguities() - "<<resolvedSegments.size()<<
"/"<<nBefore
270 <<
" segments survived ambiguity solving in "<<chamber->identString()<<
".");
271 segmentCandidates.insert(segmentCandidates.end(),
272 std::make_move_iterator(resolvedSegments.begin()),
273 std::make_move_iterator(resolvedSegments.end()));
275 ATH_MSG_VERBOSE(
"Ambiguity solving done "<<segmentCandidates.size()<<
" survived.");
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_VERBOSE(x,...)
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
size_type size() const noexcept
Returns the number of elements in the collection.
A spectrometer sector forms the envelope of all chambers that are placed in the same MS sector & laye...
int8_t side() const
Returns the side of the MS-sector 1 -> A side ; -1 -> C side.
const Acts::Transform3 & localToGlobalTransform(const ActsTrk::GeometryContext &gctx) const
Returns the local -> global tarnsformation from the sector.
int sector() const
Returns the sector of the MS-sector.
Muon::MuonStationIndex::ChIndex chamberIndex() const
Returns the chamber index scheme.
SeedingState< HitVec_t, CalibCont_t, SeederStateBase > State_t
Define the state holder object.
std::unique_ptr< SegmentFit::SegmentAmbiSolver > m_ambiSolver
Pointer to the ambiguity reosolution.
Gaudi::Property< unsigned > m_precHitCut
Minimum number of precision hits to accept the segment.
Gaudi::Property< bool > m_hessianResidual
Use the expliciit Hessian in the residual calculation.
virtual StatusCode initialize() override
Gaudi::Property< bool > m_recalibSeed
Toggle seed recalibration.
Gaudi::Property< double > m_seedHitChi2
Two mdt seeds are the same if their defining parameters match wihin.
Gaudi::Property< bool > m_useFastFitter
Use the fast Mdt fitter where possible.
ToolHandle< MuonValR4::IPatternVisualizationTool > m_visionTool
Pattern visualization tool.
Gaudi::Property< double > m_beamSpotL
Longitudinal covariance on the beam spo measurement.
Gaudi::Property< bool > m_recalibInFit
SG::WriteHandleKey< SegmentContainer > m_outSegments
SegmentVec_t fitSegmentSeed(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const SegmentSeed *seed) const
Fit the hits from the pattern seed to segment candidates.
virtual ~SegmentFittingAlg()
Gaudi::Property< bool > m_fastPreFitter
The fast fitter is treated as a pre fitter.
std::unique_ptr< SegmentFit::MdtSegmentSeedGenerator > m_seederBEE
Pointer to the L-R segment seeder used for the BEE chambers -> increased hit occupancy.
void resolveAmbiguities(const ActsTrk::GeometryContext &gctx, SegmentVec_t &segmentCandidates) const
Resolve the ambiguity amongst the segment candidates within a spectrometer sector.
std::unique_ptr< SegmentFit::MdtSegmentSeedGenerator > m_seeder
Pointer to the L-R segment seeder.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
IdHelperSvc.
Gaudi::Property< bool > m_doBeamspotConstraint
Add beamline constraint.
ToolHandle< ISpacePointCalibrator > m_calibTool
Handle to the space point calibrator.
std::unique_ptr< SegmentFit::SegmentLineFitter > m_fitter
Pointer to the actual segment fitter.
std::vector< std::unique_ptr< Segment > > SegmentVec_t
Gaudi::Property< std::vector< double > > m_seedMaxBsL
Gaudi::Property< bool > m_ignoreFailedPreFit
Switch to try the full fit when the fast pre-fitter fails.
SegmentFit::Parameters Parameters
Gaudi::Property< bool > m_doT0Fit
static constexpr auto s_stIdxMax
SG::ReadHandleKey< SegmentSeedContainer > m_seedKey
ReadHandle of the seeds.
Gaudi::Property< std::vector< double > > m_seedMaxBsR
Maximum allowed distance of the segment seed line to the beam spot measurement expressed in relative ...
Gaudi::Property< double > m_recoveryPull
Gaudi::Property< double > m_beamSpotR
Radial covariance on th beam spot measurment.
Gaudi::Property< unsigned > m_maxIter
Tune the number of iterations.
virtual StatusCode execute(const EventContext &ctx) const override
ActsTrk::GeoContextReadKey_t m_geoCtxKey
Gaudi::Property< unsigned > m_busyLayerLimit
Cut on the number of hits per layer to use the layer for seeding.
Gaudi::Property< double > m_outlierRemovalCut
Cut on the segment chi2 / nDoF to launch the outlier removal.
Gaudi::Property< bool > m_tryPatternPars
Try first to fit the pattern parameters. Then proceed with the straw line tangents.
Representation of a segment seed (a fully processed hough maximum) produced by the hough transform.
const Parameters & parameters() const
Returns the parameter array.
const MuonGMR4::SpectrometerSector * msSector() const
Returns the associated chamber.
Acts::CloneablePtr< CalibratedSpacePoint > MeasType
Calibrated space point type.
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
constexpr double timeToAthena(T actsT)
Converts a time unit from Acts to Athena units.
Acts::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...
This class is not to needed in AthSimulation.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Eigen::Matrix< double, 3, 1 > Vector3D
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
std::pair< Amg::Vector3D, Amg::Vector3D > makeLine(const Parameters &pars)
Returns the parsed parameters into an Eigen line parametrization.
This header ties the generic definitions in this package.
MuonValR4::IPatternVisualizationTool::PrimitiveVec PrimitiveVec
DataVector< SegmentSeed > SegmentSeedContainer
std::unique_ptr< TLine > drawLine(const MuonR4::SegmentFit::Parameters &pars, const double lowEnd, const double highEnd, const int color=kRed+1, const int lineStyle=kDashed, const int view=objViewEta)
Draws a line from the segment fit parameters.
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const double textSize=18, const bool useNDC=true, const int color=kBlack)
Create a TLatex label,.
StIndex
enum to classify the different station layers in the muon spectrometer
StIndex toStationIndex(ChIndex index)
convert ChIndex into StIndex
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Helper struct to ensure that the spectrometer sectors & chambers are sorted.
Configuration object to stree the ambiguties.
const ISpacePointCalibrator * calibrator
Pointer to the calibrator.
bool doBeamSpot
Switch to insert a beamspot constraint if possible.
const Muon::IMuonIdHelperSvc * idHelperSvc
Pointer to the idHelperSvc.
unsigned nPrecHitCut
Minimum number of precision hits.
double outlierRemovalCut
Cut on the segment chi2 / nDoF to launch the outlier removal.
const MuonValR4::IPatternVisualizationTool * visionTool
Pointer to the visualization tool.
double recoveryPull
Maximum pull on a measurement to add it back on the line.
double beamSpotRadius
Parameters of the beamspot measurement.
Full configuration object.