Mercurial > hg > orthanc
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) |