ATLAS Offline Software
Loading...
Searching...
No Matches
WriteData Class Reference

#include <WriteData.h>

Inheritance diagram for WriteData:
Collaboration diagram for WriteData:

Public Member Functions

virtual StatusCode initialize () override
virtual StatusCode execute () override
 AthAlgorithm (const std::string &name, ISvcLocator *pSvcLocator)
 Constructor with parameters:
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode onError ()
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

DataObjIDColl m_extendedExtraObjects
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Member Function Documentation

◆ AthAlgorithm()

AthAlgorithm::AthAlgorithm ( const std::string & name,
ISvcLocator * pSvcLocator )

Constructor with parameters:

Definition at line 51 of file AthAlgorithm.cxx.

25 :
27{
28 // Set up to run AthAlgorithmDHUpdate in sysInitialize before
29 // merging dependency lists. This extends the output dependency
30 // list with any symlinks implied by inheritance relations.
31 m_updateDataHandles =
32 std::make_unique<AthenaBaseComps::AthAlgorithmDHUpdate>
34 std::move (m_updateDataHandles));
35}
DataObjIDColl m_extendedExtraObjects
AthCommonDataStore(const std::string &name, T... args)

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode WriteData::execute ( )
overridevirtual

Definition at line 35 of file Control/AthenaExamples/AthExStoreGateExample/src/WriteData.cxx.

