BOSS 7.0.9
BESIII Offline Software System
Loading...
Searching...
No Matches
eformat::write::FullEventFragment Class Reference

#include <FullEventFragment.h>

Public Member Functions

 FullEventFragment (uint32_t source_id, uint32_t global_id, uint32_t run_no, uint32_t lvl1_id, uint32_t lvl1_type, uint32_t lvl2_info, const uint32_t *ef_info)
 
 FullEventFragment (uint32_t source_id, uint32_t use_time, uint32_t global_id, uint32_t run_no, uint32_t lvl1_id, uint32_t lvl1_type, uint32_t lvl2_info, const uint32_t *ef_info)
 
 FullEventFragment (uint32_t *fe)
 
 FullEventFragment (eformat::write::node_t *fe)
 
 FullEventFragment ()
 
 FullEventFragment (const FullEventFragment &other)
 
virtual ~FullEventFragment ()
 
FullEventFragmentoperator= (const FullEventFragment &other)
 
void status (uint32_t n, const uint32_t *status)
 
uint32_t nstatus (void) const
 
const uint32_t * status (void) const
 
void minor_version (uint16_t v)
 
uint16_t minor_version (void) const
 
void source_id (uint32_t s)
 
uint32_t source_id (void) const
 
void time (uint32_t s)
 
uint32_t time (void) const
 
void global_id (uint32_t s)
 
uint32_t global_id (void) const
 
void run_no (uint32_t s)
 
uint32_t run_no (void) const
 
void lvl1_id (uint32_t s)
 
uint32_t lvl1_id (void) const
 
void lvl1_trigger_type (uint32_t s)
 
uint32_t lvl1_trigger_type (void) const
 
void lvl2_trigger_info (uint32_t s)
 
uint32_t lvl2_trigger_info (void) const
 
void event_filter_info (const uint32_t *s)
 
const uint32_t * event_filter_info (void) const
 
uint32_t meta_size_word (void) const
 
uint32_t size_word (void) const
 
void append (eformat::write::SubDetectorFragment *sd)
 
const SubDetectorFragmentfirst_child (void) const
 
void size_change (uint32_t o, uint32_t n)
 
uint32_t page_count (void) const
 
const eformat::write::node_tbind (void)
 
const eformat::write::node_trebind (void)
 

Detailed Description

Defines a helper class to aid the creation of FullEvent fragments.

Definition at line 26 of file write/FullEventFragment.h.

Constructor & Destructor Documentation

◆ FullEventFragment() [1/6]

eformat::write::FullEventFragment::FullEventFragment ( uint32_t  source_id,
uint32_t  global_id,
uint32_t  run_no,
uint32_t  lvl1_id,
uint32_t  lvl1_type,
uint32_t  lvl2_info,
const uint32_t *  ef_info 
)

Builds a new FullEvent fragment from scratch, using the current time as the time label.

Parameters
source_idThe source identifier to be using for this FullEvent
global_idThe global identifier for this fragment
run_noThe run number for this fragment
lvl1_idThe LVL1 trigger identifier for this fragment
lvl1_typeThe LVL1 trigger type for this fragment
lvl2_infoThe LVL2 trigger info for this fragment @parma ef_info The Event Filter info for this fragment: a pointer to 4 pre-allocated words.

Definition at line 54 of file FullEventFragment.cxx.

58 : m_child(0),
59 m_last(0),
60 m_extra_count(0)
61{
62 m_header[0] = eformat::FULL_EVENT; //marker
63 m_header[1] = 18; //this header size + status size
64 m_header[2] = 18; //this header size + status size
65 m_header[3] = eformat::DEFAULT_VERSION; //format version
66 m_header[4] = source_id;
67 m_header[5] = 1; //number of status
68 m_header[6] = 10; //number of fragment specific
69 m_header[7] = std::time(0);
70 m_header[8] = global_id;
71 m_header[9] = run_no;
72 m_header[10] = lvl1_id;
73 m_header[11] = lvl1_type;
74 m_header[12] = lvl2_info;
75 memcpy(&m_header[13], ef_info, 4*sizeof(uint32_t));
76
77 //now initialize pages
78 set(m_node[0], m_header, 6, &m_node[1]);
79 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
80 set(m_node[2], &m_header[6], 11, 0);
81 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
82 "Built (write) full event from scratch, with",
85}
#define ERS_DEBUG_3(...)
void set(node_t &i, const uint32_t *b, size_t l, node_t *n=0)
Definition: node.cxx:16
@ FULL_EVENT
Definition: HeaderMarker.h:30
const uint32_t DEFAULT_VERSION
Definition: Version.h:24
const uint32_t DEFAULT_STATUS
Definition: Status.h:44

