thepeg is hosted by Hepforge, IPPP Durham
ThePEG 2.3.0
DataPointSet.h
1// -*- C++ -*-
2//
3// DataPointSet.h is a part of ThePEG - Toolkit for HEP Event Generation
4// Copyright (C) 1999-2019 Leif Lonnblad
5//
6// ThePEG is licenced under version 3 of the GPL, see COPYING for details.
7// Please respect the MCnet academic guidelines, see GUIDELINES for details.
8//
9#ifndef LWH_DataPointSet_H
10#define LWH_DataPointSet_H
11//
12// This is the declaration of the DataPointSet class representing
13//
14
15
16#include <vector>
17#include <limits>
18#include <cmath>
19#include <algorithm>
20#include "AIDataPointSet.h"
21#include "ManagedObject.h"
22#include "DataPoint.h"
23
24namespace LWH {
25
26using namespace AIDA;
27
33class DataPointSet: public IDataPointSet, public ManagedObject {
34
35public:
36
41 DataPointSet(int D): dim(D) {}
42
46 virtual ~DataPointSet() {}
47
51 IAnnotation & annotation() {
52 throw std::runtime_error("LWH cannot handle annotations");
53 }
54
58 const IAnnotation & annotation() const {
59 throw std::runtime_error("LWH cannot handle annotations");
60 }
61
66 std::string title() const {
67 return theTitle;
68 }
69
74 std::string name() const {
75 return theTitle;
76 }
77
83 bool setTitle(const std::string & title) {
85 return true;
86 }
87
93 int dimension() const {
94 return dim;
95 }
96
101 void clear() {
102 dset.clear();
103 }
104
110 int size() const {
111 return dset.size();
112 }
113
119 IDataPoint * point(int index) {
120 return &(dset[index]);
121 }
122
136 bool setCoordinate(int coord,
137 const std::vector<double> & val,
138 const std::vector<double> & err) {
139 return setCoordinate(coord, val, err, err);
140 }
141
157 bool setCoordinate(int coord,
158 const std::vector<double> & val,
159 const std::vector<double> & errp,
160 const std::vector<double> & errm) {
161 if ( coord < 0 || coord >= dimension() ) return false;
162 if ( val.size() != dset.size() || errp.size() != dset.size() ||
163 errm.size() != dset.size() ) return false;
164 for ( int i = 0, N = val.size(); i < N; ++i ) {
165 dset[i].coordinate(coord)->setValue(val[i]);
166 dset[i].coordinate(coord)->setErrorPlus(errp[i]);
167 dset[i].coordinate(coord)->setErrorMinus(errm[i]);
168 }
169 return true;
170 }
171
176 const IDataPoint * point(int index) const {
177 if ( index < 0 || unsigned(index) >= dset.size() ) return 0;
178 return &(dset[index]);
179 }
180
185 IDataPoint * addPoint() {
186 dset.push_back(DataPoint(dimension()));
187 return &(dset.back());
188 }
189
196 bool addPoint(const IDataPoint & point) {
197 if ( dimension() && dimension() != point.dimension() ) return false;
198 dset.push_back(DataPoint(point));
199 return true;
200 }
201
207 bool removePoint(int index) {
208 if ( index < 0 || unsigned(index) >= dset.size() ) return false;
209 dset.erase(dset.begin() + index);
210 return true;
211 }
212
220 double lowerExtent(int coord) const {
221 if ( dset.empty() ) return std::numeric_limits<double>::quiet_NaN();
222 if ( coord < 0 || coord >= dimension() )
223 return std::numeric_limits<double>::quiet_NaN();
224 double low = dset[0].coordinate(coord)->value();
225 for ( int i = 1, N = dset.size(); i < N; ++i )
226 low = std::min(low, dset[i].coordinate(coord)->value());
227 return low;
228 }
229
237 double upperExtent(int coord) const {
238 if ( dset.empty() ) return std::numeric_limits<double>::quiet_NaN();
239 if ( coord < 0 || coord >= dimension() )
240 return std::numeric_limits<double>::quiet_NaN();
241 double upp = dset[0].coordinate(coord)->value();
242 for ( int i = 1, N = dset.size(); i < N; ++i )
243 upp = std::max(upp, dset[i].coordinate(coord)->value());
244 return upp;
245 }
246
253 bool scale(double scale) {
254 for ( int i = 0, N = dset.size(); i < N; ++i )
255 for ( int j = 0, M = dset[i].dimension(); j < M; ++j ) {
256 IMeasurement * m = dset[i].coordinate(j);
257 m->setValue(m->value()*scale);
258 m->setErrorPlus(m->errorPlus()*scale);
259 m->setErrorMinus(m->errorPlus()*scale);
260 }
261 return true;
262 }
263
270 bool scaleValues(double scale) {
271 for ( int i = 0, N = dset.size(); i < N; ++i )
272 for ( int j = 0, M = dset[i].dimension(); j < M; ++j ) {
273 IMeasurement * m = dset[i].coordinate(j);
274 m->setValue(m->value()*scale);
275 }
276 return true;
277 }
278
285 bool scaleErrors(double scale) {
286 for ( int i = 0, N = dset.size(); i < N; ++i )
287 for ( int j = 0, M = dset[i].dimension(); j < M; ++j ) {
288 IMeasurement * m = dset[i].coordinate(j);
289 m->setErrorPlus(m->errorPlus()*scale);
290 m->setErrorMinus(m->errorPlus()*scale);
291 }
292 return true;
293 }
294
299 void * cast(const std::string &) const {
300 return 0;
301 }
302
306 bool writeXML(std::ostream & os, std::string path, std::string name) {
307 os << " <dataPointSet name=\"" << name
308 << "\"\n title=\"" << title()
309 << "\" path=\"" << path
310 << "\" dimension=\"" << dimension() << "\">\n";
311 for ( int d = 0; d < dimension(); ++d )
312 os << " <dimension dim=\"" << d << "\" title=\"unknown\" />\n";
313 for ( int i = 0, N = size(); i < N; ++i ) {
314 os << " <dataPoint>\n";
315 for ( int j = 0, M = dimension(); j < M; ++j )
316 os << " <measurement value=\""
317 << point(i)->coordinate(j)->value()
318 << "\" errorPlus=\""
319 << point(i)->coordinate(j)->errorPlus()
320 << "\" errorMinus=\""
321 << point(i)->coordinate(j)->errorMinus()
322 << "\"/>\n";
323 os << " </dataPoint>\n";
324 }
325 os << " </dataPointSet>" << std::endl;
326 return true;
327 }
328
334 bool writeFLAT(std::ostream & os, std::string path, std::string name) {
335 os << "# " << path << "/" << name << " " << size()
336 << " \"" << title() << " \" dimension " << dimension() << std::endl;
337 for ( int i = 0, N = size(); i < N; ++i ) {
338 for ( int j = 0, M = dimension(); j < M; ++j )
339 os << point(i)->coordinate(j)->value() << " ";
340 for ( int j = 0, M = dimension(); j < M; ++j )
341 os << point(i)->coordinate(j)->errorPlus() << " ";
342 for ( int j = 0, M = dimension(); j < M; ++j )
343 os << point(i)->coordinate(j)->errorMinus() << " ";
344 os << std::endl;
345 }
346 os << std::endl;
347 return true;
348 }
349
350private:
351
353 std::string theTitle;
354
358 std::vector<DataPoint> dset;
359
363 unsigned int dim;
364
365
366};
367
368}
369
370#endif /* LWH_DataPointSet_H */
An DataPointSet represents a binned histogram axis.
Definition: DataPointSet.h:33
virtual ~DataPointSet()
Destructor.
Definition: DataPointSet.h:46
bool scale(double scale)
Scales the values and the errors of all the measurements of each point by a given factor.
Definition: DataPointSet.h:253
std::string theTitle
The title.
Definition: DataPointSet.h:353
unsigned int dim
The dimension of the points in this set.
Definition: DataPointSet.h:363
bool writeXML(std::ostream &os, std::string path, std::string name)
Write out the data set in the AIDA xml format.
Definition: DataPointSet.h:306
std::string title() const
Get the data set's title.
Definition: DataPointSet.h:66
std::vector< DataPoint > dset
The included data points.
Definition: DataPointSet.h:358
void clear()
Remove all the IDataPoints in the set.
Definition: DataPointSet.h:101
std::string name() const
Get the data set's title.
Definition: DataPointSet.h:74
double lowerExtent(int coord) const
Get the lower value for a give axis.
Definition: DataPointSet.h:220
bool setCoordinate(int coord, const std::vector< double > &val, const std::vector< double > &err)
Set the values and errors of a given coordinate all at once.
Definition: DataPointSet.h:136
IDataPoint * addPoint()
Add a new empty IDataPoint at the end of the set.
Definition: DataPointSet.h:185
IAnnotation & annotation()
Not implemented in LWH.
Definition: DataPointSet.h:51
int dimension() const
Get the dimension of the IDataPoints that can be stored in the set.
Definition: DataPointSet.h:93
bool setTitle(const std::string &title)
Set the data set's title.
Definition: DataPointSet.h:83
bool addPoint(const IDataPoint &point)
Add a copy of an IDataPoint at the end of the set.
Definition: DataPointSet.h:196
bool scaleValues(double scale)
Scales the values of all the measurements of each point by a given factor.
Definition: DataPointSet.h:270
double upperExtent(int coord) const
Get the upper value for a give axis.
Definition: DataPointSet.h:237
bool scaleErrors(double scale)
Scales the errors of all the measurements of each point by a given factor.
Definition: DataPointSet.h:285
const IAnnotation & annotation() const
Not implemented in LWH.
Definition: DataPointSet.h:58
IDataPoint * point(int index)
Get the IDataPoint at a give index in the set.
Definition: DataPointSet.h:119
bool writeFLAT(std::ostream &os, std::string path, std::string name)
Write out the data set in a flat text file suitable for eg.
Definition: DataPointSet.h:334
void * cast(const std::string &) const
Not implemented in LWH.
Definition: DataPointSet.h:299
int size() const
Get the current size of the IDataPointSet, i.e.
Definition: DataPointSet.h:110
bool removePoint(int index)
Remove the IDataPoint at a given index.
Definition: DataPointSet.h:207
DataPointSet(int D)
Standard constructor takes the dimension, D, of the data points as argument.
Definition: DataPointSet.h:41
bool setCoordinate(int coord, const std::vector< double > &val, const std::vector< double > &errp, const std::vector< double > &errm)
Set the values and errors of a given coordinate all at once.
Definition: DataPointSet.h:157
const IDataPoint * point(int index) const
Return the data point at the given index.
Definition: DataPointSet.h:176
An DataPoint represents a binned histogram axis.
Definition: DataPoint.h:31
The creator of trees.
Definition: ManagedObject.h:25
The LWH namespace contains a Light-Weight Histogram package which implements the most rudimentary his...