// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_histo_histo_data #define tools_histo_histo_data #include #include //for annotations #include "axis" namespace tools { namespace histo { //TC is for a coordinate. //TN is for a number of entries. //TW is for a weight. template class histo_data { public: typedef typename axis::bn_t bn_t; typedef unsigned int dim_t; public: histo_data() :m_dimension(0) ,m_bin_number(0) //,m_mode(0) {} public: histo_data(const histo_data& a_from) :m_title(a_from.m_title) ,m_dimension(a_from.m_dimension) ,m_bin_number(a_from.m_bin_number) //,m_mode(a_from.m_mode) // Arrays : ,m_bin_entries(a_from.m_bin_entries) ,m_bin_Sw(a_from.m_bin_Sw) ,m_bin_Sw2(a_from.m_bin_Sw2) ,m_bin_Sxw(a_from.m_bin_Sxw) ,m_bin_Sx2w(a_from.m_bin_Sx2w) ,m_axes(a_from.m_axes) ,m_annotations(a_from.m_annotations) {} histo_data& operator=(const histo_data& a_from) { m_title = a_from.m_title; m_dimension = a_from.m_dimension; m_bin_number = a_from.m_bin_number; //m_mode = a_from.m_mode; // Arrays : m_bin_entries = a_from.m_bin_entries; m_bin_Sw = a_from.m_bin_Sw; m_bin_Sw2 = a_from.m_bin_Sw2; m_bin_Sxw = a_from.m_bin_Sxw; m_bin_Sx2w = a_from.m_bin_Sx2w; m_axes = a_from.m_axes; // m_annotations = a_from.m_annotations; return *this; } virtual ~histo_data(){} public: void base_reset() { //used in multiply,divide. // Reset content (different of clear that deallocate all internal things). for(bn_t ibin=0;ibin=m_dimension) return false; for(bn_t ibin=0;ibin=m_dimension) return false; for(bn_t ibin=0;ibin=0;iaxis--) { index = offset/m_axes[iaxis].m_offset; if(index==0) return true; if(index==(int(m_axes[iaxis].m_number_of_bins)+1)) return true; offset -= index * m_axes[iaxis].m_offset; } return false; } void get_indices(bn_t aOffset,std::vector& aIs) const { int offset = aOffset; {for(int iaxis=m_dimension-1;iaxis>=0;iaxis--) { aIs[iaxis] = offset/m_axes[iaxis].m_offset; offset -= aIs[iaxis] * m_axes[iaxis].m_offset; }} for(dim_t iaxis=0;iaxis::UNDERFLOW_BIN; } else if(aIs[iaxis]==int(m_axes[iaxis].m_number_of_bins)+1) { aIs[iaxis] = axis::OVERFLOW_BIN; } else { aIs[iaxis]--; } } } // for raxml : bool get_offset(const std::vector& aIs,bn_t& a_offset) const { // aIs[iaxis] is given in in-range indexing : // - [0,n[iaxis]-1] for in-range bins // - UNDERFLOW_BIN for the iaxis underflow bin // - OVERFLOW_BIN for the iaxis overflow bin a_offset = 0; if(!m_dimension) return false; bn_t ibin; for(dim_t iaxis=0;iaxis m_bin_entries; std::vector m_bin_Sw; std::vector m_bin_Sw2; std::vector< std::vector > m_bin_Sxw; std::vector< std::vector > m_bin_Sx2w; // Axes : std::vector< axis > m_axes; // etc : std::map m_annotations; }; }} #endif