CASToR  3.2
Tomographic Reconstruction (PET/SPECT/CT)
code/include/image/oInterfileIO.hh
Go to the documentation of this file.
1 
9 #ifndef OINTERFILEIO_HH
10 #define OINTERFILEIO_HH 1
11 
13 #include "sScannerManager.hh"
14 
15 // ---------------------------------------------------------------------
33 #define INTF_BIG_ENDIAN 0
34 
35 #define INTF_LITTLE_ENDIAN 1
36 
46 #define INTF_IMG_STATIC 0
47 
48 #define INTF_IMG_DYNAMIC 1
49 
50 #define INTF_IMG_PET 2
51 
52 #define INTF_IMG_SPECT 3
53 
54 #define INTF_IMG_GATED 4
55 
56 #define INTF_IMG_GSPECT 5
57 
58 #define INTF_IMG_UNKNOWN 6
59 
74 #define INTF_LERP_DISABLED false
75 
76 #define INTF_LERP_ENABLED true
77 
89 #define BIT_str "bit"
90 
91 #define UINT32_str "unsigned integer"
92 
93 #define INT32_str "signed integer"
94 
95 #define FLT32_str "short float"
96 #define FLT32_str2 "float"
97 
98 #define FLT64_str "long float"
99 
100 #define LONGDOUBLE_str "long long float"
101 
102 #define ASCII_str "ASCII"
103 
114 #define INTF_SUPINE_HEADIN_TRANSAXIAL 0
115 
116 #define INTF_SUPINE_HEADIN_SAGITTAL 1
117 
118 #define INTF_SUPINE_HEADIN_CORONAL 2
119 
120 #define INTF_SUPINE_FEETIN_TRANSAXIAL 3
121 
122 #define INTF_SUPINE_FEETIN_SAGITTAL 4
123 
124 #define INTF_SUPINE_FEETIN_CORONAL 5
125 
126 #define INTF_PRONE_HEADIN_TRANSAXIAL 6
127 
128 #define INTF_PRONE_HEADIN_SAGITTAL 7
129 
130 #define INTF_PRONE_HEADIN_CORONAL 8
131 
132 #define INTF_PRONE_FEETIN_TRANSAXIAL 9
133 
134 #define INTF_PRONE_FEETIN_SAGITTAL 10
135 
136 #define INTF_PRONE_FEETIN_CORONAL 11
137 
150 #define INTF_TRANSVERSE 0
151 
152 #define INTF_CORONAL 1
153 
154 #define INTF_SAGITTAL 2
155 
156 #define INTF_OTHER 3
157 
170 #define INTF_SUPINE 0
171 
172 #define INTF_PRONE 1
173 
186 #define INTF_HEADIN 0
187 
188 #define INTF_FEETIN 1
189 
200 struct Intf_key
201 {
202  string korig;
203  string kcase;
204  string klcase;
205  string kvalue;
206 };
210 // ---------------------------------------------------------------------
218 {
219  string path_to_image;
225  uint8_t endianness;
228  uint32_t data_offset;
231  string nb_format;
234  uint8_t nb_dims;
237  uint32_t mtx_size[7];
241  FLTNB vox_offset[3];
244 // float vox_size[3]; /*!< Voxel dimensions in mm.\n
245  FLTNB vox_size[3];
248 // float slice_thickness_mm ; /*!< Read from the key 'slice thickness (pixels)'.\n
259  uint16_t nb_time_frames ;
262  uint16_t nb_resp_gates ;
265  uint16_t nb_card_gates ;
268  uint32_t nb_total_imgs;
271  uint8_t nb_bytes_pixel;
278  int8_t pat_rotation;
295  uint32_t cmtx_size[3];
298  FLTNB cvox_size[3];
301  FLTNB cvox_offset[3];
308  int data_type;
312 // float study_duration; /*!< Acquisition duration.\n
316  vector<FLTNB> image_duration;
320  vector<FLTNB> image_start_time;
324  uint32_t nb_time_windows;
329  string process_status;
332  // --- Fields related to an image in a group --- // // todo
333 
337 // float image_pause; /*!< Pause between time windows ?\n
338  //FLTNB image_pause;
344  vector<FLTNB> frame_group_pause;
347  // --- SPECT and projection related data --- //
348  uint16_t nb_detector_heads;
351  uint32_t nb_energy_windows;
354  uint16_t nb_projections;
357 // float extent_rotation; /*!< Angular span ex: 180, 360.\n
364 // float first_angle; /*!< Angle of the first view.\n
371  string radius;
373 };
378 #include "gVariables.hh"
379 #include "sOutputManager.hh"
380 #include "gOptions.hh"
381 
382  // -------------------------------------------------------------------
383  // ----- "PUBLIC" FUNCTIONS WHICH COULD AND SHOULD BE ANYWHERE IN THE CODE WHERE INTERFILE IS REQUIRED -----
384 
397  template <typename T> int IntfKeyGetValueFromFile(const string& a_pathToHeader, const string& a_key, T* ap_return, int a_nbElts, int a_mandatoryFlag);
398 
413  template <typename T> int IntfKeyGetRecurringValueFromFile(const string& a_pathToHeader, const string& a_key, T* ap_return, int a_nbElts, int a_mandatoryFlag, uint16_t a_nbOccurrences);
414 
426  int IntfReadProjectionImage( const string& a_pathToHeaderFile,
427  FLTNB* ap_ImgMatrix,
428  Intf_fields* ap_IF,
429  int vb,
430  bool a_lerpFlag);
431 
440  int IntfCheckDimensionsConsistency(Intf_fields ImgFields1, Intf_fields ImgFields2);
441 
451  FLTNB* IntfLoadImageFromScratch( const string& a_pathToHeaderFile,
452  Intf_fields* ap_ImgFields,
453  int vb );
464  int IntfWriteImageFromIntfFields( const string& a_pathToImg,
465  FLTNB* ap_ImgMatrix,
466  Intf_fields Img_fields,
467  int vb );
468 
480  int IntfReadImage( const string& a_pathToHeaderFile,
481  FLTNB* ap_ImgMatrix,
483  int vb,
484  bool a_lerpFlag);
485 
500  int IntfReadImage( const string& a_pathToHeaderFile,
501  FLTNB**** a4p_ImgMatrix,
503  int vb,
504  bool a_lerpFlag);
505 
520  int IntfReadImgDynCoeffFile(const string& a_pathToHeaderFile,
521  FLTNB** a2p_ImgMatrix,
523  int a_nbFbases,
524  int vb,
525  bool a_lerpFlag);
526 
527 
528  // -------------------------------------------------------------------
529  // ----- FUNCTIONS DEDICATED TO IMAGE DATA READING/WRITING -----
530 
544  int IntfCheckConsistency(Intf_fields* ap_IF, oImageDimensionsAndQuantification* ap_ID, int vb, int a_lerpFlag);
545 
561  ifstream* ap_iFile,
562  FLTNB* ap_outImgMatrix,
563  FLTNB* ap_inImgMatrix,
564  uint32_t* a_offset,
565  int a_nbVox,
566  int vb);
567 
585  template <class T>
586  int IntfReadData(Intf_fields a_IF,
587  ifstream* ap_iFile,
588  FLTNB* ap_outImgMatrix,
589  FLTNB* ap_inImgMatrix,
590  uint32_t* a_offset,
591  int a_nbVox,
592  int vb,
593  T* bytes);
594 
595 
609  int ImageInterpolation(FLTNB *ap_iImg, FLTNB *ap_oImg,
610  const uint32_t ap_iDimVox[3], const uint32_t ap_oDimVox[3],
611  const FLTNB ap_iSizeVox[3], const FLTNB ap_oSizeVox[3],
612  const FLTNB ap_iOffVox[3], const FLTNB ap_oOffVox[3] );
613 
614 
627  int IntfWriteImgFile(const string& a_pathToImg, FLTNB* ap_ImgMatrix, const Intf_fields& ap_IntfF, int vb);
628 
642  int IntfWriteImgFile(const string& a_pathToImg, FLTNB* ap_ImgMatrix, oImageDimensionsAndQuantification* ap_ID, int vb);
643 
660  int IntfWriteProjFile(const string& a_pathToImg, FLTNB** a2p_ImgMatrix, oImageDimensionsAndQuantification* ap_ID, Intf_fields a_Imgfields, int vb);
661 
680  int IntfWriteImgDynCoeffFile(const string& a_pathToImg, FLTNB** a2p_ImgMatrix, oImageDimensionsAndQuantification* ap_ID, int a_nbParImgs, int vb, bool a_mergeDynImgFlag=false);
681 
697  int IntfWriteImgFile(const string& a_pathToImg, FLTNB**** a4p_ImgMatrix, oImageDimensionsAndQuantification* ap_ID, int vb);
698 
710  int IntfWriteWholeDynBasisCoeffImgFile(const string& a_pathToImg, FLTNB**** a4p_ImgMatrix, oImageDimensionsAndQuantification* ap_ID, int vb);
711 
722  int IntfWriteImage(const string& a_pathToImg, FLTNB* ap_outImgMtx, uint32_t a_dim, int vb);
723 
734  int IntfWriteImage(vector<string> ap_pathToImgs, FLTNB** a2p_outImgMtx, uint32_t ap_dim[2], int vb);
735 
746  int IntfWriteImage(vector<string> ap_pathToImgs, FLTNB**** a4p_outImgMtx, uint32_t ap_dim[4], int vb);
747 
759  int IntfWriteData(ofstream* ap_oFile, FLTNB* ap_outImgMatrix, int a_nbVox, int vb);
760 
768  int IntfWriteContentOfInputDataHeaderIntoInterfileHeader(ofstream &ap_ofile, int vb);
769 
770 
771  // -------------------------------------------------------------------
772  // ----- FUNCTIONS DEDICATED TO INTERFILE HEADER KEYs DECODING/PARSING/READING -----
773 
786  int IntfIsMHD(string a_pathToFile, vector<string> &ap_lPathToImgs);
787 
798  int IntfWriteMHD(const string& a_pathToMhd, const vector<string> &ap_lPathToImgs, Intf_fields a_IntfF, oImageDimensionsAndQuantification* ap_ID, int vb);
799 
817  int IntfReadHeader(const string& a_pathToHeaderFile, Intf_fields* ap_IntfFields, int vb);
818 
830  int IntfWriteHeaderMainData(const string& a_path, const Intf_fields& ap_IntfF, int vb);
831 
842  int IntfWriteHeaderImgData(ofstream &ap_ofile, const Intf_fields& ap_IntfF, int vb);
843 
849  void IntfKeyInitFields(Intf_fields* ap_IF);
850 
860 
866  void IntfKeyPrintFields(Intf_fields a_IF);
867 
880  int IntfRecoverKey(Intf_key* ap_Key, const string& a_line);
881 
890  int IntfCheckKeyMatch(Intf_key a_Key, const string& a_field);
891 
898  int IntfKeyIsArray(Intf_key ap_Key);
899 
906  int IntfKeyGetArrayNbElts(Intf_key ap_Key);
907 
914  int IntfKeyGetMaxArrayKey(Intf_key ap_Key);
915 
924  template <typename T> int IntfKeyGetArrayElts(Intf_key a_Key, T* ap_return);
925 
934  string IntfKeyGetEndianStr(int a_val);
935 
944  string IntfKeyGetModalityStr(int a_modalityIdx);
945 
952  int IntfKeyGetInputImgDataType(const string& a_str);
953 
961 
967  string IntfKeyGetPixTypeStr();
968 
969 
970  // -------------------------------------------------------------------
971  // ----- NOT IMPLEMENTED KEY FUNCTION -----
972 
982 
992  int IntfGetVoxIdxSHTOrientation(Intf_fields a_IF, int a_voxId);
993 
994 
995  // -------------------------------------------------------------------
996  // ----- SOME UTILITY FUNCTIONS -----
997 
1004  void IntfAllocInterpImg(FLTNB** a2p_img, Intf_fields a_IF);
1005 
1012  void GetUserEndianness();
1013 
1019  void IntfEraseSpaces(string* input_str);
1020 
1027  void IntfToLowerCase(string* ap_str);
1028 
1033  string IntfKeyGetPatientNameTag();
1034 
1041  template <class Type> void SwapBytes(Type *ap_type);
1042 
1043 #endif
void IntfKeySetFieldsOutput(Intf_fields *ap_IF, oImageDimensionsAndQuantification *ap_ID)
Init the keys of the Interfile header of an image to be written on disk.
int IntfWriteImgDynCoeffFile(const string &a_pathToImg, FLTNB **a2p_ImgMatrix, oImageDimensionsAndQuantification *ap_ID, int a_nbParImgs, int vb, bool a_mergeDynImgFlag=false)
void IntfAllocInterpImg(FLTNB **a2p_img, Intf_fields a_IF)
Allocate memory for an image matrix to recover an image to interpolate.
int IntfKeyGetPatOrientation(Intf_fields ap_IF)
Get the complete patient orientation from an Intf_fields structure according to the values of keys &#39;s...
int IntfReadData(Intf_fields a_IF, ifstream *ap_iFile, FLTNB *ap_outImgMatrix, FLTNB *ap_inImgMatrix, uint32_t *a_offset, int a_nbVox, int vb, T *bytes)
Templated function which read an image voxel by voxel and store it in the ap_outImgMtx image matrix...
int IntfKeyGetInputImgDataType(const string &a_str)
Get the image data type corresponding to the image metadata passed in parameter.
int IntfIsMHD(string a_pathToFile, vector< string > &ap_lPathToImgs)
Check if the string in argument contains the path to a Interfile metaheader.
string IntfKeyGetModalityStr(int a_modalityIdx)
Convert the integer provided in parameter to the string related to the corresponding modality as de...
int IntfKeyGetArrayNbElts(Intf_key ap_Key)
Return the number of elts in an Interfile array Key.
int IntfWriteHeaderMainData(const string &a_path, const Intf_fields &ap_IntfF, int vb)
void SwapBytes(Type *ap_type)
Use std::reverse to swap the bits of a variable of any type.
void IntfToLowerCase(string *ap_str)
Set all characters of the string passed in parameter to lower case.
int IntfKeyGetOutputImgDataType(oImageDimensionsAndQuantification *ap_ID)
void IntfKeyPrintFields(Intf_fields a_IF)
Print all the keys of the Intf_fields structure passed in parameter, as well as their values for debu...
int IntfReadProjectionImage(const string &a_pathToHeaderFile, FLTNB *ap_ImgMatrix, Intf_fields *ap_IF, int vb, bool a_lerpFlag)
Main function which reads a projection Interfile 3D projection image and store its content in the pro...
string IntfKeyGetPixTypeStr()
Return the string corresponding to the nb of bytes in the type FLTNB.
int IntfWriteImgFile(const string &a_pathToImg, FLTNB *ap_ImgMatrix, const Intf_fields &ap_IntfF, int vb)
Main function dedicated to Interfile 3D image writing. Recover image information from a provided In...
void IntfEraseSpaces(string *input_str)
Erase space, blank characters ((t,r,n)), and &#39;!&#39; before and after the characters in the string passed...
int IntfReadImage(const string &a_pathToHeaderFile, FLTNB *ap_ImgMatrix, oImageDimensionsAndQuantification *ap_ID, int vb, bool a_lerpFlag)
Main function dedicated to Interfile 3D image loading.
int IntfKeyGetArrayElts(Intf_key a_Key, T *ap_return)
Get all the elements in an array key in a templated array passed in parameter. It assumes the retur...
int IntfWriteImageFromIntfFields(const string &a_pathToImg, FLTNB *ap_ImgMatrix, Intf_fields Img_fields, int vb)
int IntfCheckKeyMatch(Intf_key a_Key, const string &a_field)
Check if the key matches the string passed in parameter.
int IntfWriteContentOfInputDataHeaderIntoInterfileHeader(ofstream &ap_ofile, int vb)
int IntfCheckDimensionsConsistency(Intf_fields ImgFields1, Intf_fields ImgFields2)
int IntfCheckConsistency(Intf_fields *ap_IF, oImageDimensionsAndQuantification *ap_ID, int vb, int a_lerpFlag)
Check if the mandatory fields have been initialize in the ap_IF structure, and check consistencies wi...
int IntfWriteWholeDynBasisCoeffImgFile(const string &a_pathToImg, FLTNB ****a4p_ImgMatrix, oImageDimensionsAndQuantification *ap_ID, int vb)
Main function dedicated to Interfile 6D (dynamic dims + 3D ) image writing of basis function coeffici...
int IntfRecoverKey(Intf_key *ap_Key, const string &a_line)
Process the line passed in parameter and write the key information in the ap_Key Intf_key member stru...
string IntfKeyGetPatientNameTag()
Recover datafile name(s) stored in sOutputManager in one string.
int IntfGetVoxIdxSHTOrientation(Intf_fields a_IF, int a_voxId)
Compute a voxel index corresponding to the default orientation (Sup/Hin/Trans) from the orientation...
void IntfKeyInitFields(Intf_fields *ap_IF)
Init the file of an Interfile fields structure passed in parameter to their default values...
int IntfReadImgDynCoeffFile(const string &a_pathToHeaderFile, FLTNB **a2p_ImgMatrix, oImageDimensionsAndQuantification *ap_ID, int a_nbFbases, int vb, bool a_lerpFlag)
Function dedicated to Interfile image reading for dynamic coefficients images.
Interfile key elements. This structure is used to recover and process the elements of an Interfile ...
int IntfKeyIsArray(Intf_key ap_Key)
Check if the key passed in parameter is an array (contains brackets &#39;{&#39; and &#39;}&#39; ) ...
Interfile fields. This structure contains all the Interfile keys currently managed by CASToR Decl...
int IntfWriteData(ofstream *ap_oFile, FLTNB *ap_outImgMatrix, int a_nbVox, int vb)
Write the content of the image matrix in the file pointed by ofstream.
void GetUserEndianness()
Check user/host computer endianness and write it to the global variable User_Endianness.
FLTNB * IntfLoadImageFromScratch(const string &a_pathToHeaderFile, Intf_fields *ap_ImgFields, int vb)
int IntfKeyGetRecurringValueFromFile(const string &a_pathToHeader, const string &a_key, T *ap_return, int a_nbElts, int a_mandatoryFlag, uint16_t a_nbOccurrences)
int IntfGetPixelTypeAndReadData(Intf_fields a_IF, ifstream *ap_iFile, FLTNB *ap_outImgMatrix, FLTNB *ap_inImgMatrix, uint32_t *a_offset, int a_nbVox, int vb)
The purpose of this function is to call the templated ReadData() function with the data type correspo...
int IntfWriteHeaderImgData(ofstream &ap_ofile, const Intf_fields &ap_IntfF, int vb)
This class is designed to manage all dimensions and quantification related stuff. ...
Declaration of class oImageDimensionsAndQuantification.
int ImageInterpolation(FLTNB *ap_iImg, FLTNB *ap_oImg, const uint32_t ap_iDimVox[3], const uint32_t ap_oDimVox[3], const FLTNB ap_iSizeVox[3], const FLTNB ap_oSizeVox[3], const FLTNB ap_iOffVox[3], const FLTNB ap_oOffVox[3])
int IntfWriteMHD(const string &a_pathToMhd, const vector< string > &ap_lPathToImgs, Intf_fields a_IntfF, oImageDimensionsAndQuantification *ap_ID, int vb)
Write an Interfile meta header at the path provided in parameter, using the field stack provided in p...
string IntfKeyGetEndianStr(int a_val)
return the endian string corresponding to the value passed in parameter (see module INTF_ENDIANNESS)...
int IntfWriteProjFile(const string &a_pathToImg, FLTNB **a2p_ImgMatrix, oImageDimensionsAndQuantification *ap_ID, Intf_fields a_Imgfields, int vb)
Function dedicated to Interfile image writing for projected data.
int IntfReadHeader(const string &a_pathToHeaderFile, Intf_fields *ap_IntfFields, int vb)
Read an Interfile header.
int IntfKeyGetMaxArrayKey(Intf_key ap_Key)
Return the maximum value from an array key (key value contains brackets &#39;{,,}&#39; )
int IntfWriteImage(const string &a_pathToImg, FLTNB *ap_outImgMtx, uint32_t a_dim, int vb)
Write Interfile raw data whose path is provided in parameter, using image matrix provided in paramete...
int IntfKeyGetValueFromFile(const string &a_pathToHeader, const string &a_key, T *ap_return, int a_nbElts, int a_mandatoryFlag)
Look for "a_nbElts" elts in the "a_pathToHeader" interfile header matching the "a_keyword" key passed...