# HG changeset patch # User Alain Mazy # Date 1647420633 -3600 # Node ID 96a3e81eba909ec4dbd94f1d76288f4d9bfe6d45 # Parent 304514ce84ee6a63010d7046990058b49ac866d7 performance warning diff -r 304514ce84ee -r 96a3e81eba90 OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp --- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Tue Mar 15 15:57:21 2022 +0100 +++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp Wed Mar 16 09:50:33 2022 +0100 @@ -1311,6 +1311,17 @@ return fields.HasTag(ParseTag(tagName)); } + void FromDcmtkBridge::FormatListOfTags(std::string& output, const std::set& tags) + { + std::set values; + for (std::set::const_iterator it = tags.begin(); + it != tags.end(); it++) + { + values.insert(it->Format()); + } + + Toolbox::JoinStrings(output, values, ";"); + } // parses a list like "0010,0010;PatientBirthDate;0020,0020" void FromDcmtkBridge::ParseListOfTags(std::set& result, const std::string& source) diff -r 304514ce84ee -r 96a3e81eba90 OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h --- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h Tue Mar 15 15:57:21 2022 +0100 +++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h Wed Mar 16 09:50:33 2022 +0100 @@ -180,6 +180,8 @@ static void ParseListOfTags(std::set& result, const Json::Value& source); + static void FormatListOfTags(std::string& output, const std::set& tags); + static bool HasTag(const DicomMap& fields, const std::string& tagName); diff -r 304514ce84ee -r 96a3e81eba90 OrthancFramework/Sources/Toolbox.h --- a/OrthancFramework/Sources/Toolbox.h Tue Mar 15 15:57:21 2022 +0100 +++ b/OrthancFramework/Sources/Toolbox.h Wed Mar 16 09:50:33 2022 +0100 @@ -234,6 +234,14 @@ } } + template static void RemoveSets(std::set& target, const std::set& toRemove) + { + for (typename std::set::const_iterator it = toRemove.begin(); + it != toRemove.end(); it++) + { + target.erase(*it); + } + } #if ORTHANC_ENABLE_PUGIXML == 1 static void JsonToXml(std::string& target, diff -r 304514ce84ee -r 96a3e81eba90 OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp --- a/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Tue Mar 15 15:57:21 2022 +0100 +++ b/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Wed Mar 16 09:50:33 2022 +0100 @@ -369,6 +369,11 @@ ASSERT_TRUE(result.find(DICOM_TAG_PATIENT_BIRTH_DATE) != result.end()); ASSERT_TRUE(result.find(DICOM_TAG_PATIENT_ORIENTATION) != result.end()); ASSERT_TRUE(result.find(DICOM_TAG_PATIENT_ID) == result.end()); + + // serialize to string + std::string serialized; + FromDcmtkBridge::FormatListOfTags(serialized, result); + ASSERT_EQ("0010,0010;0010,0030;0020,0020", serialized); } {// no tag @@ -395,6 +400,21 @@ ASSERT_EQ(1, result.size()); } + {// Json + Json::Value source = Json::arrayValue; + source.append("0010,0010"); + source.append("PatientBirthDate"); + source.append("0020,0020"); + std::set result; + FromDcmtkBridge::ParseListOfTags(result, source); + + ASSERT_TRUE(result.find(DICOM_TAG_PATIENT_NAME) != result.end()); + ASSERT_TRUE(result.find(DICOM_TAG_PATIENT_BIRTH_DATE) != result.end()); + ASSERT_TRUE(result.find(DICOM_TAG_PATIENT_ORIENTATION) != result.end()); + ASSERT_TRUE(result.find(DICOM_TAG_PATIENT_ID) == result.end()); + } + + } static const DicomTag REFERENCED_STUDY_SEQUENCE(0x0008, 0x1110); diff -r 304514ce84ee -r 96a3e81eba90 OrthancServer/Sources/OrthancConfiguration.cpp --- a/OrthancServer/Sources/OrthancConfiguration.cpp Tue Mar 15 15:57:21 2022 +0100 +++ b/OrthancServer/Sources/OrthancConfiguration.cpp Wed Mar 16 09:50:33 2022 +0100 @@ -1059,7 +1059,13 @@ { return GetBooleanParameter("EnableLogsForInconsistentMainDicomTags", true); } - + + bool OrthancConfiguration::IsStorageAccessOnFindLogsEnabled() const + { + return GetBooleanParameter("EnableLogsForStorageAccessOnFind", true); + } + + void OrthancConfiguration::DefaultExtractDicomSummary(DicomMap& target, const ParsedDicomFile& dicom) { diff -r 304514ce84ee -r 96a3e81eba90 OrthancServer/Sources/OrthancConfiguration.h --- a/OrthancServer/Sources/OrthancConfiguration.h Tue Mar 15 15:57:21 2022 +0100 +++ b/OrthancServer/Sources/OrthancConfiguration.h Wed Mar 16 09:50:33 2022 +0100 @@ -244,6 +244,8 @@ bool IsInconsistentDicomTagsLogsEnabled() const; + bool IsStorageAccessOnFindLogsEnabled() const; + static void DefaultExtractDicomSummary(DicomMap& target, const ParsedDicomFile& dicom); diff -r 304514ce84ee -r 96a3e81eba90 OrthancServer/Sources/ServerContext.cpp --- a/OrthancServer/Sources/ServerContext.cpp Tue Mar 15 15:57:21 2022 +0100 +++ b/OrthancServer/Sources/ServerContext.cpp Wed Mar 16 09:50:33 2022 +0100 @@ -2546,6 +2546,26 @@ // possibly merge missing requested tags from dicom-as-json if (!resource.missingRequestedTags_.empty() && !DicomMap::HasOnlyComputedTags(resource.missingRequestedTags_)) { + OrthancConfiguration::ReaderLock lock; + if (lock.GetConfiguration().IsStorageAccessOnFindLogsEnabled()) + { + std::set missingTags; + Toolbox::AppendSets(missingTags, resource.missingRequestedTags_); + for (std::set::const_iterator it = resource.missingRequestedTags_.begin(); it != resource.missingRequestedTags_.end(); it++) + { + if (DicomMap::IsComputedTag(*it)) + { + missingTags.erase(*it); + } + } + + std::string missings; + FromDcmtkBridge::FormatListOfTags(missings, missingTags); + + LOG(WARNING) << "PERFORMANCE WARNING: Accessing Dicom tags from storage when accessing " << Orthanc::GetResourceTypeText(resource.type_, false , false) << " : " << missings; + } + + std::string instanceId_ = instanceId; DicomMap tagsFromJson; @@ -2569,7 +2589,6 @@ } } - // MORE_TAGS :TODO: log "performance" warning (add an option to disable them) Json::Value tmpDicomAsJson; ReadDicomAsJson(tmpDicomAsJson, instanceId_); tagsFromJson.FromDicomAsJson(tmpDicomAsJson);