diff OrthancFramework/UnitTestsSources/DicomMapTests.cpp @ 5044:6fed78e13233

Refactored DicomMap to handle sequences when needed
author Alain Mazy <am@osimis.io>
date Tue, 28 Jun 2022 17:45:09 +0200
parents 1c08cd68250a
children a9ca92ecbbc2
line wrap: on
line diff
--- a/OrthancFramework/UnitTestsSources/DicomMapTests.cpp	Mon Jun 27 15:22:19 2022 +0200
+++ b/OrthancFramework/UnitTestsSources/DicomMapTests.cpp	Tue Jun 28 17:45:09 2022 +0200
@@ -167,26 +167,6 @@
 
 }
 
-TEST(DicomMap, ExtractSequences)
-{
-  std::set<DicomTag> allTags;
-  std::set<DicomTag> sequences;
-
-  // empty list
-  DicomMap::ExtractSequences(sequences, allTags);
-  ASSERT_EQ(0u, sequences.size());
-
-  // one tag, no sequence
-  allTags.insert(DICOM_TAG_PATIENT_NAME);
-  DicomMap::ExtractSequences(sequences, allTags);
-  ASSERT_EQ(0u, sequences.size());
-
-  // one sequence
-  allTags.insert(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE);
-  DicomMap::ExtractSequences(sequences, allTags);
-  ASSERT_EQ(1u, sequences.size());
-  ASSERT_TRUE(sequences.find(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE) != sequences.end());
-}
 
 TEST(DicomMap, Tags)
 {
@@ -642,6 +622,168 @@
 }
 
 
