Back to home page

EIC code displayed by LXR

 
 

    


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