PixelMask: Precalculate raw maskto avoid copying it in the later code

This commit is contained in:
2026-05-01 12:58:42 +02:00
parent 6e0bb971ac
commit d8be435be6
7 changed files with 86 additions and 24 deletions
+37 -7
View File
@@ -10,7 +10,7 @@ TEST_CASE("PixelMask_MaskModuleEdges","[PixelMask]") {
PixelMask mask(experiment);
auto mask_out = mask.GetMaskRaw(experiment);
auto mask_out = mask.GetMaskRaw();
REQUIRE(mask_out.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
@@ -33,7 +33,7 @@ TEST_CASE("PixelMask_MaskChipEdges","[PixelMask]") {
experiment.MaskChipEdges(true).MaskModuleEdges(false).Raw();
PixelMask mask(experiment);
auto mask_out = mask.GetMaskRaw(experiment);
auto mask_out = mask.GetMaskRaw();
REQUIRE(mask_out.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
CHECK(mask_out[255] == (1u<<31));
@@ -73,7 +73,7 @@ TEST_CASE("PixelMask_MaskWrongGain","[PixelMask]") {
mask.LoadDetectorBadPixelMask(experiment, &calibration);
auto mask_out = mask.GetMaskRaw(experiment);
auto mask_out = mask.GetMaskRaw();
REQUIRE(mask_out.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
CHECK(mask_out[2*RAW_MODULE_SIZE + 345] != 0);
@@ -89,7 +89,7 @@ TEST_CASE("PixelMask_MaskWrongGain","[PixelMask]") {
REQUIRE(!experiment.IsMaskPixelsWithoutG0());
mask.LoadDetectorBadPixelMask(experiment, &calibration);
mask_out = mask.GetMaskRaw(experiment);
mask_out = mask.GetMaskRaw();
CHECK(mask_out[2*RAW_MODULE_SIZE + 345] == 0);
CHECK(mask_out[2*RAW_MODULE_SIZE + 346] != 0);
@@ -126,7 +126,7 @@ TEST_CASE("PixelMask_MaskG0RMS","[PixelMask]") {
mask.LoadDetectorBadPixelMask(experiment, &calibration);
auto mask_out = mask.GetMaskRaw(experiment);
auto mask_out = mask.GetMaskRaw();
REQUIRE(mask_out.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
CHECK(mask_out[2*RAW_MODULE_SIZE + 245] == (1 << PixelMask::NoisyPixelBit));
@@ -164,7 +164,7 @@ TEST_CASE("PixelMask_SCs","[PixelMask]") {
mask.LoadDetectorBadPixelMask(experiment, &calibration);
auto mask_out = mask.GetMaskRaw(experiment);
auto mask_out = mask.GetMaskRaw();
REQUIRE(mask_out.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
CHECK(mask_out[456] == (1 << PixelMask::ErrorPixelBit));
@@ -199,6 +199,10 @@ TEST_CASE("PixelMask_CalculateNexusMask_UserMaskConv","[PixelMask]") {
REQUIRE(user_mask_v[1030 * 700 + 300] == 1);
REQUIRE(user_mask_v[(1030+8)*514] == 0);
experiment.Raw();
const auto &raw_mask_v = mask.GetMask(experiment);
REQUIRE(raw_mask_v.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
}
TEST_CASE("PixelMask_MaskDetectorGaps","[PixelMask]") {
@@ -271,7 +275,7 @@ TEST_CASE("PixelMask_LoadDarkBadPixelMask","[PixelMask]") {
dark_mask[534] = 1; // On gap, should be ignored
dark_mask[2 * 1000 * 5] = 1; // bad pixel, should be ignored
dark_mask[67867] = 1; // Nothing else, should be included
mask.LoadDarkBadPixelMask(dark_mask);
mask.LoadDarkBadPixelMask(experiment, dark_mask);
CHECK(mask.GetStatistics().user_mask == 2);
CHECK(mask.GetStatistics().error_pixel == 4);
@@ -282,4 +286,30 @@ TEST_CASE("PixelMask_LoadDarkBadPixelMask","[PixelMask]") {
CHECK(mask.GetMask()[534] == (1 << PixelMask::ModuleGapPixelBit));
CHECK(mask.GetMask()[2 * 1000 * 5] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask.GetMask()[67867] == (1 << PixelMask::NoisyPixelBit));
}
TEST_CASE("PixelMask_LoadUserMaskRaw_UpdatesCachedRawMask", "[PixelMask]") {
DiffractionExperiment experiment(DetJF(1, 1));
experiment.MaskModuleEdges(true).MaskChipEdges(false).Raw();
PixelMask mask(experiment);
std::vector<uint32_t> raw_user_mask(experiment.GetModulesNum() * RAW_MODULE_SIZE, 0);
raw_user_mask[345] = 1;
REQUIRE_NOTHROW(mask.LoadUserMask(experiment, raw_user_mask));
const auto &raw_mask_out = mask.GetMaskRaw();
REQUIRE(raw_mask_out.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
CHECK((raw_mask_out[345] & (1u << PixelMask::UserMaskedPixelBit)) != 0);
CHECK((raw_mask_out[0] & (1u << PixelMask::ModuleEdgePixelBit)) != 0);
}
TEST_CASE("PixelMask_GetMaskRaw_ThrowsForDECTRIS", "[PixelMask]") {
DiffractionExperiment experiment(DetDECTRIS(2068, 2164, "Test", ""));
PixelMask mask(experiment);
REQUIRE_THROWS(mask.GetMaskRaw());
REQUIRE(mask.GetMask(experiment).size() == experiment.GetPixelsNum());
}