00001 /*========================================================================= 00002 00003 Program: GDCM (Grassroots DICOM). A DICOM library 00004 Module: $URL$ 00005 00006 Copyright (c) 2006-2010 Mathieu Malaterre 00007 All rights reserved. 00008 See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00015 // .NAME vtkGDCMMedicalImageProperties - some medical image properties. 00016 // .SECTION Description 00017 // vtkGDCMMedicalImageProperties is a helper class that can be used by medical 00018 // image readers and applications to encapsulate medical image/acquisition 00019 // properties. Later on, this should probably be extended to add 00020 // any user-defined property. 00021 // .SECTION See Also 00022 // vtkMedicalImageReader2 00023 00024 #ifndef VTKGDCMMEDICALIMAGEPROPERTIES_H 00025 #define VTKGDCMMEDICALIMAGEPROPERTIES_H 00026 00027 #include "vtkMedicalImageProperties.h" 00028 00029 class vtkGDCMMedicalImagePropertiesInternals; 00030 //BTX 00031 namespace gdcm { class File; } 00032 //ETX 00033 00034 class VTK_EXPORT vtkGDCMMedicalImageProperties : public vtkMedicalImageProperties 00035 { 00036 public: 00037 static vtkGDCMMedicalImageProperties *New(); 00038 vtkTypeRevisionMacro(vtkGDCMMedicalImageProperties,vtkMedicalImageProperties); 00039 void PrintSelf(ostream& os, vtkIndent indent); 00040 00041 // Description: 00042 // Convenience method to reset all fields to an emptry string/value 00043 virtual void Clear(); 00044 00045 /* 00046 // Description: 00047 // Patient name 00048 // For ex: DICOM (0010,0010) = DOE,JOHN 00049 vtkSetStringMacro(PatientName); 00050 vtkGetStringMacro(PatientName); 00051 00052 // Description: 00053 // Patient ID 00054 // For ex: DICOM (0010,0020) = 1933197 00055 vtkSetStringMacro(PatientID); 00056 vtkGetStringMacro(PatientID); 00057 00058 // Description: 00059 // Patient age 00060 // Format: nnnD, nnW, nnnM or nnnY (eventually nnD, nnW, nnY) 00061 // with D (day), M (month), W (week), Y (year) 00062 // For ex: DICOM (0010,1010) = 031Y 00063 vtkSetStringMacro(PatientAge); 00064 vtkGetStringMacro(PatientAge); 00065 00066 // Description: 00067 // Take as input a string in VR=AS (DICOM PS3.5) and extract either 00068 // different fields namely: year month week day 00069 // Return 0 on error, 1 on success 00070 // One can test fields if they are different from -1 upon success 00071 static int GetAgeAsFields(const char *age, int &year, int &month, int &week, int &day); 00072 00073 // For Tcl: 00074 // From C++ use GetPatientAge + GetAgeAsField 00075 // Those function parse a DICOM string, and return the value of the number expressed 00076 // this is either expressed in year, month or days. Thus if a string is expressed in years 00077 // GetPatientAgeDay/GetPatientAgeWeek/GetPatientAgeMonth will return 0 00078 int GetPatientAgeYear(); 00079 int GetPatientAgeMonth(); 00080 int GetPatientAgeWeek(); 00081 int GetPatientAgeDay(); 00082 00083 // Description: 00084 // Patient sex 00085 // For ex: DICOM (0010,0040) = M 00086 vtkSetStringMacro(PatientSex); 00087 vtkGetStringMacro(PatientSex); 00088 00089 // Description: 00090 // Patient birth date 00091 // Format: yyyymmdd 00092 // For ex: DICOM (0010,0030) = 19680427 00093 vtkSetStringMacro(PatientBirthDate); 00094 vtkGetStringMacro(PatientBirthDate); 00095 00096 // For Tcl: 00097 // From C++ use GetPatientBirthDate + GetDateAsFields 00098 int GetPatientBirthDateYear(); 00099 int GetPatientBirthDateMonth(); 00100 int GetPatientBirthDateDay(); 00101 00102 // Description: 00103 // Study Date 00104 // Format: yyyymmdd 00105 // For ex: DICOM (0008,0020) = 20030617 00106 vtkSetStringMacro(StudyDate); 00107 vtkGetStringMacro(StudyDate); 00108 00109 // Description: 00110 // Acquisition Date 00111 // Format: yyyymmdd 00112 // For ex: DICOM (0008,0022) = 20030617 00113 vtkSetStringMacro(AcquisitionDate); 00114 vtkGetStringMacro(AcquisitionDate); 00115 00116 // For Tcl: 00117 // From C++ use GetAcquisitionDate + GetDateAsFields 00118 int GetAcquisitionDateYear(); 00119 int GetAcquisitionDateMonth(); 00120 int GetAcquisitionDateDay(); 00121 00122 // Description: 00123 // Study Time 00124 // Format: hhmmss.frac (any trailing component(s) can be ommited) 00125 // For ex: DICOM (0008,0030) = 162552.0705 or 230012, or 0012 00126 vtkSetStringMacro(StudyTime); 00127 vtkGetStringMacro(StudyTime); 00128 00129 // Description: 00130 // Acquisition time 00131 // Format: hhmmss.frac (any trailing component(s) can be ommited) 00132 // For ex: DICOM (0008,0032) = 162552.0705 or 230012, or 0012 00133 vtkSetStringMacro(AcquisitionTime); 00134 vtkGetStringMacro(AcquisitionTime); 00135 00136 // Description: 00137 // Image Date aka Content Date 00138 // Format: yyyymmdd 00139 // For ex: DICOM (0008,0023) = 20030617 00140 vtkSetStringMacro(ImageDate); 00141 vtkGetStringMacro(ImageDate); 00142 00143 // For Tcl: 00144 // From C++ use GetImageDate + GetDateAsFields 00145 int GetImageDateYear(); 00146 int GetImageDateMonth(); 00147 int GetImageDateDay(); 00148 00149 // Description: 00150 // Take as input a string in ISO 8601 date (YYYY/MM/DD) and extract the 00151 // different fields namely: year month day 00152 // Return 0 on error, 1 on success 00153 static int GetDateAsFields(const char *date, int &year, int &month, int &day); 00154 00155 // Description: 00156 // Take as input a string in ISO 8601 date (YYYY/MM/DD) and construct a 00157 // locale date based on the different fields (see GetDateAsFields to extract 00158 // different fields) 00159 // Return 0 on error, 1 on success 00160 static int GetDateAsLocale(const char *date, char *locale); 00161 00162 // Description: 00163 // Image Time 00164 // Format: hhmmss.frac (any trailing component(s) can be ommited) 00165 // For ex: DICOM (0008,0033) = 162552.0705 or 230012, or 0012 00166 vtkSetStringMacro(ImageTime); 00167 vtkGetStringMacro(ImageTime); 00168 00169 // Description: 00170 // Image number 00171 // For ex: DICOM (0020,0013) = 1 00172 vtkSetStringMacro(ImageNumber); 00173 vtkGetStringMacro(ImageNumber); 00174 00175 // Description: 00176 // Series number 00177 // For ex: DICOM (0020,0011) = 902 00178 vtkSetStringMacro(SeriesNumber); 00179 vtkGetStringMacro(SeriesNumber); 00180 00181 // Description: 00182 // Series Description 00183 // User provided description of the Series 00184 // For ex: DICOM (0008,103e) = SCOUT 00185 vtkSetStringMacro(SeriesDescription); 00186 vtkGetStringMacro(SeriesDescription); 00187 00188 // Description: 00189 // Study ID 00190 // For ex: DICOM (0020,0010) = 37481 00191 vtkSetStringMacro(StudyID); 00192 vtkGetStringMacro(StudyID); 00193 00194 // Description: 00195 // Study description 00196 // For ex: DICOM (0008,1030) = BRAIN/C-SP/FACIAL 00197 vtkSetStringMacro(StudyDescription); 00198 vtkGetStringMacro(StudyDescription); 00199 00200 // Description: 00201 // Modality 00202 // For ex: DICOM (0008,0060)= CT 00203 vtkSetStringMacro(Modality); 00204 vtkGetStringMacro(Modality); 00205 00206 // Description: 00207 // Manufacturer 00208 // For ex: DICOM (0008,0070) = Siemens 00209 vtkSetStringMacro(Manufacturer); 00210 vtkGetStringMacro(Manufacturer); 00211 00212 // Description: 00213 // Manufacturer's Model Name 00214 // For ex: DICOM (0008,1090) = LightSpeed QX/i 00215 vtkSetStringMacro(ManufacturerModelName); 00216 vtkGetStringMacro(ManufacturerModelName); 00217 00218 // Description: 00219 // Station Name 00220 // For ex: DICOM (0008,1010) = LSPD_OC8 00221 vtkSetStringMacro(StationName); 00222 vtkGetStringMacro(StationName); 00223 00224 // Description: 00225 // Institution Name 00226 // For ex: DICOM (0008,0080) = FooCity Medical Center 00227 vtkSetStringMacro(InstitutionName); 00228 vtkGetStringMacro(InstitutionName); 00229 00230 // Description: 00231 // Convolution Kernel (or algorithm used to reconstruct the data) 00232 // For ex: DICOM (0018,1210) = Bone 00233 vtkSetStringMacro(ConvolutionKernel); 00234 vtkGetStringMacro(ConvolutionKernel); 00235 00236 // Description: 00237 // Slice Thickness (Nominal reconstructed slice thickness, in mm) 00238 // For ex: DICOM (0018,0050) = 0.273438 00239 vtkSetStringMacro(SliceThickness); 00240 vtkGetStringMacro(SliceThickness); 00241 virtual double GetSliceThicknessAsDouble(); 00242 00243 // Description: 00244 // Peak kilo voltage output of the (x-ray) generator used 00245 // For ex: DICOM (0018,0060) = 120 00246 vtkSetStringMacro(KVP); 00247 vtkGetStringMacro(KVP); 00248 00249 // Description: 00250 // Gantry/Detector tilt (Nominal angle of tilt in degrees of the scanning 00251 // gantry.) 00252 // For ex: DICOM (0018,1120) = 15 00253 vtkSetStringMacro(GantryTilt); 00254 vtkGetStringMacro(GantryTilt); 00255 virtual double GetGantryTiltAsDouble(); 00256 00257 // Description: 00258 // Echo Time 00259 // (Time in ms between the middle of the excitation pulse and the peak of 00260 // the echo produced) 00261 // For ex: DICOM (0018,0081) = 105 00262 vtkSetStringMacro(EchoTime); 00263 vtkGetStringMacro(EchoTime); 00264 00265 // Description: 00266 // Echo Train Length 00267 // (Number of lines in k-space acquired per excitation per image) 00268 // For ex: DICOM (0018,0091) = 35 00269 vtkSetStringMacro(EchoTrainLength); 00270 vtkGetStringMacro(EchoTrainLength); 00271 00272 // Description: 00273 // Repetition Time 00274 // The period of time in msec between the beginning of a pulse sequence and 00275 // the beginning of the succeeding (essentially identical) pulse sequence. 00276 // For ex: DICOM (0018,0080) = 2040 00277 vtkSetStringMacro(RepetitionTime); 00278 vtkGetStringMacro(RepetitionTime); 00279 00280 // Description: 00281 // Exposure time (time of x-ray exposure in msec) 00282 // For ex: DICOM (0018,1150) = 5 00283 vtkSetStringMacro(ExposureTime); 00284 vtkGetStringMacro(ExposureTime); 00285 00286 // Description: 00287 // X-ray tube current (in mA) 00288 // For ex: DICOM (0018,1151) = 400 00289 vtkSetStringMacro(XRayTubeCurrent); 00290 vtkGetStringMacro(XRayTubeCurrent); 00291 00292 // Description: 00293 // Exposure (The exposure expressed in mAs, for example calculated 00294 // from Exposure Time and X-ray Tube Current) 00295 // For ex: DICOM (0018,1152) = 114 00296 vtkSetStringMacro(Exposure); 00297 vtkGetStringMacro(Exposure); 00298 00299 // Interface to allow insertion of user define values, for instance in DICOM one would want to 00300 // store the Protocol Name (0018,1030), in this case one would do: 00301 // AddUserDefinedValue( "Protocol Name", "T1W/SE/1024" ); 00302 void AddUserDefinedValue(const char *name, const char *value); 00303 // Get a particular user value 00304 const char *GetUserDefinedValue(const char *name); 00305 // Get the number of user defined values 00306 unsigned int GetNumberOfUserDefinedValues(); 00307 // Get a name/value by index 00308 const char *GetUserDefinedNameByIndex(unsigned int idx); 00309 const char *GetUserDefinedValueByIndex(unsigned int idx); 00310 00311 // Description: 00312 // Copy the contents of p to this instance. 00313 virtual void DeepCopy(vtkGDCMMedicalImageProperties *p); 00314 00315 // Description: 00316 // Add/Remove/Query the window/level presets that may have been associated 00317 // to a medical image. Window is also known as 'width', level is also known 00318 // as 'center'. The same window/level pair can not be added twice. 00319 // As a convenience, a comment (aka Explanation) can be associated to a preset. 00320 // For ex: DICOM Window Center (0028,1050) = 00045\000470 00321 // DICOM Window Width (0028,1051) = 0106\03412 00322 // DICOM Window Center Width Explanation (0028,1055) = WINDOW1\WINDOW2 00323 virtual void AddWindowLevelPreset(double w, double l); 00324 virtual void RemoveWindowLevelPreset(double w, double l); 00325 virtual void RemoveAllWindowLevelPresets(); 00326 virtual int GetNumberOfWindowLevelPresets(); 00327 virtual int HasWindowLevelPreset(double w, double l); 00328 virtual int GetNthWindowLevelPreset(int idx, double *w, double *l); 00329 virtual double* GetNthWindowLevelPreset(int idx); 00330 virtual void SetNthWindowLevelPresetComment(int idx, const char *comment); 00331 virtual const char* GetNthWindowLevelPresetComment(int idx); 00332 00333 // Description: 00334 // Mapping from a sliceidx within a volumeidx into a DICOM Instance UID 00335 // Some DICOM reader can populate this structure so that later on from a slice index 00336 // in a vtkImageData volume we can backtrack and find out which 2d slice it was coming from 00337 const char *GetInstanceUIDFromSliceID(int volumeidx, int sliceid); 00338 void SetInstanceUIDFromSliceID(int volumeidx, int sliceid, const char *uid); 00339 00340 // Description: 00341 // Provides the inverse mapping. Returns -1 if a slice for this uid is 00342 // not found. 00343 int GetSliceIDFromInstanceUID(int &volumeidx, const char *uid); 00344 00345 //BTX 00346 typedef enum { 00347 AXIAL = 0, 00348 CORONAL, 00349 SAGITTAL 00350 } OrientationType; 00351 //ETX 00352 int GetOrientationType(int volumeidx); 00353 void SetOrientationType(int volumeidx, int orientation); 00354 static const char *GetStringFromOrientationType(unsigned int type); 00355 */ 00356 protected: 00357 vtkGDCMMedicalImageProperties(); 00358 ~vtkGDCMMedicalImageProperties(); 00359 00360 //BTX 00361 friend class vtkGDCMImageReader; 00362 friend class vtkGDCMImageWriter; 00363 void PushBackFile(gdcm::File const &f); 00364 gdcm::File const & GetFile(unsigned int t); 00365 //ETX 00366 00367 private: 00368 vtkGDCMMedicalImagePropertiesInternals *Internals; 00369 00370 vtkGDCMMedicalImageProperties(const vtkGDCMMedicalImageProperties&); // Not implemented. 00371 void operator=(const vtkGDCMMedicalImageProperties&); // Not implemented. 00372 }; 00373 00374 #endif