g4tools  5.4.0
axes
Go to the documentation of this file.
1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
2 // See the file tools.license for terms.
3 
4 #ifndef tools_histo_axes
5 #define tools_histo_axes
6 
7 #include "axis"
8 
9 namespace tools {
10 namespace histo {
11 
12 //TC is for a coordinate.
13 //TO is for an offset used to identify a bin.
14 
15 template <class TC,class TO>
16 inline bool is_out(const std::vector< axis<TC,TO> >& a_axes,TO a_offset) {
17  TO offset = a_offset;
18  int index;
19  typename std::vector< axis<TC,TO> >::size_type dimension = a_axes.size();
20  for(int iaxis=int(dimension)-1;iaxis>=0;iaxis--) {
21  index = int(offset/a_axes[iaxis].m_offset);
22  if(index==0) return true;
23  if(index==(int(a_axes[iaxis].m_number_of_bins)+1)) return true;
24  offset -= index * a_axes[iaxis].m_offset;
25  }
26  return false;
27 }
28 
29 template <class TC,class TO>
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;
32  typename std::vector< axis<TC,TO> >::size_type dimension = a_axes.size();
33  {for(int iaxis=int(dimension)-1;iaxis>=0;iaxis--) {
34  a_is[iaxis] = int(offset/a_axes[iaxis].m_offset);
35  offset -= a_is[iaxis] * a_axes[iaxis].m_offset;
36  }}
37  typedef unsigned int dim_t;
38  for(dim_t iaxis=0;iaxis<dimension;iaxis++) {
39  if(a_is[iaxis]==0) {
40  a_is[iaxis] = axis_UNDERFLOW_BIN;
41  } else if(a_is[iaxis]==int(a_axes[iaxis].m_number_of_bins)+1) {
42  a_is[iaxis] = axis_OVERFLOW_BIN;
43  } else {
44  a_is[iaxis]--;
45  }
46  }
47 }
48 
49 template <class TC,class TO>
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 :
52  // - [0,n[iaxis]-1] for in-range bins
53  // - UNDERFLOW_BIN for the iaxis underflow bin
54  // - OVERFLOW_BIN for the iaxis overflow bin
55  a_offset = 0;
56  if(a_axes.empty()) return false;
57  typename std::vector< axis<TC,TO> >::size_type dimension = a_axes.size();
58  typename axis<TC,TO>::bn_t ibin;
59  typedef unsigned int dim_t;
60  for(dim_t iaxis=0;iaxis<dimension;iaxis++) {
61  if(!a_axes[iaxis].in_range_to_absolute_index(a_is[iaxis],ibin)) {
62  a_offset = 0;
63  return false;
64  }
65  a_offset += ibin * a_axes[iaxis].m_offset;
66  }
67  return true;
68 }
69 
70 }}
71 
72 #endif
73 
74 
75 
76 
tools::histo::axis::m_offset
TO m_offset
Definition: axis:264
tools::histo::axis_UNDERFLOW_BIN
@ axis_UNDERFLOW_BIN
Definition: axis:13
tools::histo::get_offset
bool get_offset(const std::vector< axis< TC, TO > > &a_axes, const std::vector< int > &a_is, TO &a_offset)
Definition: axes:50
tools::histo::axis
Definition: axis:19
tools::histo::axis_OVERFLOW_BIN
@ axis_OVERFLOW_BIN
Definition: axis:13
tools::histo::is_out
bool is_out(const std::vector< axis< TC, TO > > &a_axes, TO a_offset)
Definition: axes:16
axis
tools::histo::get_indices
void get_indices(const std::vector< axis< TC, TO > > &a_axes, TO a_offset, std::vector< int > &a_is)
Definition: axes:30
tools
inlined C code : ///////////////////////////////////
Definition: aida_ntuple:26
tools::histo::axis::bn_t
unsigned int bn_t
Definition: axis:21