1 /*========================================================================= 2 * 3 * Copyright Insight Software Consortium 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0.txt 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 *=========================================================================*/ 18 /** 19 * \file itkSiemensVisionImageIO.h 20 * 21 * Much of the code for this file reader/writer was taken from 22 * the University of Iowa Imaging Group library with the 23 * permission of the authors, Milan Sonka, Joseph Reinhardt, 24 * Ryan Long, Hans Johnson, Gary Christensen, and others. 25 * The specification for this file format is taken from the 26 * web site http://analyzedirect.com/support/10.0Documents/Analyze_Resource_01.pdf 27 * \author Kent Williams 28 * The University of Iowa 2003 29 * \brief This file was written as a modification to the itkMetaImageIO 30 * as a new method for reading in files from the GE4 scanner. 31 */ 32 33 #ifndef itkSiemensVisionImageIO_h 34 #define itkSiemensVisionImageIO_h 35 #include "ITKIOSiemensExport.h" 36 37 38 #include "itkIPLCommonImageIO.h" 39 40 namespace itk 41 { 42 /** \class SiemensVisionImageIO 43 * 44 * \author Hans J. Johnson 45 * \brief Class that defines how to read SiemensVision file format. 46 * 47 * \ingroup IOFilters 48 * \ingroup ITKIOSiemens 49 */ 50 class ITKIOSiemens_EXPORT SiemensVisionImageIO:public IPLCommonImageIO 51 { 52 public: 53 ITK_DISALLOW_COPY_AND_ASSIGN(SiemensVisionImageIO); 54 55 /** Standard class type aliases. */ 56 using Self = SiemensVisionImageIO; 57 using Superclass = IPLCommonImageIO; 58 using Pointer = SmartPointer< Self >; 59 60 /** Method for creation through the object factory. */ 61 itkNewMacro(Self); 62 63 /** Run-time type information (and related methods). */ 64 itkTypeMacro(SiemensVisionImageIO, Superclass); 65 66 /*-------- This part of the interfaces deals with reading data. ----- */ 67 68 /** Determine if the file can be read with this ImageIO implementation. 69 * \author Hans J Johnson 70 * \param FileNameToRead The name of the file to test for reading. 71 * \post Sets classes ImageIOBase::m_FileName variable to be FileNameToWrite 72 * \return Returns true if this ImageIO can read the file specified. 73 */ 74 bool CanReadFile(const char *FileNameToRead) override; 75 76 /* * Set the spacing and dimension information for the set filename. */ 77 // Implemented in superclass 78 // virtual void ReadImageInformation(); 79 80 /* * Get the type of the pixel. */ 81 // Implemented in superclass 82 // virtual const std::type_info& GetPixelType() const; 83 84 /* * Reads the data from disk into the memory buffer provided. */ 85 // Implemented in superclass 86 // virtual void Read(void* buffer); 87 88 /* * Compute the size (in bytes) of the components of a pixel. For 89 * example, and RGB pixel of unsigned char would have a 90 * component size of 1 byte. */ 91 // Implemented in superclass 92 // virtual unsigned int GetComponentSize() const; 93 94 /*-------- This part of the interfaces deals with writing data. ----- */ 95 96 /* * Determine if the file can be written with this ImageIO implementation. 97 * \param FileNameToWrite The name of the file to test for writing. 98 * \author Hans J. Johnson 99 * \post Sets classes ImageIOBase::m_FileName variable to be FileNameToWrite 100 * \return Returns true if this ImageIO can write the file specified. 101 */ 102 // Implemented in superclass 103 // virtual bool CanWriteFile(const char * FileNameToWrite); 104 105 /* * Set the spacing and dimension information for the set filename. */ 106 // Implemented in superclass 107 // virtual void WriteImageInformation(); 108 109 /* * Writes the data to disk from the memory buffer provided. Make sure 110 * that the IORegions has been set properly. */ 111 // Implemented in superclass 112 // virtual void Write(const void* buffer); 113 114 protected: 115 SiemensVisionImageIO(); 116 ~SiemensVisionImageIO() override; 117 // Implemented in superclass 118 // void PrintSelf(std::ostream& os, Indent indent) const; 119 GEImageHeader * ReadHeader(const char *FileNameToRead) override; 120 121 private: 122 typedef enum { 123 HDR_STUDY_YEAR = 0, // Study date year, u_int 124 HDR_STUDY_YEAR_LEN = 4, 125 HDR_STUDY_MONTH = 4, // Study date month, u_int 126 HDR_STUDY_MONTH_LEN = 4, 127 HDR_STUDY_DAY = 8, // Study date day, u_int 128 HDR_STUDY_DAY_LEN = 4, 129 HDR_ACQ_YEAR = 12, // Acquisition date year, u_int 130 HDR_ACQ_YEAR_LEN = 4, 131 HDR_ACQ_MONTH = 16, // Acquisition date month, u_int 132 HDR_ACQ_MONTH_LEN = 4, 133 HDR_ACQ_DAY = 20, // Acquisition date day, u_int 134 HDR_ACQ_DAY_LEN = 4, 135 HDR_IMAGE_YEAR = 24, // Image date year, u_int 136 HDR_IMAGE_YEAR_LEN = 4, 137 HDR_IMAGE_MONTH = 28, // Image date month, u_int 138 HDR_IMAGE_MONTH_LEN = 4, 139 HDR_IMAGE_DAY = 32, // Image date day, u_int 140 HDR_IMAGE_DAY_LEN = 4, 141 HDR_STUDY_HOUR = 36, // Study time hour, u_int 142 HDR_STUDY_HOUR_LEN = 4, 143 HDR_STUDY_MIN = 40, // Study time minute, u_int 144 HDR_STUDY_MIN_LEN = 4, 145 HDR_STUDY_SEC = 44, // Study time second, u_int 146 HDR_STUDY_SEC_LEN = 4, 147 HDR_ACQ_HOUR = 52, // Acquisition time second, u_int 148 HDR_ACQ_HOUR_LEN = 4, 149 HDR_ACQ_MIN = 56, // Acquisition time second, u_int 150 HDR_ACQ_MIN_LEN = 4, 151 HDR_ACQ_SEC = 60, // Acquisition time second, u_int 152 HDR_ACQ_SEC_LEN = 4, 153 HDR_IMAGE_HOUR = 68, // Image Creation time second, u_int 154 HDR_IMAGE_HOUR_LEN = 4, 155 HDR_IMAGE_MIN = 72, // Image Creation time second, u_int 156 HDR_IMAGE_MIN_LEN = 4, 157 HDR_IMAGE_SEC = 76, // Image Creation time second, u_int 158 HDR_IMAGE_SEC_LEN = 4, 159 HDR_MANUFAC = 96, // Scanner Manufacturer, char 160 HDR_MANUFAC_LEN = 7, 161 HDR_INSTUTE_NAME = 105, // Institution Name, char 162 HDR_INSTUTE_NAME_LEN = 25, 163 HDR_ANNOTATION = 186, // Annotation, char 164 HDR_ANNOTATION_LEN = 32, 165 HDR_MODEL_NAME = 281, // Scanner Model Name, char 166 HDR_MODEL_NAME_LEN = 12, 167 HDR_LMOVE_YEAR = 412, // Date of Last Image Move - year, u_int 168 HDR_LMOVE_YEAR_LEN = 4, 169 HDR_LMOVE_MONTH = 416, // Date of Last Image Move - month, u_int 170 HDR_LMOVE_MONTH_LEN = 4, 171 HDR_LMOVE_DAY = 420, // Date of Last Image Move - day, u_int 172 HDR_LMOVE_DAY_LEN = 4, 173 HDR_LMOVE_HOUR = 424, // Date of Last Image Move - hour, u_int 174 HDR_LMOVE_HOUR_LEN = 4, 175 HDR_LMOVE_MIN = 428, // Date of Last Image Move - minute, u_int 176 HDR_LMOVE_MIN_LEN = 4, 177 HDR_LMOVE_SEC = 432, // Date of Last Image Move - second, u_int 178 HDR_LMOVE_SEC_LEN = 4, 179 HDR_PAT_NAME = 768, // Patient Name, char 180 HDR_PAT_NAME_LEN = 25, 181 HDR_PAT_ID = 795, // Patient ID Number, char 182 HDR_PAT_ID_LEN = 12, 183 HDR_DOB_YEAR = 808, // Date of Birth year, u_int 184 HDR_DOB_YEAR_LEN = 4, 185 HDR_DOB_MONTH = 812, // Date of Birth month, u_int 186 HDR_DOB_MONTH_LEN = 4, 187 HDR_DOB_DAY = 816, // Date of Birth day, u_int 188 HDR_DOB_DAY_LEN = 4, 189 HDR_PAT_AGE = 851, // Patient Age, char 190 HDR_PAT_AGE_LEN = 3, 191 HDR_AGE_UNIT = 854, // Patient Age Unit, char 192 HDR_AGE_UNIT_LEN = 1, 193 HDR_REG_YEAR = 1052, // Registration Date year, u_int 194 HDR_REG_YEAR_LEN = 4, 195 HDR_REG_MONTH = 1056, // Registration Date month, u_int 196 HDR_REG_MONTH_LEN = 4, 197 HDR_REG_DAY = 1060, // Registration Date day, u_int 198 HDR_REG_DAY_LEN = 4, 199 HDR_REG_HOUR = 1064, // Registration Time hour, u_int 200 HDR_REG_HOUR_LEN = 4, 201 HDR_REG_MIN = 1068, // Registration Time minute, u_int 202 HDR_REG_MIN_LEN = 4, 203 HDR_REG_SEC = 1072, // Registration Time second, u_int 204 HDR_REG_SEC_LEN = 4, 205 HDR_SLICE_THCK = 1544, // Slice thickness, double 206 HDR_SLICE_THCK_LEN = 8, 207 HDR_TR = 1560, // TR, double 208 HDR_TR_LEN = 8, 209 HDR_TE = 1568, // TE, double 210 HDR_TE_LEN = 8, 211 HDR_FREQ = 1592, // Center Frequency, double 212 HDR_FREQ_LEN = 8, 213 HDR_STATION = 1639, // Station Name, char 214 HDR_STATION_LEN = 5, 215 HDR_CAL_YEAR = 1712, // Calibration Date - year, u_int 216 HDR_CAL_YEAR_LEN = 4, 217 HDR_CAL_MONTH = 1716, // Calibration Date - month, u_int 218 HDR_CAL_MONTH_LEN = 4, 219 HDR_CAL_DAY = 1720, // Calibration Date - day, u_int 220 HDR_CAL_DAY_LEN = 4, 221 HDR_CAL_HOUR = 1724, // Calibration Time - hour, u_int 222 HDR_CAL_HOUR_LEN = 4, 223 HDR_CAL_MIN = 1728, // Calibration Time - minute, u_int 224 HDR_CAL_MIN_LEN = 4, 225 HDR_CAL_SEC = 1732, // Calibration Time - second, u_int 226 HDR_CAL_SEC_LEN = 4, 227 HDR_COIL = 1767, // Receive Coil, char 228 HDR_COIL_LEN = 16, 229 HDR_IMAGE_NUC = 1828, // Imaged Nucleus, char 230 HDR_IMAGE_NUC_LEN = 4, 231 HDR_FLIP_ANGLE = 2112, // Flip Angle, double 232 HDR_FLIP_ANGLE_LEN = 8, 233 HDR_FIELD = 2560, // Field Strength, double 234 HDR_FIELD_LEN = 8, 235 HDR_DISPLAY_SIZE = 2864, // Displayed Matrix Size, u_int 236 HDR_DISPLAY_SIZE_LEN = 4, 237 HDR_SEQPROG_NAME = 2944, // Pulse Sequence Program Name, cha 238 HDR_SEQPROG_NAME_LEN = 65, 239 HDR_WKC_NAME = 3009, // Pulse Sequence Name, char 240 HDR_WKC_NAME_LEN = 65, 241 HDR_AUTHOR = 3074, // Pulse Sequence Author, char 242 HDR_AUTHOR_LEN = 9, 243 HDR_SEQUENCE_TYPE = 3083, // Pulse Sequence Type, char 244 HDR_SEQUENCE_TYPE_LEN = 8, 245 HDR_FOV_ROW = 3744, // Row FOV, double 246 HDR_FOV_ROW_LEN = 8, 247 HDR_FOV_COLUMN = 3752, // Column FOV, double 248 HDR_FOV_COLUMN_LEN = 8, 249 HDR_CENTER_X = 3768, // X Center Point, double 250 HDR_CENTER_X_LEN = 8, 251 HDR_CENTER_Y = 3776, // Y Center Point, double 252 HDR_CENTER_Y_LEN = 8, 253 HDR_CENTER_Z = 3784, // Z Center Point, double 254 HDR_CENTER_Z_LEN = 8, 255 HDR_NORMV_X = 3792, // Nornal Vector X, double 256 HDR_NORMV_X_LEN = 8, 257 HDR_NORMV_Y = 3800, // Nornal Vector Y, double 258 HDR_NORMV_Y_LEN = 8, 259 HDR_NORMV_Z = 3808, // Nornal Vector Z, double 260 HDR_NORMV_Z_LEN = 8, 261 HDR_DIST_ISO = 3816, // Distance from Isocenter, double 262 HDR_DIST_ISO_LEN = 8, 263 HDR_ROWV_X = 3832, // Row vector X, double 264 HDR_ROWV_X_LEN = 8, 265 HDR_ROWV_Y = 3840, // Row vector Y, double 266 HDR_ROWV_Y_LEN = 8, 267 HDR_ROWV_Z = 3848, // Row vector Z, double 268 HDR_ROWV_Z_LEN = 8, 269 HDR_COLMNV_X = 3856, // Column vector X, double 270 HDR_COLMNV_X_LEN = 8, 271 HDR_COLMNV_Y = 3864, // Column vector Y, double 272 HDR_COLMNV_Y_LEN = 8, 273 HDR_COLMNV_Z = 3872, // Column vector Z, double 274 HDR_COLMNV_Z_LEN = 8, 275 HDR_ORNT_SET1X = 3880, // Orientation Set 1 - X, char 276 HDR_ORNT_SET1X_LEN = 3, 277 HDR_ORNT_SET1Y = 3884, // Orientation Set 1 - Y, char 278 HDR_ORNT_SET1Y_LEN = 3, 279 HDR_ORNT_SET1Z = 3888, // Orientation Set 1 - Z, char 280 HDR_ORNT_SET1Z_LEN = 3, 281 HDR_ORNT_SET2X = 3892, // Orientation Set 2 - X, char 282 HDR_ORNT_SET2X_LEN = 3, 283 HDR_ORNT_SET2Y = 3896, // Orientation Set 2 - Y, char 284 HDR_ORNT_SET2Y_LEN = 3, 285 HDR_ORNT_SET2Z = 3900, // Orientation Set 2 - Z, char 286 HDR_ORNT_SET2Z_LEN = 3, 287 HDR_PROTOCOL_NAME = 2944, // Pulse Sequence Name, char 288 HDR_PROTOCOL_NAME_LEN = 64, 289 HDR_PIXELSIZE_ROW = 5000, // Row Pixel Size, double 290 HDR_PIXELSIZE_ROW_LEN = 8, 291 HDR_PIXELSIZE_CLMN = 5008, // Column Pixel Size, double 292 HDR_PIXELSIZE_CLMN_LEN = 8, 293 TEXT_PAT_ID = 5504, // Text Patient ID, char 294 TEXT_PAT_ID_LEN = 12, 295 TEXT_PAT_SEX = 5517, // Text Patient Sex, char 296 TEXT_PAT_SEX_LEN = 1, 297 TEXT_PAT_AGE = 5518, // Text Patient Age, char 298 TEXT_PAT_AGE_LEN = 3, 299 TEXT_AGE_UNIT = 5521, // Text Patient Age Unit (Y=year), char 300 TEXT_AGE_UNIT_LEN = 1, 301 TEXT_PAT_POS = 5529, // Text Patient Position, char 302 TEXT_PAT_POS_LEN = 7, 303 TEXT_IMG_FLAG = 5541, // Text Image Flag (IMAGE=image), char 304 TEXT_IMG_FLAG_LEN = 5, 305 TEXT_IMG_NUMBER = 5546, // Text Image Number, char 306 TEXT_IMG_NUMBER_LEN = 4, 307 TEXT_IMG_DAY = 5559, // Text Date - Day, char 308 TEXT_IMG_DAY_LEN = 2, 309 TEXT_IMG_MONTH = 5562, // Text Date - Month, char 310 TEXT_IMG_MONTH_LEN = 3, 311 TEXT_IMG_YEAR = 5566, // Text Date - Year, char 312 TEXT_IMG_YEAR_LEN = 4, 313 TEXT_IMG_HOUR = 5571, // Text Time - hour, char 314 TEXT_IMG_HOUR_LEN = 2, 315 TEXT_IMG_MIN = 5574, // Text Time - minute, char 316 TEXT_IMG_MIN_LEN = 2, 317 TEXT_ACQ_FLAG = 5577, // Text Acq. Time Flag (TA=time of acq), char 318 TEXT_ACQ_FLAG_LEN = 2, 319 TEXT_ACQ_MIN = 5583, // Text Acq Time - minute, char 320 TEXT_ACQ_MIN_LEN = 2, 321 TEXT_ACQ_SEC = 5586, // Text Acq Time - second, char 322 TEXT_ACQ_SEC_LEN = 2, 323 TEXT_ANNOTATION = 5601, // Text Annotation, char 324 TEXT_ANNOTATION_LEN = 32, 325 TEXT_ORGANIZATION = 5655, // Text Organization, char 326 TEXT_ORGANIZATION_LEN = 25, 327 TEXT_STATION = 5682, // Text Station Name, char 328 TEXT_STATION_LEN = 5, 329 TEXT_ACQ_MTRX_PHASE = 5695, // Acq. Matrix Phase Axis, char 330 TEXT_ACQ_MTRX_PHASE_LEN = 3, 331 TEXT_ACQ_PHASE_DIR = 5698, // Acq. phase direction (h=hor, v=vert), char 332 TEXT_ACQ_PHASE_DIR_LEN = 1, 333 TEXT_ACQ_MTRX_FREQ = 5700, // Acq. matrix Freq Axis, char 334 TEXT_ACQ_MTRX_FREQ_LEN = 3, 335 TEXT_ACQ_MTRX_FREQO = 5703, // Acq freq (o=o " "=blank), char 336 TEXT_ACQ_MTRX_FREQO_LEN = 1, 337 TEXT_ACQ_MTRX_FREQS = 5704, // Acq freq (s=s " "=blank), char 338 TEXT_ACQ_MTRX_FREQS_LEN = 1, 339 TEXT_SEQUENCE = 5706, // Sequence Type, char 340 TEXT_SEQUENCE_LEN = 8, 341 TEXT_FLIP_ANGLE = 5714, // Flip Angle, char 342 TEXT_FLIP_ANGLE_LEN = 3, 343 TEXT_SCAN_FLAG = 5718, // Scan flag ("SCAN"), char */ 344 TEXT_SCAN_FLAG_LEN = 4, 345 TEXT_SCANA_NUM = 5723, // Scan Number A, char 346 TEXT_SCANA_NUM_LEN = 3, 347 TEXT_SCANB_NUM = 5726, // Scan Number B, char 348 TEXT_SCANB_NUM_LEN = 3, 349 TEXT_TR_FLAG = 5730, // TR flag ("TR"), char 350 TEXT_TR_FLAG_LEN = 2, 351 TEXT_TR = 5734, // TR, char 352 TEXT_TR_LEN = 7, 353 TEXT_TE_FLAG = 5742, // TE flag ("TE"), char 354 TEXT_TE_FLAG_LEN = 2, 355 TEXT_TE = 5746, // TE, char 356 TEXT_TE_LEN = 5, 357 TEXT_ECHO_NUM = 5752, // Echo number, char 358 TEXT_ECHO_NUM_LEN = 1, 359 TEXT_THCK_FLAG = 5790, // SLice thickness flag ("SL"), char 360 TEXT_THCK_FLAG_LEN = 2, 361 TEXT_SLICE_THCK = 5794, // Slice thickness 362 TEXT_SLICE_THCK_LEN = 7, 363 TEXT_POS_FLAG = 5802, // Slice position flag ("SP"), char 364 TEXT_POS_FLAG_LEN = 2, 365 TEXT_SLICE_POS = 5806, // Slice position, char 366 TEXT_SLICE_POS_LEN = 7, 367 TEXT_ANGLE_FLAG1 = 5814, // Angle flag 1 ("Sag","Cor",or,"Tra"), char 368 TEXT_ANGLE_FLAG1_LEN = 3, 369 TEXT_ANGLE_FLAG2 = 5817, // Angle flag 2 ("<", or ">"), char 370 TEXT_ANGLE_FLAG2_LEN = 1, 371 TEXT_ANGLE_FLAG3 = 5818, // Angle flag 3 ("Sag","Cor",or,"Tra"), char 372 TEXT_ANGLE_FLAG3_LEN = 3, 373 TEXT_ANGLE = 5821, // Angle, char 374 TEXT_ANGLE_LEN = 4, 375 TEXT_FOV_FLAG = 5838, // FOV flag ("FOV"), char 376 TEXT_FOV_FLAG_LEN = 3, 377 TEXT_FOVH = 5842, // Horizontal FOV, char 378 TEXT_FOVH_LEN = 3, 379 TEXT_FOVV = 5846, // Vertical FOV, char 380 TEXT_FOVV_LEN = 3, 381 TEXT_TABLEPOS_FLAG = 5874, // Table Position flag ("TP"), char 382 TEXT_TABLEPOS_FLAG_LEN = 2, 383 TEXT_TABLE_POS = 5878, // Table position 384 TEXT_TABLE_POS_LEN = 7, 385 TEXT_STUDY_FLAG = 5938, // Study flag ("STUDY"), char 386 TEXT_STUDY_FLAG_LEN = 5, 387 TEXT_STUDY_NUM = 5943, // Study number, char 388 TEXT_STUDY_NUM_LEN = 2, 389 TEXT_DOB_DAY = 5956, // Date of Birth - day, char 390 TEXT_DOB_DAY_LEN = 2, 391 TEXT_DOB_MONTH = 5959, // Date of Birth - month, char 392 TEXT_DOB_MONTH_LEN = 3, 393 TEXT_DOB_YEAR = 5963, // Date of Birth - year, char 394 TEXT_DOB_YEAR_LEN = 4, 395 TEXT_STUDY_FLAG2 = 5992, // Study flag 2 ("STU"), char 396 TEXT_STUDY_FLAG2_LEN = 3, 397 TEXT_IMAGE_FLAG2 = 5996, // Image flag 2 ("IMA"), char 398 TEXT_IMAGE_FLAG2_LEN = 3, 399 TEXT_STUDY_NUM2 = 5999, // Study number 2, char 400 TEXT_STUDY_NUM2_LEN = 2, 401 TEXT_IMAGE_NUM2 = 6002, // Image number 2, char 402 TEXT_IMAGE_NUM2_LEN = 2, 403 TEXT_IMAGE_NUM3 = 6013, // Image number 3, char 404 TEXT_IMAGE_NUM3_LEN = 5, 405 TEXT_MODEL_NAME = 6031, // Model Name, char 406 TEXT_MODEL_NAME_LEN = 15, 407 TEXT_PAT_NAME = 6058, // Patient Name, char 408 TEXT_PAT_NAME_LEN = 25, 409 TEXT_START_HOUR = 6085, // Scan start time - hour, char 410 TEXT_START_HOUR_LEN = 2, 411 TEXT_START_MIN = 6088, // Scan start time - minute, char 412 TEXT_START_MIN_LEN = 2, 413 TEXT_START_SEC = 6091, // Scan start time - second, char 414 TEXT_START_SEC_LEN = 2, 415 HDR_TOTAL_LENGTH = 6144 // Total length of Siemens Header 416 } SiemensVisionHeaderInfo; 417 }; 418 } // end namespace itk 419 420 #endif // itkSiemensVisionImageIO_h 421