Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/tools/histo/c3d

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /externals/g4tools/include/tools/histo/c3d (Version 11.3.0) and /externals/g4tools/include/tools/histo/c3d (Version 11.1)


  1 // Copyright (C) 2010, Guy Barrand. All rights      1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
  2 // See the file tools.license for terms.            2 // See the file tools.license for terms.
  3                                                     3 
  4 #ifndef tools_histo_c3d                             4 #ifndef tools_histo_c3d
  5 #define tools_histo_c3d                             5 #define tools_histo_c3d
  6                                                     6 
  7 #include "base_cloud"                               7 #include "base_cloud"
  8                                                     8 
  9 #include "../mnmx"                                  9 #include "../mnmx"
 10                                                    10 
 11 #include "h3d"                                     11 #include "h3d"
 12                                                    12 
 13 namespace tools {                                  13 namespace tools {
 14 namespace histo {                                  14 namespace histo {
 15                                                    15 
 16 class c3d : public base_cloud {                    16 class c3d : public base_cloud {
 17 public:                                            17 public:
 18   static const std::string& s_class() {            18   static const std::string& s_class() {
 19     static const std::string s_v("tools::histo     19     static const std::string s_v("tools::histo::c3d");
 20     return s_v;                                    20     return s_v;
 21   }                                                21   }
 22 public:                                            22 public:
 23   bool set_title(const std::string&);              23   bool set_title(const std::string&);
 24   unsigned int dimension() const {return 3;}       24   unsigned int dimension() const {return 3;}
 25   bool reset();                                    25   bool reset();
 26   unsigned int entries() const;                    26   unsigned int entries() const;
 27 public:                                            27 public:
 28   double sum_of_weights() const;                   28   double sum_of_weights() const;
 29   bool convert_to_histogram();                     29   bool convert_to_histogram();
 30   bool is_converted() const;                       30   bool is_converted() const;
 31   bool scale(double);                              31   bool scale(double);
 32 public:                                            32 public:
 33   bool fill(double,double,double,double = 1);      33   bool fill(double,double,double,double = 1);
 34   double lower_edge_x() const;                     34   double lower_edge_x() const;
 35   double upper_edge_x() const;                     35   double upper_edge_x() const;
 36   double lower_edge_y() const;                     36   double lower_edge_y() const;
 37   double upper_edge_y() const;                     37   double upper_edge_y() const;
 38   double lower_edge_z() const;                     38   double lower_edge_z() const;
 39   double upper_edge_z() const;                     39   double upper_edge_z() const;
 40   double value_x(unsigned int) const;              40   double value_x(unsigned int) const;
 41   double value_y(unsigned int) const;              41   double value_y(unsigned int) const;
 42   double value_z(unsigned int) const;              42   double value_z(unsigned int) const;
 43   double weight(unsigned int) const;               43   double weight(unsigned int) const;
 44   double mean_x() const;                           44   double mean_x() const;
 45   double mean_y() const;                           45   double mean_y() const;
 46   double mean_z() const;                           46   double mean_z() const;
 47   double rms_x() const;                            47   double rms_x() const;
 48   double rms_y() const;                            48   double rms_y() const;
 49   double rms_z() const;                            49   double rms_z() const;
 50   bool convert(unsigned int,double,double,         50   bool convert(unsigned int,double,double,
 51                unsigned int,double,double,         51                unsigned int,double,double,
 52                unsigned int,double,double);        52                unsigned int,double,double);
 53   bool convert(const std::vector<double>&,         53   bool convert(const std::vector<double>&,
 54                        const std::vector<doubl     54                        const std::vector<double>&,
 55                        const std::vector<doubl     55                        const std::vector<double>&);
 56   const histo::h3d& histogram() const;             56   const histo::h3d& histogram() const;
 57   bool fill_histogram(histo::h3d& a_histo) con     57   bool fill_histogram(histo::h3d& a_histo) const {
 58     size_t number = m_xs.size();                   58     size_t number = m_xs.size();
 59     for(size_t index=0;index<number;index++) {     59     for(size_t index=0;index<number;index++) {
 60       if(!a_histo.fill(m_xs[index],m_ys[index]     60       if(!a_histo.fill(m_xs[index],m_ys[index],m_zs[index],m_ws[index])) return false;
 61     }                                              61     }
 62     return true;                                   62     return true;
 63   }                                                63   }
 64   bool set_conversion_parameters(unsigned int,     64   bool set_conversion_parameters(unsigned int,double,double,
 65                                  unsigned int,     65                                  unsigned int,double,double,
 66                                  unsigned int,     66                                  unsigned int,double,double);
 67                                                    67 
 68   bool set_histogram(h3d* a_histo){ //we take      68   bool set_histogram(h3d* a_histo){ //we take ownership of a_histo.
 69     reset();                                       69     reset();
 70     m_histo = a_histo;                             70     m_histo = a_histo;
 71     return true;                                   71     return true;
 72   }                                                72   }
 73 public:                                            73 public:
 74   c3d();                                           74   c3d();
 75   c3d(const std::string&,int=base_cloud::UNLIM     75   c3d(const std::string&,int=base_cloud::UNLIMITED());
 76   virtual ~c3d(){delete m_histo;}                  76   virtual ~c3d(){delete m_histo;}
 77 public:                                            77 public:
 78   c3d(const c3d& a_from)                           78   c3d(const c3d& a_from)
 79   :base_cloud(a_from)                              79   :base_cloud(a_from)
 80   ,m_xs(a_from.m_xs)                               80   ,m_xs(a_from.m_xs)
 81   ,m_ys(a_from.m_ys)                               81   ,m_ys(a_from.m_ys)
 82   ,m_zs(a_from.m_zs)                               82   ,m_zs(a_from.m_zs)
 83   ,m_lower_x(a_from.m_lower_x)                     83   ,m_lower_x(a_from.m_lower_x)
 84   ,m_upper_x(a_from.m_upper_x)                     84   ,m_upper_x(a_from.m_upper_x)
 85   ,m_lower_y(a_from.m_lower_y)                     85   ,m_lower_y(a_from.m_lower_y)
 86   ,m_upper_y(a_from.m_upper_y)                     86   ,m_upper_y(a_from.m_upper_y)
 87   ,m_lower_z(a_from.m_lower_z)                     87   ,m_lower_z(a_from.m_lower_z)
 88   ,m_upper_z(a_from.m_upper_z)                     88   ,m_upper_z(a_from.m_upper_z)
 89   ,m_Sxw(a_from.m_Sxw)                             89   ,m_Sxw(a_from.m_Sxw)
 90   ,m_Sx2w(a_from.m_Sx2w)                           90   ,m_Sx2w(a_from.m_Sx2w)
 91   ,m_Syw(a_from.m_Syw)                             91   ,m_Syw(a_from.m_Syw)
 92   ,m_Sy2w(a_from.m_Sy2w)                           92   ,m_Sy2w(a_from.m_Sy2w)
 93   ,m_Szw(a_from.m_Szw)                             93   ,m_Szw(a_from.m_Szw)
 94   ,m_Sz2w(a_from.m_Sz2w)                           94   ,m_Sz2w(a_from.m_Sz2w)
 95   ,m_cnv_x_num(a_from.m_cnv_x_num)                 95   ,m_cnv_x_num(a_from.m_cnv_x_num)
 96   ,m_cnv_x_min(a_from.m_cnv_x_min)                 96   ,m_cnv_x_min(a_from.m_cnv_x_min)
 97   ,m_cnv_x_max(a_from.m_cnv_x_max)                 97   ,m_cnv_x_max(a_from.m_cnv_x_max)
 98   ,m_cnv_y_num(a_from.m_cnv_y_num)                 98   ,m_cnv_y_num(a_from.m_cnv_y_num)
 99   ,m_cnv_y_min(a_from.m_cnv_y_min)                 99   ,m_cnv_y_min(a_from.m_cnv_y_min)
100   ,m_cnv_y_max(a_from.m_cnv_y_max)                100   ,m_cnv_y_max(a_from.m_cnv_y_max)
101   ,m_cnv_z_num(a_from.m_cnv_z_num)                101   ,m_cnv_z_num(a_from.m_cnv_z_num)
102   ,m_cnv_z_min(a_from.m_cnv_z_min)                102   ,m_cnv_z_min(a_from.m_cnv_z_min)
103   ,m_cnv_z_max(a_from.m_cnv_z_max)                103   ,m_cnv_z_max(a_from.m_cnv_z_max)
104   ,m_histo(0)                                     104   ,m_histo(0)
105   {                                               105   {
106     if(a_from.m_histo) {                          106     if(a_from.m_histo) {
107       m_histo = new histo::h3d(*a_from.m_histo    107       m_histo = new histo::h3d(*a_from.m_histo);
108     }                                             108     }
109   }                                               109   }
110                                                   110 
111   c3d& operator=(const c3d& a_from) {             111   c3d& operator=(const c3d& a_from) {
112     base_cloud::operator=(a_from);                112     base_cloud::operator=(a_from);
113     if(&a_from==this) return *this;               113     if(&a_from==this) return *this;
114     m_xs = a_from.m_xs;                           114     m_xs = a_from.m_xs;
115     m_ys = a_from.m_ys;                           115     m_ys = a_from.m_ys;
116     m_zs = a_from.m_zs;                           116     m_zs = a_from.m_zs;
117     m_lower_x = a_from.m_lower_x;                 117     m_lower_x = a_from.m_lower_x;
118     m_upper_x = a_from.m_upper_x;                 118     m_upper_x = a_from.m_upper_x;
119     m_lower_y = a_from.m_lower_y;                 119     m_lower_y = a_from.m_lower_y;
120     m_upper_y = a_from.m_upper_y;                 120     m_upper_y = a_from.m_upper_y;
121     m_lower_z = a_from.m_lower_z;                 121     m_lower_z = a_from.m_lower_z;
122     m_upper_z = a_from.m_upper_z;                 122     m_upper_z = a_from.m_upper_z;
123     m_Sxw = a_from.m_Sxw;                         123     m_Sxw = a_from.m_Sxw;
124     m_Sx2w = a_from.m_Sx2w;                       124     m_Sx2w = a_from.m_Sx2w;
125     m_Syw = a_from.m_Syw;                         125     m_Syw = a_from.m_Syw;
126     m_Sy2w = a_from.m_Sy2w;                       126     m_Sy2w = a_from.m_Sy2w;
127     m_Szw = a_from.m_Szw;                         127     m_Szw = a_from.m_Szw;
128     m_Sz2w = a_from.m_Sz2w;                       128     m_Sz2w = a_from.m_Sz2w;
129     m_cnv_x_num = a_from.m_cnv_x_num;             129     m_cnv_x_num = a_from.m_cnv_x_num;
130     m_cnv_x_min = a_from.m_cnv_x_min;             130     m_cnv_x_min = a_from.m_cnv_x_min;
131     m_cnv_x_max = a_from.m_cnv_x_max;             131     m_cnv_x_max = a_from.m_cnv_x_max;
132     m_cnv_y_num = a_from.m_cnv_y_num;             132     m_cnv_y_num = a_from.m_cnv_y_num;
133     m_cnv_y_min = a_from.m_cnv_y_min;             133     m_cnv_y_min = a_from.m_cnv_y_min;
134     m_cnv_y_max = a_from.m_cnv_y_max;             134     m_cnv_y_max = a_from.m_cnv_y_max;
135     m_cnv_z_num = a_from.m_cnv_z_num;             135     m_cnv_z_num = a_from.m_cnv_z_num;
136     m_cnv_z_min = a_from.m_cnv_z_min;             136     m_cnv_z_min = a_from.m_cnv_z_min;
137     m_cnv_z_max = a_from.m_cnv_z_max;             137     m_cnv_z_max = a_from.m_cnv_z_max;
138     delete m_histo;                               138     delete m_histo;
139     m_histo = 0;                                  139     m_histo = 0;
140     if(a_from.m_histo) {                          140     if(a_from.m_histo) {
141       m_histo = new histo::h3d(*a_from.m_histo    141       m_histo = new histo::h3d(*a_from.m_histo);
142     }                                             142     }
143     return *this;                                 143     return *this;
144   }                                               144   }
145                                                   145 
146 protected:                                        146 protected:
147   void clear();                                   147   void clear();
148 protected:                                        148 protected:
149   std::vector<double> m_xs;                       149   std::vector<double> m_xs;
150   std::vector<double> m_ys;                       150   std::vector<double> m_ys;
151   std::vector<double> m_zs;                       151   std::vector<double> m_zs;
152   double m_lower_x;                               152   double m_lower_x;
153   double m_upper_x;                               153   double m_upper_x;
154   double m_lower_y;                               154   double m_lower_y;
155   double m_upper_y;                               155   double m_upper_y;
156   double m_lower_z;                               156   double m_lower_z;
157   double m_upper_z;                               157   double m_upper_z;
158   double m_Sxw;                                   158   double m_Sxw;
159   double m_Sx2w;                                  159   double m_Sx2w;
160   double m_Syw;                                   160   double m_Syw;
161   double m_Sy2w;                                  161   double m_Sy2w;
162   double m_Szw;                                   162   double m_Szw;
163   double m_Sz2w;                                  163   double m_Sz2w;
164   //                                              164   //
165   unsigned int m_cnv_x_num;                       165   unsigned int m_cnv_x_num;
166   double m_cnv_x_min;                             166   double m_cnv_x_min;
167   double m_cnv_x_max;                             167   double m_cnv_x_max;
168   unsigned int m_cnv_y_num;                       168   unsigned int m_cnv_y_num;
169   double m_cnv_y_min;                             169   double m_cnv_y_min;
170   double m_cnv_y_max;                             170   double m_cnv_y_max;
171   unsigned int m_cnv_z_num;                       171   unsigned int m_cnv_z_num;
172   double m_cnv_z_min;                             172   double m_cnv_z_min;
173   double m_cnv_z_max;                             173   double m_cnv_z_max;
174   histo::h3d* m_histo;                            174   histo::h3d* m_histo;
175 };                                                175 };
176                                                   176 
177 }}                                                177 }}
178                                                   178 
179 namespace tools {                                 179 namespace tools {
180 namespace histo {                                 180 namespace histo {
181                                                   181 
182 inline                                            182 inline
183 c3d::c3d()                                        183 c3d::c3d()
184 :base_cloud(UNLIMITED())                          184 :base_cloud(UNLIMITED())
185 ,m_lower_x(0)                                     185 ,m_lower_x(0)
186 ,m_upper_x(0)                                     186 ,m_upper_x(0)
187 ,m_lower_y(0)                                     187 ,m_lower_y(0)
188 ,m_upper_y(0)                                     188 ,m_upper_y(0)
189 ,m_lower_z(0)                                     189 ,m_lower_z(0)
190 ,m_upper_z(0)                                     190 ,m_upper_z(0)
191 ,m_Sxw(0)                                         191 ,m_Sxw(0)
192 ,m_Sx2w(0)                                        192 ,m_Sx2w(0)
193 ,m_Syw(0)                                         193 ,m_Syw(0)
194 ,m_Sy2w(0)                                        194 ,m_Sy2w(0)
195 ,m_Szw(0)                                         195 ,m_Szw(0)
196 ,m_Sz2w(0)                                        196 ,m_Sz2w(0)
197 ,m_cnv_x_num(0)                                   197 ,m_cnv_x_num(0)
198 ,m_cnv_x_min(0)                                   198 ,m_cnv_x_min(0)
199 ,m_cnv_x_max(0)                                   199 ,m_cnv_x_max(0)
200 ,m_cnv_y_num(0)                                   200 ,m_cnv_y_num(0)
201 ,m_cnv_y_min(0)                                   201 ,m_cnv_y_min(0)
202 ,m_cnv_y_max(0)                                   202 ,m_cnv_y_max(0)
203 ,m_cnv_z_num(0)                                   203 ,m_cnv_z_num(0)
204 ,m_cnv_z_min(0)                                   204 ,m_cnv_z_min(0)
205 ,m_cnv_z_max(0)                                   205 ,m_cnv_z_max(0)
206 ,m_histo(0)                                       206 ,m_histo(0)
207 {}                                                207 {}
208                                                   208 
209 inline                                            209 inline
210 c3d::c3d(const std::string& a_title,int aLimit    210 c3d::c3d(const std::string& a_title,int aLimit)
211 :base_cloud(aLimit)                               211 :base_cloud(aLimit)
212 ,m_lower_x(0)                                     212 ,m_lower_x(0)
213 ,m_upper_x(0)                                     213 ,m_upper_x(0)
214 ,m_lower_y(0)                                     214 ,m_lower_y(0)
215 ,m_upper_y(0)                                     215 ,m_upper_y(0)
216 ,m_lower_z(0)                                     216 ,m_lower_z(0)
217 ,m_upper_z(0)                                     217 ,m_upper_z(0)
218 ,m_Sxw(0)                                         218 ,m_Sxw(0)
219 ,m_Sx2w(0)                                        219 ,m_Sx2w(0)
220 ,m_Syw(0)                                         220 ,m_Syw(0)
221 ,m_Sy2w(0)                                        221 ,m_Sy2w(0)
222 ,m_Szw(0)                                         222 ,m_Szw(0)
223 ,m_Sz2w(0)                                        223 ,m_Sz2w(0)
224 ,m_cnv_x_num(0)                                   224 ,m_cnv_x_num(0)
225 ,m_cnv_x_min(0)                                   225 ,m_cnv_x_min(0)
226 ,m_cnv_x_max(0)                                   226 ,m_cnv_x_max(0)
227 ,m_cnv_y_num(0)                                   227 ,m_cnv_y_num(0)
228 ,m_cnv_y_min(0)                                   228 ,m_cnv_y_min(0)
229 ,m_cnv_y_max(0)                                   229 ,m_cnv_y_max(0)
230 ,m_cnv_z_num(0)                                   230 ,m_cnv_z_num(0)
231 ,m_cnv_z_min(0)                                   231 ,m_cnv_z_min(0)
232 ,m_cnv_z_max(0)                                   232 ,m_cnv_z_max(0)
233 ,m_histo(0)                                       233 ,m_histo(0)
234 {                                                 234 {
235   set_title(a_title);                             235   set_title(a_title);
236 }                                                 236 }
237                                                   237 
238 inline                                            238 inline
239 bool c3d::is_converted() const {return m_histo    239 bool c3d::is_converted() const {return m_histo ? true : false;}
240                                                   240 
241 inline                                            241 inline
242 void c3d::clear(){                                242 void c3d::clear(){
243   m_lower_x = 0;                                  243   m_lower_x = 0;
244   m_upper_x = 0;                                  244   m_upper_x = 0;
245   m_lower_y = 0;                                  245   m_lower_y = 0;
246   m_upper_y = 0;                                  246   m_upper_y = 0;
247   m_lower_z = 0;                                  247   m_lower_z = 0;
248   m_upper_z = 0;                                  248   m_upper_z = 0;
249   m_Sw = 0;                                       249   m_Sw = 0;
250   m_Sxw = 0;                                      250   m_Sxw = 0;
251   m_Sx2w = 0;                                     251   m_Sx2w = 0;
252   m_Syw = 0;                                      252   m_Syw = 0;
253   m_Sy2w = 0;                                     253   m_Sy2w = 0;
254   m_Szw = 0;                                      254   m_Szw = 0;
255   m_Sz2w = 0;                                     255   m_Sz2w = 0;
256   m_xs.clear();                                   256   m_xs.clear();
257   m_ys.clear();                                   257   m_ys.clear();
258   m_zs.clear();                                   258   m_zs.clear();
259   m_ws.clear();                                   259   m_ws.clear();
260 }                                                 260 }
261                                                   261 
262 inline                                            262 inline
263 bool c3d::convert(                                263 bool c3d::convert(
264  unsigned int a_bins_x,double a_lower_edge_x,d    264  unsigned int a_bins_x,double a_lower_edge_x,double a_upper_edge_x
265 ,unsigned int a_bins_y,double a_lower_edge_y,d    265 ,unsigned int a_bins_y,double a_lower_edge_y,double a_upper_edge_y
266 ,unsigned int a_bins_z,double a_lower_edge_z,d    266 ,unsigned int a_bins_z,double a_lower_edge_z,double a_upper_edge_z
267 ) {                                               267 ) {
268   if(m_histo) return true; // Done.               268   if(m_histo) return true; // Done.
269   m_histo = new histo::h3d(base_cloud::title()    269   m_histo = new histo::h3d(base_cloud::title(),
270                            a_bins_x,a_lower_ed    270                            a_bins_x,a_lower_edge_x,a_upper_edge_x,
271                            a_bins_y,a_lower_ed    271                            a_bins_y,a_lower_edge_y,a_upper_edge_y,
272                            a_bins_z,a_lower_ed    272                            a_bins_z,a_lower_edge_z,a_upper_edge_z);
273   if(!m_histo) return false;                      273   if(!m_histo) return false;
274   bool status = fill_histogram(*m_histo);         274   bool status = fill_histogram(*m_histo);
275   clear();                                        275   clear();
276   return status;                                  276   return status;
277 }                                                 277 }
278                                                   278 
279 inline                                            279 inline
280 bool c3d::convert_to_histogram(){                 280 bool c3d::convert_to_histogram(){
281   if( (m_cnv_x_num<=0) || (m_cnv_x_max<=m_cnv_    281   if( (m_cnv_x_num<=0) || (m_cnv_x_max<=m_cnv_x_min) ||
282       (m_cnv_y_num<=0) || (m_cnv_y_max<=m_cnv_    282       (m_cnv_y_num<=0) || (m_cnv_y_max<=m_cnv_y_min) ||
283       (m_cnv_z_num<=0) || (m_cnv_z_max<=m_cnv_    283       (m_cnv_z_num<=0) || (m_cnv_z_max<=m_cnv_z_min) ) {
284     double dx = 0.01 * (upper_edge_x() - lower    284     double dx = 0.01 * (upper_edge_x() - lower_edge_x())/BINS();
285     double dy = 0.01 * (upper_edge_y() - lower    285     double dy = 0.01 * (upper_edge_y() - lower_edge_y())/BINS();
286     double dz = 0.01 * (upper_edge_z() - lower    286     double dz = 0.01 * (upper_edge_z() - lower_edge_z())/BINS();
287     return convert(BINS(),lower_edge_x(),upper    287     return convert(BINS(),lower_edge_x(),upper_edge_x()+dx,
288                    BINS(),lower_edge_y(),upper    288                    BINS(),lower_edge_y(),upper_edge_y()+dy,
289                    BINS(),lower_edge_z(),upper    289                    BINS(),lower_edge_z(),upper_edge_z()+dz);
290   } else {                                        290   } else {
291     return convert(m_cnv_x_num,m_cnv_x_min,m_c    291     return convert(m_cnv_x_num,m_cnv_x_min,m_cnv_x_max,
292                    m_cnv_y_num,m_cnv_y_min,m_c    292                    m_cnv_y_num,m_cnv_y_min,m_cnv_y_max,
293                    m_cnv_z_num,m_cnv_z_min,m_c    293                    m_cnv_z_num,m_cnv_z_min,m_cnv_z_max);
294   }                                               294   }
295 }                                                 295 }
296                                                   296 
297 inline                                            297 inline
298 bool c3d::set_title(const std::string& a_title    298 bool c3d::set_title(const std::string& a_title){
299   m_title = a_title;                              299   m_title = a_title;
300   if(m_histo) m_histo->set_title(a_title);        300   if(m_histo) m_histo->set_title(a_title);
301   return true;                                    301   return true;
302 }                                                 302 }
303                                                   303 
304 inline                                            304 inline
305 bool c3d::scale(double a_scale) {                 305 bool c3d::scale(double a_scale) {
306   if(m_histo) {                                   306   if(m_histo) {
307     return m_histo->scale(a_scale);               307     return m_histo->scale(a_scale);
308   } else {                                        308   } else {
309     size_t number = m_ws.size();                  309     size_t number = m_ws.size();
310     for(size_t index=0;index<number;index++) m    310     for(size_t index=0;index<number;index++) m_ws[index] *= a_scale;
311     m_Sw *= a_scale;                              311     m_Sw *= a_scale;
312     m_Sxw *= a_scale;                             312     m_Sxw *= a_scale;
313     m_Sx2w *= a_scale;                            313     m_Sx2w *= a_scale;
314     m_Syw *= a_scale;                             314     m_Syw *= a_scale;
315     m_Sy2w *= a_scale;                            315     m_Sy2w *= a_scale;
316     m_Szw *= a_scale;                             316     m_Szw *= a_scale;
317     m_Sz2w *= a_scale;                            317     m_Sz2w *= a_scale;
318     return true;                                  318     return true;
319   }                                               319   }
320 }                                                 320 }
321                                                   321 
322 inline                                            322 inline
323 bool c3d::set_conversion_parameters(              323 bool c3d::set_conversion_parameters(
324  unsigned int aCnvXnumber,double aCnvXmin,doub    324  unsigned int aCnvXnumber,double aCnvXmin,double aCnvXmax
325 ,unsigned int aCnvYnumber,double aCnvYmin,doub    325 ,unsigned int aCnvYnumber,double aCnvYmin,double aCnvYmax
326 ,unsigned int aCnvZnumber,double aCnvZmin,doub    326 ,unsigned int aCnvZnumber,double aCnvZmin,double aCnvZmax
327 ){                                                327 ){
328   m_cnv_x_num = aCnvXnumber;                      328   m_cnv_x_num = aCnvXnumber;
329   m_cnv_x_min = aCnvXmin;                         329   m_cnv_x_min = aCnvXmin;
330   m_cnv_x_max = aCnvXmax;                         330   m_cnv_x_max = aCnvXmax;
331   m_cnv_y_num = aCnvYnumber;                      331   m_cnv_y_num = aCnvYnumber;
332   m_cnv_y_min = aCnvYmin;                         332   m_cnv_y_min = aCnvYmin;
333   m_cnv_y_max = aCnvYmax;                         333   m_cnv_y_max = aCnvYmax;
334   m_cnv_z_num = aCnvZnumber;                      334   m_cnv_z_num = aCnvZnumber;
335   m_cnv_z_min = aCnvZmin;                         335   m_cnv_z_min = aCnvZmin;
336   m_cnv_z_max = aCnvZmax;                         336   m_cnv_z_max = aCnvZmax;
337   return true;                                    337   return true;
338 }                                                 338 }
339                                                   339 
340                                                   340 
341 inline                                            341 inline
342 const h3d& c3d::histogram() const {               342 const h3d& c3d::histogram() const {
343   if(!m_histo) const_cast<c3d&>(*this).convert    343   if(!m_histo) const_cast<c3d&>(*this).convert_to_histogram();
344   return *m_histo;                                344   return *m_histo;
345 }                                                 345 }
346                                                   346 
347 inline                                            347 inline
348 bool c3d::reset() {                               348 bool c3d::reset() {
349   clear();                                        349   clear();
350   delete m_histo;                                 350   delete m_histo;
351   m_histo = 0;                                    351   m_histo = 0;
352   return true;                                    352   return true;
353 }                                                 353 }
354                                                   354 
355 inline                                            355 inline
356 bool c3d::fill(double aX,double aY,double aZ,d    356 bool c3d::fill(double aX,double aY,double aZ,double aW){
357   if(!m_histo && (m_limit!=UNLIMITED()) && ((i    357   if(!m_histo && (m_limit!=UNLIMITED()) && ((int)m_xs.size()>=m_limit)){
358     convert_to_histogram();                       358     convert_to_histogram();
359   }                                               359   }
360                                                   360 
361   if(m_histo) {                                   361   if(m_histo) {
362     return m_histo->fill(aX,aY,aZ,aW);            362     return m_histo->fill(aX,aY,aZ,aW);
363   } else {                                        363   } else {
364     if(m_xs.size()) {                             364     if(m_xs.size()) {
365       m_lower_x = mn<double>(aX,m_lower_x);       365       m_lower_x = mn<double>(aX,m_lower_x);
366       m_upper_x = mx<double>(aX,m_upper_x);       366       m_upper_x = mx<double>(aX,m_upper_x);
367     } else {                                      367     } else {
368       m_lower_x = aX;                             368       m_lower_x = aX;
369       m_upper_x = aX;                             369       m_upper_x = aX;
370     }                                             370     }
371     if(m_ys.size()) {                             371     if(m_ys.size()) {
372       m_lower_y = mn<double>(aY,m_lower_y);       372       m_lower_y = mn<double>(aY,m_lower_y);
373       m_upper_y = mx<double>(aY,m_upper_y);       373       m_upper_y = mx<double>(aY,m_upper_y);
374     } else {                                      374     } else {
375       m_lower_y = aY;                             375       m_lower_y = aY;
376       m_upper_y = aY;                             376       m_upper_y = aY;
377     }                                             377     }
378     if(m_zs.size()) {                             378     if(m_zs.size()) {
379       m_lower_z = mn<double>(aZ,m_lower_z);       379       m_lower_z = mn<double>(aZ,m_lower_z);
380       m_upper_z = mx<double>(aZ,m_upper_z);       380       m_upper_z = mx<double>(aZ,m_upper_z);
381     } else {                                      381     } else {
382       m_lower_z = aZ;                             382       m_lower_z = aZ;
383       m_upper_z = aZ;                             383       m_upper_z = aZ;
384     }                                             384     }
385     m_xs.push_back(aX);                           385     m_xs.push_back(aX);
386     m_ys.push_back(aY);                           386     m_ys.push_back(aY);
387     m_zs.push_back(aZ);                           387     m_zs.push_back(aZ);
388     m_ws.push_back(aW);                           388     m_ws.push_back(aW);
389     m_Sw += aW;                                   389     m_Sw += aW;
390     double xw = aX * aW;                          390     double xw = aX * aW;
391     m_Sxw += xw;                                  391     m_Sxw += xw;
392     m_Sx2w += aX * xw;                            392     m_Sx2w += aX * xw;
393     double yw = aY * aW;                          393     double yw = aY * aW;
394     m_Syw += yw;                                  394     m_Syw += yw;
395     m_Sy2w += aY * yw;                            395     m_Sy2w += aY * yw;
396     double zw = aZ * aW;                          396     double zw = aZ * aW;
397     m_Szw += zw;                                  397     m_Szw += zw;
398     m_Sz2w += aZ * zw;                            398     m_Sz2w += aZ * zw;
399     return true;                                  399     return true;
400   }                                               400   }
401 }                                                 401 }
402                                                   402 
403 inline                                            403 inline
404 bool c3d::convert(                                404 bool c3d::convert(
405  const std::vector<double>& a_edges_x             405  const std::vector<double>& a_edges_x
406 ,const std::vector<double>& a_edges_y             406 ,const std::vector<double>& a_edges_y
407 ,const std::vector<double>& a_edges_z             407 ,const std::vector<double>& a_edges_z
408 ) {                                               408 ) {
409   if(m_histo) return true;                        409   if(m_histo) return true;
410   m_histo = new histo::h3d(base_cloud::title()    410   m_histo = new histo::h3d(base_cloud::title(),
411                            a_edges_x,a_edges_y    411                            a_edges_x,a_edges_y,a_edges_z);
412   if(!m_histo) return false;                      412   if(!m_histo) return false;
413   bool status = fill_histogram(*m_histo);         413   bool status = fill_histogram(*m_histo);
414   clear();                                        414   clear();
415   return status;                                  415   return status;
416 }                                                 416 }
417                                                   417 
418 inline                                            418 inline
419 double c3d::sum_of_weights() const {              419 double c3d::sum_of_weights() const {
420   return (m_histo ? m_histo->sum_bin_heights()    420   return (m_histo ? m_histo->sum_bin_heights() : m_Sw);
421 }                                                 421 }
422                                                   422 
423 inline                                            423 inline
424 unsigned int c3d::entries() const {               424 unsigned int c3d::entries() const {
425   return m_histo ? m_histo->all_entries() : (u    425   return m_histo ? m_histo->all_entries() : (unsigned int)m_ws.size();
426 }                                                 426 }
427                                                   427 
428 inline                                            428 inline
429 double c3d::lower_edge_x() const {                429 double c3d::lower_edge_x() const {
430   return m_histo ? m_histo->axis_x().lower_edg    430   return m_histo ? m_histo->axis_x().lower_edge() : m_lower_x;
431 }                                                 431 }
432 inline                                            432 inline
433 double c3d::lower_edge_y() const {                433 double c3d::lower_edge_y() const {
434   return m_histo ? m_histo->axis_y().lower_edg    434   return m_histo ? m_histo->axis_y().lower_edge() : m_lower_y;
435 }                                                 435 }
436 inline                                            436 inline
437 double c3d::lower_edge_z() const {                437 double c3d::lower_edge_z() const {
438   return m_histo ? m_histo->axis_z().lower_edg    438   return m_histo ? m_histo->axis_z().lower_edge() : m_lower_z;
439 }                                                 439 }
440 inline                                            440 inline
441 double c3d::upper_edge_x() const {                441 double c3d::upper_edge_x() const {
442   return m_histo ? m_histo->axis_x().upper_edg    442   return m_histo ? m_histo->axis_x().upper_edge() : m_upper_x;
443 }                                                 443 }
444 inline                                            444 inline
445 double c3d::upper_edge_y() const {                445 double c3d::upper_edge_y() const {
446   return m_histo ? m_histo->axis_y().upper_edg    446   return m_histo ? m_histo->axis_y().upper_edge() : m_upper_y;
447 }                                                 447 }
448 inline                                            448 inline
449 double c3d::upper_edge_z() const {                449 double c3d::upper_edge_z() const {
450   return m_histo ? m_histo->axis_z().upper_edg    450   return m_histo ? m_histo->axis_z().upper_edge() : m_upper_z;
451 }                                                 451 }
452 inline                                            452 inline
453 double c3d::value_x(unsigned int a_index) cons    453 double c3d::value_x(unsigned int a_index) const {
454   return m_histo ? 0 : m_xs[a_index];             454   return m_histo ? 0 : m_xs[a_index];
455 }                                                 455 }
456 inline                                            456 inline
457 double c3d::value_y(unsigned int a_index) cons    457 double c3d::value_y(unsigned int a_index) const {
458   return m_histo ? 0 : m_ys[a_index];             458   return m_histo ? 0 : m_ys[a_index];
459 }                                                 459 }
460 inline                                            460 inline
461 double c3d::value_z(unsigned int a_index) cons    461 double c3d::value_z(unsigned int a_index) const {
462   return m_histo ? 0 : m_zs[a_index];             462   return m_histo ? 0 : m_zs[a_index];
463 }                                                 463 }
464 inline                                            464 inline
465 double c3d::weight(unsigned int a_index) const    465 double c3d::weight(unsigned int a_index) const {
466   return m_histo ? 0 : m_ws[a_index];             466   return m_histo ? 0 : m_ws[a_index];
467 }                                                 467 }
468 inline                                            468 inline
469 double c3d::mean_x() const {                      469 double c3d::mean_x() const {
470   return m_histo ? m_histo->mean_x() : (m_Sw?m    470   return m_histo ? m_histo->mean_x() : (m_Sw?m_Sxw/m_Sw:0);
471 }                                                 471 }
472 inline                                            472 inline
473 double c3d::mean_y() const {                      473 double c3d::mean_y() const {
474   return m_histo ? m_histo->mean_y() : (m_Sw?m    474   return m_histo ? m_histo->mean_y() : (m_Sw?m_Syw/m_Sw:0);
475 }                                                 475 }
476 inline                                            476 inline
477 double c3d::mean_z() const {                      477 double c3d::mean_z() const {
478   return m_histo ? m_histo->mean_z() : (m_Sw?m    478   return m_histo ? m_histo->mean_z() : (m_Sw?m_Szw/m_Sw:0);
479 }                                                 479 }
480 inline                                            480 inline
481 double c3d::rms_x() const {                       481 double c3d::rms_x() const {
482   double rms = 0; //FIXME nan.                    482   double rms = 0; //FIXME nan.
483   if(m_histo) {                                   483   if(m_histo) {
484     rms = m_histo->rms_x();                       484     rms = m_histo->rms_x();
485   } else {                                        485   } else {
486     if(m_Sw==0) {                                 486     if(m_Sw==0) {
487     } else {                                      487     } else {
488       double mean = m_Sxw / m_Sw;                 488       double mean = m_Sxw / m_Sw;
489       rms = ::sqrt(::fabs( (m_Sx2w / m_Sw) - m    489       rms = ::sqrt(::fabs( (m_Sx2w / m_Sw) - mean * mean));
490     }                                             490     }
491   }                                               491   }
492   return rms;                                     492   return rms;
493 }                                                 493 }
494 inline                                            494 inline
495 double c3d::rms_y() const {                       495 double c3d::rms_y() const {
496   double rms = 0; //FIXME nan.                    496   double rms = 0; //FIXME nan.
497   if(m_histo) {                                   497   if(m_histo) {
498     rms = m_histo->rms_y();                       498     rms = m_histo->rms_y();
499   } else {                                        499   } else {
500     if(m_Sw==0) {                                 500     if(m_Sw==0) {
501     } else {                                      501     } else {
502       double mean = m_Syw / m_Sw;                 502       double mean = m_Syw / m_Sw;
503       rms = ::sqrt(::fabs( (m_Sy2w / m_Sw) - m    503       rms = ::sqrt(::fabs( (m_Sy2w / m_Sw) - mean * mean));
504     }                                             504     }
505   }                                               505   }
506   return rms;                                     506   return rms;
507 }                                                 507 }
508 inline                                            508 inline
509 double c3d::rms_z() const {                       509 double c3d::rms_z() const {
510   double rms = 0; //FIXME nan.                    510   double rms = 0; //FIXME nan.
511   if(m_histo) {                                   511   if(m_histo) {
512     rms = m_histo->rms_z();                       512     rms = m_histo->rms_z();
513   } else {                                        513   } else {
514     if(m_Sw==0) {                                 514     if(m_Sw==0) {
515     } else {                                      515     } else {
516       double mean = m_Szw / m_Sw;                 516       double mean = m_Szw / m_Sw;
517       rms = ::sqrt(::fabs( (m_Sz2w / m_Sw) - m    517       rms = ::sqrt(::fabs( (m_Sz2w / m_Sw) - mean * mean));
518     }                                             518     }
519   }                                               519   }
520   return rms;                                     520   return rms;
521 }                                                 521 }
522                                                   522 
523 }}                                                523 }}
524                                                   524 
525 #endif                                            525 #endif