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
00103 void RequestSetProgressCallback(itk::Command *progressCallback)
00104 {
00105 m_ImageSeriesReader->AddObserver(itk::ProgressEvent(),progressCallback);
00106 }
00107
00108 void RequestSetAbortCallback(itk::Command *abortCallback)
00109 {
00110 m_ImageSeriesReader->AddObserver(itk::AbortEvent(),abortCallback);
00111 }
00112
00114 void RequestReadImage();
00115
00117 void RequestGetModalityInformation();
00118
00120 void RequestGetPatientNameInformation();
00121
00123 typedef std::string DICOMInformationType;
00124
00129 bool FileSuccessfullyRead() const { return m_FileSuccessfullyRead; }
00130
00137 igstkUnsafeGetMacro( PatientName, DICOMInformationType );
00138
00145 igstkUnsafeGetMacro( PatientID, DICOMInformationType );
00146
00153 igstkUnsafeGetMacro( Modality, DICOMInformationType );
00154
00156 void RequestGetImage();
00157
00159 igstkLoadedTemplatedObjectEventMacro( ImageModifiedEvent, IGSTKEvent,
00160 TImageSpatialObject);
00161
00163 igstkLoggerMacro();
00164
00165 protected:
00166
00167 DICOMImageReader( void );
00168 ~DICOMImageReader( void );
00169
00171 itk::GDCMSeriesFileNames::Pointer m_FileNames;
00172 itk::GDCMImageIO::Pointer m_ImageIO;
00173
00174 typedef typename Superclass::ImageType ImageType;
00175
00176 typedef itk::ImageSeriesReader< ImageType > ImageSeriesReaderType;
00177 typedef itk::ImageFileReader< ImageType > ImageReaderType;
00178
00180 typename ImageSeriesReaderType::Pointer m_ImageSeriesReader;
00181 typename ImageReaderType::Pointer m_ImageFileReader;
00182
00184 void PrintSelf( std::ostream& os, itk::Indent indent ) const;
00185
00188 virtual const ImageType * GetITKImage() const;
00189
00190 private:
00191
00194 DICOMImageReader(const Self&);
00195 void operator=(const Self&);
00196
00197
00198 DirectoryNameType m_ImageDirectoryName;
00199 DirectoryNameType m_ImageDirectoryNameToBeSet;
00200
00202 igstkDeclareStateMacro( Idle );
00203 igstkDeclareStateMacro( ImageDirectoryNameRead );
00204 igstkDeclareStateMacro( AttemptingToReadImage );
00205 igstkDeclareStateMacro( ImageSeriesFileNamesGenerated );
00206 igstkDeclareStateMacro( ImageRead );
00207
00209 igstkDeclareInputMacro( ReadImage );
00210 igstkDeclareInputMacro( ImageDirectoryNameValid );
00211 igstkDeclareInputMacro( ImageReadingSuccess );
00212 igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingSuccess );
00213 igstkDeclareInputMacro( ResetReader );
00214 igstkDeclareInputMacro( GetImage );
00215
00217 igstkDeclareInputMacro( ImageReadingError );
00218 igstkDeclareInputMacro( ImageDirectoryNameIsEmpty );
00219 igstkDeclareInputMacro( ImageDirectoryNameDoesNotExist );
00220 igstkDeclareInputMacro( ImageDirectoryNameIsNotDirectory );
00221 igstkDeclareInputMacro( ImageDirectoryNameDoesNotHaveEnoughFiles );
00222 igstkDeclareInputMacro( ImageSeriesFileNamesGeneratingError );
00223
00229 virtual bool CheckModalityType( DICOMInformationType modality );
00230
00232 igstkDeclareInputMacro( GetModalityInformation );
00233 igstkDeclareInputMacro( GetPatientNameInformation );
00234
00236 void SetDirectoryNameProcessing();
00237
00240 void ReadDirectoryFileNamesProcessing();
00241
00243 void AttemptReadImageProcessing();
00244
00247 void ReportInvalidRequestProcessing();
00248
00250 void ReportImageDirectoryEmptyErrorProcessing();
00251
00253 void ReportImageDirectoryDoesNotExistErrorProcessing();
00254
00257 void ReportImageDirectoryDoesNotHaveEnoughFilesErrorProcessing();
00258
00261 void ReportImageSeriesFileNamesGeneratingErrorProcessing();
00262
00265 void ReportImageSeriesFileNamesGeneratingSuccessProcessing();
00266
00268 void ReportImageReadingErrorProcessing();
00269
00271 void ReportImageReadingSuccessProcessing();
00272
00274 void ReportImageProcessing();
00275
00277 void ResetReaderProcessing();
00278
00281 void ReportImageDirectoryIsNotDirectoryErrorProcessing();
00282
00285 void GetModalityInformationProcessing();
00286
00289 void GetPatientNameInformationProcessing();
00290
00292 bool m_FileSuccessfullyRead;
00293
00295 DICOMInformationType m_PatientID;
00296 DICOMInformationType m_PatientName;
00297 DICOMInformationType m_Modality;
00298 DICOMInformationType m_GantryTilt;
00299
00301 std::string m_ImageReadingErrorInformation;
00302 };
00303
00304 }
00305
00306 #ifndef IGSTK_MANUAL_INSTANTIATION
00307 #include "igstkDICOMImageReader.txx"
00308 #endif
00309
00310 #endif // __igstkDICOMImageReader_h