IGSTK
/build/buildd/igstk-4.4.0/Source/igstkDICOMImageReader.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Image Guided Surgery Software Toolkit
00004   Module:    $RCSfile: igstkDICOMImageReader.h,v $
00005   Language:  C++
00006   Date:      $Date: 2009-06-15 19:54:58 $
00007   Version:   $Revision: 1.18 $
00008 
00009   Copyright (c) ISC  Insight Software Consortium.  All rights reserved.
00010   See IGSTKCopyright.txt or http://www.igstk.org/copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00014      PURPOSE.  See the above copyright notices for more information.
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 // Invalid request error event 
00047 igstkEventMacro( DICOMImageReaderErrorEvent, IGSTKErrorWithStringEvent );
00048 igstkEventMacro( DICOMInvalidRequestErrorEvent,
00049                DICOMImageReaderErrorEvent );
00050 
00051 // Events to handle errors with the ImageDirectory name
00052 igstkEventMacro(DICOMImageDirectoryEmptyErrorEvent,
00053               DICOMImageReaderErrorEvent );
00054 igstkEventMacro(DICOMImageDirectoryDoesNotExistErrorEvent,
00055               DICOMImageReaderErrorEvent );
00056 igstkEventMacro(DICOMImageDirectoryIsNotDirectoryErrorEvent,
00057               DICOMImageReaderErrorEvent );
00058 igstkEventMacro(DICOMImageDirectoryDoesNotHaveEnoughFilesErrorEvent,
00059               DICOMImageReaderErrorEvent );
00060 
00061 // Image series filename generation error event
00062 igstkEventMacro(DICOMImageSeriesFileNamesGeneratingErrorEvent,
00063               DICOMImageReaderErrorEvent );
00064 
00065 //Image reading error
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&);    //purposely not implemented
00195   void operator=(const Self&);      //purposely not implemented
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 } // end namespace igstk
00305 
00306 #ifndef IGSTK_MANUAL_INSTANTIATION
00307 #include "igstkDICOMImageReader.txx"
00308 #endif
00309 
00310 #endif // __igstkDICOMImageReader_h