diff OrthancFramework/Sources/DicomFormat/DicomMap.cpp @ 4933:312c6f4da888 more-tags

adding MainDicomTags signatures
author Alain Mazy <am@osimis.io>
date Wed, 09 Mar 2022 12:16:45 +0100
parents b7ce2bb6b881
children acd3f72e2a21
line wrap: on
line diff
--- a/OrthancFramework/Sources/DicomFormat/DicomMap.cpp	Wed Mar 09 11:17:08 2022 +0100
+++ b/OrthancFramework/Sources/DicomFormat/DicomMap.cpp	Wed Mar 09 12:16:45 2022 +0100
@@ -26,6 +26,7 @@
 
 #include <stdio.h>
 #include <memory>
+#include <boost/algorithm/string/join.hpp>
 
 #include "../Compatibility.h"
 #include "../Endianness.h"
@@ -49,6 +50,15 @@
   }
 
 
+  // WARNING: the DEFAULT list of main dicom tags below are the list as they 
+  // were in Orthanc 1.10 before we introduced the dynamic main dicom tags.
+  // This list has not changed since Orthanc 1.4.2 and had a single change since
+  // Orthanc 0.9.5.
+  // These lists have a specific signature.  When a resource does not have
+  // the metadata "MainDicomTagsSignature", we'll assume that they were stored
+  // with an Orthanc prior to 1.11.  It is therefore very important that you never
+  // change these lists !
+
   static const MainDicomTag DEFAULT_PATIENT_MAIN_DICOM_TAGS[] =
   {
     // { DicomTag(0x0010, 0x1010), "PatientAge" },
@@ -163,6 +173,9 @@
     std::map<ResourceType, std::set<DicomTag> > mainDicomTagsByLevel_;
     std::set<DicomTag> allMainDicomTags_;
 
+    std::map<ResourceType, std::string> signatures_;
+    std::map<ResourceType, std::string> defaultSignatures_;
+
     MainDicomTagsConfiguration()
     {
       ResetDefaultMainDicomTags();
@@ -180,6 +193,27 @@
       LoadDefaultMainDicomTags(ResourceType_Study);
       LoadDefaultMainDicomTags(ResourceType_Series);
       LoadDefaultMainDicomTags(ResourceType_Instance);
+
+      defaultSignatures_[ResourceType_Patient] = signatures_[ResourceType_Patient];
+      defaultSignatures_[ResourceType_Study] = signatures_[ResourceType_Study];
+      defaultSignatures_[ResourceType_Series] = signatures_[ResourceType_Series];
+      defaultSignatures_[ResourceType_Instance] = signatures_[ResourceType_Instance];
+    }
+
+    std::string ComputeSignature(const std::set<DicomTag>& tags)
+    {
+      // std::set are sorted by default (which is important for us !)
+      std::set<std::string> tagsIds;
+      for (std::set<DicomTag>::const_iterator it = tags.begin(); it != tags.end(); it++)
+      {
+        tagsIds.insert(it->Format());
+      }
+
+      std::string signatureText = boost::algorithm::join(tagsIds, "|");
+      std::string signatureMD5;
+      Toolbox::ComputeMD5(signatureMD5, signatureText);
+
+      return signatureMD5;
     }
 
     void LoadDefaultMainDicomTags(ResourceType level)
@@ -249,6 +283,7 @@
       mainDicomTagsByName_[level][name] = DicomTag2(tag);
       mainDicomTagsByLevel_[level].insert(tag);
       allMainDicomTags_.insert(tag);
+      signatures_[level] = ComputeSignature(GetMainDicomTagsByLevel(level));
     }
 
     const std::map<DicomTag, std::string>& GetMainDicomTags(ResourceType level) const
@@ -276,6 +311,21 @@
     {
       return allMainDicomTags_;
     }
+
+    const std::string& GetMainDicomTagsSignature(ResourceType level)
+    {
+      assert(signatures_.find(level) != signatures_.end());
+
+      return signatures_[level];
+    }
+
+    const std::string& GetDefaultMainDicomTagsSignature(ResourceType level)
+    {
+      assert(defaultSignatures_.find(level) != defaultSignatures_.end());
+
+      return defaultSignatures_[level];
+    }
+
   };
 
 
@@ -589,6 +639,16 @@
     DicomMap::MainDicomTagsConfiguration::GetInstance().ResetDefaultMainDicomTags();
   }
 
+  const std::string& DicomMap::GetMainDicomTagsSignature(ResourceType level)
+  {
+    return DicomMap::MainDicomTagsConfiguration::GetInstance().GetMainDicomTagsSignature(level);
+  }
+
+  const std::string& DicomMap::GetDefaultMainDicomTagsSignature(ResourceType level)
+  {
+    return DicomMap::MainDicomTagsConfiguration::GetInstance().GetDefaultMainDicomTagsSignature(level);
+  }
+
   void DicomMap::GetTags(std::set<DicomTag>& tags) const
   {
     tags.clear();