yoda is hosted by Hepforge, IPPP Durham
YODA - Yet more Objects for Data Analysis  1.7.2

Persistency writer for YODA flat text format. More...

#include <WriterYODA.h>

Inheritance diagram for YODA::WriterYODA:
YODA::Writer

Static Public Member Functions

static Writercreate ()
 Singleton creation function. More...
 
Writing a single analysis object.
static void write (std::ostream &stream, const AnalysisObject &ao)
 Write out object ao to output stream stream. More...
 
template<typename T >
static std::enable_if< DerefableToAO< T >::value >::type write (std::ostream &stream, const T &ao)
 Write out pointer-like object ao to output stream stream. More...
 
static void write (const std::string &filename, const AnalysisObject &ao)
 Write out object ao to file filename. More...
 
template<typename T >
static std::enable_if< DerefableToAO< T >::value >::type write (const std::string &filename, const T &ao)
 Write out pointer-like object ao to file filename. More...
 
Writing multiple analysis objects by collection.
template<typename RANGE >
static std::enable_if< CIterable< RANGE >::value >::type write (std::ostream &stream, const RANGE &aos)
 
template<typename RANGE >
static std::enable_if< CIterable< RANGE >::value >::type write (const std::string &filename, const RANGE &aos)
 
Writing multiple analysis objects by iterator range.
template<typename AOITER >
static void write (std::ostream &stream, const AOITER &begin, const AOITER &end)
 
template<typename AOITER >
static void write (const std::string &filename, const AOITER &begin, const AOITER &end)
 

Protected Member Functions

void writeCounter (std::ostream &stream, const Counter &c)
 
void writeHisto1D (std::ostream &stream, const Histo1D &h)
 
void writeHisto2D (std::ostream &stream, const Histo2D &h)
 
void writeProfile1D (std::ostream &stream, const Profile1D &p)
 
void writeProfile2D (std::ostream &stream, const Profile2D &p)
 
void writeScatter1D (std::ostream &stream, const Scatter1D &s)
 
void writeScatter2D (std::ostream &stream, const Scatter2D &s)
 
void writeScatter3D (std::ostream &stream, const Scatter3D &s)
 
- Protected Member Functions inherited from YODA::Writer
virtual void writeHead (std::ostream &)
 Write any opening boilerplate required by the format to stream. More...
 
virtual void writeBody (std::ostream &stream, const AnalysisObject *ao)
 Write the body elements corresponding to AnalysisObject ao to stream. More...
 
virtual void writeBody (std::ostream &stream, const AnalysisObject &ao)
 Write the body elements corresponding to AnalysisObject pointer ao to stream. More...
 
template<typename T >
std::enable_if< DerefableToAO< T >::value >::type writeBody (std::ostream &stream, const T &ao)
 Write the body elements corresponding to AnalysisObject ao to stream. More...
 
virtual void writeFoot (std::ostream &stream)
 Write any closing boilerplate required by the format to stream. More...
 

Additional Inherited Members

- Public Member Functions inherited from YODA::Writer
virtual ~Writer ()
 Virtual destructor. More...
 
void setPrecision (int precision)
 Set precision of numerical quantities in this writer's output. More...
 
void useCompression (bool compress=true)
 Use libz compression? More...
 
void write (const std::string &filename, const AnalysisObject &ao)
 Write out object ao to file filename. More...
 
void write (std::ostream &stream, const AnalysisObject &ao)
 Write out object ao to output stream stream. More...
 
template<typename T >
std::enable_if< DerefableToAO< T >::value >::type write (std::ostream &stream, const T &ao)
 Write out pointer-like object ao to output stream stream. More...
 
template<typename T >
std::enable_if< DerefableToAO< T >::value >::type write (const std::string &filename, const T &ao)
 Write out pointer-like object ao to file filename. More...
 
void write (std::ostream &stream, const std::vector< const AnalysisObject *> &aos)
 
template<typename RANGE >
std::enable_if< CIterable< RANGE >::value >::type write (std::ostream &stream, const RANGE &aos)
 
template<typename RANGE >
std::enable_if< CIterable< RANGE >::value >::type write (const std::string &filename, const RANGE &aos)
 Write out a collection of objects objs to file filename. More...
 
template<typename AOITER >
void write (std::ostream &stream, const AOITER &begin, const AOITER &end)
 
