ATLAS Offline Software
Loading...
Searching...
No Matches
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
20#include "TrkTrack/Track.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;
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;
163 (evtStore()->retrieve(tpbmap[key],key)).isSuccess()){
164 } else {
165 tpbmap[key] = new Trk::TrackParticleBaseCollection;
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();
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
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t ss
static Double_t sc
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
std::vector< std::string > m_trackKeys
~InDetEventSplitter()
Destructor - check up memory allocation delete any memory allocation on the heap.
StatusCode execute()
Execute - on event by event.
InDetEventSplitter(const std::string &name, ISvcLocator *pSvcLocator)
Author: Peter V.
std::string m_tpbContainerName
containers to retrieve
StatusCode initialize()
Initialize initialize StoreGate.
StatusCode finalize()
Finalize - delete any memory allocation from the heap.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
DataVector< TrackParticleBase > TrackParticleBaseCollection