ATLAS Offline Software
Loading...
Searching...
No Matches
PRD_AssociationTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
7#include "TrkTrack/Track.h"
10
11#include <cassert>
12#include <vector>
13#include <stdexcept>
14#include "ext/functional"
15
17 const std::string& n,
18 const IInterface* p )
19 :
20 base_class(t,n,p)
21{
22}
23
25{
26 StatusCode sc = AlgTool::initialize();
27 if (sc.isFailure()) return sc;
28 ATH_CHECK( m_prdToTrackMap.initialize( !m_prdToTrackMap.key().empty() ) );
29 ATH_CHECK( m_idHelperSvc.retrieve());
30 return StatusCode::SUCCESS;
31}
32
34{
35 if (!m_prdToTrackMap.key().empty()) throw std::runtime_error("Cannot modify(addPRDs) the PRDtoTrackMap that was read from storegate!");
36 return addPRDs (m_maps, track);
37}
38
39StatusCode Trk::PRD_AssociationTool::addPRDs( Maps& maps, const Trk::Track& track ) const
40{
41 // test caching
42 TrackPrepRawDataMap::const_iterator itvec = maps.m_trackPrepRawDataMap.find(&track);
43 if (itvec!=maps.m_trackPrepRawDataMap.end())
44 {
45 ATH_MSG_ERROR ("track already found in cache, should not happen");
46 return StatusCode::FAILURE;
47 }
48 // get all prds on 'track'
49 std::vector< const Trk::PrepRawData* > prds = getPrdsOnTrack( maps, track );
50 for (const Trk::PrepRawData* prd : prds) {
51 maps.m_prepRawDataTrackMap.emplace(prd, &track);
52 }
53
54 // cache this using m_trackPrepRawDataMap
55 maps.m_trackPrepRawDataMap.emplace(&track, prds);
56
57 ATH_MSG_DEBUG ("Added PRDs from Track at ("<<&track<<") - map now has size: \t"<<
58 maps.m_prepRawDataTrackMap.size());
59 return StatusCode::SUCCESS;
60}
61
63{
64 if (!m_prdToTrackMap.key().empty()) throw std::runtime_error("Cannot modify(removePRDs) the PRDtoTrackMap that was read from storegate!");
65 return removePRDs (m_maps, track);
66}
67
69 const Trk::Track& track ) const
70{
71 // This is NOT pretty code!
72 // At the moment I'm brute-forcing, but maybe I need a second map, containing <Track*, iterator>
73 // The problem is that I think filling such a map is also time-consuming.
74 // Since removes happen much less frequently than add, then the slow bit should be here.
75 // EJWM
76
77 // save for debugging purposes
78 int oldSize = maps.m_prepRawDataTrackMap.size();//used in debug output at end.
79
80 // test caching
81 TrackPrepRawDataMap::iterator itvec = maps.m_trackPrepRawDataMap.find(&track);
82 if (itvec==maps.m_trackPrepRawDataMap.end())
83 {
84 ATH_MSG_ERROR ("Track not found in cache, this should not happen");
85 return StatusCode::FAILURE;
86 }
87
88 // get all prds on 'track'
89 std::vector< const Trk::PrepRawData* > prds = itvec->second;
90 for (const Trk::PrepRawData* prd : prds)
91 {
92 // now get all map elements (i.e. Tracks) that contain this PRD
94 range = maps.m_prepRawDataTrackMap.equal_range(prd);
95
96 // get iterators for range
97 ConstPRD_MapIt mapIt = range.first;
98 ConstPRD_MapIt mapItEnd = range.second;
99
100 // simple for loop instead of fancier remove_if above
101 for ( ;mapIt!=mapItEnd; ++mapIt)
102 {
103 if ( mapIt->second==&track )
104 {
105 maps.m_prepRawDataTrackMap.erase( mapIt );
106 break;//should only ever be one Track
107 }
108 }
109 }
110
111 // remove cached PRD vector
112 maps.m_trackPrepRawDataMap.erase( itvec );
113
114 ATH_MSG_DEBUG ("Removed PRDs from track (" <<&track<<") \t- map has changed "<<
115 "size from \t"<<oldSize <<" \tto "<<maps.m_prepRawDataTrackMap.size());
116 return StatusCode::SUCCESS;
117}
118
121{
122 if (!m_prdToTrackMap.key().empty()) throw std::runtime_error("findConnectedTracks not supported when using a PRDtoTrackMap from storegate.");
123 return findConnectedTracks (m_maps, track);
124}
125
128 const Trk::Track& track ) const
129{
130 TrackSet connectedTracks;
131
132 std::vector< const Trk::PrepRawData* > prds = getPrdsOnTrack(maps, track);
133 for (const Trk::PrepRawData* prd : prds)
134 {
136
137 // TODO use remove_copy_if instead.
138 for ( ; range.first!=range.second; ++(range.first) )
139 {
140 const Track* conTrack = (range.first)->second;
141 // don't copy this track!
142 if (conTrack!=&track) {
143 // this does actually not allow for double entries
144 connectedTracks.insert(conTrack);
145 ATH_MSG_VERBOSE ("Track "<<&track<<" \tshares PRD "<<prd<<" \twith track:"<<conTrack);
146 }
147 }
148 ATH_MSG_VERBOSE ("Added in connected tracks for PRD:"<<prd<<
149 "\tsize of list now:"<<connectedTracks.size());
150 }
151
152 return connectedTracks;
153}
154
155
156std::vector< const Trk::PrepRawData* >
158{
159 if (!m_prdToTrackMap.key().empty()) throw std::runtime_error("getPrdsOnTrack not supported when using a PRDtoTrackMap from storegate.");
160 return getPrdsOnTrack (m_maps, track);
161}
162
163
164std::vector< const Trk::PrepRawData* >
166 const Trk::Track& track) const
167{
168 using PRDs_t = std::vector<const PrepRawData *>;
169
170 // test caching
171 TrackPrepRawDataMap::const_iterator itvec = maps.m_trackPrepRawDataMap.find(&track);
172 if (itvec!=maps.m_trackPrepRawDataMap.end())
173 {
174 ATH_MSG_VERBOSE ("found track in cache, return cached PRD vector for track");
175 return itvec->second;
176 }
177
178 if (track.measurementsOnTrack()==nullptr) {
179 ATH_MSG_WARNING ("Track has no RoTs");
180 return {};
181 }
182
183 PRDs_t vec;
184 vec.reserve(track.measurementsOnTrack()->size());
185 for (const MeasurementBase* meas : *track.measurementsOnTrack())
186 {
187 const RIO_OnTrack* rot = dynamic_cast<const RIO_OnTrack*>(meas);
188 if (rot){
189 if(m_idHelperSvc->isMuon(rot->identify())){
190 //only use precision hits for muon track overlap
191 if(!m_idHelperSvc->isMdt(rot->identify()) && (!m_idHelperSvc->isCsc(rot->identify()) || m_idHelperSvc->measuresPhi(rot->identify()))) continue;
192 }
193 vec.push_back(rot->prepRawData());
194 }
195 else{
196 const Trk::CompetingRIOsOnTrack* competingROT = dynamic_cast <const Trk::CompetingRIOsOnTrack*> (meas);
197 if(competingROT){
198 const unsigned int numROTs = competingROT->numberOfContainedROTs();
199 for( unsigned int i=0;i<numROTs;++i ){
200 const Trk::RIO_OnTrack* rot = &competingROT->rioOnTrack(i);
201 if( !rot || !rot->prepRawData() || !m_idHelperSvc->isMuon(rot->identify()) ) continue;
202 //only use precision hits for muon track overlap
203 if(!m_idHelperSvc->isMdt(rot->identify()) && (!m_idHelperSvc->isCsc(rot->identify()) || m_idHelperSvc->measuresPhi(rot->identify()))) continue;
204 vec.push_back(rot->prepRawData());
205 }
206 }
207 }
208 }
209 ATH_MSG_DEBUG (" Getting "<<vec.size()<<" PRDs from track at:"<<&track);
210
211 return vec;
212}
213
216{
217 if (!m_prdToTrackMap.key().empty()) {return SG::ReadHandle<Trk::PRDtoTrackMap>(m_prdToTrackMap)->onTracks(prd);}
218 return onTracks (m_maps, prd);
219}
220
222Trk::PRD_AssociationTool::onTracks(const Maps& maps, const PrepRawData& prd) const
223{
224// std::pair<IPRD_AssociationTool::PRD_MapIt, IPRD_AssociationTool::PRD_MapIt> range =
225 return maps.m_prepRawDataTrackMap.equal_range(&prd);
226}
227
229{
230 if (!m_prdToTrackMap.key().empty()) throw std::runtime_error("cannot reset PRDtoTrack map when it is taken from storegate.");
231 m_maps.m_prepRawDataTrackMap.clear();
232 m_maps.m_trackPrepRawDataMap.clear();
233}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::vector< size_t > vec
static Double_t sc
Base class for all CompetingRIOsOnTack implementations, extends the common MeasurementBase.
virtual unsigned int numberOfContainedROTs() const =0
Number of RIO_OnTracks to be contained by this CompetingRIOsOnTrack.
virtual const RIO_OnTrack & rioOnTrack(unsigned int) const =0
returns the RIO_OnTrack (also known as ROT) objects depending on the integer.
std::set< const Track * > TrackSet
std::pair< ConstPRD_MapIt, ConstPRD_MapIt > PrepRawDataTrackMapRange
the first element is the beginning iterator of the range, the second is the end
This class is the pure abstract base class for all fittable tracking measurements.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
virtual StatusCode initialize() override
virtual void reset() override
resets the tool - should be called before using tool (and maybe afterwards to free up memory)
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
virtual std::vector< const PrepRawData * > getPrdsOnTrack(const Track &track) const override
returns a vector of PRDs belonging to the passed track.
virtual IPRD_AssociationTool::PrepRawDataTrackMapRange onTracks(const PrepRawData &prd) const override
get the Tracks associated with this Trk::PrepRawData.
virtual StatusCode addPRDs(const Track &track) override
add the PRDs from this track to the store
virtual StatusCode removePRDs(Maps &maps, const Track &track) const override
remove the PRDs from this track from maps
virtual IPRD_AssociationTool::TrackSet findConnectedTracks(const Track &track) const override
returns set of tracks which share PRD with this one
PRD_AssociationTool(const std::string &, const std::string &, const IInterface *)
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
Identifier identify() const
return the identifier -extends MeasurementBase