npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
DualAxis.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_DUALAXIS_HH_
2 #define NPSTAT_DUALAXIS_HH_
3 
4 /*!
5 // \file DualAxis.hh
6 //
7 // \brief Represent both equidistant and non-uniform coordinate sets
8 // for rectangular grids
9 //
10 // Author: I. Volobouev
11 //
12 // July 2012
13 */
14 
15 #include "npstat/nm/GridAxis.hh"
16 #include "npstat/nm/UniformAxis.hh"
17 
18 namespace npstat {
19  /**
20  // Rectangular grid axis which can be either uniform or non-uniform.
21  // Will work a little bit slower than either GridAxis or UniformAxis,
22  // but can be used in place of either one of them.
23  */
24  class DualAxis
25  {
26  public:
27  // Constructors
28  inline DualAxis(const GridAxis& g)
29  : a_(g), u_(2, 0.0, 1.0), uniform_(false) {}
30 
31  inline DualAxis(const UniformAxis& u)
32  : a_(dummy_vec()), u_(u), uniform_(true) {}
33 
34  inline DualAxis(unsigned nCoords, double min, double max,
35  const char* label=0)
36  : a_(dummy_vec()), u_(nCoords, min, max, label), uniform_(true) {}
37 
38  inline explicit DualAxis(const std::vector<double>& coords,
39  const bool useLogSpace=false)
40  : a_(coords, useLogSpace), u_(2, 0.0, 1.0), uniform_(false) {}
41 
42  inline DualAxis(const std::vector<double>& coords, const char* label,
43  const bool useLogSpace=false)
44  : a_(coords, label, useLogSpace), u_(2,0.0,1.0), uniform_(false) {}
45 
46  // Inspectors
47  inline bool isUniform() const {return uniform_;}
48 
49  inline unsigned nCoords() const
50  {return uniform_ ? u_.nCoords() : a_.nCoords();}
51 
52  inline double min() const
53  {return uniform_ ? u_.min() : a_.min();}
54 
55  inline double max() const
56  {return uniform_ ? u_.max() : a_.max();}
57 
58  inline const std::string& label() const
59  {return uniform_ ? u_.label() : a_.label();}
60 
61  inline bool usesLogSpace() const
62  {return uniform_ ? u_.usesLogSpace() : a_.usesLogSpace();}
63 
64  inline std::pair<unsigned,double> getInterval(const double x) const
65  {return uniform_ ? u_.getInterval(x) : a_.getInterval(x);}
66 
67  inline std::pair<unsigned,double> linearInterval(const double x) const
68  {return uniform_ ? u_.linearInterval(x) : a_.linearInterval(x);}
69 
70  inline double coordinate(const unsigned i) const
71  {return uniform_ ? u_.coordinate(i) : a_.coordinate(i);}
72 
73  inline double length() const
74  {return uniform_ ? u_.length() : a_.length();}
75 
76  inline unsigned nIntervals() const
77  {return uniform_ ? u_.nIntervals() : a_.nIntervals();}
78 
79  inline double intervalWidth(const unsigned i=0) const
80  {return uniform_ ? u_.intervalWidth(i) : a_.intervalWidth(i);}
81 
82  inline std::vector<double> coords() const
83  {return uniform_ ? u_.coords() : a_.coords();}
84 
85  inline bool operator==(const DualAxis& r) const
86  {return uniform_ == r.uniform_ && a_ == r.a_ && u_ == r.u_;}
87 
88  inline bool operator!=(const DualAxis& r) const
89  {return !(*this == r);}
90 
91  //@{
92  /**
93  // Return a pointer to the underlying axis. This will be
94  // a null pointer if the axis does not correspond to the
95  // constructed type.
96  */
97  inline const GridAxis* getGridAxis() const
98  {return uniform_ ? static_cast<const GridAxis*>(0) : &a_;}
99 
100  inline const UniformAxis* getUniformAxis() const
101  {return uniform_ ? &u_ : static_cast<const UniformAxis*>(0);}
102  //@}
103 
104  /** Modify the axis label */
105  inline void setLabel(const char* newlabel)
106  {uniform_ ? u_.setLabel(newlabel) : a_.setLabel(newlabel);}
107 
108  //@{
109  /** Method related to "geners" I/O */
110  inline gs::ClassId classId() const {return gs::ClassId(*this);}
111  bool write(std::ostream& of) const;
112  //@}
113 
114  static inline const char* classname() {return "npstat::DualAxis";}
115  static inline unsigned version() {return 1;}
116  static DualAxis* read(const gs::ClassId& id, std::istream& in);
117 
118  private:
119  GridAxis a_;
120  UniformAxis u_;
121  bool uniform_;
122 
123  inline static std::vector<double> dummy_vec()
124  {
125  std::vector<double> vec(2, 0.0);
126  vec[1] = 1.0;
127  return vec;
128  }
129 
130 #ifdef SWIG
131  public:
132  inline std::pair<double,double> range() const
133  {return uniform_ ? u_.range() : a_.range();}
134 #endif // SWIG
135 
136  inline DualAxis()
137  : a_(dummy_vec()), u_(2, 0.0, 1.0), uniform_(true) {}
138  };
139 }
140 
141 #endif // NPSTAT_DUALAXIS_HH_
Non-uniformly spaced coordinate sets for use in constructing rectangular grids.
Uniformly spaced coordinate sets for use in constructing rectangular grids.
Definition: DualAxis.hh:25
void setLabel(const char *newlabel)
Definition: DualAxis.hh:105
const GridAxis * getGridAxis() const
Definition: DualAxis.hh:97
gs::ClassId classId() const
Definition: DualAxis.hh:110
Definition: GridAxis.hh:31
unsigned nCoords() const
Definition: GridAxis.hh:95
std::pair< unsigned, double > linearInterval(double coordinate) const
void setLabel(const char *newlabel)
Definition: GridAxis.hh:121
const std::vector< double > & coords() const
Definition: GridAxis.hh:57
std::pair< unsigned, double > getInterval(double coordinate) const
Definition: UniformAxis.hh:28
Definition: AbsArrayProjector.hh:14