◆ FullEventFragment() [2/6]

eformat::write::FullEventFragment::FullEventFragment ( uint32_t  source_id,
uint32_t  use_time,
uint32_t  global_id,
uint32_t  run_no,
uint32_t  lvl1_id,
uint32_t  lvl1_type,
uint32_t  lvl2_info,
const uint32_t *  ef_info 
)

Builds a new FullEvent fragment from scratch

Parameters
source_idThe source identifier to be using for this FullEvent
use_timeThe creation time in seconds since 1/1/1970 00:00 UTC for this fragment
global_idThe global identifier for this fragment
run_noThe run number for this fragment
lvl1_idThe LVL1 trigger identifier for this fragment
lvl1_typeThe LVL1 trigger type for this fragment
lvl2_infoThe LVL2 trigger info for this fragment @parma ef_info The Event Filter info for this fragment: a pointer to 4 pre-allocated words.

Definition at line 20 of file FullEventFragment.cxx.

25 : m_child(0),
26 m_last(0),
27 m_extra_count(0)
28{
29 m_header[0] = eformat::FULL_EVENT; //marker
30 m_header[1] = 18; //this header size + status size
31 m_header[2] = 18; //this header size + status size
32 m_header[3] = eformat::DEFAULT_VERSION; //format version
33 m_header[4] = source_id;
34 m_header[5] = 1; //number of status
35 m_header[6] = 10; //number of fragment specific
36 m_header[7] = use_time;
37 m_header[8] = global_id;
38 m_header[9] = run_no;
39 m_header[10] = lvl1_id;
40 m_header[11] = lvl1_type;
41 m_header[12] = lvl2_info;
42 memcpy(&m_header[13], ef_info, 4*sizeof(uint32_t));
43
44 //now initialize pages
45 set(m_node[0], m_header, 6, &m_node[1]);
46 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
47 set(m_node[2], &m_header[6], 11, 0);
48 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
49 "Built (write) full event from scratch, with",
52}

◆ FullEventFragment() [3/6]

eformat::write::FullEventFragment::FullEventFragment ( uint32_t *  fe)

Builds a new FullEvent fragment from an existing FullEvent fragment in contiguous memory.

Parameters
feThe existing FullEvent fragment

Definition at line 87 of file FullEventFragment.cxx.

88 : m_child(0),
89 m_last(0),
90 m_extra_count(0)
91{
92 //now initialize pages
93 set(m_node[0], fe, 6, &m_node[1]);
94 set(m_node[1], &fe[6], fe[5], &m_node[2]);
95 set(m_node[2], &fe[6+fe[5]], 11, 0);
96 eformat::write::set(m_extra, &fe[17+fe[5]], fe[1]-fe[2], 0);
97 ++m_extra_count;
98 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
99 "Built (write) full event from contiguos memory, with",
100 source_id(), lvl1_id(), run_no());
101}

◆ FullEventFragment() [4/6]

eformat::write::FullEventFragment::FullEventFragment ( eformat::write::node_t fe)

Builds a new FullEvent fragment from an existing FullEvent fragment in non-contiguous memory. The top-level fragment header is expected to be on a contiguous area of memory, together with the first word of the first child fragment (i.e. the ROS header marker). The following data can be spread around.

Parameters
feThe existing FullEvent fragment, as a list of nodes, pre-concatenated by the caller.

Definition at line 103 of file FullEventFragment.cxx.

