ATLAS Offline Software
Loading...
Searching...
No Matches
CreateData.cxx
Go to the documentation of this file.
1
2
3/*
4 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
5*/
6
7// CreateData.cxx
8// Implementation file for class CreateData
9// Author: S.Binet<binet@cern.ch>
11
12
13// STL includes
14
15// FrameWork includes
16#include "Gaudi/Property.h"
17#include "GaudiKernel/SystemOfUnits.h"
18
19// StoreGate
21
22// DataModel includes
24#include "AthLinks/ElementLinkVector.h"
25
26// AthExThinning includes
32
34// Public methods:
36
37using namespace AthExThinning;
38
39// Constructors
41CreateData::CreateData( const std::string& name,
42 ISvcLocator* pSvcLocator ) :
43 AthAlgorithm( name, pSvcLocator )
44{
45 //
46 // Property declaration
47 //
48 //declareProperty( "Property", m_nProperty );
49
50 declareProperty( "ParticlesOutput",
51 m_particlesOutputName = "Particles",
52 "Output location of the particles" );
53
54 declareProperty( "NbrOfParticles",
55 m_nbrParticles = 10,
56 "Number of particles to create" );
57
58 declareProperty( "DecayOutput",
59 m_decayOutputName = "TwoBodyDecay",
60 "Output location of a 2-body decay" );
61
62 declareProperty( "ElephantinoOutput",
63 m_elephantinoOutputName = "PinkElephantino",
64 "Output location of an Elephantino with 4 legs" );
65
66 declareProperty( "TestNames",
68 "list of test-names to create data for "
69 "(default: test1,test2,test3)" );
70 m_testNames = std::vector<std::string>(3);
71 m_testNames[0] = "test1";
72 m_testNames[1] = "test2";
73 m_testNames[2] = "test3";
74}
75
76// Destructor
80
81// Athena Algorithm's Hooks
84{
85 ATH_MSG_INFO ("Initializing {}...", name());
86 return StatusCode::SUCCESS;
87}
88
90{
91 ATH_MSG_INFO ("Finalizing {}...", name());
92 return StatusCode::SUCCESS;
93}
94
95StatusCode CreateData::execute(const EventContext& /*ctx*/)
96{
97 ATH_MSG_DEBUG ("Executing {}...", name());
98
99 for ( std::vector<std::string>::const_iterator
100 itr = m_testNames.begin(),
101 iEnd = m_testNames.end();
102 itr != iEnd;
103 ++itr ) {
104 ATH_MSG_INFO("Generating data for [{}]...", *itr);
105 if ( !makeData(*itr).isSuccess() ) {
106 ATH_MSG_ERROR ("Could not generate data for [{}] !!", *itr);
107 return StatusCode::FAILURE;
108 }
109 }
110
111 return StatusCode::SUCCESS;
112}
113
114StatusCode CreateData::makeData( const std::string& test )
115{
116 const std::string testName = "_"+test;
117 const std::string particlesOutputName = m_particlesOutputName.value()
118 + testName;
119 // create particles
120 AthExParticles * particles = new AthExParticles;
121 if ( !evtStore()->record(particles, particlesOutputName).isSuccess() ) {
122 ATH_MSG_ERROR("Could not store particles at [{}]", particlesOutputName);
123 delete particles;
124 particles = 0;
125 return StatusCode::RECOVERABLE;
126 }
127 if ( !evtStore()->setConst(particles).isSuccess() ) {
128 ATH_MSG_WARNING("Could not setConst particles at [{}]", particlesOutputName);
129 }
130
131 for ( unsigned int i = 0; i != m_nbrParticles.value(); ++i ) {
132 AthExParticle * p = new AthExParticle( (i+1) * 10. * Gaudi::Units::GeV,
133 (i+1) * 10. * Gaudi::Units::GeV,
134 (i+1) * 10. * Gaudi::Units::GeV,
135 (i+2) * 10. * Gaudi::Units::GeV );
136 particles->push_back(p);
137 }
138
139 ATH_MSG_DEBUG ("particles: {} [{}]",
140 particles->size(), static_cast<void*>(particles));
141
142 const std::string decayOutputName = m_decayOutputName.value() + testName;
143 // create a dumb object from 2 particles
144 AthExDecay * dcy = new AthExDecay;
145 if ( !evtStore()->record(dcy, decayOutputName).isSuccess() ) {
146 ATH_MSG_ERROR("Could not store Decay at [{}] !!", decayOutputName);
147 delete dcy;
148 dcy = 0;
149 return StatusCode::RECOVERABLE;
150 }
151 if ( !evtStore()->setConst(dcy).isSuccess() ) {
152 ATH_MSG_WARNING("Could not setConst Decay at [{}]", decayOutputName);
153 }
154
155 if ( particles->size() < 5 ) {
156 ATH_MSG_WARNING("Not enough particles to make a Decay !!");
157 return StatusCode::RECOVERABLE;
158 }
159
160 // we need to test all the possible states of ElementLinks
161 // -> created from an index
162 const ElementLink<AthExParticles> p1( *particles, 0 );
163 // -> created from a pointer
164 const ElementLink<AthExParticles> p2( (*particles)[4], *particles );
165
166 // -> created from an index
167 const ElementLink<AthExParticles> l1( *particles, 1 );
168 // -> created from a pointer
169 const ElementLink<AthExParticles> l2( (*particles)[9], *particles );
170
171 dcy->setDecay( p1, p2, l1, l2 );
172
173 const double igev = 1. / Gaudi::Units::GeV;
174 ATH_MSG_INFO("Created a Decay from :");
175 ATH_MSG_INFO(" p1: px= {}", dcy->p1()->px() * igev);
176 ATH_MSG_INFO(" p2: px= {}", dcy->p2()->px() * igev);
177 ATH_MSG_INFO(" l1: px= {}", dcy->l1()->px() * igev);
178 ATH_MSG_INFO(" l2: px= {}", dcy->l2()->px() * igev);
179
180 // create the elephantino
181 const std::string elephantinoOutputName = m_elephantinoOutputName.value()
182 + testName;
184 if ( !evtStore()->record(eleph, elephantinoOutputName).isSuccess() ) {
185 ATH_MSG_ERROR("Could not store Elephantino at [{}] !!", elephantinoOutputName);
186 delete eleph;
187 eleph = 0;
188 return StatusCode::RECOVERABLE;
189 }
190 if ( !evtStore()->setConst(eleph).isSuccess() ) {
191 ATH_MSG_WARNING("Could not setConst Elephantino at [{}]", elephantinoOutputName);
192 }
193
194 const AthExIParticles* iparticles = 0;
195 if ( !evtStore()->retrieve( iparticles, particlesOutputName).isSuccess() ||
196 0 == iparticles ) {
197 ATH_MSG_WARNING("Could not retrieve the (symlinked) AthExIParticles at [{}] !!",
198 particlesOutputName);
199 return StatusCode::RECOVERABLE;
200 }
201
202 if ( iparticles->size() < 9 ) {
203 ATH_MSG_WARNING("Not enough particles to make an Elephantino !!");
204 return StatusCode::RECOVERABLE;
205 }
206
207 ATH_MSG_INFO(" particles: {}", particles->size());
208 ATH_MSG_INFO(" iparticles: {}", iparticles->size());
209
210 if ( iparticles->size() != particles->size() ) {
211 ATH_MSG_ERROR("Error performing the symlink !");
212 ATH_MSG_ERROR(" #iparticles: {}", iparticles->size());
213 ATH_MSG_ERROR(" #particles: {}", particles->size());
214 ATH_MSG_ERROR(" @iparticles: {}", static_cast<const void*>(iparticles));
215 ATH_MSG_ERROR(" @particles: {}", static_cast<const void*>(particles));
216 ATH_MSG_ERROR("=== StoreGate content ===\n{}", evtStore()->dump());
217 return StatusCode::FAILURE;
218 }
219
220 // we need to test all the possible states of ElementLinks
221 // -> created from an index
222 // -> created from a pointer
223 const ElementLink<AthExIParticles> ip1( *iparticles, 0 );
224 const ElementLink<AthExIParticles> ip2( (*iparticles)[4], *iparticles );
225 const ElementLink<AthExIParticles> ip3( *iparticles, 7 );
226 const ElementLink<AthExIParticles> ip4( (*iparticles)[8], *iparticles );
227
228 eleph->setLegs( ip1, ip2, ip3, ip4 );
229
230 const ElementLink<AthExIParticles> ie1( *iparticles, 1 );
231 const ElementLink<AthExIParticles> ie2( (*iparticles)[9], *iparticles );
232 eleph->setEars( ie1, ie2 );
233
234 ATH_MSG_INFO("Created an Elephantino from :");
235 ATH_MSG_INFO(" leg1: px= {}", eleph->leg1()->px() * igev);
236 ATH_MSG_INFO(" leg2: px= {}", eleph->leg2()->px() * igev);
237 ATH_MSG_INFO(" leg3: px= {}", eleph->leg3()->px() * igev);
238 ATH_MSG_INFO(" leg4: px= {}", eleph->leg4()->px() * igev);
239 ATH_MSG_INFO(" ear1: px= {}", eleph->ear1()->px() * igev);
240 ATH_MSG_INFO(" ear2: px= {}", eleph->ear2()->px() * igev);
241
242 return StatusCode::SUCCESS;
243}
DataVector< AthExIParticle > AthExIParticles
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
An STL vector of pointers that by default owns its pointed-to elements.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
const AthExParticle * l1() const
const AthExParticle * l2() const
void setDecay(const ElementLink< AthExParticles > &p1, const ElementLink< AthExParticles > &p2, const ElementLink< AthExParticles > &l1, const ElementLink< AthExParticles > &l2)
const AthExParticle * p1() const
const AthExParticle * p2() const
object with 4 legs, so it is best modeled with a vector of ElementLink.
void setEars(const ElementLink< AthExIParticles > &e1, const ElementLink< AthExIParticles > &e4)
const AthExIParticle * ear1() const
const AthExIParticle * leg4() const
const AthExIParticle * leg3() const
const AthExIParticle * leg1() const
const AthExIParticle * leg2() const
void setLegs(const ElementLink< AthExIParticles > &p1, const ElementLink< AthExIParticles > &p2, const ElementLink< AthExIParticles > &p3, const ElementLink< AthExIParticles > &p4)
const AthExIParticle * ear2() const
virtual double px() const =0
AthExIParticle interface.
virtual double px() const
Implementation of the AthExIParticle interface.
StringProperty m_particlesOutputName
Particles output location.
Definition CreateData.h:78
StringProperty m_decayOutputName
Decay object output location.
Definition CreateData.h:84
virtual StatusCode execute(const EventContext &ctx)
Execute method.
StatusCode makeData(const std::string &testName)
make data for a test
virtual StatusCode finalize()
virtual ~CreateData()
Destructor:
virtual StatusCode initialize()
UnsignedIntegerProperty m_nbrParticles
Number of particles to generate.
Definition CreateData.h:81
CreateData()
Default constructor:
std::vector< std::string > m_testNames
list of test-names to create data for (default: test1,test2,test3)
Definition CreateData.h:73
StringProperty m_elephantinoOutputName
Elephantino object output location.
Definition CreateData.h:87
size_type size() const noexcept
Returns the number of elements in the collection.
-event-from-file