comparison 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
comparison
equal deleted inserted replaced
5043:ec5c203a97ea 5044:6fed78e13233
165 ASSERT_NE(defaultInstanceSignature, instanceSignature); 165 ASSERT_NE(defaultInstanceSignature, instanceSignature);
166 } 166 }
167 167
168 } 168 }
169 169
170 TEST(DicomMap, ExtractSequences)
171 {
172 std::set<DicomTag> allTags;
173 std::set<DicomTag> sequences;
174
175 // empty list
176 DicomMap::ExtractSequences(sequences, allTags);
177 ASSERT_EQ(0u, sequences.size());
178
179 // one tag, no sequence
180 allTags.insert(DICOM_TAG_PATIENT_NAME);
181 DicomMap::ExtractSequences(sequences, allTags);
182 ASSERT_EQ(0u, sequences.size());
183
184 // one sequence
185 allTags.insert(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE);
186 DicomMap::ExtractSequences(sequences, allTags);
187 ASSERT_EQ(1u, sequences.size());
188 ASSERT_TRUE(sequences.find(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE) != sequences.end());
189 }
190 170
191 TEST(DicomMap, Tags) 171 TEST(DicomMap, Tags)
192 { 172 {
193 std::set<DicomTag> s; 173 std::set<DicomTag> s;
194 174
637 617
638 std::string s; 618 std::string s;
639 ASSERT_EQ(2u, b.GetSize()); 619 ASSERT_EQ(2u, b.GetSize());
640 ASSERT_TRUE(b.LookupStringValue(s, DICOM_TAG_PATIENT_NAME, false)); ASSERT_EQ("A", s); 620 ASSERT_TRUE(b.LookupStringValue(s, DICOM_TAG_PATIENT_NAME, false)); ASSERT_EQ("A", s);
641 ASSERT_TRUE(b.LookupStringValue(s, DICOM_TAG_SERIES_INSTANCE_UID, false)); ASSERT_EQ("C", s); 621 ASSERT_TRUE(b.LookupStringValue(s, DICOM_TAG_SERIES_INSTANCE_UID, false)); ASSERT_EQ("C", s);
622 }
623
624
625 TEST(DicomMap, FromDicomAsJsonAndSequences)
626 {
627 DicomMap m;
628 std::string jsonFullString = "{"
629 "\"0008,1090\" : "
630 "{"
631 "\"Name\" : \"ManufacturerModelName\","
632 "\"Type\" : \"String\","
633 "\"Value\" : \"MyModel\""
634 "},"
635 "\"0008,1111\" : "
636 "{"
637 "\"Name\" : \"ReferencedPerformedProcedureStepSequence\","
638 "\"Type\" : \"Sequence\","
639 "\"Value\" : "
640 "["
641 "{"
642 "\"0008,1150\" : "
643 "{"
644 "\"Name\" : \"ReferencedSOPClassUID\","
645 "\"Type\" : \"String\","
646 "\"Value\" : \"1.2.4\""
647 "},"
648 "\"0008,1155\" : "
649 "{"
650 "\"Name\" : \"ReferencedSOPInstanceUID\","
651 "\"Type\" : \"String\","
652 "\"Value\" : \"1.2.3\""
653 "}"
654 "}"
655 "]"
656 "}}";
657
658 Json::Value parsedJson;
659 bool ret = Toolbox::ReadJson(parsedJson, jsonFullString);
660
661 m.FromDicomAsJson(parsedJson, false /* append */, true /* parseSequences*/);
662 ASSERT_TRUE(ret);
663
664 ASSERT_TRUE(m.HasTag(DicomTag(0x0008, 0x1090)));
665 ASSERT_EQ("MyModel", m.GetValue(0x0008,0x1090).GetContent());
666
667 ASSERT_TRUE(m.HasTag(DicomTag(0x0008, 0x1111)));
668 const Json::Value& jsonSequence = m.GetValue(0x0008, 0x1111).GetSequenceContent();
669 ASSERT_EQ("ReferencedSOPClassUID", jsonSequence[0]["0008,1150"]["Name"].asString());
670
671 {// serialize to human dicomAsJson
672 Json::Value dicomAsJson = Json::objectValue;
673 FromDcmtkBridge::ToJson(dicomAsJson, m, DicomToJsonFormat_Human);
674 // printf("%s", dicomAsJson.toStyledString().c_str());
675
676 ASSERT_TRUE(dicomAsJson.isMember("ManufacturerModelName"));
677 ASSERT_TRUE(dicomAsJson.isMember("ReferencedPerformedProcedureStepSequence"));
678 ASSERT_TRUE(dicomAsJson["ReferencedPerformedProcedureStepSequence"][0].isMember("ReferencedSOPClassUID"));
679 ASSERT_EQ("1.2.4", dicomAsJson["ReferencedPerformedProcedureStepSequence"][0]["ReferencedSOPClassUID"].asString());
680 }
681
682 {// serialize to full dicomAsJson
683 Json::Value dicomAsJson = Json::objectValue;
684 FromDcmtkBridge::ToJson(dicomAsJson, m, DicomToJsonFormat_Full);
685 // printf("%s", dicomAsJson.toStyledString().c_str());
686
687 ASSERT_TRUE(dicomAsJson.isMember("0008,1090"));
688 ASSERT_TRUE(dicomAsJson.isMember("0008,1111"));
689 ASSERT_TRUE(dicomAsJson["0008,1111"]["Value"][0].isMember("0008,1150"));
690 ASSERT_EQ("1.2.4", dicomAsJson["0008,1111"]["Value"][0]["0008,1150"]["Value"].asString());
691 ASSERT_EQ("MyModel", dicomAsJson["0008,1090"]["Value"].asString());
692 }
693
694 {// serialize to short dicomAsJson
695 Json::Value dicomAsJson = Json::objectValue;
696 FromDcmtkBridge::ToJson(dicomAsJson, m, DicomToJsonFormat_Short);
697 // printf("%s", dicomAsJson.toStyledString().c_str());
698
699 ASSERT_TRUE(dicomAsJson.isMember("0008,1090"));
700 ASSERT_TRUE(dicomAsJson.isMember("0008,1111"));
701 ASSERT_TRUE(dicomAsJson["0008,1111"][0].isMember("0008,1150"));
702 ASSERT_EQ("1.2.4", dicomAsJson["0008,1111"][0]["0008,1150"].asString());
703 ASSERT_EQ("MyModel", dicomAsJson["0008,1090"].asString());
704 }
705
706 {// extract sequence
707 DicomMap sequencesOnly;
708 m.ExtractSequences(sequencesOnly);
709
710 ASSERT_EQ(1, sequencesOnly.GetSize());
711 ASSERT_TRUE(sequencesOnly.HasTag(0x0008, 0x1111));
712 ASSERT_TRUE(sequencesOnly.GetValue(0x0008, 0x1111).GetSequenceContent()[0].isMember("0008,1150"));
713
714 // copy sequence
715 DicomMap sequencesCopy;
716 sequencesCopy.SetValue(0x0008, 0x1111, sequencesOnly.GetValue(0x0008, 0x1111));
717
718 ASSERT_EQ(1, sequencesCopy.GetSize());
719 ASSERT_TRUE(sequencesCopy.HasTag(0x0008, 0x1111));
720 ASSERT_TRUE(sequencesCopy.GetValue(0x0008, 0x1111).GetSequenceContent()[0].isMember("0008,1150"));
721 }
722 }
723
724 TEST(DicomMap, ExtractSummary)
725 {
726 Json::Value v = Json::objectValue;
727 v["PatientName"] = "Hello";
728 v["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4";
729
730 {
731 Json::Value a = Json::arrayValue;
732
733 {
734 Json::Value item = Json::objectValue;
735 item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4";
736 item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.719";
737 a.append(item);
738 }
739
740 {
741 Json::Value item = Json::objectValue;
742 item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4"; // ReferencedSOPClassUID
743 item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.726";
744 a.append(item);
745 }
746
747 v["ReferencedImageSequence"] = a;
748 }
749
750 {
751 Json::Value a = Json::arrayValue;
752
753 {
754 Json::Value item = Json::objectValue;
755 item["StudyInstanceUID"] = "1.2.840.113704.1.111.7016.1342451220.40";
756
757 {
758 Json::Value b = Json::arrayValue;
759
760 {
761 Json::Value c = Json::objectValue;
762 c["CodeValue"] = "122403";
763 c["0008,103e"] = "WORLD"; // Series description
764 b.append(c);
765 }
766
767 item["PurposeOfReferenceCodeSequence"] = b;
768 }
769
770 a.append(item);
771 }
772
773 v["RelatedSeriesSequence"] = a;
774 }
775
776 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
777
778 DicomMap summary;
779 std::set<DicomTag> ignoreTagLength;
780 dicom->ExtractDicomSummary(summary, ORTHANC_MAXIMUM_TAG_LENGTH, ignoreTagLength);
781
782 ASSERT_TRUE(summary.HasTag(0x0008, 0x1140));
783 ASSERT_EQ("1.2.840.10008.5.1.4.1.1.4", summary.GetValue(0x0008, 0x1140).GetSequenceContent()[0]["0008,1150"]["Value"].asString());
642 } 784 }
643 785
644 786
645 787
646 TEST(DicomWebJson, Multiplicity) 788 TEST(DicomWebJson, Multiplicity)