template<typename AOITER >
void write (const std::string &filename, const AOITER &begin, const AOITER &end)
 

Detailed Description

Persistency writer for YODA flat text format.

Definition at line 16 of file WriterYODA.h.

Member Function Documentation

◆ create()

Writer & YODA::WriterYODA::create ( )
static

Singleton creation function.

Definition at line 20 of file WriterYODA.cc.

References YODA::Writer::setPrecision().

20  {
21  static WriterYODA _instance;
22  _instance.setPrecision(6);
23  return _instance;
24  }

◆ write() [1/8]

static void YODA::WriterYODA::write ( std::ostream &  stream,
const AnalysisObject ao 
)
inlinestatic

Write out object ao to output stream stream.

Definition at line 11 of file WriterYODA.h.

12  {
13 

◆ write() [2/8]

template<typename T >
static std::enable_if<DerefableToAO<T>::value>::type YODA::WriterYODA::write ( std::ostream &  stream,
const T &  ao 
)
inlinestatic

Write out pointer-like object ao to output stream stream.

Definition at line 18 of file WriterYODA.h.

26 :
27 

◆ write() [3/8]

static void YODA::WriterYODA::write ( const std::string &  filename,
const AnalysisObject ao 
)
inlinestatic

Write out object ao to file filename.

Definition at line 21 of file WriterYODA.h.

26  :
27 
28  void writeCounter(std::ostream& stream, const Counter& c);

◆ write() [4/8]

template<typename T >
static std::enable_if<DerefableToAO<T>::value>::type YODA::WriterYODA::write ( const std::string &  filename,
const T &  ao 
)
inlinestatic

Write out pointer-like object ao to file filename.

Definition at line 33 of file WriterYODA.h.

◆ write() [5/8]

template<typename RANGE >
static std::enable_if<CIterable<RANGE>::value>::type YODA::WriterYODA::write ( std::ostream &  stream,
const RANGE &  aos 
)
inlinestatic

Definition at line 43 of file WriterYODA.h.

43  { }
44 
45  };

◆ write() [6/8]

template<typename RANGE >
static std::enable_if<CIterable<RANGE>::value>::type YODA::WriterYODA::write ( const std::string &  filename,
const RANGE &  aos 
)
inlinestatic

Definition at line 49 of file WriterYODA.h.

◆ write() [7/8]

template<typename AOITER >
static void YODA::WriterYODA::write ( std::ostream &  stream,
const AOITER &  begin,
const AOITER &  end 
)
inlinestatic

Write out the objects specified by start iterator begin and end iterator end to output stream stream.

Todo:
Add SFINAE trait checking for AOITER = DerefableToAO

Definition at line 69 of file WriterYODA.h.

◆ write() [8/8]

template<typename AOITER >
static void YODA::WriterYODA::write ( const std::string &  filename,
const AOITER &  begin,
const AOITER &  end 
)
inlinestatic

Write out the objects specified by start iterator begin and end iterator end to file filename.

Todo:
Add SFINAE trait checking for AOITER = DerefableToAO

Definition at line 78 of file WriterYODA.h.

◆ writeCounter()

void YODA::WriterYODA::writeCounter ( std::ostream &  stream,
const Counter c 
)
protectedvirtual

Implements YODA::Writer.

Definition at line 51 of file WriterYODA.cc.

51  {
52  ios_base::fmtflags oldflags = os.flags();
53  os << scientific << showpoint << setprecision(_precision);
54 
55  os << "BEGIN " << _iotypestr("COUNTER") << " " << c.path() << "\n";
56  _writeAnnotations(os, c);
57  os << "# sumW\t sumW2\t numEntries\n";
58  os << c.sumW() << "\t" << c.sumW2() << "\t" << c.numEntries() << "\n";
59  os << "END " << _iotypestr("COUNTER") << "\n";
60 
61  os.flags(oldflags);
62  }

◆ writeHisto1D()

void YODA::WriterYODA::writeHisto1D ( std::ostream &  stream,
const Histo1D h 
)
protectedvirtual

Implements YODA::Writer.

Definition at line 65 of file WriterYODA.cc.

