FrameTransformation: Add two tests for int32 and uint16
This commit is contained in:
1 parent
d6c1b19599
commit
dec3eb15de
4 files changed
+143
-16
No files matched your search
@@ -540,7 +540,7 @@ int64_t DiffractionExperiment::GetPixelDepth() const {
|
||||
}
|
||||
|
||||
bool DiffractionExperiment::IsPixelSigned() const {
|
||||
return (GetDetectorMode() == DetectorMode::Conversion) && (GetDetectorType() == JFJochProtoBuf::JUNGFRAU);
|
||||
return GetFPGAOutputSigned();
|
||||
}
|
||||
|
||||
int64_t DiffractionExperiment::GetDataStreamsNum() const {
|
||||
|
||||
@@ -21,19 +21,16 @@ FrameTransformation::FrameTransformation(const DiffractionExperiment &in_experim
|
||||
|
||||
precompression_buffer.resize(experiment.GetPixelsNum() * pixel_depth);
|
||||
|
||||
if (experiment.GetApplyPixelMaskInFPGA()) {
|
||||
// Mask gaps
|
||||
if (pixel_depth == 2) {
|
||||
if (pixel_signed)
|
||||
FillVector<int16_t>(precompression_buffer, INT16_MIN);
|
||||
else
|
||||
FillVector<uint16_t>(precompression_buffer, UINT16_MAX);
|
||||
} else if (pixel_depth == 4) {
|
||||
if (pixel_signed)
|
||||
FillVector<int32_t>(precompression_buffer, INT32_MIN);
|
||||
else
|
||||
FillVector<uint32_t>(precompression_buffer, UINT32_MAX);
|
||||
}
|
||||
if (pixel_depth == 2) {
|
||||
if (pixel_signed)
|
||||
FillVector<int16_t>(precompression_buffer, INT16_MIN);
|
||||
else
|
||||
FillVector<uint16_t>(precompression_buffer, UINT16_MAX);
|
||||
} else if (pixel_depth == 4) {
|
||||
if (pixel_signed)
|
||||
FillVector<int32_t>(precompression_buffer, INT32_MIN);
|
||||
else
|
||||
FillVector<uint32_t>(precompression_buffer, UINT32_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +39,7 @@ size_t FrameTransformation::SaveCompressedImage(void *output) {
|
||||
experiment.GetPixelsNum(), pixel_depth);
|
||||
}
|
||||
|
||||
void FrameTransformation::ProcessModule(const int16_t *input, uint16_t module_number, int data_stream) {
|
||||
void FrameTransformation::ProcessModule(const void *input, uint16_t module_number, int data_stream) {
|
||||
size_t module_number_abs = experiment.GetFirstModuleOfDataStream(data_stream) + module_number;
|
||||
|
||||
if (experiment.GetDetectorMode() != DetectorMode::Conversion) {
|
||||
|
||||
@@ -16,7 +16,7 @@ class FrameTransformation {
|
||||
const size_t pixel_depth;
|
||||
public:
|
||||
explicit FrameTransformation(const DiffractionExperiment &experiment);
|
||||
void ProcessModule(const int16_t *input, uint16_t module_number, int data_stream);
|
||||
void ProcessModule(const void *input, uint16_t module_number, int data_stream);
|
||||
size_t SaveCompressedImage(void *output);
|
||||
const void *GetPreviewImage() const;
|
||||
};
|
||||
|
||||
@@ -282,3 +282,133 @@ TEST_CASE("FrameTransformation_Converted_bshuf_zstd_rle" ,"") {
|
||||
REQUIRE(input_1[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030]);
|
||||
REQUIRE(input_1[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030 + 800 + 6]);
|
||||
}
|
||||
|
||||
TEST_CASE("FrameTransformation_Converted_bshuf_zstd_32bit" ,"") {
|
||||
const uint16_t nmodules = 4;
|
||||
const uint16_t ndatastreams = 2;
|
||||
DiffractionExperiment experiment(DetectorGeometry(ndatastreams * nmodules, 2));
|
||||
experiment.DataStreams(ndatastreams);
|
||||
|
||||
experiment.Mode(DetectorMode::Conversion).Compression(JFJochProtoBuf::BSHUF_ZSTD).FPGAOutputMode(JFJochProtoBuf::INT32);
|
||||
|
||||
FrameTransformation transformation(experiment);
|
||||
|
||||
std::mt19937 g1(1987);
|
||||
std::uniform_int_distribution<int32_t> dist;
|
||||
|
||||
std::vector<int32_t> input_0(nmodules*RAW_MODULE_SIZE);
|
||||
for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++)
|
||||
input_0[i] = dist(g1);
|
||||
|
||||
input_0[311*1024+256] = INT32_MAX-1;
|
||||
input_0[311*1024+255] = INT32_MIN;
|
||||
|
||||
std::vector<int32_t> input_1(nmodules*RAW_MODULE_SIZE);
|
||||
for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++)
|
||||
input_1[i] = dist(g1);
|
||||
|
||||
std::vector<char> output_compressed(experiment.GetMaxCompressedSize());
|
||||
|
||||
for (int i = 0; i < nmodules; i++) {
|
||||
REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data() + i * RAW_MODULE_SIZE, i, 0));
|
||||
REQUIRE_NOTHROW(transformation.ProcessModule(input_1.data() + i * RAW_MODULE_SIZE, i, 1));
|
||||
}
|
||||
|
||||
size_t compressed_size;
|
||||
REQUIRE_NOTHROW(compressed_size = transformation.SaveCompressedImage(output_compressed.data()));
|
||||
|
||||
REQUIRE(bshuf_read_uint64_BE(output_compressed.data()) == experiment.GetPixelsNum() * experiment.GetPixelDepth());
|
||||
REQUIRE(bshuf_read_uint32_BE(output_compressed.data()+8) == JFJochBitShuffleCompressor::DefaultBlockSize * experiment.GetPixelDepth());
|
||||
|
||||
output_compressed.resize(compressed_size);
|
||||
std::vector<int32_t> output;
|
||||
REQUIRE_NOTHROW(JFJochDecompress(output, experiment.GetCompressionAlgorithmEnum(), output_compressed,
|
||||
experiment.GetPixelsNum()));
|
||||
|
||||
REQUIRE(input_0[511*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 0]);
|
||||
REQUIRE(input_0[511*1024+256]/2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 258]);
|
||||
REQUIRE(input_0[256*1024+256]/4 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 2 * 1030 * 255 + 257]);
|
||||
|
||||
REQUIRE(input_0[311*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 0]);
|
||||
REQUIRE(input_0[311*1024+255] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 255]);
|
||||
REQUIRE(input_0[311*1024+256] / 2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 258]);
|
||||
|
||||
REQUIRE(input_0[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030]);
|
||||
REQUIRE(input_0[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030 + 800 + 6]);
|
||||
|
||||
REQUIRE(input_1[511*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 0]);
|
||||
REQUIRE(input_1[511*1024+256] /2 == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 258]);
|
||||
|
||||
REQUIRE(input_1[(311+2*512)*1024] == output[200 * 1030 * 2 + 0]);
|
||||
REQUIRE(input_1[(311+2*512)*1024+512] / 2 == output[200 * 1030 * 2 + 256*2+3]);
|
||||
|
||||
REQUIRE(input_1[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030]);
|
||||
REQUIRE(input_1[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030 + 800 + 6]);
|
||||
}
|
||||
|
||||
|
||||
TEST_CASE("FrameTransformation_Converted_bshuf_zstd_unsigned_16bit" ,"") {
|
||||
const uint16_t nmodules = 4;
|
||||
const uint16_t ndatastreams = 2;
|
||||
DiffractionExperiment experiment(DetectorGeometry(ndatastreams * nmodules, 2));
|
||||
experiment.DataStreams(ndatastreams);
|
||||
|
||||
experiment.Mode(DetectorMode::Conversion).Compression(JFJochProtoBuf::BSHUF_ZSTD).FPGAOutputMode(JFJochProtoBuf::UINT16);
|
||||
|
||||
REQUIRE(!experiment.IsPixelSigned());
|
||||
REQUIRE(experiment.GetPixelDepth() == 2);
|
||||
|
||||
FrameTransformation transformation(experiment);
|
||||
|
||||
std::mt19937 g1(1987);
|
||||
std::uniform_int_distribution<uint16_t> dist(0, UINT16_MAX - 2);
|
||||
|
||||
std::vector<uint16_t> input_0(nmodules*RAW_MODULE_SIZE);
|
||||
for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++)
|
||||
input_0[i] = dist(g1);
|
||||
|
||||
input_0[311*1024+256] = UINT16_MAX - 2;
|
||||
input_0[311*1024+255] = UINT16_MAX - 1;
|
||||
|
||||
std::vector<uint16_t> input_1(nmodules*RAW_MODULE_SIZE);
|
||||
for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++)
|
||||
input_1[i] = dist(g1);
|
||||
|
||||
std::vector<char> output_compressed(experiment.GetMaxCompressedSize());
|
||||
|
||||
for (int i = 0; i < nmodules; i++) {
|
||||
REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data() + i * RAW_MODULE_SIZE, i, 0));
|
||||
REQUIRE_NOTHROW(transformation.ProcessModule(input_1.data() + i * RAW_MODULE_SIZE, i, 1));
|
||||
}
|
||||
|
||||
size_t compressed_size;
|
||||
REQUIRE_NOTHROW(compressed_size = transformation.SaveCompressedImage(output_compressed.data()));
|
||||
|
||||
REQUIRE(bshuf_read_uint64_BE(output_compressed.data()) == experiment.GetPixelsNum() * experiment.GetPixelDepth());
|
||||
REQUIRE(bshuf_read_uint32_BE(output_compressed.data()+8) == JFJochBitShuffleCompressor::DefaultBlockSize * experiment.GetPixelDepth());
|
||||
|
||||
output_compressed.resize(compressed_size);
|
||||
std::vector<uint16_t> output;
|
||||
REQUIRE_NOTHROW(JFJochDecompress(output, experiment.GetCompressionAlgorithmEnum(), output_compressed,
|
||||
experiment.GetPixelsNum()));
|
||||
|
||||
REQUIRE(input_0[511*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 0]);
|
||||
REQUIRE(input_0[511*1024+256]/2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 258]);
|
||||
REQUIRE(input_0[256*1024+256]/4 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 2 * 1030 * 255 + 257]);
|
||||
|
||||
REQUIRE(input_0[311*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 0]);
|
||||
REQUIRE(input_0[311*1024+255] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 255]);
|
||||
REQUIRE(input_0[311*1024+256] / 2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 258]);
|
||||
|
||||
REQUIRE(input_0[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030]);
|
||||
REQUIRE(input_0[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030 + 800 + 6]);
|
||||
|
||||
REQUIRE(input_1[511*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 0]);
|
||||
REQUIRE(input_1[511*1024+256] /2 == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 258]);
|
||||
|
||||
REQUIRE(input_1[(311+2*512)*1024] == output[200 * 1030 * 2 + 0]);
|
||||
REQUIRE(input_1[(311+2*512)*1024+512] / 2 == output[200 * 1030 * 2 + 256*2+3]);
|
||||
|
||||
REQUIRE(input_1[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030]);
|
||||
REQUIRE(input_1[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030 + 800 + 6]);
|
||||
}
|
||||
Reference in new issue
Block a user