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