93 {
94
95 const Muon::TgcCablingMap*
cabling{};
97
98 SG::ReadCondHandle<MuonGM::MuonDetectorManager> detectorManagerHandle{
100 if (!detectorManagerHandle.
isValid()) {
102 return StatusCode::FAILURE;
103 }
104 const MuonGM::MuonDetectorManager* detectorManager =
105 detectorManagerHandle.
cptr();
106
108 TgcL0Floating::DecodeStatistics statistics;
109 const TgcL0Floating::RdoDecoder
decoder;
111 hitGroups, statistics));
112
114 const TgcL0Floating::StationCoincidenceBuilder coincidenceBuilder;
115 ATH_CHECK(coincidenceBuilder.build(hitGroups, coincidences));
116
117
118 TgcL0Floating::SegmentReconstructionConfig segmentConfig;
119 segmentConfig.maxPivotWireStripDeltaEta =
121 segmentConfig.maxPivotWireStripDeltaPhi =
123 segmentConfig.maxSegmentCombinationsPerGroup =
125 segmentConfig.maxCandidatesPerLocalBin =
127 TgcL0Floating::SegmentStatistics segmentStatistics;
128 const TgcL0Floating::SegmentReconstruction segmentReconstruction{
129 std::move(segmentConfig)};
130 ATH_CHECK(segmentReconstruction.build(coincidences, candidates,
131 segmentStatistics, segments));
132
133 TgcL0Floating::OverlapClassificationStatistics overlapStatistics;
134 const TgcL0Floating::OverlapClassification overlapClassification;
135 overlapClassification.classify(candidates, overlapStatistics);
136
137 std::size_t nValidPtEstimates = 0U;
138 for (TgcL0Candidate& candidate : candidates) {
139 const TgcL0FloatingPtEvaluation evaluation =
140 m_ptLut->evaluate(candidate.eta, candidate.phi, candidate.deltaTheta);
141 if (!evaluation.ptEstimateValid) continue;
142 candidate.preInnerCoincidencePt = evaluation.ptEstimateGeV;
143 candidate.preInnerCoincidenceThreshold = evaluation.thresholdCode;
144 candidate.charge = evaluation.estimatedCharge;
145 ++nValidPtEstimates;
146 }
147 const std::size_t nInvalidPtEstimates =
149 ATH_MSG_DEBUG(
"Floating-pT evaluation: valid=" << nValidPtEstimates
150 << ", invalid="
151 << nInvalidPtEstimates);
152
153 CoincidenceQualityCounts totalCounts;
154 CoincidenceQualityCounts m1WireCounts;
155 CoincidenceQualityCounts m1StripCounts;
156 CoincidenceQualityCounts m2WireCounts;
157 CoincidenceQualityCounts m2StripCounts;
158 CoincidenceQualityCounts m3WireCounts;
159 CoincidenceQualityCounts m3StripCounts;
160
161 for (const TgcL0Floating::StationCoincidence& coincidence : coincidences) {
162 countCoincidenceQuality(coincidence, totalCounts);
163
164 CoincidenceQualityCounts* stationCounts{nullptr};
166 stationCounts = coincidence.isStrip ? &m1StripCounts : &m1WireCounts;
168 stationCounts = coincidence.isStrip ? &m2StripCounts : &m2WireCounts;
170 stationCounts = coincidence.isStrip ? &m3StripCounts : &m3WireCounts;
171 }
172 if (stationCounts != nullptr) {
173 countCoincidenceQuality(coincidence, *stationCounts);
174 }
175 }
176
177 ATH_MSG_DEBUG(
"Decoded " << statistics.nHits <<
" TGC hits from "
178 << statistics.nRawData << " raw-data words in "
179 << hitGroups.size() << " groups: wire="
180 << statistics.nWireHits << ", strip="
181 << statistics.nStripHits << ", M1="
182 << statistics.nM1Hits << ", M2="
183 << statistics.nM2Hits << ", M3="
184 << statistics.nM3Hits << ", inner="
185 << statistics.nInnerHits << ", unknown="
186 << statistics.nUnknownStation
187 << ", mapping failures="
188 << statistics.nMappingFailures
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 << ")");
196
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 << ")");
211
213 << segmentStatistics.nWireSegments << ", strip="
214 << segmentStatistics.nStripSegments << ", candidates="
216 << segmentStatistics.nM1M2M3Candidates << ", M1M2="
217 << segmentStatistics.nM1M2Candidates << ", M1M3="
218 << segmentStatistics.nM1M3Candidates << ", M2M3="
219 << segmentStatistics.nM2M3Candidates
220 << ", M1only="
221 << segmentStatistics.nM1OnlyPositionCandidates
222 << ", M2only="
223 << segmentStatistics.nM2OnlyPositionCandidates
224 << ", M3only="
225 << segmentStatistics.nM3OnlyPositionCandidates
226 << "), projectionRejected="
227 << segmentStatistics.nRejectedProjectionCombinations
228 << ", projectionDuplicates="
229 << segmentStatistics.nDuplicateProjectionSegments
230 << ", projectionLimited="
231 << segmentStatistics.nLimitedProjectionSegments
232 << ", pairRejected=" << segmentStatistics.nRejectedPairs
233 << ", candidateDuplicates="
234 << segmentStatistics.nDuplicateCandidates
235 << ", localDuplicates="
236 << segmentStatistics.nLocalDuplicateCandidates
237 << ", candidateLimited="
238 << segmentStatistics.nLimitedCandidates);
239
241 << overlapStatistics.nGroups << ", candidates="
242 << overlapStatistics.nCandidates << ", maxMultiplicity="
243 << overlapStatistics.maxMultiplicity);
244
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);
251 }
252 }
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 << ",";
258 }
260 << groupId << ", multiplicity=" << memberIndices.size()
261 << ", members=[" << members.str() << "]");
262 }
263
264 for (std::size_t candidateIndex = 0; candidateIndex <
candidates.size();
265 ++candidateIndex) {
266 const TgcL0Candidate& candidate =
candidates[candidateIndex];
268 << candidateIndex << ", bcTag=" << candidate.bcTag
269 << ", subdetectorId=" << candidate.subdetectorId
270 << ", triggerSector=" << candidate.sectorId
271 << ", readoutSector=" << candidate.readoutSector
272 << ", stationMask="
273 << static_cast<unsigned int>(candidate.stationMask)
274 << ", wireStationMask="
275 << static_cast<unsigned int>(candidate.wireStationMask)
276 << ", stripStationMask="
277 << static_cast<unsigned int>(candidate.stripStationMask)
278 << ", positionStationMask="
279 << static_cast<unsigned int>(
280 candidate.positionStationMask)
281 << ", eta=" << candidate.eta << ", phi="
282 << candidate.phi << ", deltaTheta="
283 << candidate.deltaTheta << ", deltaPhi="
284 << candidate.deltaPhi << ", preInnerCoincidencePt="
285 << candidate.preInnerCoincidencePt
286 << ", preInnerCoincidenceThreshold="
287 << static_cast<unsigned int>(
288 candidate.preInnerCoincidenceThreshold)
289 << ", charge=" << static_cast<int>(candidate.charge)
290 << ", wireQuality="
291 << static_cast<unsigned int>(candidate.wireQuality)
292 << ", wireQualities=("
293 << static_cast<unsigned int>(candidate.m1WireQuality)
294 << ","
295 << static_cast<unsigned int>(candidate.m2WireQuality)
296 << ","
297 << static_cast<unsigned int>(candidate.m3WireQuality)
298 << "), stripQualities=("
299 << static_cast<unsigned int>(candidate.m1StripQuality)
300 << ","
301 << static_cast<unsigned int>(candidate.m2StripQuality)
302 << ","
303 << static_cast<unsigned int>(candidate.m3StripQuality)
304 << "), chambers=(M1:" << candidate.m1StationEta << "/"
305 << candidate.m1StationPhi << ", M2:"
306 << candidate.m2StationEta << "/" << candidate.m2StationPhi
307 << ", M3:" << candidate.m3StationEta << "/"
308 << candidate.m3StationPhi << "), overlapGroupId="
309 << candidate.overlapGroupId << ", overlapMultiplicity="
310 << static_cast<unsigned int>(candidate.overlapMultiplicity)
311 << ", inChamberOverlap=" << candidate.inChamberOverlap);
312 }
313
314
315
316 return StatusCode::SUCCESS;
317}
#define ATH_CHECK
Evaluate an expression and check for errors.
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.