/*========================================================================= Program: wxMaracas Module: $RCSfile: marSimpleDicom.h,v $ Language: C++ Date: $Date: 2008/10/31 16:32:56 $ Version: $Revision: 1.1 $ Copyright: (c) 2002, 2003 License: This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef __MAR__KERNEL__MARSIMPLEDICOM__HXX__ #define __MAR__KERNEL__MARSIMPLEDICOM__HXX__ #include "marDicomBase.h" #include "volume.hxx" #include #include // PS -> #include // PS -> #include #include // PS -> #include typedef std::vector SerieInfo; //DICOM info for each serie /** * Shouldn't we break the dependencies to wx ??? * * We use vector instead of list for efficiency: for access time * futhermore the number of patient is not changing a lot, so we * might add the number of patient to params.dat, to allocate the right * number of vector * */ // EED Borrame //class MAR_KERNEL_EXPORT marGdcmDicom : public marObject class marSimpleDicom : public marFilesBase { public: enum DicomTags { ID_File_Name = 0 , ID_SOP_Class_UID ,//!0008 0016 UI ID SOP Class UID ID_SOP_Instance_UID ,//!0008 0018 UI ID SOP Instance UID ID_Study_Date ,//!0008 0020 DA ID Study Date ID_Series_Date ,//!0008 0021 DA ID Series Date ID_Acquisition_Date ,//!0008 0022 DA ID Acquisition Date ID_Image_Date ,//!0008 0023 DA ID Image Date ID_Study_Time ,//!0008 0030 TM ID Study Time ID_Series_Time ,//!0008 0031 TM ID Series Time ID_Acquisition_Time ,//!0008 0032 TM ID Acquisition Time ID_Image_Time ,//!0008 0033 TM ID Image Time ID_Modality ,//!0008 0060 CS ID Modality ID_Manufacturer ,//!0008 0070 LO ID Manufacturer ID_Institution_Name ,//!0008 0080 LO ID Institution Name ID_Study_Description ,//!0008 1030 LO ID Study Description ID_Series_Description ,//!0008 103e LO ID Series Description ID_Admitting_Diagnoses_Description ,//!0008 1080 LO ID Admitting Diagnoses Description ID_Patient_Name ,//!0010 0010 PN PAT Patient Name ID_Patient_ID ,//!0010 0020 LO PAT Patient ID ID_Body_Part_Examined ,//!0018 0015 CS ACQ Body Part Examined ID_Scanning_Sequence ,//!0018 0020 CS ACQ Scanning Sequence ID_Sequence_Variant ,//!0018 0021 CS ACQ Sequence Variant ID_Scan_Options ,//!0018 0022 CS ACQ Scan Options ID_MR_Acquisition_Type ,//!0018 0023 CS ACQ MR Acquisition Type ID_Sequence_Name ,//!0018 0024 SH ACQ Sequence Name ID_Slice_Thickness ,//!0018 0050 DS ACQ Slice Thickness ID_Repetition_Time ,//!0018 0080 DS ACQ Repetition Time ID_Echo_Time ,//!0018 0081 DS ACQ Echo Time ID_Inversion_Time ,//!0018 0082 DS ACQ Inversion Time ID_Number_of_Averages ,//!0018 0083 DS ACQ Number of Averages ID_Imaging_Frequency ,//!0018 0084 DS ACQ Imaging Frequency ID_Imaged_Nucleus ,//!0018 0085 SH ACQ Imaged Nucleus ID_Echo_Number ,//!0018 0086 IS ACQ Echo Number ID_Magnetic_Field_Strength ,//!0018 0087 DS ACQ Magnetic Field Strength ID_Spacing_Between_Slices ,//!0018 0088 DS ACQ Spacing Between Slices ID_Echo_Train_Length ,//!0018 0091 IS ACQ Echo Train Length ID_Percent_Sampling ,//!0018 0093 DS ACQ Percent Sampling ID_Percent_Phase_Field_of_View ,//!0018 0094 DS ACQ Percent Phase Field of View ID_Receiving_Coil ,//!0018 1250 SH ACQ Receiving Coil ID_Patient_Position ,//!0018 5100 CS ACQ Patient Position ID_Study_Instance_UID ,//!0020 000d UI REL Study Instance UID ID_Series_Instance_UID ,//!0020 000e UI REL Series Instance UID ID_Study_ID ,//!0020 0010 SH REL Study ID ID_Series_Number ,//!0020 0011 IS REL Series Number ID_Acquisition_Number ,//!0020 0012 IS REL Acquisition Number ID_Image_Number ,//!0020 0013 IS REL Image Number ID_Patient_Orientation ,//!0020 0020 CS REL Patient Orientation ID_Image_Position ,//!0020 0030 RET REL Image Position ID_Image_Position_Patient ,//!0020 0032 DS REL Image Position Patient ID_Image_Orientation ,//!0020 0035 RET REL Image Orientation ID_Image_Orientation_Patient ,//!0020 0037 DS REL Image Orientation (Patient) ID_Location ,//!0020 0050 RET REL Location ID_Frame_of_Reference_UID ,//!0020 0052 UI REL Frame of Reference UID ID_Slice_Location ,//!0020 1041 DS REL Slice Location ID_Image_Comments ,//!0020 4000 LT REL Image Comments ID_Pixel_Spacing ,//!0028 0030 DS IMG Pixel Spacing ID_Window_Center ,//!0028 1050 DS IMG Window Center ID_Window_Width ,//!0028 1051 DS IMG Window Width ID_dicom_tags_count }; public: void SetVolumeData( int dimX, int dimY, int dimZ, float spacingX, float spacingY, float spacingZ, float rescaleSlope, float rescaleIntercept, unsigned short * pixels); marSimpleDicom( marParameters* p = NULL ); virtual ~marSimpleDicom( ); /** Function which return an *ordered* array string The string is ordered so that filename are in the right order */ // PS -> wxArrayString getStudyInfo( ) { return( m_DicomInfo[m_ActualStudy][0] ); } // PS -> int getNumberOfStudies( ) { return m_DicomInfo.size(); } // PS -> wxArrayString getSerieInfo( ) { return( m_DicomInfo[m_ActualStudy][m_ActualSerie] ); } // PS -> int getNumberOfSeries( ) { return m_DicomInfo[m_ActualStudy].size(); } // PS -> int getNumberOfFiles( ) // PS -> { // PS -> return m_DicomInfo[m_ActualStudy][m_ActualSerie].GetCount(); // PS -> } void SetInvestSliceOrder(bool investSliceOrder); void loadActualSerie(wxGauge* gauge ); // PS -> wxArrayString getImageNumbers( ) // PS -> { // PS -> wxArrayString imageNumbers; // PS -> std::list flist = helper->GetGdcmFileList(); // PS -> for(std::list::iterator it = flist.begin(); // PS -> it != flist.end(); it++ ) // PS -> { // PS -> imageNumbers.Add( wxString::Format("%d", (*it)->GetImageNumber()) ); // PS -> } // PS -> return( imageNumbers ); // PS -> } // PS -> void loadVolume( bool force = false, wxGauge* gauge = NULL); void loadVolumeDXMM( bool force = false, wxGauge* gauge = NULL); // PS -> // PS -> bool setActualStudy( unsigned int studynumber ) // PS -> { // PS -> m_ActualStudy = studynumber; // PS -> return true; // PS -> } // PS -> bool setActualSerie( unsigned int serienumber ) // PS -> { // PS -> m_ActualSerie = serienumber; // PS -> return true; // PS -> } // PS -> /** * General methods */ void reset( ); void copyFrom( const marObject& from ); /** * Persistence methods */ bool save( std::ofstream& os ); bool load( std::ifstream& is ); // PS -> void FillDicomInfo(); // PS -> wxString GetPatientName() // PS -> { // PS -> return wxString( helper->GetGdcmHeader()->GetPubElValByNumber(0x0010,0x0010).c_str()).Trim();//0010 0010 PN PAT Patient Name // PS -> } private: // PS -> wxArrayString gdcmGetExamInfo( wxString directoryname ); std::vector< SerieInfo > m_DicomInfo; unsigned int m_ActualStudy; unsigned int m_ActualSerie; // PS -> gdcmSerieHeaderHelper *helper; unsigned short * m_pSlicesPixels; int m_nX, m_nY, m_nSlices; float m_PixelSpacingColumn,m_PixelSpacingRow,m_PixelSpacingSlice; float m_RescaleSlope, m_RescaleIntercept; bool _investSliceOrder; }; #endif // __MAR__KERNEL__MARSIMPLEDICOM__HXX__