105 : m_child(0),
106 m_last(0),
107 m_extra_count(0)
108{
109 //now initialize pages
110 set(m_node[0], fe->base, 6, &m_node[1]);
111 set(m_node[1], &fe->base[6], fe->base[5], &m_node[2]);
112 set(m_node[2], &fe->base[6+fe->base[5]], 11, 0);
113 eformat::write::set(m_extra, &fe->base[17+fe->base[5]],
114 fe->size_word - fe->base[2], fe->next);
115 m_extra_count += eformat::write::count(m_extra);
116 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
117 "Built (write) full event from paged memory, with",
118 source_id(), lvl1_id(), run_no());
119}
uint32_t count(const node_t &list)
Definition: node.cxx:42
node_t * next
The next node.
Definition: node.h:29
uint32_t * base
The base address for this page.
Definition: node.h:27
size_t size_word
The size, in 4-byte words for this page.
Definition: node.h:28

◆ FullEventFragment() [5/6]

eformat::write::FullEventFragment::FullEventFragment ( )

Builds a new empty FullEventFragment, otherwise invalid. This is useful for array builds and standard containers.

Definition at line 121 of file FullEventFragment.cxx.

122 : m_child(0),
123 m_last(0),
124 m_extra_count(0)
125{
126 m_header[0] = eformat::FULL_EVENT; //marker
127 m_header[1] = 18; //this header size + status size
128 m_header[2] = 18; //this header size + status size
129 m_header[3] = eformat::DEFAULT_VERSION; //format version
130 m_header[4] = 0; //source identifier
131 m_header[5] = 1; //number of status
132 m_header[6] = 10; //number of fragment specific
133 m_header[7] = std::time(0);
134 m_header[8] = 0; //global identifier
135 m_header[9] = 0; //run number
136 m_header[10] = 0; //LVL1 identifier
137 m_header[11] = 0; //LVL1 type
138 m_header[12] = 0; //LVL2 info
139 m_header[13] = 0; //EF info [0]
140 m_header[14] = 0; //EF info [1]
141 m_header[15] = 0; //EF info [2]
142 m_header[16] = 0; //EF info [3]
143
144 //now initialize pages
145 set(m_node[0], m_header, 6, &m_node[1]);
146 set(m_node[1], &eformat::DEFAULT_STATUS, 1, &m_node[2]);
147 set(m_node[2], &m_header[6], 11, 0);
148 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
149 "Built empty (write) full event from scratch, with",
152}

◆ FullEventFragment() [6/6]

eformat::write::FullEventFragment::FullEventFragment ( const FullEventFragment other)

Copy constructor. This will only copy the meta data, not the fragment relationships and block-data (children and status block) contained in the to-be-copied fragment. If you wish this fragment has the same children of the copied fragment, you have to do this operation manually, after copying. If you wish to make a copy of the status as well, do it manually and then assign it to this fragment using the status() method.

Parameters
otherThe other fragment to take the meta data from.

Definition at line 154 of file FullEventFragment.cxx.

156 : m_child(0),
157 m_last(0),
158 m_extra_count(0)
159{
160 *this = other;
161 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
162 "Built (write) full event from copy, with",
165}

◆ ~FullEventFragment()

virtual eformat::write::FullEventFragment::~FullEventFragment ( )
inlinevirtual

Base destructor

Definition at line 111 of file write/FullEventFragment.h.

111{}

Member Function Documentation

◆ append()

void eformat::write::FullEventFragment::append ( eformat::write::SubDetectorFragment sd)

Appends a new SubDetector fragment to this FullEvent fragment.

Warning
This will change the page structure of the last ROS fragment inserted here, in order to concatenate the ROS fragments together. Please note that this operation is not compatible with multiple threads of operation, if you would like to share eformat::write::Fragment's between threads. A better strategy would be create, for every thread of operation, a proper ROSFragment instead.
Parameters
sdThe SubDetector fragment to be appended to myself

Definition at line 200 of file FullEventFragment.cxx.

