46 inline void FillVector(std::vector<double> &v,
int size, T *a)
49 for (
auto i : ROOT::TSeq<int>(size + 1))
54 inline void FillVector<double>(std::vector<double> &v,
int size,
double *a)
56 v.assign(a, a + (
size_t)(size + 1));
59 inline void SetAxisProperties(
const TAxis *axis,
double &low,
double &up, std::vector<double> &edges)
63 if (!axis->GetXbins()->fN) {
64 low = axis->GetXmin();
68 const auto size = axis->GetNbins() + 1;
70 for (
auto i : ROOT::TSeq<int>(1, size))
71 edges.push_back(axis->GetBinLowEdge(i));
72 edges.push_back(axis->GetBinUpEdge(size - 1));
80 TH1DModel::TH1DModel(const ::TH1D &h) : fName(h.GetName()), fTitle(h.GetTitle()), fNbinsX(h.GetNbinsX())
82 SetAxisProperties(h.GetXaxis(), fXLow, fXUp, fBinXEdges);
84 TH1DModel::TH1DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup)
85 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup)
88 TH1DModel::TH1DModel(
const char *name,
const char *title,
int nbinsx,
const float *xbins)
89 : fName(name), fTitle(title), fNbinsX(nbinsx)
91 FillVector(fBinXEdges, nbinsx, xbins);
93 TH1DModel::TH1DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins)
94 : fName(name), fTitle(title), fNbinsX(nbinsx)
96 FillVector(fBinXEdges, nbinsx, xbins);
98 std::shared_ptr<::TH1D> TH1DModel::GetHistogram()
const
100 std::shared_ptr<::TH1D> h;
101 if (fBinXEdges.empty())
102 h = std::make_shared<::TH1D>(fName, fTitle, fNbinsX, fXLow, fXUp);
104 h = std::make_shared<::TH1D>(fName, fTitle, fNbinsX, fBinXEdges.data());
106 h->SetDirectory(
nullptr);
109 TH1DModel::~TH1DModel()
113 TH2DModel::TH2DModel(const ::TH2D &h)
114 : fName(h.GetName()), fTitle(h.GetTitle()), fNbinsX(h.GetNbinsX()), fNbinsY(h.GetNbinsY())
116 SetAxisProperties(h.GetXaxis(), fXLow, fXUp, fBinXEdges);
117 SetAxisProperties(h.GetYaxis(), fYLow, fYUp, fBinYEdges);
119 TH2DModel::TH2DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
int nbinsy,
double ylow,
121 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fNbinsY(nbinsy), fYLow(ylow), fYUp(yup)
124 TH2DModel::TH2DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins,
int nbinsy,
double ylow,
126 : fName(name), fTitle(title), fNbinsX(nbinsx), fNbinsY(nbinsy), fYLow(ylow), fYUp(yup)
128 FillVector(fBinXEdges, nbinsx, xbins);
130 TH2DModel::TH2DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
int nbinsy,
132 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fNbinsY(nbinsy)
134 FillVector(fBinYEdges, nbinsy, ybins);
136 TH2DModel::TH2DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins,
int nbinsy,
138 : fName(name), fTitle(title), fNbinsX(nbinsx), fNbinsY(nbinsy)
140 FillVector(fBinXEdges, nbinsx, xbins);
141 FillVector(fBinYEdges, nbinsy, ybins);
143 TH2DModel::TH2DModel(
const char *name,
const char *title,
int nbinsx,
const float *xbins,
int nbinsy,
145 : fName(name), fTitle(title), fNbinsX(nbinsx), fNbinsY(nbinsy)
147 FillVector(fBinXEdges, nbinsx, xbins);
148 FillVector(fBinYEdges, nbinsy, ybins);
150 std::shared_ptr<::TH2D> TH2DModel::GetHistogram()
const
152 auto xEdgesEmpty = fBinXEdges.empty();
153 auto yEdgesEmpty = fBinYEdges.empty();
154 std::shared_ptr<::TH2D> h;
155 if (xEdgesEmpty && yEdgesEmpty)
156 h = std::make_shared<::TH2D>(fName, fTitle, fNbinsX, fXLow, fXUp, fNbinsY, fYLow, fYUp);
157 else if (!xEdgesEmpty && yEdgesEmpty)
158 h = std::make_shared<::TH2D>(fName, fTitle, fNbinsX, fBinXEdges.data(), fNbinsY, fYLow, fYUp);
159 else if (xEdgesEmpty && !yEdgesEmpty)
160 h = std::make_shared<::TH2D>(fName, fTitle, fNbinsX, fXLow, fXUp, fNbinsY, fBinYEdges.data());
162 h = std::make_shared<::TH2D>(fName, fTitle, fNbinsX, fBinXEdges.data(), fNbinsY, fBinYEdges.data());
164 h->SetDirectory(
nullptr);
167 TH2DModel::~TH2DModel()
171 TH3DModel::TH3DModel(const ::TH3D &h)
172 : fName(h.GetName()), fTitle(h.GetTitle()), fNbinsX(h.GetNbinsX()), fNbinsY(h.GetNbinsY()), fNbinsZ(h.GetNbinsZ())
174 SetAxisProperties(h.GetXaxis(), fXLow, fXUp, fBinXEdges);
175 SetAxisProperties(h.GetYaxis(), fYLow, fYUp, fBinYEdges);
176 SetAxisProperties(h.GetZaxis(), fZLow, fZUp, fBinZEdges);
178 TH3DModel::TH3DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
int nbinsy,
double ylow,
179 double yup,
int nbinsz,
double zlow,
double zup)
180 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fNbinsY(nbinsy), fYLow(ylow), fYUp(yup),
181 fNbinsZ(nbinsz), fZLow(zlow), fZUp(zup)
184 TH3DModel::TH3DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins,
int nbinsy,
185 const double *ybins,
int nbinsz,
const double *zbins)
186 : fName(name), fTitle(title), fNbinsX(nbinsx), fNbinsY(nbinsy), fNbinsZ(nbinsz)
188 FillVector(fBinXEdges, nbinsx, xbins);
189 FillVector(fBinYEdges, nbinsy, ybins);
190 FillVector(fBinZEdges, nbinsz, zbins);
192 TH3DModel::TH3DModel(
const char *name,
const char *title,
int nbinsx,
const float *xbins,
int nbinsy,
193 const float *ybins,
int nbinsz,
const float *zbins)
194 : fName(name), fTitle(title), fNbinsX(nbinsx), fNbinsY(nbinsy), fNbinsZ(nbinsz)
196 FillVector(fBinXEdges, nbinsx, xbins);
197 FillVector(fBinYEdges, nbinsy, ybins);
198 FillVector(fBinZEdges, nbinsz, zbins);
200 std::shared_ptr<::TH3D> TH3DModel::GetHistogram()
const
202 std::shared_ptr<::TH3D> h;
203 if (fBinXEdges.empty() && fBinYEdges.empty() && fBinZEdges.empty())
204 h = std::make_shared<::TH3D>(fName, fTitle, fNbinsX, fXLow, fXUp, fNbinsY, fYLow, fYUp, fNbinsZ, fZLow, fZUp);
206 h = std::make_shared<::TH3D>(fName, fTitle, fNbinsX, fBinXEdges.data(), fNbinsY, fBinYEdges.data(), fNbinsZ,
209 h->SetDirectory(
nullptr);
212 TH3DModel::~TH3DModel()
218 TProfile1DModel::TProfile1DModel(const ::TProfile &h)
219 : fName(h.GetName()), fTitle(h.GetTitle()), fNbinsX(h.GetNbinsX()), fXLow(h.GetXaxis()->GetXmin()),
220 fXUp(h.GetXaxis()->GetXmax()), fYLow(h.GetYmin()), fYUp(h.GetYmax()), fOption(h.GetErrorOption())
222 SetAxisProperties(h.GetXaxis(), fXLow, fXUp, fBinXEdges);
224 TProfile1DModel::TProfile1DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
226 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fOption(option)
230 TProfile1DModel::TProfile1DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
double ylow,
231 double yup,
const char *option)
232 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fYLow(ylow), fYUp(yup), fOption(option)
236 TProfile1DModel::TProfile1DModel(
const char *name,
const char *title,
int nbinsx,
const float *xbins,
238 : fName(name), fTitle(title), fNbinsX(nbinsx), fOption(option)
240 FillVector(fBinXEdges, nbinsx, xbins);
242 TProfile1DModel::TProfile1DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins,
244 : fName(name), fTitle(title), fNbinsX(nbinsx), fOption(option)
246 FillVector(fBinXEdges, nbinsx, xbins);
248 TProfile1DModel::TProfile1DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins,
double ylow,
249 double yup,
const char *option)
250 : fName(name), fTitle(title), fNbinsX(nbinsx), fYLow(ylow), fYUp(yup), fOption(option)
252 FillVector(fBinXEdges, nbinsx, xbins);
254 std::shared_ptr<::TProfile> TProfile1DModel::GetProfile()
const
256 std::shared_ptr<::TProfile> prof;
258 if (fBinXEdges.empty())
259 prof = std::make_shared<::TProfile>(fName, fTitle, fNbinsX, fXLow, fXUp, fYLow, fYUp, fOption);
261 prof = std::make_shared<::TProfile>(fName, fTitle, fNbinsX, fBinXEdges.data(), fYLow, fYUp, fOption);
263 prof->SetDirectory(
nullptr);
266 TProfile1DModel::~TProfile1DModel()
270 TProfile2DModel::TProfile2DModel(const ::TProfile2D &h)
271 : fName(h.GetName()), fTitle(h.GetTitle()), fNbinsX(h.GetNbinsX()), fXLow(h.GetXaxis()->GetXmin()),
272 fXUp(h.GetXaxis()->GetXmax()), fNbinsY(h.GetNbinsY()), fYLow(h.GetYaxis()->GetXmin()),
273 fYUp(h.GetYaxis()->GetXmax()), fZLow(h.GetZmin()), fZUp(h.GetZmax()), fOption(h.GetErrorOption())
275 SetAxisProperties(h.GetXaxis(), fXLow, fXUp, fBinXEdges);
276 SetAxisProperties(h.GetYaxis(), fYLow, fYUp, fBinYEdges);
278 TProfile2DModel::TProfile2DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
int nbinsy,
279 double ylow,
double yup,
const char *option)
280 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fNbinsY(nbinsy), fYLow(ylow), fYUp(yup),
285 TProfile2DModel::TProfile2DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
int nbinsy,
286 double ylow,
double yup,
double zlow,
double zup,
const char *option)
287 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fNbinsY(nbinsy), fYLow(ylow), fYUp(yup),
288 fZLow(zlow), fZUp(zup), fOption(option)
292 TProfile2DModel::TProfile2DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins,
int nbinsy,
293 double ylow,
double yup,
const char *option)
294 : fName(name), fTitle(title), fNbinsX(nbinsx), fNbinsY(nbinsy), fYLow(ylow), fYUp(yup), fOption(option)
296 FillVector(fBinXEdges, nbinsx, xbins);
299 TProfile2DModel::TProfile2DModel(
const char *name,
const char *title,
int nbinsx,
double xlow,
double xup,
int nbinsy,
300 const double *ybins,
const char *option)
301 : fName(name), fTitle(title), fNbinsX(nbinsx), fXLow(xlow), fXUp(xup), fNbinsY(nbinsy), fOption(option)
303 FillVector(fBinYEdges, nbinsy, ybins);
306 TProfile2DModel::TProfile2DModel(
const char *name,
const char *title,
int nbinsx,
const double *xbins,
int nbinsy,
307 const double *ybins,
const char *option)
308 : fName(name), fTitle(title), fNbinsX(nbinsx), fNbinsY(nbinsy), fOption(option)
310 FillVector(fBinXEdges, nbinsx, xbins);
311 FillVector(fBinYEdges, nbinsy, ybins);
314 std::shared_ptr<::TProfile2D> TProfile2DModel::GetProfile()
const
321 auto xEdgesEmpty = fBinXEdges.empty();
322 auto yEdgesEmpty = fBinYEdges.empty();
323 std::shared_ptr<::TProfile2D> prof;
324 if (xEdgesEmpty && yEdgesEmpty) {
325 prof = std::make_shared<::TProfile2D>(fName, fTitle, fNbinsX, fXLow, fXUp, fNbinsY, fYLow, fYUp, fZLow, fZUp,
327 }
else if (!xEdgesEmpty && yEdgesEmpty) {
328 prof = std::make_shared<::TProfile2D>(fName, fTitle, fNbinsX, fBinXEdges.data(), fNbinsY, fYLow, fYUp, fOption);
329 }
else if (xEdgesEmpty && !yEdgesEmpty) {
330 prof = std::make_shared<::TProfile2D>(fName, fTitle, fNbinsX, fXLow, fXUp, fNbinsY, fBinYEdges.data(), fOption);
333 std::make_shared<::TProfile2D>(fName, fTitle, fNbinsX, fBinXEdges.data(), fNbinsY, fBinYEdges.data(), fOption);
341 TProfile2DModel::~TProfile2DModel()