17 MuonInsideOutRecoTool::MuonInsideOutRecoTool(
const std::string&
type,
const std::string&
name,
const IInterface*
parent) :
19 declareInterface<IMuonCombinedInDetExtensionTool>(
this);
20 declareInterface<MuonInsideOutRecoTool>(
this);
38 return StatusCode::SUCCESS;
43 const EventContext& ctx)
const {
44 ATH_MSG_WARNING(
"This version is deprecated, please use extendWithPRDs for MuGirl");
46 extendWithPRDs(inDetCandidates, tagMap, prdData, combTracks, meTracks, segments, ctx);
54 std::vector<std::shared_ptr<const Muon::MuonSegment>> msegments;
59 for(
auto trkSeg : *segInColl){
61 std::shared_ptr<const Muon::MuonSegment> mseg2 = std::make_shared<const Muon::MuonSegment>(*muonSeg);
62 msegments.push_back(mseg2);
74 ATH_MSG_DEBUG(
" skip silicon associated track for extension ");
83 if (!muonSystemExtension) {
91 std::vector<Muon::MuonLayerRecoData> allLayers;
93 const std::vector<Muon::MuonSystemExtension::Intersection>& layerIntersections = muonSystemExtension->
layerIntersections();
94 ATH_MSG_DEBUG(
" ID track: pt " << indetTrackParticle.
pt() <<
" eta " << indetTrackParticle.
eta() <<
" phi "
95 << indetTrackParticle.
phi() <<
" layers " << layerIntersections.size());
104 if (!
getLayerData(layer_intersect.layerSurface, layerPrepRawData, prdData)) {
111 m_segmentFinder->find(ctx, layer_intersect, layerPrepRawData, segments);
113 if (segments.empty())
continue;
117 for (
const std::shared_ptr<const Muon::MuonSegment>& seg : segments)
m_recoValidationTool->add(layer_intersect, *seg, 0);
121 std::vector<std::shared_ptr<const Muon::MuonSegment>> selectedSegments;
123 if (selectedSegments.empty())
continue;
131 allLayers.emplace_back(layer_intersect, std::move(selectedSegments));
135 msg(
MSG::DEBUG) <<
" Layers with segments " << allLayers.size();
136 for (
auto&
layer : allLayers) {
143 std::pair<std::unique_ptr<const Muon::MuonCandidate>, std::unique_ptr<Trk::Track>> bestCandidate =
145 if (!bestCandidate.first) {
return; }
148 addTag(ctx, indetCandidate, tagMap, *bestCandidate.first, bestCandidate.second, combTracks, meTracks, segColl);
153 const std::vector<Muon::MuonLayerRecoData>& allLayers)
const {
155 std::vector<Muon::MuonCandidate> resolvedCandidates;
160 typedef std::pair<std::unique_ptr<Trk::Track>, std::unique_ptr<const Muon::MuonCandidate>> candidatePair;
161 std::vector<candidatePair> trackCandidateLookup;
165 if (!
track || !
track->isValid() || !
track->fitQuality()->numberDoF())
continue;
167 tracks.push_back(
track.get());
168 trackCandidateLookup.emplace_back(std::move(
track), std::make_unique<Muon::MuonCandidate>(std::move(candidate)));
171 ATH_MSG_DEBUG(
"found " << tracks.size() <<
" combined tracks");
174 if (tracks.empty())
return {
nullptr,
nullptr};
177 if (tracks.size() == 1) {
178 selectedTrack = tracks.front();
182 if (!resolvedTracks || resolvedTracks->empty()) {
183 ATH_MSG_WARNING(
"Ambiguity resolver returned no tracks. Arbitrarily using the first track of initial collection.");
184 selectedTrack = tracks.front();
187 if (
it != tracks.end()) {
190 ATH_MSG_ERROR(
"Ambiguity resolver returned an unknown track. Arbitrarily using the first track of initial collection.");
191 selectedTrack = tracks.front();
197 std::find_if(trackCandidateLookup.begin(), trackCandidateLookup.end(),
198 [selectedTrack](candidatePair& ele) { return ele.first.get() == selectedTrack; });
200 if (look_itr == trackCandidateLookup.end() || !look_itr->second) {
202 return {
nullptr,
nullptr};
207 return std::make_pair(std::move(look_itr->second), std::move(look_itr->first));
219 if (!vertices.isValid()) {
222 for (
const auto*
const vx : *vertices) {
223 for (
const auto& tpLink : vx->trackParticleLinks()) {
224 if (*tpLink == &idTrackParticle) {
228 if (matchedVertex)
break;
234 origin =
Amg::Vector3D{matchedVertex->
x(), matchedVertex->
y(), matchedVertex->
z()};
238 idTrackParticle.
d0() *
std::cos(idTrackParticle.
phi()) + idTrackParticle.
vy(),
239 idTrackParticle.
z0() + idTrackParticle.
vz()};
240 ATH_MSG_DEBUG(
" NO matched vertex take track perigee " << origin);
248 if (
it->trackParameters()) {
249 ATH_MSG_VERBOSE(
"check tsos " << tsos <<
" r " <<
it->trackParameters()->position().perp() <<
" z "
250 <<
it->trackParameters()->position().z() <<
" p "
251 <<
it->trackParameters()->momentum().mag());
256 std::vector<const Muon::MuonSegment*> segLinks;
258 std::unique_ptr<Muon::MuonSegment>
copy = std::make_unique<Muon::MuonSegment>(*
layer.segment);
259 segLinks.push_back(
copy.get());
265 ChIndex ch_a = m_idHelperSvc->chamberIndex(m_edmHelperSvc->chamberId(*seg_a));
266 ChIndex ch_b = m_idHelperSvc->chamberIndex(m_edmHelperSvc->chamberId(*seg_b));
267 StIndex st_a = toStationIndex(ch_a);
268 StIndex st_b = toStationIndex(ch_b);
269 if (st_a != st_b) return st_a < st_b;
271 if (ch_a == ChIndex::CSL || ch_a == ChIndex::CSS || ch_b == ChIndex::CSS || ch_b == ChIndex::CSL)
272 return (ch_a == ChIndex::CSL) + 2 * (ch_a == ChIndex::CSS) > (ch_b == ChIndex::CSL) + 2 * (ch_b == ChIndex::CSS);
277 std::stringstream sstr;
283 ATH_MSG_DEBUG(
"Selected segments " << segLinks.size() <<
" " << sstr.str());
287 std::unique_ptr<Trk::Track> standaloneRefit{
m_trackFitter->standaloneRefit(ctx, *selectedTrack, origin)};
289 combTracks->push_back(std::move(selectedTrack));
294 if (standaloneRefit) {
295 meTracks->push_back(std::move(standaloneRefit));
297 tag->setUpdatedExtrapolatedTrack(melink);
308 const std::set<TechnologyIndex>& technologiesInStation =
m_idHelperSvc->technologiesInStation(stIndex);
310 std::string techString;
327 isok |= getLayerDataTech<Muon::MdtPrepData>(
it, surf, prdData.
mdtPrds, layerPrepRawData.
mdts);
330 isok |= getLayerDataTech<Muon::RpcPrepData>(
it, surf, prdData.
rpcPrds, layerPrepRawData.
rpcs);
333 isok |= getLayerDataTech<Muon::TgcPrepData>(
it, surf, prdData.
tgcPrds, layerPrepRawData.
tgcs);
336 isok |= getLayerDataTech<Muon::CscPrepData>(
it, surf, prdData.
cscPrds, layerPrepRawData.
cscs);
339 isok |= getLayerDataTech<Muon::sTgcPrepData>(
it, surf, prdData.
stgcPrds, layerPrepRawData.
stgcs);
342 isok |= getLayerDataTech<Muon::MMPrepData>(
it, surf, prdData.
mmPrds, layerPrepRawData.
mms);
355 if (!layerPrepRawData.
mms.empty())
msg(
MSG::DEBUG) <<
" MMs " << layerPrepRawData.
mms.size();
365 if (!input || input->size() == 0)
return false;
373 if (
hashes.empty())
return false;
376 for (Muon::MuonLayerHashProviderTool::HashVec::const_iterator
it =
hashes.begin();
it !=
hashes.end(); ++
it) {
378 const auto* colIt = input->indexFindPtr(*
it);
379 if (!colIt) {
continue; }
382 output.push_back(colIt);
384 return output.size();