JFJochReceiver: Give one plot at a time

This commit is contained in:
2023-04-18 13:55:43 +02:00
parent 962edaa4ad
commit 25cb4df0bf
21 changed files with 186 additions and 152 deletions

View File

@@ -49,9 +49,9 @@ grpc::Status JFJochBroker::GetStatus(grpc::ServerContext *context, const JFJochP
GRPC_RUN( *response = state_machine.GetStatus() );
}
grpc::Status JFJochBroker::GetPlots(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,
JFJochProtoBuf::ReceiverDataProcessingPlots *response) {
GRPC_RUN( *response = state_machine.GetPlots() );
grpc::Status JFJochBroker::GetPlots(grpc::ServerContext *context, const JFJochProtoBuf::PlotRequest *request,
JFJochProtoBuf::Plot *response) {
GRPC_RUN( *response = state_machine.GetPlots(*request) );
}
grpc::Status JFJochBroker::GetPreview(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,

View File

@@ -41,8 +41,8 @@ public:
grpc::Status GetStatus(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,
JFJochProtoBuf::BrokerStatus *response) override;
grpc::Status GetPlots(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,
JFJochProtoBuf::ReceiverDataProcessingPlots *response) override;
grpc::Status GetPlots(grpc::ServerContext *context, const JFJochProtoBuf::PlotRequest *request,
JFJochProtoBuf::Plot *response) override;
grpc::Status GetPreview(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,
JFJochProtoBuf::PreviewFrame *response) override;

View File

@@ -143,16 +143,11 @@ JFJochProtoBuf::ReceiverStatus JFJochServices::GetReceiverStatus() {
return receiver.GetStatus();
}
JFJochProtoBuf::ReceiverDataProcessingPlots JFJochServices::GetPlots() {
JFJochProtoBuf::Plot JFJochServices::GetPlots(const JFJochProtoBuf::PlotRequest &request) {
try {
return receiver.GetPlots();
return receiver.GetPlots(request);
} catch (...) {
JFJochProtoBuf::ReceiverDataProcessingPlots plots;
*plots.mutable_indexing_rate() = JFJochProtoBuf::Plot();
*plots.mutable_bkg_estimate() = JFJochProtoBuf::Plot();
*plots.mutable_spot_count() = JFJochProtoBuf::Plot();
*plots.mutable_radial_int_profile() = JFJochProtoBuf::Plot();
return plots;
return JFJochProtoBuf::Plot();
}
}

View File

@@ -31,7 +31,7 @@ public:
JFJochProtoBuf::ReceiverStatus GetReceiverStatus();
JFJochProtoBuf::PreviewFrame GetPreviewFrame();
JFJochProtoBuf::ReceiverDataProcessingPlots GetPlots();
JFJochProtoBuf::Plot GetPlots(const JFJochProtoBuf::PlotRequest &request);
void SetDataProcessingSettings(const JFJochProtoBuf::DataProcessingSettings &settings);
JFJochServices& Receiver(const std::string &addr);

View File

@@ -493,8 +493,8 @@ JFJochProtoBuf::BrokerStatus JFJochStateMachine::GetStatus() const {
return ret;
}
JFJochProtoBuf::ReceiverDataProcessingPlots JFJochStateMachine::GetPlots() const {
return services.GetPlots();
JFJochProtoBuf::Plot JFJochStateMachine::GetPlots(const JFJochProtoBuf::PlotRequest &request) const {
return services.GetPlots(request);
}
void JFJochStateMachine::SetDataProcessingSettings(const JFJochProtoBuf::DataProcessingSettings &settings) {

View File

@@ -84,7 +84,7 @@ public:
JFJochProtoBuf::JFCalibrationStatistics GetCalibrationStatistics() const;
JFJochProtoBuf::BrokerStatus GetStatus() const;
JFJochProtoBuf::ReceiverDataProcessingPlots GetPlots() const;
JFJochProtoBuf::Plot GetPlots(const JFJochProtoBuf::PlotRequest &request) const;
JFJochProtoBuf::Image GetNeXusMask() const;
JFJochProtoBuf::Image GetPedestalG0() const;

View File

@@ -690,12 +690,10 @@ int64_t DiffractionExperiment::GetSpotFindingStride() const {
}
int64_t DiffractionExperiment::GetSpotFindingBin() const {
if (GetSpotFindingPeriod().count() <= 0)
return 100;
else if (GetSpotFindingPeriod().count() >= 1000*1000)
if (GetImageTime().count() >= 200*1000)
return 1;
else
return 1000*1000/(GetSpotFindingPeriod().count()); // 1 bin = 1 second
return 200*1000 / GetImageTime().count(); // 1 bin = 1 second
}
int64_t DiffractionExperiment::GetPreviewStride(std::chrono::microseconds period) const {

View File

@@ -11,7 +11,7 @@
#include <jfjoch.pb.h>
#include "JFJochException.h"
#include <iostream>
template <class T> class StatusVector {
mutable std::mutex m;
@@ -20,10 +20,10 @@ template <class T> class StatusVector {
public:
void AddElement(uint32_t id, T val) {
std::unique_lock<std::mutex> ul(m);
content[id] = val;
if (id > max_id)
max_id = id;
}
[[nodiscard]] float Mean() const {
@@ -47,8 +47,12 @@ public:
"Bin number must be greater than zero");
std::vector<float> ret;
size_t elems = (max_id + 1) / bin_size + (((max_id + 1) % bin_size > 0) ? 1 : 0);
ret.resize(elems);
if (!content.empty()) {
for (int bin = 0; bin < max_id / bin_size + ((max_id % bin_size > 0) ? 1 : 0); bin++) {
for (int bin = 0; bin < elems; bin++) {
double sum = 0;
int64_t count = 0;
@@ -61,9 +65,9 @@ public:
}
}
if (count > 0)
ret.push_back(static_cast<float>(sum / static_cast<double>(count)));
ret[bin] = static_cast<float>(sum / static_cast<double>(count));
else
ret.push_back(0.0);
ret[bin] = 0.0;
}
}
return ret;

View File

@@ -131,17 +131,16 @@ JFJochProtoBuf::ReceiverNetworkConfig JFJochReceiverClient::GetNetworkConfig() {
return ret;
}
JFJochProtoBuf::ReceiverDataProcessingPlots JFJochReceiverClient::GetPlots() {
JFJochProtoBuf::ReceiverDataProcessingPlots ret;
JFJochProtoBuf::Plot JFJochReceiverClient::GetPlots(const JFJochProtoBuf::PlotRequest &request) {
JFJochProtoBuf::Plot ret;
if (_stub) {
grpc::ClientContext context;
JFJochProtoBuf::Empty empty;
auto status = _stub->GetDataProcessingPlots(&context, empty, &ret);
auto status = _stub->GetDataProcessingPlots(&context, request, &ret);
if (!status.ok()) throw JFJochException(JFJochExceptionCategory::gRPCError,
"JFJochReceiver: " + status.error_message());
} else {
// TODO: Write some dummy plots
}
return ret;
}

View File

@@ -22,7 +22,7 @@ public:
JFJochProtoBuf::ReceiverStatus GetStatus();
JFJochProtoBuf::PreviewFrame GetPreviewFrame();
JFJochProtoBuf::ReceiverNetworkConfig GetNetworkConfig();
JFJochProtoBuf::ReceiverDataProcessingPlots GetPlots();
JFJochProtoBuf::Plot GetPlots(const JFJochProtoBuf::PlotRequest& request);
};

View File

@@ -260,6 +260,18 @@ message ReceiverStatus {
optional float indexing_rate = 3;
}
enum PlotType {
BKG_ESTIMATE = 0;
RAD_INT = 1;
SPOT_COUNT = 2;
INDEXING_RATE = 3;
}
message PlotRequest {
PlotType type = 1;
uint64 binning = 2;
}
message ReceiverDataProcessingPlots {
Plot bkg_estimate = 1;
Plot radial_int_profile = 2;
@@ -377,7 +389,6 @@ message DataProcessingSettings {
optional float low_resolution_limit = 7;
float bkg_estimate_low_q = 8;
float bkg_estimate_high_q = 9;
optional int64 result_binning = 10;
}
message PreviewFrame {
@@ -481,7 +492,7 @@ service gRPC_JFJochReceiver {
rpc Stop (Empty) returns (ReceiverOutput) {}
rpc GetStatus (Empty) returns (ReceiverStatus) {}
rpc SetDataProcessingSettings(DataProcessingSettings) returns (Empty) {}
rpc GetDataProcessingPlots(Empty) returns (ReceiverDataProcessingPlots) {}
rpc GetDataProcessingPlots(PlotRequest) returns (Plot) {}
rpc GetPreviewFrame (Empty) returns (PreviewFrame) {}
rpc GetNetworkConfig (Empty) returns (ReceiverNetworkConfig) {}
}
@@ -517,7 +528,7 @@ service gRPC_JFJochBroker {
rpc GetMeasurementStatistics (Empty) returns (MeasurementStatistics) {}
rpc GetDataProcessingSettings (Empty) returns (DataProcessingSettings) {}
rpc PutDataProcessingSettings (DataProcessingSettings) returns (Empty) {}
rpc GetPlots (Empty) returns (ReceiverDataProcessingPlots) {}
rpc GetPlots (PlotRequest) returns (Plot) {}
rpc GetPreview (Empty) returns (PreviewFrame) {}
rpc GetPedestalG0 (Empty) returns (Image) {}

View File

@@ -174,12 +174,12 @@ async def put_data_processing_settings(data: str = Body(...)):
raise HTTPException(status_code=400, detail=e.details())
@app.get("/data_processing/plots")
async def get_settings():
@app.post("/data_processing/plots")
async def get_settings(data: str = Body(...)):
try:
stub = jfjoch_pb2_grpc.gRPC_JFJochBrokerStub(channel)
return MessageToDict(
stub.GetPlots(jfjoch_pb2.Empty()), including_default_value_fields=True
stub.GetPlots(Parse(data, jfjoch_pb2.PlotRequest())), including_default_value_fields=True
)
except grpc.RpcError as e:
raise HTTPException(status_code=400, detail=e.details())

File diff suppressed because one or more lines are too long

View File

@@ -46,8 +46,8 @@ class gRPC_JFJochReceiverStub(object):
)
self.GetDataProcessingPlots = channel.unary_unary(
'/JFJochProtoBuf.gRPC_JFJochReceiver/GetDataProcessingPlots',
request_serializer=jfjoch__pb2.Empty.SerializeToString,
response_deserializer=jfjoch__pb2.ReceiverDataProcessingPlots.FromString,
request_serializer=jfjoch__pb2.PlotRequest.SerializeToString,
response_deserializer=jfjoch__pb2.Plot.FromString,
)
self.GetPreviewFrame = channel.unary_unary(
'/JFJochProtoBuf.gRPC_JFJochReceiver/GetPreviewFrame',
@@ -153,8 +153,8 @@ def add_gRPC_JFJochReceiverServicer_to_server(servicer, server):
),
'GetDataProcessingPlots': grpc.unary_unary_rpc_method_handler(
servicer.GetDataProcessingPlots,
request_deserializer=jfjoch__pb2.Empty.FromString,
response_serializer=jfjoch__pb2.ReceiverDataProcessingPlots.SerializeToString,
request_deserializer=jfjoch__pb2.PlotRequest.FromString,
response_serializer=jfjoch__pb2.Plot.SerializeToString,
),
'GetPreviewFrame': grpc.unary_unary_rpc_method_handler(
servicer.GetPreviewFrame,
@@ -290,8 +290,8 @@ class gRPC_JFJochReceiver(object):
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/JFJochProtoBuf.gRPC_JFJochReceiver/GetDataProcessingPlots',
jfjoch__pb2.Empty.SerializeToString,
jfjoch__pb2.ReceiverDataProcessingPlots.FromString,
jfjoch__pb2.PlotRequest.SerializeToString,
jfjoch__pb2.Plot.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -764,8 +764,8 @@ class gRPC_JFJochBrokerStub(object):
)
self.GetPlots = channel.unary_unary(
'/JFJochProtoBuf.gRPC_JFJochBroker/GetPlots',
request_serializer=jfjoch__pb2.Empty.SerializeToString,
response_deserializer=jfjoch__pb2.ReceiverDataProcessingPlots.FromString,
request_serializer=jfjoch__pb2.PlotRequest.SerializeToString,
response_deserializer=jfjoch__pb2.Plot.FromString,
)
self.GetPreview = channel.unary_unary(
'/JFJochProtoBuf.gRPC_JFJochBroker/GetPreview',
@@ -1014,8 +1014,8 @@ def add_gRPC_JFJochBrokerServicer_to_server(servicer, server):
),
'GetPlots': grpc.unary_unary_rpc_method_handler(
servicer.GetPlots,
request_deserializer=jfjoch__pb2.Empty.FromString,
response_serializer=jfjoch__pb2.ReceiverDataProcessingPlots.SerializeToString,
request_deserializer=jfjoch__pb2.PlotRequest.FromString,
response_serializer=jfjoch__pb2.Plot.SerializeToString,
),
'GetPreview': grpc.unary_unary_rpc_method_handler(
servicer.GetPreview,
@@ -1312,8 +1312,8 @@ class gRPC_JFJochBroker(object):
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/JFJochProtoBuf.gRPC_JFJochBroker/GetPlots',
jfjoch__pb2.Empty.SerializeToString,
jfjoch__pb2.ReceiverDataProcessingPlots.FromString,
jfjoch__pb2.PlotRequest.SerializeToString,
jfjoch__pb2.Plot.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

View File

@@ -601,28 +601,39 @@ void JFJochReceiver::AddRadialIntegrationProfile(const std::vector<float> &resul
}
}
void JFJochReceiver::GetRadialIntegrationProfile(JFJochProtoBuf::ReceiverDataProcessingPlots &plots) {
void JFJochReceiver::GetRadialIntegrationProfile(JFJochProtoBuf::Plot &plot) {
std::unique_lock<std::mutex> ul(rad_int_profile_mutex);
auto plot = plots.mutable_radial_int_profile();
const auto &bin_to_q = rad_int_mapping->GetBinToQ();
if (!rad_int_profile.empty()) {
*plot->mutable_x() = {bin_to_q.begin(), bin_to_q.end()};
*plot->mutable_y() = {rad_int_profile.begin(), rad_int_profile.end()};
*plot.mutable_x() = {bin_to_q.begin(), bin_to_q.end()};
*plot.mutable_y() = {rad_int_profile.begin(), rad_int_profile.end()};
}
}
JFJochProtoBuf::ReceiverDataProcessingPlots JFJochReceiver::GetPlots() {
JFJochProtoBuf::ReceiverDataProcessingPlots ret;
auto local_data_processing_settings = GetDataProcessingSettings();
JFJochProtoBuf::Plot JFJochReceiver::GetPlots(const JFJochProtoBuf::PlotRequest &request) {
JFJochProtoBuf::Plot ret;
auto nbins = experiment.GetSpotFindingBin();
if (local_data_processing_settings.has_result_binning())
nbins = local_data_processing_settings.result_binning();
if (request.binning() > 0)
nbins = request.binning();
spot_count.GetPlot(*ret.mutable_spot_count(), nbins);
bkg_estimate.GetPlot(*ret.mutable_bkg_estimate(), nbins);
indexing_solution.GetPlot(*ret.mutable_indexing_rate(), nbins);
GetRadialIntegrationProfile(ret);
switch (request.type()) {
case JFJochProtoBuf::RAD_INT:
GetRadialIntegrationProfile(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;
default:
// Do nothing
break;
}
return ret;
}

View File

@@ -100,7 +100,7 @@ class JFJochReceiver {
JFJochProtoBuf::DataProcessingSettings GetDataProcessingSettings();
void AddRadialIntegrationProfile(const std::vector<float> &result);
void GetRadialIntegrationProfile(JFJochProtoBuf::ReceiverDataProcessingPlots &plots);
void GetRadialIntegrationProfile(JFJochProtoBuf::Plot &plots);
void UpdateMaxImage(int64_t image_number);
public:
@@ -122,7 +122,7 @@ public:
double GetIndexingRate() const;
void SetDataProcessingSettings(const JFJochProtoBuf::DataProcessingSettings &data_processing_settings);
JFJochProtoBuf::ReceiverDataProcessingPlots GetPlots();
JFJochProtoBuf::Plot GetPlots(const JFJochProtoBuf::PlotRequest& request);
};
#endif //JUNGFRAUJOCH_JFJOCHRECEIVER_H

View File

@@ -129,12 +129,14 @@ grpc::Status JFJochReceiverService::GetStatus(grpc::ServerContext *context, cons
}
grpc::Status
JFJochReceiverService::GetDataProcessingPlots(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,
JFJochProtoBuf::ReceiverDataProcessingPlots *response) {
JFJochReceiverService::GetDataProcessingPlots(grpc::ServerContext *context, const JFJochProtoBuf::PlotRequest *request,
JFJochProtoBuf::Plot *response) {
// Need to hold mutex, as receiver might not exist here, if state is idle
std::unique_lock<std::mutex> ul(state_mutex);
if (request->binning() <= 0)
return {grpc::StatusCode::ABORTED, "Binning must be > 0"};
if (receiver)
*response = receiver->GetPlots();
*response = receiver->GetPlots(*request);
return grpc::Status::OK;
}

View File

@@ -47,8 +47,8 @@ public:
JFJochProtoBuf::PreviewFrame *response) override;
grpc::Status GetNetworkConfig(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,
JFJochProtoBuf::ReceiverNetworkConfig *response) override;
grpc::Status GetDataProcessingPlots(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request,
JFJochProtoBuf::ReceiverDataProcessingPlots *response) override;
grpc::Status GetDataProcessingPlots(grpc::ServerContext *context, const JFJochProtoBuf::PlotRequest *request,
JFJochProtoBuf::Plot *response) override;
};

View File

@@ -440,6 +440,7 @@ TEST_CASE("DiffractionExperiment_SpotFinding", "[DiffractionExperiment]") {
DiffractionExperiment x;
std::map<size_t, uint32_t> map, map2;
x.ImagesPerTrigger(10000).Summation(1).FrameTime(1ms);
REQUIRE(x.GetSpotFindingBin() == 200);
x.SpotFindingPeriod(0ms);
REQUIRE(x.GetSpotFindingStride() == 0);
REQUIRE(x.GetSpotFindingPeriod().count() == 0);
@@ -447,19 +448,6 @@ TEST_CASE("DiffractionExperiment_SpotFinding", "[DiffractionExperiment]") {
x.SpotFindingPeriod(1s);
REQUIRE(x.GetSpotFindingPeriod() == std::chrono::milliseconds(1000));
REQUIRE(x.GetSpotFindingStride() == 1000);
REQUIRE(x.GetSpotFindingBin() == 1);
x.SpotFindingPeriod(10s);
REQUIRE(x.GetSpotFindingBin() == 1);
x.SpotFindingPeriod(10ms);
REQUIRE(x.GetSpotFindingBin() == 100);
x.SpotFindingPeriod(4ms);
REQUIRE(x.GetSpotFindingBin() == 250);
x.SpotFindingPeriod(50ms);
REQUIRE(x.GetSpotFindingBin() == 20);
REQUIRE_THROWS(x.SpotFindingPeriod(-5ms));

View File

@@ -814,13 +814,27 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_background_estimation", "[JFJochReceiver]")
REQUIRE_NOTHROW(state_machine.Stop());
logger.Info("Stopped measurement");
JFJochProtoBuf::ReceiverDataProcessingPlots plots;
REQUIRE(fpga_receiver.GetDataProcessingPlots(nullptr, nullptr, &plots).ok());
JFJochProtoBuf::PlotRequest req;
req.set_type(JFJochProtoBuf::BKG_ESTIMATE);
req.set_binning(10);
REQUIRE(plots.bkg_estimate().x_size() == 1);
REQUIRE(plots.bkg_estimate().y_size() == 1);
REQUIRE(plots.bkg_estimate().x(0) == Approx(4.5));
REQUIRE(plots.bkg_estimate().y(0) == Approx((5 + 23) / 2.0));
JFJochProtoBuf::Plot plot;
REQUIRE(fpga_receiver.GetDataProcessingPlots(nullptr, &req, &plot).ok());
REQUIRE(plot.x_size() == 1);
REQUIRE(plot.y_size() == 1);
REQUIRE(plot.x(0) == Approx(4.5));
REQUIRE(plot.y(0) == Approx((5 + 23) / 2.0));
req.set_type(JFJochProtoBuf::BKG_ESTIMATE);
req.set_binning(1);
REQUIRE(fpga_receiver.GetDataProcessingPlots(nullptr, &req, &plot).ok());
REQUIRE(plot.x_size() == 10);
REQUIRE(plot.y_size() == 10);
req.set_binning(0);
REQUIRE(!fpga_receiver.GetDataProcessingPlots(nullptr, &req, &plot).ok());
auto tmp = state_machine.GetMeasurementStatistics();
REQUIRE(tmp.has_value());

View File

@@ -28,6 +28,14 @@ TEST_CASE("StatusVector_GetStatus","[StatusVector]") {
REQUIRE(status_out[3] == 0);
REQUIRE(status_out[4] == Approx(45));
REQUIRE(status_out[5] == Approx((44+41)/2.0));
status_out = status_vector.GetStatus(1);
REQUIRE(status_out.size() == 2601);
REQUIRE(status_out[5] == 11);
REQUIRE(status_out[1900] == 0);
REQUIRE(status_out[2000] == 45);
REQUIRE(status_out[2543] == 44);
REQUIRE(status_out[2600] == 41);
}
TEST_CASE("StatusVector_Plot","[StatusVector]") {