22struct CoincidenceQualityCounts {
23 std::size_t nThreeOfThree{0};
24 std::size_t nTwoOfThree{0};
25 std::size_t nOneOfThree{0};
26 std::size_t nTwoOfTwo{0};
27 std::size_t nOneOfTwo{0};
30void countCoincidenceQuality(
32 CoincidenceQualityCounts& counts) {
59 const std::string calibrationDirectory =
61 if (calibrationDirectory.empty()) {
62 ATH_MSG_ERROR(
"Could not resolve the GroupData development directory");
63 return StatusCode::FAILURE;
65 const std::string calibrationPath =
71 return StatusCode::FAILURE;
74 <<
m_ptLut->version() <<
" from " << calibrationPath
75 <<
" (eta bins=" <<
m_ptLut->etaBins()
76 <<
", folded-phi bins=" <<
m_ptLut->phiBinsPerFold()
77 <<
", knots=" <<
m_ptLut->knotCount()
79 << (
m_ptLut->isDevelopmentPayload() ?
"development"
82 return StatusCode::SUCCESS;
87 const EventContext& ctx)
const {
88 return build(rdos, candidates,
nullptr, ctx);
100 if (!detectorManagerHandle.
isValid()) {
102 return StatusCode::FAILURE;
105 detectorManagerHandle.
cptr();
111 hitGroups, statistics));
129 std::move(segmentConfig)};
131 segmentStatistics, segments));
135 overlapClassification.
classify(candidates, overlapStatistics);
137 std::size_t nValidPtEstimates = 0U;
140 m_ptLut->evaluate(candidate.eta, candidate.phi, candidate.deltaTheta);
143 candidate.preInnerCoincidenceThreshold = evaluation.
thresholdCode;
147 const std::size_t nInvalidPtEstimates =
148 candidates.size() - nValidPtEstimates;
149 ATH_MSG_DEBUG(
"Floating-pT evaluation: valid=" << nValidPtEstimates
151 << nInvalidPtEstimates);
153 CoincidenceQualityCounts totalCounts;
154 CoincidenceQualityCounts m1WireCounts;
155 CoincidenceQualityCounts m1StripCounts;
156 CoincidenceQualityCounts m2WireCounts;
157 CoincidenceQualityCounts m2StripCounts;
158 CoincidenceQualityCounts m3WireCounts;
159 CoincidenceQualityCounts m3StripCounts;
162 countCoincidenceQuality(coincidence, totalCounts);
164 CoincidenceQualityCounts* stationCounts{
nullptr};
166 stationCounts = coincidence.
isStrip ? &m1StripCounts : &m1WireCounts;
168 stationCounts = coincidence.
isStrip ? &m2StripCounts : &m2WireCounts;
170 stationCounts = coincidence.
isStrip ? &m3StripCounts : &m3WireCounts;
172 if (stationCounts !=
nullptr) {
173 countCoincidenceQuality(coincidence, *stationCounts);
178 << statistics.
nRawData <<
" raw-data words in "
179 << hitGroups.size() <<
" groups: wire="
182 << statistics.
nM1Hits <<
", M2="
183 << statistics.
nM2Hits <<
", M3="
184 << statistics.
nM3Hits <<
", inner="
187 <<
", mapping failures="
189 <<
"; station coincidences="
190 << coincidences.size() <<
" (3/3="
191 << totalCounts.nThreeOfThree <<
", 2/3="
192 << totalCounts.nTwoOfThree <<
", 1/3="
193 << totalCounts.nOneOfThree <<
", 2/2="
194 << totalCounts.nTwoOfTwo <<
", 1/2="
195 << totalCounts.nOneOfTwo <<
")");
198 << m1WireCounts.nThreeOfThree <<
", 2/3="
199 << m1WireCounts.nTwoOfThree <<
", 1/3="
200 << m1WireCounts.nOneOfThree <<
"), M1 strip=(2/2="
201 << m1StripCounts.nTwoOfTwo <<
", 1/2="
202 << m1StripCounts.nOneOfTwo <<
"), M2 wire=(2/2="
203 << m2WireCounts.nTwoOfTwo <<
", 1/2="
204 << m2WireCounts.nOneOfTwo <<
"), M2 strip=(2/2="
205 << m2StripCounts.nTwoOfTwo <<
", 1/2="
206 << m2StripCounts.nOneOfTwo <<
"), M3 wire=(2/2="
207 << m3WireCounts.nTwoOfTwo <<
", 1/2="
208 << m3WireCounts.nOneOfTwo <<
"), M3 strip=(2/2="
209 << m3StripCounts.nTwoOfTwo <<
", 1/2="
210 << m3StripCounts.nOneOfTwo <<
")");
215 << candidates.size() <<
" (M1M2M3="
226 <<
"), projectionRejected="
228 <<
", projectionDuplicates="
230 <<
", projectionLimited="
233 <<
", candidateDuplicates="
235 <<
", localDuplicates="
237 <<
", candidateLimited="
241 << overlapStatistics.
nGroups <<
", candidates="
242 << overlapStatistics.
nCandidates <<
", maxMultiplicity="
245 for (std::size_t groupId = 1U;
246 groupId <= overlapStatistics.
nGroups; ++groupId) {
247 std::vector<std::size_t> memberIndices;
249 if (candidates[
index].overlapGroupId == groupId) {
250 memberIndices.emplace_back(
index);
253 if (memberIndices.empty())
continue;
254 std::ostringstream members;
255 for (std::size_t position = 0U; position < memberIndices.size(); ++position) {
256 if (position != 0U) members <<
",";
257 members << memberIndices[position];
260 << groupId <<
", multiplicity=" << memberIndices.size()
261 <<
", members=[" << members.str() <<
"]");
264 for (std::size_t candidateIndex = 0; candidateIndex < candidates.size();
268 << candidateIndex <<
", bcTag=" << candidate.
bcTag
270 <<
", triggerSector=" << candidate.
sectorId
273 <<
static_cast<unsigned int>(candidate.
stationMask)
274 <<
", wireStationMask="
276 <<
", stripStationMask="
278 <<
", positionStationMask="
279 <<
static_cast<unsigned int>(
281 <<
", eta=" << candidate.
eta <<
", phi="
282 << candidate.
phi <<
", deltaTheta="
284 << candidate.
deltaPhi <<
", preInnerCoincidencePt="
286 <<
", preInnerCoincidenceThreshold="
287 <<
static_cast<unsigned int>(
289 <<
", charge=" <<
static_cast<int>(candidate.
charge)
291 <<
static_cast<unsigned int>(candidate.
wireQuality)
292 <<
", wireQualities=("
298 <<
"), stripQualities=("
316 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
static std::unique_ptr< TgcL0FloatingPtLut > loadAscii(const std::string &calibrationPath, std::string &error)
Load the human-readable calibration payload.
Tag nearby candidates from distinct chamber paths.
void classify(TgcL0CandidateContainer &candidates, OverlapClassificationStatistics &statistics) const
Reconstruct same-BC inter-station segments and transient candidates.
StatusCode build(const StationCoincidenceContainer &coincidences, TgcL0CandidateContainer &candidates, SegmentStatistics &statistics, TgcL0SegmentContainer *validationSegments=nullptr) const
Build station representative points from layer-level TGC hits.
StatusCode build(const HitGroups &hitGroups, StationCoincidenceContainer &coincidences) const
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
static std::string find_calib_directory(const std::string &logical_file_name)
const_pointer_type cptr()
std::map< HitGroupKey, HitContainer > HitGroups
std::vector< StationCoincidence > StationCoincidenceContainer
std::vector< TgcL0Segment > TgcL0SegmentContainer
std::vector< TgcL0Candidate > TgcL0CandidateContainer
Event-local candidate collection.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Event-local candidate used by the TGC simulation tools.
bool inChamberOverlap
True when the candidate has a nearby partner from a different chamber path.
std::int16_t m1StationEta
Offline chamber identifiers retained for overlap diagnostics.
std::uint8_t m2StripQuality
std::uint8_t m1StripQuality
Station-coincidence qualities for strip projections.
std::int16_t m2StationEta
float preInnerCoincidencePt
TGC pT estimate before Inner Coincidence, in GeV.
float deltaPhi
Signed azimuthal-angle residual, in radians.
std::uint16_t m1StationPhi
std::uint8_t m2WireQuality
std::uint8_t positionStationMask
Alias of stationMask retained for explicit validation/debug use.
std::int16_t m3StationEta
std::uint8_t m1WireQuality
Station-coincidence qualities for wire projections.
std::uint8_t preInnerCoincidenceThreshold
Highest pT-threshold index before Inner Coincidence.
std::uint16_t readoutSector
Run-3 detector/readout sector retained for diagnostics.
std::uint16_t bcTag
Bunch-crossing tag.
std::int8_t charge
Charge sign: -1, 0, or +1.
std::uint8_t stripStationMask
Stations used by the strip projection segment.
std::uint8_t m3StripQuality
std::uint8_t m3WireQuality
std::uint8_t stationMask
Stations with a complete two-dimensional wire-and-strip position.
std::uint16_t m3StationPhi
std::uint16_t sectorId
Trigger Sector identifier.
std::uint16_t m2StationPhi
std::uint8_t wireStationMask
Stations used by the wire projection segment.
float eta
Pseudorapidity at the TGC pivot plane.
std::uint8_t overlapMultiplicity
Number of candidates in the classified overlap group.
float phi
Azimuth at the TGC pivot plane, in radians.
std::uint16_t subdetectorId
Subdetector identifier.
std::uint16_t overlapGroupId
Event-local overlap group. Zero means no classified overlap partner.
float deltaTheta
Signed polar-angle residual, in radians.
std::uint8_t wireQuality
Wire quality.
std::uint8_t thresholdCode
float ptEstimateGeV
Operational pT value, saturated to the downstream 8-bit range.
std::int8_t estimatedCharge
std::size_t nUnknownStation
std::size_t nMappingFailures
std::size_t maxMultiplicity
float maxPivotWireStripDeltaEta
Common-pivot wire-strip association.
std::size_t maxCandidatesPerLocalBin
Old Floating local eta-phi-pivot candidate-bin pruning.
std::size_t maxSegmentCombinationsPerGroup
Validated Floating working-set size per side/Trigger-Sector/BC chain.
float maxPivotWireStripDeltaPhi
std::size_t nM3OnlyPositionCandidates
std::size_t nLocalDuplicateCandidates
std::size_t nStripSegments
std::size_t nDuplicateCandidates
std::size_t nWireSegments
std::size_t nM2OnlyPositionCandidates
std::size_t nM1M2M3Candidates
std::size_t nLimitedCandidates
std::size_t nM1M3Candidates
std::size_t nRejectedPairs
std::size_t nM1OnlyPositionCandidates
std::size_t nDuplicateProjectionSegments
std::size_t nRejectedProjectionCombinations
std::size_t nLimitedProjectionSegments
std::size_t nM1M2Candidates
std::size_t nM2M3Candidates
std::uint8_t observedLayers
std::uint8_t nominalLayers