comparison 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
comparison
equal deleted inserted replaced
4932:b7ce2bb6b881 4933:312c6f4da888
24 #include "../PrecompiledHeaders.h" 24 #include "../PrecompiledHeaders.h"
25 #include "DicomMap.h" 25 #include "DicomMap.h"
26 26
27 #include <stdio.h> 27 #include <stdio.h>
28 #include <memory> 28 #include <memory>
29 #include <boost/algorithm/string/join.hpp>
29 30
30 #include "../Compatibility.h" 31 #include "../Compatibility.h"
31 #include "../Endianness.h" 32 #include "../Endianness.h"
32 #include "../Logging.h" 33 #include "../Logging.h"
33 #include "../OrthancException.h" 34 #include "../OrthancException.h"
46 }; 47 };
47 typedef std::vector<MainDicomTag> MainDicomTags; 48 typedef std::vector<MainDicomTag> MainDicomTags;
48 49
49 } 50 }
50 51
52
53 // WARNING: the DEFAULT list of main dicom tags below are the list as they
54 // were in Orthanc 1.10 before we introduced the dynamic main dicom tags.
55 // This list has not changed since Orthanc 1.4.2 and had a single change since
56 // Orthanc 0.9.5.
57 // These lists have a specific signature. When a resource does not have
58 // the metadata "MainDicomTagsSignature", we'll assume that they were stored
59 // with an Orthanc prior to 1.11. It is therefore very important that you never
60 // change these lists !
51 61
52 static const MainDicomTag DEFAULT_PATIENT_MAIN_DICOM_TAGS[] = 62 static const MainDicomTag DEFAULT_PATIENT_MAIN_DICOM_TAGS[] =
53 { 63 {
54 // { DicomTag(0x0010, 0x1010), "PatientAge" }, 64 // { DicomTag(0x0010, 0x1010), "PatientAge" },
55 // { DicomTag(0x0010, 0x1040), "PatientAddress" }, 65 // { DicomTag(0x0010, 0x1040), "PatientAddress" },
161 std::map<ResourceType, std::map<DicomTag, std::string> > mainDicomTagsByTag_; 171 std::map<ResourceType, std::map<DicomTag, std::string> > mainDicomTagsByTag_;
162 std::map<ResourceType, std::map<std::string, DicomTag2> > mainDicomTagsByName_; 172 std::map<ResourceType, std::map<std::string, DicomTag2> > mainDicomTagsByName_;
163 std::map<ResourceType, std::set<DicomTag> > mainDicomTagsByLevel_; 173 std::map<ResourceType, std::set<DicomTag> > mainDicomTagsByLevel_;
164 std::set<DicomTag> allMainDicomTags_; 174 std::set<DicomTag> allMainDicomTags_;
165 175
176 std::map<ResourceType, std::string> signatures_;
177 std::map<ResourceType, std::string> defaultSignatures_;
178
166 MainDicomTagsConfiguration() 179 MainDicomTagsConfiguration()
167 { 180 {
168 ResetDefaultMainDicomTags(); 181 ResetDefaultMainDicomTags();
169 } 182 }
170 183
178 // by default, initialize with the previous static list (up to 1.10.0) 191 // by default, initialize with the previous static list (up to 1.10.0)
179 LoadDefaultMainDicomTags(ResourceType_Patient); 192 LoadDefaultMainDicomTags(ResourceType_Patient);
180 LoadDefaultMainDicomTags(ResourceType_Study); 193 LoadDefaultMainDicomTags(ResourceType_Study);
181 LoadDefaultMainDicomTags(ResourceType_Series); 194 LoadDefaultMainDicomTags(ResourceType_Series);
182 LoadDefaultMainDicomTags(ResourceType_Instance); 195 LoadDefaultMainDicomTags(ResourceType_Instance);
196
197 defaultSignatures_[ResourceType_Patient] = signatures_[ResourceType_Patient];
198 defaultSignatures_[ResourceType_Study] = signatures_[ResourceType_Study];
199 defaultSignatures_[ResourceType_Series] = signatures_[ResourceType_Series];
200 defaultSignatures_[ResourceType_Instance] = signatures_[ResourceType_Instance];
201 }
202
203 std::string ComputeSignature(const std::set<DicomTag>& tags)
204 {
205 // std::set are sorted by default (which is important for us !)
206 std::set<std::string> tagsIds;
207 for (std::set<DicomTag>::const_iterator it = tags.begin(); it != tags.end(); it++)
208 {
209 tagsIds.insert(it->Format());
210 }
211
212 std::string signatureText = boost::algorithm::join(tagsIds, "|");
213 std::string signatureMD5;
214 Toolbox::ComputeMD5(signatureMD5, signatureText);
215
216 return signatureMD5;
183 } 217 }
184 218
185 void LoadDefaultMainDicomTags(ResourceType level) 219 void LoadDefaultMainDicomTags(ResourceType level)
186 { 220 {
187 assert(mainDicomTagsByTag_.find(level) == mainDicomTagsByTag_.end()); 221 assert(mainDicomTagsByTag_.find(level) == mainDicomTagsByTag_.end());
247 281
248 mainDicomTagsByTag_[level][tag] = name; 282 mainDicomTagsByTag_[level][tag] = name;
249 mainDicomTagsByName_[level][name] = DicomTag2(tag); 283 mainDicomTagsByName_[level][name] = DicomTag2(tag);
250 mainDicomTagsByLevel_[level].insert(tag); 284 mainDicomTagsByLevel_[level].insert(tag);
251 allMainDicomTags_.insert(tag); 285 allMainDicomTags_.insert(tag);
286 signatures_[level] = ComputeSignature(GetMainDicomTagsByLevel(level));
252 } 287 }
253 288
254 const std::map<DicomTag, std::string>& GetMainDicomTags(ResourceType level) const 289 const std::map<DicomTag, std::string>& GetMainDicomTags(ResourceType level) const
255 { 290 {
256 assert(mainDicomTagsByTag_.find(level) != mainDicomTagsByTag_.end()); 291 assert(mainDicomTagsByTag_.find(level) != mainDicomTagsByTag_.end());
274 309
275 const std::set<DicomTag>& GetAllMainDicomTags() const 310 const std::set<DicomTag>& GetAllMainDicomTags() const
276 { 311 {
277 return allMainDicomTags_; 312 return allMainDicomTags_;
278 } 313 }
314
315 const std::string& GetMainDicomTagsSignature(ResourceType level)
316 {
317 assert(signatures_.find(level) != signatures_.end());
318
319 return signatures_[level];
320 }
321
322 const std::string& GetDefaultMainDicomTagsSignature(ResourceType level)
323 {
324 assert(defaultSignatures_.find(level) != defaultSignatures_.end());
325
326 return defaultSignatures_[level];
327 }
328
279 }; 329 };
280 330
281 331
282 void DicomMap::SetValueInternal(uint16_t group, 332 void DicomMap::SetValueInternal(uint16_t group,
283 uint16_t element, 333 uint16_t element,
585 } 635 }
586 636
587 void DicomMap::ResetDefaultMainDicomTags() 637 void DicomMap::ResetDefaultMainDicomTags()
588 { 638 {
589 DicomMap::MainDicomTagsConfiguration::GetInstance().ResetDefaultMainDicomTags(); 639 DicomMap::MainDicomTagsConfiguration::GetInstance().ResetDefaultMainDicomTags();
640 }
641
642 const std::string& DicomMap::GetMainDicomTagsSignature(ResourceType level)
643 {
644 return DicomMap::MainDicomTagsConfiguration::GetInstance().GetMainDicomTagsSignature(level);
645 }
646
647 const std::string& DicomMap::GetDefaultMainDicomTagsSignature(ResourceType level)
648 {
649 return DicomMap::MainDicomTagsConfiguration::GetInstance().GetDefaultMainDicomTagsSignature(level);
590 } 650 }
591 651
592 void DicomMap::GetTags(std::set<DicomTag>& tags) const 652 void DicomMap::GetTags(std::set<DicomTag>& tags) const
593 { 653 {
594 tags.clear(); 654 tags.clear();