inlib  1.2.0
/Users/barrand/private/dev/softinex/old/inexlib-1.2/inlib/inlib/histo/histo_data
Go to the documentation of this file.
00001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
00002 // See the file inlib.license for terms.
00003 
00004 #ifndef inlib_histo_histo_data
00005 #define inlib_histo_histo_data
00006 
00007 #include <vector>
00008 //#include <map> //for annotations
00009 
00010 #include "axis"
00011 
00012 namespace inlib {
00013 namespace histo {
00014 
00015 //TC is for a coordinate.
00016 //TN is for a number of entries.
00017 //TW is for a weight.
00018 
00019 template <class TC,class TN,class TW>
00020 class histo_data {
00021 public:
00022   typedef typename axis<TC>::bn_t bn_t;
00023   typedef unsigned int dim_t;
00024 public:
00025   histo_data()
00026   :m_dimension(0)
00027   ,m_bin_number(0)
00028   //,m_mode(0)
00029   {}
00030 public:
00031   histo_data(const histo_data& a_from)
00032   :m_title(a_from.m_title)
00033   ,m_dimension(a_from.m_dimension)
00034   ,m_bin_number(a_from.m_bin_number)
00035   //,m_mode(a_from.m_mode)
00036   // Arrays :
00037   ,m_bin_entries(a_from.m_bin_entries)
00038   ,m_bin_Sw(a_from.m_bin_Sw)
00039   ,m_bin_Sw2(a_from.m_bin_Sw2)
00040   ,m_bin_Sxw(a_from.m_bin_Sxw)
00041   ,m_bin_Sx2w(a_from.m_bin_Sx2w)
00042   ,m_axes(a_from.m_axes)
00043   //,m_annotations(a_from.m_annotations)
00044   {}
00045 
00046   histo_data& operator=(const histo_data& a_from) {
00047     m_title = a_from.m_title;
00048     m_dimension = a_from.m_dimension;
00049     m_bin_number = a_from.m_bin_number;
00050     //m_mode = a_from.m_mode;
00051     // Arrays :
00052     m_bin_entries = a_from.m_bin_entries;
00053     m_bin_Sw = a_from.m_bin_Sw;
00054     m_bin_Sw2 = a_from.m_bin_Sw2;
00055     m_bin_Sxw = a_from.m_bin_Sxw;
00056     m_bin_Sx2w = a_from.m_bin_Sx2w;
00057     m_axes = a_from.m_axes;
00058     //
00059     //m_annotations = a_from.m_annotations;
00060     return *this;
00061   }
00062 
00063   virtual ~histo_data(){}
00064 public: 
00065   void base_reset() { //used in multiply,divide.
00066     // Reset content (different of clear that deallocate all internal things).
00067     for(bn_t ibin=0;ibin<m_bin_number;ibin++) {
00068       m_bin_entries[ibin] = 0;
00069       m_bin_Sw[ibin] = 0;
00070       m_bin_Sw2[ibin] = 0;
00071       for(dim_t iaxis=0;iaxis<m_dimension;iaxis++) {
00072         m_bin_Sxw[ibin][iaxis] = 0;
00073         m_bin_Sx2w[ibin][iaxis] = 0;
00074       }
00075     }
00076   }
00077 
00078 public:
00079   // for BatchLab::Rio::TH::streamTH1 :
00080   TN get_entries() const {
00081     TN number = 0;
00082     for(bn_t ibin=0;ibin<m_bin_number;ibin++) {
00083       if(!is_out(ibin)) {
00084         number += m_bin_entries[ibin];
00085       }
00086     }
00087     return number;
00088   }
00089   TW get_Sw() const {
00090     TW sw = 0;
00091     for(bn_t ibin=0;ibin<m_bin_number;ibin++) {
00092       if(!is_out(ibin)) {
00093         sw += m_bin_Sw[ibin];
00094       }
00095     }
00096     return sw;
00097   }
00098 
00099   TW get_Sw2() const {
00100     TW sw2 = 0;
00101     for(bn_t ibin=0;ibin<m_bin_number;ibin++) {
00102       if(!is_out(ibin)) {
00103         sw2 += m_bin_Sw2[ibin];
00104       }
00105     }
00106     return sw2;
00107   }
00108 
00109   bool get_ith_axis_Sxw(dim_t a_axis,TC& a_value) const {
00110     a_value = 0;
00111     if(a_axis>=m_dimension) return false;
00112     for(bn_t ibin=0;ibin<m_bin_number;ibin++) {
00113       if(!is_out(ibin)) {
00114         a_value += m_bin_Sxw[ibin][a_axis];
00115       }
00116     }
00117     return true;
00118   }
00119 
00120   bool get_ith_axis_Sx2w(dim_t a_axis,TC& a_value) const {
00121     a_value = 0;
00122     if(a_axis>=m_dimension) return false;
00123     for(bn_t ibin=0;ibin<m_bin_number;ibin++) {
00124       if(!is_out(ibin)) {
00125         a_value += m_bin_Sx2w[ibin][a_axis];
00126       }
00127     }
00128     return true;
00129   }
00130 
00131   TN get_all_entries() const {
00132     TN number = 0;
00133     for(bn_t ibin=0;ibin<m_bin_number;ibin++) {
00134       number += m_bin_entries[ibin];
00135     }
00136     return number;
00137   }
00138 
00139   bool is_out(bn_t aOffset) const {
00140     int offset = aOffset;
00141     int index;
00142     for(int iaxis=m_dimension-1;iaxis>=0;iaxis--) { 
00143       index = offset/m_axes[iaxis].m_offset;
00144       if(index==0) return true;
00145       if(index==(int(m_axes[iaxis].m_number_of_bins)+1)) return true;
00146       offset -= index * m_axes[iaxis].m_offset;
00147     }
00148     return false;
00149   }
00150 
00151   void get_indices(bn_t aOffset,std::vector<int>& aIs) const {
00152     int offset = aOffset;
00153    {for(int iaxis=m_dimension-1;iaxis>=0;iaxis--) { 
00154       aIs[iaxis] = offset/m_axes[iaxis].m_offset;
00155       offset -= aIs[iaxis] * m_axes[iaxis].m_offset;
00156     }}
00157     for(dim_t iaxis=0;iaxis<m_dimension;iaxis++) {
00158       if(aIs[iaxis]==0) {
00159         aIs[iaxis] = axis<TC>::UNDERFLOW_BIN;
00160       } else if(aIs[iaxis]==int(m_axes[iaxis].m_number_of_bins)+1) {
00161         aIs[iaxis] = axis<TC>::OVERFLOW_BIN;
00162       } else {
00163         aIs[iaxis]--;
00164       }
00165     }
00166   }
00167 
00168   // for raxml :
00169   bool get_offset(const std::vector<int>& aIs,bn_t& a_offset) const {
00170     // aIs[iaxis] is given in in-range indexing :
00171     //  - [0,n[iaxis]-1] for in-range bins
00172     //  - UNDERFLOW_BIN for the iaxis underflow bin
00173     //  - OVERFLOW_BIN for the iaxis overflow bin
00174     a_offset = 0;
00175     if(!m_dimension) return false;
00176     bn_t ibin;
00177     for(dim_t iaxis=0;iaxis<m_dimension;iaxis++) { 
00178       if(!m_axes[iaxis].in_range_to_absolute_index(aIs[iaxis],ibin)) {
00179         a_offset = 0;
00180         return false;
00181       }
00182       a_offset += ibin * m_axes[iaxis].m_offset;
00183     }
00184     return true;
00185   }
00186 
00187 public:
00188   // General :
00189   std::string m_title;
00190   dim_t m_dimension;
00191   // Bins :
00192   bn_t m_bin_number;
00193   std::vector<TN> m_bin_entries;
00194   std::vector<TW> m_bin_Sw;
00195   std::vector<TW> m_bin_Sw2;
00196   std::vector< std::vector<TC> > m_bin_Sxw;
00197   std::vector< std::vector<TC> > m_bin_Sx2w;
00198   // Axes :
00199   std::vector< axis<TC> > m_axes;
00200   // etc :
00201   //std::map<std::string,std::string> m_annotations;
00202 };
00203 
00204 }}
00205 
00206 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines