PixelMask: Add option to include DECTRIS pixel mask and load additional mask from dark measurement

This commit is contained in:
2025-11-04 16:29:31 +01:00
parent 8b356a7001
commit 5667a9ee65
4 changed files with 129 additions and 38 deletions
+74 -12
View File
@@ -80,8 +80,8 @@ TEST_CASE("PixelMask_MaskWrongGain","[PixelMask]") {
CHECK(mask_out[2*RAW_MODULE_SIZE + 346] != 0);
CHECK(mask_out[2*RAW_MODULE_SIZE + 347] != 0);
CHECK(mask.GetStatistics().too_high_pedestal_rms == 0);
CHECK(mask.GetStatistics().wrong_gain == 3);
CHECK(mask.GetStatistics().noisy_pixel == 0);
CHECK(mask.GetStatistics().error_pixel == 3);
CHECK(mask.GetStatistics().user_mask == 0);
image_format.MaskPixelsWithoutG0(false);
@@ -95,8 +95,8 @@ TEST_CASE("PixelMask_MaskWrongGain","[PixelMask]") {
CHECK(mask_out[2*RAW_MODULE_SIZE + 346] != 0);
CHECK(mask_out[2*RAW_MODULE_SIZE + 347] != 0);
CHECK(mask.GetStatistics().too_high_pedestal_rms == 0);
CHECK(mask.GetStatistics().wrong_gain == 2);
CHECK(mask.GetStatistics().noisy_pixel == 0);
CHECK(mask.GetStatistics().error_pixel == 2);
CHECK(mask.GetStatistics().user_mask == 0);
}
@@ -129,14 +129,14 @@ TEST_CASE("PixelMask_MaskG0RMS","[PixelMask]") {
auto mask_out = mask.GetMaskRaw(experiment);
REQUIRE(mask_out.size() == experiment.GetModulesNum() * RAW_MODULE_SIZE);
CHECK(mask_out[2*RAW_MODULE_SIZE + 245] == (1 << PixelMask::TooHighPedestalRMSPixelBit));
CHECK(mask_out[2*RAW_MODULE_SIZE + 245] == (1 << PixelMask::NoisyPixelBit));
CHECK(mask_out[2*RAW_MODULE_SIZE + 345] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask_out[2*RAW_MODULE_SIZE + 346] == ((1 << PixelMask::ErrorPixelBit) | (1 << PixelMask::TooHighPedestalRMSPixelBit)));
CHECK(mask_out[2*RAW_MODULE_SIZE + 346] == ((1 << PixelMask::ErrorPixelBit) | (1 << PixelMask::NoisyPixelBit)));
CHECK(mask_out[2*RAW_MODULE_SIZE + 347] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask.GetStatistics().too_high_pedestal_rms == 2);
CHECK(mask.GetStatistics().wrong_gain == 3);
CHECK(mask.GetStatistics().noisy_pixel == 2);
CHECK(mask.GetStatistics().error_pixel == 3);
CHECK(mask.GetStatistics().user_mask == 0);
}
@@ -169,11 +169,11 @@ TEST_CASE("PixelMask_SCs","[PixelMask]") {
CHECK(mask_out[456] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask_out[RAW_MODULE_SIZE * 1 + 324] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask_out[RAW_MODULE_SIZE * 2 + 324] == (1 << PixelMask::TooHighPedestalRMSPixelBit));
CHECK(mask_out[RAW_MODULE_SIZE * 3 + 0] == ((1 << PixelMask::ErrorPixelBit) | (1 << PixelMask::TooHighPedestalRMSPixelBit)));
CHECK(mask_out[RAW_MODULE_SIZE * 2 + 324] == (1 << PixelMask::NoisyPixelBit));
CHECK(mask_out[RAW_MODULE_SIZE * 3 + 0] == ((1 << PixelMask::ErrorPixelBit) | (1 << PixelMask::NoisyPixelBit)));
CHECK(mask.GetStatistics().too_high_pedestal_rms == 2);
CHECK(mask.GetStatistics().wrong_gain == 3);
CHECK(mask.GetStatistics().noisy_pixel == 2);
CHECK(mask.GetStatistics().error_pixel == 3);
}
TEST_CASE("PixelMask_CalculateNexusMask_UserMaskRaw","[PixelMask]") {
@@ -262,3 +262,65 @@ TEST_CASE("PixelMask_MaskDetectorGaps","[PixelMask]") {
REQUIRE(mask_export[(1030*2+8)*514 + 566] == 1);
REQUIRE(mask_export[(1030*2+8)*(514*3+36*2+12) + 566] == 1);
}
TEST_CASE("PixelMask_LoadDECTRISBadPixelMask","[PixelMask]") {
DiffractionExperiment experiment(DetJF(4,1));
PixelMask mask(experiment);
std::vector<uint32_t> det_mask(experiment.GetPixelsNum(), 0);
det_mask[0] = (1 << PixelMask::UserMaskedPixelBit);
det_mask[534] = (1 << PixelMask::UserMaskedPixelBit) | (1 << PixelMask::ModuleGapPixelBit);
det_mask[535] = (1 << PixelMask::ModuleGapPixelBit);
det_mask[2 * 1000 * 5] = (1 << 3);
det_mask[2 * 1000 * 5 + 3] = (1 << 2);
det_mask[2 * 1000 * 5 + 4] = (1 << PixelMask::NoisyPixelBit);
det_mask[23 * 1000 * 5] = (1 << 5) | (1 << PixelMask::UserMaskedPixelBit);
mask.LoadDECTRISBadPixelMask(det_mask);
CHECK(mask.GetStatistics().user_mask == 2);
CHECK(mask.GetStatistics().error_pixel == 4);
CHECK(mask.GetStatistics().noisy_pixel == 0);
CHECK(mask.GetMask()[0] == (1 << PixelMask::UserMaskedPixelBit));
CHECK(mask.GetMask()[534] == (1 << PixelMask::ModuleGapPixelBit));
CHECK(mask.GetMask()[535] == (1 << PixelMask::ModuleGapPixelBit));
CHECK(mask.GetMask()[2 * 1000 * 5] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask.GetMask()[2 * 1000 * 5 + 3] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask.GetMask()[2 * 1000 * 5 + 4] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask.GetMask()[23 * 1000 * 5] == ((1 << PixelMask::ErrorPixelBit) | (1 << PixelMask::UserMaskedPixelBit)));
}
TEST_CASE("PixelMask_LoadDarkBadPixelMask","[PixelMask]") {
DiffractionExperiment experiment(DetJF(4,1));
PixelMask mask(experiment);
std::vector<uint32_t> det_mask(experiment.GetPixelsNum(), 0);
det_mask[0] = (1 << PixelMask::UserMaskedPixelBit);
det_mask[534] = (1 << PixelMask::UserMaskedPixelBit) | (1 << PixelMask::ModuleGapPixelBit);
det_mask[535] = (1 << PixelMask::ModuleGapPixelBit);
det_mask[2 * 1000 * 5] = (1 << 3);
det_mask[2 * 1000 * 5 + 3] = (1 << 2);
det_mask[2 * 1000 * 5 + 4] = (1 << PixelMask::NoisyPixelBit);
det_mask[23 * 1000 * 5] = (1 << 5) | (1 << PixelMask::UserMaskedPixelBit);
mask.LoadDECTRISBadPixelMask(det_mask);
std::vector<uint32_t> dark_mask(experiment.GetPixelsNum(), 0);
dark_mask[0] = 1; // user masked, should be included
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);
CHECK(mask.GetStatistics().user_mask == 2);
CHECK(mask.GetStatistics().error_pixel == 4);
CHECK(mask.GetStatistics().noisy_pixel == 2);
CHECK(mask.GetMask()[0] == (1 << PixelMask::UserMaskedPixelBit | 1 << PixelMask::NoisyPixelBit));
CHECK(mask.GetMask()[534] == (1 << PixelMask::ModuleGapPixelBit));
CHECK(mask.GetMask()[2 * 1000 * 5] == (1 << PixelMask::ErrorPixelBit));
CHECK(mask.GetMask()[67867] == (1 << PixelMask::NoisyPixelBit));
}