65  {
66  ios_base::fmtflags oldflags = os.flags();
67  os << scientific << showpoint << setprecision(_precision);
68 
69  os << "BEGIN " << _iotypestr("HISTO1D") << " " << h.path() << "\n";
70  _writeAnnotations(os, h);
71  try {
72  //if ( h.totalDbn().effNumEntries() > 0 ) {
73  os << "# Mean: " << h.xMean() << "\n";
74  os << "# Area: " << h.integral() << "\n";
75  } catch (LowStatsError& e) {
76  //
77  }
78  os << "# ID\t ID\t sumw\t sumw2\t sumwx\t sumwx2\t numEntries\n";
79  os << "Total \tTotal \t";
80  os << h.totalDbn().sumW() << "\t" << h.totalDbn().sumW2() << "\t";
81  os << h.totalDbn().sumWX() << "\t" << h.totalDbn().sumWX2() << "\t";
82  os << h.totalDbn().numEntries() << "\n";
83  os << "Underflow\tUnderflow\t";
84  os << h.underflow().sumW() << "\t" << h.underflow().sumW2() << "\t";
85  os << h.underflow().sumWX() << "\t" << h.underflow().sumWX2() << "\t";
86  os << h.underflow().numEntries() << "\n";
87  os << "Overflow\tOverflow\t";
88  os << h.overflow().sumW() << "\t" << h.overflow().sumW2() << "\t";
89  os << h.overflow().sumWX() << "\t" << h.overflow().sumWX2() << "\t";
90  os << h.overflow().numEntries() << "\n";
91  os << "# xlow\t xhigh\t sumw\t sumw2\t sumwx\t sumwx2\t numEntries\n";
92  for (const HistoBin1D& b : h.bins()) {
93  os << b.xMin() << "\t" << b.xMax() << "\t";
94  os << b.sumW() << "\t" << b.sumW2() << "\t";
95  os << b.sumWX() << "\t" << b.sumWX2() << "\t";
96  os << b.numEntries() << "\n";
97  }
98  os << "END " << _iotypestr("HISTO1D") << "\n";
99 
100  os.flags(oldflags);
101  }

◆ writeHisto2D()

void YODA::WriterYODA::writeHisto2D ( std::ostream &  stream,
const Histo2D h 
)
protectedvirtual
Todo:
Disabled for now, reinstate with a full set of outflow info to allow marginalisation

Implements YODA::Writer.

Definition at line 104 of file WriterYODA.cc.

104  {
105  ios_base::fmtflags oldflags = os.flags();
106  os << scientific << showpoint << setprecision(_precision);
107 
108  os << "BEGIN " << _iotypestr("HISTO2D") << " " << h.path() << "\n";
109  _writeAnnotations(os, h);
110  try {
111  //if ( h.totalDbn().numEntries() > 0 )
112  os << "# Mean: (" << h.xMean() << ", " << h.yMean() << ")\n";
113  os << "# Volume: " << h.integral() << "\n";
114  } catch (LowStatsError& e) {
115  //
116  }
117  os << "# ID\t ID\t sumw\t sumw2\t sumwx\t sumwx2\t sumwy\t sumwy2\t sumwxy\t numEntries\n";
118  // Total distribution
119  const Dbn2D& td = h.totalDbn();
120  os << "Total \tTotal \t";
121  os << td.sumW() << "\t" << td.sumW2() << "\t";
122  os << td.sumWX() << "\t" << td.sumWX2() << "\t";
123  os << td.sumWY() << "\t" << td.sumWY2() << "\t";
124  os << td.sumWXY() << "\t";
125  os << td.numEntries() << "\n";
126  // Outflows
128  os << "# 2D outflow persistency not currently supported until API is stable\n";
129  // for (int ix = -1; ix <= 1; ++ix) {
130  // for (int iy = -1; iy <= 1; ++iy) {
131  // if (ix == 0 && iy == 0) continue;
132  // os << "Outflow\t" << ix << ":" << iy << "\t";
133  // const Dbn2D& d = h.outflow(ix, iy);
134  // os << d.sumW() << "\t" << d.sumW2() << "\t";
135  // os << d.sumWX() << "\t" << d.sumWX2() << "\t";
136  // os << d.sumWY() << "\t" << d.sumWY2() << "\t";
137  // os << d.sumWXY() << "\t";
138  // os << d.numEntries() << "\n";
139  // }
140  // }
141  // Bins
142  os << "# xlow\t xhigh\t ylow\t yhigh\t sumw\t sumw2\t sumwx\t sumwx2\t sumwy\t sumwy2\t sumwxy\t numEntries\n";
143  for (const HistoBin2D& b : h.bins()) {
144  os << b.xMin() << "\t" << b.xMax() << "\t";
145  os << b.yMin() << "\t" << b.yMax() << "\t";
146  os << b.sumW() << "\t" << b.sumW2() << "\t";
147  os << b.sumWX() << "\t" << b.sumWX2() << "\t";
148  os << b.sumWY() << "\t" << b.sumWY2() << "\t";
149  os << b.sumWXY() << "\t";
150  os << b.numEntries() << "\n";
151  }
152  os << "END " << _iotypestr("HISTO2D") << "\n";
153 
154  os.flags(oldflags);
155  }