202{
203 ERS_DEBUG_3("%s Source Id. = 0x%x to full event with Source Id. = 0x%x",
204 "Appending subdetector with",
205 sd->source_id(), source_id());
206 sd->parent(this);
207 m_node[0].base[1] += sd->size_word();
208
209 //adjust `m_last' and `m_child' to point to the new last ROB
210 if (m_last) m_last->next(sd);
211 else m_child = sd;
212 m_last = sd;
213}
const FullEventFragment * parent(void) const
const SubDetectorFragment * next(void) const

Referenced by Builder::append2event(), eformat::old::convert(), and main().

◆ bind()

const eformat::write::node_t * eformat::write::FullEventFragment::bind ( void  )

Returns the first node of a list of nodes that represent the fragment you have constructed. To make use of it, just browse the list as defined in node.h

Definition at line 224 of file FullEventFragment.cxx.

225{
226 //the header is already concatenated by construction
227 eformat::write::node_t* last = &m_node[2];
228 if (m_extra_count) {
229 last = &m_extra;
230 while (last->next) last = last->next;
231 }
232 for (SubDetectorFragment* curr = m_child; curr;
233 curr = const_cast<SubDetectorFragment*>(curr->next())) {
234 last->next = const_cast<eformat::write::node_t*>(curr->bind());
235 while (last->next) last = last->next; //advance until end
236 }
237 return m_node;
238}

Referenced by eformat::old::convert(), main(), and RawDataOutputSvc::putEvent().

◆ event_filter_info() [1/2]

void eformat::write::FullEventFragment::event_filter_info ( const uint32_t *  s)
inline

Changes the event filter trigger info in this fragment

Parameters
sThe new value to set: a pointer with 4 word pre-allocated

Definition at line 263 of file write/FullEventFragment.h.

264 { memcpy(&m_node[2].base[7], s, 4*sizeof(uint32_t)); }
XmlRpcServer s
Definition: HelloServer.cpp:11

Referenced by HltBuilder::pack().

◆ event_filter_info() [2/2]

const uint32_t * eformat::write::FullEventFragment::event_filter_info ( void  ) const
inline

Returns the event filter trigger info for this fragment

Definition at line 269 of file write/FullEventFragment.h.

270 { return &m_node[2].base[7]; }

◆ first_child()

const SubDetectorFragment * eformat::write::FullEventFragment::first_child ( void  ) const
inline

This returns the first child of this fragment. The system operates as a concatenated list of fragments. From this child you can get to the next.

Definition at line 306 of file write/FullEventFragment.h.

307 { return m_child; }

Referenced by PackedRawDataCnvSvc::commitOutput().

◆ global_id() [1/2]

void eformat::write::FullEventFragment::global_id ( uint32_t  s)
inline

Changes the global identifier for this event

Parameters
sThe new value to set

Definition at line 193 of file write/FullEventFragment.h.

194 { m_node[2].base[2] = s; }

◆ global_id() [2/2]

uint32_t eformat::write::FullEventFragment::global_id ( void  ) const
inline

Returns the global identifier for this event

Definition at line 199 of file write/FullEventFragment.h.

200 { return m_node[2].base[2]; }

Referenced by FullEventFragment().

◆ lvl1_id() [1/2]

void eformat::write::FullEventFragment::lvl1_id ( uint32_t  s)
inline

Changes the lvl1 identifier in this fragment

Parameters
sThe new value to set

Definition at line 221 of file write/FullEventFragment.h.

222 { m_node[2].base[4] = s; }

Referenced by Builder::append2event().

◆ lvl1_id() [2/2]

uint32_t eformat::write::FullEventFragment::lvl1_id ( void  ) const
inline

Returns the lvl1 identifier for this fragment

Definition at line 227 of file write/FullEventFragment.h.

228 { return m_node[2].base[4]; }

Referenced by FullEventFragment(), and operator=().

◆ lvl1_trigger_type() [1/2]

void eformat::write::FullEventFragment::lvl1_trigger_type ( uint32_t  s)
inline

Changes the lvl1 trigger type in this fragment

Parameters
sThe new value to set

