diff --git a/broker/JFJochBroker.cpp b/broker/JFJochBroker.cpp index 41fb5b3d..2c57004c 100644 --- a/broker/JFJochBroker.cpp +++ b/broker/JFJochBroker.cpp @@ -117,11 +117,23 @@ grpc::Status JFJochBroker::GetMeasurementStatistics(grpc::ServerContext *context }); } -void JFJochBroker::LoadGainFile(const std::string &filename) { - state_machine.LoadGainFile(filename); - logger.Info("Loaded gain file {}", filename); -} - JFJochServices &JFJochBroker::Services() { return services; } + +void JFJochBroker::AddDetectorSetup(const DetectorSetup &setup) { + state_machine.AddDetectorSetup(setup); + logger.Info("Added detector {}", setup.GetDescription()); +} + +grpc::Status JFJochBroker::GetDetectorList(grpc::ServerContext *context, + const JFJochProtoBuf::Empty *request, + JFJochProtoBuf::DetectorList *response) { + GRPC_RUN(*response = state_machine.GetDetectorsList() ); +} + +grpc::Status JFJochBroker::SelectDetector(grpc::ServerContext *context, + const JFJochProtoBuf::DetectorSelection *request, + JFJochProtoBuf::Empty *response) { + GRPC_RUN(state_machine.SelectDetector(request->id())); +} diff --git a/broker/JFJochBroker.h b/broker/JFJochBroker.h index 9fc71e6d..a3167054 100644 --- a/broker/JFJochBroker.h +++ b/broker/JFJochBroker.h @@ -14,7 +14,7 @@ class JFJochBroker final : public JFJochProtoBuf::gRPC_JFJochBroker::Service { JFJochStateMachine state_machine {services, logger}; public: JFJochBroker(const DiffractionExperiment& experiment); - void LoadGainFile(const std::string& filename); + void AddDetectorSetup(const DetectorSetup &setup); JFJochServices& Services(); grpc::Status Start(grpc::ServerContext *context, const JFJochProtoBuf::DatasetSettings *request, @@ -77,6 +77,11 @@ public: grpc::Status GetMeasurementStatistics(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request, JFJochProtoBuf::MeasurementStatistics *response) override; + grpc::Status GetDetectorList(grpc::ServerContext *context, const JFJochProtoBuf::Empty *request, + JFJochProtoBuf::DetectorList *response) override; + + grpc::Status SelectDetector(grpc::ServerContext *context, const JFJochProtoBuf::DetectorSelection *request, + JFJochProtoBuf::Empty *response) override; }; diff --git a/broker/JFJochBrokerParser.cpp b/broker/JFJochBrokerParser.cpp index 70a0d0fe..4fbd737f 100644 --- a/broker/JFJochBrokerParser.cpp +++ b/broker/JFJochBrokerParser.cpp @@ -185,6 +185,9 @@ DetectorGeometry ParseDetectorGeometry(const nlohmann::json &j) { } DetectorSetup ParseDetectorSetup(const nlohmann::json &j) { + if (!j.is_object()) + throw JFJochException(JFJochExceptionCategory::JSON, "Expecting JSON object for detector setup"); + DetectorGeometry geom = ParseDetectorGeometry(j); std::string description = GET_STR(j, "description"); @@ -198,36 +201,52 @@ DetectorSetup ParseDetectorSetup(const nlohmann::json &j) { return setup; } -void ParseFacilityConfiguration(const nlohmann::json &j, DiffractionExperiment &experiment) { - experiment.SourceName(GET_STR(j, "source_name")); - experiment.SourceNameShort(GET_STR(j, "source_name_short")); - experiment.InstrumentName(GET_STR(j, "instrument_name")); - experiment.InstrumentNameShort(GET_STR(j, "instrument_name_short")); - experiment.DataStreams(GET_I64(j, "datastreams")); - - experiment.PedestalG0Frames(GET_I64(j, "pedestal_g0_frames")); - experiment.PedestalG1Frames(GET_I64(j, "pedestal_g1_frames")); - experiment.PedestalG2Frames(GET_I64(j, "pedestal_g2_frames")); - - experiment.FrameTime(GET_TIME(j, "frame_time_us"), GET_TIME(j, "count_time_us")); - - experiment.IndexingPeriod(GET_TIME(j, "indexing_period_us")); - experiment.SpotFindingPeriod(GET_TIME(j, "spot_finding_period_us")); - experiment.PreviewPeriod(GET_TIME(j, "preview_period_us")); - - experiment.IPv4Subnet(GET_STR(j, "ipv4_subnet")); +void ParseDetectorSetup(const nlohmann::json &j, const std::string& tag, JFJochBroker& broker) { + if (CHECK_ARRAY(j, tag)) { + for (const auto &iter : j[tag]) + broker.AddDetectorSetup(ParseDetectorSetup(iter)); + } else + throw JFJochException(JFJochExceptionCategory::JSON, "Detector setup not found"); } -void ParseBrokerConfiguration(const nlohmann::json &input, JFJochBroker& broker) { - if (input.contains("receiver_addr")) - broker.Services().Receiver(GET_STR(input, "receiver_addr")); +void ParseFacilityConfiguration(const nlohmann::json &input, const std::string& tag, DiffractionExperiment &experiment) { + if (CHECK_OBJECT(input, tag)) { + auto j = input[tag]; + experiment.SourceName(GET_STR(j, "source_name")); + experiment.SourceNameShort(GET_STR(j, "source_name_short")); + experiment.InstrumentName(GET_STR(j, "instrument_name")); + experiment.InstrumentNameShort(GET_STR(j, "instrument_name_short")); + experiment.DataStreams(GET_I64(j, "datastreams")); - if (CHECK_ARRAY(input, "writer")) { - for (const auto &j: input["writer"]) { - broker.Services().Writer(GET_STR(j, "addr_grpc"), GET_STR(j, "addr_zmq")); + experiment.PedestalG0Frames(GET_I64(j, "pedestal_g0_frames")); + experiment.PedestalG1Frames(GET_I64(j, "pedestal_g1_frames")); + experiment.PedestalG2Frames(GET_I64(j, "pedestal_g2_frames")); + + experiment.FrameTime(GET_TIME(j, "frame_time_us"), GET_TIME(j, "count_time_us")); + + experiment.IndexingPeriod(GET_TIME(j, "indexing_period_us")); + experiment.SpotFindingPeriod(GET_TIME(j, "spot_finding_period_us")); + experiment.PreviewPeriod(GET_TIME(j, "preview_period_us")); + + experiment.IPv4Subnet(GET_STR(j, "ipv4_subnet")); + } else + throw JFJochException(JFJochExceptionCategory::JSON, "Default configuration not found"); +} + +void ParseBrokerConfiguration(const nlohmann::json &input, const std::string& tag, JFJochBroker& broker) { + if (CHECK_OBJECT(input, tag)) { + auto j = input[tag]; + if (j.contains("receiver_addr")) + broker.Services().Receiver(GET_STR(j, "receiver_addr")); + + if (CHECK_ARRAY(j, "writer")) { + for (const auto &iter: j["writer"]) { + broker.Services().Writer(GET_STR(iter, "addr_grpc"), GET_STR(iter, "addr_zmq")); + } } - } - if (input.contains("detector_addr")) - broker.Services().Detector(GET_STR(input, "detector_addr")); + if (j.contains("detector_addr")) + broker.Services().Detector(GET_STR(j, "detector_addr")); + } else + throw JFJochException(JFJochExceptionCategory::JSON, "Service configuration not found"); } \ No newline at end of file diff --git a/broker/JFJochBrokerParser.h b/broker/JFJochBrokerParser.h index 9ccf1010..8efbc1b3 100644 --- a/broker/JFJochBrokerParser.h +++ b/broker/JFJochBrokerParser.h @@ -12,7 +12,8 @@ DetectorGeometry ParseStandardDetectorGeometry(const nlohmann::json &j); DetectorGeometry ParseCustomDetectorGeometry(const nlohmann::json &j); DetectorGeometry ParseDetectorGeometry(const nlohmann::json &j); DetectorSetup ParseDetectorSetup(const nlohmann::json &j); -void ParseFacilityConfiguration(const nlohmann::json &j, DiffractionExperiment &experiment); -void ParseBrokerConfiguration(const nlohmann::json &input, JFJochBroker& broker); +void ParseDetectorSetup(const nlohmann::json &j, const std::string& tag, JFJochBroker& broker); +void ParseFacilityConfiguration(const nlohmann::json &j, const std::string& tag, DiffractionExperiment &experiment); +void ParseBrokerConfiguration(const nlohmann::json &input, const std::string& tag, JFJochBroker& broker); #endif //JUNGFRAUJOCH_JFJOCHBROKERPARSER_H diff --git a/broker/JFJochStateMachine.cpp b/broker/JFJochStateMachine.cpp index 5dbfe4bd..1e765c9b 100644 --- a/broker/JFJochStateMachine.cpp +++ b/broker/JFJochStateMachine.cpp @@ -130,8 +130,10 @@ void JFJochStateMachine::Initialize() { std::unique_lock ul(m); if ((state == JFJochState::Measuring) || (state == JFJochState::Pedestal)) - throw JFJochException(JFJochExceptionCategory::WrongDAQState, - "Cannot initialize during measurement"); + throw JFJochException(JFJochExceptionCategory::WrongDAQState, "Cannot initialize during measurement"); + + if (detector_setup.empty()) + throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Detector information not provided"); logger.Info("Initialize"); @@ -511,6 +513,45 @@ JFJochState JFJochStateMachine::GetState() const { return state; } -void JFJochStateMachine::LoadGainFile(const std::string &filename) { - gain_calibration.emplace_back(filename); +void JFJochStateMachine::AddDetectorSetup(const DetectorSetup &setup) { + std::unique_lock ul(m); + + if (detector_setup.empty()) { + experiment.Detector(setup); + gain_calibration = setup.GetGainCalibration(); + } + detector_setup.emplace_back(setup); +} + +JFJochProtoBuf::DetectorList JFJochStateMachine::GetDetectorsList() { + std::unique_lock ul(m); + JFJochProtoBuf::DetectorList ret; + for (const auto& i: detector_setup) { + auto tmp = ret.add_detector(); + tmp->set_description(i.GetDescription()); + tmp->set_nmodules(i.GetModulesNum()); + } + return ret; +} + +void JFJochStateMachine::SelectDetector(int64_t id) { + std::unique_lock ul(m); + + if ((id < 0) || (id >= detector_setup.size())) + throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, "Detector doesn't exist"); + + switch (state) { + case JFJochState::Inactive: + case JFJochState::Error: + case JFJochState::Idle: + experiment.Detector(detector_setup[id]); + gain_calibration = detector_setup[id].GetGainCalibration(); + state = JFJochState::Inactive; + break; + case JFJochState::Measuring: + case JFJochState::Busy: + case JFJochState::Pedestal: + throw JFJochException(JFJochExceptionCategory::WrongDAQState, + "Cannot change detector during data collection"); + } } diff --git a/broker/JFJochStateMachine.h b/broker/JFJochStateMachine.h index 7014f9e0..235f1027 100644 --- a/broker/JFJochStateMachine.h +++ b/broker/JFJochStateMachine.h @@ -23,12 +23,14 @@ class JFJochStateMachine { mutable std::mutex m; std::condition_variable c; + // mutex m is protecting: DiffractionExperiment experiment; volatile JFJochState state = JFJochState::Inactive; volatile bool cancel_sequence = false; std::unique_ptr calibration; std::vector gain_calibration; + std::vector detector_setup; std::future measurement; @@ -99,7 +101,9 @@ public: // Function for debug only - UNSAFE for real operation void DebugOnly_SetState(JFJochState state); - void LoadGainFile(const std::string& filename); + void AddDetectorSetup(const DetectorSetup& setup); + JFJochProtoBuf::DetectorList GetDetectorsList(); + void SelectDetector(int64_t id); }; diff --git a/broker/jfjoch_broker.cpp b/broker/jfjoch_broker.cpp index 2348bedb..c67a775b 100644 --- a/broker/jfjoch_broker.cpp +++ b/broker/jfjoch_broker.cpp @@ -2,7 +2,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include -#include #include #include "../common/Logger.h" @@ -11,6 +10,8 @@ #include "JFJochBroker.h" #include "../grpc/gRPCServer_Template.h" +#include "JFJochBrokerParser.h" + int main (int argc, char **argv) { if (argc > 3) { std::cout << "Usage ./jfjoch_broker { {}}" << std::endl; @@ -33,65 +34,13 @@ int main (int argc, char **argv) { } } - DiffractionExperiment experiment(DetectorGeometry(8, 2, 8, 36)); - experiment.DataStreams(2); - experiment.PedestalG0Frames(2000).PedestalG1Frames(300).PedestalG2Frames(300); + DiffractionExperiment experiment; experiment.MaskChipEdges(true).MaskModuleEdges(true); - - try { - experiment.SourceName(input.at("source_name").get()); - experiment.SourceNameShort(input.at("source_name_short").get()); - } catch (std::exception &e) { - logger.Warning("Source name metadata error: {}", e.what() ); - } - - try { - experiment.InstrumentName(input.at("instrument_name").get()); - experiment.InstrumentNameShort(input.at("instrument_name_short").get()); - } catch (std::exception &e) { - logger.Warning("Instrument name metadata error: {}", e.what() ); - } - - std::random_device generator; - - uint8_t base_ipv4_addr_net = UINT8_MAX; - if (input.contains("ipv4_subnet")) - base_ipv4_addr_net = input["ipv4_subnet"]; - - std::uniform_int_distribution ipv4_subnet_distribution(0,UINT8_MAX-1); - if (base_ipv4_addr_net == UINT8_MAX) - base_ipv4_addr_net = ipv4_subnet_distribution(generator); - experiment.IPv4Subnet("10.1." + std::to_string(base_ipv4_addr_net) + ".0"); - logger.Info("Base IPv4 address for FPGA and detector modules: " - + IPv4AddressToStr(experiment.GetDestIPv4Address(0))); + ParseFacilityConfiguration(input, "cfg", experiment); JFJochBroker broker(experiment); - - if (input.contains("receiver_addr")) - broker.Services().Receiver(input["receiver_addr"]); - - if (input.contains("writer")) { - if (input["writer"].is_array()) { - for (const auto &j: input["writer"]) - broker.Services().Writer(j["addr_grpc"], j["addr_zmq"]); - } else { - broker.Services().Writer(input["writer"]["addr_grpc"], input["writer"]["addr_zmq"]); - } - } - if (input.contains("detector_addr")) - broker.Services().Detector(input["detector_addr"]); - - - if (input.contains("gain_file") && (input["gain_file"].is_array())) { - for (int i = 0; i < input["gain_file"].size(); i++) { - try { - broker.LoadGainFile(input["gain_file"][i].get()); - } catch (const std::exception &e) { - logger.ErrorException(e); - exit(EXIT_FAILURE); - } - } - } + ParseBrokerConfiguration(input, "services", broker); + ParseDetectorSetup(input, "detectors", broker); std::string grpc_addr = "0.0.0.0:" + std::to_string(grpc_port); diff --git a/etc/broker.json b/etc/broker.json index d5d23134..ba1b2b01 100644 --- a/etc/broker.json +++ b/etc/broker.json @@ -1,42 +1,94 @@ { - "ipv4_subnet": 85, - "writer": [ - { - "addr_grpc": "10.10.1.204:5234", - "addr_zmq": "tcp://10.10.1.242:5402" - }, - { - "addr_grpc": "10.10.1.204:5235", - "addr_zmq": "tcp://10.10.1.242:5403" - }, - { - "addr_grpc": "10.10.1.204:5236", - "addr_zmq": "tcp://10.10.1.242:5404" - }, - { - "addr_grpc": "10.10.1.204:5237", - "addr_zmq": "tcp://10.10.1.242:5405" - } - ], - "receiver_addr": "unix:/opt/jfjoch/.jfjoch-fpga-receiver", - "detector_addr": "unix:/opt/jfjoch/.jfjoch-detector", - "frontend_directory": "/opt/jfjoch/frontend", - "indexer": { - "addr_grpc": "mx-jungfrau-1:5405", - "addr_zmq": "tcp://10.10.1.242:5401" + "services": { + "writer": [ + { + "addr_grpc": "10.10.1.204:5234", + "addr_zmq": "tcp://10.10.1.242:5402" + }, + { + "addr_grpc": "10.10.1.204:5235", + "addr_zmq": "tcp://10.10.1.242:5403" + }, + { + "addr_grpc": "10.10.1.204:5236", + "addr_zmq": "tcp://10.10.1.242:5404" + }, + { + "addr_grpc": "10.10.1.204:5237", + "addr_zmq": "tcp://10.10.1.242:5405" + } + ], + "receiver_addr": "unix:/opt/jfjoch/.jfjoch-fpga-receiver", + "detector_addr": "unix:/opt/jfjoch/.jfjoch-detector" }, - "source_name": "Swiss Light Source", - "source_name_short": "SLS", - "instrument_name": "VESPA", - "instrument_name_short": "VESPA", - "gain_file": [ - "/opt/jfjoch/gainmaps/gainMaps_M352_2020-01-31.bin", - "/opt/jfjoch/gainmaps/gainMaps_M307_2020-01-20.bin", - "/opt/jfjoch/gainmaps/gainMaps_M264_2019-07-29.bin", - "/opt/jfjoch/gainmaps/gainMaps_M253_2019-07-29.bin", - "/opt/jfjoch/gainmaps/gainMaps_M351_2020-01-20.bin", - "/opt/jfjoch/gainmaps/gainMaps_M312_2020-01-20.bin", - "/opt/jfjoch/gainmaps/gainMaps_M261_2019-07-29.bin", - "/opt/jfjoch/gainmaps/gainMaps_M310_2021-01-26.bin" + "cfg": { + "source_name": "Swiss Light Source", + "source_name_short": "SLS", + "instrument_name": "X06SA VESPA", + "instrument_name_short": "VESPA", + "datastreams": 2, + "pedestal_g0_frames": 2000, + "pedestal_g1_frames": 300, + "pedestal_g2_frames": 300, + "frame_time_us": "1000 us", + "count_time_us": "980 us", + "indexing_period_us": "5 ms", + "spot_finding_period_us": "5 ms", + "preview_period_us": "1 s", + "ipv4_subnet": "10.10.85.0" + }, + "detectors": [ + { + "standard_geometry": { + "nmodules": 8, + "horizontal_stacking": 2, + "gap_x": 8, + "gap_y": 36, + "mirror_y": true + }, + "description": "PSI JUNGFRAU 4M", + "module_hostname": [ + "10.10.10.10", + "10.10.10.11", + "10.10.10.12", + "10.10.10.13", + "10.10.10.14", + "10.10.10.15", + "10.10.10.16", + "10.10.10.17" + ], + "gain_files": [ + "/opt/jfjoch/gainmaps/gainMaps_M352_2020-01-31.bin", + "/opt/jfjoch/gainmaps/gainMaps_M307_2020-01-20.bin", + "/opt/jfjoch/gainmaps/gainMaps_M264_2019-07-29.bin", + "/opt/jfjoch/gainmaps/gainMaps_M253_2019-07-29.bin", + "/opt/jfjoch/gainmaps/gainMaps_M351_2020-01-20.bin", + "/opt/jfjoch/gainmaps/gainMaps_M312_2020-01-20.bin", + "/opt/jfjoch/gainmaps/gainMaps_M261_2019-07-29.bin", + "/opt/jfjoch/gainmaps/gainMaps_M310_2021-01-26.bin" + ] + }, + { + "standard_geometry": { + "nmodules": 4, + "horizontal_stacking": 2, + "gap_x": 8, + "gap_y": 36, + "mirror_y": true + }, + "description": "PSI JUNGFRAU 4M (2M ROI)", + "module_hostname": [ + "10.10.10.12", + "10.10.10.13", + "10.10.10.14", + "10.10.10.15" + ], + "gain_files": [ + "/opt/jfjoch/gainmaps/gainMaps_M264_2019-07-29.bin", + "/opt/jfjoch/gainmaps/gainMaps_M253_2019-07-29.bin", + "/opt/jfjoch/gainmaps/gainMaps_M351_2020-01-20.bin", + "/opt/jfjoch/gainmaps/gainMaps_M312_2020-01-20.bin" + ] + } ] } diff --git a/grpc/jfjoch.proto b/grpc/jfjoch.proto index 869298b7..fb381a2a 100644 --- a/grpc/jfjoch.proto +++ b/grpc/jfjoch.proto @@ -460,6 +460,19 @@ message BrokerFullStatus { repeated WriterOutput writer = 3; } +message DetectorListElement { + string description = 1; + int64 nmodules = 2; +} + +message DetectorList { + repeated DetectorListElement detector = 1; +} + +message DetectorSelection { + int64 id = 1; +} + service gRPC_JFJochReceiver { rpc Start (ReceiverInput) returns (Empty) {} rpc Abort (Empty) returns (Empty) {} @@ -510,4 +523,7 @@ service gRPC_JFJochBroker { rpc GetPedestalG1 (Empty) returns (Image) {} rpc GetPedestalG2 (Empty) returns (Image) {} rpc GetMask (Empty) returns (Image) {} + + rpc GetDetectorList (Empty) returns (DetectorList) {} + rpc SelectDetector (DetectorSelection) returns (Empty) {} } \ No newline at end of file diff --git a/python/jfjoch_pb2.py b/python/jfjoch_pb2.py index 7d490506..3a7e2a7b 100644 --- a/python/jfjoch_pb2.py +++ b/python/jfjoch_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cjfjoch.proto\x12\x0eJFJochProtoBuf\"\x07\n\x05\x45mpty\"W\n\x08UnitCell\x12\t\n\x01\x61\x18\x01 \x01(\x02\x12\t\n\x01\x62\x18\x02 \x01(\x02\x12\t\n\x01\x63\x18\x03 \x01(\x02\x12\r\n\x05\x61lpha\x18\x04 \x01(\x02\x12\x0c\n\x04\x62\x65ta\x18\x05 \x01(\x02\x12\r\n\x05gamma\x18\x06 \x01(\x02\")\n\x06Vector\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\"|\n\x10RotationSettings\x12\x17\n\x0fstart_angle_deg\x18\x01 \x01(\x02\x12 \n\x18\x61ngle_incr_per_image_deg\x18\x02 \x01(\x02\x12-\n\rrotation_axis\x18\x03 \x01(\x0b\x32\x16.JFJochProtoBuf.Vector\"\x1c\n\x04Plot\x12\t\n\x01x\x18\x01 \x03(\x02\x12\t\n\x01y\x18\x02 \x03(\x02\"\xa5\x04\n\x0f\x44\x61tasetSettings\x12\x1a\n\x12images_per_trigger\x18\x01 \x01(\x03\x12\x10\n\x08ntrigger\x18\x02 \x01(\x03\x12\x13\n\tsummation\x18\x03 \x01(\x03H\x00\x12\x17\n\rimage_time_us\x18\x04 \x01(\x03H\x00\x12\x12\n\nbeam_x_pxl\x18\x05 \x01(\x02\x12\x12\n\nbeam_y_pxl\x18\x06 \x01(\x02\x12\x1c\n\x14\x64\x65tector_distance_mm\x18\x07 \x01(\x02\x12\x19\n\x11photon_energy_keV\x18\x08 \x01(\x02\x12\x13\n\x0b\x66ile_prefix\x18\t \x01(\t\x12\x17\n\x0f\x64\x61ta_file_count\x18\n \x01(\x03\x12\x30\n\x0b\x63ompression\x18\x0b \x01(\x0e\x32\x1b.JFJochProtoBuf.Compression\x12\x13\n\x0bsample_name\x18\x0c \x01(\t\x12\x30\n\tunit_cell\x18\r \x01(\x0b\x32\x18.JFJochProtoBuf.UnitCellH\x01\x88\x01\x01\x12\x1a\n\x12space_group_number\x18\x0e \x01(\x03\x12\x36\n\x11scattering_vector\x18\x0f \x01(\x0b\x32\x16.JFJochProtoBuf.VectorH\x02\x88\x01\x01\x12\x18\n\x10\x61pply_pixel_mask\x18\x10 \x01(\x08\x12\x12\n\nbinning2x2\x18\x11 \x01(\x08\x42\x08\n\x06timingB\x0c\n\n_unit_cellB\x14\n\x12_scattering_vector\"\xf6\x02\n\x10\x44\x65tectorSettings\x12\x15\n\rframe_time_us\x18\x01 \x01(\x03\x12\x1a\n\rcount_time_us\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12\x19\n\x11use_storage_cells\x18\x03 \x01(\x08\x12%\n\x1duse_internal_packet_generator\x18\x04 \x01(\x08\x12\x18\n\x10\x63ollect_raw_data\x18\x05 \x01(\x08\x12\x1f\n\x12pedestal_g0_frames\x18\x06 \x01(\x03H\x01\x88\x01\x01\x12\x1f\n\x12pedestal_g1_frames\x18\x07 \x01(\x03H\x02\x88\x01\x01\x12\x1f\n\x12pedestal_g2_frames\x18\x08 \x01(\x03H\x03\x88\x01\x01\x12\x19\n\x11\x63onversion_on_cpu\x18\t \x01(\x08\x42\x10\n\x0e_count_time_usB\x15\n\x13_pedestal_g0_framesB\x15\n\x13_pedestal_g1_framesB\x15\n\x13_pedestal_g2_frames\"b\n\x16\x44\x65tectorModuleGeometry\x12\x0e\n\x06pixel0\x18\x01 \x01(\x03\x12\x1b\n\x13\x66\x61st_direction_step\x18\x02 \x01(\x03\x12\x1b\n\x13slow_direction_step\x18\x03 \x01(\x03\"z\n\x10\x44\x65tectorGeometry\x12\x11\n\twidth_pxl\x18\x01 \x01(\x03\x12\x12\n\nheight_pxl\x18\x02 \x01(\x03\x12?\n\x0fmodule_geometry\x18\x03 \x03(\x0b\x32&.JFJochProtoBuf.DetectorModuleGeometry\"\xc1\x01\n\x08\x44\x65tector\x12\x10\n\x08nmodules\x18\x01 \x01(\x03\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x15\n\rpixel_size_mm\x18\x03 \x01(\x02\x12\x17\n\x0fmodule_hostname\x18\x04 \x03(\t\x12\x32\n\x08geometry\x18\x05 \x01(\x0b\x32 .JFJochProtoBuf.DetectorGeometry\x12*\n\x04type\x18\x06 \x01(\x0e\x32\x1c.JFJochProtoBuf.DetectorType\"\x91\x06\n\x10InternalSettings\x12\"\n\x1a\x66rame_time_pedestalG1G2_us\x18\x01 \x01(\x03\x12\x15\n\rframe_time_us\x18\x03 \x01(\x03\x12\x15\n\rcount_time_us\x18\x04 \x01(\x03\x12*\n\x08\x64\x65tector\x18\x05 \x01(\x0b\x32\x18.JFJochProtoBuf.Detector\x12\x14\n\x0cndatastreams\x18\x06 \x01(\x03\x12&\n\x1einternal_fpga_packet_generator\x18\t \x01(\x08\x12\x15\n\rstorage_cells\x18\n \x01(\x03\x12\x1a\n\x12storage_cell_start\x18\x0b \x01(\x03\x12\x1a\n\x12pedestal_g0_frames\x18\x0c \x01(\x03\x12\x1a\n\x12pedestal_g1_frames\x18\r \x01(\x03\x12\x1a\n\x12pedestal_g2_frames\x18\x0e \x01(\x03\x12\x19\n\x11preview_period_us\x18\x0f \x01(\x03\x12\x1e\n\x16spot_finding_period_us\x18\x10 \x01(\x03\x12\x1a\n\x12indexing_period_us\x18\x11 \x01(\x03\x12*\n\x04mode\x18\x13 \x01(\x0e\x32\x1c.JFJochProtoBuf.DetectorMode\x12\x19\n\x11mask_module_edges\x18\x14 \x01(\x08\x12\x17\n\x0fmask_chip_edges\x18\x15 \x01(\x08\x12\x13\n\x0bipv4_subnet\x18\x16 \x01(\x03\x12\x15\n\rbase_udp_port\x18\x17 \x01(\x03\x12\r\n\x05low_q\x18\x1a \x01(\x02\x12\x0e\n\x06high_q\x18\x1b \x01(\x02\x12\x11\n\tq_spacing\x18\x1c \x01(\x02\x12\x10\n\x08git_sha1\x18\x1d \x01(\t\x12\x10\n\x08git_date\x18\x1e \x01(\t\x12\x19\n\x11\x63onversion_on_cpu\x18\x1f \x01(\x08\x12\x13\n\x0bsource_name\x18 \x01(\t\x12\x19\n\x11source_name_short\x18! \x01(\t\x12\x17\n\x0finstrument_name\x18\" \x01(\t\x12\x1d\n\x15instrument_name_short\x18# \x01(\t\"|\n\x14JungfraujochSettings\x12\x30\n\x07\x64\x61taset\x18\x01 \x01(\x0b\x32\x1f.JFJochProtoBuf.DatasetSettings\x12\x32\n\x08internal\x18\x02 \x01(\x0b\x32 .JFJochProtoBuf.InternalSettings\"\x1e\n\nJFPedestal\x12\x10\n\x08pedestal\x18\x01 \x01(\x0c\"-\n\x11JFGainCalibration\x12\x18\n\x10gain_calibration\x18\x01 \x01(\x0c\"\xb2\x01\n\rJFCalibration\x12\x10\n\x08nmodules\x18\x01 \x01(\x04\x12\x16\n\x0enstorage_cells\x18\x02 \x01(\x04\x12,\n\x08pedestal\x18\x03 \x03(\x0b\x32\x1a.JFJochProtoBuf.JFPedestal\x12\x0c\n\x04mask\x18\x04 \x01(\x0c\x12;\n\x10gain_calibration\x18\x05 \x03(\x0b\x32!.JFJochProtoBuf.JFGainCalibration\"V\n\x17JFCalibrationStatistics\x12;\n\x11module_statistics\x18\x01 \x03(\x0b\x32 .JFJochProtoBuf.ModuleStatistics\"\xe1\x03\n\x1b\x41\x63quisitionDeviceStatistics\x12\x14\n\x0cgood_packets\x18\x01 \x01(\x04\x12-\n%packets_expected_per_module_and_frame\x18\x02 \x01(\x04\x12-\n%packets_received_per_module_and_frame\x18\x03 \x03(\x04\x12\x12\n\nefficiency\x18\x04 \x01(\x02\x12\x16\n\x0e\x62ytes_received\x18\x05 \x01(\x04\x12\x17\n\x0fstart_timestamp\x18\x06 \x01(\x04\x12\x15\n\rend_timestamp\x18\x07 \x01(\x04\x12/\n\x0b\x66pga_status\x18\x08 \x01(\x0b\x32\x1a.JFJochProtoBuf.FPGAStatus\x12\x10\n\x08nmodules\x18\t \x01(\x04\x12\x13\n\x0bpacket_mask\x18\n \x03(\x04\x12\x1f\n\x17mask_entries_per_module\x18\x0b \x01(\x04\x12\x18\n\x10packets_expected\x18\x0c \x01(\x04\x12\x11\n\ttimestamp\x18\r \x03(\r\x12\x16\n\x0e\x64\x65tector_debug\x18\x0e \x03(\r\x12\x0f\n\x07\x62unchid\x18\x0f \x03(\x04\x12#\n\x1bpackets_received_per_module\x18\x10 \x03(\x04\"\x88\x01\n\rReceiverInput\x12\x43\n\x15jungfraujoch_settings\x18\x01 \x01(\x0b\x32$.JFJochProtoBuf.JungfraujochSettings\x12\x32\n\x0b\x63\x61libration\x18\x02 \x01(\x0b\x32\x1d.JFJochProtoBuf.JFCalibration\"\xaa\x03\n\x0eReceiverOutput\x12\x46\n\x11\x64\x65vice_statistics\x18\x01 \x03(\x0b\x32+.JFJochProtoBuf.AcquisitionDeviceStatistics\x12\x19\n\x11max_receive_delay\x18\x02 \x01(\x04\x12\x17\n\x0f\x63ompressed_size\x18\x03 \x01(\x04\x12\x18\n\x10\x63ompressed_ratio\x18\x04 \x01(\x02\x12\x13\n\x0bimages_sent\x18\x05 \x01(\x04\x12\x15\n\rstart_time_ms\x18\x06 \x01(\x04\x12\x13\n\x0b\x65nd_time_ms\x18\x07 \x01(\x04\x12\x12\n\nefficiency\x18\x08 \x01(\x02\x12\x1d\n\x15max_image_number_sent\x18\t \x01(\x04\x12\x11\n\tcancelled\x18\n \x01(\x08\x12\x18\n\x10master_file_name\x18\x0b \x01(\t\x12\x33\n\x0fpedestal_result\x18\x0c \x03(\x0b\x32\x1a.JFJochProtoBuf.JFPedestal\x12\x1a\n\rindexing_rate\x18\r \x01(\x02H\x00\x88\x01\x01\x42\x10\n\x0e_indexing_rate\".\n\x15ReceiverNetworkConfig\x12\x15\n\rfpga_mac_addr\x18\x01 \x03(\t\"\x93\x01\n\x0eReceiverStatus\x12\x15\n\x08progress\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12/\n\x0b\x66pga_status\x18\x02 \x03(\x0b\x32\x1a.JFJochProtoBuf.FPGAStatus\x12\x1a\n\rindexing_rate\x18\x03 \x01(\x02H\x01\x88\x01\x01\x42\x0b\n\t_progressB\x10\n\x0e_indexing_rate\"\xd2\x01\n\x1bReceiverDataProcessingPlots\x12*\n\x0c\x62kg_estimate\x18\x01 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\x12\x30\n\x12radial_int_profile\x18\x02 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\x12(\n\nspot_count\x18\x03 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\x12+\n\rindexing_rate\x18\x04 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\">\n\x0bWriterInput\x12\x1c\n\x14zmq_receiver_address\x18\x01 \x01(\t\x12\x11\n\tseries_id\x18\x02 \x01(\x03\"P\n\x0cWriterOutput\x12\x0f\n\x07nimages\x18\x01 \x01(\x03\x12\x17\n\x0fperformance_MBs\x18\x02 \x01(\x02\x12\x16\n\x0eperformance_Hz\x18\x03 \x01(\x02\"\xe0\x01\n\x14\x44\x65tectorModuleConfig\x12\x17\n\x0fudp_dest_port_1\x18\x01 \x01(\x04\x12\x17\n\x0fudp_dest_port_2\x18\x02 \x01(\x04\x12\x17\n\x0fipv4_src_addr_1\x18\x03 \x01(\t\x12\x17\n\x0fipv4_src_addr_2\x18\x04 \x01(\t\x12\x18\n\x10ipv4_dest_addr_1\x18\x05 \x01(\t\x12\x18\n\x10ipv4_dest_addr_2\x18\x06 \x01(\t\x12\x17\n\x0fmac_addr_dest_1\x18\x07 \x01(\t\x12\x17\n\x0fmac_addr_dest_2\x18\x08 \x01(\t\"`\n\x0e\x44\x65tectorConfig\x12\x35\n\x07modules\x18\x01 \x03(\x0b\x32$.JFJochProtoBuf.DetectorModuleConfig\x12\x17\n\x0fmodule_hostname\x18\x02 \x03(\t\"\xf9\x01\n\rDetectorInput\x12\x13\n\x0bmodules_num\x18\x01 \x01(\x03\x12*\n\x04mode\x18\x02 \x01(\x0e\x32\x1c.JFJochProtoBuf.DetectorMode\x12\x12\n\nnum_frames\x18\x03 \x01(\x03\x12\x14\n\x0cnum_triggers\x18\x04 \x01(\x03\x12\x1b\n\x13storage_cell_number\x18\x05 \x01(\x03\x12\x1a\n\x12storage_cell_start\x18\x06 \x01(\x03\x12\x1a\n\x12storage_cell_delay\x18\x07 \x01(\x03\x12\x11\n\tperiod_us\x18\t \x01(\x03\x12\x15\n\rcount_time_us\x18\n \x01(\x03\"\x10\n\x0e\x44\x65tectorOutput\"b\n\x0e\x44\x65tectorStatus\x12$\n\x05state\x18\x01 \x01(\x0e\x32\x15.JFJochProtoBuf.State\x12\x12\n\nfw_version\x18\x02 \x01(\x03\x12\x16\n\x0eserver_version\x18\x03 \x01(\t\"\xae\x08\n\nFPGAStatus\x12\x15\n\rpackets_ether\x18\x02 \x01(\x04\x12\x13\n\x0bpackets_udp\x18\x03 \x01(\x04\x12\x16\n\x0epackets_jfjoch\x18\x04 \x01(\x04\x12\x14\n\x0cpackets_icmp\x18\x05 \x01(\x04\x12\x11\n\tfpga_idle\x18\x06 \x01(\x08\x12\x17\n\x0fhbm_temp_0_degC\x18\x07 \x01(\x04\x12\x17\n\x0fhbm_temp_1_degC\x18\x08 \x01(\x04\x12\x12\n\nstalls_hbm\x18\t \x01(\x04\x12\x13\n\x0bstalls_host\x18\n \x01(\x04\x12\x1b\n\x13\x65thernet_rx_aligned\x18\x0b \x01(\x08\x12\x1c\n\x14\x66ull_status_register\x18\r \x01(\r\x12?\n\x0b\x66ifo_status\x18\x0e \x03(\x0b\x32*.JFJochProtoBuf.FPGAStatus.FifoStatusEntry\x12\x13\n\x0bmax_modules\x18\x0f \x01(\x04\x12\x10\n\x08git_sha1\x18\x10 \x01(\r\x12\x17\n\x0fmailbox_err_reg\x18\x11 \x01(\r\x12\x1a\n\x12mailbox_status_reg\x18\x12 \x01(\r\x12\x1c\n\x14\x64\x61tamover_mm2s_error\x18\x13 \x01(\x08\x12\x1c\n\x14\x64\x61tamover_s2mm_error\x18\x14 \x01(\x08\x12&\n\x1e\x66rame_statistics_alignment_err\x18\x15 \x01(\x08\x12\"\n\x1a\x66rame_statistics_tlast_err\x18\x16 \x01(\x08\x12%\n\x1d\x66rame_statistics_work_req_err\x18\x17 \x01(\x08\x12\x14\n\x0cslowest_head\x18\x18 \x01(\x04\x12\x16\n\x0e\x66pga_temp_degC\x18\x1a \x01(\x02\x12\x1a\n\x12\x63urrent_edge_12V_A\x18\x1b \x01(\x02\x12\x1a\n\x12voltage_edge_12V_V\x18\x1c \x01(\x02\x12\x1b\n\x13\x63urrent_edge_3p3V_A\x18\x1d \x01(\x02\x12\x1b\n\x13voltage_edge_3p3V_V\x18\x1e \x01(\x02\x12\x1c\n\x14pcie_h2c_descriptors\x18\x1f \x01(\x04\x12\x1c\n\x14pcie_c2h_descriptors\x18 \x01(\x04\x12\x16\n\x0epcie_h2c_beats\x18! \x01(\x04\x12\x16\n\x0epcie_c2h_beats\x18\" \x01(\x04\x12\x17\n\x0fpcie_h2c_status\x18# \x01(\x04\x12\x17\n\x0fpcie_c2h_status\x18$ \x01(\x04\x12\x13\n\x0bpackets_sls\x18% \x01(\x04\x12\x11\n\terror_eth\x18& \x01(\r\x12\x18\n\x10\x65rror_packet_len\x18\' \x01(\r\x1aQ\n\x0f\x46ifoStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12-\n\x05value\x18\x02 \x01(\x0e\x32\x1e.JFJochProtoBuf.FPGAFIFOStatus:\x02\x38\x01\"I\n\x1aIndexerDataProcessingPlots\x12+\n\rindexing_rate\x18\x01 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\"\x8a\x03\n\x16\x44\x61taProcessingSettings\x12!\n\x19signal_to_noise_threshold\x18\x01 \x01(\x02\x12\x1e\n\x16photon_count_threshold\x18\x02 \x01(\x03\x12\x18\n\x10min_pix_per_spot\x18\x03 \x01(\x03\x12\x18\n\x10max_pix_per_spot\x18\x04 \x01(\x03\x12\x16\n\x0elocal_bkg_size\x18\x05 \x01(\x03\x12\"\n\x15high_resolution_limit\x18\x06 \x01(\x02H\x00\x88\x01\x01\x12!\n\x14low_resolution_limit\x18\x07 \x01(\x02H\x01\x88\x01\x01\x12\x1a\n\x12\x62kg_estimate_low_q\x18\x08 \x01(\x02\x12\x1b\n\x13\x62kg_estimate_high_q\x18\t \x01(\x02\x12\x1b\n\x0eresult_binning\x18\n \x01(\x03H\x02\x88\x01\x01\x42\x18\n\x16_high_resolution_limitB\x17\n\x15_low_resolution_limitB\x11\n\x0f_result_binning\"\x8d\x02\n\x0cPreviewFrame\x12\x14\n\x0cimage_number\x18\x01 \x01(\x03\x12\x14\n\x0ctotal_images\x18\x02 \x01(\x03\x12\x14\n\x0cwavelength_A\x18\x03 \x01(\x02\x12\x12\n\nbeam_x_pxl\x18\x04 \x01(\x02\x12\x12\n\nbeam_y_pxl\x18\x05 \x01(\x02\x12\x1c\n\x14\x64\x65tector_distance_mm\x18\x06 \x01(\x02\x12\x18\n\x10saturation_value\x18\x07 \x01(\x03\x12\x13\n\x0b\x66ile_prefix\x18\x08 \x01(\t\x12\r\n\x05width\x18\t \x01(\x03\x12\x0e\n\x06height\x18\n \x01(\x03\x12\x13\n\x0bpixel_depth\x18\x0b \x01(\x03\x12\x0c\n\x04\x64\x61ta\x18\r \x01(\x0cJ\x04\x08\x0c\x10\r\"\xed\x01\n\x10ModuleStatistics\x12\x15\n\rmodule_number\x18\x01 \x01(\x03\x12\x1b\n\x13storage_cell_number\x18\x02 \x01(\x03\x12\x18\n\x10pedestal_g0_mean\x18\x03 \x01(\x02\x12\x18\n\x10pedestal_g1_mean\x18\x04 \x01(\x02\x12\x18\n\x10pedestal_g2_mean\x18\x05 \x01(\x02\x12\x14\n\x0cgain_g0_mean\x18\x06 \x01(\x02\x12\x14\n\x0cgain_g1_mean\x18\x07 \x01(\x02\x12\x14\n\x0cgain_g2_mean\x18\x08 \x01(\x02\x12\x15\n\rmasked_pixels\x18\t \x01(\x04\"I\n\x05Image\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\r\n\x05width\x18\x02 \x01(\x03\x12\x0e\n\x06height\x18\x03 \x01(\x03\x12\x13\n\x0bpixel_depth\x18\x04 \x01(\x03\".\n\nMaskToLoad\x12\x0c\n\x04mask\x18\x01 \x03(\r\x12\x12\n\nbit_to_set\x18\x02 \x01(\x05\"\xfc\x03\n\x15MeasurementStatistics\x12\x13\n\x0b\x66ile_prefix\x18\x01 \x01(\t\x12\x18\n\x10images_collected\x18\x02 \x01(\x03\x12\x1d\n\x15max_image_number_sent\x18\x03 \x01(\x03\x12\x1d\n\x15\x63ollection_efficiency\x18\x04 \x01(\x02\x12\x19\n\x11\x63ompression_ratio\x18\x05 \x01(\x02\x12\x11\n\tcancelled\x18\x06 \x01(\x08\x12\x19\n\x11max_receive_delay\x18\x07 \x01(\x03\x12#\n\x16writer_performance_MBs\x18\x08 \x01(\x02H\x00\x88\x01\x01\x12\x1b\n\x0eimages_written\x18\t \x01(\x03H\x01\x88\x01\x01\x12\x1a\n\rindexing_rate\x18\n \x01(\x02H\x02\x88\x01\x01\x12$\n\x17indexing_performance_ms\x18\x0b \x01(\x02H\x03\x88\x01\x01\x12\x16\n\x0e\x64\x65tector_width\x18\x0c \x01(\x03\x12\x17\n\x0f\x64\x65tector_height\x18\r \x01(\x03\x12\x1c\n\x14\x64\x65tector_pixel_depth\x18\x0e \x01(\x03\x42\x19\n\x17_writer_performance_MBsB\x11\n\x0f_images_writtenB\x10\n\x0e_indexing_rateB\x1a\n\x18_indexing_performance_ms\"\x8d\x01\n\x0c\x42rokerStatus\x12+\n\x0c\x62roker_state\x18\x01 \x01(\x0e\x32\x15.JFJochProtoBuf.State\x12\x15\n\x08progress\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12\x1a\n\rindexing_rate\x18\x03 \x01(\x02H\x01\x88\x01\x01\x42\x0b\n\t_progressB\x10\n\x0e_indexing_rate\"\xa4\x01\n\x10\x42rokerFullStatus\x12\x30\n\x08receiver\x18\x01 \x01(\x0b\x32\x1e.JFJochProtoBuf.ReceiverOutput\x12\x30\n\x08\x64\x65tector\x18\x02 \x01(\x0b\x32\x1e.JFJochProtoBuf.DetectorOutput\x12,\n\x06writer\x18\x03 \x03(\x0b\x32\x1c.JFJochProtoBuf.WriterOutput*T\n\x0b\x43ompression\x12\r\n\tBSHUF_LZ4\x10\x00\x12\x0e\n\nBSHUF_ZSTD\x10\x01\x12\x12\n\x0e\x42SHUF_ZSTD_RLE\x10\x02\x12\x12\n\x0eNO_COMPRESSION\x10\x03*\'\n\x0c\x44\x65tectorType\x12\x0c\n\x08JUNGFRAU\x10\x00\x12\t\n\x05\x45IGER\x10\x01*Z\n\x0c\x44\x65tectorMode\x12\x0e\n\nCONVERSION\x10\x00\x12\x07\n\x03RAW\x10\x01\x12\x0f\n\x0bPEDESTAL_G0\x10\x02\x12\x0f\n\x0bPEDESTAL_G1\x10\x03\x12\x0f\n\x0bPEDESTAL_G2\x10\x04*2\n\x0e\x46PGAFIFOStatus\x12\t\n\x05\x45MPTY\x10\x00\x12\x08\n\x04\x46ULL\x10\x01\x12\x0b\n\x07PARTIAL\x10\x02*^\n\x05State\x12\x13\n\x0fNOT_INITIALIZED\x10\x00\x12\x08\n\x04IDLE\x10\x01\x12\x08\n\x04\x42USY\x10\x02\x12\x0c\n\x08PEDESTAL\x10\x03\x12\x13\n\x0f\x44\x41TA_COLLECTION\x10\x04\x12\t\n\x05\x45RROR\x10\x05\x32\xac\x05\n\x13gRPC_JFJochReceiver\x12?\n\x05Start\x12\x1d.JFJochProtoBuf.ReceiverInput\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x37\n\x05\x41\x62ort\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x38\n\x06\x43\x61ncel\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12?\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x1e.JFJochProtoBuf.ReceiverOutput\"\x00\x12\x44\n\tGetStatus\x12\x15.JFJochProtoBuf.Empty\x1a\x1e.JFJochProtoBuf.ReceiverStatus\"\x00\x12\\\n\x19SetDataProcessingSettings\x12&.JFJochProtoBuf.DataProcessingSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12^\n\x16GetDataProcessingPlots\x12\x15.JFJochProtoBuf.Empty\x1a+.JFJochProtoBuf.ReceiverDataProcessingPlots\"\x00\x12H\n\x0fGetPreviewFrame\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.PreviewFrame\"\x00\x12R\n\x10GetNetworkConfig\x12\x15.JFJochProtoBuf.Empty\x1a%.JFJochProtoBuf.ReceiverNetworkConfig\"\x00\x32\xca\x01\n\x11gRPC_JFJochWriter\x12=\n\x05Start\x12\x1b.JFJochProtoBuf.WriterInput\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x37\n\x05\x41\x62ort\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12=\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.WriterOutput\"\x00\x32\x82\x03\n\x13gRPC_JFJochDetector\x12?\n\x05Start\x12\x1d.JFJochProtoBuf.DetectorInput\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x36\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x41\n\x06Status\x12\x15.JFJochProtoBuf.Empty\x1a\x1e.JFJochProtoBuf.DetectorStatus\"\x00\x12=\n\x02On\x12\x1e.JFJochProtoBuf.DetectorConfig\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x35\n\x03Off\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x39\n\x07Trigger\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x32\xae\x0b\n\x11gRPC_JFJochBroker\x12\x41\n\x05Start\x12\x1f.JFJochProtoBuf.DatasetSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x36\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12:\n\x08Pedestal\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12<\n\nInitialize\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x38\n\x06\x43\x61ncel\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12<\n\nDeactivate\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x39\n\x07Trigger\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x42\n\tGetStatus\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.BrokerStatus\"\x00\x12\\\n\x18GetCalibrationStatistics\x12\x15.JFJochProtoBuf.Empty\x1a\'.JFJochProtoBuf.JFCalibrationStatistics\"\x00\x12P\n\x13GetDetectorSettings\x12\x15.JFJochProtoBuf.Empty\x1a .JFJochProtoBuf.DetectorSettings\"\x00\x12P\n\x13PutDetectorSettings\x12 .JFJochProtoBuf.DetectorSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12Z\n\x18GetMeasurementStatistics\x12\x15.JFJochProtoBuf.Empty\x1a%.JFJochProtoBuf.MeasurementStatistics\"\x00\x12\\\n\x19GetDataProcessingSettings\x12\x15.JFJochProtoBuf.Empty\x1a&.JFJochProtoBuf.DataProcessingSettings\"\x00\x12\\\n\x19PutDataProcessingSettings\x12&.JFJochProtoBuf.DataProcessingSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12P\n\x08GetPlots\x12\x15.JFJochProtoBuf.Empty\x1a+.JFJochProtoBuf.ReceiverDataProcessingPlots\"\x00\x12\x43\n\nGetPreview\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.PreviewFrame\"\x00\x12?\n\rGetPedestalG0\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x12?\n\rGetPedestalG1\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x12?\n\rGetPedestalG2\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x12\x39\n\x07GetMask\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cjfjoch.proto\x12\x0eJFJochProtoBuf\"\x07\n\x05\x45mpty\"W\n\x08UnitCell\x12\t\n\x01\x61\x18\x01 \x01(\x02\x12\t\n\x01\x62\x18\x02 \x01(\x02\x12\t\n\x01\x63\x18\x03 \x01(\x02\x12\r\n\x05\x61lpha\x18\x04 \x01(\x02\x12\x0c\n\x04\x62\x65ta\x18\x05 \x01(\x02\x12\r\n\x05gamma\x18\x06 \x01(\x02\")\n\x06Vector\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\"|\n\x10RotationSettings\x12\x17\n\x0fstart_angle_deg\x18\x01 \x01(\x02\x12 \n\x18\x61ngle_incr_per_image_deg\x18\x02 \x01(\x02\x12-\n\rrotation_axis\x18\x03 \x01(\x0b\x32\x16.JFJochProtoBuf.Vector\"\x1c\n\x04Plot\x12\t\n\x01x\x18\x01 \x03(\x02\x12\t\n\x01y\x18\x02 \x03(\x02\"\xa5\x04\n\x0f\x44\x61tasetSettings\x12\x1a\n\x12images_per_trigger\x18\x01 \x01(\x03\x12\x10\n\x08ntrigger\x18\x02 \x01(\x03\x12\x13\n\tsummation\x18\x03 \x01(\x03H\x00\x12\x17\n\rimage_time_us\x18\x04 \x01(\x03H\x00\x12\x12\n\nbeam_x_pxl\x18\x05 \x01(\x02\x12\x12\n\nbeam_y_pxl\x18\x06 \x01(\x02\x12\x1c\n\x14\x64\x65tector_distance_mm\x18\x07 \x01(\x02\x12\x19\n\x11photon_energy_keV\x18\x08 \x01(\x02\x12\x13\n\x0b\x66ile_prefix\x18\t \x01(\t\x12\x17\n\x0f\x64\x61ta_file_count\x18\n \x01(\x03\x12\x30\n\x0b\x63ompression\x18\x0b \x01(\x0e\x32\x1b.JFJochProtoBuf.Compression\x12\x13\n\x0bsample_name\x18\x0c \x01(\t\x12\x30\n\tunit_cell\x18\r \x01(\x0b\x32\x18.JFJochProtoBuf.UnitCellH\x01\x88\x01\x01\x12\x1a\n\x12space_group_number\x18\x0e \x01(\x03\x12\x36\n\x11scattering_vector\x18\x0f \x01(\x0b\x32\x16.JFJochProtoBuf.VectorH\x02\x88\x01\x01\x12\x18\n\x10\x61pply_pixel_mask\x18\x10 \x01(\x08\x12\x12\n\nbinning2x2\x18\x11 \x01(\x08\x42\x08\n\x06timingB\x0c\n\n_unit_cellB\x14\n\x12_scattering_vector\"\xf6\x02\n\x10\x44\x65tectorSettings\x12\x15\n\rframe_time_us\x18\x01 \x01(\x03\x12\x1a\n\rcount_time_us\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12\x19\n\x11use_storage_cells\x18\x03 \x01(\x08\x12%\n\x1duse_internal_packet_generator\x18\x04 \x01(\x08\x12\x18\n\x10\x63ollect_raw_data\x18\x05 \x01(\x08\x12\x1f\n\x12pedestal_g0_frames\x18\x06 \x01(\x03H\x01\x88\x01\x01\x12\x1f\n\x12pedestal_g1_frames\x18\x07 \x01(\x03H\x02\x88\x01\x01\x12\x1f\n\x12pedestal_g2_frames\x18\x08 \x01(\x03H\x03\x88\x01\x01\x12\x19\n\x11\x63onversion_on_cpu\x18\t \x01(\x08\x42\x10\n\x0e_count_time_usB\x15\n\x13_pedestal_g0_framesB\x15\n\x13_pedestal_g1_framesB\x15\n\x13_pedestal_g2_frames\"b\n\x16\x44\x65tectorModuleGeometry\x12\x0e\n\x06pixel0\x18\x01 \x01(\x03\x12\x1b\n\x13\x66\x61st_direction_step\x18\x02 \x01(\x03\x12\x1b\n\x13slow_direction_step\x18\x03 \x01(\x03\"z\n\x10\x44\x65tectorGeometry\x12\x11\n\twidth_pxl\x18\x01 \x01(\x03\x12\x12\n\nheight_pxl\x18\x02 \x01(\x03\x12?\n\x0fmodule_geometry\x18\x03 \x03(\x0b\x32&.JFJochProtoBuf.DetectorModuleGeometry\"\xc1\x01\n\x08\x44\x65tector\x12\x10\n\x08nmodules\x18\x01 \x01(\x03\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x15\n\rpixel_size_mm\x18\x03 \x01(\x02\x12\x17\n\x0fmodule_hostname\x18\x04 \x03(\t\x12\x32\n\x08geometry\x18\x05 \x01(\x0b\x32 .JFJochProtoBuf.DetectorGeometry\x12*\n\x04type\x18\x06 \x01(\x0e\x32\x1c.JFJochProtoBuf.DetectorType\"\x91\x06\n\x10InternalSettings\x12\"\n\x1a\x66rame_time_pedestalG1G2_us\x18\x01 \x01(\x03\x12\x15\n\rframe_time_us\x18\x03 \x01(\x03\x12\x15\n\rcount_time_us\x18\x04 \x01(\x03\x12*\n\x08\x64\x65tector\x18\x05 \x01(\x0b\x32\x18.JFJochProtoBuf.Detector\x12\x14\n\x0cndatastreams\x18\x06 \x01(\x03\x12&\n\x1einternal_fpga_packet_generator\x18\t \x01(\x08\x12\x15\n\rstorage_cells\x18\n \x01(\x03\x12\x1a\n\x12storage_cell_start\x18\x0b \x01(\x03\x12\x1a\n\x12pedestal_g0_frames\x18\x0c \x01(\x03\x12\x1a\n\x12pedestal_g1_frames\x18\r \x01(\x03\x12\x1a\n\x12pedestal_g2_frames\x18\x0e \x01(\x03\x12\x19\n\x11preview_period_us\x18\x0f \x01(\x03\x12\x1e\n\x16spot_finding_period_us\x18\x10 \x01(\x03\x12\x1a\n\x12indexing_period_us\x18\x11 \x01(\x03\x12*\n\x04mode\x18\x13 \x01(\x0e\x32\x1c.JFJochProtoBuf.DetectorMode\x12\x19\n\x11mask_module_edges\x18\x14 \x01(\x08\x12\x17\n\x0fmask_chip_edges\x18\x15 \x01(\x08\x12\x13\n\x0bipv4_subnet\x18\x16 \x01(\x03\x12\x15\n\rbase_udp_port\x18\x17 \x01(\x03\x12\r\n\x05low_q\x18\x1a \x01(\x02\x12\x0e\n\x06high_q\x18\x1b \x01(\x02\x12\x11\n\tq_spacing\x18\x1c \x01(\x02\x12\x10\n\x08git_sha1\x18\x1d \x01(\t\x12\x10\n\x08git_date\x18\x1e \x01(\t\x12\x19\n\x11\x63onversion_on_cpu\x18\x1f \x01(\x08\x12\x13\n\x0bsource_name\x18 \x01(\t\x12\x19\n\x11source_name_short\x18! \x01(\t\x12\x17\n\x0finstrument_name\x18\" \x01(\t\x12\x1d\n\x15instrument_name_short\x18# \x01(\t\"|\n\x14JungfraujochSettings\x12\x30\n\x07\x64\x61taset\x18\x01 \x01(\x0b\x32\x1f.JFJochProtoBuf.DatasetSettings\x12\x32\n\x08internal\x18\x02 \x01(\x0b\x32 .JFJochProtoBuf.InternalSettings\"\x1e\n\nJFPedestal\x12\x10\n\x08pedestal\x18\x01 \x01(\x0c\"-\n\x11JFGainCalibration\x12\x18\n\x10gain_calibration\x18\x01 \x01(\x0c\"\xb2\x01\n\rJFCalibration\x12\x10\n\x08nmodules\x18\x01 \x01(\x04\x12\x16\n\x0enstorage_cells\x18\x02 \x01(\x04\x12,\n\x08pedestal\x18\x03 \x03(\x0b\x32\x1a.JFJochProtoBuf.JFPedestal\x12\x0c\n\x04mask\x18\x04 \x01(\x0c\x12;\n\x10gain_calibration\x18\x05 \x03(\x0b\x32!.JFJochProtoBuf.JFGainCalibration\"V\n\x17JFCalibrationStatistics\x12;\n\x11module_statistics\x18\x01 \x03(\x0b\x32 .JFJochProtoBuf.ModuleStatistics\"\xe1\x03\n\x1b\x41\x63quisitionDeviceStatistics\x12\x14\n\x0cgood_packets\x18\x01 \x01(\x04\x12-\n%packets_expected_per_module_and_frame\x18\x02 \x01(\x04\x12-\n%packets_received_per_module_and_frame\x18\x03 \x03(\x04\x12\x12\n\nefficiency\x18\x04 \x01(\x02\x12\x16\n\x0e\x62ytes_received\x18\x05 \x01(\x04\x12\x17\n\x0fstart_timestamp\x18\x06 \x01(\x04\x12\x15\n\rend_timestamp\x18\x07 \x01(\x04\x12/\n\x0b\x66pga_status\x18\x08 \x01(\x0b\x32\x1a.JFJochProtoBuf.FPGAStatus\x12\x10\n\x08nmodules\x18\t \x01(\x04\x12\x13\n\x0bpacket_mask\x18\n \x03(\x04\x12\x1f\n\x17mask_entries_per_module\x18\x0b \x01(\x04\x12\x18\n\x10packets_expected\x18\x0c \x01(\x04\x12\x11\n\ttimestamp\x18\r \x03(\r\x12\x16\n\x0e\x64\x65tector_debug\x18\x0e \x03(\r\x12\x0f\n\x07\x62unchid\x18\x0f \x03(\x04\x12#\n\x1bpackets_received_per_module\x18\x10 \x03(\x04\"\x88\x01\n\rReceiverInput\x12\x43\n\x15jungfraujoch_settings\x18\x01 \x01(\x0b\x32$.JFJochProtoBuf.JungfraujochSettings\x12\x32\n\x0b\x63\x61libration\x18\x02 \x01(\x0b\x32\x1d.JFJochProtoBuf.JFCalibration\"\xaa\x03\n\x0eReceiverOutput\x12\x46\n\x11\x64\x65vice_statistics\x18\x01 \x03(\x0b\x32+.JFJochProtoBuf.AcquisitionDeviceStatistics\x12\x19\n\x11max_receive_delay\x18\x02 \x01(\x04\x12\x17\n\x0f\x63ompressed_size\x18\x03 \x01(\x04\x12\x18\n\x10\x63ompressed_ratio\x18\x04 \x01(\x02\x12\x13\n\x0bimages_sent\x18\x05 \x01(\x04\x12\x15\n\rstart_time_ms\x18\x06 \x01(\x04\x12\x13\n\x0b\x65nd_time_ms\x18\x07 \x01(\x04\x12\x12\n\nefficiency\x18\x08 \x01(\x02\x12\x1d\n\x15max_image_number_sent\x18\t \x01(\x04\x12\x11\n\tcancelled\x18\n \x01(\x08\x12\x18\n\x10master_file_name\x18\x0b \x01(\t\x12\x33\n\x0fpedestal_result\x18\x0c \x03(\x0b\x32\x1a.JFJochProtoBuf.JFPedestal\x12\x1a\n\rindexing_rate\x18\r \x01(\x02H\x00\x88\x01\x01\x42\x10\n\x0e_indexing_rate\".\n\x15ReceiverNetworkConfig\x12\x15\n\rfpga_mac_addr\x18\x01 \x03(\t\"\x93\x01\n\x0eReceiverStatus\x12\x15\n\x08progress\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12/\n\x0b\x66pga_status\x18\x02 \x03(\x0b\x32\x1a.JFJochProtoBuf.FPGAStatus\x12\x1a\n\rindexing_rate\x18\x03 \x01(\x02H\x01\x88\x01\x01\x42\x0b\n\t_progressB\x10\n\x0e_indexing_rate\"\xd2\x01\n\x1bReceiverDataProcessingPlots\x12*\n\x0c\x62kg_estimate\x18\x01 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\x12\x30\n\x12radial_int_profile\x18\x02 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\x12(\n\nspot_count\x18\x03 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\x12+\n\rindexing_rate\x18\x04 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\">\n\x0bWriterInput\x12\x1c\n\x14zmq_receiver_address\x18\x01 \x01(\t\x12\x11\n\tseries_id\x18\x02 \x01(\x03\"P\n\x0cWriterOutput\x12\x0f\n\x07nimages\x18\x01 \x01(\x03\x12\x17\n\x0fperformance_MBs\x18\x02 \x01(\x02\x12\x16\n\x0eperformance_Hz\x18\x03 \x01(\x02\"\xe0\x01\n\x14\x44\x65tectorModuleConfig\x12\x17\n\x0fudp_dest_port_1\x18\x01 \x01(\x04\x12\x17\n\x0fudp_dest_port_2\x18\x02 \x01(\x04\x12\x17\n\x0fipv4_src_addr_1\x18\x03 \x01(\t\x12\x17\n\x0fipv4_src_addr_2\x18\x04 \x01(\t\x12\x18\n\x10ipv4_dest_addr_1\x18\x05 \x01(\t\x12\x18\n\x10ipv4_dest_addr_2\x18\x06 \x01(\t\x12\x17\n\x0fmac_addr_dest_1\x18\x07 \x01(\t\x12\x17\n\x0fmac_addr_dest_2\x18\x08 \x01(\t\"`\n\x0e\x44\x65tectorConfig\x12\x35\n\x07modules\x18\x01 \x03(\x0b\x32$.JFJochProtoBuf.DetectorModuleConfig\x12\x17\n\x0fmodule_hostname\x18\x02 \x03(\t\"\xf9\x01\n\rDetectorInput\x12\x13\n\x0bmodules_num\x18\x01 \x01(\x03\x12*\n\x04mode\x18\x02 \x01(\x0e\x32\x1c.JFJochProtoBuf.DetectorMode\x12\x12\n\nnum_frames\x18\x03 \x01(\x03\x12\x14\n\x0cnum_triggers\x18\x04 \x01(\x03\x12\x1b\n\x13storage_cell_number\x18\x05 \x01(\x03\x12\x1a\n\x12storage_cell_start\x18\x06 \x01(\x03\x12\x1a\n\x12storage_cell_delay\x18\x07 \x01(\x03\x12\x11\n\tperiod_us\x18\t \x01(\x03\x12\x15\n\rcount_time_us\x18\n \x01(\x03\"\x10\n\x0e\x44\x65tectorOutput\"b\n\x0e\x44\x65tectorStatus\x12$\n\x05state\x18\x01 \x01(\x0e\x32\x15.JFJochProtoBuf.State\x12\x12\n\nfw_version\x18\x02 \x01(\x03\x12\x16\n\x0eserver_version\x18\x03 \x01(\t\"\xae\x08\n\nFPGAStatus\x12\x15\n\rpackets_ether\x18\x02 \x01(\x04\x12\x13\n\x0bpackets_udp\x18\x03 \x01(\x04\x12\x16\n\x0epackets_jfjoch\x18\x04 \x01(\x04\x12\x14\n\x0cpackets_icmp\x18\x05 \x01(\x04\x12\x11\n\tfpga_idle\x18\x06 \x01(\x08\x12\x17\n\x0fhbm_temp_0_degC\x18\x07 \x01(\x04\x12\x17\n\x0fhbm_temp_1_degC\x18\x08 \x01(\x04\x12\x12\n\nstalls_hbm\x18\t \x01(\x04\x12\x13\n\x0bstalls_host\x18\n \x01(\x04\x12\x1b\n\x13\x65thernet_rx_aligned\x18\x0b \x01(\x08\x12\x1c\n\x14\x66ull_status_register\x18\r \x01(\r\x12?\n\x0b\x66ifo_status\x18\x0e \x03(\x0b\x32*.JFJochProtoBuf.FPGAStatus.FifoStatusEntry\x12\x13\n\x0bmax_modules\x18\x0f \x01(\x04\x12\x10\n\x08git_sha1\x18\x10 \x01(\r\x12\x17\n\x0fmailbox_err_reg\x18\x11 \x01(\r\x12\x1a\n\x12mailbox_status_reg\x18\x12 \x01(\r\x12\x1c\n\x14\x64\x61tamover_mm2s_error\x18\x13 \x01(\x08\x12\x1c\n\x14\x64\x61tamover_s2mm_error\x18\x14 \x01(\x08\x12&\n\x1e\x66rame_statistics_alignment_err\x18\x15 \x01(\x08\x12\"\n\x1a\x66rame_statistics_tlast_err\x18\x16 \x01(\x08\x12%\n\x1d\x66rame_statistics_work_req_err\x18\x17 \x01(\x08\x12\x14\n\x0cslowest_head\x18\x18 \x01(\x04\x12\x16\n\x0e\x66pga_temp_degC\x18\x1a \x01(\x02\x12\x1a\n\x12\x63urrent_edge_12V_A\x18\x1b \x01(\x02\x12\x1a\n\x12voltage_edge_12V_V\x18\x1c \x01(\x02\x12\x1b\n\x13\x63urrent_edge_3p3V_A\x18\x1d \x01(\x02\x12\x1b\n\x13voltage_edge_3p3V_V\x18\x1e \x01(\x02\x12\x1c\n\x14pcie_h2c_descriptors\x18\x1f \x01(\x04\x12\x1c\n\x14pcie_c2h_descriptors\x18 \x01(\x04\x12\x16\n\x0epcie_h2c_beats\x18! \x01(\x04\x12\x16\n\x0epcie_c2h_beats\x18\" \x01(\x04\x12\x17\n\x0fpcie_h2c_status\x18# \x01(\x04\x12\x17\n\x0fpcie_c2h_status\x18$ \x01(\x04\x12\x13\n\x0bpackets_sls\x18% \x01(\x04\x12\x11\n\terror_eth\x18& \x01(\r\x12\x18\n\x10\x65rror_packet_len\x18\' \x01(\r\x1aQ\n\x0f\x46ifoStatusEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12-\n\x05value\x18\x02 \x01(\x0e\x32\x1e.JFJochProtoBuf.FPGAFIFOStatus:\x02\x38\x01\"I\n\x1aIndexerDataProcessingPlots\x12+\n\rindexing_rate\x18\x01 \x01(\x0b\x32\x14.JFJochProtoBuf.Plot\"\x8a\x03\n\x16\x44\x61taProcessingSettings\x12!\n\x19signal_to_noise_threshold\x18\x01 \x01(\x02\x12\x1e\n\x16photon_count_threshold\x18\x02 \x01(\x03\x12\x18\n\x10min_pix_per_spot\x18\x03 \x01(\x03\x12\x18\n\x10max_pix_per_spot\x18\x04 \x01(\x03\x12\x16\n\x0elocal_bkg_size\x18\x05 \x01(\x03\x12\"\n\x15high_resolution_limit\x18\x06 \x01(\x02H\x00\x88\x01\x01\x12!\n\x14low_resolution_limit\x18\x07 \x01(\x02H\x01\x88\x01\x01\x12\x1a\n\x12\x62kg_estimate_low_q\x18\x08 \x01(\x02\x12\x1b\n\x13\x62kg_estimate_high_q\x18\t \x01(\x02\x12\x1b\n\x0eresult_binning\x18\n \x01(\x03H\x02\x88\x01\x01\x42\x18\n\x16_high_resolution_limitB\x17\n\x15_low_resolution_limitB\x11\n\x0f_result_binning\"\x8d\x02\n\x0cPreviewFrame\x12\x14\n\x0cimage_number\x18\x01 \x01(\x03\x12\x14\n\x0ctotal_images\x18\x02 \x01(\x03\x12\x14\n\x0cwavelength_A\x18\x03 \x01(\x02\x12\x12\n\nbeam_x_pxl\x18\x04 \x01(\x02\x12\x12\n\nbeam_y_pxl\x18\x05 \x01(\x02\x12\x1c\n\x14\x64\x65tector_distance_mm\x18\x06 \x01(\x02\x12\x18\n\x10saturation_value\x18\x07 \x01(\x03\x12\x13\n\x0b\x66ile_prefix\x18\x08 \x01(\t\x12\r\n\x05width\x18\t \x01(\x03\x12\x0e\n\x06height\x18\n \x01(\x03\x12\x13\n\x0bpixel_depth\x18\x0b \x01(\x03\x12\x0c\n\x04\x64\x61ta\x18\r \x01(\x0cJ\x04\x08\x0c\x10\r\"\xed\x01\n\x10ModuleStatistics\x12\x15\n\rmodule_number\x18\x01 \x01(\x03\x12\x1b\n\x13storage_cell_number\x18\x02 \x01(\x03\x12\x18\n\x10pedestal_g0_mean\x18\x03 \x01(\x02\x12\x18\n\x10pedestal_g1_mean\x18\x04 \x01(\x02\x12\x18\n\x10pedestal_g2_mean\x18\x05 \x01(\x02\x12\x14\n\x0cgain_g0_mean\x18\x06 \x01(\x02\x12\x14\n\x0cgain_g1_mean\x18\x07 \x01(\x02\x12\x14\n\x0cgain_g2_mean\x18\x08 \x01(\x02\x12\x15\n\rmasked_pixels\x18\t \x01(\x04\"I\n\x05Image\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\r\n\x05width\x18\x02 \x01(\x03\x12\x0e\n\x06height\x18\x03 \x01(\x03\x12\x13\n\x0bpixel_depth\x18\x04 \x01(\x03\".\n\nMaskToLoad\x12\x0c\n\x04mask\x18\x01 \x03(\r\x12\x12\n\nbit_to_set\x18\x02 \x01(\x05\"\xfc\x03\n\x15MeasurementStatistics\x12\x13\n\x0b\x66ile_prefix\x18\x01 \x01(\t\x12\x18\n\x10images_collected\x18\x02 \x01(\x03\x12\x1d\n\x15max_image_number_sent\x18\x03 \x01(\x03\x12\x1d\n\x15\x63ollection_efficiency\x18\x04 \x01(\x02\x12\x19\n\x11\x63ompression_ratio\x18\x05 \x01(\x02\x12\x11\n\tcancelled\x18\x06 \x01(\x08\x12\x19\n\x11max_receive_delay\x18\x07 \x01(\x03\x12#\n\x16writer_performance_MBs\x18\x08 \x01(\x02H\x00\x88\x01\x01\x12\x1b\n\x0eimages_written\x18\t \x01(\x03H\x01\x88\x01\x01\x12\x1a\n\rindexing_rate\x18\n \x01(\x02H\x02\x88\x01\x01\x12$\n\x17indexing_performance_ms\x18\x0b \x01(\x02H\x03\x88\x01\x01\x12\x16\n\x0e\x64\x65tector_width\x18\x0c \x01(\x03\x12\x17\n\x0f\x64\x65tector_height\x18\r \x01(\x03\x12\x1c\n\x14\x64\x65tector_pixel_depth\x18\x0e \x01(\x03\x42\x19\n\x17_writer_performance_MBsB\x11\n\x0f_images_writtenB\x10\n\x0e_indexing_rateB\x1a\n\x18_indexing_performance_ms\"\x8d\x01\n\x0c\x42rokerStatus\x12+\n\x0c\x62roker_state\x18\x01 \x01(\x0e\x32\x15.JFJochProtoBuf.State\x12\x15\n\x08progress\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12\x1a\n\rindexing_rate\x18\x03 \x01(\x02H\x01\x88\x01\x01\x42\x0b\n\t_progressB\x10\n\x0e_indexing_rate\"\xa4\x01\n\x10\x42rokerFullStatus\x12\x30\n\x08receiver\x18\x01 \x01(\x0b\x32\x1e.JFJochProtoBuf.ReceiverOutput\x12\x30\n\x08\x64\x65tector\x18\x02 \x01(\x0b\x32\x1e.JFJochProtoBuf.DetectorOutput\x12,\n\x06writer\x18\x03 \x03(\x0b\x32\x1c.JFJochProtoBuf.WriterOutput\"<\n\x13\x44\x65tectorListElement\x12\x13\n\x0b\x64\x65scription\x18\x01 \x01(\t\x12\x10\n\x08nmodules\x18\x02 \x01(\x03\"E\n\x0c\x44\x65tectorList\x12\x35\n\x08\x64\x65tector\x18\x01 \x03(\x0b\x32#.JFJochProtoBuf.DetectorListElement\"\x1f\n\x11\x44\x65tectorSelection\x12\n\n\x02id\x18\x01 \x01(\x03*T\n\x0b\x43ompression\x12\r\n\tBSHUF_LZ4\x10\x00\x12\x0e\n\nBSHUF_ZSTD\x10\x01\x12\x12\n\x0e\x42SHUF_ZSTD_RLE\x10\x02\x12\x12\n\x0eNO_COMPRESSION\x10\x03*\'\n\x0c\x44\x65tectorType\x12\x0c\n\x08JUNGFRAU\x10\x00\x12\t\n\x05\x45IGER\x10\x01*Z\n\x0c\x44\x65tectorMode\x12\x0e\n\nCONVERSION\x10\x00\x12\x07\n\x03RAW\x10\x01\x12\x0f\n\x0bPEDESTAL_G0\x10\x02\x12\x0f\n\x0bPEDESTAL_G1\x10\x03\x12\x0f\n\x0bPEDESTAL_G2\x10\x04*2\n\x0e\x46PGAFIFOStatus\x12\t\n\x05\x45MPTY\x10\x00\x12\x08\n\x04\x46ULL\x10\x01\x12\x0b\n\x07PARTIAL\x10\x02*^\n\x05State\x12\x13\n\x0fNOT_INITIALIZED\x10\x00\x12\x08\n\x04IDLE\x10\x01\x12\x08\n\x04\x42USY\x10\x02\x12\x0c\n\x08PEDESTAL\x10\x03\x12\x13\n\x0f\x44\x41TA_COLLECTION\x10\x04\x12\t\n\x05\x45RROR\x10\x05\x32\xac\x05\n\x13gRPC_JFJochReceiver\x12?\n\x05Start\x12\x1d.JFJochProtoBuf.ReceiverInput\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x37\n\x05\x41\x62ort\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x38\n\x06\x43\x61ncel\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12?\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x1e.JFJochProtoBuf.ReceiverOutput\"\x00\x12\x44\n\tGetStatus\x12\x15.JFJochProtoBuf.Empty\x1a\x1e.JFJochProtoBuf.ReceiverStatus\"\x00\x12\\\n\x19SetDataProcessingSettings\x12&.JFJochProtoBuf.DataProcessingSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12^\n\x16GetDataProcessingPlots\x12\x15.JFJochProtoBuf.Empty\x1a+.JFJochProtoBuf.ReceiverDataProcessingPlots\"\x00\x12H\n\x0fGetPreviewFrame\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.PreviewFrame\"\x00\x12R\n\x10GetNetworkConfig\x12\x15.JFJochProtoBuf.Empty\x1a%.JFJochProtoBuf.ReceiverNetworkConfig\"\x00\x32\xca\x01\n\x11gRPC_JFJochWriter\x12=\n\x05Start\x12\x1b.JFJochProtoBuf.WriterInput\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x37\n\x05\x41\x62ort\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12=\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.WriterOutput\"\x00\x32\x82\x03\n\x13gRPC_JFJochDetector\x12?\n\x05Start\x12\x1d.JFJochProtoBuf.DetectorInput\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x36\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x41\n\x06Status\x12\x15.JFJochProtoBuf.Empty\x1a\x1e.JFJochProtoBuf.DetectorStatus\"\x00\x12=\n\x02On\x12\x1e.JFJochProtoBuf.DetectorConfig\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x35\n\x03Off\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x39\n\x07Trigger\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x32\xc6\x0c\n\x11gRPC_JFJochBroker\x12\x41\n\x05Start\x12\x1f.JFJochProtoBuf.DatasetSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x36\n\x04Stop\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12:\n\x08Pedestal\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12<\n\nInitialize\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x38\n\x06\x43\x61ncel\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12<\n\nDeactivate\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x39\n\x07Trigger\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12\x42\n\tGetStatus\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.BrokerStatus\"\x00\x12\\\n\x18GetCalibrationStatistics\x12\x15.JFJochProtoBuf.Empty\x1a\'.JFJochProtoBuf.JFCalibrationStatistics\"\x00\x12P\n\x13GetDetectorSettings\x12\x15.JFJochProtoBuf.Empty\x1a .JFJochProtoBuf.DetectorSettings\"\x00\x12P\n\x13PutDetectorSettings\x12 .JFJochProtoBuf.DetectorSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12Z\n\x18GetMeasurementStatistics\x12\x15.JFJochProtoBuf.Empty\x1a%.JFJochProtoBuf.MeasurementStatistics\"\x00\x12\\\n\x19GetDataProcessingSettings\x12\x15.JFJochProtoBuf.Empty\x1a&.JFJochProtoBuf.DataProcessingSettings\"\x00\x12\\\n\x19PutDataProcessingSettings\x12&.JFJochProtoBuf.DataProcessingSettings\x1a\x15.JFJochProtoBuf.Empty\"\x00\x12P\n\x08GetPlots\x12\x15.JFJochProtoBuf.Empty\x1a+.JFJochProtoBuf.ReceiverDataProcessingPlots\"\x00\x12\x43\n\nGetPreview\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.PreviewFrame\"\x00\x12?\n\rGetPedestalG0\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x12?\n\rGetPedestalG1\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x12?\n\rGetPedestalG2\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x12\x39\n\x07GetMask\x12\x15.JFJochProtoBuf.Empty\x1a\x15.JFJochProtoBuf.Image\"\x00\x12H\n\x0fGetDetectorList\x12\x15.JFJochProtoBuf.Empty\x1a\x1c.JFJochProtoBuf.DetectorList\"\x00\x12L\n\x0eSelectDetector\x12!.JFJochProtoBuf.DetectorSelection\x1a\x15.JFJochProtoBuf.Empty\"\x00\x62\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'jfjoch_pb2', globals()) @@ -22,16 +22,16 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _FPGASTATUS_FIFOSTATUSENTRY._options = None _FPGASTATUS_FIFOSTATUSENTRY._serialized_options = b'8\001' - _COMPRESSION._serialized_start=8246 - _COMPRESSION._serialized_end=8330 - _DETECTORTYPE._serialized_start=8332 - _DETECTORTYPE._serialized_end=8371 - _DETECTORMODE._serialized_start=8373 - _DETECTORMODE._serialized_end=8463 - _FPGAFIFOSTATUS._serialized_start=8465 - _FPGAFIFOSTATUS._serialized_end=8515 - _STATE._serialized_start=8517 - _STATE._serialized_end=8611 + _COMPRESSION._serialized_start=8412 + _COMPRESSION._serialized_end=8496 + _DETECTORTYPE._serialized_start=8498 + _DETECTORTYPE._serialized_end=8537 + _DETECTORMODE._serialized_start=8539 + _DETECTORMODE._serialized_end=8629 + _FPGAFIFOSTATUS._serialized_start=8631 + _FPGAFIFOSTATUS._serialized_end=8681 + _STATE._serialized_start=8683 + _STATE._serialized_end=8777 _EMPTY._serialized_start=32 _EMPTY._serialized_end=39 _UNITCELL._serialized_start=41 @@ -112,12 +112,18 @@ if _descriptor._USE_C_DESCRIPTORS == False: _BROKERSTATUS._serialized_end=8077 _BROKERFULLSTATUS._serialized_start=8080 _BROKERFULLSTATUS._serialized_end=8244 - _GRPC_JFJOCHRECEIVER._serialized_start=8614 - _GRPC_JFJOCHRECEIVER._serialized_end=9298 - _GRPC_JFJOCHWRITER._serialized_start=9301 - _GRPC_JFJOCHWRITER._serialized_end=9503 - _GRPC_JFJOCHDETECTOR._serialized_start=9506 - _GRPC_JFJOCHDETECTOR._serialized_end=9892 - _GRPC_JFJOCHBROKER._serialized_start=9895 - _GRPC_JFJOCHBROKER._serialized_end=11349 + _DETECTORLISTELEMENT._serialized_start=8246 + _DETECTORLISTELEMENT._serialized_end=8306 + _DETECTORLIST._serialized_start=8308 + _DETECTORLIST._serialized_end=8377 + _DETECTORSELECTION._serialized_start=8379 + _DETECTORSELECTION._serialized_end=8410 + _GRPC_JFJOCHRECEIVER._serialized_start=8780 + _GRPC_JFJOCHRECEIVER._serialized_end=9464 + _GRPC_JFJOCHWRITER._serialized_start=9467 + _GRPC_JFJOCHWRITER._serialized_end=9669 + _GRPC_JFJOCHDETECTOR._serialized_start=9672 + _GRPC_JFJOCHDETECTOR._serialized_end=10058 + _GRPC_JFJOCHBROKER._serialized_start=10061 + _GRPC_JFJOCHBROKER._serialized_end=11667 # @@protoc_insertion_point(module_scope) diff --git a/python/jfjoch_pb2_grpc.py b/python/jfjoch_pb2_grpc.py index 8e61c81d..b2c46b89 100644 --- a/python/jfjoch_pb2_grpc.py +++ b/python/jfjoch_pb2_grpc.py @@ -792,6 +792,16 @@ class gRPC_JFJochBrokerStub(object): request_serializer=jfjoch__pb2.Empty.SerializeToString, response_deserializer=jfjoch__pb2.Image.FromString, ) + self.GetDetectorList = channel.unary_unary( + '/JFJochProtoBuf.gRPC_JFJochBroker/GetDetectorList', + request_serializer=jfjoch__pb2.Empty.SerializeToString, + response_deserializer=jfjoch__pb2.DetectorList.FromString, + ) + self.SelectDetector = channel.unary_unary( + '/JFJochProtoBuf.gRPC_JFJochBroker/SelectDetector', + request_serializer=jfjoch__pb2.DetectorSelection.SerializeToString, + response_deserializer=jfjoch__pb2.Empty.FromString, + ) class gRPC_JFJochBrokerServicer(object): @@ -917,6 +927,18 @@ class gRPC_JFJochBrokerServicer(object): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def GetDetectorList(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SelectDetector(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_gRPC_JFJochBrokerServicer_to_server(servicer, server): rpc_method_handlers = { @@ -1020,6 +1042,16 @@ def add_gRPC_JFJochBrokerServicer_to_server(servicer, server): request_deserializer=jfjoch__pb2.Empty.FromString, response_serializer=jfjoch__pb2.Image.SerializeToString, ), + 'GetDetectorList': grpc.unary_unary_rpc_method_handler( + servicer.GetDetectorList, + request_deserializer=jfjoch__pb2.Empty.FromString, + response_serializer=jfjoch__pb2.DetectorList.SerializeToString, + ), + 'SelectDetector': grpc.unary_unary_rpc_method_handler( + servicer.SelectDetector, + request_deserializer=jfjoch__pb2.DetectorSelection.FromString, + response_serializer=jfjoch__pb2.Empty.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'JFJochProtoBuf.gRPC_JFJochBroker', rpc_method_handlers) @@ -1369,3 +1401,37 @@ class gRPC_JFJochBroker(object): jfjoch__pb2.Image.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetDetectorList(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/JFJochProtoBuf.gRPC_JFJochBroker/GetDetectorList', + jfjoch__pb2.Empty.SerializeToString, + jfjoch__pb2.DetectorList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SelectDetector(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/JFJochProtoBuf.gRPC_JFJochBroker/SelectDetector', + jfjoch__pb2.DetectorSelection.SerializeToString, + jfjoch__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/tests/JFJochBrokerParserTest.cpp b/tests/JFJochBrokerParserTest.cpp index 98bff346..b12870e4 100644 --- a/tests/JFJochBrokerParserTest.cpp +++ b/tests/JFJochBrokerParserTest.cpp @@ -98,26 +98,28 @@ TEST_CASE("JFJochBrokerParser_DetectorSetup") { TEST_CASE("JFJochBrokerParser_ParseFacilityConfiguration") { nlohmann::json j = R"( - { - "source_name": "Swiss Light Source", - "source_name_short": "SLS", - "instrument_name": "X06SA VESPA", - "instrument_name_short": "VESPA", - "datastreams": 4, - "pedestal_g0_frames": 5000, - "pedestal_g1_frames": 333, - "pedestal_g2_frames": 333, - "frame_time_us": 0.0012, - "count_time_us": "950 us", - "indexing_period_us": "5 ms", - "spot_finding_period_us": " 2 ms", - "preview_period_us": "1 s", - "ipv4_subnet": "10.10.25.0" - } +{ + "cfg": { + "source_name": "Swiss Light Source", + "source_name_short": "SLS", + "instrument_name": "X06SA VESPA", + "instrument_name_short": "VESPA", + "datastreams": 4, + "pedestal_g0_frames": 5000, + "pedestal_g1_frames": 333, + "pedestal_g2_frames": 333, + "frame_time_us": 0.0012, + "count_time_us": "950 us", + "indexing_period_us": "5 ms", + "spot_finding_period_us": " 2 ms", + "preview_period_us": "1 s", + "ipv4_subnet": "10.10.25.0" + } +} )"_json; DiffractionExperiment x(DetectorGeometry(8)); - ParseFacilityConfiguration(j, x); + ParseFacilityConfiguration(j, "cfg", x); REQUIRE(x.GetSourceName() == "Swiss Light Source"); REQUIRE(x.GetSourceNameShort() == "SLS"); REQUIRE(x.GetInstrumentName() == "X06SA VESPA"); diff --git a/tests/JFJochBrokerTest.cpp b/tests/JFJochBrokerTest.cpp index 692082e8..6867eb34 100644 --- a/tests/JFJochBrokerTest.cpp +++ b/tests/JFJochBrokerTest.cpp @@ -9,6 +9,7 @@ TEST_CASE("JFJochStateMachine_States") { Logger logger("JFJochStateMachine_States"); JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); + state_machine.AddDetectorSetup(DetectorGeometry(4)); JFJochProtoBuf::DatasetSettings setup; setup.set_ntrigger(1); @@ -39,6 +40,7 @@ TEST_CASE("JFJochStateMachine_State_Pedestal") { Logger logger("JFJochStateMachine_State_Pedestal"); JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); + state_machine.AddDetectorSetup(DetectorGeometry(4)); JFJochProtoBuf::DatasetSettings setup; setup.set_ntrigger(1); @@ -69,6 +71,7 @@ TEST_CASE("JFJochStateMachine_State_Measure") { Logger logger("JFJochStateMachine_State_Measure"); JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); + state_machine.AddDetectorSetup(DetectorGeometry(4)); JFJochProtoBuf::DatasetSettings setup; setup.set_ntrigger(1); @@ -99,6 +102,7 @@ TEST_CASE("JFJochStateMachine_State_Error") { Logger logger("JFJochStateMachine_State_Error"); JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); + state_machine.AddDetectorSetup(DetectorGeometry(4)); JFJochProtoBuf::DatasetSettings setup; setup.set_ntrigger(1); @@ -159,18 +163,32 @@ TEST_CASE("JFJochStateMachine_Setup") { REQUIRE(settings_save.count_time_us() == 247); } - -TEST_CASE("JFJochStateMachine_GainCalibration") { - Logger logger("JFJochBrokerService_GainCalibration"); +TEST_CASE("JFJochStateMachine_NoDetectorSetup") { + Logger logger("JFJochStateMachine_NoDetectorSetup"); JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment(DetectorGeometry(4)); - REQUIRE_NOTHROW(state_machine.Initialize()); - state_machine.LoadGainFile("../../tests/test_data/gainMaps_M049.bin"); - state_machine.LoadGainFile("../../tests/test_data/gainMaps_M049.bin"); - state_machine.LoadGainFile("../../tests/test_data/gainMaps_M049.bin"); REQUIRE_THROWS(state_machine.Initialize()); - state_machine.LoadGainFile("../../tests/test_data/gainMaps_M049.bin"); +} + +TEST_CASE("JFJochStateMachine_AddDetectorSetup") { + Logger logger("JFJochStateMachine_AddDetectorSetup"); + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + DetectorSetup setup = DetectorGeometry(4); + state_machine.AddDetectorSetup(setup); + REQUIRE_NOTHROW(state_machine.Initialize()); +} + +TEST_CASE("JFJochStateMachine_AddDetectorSetup_Gain") { + Logger logger("JFJochStateMachine_AddDetectorSetup_Gain"); + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + DetectorSetup setup = DetectorGeometry(4); + setup.LoadGain({"../../tests/test_data/gainMaps_M049.bin", + "../../tests/test_data/gainMaps_M049.bin", + "../../tests/test_data/gainMaps_M049.bin", + "../../tests/test_data/gainMaps_M049.bin"}); + state_machine.AddDetectorSetup(setup); REQUIRE_NOTHROW(state_machine.Initialize()); } @@ -178,6 +196,7 @@ TEST_CASE("JFJochStateMachine_StorageCells") { Logger logger("JFJochBrokerService_StorageCells"); JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); + state_machine.AddDetectorSetup(DetectorGeometry(4)); JFJochProtoBuf::DetectorSettings settings; settings.set_frame_time_us(500); @@ -191,11 +210,41 @@ TEST_CASE("JFJochStateMachine_StorageCells") { REQUIRE(calibration_pbuf.nstorage_cells() == 16); } +TEST_CASE("JFJochStateMachine_AddDetectorSetup_Multiple") { + Logger logger("JFJochBrokerService_StorageCells"); + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + REQUIRE_NOTHROW(state_machine.AddDetectorSetup(DetectorSetup(DetectorGeometry(4), "Det1", {"mx1", "mx2", "mx3", "mx4"}))); + REQUIRE_NOTHROW(state_machine.AddDetectorSetup(DetectorSetup(DetectorGeometry(2), "Det2", {"mx1", "mx2"}))); + REQUIRE_NOTHROW(state_machine.AddDetectorSetup(DetectorSetup(DetectorGeometry(1), "Det3", {"mx1"}))); + + auto dl = state_machine.GetDetectorsList(); + REQUIRE(dl.detector_size() == 3); + REQUIRE(dl.detector(0).description() == "Det1"); + REQUIRE(dl.detector(0).nmodules() == 4); + REQUIRE(dl.detector(1).description() == "Det2"); + REQUIRE(dl.detector(1).nmodules() == 2); + REQUIRE(dl.detector(2).description() == "Det3"); + REQUIRE(dl.detector(2).nmodules() == 1); + + REQUIRE_NOTHROW(state_machine.Initialize()); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetModulesNum() == 4); + REQUIRE(state_machine.GetState() == JFJochState::Idle); + + REQUIRE_THROWS(state_machine.SelectDetector(7)); + REQUIRE(state_machine.GetState() == JFJochState::Idle); + + REQUIRE_NOTHROW(state_machine.SelectDetector(2)); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetModulesNum() == 1); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetDetectorDescription() == "Det3"); + REQUIRE(state_machine.GetState() == JFJochState::Inactive); +} + TEST_CASE("JFJochBroker") { DiffractionExperiment experiment; JFJochBroker broker(experiment); - + broker.AddDetectorSetup(DetectorGeometry(4)); REQUIRE(broker.Initialize(nullptr, nullptr, nullptr).ok()); @@ -211,4 +260,4 @@ TEST_CASE("JFJochBroker") { REQUIRE(broker.Start(nullptr, &setup, nullptr).ok()); REQUIRE(broker.Stop(nullptr, nullptr, nullptr).ok()); REQUIRE(broker.Deactivate(nullptr, nullptr, nullptr).ok()); -} \ No newline at end of file +} diff --git a/tests/JFJochFullIntegrationTest.cpp b/tests/JFJochFullIntegrationTest.cpp index 7087a9d4..939daeb4 100644 --- a/tests/JFJochFullIntegrationTest.cpp +++ b/tests/JFJochFullIntegrationTest.cpp @@ -29,10 +29,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ", "[JFJochReceiver]") { JFJochStateMachine state_machine(services, logger); REQUIRE(!state_machine.GetMeasurementStatistics().has_value()); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); - - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -126,8 +125,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_2DataStreams_4Devices", "[JFJochReceiver]") REQUIRE(!state_machine.GetMeasurementStatistics().has_value()); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -220,9 +220,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_RAW", "[JFJochReceiver]") { JFJochStateMachine state_machine(services, logger); REQUIRE(!state_machine.GetMeasurementStatistics().has_value()); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().Mode(DetectorMode::Conversion); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -315,8 +315,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_3Writers", "[JFJochReceiver]") { JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0); services .Writer("unix:writer_test_0", "inproc://#0") @@ -413,8 +414,9 @@ TEST_CASE("JFJochIntegrationTest_Cancel", "[JFJochReceiver]") { JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -491,8 +493,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_with_preview", "[JFJochReceiver]") { JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0).PreviewPeriod( 5ms); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -611,8 +614,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_with_preview_no_writer", "[JFJochReceiver]" JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0).PreviewPeriod( 5ms); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -729,8 +733,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_background_estimation", "[JFJochReceiver]") JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0) .MaskChipEdges(true).MaskModuleEdges(true).SpotFindingPeriod(1ms).FrameTime(1ms); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -839,8 +844,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_lysozyme_spot", "[JFJochReceiver]") { JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -950,8 +956,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_lysozyme_spot_and_index", "[JFJochReceiver] JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0) .SpotFindingPeriod(10ms).IndexingPeriod(10ms); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); @@ -1070,8 +1077,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_lysozyme_spot_and_index_sum", "[JFJochRecei JFJochServices services(logger); JFJochStateMachine state_machine(services, logger); - state_machine.NotThreadSafe_Experiment() = DiffractionExperiment( - DetectorGeometry(ndatastream * nmodules, 2, 8, 36)).DataStreams(ndatastream); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0) .SpotFindingPeriod(10ms).IndexingPeriod(10ms); services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test");