ATLAS Offline Software
Loading...
Searching...
No Matches
CreateData.cxx
Go to the documentation of this file.
1
2
3/*
4 Copyright (C) 2002-2020 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
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 ["
123 << particlesOutputName << "]");
124 delete particles;
125 particles = 0;
126 return StatusCode::RECOVERABLE;
127 }
128 if ( !evtStore()->setConst(particles).isSuccess() ) {
129 ATH_MSG_WARNING("Could not setConst particles at ["
130 << particlesOutputName << "]");
131 }
132
133 for ( unsigned int i = 0; i != m_nbrParticles.value(); ++i ) {
134 AthExParticle * p = new AthExParticle( (i+1) * 10. * Gaudi::Units::GeV,
135 (i+1) * 10. * Gaudi::Units::GeV,
136 (i+1) * 10. * Gaudi::Units::GeV,
137 (i+2) * 10. * Gaudi::Units::GeV );
138 particles->push_back(p);
139 }
140
141 ATH_MSG_DEBUG ("particles: " << particles->size()
142 << " [" << particles << "]");
143
144 const std::string decayOutputName = m_decayOutputName.value() + testName;
145 // create a dumb object from 2 particles
146 AthExDecay * dcy = new AthExDecay;
147 if ( !evtStore()->record(dcy, decayOutputName).isSuccess() ) {
148 ATH_MSG_ERROR("Could not store Decay at [" << decayOutputName << "] !!");
149 delete dcy;
150 dcy = 0;
151 return StatusCode::RECOVERABLE;
152 }
153 if ( !evtStore()->setConst(dcy).isSuccess() ) {
154 ATH_MSG_WARNING("Could not setConst Decay at [" << decayOutputName << "]");
155 }
156
157 if ( particles->size() < 5 ) {
158 ATH_MSG_WARNING("Not enough particles to make a Decay !!");
159 return StatusCode::RECOVERABLE;
160 }
161
162 // we need to test all the possible states of ElementLinks
163 // -> created from an index
164 const ElementLink<AthExParticles> p1( *particles, 0 );
165 // -> created from a pointer
166 const ElementLink<AthExParticles> p2( (*particles)[4], *particles );
167
168 // -> created from an index
169 const ElementLink<AthExParticles> l1( *particles, 1 );
170 // -> created from a pointer
171 const ElementLink<AthExParticles> l2( (*particles)[9], *particles );
172
173 dcy->setDecay( p1, p2, l1, l2 );
174
175 const double igev = 1. / Gaudi::Units::GeV;
177 ("Created a Decay from :" << endmsg
178 << " p1: px= " << dcy->p1()->px() * igev << endmsg
179 << " p2: px= " << dcy->p2()->px() * igev << endmsg
180 << " l1: px= " << dcy->l1()->px() * igev << endmsg
181 << " l2: px= " << dcy->l2()->px() * igev
182 );
183
184 // create the elephantino
185 const std::string elephantinoOutputName = m_elephantinoOutputName.value()
186 + testName;
188 if ( !evtStore()->record(eleph, elephantinoOutputName).isSuccess() ) {
189 ATH_MSG_ERROR("Could not store Elephantino at ["
190 << elephantinoOutputName << "] !!");
191 delete eleph;
192 eleph = 0;
193 return StatusCode::RECOVERABLE;
194 }
195 if ( !evtStore()->setConst(eleph).isSuccess() ) {
196 ATH_MSG_WARNING("Could not setConst Elephantino at ["
197 << elephantinoOutputName << "]");
198 }
199
200 {
201 const AthExIParticles* iparticles = 0;
202 if ( !evtStore()->symLink( particles, iparticles ).isSuccess() ) {
203 ATH_MSG_WARNING("Could not symlink AthExParticles to AthExIParticles !!");
204 return StatusCode::RECOVERABLE;
205 }
206 }
207
208 const AthExIParticles* iparticles = 0;
209 if ( !evtStore()->retrieve( iparticles, particlesOutputName).isSuccess() ||
210 0 == iparticles ) {
211 ATH_MSG_WARNING("Could not retrieve the (symlinked) AthExIParticles at ["
212 << particlesOutputName << "] !!");
213 return StatusCode::RECOVERABLE;
214 }
215
216 if ( iparticles->size() < 9 ) {
217 ATH_MSG_WARNING("Not enough particles to make an Elephantino !!");
218 return StatusCode::RECOVERABLE;
219 }
220
221 ATH_MSG_INFO(" particles: " << particles->size()
222 << endmsg <<
223 " iparticles: " << iparticles->size());
224
225 if ( iparticles->size() != particles->size() ) {
226 ATH_MSG_ERROR("Error performing the symlink !" << endmsg
227 << " #iparticles: " << iparticles->size() << endmsg
228 << " #particles: " << particles->size() << endmsg
229 << " @iparticles: " << iparticles << endmsg
230 << " @particles: " << particles << endmsg
231 << "=== StoreGate content ===\n"
232 << evtStore()->dump());
233 return StatusCode::FAILURE;
234 }
235
236 // we need to test all the possible states of ElementLinks
237 // -> created from an index
238 // -> created from a pointer
239 const ElementLink<AthExIParticles> ip1( *iparticles, 0 );
240 const ElementLink<AthExIParticles> ip2( (*iparticles)[4], *iparticles );
241 const ElementLink<AthExIParticles> ip3( *iparticles, 7 );
242 const ElementLink<AthExIParticles> ip4( (*iparticles)[8], *iparticles );
243
244 eleph->setLegs( ip1, ip2, ip3, ip4 );
245
246 const ElementLink<AthExIParticles> ie1( *iparticles, 1 );
247 const ElementLink<AthExIParticles> ie2( (*iparticles)[9], *iparticles );
248 eleph->setEars( ie1, ie2 );
249
250 ATH_MSG_INFO("Created an Elephantino from :" << endmsg
251 << " leg1: px= " << eleph->leg1()->px() * igev << endmsg
252 << " leg2: px= " << eleph->leg2()->px() * igev << endmsg
253 << " leg3: px= " << eleph->leg3()->px() * igev << endmsg
254 << " leg4: px= " << eleph->leg4()->px() * igev << endmsg
255 << " ear1: px= " << eleph->ear1()->px() * igev << endmsg
256 << " ear2: px= " << eleph->ear2()->px() * igev);
257
258 return StatusCode::SUCCESS;
259}
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
An STL vector of pointers that by default owns its pointed-to elements.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
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
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
virtual StatusCode execute()
size_type size() const noexcept
Returns the number of elements in the collection.
-event-from-file