107 {
108
109 const Muon::TgcCablingMap*
cabling{};
111
112 SG::ReadCondHandle<MuonGM::MuonDetectorManager> detectorManagerHandle{
114 if (!detectorManagerHandle.
isValid()) {
116 return StatusCode::FAILURE;
117 }
118 const MuonGM::MuonDetectorManager* detectorManager =
119 detectorManagerHandle.
cptr();
120
122 TgcL0Floating::DecodeStatistics statistics;
123 const TgcL0Floating::RdoDecoder
decoder;
125 hitGroups, statistics));
126
128 const TgcL0Floating::StationCoincidenceBuilder coincidenceBuilder;
129 ATH_CHECK(coincidenceBuilder.build(hitGroups, coincidences));
130
131
132 TgcL0Floating::SegmentReconstructionConfig segmentConfig;
133 segmentConfig.maxPivotWireStripDeltaEta =
135 segmentConfig.maxPivotWireStripDeltaPhi =
137 segmentConfig.maxSegmentCombinationsPerGroup =
139 segmentConfig.maxCandidatesPerLocalBin =
141 TgcL0Floating::SegmentStatistics segmentStatistics;
142 const TgcL0Floating::SegmentReconstruction segmentReconstruction{
143 std::move(segmentConfig)};
144 ATH_CHECK(segmentReconstruction.build(coincidences, candidates,
145 segmentStatistics, segments));
146
147 TgcL0Floating::OverlapClassificationStatistics overlapStatistics;
148 const TgcL0Floating::OverlapClassification overlapClassification;
149 overlapClassification.classify(candidates, overlapStatistics);
150
151 std::size_t nValidPtEstimates = 0U;
152 for (TgcL0Candidate& candidate : candidates) {
153 const TgcL0FloatingPtEvaluation evaluation =
154 m_ptLut->evaluate(candidate.eta, candidate.phi, candidate.deltaTheta);
156 candidate.eta, candidate.phi,
m_ptLut->absEtaMin(),
158 if (!evaluation.ptEstimateValid) continue;
159 candidate.preInnerCoincidencePt = evaluation.ptEstimateGeV;
160 candidate.preInnerCoincidenceThreshold = evaluation.thresholdCode;
161 candidate.charge = evaluation.estimatedCharge;
162 ++nValidPtEstimates;
163 }
164 const std::size_t nInvalidPtEstimates =
166 ATH_MSG_DEBUG(
"Floating-pT evaluation: valid=" << nValidPtEstimates
167 << ", invalid="
168 << nInvalidPtEstimates);
169
170 CoincidenceQualityCounts totalCounts;
171 CoincidenceQualityCounts m1WireCounts;
172 CoincidenceQualityCounts m1StripCounts;
173 CoincidenceQualityCounts m2WireCounts;
174 CoincidenceQualityCounts m2StripCounts;
175 CoincidenceQualityCounts m3WireCounts;
176 CoincidenceQualityCounts m3StripCounts;
177
178 for (const TgcL0Floating::StationCoincidence& coincidence : coincidences) {
179 countCoincidenceQuality(coincidence, totalCounts);
180
181 CoincidenceQualityCounts* stationCounts{nullptr};
183 stationCounts = coincidence.isStrip ? &m1StripCounts : &m1WireCounts;
185 stationCounts = coincidence.isStrip ? &m2StripCounts : &m2WireCounts;
187 stationCounts = coincidence.isStrip ? &m3StripCounts : &m3WireCounts;
188 }
189 if (stationCounts != nullptr) {
190 countCoincidenceQuality(coincidence, *stationCounts);
191 }
192 }
193
194 ATH_MSG_DEBUG(
"Decoded " << statistics.nHits <<
" TGC hits from "
195 << statistics.nRawData << " raw-data words in "
196 << hitGroups.size() << " groups: wire="
197 << statistics.nWireHits << ", strip="
198 << statistics.nStripHits << ", M1="
199 << statistics.nM1Hits << ", M2="
200 << statistics.nM2Hits << ", M3="
201 << statistics.nM3Hits << ", inner="
202 << statistics.nInnerHits << ", unknown="
203 << statistics.nUnknownStation
204 << ", mapping failures="
205 << statistics.nMappingFailures
206 << "; station coincidences="
207 << coincidences.size() << " (3/3="
208 << totalCounts.nThreeOfThree << ", 2/3="
209 << totalCounts.nTwoOfThree << ", 1/3="
210 << totalCounts.nOneOfThree << ", 2/2="
211 << totalCounts.nTwoOfTwo << ", 1/2="
212 << totalCounts.nOneOfTwo << ")");
213
215 << m1WireCounts.nThreeOfThree << ", 2/3="
216 << m1WireCounts.nTwoOfThree << ", 1/3="
217 << m1WireCounts.nOneOfThree << "), M1 strip=(2/2="
218 << m1StripCounts.nTwoOfTwo << ", 1/2="
219 << m1StripCounts.nOneOfTwo << "), M2 wire=(2/2="
220 << m2WireCounts.nTwoOfTwo << ", 1/2="
221 << m2WireCounts.nOneOfTwo << "), M2 strip=(2/2="
222 << m2StripCounts.nTwoOfTwo << ", 1/2="
223 << m2StripCounts.nOneOfTwo << "), M3 wire=(2/2="
224 << m3WireCounts.nTwoOfTwo << ", 1/2="
225 << m3WireCounts.nOneOfTwo << "), M3 strip=(2/2="
226 << m3StripCounts.nTwoOfTwo << ", 1/2="
227 << m3StripCounts.nOneOfTwo << ")");
228
230 << segmentStatistics.nWireSegments << ", strip="
231 << segmentStatistics.nStripSegments << ", candidates="
233 << segmentStatistics.nM1M2M3Candidates << ", M1M2="
234 << segmentStatistics.nM1M2Candidates << ", M1M3="
235 << segmentStatistics.nM1M3Candidates << ", M2M3="
236 << segmentStatistics.nM2M3Candidates
237 << ", M1only="
238 << segmentStatistics.nM1OnlyPositionCandidates
239 << ", M2only="
240 << segmentStatistics.nM2OnlyPositionCandidates
241 << ", M3only="
242 << segmentStatistics.nM3OnlyPositionCandidates
243 << "), projectionRejected="
244 << segmentStatistics.nRejectedProjectionCombinations
245 << ", projectionDuplicates="
246 << segmentStatistics.nDuplicateProjectionSegments
247 << ", projectionLimited="
248 << segmentStatistics.nLimitedProjectionSegments
249 << ", pairRejected=" << segmentStatistics.nRejectedPairs
250 << ", candidateDuplicates="
251 << segmentStatistics.nDuplicateCandidates
252 << ", localDuplicates="
253 << segmentStatistics.nLocalDuplicateCandidates
254 << ", candidateLimited="
255 << segmentStatistics.nLimitedCandidates);
256
258 << overlapStatistics.nGroups << ", candidates="
259 << overlapStatistics.nCandidates << ", maxMultiplicity="
260 << overlapStatistics.maxMultiplicity);
261
262 for (std::size_t groupId = 1U;
263 groupId <= overlapStatistics.nGroups; ++groupId) {
264 std::vector<std::size_t> memberIndices;
266 if (candidates[index].overlapGroupId == groupId) {
267 memberIndices.emplace_back(index);
268 }
269 }
270 if (memberIndices.empty()) continue;
271 std::ostringstream members;
272 for (std::size_t position = 0U;
position < memberIndices.size(); ++
position) {
273 if (position != 0U) members << ",";
275 }
277 << groupId << ", multiplicity=" << memberIndices.size()
278 << ", members=[" << members.str() << "]");
279 }
280
281 for (std::size_t candidateIndex = 0; candidateIndex <
candidates.size();
282 ++candidateIndex) {
283 const TgcL0Candidate& candidate =
candidates[candidateIndex];
285 << candidateIndex << ", bcTag=" << candidate.bcTag
286 << ", subdetectorId=" << candidate.subdetectorId
287 << ", triggerSector=" << candidate.sectorId
288 << ", readoutSector=" << candidate.readoutSector
289 << ", stationMask="
290 << static_cast<unsigned int>(candidate.stationMask)
291 << ", wireStationMask="
292 << static_cast<unsigned int>(candidate.wireStationMask)
293 << ", stripStationMask="
294 << static_cast<unsigned int>(candidate.stripStationMask)
295 << ", positionStationMask="
296 << static_cast<unsigned int>(
297 candidate.positionStationMask)
298 << ", eta=" << candidate.eta << ", phi="
299 << candidate.phi << ", deltaTheta="
300 << candidate.deltaTheta << ", deltaPhi="
301 << candidate.deltaPhi << ", preInnerCoincidencePt="
302 << candidate.preInnerCoincidencePt
303 << ", preInnerCoincidenceThreshold="
304 << static_cast<unsigned int>(
305 candidate.preInnerCoincidenceThreshold)
306 << ", charge=" << static_cast<int>(candidate.charge)
307 << ", goodMagneticField="
308 << candidate.goodMagneticField
309 << ", wireQuality="
310 << static_cast<unsigned int>(candidate.wireQuality)
311 << ", wireQualities=("
312 << static_cast<unsigned int>(candidate.m1WireQuality)
313 << ","
314 << static_cast<unsigned int>(candidate.m2WireQuality)
315 << ","
316 << static_cast<unsigned int>(candidate.m3WireQuality)
317 << "), stripQualities=("
318 << static_cast<unsigned int>(candidate.m1StripQuality)
319 << ","
320 << static_cast<unsigned int>(candidate.m2StripQuality)
321 << ","
322 << static_cast<unsigned int>(candidate.m3StripQuality)
323 << "), chambers=(M1:" << candidate.m1StationEta << "/"
324 << candidate.m1StationPhi << ", M2:"
325 << candidate.m2StationEta << "/" << candidate.m2StationPhi
326 << ", M3:" << candidate.m3StationEta << "/"
327 << candidate.m3StationPhi << "), overlapGroupId="
328 << candidate.overlapGroupId << ", overlapMultiplicity="
329 << static_cast<unsigned int>(candidate.overlapMultiplicity)
330 << ", inChamberOverlap=" << candidate.inChamberOverlap);
331 }
332
333
334
335 return StatusCode::SUCCESS;
336}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
const_pointer_type cptr()
std::map< HitGroupKey, HitContainer > HitGroups
std::vector< StationCoincidence > StationCoincidenceContainer
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.