/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ /** * \file itkGEAdwImageIO.h * Much of the code for this file reader/writer was taken from * the University of Iowa Imaging Group library with the * permission of the authors, Milan Sonka, Joseph Reinhardt, * Ryan Long, Hans Johnson, Gary Christensen, and others. * The specification for this file format is taken from the * web site https://analyzedirect.com/support/10.0Documents/Analyze_Resource_01.pdf * \author Kent Williams * The University of Iowa 2003 * \brief This file was written as a modification to the itkMetaImageIO * as a new method for reading in files from the GE4 scanner. */ #ifndef itkGEAdwImageIO_h #define itkGEAdwImageIO_h #include "ITKIOGEExport.h" #include "itkIPLCommonImageIO.h" namespace itk { /** * \class GEAdwImageIO * * \author Hans J. Johnson * \brief Class that defines how to read GEAdw file format. * * \ingroup IOFilters * \ingroup ITKIOGE */ class ITKIOGE_EXPORT GEAdwImageIO : public IPLCommonImageIO { public: ITK_DISALLOW_COPY_AND_MOVE(GEAdwImageIO); /** Standard class type aliases. */ using Self = GEAdwImageIO; using Superclass = IPLCommonImageIO; using Pointer = SmartPointer; /** Method for creation through the object factory. */ itkNewMacro(Self); /** \see LightObject::GetNameOfClass() */ itkOverrideGetNameOfClassMacro(GEAdwImageIO); /*-------- This part of the interfaces deals with reading data. ----- */ /** Determine if the file can be read with this ImageIO implementation. * \author Hans J Johnson * \param FileNameToRead The name of the file to test for reading. * \post Sets classes ImageIOBase::m_FileName variable to be FileNameToWrite * \return Returns true if this ImageIO can read the file specified. */ bool CanReadFile(const char * FileNameToRead) override; /* * Set the spacing and dimension information for the set filename. */ // Implemented in superclass // virtual void ReadImageInformation(); /* * Get the type of the pixel. */ // Implemented in superclass // virtual const std::type_info& GetPixelType() const; /* * Reads the data from disk into the memory buffer provided. */ // Implemented in superclass // virtual void Read(void* buffer); /* * Compute the size (in bytes) of the components of a pixel. For * example, and RGB pixel of unsigned char would have a * component size of 1 byte. */ // Implemented in superclass // virtual unsigned int GetComponentSize() const; /*-------- This part of the interfaces deals with writing data. ----- */ /* * Determine if the file can be written with this ImageIO implementation. * \param FileNameToWrite The name of the file to test for writing. * \author Hans J. Johnson * \post Sets classes ImageIOBase::m_FileName variable to be FileNameToWrite * \return Returns true if this ImageIO can write the file specified. */ // Implemented in superclass // virtual bool CanWriteFile(const char * FileNameToWrite); /* * Set the spacing and dimension information for the set filename. */ // Implemented in superclass // virtual void WriteImageInformation(); /* * Writes the data to disk from the memory buffer provided. Make sure * that the IORegions has been set properly. */ // Implemented in superclass // virtual void Write(const void* buffer); protected: GEAdwImageIO(); ~GEAdwImageIO() override; // Implemented in superclass // void PrintSelf(std::ostream& os, Indent indent) const; GEImageHeader * ReadHeader(const char * FileNameToRead) override; private: enum GE_ADW_DEFINES { GE_ADW_SU_ID = 0, /**< Site id - String */ GE_ADW_SU_ID_LEN = 4, GE_ADW_SU_PRODID = 7, /**< Product ID - String */ GE_ADW_SU_PRODID_LEN = 13, GE_ADW_EX_SUID = 116, /**< Exam study ID - String */ GE_ADW_EX_SUID_LEN = 4, GE_ADW_EX_NO = 124, /**< Exam Number - Unsigned short Int */ GE_ADW_EX_NO_LEN = 2, GE_ADW_EX_HOSPNAME = 126, /**< Hospital Name - String */ GE_ADW_EX_HOSPNAME_LEN = 33, GE_ADW_EX_MAGSTRENGTH = 200, /**< Magnet Strength - Integer */ GE_ADW_EX_MAGSTRENGTH_LEN = 4, GE_ADW_EX_PATID = 204, /**< Patient ID - String */ GE_ADW_EX_PATID_LEN = 13, GE_ADW_EX_PATNAME = 217, /**< Patient Name - String */ GE_ADW_EX_PATNAME_LEN = 25, GE_ADW_EX_PATAGE = 242, /**< Patient Age - Short Int */ GE_ADW_EX_PATAGE_LEN = 2, GE_ADW_EX_PATIAN = 244, /**< Patient Age Notation - Short Int */ GE_ADW_EX_PATIAN_LEN = 2, GE_ADW_EX_PATSEX = 246, /**< Patient Sex - Short Integer */ GE_ADW_EX_PATSEX_LEN = 2, GE_ADW_EX_PATWEIGHT = 248, /**< Patient Weight - Integer */ GE_ADW_EX_PATWEIGHT_LEN = 4, GE_ADW_EX_HIST = 254, /**< Patient History - String */ GE_ADW_EX_HIST_LEN = 61, GE_ADW_EX_DATETIME = 328, /**< Exam date/time stamp - Integer */ GE_ADW_EX_DATETIME_LEN = 4, GE_ADW_EX_REFPHY = 332, /**< Referring Physician - String */ GE_ADW_EX_REFPHY_LEN = 33, GE_ADW_EX_DIAGRAD = 365, /**< Diagnostician/Radiologist - String */ GE_ADW_EX_DIAGRAD_LEN = 33, GE_ADW_EX_OP = 398, /**< Operator - String */ GE_ADW_EX_OP_LEN = 4, GE_ADW_EX_DESC = 402, /**< Exam Description - String */ GE_ADW_EX_DESC_LEN = 23, GE_ADW_EX_TYP = 425, /**< Exam Type - String */ GE_ADW_EX_TYP_LEN = 3, GE_ADW_EX_FORMAT = 428, /**< Exam Format - Short Integer */ GE_ADW_EX_FORMAT_LEN = 2, GE_ADW_EX_SYSID = 444, /**< Creator Suite and Host - String */ GE_ADW_EX_SYSID_LEN = 9, /** * Series Header Variables */ GE_ADW_SE_SUID = 1156, /**< Suite Id for Series - String */ GE_ADW_SE_SUID_LEN = 4, GE_ADW_SE_UNIQ = 1160, /**< The Make-Unique Flag - Short Integer */ GE_ADW_SE_UNIQ_LEN = 2, GE_ADW_SE_EXNO = 1164, /**< Exam Number - Unsigned Short Integer */ GE_ADW_SE_EXNO_LEN = 2, GE_ADW_SE_NO = 1166, /**< Series Number - Short Integer */ GE_ADW_SE_NO_LEN = 2, GE_ADW_SE_DATETIME = 1168, /**< Date/Time stamp - Integer */ GE_ADW_SE_DATETIME_LEN = 4, GE_ADW_SE_DESC = 1176, /**< Series description - String */ GE_ADW_SE_DESC_LEN = 30, GE_ADW_SE_TYP = 1224, /**< Series Type - Short Integer */ GE_ADW_SE_TYP_LEN = 2, GE_ADW_SE_PLANE = 1228, /**< Most Like Plane - Short Integer */ GE_ADW_SE_PLANE_LEN = 2, GE_ADW_SE_POSITION = 1232, /**< Patient Position - Integer */ GE_ADW_SE_POSITION_LEN = 4, GE_ADW_SE_ENTRY = 1236, /**< Patient Entry - Integer */ GE_ADW_SE_ENTRY_LEN = 4, GE_ADW_SE_ANREF = 1240, /**< Anatomical reference - String */ GE_ADW_SE_ANREF_LEN = 3, GE_ADW_SE_CONTRAST = 1274, /**< Non-zero if contrast - Short Int */ GE_ADW_SE_CONTRAST_LEN = 2, GE_ADW_SE_START_RAS = 1276, /**< RAS letter for first scan location - String */ GE_ADW_SE_START_RAS_LEN = 1, GE_ADW_SE_START_LOC = 1280, /**< Start location position - Float */ GE_ADW_SE_START_LOC_LEN = 4, GE_ADW_SE_END_RAS = 1284, /**< RAS letter for last scan location - String */ GE_ADW_SE_END_RAS_LEN = 1, GE_ADW_SE_END_LOC = 1288, /**< End location position - Float */ GE_ADW_SE_END_LOC_LEN = 4, GE_ADW_SE_NUMIMAGES = 1368, /**< Number of Images Existing - Integer */ GE_ADW_SE_NUMIMAGES_LEN = 4, /** * Image Header Variables */ GE_ADW_IM_SUID = 2184, /**< Suite ID for this image - String */ GE_ADW_IM_SUID_LEN = 4, GE_ADW_IM_UNIQ = 2188, /**< The make unique flag - Short Integer */ GE_ADW_IM_UNIQ_LEN = 2, GE_ADW_IM_EXNO = 2192, /**< Exam number for this image - Unsigned short */ GE_ADW_IM_EXNO_LEN = 2, GE_ADW_IM_SENO = 2194, /**< Series number for image - short integer */ GE_ADW_IM_SENO_LEN = 2, GE_ADW_IM_NO = 2196, /**< Image number - short integer */ GE_ADW_IM_NO_LEN = 2, GE_ADW_IM_DATETIME = 2200, /**< Image allocation date/time stamp - integer */ GE_ADW_IM_DATETIME_LEN = 4, GE_ADW_IM_ACTUAL_DT = 2204, /**< Actual image date/time stamp - Date */ GE_ADW_IM_ACTUAL_DT_LEN = 4, GE_ADW_IM_SCTIME = 2208, /**< Duration of scan (secs) - float */ GE_ADW_IM_SCTIME_LEN = 4, GE_ADW_IM_SLTHICK = 2212, /**< Slice thickness (mm) - float */ GE_ADW_IM_SLTHICK_LEN = 4, GE_ADW_IM_IMATRIX_X = 2216, /**< Image matrix size X - short integer */ GE_ADW_IM_IMATRIX_X_LEN = 2, GE_ADW_IM_IMATRIX_Y = 2218, /**< Image matrix size Y - short integer */ GE_ADW_IM_IMATRIX_Y_LEN = 2, GE_ADW_IM_DFOV = 2220, /**< Display field of view X (mm) - float */ GE_ADW_IM_DFOV_LEN = 4, GE_ADW_IM_DFOV_RECT = 2224, /**< Display field of view Y (mm) if different - float */ GE_ADW_IM_DFOV_RECT_LEN = 4, GE_ADW_IM_DIM_X = 2228, /**< Image dimension X - float */ GE_ADW_IM_DIM_X_LEN = 4, GE_ADW_IM_DIM_Y = 2232, /**< Image dimension Y - float */ GE_ADW_IM_DIM_Y_LEN = 4, GE_ADW_IM_PIXSIZE_X = 2236, /**< Image pixel size X - float */ GE_ADW_IM_PIXSIZE_X_LEN = 4, GE_ADW_IM_PIXSIZE_Y = 2240, /**< Image pixel size Y - float */ GE_ADW_IM_PIXSIZE_Y_LEN = 4, GE_ADW_IM_CONTMODE = 2292, /**< Image contrast mode - short integer */ GE_ADW_IM_CONTMODE_LEN = 2, GE_ADW_IM_PLANE = 2300, /**< Plane type - short integer */ GE_ADW_IM_PLANE_LEN = 2, GE_ADW_IM_SCANSPACING = 2304, /**< Spacing between scans (mm) - float */ GE_ADW_IM_SCANSPACING_LEN = 4, GE_ADW_IM_LOC_RAS = 2312, /**< RAS letter of image location - string */ GE_ADW_IM_LOC_RAS_LEN = 1, GE_ADW_IM_LOC = 2316, /**< Image location - float */ GE_ADW_IM_LOC_LEN = 4, GE_ADW_IM_ULHC_R = 2344, /**< R coordinate of upper left corner - float */ GE_ADW_IM_ULHC_R_LEN = 4, GE_ADW_IM_ULHC_A = 2348, /**< A coordinate of upper left corner - float */ GE_ADW_IM_ULHC_A_LEN = 4, GE_ADW_IM_ULHC_S = 2352, /**< S coordinate of upper left corner - float */ GE_ADW_IM_ULHC_S_LEN = 4, GE_ADW_IM_URHC_R = 2356, /**< R coordinate of upper right corner - float */ GE_ADW_IM_URHC_R_LEN = 4, GE_ADW_IM_URHC_A = 2360, /**< A coordinate of upper right corner - float */ GE_ADW_IM_URHC_A_LEN = 4, GE_ADW_IM_URHC_S = 2364, /**< S coordinate of upper right corner - float */ GE_ADW_IM_URHC_S_LEN = 4, GE_ADW_IM_BRHC_R = 2368, /**< R coordinate of bottom right corner - float */ GE_ADW_IM_BRHC_R_LEN = 4, GE_ADW_IM_BRHC_A = 2372, /**< A coordinate of bottom right corner - float */ GE_ADW_IM_BRHC_A_LEN = 4, GE_ADW_IM_BRHC_S = 2376, /**< S coordinate of bottom right corner - float */ GE_ADW_IM_BRHC_S_LEN = 4, GE_ADW_IM_TR = 2384, /**< Pulse repetition time (usec) - integer */ GE_ADW_IM_TR_LEN = 4, GE_ADW_IM_TI = 2388, /**< Pulse inversion time (usec) - integer */ GE_ADW_IM_TI_LEN = 4, GE_ADW_IM_TE = 2392, /**< Pulse echo time (usec) - integer */ GE_ADW_IM_TE_LEN = 4, GE_ADW_IM_NUMECHO = 2400, /**< Number of echoes - short integer */ GE_ADW_IM_NUMECHO_LEN = 2, GE_ADW_IM_ECHONUM = 2402, /**< Echo number - short integer */ GE_ADW_IM_ECHONUM_LEN = 2, GE_ADW_IM_NEX = 2408, /**< Number of averages - float */ GE_ADW_IM_NEX_LEN = 4, GE_ADW_IM_CONTIG = 2412, /**< Continuous slices flag - short integer */ GE_ADW_IM_CONTIG_LEN = 2, GE_ADW_IM_HRTRATE = 2414, /**< Cardiac Heart rate (bpm) - short integer */ GE_ADW_IM_HRTRATE_LEN = 2, GE_ADW_IM_TDEL = 2416, /**< Delay after trigger (usec) - integer */ GE_ADW_IM_TDEL_LEN = 4, GE_ADW_IM_XMTGAIN = 2438, /**< Actual transmit gain (.1 dB) - short integer */ GE_ADW_IM_XMTGAIN_LEN = 2, GE_ADW_IM_MR_FLIP = 2444, /**< Flip angle for GRASS scans (dgr) - short integer */ GE_ADW_IM_MR_FLIP_LEN = 2, GE_ADW_IM_CPHASE = 2452, /**< Total cardiac phases prescribed - short integer */ GE_ADW_IM_CPHASE_LEN = 2, GE_ADW_IM_SWAPPF = 2454, /**< Swap phase/frequency - short integer */ GE_ADW_IM_SWAPPF_LEN = 2, GE_ADW_IM_OBPLANE = 2464, /**< Oblique plane - integer */ GE_ADW_IM_OBPLANE_LEN = 4, GE_ADW_IM_XMTFREQ = 2472, /**< Transmit frequency - integer */ GE_ADW_IM_XMTFREQ_LEN = 4, GE_ADW_IM_PRESCAN_R1 = 2482, /**< Prescan R1 value - short integer */ GE_ADW_IM_PRESCAN_R1_LEN = 2, GE_ADW_IM_PRESCAN_R2 = 2484, /**< Prescan R2 value - short integer */ GE_ADW_IM_PRESCAN_R2_LEN = 2, GE_ADW_IM_IMODE = 2494, /**< Imaging mode - short integer */ GE_ADW_IM_IMODE_LEN = 2, GE_ADW_IM_IOPT = 2496, /**< Imaging options - integer */ GE_ADW_IM_IOPT_LEN = 4, GE_ADW_IM_PSEQ = 2500, /**< Imaging pulse sequence - short integer */ GE_ADW_IM_PSEQ_LEN = 2, GE_ADW_IM_PSDNAME = 2504, /**< Pulse sequence name - string */ GE_ADW_IM_PSDNAME_LEN = 33, GE_ADW_IM_CTYP = 2558, /**< Coil type - short integer */ GE_ADW_IM_CTYP_LEN = 2, GE_ADW_IM_CNAME = 2560, /**< Coil name - string */ GE_ADW_IM_CNAME_LEN = 17, GE_ADW_IM_SUPP_TECH = 2592, /**< SAT type FAT/WATER/NONE - short integer */ GE_ADW_IM_SUPP_TECH_LEN = 2, GE_ADW_IM_VBW = 2596, /**< Variable bandwidth (Hz) - float */ GE_ADW_IM_VBW_LEN = 4, GE_ADW_IM_SLQUANT = 2600, /**< Number of slices in scan group - short integer */ GE_ADW_IM_SLQUANT_LEN = 2, GE_ADW_IM_USER0 = 2608, /**< User variable 0 - float */ GE_ADW_IM_USER0_LEN = 4, GE_ADW_IM_USER1 = 2612, /**< User variable 1 - float */ GE_ADW_IM_USER1_LEN = 4, GE_ADW_IM_USER2 = 2616, /**< User variable 2 - float */ GE_ADW_IM_USER2_LEN = 4, GE_ADW_IM_USER3 = 2620, /**< User variable 3 - float */ GE_ADW_IM_USER3_LEN = 4, GE_ADW_IM_USER4 = 2624, /**< User variable 4 - float */ GE_ADW_IM_USER4_LEN = 4, GE_ADW_IM_USER5 = 2628, /**< User variable 5 - float */ GE_ADW_IM_USER5_LEN = 4, GE_ADW_IM_USER6 = 2632, /**< User variable 6 - float */ GE_ADW_IM_USER6_LEN = 4, GE_ADW_IM_USER7 = 2636, /**< User variable 7 - float */ GE_ADW_IM_USER7_LEN = 4, GE_ADW_IM_USER8 = 2640, /**< User variable 8 - float */ GE_ADW_IM_USER8_LEN = 4, GE_ADW_IM_USER9 = 2644, /**< User variable 9 - float */ GE_ADW_IM_USER9_LEN = 4, GE_ADW_IM_USER10 = 2648, /**< User variable 10 - float */ GE_ADW_IM_USER10_LEN = 4, GE_ADW_IM_USER11 = 2652, /**< User variable 11 - float */ GE_ADW_IM_USER11_LEN = 4, GE_ADW_IM_USER12 = 2656, /**< User variable 12 - float */ GE_ADW_IM_USER12_LEN = 4, GE_ADW_IM_USER13 = 2660, /**< User variable 13 - float */ GE_ADW_IM_USER13_LEN = 4, GE_ADW_IM_USER14 = 2664, /**< User variable 14 - float */ GE_ADW_IM_USER14_LEN = 4, GE_ADW_IM_USER15 = 2668, /**< User variable 15 - float */ GE_ADW_IM_USER15_LEN = 4, GE_ADW_IM_USER16 = 2672, /**< User variable 16 - float */ GE_ADW_IM_USER16_LEN = 4, GE_ADW_IM_USER17 = 2676, /**< User variable 17 - float */ GE_ADW_IM_USER17_LEN = 4, GE_ADW_IM_USER18 = 2680, /**< User variable 18 - float */ GE_ADW_IM_USER18_LEN = 4, GE_ADW_IM_USER19 = 2684, /**< User variable 19 - float */ GE_ADW_IM_USER19_LEN = 4, GE_ADW_IM_USER20 = 2688, /**< User variable 20 - float */ GE_ADW_IM_USER20_LEN = 4, GE_ADW_IM_USER21 = 2692, /**< User variable 21 - float */ GE_ADW_IM_USER21_LEN = 4, GE_ADW_IM_USER22 = 2696, /**< User variable 22 - float */ GE_ADW_IM_USER22_LEN = 4, GE_ADW_IM_USER23 = 2700, /**< User variable 23 - float */ GE_ADW_IM_USER23_LEN = 4, GE_ADW_IM_USER24 = 2704, /**< User variable 24 - float */ GE_ADW_IM_USER24_LEN = 4, GE_ADW_IM_SATBITS = 2756, /**< Bitmap of sat selections - short integer */ GE_ADW_IM_SATBITS_LEN = 2, GE_ADW_IM_SCIC = 2758, /**< Surface coil intensity correction flag - short integer */ GE_ADW_IM_SCIC_LEN = 2, GE_ADW_IM_FLAX = 2778, /**< Phase contrast flow analysis - short integer */ GE_ADW_IM_FLAX_LEN = 2, GE_ADW_IM_VENC = 2780, /**< Phase contrast flow encoding - short integer */ GE_ADW_IM_VENC_LEN = 2, GE_ADW_IM_THK_DISCLMR = 2782, /**< Slice thickness - short integer */ GE_ADW_IM_THK_DISCLMR_LEN = 2, GE_ADW_IM_VAS_COLLAPSE = 2790, /**< Collapse image - short integer */ GE_ADW_IM_VAS_COLLAPSE_LEN = 2, GE_ADW_IM_X_AXIS_ROT = 2816, /**< X-axis rotation - float */ GE_ADW_IM_X_AXIS_ROT_LEN = 4, GE_ADW_IM_Y_AXIS_ROT = 2820, /**< Y-axis rotation - float */ GE_ADW_IM_Y_AXIS_ROT_LEN = 4, GE_ADW_IM_Z_AXIS_ROT = 2824, /**< Z-axis rotation - float */ GE_ADW_IM_Z_AXIS_ROT_LEN = 4, GE_ADW_IM_ECHO_TRN = 2844, /**< Length of echo train - short integer */ GE_ADW_IM_ECHO_TRN_LEN = 2, GE_ADW_IM_FRAC_ECHO = 2846, /**< Fractional echo - short integer */ GE_ADW_IM_FRAC_ECHO_LEN = 2, GE_ADW_IM_PREP_PULSE = 2848, /**< Prep pulses - short integer */ GE_ADW_IM_PREP_PULSE_LEN = 2, GE_ADW_IM_CPHASENUM = 2850, /**< Cardiac phase number - short integer */ GE_ADW_IM_CPHASENUM_LEN = 2, GE_ADW_IM_VAR_ECHO = 2852, /**< Variable echo - short integer */ GE_ADW_IM_VAR_ECHO_LEN = 2, GE_ADW_IM_FREQ_DIR = 2948, /**< Frequency direction - short integer */ GE_ADW_IM_FREQ_DIR_LEN = 2, GE_ADW_IM_VMODE = 2950, /**< Vascular mode - short integer */ GE_ADW_IM_VMODE_LEN = 2, GE_ADW_FIXED_HDR_LENGTH = 3228, /**< Total Length of the Fixed header */ GE_ADW_VARIABLE_HDR_LENGTH_LEN = 4, GE_ADW_VARIABLE_HDR_LENGTH = 3232 /**< Size of variable header - integer */ }; }; } // end namespace itk #endif // itkGEAdwImageIO_h