// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_histo_b2 #define tools_histo_b2 #include "base_histo" #include namespace tools { namespace histo { template class b2 : public base_histo { typedef base_histo parent; protected: enum {AxisX=0,AxisY=1}; public: typedef base_histo base_histo_t; typedef typename parent::axis_t axis_t; typedef typename parent::bn_t bn_t; public: virtual TH bin_error(int,int) const = 0; //for print public: // Partition : TC mean_x() const { if(parent::m_in_range_Sw==0) return 0; return parent::m_in_range_Sxw[0]/parent::m_in_range_Sw; } TC mean_y() const { if(parent::m_in_range_Sw==0) return 0; return parent::m_in_range_Sxw[1]/parent::m_in_range_Sw; } TC rms_x() const { if(parent::m_in_range_Sw==0) return 0; TC mean = parent::m_in_range_Sxw[0]/parent::m_in_range_Sw; return ::sqrt(::fabs((parent::m_in_range_Sx2w[0] / parent::m_in_range_Sw) - mean * mean)); } TC rms_y() const { if(parent::m_in_range_Sw==0) return 0; TC mean = parent::m_in_range_Sxw[1]/parent::m_in_range_Sw; return ::sqrt(::fabs((parent::m_in_range_Sx2w[1] / parent::m_in_range_Sw) - mean * mean)); } int coord_to_index_x(TC aCoord) const { return axis_x().coord_to_index(aCoord); } int coord_to_index_y(TC aCoord) const { return axis_y().coord_to_index(aCoord); } // bins : TN bin_entries(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return parent::m_bin_entries[offset]; } TW bin_Sw(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return parent::m_bin_Sw[offset]; } TW bin_Sw2(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return parent::m_bin_Sw2[offset]; } TC bin_Sxw(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return parent::m_bin_Sxw[offset][AxisX]; } TC bin_Sx2w(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return parent::m_bin_Sx2w[offset][AxisX]; } TC bin_Syw(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return parent::m_bin_Sxw[offset][AxisY]; } TC bin_Sy2w(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return parent::m_bin_Sx2w[offset][AxisY]; } TH bin_height(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; return this->get_bin_height(offset); } TC bin_center_x(int aI) const { return parent::m_axes[0].bin_center(aI); } TC bin_center_y(int aJ) const { return parent::m_axes[1].bin_center(aJ); } TC bin_mean_x(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; TW sw = parent::m_bin_Sw[offset]; if(sw==0) return 0; return parent::m_bin_Sxw[offset][AxisX]/sw; } TC bin_mean_y(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; TW sw = parent::m_bin_Sw[offset]; if(sw==0) return 0; return parent::m_bin_Sxw[offset][AxisY]/sw; } TC bin_rms_x(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; TW sw = parent::m_bin_Sw[offset]; if(sw==0) return 0; TC sxw = parent::m_bin_Sxw[offset][AxisX]; TC sx2w = parent::m_bin_Sx2w[offset][AxisX]; TC mean = sxw/sw; return ::sqrt(::fabs((sx2w / sw) - mean * mean)); } TC bin_rms_y(int aI,int aJ) const { TO offset; if(!_find_offset(aI,aJ,offset)) return 0; TW sw = parent::m_bin_Sw[offset]; if(sw==0) return 0; TC sxw = parent::m_bin_Sxw[offset][AxisY]; TC sx2w = parent::m_bin_Sx2w[offset][AxisY]; TC mean = sxw/sw; return ::sqrt(::fabs((sx2w / sw) - mean * mean)); } // Axes : const axis_t& axis_x() const {return parent::m_axes[0];} const axis_t& axis_y() const {return parent::m_axes[1];} axis_t& axis_x() {return parent::m_axes[0];} //touchy axis_t& axis_y() {return parent::m_axes[1];} //touchy // Projection : TN bin_entries_x(int aI) const { if(!parent::m_dimension) return 0; bn_t ibin; if(!parent::m_axes[0].in_range_to_absolute_index(aI,ibin)) return 0; bn_t ybins = parent::m_axes[1].bins()+2; TO offset; TN _entries = 0; for(bn_t jbin=0;jbinget_bin_height(offset); } return sw; } TN bin_entries_y(int aJ) const { if(!parent::m_dimension) return 0; bn_t jbin; if(!parent::m_axes[1].in_range_to_absolute_index(aJ,jbin)) return 0; bn_t xbins = parent::m_axes[0].bins()+2; TO offset; TN _entries = 0; for(bn_t ibin=0;ibinget_bin_height(offset); } return sw; } TC Sxyw() const {return parent::m_in_range_plane_Sxyw[0];} public: //NOTE : print is a Python keyword. void hprint(std::ostream& a_out) { // A la HPRINT. a_out << parent::dimension() << parent::title() << std::endl; a_out << " * ENTRIES = " << parent::all_entries() << std::endl; // 6 | 7 | 8 // ----------- // 3 | 4 | 5 // ----------- // 0 | 1 | 2 TW height_0 = bin_height(axis_t::UNDERFLOW_BIN, axis_t::UNDERFLOW_BIN); TW height_2 = bin_height(axis_t::OVERFLOW_BIN, axis_t::UNDERFLOW_BIN); TW height_6 = bin_height(axis_t::UNDERFLOW_BIN, axis_t::OVERFLOW_BIN); TW height_8 = bin_height(axis_t::OVERFLOW_BIN, axis_t::OVERFLOW_BIN); bn_t i,j; TW height_1 = 0; TW height_7 = 0; for(i=0;i