inlib
1.2.0
|
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