diff --git a/common/ADUHistogram.cpp b/common/ADUHistogram.cpp index 1b998d75..26ea80de 100644 --- a/common/ADUHistogram.cpp +++ b/common/ADUHistogram.cpp @@ -16,11 +16,13 @@ const std::vector &ADUHistogram::GetHistogram() const { return histogram; } -void ADUHistogram::GetPlot(JFJochProtoBuf::Plot &plot) const { +Plot ADUHistogram::GetPlot() const { std::unique_lock ul(m); - + Plot ret; + ret.x.resize(ADU_HISTO_BIN_COUNT); + ret.y.resize(ADU_HISTO_BIN_COUNT); for (int i = 0; i < ADU_HISTO_BIN_COUNT; i++) { - plot.add_x(ADU_HISTO_BIN_WIDTH * i + ADU_HISTO_BIN_WIDTH / 2); - plot.add_y(histogram[i]); + ret.x[i] = ADU_HISTO_BIN_WIDTH * i + ADU_HISTO_BIN_WIDTH / 2; + ret.y[i] = histogram[i]; } } \ No newline at end of file diff --git a/common/ADUHistogram.h b/common/ADUHistogram.h index 3d17efc4..a55de2a2 100644 --- a/common/ADUHistogram.h +++ b/common/ADUHistogram.h @@ -4,7 +4,7 @@ #define JUNGFRAUJOCH_ADUHISTOGRAM_H #include -#include +#include "Plot.h" #include "../acquisition_device/AcquisitionDevice.h" class ADUHistogram { @@ -14,7 +14,7 @@ public: explicit ADUHistogram(); void Add(const DeviceOutput &output); const std::vector& GetHistogram() const; - void GetPlot(JFJochProtoBuf::Plot &plot) const; + Plot GetPlot() const; }; #endif //JUNGFRAUJOCH_ADUHISTOGRAM_H diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 2a01f32f..f446a96e 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -50,7 +50,8 @@ ADD_LIBRARY( CommonFunctions STATIC NUMAHWPolicy.h ADUHistogram.cpp ADUHistogram.h - RawToConvertedGeometryCore.h) + RawToConvertedGeometryCore.h + Plot.h) TARGET_LINK_LIBRARIES(CommonFunctions Compression FrameSerialize libzmq JFCalibration JFJochProtoBuf -lrt) diff --git a/common/Histogram.h b/common/Histogram.h index 477aa646..3735e9b1 100644 --- a/common/Histogram.h +++ b/common/Histogram.h @@ -7,7 +7,7 @@ #include #include #include -#include +#include "Plot.h" template class Histogram { @@ -25,16 +25,20 @@ public: } } - void GetPlot(JFJochProtoBuf::Plot &plot) { + Plot GetPlot() { std::unique_lock ul(m); + Plot ret; + ret.x.resize(sum.size()); + ret.y.resize(sum.size()); for (int i = 0; i < sum.size(); i++) { - plot.add_x(static_cast(i)); + ret.x[i] = static_cast(i); if (count[i] > 0) - plot.add_y(static_cast(sum[i]) / count[i]); + ret.y[i] = static_cast(sum[i]) / count[i]; else - plot.add_y(0); + ret.y[i] = 0; } + return ret; } }; diff --git a/common/Plot.h b/common/Plot.h new file mode 100644 index 00000000..13f2dd57 --- /dev/null +++ b/common/Plot.h @@ -0,0 +1,31 @@ +// Copyright (2019-2023) Paul Scherrer Institute + +#ifndef JUNGFRAUJOCH_PLOT_H +#define JUNGFRAUJOCH_PLOT_H + +#include +#include +#include + +enum class PlotType {BkgEstimate, RadInt, SpotCount, IndexingRate, IndexingRatePerFile, ADUHistorgram}; + +struct PlotRequest { + PlotType type; + uint64_t binning; +}; + +struct Plot { + std::vector x; + std::vector y; +}; + +struct RadialIntegrationProfileStruct { + std::string title; + Plot plot; +}; + +struct RadialIntegrationProfiles { + std::vector profiles; +}; + +#endif //JUNGFRAUJOCH_PLOT_H diff --git a/common/StatusVector.h b/common/StatusVector.h index 9f8206cd..1d15e12e 100644 --- a/common/StatusVector.h +++ b/common/StatusVector.h @@ -7,7 +7,7 @@ #include #include -#include +#include "Plot.h" #include "JFJochException.h" #include @@ -72,18 +72,21 @@ public: return ret; } - void GetPlot(JFJochProtoBuf::Plot& plot, int32_t bin_size) const { + Plot GetPlot(int64_t bin_size) const { // GetStatus has mutex, no need to lock again auto status = GetStatus(bin_size); - if (status.size() == 1) { - plot.add_x(max_id / 2.0); - plot.add_y(status[0]); - } else if (!status.empty()) { - *plot.mutable_y() = {status.begin(), status.end()}; + Plot ret; + if (status.size() == 1) { + ret.x = {max_id / 2.0f}; + ret.y = {status[0]}; + } else if (!status.empty()) { + ret.y = status; + ret.x.resize(status.size()); for (int i = 0; i < status.size(); i++) - plot.add_x(bin_size * (i + 0.5)); + ret.x[i] = bin_size * (i + 0.5f); } + return ret; } }; diff --git a/image_analysis/RadialIntegrationProfile.cpp b/image_analysis/RadialIntegrationProfile.cpp index b7c28604..70330273 100644 --- a/image_analysis/RadialIntegrationProfile.cpp +++ b/image_analysis/RadialIntegrationProfile.cpp @@ -36,13 +36,13 @@ std::vector RadialIntegrationProfile::GetResult() const { return rad_int_profile; } -void RadialIntegrationProfile::GetPlot(JFJochProtoBuf::Plot &plot) const { +Plot RadialIntegrationProfile::GetPlot() const { std::unique_lock ul(m); - std::vector rad_int_profile = GetResult(); - - *plot.mutable_x() = {bin_to_q.begin(), bin_to_q.end()}; - *plot.mutable_y() = {rad_int_profile.begin(), rad_int_profile.end()}; + Plot ret; + ret.x = bin_to_q; + ret.y = GetResult(); + return ret; } float RadialIntegrationProfile::GetMeanValueOfBins(uint16_t min_bin, uint16_t max_bin) const { diff --git a/image_analysis/RadialIntegrationProfile.h b/image_analysis/RadialIntegrationProfile.h index 168ccdfc..7ff91d66 100644 --- a/image_analysis/RadialIntegrationProfile.h +++ b/image_analysis/RadialIntegrationProfile.h @@ -5,7 +5,7 @@ #include #include -#include +#include "../common/Plot.h" #include "RadialIntegrationMapping.h" #include "../acquisition_device/AcquisitionDevice.h" @@ -21,7 +21,7 @@ public: void Add(const std::vector &sum, const std::vector &count); std::vector GetResult() const; float GetMeanValueOfBins(uint16_t min_bin, uint16_t max_bin) const; - void GetPlot(JFJochProtoBuf::Plot &plot) const; + Plot GetPlot() const; RadialIntegrationProfile& operator+=(const RadialIntegrationProfile& profile); }; diff --git a/receiver/JFJochReceiver.cpp b/receiver/JFJochReceiver.cpp index 62d1c72a..e63a5eac 100644 --- a/receiver/JFJochReceiver.cpp +++ b/receiver/JFJochReceiver.cpp @@ -660,31 +660,28 @@ JFJochProtoBuf::DataProcessingSettings JFJochReceiver::GetDataProcessingSettings return data_processing_settings; } -JFJochProtoBuf::Plot JFJochReceiver::GetPlots(const JFJochProtoBuf::PlotRequest &request) { - JFJochProtoBuf::Plot ret; +Plot JFJochReceiver::GetPlots(const PlotRequest &request) { + Plot ret; auto nbins = experiment.GetSpotFindingBin(); - if (request.binning() > 0) - nbins = request.binning(); + if (request.binning > 0) + nbins = request.binning; - switch (request.type()) { - case JFJochProtoBuf::RAD_INT: + switch (request.type) { + case PlotType::RadInt: if (rad_int_profile) - rad_int_profile->GetPlot(ret); - break; - case JFJochProtoBuf::SPOT_COUNT: - spot_count.GetPlot(ret, nbins); - break; - case JFJochProtoBuf::INDEXING_RATE: - indexing_solution.GetPlot(ret, nbins); - break; - case JFJochProtoBuf::BKG_ESTIMATE: - bkg_estimate.GetPlot(ret, nbins); - break; - case JFJochProtoBuf::INDEXING_RATE_PER_FILE: - indexing_solution_per_file.GetPlot(ret); - break; - case JFJochProtoBuf::ADU_HISTOGRAM: - adu_histogram_total.GetPlot(ret); + return rad_int_profile->GetPlot(); + else + return {}; + case PlotType::SpotCount: + return spot_count.GetPlot(nbins); + case PlotType::IndexingRate: + return indexing_solution.GetPlot(nbins); + case PlotType::BkgEstimate: + return bkg_estimate.GetPlot(nbins); + case PlotType::IndexingRatePerFile: + return indexing_solution_per_file.GetPlot(); + case PlotType::ADUHistorgram: + return adu_histogram_total.GetPlot(); break; default: // Do nothing @@ -693,19 +690,19 @@ JFJochProtoBuf::Plot JFJochReceiver::GetPlots(const JFJochProtoBuf::PlotRequest return ret; } -JFJochProtoBuf::RadialIntegrationProfiles JFJochReceiver::GetRadialIntegrationProfiles() { - JFJochProtoBuf::RadialIntegrationProfiles ret; +RadialIntegrationProfiles JFJochReceiver::GetRadialIntegrationProfiles() { + RadialIntegrationProfiles ret; if (rad_int_profile) { - auto p = ret.add_profiles(); - p->set_title("dataset"); - rad_int_profile->GetPlot(*p->mutable_plot()); + ret.profiles.emplace_back(RadialIntegrationProfileStruct{ + .title = "dataset" , + .plot = rad_int_profile->GetPlot()}); } for (int i = 0; i < rad_int_profile_per_file.size(); i++) { - auto p = ret.add_profiles(); - p->set_title("file" + std::to_string(i)); - rad_int_profile_per_file[i]->GetPlot(*p->mutable_plot()); + ret.profiles.emplace_back(RadialIntegrationProfileStruct{ + .title = "file" + std::to_string(i), + .plot = rad_int_profile_per_file[i]->GetPlot()}); } return ret; diff --git a/receiver/JFJochReceiver.h b/receiver/JFJochReceiver.h index 5fef705c..fc97dda9 100644 --- a/receiver/JFJochReceiver.h +++ b/receiver/JFJochReceiver.h @@ -29,6 +29,7 @@ #include "../jungfrau/JFCalibration.h" #include "../common/ADUHistogram.h" +#include "../common/Plot.h" struct JFJochReceiverOutput { std::vector pedestal_result; @@ -151,8 +152,8 @@ public: void SetDataProcessingSettings(const JFJochProtoBuf::DataProcessingSettings &data_processing_settings); float GetAvailableSendBuffers() const; - JFJochProtoBuf::Plot GetPlots(const JFJochProtoBuf::PlotRequest& request); - JFJochProtoBuf::RadialIntegrationProfiles GetRadialIntegrationProfiles(); + Plot GetPlots(const PlotRequest& request); + RadialIntegrationProfiles GetRadialIntegrationProfiles(); }; #endif //JUNGFRAUJOCH_JFJOCHRECEIVER_H diff --git a/receiver/JFJochReceiverService.cpp b/receiver/JFJochReceiverService.cpp index 0de1753b..ccb2463e 100644 --- a/receiver/JFJochReceiverService.cpp +++ b/receiver/JFJochReceiverService.cpp @@ -2,6 +2,49 @@ #include "JFJochReceiverService.h" +PlotRequest Convert(const JFJochProtoBuf::PlotRequest& request) { + PlotRequest ret; + ret.binning = request.binning(); + switch (request.type()) { + case JFJochProtoBuf::BKG_ESTIMATE: + ret.type = PlotType::BkgEstimate; + break; + case JFJochProtoBuf::RAD_INT: + ret.type = PlotType::RadInt; + break; + case JFJochProtoBuf::SPOT_COUNT: + ret.type = PlotType::SpotCount; + break; + case JFJochProtoBuf::INDEXING_RATE: + ret.type = PlotType::IndexingRate; + break; + case JFJochProtoBuf::INDEXING_RATE_PER_FILE: + ret.type = PlotType::IndexingRatePerFile; + break; + default: + case JFJochProtoBuf::ADU_HISTOGRAM: + ret.type = PlotType::ADUHistorgram; + break; + } + return ret; +} + +void Convert(const Plot& input, JFJochProtoBuf::Plot &output) { + if (!input.x.empty()) + *output.mutable_x() = {input.x.begin(), input.x.end()}; + if (!input.y.empty()) + *output.mutable_y() = {input.y.begin(), input.y.end()}; + +} + +void Convert(const RadialIntegrationProfiles& input, JFJochProtoBuf::RadialIntegrationProfiles& output) { + for (const auto &i: input.profiles) { + auto tmp = output.add_profiles(); + tmp->set_title(i.title); + Convert(i.plot, *tmp->mutable_plot()); + } +} + JFJochReceiverService::JFJochReceiverService(std::vector &open_capi_device, Logger &in_logger, ImagePusher &pusher) : logger(in_logger), aq_devices(open_capi_device), @@ -175,7 +218,7 @@ grpc::Status JFJochReceiverService::GetDataProcessingPlots(grpc::ServerContext * // Need to hold mutex, as receiver might not exist here, if state is idle std::unique_lock ul(state_mutex); if (receiver) - *response = receiver->GetPlots(*request); + Convert(receiver->GetPlots(Convert(*request)), *response); return grpc::Status::OK; } @@ -185,7 +228,7 @@ grpc::Status JFJochReceiverService::GetRadialIntegrationProfiles(grpc::ServerCon // Need to hold mutex, as receiver might not exist here, if state is idle std::unique_lock ul(state_mutex); if (receiver) - *response = receiver->GetRadialIntegrationProfiles(); + Convert(receiver->GetRadialIntegrationProfiles(), *response); return grpc::Status::OK; } diff --git a/tests/RadialIntegrationTest.cpp b/tests/RadialIntegrationTest.cpp index 19ec84b6..de7388dc 100644 --- a/tests/RadialIntegrationTest.cpp +++ b/tests/RadialIntegrationTest.cpp @@ -79,14 +79,13 @@ TEST_CASE("RadialIntegrationProfile","[RadialIntegration]") { std::vector sum_wr(mapping.GetBinNumber() - 1); REQUIRE_THROWS(profile.Add(sum_wr, count)); - JFJochProtoBuf::Plot plot; - profile.GetPlot(plot); + Plot plot = profile.GetPlot(); - REQUIRE(plot.x_size() == mapping.GetBinNumber()); - REQUIRE(plot.y_size() == mapping.GetBinNumber()); + REQUIRE(plot.x.size() == mapping.GetBinNumber()); + REQUIRE(plot.y.size() == mapping.GetBinNumber()); for (int i = 0; i < mapping.GetBinNumber(); i++) { - REQUIRE(plot.x(i) == Approx(mapping.GetBinToQ()[i])); - REQUIRE(plot.y(i) == Approx(i * 4)); + REQUIRE(plot.x[i] == Approx(mapping.GetBinToQ()[i])); + REQUIRE(plot.y[i] == Approx(i * 4)); } } @@ -109,14 +108,13 @@ TEST_CASE("RadialIntegrationProfile_operatorAdd","[RadialIntegration]") { REQUIRE_NOTHROW(profile0.Add(sum, count)); REQUIRE_NOTHROW(profile1 += profile0); - JFJochProtoBuf::Plot plot; - profile1.GetPlot(plot); + auto plot = profile1.GetPlot(); - REQUIRE(plot.x_size() == mapping.GetBinNumber()); - REQUIRE(plot.y_size() == mapping.GetBinNumber()); + REQUIRE(plot.x.size() == mapping.GetBinNumber()); + REQUIRE(plot.y.size() == mapping.GetBinNumber()); for (int i = 0; i < mapping.GetBinNumber(); i++) { - REQUIRE(plot.x(i) == Approx(mapping.GetBinToQ()[i])); - REQUIRE(plot.y(i) == Approx(i * 4)); + REQUIRE(plot.x[i] == Approx(mapping.GetBinToQ()[i])); + REQUIRE(plot.y[i] == Approx(i * 4)); } } diff --git a/tests/StatusVectorTest.cpp b/tests/StatusVectorTest.cpp index efb6f949..59e5abcd 100644 --- a/tests/StatusVectorTest.cpp +++ b/tests/StatusVectorTest.cpp @@ -45,24 +45,22 @@ TEST_CASE("StatusVector_Plot","[StatusVector]") { status_vector.AddElement(2543, 44); status_vector.AddElement(2600, 41); - JFJochProtoBuf::Plot plot_out; - status_vector.GetPlot(plot_out, 1000); - REQUIRE(plot_out.x_size() == 3); - REQUIRE(plot_out.y_size() == 3); - REQUIRE(plot_out.x(0) == Approx(500)); - REQUIRE(plot_out.y(0) == Approx(11)); - REQUIRE(plot_out.x(2) == Approx(2500)); - REQUIRE(plot_out.y(2) == Approx((45 + 44 + 41) / 3.0)); + Plot plot_out = status_vector.GetPlot(1000); + REQUIRE(plot_out.x.size() == 3); + REQUIRE(plot_out.y.size() == 3); + REQUIRE(plot_out.x[0] == Approx(500)); + REQUIRE(plot_out.y[0] == Approx(11)); + REQUIRE(plot_out.x[2] == Approx(2500)); + REQUIRE(plot_out.y[2] == Approx((45 + 44 + 41) / 3.0)); } TEST_CASE("StatusVector_Plot_OneBin","[StatusVector]") { StatusVector status_vector; status_vector.AddElement(5, 11); - JFJochProtoBuf::Plot plot_out; - status_vector.GetPlot(plot_out, 1000); - REQUIRE(plot_out.x_size() == 1); - REQUIRE(plot_out.y_size() == 1); - REQUIRE(plot_out.x(0) == Approx(2.5)); - REQUIRE(plot_out.y(0) == Approx(11)); + auto plot_out = status_vector.GetPlot(1000); + REQUIRE(plot_out.x.size() == 1); + REQUIRE(plot_out.y.size() == 1); + REQUIRE(plot_out.x[0] == Approx(2.5)); + REQUIRE(plot_out.y[0] == Approx(11)); } \ No newline at end of file