Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkCESTDICOMReaderService.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 
15 #include "mitkCESTIOMimeTypes.h"
16 #include <mitkCustomTagParser.h>
20 
21 #include <itkGDCMImageIO.h>
22 
23 namespace mitk
24 {
26  : BaseDICOMReaderService(CustomMimeType(MitkCESTIOMimeTypes::CEST_DICOM_MIMETYPE_NAME()), "MITK CEST DICOM Reader")
27  {
28  Options defaultOptions;
29 
30  std::vector<std::string> parseStrategy;
31  parseStrategy.push_back("Automatic");
32  parseStrategy.push_back("CEST/WASABI");
33  parseStrategy.push_back("T1");
34  defaultOptions["Force type"] = parseStrategy;
35 
36  std::vector<std::string> mappingStrategy;
37  mappingStrategy.push_back("Strict");
38  mappingStrategy.push_back("Fuzzy");
39  defaultOptions["Revision mapping"] = mappingStrategy;
40 
41  std::vector<std::string> normalizationStrategy;
42  normalizationStrategy.push_back("Automatic");
43  normalizationStrategy.push_back("No");
44  defaultOptions["Normalize data"] = normalizationStrategy;
45 
46 
47  this->SetDefaultOptions(defaultOptions);
48 
49  this->RegisterService();
50  }
51 
52  DICOMFileReader::Pointer CESTDICOMReaderService::GetReader(const mitk::StringList &relevantFiles) const
53  {
54  mitk::DICOMFileReaderSelector::Pointer selector = mitk::DICOMFileReaderSelector::New();
55 
56  selector->LoadBuiltIn3DConfigs();
57  selector->LoadBuiltIn3DnTConfigs();
58  selector->SetInputFiles(relevantFiles);
59 
60  mitk::DICOMFileReader::Pointer reader = selector->GetFirstReaderWithMinimumNumberOfOutputImages();
61  if (reader.IsNotNull())
62  {
63  // reset tag cache to ensure that additional tags of interest
64  // will be regarded by the reader if set later on.
65  reader->SetTagCache(nullptr);
66  }
67 
68  return reader;
69  }
70 
71  std::vector<itk::SmartPointer<BaseData>> CESTDICOMReaderService::Read()
72  {
73  std::vector<BaseData::Pointer> result;
74  std::vector<BaseData::Pointer> dicomResult = BaseDICOMReaderService::Read();
75 
76  const Options options = this->GetOptions();
77 
78  const std::string parseStrategy = options.find("Force type")->second.ToString();
79  const std::string mappingStrategy = options.find("Revision mapping")->second.ToString();
80  const std::string normalizationStrategy = options.find("Normalize data")->second.ToString();
81 
82  for (auto &item : dicomResult)
83  {
84  auto prop = item->GetProperty("files");
85  auto fileProp = dynamic_cast<mitk::StringLookupTableProperty*>(prop.GetPointer());
86  if (!fileProp)
87  {
88  mitkThrow() << "Cannot load CEST file. Property \"files\" is missing after BaseDICOMReaderService::Read().";
89  }
90 
91  mitk::StringList relevantFiles = { fileProp->GetValue().GetTableValue(0) };
92 
93  mitk::DICOMDCMTKTagScanner::Pointer scanner = mitk::DICOMDCMTKTagScanner::New();
94 
95  DICOMTag siemensCESTprivateTag(0x0029, 0x1020);
96 
97  scanner->AddTag(siemensCESTprivateTag);
98  scanner->SetInputFiles(relevantFiles);
99  scanner->Scan();
100  mitk::DICOMTagCache::Pointer tagCache = scanner->GetScanCache();
101 
102  DICOMImageFrameList imageFrameList = mitk::ConvertToDICOMImageFrameList(tagCache->GetFrameInfoList());
103  DICOMImageFrameInfo *firstFrame = imageFrameList.begin()->GetPointer();
104 
105  std::string byteString = tagCache->GetTagValue(firstFrame, siemensCESTprivateTag).value;
106 
107  mitk::CustomTagParser tagParser(relevantFiles[0]);
108  tagParser.SetParseStrategy(parseStrategy);
109  tagParser.SetRevisionMappingStrategy(mappingStrategy);
110 
111  auto parsedPropertyList = tagParser.ParseDicomPropertyString(byteString);
112 
113  item->GetPropertyList()->ConcatenatePropertyList(parsedPropertyList);
114 
115  auto image = dynamic_cast<mitk::Image*>(item.GetPointer());
116  if (normalizationStrategy == "Automatic" && mitk::IsNotNormalizedCESTImage(image))
117  {
118  MITK_INFO << "Unnormalized CEST image was loaded and will be normalized automatically.";
119  auto normalizationFilter = mitk::CESTImageNormalizationFilter::New();
120  normalizationFilter->SetInput(image);
121  normalizationFilter->Update();
122  auto normalizedImage = normalizationFilter->GetOutput();
123 
124  auto nameProp = item->GetProperty("name");
125  if (!nameProp)
126  {
127  mitkThrow() << "Cannot load CEST file. Property \"name\" is missing after BaseDICOMReaderService::Read().";
128  }
129  normalizedImage->SetProperty("name", mitk::StringProperty::New(nameProp->GetValueAsString() + "_normalized"));
130  result.push_back(normalizedImage);
131  }
132  else
133  {
134  result.push_back(item);
135  }
136  }
137 
138  return result;
139  }
140 
141  CESTDICOMReaderService *CESTDICOMReaderService::Clone() const { return new CESTDICOMReaderService(*this); }
142 }
#define MITK_INFO
Definition: mitkLogMacros.h:18
Provides the custom mime types for MitkCEST.
std::vector< itk::SmartPointer< BaseData > > Read() override
Representation of a DICOM tag.
Definition: mitkDICOMTag.h:32
DataCollection - Class to facilitate loading/accessing structured data.
std::map< std::string, us::Any > Options
Options for reading or writing data.
Definition: mitkIFileIO.h:69
mitk::PropertyList::Pointer ParseDicomPropertyString(std::string dicomPropertyString)
parse the provided string and return a property list based on the closest revision parameter mapping ...
Describes a frame within a DICOM file.
The CustomMimeType class represents a custom mime-type which may be registered as a service object...
void SetDefaultOptions(const Options &defaultOptions)
us::ServiceRegistration< IFileReader > RegisterService(us::ModuleContext *context=us::GetModuleContext())
void SetParseStrategy(std::string parseStrategy)
std::vector< DICOMImageFrameInfo::Pointer > DICOMImageFrameList
#define mitkThrow()
Image class for storing images.
Definition: mitkImage.h:72
Options GetOptions() const override
returns a list of the supported options
mitk::Image::Pointer image
MITKCEST_EXPORT bool IsNotNormalizedCESTImage(const Image *cestImage)
std::vector< std::string > StringList
MITKDICOMREADER_EXPORT mitk::DICOMImageFrameList ConvertToDICOMImageFrameList(const DICOMDatasetAccessingImageFrameList &input)
std::vector< itk::SmartPointer< BaseData > > Read() override
Reads a path or stream and creates a list of BaseData objects.
mitk::DICOMFileReader::Pointer GetReader(const mitk::StringList &relevantFiles) const override
static Pointer New()
void SetRevisionMappingStrategy(std::string revisionMappingStrategy)