35 {
36 //this example illustrates how to record objects into the StoreGate(SG)
37 //with and without providing a key
38 //It then covers the new DataLink class and its usage as a persistable
39 //reference among objects in the SG
40 //Finally it shows how to use symlinks to record an object using its
41 //concrete type and its base class(es).
42
43 ATH_MSG_INFO ("in execute()");
44
45 // For algorithms that produce new data objects like this one
46 // the SG works like a bulletin board: the algorithm posts the
47 // new object to the SG (optionally providing a "name" for it).
48 // The SG assigns a unique identifier to the object and puts it on display
49 // alongside others of the same type.
50 // At preset intervals all objects are removed from the board to make room
51 // for new ones and filed.
52
53 // Part 1: Recording objects to the SG
54 // We create a MyDataObj on the heap (using "new")
55 // (so that later we can pass ownership to SG)
56 //
57 MyDataObj *dobj = new MyDataObj;
58 dobj->val(1);
59
60 // now we record dobj. SG will identify dobj as the first obj
61 // of type MyDataObj
62 StatusCode sc = evtStore()->record(dobj, SG::DEFAULTKEY, false);
63 // Remember NEVER delete an object recorded in the SG:
64 // SG owns the object after it has been recorded
65 if ( sc.isFailure() ) {
66 ATH_MSG_ERROR (" could not register dobj");
67 return( onError() );
68 }
69
70 //now we create a second MyDataObj instance...
71 MyDataObj *dobj2 = new MyDataObj;
72 dobj2->val(2);
73
74 //...try to record it as we did for the first. Since dobj2 is also a
75 //MyDataObj we expect to see an error printed
76 ATH_MSG_WARNING ("we expect an error message here");
77 sc = evtStore()->record(dobj2, SG::DEFAULTKEY, false);
78 ATH_MSG_WARNING ("end of error message");
79 if ( !sc.isFailure() ) {
81 (" allowed to register two default objects for type MyDataObj");
82 return( onError() );
83 }
84 // The error handling will have deleted dobj2.
85
86 //here we go again...
87 MyDataObj *dobj3 = new MyDataObj;
88 dobj3->val(3);
89
90 //... but this time we register the dobj3 using this algo name as key
91 //sc = evtStore()->record(dobj3, name(), true);
92 sc = evtStore()->record(dobj3, name());
93 //the last argument of record, which for now defaults to true, is "allowMods"
94 //by setting it to true we allow downstream algorithms to modify dobj3
95 if ( sc.isFailure() ) {
96 ATH_MSG_ERROR (" could not register Data Object");
97 return( onError() );
98 }
99 //now dobj3 is known both as the default MyDataObj and the MyDataObj
100 //with key "WriteData"
101 //Notice that while in this case we used a std::string as key, this
102 //need not be the case. Any type satisfying the constraints specified
103 //in StoreGate/constraints/KeyConcept.h is a valid key
104 //Currently (release 1.3.5) KeyConcept requires a key to be convertible
105 //to and from a std::string (hence a string is a valid key)
106 //From release 2.0.0 (or 1.3.6) the only requirement on the key type
107 //will be to be sortable, i.e. to provide a "less than" operator <
108
109
111
112 // Part 2: storing collections in the SG
113
114 //first we create two instances on MyContObj
115 //(they can be created on the stack as std::vector copies them anyway
116
117 MyContObj* mco1 = new MyContObj;
118 MyContObj* mco2 = new MyContObj;
119 mco1->set(11.3, 132);
120 mco2->set(41.7, 291);
121
122 DataVector<MyContObj> *cobj = new DataVector<MyContObj>;
123 cobj->reserve(10);
124 cobj->push_back(mco1);
125 cobj->push_back(mco2); // if I push back this, it core dumps in map record
126
127 //finally we record the list itself. As before we don't need to specify
128 //a key. This make sense for collections, as in many applications (Atlfast)
129 //there is only one instance of each collection in the whole app
130 sc = evtStore()->record(cobj, SG::DEFAULTKEY, false);
131 if ( sc.isFailure() ) {
132 ATH_MSG_ERROR (" could not register list<MyContObj>");
133 return( onError() );
134 }
135
136 //
137 // as above with a vector of integers
138 //
139
140 //again notice how the vector is created on the heap
141 std::vector<float> *vFloat = new std::vector<float>;
142 vFloat->push_back(1.0);
143 vFloat->push_back(2.0);
144 vFloat->push_back(3.0);
145
146 sc = evtStore()->record(vFloat, SG::DEFAULTKEY, false);
147 if ( sc.isFailure() ) {
148 ATH_MSG_ERROR (" could not register vector<float>");
149 return( onError() );
150 }
151
152 //
153 // now we record a map
154 //
155
157 (*m)["uno"]=1.0;
158 (*m)["due"]=2.0;
159
160 sc = evtStore()->record(m, SG::DEFAULTKEY, false);
161 if ( sc.isFailure() ) {
162 ATH_MSG_ERROR (" could not register MapStringFloat");
163 return( onError() );
164 }
165
167 //
168 // Part 3: Data Links
169 //
170 // Data links are persistable references. Typically they will replace
171 // pointers from one object in the event to another, hence they have
172 // the usual "pointer" syntax (op *, op ->, op !, ...)
173 // (to be pedantic they have the moniker syntax as they don't define ++, --)
174 // For example in Atlfast::Cell
175 // class Cell {
176 // ...
177 // private:
178 // std::vector<const HepMC::Particle*> m_particles;
179 // };
180 // m_particles would become
181 // std::vector<HepMCLink<Particle>::type > m_particles;
182 //
183 // To understand data links it is important to observe that the SG
184 // is not able to identify every single object in the event.
185 // In particular individual elements of a container (the MyContObj
186 // in the vector above or the Particles in McEventCollection) are not
187 // recorded individually into SG, only their owner (the container) is.
188 // For this reason data links are supported by two class templates:
189 // DataLink<DATAOBJ> is a link to a data object i.e. an object
190 // identified by SG
191 // ElementLink<CONTAINER> is a link to an element of a container (which
192 // in turn is a SG data object)
193 // To make a DataLink persistable we need to provide its SG identifier
194 // (its type and key).
195 // To make an ElementLink persistable we need two pieces of information:
196 // i) the SG identifier (type/key) of the data object owning the element
197 // ii) the identifier of the contained object within the owner
198 // For example when we write out a link to the third element of
199 // our vector<float> we want to write the SG id of the vector
200 // and the index (2) of the element in the vector
201 //
202 // Since the indexing mechanism of a container depends on the container
203 // type we need to specialize ElementLink for different containers
204 // Elements of STL sequences (lists, vectors, deques but also DataVector
205 // and DataList) are dealt with automatically.
206 // For other STL or STL-like containers, the data object designer (or the
207 // client must "help" ElementLink identifying the type of container
208 // Three macros in the header StoreGate/DeclareIndexingPolicy.h
209 // are provided to this end:
210 // for sequences use CONTAINER_IS_SEQUENCE( MySequence )
211 // for sets use CONTAINER_IS_SET( MySet )
212 // for maps and related containers use CONTAINER_IS_MAP( MyMap )
213 //
214 // It is also possible to define custom specializations of ElementLink
215 // for custom containers (e.g. GenParticleLink for McEventCollection).
216 //
217 //Enough! Let's now create our first DataLink. It refers to the first
218 // MyDataObj we recorded. DataLink constructors use references
219 // as input arguments
220 //
221 // DataLink referring to a storable object
222 //
223 DataLink<MyDataObj> dobjLink(*dobj);
224 //since dobj is identifiable in the SG a reference to it is all we need
225
226 dobj2 = new MyDataObj;
227 dobj2->val(2);
228 CHECK( evtStore()->record(dobj2, "dobj2") );
229
230 //Otherwise one could first create an empty link
231 DataLink<MyDataObj> dobjLink2;
232 //and later on set it to refer to its target
233 dobjLink2.toStorableObject(*dobj2);
234
235
236 // Added Aug 30, 2001 HMA
237 // DataLink made from a key. This should work for either an object
238 // already registered in the store, or an object that has a
239 // persistency for it. we use dobj3, which is an object registered with
240 // a key.
241
242 DataLink<MyDataObj> dobjLink3(name());
243 // now access it. DataLink will do a retrieve to get it from the store.
244 (void)dobjLink3.cptr();
245
246 //
247 // ElementLinks referring to contained objects
248 //
249 typedef ElementLink<std::vector<float> > VecElemLink;
250
251
252 VecElemLink thirdElementLink(*vFloat, 2); //THIS CRASHES SUN CC
253
254 //sometimes we would not know the index of the element we want to refer to
255
256 //reference to an element of the vector
257 float& anElement = vFloat->operator[](0);
258
259 //starting from an empty link
260 VecElemLink aLink;
261 //we can refer it to its target without knowing its index
262 aLink.toContainedElement(*vFloat, anElement);
263 //it is better though to remember that toContainedElement for an
264 //ElementLink performs a linear search of "anElement" into "vFloat".
265 // If vFloat has a million elements think twice before using
266 // toContainedElement!
267
268
269 //Now let's put all this VecElemLink in a list
270 std::list<VecElemLink> *pLinkList = new std::list<VecElemLink>;
271 pLinkList->push_back(aLink);
272 pLinkList->push_back(thirdElementLink);
273
274 //and finally let's record the list of links into SG
275 sc = evtStore()->record(pLinkList, name(), false);
276 if ( sc.isFailure() ) {
277 ATH_MSG_ERROR (" could not register the list of DataLinks");
278 return( onError() );
279 }
280 //
281 // Part 3b: create a vector of links to the elements of the map above
282 //
283 typedef ElementLink<MapStringFloat> MapElemLink;
284 std::vector<MapElemLink>* linkVector = new std::vector<MapElemLink>;
285
286 linkVector->push_back(MapElemLink(*m, "uno"));
287 MapElemLink mLink;
288 mLink.toContainedElement(*m, (*m)["due"]);
289 linkVector->push_back(mLink);
290
291 sc = evtStore()->record(linkVector, SG::DEFAULTKEY, false);
292 if ( sc.isFailure() ) {
293 ATH_MSG_ERROR (" could not register the vector of DataLinks");
294 return( onError() );
295 }
296
297 // Part 4
298 // make a link to dobj as its base class after it has been registered
299 // this allows later to retrieve different concrete types as a common ABC
300
301 const BaseClass * pDO = 0;
302 if ( (evtStore()->symLink(dobj, pDO)).isFailure() ) {
303 ATH_MSG_ERROR (" could not make link to BaseClass");
304 return( onError() );
305 }
306
307 // make a link as its base class, with the same name
308 if ( ( evtStore()->symLink(dobj3, pDO)).isFailure() ) {
309 ATH_MSG_ERROR (" could not make link to BaseClass");
310 return( onError() );
311 }
312
313 // Part 5
314 // finally dump the sturcture of the StoreGate before returning
315 ATH_MSG_INFO (" registered all data objects");
316 ATH_MSG_INFO (" StoreGate structure before returning from execute \n"
317 << evtStore()->dump());
318
319 return StatusCode::SUCCESS;
320}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define CHECK(...)
Evaluate an expression and check for errors.
static Double_t sc
std::map< std::string, float > MapStringFloat
a map of float keyed by string
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
void set(float t, int i)
Definition MyContObj.h:18
void val(int i)
Definition MyDataObj.h:24
::StatusCode StatusCode
StatusCode definition for legacy code.
std::ostream & dump(std::ostream &out, const I4MomIter iBeg, const I4MomIter iEnd)
Helper to stream out a range of I4Momentum objects.
Definition P4Dumper.h:24
RoIThresholdsTool< xAOD::MuonRoI, xAOD::MuonRoIContainer, ContainerName, ThresholdType > BaseClass
const std::string DEFAULTKEY
Definition DefaultKey.h:12

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthAlgorithm::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 50 of file AthAlgorithm.cxx.

