Warning, /include/Geant4/tools/histo/dps is written in an unsupported language. File is not indexed.
0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003
0004 #ifndef tools_histo_dps
0005 #define tools_histo_dps
0006
0007 // data point set.
0008
0009 #include <vector>
0010 #include <string>
0011 #include "../mnmx"
0012
0013 namespace tools {
0014 namespace histo {
0015
0016 class measurement {
0017 static const std::string& s_class() {
0018 static const std::string s_v("tools::histo::measurement");
0019 return s_v;
0020 }
0021 public:
0022 measurement():m_value(0),m_error_plus(0),m_error_minus(0){
0023 }
0024 measurement(double a_value,double a_error_plus,double a_error_minus)
0025 :m_value(a_value)
0026 ,m_error_plus(a_error_plus)
0027 ,m_error_minus(a_error_minus)
0028 {
0029 }
0030 virtual ~measurement(){
0031 }
0032 public:
0033 measurement(const measurement& a_from)
0034 :m_value(a_from.m_value)
0035 ,m_error_plus(a_from.m_error_plus)
0036 ,m_error_minus(a_from.m_error_minus)
0037 {
0038 }
0039 measurement& operator=(const measurement& a_from) {
0040 if(&a_from==this) return *this;
0041 m_value = a_from.m_value;
0042 m_error_plus = a_from.m_error_plus;
0043 m_error_minus = a_from.m_error_minus;
0044 return *this;
0045 }
0046 public:
0047 double value() const {return m_value;}
0048 double error_plus() const {return m_error_plus;}
0049 double error_minus() const {return m_error_minus;}
0050 void set_value(double a_v) {m_value = a_v;}
0051 void set_error_plus(double a_v) {m_error_plus = a_v;}
0052 void set_error_minus(double a_v) {m_error_minus = a_v;}
0053 protected:
0054 double m_value;
0055 double m_error_plus;
0056 double m_error_minus;
0057 };
0058
0059 class data_point {
0060 static const std::string& s_class() {
0061 static const std::string s_v("tools::histo::data_point");
0062 return s_v;
0063 }
0064 public:
0065 data_point(unsigned int a_dim):m_measurements(a_dim){
0066 }
0067 virtual ~data_point() {
0068 }
0069 public:
0070 data_point(const data_point& a_from)
0071 :m_measurements(a_from.m_measurements)
0072 {
0073 }
0074 data_point& operator=(const data_point& a_from) {
0075 if(&a_from==this) return *this;
0076 m_measurements = a_from.m_measurements;
0077 return *this;
0078 }
0079 public: //AIDA/Idata_point
0080 size_t dimension() const {return m_measurements.size();}
0081 measurement& coordinate(unsigned int a_coord) {
0082 //WARNING : no check done on a_coord vs m_dim.
0083 return m_measurements[a_coord];
0084 }
0085 const measurement& coordinate(unsigned int a_coord) const {
0086 //WARNING : no check done on a_coord vs m_dim.
0087 return m_measurements[a_coord];
0088 }
0089 protected:
0090 std::vector<measurement> m_measurements;
0091 };
0092
0093
0094 class dps {
0095 public:
0096 static const std::string& s_class() {
0097 static const std::string s_v("tools::histo::dps");
0098 return s_v;
0099 }
0100 public:
0101 dps():m_dim(0){}
0102
0103 dps(const std::string& a_title,unsigned int a_dim)
0104 :m_title(a_title),m_dim(a_dim)
0105 {}
0106 virtual ~dps(){}
0107 public:
0108 dps(const dps& a_from)
0109 :m_title(a_from.m_title)
0110 ,m_dim(a_from.m_dim)
0111 ,m_points(a_from.m_points)
0112 {}
0113 dps& operator=(const dps& a_from) {
0114 if(&a_from==this) return *this;
0115 m_title = a_from.m_title;
0116 m_dim = a_from.m_dim;
0117 m_points = a_from.m_points;
0118 return *this;
0119 }
0120
0121 public:
0122 const std::string& title() const {return m_title;}
0123
0124 void set_title(const std::string& a_s) {m_title = a_s;}
0125
0126 unsigned int dimension() const {return m_dim;}
0127 void clear() {m_points.clear();}
0128 size_t size() const {return m_points.size();}
0129
0130 const data_point& point(size_t a_index) const {
0131 //WARNING : no check done on a_index.
0132 return m_points[a_index];
0133 }
0134 data_point& point(size_t a_index) {
0135 //WARNING : no check done on a_index.
0136 return m_points[a_index];
0137 }
0138
0139 data_point& add_point() {
0140 m_points.push_back(data_point(m_dim));
0141 return m_points.back();
0142 }
0143
0144 bool remove_point(size_t a_index) {
0145 bool done = false;
0146 if(a_index<m_points.size()){
0147 std::vector<data_point>::iterator it = m_points.begin();
0148 it += a_index;
0149 m_points.erase(it);
0150 done = true;
0151 }
0152 return done;
0153 }
0154
0155 bool lower_extent(unsigned int a_coord,double& a_value) const {
0156 if(m_points.empty()||(a_coord>=m_dim)){
0157 a_value = 0;
0158 return false;
0159 }
0160 std::vector<data_point>::const_iterator it = m_points.begin();
0161 a_value = (*it).coordinate(a_coord).value();
0162 ++it;
0163 for(;it!=m_points.end();++it) {
0164 a_value = min_of<double>(a_value,(*it).coordinate(a_coord).value());
0165 }
0166 return true;
0167 }
0168
0169 bool upper_extent(unsigned int a_coord,double& a_value) const {
0170 if(m_points.empty()||(a_coord>=m_dim)){
0171 a_value = 0;
0172 return false;
0173 }
0174 std::vector<data_point>::const_iterator it = m_points.begin();
0175 a_value = (*it).coordinate(a_coord).value();
0176 ++it;
0177 for(;it!=m_points.end();++it) {
0178 a_value = max_of<double>(a_value,(*it).coordinate(a_coord).value());
0179 }
0180 return true;
0181 }
0182
0183 void scale(double a_scale) {
0184 std::vector<data_point>::iterator it;
0185 for(it=m_points.begin();it!=m_points.end();++it) {
0186 for(unsigned int coord=0;coord<m_dim;coord++) {
0187 measurement& _m = (*it).coordinate(coord);
0188 _m.set_value(_m.value() * a_scale);
0189 _m.set_error_plus(_m.error_plus() * a_scale);
0190 _m.set_error_minus(_m.error_minus() * a_scale);
0191 }
0192 }
0193 }
0194
0195 void scale_value(double a_scale) {
0196 std::vector<data_point>::iterator it;
0197 for(it=m_points.begin();it!=m_points.end();++it) {
0198 for(unsigned int coord=0;coord<m_dim;coord++) {
0199 measurement& _m = (*it).coordinate(coord);
0200 _m.set_value(_m.value() * a_scale);
0201 }
0202 }
0203 }
0204
0205 void scale_errors(double a_scale) {
0206 std::vector<data_point>::iterator it;
0207 for(it=m_points.begin();it!=m_points.end();++it) {
0208 for(unsigned int coord=0;coord<m_dim;coord++) {
0209 measurement& _m = (*it).coordinate(coord);
0210 _m.set_error_plus(_m.error_plus() * a_scale);
0211 _m.set_error_minus(_m.error_minus() * a_scale);
0212 }
0213 }
0214 }
0215
0216 protected:
0217 std::string m_title;
0218 unsigned int m_dim;
0219 std::vector<data_point> m_points;
0220 };
0221
0222 }}
0223
0224 #endif