IGSTK
igstkDICOMImageReader.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Image Guided Surgery Software Toolkit
4  Module: $RCSfile: igstkDICOMImageReader.h,v $
5  Language: C++
6  Date: $Date: 2009-06-15 19:54:58 $
7  Version: $Revision: 1.18 $
8 
9  Copyright (c) ISC Insight Software Consortium. All rights reserved.
10  See IGSTKCopyright.txt or http://www.igstk.org/copyright.htm for details.
11 
12  This software is distributed WITHOUT ANY WARRANTY; without even
13  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14  PURPOSE. See the above copyright notices for more information.
15 
16 =========================================================================*/
17 #ifndef __igstkDICOMImageReader_h
18 #define __igstkDICOMImageReader_h
19 
20 #include "igstkImageReader.h"
21 
22 #include "igstkEvents.h"
23 
24 #include "itkImageSeriesReader.h"
25 #include "itkEventObject.h"
26 #include "itkGDCMImageIO.h"
27 #include "itkGDCMSeriesFileNames.h"
28 
29 
30 namespace igstk
31 {
32 
33 #define igstkUnsafeGetMacro(name,type) \
34 virtual const type & Get##name () const \
35 { \
36  igstkLogMacro( CRITICAL, \
37  "igstk::DICOMImageReader::Get" #name " unsafe method called...\n"); \
38  return this->m_##name; \
39 }
40 
41 
42 igstkEventMacro( DICOMModalityEvent, StringEvent);
43 igstkEventMacro( DICOMPatientNameEvent, StringEvent);
44 igstkEventMacro( DICOMImageReaderEvent, StringEvent);
45 
46 // Invalid request error event
47 igstkEventMacro( DICOMImageReaderErrorEvent, IGSTKErrorWithStringEvent );
48 igstkEventMacro( DICOMInvalidRequestErrorEvent,
49  DICOMImageReaderErrorEvent );
50 
51 // Events to handle errors with the ImageDirectory name
52 igstkEventMacro(DICOMImageDirectoryEmptyErrorEvent,
53  DICOMImageReaderErrorEvent );
54 igstkEventMacro(DICOMImageDirectoryDoesNotExistErrorEvent,
55  DICOMImageReaderErrorEvent );
56 igstkEventMacro(DICOMImageDirectoryIsNotDirectoryErrorEvent,
57  DICOMImageReaderErrorEvent );
58 igstkEventMacro(DICOMImageDirectoryDoesNotHaveEnoughFilesErrorEvent,
59  DICOMImageReaderErrorEvent );
60 
61 // Image series filename generation error event
62 igstkEventMacro(DICOMImageSeriesFileNamesGeneratingErrorEvent,
63  DICOMImageReaderErrorEvent );
64 
65 //Image reading error
66 igstkEventMacro(DICOMImageReadingErrorEvent,
67  DICOMImageReaderErrorEvent );
68 
69 
84 template <class TImageSpatialObject>
85 class DICOMImageReader : public ImageReader< TImageSpatialObject >
86 {
87 
88 public:
89 
93 
94 public:
95 
98  typedef std::string DirectoryNameType;
99 
101  void RequestSetDirectory( const DirectoryNameType & directory );
102 
103  void RequestSetProgressCallback(itk::Command *progressCallback)
104  {
105  m_ImageSeriesReader->AddObserver(itk::ProgressEvent(),progressCallback);
106  }
107 
108  void RequestSetAbortCallback(itk::Command *abortCallback)
109  {
110  m_ImageSeriesReader->AddObserver(itk::AbortEvent(),abortCallback);
111  }
112 
114  void RequestReadImage();
115 
118 
121 
123  typedef std::string DICOMInformationType;
124 
129  bool FileSuccessfullyRead() const { return m_FileSuccessfullyRead; }
130 
138 
146 
154 
156  void RequestGetImage();
157 
159  igstkLoadedTemplatedObjectEventMacro( ImageModifiedEvent, IGSTKEvent,
160  TImageSpatialObject);
161 
164 
165 protected:
166 
167  DICOMImageReader( void );
168  ~DICOMImageReader( void );
169 
171  itk::GDCMSeriesFileNames::Pointer m_FileNames;
172  itk::GDCMImageIO::Pointer m_ImageIO;
173 
174  typedef typename Superclass::ImageType ImageType;
175 
176  typedef itk::ImageSeriesReader< ImageType > ImageSeriesReaderType;
177  typedef itk::ImageFileReader< ImageType > ImageReaderType;
178 
180  typename ImageSeriesReaderType::Pointer m_ImageSeriesReader;
181  typename ImageReaderType::Pointer m_ImageFileReader;
182 
184  void PrintSelf( std::ostream& os, itk::Indent indent ) const;
185 
188  virtual const ImageType * GetITKImage() const;
189 
190 private:
191 
194  DICOMImageReader(const Self&); //purposely not implemented
195  void operator=(const Self&); //purposely not implemented
196 
197 
198  DirectoryNameType m_ImageDirectoryName;
199  DirectoryNameType m_ImageDirectoryNameToBeSet;
200 
202  igstkDeclareStateMacro( Idle );
203  igstkDeclareStateMacro( ImageDirectoryNameRead );
204  igstkDeclareStateMacro( AttemptingToReadImage );
205  igstkDeclareStateMacro( ImageSeriesFileNamesGenerated );
206  igstkDeclareStateMacro( ImageRead );
207 
209  igstkDeclareInputMacro( ReadImage );
210  igstkDeclareInputMacro( ImageDirectoryNameValid );
211  igstkDeclareInputMacro( ImageReadingSuccess );
212  igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingSuccess );
213  igstkDeclareInputMacro( ResetReader );
214  igstkDeclareInputMacro( GetImage );
215 
217  igstkDeclareInputMacro( ImageReadingError );
218  igstkDeclareInputMacro( ImageDirectoryNameIsEmpty );
219  igstkDeclareInputMacro( ImageDirectoryNameDoesNotExist );
220  igstkDeclareInputMacro( ImageDirectoryNameIsNotDirectory );
221  igstkDeclareInputMacro( ImageDirectoryNameDoesNotHaveEnoughFiles );
222  igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingError );
223 
229  virtual bool CheckModalityType( DICOMInformationType modality );
230 
232  igstkDeclareInputMacro( GetModalityInformation );
233  igstkDeclareInputMacro( GetPatientNameInformation );
234 
236  void SetDirectoryNameProcessing();
237 
240  void ReadDirectoryFileNamesProcessing();
241 
243  void AttemptReadImageProcessing();
244 
247  void ReportInvalidRequestProcessing();
248 
250  void ReportImageDirectoryEmptyErrorProcessing();
251 
253  void ReportImageDirectoryDoesNotExistErrorProcessing();
254 
257  void ReportImageDirectoryDoesNotHaveEnoughFilesErrorProcessing();
258 
261  void ReportImageSeriesFileNamesGeneratingErrorProcessing();
262 
265  void ReportImageSeriesFileNamesGeneratingSuccessProcessing();
266 
268  void ReportImageReadingErrorProcessing();
269 
271  void ReportImageReadingSuccessProcessing();
272 
274  void ReportImageProcessing();
275 
277  void ResetReaderProcessing();
278 
281  void ReportImageDirectoryIsNotDirectoryErrorProcessing();
282 
285  void GetModalityInformationProcessing();
286 
289  void GetPatientNameInformationProcessing();
290 
292  bool m_FileSuccessfullyRead;
293 
295  DICOMInformationType m_PatientID;
296  DICOMInformationType m_PatientName;
297  DICOMInformationType m_Modality;
298  DICOMInformationType m_GantryTilt;
299 
301  std::string m_ImageReadingErrorInformation;
302 };
303 
304 } // end namespace igstk
305 
306 #ifndef IGSTK_MANUAL_INSTANTIATION
307 #include "igstkDICOMImageReader.txx"
308 #endif
309 
310 #endif // __igstkDICOMImageReader_h