From 51d6782755ba5a25199f9b3da14ddad36330c3ba Mon Sep 17 00:00:00 2001 From: Gordon McCann Date: Sun, 1 May 2022 20:38:26 -0400 Subject: [PATCH] Added new cut types, CutSummaryAll and CutSummaryAny for use with HistogramSummary. Tested for creation, drawing, and serialization. Needs testing for cut functionality. --- Navigator/src/Navigator/Core/Cut.cpp | 34 ++++++++ Navigator/src/Navigator/Core/Cut.h | 22 ++++++ .../src/Navigator/Core/SpectrumManager.cpp | 42 ++++++++++ .../src/Navigator/Core/SpectrumManager.h | 6 ++ .../src/Navigator/Core/SpectrumSerializer.cpp | 73 +++++++++++++++++ .../src/Navigator/Editor/SpectrumPanel.cpp | 79 +++++++++++++++---- 6 files changed, 242 insertions(+), 14 deletions(-) diff --git a/Navigator/src/Navigator/Core/Cut.cpp b/Navigator/src/Navigator/Core/Cut.cpp index 5b79dce..0d3dbae 100644 --- a/Navigator/src/Navigator/Core/Cut.cpp +++ b/Navigator/src/Navigator/Core/Cut.cpp @@ -19,6 +19,19 @@ namespace Navigator { + std::string ConvertCutTypeToString(CutType type) + { + switch(type) + { + case CutType::Cut1D: return "Cut1D"; + case CutType::Cut2D: return "Cut2D"; + case CutType::CutSummaryAll: return "CutSummaryAll"; + case CutType::CutSummaryAny: return "CutSummaryAny"; + case CutType::None: return "None"; + } + return "None"; + } + /*1D Cuts -- Can be made on and applied to either 1D or 2D histograms*/ Cut1D::Cut1D(const CutArgs& params, double min, double max) : Cut(params), m_minVal(min), m_maxVal(max) @@ -89,4 +102,25 @@ namespace Navigator { ImPlot::PlotLine(m_params.name.c_str(), m_xpoints.data(), m_ypoints.data(), (int)m_xpoints.size()); } + /*CutSummaryAll -- Can only be made on a HistogramSummary but can be applied to any*/ + CutSummary::CutSummary(const CutArgs& params, const std::vector& subhistos, double min, double max) : + Cut(params), m_subhistos(subhistos), m_minVal(min), m_maxVal(max) + { + } + + CutSummary::~CutSummary() + { + } + + void CutSummary::IsInside(double x, double y) + { + m_isValid = x >= m_minVal && x <= m_maxVal; + } + + //Only within an ImPlot/ImGui context!!! + void CutSummary::Draw() const + { + double points[2] = { m_minVal, m_maxVal }; + ImPlot::PlotVLines(m_params.name.c_str(), points, 2); + } } diff --git a/Navigator/src/Navigator/Core/Cut.h b/Navigator/src/Navigator/Core/Cut.h index 1c08350..72aa3c1 100644 --- a/Navigator/src/Navigator/Core/Cut.h +++ b/Navigator/src/Navigator/Core/Cut.h @@ -26,9 +26,13 @@ namespace Navigator { { Cut1D, Cut2D, + CutSummaryAny, + CutSummaryAll, None }; + std::string ConvertCutTypeToString(CutType type); + struct NAV_API CutArgs { CutArgs() {} @@ -99,6 +103,24 @@ namespace Navigator { std::vector m_xpoints; std::vector m_ypoints; }; + + class NAV_API CutSummary : public Cut + { + public: + CutSummary(const CutArgs& params, const std::vector& subhistos, double min, double max); + virtual ~CutSummary(); + virtual void IsInside(double x, double y) override; + virtual void Draw() const override; + virtual std::vector GetXValues() const override { return std::vector({ m_minVal, m_maxVal }); } + virtual std::vector GetYValues() const override { return std::vector(); } + + inline const std::vector& GetSubHistograms() const { return m_subhistos; } + + private: + double m_minVal, m_maxVal; + std::vector m_subhistos; + }; + } #endif diff --git a/Navigator/src/Navigator/Core/SpectrumManager.cpp b/Navigator/src/Navigator/Core/SpectrumManager.cpp index f555dd4..db1faf2 100644 --- a/Navigator/src/Navigator/Core/SpectrumManager.cpp +++ b/Navigator/src/Navigator/Core/SpectrumManager.cpp @@ -345,6 +345,18 @@ namespace Navigator { return null_result; } + std::vector SpectrumManager::GetCutSubHistograms(const std::string& cutname) + { + std::lock_guard guard(m_managerMutex); + auto iter = m_cutMap.find(cutname); + if (iter != m_cutMap.end() && iter->second->GetType() == CutType::CutSummaryAny || iter->second->GetType() == CutType::CutSummaryAll) + { + auto cut = std::static_pointer_cast(iter->second); + return cut->GetSubHistograms(); + } + return std::vector(); + } + //Similar to GetListOfHistograms, see that documentation std::vector SpectrumManager::GetListOfCuts() { @@ -419,6 +431,36 @@ namespace Navigator { iter.second->IsInside(iterX->second->value, iterY->second->value); break; } + case CutType::CutSummaryAll: + { + std::vector paramlist = std::static_pointer_cast(iter.second)->GetSubHistograms(); + for (auto& param : paramlist) + { + auto iterX = m_paramMap.find(param); + if (iterX != m_paramMap.end() && iterX->second->validFlag) + { + iter.second->IsInside(iterX->second->value); + if (!iter.second->IsValid()) + break; + } + } + break; + } + case CutType::CutSummaryAny: + { + std::vector paramlist = std::static_pointer_cast(iter.second)->GetSubHistograms(); + for (auto& param : paramlist) + { + auto iterX = m_paramMap.find(param); + if (iterX != m_paramMap.end() && iterX->second->validFlag) + { + iter.second->IsInside(iterX->second->value); + if (iter.second->IsValid()) + break; + } + } + break; + } case CutType::None: { NAV_WARN("Found a cut with None type!"); diff --git a/Navigator/src/Navigator/Core/SpectrumManager.h b/Navigator/src/Navigator/Core/SpectrumManager.h index a5849e2..22bd6f2 100644 --- a/Navigator/src/Navigator/Core/SpectrumManager.h +++ b/Navigator/src/Navigator/Core/SpectrumManager.h @@ -78,9 +78,15 @@ namespace Navigator { std::lock_guard guard(m_managerMutex); m_cutMap[params.name].reset(new Cut2D(params, xpoints, ypoints)); } + inline void AddCut(const CutArgs& params, const std::vector& subhistos, double min, double max) + { + std::lock_guard guard(m_managerMutex); + m_cutMap[params.name].reset(new CutSummary(params, subhistos, min, max)); + } void RemoveCut(const std::string& name); std::vector GetCutXPoints(const std::string& name); std::vector GetCutYPoints(const std::string& name); + std::vector GetCutSubHistograms(const std::string& cutname); std::vector GetListOfCuts(); /**************/ diff --git a/Navigator/src/Navigator/Core/SpectrumSerializer.cpp b/Navigator/src/Navigator/Core/SpectrumSerializer.cpp index 002aa7d..3760838 100644 --- a/Navigator/src/Navigator/Core/SpectrumSerializer.cpp +++ b/Navigator/src/Navigator/Core/SpectrumSerializer.cpp @@ -71,6 +71,38 @@ namespace Navigator { output << "\t\tend_yvalues" << std::endl; output << "\tend_cut2D" << std::endl; } + else if (cut.type == CutType::CutSummaryAll) + { + std::vector subhistos = manager.GetCutSubHistograms(cut.name); + std::vector xpoints = manager.GetCutXPoints(cut.name); + output << "\tbegin_cutSummaryAll" << std::endl; + output << "\t\tname: " << cut.name << std::endl; + output << "\t\tminValue: " << xpoints[0] << std::endl; + output << "\t\tmaxValue: " << xpoints[1] << std::endl; + output << "\t\tbegin_parameters" << std::endl; + for (auto& par : subhistos) + { + output << "\t\t\t" << par << std::endl; + } + output << "\t\tend_parameters" << std::endl; + output << "\tend_cutSummaryAll" << std::endl; + } + else if (cut.type == CutType::CutSummaryAny) + { + std::vector subhistos = manager.GetCutSubHistograms(cut.name); + std::vector xpoints = manager.GetCutXPoints(cut.name); + output << "\tbegin_cutSummaryAny" << std::endl; + output << "\t\tname: " << cut.name << std::endl; + output << "\t\tminValue: " << xpoints[0] << std::endl; + output << "\t\tmaxValue: " << xpoints[1] << std::endl; + output << "\t\tbegin_parameters" << std::endl; + for (auto& par : subhistos) + { + output << "\t\t\t" << par << std::endl; + } + output << "\t\tend_parameters" << std::endl; + output << "\tend_cutSummaryAny" << std::endl; + } } output << "end_cuts" << std::endl; @@ -189,6 +221,7 @@ namespace Navigator { cut_data = reset_cut; cut_xdata.clear(); cut_ydata.clear(); + subhistos.clear(); if (check == "begin_cut1D") { cut_data.type = CutType::Cut1D; @@ -228,6 +261,46 @@ namespace Navigator { input >> check; manager.AddCut(cut_data, cut_xdata, cut_ydata); } + else if (check == "begin_cutSummaryAll") + { + cut_data.type = CutType::CutSummaryAll; + input >> check >> cut_data.name; + input >> check >> value_doub; + cut_xdata.push_back(value_doub); + input >> check >> value_doub; + cut_xdata.push_back(value_doub); + while (input >> check) + { + if (check == "begin_parameters") + continue; + else if (check == "end_parameters") + break; + else + subhistos.push_back(check); + } + input >> check; + manager.AddCut(cut_data, subhistos, cut_xdata[0], cut_xdata[1]); + } + else if (check == "begin_cutSummaryAny") + { + cut_data.type = CutType::CutSummaryAny; + input >> check >> cut_data.name; + input >> check >> value_doub; + cut_xdata.push_back(value_doub); + input >> check >> value_doub; + cut_xdata.push_back(value_doub); + while (input >> check) + { + if (check == "begin_parameters") + continue; + else if (check == "end_parameters") + break; + else + subhistos.push_back(check); + } + input >> check; + manager.AddCut(cut_data, subhistos, cut_xdata[0], cut_xdata[1]); + } else if (check == "end_cuts") break; else diff --git a/Navigator/src/Navigator/Editor/SpectrumPanel.cpp b/Navigator/src/Navigator/Editor/SpectrumPanel.cpp index 6758c99..0ba6eaf 100644 --- a/Navigator/src/Navigator/Editor/SpectrumPanel.cpp +++ b/Navigator/src/Navigator/Editor/SpectrumPanel.cpp @@ -44,11 +44,8 @@ namespace Navigator { { if (m_zoomedFlag && m_zoomedGram.type != SpectrumType::None) { - if (m_zoomedGram.type == SpectrumType::Histo1D || m_zoomedGram.type == SpectrumType::Histo2D) - { - RenderCutButton(); - ImGui::SameLine(); - } + RenderCutButton(); + ImGui::SameLine(); if(ImGui::Button("Clear")) { SpectrumManager::GetInstance().ClearHistogram(m_zoomedGram.name); @@ -203,6 +200,24 @@ namespace Navigator { ImPlot::PlotLine(m_newCutArgs.name.c_str(), m_newCutX.data(), m_newCutY.data(), int(m_newCutX.size())); break; } + case SpectrumType::Summary: + { + if (m_newCutX.size() == 2) + { + m_acceptCutFlag = true; + } + else if (ImPlot::IsPlotHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) + { + m_newCutX.push_back(ImPlot::GetPlotMousePos().x); + } + ImPlot::PlotVLines(m_newCutArgs.name.c_str(), m_newCutX.data(), int(m_newCutX.size())); + break; + } + case SpectrumType::None: + { + m_cutModeFlag = false; + break; + } } } @@ -219,16 +234,44 @@ namespace Navigator { ImGui::Text("Save this Cut?"); if (ImGui::Button("Yes")) { - if (m_newCutArgs.y_par == "None") + SpectrumManager& manager = SpectrumManager::GetInstance(); + switch (m_newCutArgs.type) { - std::sort(m_newCutX.begin(), m_newCutX.end()); - SpectrumManager::GetInstance().AddCut(m_newCutArgs, m_newCutX[0], m_newCutX[1]); + case CutType::Cut1D: + { + std::sort(m_newCutX.begin(), m_newCutX.end()); + manager.AddCut(m_newCutArgs, m_newCutX[0], m_newCutX[1]); + manager.AddCutToHistogramDraw(m_newCutArgs.name, m_zoomedGram.name); + break; + } + case CutType::Cut2D: + { + manager.AddCut(m_newCutArgs, m_newCutX, m_newCutY); + manager.AddCutToHistogramDraw(m_newCutArgs.name, m_zoomedGram.name); + break; + } + case CutType::CutSummaryAny: + { + std::sort(m_newCutX.begin(), m_newCutX.end()); + std::vector subhistos = manager.GetSubHistograms(m_zoomedGram.name); + manager.AddCut(m_newCutArgs, subhistos, m_newCutX[0], m_newCutX[1]); + manager.AddCutToHistogramDraw(m_newCutArgs.name, m_zoomedGram.name); + break; + } + case CutType::CutSummaryAll: + { + std::sort(m_newCutX.begin(), m_newCutX.end()); + std::vector subhistos = manager.GetSubHistograms(m_zoomedGram.name); + manager.AddCut(m_newCutArgs, subhistos, m_newCutX[0], m_newCutX[1]); + manager.AddCutToHistogramDraw(m_newCutArgs.name, m_zoomedGram.name); + break; + } + case CutType::None: + { + NAV_ERROR("Trying to add None type cut to manager at SpectrumPanel::RenderAcceptCutDialog!"); + break; + } } - else - { - SpectrumManager::GetInstance().AddCut(m_newCutArgs, m_newCutX, m_newCutY); - } - SpectrumManager::GetInstance().AddCutToHistogramDraw(m_newCutArgs.name, m_zoomedGram.name); ImGui::CloseCurrentPopup(); m_result = true; } @@ -271,8 +314,16 @@ namespace Navigator { ImGui::BulletText("%s", ("Y Parameter: " + m_newCutArgs.y_par).c_str()); break; } + case SpectrumType::Summary: + { + if (ImGui::RadioButton("CutSummaryAny", m_newCutArgs.type == CutType::CutSummaryAny)) + m_newCutArgs.type = CutType::CutSummaryAny; + ImGui::SameLine(); + if (ImGui::RadioButton("CutSummaryAll", m_newCutArgs.type == CutType::CutSummaryAll)) + m_newCutArgs.type = CutType::CutSummaryAll; + break; + } case SpectrumType::None: m_newCutArgs.type = CutType::None; break; - case SpectrumType::Summary: m_newCutArgs.type = CutType::None; break; } ImGui::InputText("Cut Name", &m_newCutArgs.name); if (ImGui::Button("Accept & Draw"))