comparison OrthancStone/UnitTestsSources/DicomTests.cpp @ 2076:990f396484b1

fix rendering of RT-DOSE with negative GridFrameOffsetVector
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 11 Jul 2023 15:58:16 +0200
parents a2955abe4c2e
children 07964689cb0b
comparison
equal deleted inserted replaced
2075:d84bdcbd8bf1 2076:990f396484b1
52 ASSERT_EQ("my_sop", p->GetSopInstanceUid()); 52 ASSERT_EQ("my_sop", p->GetSopInstanceUid());
53 ASSERT_EQ(OrthancStone::SopClassUid_Other, p->GetSopClassUid()); 53 ASSERT_EQ(OrthancStone::SopClassUid_Other, p->GetSopClassUid());
54 ASSERT_EQ(1u, p->GetNumberOfFrames()); 54 ASSERT_EQ(1u, p->GetNumberOfFrames());
55 ASSERT_EQ(0u, p->GetWidth()); 55 ASSERT_EQ(0u, p->GetWidth());
56 ASSERT_EQ(0u, p->GetHeight()); 56 ASSERT_EQ(0u, p->GetHeight());
57 ASSERT_TRUE(OrthancStone::LinearAlgebra::IsCloseToZero(p->GetSliceThickness())); 57 ASSERT_FALSE(p->HasSliceThickness());
58 ASSERT_THROW(p->GetSliceThickness(), Orthanc::OrthancException);
58 ASSERT_FLOAT_EQ(1, p->GetPixelSpacingX()); 59 ASSERT_FLOAT_EQ(1, p->GetPixelSpacingX());
59 ASSERT_FLOAT_EQ(1, p->GetPixelSpacingY()); 60 ASSERT_FLOAT_EQ(1, p->GetPixelSpacingY());
60 ASSERT_FALSE(p->GetGeometry().IsValid()); 61 ASSERT_FALSE(p->GetGeometry().IsValid());
61 ASSERT_THROW(p->GetImageInformation(), Orthanc::OrthancException); 62 ASSERT_THROW(p->GetImageInformation(), Orthanc::OrthancException);
62 ASSERT_FALSE(p->GetFrameGeometry(0).IsValid()); 63 ASSERT_FALSE(p->GetFrameGeometry(0).IsValid());
79 ASSERT_TRUE(p->GetDoseUnits().empty()); 80 ASSERT_TRUE(p->GetDoseUnits().empty());
80 ASSERT_DOUBLE_EQ(1.0, p->GetDoseGridScaling()); 81 ASSERT_DOUBLE_EQ(1.0, p->GetDoseGridScaling());
81 ASSERT_DOUBLE_EQ(1.0, p->ApplyRescale(1.0)); 82 ASSERT_DOUBLE_EQ(1.0, p->ApplyRescale(1.0));
82 83
83 double s; 84 double s;
84 ASSERT_FALSE(p->ComputeRegularSpacing(s)); 85 ASSERT_FALSE(p->ComputeFrameOffsetsSpacing(s));
85 ASSERT_TRUE(p->GetFrameOfReferenceUid().empty()); 86 ASSERT_TRUE(p->GetFrameOfReferenceUid().empty());
86 } 87 }
87 88
88 89
89 TEST(DicomInstanceParameters, Windowing) 90 TEST(DicomInstanceParameters, Windowing)
221 s2.SetDicomWebThroughOrthancSource("server2"); 222 s2.SetDicomWebThroughOrthancSource("server2");
222 ASSERT_FALSE(s1.IsSameSource(s2)); 223 ASSERT_FALSE(s1.IsSameSource(s2));
223 } 224 }
224 } 225 }
225 } 226 }
227
228
229 TEST(DicomInstanceParameters, ReverseFrameOffsetsGrid)
230 {
231 Orthanc::DicomMap m;
232 SetupUids(m);
233
234 m.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-276.611\\-274.463\\100", false);
235 m.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "1\\0\\0\\0\\1\\0", false);
236 m.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "126", false);
237 m.SetValue(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, "0\\-2\\-4\\-6\\-8\\-10\\-12\\-14\\-16\\-18\\-20\\-22\\-24\\-26\\-28\\-30\\-32\\-34\\-36\\-38\\-40\\-42\\-44\\-46\\-48\\-50\\-52\\-54\\-56\\-58\\-60\\-62\\-64\\-66\\-68\\-70\\-72\\-74\\-76\\-78\\-80\\-82\\-84\\-86\\-88\\-90\\-92\\-94\\-96\\-98\\-100\\-102\\-104\\-106\\-108\\-110\\-112\\-114\\-116\\-118\\-120\\-122\\-124\\-126\\-128\\-130\\-132\\-134\\-136\\-138\\-140\\-142\\-144\\-146\\-148\\-150\\-152\\-154\\-156\\-158\\-160\\-162\\-164\\-166\\-168\\-170\\-172\\-174\\-176\\-178\\-180\\-182\\-184\\-186\\-188\\-190\\-192\\-194\\-196\\-198\\-200\\-202\\-204\\-206\\-208\\-210\\-212\\-214\\-216\\-218\\-220\\-222\\-224\\-226\\-228\\-230\\-232\\-234\\-236\\-238\\-240\\-242\\-244\\-246\\-248\\-250", false);
238
239 std::unique_ptr<OrthancStone::DicomInstanceParameters> p;
240 p.reset(OrthancStone::DicomInstanceParameters(m).Clone());
241
242 ASSERT_FALSE(p->HasSliceThickness());
243 ASSERT_THROW(p->GetSliceThickness(), Orthanc::OrthancException);
244
245 double s;
246 ASSERT_TRUE(p->ComputeFrameOffsetsSpacing(s));
247 ASSERT_DOUBLE_EQ(s, 2.0);
248 ASSERT_TRUE(p->IsReversedFrameOffsets());
249
250 ASSERT_DOUBLE_EQ(1, p->GetMultiFrameGeometry().GetAxisX() [0]);
251 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisX() [1]);
252 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisX() [2]);
253
254 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisY() [0]);
255 ASSERT_DOUBLE_EQ(1, p->GetMultiFrameGeometry().GetAxisY() [1]);
256 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisY() [2]);
257
258 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetNormal() [0]);
259 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetNormal() [1]);
260 ASSERT_DOUBLE_EQ(1, p->GetMultiFrameGeometry().GetNormal() [2]);
261
262 ASSERT_DOUBLE_EQ(-276.611, p->GetMultiFrameGeometry().GetOrigin() [0]);
263 ASSERT_DOUBLE_EQ(-274.463, p->GetMultiFrameGeometry().GetOrigin() [1]);
264 ASSERT_DOUBLE_EQ(100.0 - 250.0, p->GetMultiFrameGeometry().GetOrigin() [2]);
265 }
266
267
268 TEST(DicomInstanceParameters, StandardFrameOffsetsGrid)
269 {
270 Orthanc::DicomMap m;
271 SetupUids(m);
272
273 m.SetValue(Orthanc::DICOM_TAG_SLICE_THICKNESS, "2", false);
274 m.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-205.2157\\-388.4679\\-120", false);
275 m.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "1\\0\\0\\0\\1\\0", false);
276 m.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "155", false);
277 m.SetValue(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, "0\\2\\4\\6\\8\\10\\12\\14\\16\\18\\20\\22\\24\\26\\28\\30\\32\\34\\36\\38\\40\\42\\44\\46\\48\\50\\52\\54\\56\\58\\60\\62\\64\\66\\68\\70\\72\\74\\76\\78\\80\\82\\84\\86\\88\\90\\92\\94\\96\\98\\100\\102\\104\\106\\108\\110\\112\\114\\116\\118\\120\\122\\124\\126\\128\\130\\132\\134\\136\\138\\140\\142\\144\\146\\148\\150\\152\\154\\156\\158\\160\\162\\164\\166\\168\\170\\172\\174\\176\\178\\180\\182\\184\\186\\188\\190\\192\\194\\196\\198\\200\\202\\204\\206\\208\\210\\212\\214\\216\\218\\220\\222\\224\\226\\228\\230\\232\\234\\236\\238\\240\\242\\244\\246\\248\\250\\252\\254\\256\\258\\260\\262\\264\\266\\268\\270\\272\\274\\276\\278\\280\\282\\284\\286\\288\\290\\292\\294\\296\\298\\300\\302\\304\\306\\308", false);
278
279 std::unique_ptr<OrthancStone::DicomInstanceParameters> p;
280 p.reset(OrthancStone::DicomInstanceParameters(m).Clone());
281
282 ASSERT_TRUE(p->HasSliceThickness());
283 ASSERT_DOUBLE_EQ(2.0, p->GetSliceThickness());
284
285 double s;
286 ASSERT_TRUE(p->ComputeFrameOffsetsSpacing(s));
287 ASSERT_DOUBLE_EQ(s, 2.0);
288 ASSERT_FALSE(p->IsReversedFrameOffsets());
289
290 ASSERT_DOUBLE_EQ(1, p->GetMultiFrameGeometry().GetAxisX() [0]);
291 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisX() [1]);
292 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisX() [2]);
293
294 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisY() [0]);
295 ASSERT_DOUBLE_EQ(1, p->GetMultiFrameGeometry().GetAxisY() [1]);
296 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetAxisY() [2]);
297
298 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetNormal() [0]);
299 ASSERT_DOUBLE_EQ(0, p->GetMultiFrameGeometry().GetNormal() [1]);
300 ASSERT_DOUBLE_EQ(1, p->GetMultiFrameGeometry().GetNormal() [2]);
301
302 ASSERT_DOUBLE_EQ(-205.2157, p->GetMultiFrameGeometry().GetOrigin() [0]);
303 ASSERT_DOUBLE_EQ(-388.4679, p->GetMultiFrameGeometry().GetOrigin() [1]);
304 ASSERT_DOUBLE_EQ(-120.0, p->GetMultiFrameGeometry().GetOrigin() [2]);
305 }