v1.0.0-rc.36
This commit is contained in:
@@ -2,17 +2,17 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
#include "JFJochReceiverService.h"
|
||||
|
||||
#include "../preview/ZMQMetadataSocket.h"
|
||||
#include "JFJochReceiverFPGA.h"
|
||||
#include "JFJochReceiverLite.h"
|
||||
|
||||
JFJochReceiverService::JFJochReceiverService(AcquisitionDeviceGroup &in_aq_devices,
|
||||
Logger &in_logger, ImagePusher &pusher,
|
||||
size_t send_buffer_size_MiB)
|
||||
: aq_devices(in_aq_devices),
|
||||
logger(in_logger),
|
||||
image_buffer(send_buffer_size_MiB * 1024 * 1024),
|
||||
image_pusher(pusher),
|
||||
spot_finding_settings(DiffractionExperiment::DefaultDataProcessingSettings()) {
|
||||
: aq_devices(in_aq_devices),
|
||||
logger(in_logger),
|
||||
image_buffer(send_buffer_size_MiB * 1024 * 1024),
|
||||
image_pusher(pusher),
|
||||
spot_finding_settings(DiffractionExperiment::DefaultDataProcessingSettings()) {
|
||||
}
|
||||
|
||||
JFJochReceiverService &JFJochReceiverService::NumThreads(int64_t input) {
|
||||
@@ -54,39 +54,62 @@ std::optional<JFJochReceiverStatus> JFJochReceiverService::GetStatus() {
|
||||
|
||||
void JFJochReceiverService::Start(const DiffractionExperiment &experiment,
|
||||
const PixelMask &pixel_mask,
|
||||
const JFCalibration *calibration) {
|
||||
const JFCalibration *calibration,
|
||||
std::shared_ptr<ImagePuller> puller) {
|
||||
std::unique_lock ul_state(state_mutex); // unique lock, as it will destroy and create receiver object
|
||||
if (state != ReceiverState::Idle)
|
||||
throw JFJochException(JFJochExceptionCategory::WrongDAQState, "Receiver not idle, cannot start");
|
||||
|
||||
try {
|
||||
preview_image.Configure(experiment, pixel_mask);
|
||||
preview_image_indexed.Configure(experiment, pixel_mask);
|
||||
|
||||
auto nthreads_local = nthreads;
|
||||
if (experiment.IsCPUSummation())
|
||||
nthreads_local = 4;
|
||||
|
||||
// Thanks to properties of unique_ptr, starting new measurement will call destructor of JFJochReceiver, which will
|
||||
// ensure that everything was rolled back
|
||||
receiver = std::make_unique<JFJochReceiver>(experiment, pixel_mask,
|
||||
calibration,
|
||||
aq_devices, image_pusher,
|
||||
logger,
|
||||
nthreads_local,
|
||||
numa_policy,
|
||||
spot_finding_settings,
|
||||
preview_image,
|
||||
preview_image_indexed,
|
||||
receiver_status,
|
||||
plots,
|
||||
image_buffer,
|
||||
zmq_preview_socket.get(),
|
||||
zmq_metadata_socket.get());
|
||||
try {
|
||||
// Don't want to stop
|
||||
receiver->SetSpotFindingSettings(spot_finding_settings);
|
||||
} catch (...) {
|
||||
|
||||
switch (experiment.GetDetectorType()) {
|
||||
case DetectorType::EIGER:
|
||||
case DetectorType::JUNGFRAU:
|
||||
receiver = std::make_unique<JFJochReceiverFPGA>(experiment, pixel_mask,
|
||||
calibration,
|
||||
aq_devices, image_pusher,
|
||||
logger,
|
||||
nthreads_local,
|
||||
numa_policy,
|
||||
spot_finding_settings,
|
||||
preview_image,
|
||||
preview_image_indexed,
|
||||
receiver_status,
|
||||
plots,
|
||||
image_buffer,
|
||||
zmq_preview_socket.get(),
|
||||
zmq_metadata_socket.get());
|
||||
break;
|
||||
case DetectorType::DECTRIS:
|
||||
if (puller)
|
||||
image_puller = puller;
|
||||
else {
|
||||
image_puller = std::make_shared<ZMQImagePuller>(
|
||||
experiment.GetDetectorSetup().GetDECTRISStream2Addr());
|
||||
}
|
||||
receiver = std::make_unique<JFJochReceiverLite>(experiment,
|
||||
pixel_mask,
|
||||
*image_puller,
|
||||
image_pusher,
|
||||
logger,
|
||||
nthreads_local,
|
||||
numa_policy,
|
||||
spot_finding_settings,
|
||||
preview_image,
|
||||
preview_image_indexed,
|
||||
receiver_status,
|
||||
plots,
|
||||
image_buffer,
|
||||
zmq_preview_socket.get(),
|
||||
zmq_metadata_socket.get());
|
||||
break;
|
||||
|
||||
}
|
||||
measurement = std::async(std::launch::async, &JFJochReceiverService::FinalizeMeasurement, this);
|
||||
state = ReceiverState::Running;
|
||||
@@ -146,20 +169,6 @@ std::vector<AcquisitionDeviceNetConfig> JFJochReceiverService::GetNetworkConfig(
|
||||
return aq_devices.GetNetworkConfig();
|
||||
}
|
||||
|
||||
std::string JFJochReceiverService::GetTIFF(bool calibration) const {
|
||||
if (calibration)
|
||||
return preview_image.GenerateTIFFDioptas();
|
||||
else
|
||||
return preview_image.GenerateTIFF();
|
||||
}
|
||||
|
||||
std::string JFJochReceiverService::GetJPEG(const PreviewJPEGSettings &settings) const {
|
||||
if (settings.show_indexed)
|
||||
return preview_image_indexed.GenerateJPEG(settings);
|
||||
else
|
||||
return preview_image.GenerateJPEG(settings);
|
||||
}
|
||||
|
||||
void JFJochReceiverService::LoadInternalGeneratorImage(const DiffractionExperiment &experiment,
|
||||
const std::vector<uint16_t> &image,
|
||||
uint64_t image_number) {
|
||||
@@ -270,8 +279,22 @@ void JFJochReceiverService::GetStartMessageFromBuffer(std::vector<uint8_t> &v) {
|
||||
image_buffer.GetStartMessage(v);
|
||||
}
|
||||
|
||||
void JFJochReceiverService::GetImageFromBuffer(std::vector<uint8_t> &v, int64_t image_number) {
|
||||
image_buffer.GetImage(v, image_number);
|
||||
bool JFJochReceiverService::GetImageFromBuffer(std::vector<uint8_t> &v, int64_t image_number) {
|
||||
return image_buffer.GetImage(v, image_number);
|
||||
}
|
||||
|
||||
std::string JFJochReceiverService::GetJPEGFromBuffer(const PreviewJPEGSettings &settings, int64_t image_number) {
|
||||
std::vector<uint8_t> cbor_image;
|
||||
if (!image_buffer.GetImage(cbor_image, image_number))
|
||||
return {};
|
||||
return preview_image.GenerateJPEG(settings, cbor_image);
|
||||
}
|
||||
|
||||
std::string JFJochReceiverService::GetTIFFFromBuffer(int64_t image_number) {
|
||||
std::vector<uint8_t> cbor_image;
|
||||
if (!image_buffer.GetImage(cbor_image, image_number))
|
||||
return {};
|
||||
return preview_image.GenerateTIFF(cbor_image);
|
||||
}
|
||||
|
||||
ImageBufferStatus JFJochReceiverService::GetImageBufferStatus() const {
|
||||
|
||||
Reference in New Issue
Block a user