ATLAS Offline Software
AlignTrackCollSplitter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 
9 
10 namespace Trk {
11 
12 //___________________________________________________________________________
13 AlignTrackCollSplitter::AlignTrackCollSplitter(const std::string& name, ISvcLocator* pSvcLocator)
14  : AthAlgorithm(name, pSvcLocator)
15  , m_trackTypeCounter(AlignTrack::NTrackTypes+1,0)
16 {
17 }
18 
19 //___________________________________________________________________________
21 {
22  ATH_MSG_DEBUG("AlignTrackCollSplitter destructor");
23 }
24 
25 //___________________________________________________________________________
27 {
28  ATH_MSG_DEBUG("AlignTrackCollSplitter::initialize()");
29 
30  // set the track collection names
31  ATH_MSG_INFO("Splitting "<<m_inputCol<<" into:");
32  for(int icol=0; icol<AlignTrack::NTrackTypes+1; ++icol) {
35  }
36 
37  return StatusCode::SUCCESS;
38 }
39 
40 //___________________________________________________________________________
42 {
43  ATH_MSG_DEBUG("AlignTrackCollSplitter::execute()");
44 
45  // increment number of events
46  m_nevents++;
47 
48  // loop over tracks
49  const TrackCollection * originalTracks = nullptr;
50 
51  // check if m_inputCol is a TrackCollection and exists for this event
52  // perhaps this can be done in a much nicer way on the python side ala PyUtils/checkFile.py
53  // do it here for now
54  if( !evtStore()->contains<TrackCollection>(m_inputCol) ||
55  evtStore()->retrieve(originalTracks,m_inputCol).isFailure() ) {
56  ATH_MSG_DEBUG("input track collection \'"<<m_inputCol<<"\' not found for this event");
57 
58  if(m_maxRetrievalErrors>=0) {
61  msg(MSG::FATAL)<<"Input track collection \'"<<m_inputCol<<"\' not found in first "
62  <<m_nRetrievalErrors<<" events. Aborting."<<endmsg;
63  msg(MSG::FATAL)<<"Maximum allowed number of events without the track collection "
64  <<"can be changed using the \'MaxRetrievalErrors\' option (-1 for infinite)."
65  <<endmsg;
66  return StatusCode::FAILURE;
67  }
68  }
69  return StatusCode::SUCCESS;
70  }
71 
72  // if we're here it means that the track collection m_inputCol exists in the file
73  // (it can be empty) so we change the error cutoff to process the whole file
76 
77  if(originalTracks->empty())
78  return StatusCode::SUCCESS;
79 
80  // increment number of processed tracks
81  m_ntracks += originalTracks->size();
82 
83  // vector to keep all different AlignTrack collections
84  // +1 is for undefined AlignTrack type
85  std::vector<TrackCollection *> alignTracks;
86  alignTracks.reserve(AlignTrack::NTrackTypes+1);
87 
88 for(int i=0;i<AlignTrack::NTrackTypes+1;i++)
89  alignTracks.push_back(new TrackCollection);
90 
91  // loop over AlignTracks and fill the corresponding track collections
92  int itrk = 0;
93  DataVector<Track>::const_iterator it = originalTracks->begin();
94  DataVector<Track>::const_iterator it_end = originalTracks->end();
95  for ( ;it != it_end ; ++it, ++itrk) {
96 
97  ATH_MSG_DEBUG("Processing AlignTrack "<<itrk);
98 
99  // each track in the collection HAS to be an AlignTrack
100  const AlignTrack * alignTrack = dynamic_cast<const AlignTrack*>(*it);
101  if(!alignTrack) {
102  msg(MSG::FATAL)<<"Track is not an AlignTrack. The code only works with TrackCollection"
103  <<" filled with AlignTracks."<<endmsg;
104  return StatusCode::FAILURE;
105  }
106 
107  int type = alignTrack->type();
108  ATH_MSG_DEBUG("type of AlignTrack: "<<alignTrack->type());
109 
110  //previously this check was always returning true (type>=0 || type<AlignTrack::NTrackTypes), meaning that in principle you could try
111  //to access an invalid vector element if type was negative. Assume that what we have below is what was meant, as last entry in vector
112  // is for undefined tracks? (Nick Styles, 04/02/15)
113  int colIndex = (type>=0 && type<AlignTrack::NTrackTypes) ? type : AlignTrack::NTrackTypes;
114 
115  ATH_MSG_DEBUG("collection index is "<<colIndex);
116  alignTracks[colIndex]->push_back(new AlignTrack(*alignTrack));
117  ATH_MSG_DEBUG("pushback ok");
118 
119  ++m_trackTypeCounter[colIndex];
120  }
121 
122  // record the collections in the StoreGate that takes care of deletion
123  // only record collection to storegate if it's not empty
124  for(int icol=0;icol<AlignTrack::NTrackTypes+1;++icol) {
125  ATH_MSG_DEBUG(icol<<": recording "<<m_outColNames[icol]<<" size "<<alignTracks[icol]->size());
126  if(!alignTracks[icol]->empty()) {
127  if(evtStore()->record(alignTracks[icol],m_outColNames[icol],false).isFailure()) {
128  ATH_MSG_ERROR("Unable to record "<<m_outColNames[icol]<<" in the StoreGate");
129  delete alignTracks[icol];
130  }
131  ATH_MSG_DEBUG("Recorded \'"<<m_outColNames[icol]<<"\' with size "<<alignTracks[icol]->size()<<" to StoreGate");
132  }
133  else {
134  ATH_MSG_DEBUG("not recording "<<m_outColNames[icol]);
135  delete alignTracks[icol];
136  }
137  }
138 
139  ATH_MSG_DEBUG("returning SUCCESS");
140  return StatusCode::SUCCESS;
141 }
142 
143 //___________________________________________________________________________
145 {
146  ATH_MSG_DEBUG("AlignTrackCollSplitter::stop()");
147 
148  ATH_MSG_INFO("Processed "<<m_nevents<<" with "<<m_ntracks<<" AlignTracks");
149  ATH_MSG_INFO("Track collections recorded in StoreGate:");
150  ATH_MSG_INFO("----------------------------------------------");
151  for(int icol=0;icol<AlignTrack::NTrackTypes+1;++icol)
153  ATH_MSG_INFO("----------------------------------------------");
154 
155  return StatusCode::SUCCESS;
156 }
157 
158 //___________________________________________________________________________
160 {
161  ATH_MSG_DEBUG("AlignTrackCollSplitter::finalize()");
162  return StatusCode::SUCCESS;
163 }
164 
165 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
Trk::AlignTrackCollSplitter::m_outColNames
std::vector< std::string > m_outColNames
Names of output track collections.
Definition: AlignTrackCollSplitter.h:54
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:18
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
Trk::AlignTrackCollSplitter::m_inputCol
StringProperty m_inputCol
Definition: AlignTrackCollSplitter.h:49
AlignTrackCollSplitter.h
Trk::AlignTrackCollSplitter::m_ntracks
int m_ntracks
number of processed tracks
Definition: AlignTrackCollSplitter.h:57
Trk::AlignTrackCollSplitter::m_nRetrievalErrors
int m_nRetrievalErrors
number of retrieval errors at the beginning of the job
Definition: AlignTrackCollSplitter.h:61
Trk::AlignTrackCollSplitter::AlignTrackCollSplitter
AlignTrackCollSplitter(const std::string &name, ISvcLocator *pSvcLocator)
constructor
Definition: AlignTrackCollSplitter.cxx:13
skel.it
it
Definition: skel.GENtoEVGEN.py:407
Trk::AlignTrackCollSplitter::~AlignTrackCollSplitter
virtual ~AlignTrackCollSplitter()
destructor
Definition: AlignTrackCollSplitter.cxx:20
Trk::dumpAlignTrackType
std::string dumpAlignTrackType(const AlignTrack::AlignTrackType type)
Definition: AlignTrack.cxx:410
Trk::AlignTrack::AlignTrackType
AlignTrackType
Definition: AlignTrack.h:45
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
atlasStyleMacro.icol
int icol
Definition: atlasStyleMacro.py:13
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
Trk::AlignTrackCollSplitter::execute
virtual StatusCode execute()
loops over tracks in event, and accumulates information necessary for alignmnet
Definition: AlignTrackCollSplitter.cxx:41
AlignTrack.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
Trk::AlignTrackCollSplitter::m_maxRetrievalErrors
IntegerProperty m_maxRetrievalErrors
Definition: AlignTrackCollSplitter.h:62
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
TrackCollection.h
Trk::AlignTrackCollSplitter::finalize
virtual StatusCode finalize()
finalize method
Definition: AlignTrackCollSplitter.cxx:159
DataVector< Trk::Track >
AthAlgorithm
Definition: AthAlgorithm.h:47
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::AlignTrackCollSplitter::initialize
virtual StatusCode initialize()
initialize method
Definition: AlignTrackCollSplitter.cxx:26
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
Trk::AlignTrack
Definition: AlignTrack.h:41
Trk::AlignTrackCollSplitter::m_nevents
int m_nevents
number of processed events
Definition: AlignTrackCollSplitter.h:56
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
Trk::AlignTrackCollSplitter::stop
virtual StatusCode stop()
stop method
Definition: AlignTrackCollSplitter.cxx:144
Trk::AlignTrackCollSplitter::m_trackTypeCounter
std::vector< int > m_trackTypeCounter
counter for different types of tracks
Definition: AlignTrackCollSplitter.h:59
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
Trk::AlignTrack::NTrackTypes
@ NTrackTypes
total number of track types
Definition: AlignTrack.h:53
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
Trk::AlignTrackCollSplitter::m_outColPrefix
StringProperty m_outColPrefix
Definition: AlignTrackCollSplitter.h:51
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
Trk::AlignTrack::type
AlignTrackType type() const
get and set the refit type
Definition: AlignTrack.h:96