00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _ECAT63_H_
00025 #define _ECAT63_H_
00026
00027 #define MatBLKSIZE 512
00028 #define MatFirstDirBlk 2
00029
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
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
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
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
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
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
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