◆ writeProfile1D()

void YODA::WriterYODA::writeProfile1D ( std::ostream &  stream,
const Profile1D p 
)
protectedvirtual

Implements YODA::Writer.

Definition at line 158 of file WriterYODA.cc.

158  {
159  ios_base::fmtflags oldflags = os.flags();
160  os << scientific << showpoint << setprecision(_precision);
161 
162  os << "BEGIN " << _iotypestr("PROFILE1D") << " " << p.path() << "\n";
163  _writeAnnotations(os, p);
164  os << "# ID\t ID\t sumw\t sumw2\t sumwx\t sumwx2\t sumwy\t sumwy2\t numEntries\n";
165  os << "Total \tTotal \t";
166  os << p.totalDbn().sumW() << "\t" << p.totalDbn().sumW2() << "\t";
167  os << p.totalDbn().sumWX() << "\t" << p.totalDbn().sumWX2() << "\t";
168  os << p.totalDbn().sumWY() << "\t" << p.totalDbn().sumWY2() << "\t";
169  os << p.totalDbn().numEntries() << "\n";
170  os << "Underflow\tUnderflow\t";
171  os << p.underflow().sumW() << "\t" << p.underflow().sumW2() << "\t";
172  os << p.underflow().sumWX() << "\t" << p.underflow().sumWX2() << "\t";
173  os << p.underflow().sumWY() << "\t" << p.underflow().sumWY2() << "\t";
174  os << p.underflow().numEntries() << "\n";
175  os << "Overflow\tOverflow\t";
176  os << p.overflow().sumW() << "\t" << p.overflow().sumW2() << "\t";
177  os << p.overflow().sumWX() << "\t" << p.overflow().sumWX2() << "\t";
178  os << p.overflow().sumWY() << "\t" << p.overflow().sumWY2() << "\t";
179  os << p.overflow().numEntries() << "\n";
180  os << "# xlow\t xhigh\t sumw\t sumw2\t sumwx\t sumwx2\t sumwy\t sumwy2\t numEntries\n";
181  for (const ProfileBin1D& b : p.bins()) {
182  os << b.xMin() << "\t" << b.xMax() << "\t";
183  os << b.sumW() << "\t" << b.sumW2() << "\t";
184  os << b.sumWX() << "\t" << b.sumWX2() << "\t";
185  os << b.sumWY() << "\t" << b.sumWY2() << "\t";
186  os << b.numEntries() << "\n";
187  }
188  os << "END " << _iotypestr("PROFILE1D") << "\n";
189 
190  os.flags(oldflags);
191  }

◆ writeProfile2D()

void YODA::WriterYODA::writeProfile2D ( std::ostream &  stream,
const Profile2D p 
)
protectedvirtual
Todo:
Disabled for now, reinstate with a full set of outflow info to allow marginalisation

Implements YODA::Writer.

Definition at line 194 of file WriterYODA.cc.

