ATLAS Offline Software
InDetPRDtoTrackMapToolGangedPixels.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 #include "TrkTrack/Track.h"
12 #include "Identifier/Identifier.h"
15 
16 #include <memory>
17 
18 #include <vector>
20  const std::string& n,
21  const IInterface* p)
22  : base_class(t,n,p)
23 {
24  declareProperty( "PixelClusterAmbiguitiesMapName", m_pixelClusterAmbiguitiesMapName = "PixelClusterAmbiguitiesMap" );
25  declareProperty( "addTRToutliers", m_addTRToutliers = false);
26 }
27 
29 = default;
30 
32 {
33  bool has_ambi_map = m_pixelClusterAmbiguitiesMapName.initialize(!m_pixelClusterAmbiguitiesMapName.key().empty()).isSuccess();
34  if (!has_ambi_map && !m_pixelClusterAmbiguitiesMapName.key().empty()) {
35  ATH_MSG_WARNING("Could not retrieve "<< m_pixelClusterAmbiguitiesMapName.key() << " this is ok if pixel is off");
36  // @TODO introduce more robust method e.g. dummy tool if pixel is off ?
37  }
38 
39  return StatusCode::SUCCESS;
40 }
41 
43 {
44  return StatusCode::SUCCESS;
45 }
46 
47 std::unique_ptr<Trk::PRDtoTrackMap> InDet::InDetPRDtoTrackMapToolGangedPixels::createPRDtoTrackMap() const {
48  std::unique_ptr<PRDtoTrackMap> prd_to_track_map( new PRDtoTrackMap(m_pixelClusterAmbiguitiesMapName ) );
49 
51  << ", number of entries for this event:"
52  << (prd_to_track_map->m_gangedAmbis.isValid() ? prd_to_track_map->m_gangedAmbis->size() : -1) );
53  return std::unique_ptr<Trk::PRDtoTrackMap>(prd_to_track_map.release());
54 }
55 
56 std::unique_ptr<Trk::PRDtoTrackMap> InDet::InDetPRDtoTrackMapToolGangedPixels::reduceToStorableMap(std::unique_ptr<Trk::PRDtoTrackMap> &&obj_in) const {
57  if (obj_in->getType()!=typeid(Trk::PRDtoTrackMap)) {
58  return std::move(obj_in);
59  }
60  if (obj_in->getType()!=typeid(InDet::InDetPRDtoTrackMapToolGangedPixels)) {
61  ATH_MSG_FATAL( "Type mismap between tool and map. Expecting " << typeid(InDet::InDetPRDtoTrackMapToolGangedPixels).name()
62  << " but got " << obj_in->getType().name()
63  << " . The tool can only handle a map created by the same tool. ");
64  }
65  Trk::PRDtoTrackMap *the_obj=static_cast<PRDtoTrackMap *>(obj_in.get());
66  return std::make_unique<Trk::PRDtoTrackMap>(std::move(*the_obj));
67 }
68 
69 
71 {
72  if (virt_prd_to_track_map.getType() != typeid(InDetPRDtoTrackMapToolGangedPixels::PRDtoTrackMap)) {
73  ATH_MSG_FATAL( "Type mismap between tool and map. Expecting " << typeid(InDetPRDtoTrackMapToolGangedPixels).name()
74  << " but got " << virt_prd_to_track_map.getType().name()
75  << " . The tool can only handle a map created by the same tool. ");
76  throw std::logic_error("Type mismap between tool and map");
77  }
78  assert( dynamic_cast<InDetPRDtoTrackMapToolGangedPixels::PRDtoTrackMap *>(&virt_prd_to_track_map) != nullptr );
79 }
80 
81 
83 {
84  ensureType(virt_prd_to_track_map);
85  PRDtoTrackMap &prd_to_track_map = static_cast<PRDtoTrackMap&>(virt_prd_to_track_map);
86  // test caching
87  Trk::PRDtoTrackMap::TrackPrepRawDataMap::const_iterator itvec = prd_to_track_map.m_trackPrepRawDataMap.find(&track);
88  if (itvec!=prd_to_track_map.m_trackPrepRawDataMap.end())
89  {
90  ATH_MSG_ERROR("track already found in cache, should not happen");
91  return StatusCode::FAILURE;
92  }
93  // get all prds on 'track'
94  std::vector< const Trk::PrepRawData* > prds = getPrdsOnTrack(prd_to_track_map, track );
95  // loop over PRD
96  for (const Trk::PrepRawData* prd : prds) {
97  prd_to_track_map.m_prepRawDataTrackMap.insert(std::make_pair(prd, &track) );
98  // test ganged ambiguity
99  if (prd->type(Trk::PrepRawDataType::PixelCluster)) {
100  const PixelCluster* pixel = static_cast<const PixelCluster*> (prd);
101  if (pixel->gangedPixel()) {
102  ATH_MSG_DEBUG( "Found ganged pixel, search for mirror" );
103  std::pair<PixelGangedClusterAmbiguities::const_iterator,
104  PixelGangedClusterAmbiguities::const_iterator> ambi = prd_to_track_map.m_gangedAmbis->equal_range(pixel);
105  for (; ambi.first != ambi.second ; ++(ambi.first) ) {
106  // add ambiguity as used by this track as well
107  if (msgLvl(MSG::DEBUG)) msg() << "Found mirror pixel, add mirror to association map" << endmsg;
108  prd_to_track_map.m_prepRawDataTrackMap.insert(std::make_pair(ambi.first->second, &track) );
109  }
110  }
111  }
112  }
113 
114  // cache this using m_trackPrepRawDataMap
115  prd_to_track_map.m_trackPrepRawDataMap.insert( std::make_pair(&track, prds) );
116 
117  ATH_MSG_DEBUG("Added PRDs from Track at ("<<&track<<") - map now has size: \t"
118  <<prd_to_track_map.m_prepRawDataTrackMap.size() );
119  return StatusCode::SUCCESS;
120 }
121 
122 
125  const Trk::Track& track ) const
126 {
127  ensureType(virt_prd_to_track_map);
128  PRDtoTrackMap &prd_to_track_map = static_cast<PRDtoTrackMap&>(virt_prd_to_track_map);
129 
130  TrackSet connectedTracks;
131 
132  std::vector< const Trk::PrepRawData* > prds = getPrdsOnTrack(virt_prd_to_track_map, track);
133  for (const Trk::PrepRawData* prd : prds) {
135  // add them into the list
136  for ( ; range.first!=range.second; ++(range.first) )
137  connectedTracks.insert((range.first)->second);
138 
139  // test ganged ambiguity
140 
141  if (prd->type(Trk::PrepRawDataType::PixelCluster)) {
142  const PixelCluster* pixel = static_cast<const PixelCluster*> (prd);
143  if (pixel->gangedPixel()) {
144  std::pair<PixelGangedClusterAmbiguities::const_iterator,
145  PixelGangedClusterAmbiguities::const_iterator> ambi = prd_to_track_map.m_gangedAmbis->equal_range(pixel);
146  for (; ambi.first != ambi.second ; ++(ambi.first) ) {
147  range = prd_to_track_map.onTracks( *(ambi.first->second) );
148  // add them into the list
149  for ( ; range.first!=range.second; ++(range.first) )
150  connectedTracks.insert((range.first)->second);
151  }
152  }
153  }
154  }
155 
156  // don't forget to remove the input track
157  connectedTracks.erase(&track);
158 
159  ATH_MSG_VERBOSE("Added in connected tracks for track "<<&track
160  << "\tsize of list is "<<connectedTracks.size());
161 
162  return connectedTracks;
163 }
164 
165 
166 std::vector< const Trk::PrepRawData* >
168  const Trk::Track& track) const
169 {
170  ensureType(virt_prd_to_track_map);
171  PRDtoTrackMap &prd_to_track_map = static_cast<PRDtoTrackMap&>(virt_prd_to_track_map);
172  using PRDs_t = std::vector<const Trk::PrepRawData *>;
173 
174  // test caching
175  Trk::PRDtoTrackMap::TrackPrepRawDataMap::const_iterator itvec = prd_to_track_map.m_trackPrepRawDataMap.find(&track);
176  if (itvec!=prd_to_track_map.m_trackPrepRawDataMap.end())
177  {
178  ATH_MSG_VERBOSE("found track in cache, return cached PRD vector for track");
179  return itvec->second;
180  }
181 
182  if (track.measurementsOnTrack()==nullptr) {
183  ATH_MSG_WARNING("Track has no RoTs");
184  return {}; // return vector optimization
185  }
186 
187  // FIXME can I do this without copying the vector?
188  /* transform(
189  track.measurementsOnTrack()->begin(),
190  track.measurementsOnTrack()->end() ,
191  back_inserter(vec),
192  bind2nd(CreatePRD_VectorFromTrack(), &track) );*/
193 
194  // output vector
195  PRDs_t vec;
196  // size it
197  vec.reserve(track.measurementsOnTrack()->size());
198 
199  // get the PRDs for the measurements on track
200  DataVector<const Trk::MeasurementBase>::const_iterator it = track.measurementsOnTrack()->begin();
201  DataVector<const Trk::MeasurementBase>::const_iterator itEnd = track.measurementsOnTrack()->end();
202  for (;it!=itEnd;++it)
203  {
204  const auto *const meas{*it};
205  if (meas->type(Trk::MeasurementBaseType::RIO_OnTrack)) {
206  const Trk::RIO_OnTrack* rot = static_cast<const Trk::RIO_OnTrack*>(meas);
207  if(rot->prepRawData()) vec.push_back(rot->prepRawData());
208  }
209  }
210  ATH_MSG_DEBUG(" Getting "<<vec.size()<<" PRDs from track at:"<<&track);
211  // new mode, we add the outliers in the TRT
212  if (m_addTRToutliers) {
213  // get the PRDs for the measurements on track
214  for (const Trk::MeasurementBase* meas : *track.outliersOnTrack()){
215  // get the ROT, make sure it is not a pseudo measurement
216  if (meas->type(Trk::MeasurementBaseType::RIO_OnTrack)) {
217  const Trk::RIO_OnTrack* rot = static_cast<const Trk::RIO_OnTrack*>(meas);
218  // check if outlier is TRT ?
220  // add to the list, it is TRT
221  if(rot->prepRawData()) vec.push_back(rot->prepRawData());
222  }
223  }
224  }
225  ATH_MSG_DEBUG(" Getting "<<vec.size()<<" PRDs including TRT outlier from track at:"<<&track);
226  }
227 
228  return vec;
229 }
230 
232 {
233  if (!key.key().empty()) {
235  }
236 }
237 
PRDtoTrackMap.h
InDet::InDetPRDtoTrackMapToolGangedPixels::getPrdsOnTrack
virtual std::vector< const Trk::PrepRawData * > getPrdsOnTrack(Trk::PRDtoTrackMap &virt_prd_to_track_map, const Trk::Track &track) const override
returns a vector of PRDs belonging to the passed track.
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:167
TrkDetElementBase.h
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
InDet::InDetPRDtoTrackMapToolGangedPixels::createPRDtoTrackMap
virtual std::unique_ptr< Trk::PRDtoTrackMap > createPRDtoTrackMap() const override
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:47
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
InDet::InDetPRDtoTrackMapToolGangedPixels::reduceToStorableMap
virtual std::unique_ptr< Trk::PRDtoTrackMap > reduceToStorableMap(std::unique_ptr< Trk::PRDtoTrackMap > &&obj_in) const override
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:56
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
Trk::PRDtoTrackMap::onTracks
PrepRawDataTrackMapRange onTracks(const PrepRawData &prd)
get the Tracks associated with this PrepRawData.
PixelCluster.h
Trk::PRDtoTrackMap
Definition: PRDtoTrackMap.h:17
InDet::InDetPRDtoTrackMapToolGangedPixels::InDetPRDtoTrackMapToolGangedPixels
InDetPRDtoTrackMapToolGangedPixels(const std::string &, const std::string &, const IInterface *)
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:19
skel.it
it
Definition: skel.GENtoEVGEN.py:423
CP::TrackSet
std::set< TrackPtr > TrackSet
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:72
Trk::RIO_OnTrack::rioType
virtual bool rioType(RIO_OnTrackType::Type type) const =0
Method checking the Rio On Track type.
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
Trk::PRDtoTrackMap::PRDtoTrackMap
PRDtoTrackMap()=default
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:12
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
InDet::InDetPRDtoTrackMapToolGangedPixels::PRDtoTrackMap
Definition: InDetPRDtoTrackMapToolGangedPixels.h:65
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::ReadHandleKey< PixelGangedClusterAmbiguities >
InDet::InDetPRDtoTrackMapToolGangedPixels::findConnectedTracks
virtual Trk::IPRDtoTrackMapTool::TrackSet findConnectedTracks(Trk::PRDtoTrackMap &virt_prd_to_track_map, const Trk::Track &track) const override
returns set of tracks which share PRD with this one
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:124
Track.h
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:269
CxxUtils::vec
typename vecDetail::vec_typedef< T, N >::type vec
Define a nice alias for the vectorized type.
Definition: vec.h:207
Trk::IPRDtoTrackMapTool::TrackSet
std::set< const Track * > TrackSet
Definition: IPRDtoTrackMapTool.h:42
AtlasDetectorID.h
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
InDet::InDetPRDtoTrackMapToolGangedPixels::PRDtoTrackMap::m_gangedAmbis
SG::ReadHandle< PixelGangedClusterAmbiguities > m_gangedAmbis
Definition: InDetPRDtoTrackMapToolGangedPixels.h:73
Trk::PRDtoTrackMap::m_trackPrepRawDataMap
TrackPrepRawDataMap m_trackPrepRawDataMap
holds the PRDs associated with each Track (i.e.
Definition: PRDtoTrackMap.h:85
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
beamspotman.n
n
Definition: beamspotman.py:731
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
InDet::InDetPRDtoTrackMapToolGangedPixels::initialize
virtual StatusCode initialize() override
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:31
InDet::InDetPRDtoTrackMapToolGangedPixels::m_addTRToutliers
bool m_addTRToutliers
add TRT outliers in the addTrack method to avoid splits due to rejected extensions
Definition: InDetPRDtoTrackMapToolGangedPixels.h:62
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
Trk::PRDtoTrackMap::getType
virtual const std::type_info & getType() const
InDet::InDetPRDtoTrackMapToolGangedPixels
Concrete Implementation of the IPRD_AssociationTool interface.
Definition: InDetPRDtoTrackMapToolGangedPixels.h:21
TRT_DriftCircleOnTrack.h
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Trk::RIO_OnTrackType::TRT_DriftCircle
@ TRT_DriftCircle
Definition: RIO_OnTrack.h:59
Trk::PrepRawData
Definition: PrepRawData.h:62
Trk::MeasurementBase
Definition: MeasurementBase.h:58
InDet::InDetPRDtoTrackMapToolGangedPixels::addPRDs
virtual StatusCode addPRDs(Trk::PRDtoTrackMap &virt_prd_to_track_map, const Trk::Track &track) const override
add the PRDs from this track to the store
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:82
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
RIO_OnTrack.h
InDet::InDetPRDtoTrackMapToolGangedPixels::ensureType
void ensureType(Trk::PRDtoTrackMap &virt_prd_to_track_map) const
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:70
Trk::PrepRawDataType::PixelCluster
@ PixelCluster
InDet::InDetPRDtoTrackMapToolGangedPixels::finalize
virtual StatusCode finalize() override
Definition: InDetPRDtoTrackMapToolGangedPixels.cxx:42
Trk::RIO_OnTrack::prepRawData
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
Trk::PRDtoTrackMap::m_prepRawDataTrackMap
PrepRawDataTrackMap m_prepRawDataTrackMap
holds the tracks associated with each PRD (i.e.
Definition: PRDtoTrackMap.h:82
Trk::MeasurementBaseType::RIO_OnTrack
@ RIO_OnTrack
Definition: MeasurementBase.h:49
InDet::PixelCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/PixelCluster.h:49
InDet::InDetPRDtoTrackMapToolGangedPixels::~InDetPRDtoTrackMapToolGangedPixels
virtual ~InDetPRDtoTrackMapToolGangedPixels()
InDetPRDtoTrackMapToolGangedPixels.h
InDet::InDetPRDtoTrackMapToolGangedPixels::m_pixelClusterAmbiguitiesMapName
SG::ReadHandleKey< PixelGangedClusterAmbiguities > m_pixelClusterAmbiguitiesMapName
Definition: InDetPRDtoTrackMapToolGangedPixels.h:59
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DEBUG
#define DEBUG
Definition: page_access.h:11
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
PixelClusterOnTrack.h
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
SiliconTech::pixel
@ pixel
Trk::PRDtoTrackMap::ConstPrepRawDataTrackMapRange
std::pair< PrepRawDataTrackMap::const_iterator, PrepRawDataTrackMap::const_iterator > ConstPrepRawDataTrackMapRange
Definition: PRDtoTrackMap.h:44
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37