ATLAS Offline Software
InDetEventSplitter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
10 
11 #include "GaudiKernel/MsgStream.h"
12 
13 //#include "StoreGate/DataHandle.h"
14 
16 #include "InDetEventSplitter.h"
17 
18 #include "Particle/TrackParticle.h"
20 #include "TrkTrack/Track.h"
21 #include "TrkTrack/LinkToTrack.h"
26 
27 #include <algorithm>
28 #include <cmath>
29 #include <cstdlib>
30 #include <ctime>
31 #include <map>
32 #include <sstream>
33 
36 
38  ISvcLocator* pSvcLocator) :
39  AthAlgorithm(name, pSvcLocator),
40  m_isOdd(false),
41  m_addToVx(0),
42  m_eventN(0){
43 
45  declareProperty("TPBContainerName", m_tpbContainerName = "TrackParticleCandidate");
46  declareProperty("TrackContainerName", m_trackContainerName = "Tracks");
47  declareProperty("MaxVertexNumber", m_maxVtx = 1); //this should not be changed until a more robust handling of multi vertices is implemented
48  declareProperty("PrimaryOnly",m_priOnly = true); //this should not be changed presently
49  declareProperty("UseTrackParticleBase",m_savetpb = true); //is this needed?
50  declareProperty("RandomSeed",m_rndSeed = 7);
51 }
52 
56 
58 
62 
64 
65  std::srand(m_rndSeed);
66  m_isOdd = false;
67  m_addToVx = 1;
68  m_eventN = 0;
69 
70  for (int i = 1; i <=m_maxVtx; i++){
71  std::stringstream ss;
72  ss << "odd_" << i << "_Tracks";
73  m_trackKeys.push_back(ss.str());
74  ss.str("");
75  ss << "even_" << i << "_Tracks";
76  m_trackKeys.push_back(ss.str());
77  ss.str("");
78  ss << "all_" << i << "_Tracks";
79  m_trackKeys.push_back(ss.str());
80  ss.str("");
81  }
82 
83  ATH_MSG_INFO ("Initializing InDetEventSplitter");
84 
85  return StatusCode::SUCCESS;
86 }
87 
90 
92  ATH_MSG_DEBUG("in finalize()");
93 
94  return StatusCode::SUCCESS;
95 
96 }
97 
100 
102 
103  ATH_MSG_DEBUG("in execute()");
104 
105  StatusCode sc = StatusCode::SUCCESS;
106 
107  sc = split_vertices();
108  if (sc.isFailure()) {
109  ATH_MSG_ERROR("InDetEventSplitter Failed");
110  return sc;
111  }
112 
113  return sc;
114 }
115 
117 
119 
120  ATH_MSG_DEBUG("in split_vertices()");
121 
122  StatusCode sc = StatusCode::SUCCESS;
123 
124  const Rec::TrackParticleContainer* tpbTES{};
125  const TrackCollection* trkTES{};
126 
127  if (m_savetpb){
128  sc=evtStore()->retrieve( tpbTES, m_tpbContainerName);
129  if( sc.isFailure() || !tpbTES ) {
130  ATH_MSG_WARNING("No TrackParticleBase container found in TDS tried " << m_tpbContainerName);
131  return StatusCode::SUCCESS;
132  }
133  ATH_MSG_DEBUG("TrackParticleCandidate Collection successfully retrieved");
134  }
135  else {
136  sc=evtStore()->retrieve( trkTES, m_trackContainerName);
137  if( sc.isFailure() || !trkTES ) {
138  ATH_MSG_WARNING("No TrackCollection container found in TDS tried " << m_trackContainerName);
139  return StatusCode::SUCCESS;
140  }
141  ATH_MSG_DEBUG("TrackParticleCandidate Collection successfully retrieved");
142  }
143 
144  std::map<std::string,TrackCollection*> trackmap;
145  std::map<std::string,Trk::TrackParticleBaseCollection*> tpbmap;
146 
147 // We need to create every container for each event, even if we don't write to them
148 
149  for (const auto & key : m_trackKeys){
150  TrackCollection* tempTracks{};
151  trackmap[key] = tempTracks;
152  if (evtStore()->contains<TrackCollection>(key) &&
153  (evtStore()->retrieve(trackmap[key],key)).isSuccess()){
154  } else {
155  trackmap[key] = new TrackCollection;
156  }
157  }
158 
159  for (const auto & key : m_trackKeys){
161  tpbmap[key] = tempTpbs;
162  if (evtStore()->contains<Trk::TrackParticleBaseCollection>(key) &&
163  (evtStore()->retrieve(tpbmap[key],key)).isSuccess()){
164  } else {
166  }
167  }
168 
169  //We need to add an approprate fraction of unfit tracks to the half and full vertex collections
170  //lets pull in the full list of tracks
171 
172  if (m_savetpb and tpbTES){
173  //we loop over that list
174  std::string oeNameString;
175  std::stringstream sss;
176  oeNameString.reserve(20);
177  for (const auto * tpb: *tpbTES){
178  //it looks like our track collection is actually sorted by the vertex that they're in
179  //which means that just alternating odd vs even is equivalent to splitting the vertex first, then splitting the remining
180  //instead, we will just put in rand() call
181  m_isOdd = std::rand() % 2;
182  oeNameString.clear();
183  if (m_isOdd) oeNameString = "odd";
184  if (!m_isOdd) oeNameString = "even";
185  sss.str("");
186  sss << oeNameString << "_" << m_addToVx << "_Tracks";
187  std::string oecontainerName = sss.str();
188  std::string allNameString = "all";
189  sss.str("");
190  sss << allNameString << "_" << m_addToVx << "_Tracks";
191  std::string allcontainerName = sss.str();
192  Trk::TrackParticleBase *trkCopy1 = new Trk::TrackParticleBase(*tpb);
193  Trk::TrackParticleBase *trkCopy2 = new Trk::TrackParticleBase(*tpb);
194  ATH_MSG_DEBUG("found a trackparticlebase, with momentum "<<tpb->definingParameters().momentum()<<" giving it the key: "<< oecontainerName);
195  tpbmap[oecontainerName]->push_back(trkCopy1);
196  ATH_MSG_DEBUG("found a trackparticlebase, with momentum "<<tpb->definingParameters().momentum()<<" giving it the key: "<< allcontainerName);
197  tpbmap[allcontainerName]->push_back(trkCopy2);
198 
199  m_addToVx++;
200  if (m_addToVx > m_maxVtx) m_addToVx = 1;
201  }
202  }
203 
204  if (!m_savetpb){
205  std::cout<<"NotYet Implemented"<<std::endl;
206  }
207 
208  if (m_savetpb){
209  for (const auto & key : m_trackKeys){
210  if(evtStore()->record(tpbmap[key],key,false).isFailure() ){
211  ATH_MSG_ERROR("Could not save the "<< key);
212  }
213  }
214  } else {
215  for (const auto & key : m_trackKeys){
216  if(evtStore()->record(trackmap[key],key,false).isFailure() ){
217  ATH_MSG_ERROR("Could not save the "<< key);
218  }
219  }
220  }
221  ATH_MSG_DEBUG("split_vertices() succeeded");
222  m_eventN++;
223  return StatusCode::SUCCESS;
224 }
225 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
LinkToTrack.h
TrackParticleBaseCollection.h
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
TrackParticle.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
InDet::InDetEventSplitter::m_savetpb
bool m_savetpb
Definition: InDetEventSplitter.h:56
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
TrackParticleBase.h
InDet::InDetEventSplitter::m_eventN
int m_eventN
Definition: InDetEventSplitter.h:59
InDet::InDetEventSplitter::m_isOdd
bool m_isOdd
Definition: InDetEventSplitter.h:46
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
InDet::InDetEventSplitter::m_addToVx
int m_addToVx
Definition: InDetEventSplitter.h:47
Track.h
InDet::InDetEventSplitter::execute
StatusCode execute()
Execute - on event by event.
Definition: InDetEventSplitter.cxx:101
Trk::TrackParticleBase
Definition: TrackParticleBase.h:41
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDet::InDetEventSplitter::InDetEventSplitter
InDetEventSplitter(const std::string &name, ISvcLocator *pSvcLocator)
Author: Peter V.
Definition: InDetEventSplitter.cxx:37
LArG4FSStartPointFilter.rand
rand
Definition: LArG4FSStartPointFilter.py:80
lumiFormat.i
int i
Definition: lumiFormat.py:92
TrackCollection
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
Definition: TrackCollection.h:19
InDetEventSplitter.h
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
DataVector< Trk::Track >
AthAlgorithm
Definition: AthAlgorithm.h:47
LinkToTrackParticleBase.h
InDet::InDetEventSplitter::m_trackContainerName
std::string m_trackContainerName
Definition: InDetEventSplitter.h:53
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
Rec::TrackParticleContainer
Definition: Reconstruction/Particle/Particle/TrackParticleContainer.h:33
InDet::InDetEventSplitter::m_trackKeys
std::vector< std::string > m_trackKeys
Definition: InDetEventSplitter.h:44
InDet::InDetEventSplitter::finalize
StatusCode finalize()
Finalize - delete any memory allocation from the heap.
Definition: InDetEventSplitter.cxx:91
InDet::InDetEventSplitter::m_tpbContainerName
std::string m_tpbContainerName
containers to retrieve
Definition: InDetEventSplitter.h:52
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
InDet::InDetEventSplitter::m_priOnly
bool m_priOnly
Definition: InDetEventSplitter.h:55
Trk::TrackParticleBaseCollection
DataVector< TrackParticleBase > TrackParticleBaseCollection
Definition: TrackParticleBaseCollection.h:14
InDet::InDetEventSplitter::~InDetEventSplitter
~InDetEventSplitter()
Destructor - check up memory allocation delete any memory allocation on the heap.
InDet::InDetEventSplitter::m_rndSeed
int m_rndSeed
Definition: InDetEventSplitter.h:57
InDet::InDetEventSplitter::m_maxVtx
int m_maxVtx
Definition: InDetEventSplitter.h:54
InDet::InDetEventSplitter::initialize
StatusCode initialize()
Initialize initialize StoreGate.
Definition: InDetEventSplitter.cxx:63
InDet::InDetEventSplitter::split_vertices
StatusCode split_vertices()
Definition: InDetEventSplitter.cxx:118
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
TrackParticleContainer.h