version 1.0.0-rc.26
This commit is contained in:
@@ -4,10 +4,10 @@
|
||||
#include "ModuleSummation.h"
|
||||
#include "JFJochException.h"
|
||||
|
||||
ModuleSummation::ModuleSummation(bool in_pixel_signed,uint32_t in_fpga_depth_bytes) {
|
||||
ModuleSummation::ModuleSummation(bool in_pixel_signed, uint32_t in_fpga_depth_bytes) {
|
||||
pixel_signed = in_pixel_signed;
|
||||
first = true;
|
||||
empty = false;
|
||||
is_empty = false;
|
||||
output_depth_bytes = 4;
|
||||
fpga_depth_bytes = in_fpga_depth_bytes;
|
||||
|
||||
@@ -20,17 +20,17 @@ ModuleSummation::ModuleSummation(bool in_pixel_signed,uint32_t in_fpga_depth_byt
|
||||
memset(output.get(), 0, sizeof(DeviceOutput));
|
||||
}
|
||||
|
||||
ModuleSummation::ModuleSummation(const DiffractionExperiment &experiment) :
|
||||
ModuleSummation(experiment.IsPixelSigned(), experiment.GetByteDepthFPGA()) {
|
||||
ModuleSummation::ModuleSummation(const DiffractionExperiment &experiment) : ModuleSummation(
|
||||
experiment.IsPixelSigned(), experiment.GetByteDepthFPGA()) {
|
||||
if (!experiment.IsCPUSummation())
|
||||
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
|
||||
"CPU summation not turned on");
|
||||
"CPU summation not turned on");
|
||||
if (experiment.GetByteDepthImage() != 4)
|
||||
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
|
||||
"CPU summation works only for 32-bit output");
|
||||
"CPU summation works only for 32-bit output");
|
||||
}
|
||||
|
||||
const DeviceOutput& ModuleSummation::GetOutput() const {
|
||||
const DeviceOutput &ModuleSummation::GetOutput() const {
|
||||
return *output;
|
||||
}
|
||||
|
||||
@@ -38,8 +38,8 @@ DeviceOutput &ModuleSummation::GetOutput() {
|
||||
return *output;
|
||||
}
|
||||
|
||||
template <class Tdst, class Tsrc>
|
||||
void Add(DeviceOutput& output, const DeviceOutput& input) {
|
||||
template<class Tdst, class Tsrc>
|
||||
void Add(DeviceOutput &output, const DeviceOutput &input) {
|
||||
auto in_pixel = reinterpret_cast<const Tsrc *>(input.pixels);
|
||||
auto out_pixel = reinterpret_cast<Tdst *>(output.pixels);
|
||||
|
||||
@@ -50,16 +50,18 @@ void Add(DeviceOutput& output, const DeviceOutput& input) {
|
||||
if ((in_pixel[i] == err_val_src) || (out_pixel[i] == err_val_dst))
|
||||
out_pixel[i] = err_val_dst;
|
||||
else if ((in_pixel[i] == std::numeric_limits<Tsrc>::max())
|
||||
|| (out_pixel[i] == std::numeric_limits<Tdst>::max())
|
||||
|| (static_cast<int64_t>(out_pixel[i]) + static_cast<int64_t>(in_pixel[i]) >= std::numeric_limits<Tdst>::max()))
|
||||
|| (out_pixel[i] == std::numeric_limits<Tdst>::max())
|
||||
|| (static_cast<int64_t>(out_pixel[i]) + static_cast<int64_t>(in_pixel[i]) >= std::numeric_limits<
|
||||
Tdst>::max()))
|
||||
out_pixel[i] = std::numeric_limits<Tdst>::max();
|
||||
else
|
||||
out_pixel[i] = out_pixel[i] + in_pixel[i];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ModuleSummation::AddFPGAOutput(const DeviceOutput &input) {
|
||||
void ModuleSummation::AddFPGAOutput(const DeviceOutput &input, const std::optional<uint32_t> &in_fpga_depth_bytes) {
|
||||
std::unique_lock ul(module_summation_mutex);
|
||||
|
||||
if (first) {
|
||||
output->module_statistics = input.module_statistics;
|
||||
first = false;
|
||||
@@ -70,24 +72,30 @@ void ModuleSummation::AddFPGAOutput(const DeviceOutput &input) {
|
||||
}
|
||||
|
||||
// The only function not handled is spot finding
|
||||
|
||||
if (fpga_depth_bytes == 2) {
|
||||
if (pixel_signed)
|
||||
Add<int32_t, int16_t>(*output, input);
|
||||
else
|
||||
Add<uint32_t, uint16_t>(*output, input);
|
||||
} else if (fpga_depth_bytes == 4) {
|
||||
if (pixel_signed)
|
||||
Add<int32_t, int32_t>(*output, input);
|
||||
else
|
||||
Add<uint32_t, uint32_t>(*output, input);
|
||||
} else if (fpga_depth_bytes == 1) {
|
||||
if (pixel_signed)
|
||||
Add<int32_t, int8_t>(*output, input);
|
||||
else
|
||||
Add<uint32_t, uint8_t>(*output, input);
|
||||
|
||||
switch (in_fpga_depth_bytes.value_or(fpga_depth_bytes)) {
|
||||
case 2:
|
||||
if (pixel_signed)
|
||||
Add<int32_t, int16_t>(*output, input);
|
||||
else
|
||||
Add<uint32_t, uint16_t>(*output, input);
|
||||
break;
|
||||
case 4:
|
||||
if (pixel_signed)
|
||||
Add<int32_t, int32_t>(*output, input);
|
||||
else
|
||||
Add<uint32_t, uint32_t>(*output, input);
|
||||
break;
|
||||
case 1:
|
||||
if (pixel_signed)
|
||||
Add<int32_t, int8_t>(*output, input);
|
||||
else
|
||||
Add<uint32_t, uint8_t>(*output, input);
|
||||
break;
|
||||
default:
|
||||
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
|
||||
"Unknown bit depth");
|
||||
}
|
||||
|
||||
for (int i = 0; i < FPGA_INTEGRATION_BIN_COUNT; i++) {
|
||||
output->integration_result[i].count += input.integration_result[i].count;
|
||||
output->integration_result[i].sum += input.integration_result[i].sum;
|
||||
@@ -108,11 +116,9 @@ void ModuleSummation::AddFPGAOutput(const DeviceOutput &input) {
|
||||
}
|
||||
|
||||
void ModuleSummation::AddEmptyOutput() {
|
||||
empty = true;
|
||||
is_empty = true;
|
||||
}
|
||||
|
||||
bool ModuleSummation::IsEmpty() const {
|
||||
return empty;
|
||||
bool ModuleSummation::empty() const {
|
||||
return is_empty;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user