+TEST(DicomMap, FromDicomAsJsonAndSequences)
+{
+  DicomMap m;
+  std::string jsonFullString = "{"
+   "\"0008,1090\" : "
+   "{"
+      "\"Name\" : \"ManufacturerModelName\","
+      "\"Type\" : \"String\","
+      "\"Value\" : \"MyModel\""
+   "},"
+   "\"0008,1111\" : "
+   "{"
+      "\"Name\" : \"ReferencedPerformedProcedureStepSequence\","
+      "\"Type\" : \"Sequence\","
+      "\"Value\" : "
+      "["
+         "{"
+            "\"0008,1150\" : "
+            "{"
+               "\"Name\" : \"ReferencedSOPClassUID\","
+               "\"Type\" : \"String\","
+               "\"Value\" : \"1.2.4\""
+            "},"
+            "\"0008,1155\" : "
+            "{"
+               "\"Name\" : \"ReferencedSOPInstanceUID\","
+               "\"Type\" : \"String\","
+               "\"Value\" : \"1.2.3\""
+            "}"
+         "}"
+      "]"
+   "}}";
+
+  Json::Value parsedJson;
+  bool ret = Toolbox::ReadJson(parsedJson, jsonFullString);
+  
+  m.FromDicomAsJson(parsedJson, false /* append */, true /* parseSequences*/);
+  ASSERT_TRUE(ret);
+
+  ASSERT_TRUE(m.HasTag(DicomTag(0x0008, 0x1090)));
+  ASSERT_EQ("MyModel", m.GetValue(0x0008,0x1090).GetContent());
+
+  ASSERT_TRUE(m.HasTag(DicomTag(0x0008, 0x1111)));
+  const Json::Value& jsonSequence = m.GetValue(0x0008, 0x1111).GetSequenceContent();
+  ASSERT_EQ("ReferencedSOPClassUID", jsonSequence[0]["0008,1150"]["Name"].asString());
+
+  {// serialize to human dicomAsJson
+    Json::Value dicomAsJson = Json::objectValue;
+    FromDcmtkBridge::ToJson(dicomAsJson, m, DicomToJsonFormat_Human);
+    // printf("%s", dicomAsJson.toStyledString().c_str());
+
+    ASSERT_TRUE(dicomAsJson.isMember("ManufacturerModelName"));
+    ASSERT_TRUE(dicomAsJson.isMember("ReferencedPerformedProcedureStepSequence"));
+    ASSERT_TRUE(dicomAsJson["ReferencedPerformedProcedureStepSequence"][0].isMember("ReferencedSOPClassUID"));
+    ASSERT_EQ("1.2.4", dicomAsJson["ReferencedPerformedProcedureStepSequence"][0]["ReferencedSOPClassUID"].asString());
+  }
+
+  {// serialize to full dicomAsJson
+    Json::Value dicomAsJson = Json::objectValue;
+    FromDcmtkBridge::ToJson(dicomAsJson, m, DicomToJsonFormat_Full);
+    // printf("%s", dicomAsJson.toStyledString().c_str());
+
+    ASSERT_TRUE(dicomAsJson.isMember("0008,1090"));
+    ASSERT_TRUE(dicomAsJson.isMember("0008,1111"));
+    ASSERT_TRUE(dicomAsJson["0008,1111"]["Value"][0].isMember("0008,1150"));
+    ASSERT_EQ("1.2.4", dicomAsJson["0008,1111"]["Value"][0]["0008,1150"]["Value"].asString());
+    ASSERT_EQ("MyModel", dicomAsJson["0008,1090"]["Value"].asString());
+  }
+
+  {// serialize to short dicomAsJson
+    Json::Value dicomAsJson = Json::objectValue;
+    FromDcmtkBridge::ToJson(dicomAsJson, m, DicomToJsonFormat_Short);
+    // printf("%s", dicomAsJson.toStyledString().c_str());
+
+    ASSERT_TRUE(dicomAsJson.isMember("0008,1090"));
+    ASSERT_TRUE(dicomAsJson.isMember("0008,1111"));
+    ASSERT_TRUE(dicomAsJson["0008,1111"][0].isMember("0008,1150"));
+    ASSERT_EQ("1.2.4", dicomAsJson["0008,1111"][0]["0008,1150"].asString());
+    ASSERT_EQ("MyModel", dicomAsJson["0008,1090"].asString());
+  }
+
+  {// extract sequence
+    DicomMap sequencesOnly;
+    m.ExtractSequences(sequencesOnly);
+
+    ASSERT_EQ(1, sequencesOnly.GetSize());
+    ASSERT_TRUE(sequencesOnly.HasTag(0x0008, 0x1111));
+    ASSERT_TRUE(sequencesOnly.GetValue(0x0008, 0x1111).GetSequenceContent()[0].isMember("0008,1150"));
+
+    // copy sequence
+    DicomMap sequencesCopy;
+    sequencesCopy.SetValue(0x0008, 0x1111, sequencesOnly.GetValue(0x0008, 0x1111));
+
+    ASSERT_EQ(1, sequencesCopy.GetSize());
+    ASSERT_TRUE(sequencesCopy.HasTag(0x0008, 0x1111));
+    ASSERT_TRUE(sequencesCopy.GetValue(0x0008, 0x1111).GetSequenceContent()[0].isMember("0008,1150"));
+  }
+}
+
+TEST(DicomMap, ExtractSummary)
+{
+  Json::Value v = Json::objectValue;
+  v["PatientName"] = "Hello";
+  v["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4";
+
+  {
+    Json::Value a = Json::arrayValue;
+
+    {
+      Json::Value item = Json::objectValue;
+      item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4";
+      item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.719";
+      a.append(item);
+    }
+      
+    {
+      Json::Value item = Json::objectValue;
+      item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4";  // ReferencedSOPClassUID
+      item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.726";
+      a.append(item);
+    }
+      
+    v["ReferencedImageSequence"] = a;
+  }
+    
+  {
+    Json::Value a = Json::arrayValue;
+
+    {
+      Json::Value item = Json::objectValue;
+      item["StudyInstanceUID"] = "1.2.840.113704.1.111.7016.1342451220.40";
+
+      {
+        Json::Value b = Json::arrayValue;
+
+        {
+          Json::Value c = Json::objectValue;
+          c["CodeValue"] = "122403";
+          c["0008,103e"] = "WORLD";  // Series description
+          b.append(c);
+        }
+
+        item["PurposeOfReferenceCodeSequence"] = b;
+      }
+        
+      a.append(item);
+    }
+      
+    v["RelatedSeriesSequence"] = a;
+  }
+
+  std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
+
+  DicomMap summary;
+  std::set<DicomTag> ignoreTagLength;
+  dicom->ExtractDicomSummary(summary, ORTHANC_MAXIMUM_TAG_LENGTH, ignoreTagLength);
+
+  ASSERT_TRUE(summary.HasTag(0x0008, 0x1140));
+  ASSERT_EQ("1.2.840.10008.5.1.4.1.1.4", summary.GetValue(0x0008, 0x1140).GetSequenceContent()[0]["0008,1150"]["Value"].asString());
+}
+
+
 
 TEST(DicomWebJson, Multiplicity)
 {