ATLAS Offline Software
Loading...
Searching...
No Matches
MuonInDetToMuonSystemExtensionAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
11namespace {
12 constexpr unsigned int num_sectors = 16;
15
16 inline const Trk::PrepRawData* prepData(const std::shared_ptr<MuonHough::Hit>& hit) {
17 if (hit->prd) return hit->prd;
18 if (hit->tgc) return hit->tgc->phiCluster.front();
19 return nullptr;
20 }
23 struct hough_chamber {
24 int nhits{0};
25 double eta{0.};
26 std::set<int> sectors;
27 };
28
29} // namespace
30
31
34 ATH_CHECK(m_idHelperSvc.retrieve());
35 ATH_CHECK(m_edmHelperSvc.retrieve());
36 ATH_CHECK(m_combTagMap.initialize());
37 ATH_CHECK(m_inputCandidate.initialize());
38 ATH_CHECK(m_bulkInDetCandKey.initialize());
40 if (m_restrictExtension) { ATH_MSG_INFO("Use the Hough seeds to determine the sectors in the MS worth for being extrapolated to"); }
44 return StatusCode::SUCCESS;
45}
46
47StatusCode MuonInDetToMuonSystemExtensionAlg::execute(const EventContext& ctx) const {
48 ATH_MSG_DEBUG("Cakes are availablei in "<<ctx.eventID().event_number());
49 InDetCandidateCache output_cache{};
50
52 if (!input_container.isValid()) {
53 ATH_MSG_FATAL("Failed to retrieve " << m_inputCandidate.fullKey());
54 return StatusCode::FAILURE;
55 }
56 output_cache.input_candidates = input_container.cptr();
57 ATH_CHECK(selectCandidates(ctx, output_cache));
58
60 ATH_CHECK(findSegments(ctx, output_cache));
61 ATH_CHECK(findHitSectors(ctx, output_cache));
62 }
63
64 ATH_MSG_DEBUG("Find the inner detector candidates to be used for MuGirl / Segment tagging");
65 ATH_CHECK(create(ctx, output_cache));
67 ATH_CHECK(indetCandidateCollection.record(std::move(output_cache.outputContainer)));
68
69 ATH_CHECK(createStaus(ctx, indetCandidateCollection.ptr(), output_cache.tag_map));
70
71 return StatusCode::SUCCESS;
72}
73StatusCode MuonInDetToMuonSystemExtensionAlg::selectCandidates(const EventContext& ctx, InDetCandidateCache& out_cache) const {
75 if (!tag_map.isValid()) {
76 ATH_MSG_FATAL("Failed to retrieve the tag map from " << tag_map.fullKey());
77 return StatusCode::FAILURE;
78 }
79 if (tag_map->empty()) {
80 ATH_MSG_DEBUG("No combined candidates in this event");
81 return StatusCode::SUCCESS;
82 }
83
84 for (const auto& combined_tags : *tag_map) {
85 if (combined_tags.second->author() != xAOD::Muon::MuidCo) {
86 ATH_MSG_WARNING("Found a non MuidCo tag.... Please check " << combined_tags.second->toString());
87 continue;
88 }
89 const MuonCombined::CombinedFitTag* cmb_tag = dynamic_cast<const MuonCombined::CombinedFitTag*>(combined_tags.second.get());
90 MuidCoCache cache{combined_tags.first, cmb_tag};
91 out_cache.tag_map.push_back(std::move(cache));
92 out_cache.excluded_trks.insert(combined_tags.first);
93 for (const Muon::MuonSegment* muon_seg : cmb_tag->associatedSegments()) {
94 out_cache.combined_segs.insert(muon_seg);
95 maskHits(muon_seg, out_cache);
96 }
97 }
98 return StatusCode::SUCCESS;
99}
100StatusCode MuonInDetToMuonSystemExtensionAlg::create(const EventContext& ctx, InDetCandidateCache& out_cache) const {
102 for (const MuonCombined::InDetCandidate* candidate : *out_cache.input_candidates) {
103 if (out_cache.excluded_trks.count(candidate)) {
104 ATH_MSG_VERBOSE("Inner detector track " << candidate->toString() << " has already been used by MuidCo");
105 continue;
106 }
109 if (candidate->indetTrackParticle().pt() < m_extThreshold || (!m_extendSAF && candidate->isSiliconAssociated()) ||
110 (!m_extendBulk && !candidate->isSiliconAssociated())) {
111 ATH_MSG_VERBOSE("Inner detector track " << candidate->toString() << " is too soft");
112 continue;
113 }
114
117 cache.candidate = std::make_unique<MuonCombined::InDetCandidate>(candidate->indetTrackParticleLink());
119 cache.candidate->setExtension(candidate->getCaloExtension());
120
121 const Muon::MuonSystemExtension* extension = candidate->getExtension();
123 if (extension) {
125 std::vector<Muon::MuonSystemExtension::Intersection> intersects = extension->layerIntersections();
126 cache.candidate->setExtension(
127 std::make_unique<Muon::MuonSystemExtension>(&extension->muonEntryLayerIntersection(), std::move(intersects)));
128 } else {
130 const bool seg_match = !m_restrictExtension || hasMatchingSegment(*candidate, out_cache);
131
132 if (!seg_match && !hasMatchingSeed(*candidate, out_cache)) continue;
133 cache.useHitSectors = !seg_match;
134 cache.sectorsWithHits = &out_cache.hit_sectors;
135 cache.createSystemExtension = true;
136 cache.requireSystemExtension = true;
137
138 if (!m_muonSystemExtensionTool->muonSystemExtension(ctx, cache)) {
139 ATH_MSG_VERBOSE("Extension failed");
140 continue;
141 }
142 }
143 out_cache.outputContainer->push_back(std::move(cache.candidate));
144 }
145 if (msgLevel(MSG::DEBUG)) {
146 std::stringstream sstr;
147 for (const MuonCombined::InDetCandidate* extended : *out_cache.outputContainer) {
148 sstr << " * " << extended->toString() << std::endl;
149 }
150 if (!out_cache.excluded_trks.empty()) {
151 sstr << std::endl << " ======== The following tracks were already successfully combined ======== " << std::endl;
152 for (const MuonCombined::InDetCandidate* combined : out_cache.excluded_trks) {
153 sstr << " = " << combined->toString() << std::endl;
154 }
155 }
156 if (out_cache.excluded_trks.size() + out_cache.outputContainer->size() != out_cache.input_candidates->size()) {
157 sstr << std::endl << " ++++++++ The following candidates were not extrapolated ++++++++ " << std::endl;
158 const InDetCandidateCollection::const_iterator begin = out_cache.outputContainer->begin();
160
161 for (const MuonCombined::InDetCandidate* rejected : *out_cache.input_candidates) {
162 if (out_cache.excluded_trks.count(rejected) ||
163 std::find_if(begin, end,
164 [rejected](const MuonCombined::InDetCandidate* extended) { return (*rejected) == (*extended); }) != end)
165 continue;
166 sstr << " + " << rejected->toString() << std::endl;
167 }
168 }
169 ATH_MSG_DEBUG("Extrapolated " << out_cache.outputContainer->size() << " out of " << out_cache.input_candidates->size()
170 << " tracks through the spectrometer" << std::endl
171 << std::endl
172 << sstr.str());
173 }
174 return StatusCode::SUCCESS;
175}
176
177StatusCode MuonInDetToMuonSystemExtensionAlg::findHitSectors(const EventContext& ctx, InDetCandidateCache& output_cache) const {
179 if (!readHandle.isValid()) {
180 ATH_MSG_FATAL("Failed to retrieve the prep data container " << m_houghDataPerSectorVecKey.fullKey());
181 return StatusCode::FAILURE;
182 }
183 const std::vector<Muon::HoughDataPerSec>& hough_data = readHandle->vec;
185 auto count_finished = [&output_cache]() -> unsigned int {
186 unsigned int n{0};
187 for (const auto& sector_hits : output_cache.hit_sectors) { n += sector_hits.second.size() >= num_sectors; }
188 return n;
189 };
190
193 using namespace Muon::MuonStationIndex;
194 for (int det_region = 0; det_region < toInt(DetectorRegionIndex::DetectorRegionIndexMax); ++det_region) {
195 const RegionIndex region_index = static_cast<RegionIndex>(det_region);
196 for (int layer = 0; layer < toInt(LayerIndex::LayerIndexMax); ++layer) {
197 const LayerIndex layer_index = static_cast<LayerIndex>(layer);
198 const unsigned int hash = sectorLayerHash(region_index, layer_index);
200 const std::set<Identifier>& masked_hits = output_cache.consumed_hits[hash];
201
203 auto num_hough_hits = [&masked_hits, this](const std::shared_ptr<MuonHough::MuonLayerHough::Maximum>& hough_maximum) {
204 std::map<Identifier, hough_chamber> chamber_counts;
205 for (const std::shared_ptr<MuonHough::Hit>& hough_hit : hough_maximum->hits) {
206 const Trk::PrepRawData* prep = prepData(hough_hit);
207 const Identifier chId = prep->identify();
208 if (masked_hits.count(chId) || (m_excludeNSW && (m_idHelperSvc->isMM(chId) || m_idHelperSvc->issTgc(chId)))) {
209 ATH_MSG_VERBOSE("Do not reuse hit " << m_idHelperSvc->toString(chId));
210 continue;
211 }
212 ATH_MSG_VERBOSE("Count hough hit " << m_idHelperSvc->toString(chId));
213 // Split the seeds into the chambers
214 hough_chamber& chamber = chamber_counts[m_idHelperSvc->chamberId(chId)];
215 ++chamber.nhits;
216 const Amg::Vector3D glob_pos = prep->detectorElement()->center(chId);
217 chamber.eta += glob_pos.eta();
218 chamber.sectors.insert(m_sector_mapping.getSector(glob_pos.phi()));
219 }
221 hough_chamber N{};
222 for (auto& ch_it : chamber_counts) {
223 if (N.nhits < ch_it.second.nhits) { N = std::move(ch_it.second); }
224 }
226 N.eta /= std::max(N.nhits, 1);
227 return N;
228 };
229
230 for (const Muon::HoughDataPerSec& sector_data : hough_data) {
231 const Muon::HoughDataPerSec::MaximumVec& eta_hits = sector_data.maxVec[hash];
233 for (const std::shared_ptr<MuonHough::MuonLayerHough::Maximum>& maxima : eta_hits) {
235 const hough_chamber effect_hits = num_hough_hits(maxima);
237 if (m_houghMin > effect_hits.nhits) continue;
238 ATH_MSG_VERBOSE("Hough maximum in " << Muon::MuonStationIndex::regionName(region_index) << ", "
240 << ", hits: " << effect_hits.nhits);
241
242 for (const int sector : effect_hits.sectors) {
243 output_cache.hit_sectors[region_index].insert(sector);
245 output_cache.eta_seeds[sector].push_back(effect_hits.eta);
246 }
247 }
248 if (count_finished() >= toInt(RegionIndex::DetectorRegionIndexMax)) {
249 ATH_MSG_VERBOSE("The MS is filled up with Hough seeds. We do not need to search for them any longer");
250 break;
251 }
252 }
253 }
254 for (auto& theta_pair : output_cache.eta_seeds) { std::sort(theta_pair.second.begin(), theta_pair.second.end()); }
255 }
256 output_cache.consumed_hits.clear();
257 return StatusCode::SUCCESS;
258}
259StatusCode MuonInDetToMuonSystemExtensionAlg::findSegments(const EventContext& ctx, InDetCandidateCache& output_cache) const {
261 if (!segmentContainer.isValid()) {
262 ATH_MSG_FATAL("Failed to retrieve the Muon segment container " << m_segmentKey.fullKey());
263 return StatusCode::FAILURE;
264 }
265 for (const Trk::Segment* trk_segment : *segmentContainer) {
266 // Which in reality is a Muon segment
267 const Muon::MuonSegment* muon_segment = dynamic_cast<const Muon::MuonSegment*>(trk_segment);
268 if (!muon_segment) {
269 ATH_MSG_WARNING("How can it be that a Muon segment is not a muon segment?");
270 continue;
271 }
272 // Check if the segment satisfies the quality criteria
273 if (m_segmentSelector->quality(*muon_segment) < m_segmentQuality) continue;
275 if (output_cache.combined_segs.count(muon_segment)) {
276 ATH_MSG_VERBOSE("Segment was already used in combined fit");
277 continue;
278 }
279 if (m_excludeNSW && std::find_if(muon_segment->containedMeasurements().begin(),muon_segment->containedMeasurements().end(),
280 [this](const Trk::MeasurementBase* meas ){
281 const Identifier meas_id = m_edmHelperSvc->getIdentifier(*meas);
282 return meas_id.is_valid() && (m_idHelperSvc->isMM(meas_id) || m_idHelperSvc->issTgc(meas_id));
283 })!= muon_segment->containedMeasurements().end()) continue;
284
286 maskHits(muon_segment, output_cache);
287 output_cache.candidate_segments.push_back(muon_segment);
288 }
289 output_cache.combined_segs.clear();
290 return StatusCode::SUCCESS;
291}
293 const InDetCandidateCache& cache) const {
295 const double ThetaID = ms_entry->position().theta();
296 std::vector<int> id_sectors;
297 m_sector_mapping.getSectors(ms_entry->position().phi(), id_sectors);
298 auto sector_match = [&id_sectors, this](const Amg::Vector3D& seg_pos) -> bool {
299 std::vector<int> seg_sectors;
300 m_sector_mapping.getSectors(seg_pos.phi(), seg_sectors);
301 return std::find_if(id_sectors.begin(), id_sectors.end(), [&seg_sectors](const int id_sec) {
302 return std::find(seg_sectors.begin(), seg_sectors.end(), id_sec) != seg_sectors.end();
303 }) != id_sectors.end();
304 };
305 for (const Muon::MuonSegment* itSeg : cache.candidate_segments) {
306 const Amg::Vector3D pos = itSeg->globalPosition();
307 const double dTheta = pos.theta() - ThetaID;
308 const bool theta_match = std::abs(dTheta) < 0.2;
309 if (!theta_match) {
310 ATH_MSG_VERBOSE("dTheta cut failed");
311 continue;
312 }
313 if (!sector_match(pos)) {
314 ATH_MSG_VERBOSE("dPhi cut failed");
315 continue;
316 }
317 return true;
318 }
319 return false;
320}
322 const InDetCandidateCache& cache) const {
324 const double etaID = ms_entry->position().eta();
325 std::vector<int> id_sectors;
326 m_sector_mapping.getSectors(ms_entry->position().phi(), id_sectors);
327 for (const int& sect : id_sectors) {
328 std::map<int, std::vector<double>>::const_iterator theta_itr = cache.eta_seeds.find(sect);
329 if (theta_itr == cache.eta_seeds.end()) continue;
330 if (std::find_if(theta_itr->second.begin(), theta_itr->second.end(),
331 [&etaID](const double eta_seed) { return std::abs(etaID - eta_seed) < 0.1; }) != theta_itr->second.end())
332 return true;
333 }
334 return false;
335}
336
337StatusCode MuonInDetToMuonSystemExtensionAlg::createStaus(const EventContext& ctx, const InDetCandidateCollection* ext_candidates,
338 const MuidCoVector& tag_map) const {
339 if (m_stauInDetCandKey.empty()) {
340 ATH_MSG_VERBOSE("No candidates for stau reconstruction will be written");
341 return StatusCode::SUCCESS;
342 }
343 ATH_MSG_DEBUG("Now find the candidates to be considered for MuGirlStau");
344 InDetCandidateCache stau_cache{};
345 stau_cache.input_candidates = ext_candidates;
346
348 ATH_CHECK(create(ctx, stau_cache));
354 for (const MuidCoCache& idMuidCo : tag_map) {
356 cache.candidate = std::make_unique<MuonCombined::InDetCandidate>(idMuidCo.id_trk->indetTrackParticleLink());
357 cache.candidate->setSiliconAssociated(idMuidCo.id_trk->isSiliconAssociated());
358 cache.candidate->setExtension(idMuidCo.id_trk->getCaloExtension());
359 cache.useHitSectors = false;
360 cache.createSystemExtension = true;
361 cache.requireSystemExtension = true;
362
363 if (!m_muonSystemExtensionTool->muonLayerInterSections(ctx, *idMuidCo.cmb_trk, cache)) {
364 ATH_MSG_DEBUG("Could not determine the intersections. Although that should be possible");
365 continue;
366 }
367 stau_cache.outputContainer->push_back(std::move(cache.candidate));
368 }
369
371 // sort candidates beofre storing, otherwise ordering in container of stau segments can be inconsistent
372 std::sort(stau_cache.outputContainer->begin(),stau_cache.outputContainer->end(),[](const MuonCombined::InDetCandidate*a, const MuonCombined::InDetCandidate*b){
373 return a->indetTrackParticle().pt() < b->indetTrackParticle().pt();});
374 ATH_CHECK(indetCandidateCollection.record(std::move(stau_cache.outputContainer)));
375 return StatusCode::SUCCESS;
376}
377
379 const Identifier seg_id = m_edmHelperSvc->chamberId(*muon_seg);
380 const LayerIndex layer_index = m_idHelperSvc->layerIndex(seg_id);
381 const RegionIndex region_index = m_idHelperSvc->regionIndex(seg_id);
382 const unsigned int hash = Muon::MuonStationIndex::sectorLayerHash(region_index, layer_index);
383 std::set<Identifier>& id_set = output_cache.consumed_hits[hash];
384 for (const Trk::MeasurementBase* meas : muon_seg->containedMeasurements()) {
385 const Identifier meas_id = m_edmHelperSvc->getIdentifier(*meas);
386 id_set.insert(meas_id);
387 }
388}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
DataVector adapter that acts like it holds const pointers.
DataVector< MuonCombined::InDetCandidate > InDetCandidateCollection
This typedef represents a collection of InDetCandidate objects.
static Double_t a
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
size_type size() const noexcept
Returns the number of elements in the collection.
TagBase implementation for a combined fit.
std::vector< const Muon::MuonSegment * > associatedSegments() const override
access to associated segments, empty vector if non available
void setExtension(std::unique_ptr< Muon::MuonSystemExtension > extension)
bool isSiliconAssociated() const
Returns true if this candidate was formed from a special far forward InDet track.
const Trk::CaloExtension * getCaloExtension() const
const xAOD::TrackParticle & indetTrackParticle() const
access TrackParticle
void setSiliconAssociated(bool)
Pass true if this candiate was created from a special far forward InDet track.
const Muon::MuonSystemExtension * getExtension() const
std::string toString() const
print candidate to string
const ElementLink< xAOD::TrackParticleContainer > & indetTrackParticleLink() const
access TrackParticleLink
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
StatusCode create(const EventContext &ctx, InDetCandidateCache &cache) const
Create the InDetCandidaes with system extensions.
SG::ReadHandleKey< Trk::SegmentCollection > m_segmentKey
Let's exploit the segments to get rid of as much tracks as possible.
SG::ReadHandleKey< MuonCombined::InDetCandidateToTagMap > m_combTagMap
That is the collection of MuidCo candidates.
StatusCode findSegments(const EventContext &ctx, InDetCandidateCache &output_cache) const
Select good segments.
StatusCode findHitSectors(const EventContext &ctx, InDetCandidateCache &output_cache) const
Find the sectors in the MS with muon signals.
Gaudi::Property< bool > m_extendSAF
Shall SAF tracks be equiped with a muon system extension used by MuGirl later.
StatusCode selectCandidates(const EventContext &ctx, InDetCandidateCache &cache) const
Select the MuidCo candidates and put the associated id tracks on a block list.
bool hasMatchingSeed(const MuonCombined::InDetCandidate &id_cand, const InDetCandidateCache &cache) const
Searches for hough seeds within theta < 0.2 && sharing the same sector.
bool hasMatchingSegment(const MuonCombined::InDetCandidate &id_cand, const InDetCandidateCache &cache) const
Searches for segments within theta < 0.2 && sharing the same sector.
PublicToolHandle< Muon::IMuonSegmentSelectionTool > m_segmentSelector
StatusCode execute(const EventContext &ctx) const override
ToolHandle< Muon::IMuonSystemExtensionTool > m_muonSystemExtensionTool
The system extension tool extrapolates the candidate through the spectrometer.
StatusCode createStaus(const EventContext &ctx, const InDetCandidateCollection *ext_candidates, const MuidCoVector &tag_map) const
void maskHits(const Muon::MuonSegment *muon_seg, InDetCandidateCache &output_cache) const
Mask the hits of the corresponding muon segment as used.
Gaudi::Property< bool > m_restrictExtension
Restrict the extrapolation of ID tracks to sectors in the MS where at least a hit is recorded.
SG::ReadHandleKey< InDetCandidateCollection > m_inputCandidate
Gaudi::Property< int > m_houghMin
The hough maxima always contain at least 2 hits.
SG::WriteHandleKey< InDetCandidateCollection > m_bulkInDetCandKey
Collection of InDet candidates written for MuGirl and MuonSegmentTag.
SG::WriteHandleKey< InDetCandidateCollection > m_stauInDetCandKey
Collection of InDet candidates written for MuGirlStau.
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
Gaudi::Property< bool > m_extendBulk
Shall ordinary ID tracks be equiped with a muon system extension used by MuGirl later.
Gaudi::Property< bool > m_excludeNSW
Prelimnary studies have shown that the NSWs generate a massive amount of fake candidates.
Gaudi::Property< float > m_extThreshold
Minimum pt threshold of the IdCandidate to be extrapolated through the spectrometer.
SG::ReadHandleKey< Muon::HoughDataPerSectorVec > m_houghDataPerSectorVecKey
Use the hough data to find sectors in the speectrometer traversed by a muon.
This is the common class for 3D segments used in the muon spectrometer.
virtual const Amg::Vector3D & globalPosition() const override final
global position
Tracking class to hold the extrapolation from a particle from the calo entry to the end of muon syste...
const Trk::TrackParameters & muonEntryLayerIntersection() const
access to intersection with the muon entry layer
const std::vector< Intersection > & layerIntersections() const
access to the intersections with the layers.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const DataObjID & fullKey() const
Return the key as a DataObjID.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
const TrackParameters * muonEntryLayerIntersection() const
access to intersection with the muon entry layer return nullptr if the intersection failed
This class is the pure abstract base class for all fittable tracking measurements.
const Amg::Vector3D & position() const
Access method for the position.
virtual const TrkDetElementBase * detectorElement() const =0
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
Identifier identify() const
return the identifier
Base class for all TrackSegment implementations, extends the common MeasurementBase.
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
virtual const Amg::Vector3D & center() const =0
Return the center of the element.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Eigen::Matrix< double, 3, 1 > Vector3D
const std::string & layerName(LayerIndex index)
convert LayerIndex into a string
DetectorRegionIndex
enum to classify the different layers in the muon spectrometer
constexpr int toInt(const EnumType enumVal)
unsigned int sectorLayerHash(DetectorRegionIndex detectorRegionIndex, LayerIndex layerIndex)
create a hash out of region and layer
const std::string & regionName(DetectorRegionIndex index)
convert DetectorRegionIndex into a string
LayerIndex
enum to classify the different layers in the muon spectrometer
ParametersBase< TrackParametersDim, Charged > TrackParameters
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
std::unique_ptr< InDetCandidateCollection > outputContainer
Output container for the StoreGate.
const InDetCandidateCollection * input_candidates
Collection of the InDet candidates to consider.
std::set< const MuonCombined::InDetCandidate * > excluded_trks
Inner detector tracks to exclude.
std::map< Muon::MuonStationIndex::DetectorRegionIndex, std::set< int > > hit_sectors
Hit sector map.
std::vector< const Muon::MuonSegment * > candidate_segments
Muon segments that could be potentially used for MuGirl / MuTagIMO.
std::map< unsigned int, std::set< Identifier > > consumed_hits
Map of hits that were successfully combined to a muon segment Key is the hash made out of region & la...
std::set< const Muon::MuonSegment * > combined_segs
List of segments that were successfully combined to a muon.
Helper struct to cache the MuidCo track and it's associated segments while keeping the association In...
std::vector< std::shared_ptr< MuonHough::MuonLayerHough::Maximum > > MaximumVec
Helper struct to pipe all data needed by the tool to equip the Id track with a MuonSystemExtension.
bool requireSystemExtension
Require that the muon system extension was successful.
bool createSystemExtension
Try to create the muon system extension.
const std::map< MuonStationIndex::DetectorRegionIndex, std::set< int > > * sectorsWithHits
Cache the sectors which have a recorded hit.
bool useHitSectors
Switch to restrict the intersection search only to the sectors with hits.
std::unique_ptr< MuonCombined::InDetCandidate > candidate
Inner detector candidate.