From c92be4bca2da579f67e2e45df184cb930f20df31 Mon Sep 17 00:00:00 2001 From: Alice Date: Tue, 24 Jun 2025 11:29:25 +0200 Subject: [PATCH] added eiger quad test --- python/tests/test_RawFile.py | 64 ++++++++++++++++++++++++++++++++-- src/NumpyFile.cpp | 4 +-- src/RawFile.test.cpp | 66 +++++++++++++++++++++++++++++------- 3 files changed, 117 insertions(+), 17 deletions(-) diff --git a/python/tests/test_RawFile.py b/python/tests/test_RawFile.py index 769b4e6..69e4d46 100644 --- a/python/tests/test_RawFile.py +++ b/python/tests/test_RawFile.py @@ -1,14 +1,74 @@ import pytest from aare import RawFile +import numpy as np @pytest.mark.files def test_read_rawfile_with_roi(test_data_path): # Starting with f1 there is now 7 frames left in the series of files - print(test_data_path) with RawFile(test_data_path / "raw/SingleChipROI/Data_master_0.json") as f: headers, frames = f.read() assert headers.size == 10100 assert frames.shape == (10100, 256, 256) - \ No newline at end of file + +@pytest.mark.files +def test_read_rawfile_quad_eiger_and_compare_to_numpy(test_data_path): + + d0 = test_data_path/'raw/eiger_quad_data/W13_vrpreampscan_m21C_300V_800eV_vthre2000_d0_f0_0.raw' + d1 = test_data_path/'raw/eiger_quad_data/W13_vrpreampscan_m21C_300V_800eV_vthre2000_d1_f0_0.raw' + + image = np.zeros((512,512), dtype=np.uint32) + + with open(d0) as f: + raw = np.fromfile(f, dtype=np.uint32, count = 256*512, offset = 20*256*512*4 + 112*21).reshape(256,512) + + image[256:,:] = raw + + with open(d1) as f: + raw = np.fromfile(f, dtype=np.uint32, count = 256*512, offset = 20*256*512*4 + 112*21).reshape(256,512) + + image[0:256,:] = raw[::-1,:] + + with RawFile(test_data_path/'raw/eiger_quad_data/W13_vrpreampscan_m21C_300V_800eV_vthre2000_master_0.json') as f: + f.seek(20) + header, image1 = f.read_frame() + + assert (image == image1).all() + + +@pytest.mark.files +def test_read_rawfile_eiger_and_compare_to_numpy(test_data_path): + d0 = test_data_path/'raw/eiger/Lab6_20500eV_2deg_20240629_d0_f0_7.raw' + d1 = test_data_path/'raw/eiger/Lab6_20500eV_2deg_20240629_d1_f0_7.raw' + d2 = test_data_path/'raw/eiger/Lab6_20500eV_2deg_20240629_d2_f0_7.raw' + d3 = test_data_path/'raw/eiger/Lab6_20500eV_2deg_20240629_d3_f0_7.raw' + + image = np.zeros((512,1024), dtype=np.uint32) + + #TODO why is there no header offset? + with open(d0) as f: + raw = np.fromfile(f, dtype=np.uint32, count = 256*512, offset=112).reshape(256,512) + + image[0:256,0:512] = raw[::-1] + + with open(d1) as f: + raw = np.fromfile(f, dtype=np.uint32, count = 256*512, offset=112).reshape(256,512) + + image[0:256,512:] = raw[::-1] + + with open(d2) as f: + raw = np.fromfile(f, dtype=np.uint32, count = 256*512, offset=112).reshape(256,512) + + image[256:,0:512] = raw + + with open(d3) as f: + raw = np.fromfile(f, dtype=np.uint32, count = 256*512, offset=112).reshape(256,512) + + image[256:,512:] = raw + + + with RawFile(test_data_path/'raw/eiger/Lab6_20500eV_2deg_20240629_master_7.json') as f: + header, image1 = f.read_frame() + + assert (image == image1).all() diff --git a/src/NumpyFile.cpp b/src/NumpyFile.cpp index 4e0c215..5fd4d15 100644 --- a/src/NumpyFile.cpp +++ b/src/NumpyFile.cpp @@ -56,7 +56,7 @@ void NumpyFile::write_impl(void *data, uint64_t size) { } Frame NumpyFile::get_frame(size_t frame_number) { - Frame frame(m_header.shape[1], m_header.shape[2], m_header.dtype); + Frame frame(m_header.shape[0], m_header.shape[1], m_header.dtype); get_frame_into(frame_number, frame.data()); return frame; } @@ -67,7 +67,7 @@ void NumpyFile::get_frame_into(size_t frame_number, std::byte *image_buf) { if (frame_number > m_header.shape[0]) { throw std::invalid_argument("Frame number out of range"); } - if (fseek(fp, header_size + frame_number * m_bytes_per_frame, + if (fseek(fp, frame_number * m_bytes_per_frame, SEEK_SET)) // NOLINT throw std::runtime_error("Could not seek to frame"); diff --git a/src/RawFile.test.cpp b/src/RawFile.test.cpp index 4fff715..4e09ead 100644 --- a/src/RawFile.test.cpp +++ b/src/RawFile.test.cpp @@ -111,25 +111,65 @@ TEST_CASE("Read frame numbers from a raw file", "[.integration]") { } TEST_CASE("Compare reading from a numpy file with a raw file", "[.files]") { - auto fpath_raw = - test_data_path() / "raw/jungfrau" / "jungfrau_single_master_0.json"; - REQUIRE(std::filesystem::exists(fpath_raw)); - auto fpath_npy = - test_data_path() / "raw/jungfrau" / "jungfrau_single_0.npy"; - REQUIRE(std::filesystem::exists(fpath_npy)); + SECTION("jungfrau data") { + auto fpath_raw = + test_data_path() / "raw/jungfrau" / "jungfrau_single_master_0.json"; + REQUIRE(std::filesystem::exists(fpath_raw)); - File raw(fpath_raw, "r"); - File npy(fpath_npy, "r"); + auto fpath_npy = + test_data_path() / "raw/jungfrau" / "jungfrau_single_0.npy"; + REQUIRE(std::filesystem::exists(fpath_npy)); - CHECK(raw.total_frames() == 10); - CHECK(npy.total_frames() == 10); + File raw(fpath_raw, "r"); + File npy(fpath_npy, "r"); - for (size_t i = 0; i < 10; ++i) { - CHECK(raw.tell() == i); + CHECK(raw.total_frames() == 10); + CHECK(npy.total_frames() == 10); + + for (size_t i = 0; i < 10; ++i) { + CHECK(raw.tell() == i); + auto raw_frame = raw.read_frame(); + auto npy_frame = npy.read_frame(); + CHECK((raw_frame.view() == npy_frame.view())); + } + } + + SECTION("eiger quad data") { + auto fpath_raw = + test_data_path() / "raw/eiger_quad_data" / + "W13_vrpreampscan_m21C_300V_800eV_vthre2000_master_0.json"; + REQUIRE(std::filesystem::exists(fpath_raw)); + + auto fpath_npy = test_data_path() / "raw/eiger_quad_data" / + "W13_vrpreampscan_m21C_300V_800eV_vthre2000.npy"; + REQUIRE(std::filesystem::exists(fpath_npy)); + + File raw(fpath_raw, "r"); + File npy(fpath_npy, "r"); + + raw.seek(20); auto raw_frame = raw.read_frame(); + auto npy_frame = npy.read_frame(); - CHECK((raw_frame.view() == npy_frame.view())); + CHECK((raw_frame.view() == npy_frame.view())); + } + SECTION("eiger data") { + auto fpath_raw = test_data_path() / "raw/eiger" / + "Lab6_20500eV_2deg_20240629_master_7.json"; + REQUIRE(std::filesystem::exists(fpath_raw)); + + auto fpath_npy = + test_data_path() / "raw/eiger" / "Lab6_20500eV_2deg_20240629_7.npy"; + REQUIRE(std::filesystem::exists(fpath_npy)); + + File raw(fpath_raw, "r"); + File npy(fpath_npy, "r"); + + auto raw_frame = raw.read_frame(); + + auto npy_frame = npy.read_frame(); + CHECK((raw_frame.view() == npy_frame.view())); } }