ecat63.h
Go to the documentation of this file.
00001 /******************************************************************************
00002 
00003   Copyright (c) 2003-2008 Turku PET Centre
00004 
00005   ecat63.h
00006 
00007   Date:
00008   1996-10-30 VO
00009   2002-01-20 VO
00010   2002-02-01 VO
00011   2002-02-12 VO
00012   2002-08-23 VO
00013   2003-07-21 VO
00014   2003-08-05 VO
00015   2003-09-08 VO
00016   2004-06-27 VO
00017   2004-12-28 VO
00018   2007-02-27 VO
00019   2007-03-13 VO
00020   2008-07-24 VO
00021 
00022 
00023 ******************************************************************************/
00024 #ifndef _ECAT63_H_
00025 #define _ECAT63_H_
00026 /*****************************************************************************/
00027 #define MatBLKSIZE 512
00028 #define MatFirstDirBlk 2
00029 /* Data types */
00030 #define BYTE_TYPE   1
00031 #define VAX_I2      2
00032 #define VAX_I4      3
00033 #define VAX_R4      4
00034 #define IEEE_R4     5
00035 #define SUN_I2      6
00036 #define SUN_I4      7
00037 /* File types */
00038 #define RAW_DATA    1
00039 #define IMAGE_DATA  2
00040 #define ATTN_DATA   3
00041 #define NORM_DATA   4
00042 /*****************************************************************************/
00043 #define ECAT63_SYSTEM_TYPE_DEFAULT 931
00044 /*****************************************************************************/
00045 /* Backup file extension */
00046 #ifndef BACKUP_EXTENSION
00047 #define BACKUP_EXTENSION ".bak"
00048 #endif 
00049 /*****************************************************************************/
00050 char ecat63errmsg[128];
00051 /*****************************************************************************/
00052 int ECAT63_TEST;
00053 /*****************************************************************************/
00054 
00055 typedef struct {
00056   int matnum;
00057   int strtblk;
00058   int endblk;
00059   int matstat;
00060 } MatDir;
00061 
00062 typedef struct {
00063   int matrixNr;
00064   int matrixSpace;
00065   MatDir *matdir;
00066 } MATRIXLIST;
00067 
00068 typedef struct {
00069   int frame, plane, gate, data, bed;
00070 } Matval;
00071 
00072 typedef struct ecat63_mainheader {
00073   char      ecat_format[14], fill1[14];
00074   char      original_file_name[20];
00075   short int sw_version;
00076   short int data_type;
00077   short int system_type;
00078   short int file_type;
00079   char      node_id[10];
00080   short int scan_start_day, scan_start_month, scan_start_year,
00081             scan_start_hour, scan_start_minute, scan_start_second;
00082   char      isotope_code[8];
00083   float     isotope_halflife;
00084   char      radiopharmaceutical[32];
00085   float     gantry_tilt, gantry_rotation, bed_elevation;
00086   short int rot_source_speed, wobble_speed, transm_source_type;
00087   float     axial_fov, transaxial_fov;
00088   short int transaxial_samp_mode, coin_samp_mode, axial_samp_mode;
00089   float     calibration_factor;
00090   short int calibration_units, compression_code;
00091   char      study_name[12], patient_id[16], patient_name[32], patient_sex,
00092             patient_age[10], patient_height[10], patient_weight[10],
00093             patient_dexterity, physician_name[32], operator_name[32],
00094             study_description[32];
00095   short int acquisition_type, bed_type, septa_type;
00096   char      facility_name[20];
00097   short int num_planes, num_frames, num_gates, num_bed_pos;
00098   float     init_bed_position, bed_offset[15], plane_separation;
00099   short int lwr_sctr_thres, lwr_true_thres, upr_true_thres;
00100   float     collimator;
00101   char      user_process_code[10];
00102   short int fill2[20];
00103 } ECAT63_mainheader;
00104 
00105 typedef struct ecat63_imageheader {
00106   char      fill1[126];
00107   short int data_type, num_dimensions, dimension_1, dimension_2;
00108   float     x_origin, y_origin, recon_scale, quant_scale;
00109   short int image_min, image_max;
00110   float     pixel_size, slice_width;
00111   int       frame_duration, frame_start_time;
00112   short int slice_location,
00113             recon_start_hour, recon_start_min, recon_start_sec;
00114   int       recon_duration;
00115   short int filter_code;
00116   int       scan_matrix_num, norm_matrix_num, atten_cor_mat_num;
00117   float     image_rotation, plane_eff_corr_fctr,
00118             decay_corr_fctr, loss_corr_fctr, intrinsic_tilt;
00119   short int processing_code, quant_units,
00120             recon_start_day, recon_start_month, recon_start_year;
00121   float     ecat_calibration_fctr, well_counter_cal_fctr, filter_params[6];
00122   char      annotation[40];
00123   short int fill2[26];
00124 } ECAT63_imageheader;
00125 
00126 typedef struct ecat63_scanheader {
00127   char      fill1[126];
00128   short int data_type,
00129             dimension_1, dimension_2,
00130             smoothing, processing_code;
00131   float     sample_distance,
00132             isotope_halflife;
00133   short int frame_duration_sec;
00134   int       gate_duration, r_wave_offset;
00135   float     scale_factor;
00136   short int scan_min, scan_max;
00137   int       prompts, delayed, multiples, net_trues;
00138   float     cor_singles[16], uncor_singles[16],
00139             tot_avg_cor, tot_avg_uncor;
00140   int       total_coin_rate,
00141             frame_start_time, frame_duration;
00142   float     loss_correction_fctr;
00143   short int fill2[22];
00144 } ECAT63_scanheader;
00145 
00146 typedef struct ecat63_normheader {
00147   short int data_type,
00148             dimension_1, dimension_2;
00149   float     scale_factor;
00150   short int norm_hour, norm_minute, norm_second, norm_day, norm_month, norm_year;
00151   float     fov_source_width;
00152 } ECAT63_normheader;
00153 
00154 typedef struct ecat63_attnheader {
00155   short int data_type, attenuation_type,
00156             dimension_1, dimension_2;
00157   float     scale_factor,
00158             x_origin, y_origin, x_radius, y_radius, tilt_angle,
00159             attenuation_coeff,
00160             sample_distance;
00161 } ECAT63_attnheader;
00162 
00163 typedef struct matdirnode {
00164   int    matnum;
00165   int    strtblk;
00166   int    endblk;
00167   int    matstat;
00168   struct matdirnode *next;
00169 } MatDirNode ;
00170 
00171 typedef struct matdirlist {
00172   int         nmats;
00173   MatDirNode *first;
00174   MatDirNode *last;
00175 } MatDirList;
00176 
00177 typedef struct matrixdata {
00178   int    mat_type;
00179   char  *shptr;
00180   char  *data_ptr;
00181   int    nviews;
00182   int    nelements;
00183   int    nblks;
00184   int    data_type;
00185 } MatrixData ;
00186 
00187 typedef struct matrix_file {
00188   ECAT63_mainheader *mhptr;
00189   MatDirList *dirlist;
00190   FILE *fptr ;
00191 } Matrix_file;
00192 /*****************************************************************************/
00193 /* Read functions */
00194 extern int ecat63ReadMainheader(FILE *fp, ECAT63_mainheader *h);
00195 extern int ecat63ReadImageheader(FILE *fp, int blk, ECAT63_imageheader *h);
00196 extern int ecat63ReadScanheader(FILE *fp, int blk, ECAT63_scanheader *h);
00197 extern int ecat63ReadAttnheader(FILE *fp, int blk, ECAT63_attnheader *h);
00198 extern int ecat63ReadNormheader(FILE *fp, int blk, ECAT63_normheader *h);
00199 extern int ecat63ReadMatdata(FILE *fp, int strtblk, int blkNr, char *data, int dtype);
00200 extern int ecat63ReadImageMatrix(FILE *fp, int strtblk, int lastblk, ECAT63_imageheader *h, float **f);
00201 extern int ecat63ReadScanMatrix(FILE *fp, int strtblk, int lastblk, ECAT63_scanheader *h, float **f);
00202 extern float ecat63rFloat(void *bufi, int isvax, int islittle);
00203 extern int ecat63rInt(void *bufi, int isvax, int islittle);
00204 extern int ecat63pxlbytes(short int data_type);
00205 /*****************************************************************************/
00206 /* Matrix list functions */
00207 extern void ecat63InitMatlist(MATRIXLIST *mlist);
00208 extern void ecat63EmptyMatlist(MATRIXLIST *mlist);
00209 extern int ecat63ReadMatlist(FILE *fp, MATRIXLIST *ml);
00210 extern void ecat63PrintMatlist(MATRIXLIST *ml);
00211 extern int mat_numcod(int frame, int plane, int gate, int data, int bed);
00212 extern void mat_numdoc(int matnum, Matval *matval);
00213 extern int ecat63Matenter(FILE *fp, int matnum, int blkNr);
00214 extern void ecat63SortMatlistByPlane(MATRIXLIST *ml);
00215 extern void ecat63SortMatlistByFrame(MATRIXLIST *ml);
00216 extern int ecat63CheckMatlist(MATRIXLIST *ml);
00217 extern int ecat63DeleteLateFrames(MATRIXLIST *ml, int frame_nr);
00218 extern int ecat63GetMatrixBlockSize(MATRIXLIST *mlist, int *blk_nr);
00219 extern int ecat63GetPlaneAndFrameNr(MATRIXLIST *mlist, ECAT63_mainheader *h, int *plane_nr, int *frame_nr);
00220 extern int ecat63GetNums(MATRIXLIST *ml, short int *num_planes, short int *num_frames, short int *num_gates, short int *num_bed_pos);
00221 extern int ecat63GatherMatlist(MATRIXLIST *ml, short int do_planes, short int do_frames, short int do_gates, short int do_beds);
00222 /*****************************************************************************/
00223 /* Write functions */
00224 extern int ecat63WriteMainheader(FILE *fp, ECAT63_mainheader *h);
00225 extern int ecat63WriteImageheader(FILE *fp, int block, ECAT63_imageheader *h);
00226 extern int ecat63WriteScanheader(FILE *fp, int block, ECAT63_scanheader *h);
00227 extern int ecat63WriteAttnheader(FILE *fp, int block, ECAT63_attnheader *h);
00228 extern int ecat63WriteNormheader(FILE *fp, int block, ECAT63_normheader *h);
00229 extern FILE *ecat63Create(const char *fname, ECAT63_mainheader *h);
00230 extern int ecat63WriteMatdata(FILE *fp, int strtblk, char *data, int pxlNr, int pxlSize);
00231 extern int ecat63WriteScan(FILE *fp, int matnum, ECAT63_scanheader *h, void *data);
00232 extern int ecat63WriteImage(FILE *fp, int matnum, ECAT63_imageheader *h, void *data);
00233 extern int ecat63WriteNorm(FILE *fp, int matnum, ECAT63_normheader *h, void *data);
00234 extern int ecat63WriteAttn(FILE *fp, int matnum, ECAT63_attnheader *h, void *data);
00235 extern int ecat63WriteImageMatrix(FILE *fp, int matnum, ECAT63_imageheader *h, float *fdata);
00236 extern int ecat63WriteScanMatrix(FILE *fp, int matnum, ECAT63_scanheader *h, float *fdata);
00237 extern void ecat63wFloat(float *bufi, void *bufo, int tovax, int islittle);
00238 extern void ecat63wInt(int *bufi, void *bufo, int tovax, int islittle);
00239 extern int ecat63_is_scaling_needed(float amax, float *data, int nr);
00240 /*****************************************************************************/
00241 /* Printing functions */
00242 extern void ecat63PrintMainheader(ECAT63_mainheader *h, FILE *fp);
00243 extern void ecat63PrintImageheader(ECAT63_imageheader *h, FILE *fp);
00244 extern void ecat63PrintScanheader(ECAT63_scanheader *h, FILE *fp);
00245 extern void ecat63PrintAttnheader(ECAT63_attnheader *h, FILE *fp);
00246 extern void ecat63PrintNormheader(ECAT63_normheader *h, FILE *fp);
00247 extern int ecat6PrintSubheader(ECAT63_mainheader mh, FILE *fp,
00248   int plane, int frame, FILE *ofp);
00249 extern char *ecat63Datatype(short int dtype);
00250 extern char *ecat63Unit(short int dunit);
00251 extern void float2parts(float *buf);
00252 /*****************************************************************************/
00253 #endif
00254