00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __igstkDICOMImageReader_h
00018 #define __igstkDICOMImageReader_h
00019
00020 #include "igstkImageReader.h"
00021
00022 #include "igstkEvents.h"
00023
00024 #include "itkImageSeriesReader.h"
00025 #include "itkEventObject.h"
00026 #include "itkGDCMImageIO.h"
00027 #include "itkGDCMSeriesFileNames.h"
00028
00029
00030 namespace igstk
00031 {
00032
00033 #define igstkUnsafeGetMacro(name,type) \
00034 virtual const type & Get##name () const \
00035 { \
00036 igstkLogMacro( CRITICAL, \
00037 "igstk::DICOMImageReader::Get" #name " unsafe method called...\n"); \
00038 return this->m_##name; \
00039 }
00040
00041
00042 igstkEventMacro( DICOMModalityEvent, StringEvent);
00043 igstkEventMacro( DICOMPatientNameEvent, StringEvent);
00044 igstkEventMacro( DICOMImageReaderEvent, StringEvent);
00045
00046
00047 igstkEventMacro( DICOMImageReaderErrorEvent, IGSTKErrorWithStringEvent );
00048 igstkEventMacro( DICOMInvalidRequestErrorEvent,
00049 DICOMImageReaderErrorEvent );
00050
00051
00052 igstkEventMacro(DICOMImageDirectoryEmptyErrorEvent,
00053 DICOMImageReaderErrorEvent );
00054 igstkEventMacro(DICOMImageDirectoryDoesNotExistErrorEvent,
00055 DICOMImageReaderErrorEvent );
00056 igstkEventMacro(DICOMImageDirectoryIsNotDirectoryErrorEvent,
00057 DICOMImageReaderErrorEvent );
00058 igstkEventMacro(DICOMImageDirectoryDoesNotHaveEnoughFilesErrorEvent,
00059 DICOMImageReaderErrorEvent );
00060
00061
00062 igstkEventMacro(DICOMImageSeriesFileNamesGeneratingErrorEvent,
00063 DICOMImageReaderErrorEvent );
00064
00065
00066 igstkEventMacro(DICOMImageReadingErrorEvent,
00067 DICOMImageReaderErrorEvent );
00068
00069
00084 template <class TImageSpatialObject>
00085 class DICOMImageReader : public ImageReader< TImageSpatialObject >
00086 {
00087
00088 public:
00089
00091 igstkStandardTemplatedAbstractClassTraitsMacro( DICOMImageReader, \
00092 ImageReader< TImageSpatialObject> )
00093
00094 public:
00095
00098 typedef std::string DirectoryNameType;
00099
00101 void RequestSetDirectory( const DirectoryNameType & directory );
00102
00104 void RequestReadImage();
00105
00107 void RequestGetModalityInformation();
00108
00110 void RequestGetPatientNameInformation();
00111
00113 typedef std::string DICOMInformationType;
00114
00119 bool FileSuccessfullyRead() const { return m_FileSuccessfullyRead; }
00120
00127 igstkUnsafeGetMacro( PatientName, DICOMInformationType );
00128
00135 igstkUnsafeGetMacro( PatientID, DICOMInformationType );
00136
00143 igstkUnsafeGetMacro( Modality, DICOMInformationType );
00144
00146 void RequestGetImage();
00147
00149 igstkLoadedTemplatedObjectEventMacro( ImageModifiedEvent, IGSTKEvent,
00150 TImageSpatialObject);
00151
00153 igstkLoggerMacro();
00154
00155 protected:
00156
00157 DICOMImageReader( void );
00158 ~DICOMImageReader( void );
00159
00161 itk::GDCMSeriesFileNames::Pointer m_FileNames;
00162 itk::GDCMImageIO::Pointer m_ImageIO;
00163
00164 typedef typename Superclass::ImageType ImageType;
00165
00166 typedef itk::ImageSeriesReader< ImageType > ImageSeriesReaderType;
00167 typedef itk::ImageFileReader< ImageType > ImageReaderType;
00168
00170 typename ImageSeriesReaderType::Pointer m_ImageSeriesReader;
00171 typename ImageReaderType::Pointer m_ImageFileReader;
00172
00174 void PrintSelf( std::ostream& os, itk::Indent indent ) const;
00175
00178 virtual const ImageType * GetITKImage() const;
00179
00180 private:
00181
00184 DICOMImageReader(const Self&);
00185 void operator=(const Self&);
00186
00187
00188 DirectoryNameType m_ImageDirectoryName;
00189 DirectoryNameType m_ImageDirectoryNameToBeSet;
00190
00192 igstkDeclareStateMacro( Idle );
00193 igstkDeclareStateMacro( ImageDirectoryNameRead );
00194 igstkDeclareStateMacro( AttemptingToReadImage );
00195 igstkDeclareStateMacro( ImageSeriesFileNamesGenerated );
00196 igstkDeclareStateMacro( ImageRead );
00197
00199 igstkDeclareInputMacro( ReadImage );
00200 igstkDeclareInputMacro( ImageDirectoryNameValid );
00201 igstkDeclareInputMacro( ImageReadingSuccess );
00202 igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingSuccess );
00203 igstkDeclareInputMacro( ResetReader );
00204 igstkDeclareInputMacro( GetImage );
00205
00207 igstkDeclareInputMacro( ImageReadingError );
00208 igstkDeclareInputMacro( ImageDirectoryNameIsEmpty );
00209 igstkDeclareInputMacro( ImageDirectoryNameDoesNotExist );
00210 igstkDeclareInputMacro( ImageDirectoryNameIsNotDirectory );
00211 igstkDeclareInputMacro( ImageDirectoryNameDoesNotHaveEnoughFiles );
00212 igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingError );
00213
00219 virtual bool CheckModalityType( DICOMInformationType modality );
00220
00222 igstkDeclareInputMacro( GetModalityInformation );
00223 igstkDeclareInputMacro( GetPatientNameInformation );
00224
00226 void SetDirectoryNameProcessing();
00227
00230 void ReadDirectoryFileNamesProcessing();
00231
00233 void AttemptReadImageProcessing();
00234
00237 void ReportInvalidRequestProcessing();
00238
00240 void ReportImageDirectoryEmptyErrorProcessing();
00241
00243 void ReportImageDirectoryDoesNotExistErrorProcessing();
00244
00247 void ReportImageDirectoryDoesNotHaveEnoughFilesErrorProcessing();
00248
00251 void ReportImageSeriesFileNamesGeneratingErrorProcessing();
00252
00255 void ReportImageSeriesFileNamesGeneratingSuccessProcessing();
00256
00258 void ReportImageReadingErrorProcessing();
00259
00261 void ReportImageReadingSuccessProcessing();
00262
00264 void ReportImageProcessing();
00265
00267 void ResetReaderProcessing();
00268
00271 void ReportImageDirectoryIsNotDirectoryErrorProcessing();
00272
00275 void GetModalityInformationProcessing();
00276
00279 void GetPatientNameInformationProcessing();
00280
00282 bool m_FileSuccessfullyRead;
00283
00285 DICOMInformationType m_PatientID;
00286 DICOMInformationType m_PatientName;
00287 DICOMInformationType m_Modality;
00288 DICOMInformationType m_GantryTilt;
00289
00291 std::string m_ImageReadingErrorInformation;
00292 };
00293
00294 }
00295
00296 #ifndef IGSTK_MANUAL_INSTANTIATION
00297 #include "igstkDICOMImageReader.txx"
00298 #endif
00299
00300 #endif // __igstkDICOMImageReader_h