Definition at line 235 of file write/FullEventFragment.h.

236 { m_node[2].base[5] = s; }

◆ lvl1_trigger_type() [2/2]

uint32_t eformat::write::FullEventFragment::lvl1_trigger_type ( void  ) const
inline

Returns the lvl1 trigger type for this fragment

Definition at line 241 of file write/FullEventFragment.h.

242 { return m_node[2].base[5]; }

◆ lvl2_trigger_info() [1/2]

void eformat::write::FullEventFragment::lvl2_trigger_info ( uint32_t  s)
inline

Changes the lvl2 trigger info in this fragment

Parameters
sThe new value to set

Definition at line 249 of file write/FullEventFragment.h.

250 { m_node[2].base[6] = s; }

◆ lvl2_trigger_info() [2/2]

uint32_t eformat::write::FullEventFragment::lvl2_trigger_info ( void  ) const
inline

Returns the lvl2 trigger info for this fragment

Definition at line 255 of file write/FullEventFragment.h.

256 { return m_node[2].base[6]; }

◆ meta_size_word()

uint32_t eformat::write::FullEventFragment::meta_size_word ( void  ) const
inline

Returns the total size for the meta data (everything that does not encompass the contents of the m_data pointer in the private representation of this class) in the fragment, in words

Definition at line 277 of file write/FullEventFragment.h.

278 { return m_node[0].base[2]; }

◆ minor_version() [1/2]

void eformat::write::FullEventFragment::minor_version ( uint16_t  v)
inline

Changes the minor version number of the fragment

Parameters
vThe new minor version for this header

Definition at line 151 of file write/FullEventFragment.h.

152 { m_node[0].base[3] = eformat::DEFAULT_VERSION | v; }
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition: KarLud.h:35

Referenced by eformat::old::convert().

◆ minor_version() [2/2]

uint16_t eformat::write::FullEventFragment::minor_version ( void  ) const
inline

Returns the minor version number of the fragment

Definition at line 157 of file write/FullEventFragment.h.

158 { return 0xffff & m_node[0].base[3]; }

◆ nstatus()

uint32_t eformat::write::FullEventFragment::nstatus ( void  ) const
inline

Returns the number of status wors in this fragment

Definition at line 139 of file write/FullEventFragment.h.

139{ return m_node[0].base[5]; }

◆ operator=()

eformat::write::FullEventFragment & eformat::write::FullEventFragment::operator= ( const FullEventFragment other)

Assigment operator. This will only copy the meta data, not the fragment relationships and block-data (children and parent and status block) contained in the to-be-copied fragment. If you wish this fragment has the same parents, and children of the copied fragment, you have to do this operation manually, after copying. If you wish to make a copy of the status as well, do it manually and then assign it to this fragment using the status() method.

Parameters
otherThe other fragment to take the meta data from.

Definition at line 168 of file FullEventFragment.cxx.

