262 if constexpr (std::is_base_of_v<CbmQaTable, T>) {
263 static_assert(
sizeof...(Args) == 2);
267 auto iLastSepPos =
static_cast<int>(sName.Last(
';'));
268 TString sTagName = sName(iLastSepPos + 1, sName.Length() - iLastSepPos);
269 if (iLastSepPos != -1) {
270 sName = sName(0, iLastSepPos);
273 bool bUseConfig =
false;
276 if constexpr (std::is_base_of_v<TH1, T>) {
283 else if constexpr (std::is_base_of_v<TCanvas, T>) {
294 const char* title = sTitle.Data();
296 if constexpr (std::is_base_of_v<TH1, T>) {
297 const auto& tagNode =
fConfigNode[
"histograms"][sTagName.Data()];
299 [[maybe_unused]]
int nBinsX = -1;
300 [[maybe_unused]]
double minX = std::numeric_limits<double>::signaling_NaN();
301 [[maybe_unused]]
double maxX = std::numeric_limits<double>::signaling_NaN();
302 [[maybe_unused]]
int nBinsY = -1;
303 [[maybe_unused]]
double minY = std::numeric_limits<double>::signaling_NaN();
304 [[maybe_unused]]
double maxY = std::numeric_limits<double>::signaling_NaN();
305 [[maybe_unused]]
int nBinsZ = -1;
306 [[maybe_unused]]
double minZ = std::numeric_limits<double>::signaling_NaN();
307 [[maybe_unused]]
double maxZ = std::numeric_limits<double>::signaling_NaN();
309 if (
const auto& axisNode = tagNode[
"x"]) {
310 nBinsX = axisNode[
"nbins"].as<
int>();
311 minX = axisNode[
"min"].as<
double>();
312 maxX = axisNode[
"max"].as<
double>();
314 if (
const auto& axisNode = tagNode[
"y"]) {
315 nBinsY = axisNode[
"nbins"].as<
int>();
316 minY = axisNode[
"min"].as<
double>();
317 maxY = axisNode[
"max"].as<
double>();
319 if (
const auto& axisNode = tagNode[
"z"]) {
320 nBinsZ = axisNode[
"nbins"].as<
int>();
321 minZ = axisNode[
"min"].as<
double>();
322 maxZ = axisNode[
"max"].as<
double>();
325 if constexpr (std::is_base_of_v<CbmQaTable, T>) {
328 else if constexpr (std::is_base_of_v<TProfile2D, T>) {
329 CheckProperty(nBinsX, Form(
"qa/histograms/%s/x/nbins", sTagName.Data()));
330 CheckProperty(minX, Form(
"qa/histograms/%s/x/min", sTagName.Data()));
331 CheckProperty(maxX, Form(
"qa/histograms/%s/x/max", sTagName.Data()));
332 CheckProperty(nBinsY, Form(
"qa/histograms/%s/y/nbins", sTagName.Data()));
333 CheckProperty(minY, Form(
"qa/histograms/%s/y/min", sTagName.Data()));
334 CheckProperty(maxY, Form(
"qa/histograms/%s/y/max", sTagName.Data()));
335 CheckProperty(minZ, Form(
"qa/histograms/%s/z/min", sTagName.Data()));
336 CheckProperty(maxZ, Form(
"qa/histograms/%s/z/max", sTagName.Data()));
339 else if constexpr (std::is_base_of_v<TProfile, T>) {
340 CheckProperty(nBinsX, Form(
"qa/histograms/%s/x/nbins", sTagName.Data()));
341 CheckProperty(minX, Form(
"qa/histograms/%s/x/min", sTagName.Data()));
342 CheckProperty(maxX, Form(
"qa/histograms/%s/x/max", sTagName.Data()));
343 CheckProperty(minY, Form(
"qa/histograms/%s/y/min", sTagName.Data()));
344 CheckProperty(maxY, Form(
"qa/histograms/%s/y/max", sTagName.Data()));
347 else if constexpr (std::is_base_of_v<TH3, T>) {
348 CheckProperty(nBinsX, Form(
"qa/histograms/%s/x/nbins", sTagName.Data()));
349 CheckProperty(minX, Form(
"qa/histograms/%s/x/min", sTagName.Data()));
350 CheckProperty(maxX, Form(
"qa/histograms/%s/x/max", sTagName.Data()));
351 CheckProperty(nBinsY, Form(
"qa/histograms/%s/y/nbins", sTagName.Data()));
352 CheckProperty(minY, Form(
"qa/histograms/%s/y/min", sTagName.Data()));
353 CheckProperty(maxY, Form(
"qa/histograms/%s/y/max", sTagName.Data()));
354 CheckProperty(nBinsZ, Form(
"qa/histograms/%s/z/nbins", sTagName.Data()));
355 CheckProperty(minZ, Form(
"qa/histograms/%s/z/min", sTagName.Data()));
356 CheckProperty(maxZ, Form(
"qa/histograms/%s/z/max", sTagName.Data()));
357 return ConstructAndRegisterQaObject<T>(sName, title, nBinsX, minX, maxX, nBinsY, minY, maxY, nBinsZ, minZ,
360 else if constexpr (std::is_base_of_v<TH2, T>) {
361 CheckProperty(nBinsX, Form(
"qa/histograms/%s/x/nbins", sTagName.Data()));
362 CheckProperty(minX, Form(
"qa/histograms/%s/x/min", sTagName.Data()));
363 CheckProperty(maxX, Form(
"qa/histograms/%s/x/max", sTagName.Data()));
364 CheckProperty(nBinsY, Form(
"qa/histograms/%s/y/nbins", sTagName.Data()));
365 CheckProperty(minY, Form(
"qa/histograms/%s/y/min", sTagName.Data()));
366 CheckProperty(maxY, Form(
"qa/histograms/%s/y/max", sTagName.Data()));
369 else if constexpr (std::is_base_of_v<TH1, T>) {
370 CheckProperty(nBinsX, Form(
"qa/histograms/%s/x/nbins", sTagName.Data()));
371 CheckProperty(minX, Form(
"qa/histograms/%s/x/min", sTagName.Data()));
372 CheckProperty(maxX, Form(
"qa/histograms/%s/x/max", sTagName.Data()));