Geant4 Cross Reference |
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_axes 4 #ifndef tools_histo_axes 5 #define tools_histo_axes 5 #define tools_histo_axes 6 6 7 #include "axis" 7 #include "axis" 8 8 9 namespace tools { 9 namespace tools { 10 namespace histo { 10 namespace histo { 11 11 12 //TC is for a coordinate. 12 //TC is for a coordinate. 13 //TO is for an offset used to identify a bin. 13 //TO is for an offset used to identify a bin. 14 14 15 template <class TC,class TO> 15 template <class TC,class TO> 16 inline bool is_out(const std::vector< axis<TC, 16 inline bool is_out(const std::vector< axis<TC,TO> >& a_axes,TO a_offset) { 17 TO offset = a_offset; 17 TO offset = a_offset; 18 int index; 18 int index; 19 typename std::vector< axis<TC,TO> >::size_ty 19 typename std::vector< axis<TC,TO> >::size_type dimension = a_axes.size(); 20 for(int iaxis=int(dimension)-1;iaxis>=0;iaxi 20 for(int iaxis=int(dimension)-1;iaxis>=0;iaxis--) { 21 index = int(offset/a_axes[iaxis].m_offset) 21 index = int(offset/a_axes[iaxis].m_offset); 22 if(index==0) return true; 22 if(index==0) return true; 23 if(index==(int(a_axes[iaxis].m_number_of_b 23 if(index==(int(a_axes[iaxis].m_number_of_bins)+1)) return true; 24 offset -= index * a_axes[iaxis].m_offset; 24 offset -= index * a_axes[iaxis].m_offset; 25 } 25 } 26 return false; 26 return false; 27 } 27 } 28 28 29 template <class TC,class TO> 29 template <class TC,class TO> 30 inline void get_indices(const std::vector< axi 30 inline void get_indices(const std::vector< axis<TC,TO> >& a_axes,TO a_offset,std::vector<int>& a_is) { 31 TO offset = a_offset; 31 TO offset = a_offset; 32 typename std::vector< axis<TC,TO> >::size_ty 32 typename std::vector< axis<TC,TO> >::size_type dimension = a_axes.size(); 33 {for(int iaxis=int(dimension)-1;iaxis>=0;iaxi 33 {for(int iaxis=int(dimension)-1;iaxis>=0;iaxis--) { 34 a_is[iaxis] = int(offset/a_axes[iaxis].m_o 34 a_is[iaxis] = int(offset/a_axes[iaxis].m_offset); 35 offset -= a_is[iaxis] * a_axes[iaxis].m_of 35 offset -= a_is[iaxis] * a_axes[iaxis].m_offset; 36 }} 36 }} 37 typedef unsigned int dim_t; 37 typedef unsigned int dim_t; 38 for(dim_t iaxis=0;iaxis<dimension;iaxis++) { 38 for(dim_t iaxis=0;iaxis<dimension;iaxis++) { 39 if(a_is[iaxis]==0) { 39 if(a_is[iaxis]==0) { 40 a_is[iaxis] = axis_UNDERFLOW_BIN; 40 a_is[iaxis] = axis_UNDERFLOW_BIN; 41 } else if(a_is[iaxis]==int(a_axes[iaxis].m 41 } else if(a_is[iaxis]==int(a_axes[iaxis].m_number_of_bins)+1) { 42 a_is[iaxis] = axis_OVERFLOW_BIN; 42 a_is[iaxis] = axis_OVERFLOW_BIN; 43 } else { 43 } else { 44 a_is[iaxis]--; 44 a_is[iaxis]--; 45 } 45 } 46 } 46 } 47 } 47 } 48 48 49 template <class TC,class TO> 49 template <class TC,class TO> 50 inline bool get_offset(const std::vector< axis 50 inline bool get_offset(const std::vector< axis<TC,TO> >& a_axes,const std::vector<int>& a_is,TO& a_offset) { 51 // a_is[iaxis] is given in in-range indexing 51 // a_is[iaxis] is given in in-range indexing : 52 // - [0,n[iaxis]-1] for in-range bins 52 // - [0,n[iaxis]-1] for in-range bins 53 // - UNDERFLOW_BIN for the iaxis underflow 53 // - UNDERFLOW_BIN for the iaxis underflow bin 54 // - OVERFLOW_BIN for the iaxis overflow bi 54 // - OVERFLOW_BIN for the iaxis overflow bin 55 a_offset = 0; 55 a_offset = 0; 56 if(a_axes.empty()) return false; 56 if(a_axes.empty()) return false; 57 typename std::vector< axis<TC,TO> >::size_ty 57 typename std::vector< axis<TC,TO> >::size_type dimension = a_axes.size(); 58 typename axis<TC,TO>::bn_t ibin; 58 typename axis<TC,TO>::bn_t ibin; 59 typedef unsigned int dim_t; 59 typedef unsigned int dim_t; 60 for(dim_t iaxis=0;iaxis<dimension;iaxis++) { 60 for(dim_t iaxis=0;iaxis<dimension;iaxis++) { 61 if(!a_axes[iaxis].in_range_to_absolute_ind 61 if(!a_axes[iaxis].in_range_to_absolute_index(a_is[iaxis],ibin)) { 62 a_offset = 0; 62 a_offset = 0; 63 return false; 63 return false; 64 } 64 } 65 a_offset += ibin * a_axes[iaxis].m_offset; 65 a_offset += ibin * a_axes[iaxis].m_offset; 66 } 66 } 67 return true; 67 return true; 68 } 68 } 69 69 70 }} 70 }} 71 71 72 #endif 72 #endif 73 73 74 74 75 75 76 76