170{
171 memcpy(reinterpret_cast<void*>(m_header),
172 reinterpret_cast<const void*>(other.m_node[0].base),
173 6*sizeof(uint32_t));
174 memcpy(reinterpret_cast<void*>(m_header+6),
175 reinterpret_cast<const void*>(other.m_node[2].base),
176 11*sizeof(uint32_t));
177
178 //now initialize pages
179 set(m_node[0], m_header, 6, &m_node[1]);
180 set(m_node[1], other.m_node[1].base, other.m_node[1].size_word, &m_node[2]);
181 set(m_node[2], &m_header[6], 11, 0);
182 ERS_DEBUG_3("%s Source Id. = 0x%x, LVL1 Id. = %d and Run Number = %d",
183 "Copied (write) full event, with",
186 return *this;
187}

◆ page_count()

uint32_t eformat::write::FullEventFragment::page_count ( void  ) const

Returns the total number of (raw memory) pages this fragment is composed of.

Warning
This operation navigates at a potentially large list of child page nodes (for a full ATLAS event this should be bigger than 2,000 pages when built from scratch). If you don't do your bookkeeping, avoid calling this too often.

Definition at line 215 of file FullEventFragment.cxx.

216{
217 uint32_t retval = 3 + m_extra_count;
218 for (const SubDetectorFragment* curr = m_child; curr; curr = curr->next())
219 retval += curr->page_count();
220 return retval;
221}

◆ rebind()

const eformat::write::node_t * eformat::write::FullEventFragment::rebind ( void  )
inline

Definition at line 337 of file write/FullEventFragment.h.

337{return m_node;};

◆ run_no() [1/2]

void eformat::write::FullEventFragment::run_no ( uint32_t  s)
inline

Changes the run number

Parameters
sThe new value to set

Definition at line 207 of file write/FullEventFragment.h.

208 { m_node[2].base[3] = s; }

Referenced by Builder::append2event().

◆ run_no() [2/2]

uint32_t eformat::write::FullEventFragment::run_no ( void  ) const
inline

Returns the run number for this fragment

Definition at line 213 of file write/FullEventFragment.h.

214 { return m_node[2].base[3]; }

Referenced by FullEventFragment(), and operator=().

◆ size_change()

void eformat::write::FullEventFragment::size_change ( uint32_t  o,
uint32_t  n 
)
inline

This method is used by children of this fragment to notify fragment size changes.

Parameters
oThe old size, in 32-bit words
nThe new size, in 32-bit words

Definition at line 316 of file write/FullEventFragment.h.

317 { m_node[0].base[1] -= o; m_node[0].base[1] += n; }
const Int_t n

◆ size_word()

uint32_t eformat::write::FullEventFragment::size_word ( void  ) const
inline

Returns the total size for this fragment, in words

Definition at line 283 of file write/FullEventFragment.h.

284 { return m_node[0].base[1]; }

Referenced by PackedRawDataCnvSvc::commitOutput().

◆ source_id() [1/2]

void eformat::write::FullEventFragment::source_id ( uint32_t  s)
inline

Changes the source identifier for this fragment

Parameters
sThe new value to set

Definition at line 165 of file write/FullEventFragment.h.

166 { m_node[0].base[4] = s; }

◆ source_id() [2/2]

uint32_t eformat::write::FullEventFragment::source_id ( void  ) const
inline

Returns the source identifier of this fragment

Definition at line 171 of file write/FullEventFragment.h.

172 { return m_node[0].base[4]; }

Referenced by FullEventFragment(), and operator=().

◆ status() [1/2]

void eformat::write::FullEventFragment::status ( uint32_t  n,
const uint32_t *  status 
)

Changes the number of status words and the status words themselves from the fragment

Parameters
nHow many status words the underlying FullEventFragment fragment supposed to have.
statusA pointer to n pre-allocated words

Definition at line 189 of file FullEventFragment.cxx.

191{
192 m_node[0].base[1] -= m_node[0].base[5]; //remove count from previous status
193 m_node[0].base[2] -= m_node[0].base[5]; //remove count from previous status
194 m_node[1].size_word = m_node[0].base[5] = n; //set new values
195 m_node[0].base[1] += n;
196 m_node[0].base[2] += n;
197 m_node[1].base = const_cast<uint32_t*>(status);
198}
const uint32_t * status(void) const

Referenced by PackedRawDataCnvSvc::connectOutput(), and eformat::old::convert().

◆ status() [2/2]

const uint32_t * eformat::write::FullEventFragment::status ( void  ) const
inline

Returns a pointer to the first status word to be used by this fragment

Definition at line 144 of file write/FullEventFragment.h.

144{ return m_node[1].base; }

◆ time() [1/2]

void eformat::write::FullEventFragment::time ( uint32_t  s)
inline

Changes the time this fragment was produced at

Parameters
sThe new value to set

Definition at line 179 of file write/FullEventFragment.h.

180 { m_node[2].base[1] = s; }

◆ time() [2/2]

uint32_t eformat::write::FullEventFragment::time ( void  ) const
inline

Returns the time for this fragment

Definition at line 185 of file write/FullEventFragment.h.

186 { return m_node[2].base[1]; }

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