Project
Loading...
Searching...
No Matches
FlatHisto2D.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
16#ifndef ALICEO2_FLATHISTO2D_H
17#define ALICEO2_FLATHISTO2D_H
18
19#include <Rtypes.h>
20#include <vector>
21#include <gsl/span>
22#include <type_traits>
23#include <cassert>
24#include <memory>
25
26class TH1F;
27class TH2F;
28
29namespace o2
30{
31namespace dataformats
32{
33
34/*
35 Fast 2D histo class which can be messages as
36 FlatHisto2D<float> histo(nbinsX, xmin, xmax, nbinsY, ymin, ymax);
37 histo.fill(...);
38 pc.outputs().snapshot(Output{"Origin", "Desc", 0}, histo.getBase());
39
40 and received (read only!) as
41 const auto hdata = pc.inputs().get<gsl::span<float>>("histodata");
42 FlatHisto2D<float> histoView;
43 histoView.adoptExternal(hdata);
44 or directly
45 FlatHisto2D<float> histoView(pc.inputs().get<gsl::span<float>>("histodata"));
46*/
47
48template <typename T = float>
50{
51 static_assert(std::is_same<T, float>::value || std::is_same<T, double>::value, "T must be float or double");
52
53 public:
54 enum { NBinsX,
63
64 FlatHisto2D() = default;
65 FlatHisto2D(uint32_t nbx, T xmin, T xmax, uint32_t nby, T ymin, T ymax);
66 FlatHisto2D(const gsl::span<const T> ext) { adoptExternal(ext); }
69 void adoptExternal(const gsl::span<const T> ext);
70 void init()
71 {
72 // when reading from file, need to call this method to make it operational
73 assert(mContainer.size() > NServiceSlots);
74 init(gsl::span<const T>(mContainer.data(), mContainer.size()));
75 }
76 void init(uint32_t nbx, T xmin, T xmax, uint32_t nby, T ymin, T ymax);
77 uint32_t getNBinsX() const { return mNBinsX; }
78 uint32_t getNBinsY() const { return mNBinsY; }
79 uint32_t getNBins() const { return getNBinsX() * getNBinsY(); }
80
81 T getXMin() const { return mXMin; }
82 T getXMax() const { return mXMax; }
83 T getYMin() const { return mYMin; }
84 T getYMax() const { return mYMax; }
85 T getBinSizeX() const { return mBinSizeX; }
86 T getBinSizeY() const { return mBinSizeY; }
87 T getBinSizeXInv() const { return mBinSizeXInv; }
88 T getBinSizeYInv() const { return mBinSizeYInv; }
89
90 T getBinContent(uint32_t ib) const
91 {
92 assert(ib < getNBins());
93 return mDataPtr[ib];
94 }
95
96 T getBinContent(uint32_t ibx, uint32_t iby) const { return getBinContent(getGlobalBin(ibx, iby)); }
97
98 T getBinContentForXY(T x, T y) const { return getBinContent(getBinX(x), getBinY(y)); }
99
100 bool isValidBin(uint32_t bin) const { return bin < getNBins(); }
101 bool isBinEmpty(uint32_t bin) const { return getBinContent(bin) == 0; }
102
103 T getBinXStart(uint32_t i) const
104 {
105 assert(i < getNBinsX());
106 return getXMin() + i * getBinSizeX();
107 }
108
109 T getBinXCenter(uint32_t i) const
110 {
111 assert(i < getNBinsX());
112 return getXMin() + (i + 0.5) * getBinSizeX();
113 }
114
115 T getBinXEnd(uint32_t i) const
116 {
117 assert(i < getNBinsX());
118 return getXMin() + (i + 1) * getBinSizeX();
119 }
120
121 T getBinYStart(uint32_t i) const
122 {
123 assert(i < getNBinsY());
124 return getYMin() + i * getBinSizeY();
125 }
126
127 T getBinYCenter(uint32_t i) const
128 {
129 assert(i < getNBinsY());
130 return getYMin() + (i + 0.5) * getBinSizeY();
131 }
132
133 T getBinYEnd(uint32_t i) const
134 {
135 assert(i < getNBinsY());
136 return getYMin() + (i + 1) * getBinSizeY();
137 }
138
139 uint32_t getXBin(uint32_t i) const { return i / getNBinsY(); }
140 uint32_t getYBin(uint32_t i) const { return i % getNBinsY(); }
141
142 void add(const FlatHisto2D& other);
143
144 void subtract(const FlatHisto2D& other);
145
146 void setBinContent(uint32_t bin, T w)
147 {
148 assert(canFill() && isValidBin(bin));
149 mDataPtr[bin] = w;
150 }
151
152 void setBinContent(uint32_t binX, uint32_t binY, T w)
153 {
154 auto bin = getGlobalBin(binX, binY);
155 setBinContent(bin, w);
156 }
157
158 void clear()
159 {
160 assert(canFill());
161 memset(mDataPtr, 0, sizeof(T) * getNBins());
162 }
163
164 T getSum() const;
165
166 int fill(T x, T y)
167 {
168 uint32_t bin = getBin(x, y);
169 if (isValidBin(bin)) {
170 mDataPtr[bin]++;
171 return (int)bin;
172 }
173 return -1;
174 }
175
176 int fill(T x, T y, T w)
177 {
178 uint32_t bin = getBin(x, y);
179 if (isValidBin(bin)) {
180 mDataPtr[bin] += w;
181 return (int)bin;
182 }
183 return -1;
184 }
185
186 void fillBin(uint32_t bin, T w)
187 {
188 if (isValidBin(bin)) {
189 mDataPtr[bin] += w;
190 }
191 }
192
193 void fillBin(uint32_t bx, uint32_t by, T w)
194 {
195 auto bin = getGlobalBin(bx, by);
196 if (isValidBin(bin)) {
197 mDataPtr[bin] += w;
198 }
199 }
200
201 uint32_t getBinX(T x) const
202 {
203 auto dx = x - getXMin();
204 return dx < 0 ? 0xffffffff : uint32_t(dx * getBinSizeXInv());
205 }
206
207 uint32_t getBinY(T y) const
208 {
209 auto dy = y - getYMin();
210 return dy < 0 ? 0xffffffff : uint32_t(dy * getBinSizeYInv());
211 }
212
213 uint32_t getBin(T x, T y) const
214 {
215 auto bx = getBinX(x), by = getBinY(y);
216 return bx < getNBinsX() && by < getNBinsY() ? getGlobalBin(bx, by) : 0xffffffff;
217 }
218
219 bool canFill() const
220 {
221 // histo can be filled only if hase its own data, otherwise only query can be done on the view
222 return mContainer.size() > NServiceSlots;
223 }
224
225 gsl::span<const T> getSliceY(uint32_t binX) const
226 {
227 uint32_t offs = binX * getNBinsY();
228 return binX < getNBinsX() ? gsl::span<const T>(&mDataPtr[offs], getNBinsY()) : gsl::span<const T>();
229 }
230
231 std::unique_ptr<TH2F> createTH2F(const std::string& name = "histo2d") const;
232
233 std::unique_ptr<TH1F> createSliceXTH1F(uint32_t binY, const std::string& name = "histo2dsliceX") const;
234 std::unique_ptr<TH1F> createSliceYTH1F(uint32_t binX, const std::string& name = "histo2dsliceY") const;
235
236 const std::vector<T>& getBase() const { return mContainer; }
237 gsl::span<const T> getView() const { return mContainerView; }
238
239 uint32_t getGlobalBin(uint32_t binX, uint32_t binY) const { return binX * getNBinsY() + binY; }
240
241 protected:
242 void init(const gsl::span<const T> ext);
243
244 std::vector<T> mContainer; // data to fill
245 gsl::span<const T> mContainerView;
246 T* mDataPtr{};
247 T mXMin{};
248 T mXMax{};
249 T mYMin{};
250 T mYMax{};
255 uint32_t mNBinsX{};
256 uint32_t mNBinsY{};
257 uint32_t mNBins{};
258
260};
261
264
265} // namespace dataformats
266} // namespace o2
267
268#endif
int32_t i
uint32_t getBin(T x, T y) const
void fillBin(uint32_t bx, uint32_t by, T w)
void fillBin(uint32_t bin, T w)
uint32_t getNBinsY() const
Definition FlatHisto2D.h:78
uint32_t getGlobalBin(uint32_t binX, uint32_t binY) const
T getBinYEnd(uint32_t i) const
gsl::span< const T > getSliceY(uint32_t binX) const
gsl::span< const T > getView() const
void setBinContent(uint32_t binX, uint32_t binY, T w)
bool isValidBin(uint32_t bin) const
std::vector< T > mContainer
T getBinContentForXY(T x, T y) const
Definition FlatHisto2D.h:98
uint32_t getNBins() const
Definition FlatHisto2D.h:79
T getBinXStart(uint32_t i) const
T getBinXCenter(uint32_t i) const
std::unique_ptr< TH1F > createSliceYTH1F(uint32_t binX, const std::string &name="histo2dsliceY") const
void subtract(const FlatHisto2D &other)
std::unique_ptr< TH1F > createSliceXTH1F(uint32_t binY, const std::string &name="histo2dsliceX") const
bool isBinEmpty(uint32_t bin) const
std::unique_ptr< TH2F > createTH2F(const std::string &name="histo2d") const
gsl::span< const T > mContainerView
T getBinXEnd(uint32_t i) const
T getBinContent(uint32_t ibx, uint32_t iby) const
Definition FlatHisto2D.h:96
void adoptExternal(const gsl::span< const T > ext)
uint32_t getBinY(T y) const
const std::vector< T > & getBase() const
FlatHisto2D & operator=(const FlatHisto2D &rhs)
FlatHisto2D(const gsl::span< const T > ext)
Definition FlatHisto2D.h:66
T getBinContent(uint32_t ib) const
Definition FlatHisto2D.h:90
void setBinContent(uint32_t bin, T w)
void add(const FlatHisto2D &other)
T getBinYStart(uint32_t i) const
uint32_t getBinX(T x) const
uint32_t getNBinsX() const
Definition FlatHisto2D.h:77
uint32_t getXBin(uint32_t i) const
int fill(T x, T y, T w)
T getBinYCenter(uint32_t i) const
uint32_t getYBin(uint32_t i) const
GLint GLenum GLint x
Definition glcorearb.h:403
GLenum src
Definition glcorearb.h:1767
GLuint const GLchar * name
Definition glcorearb.h:781
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
VectorOfTObjectPtrs other