194  {
195  ios_base::fmtflags oldflags = os.flags();
196  os << scientific << showpoint << setprecision(_precision);
197 
198  os << "BEGIN " << _iotypestr("PROFILE2D") << " " << p.path() << "\n";
199  _writeAnnotations(os, p);
200  os << "# sumw\t sumw2\t sumwx\t sumwx2\t sumwy\t sumwy2\t sumwz\t sumwz2\t sumwxy\t numEntries\n";
201  // Total distribution
202  const Dbn3D& td = p.totalDbn();
203  os << "Total \tTotal \t";
204  os << td.sumW() << "\t" << td.sumW2() << "\t";
205  os << td.sumWX() << "\t" << td.sumWX2() << "\t";
206  os << td.sumWY() << "\t" << td.sumWY2() << "\t";
207  os << td.sumWZ() << "\t" << td.sumWZ2() << "\t";
208  os << td.sumWXY() << "\t"; // << td.sumWXZ() << "\t" << td.sumWYZ() << "\t";
209  os << td.numEntries() << "\n";
210  // Outflows
212  os << "# 2D outflow persistency not currently supported until API is stable\n";
213  // for (int ix = -1; ix <= 1; ++ix) {
214  // for (int iy = -1; iy <= 1; ++iy) {
215  // if (ix == 0 && iy == 0) continue;
216  // os << "Outflow\t" << ix << ":" << iy << "\t";
217  // const Dbn3D& d = p.outflow(ix, iy);
218  // os << d.sumW() << "\t" << d.sumW2() << "\t";
219  // os << d.sumWX() << "\t" << d.sumWX2() << "\t";
220  // os << d.sumWY() << "\t" << d.sumWY2() << "\t";
221  // os << d.sumWZ() << "\t" << d.sumWZ2() << "\t";
222  // os << d.sumWXY() << "\t"; // << d.sumWXZ() << "\t" << d.sumWYZ() << "\t";
223  // os << d.numEntries() << "\n";
224  // }
225  // }
226  // Bins
227  os << "# xlow\t xhigh\t ylow\t yhigh\t sumw\t sumw2\t sumwx\t sumwx2\t sumwy\t sumwy2\t sumwz\t sumwz2\t sumwxy\t numEntries\n";
228  for (const ProfileBin2D& b : p.bins()) {
229  os << b.xMin() << "\t" << b.xMax() << "\t";
230  os << b.yMin() << "\t" << b.yMax() << "\t";
231  os << b.sumW() << "\t" << b.sumW2() << "\t";
232  os << b.sumWX() << "\t" << b.sumWX2() << "\t";
233  os << b.sumWY() << "\t" << b.sumWY2() << "\t";
234  os << b.sumWZ() << "\t" << b.sumWZ2() << "\t";
235  os << b.sumWXY() << "\t"; // << b.sumWXZ() << "\t" << b.sumWYZ() << "\t";
236  os << b.numEntries() << "\n";
237  }
238  os << "END " << _iotypestr("PROFILE2D") << "\n";
239 
240  os.flags(oldflags);
241  }

◆ writeScatter1D()

void YODA::WriterYODA::writeScatter1D ( std::ostream &  stream,
const Scatter1D s 
)
protectedvirtual

Implements YODA::Writer.

Definition at line 244 of file WriterYODA.cc.

244  {
245  ios_base::fmtflags oldflags = os.flags();
246  os << scientific << showpoint << setprecision(_precision);
247 
248  os << "BEGIN " << _iotypestr("SCATTER1D") << " " << s.path() << "\n";
249  //first write the Variations, a dummy annotation which
250  //contains the additional columns which will be written out
251  //for sytematic variations
252  YAML::Emitter out;
253  out << YAML::Flow ;
254  out << s.variations();
255  os << "Variations" << ": " << out.c_str() << "\n";
256  // then write the regular annotations
257  _writeAnnotations(os, s);
258 
259  std::vector<std::string> variations= s.variations();
260 
261  //write headers
262  std::string headers="# xval\t ";
263  for (const auto &source : variations){
264  headers+=" xerr-"+source+"\t xerr-"+source+"\t";
265  }
266  os << headers << "\n";
267 
268  //write points
269  for (const Point1D& pt : s.points()) {
270  // fill central value
271  os << pt.x();
272  // fill errors for variations. The first should always be "" which is nominal.
273  // Assumes here that all points in the Scatter have the same
274  // variations... if not a range error will get thrown from
275  // the point when the user tries to access a variation it
276  // doesn't have... @todo maybe better way to do this?
277  for (const auto &source : variations){
278  os << "\t" << pt.xErrMinus(source) << "\t" << pt.xErrPlus(source) ;
279  }
280  os << "\n";
281  }
282  os << "END " << _iotypestr("SCATTER1D") << "\n";
283 
284  os << flush;
285  os.flags(oldflags);
286  }

◆ writeScatter2D()