51{
52 // If we didn't find any symlinks to add, just return the collection
53 // from the base class. Otherwise, return the extended collection.
54 if (!m_extendedExtraObjects.empty()) {
56 }
57 return Algorithm::extraOutputDeps();
58}

◆ initialize()

StatusCode WriteData::initialize ( )
overridevirtual

Definition at line 26 of file Control/AthenaExamples/AthExStoreGateExample/src/WriteData.cxx.

26 {
27 ATH_MSG_INFO ("in initialize()");
28 //locate the StoreGateSvc and initialize our local ptr
30 return StatusCode::SUCCESS;
31}
#define ATH_CHECK
Evaluate an expression and check for errors.
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ msg()

MsgStream & AthCommonMsg< Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ onError()

StatusCode WriteData::onError ( )
private

Definition at line 324 of file Control/AthenaExamples/AthExStoreGateExample/src/WriteData.cxx.

324 {
325
326 ATH_MSG_ERROR ("Dumping StoreGate after error occurred\n"
327 << evtStore()->dump());
328 return StatusCode::FAILURE;
329}

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ sysInitialize()

StatusCode AthAlgorithm::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthFilterAlgorithm, AthHistogramAlgorithm, and PyAthena::Alg.

Definition at line 66 of file AthAlgorithm.cxx.

66 {
68
69 if (sc.isFailure()) {
70 return sc;
71 }
72 ServiceHandle<ICondSvc> cs("CondSvc",name());
73 for (auto h : outputHandles()) {
74 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
75 // do this inside the loop so we don't create the CondSvc until needed
76 if ( cs.retrieve().isFailure() ) {
77 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
78 return StatusCode::SUCCESS;
79 }
80 if (cs->regHandle(this,*h).isFailure()) {
81 sc = StatusCode::FAILURE;
82 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
83 << " with CondSvc");
84 }
85 }
86 }
87 return sc;
88}
virtual StatusCode sysInitialize() override
Override sysInitialize.
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthAlgorithm::m_extendedExtraObjects
privateinherited

Definition at line 79 of file AthAlgorithm.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: