Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkDICOMFileReaderTestHelper.h
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 
13 #ifndef mitkDICOMFileReaderTestHelper_h
14 #define mitkDICOMFileReaderTestHelper_h
15 
16 #include "mitkDICOMFileReader.h"
17 #include "mitkDICOMEnums.h"
18 
19 #include "mitkTestingMacros.h"
20 
21 namespace mitk
22 {
23 
25 {
26  public:
27 
29 {
30  static StringList inputs;
31  return inputs;
32 }
33 
34 static void SetTestInputFilenames(int argc, char* argv[])
35 {
36  mitk::StringList inputFiles;
37 
38  for (int a = 1; a < argc; ++a)
39  {
40  inputFiles.push_back( argv[a] );
41  }
42 
43  GetInputFilenames() = inputFiles;
44 }
45 
46 
47 static void SetTestInputFilenames(const StringList& filenames)
48 {
49  GetInputFilenames() = filenames;
50 }
51 
52 static void TestInputFilenames(DICOMFileReader* reader)
53 {
54  StringList inputFiles = GetInputFilenames();
55  reader->SetInputFiles( inputFiles );
56 
57  const StringList& inputFilesReturned = reader->GetInputFiles();
58  MITK_TEST_CONDITION( inputFilesReturned.size() == inputFiles.size(), "Input file list is received")
59  MITK_TEST_CONDITION( reader->GetNumberOfOutputs() == 0, "No outputs without analysis")
60 }
61 
63 {
64  StringList inputFiles = GetInputFilenames();
65  reader->SetInputFiles( inputFiles );
66 
67  reader->AnalyzeInputFiles();
68 
69  StringList allSortedInputsFiles;
70 
71  unsigned int numberOfOutputs = reader->GetNumberOfOutputs();
72  for (unsigned int o = 0; o < numberOfOutputs; ++o)
73  {
74  const DICOMImageBlockDescriptor block = reader->GetOutput(o);
75 
76  const DICOMImageFrameList& outputFiles = block.GetImageFrameList();
77  for(auto iter = outputFiles.cbegin();
78  iter != outputFiles.cend();
79  ++iter)
80  {
81  // check that output is part of input
82  auto inputPositionOfCurrentOutput = std::find( inputFiles.cbegin(), inputFiles.cend(), (*iter)->Filename );
83  if (inputPositionOfCurrentOutput != inputFiles.cend())
84  {
85  // check that output is only part of ONE output
86  auto outputPositionOfCurrentOutput = std::find( allSortedInputsFiles.cbegin(), allSortedInputsFiles.cend(), (*iter)->Filename );
87  if (outputPositionOfCurrentOutput == allSortedInputsFiles.cend())
88  {
89  // was not in list before
90  allSortedInputsFiles.push_back( *inputPositionOfCurrentOutput );
91  }
92  else
93  {
94  reader->PrintOutputs(std::cout);
95  MITK_TEST_CONDITION_REQUIRED(false, "File '" << (*iter)->Filename << "' appears in TWO outputs. Readers are expected to use each frame only once." )
96  }
97  }
98  else
99  {
100  reader->PrintOutputs(std::cout);
101  MITK_TEST_CONDITION_REQUIRED(false, "File '" << (*iter)->Filename << "' appears in output, but it was never part of the input list." )
102  }
103  }
104  }
105 
106  MITK_TEST_CONDITION( allSortedInputsFiles.size() == inputFiles.size(), "Output list size (" << allSortedInputsFiles.size() << ") equals input list size (" << inputFiles.size() << ")" )
107 
108  try
109  {
110  const DICOMImageBlockDescriptor block = reader->GetOutput( inputFiles.size() );
111  MITK_TEST_CONDITION(false, "Invalid indices for GetOutput() should throw exception")
112  }
113  catch( std::invalid_argument& )
114  {
115  MITK_TEST_CONDITION(true, "Invalid indices for GetOutput() should throw exception")
116  }
117 }
118 
120  const DICOMFileReader::AdditionalTagsMapType& requestedTags,
121  const std::unordered_map<std::string, std::string>& expectedProperties )
122 {
123  StringList inputFiles = GetInputFilenames();
124  reader->SetInputFiles( inputFiles );
125 
126  reader->AnalyzeInputFiles();
127  reader->LoadImages();
128 
129  unsigned int numberOfOutputs = reader->GetNumberOfOutputs();
130  for (unsigned int o = 0; o < numberOfOutputs; ++o)
131  {
132  const DICOMImageBlockDescriptor block = reader->GetOutput(o);
133 
134  const DICOMImageFrameList& outputFiles = block.GetImageFrameList();
135  const mitk::Image::Pointer mitkImage = block.GetMitkImage();
136 
137  for ( auto iter = requestedTags.cbegin(); iter != requestedTags.cend(); ++iter)
138  {
139  mitk::BaseProperty* property = mitkImage->GetProperty( iter->second.c_str() ).GetPointer();
140  MITK_TEST_CONDITION( property != nullptr,
141  "Requested Tag is available as Property in Image" );
142  if (property)
143  {
144  MITK_INFO << iter->first.ToStr() << " / " << property->GetNameOfClass();
145  auto expectfinding = expectedProperties.find(iter->second);
146 
147  if (expectfinding != expectedProperties.end())
148  {
149  MITK_TEST_CONDITION(std::string(property->GetNameOfClass()) == expectfinding->second, "Property type is as expected");
150  }
151  }
152  }
153 
154 
155  MITK_DEBUG << "-------------------------------------------";
156  MITK_DEBUG << "Output " << o << " at " << (void*) mitkImage.GetPointer();
157  MITK_DEBUG << " Number of files: " << outputFiles.size();
158  MITK_DEBUG << " Dimensions: " << mitkImage->GetDimension(0) << " " << mitkImage->GetDimension(1) << " " << mitkImage->GetDimension(2);
159  }
160 }
161 
163 {
164  StringList inputFiles = GetInputFilenames();
165  reader->SetInputFiles( inputFiles );
166  reader->AnalyzeInputFiles();
167  reader->LoadImages();
168 
169  unsigned int numberOfOutputs = reader->GetNumberOfOutputs();
170 
171  MITK_TEST_CONDITION_REQUIRED( numberOfOutputs == 1, "Single block is read from input files.");
172 }
173 
175 {
177 }
178 
179 
180 }; // end test class
181 
182 } // namespace
183 
184 #endif
static void TestMitkImagesAreLoaded(DICOMFileReader *reader, const DICOMFileReader::AdditionalTagsMapType &requestedTags, const std::unordered_map< std::string, std::string > &expectedProperties)
#define MITK_INFO
Definition: mitkLogMacros.h:18
#define MITK_TEST_CONDITION_REQUIRED(COND, MSG)
static mitk::BaseProperty::Pointer DummyTagToPropertyFunctor(const mitk::StringLookupTable &)
#define MITK_DEBUG
Definition: mitkLogMacros.h:22
Image::Pointer GetMitkImage() const
the 3D mitk::Image that is loaded from the DICOM files of a DICOMImageFrameList
DataCollection - Class to facilitate loading/accessing structured data.
virtual bool LoadImages()=0
itk::SmartPointer< Self > Pointer
void SetInputFiles(const StringList &filenames)
This input files.
const DICOMImageFrameList & GetImageFrameList() const
List of frames that constitute the mitk::Image (DICOMImageFrames)
const StringList & GetInputFiles() const
This input files.
virtual void AnalyzeInputFiles()=0
Analyze input files.
unsigned int GetNumberOfOutputs() const
Number of outputs, only meaningful after calling AnalyzeInputFiles()
Abstract base class for properties.
const DICOMImageBlockDescriptor & GetOutput(unsigned int index) const
Individual outputs, only meaningful after calling AnalyzeInputFiles().
#define MITK_TEST_CONDITION(COND, MSG)
std::vector< DICOMImageFrameInfo::Pointer > DICOMImageFrameList
DICOMImageBlockDescriptor::AdditionalTagsMapType AdditionalTagsMapType
void PrintOutputs(std::ostream &os, bool filenameDetails=false) const
Print output description to given stream, for human reader.
static void TestSingleBlockIsRead(DICOMFileReader *reader)
Output descriptor for DICOMFileReader.
static void TestOutputsContainInputs(DICOMFileReader *reader)
static void SetTestInputFilenames(const StringList &filenames)
std::vector< std::string > StringList
static void SetTestInputFilenames(int argc, char *argv[])
static void TestInputFilenames(DICOMFileReader *reader)
Interface for DICOM readers that produce mitk::Images.