From 4d9f6aad86591a71f1265b30b3622b55837ddeba Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Fri, 11 Jul 2025 10:44:41 +0200 Subject: [PATCH 01/14] clang-tidy stc/Task*pp --- src/Task.cpp | 4 ++-- src/Task.hpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index b7a43d4..9610c35 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -144,7 +144,7 @@ void Task::Finish() { out_file_->Close(); } -TDirectory* Task::MkMultiLevelDir(TFile* file, const std::string& name) const { +TDirectory* Task::MkMultiLevelDir(TFile* file, const std::string& name) { auto splitBySlash = [](const std::string& str) { std::vector result; std::stringstream ss(str); @@ -172,7 +172,7 @@ void Task::CreateOutputFileIfNotYet() { if (out_file_ == nullptr) out_file_ = new TFile(out_file_name_.c_str(), out_file_option_.c_str()); } -std::string Task::ConstructOutputDirectoryName() { +std::string Task::ConstructOutputDirectoryName() const { const std::string entryName = entries_.back().GetDirectoryName(); std::string dirName = toplevel_dir_name_.empty() ? entryName : toplevel_dir_name_; if (is_append_dir_name_with_entry_name_ && !toplevel_dir_name_.empty()) dirName.append("/" + entryName); diff --git a/src/Task.hpp b/src/Task.hpp index bdcaa9e..0c17761 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -67,10 +67,10 @@ class Task : public AnalysisTask { private: void FillIntegral(EntryConfig& plot); - TDirectory* MkMultiLevelDir(TFile* file, const std::string& name) const; + static TDirectory* MkMultiLevelDir(TFile* file, const std::string& name); template - TDirectory* MkDirIfNotExists(T* fod, std::string name) const { + static TDirectory* MkDirIfNotExists(T* fod, const std::string& name) { if (fod == nullptr) throw std::runtime_error("Task::MkDirIfNotExists(): file or directory ptr is null"); TDirectory* result = fod->GetDirectory(name.c_str()); if (result == nullptr) result = fod->mkdir(name.c_str()); @@ -78,7 +78,7 @@ class Task : public AnalysisTask { } void CreateOutputFileIfNotYet(); - std::string ConstructOutputDirectoryName(); + std::string ConstructOutputDirectoryName() const; std::vector entries_{}; std::map dir_map_{}; From 1acc0f5e06fa0d66ccdc37f14c034242b993b1b7 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Fri, 11 Jul 2025 10:44:58 +0200 Subject: [PATCH 02/14] add PATH to AnalysisTreeQAConfig.sh --- cmake_modules/AnalysisTreeQAConfig.sh.in | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake_modules/AnalysisTreeQAConfig.sh.in b/cmake_modules/AnalysisTreeQAConfig.sh.in index 463bb55..396c280 100644 --- a/cmake_modules/AnalysisTreeQAConfig.sh.in +++ b/cmake_modules/AnalysisTreeQAConfig.sh.in @@ -4,3 +4,4 @@ source ${AT_INSTALL_BIN}/AnalysisTreeConfig.sh export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CMAKE_INSTALL_PREFIX}/lib export ROOT_INCLUDE_PATH=$ROOT_INCLUDE_PATH:${CMAKE_INSTALL_PREFIX}/include/AnalysisTreeQA +export PATH=$PATH:${CMAKE_INSTALL_PREFIX}/bin From 49bbc34adf52de6974002bad2a33ef00453fe0c7 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Wed, 16 Jul 2025 01:32:39 +0200 Subject: [PATCH 03/14] add clang-format check to CI --- .github/workflows/clang.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/clang.yml diff --git a/.github/workflows/clang.yml b/.github/workflows/clang.yml new file mode 100644 index 0000000..14f169f --- /dev/null +++ b/.github/workflows/clang.yml @@ -0,0 +1,14 @@ +name: Clang Format Checker +on: + push: + pull_request: + branches: [ master ] +jobs: + clang-format-checking: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: RafikFarhad/clang-format-github-action@v2.0.0 + with: + sources: "src/*.*pp examples/*.*pp" + style: file From eb009bacbe24765e93856378370e26dcda0922a5 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 22 Jul 2025 16:35:28 +0200 Subject: [PATCH 04/14] Task: get rid of MkMultiLevelDir(), replaced with MkDirIfNotExists() --- src/Task.cpp | 34 +++++----------------------------- src/Task.hpp | 10 +++++----- 2 files changed, 10 insertions(+), 34 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index 9610c35..f007b85 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -9,7 +9,7 @@ size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, Variable weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, weight, name, cuts, false); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkMultiLevelDir(out_file_, dirName); + TDirectory* dir = MkDirIfNotExists(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -26,7 +26,7 @@ size_t Task::AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, y, weight, name, cuts); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkMultiLevelDir(out_file_, dirName); + TDirectory* dir = MkDirIfNotExists(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -43,7 +43,7 @@ size_t Task::AddProfile(const std::string& name, const Axis& x, const Axis& y, C weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, y, weight, name, cuts, true); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkMultiLevelDir(out_file_, dirName); + TDirectory* dir = MkDirIfNotExists(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -60,7 +60,7 @@ size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts, Var weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, weight, name, cuts, true); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkMultiLevelDir(out_file_, dirName); + TDirectory* dir = MkDirIfNotExists(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -76,7 +76,7 @@ size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_ CreateOutputFileIfNotYet(); entries_.emplace_back(x, cuts_x, y, cuts_y); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkMultiLevelDir(out_file_, dirName); + TDirectory* dir = MkDirIfNotExists(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id_x = AddEntry(AnalysisEntry({entries_.back().GetVariables()[0]}, cuts_x)); @@ -144,30 +144,6 @@ void Task::Finish() { out_file_->Close(); } -TDirectory* Task::MkMultiLevelDir(TFile* file, const std::string& name) { - auto splitBySlash = [](const std::string& str) { - std::vector result; - std::stringstream ss(str); - std::string item; - - // Split the string by slashes - while (std::getline(ss, item, '/')) { - result.push_back(item); - } - - return result; - }; - - auto vDirs = splitBySlash(name); - TDirectory* result; - for (int iDir = 0; iDir < vDirs.size(); iDir++) { - if (iDir == 0) result = MkDirIfNotExists(file, vDirs.at(iDir)); - else - result = MkDirIfNotExists(result, vDirs.at(iDir)); - } - return result; -} - void Task::CreateOutputFileIfNotYet() { if (out_file_ == nullptr) out_file_ = new TFile(out_file_name_.c_str(), out_file_option_.c_str()); } diff --git a/src/Task.hpp b/src/Task.hpp index 0c17761..3adf328 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -67,13 +67,13 @@ class Task : public AnalysisTask { private: void FillIntegral(EntryConfig& plot); - static TDirectory* MkMultiLevelDir(TFile* file, const std::string& name); template - static TDirectory* MkDirIfNotExists(T* fod, const std::string& name) { - if (fod == nullptr) throw std::runtime_error("Task::MkDirIfNotExists(): file or directory ptr is null"); - TDirectory* result = fod->GetDirectory(name.c_str()); - if (result == nullptr) result = fod->mkdir(name.c_str()); + static TDirectory* MkDirIfNotExists(T* fileOrDirectory, const std::string& name) { + if (fileOrDirectory == nullptr) throw std::runtime_error("HelperFunctions::MkDirIfNotExists(): file or directory ptr is null"); + TDirectory* result = fileOrDirectory->GetDirectory(name.c_str()); + if (result == nullptr) fileOrDirectory->mkdir(name.c_str()); + result = fileOrDirectory->GetDirectory(name.c_str()); return result; } From 6a13cad1e2b6ef428040c202c6b31efde719de19 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 22 Jul 2025 18:21:27 +0200 Subject: [PATCH 05/14] Task: MkDirIfNot[Exists->Yet] --- src/Task.cpp | 10 +++++----- src/Task.hpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index f007b85..419de66 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -9,7 +9,7 @@ size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, Variable weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, weight, name, cuts, false); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkDirIfNotExists(out_file_, dirName); + TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -26,7 +26,7 @@ size_t Task::AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, y, weight, name, cuts); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkDirIfNotExists(out_file_, dirName); + TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -43,7 +43,7 @@ size_t Task::AddProfile(const std::string& name, const Axis& x, const Axis& y, C weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, y, weight, name, cuts, true); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkDirIfNotExists(out_file_, dirName); + TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -60,7 +60,7 @@ size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts, Var weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, weight, name, cuts, true); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkDirIfNotExists(out_file_, dirName); + TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); @@ -76,7 +76,7 @@ size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_ CreateOutputFileIfNotYet(); entries_.emplace_back(x, cuts_x, y, cuts_y); const std::string dirName = ConstructOutputDirectoryName(); - TDirectory* dir = MkDirIfNotExists(out_file_, dirName); + TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); auto var_id_x = AddEntry(AnalysisEntry({entries_.back().GetVariables()[0]}, cuts_x)); diff --git a/src/Task.hpp b/src/Task.hpp index 3adf328..08de71b 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -69,8 +69,8 @@ class Task : public AnalysisTask { void FillIntegral(EntryConfig& plot); template - static TDirectory* MkDirIfNotExists(T* fileOrDirectory, const std::string& name) { - if (fileOrDirectory == nullptr) throw std::runtime_error("HelperFunctions::MkDirIfNotExists(): file or directory ptr is null"); + static TDirectory* MkDirIfNotYet(T* fileOrDirectory, const std::string& name) { + if (fileOrDirectory == nullptr) throw std::runtime_error("HelperFunctions::MkDirIfNotYet(): file or directory ptr is null"); TDirectory* result = fileOrDirectory->GetDirectory(name.c_str()); if (result == nullptr) fileOrDirectory->mkdir(name.c_str()); result = fileOrDirectory->GetDirectory(name.c_str()); From ddae29e7c600240229145a30dd43c86cc94b5a29 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 28 Oct 2025 19:10:10 +0100 Subject: [PATCH 06/14] remove entry_cuts_ from EntryConfig, leave their name only --- src/EntryConfig.cpp | 19 ++++++++++--------- src/EntryConfig.hpp | 4 ++-- src/Task.cpp | 8 ++++---- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/EntryConfig.cpp b/src/EntryConfig.cpp index a514c08..2bc3bf8 100644 --- a/src/EntryConfig.cpp +++ b/src/EntryConfig.cpp @@ -36,7 +36,7 @@ EntryConfig::EntryConfig(const Axis& axis, Variable& weight, const std::string& type_(is_integral ? PlotType::kIntegral1D : PlotType::kHisto1D), axes_({axis}), var4weight_(weight), - entry_cuts_(cuts) { + entry_cuts_name_(cuts != nullptr ? cuts->GetName() : "") { if (name == "") { if (cuts) name_ += "_" + cuts->GetName(); @@ -53,14 +53,18 @@ EntryConfig::EntryConfig(const Axis& axis, Variable& weight, const std::string& EntryConfig::EntryConfig(const Axis& x, const Axis& y, Variable& weight, const std::string& name, Cuts* cuts, bool is_profile) : type_(is_profile ? PlotType::kProfile : PlotType::kHisto2D), axes_({x, y}), var4weight_(weight), - entry_cuts_(cuts) { + entry_cuts_name_(cuts != nullptr ? cuts->GetName() : "") { Set2DName(name); InitPlot(); } EntryConfig::EntryConfig(const Axis& x, Cuts* cuts_x, const Axis& y, Cuts* cuts_y) : type_(PlotType::kIntegral2D), - axes_({x, y}), - entry_cuts_(cuts_x) { + axes_({x, y}) { + const std::string cutNameX = cuts_x != nullptr ? cuts_x->GetName() : ""; + const std::string cutNameY = cuts_y != nullptr ? cuts_y->GetName() : ""; + const std::string cutNameSeparator = cuts_x != nullptr && cuts_y != nullptr ? "_" : ""; + entry_cuts_name_ = cutNameX + cutNameSeparator + cutNameY; + Set2DName(); InitPlot(); } @@ -172,8 +176,7 @@ void EntryConfig::InitPlot() { void EntryConfig::Set2DName(const std::string& name) { name_ = name.empty() ? Form("%s_%s", axes_[0].GetName(), axes_[1].GetName()) : name; if (name.empty()) { - if (entry_cuts_ != nullptr) - name_ += "_" + entry_cuts_->GetName(); + name_ += "_" + entry_cuts_name_; if (!var4weight_.GetName().empty() && var4weight_.GetFields().at(0).GetName() != "ones") { name_ += "_weight_" + var4weight_.GetName(); @@ -206,9 +209,7 @@ std::string EntryConfig::GetDirectoryName() const { for (auto it = ++branches.begin(); it != branches.end(); ++it) { name += "_" + *it; } - if (entry_cuts_) { - name += "_" + entry_cuts_->GetName(); - } + name += "_" + entry_cuts_name_; if (!var4weight_.GetName().empty() && var4weight_.GetFields().at(0).GetName() != "ones") { name += "_weight_" + var4weight_.GetName(); } diff --git a/src/EntryConfig.hpp b/src/EntryConfig.hpp index 46269ef..ec05669 100644 --- a/src/EntryConfig.hpp +++ b/src/EntryConfig.hpp @@ -59,7 +59,7 @@ class EntryConfig { void Fill(double value1, double value2, double value3); ANALYSISTREE_ATTR_NODISCARD unsigned int GetNdimensions() const { return axes_.size(); } - ANALYSISTREE_ATTR_NODISCARD Cuts* GetEntryCuts() const { return entry_cuts_; } + ANALYSISTREE_ATTR_NODISCARD const std::string& GetEntryCutsName() const { return entry_cuts_name_; } ANALYSISTREE_ATTR_NODISCARD PlotType GetType() const { return type_; } ANALYSISTREE_ATTR_NODISCARD std::vector> GetVariablesId() const { return vars_id_; } @@ -97,7 +97,7 @@ class EntryConfig { std::vector axes_{}; Variable var4weight_{}; - Cuts* entry_cuts_{nullptr}; + std::string entry_cuts_name_{}; std::vector> vars_id_{}; ClassDef(EntryConfig, 1); diff --git a/src/Task.cpp b/src/Task.cpp index 419de66..be85c5a 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -12,7 +12,7 @@ size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, Variable TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); + auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}}); return entries_.size() - 1; } @@ -29,7 +29,7 @@ size_t Task::AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); + auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}, {var_id.first, var_id.second.at(1)}}); return entries_.size() - 1; } @@ -46,7 +46,7 @@ size_t Task::AddProfile(const std::string& name, const Axis& x, const Axis& y, C TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); + auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}, {var_id.first, var_id.second.at(1)}}); return entries_.size() - 1; } @@ -63,7 +63,7 @@ size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts, Var TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), entries_.back().GetEntryCuts(), entries_.back().GetVariableForWeight())); + auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}}); return entries_.size() - 1; } From 4cc130bea6dfd4d8883971885da147434d3f4f30 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Mon, 3 Nov 2025 22:07:33 +0100 Subject: [PATCH 07/14] clean-up code --- src/EntryConfig.cpp | 21 ++++++++++++++++++--- src/EntryConfig.hpp | 3 +++ src/Task.cpp | 28 +++++++++------------------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/EntryConfig.cpp b/src/EntryConfig.cpp index 2bc3bf8..bedb83f 100644 --- a/src/EntryConfig.cpp +++ b/src/EntryConfig.cpp @@ -17,7 +17,12 @@ namespace AnalysisTree::QA { struct fill2_struct : public Utils::Visitor { fill2_struct(double val1, double val2) : val1_(val1), val2_(val2) {} - void operator()(TH1* h1) const { h1->Fill(val1_, val2_); } + void operator()(TH1* h1) const { + if (FloatingEqualZero(val2_)) return; + if (FloatingEqualOne(val2_)) h1->Fill(val1_); + else + h1->Fill(val1_, val2_); + } void operator()(TH2* h2) const { h2->Fill(val1_, val2_); } void operator()(TProfile* p) const { p->Fill(val1_, val2_); } double val1_, val2_; @@ -26,8 +31,18 @@ struct fill2_struct : public Utils::Visitor { struct fill3_struct : public Utils::Visitor { fill3_struct(double val1, double val2, double val3) : val1_(val1), val2_(val2), val3_(val3) {} void operator()(TH1*) const { throw std::runtime_error("EntryConfig, fill3_struct: cannot fill TH1 with 3 arguments"); } - void operator()(TH2* h2) const { h2->Fill(val1_, val2_, val3_); } - void operator()(TProfile* p) const { p->Fill(val1_, val2_, val3_); } + void operator()(TH2* h2) const { + if (FloatingEqualZero(val3_)) return; + if (FloatingEqualOne(val3_)) h2->Fill(val1_, val2_); + else + h2->Fill(val1_, val2_, val3_); + } + void operator()(TProfile* p) const { + if (FloatingEqualZero(val3_)) return; + if (FloatingEqualOne(val3_)) p->Fill(val1_, val2_); + else + p->Fill(val1_, val2_, val3_); + } double val1_, val2_, val3_; }; diff --git a/src/EntryConfig.hpp b/src/EntryConfig.hpp index ec05669..c142cd1 100644 --- a/src/EntryConfig.hpp +++ b/src/EntryConfig.hpp @@ -103,5 +103,8 @@ class EntryConfig { ClassDef(EntryConfig, 1); }; +inline bool FloatingEqualZero(const double value, const double eps = 1e-6) { return std::fabs(value) < eps; } +inline bool FloatingEqualOne(const double value, const double eps = 1e-6) { return std::fabs(value - 1) < eps; } + }// namespace AnalysisTree::QA #endif//ANALYSISTREE_QA_ENTRYCONFIG_H diff --git a/src/Task.cpp b/src/Task.cpp index be85c5a..6e0cb7d 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -88,7 +88,7 @@ size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_ void Task::FillIntegral(EntryConfig& plot) { double integral_x{0.}; double integral_y{0.}; - auto var_ids = plot.GetVariablesId(); + const auto& var_ids = plot.GetVariablesId(); for (const auto& var : this->GetValues(var_ids.at(0).first)) { integral_x += var[var_ids.at(0).second]; @@ -114,26 +114,16 @@ void Task::Exec() { FillIntegral(plot); continue; } - auto var_ids = plot.GetVariablesId(); - auto weights = this->GetWeights(var_ids.at(0).first); + const auto& var_ids = plot.GetVariablesId(); + const auto& weights = this->GetWeights(var_ids.at(0).first); int ivw{-1}; - for (auto var : this->GetValues(var_ids.at(0).first)) { + for (const auto& var : this->GetValues(var_ids.at(0).first)) { ++ivw; - auto weight = weights.at(ivw); - if (std::fabs(weight) < 1e-6) continue; - switch (plot.GetNdimensions()) { - case 1: { - if (std::fabs(weight - 1) < 1e-4) plot.Fill(var[var_ids.at(0).second]); - else - plot.Fill(var[var_ids.at(0).second], weight); - break; - } - case 2: { - if (std::fabs(weight - 1) < 1e-4) plot.Fill(var[var_ids.at(0).second], var[var_ids.at(1).second]); - else - plot.Fill(var[var_ids.at(0).second], var[var_ids.at(1).second], weight); - break; - } + const auto& weight = weights.at(ivw); + if (plot.GetNdimensions() == 1) { + plot.Fill(var[var_ids.at(0).second], weight); + } else { + plot.Fill(var[var_ids.at(0).second], var[var_ids.at(1).second], weight); } } }// plots From 545e8059c7f1460f8248531dc84495cb710190c6 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 4 Nov 2025 21:43:55 +0100 Subject: [PATCH 08/14] remove weights from AddIntegral() --- src/Task.cpp | 7 ++++--- src/Task.hpp | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index 6e0cb7d..c6bb197 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -55,8 +55,9 @@ size_t Task::AddProfile(const Axis& x, const Axis& y, Cuts* cuts, Variable weigh return AddProfile("", x, y, cuts, std::move(weight)); } -size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts, Variable weight) { +size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts) { CreateOutputFileIfNotYet(); + Variable weight{}; weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, weight, name, cuts, true); const std::string dirName = ConstructOutputDirectoryName(); @@ -68,8 +69,8 @@ size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts, Var return entries_.size() - 1; } -size_t Task::AddIntegral(const Axis& x, Cuts* cuts, Variable weight) { - return AddIntegral("", x, cuts, std::move(weight)); +size_t Task::AddIntegral(const Axis& x, Cuts* cuts) { + return AddIntegral("", x, cuts); } size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_y) { diff --git a/src/Task.hpp b/src/Task.hpp index 08de71b..a1560f7 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -45,9 +45,9 @@ class Task : public AnalysisTask { size_t AddProfile(const Axis& x, const Axis& y, Cuts* cuts = nullptr, Variable weight = Variable{}); - size_t AddIntegral(const std::string& name, const Axis& x, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddIntegral(const std::string& name, const Axis& x, Cuts* cuts = nullptr); - size_t AddIntegral(const Axis& x, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddIntegral(const Axis& x, Cuts* cuts = nullptr); size_t AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x = nullptr, Cuts* cuts_y = nullptr); From 7bba1c966403dcb1cd1f90144e59a821c0f9b269 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 4 Nov 2025 21:54:30 +0100 Subject: [PATCH 09/14] enable custom histo naming of AddIntegral() 2D --- src/EntryConfig.cpp | 4 ++-- src/EntryConfig.hpp | 2 +- src/Task.cpp | 8 ++++++-- src/Task.hpp | 2 ++ 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/EntryConfig.cpp b/src/EntryConfig.cpp index bedb83f..8d08d80 100644 --- a/src/EntryConfig.cpp +++ b/src/EntryConfig.cpp @@ -73,14 +73,14 @@ EntryConfig::EntryConfig(const Axis& x, const Axis& y, Variable& weight, const s InitPlot(); } -EntryConfig::EntryConfig(const Axis& x, Cuts* cuts_x, const Axis& y, Cuts* cuts_y) : type_(PlotType::kIntegral2D), +EntryConfig::EntryConfig(const Axis& x, Cuts* cuts_x, const Axis& y, Cuts* cuts_y, const std::string& name) : type_(PlotType::kIntegral2D), axes_({x, y}) { const std::string cutNameX = cuts_x != nullptr ? cuts_x->GetName() : ""; const std::string cutNameY = cuts_y != nullptr ? cuts_y->GetName() : ""; const std::string cutNameSeparator = cuts_x != nullptr && cuts_y != nullptr ? "_" : ""; entry_cuts_name_ = cutNameX + cutNameSeparator + cutNameY; - Set2DName(); + Set2DName(name); InitPlot(); } diff --git a/src/EntryConfig.hpp b/src/EntryConfig.hpp index c142cd1..6060c72 100644 --- a/src/EntryConfig.hpp +++ b/src/EntryConfig.hpp @@ -46,7 +46,7 @@ class EntryConfig { EntryConfig() = default; explicit EntryConfig(const Axis& axis, [[maybe_unused]] Variable& weight, const std::string& name, Cuts* cuts = nullptr, bool is_integral = false); EntryConfig(const Axis& x, const Axis& y, Variable& weight, const std::string& name, Cuts* cuts = nullptr, bool is_profile = false); - EntryConfig(const Axis& x, Cuts* cuts_x, const Axis& y, Cuts* cuts_y); + EntryConfig(const Axis& x, Cuts* cuts_x, const Axis& y, Cuts* cuts_y, const std::string& name); EntryConfig(const EntryConfig&) = default; EntryConfig(EntryConfig&&) = default; diff --git a/src/Task.cpp b/src/Task.cpp index c6bb197..a8fdef8 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -73,9 +73,9 @@ size_t Task::AddIntegral(const Axis& x, Cuts* cuts) { return AddIntegral("", x, cuts); } -size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_y) { +size_t Task::AddIntegral(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_y) { CreateOutputFileIfNotYet(); - entries_.emplace_back(x, cuts_x, y, cuts_y); + entries_.emplace_back(x, cuts_x, y, cuts_y, name); const std::string dirName = ConstructOutputDirectoryName(); TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); @@ -86,6 +86,10 @@ size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_ return entries_.size() - 1; } +size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_y) { + return AddIntegral("", x, y, cuts_x, cuts_y); +} + void Task::FillIntegral(EntryConfig& plot) { double integral_x{0.}; double integral_y{0.}; diff --git a/src/Task.hpp b/src/Task.hpp index a1560f7..d38e372 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -49,6 +49,8 @@ class Task : public AnalysisTask { size_t AddIntegral(const Axis& x, Cuts* cuts = nullptr); + size_t AddIntegral(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts_x = nullptr, Cuts* cuts_y = nullptr); + size_t AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x = nullptr, Cuts* cuts_y = nullptr); std::vector& Entries() { return entries_; } From 90334d166743863783f8d7b184b080c9cb072016 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Wed, 5 Nov 2025 11:26:34 +0100 Subject: [PATCH 10/14] do not nest namespaces (c++11 compat) --- src/EntryConfig.cpp | 8 +++++--- src/EntryConfig.hpp | 6 ++++-- src/Task.cpp | 6 ++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/EntryConfig.cpp b/src/EntryConfig.cpp index 8d08d80..e671473 100644 --- a/src/EntryConfig.cpp +++ b/src/EntryConfig.cpp @@ -13,7 +13,8 @@ using TH1FD = TH1F; using TH2FD = TH2F; #endif -namespace AnalysisTree::QA { +namespace AnalysisTree { +namespace QA { struct fill2_struct : public Utils::Visitor { fill2_struct(double val1, double val2) : val1_(val1), val2_(val2) {} @@ -74,7 +75,7 @@ EntryConfig::EntryConfig(const Axis& x, const Axis& y, Variable& weight, const s } EntryConfig::EntryConfig(const Axis& x, Cuts* cuts_x, const Axis& y, Cuts* cuts_y, const std::string& name) : type_(PlotType::kIntegral2D), - axes_({x, y}) { + axes_({x, y}) { const std::string cutNameX = cuts_x != nullptr ? cuts_x->GetName() : ""; const std::string cutNameY = cuts_y != nullptr ? cuts_y->GetName() : ""; const std::string cutNameSeparator = cuts_x != nullptr && cuts_y != nullptr ? "_" : ""; @@ -231,4 +232,5 @@ std::string EntryConfig::GetDirectoryName() const { return name; } -}// namespace AnalysisTree::QA +}// namespace QA +}// namespace AnalysisTree diff --git a/src/EntryConfig.hpp b/src/EntryConfig.hpp index 6060c72..3bc220f 100644 --- a/src/EntryConfig.hpp +++ b/src/EntryConfig.hpp @@ -12,7 +12,8 @@ #include "AnalysisTree/Cuts.hpp" #include "AnalysisTree/Utils.hpp" -namespace AnalysisTree::QA { +namespace AnalysisTree { +namespace QA { class Axis : public Variable, public TAxis { public: @@ -106,5 +107,6 @@ class EntryConfig { inline bool FloatingEqualZero(const double value, const double eps = 1e-6) { return std::fabs(value) < eps; } inline bool FloatingEqualOne(const double value, const double eps = 1e-6) { return std::fabs(value - 1) < eps; } -}// namespace AnalysisTree::QA +}// namespace QA +}// namespace AnalysisTree #endif//ANALYSISTREE_QA_ENTRYCONFIG_H diff --git a/src/Task.cpp b/src/Task.cpp index a8fdef8..3ea2634 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -2,7 +2,8 @@ #include -namespace AnalysisTree::QA { +namespace AnalysisTree { +namespace QA { size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, Variable weight) { CreateOutputFileIfNotYet(); @@ -151,4 +152,5 @@ std::string Task::ConstructOutputDirectoryName() const { return dirName; } -}// namespace AnalysisTree::QA +}// namespace QA +}// namespace AnalysisTree From bacf057a0b16672157c2f69500d17e8dac86fc3e Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Wed, 5 Nov 2025 11:52:34 +0100 Subject: [PATCH 11/14] clean code --- src/Task.cpp | 27 +++++++++++++++++++-------- src/Task.hpp | 18 +++++------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index 3ea2634..91ecb87 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -13,7 +13,7 @@ size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, Variable TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); + const auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}}); return entries_.size() - 1; } @@ -30,7 +30,7 @@ size_t Task::AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); + const auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}, {var_id.first, var_id.second.at(1)}}); return entries_.size() - 1; } @@ -47,7 +47,7 @@ size_t Task::AddProfile(const std::string& name, const Axis& x, const Axis& y, C TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); + const auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}, {var_id.first, var_id.second.at(1)}}); return entries_.size() - 1; } @@ -65,7 +65,7 @@ size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts) { TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); + const auto var_id = AddEntry(AnalysisEntry(entries_.back().GetVariables(), cuts, entries_.back().GetVariableForWeight())); entries_.back().SetVariablesId({{var_id.first, var_id.second.at(0)}}); return entries_.size() - 1; } @@ -81,8 +81,8 @@ size_t Task::AddIntegral(const std::string& name, const Axis& x, const Axis& y, TDirectory* dir = MkDirIfNotYet(out_file_, dirName); ANALYSISTREE_UTILS_VISIT(setdirectory_struct(dir), entries_.back().GetPlot()); ANALYSISTREE_UTILS_VISIT(setname_struct(entries_.back().GetName()), entries_.back().GetPlot()); - auto var_id_x = AddEntry(AnalysisEntry({entries_.back().GetVariables()[0]}, cuts_x)); - auto var_id_y = AddEntry(AnalysisEntry({entries_.back().GetVariables()[1]}, cuts_y)); + const auto var_id_x = AddEntry(AnalysisEntry({entries_.back().GetVariables()[0]}, cuts_x)); + const auto var_id_y = AddEntry(AnalysisEntry({entries_.back().GetVariables()[1]}, cuts_y)); entries_.back().SetVariablesId({{var_id_x.first, var_id_x.second.at(0)}, {var_id_y.first, var_id_y.second.at(0)}}); return entries_.size() - 1; } @@ -115,7 +115,6 @@ void Task::Exec() { AnalysisTask::Exec(); for (auto& plot : entries_) { - if (plot.GetType() == EntryConfig::PlotType::kIntegral1D || plot.GetType() == EntryConfig::PlotType::kIntegral2D) { FillIntegral(plot); continue; @@ -145,12 +144,24 @@ void Task::CreateOutputFileIfNotYet() { } std::string Task::ConstructOutputDirectoryName() const { - const std::string entryName = entries_.back().GetDirectoryName(); + const std::string& entryName = entries_.back().GetDirectoryName(); std::string dirName = toplevel_dir_name_.empty() ? entryName : toplevel_dir_name_; if (is_append_dir_name_with_entry_name_ && !toplevel_dir_name_.empty()) dirName.append("/" + entryName); return dirName; } +void Task::SetOutputFileName(std::string name, std::string option) { + out_file_name_ = std::move(name); + out_file_option_ = std::move(option); +} +void Task::SetTopLevelDirName(const std::string& name, bool is_append_dir_name_with_entry_name) { + toplevel_dir_name_ = name; + is_append_dir_name_with_entry_name_ = is_append_dir_name_with_entry_name; +} +void Task::ResetTopLevelDirName() { + SetTopLevelDirName("", false); +} + }// namespace QA }// namespace AnalysisTree diff --git a/src/Task.hpp b/src/Task.hpp index d38e372..ee4c04e 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -54,18 +54,10 @@ class Task : public AnalysisTask { size_t AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x = nullptr, Cuts* cuts_y = nullptr); std::vector& Entries() { return entries_; } - void SetOutputFileName(std::string name, std::string option = "recreate") { - out_file_name_ = std::move(name); - out_file_option_ = std::move(option); - } - void SetTopLevelDirName(const std::string& name, bool is_append_dir_name_with_entry_name = false) { - toplevel_dir_name_ = name; - is_append_dir_name_with_entry_name_ = is_append_dir_name_with_entry_name; - } - void ResetTopLevelDirName() { - toplevel_dir_name_ = ""; - is_append_dir_name_with_entry_name_ = false; - } + + void SetOutputFileName(std::string name, std::string option = "recreate"); + void SetTopLevelDirName(const std::string& name, bool is_append_dir_name_with_entry_name = false); + void ResetTopLevelDirName(); private: void FillIntegral(EntryConfig& plot); @@ -86,7 +78,7 @@ class Task : public AnalysisTask { std::map dir_map_{}; std::string out_file_name_{"QA.root"}; std::string out_file_option_{"recreate"}; - std::string toplevel_dir_name_{""}; + std::string toplevel_dir_name_{}; bool is_append_dir_name_with_entry_name_{false}; TFile* out_file_{nullptr}; From 8d6c489f22a573d159dcd76abe9f53d4960d9e63 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Thu, 6 Nov 2025 21:06:14 +0100 Subject: [PATCH 12/14] pass weight as const& --- src/EntryConfig.cpp | 10 +++++----- src/EntryConfig.hpp | 4 ++-- src/Task.cpp | 26 +++++++++++--------------- src/Task.hpp | 14 +++++++------- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/EntryConfig.cpp b/src/EntryConfig.cpp index e671473..d63984c 100644 --- a/src/EntryConfig.cpp +++ b/src/EntryConfig.cpp @@ -47,7 +47,7 @@ struct fill3_struct : public Utils::Visitor { double val1_, val2_, val3_; }; -EntryConfig::EntryConfig(const Axis& axis, Variable& weight, const std::string& name, Cuts* cuts, bool is_integral) +EntryConfig::EntryConfig(const Axis& axis, const Variable& weight, const std::string& name, Cuts* cuts, bool is_integral) : name_(name == "" ? axis.GetName() : name), type_(is_integral ? PlotType::kIntegral1D : PlotType::kHisto1D), axes_({axis}), @@ -66,10 +66,10 @@ EntryConfig::EntryConfig(const Axis& axis, Variable& weight, const std::string& InitPlot(); } -EntryConfig::EntryConfig(const Axis& x, const Axis& y, Variable& weight, const std::string& name, Cuts* cuts, bool is_profile) : type_(is_profile ? PlotType::kProfile : PlotType::kHisto2D), - axes_({x, y}), - var4weight_(weight), - entry_cuts_name_(cuts != nullptr ? cuts->GetName() : "") { +EntryConfig::EntryConfig(const Axis& x, const Axis& y, const Variable& weight, const std::string& name, Cuts* cuts, bool is_profile) : type_(is_profile ? PlotType::kProfile : PlotType::kHisto2D), + axes_({x, y}), + var4weight_(weight), + entry_cuts_name_(cuts != nullptr ? cuts->GetName() : "") { Set2DName(name); InitPlot(); } diff --git a/src/EntryConfig.hpp b/src/EntryConfig.hpp index 3bc220f..771c5eb 100644 --- a/src/EntryConfig.hpp +++ b/src/EntryConfig.hpp @@ -45,8 +45,8 @@ class EntryConfig { }; EntryConfig() = default; - explicit EntryConfig(const Axis& axis, [[maybe_unused]] Variable& weight, const std::string& name, Cuts* cuts = nullptr, bool is_integral = false); - EntryConfig(const Axis& x, const Axis& y, Variable& weight, const std::string& name, Cuts* cuts = nullptr, bool is_profile = false); + explicit EntryConfig(const Axis& axis, [[maybe_unused]] const Variable& weight, const std::string& name, Cuts* cuts = nullptr, bool is_integral = false); + EntryConfig(const Axis& x, const Axis& y, const Variable& weight, const std::string& name, Cuts* cuts = nullptr, bool is_profile = false); EntryConfig(const Axis& x, Cuts* cuts_x, const Axis& y, Cuts* cuts_y, const std::string& name); EntryConfig(const EntryConfig&) = default; diff --git a/src/Task.cpp b/src/Task.cpp index 91ecb87..88f6db9 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -5,9 +5,8 @@ namespace AnalysisTree { namespace QA { -size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, Variable weight) { +size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, const Variable& weight) { CreateOutputFileIfNotYet(); - weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, weight, name, cuts, false); const std::string dirName = ConstructOutputDirectoryName(); TDirectory* dir = MkDirIfNotYet(out_file_, dirName); @@ -18,13 +17,12 @@ size_t Task::AddH1(const std::string& name, const Axis& x, Cuts* cuts, Variable return entries_.size() - 1; } -size_t Task::AddH1(const Axis& x, Cuts* cuts, Variable weight) { - return AddH1("", x, cuts, std::move(weight)); +size_t Task::AddH1(const Axis& x, Cuts* cuts, const Variable& weight) { + return AddH1("", x, cuts, weight); } -size_t Task::AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts, Variable weight) { +size_t Task::AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts, const Variable& weight) { CreateOutputFileIfNotYet(); - weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, y, weight, name, cuts); const std::string dirName = ConstructOutputDirectoryName(); TDirectory* dir = MkDirIfNotYet(out_file_, dirName); @@ -35,13 +33,12 @@ size_t Task::AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* return entries_.size() - 1; } -size_t Task::AddH2(const Axis& x, const Axis& y, Cuts* cuts, Variable weight) { - return AddH2("", x, y, cuts, std::move(weight)); +size_t Task::AddH2(const Axis& x, const Axis& y, Cuts* cuts, const Variable& weight) { + return AddH2("", x, y, cuts, weight); } -size_t Task::AddProfile(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts, Variable weight) { +size_t Task::AddProfile(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts, const Variable& weight) { CreateOutputFileIfNotYet(); - weight.IfEmptyVariableConvertToOnes(x); entries_.emplace_back(x, y, weight, name, cuts, true); const std::string dirName = ConstructOutputDirectoryName(); TDirectory* dir = MkDirIfNotYet(out_file_, dirName); @@ -52,14 +49,13 @@ size_t Task::AddProfile(const std::string& name, const Axis& x, const Axis& y, C return entries_.size() - 1; } -size_t Task::AddProfile(const Axis& x, const Axis& y, Cuts* cuts, Variable weight) { - return AddProfile("", x, y, cuts, std::move(weight)); +size_t Task::AddProfile(const Axis& x, const Axis& y, Cuts* cuts, const Variable& weight) { + return AddProfile("", x, y, cuts, weight); } size_t Task::AddIntegral(const std::string& name, const Axis& x, Cuts* cuts) { CreateOutputFileIfNotYet(); - Variable weight{}; - weight.IfEmptyVariableConvertToOnes(x); + const Variable weight{}; entries_.emplace_back(x, weight, name, cuts, true); const std::string dirName = ConstructOutputDirectoryName(); TDirectory* dir = MkDirIfNotYet(out_file_, dirName); @@ -91,7 +87,7 @@ size_t Task::AddIntegral(const Axis& x, const Axis& y, Cuts* cuts_x, Cuts* cuts_ return AddIntegral("", x, y, cuts_x, cuts_y); } -void Task::FillIntegral(EntryConfig& plot) { +void Task::FillIntegral(EntryConfig& plot) const { double integral_x{0.}; double integral_y{0.}; const auto& var_ids = plot.GetVariablesId(); diff --git a/src/Task.hpp b/src/Task.hpp index ee4c04e..ef6ba7b 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -33,17 +33,17 @@ class Task : public AnalysisTask { void Exec() override; void Finish() override; - size_t AddH1(const std::string& name, const Axis& x, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddH1(const std::string& name, const Axis& x, Cuts* cuts = nullptr, const Variable& weight = {}); - size_t AddH1(const Axis& x, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddH1(const Axis& x, Cuts* cuts = nullptr, const Variable& weight = {}); - size_t AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddH2(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts = nullptr, const Variable& weight = {}); - size_t AddH2(const Axis& x, const Axis& y, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddH2(const Axis& x, const Axis& y, Cuts* cuts = nullptr, const Variable& weight = {}); - size_t AddProfile(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddProfile(const std::string& name, const Axis& x, const Axis& y, Cuts* cuts = nullptr, const Variable& weight = {}); - size_t AddProfile(const Axis& x, const Axis& y, Cuts* cuts = nullptr, Variable weight = Variable{}); + size_t AddProfile(const Axis& x, const Axis& y, Cuts* cuts = nullptr, const Variable& weight = {}); size_t AddIntegral(const std::string& name, const Axis& x, Cuts* cuts = nullptr); @@ -60,7 +60,7 @@ class Task : public AnalysisTask { void ResetTopLevelDirName(); private: - void FillIntegral(EntryConfig& plot); + void FillIntegral(EntryConfig& plot) const; template static TDirectory* MkDirIfNotYet(T* fileOrDirectory, const std::string& name) { From bfbf1e3c92858b2c56ec04a6963761fda74e9ab4 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Wed, 4 Feb 2026 19:44:20 +0100 Subject: [PATCH 13/14] SetTopLevelDirName: foresee root directory --- src/Task.cpp | 8 +++++--- src/Task.hpp | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index 88f6db9..e07501a 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -141,8 +141,10 @@ void Task::CreateOutputFileIfNotYet() { std::string Task::ConstructOutputDirectoryName() const { const std::string& entryName = entries_.back().GetDirectoryName(); - std::string dirName = toplevel_dir_name_.empty() ? entryName : toplevel_dir_name_; - if (is_append_dir_name_with_entry_name_ && !toplevel_dir_name_.empty()) dirName.append("/" + entryName); + std::string dirName = toplevel_dir_name_ == UndefTopLevelDirName ? entryName : toplevel_dir_name_; + if (is_append_dir_name_with_entry_name_ && toplevel_dir_name_ != UndefTopLevelDirName) { + dirName.append((toplevel_dir_name_.empty() ? "" : "/") + entryName); + }; return dirName; } @@ -156,7 +158,7 @@ void Task::SetTopLevelDirName(const std::string& name, bool is_append_dir_name_w is_append_dir_name_with_entry_name_ = is_append_dir_name_with_entry_name; } void Task::ResetTopLevelDirName() { - SetTopLevelDirName("", false); + SetTopLevelDirName(UndefTopLevelDirName, false); } }// namespace QA diff --git a/src/Task.hpp b/src/Task.hpp index ef6ba7b..232e2fa 100644 --- a/src/Task.hpp +++ b/src/Task.hpp @@ -12,6 +12,8 @@ namespace AnalysisTree { namespace QA { +const std::string UndefTopLevelDirName{"-999"}; + struct setdirectory_struct : Utils::Visitor { explicit setdirectory_struct(TDirectory* dir) : dir_(dir) {} template @@ -78,7 +80,7 @@ class Task : public AnalysisTask { std::map dir_map_{}; std::string out_file_name_{"QA.root"}; std::string out_file_option_{"recreate"}; - std::string toplevel_dir_name_{}; + std::string toplevel_dir_name_{UndefTopLevelDirName}; bool is_append_dir_name_with_entry_name_{false}; TFile* out_file_{nullptr}; From a5ea67dc7df7292af78434817fd1e5ea06d05686 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Sat, 30 May 2026 01:11:19 +0200 Subject: [PATCH 14/14] bugfix ddae29e: foresee entry_cuts_name_.empty() == true --- src/EntryConfig.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/EntryConfig.cpp b/src/EntryConfig.cpp index d63984c..0e3cfd0 100644 --- a/src/EntryConfig.cpp +++ b/src/EntryConfig.cpp @@ -192,7 +192,9 @@ void EntryConfig::InitPlot() { void EntryConfig::Set2DName(const std::string& name) { name_ = name.empty() ? Form("%s_%s", axes_[0].GetName(), axes_[1].GetName()) : name; if (name.empty()) { - name_ += "_" + entry_cuts_name_; + if (!entry_cuts_name_.empty()) { + name_ += "_" + entry_cuts_name_; + } if (!var4weight_.GetName().empty() && var4weight_.GetFields().at(0).GetName() != "ones") { name_ += "_weight_" + var4weight_.GetName(); @@ -225,7 +227,9 @@ std::string EntryConfig::GetDirectoryName() const { for (auto it = ++branches.begin(); it != branches.end(); ++it) { name += "_" + *it; } - name += "_" + entry_cuts_name_; + if (!entry_cuts_name_.empty()) { + name += "_" + entry_cuts_name_; + } if (!var4weight_.GetName().empty() && var4weight_.GetFields().at(0).GetName() != "ones") { name += "_weight_" + var4weight_.GetName(); }