Detector Geometry customization

This commit is contained in:
2023-04-12 19:22:13 +00:00
parent 94ba13b3a1
commit 0973f3725d
52 changed files with 1335 additions and 973 deletions
+108 -62
View File
@@ -172,10 +172,11 @@ TEST_CASE("DiffractionExperiment_UnitCell","[DiffractionExperiment]") {
}
TEST_CASE("DiffractionExperiment_IPv4Address","[DiffractionExperiment]") {
DiffractionExperiment x(1, {4, 4, 4});
DiffractionExperiment x(DetectorGeometry(12));
x.Mode(DetectorMode::Conversion);
uint32_t ndatastreams = 3;
x.DataStreams(ndatastreams);
REQUIRE(x.GetDestIPv4Address(0) == 0x0132010a);
REQUIRE(x.GetDestIPv4Address(1) == 0x0232010a);
@@ -226,8 +227,8 @@ TEST_CASE("MacAddressFromStr","") {
}
TEST_CASE("DiffractionExperiment_UDPAddress","[DiffractionExperiment]") {
DiffractionExperiment x(1, {4, 4, 4});
x.Mode(DetectorMode::Conversion);
DiffractionExperiment x(DetectorGeometry(12));
x.Mode(DetectorMode::Conversion).DataStreams(3);
REQUIRE(x.GetDestUDPPort(0, 0) % 64 == 0);
REQUIRE(x.GetDestUDPPort(0, 2) % 64 == 0);
@@ -251,85 +252,124 @@ TEST_CASE("DiffractionExperiment_UDPAddress","[DiffractionExperiment]") {
}
TEST_CASE("DiffractionExperiment_DataStreams","[DiffractionExperiment]") {
DiffractionExperiment x(DetectorGeometry(18)); // 9M
x.DataStreams(4);
REQUIRE(x.GetModulesNum() == 18);
REQUIRE(x.GetDataStreamsNum() == 4);
REQUIRE(x.GetModulesNum(0) == 5);
REQUIRE(x.GetModulesNum(1) == 5);
REQUIRE(x.GetModulesNum(2) == 4);
REQUIRE(x.GetModulesNum(3) == 4);
REQUIRE_THROWS(x.GetModulesNum(4));
x.DataStreams(2);
REQUIRE(x.GetModulesNum() == 18);
REQUIRE(x.GetDataStreamsNum() == 2);
REQUIRE(x.GetModulesNum(0) == 9);
REQUIRE(x.GetModulesNum(1) == 9);
REQUIRE_THROWS(x.GetModulesNum(2));
x = DiffractionExperiment(DetectorGeometry(2));
x.DataStreams(2);
REQUIRE(x.GetModulesNum() == 2);
REQUIRE(x.GetDataStreamsNum() == 2);
REQUIRE(x.GetModulesNum(0) == 1);
REQUIRE(x.GetModulesNum(1) == 1);
x.DataStreams(5);
REQUIRE(x.GetModulesNum() == 2);
REQUIRE(x.GetDataStreamsNum() == 2);
REQUIRE(x.GetModulesNum(0) == 1);
REQUIRE(x.GetModulesNum(1) == 1);
}
TEST_CASE("DiffractionExperiment_DetectorGeometry","[DiffractionExperiment]") {
DiffractionExperiment x(1, {4, 4, 6, 6}); // 10M configuration #1 - via constructor
DiffractionExperiment x(DetectorGeometry(18)); // 9M configuration #1 - via constructor
x.Mode(DetectorMode::Conversion);
x.DataStreams(4);
REQUIRE(x.GetDataStreamsNum() == 4);
REQUIRE(x.GetXPixelsNum() == 1030);
REQUIRE(x.GetYPixelsNum() == 514 * 20);
REQUIRE(x.GetYPixelsNum() == 514 * 18);
REQUIRE(x.GetModulesNum() == 20);
REQUIRE(x.GetModulesNum(TASK_NO_DATA_STREAM) == 20);
REQUIRE(x.GetModulesNum(0) == 4);
REQUIRE(x.GetModulesNum(2) == 6);
REQUIRE(x.GetModulesNum() == 18);
REQUIRE(x.GetModulesNum(TASK_NO_DATA_STREAM) == 18);
REQUIRE(x.GetModulesNum(0) == 5);
REQUIRE(x.GetModulesNum(2) == 4);
REQUIRE(x.GetFirstModuleOfDataStream(TASK_NO_DATA_STREAM) == 0);
REQUIRE(x.GetFirstModuleOfDataStream(0) == 0);
REQUIRE(x.GetFirstModuleOfDataStream(1) == 4);
REQUIRE(x.GetFirstModuleOfDataStream(2) == 8);
REQUIRE(x.GetFirstModuleOfDataStream(1) == 5);
REQUIRE(x.GetFirstModuleOfDataStream(2) == 10);
REQUIRE(x.GetFirstModuleOfDataStream(3) == 14);
REQUIRE(x.GetPixelsNum() == 20 * 514 * 1030);
REQUIRE(x.GetPixelsNum() == 18 * 514 * 1030);
x.Mode(DetectorMode::Raw);
REQUIRE(x.GetPixelsNum() == 20 * 512 * 1024);
REQUIRE(x.GetPixelsNum() == 18 * 512 * 1024);
REQUIRE(x.GetXPixelsNum() == 1024);
REQUIRE(x.GetYPixelsNum() == 512 * 20);
REQUIRE(x.GetYPixelsNum() == 512 * 18);
x.Mode(DetectorMode::Conversion);
x = DiffractionExperiment(2, {4, 4, 6, 6}, 0, 0, true); // 10M configuration #2
x = DiffractionExperiment(DetectorGeometry(18, 2)); // 9M configuration #2
REQUIRE(x.GetPixelsNum() == 1030 * 514 * 20);
REQUIRE(x.GetPixelsNum() == 1030 * 514 * 18);
REQUIRE(x.GetXPixelsNum() == 1030 * 2);
REQUIRE(x.GetYPixelsNum() == 514 * 20 / 2);
REQUIRE(x.GetYPixelsNum() == 514 * 18 / 2);
REQUIRE(x.GetPixel0OfModule(0) == 18 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(1) == 18 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(0) == 16 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(1) == 16 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(12) == 6 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(13) == 6 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(12) == 4 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(13) == 4 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(14) == 4 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(15) == 4 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(14) == 2 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(15) == 2 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(16) == 2 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(17) == 2 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(16) == 0 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(17) == 0 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE(x.GetPixel0OfModule(18) == 0 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2);
REQUIRE(x.GetPixel0OfModule(19) == 0 * CONVERTED_MODULE_SIZE + 513 * CONVERTED_MODULE_COLS * 2 + CONVERTED_MODULE_COLS);
REQUIRE_THROWS(x.GetPixel0OfModule(20));
REQUIRE_THROWS(x.GetPixel0OfModule(18));
x.Mode(DetectorMode::Raw);
REQUIRE(x.GetPixelsNum() == 1024 * 512 * 20);
REQUIRE(x.GetPixelsNum() == 1024 * 512 * 18);
REQUIRE(x.GetXPixelsNum() == 1024);
REQUIRE(x.GetYPixelsNum() == 512 * 20);
REQUIRE(x.GetYPixelsNum() == 512 * 18);
REQUIRE(x.GetPixel0OfModule(15) == 15 * RAW_MODULE_SIZE);
}
TEST_CASE("DiffractionExperiment_DetectorGeometry_gaps","[DiffractionExperiment]") {
const size_t gap_x = 8;
const size_t gap_y = 36;
DiffractionExperiment x(2, {4, 4, 6, 6}, gap_x,gap_y, false);
DiffractionExperiment x(DetectorGeometry(18, 2, gap_x, gap_y, false));
x.Mode(DetectorMode::Conversion);
x.DataStreams(4);
REQUIRE(x.GetDataStreamsNum() == 4);
REQUIRE(x.GetPixelsNum() == (1030 * 2 + gap_x) * (514 * 10 + (10-1) * gap_y) );
REQUIRE(x.GetXPixelsNum() == 1030 * 2 +gap_x);
REQUIRE(x.GetYPixelsNum() == 514 * 10 + (10-1) * gap_y);
REQUIRE(x.GetPixelsNum() == (1030 * 2 + gap_x) * (514 * 9 + (9-1) * gap_y) );
REQUIRE(x.GetXPixelsNum() == 1030 * 2 + gap_x);
REQUIRE(x.GetYPixelsNum() == 514 * 9 + (9-1) * gap_y);
REQUIRE(x.GetModulesNum() == 20);
REQUIRE(x.GetModulesNum(0) == 4);
REQUIRE(x.GetModulesNum(2) == 6);
REQUIRE(x.GetModulesNum() == 18);
REQUIRE(x.GetModulesNum(0) == 5);
REQUIRE(x.GetModulesNum(2) == 4);
REQUIRE(x.GetFirstModuleOfDataStream(0) == 0);
REQUIRE(x.GetFirstModuleOfDataStream(1) == 4);
REQUIRE(x.GetFirstModuleOfDataStream(2) == 8);
REQUIRE(x.GetFirstModuleOfDataStream(1) == 5);
REQUIRE(x.GetFirstModuleOfDataStream(2) == 10);
REQUIRE(x.GetFirstModuleOfDataStream(3) == 14);
REQUIRE(x.GetPixel0OfModule(0) == (2*1030 + gap_x) * (514 + gap_y) * (0/2));
@@ -340,16 +380,15 @@ TEST_CASE("DiffractionExperiment_DetectorGeometry_gaps","[DiffractionExperiment]
REQUIRE(x.GetPixel0OfModule(0) == (2*1030 + gap_x) * 0 * (514 + gap_y));
REQUIRE(x.GetPixel0OfModule(1) == (2*1030 + gap_x) * 0 * (514 + gap_y) + 1030 + gap_x);
REQUIRE(x.GetPixel0OfModule(18) == (2*1030 + gap_x) * 9 * (514 + gap_y));
REQUIRE(x.GetPixel0OfModule(19) == (2*1030 + gap_x) * 9 * (514 + gap_y) + 1030 + gap_x);
REQUIRE(x.GetPixel0OfModule(16) == (2*1030 + gap_x) * 8 * (514 + gap_y));
REQUIRE(x.GetPixel0OfModule(17) == (2*1030 + gap_x) * 8 * (514 + gap_y) + 1030 + gap_x);
}
TEST_CASE("DiffractionExperiment_DetectorGeometry_gaps_mirror_y","[DiffractionExperiment]") {
const size_t gap_x = 8;
const size_t gap_y = 36;
DiffractionExperiment x(2, {4, 4, 6, 6}, gap_x,gap_y, true);
DiffractionExperiment x(DetectorGeometry(20, 2, gap_x, gap_y, true));
x.Mode(DetectorMode::Conversion);
REQUIRE(x.GetPixel0OfModule(0) == (2*1030+gap_x) * 513 + (2*1030 + gap_x) * 9 * (514 + gap_y));
@@ -502,7 +541,8 @@ TEST_CASE("DiffractionExperiment_FrameCountTime","[DiffractionExperiment]") {
}
TEST_CASE("DiffractionExperiment_ExportProtobuf","[DiffractionExperiment]") {
DiffractionExperiment x(4, {4, 4, 8}, 0, 0, false),y;
DiffractionExperiment x(DetectorGeometry(16, 4, 0, 0, false)),y;
x.DataStreams(3);
std::vector<DetectorMode> v = {DetectorMode::Raw, DetectorMode::Conversion,
DetectorMode::PedestalG0, DetectorMode::PedestalG1, DetectorMode::PedestalG2};
@@ -517,8 +557,7 @@ TEST_CASE("DiffractionExperiment_ExportProtobuf","[DiffractionExperiment]") {
JFJochProtoBuf::JungfraujochSettings settings_in_protobuf = x;
REQUIRE_NOTHROW(y.Import(settings_in_protobuf));
REQUIRE(! y.IsUpsideDown());
REQUIRE(y.GetFilePrefix() == x.GetFilePrefix());
REQUIRE(y.GetFilePrefix() == x.GetFilePrefix());
REQUIRE(x.GetDataStreamsNum() == y.GetDataStreamsNum());
REQUIRE(x.GetXPixelsNum() == y.GetXPixelsNum());
REQUIRE(x.GetModulesNum(2) == y.GetModulesNum(2));
@@ -577,7 +616,7 @@ TEST_CASE("DiffractionExperiment_CopyConstructor", "[DiffractionExperiment]") {
}
TEST_CASE("DiffractionExperiment_ResToPxl","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
x.DetectorDistance_mm(75).PhotonEnergy_keV(WVL_1A_IN_KEV);
// sin(theta) = 1/2
@@ -592,7 +631,7 @@ TEST_CASE("DiffractionExperiment_ResToPxl","[DiffractionExperiment]") {
}
TEST_CASE("DiffractionExperiment_RadialIntegration_LowQ","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
REQUIRE_THROWS(x.LowQForRadialInt_recipA(0));
REQUIRE_THROWS(x.LowQForRadialInt_recipA(-1));
@@ -613,7 +652,7 @@ TEST_CASE("DiffractionExperiment_RadialIntegration_LowQ","[DiffractionExperiment
TEST_CASE("DiffractionExperiment_RadialIntegration_HighQ","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
REQUIRE_THROWS(x.HighQForRadialInt_recipA(0));
REQUIRE_THROWS(x.HighQForRadialInt_recipA(-1));
@@ -633,7 +672,7 @@ TEST_CASE("DiffractionExperiment_RadialIntegration_HighQ","[DiffractionExperimen
}
TEST_CASE("DiffractionExperiment_RadialIntegration_QSpacing","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
x.QSpacingForRadialInt_recipA(0.456);
REQUIRE(x.GetQSpacingForRadialInt_recipA() == Approx(0.456));
@@ -643,7 +682,7 @@ TEST_CASE("DiffractionExperiment_RadialIntegration_QSpacing","[DiffractionExperi
}
TEST_CASE("DiffractionExperiment_IndexingPeriod","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
x.DetectorDistance_mm(75).PhotonEnergy_keV(WVL_1A_IN_KEV);
x.FrameTime(1ms).Summation(3);
x.IndexingPeriod(9ms);
@@ -729,7 +768,7 @@ TEST_CASE("DiffractionExperiment_DetectorType","[DiffractionExperiment]") {
}
TEST_CASE("DiffractionExperiment_DetectorInput_MultiTriggger","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
x.FrameTime(700us).Summation(1).ImagesPerTrigger(350).NumTriggers(7);
JFJochProtoBuf::DetectorInput ret = x;
REQUIRE(ret.modules_num() == 8);
@@ -742,7 +781,7 @@ TEST_CASE("DiffractionExperiment_DetectorInput_MultiTriggger","[DiffractionExper
}
TEST_CASE("DiffractionExperiment_DetectorInput_NoTriggger","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
x.FrameTime(1200us).Summation(1).ImagesPerTrigger(350).NumTriggers(1);
JFJochProtoBuf::DetectorInput ret = x;
REQUIRE(ret.modules_num() == 8);
@@ -755,7 +794,7 @@ TEST_CASE("DiffractionExperiment_DetectorInput_NoTriggger","[DiffractionExperime
}
TEST_CASE("DiffractionExperiment_DetectorInput_PedestalG2","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
x.FrameTime(1200us).Summation(1).PedestalG2Frames(4560).NumTriggers(1).Mode(DetectorMode::PedestalG2);
JFJochProtoBuf::DetectorInput ret = x;
REQUIRE(ret.modules_num() == 8);
@@ -767,7 +806,7 @@ TEST_CASE("DiffractionExperiment_DetectorInput_PedestalG2","[DiffractionExperime
}
TEST_CASE("DiffractionExperiment_DetectorInput_StorageCell","[DiffractionExperiment]") {
DiffractionExperiment x(2, {4,4}, 8, 36);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
x.FrameTime(1200us).Summation(1).NumTriggers(4560).StorageCells(8);
JFJochProtoBuf::DetectorInput ret = x;
REQUIRE(ret.modules_num() == 8);
@@ -958,7 +997,7 @@ TEST_CASE("DiffractionExperiment_ConversionOnCPU","[DiffractionExperiment]") {
}
TEST_CASE("DiffractionExperiment_Binning","[DiffractionExperiment]") {
DiffractionExperiment x(2,{4,4}, 8, 36, true);
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36, true));
x.Mode(DetectorMode::Conversion).BeamX_pxl(200.0).BeamY_pxl(400.0);
REQUIRE(!x.GetBinning2x2());
@@ -966,6 +1005,10 @@ TEST_CASE("DiffractionExperiment_Binning","[DiffractionExperiment]") {
REQUIRE(x.GetXPixelsNum() == 2068);
REQUIRE(x.GetYPixelsNum() == 2164);
REQUIRE(x.GetXPixelsNumFullImage() == 2068);
REQUIRE(x.GetYPixelsNumFullImage() == 2164);
REQUIRE(x.GetPixelsNumFullImage() == 2164*2068);
REQUIRE(x.GetBeamX_pxl() == Approx(200.0));
REQUIRE(x.GetBeamY_pxl() == Approx(400.0));
REQUIRE(x.GetPixel0OfModule(0) == (2164 - 1)*2068);
@@ -974,16 +1017,19 @@ TEST_CASE("DiffractionExperiment_Binning","[DiffractionExperiment]") {
REQUIRE(x.GetBinning2x2());
REQUIRE(x.GetPixelSize_mm() == Approx(2*PIXEL_SIZE_IN_MM));
REQUIRE(x.GetXPixelsNumFullImage() == 2068);
REQUIRE(x.GetXPixelsNum() == 2068/2);
REQUIRE(x.GetYPixelsNumFullImage() == 2164);
REQUIRE(x.GetYPixelsNum() == 2164/2);
REQUIRE(x.GetPixelsNumFullImage() == 2164*2068);
REQUIRE(x.GetPixelsNum() == (2164/2)*(2068/2));
REQUIRE(x.GetBeamX_pxl() == Approx(100.0));
REQUIRE(x.GetBeamY_pxl() == Approx(200.0));
REQUIRE(x.GetPixel0OfModule(0) == ((2164 - 1)/2)*(2068/2));
REQUIRE(x.GetPixel0OfModule(1) == ((2164 - 1)/2)*(2068/2) + (1030+8)/2);
REQUIRE(x.GetPixel0OfModule(6) == ((2164 - 1)/2)*(2068/2) - 3 * ((514+36)/2)*(2068/2));
REQUIRE(x.GetPixel0OfModule(7) == ((2164 - 1)/2)*(2068/2) - 3 * ((514+36)/2)*(2068/2) + (1030+8)/2);
REQUIRE(x.GetPixel0OfModule(0) == ((2164 - 1))*(2068));
REQUIRE(x.GetPixel0OfModule(1) == ((2164 - 1))*(2068) + (1030+8));
REQUIRE(x.GetPixel0OfModule(6) == ((2164 - 1))*(2068) - 3 * ((514+36))*(2068));
REQUIRE(x.GetPixel0OfModule(7) == ((2164 - 1))*(2068) - 3 * ((514+36))*(2068) + (1030+8));
x.Mode(DetectorMode::Raw);
REQUIRE(!x.GetBinning2x2());