void YODA::WriterYODA::writeScatter2D ( std::ostream &  stream,
const Scatter2D s 
)
protectedvirtual
Todo:
Change ordering to {vals} {errs} {errs} ...
Todo:
Change ordering to {vals} {errs} {errs} ...

Implements YODA::Writer.

Definition at line 289 of file WriterYODA.cc.

289  {
290  ios_base::fmtflags oldflags = os.flags();
291  os << scientific << showpoint << setprecision(_precision);
292 
293  os << "BEGIN " << _iotypestr("SCATTER2D") << " " << s.path() << "\n";
294  //first write the Variations, a dummy annotation which
295  //contains the additional columns which will be written out
296  //for sytematic variations
297  YAML::Emitter out;
298  out << YAML::Flow ;
299  out << s.variations();
300  os << "Variations" << ": " << out.c_str() << "\n";
301  // then write the regular annotations
302  _writeAnnotations(os, s);
303 
304  std::vector<std::string> variations= s.variations();
305  //write headers
307  std::string headers="# xval\t xerr-\t xerr+\t yval\t";
308  for (const auto &source : variations){
309  headers+=" yerr-"+source+"\t yerr-"+source+"\t";
310  }
311  os << headers << "\n";
312 
313  //write points
314  for (const Point2D& pt : s.points()) {
316  // fill central value
317  os << pt.x() << "\t" << pt.xErrMinus() << "\t" << pt.xErrPlus() << "\t";
318  os << pt.y();
319  // fill errors for variations. The first should always be "" which is nominal.
320  // Assumes here that all points in the Scatter have the same
321  // variations... if not a range error will get thrown from
322  // the point when the user tries to access a variation it
323  // doesn't have... @todo maybe better way to do this?
324  for (const auto &source : variations){
325  os << "\t" << pt.yErrMinus(source) << "\t" << pt.yErrPlus(source) ;
326  }
327  os << "\n";
328  }
329  os << "END " << _iotypestr("SCATTER2D") << "\n";
330 
331  os << flush;
332  os.flags(oldflags);
333  }

◆ writeScatter3D()

void YODA::WriterYODA::writeScatter3D ( std::ostream &  stream,
const Scatter3D s 
)
protectedvirtual
Todo:
Change ordering to {vals} {errs} {errs} ...
Todo:
Change ordering to {vals} {errs} {errs} ...

Implements YODA::Writer.

Definition at line 336 of file WriterYODA.cc.

336  {
337  ios_base::fmtflags oldflags = os.flags();
338  os << scientific << showpoint << setprecision(_precision);
339 
340  os << "BEGIN " << _iotypestr("SCATTER3D") << " " << s.path() << "\n";
341  //first write the Variations, a dummy annotation which
342  //contains the additional columns which will be written out
343  //for sytematic variations
344  YAML::Emitter out;
345  out << YAML::Flow ;
346  out << s.variations();
347  os << "Variations" << ": " << out.c_str() << "\n";
348  // then write the regular annotations
349  _writeAnnotations(os, s);
350 
351  std::vector<std::string> variations= s.variations();
352  //write headers
354  std::string headers="# xval\t xerr-\t xerr+\t yval\t yerr-\t yerr+\t zval\t ";
355  for (const auto &source : variations){
356  headers+=" zerr-"+source+"\t zerr-"+source+"\t";
357  }
358  os << headers << "\n";
359 
360  //write points
361  for (const Point3D& pt : s.points()) {
363  // fill central value
364  os << pt.x() << "\t" << pt.xErrMinus() << "\t" << pt.xErrPlus() << "\t";
365  os << pt.y() << "\t" << pt.yErrMinus() << "\t" << pt.yErrPlus() << "\t";
366  os << pt.z();
367  // fill errors for variations. The first should always be "" which is nominal.
368  // Assumes here that all points in the Scatter have the same
369  // variations... if not a range error will get thrown from
370  // the point when the user tries to access a variation it
371  // doesn't have... @todo maybe better way to do this?
372  for (const auto &source : variations){
373  os << "\t" << pt.zErrMinus(source) << "\t" << pt.zErrPlus(source) ;
374  }
375  os << "\n";
376  }
377  os << "END " << _iotypestr("SCATTER3D") << "\n";
378 
379  os << flush;
380  os.flags(oldflags);
381  }

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