The Gaudi Framework  master (01b473db)
H1.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #pragma once
12 // ============================================================================
13 // Include files
14 // ============================================================================
15 namespace {
16  // ==========================================================================
18  typedef std::pair<double, double> Bin;
20  typedef std::vector<Bin> Bins;
21  // ==========================================================================
27  struct Edges final {
28  //
29  void setHighEdge( double value ) { high = value; }
30  void setLowEdge( double value ) { low = value; }
31  void setNBins( unsigned int value ) { nbins = value; }
32  void setEdges( std::vector<double> value ) { edges = std::move( value ); }
33  //
34  Edges& operator-=( double value ) {
35  setLowEdge( value );
36  return *this;
37  }
38  Edges& operator+=( double value ) {
39  setHighEdge( value );
40  return *this;
41  }
42  Edges& operator*=( std::vector<double> value ) {
43  setEdges( std::move( value ) );
44  return *this;
45  }
46  Edges& operator/=( unsigned int value ) {
47  setNBins( value );
48  return *this;
49  }
50  //
51  bool ok() const { return edges.empty() ? low < high && 0 < nbins : 2 < edges.size(); }
52  unsigned int nBins() const { return edges.empty() ? nbins : edges.size() - 1; }
53  //
54  double low;
55  double high;
56  unsigned int nbins;
57  std::vector<double> edges;
58  };
59  // ==========================================================================
65  struct H1 final {
66  //
67  void setName( std::string value ) { m_name = std::move( value ); }
68  void setTitle( std::string value ) { m_title = std::move( value ); }
69 
70  void setEdges( Edges value ) { m_edges = std::move( value ); }
71  void setHighEdge( const double value ) { m_edges.setHighEdge( value ); }
72  void setLowEdge( const double value ) { m_edges.setLowEdge( value ); }
73  void setNBins( const unsigned int value ) { m_edges.setNBins( value ); }
74 
75  void setBins( Bins value ) { m_bins = std::move( value ); }
76  //
77  H1& operator*=( std::string value ) {
78  setName( std::move( value ) );
79  return *this;
80  }
81  H1& operator/=( std::string value ) {
82  setTitle( std::move( value ) );
83  return *this;
84  }
85  H1& operator^=( const double value ) {
86  setHighEdge( value );
87  return *this;
88  }
89  H1& operator-=( const double value ) {
90  setLowEdge( value );
91  return *this;
92  }
93  H1& operator|=( const unsigned int value ) {
94  setNBins( value );
95  return *this;
96  }
97 
98  H1& operator&=( Edges value ) {
99  setEdges( std::move( value ) );
100  return *this;
101  }
102  H1& operator+=( Bins value ) {
103  setBins( std::move( value ) );
104  return *this;
105  }
106  //
107  bool ok() const {
108  if ( m_bins.empty() ) { return false; }
109  if ( !m_edges.ok() ) { return false; }
110  if ( m_bins.size() != m_edges.nBins() + 2 ) { return false; }
111  return true;
112  }
113  //
114  std::string m_name;
115  std::string m_title;
116  Edges m_edges;
117  Bins m_bins;
118  };
119  // ==========================================================================
125  struct H2 final {
126  //
127  void setName( std::string value ) { m_name = std::move( value ); }
128  void setTitle( std::string value ) { m_title = std::move( value ); }
129  void setXEdges( Edges value ) { m_xedges = std::move( value ); }
130  void setYEdges( Edges value ) { m_yedges = std::move( value ); }
131  void setBins( Bins value ) { m_bins = std::move( value ); }
132  //
133  H2& operator*=( std::string value ) {
134  setName( std::move( value ) );
135  return *this;
136  }
137  H2& operator/=( std::string value ) {
138  setTitle( std::move( value ) );
139  return *this;
140  }
141  H2& operator&=( Edges value ) {
142  setXEdges( std::move( value ) );
143  return *this;
144  }
145  H2& operator|=( Edges value ) {
146  setYEdges( std::move( value ) );
147  return *this;
148  }
149  H2& operator+=( Bins value ) {
150  setBins( std::move( value ) );
151  return *this;
152  }
153  //
154  bool ok() const {
155  if ( m_bins.empty() ) { return false; }
156  if ( !m_xedges.ok() ) { return false; }
157  if ( !m_yedges.ok() ) { return false; }
158  if ( m_bins.size() != ( m_xedges.nBins() + 2 ) * ( m_yedges.nBins() + 2 ) ) { return false; }
159  return true;
160  }
161  //
162  //
163  std::string m_name;
164  std::string m_title;
165  Edges m_xedges;
166  Edges m_yedges;
167  Bins m_bins;
168  };
169  // ==========================================================================
175  struct H3 final {
176  //
177  void setName( std::string value ) { m_name = std::move( value ); }
178  void setTitle( std::string value ) { m_title = std::move( value ); }
179  void setXEdges( Edges value ) { m_xedges = std::move( value ); }
180  void setYEdges( Edges value ) { m_yedges = std::move( value ); }
181  void setZEdges( Edges value ) { m_zedges = std::move( value ); }
182  void setBins( Bins value ) { m_bins = std::move( value ); }
183  //
184  H3& operator*=( std::string value ) {
185  setName( std::move( value ) );
186  return *this;
187  }
188  H3& operator/=( std::string value ) {
189  setTitle( std::move( value ) );
190  return *this;
191  }
192  H3& operator&=( Edges value ) {
193  setXEdges( std::move( value ) );
194  return *this;
195  }
196  H3& operator|=( Edges value ) {
197  setYEdges( std::move( value ) );
198  return *this;
199  }
200  H3& operator-=( Edges value ) {
201  setZEdges( std::move( value ) );
202  return *this;
203  }
204  H3& operator+=( Bins value ) {
205  setBins( std::move( value ) );
206  return *this;
207  }
208  //
209  bool ok() const {
210  if ( m_bins.empty() ) { return false; }
211  if ( !m_xedges.ok() ) { return false; }
212  if ( !m_yedges.ok() ) { return false; }
213  if ( !m_zedges.ok() ) { return false; }
214  if ( m_bins.size() != ( m_xedges.nBins() + 2 ) * ( m_yedges.nBins() + 2 ) * ( m_zedges.nBins() + 2 ) ) {
215  return false;
216  }
217  return true;
218  }
219  //
220  //
221  std::string m_name;
222  std::string m_title;
223  Edges m_xedges;
224  Edges m_yedges;
225  Edges m_zedges;
226  Bins m_bins;
227  };
228 
229  // ==========================================================================
230 } // end of anonymous namespace
231 // ============================================================================
232 // The END
233 // ============================================================================