My Project
ecat7p.c
Go to the documentation of this file.
1/******************************************************************************
2
3 ecat7p.c (c) 2003-2007 by Turku PET Centre
4
5 Procedures for printing ECAT 7.x (header) contents.
6
7
8 Version:
9 2003-07-17 Vesa Oikonen
10 2004-05-23 VO
11 Added ecat7datatype(short int data_type), and used too.
12 Added some units etc.
13 2004-08-15 VO
14 Main header sex and dexterity are checked printed as space instead of
15 (char)0.
16 2004-09-20 VO
17 Doxygen style comments are corrected.
18 2007-03-21 VO
19 strftime() call changed so that even Mingw can understand it.
20 2007-17-07 Harri Merisaari
21 fixed for ANSI
22 2007-09-10 VO
23 Return value of localtime() is checked.
24 2008-07-24 VO
25 Added ecat7PrintSubheader().
26
27******************************************************************************/
28#include <locale.h>
29#include <stdio.h>
30#include <stdlib.h>
31#include <math.h>
32#include <ctype.h>
33#include <string.h>
34#include <unistd.h>
35#include <time.h>
36/*****************************************************************************/
37#include <swap.h>
38#include <datetime.h>
39#include "include/ecat7.h"
40/*****************************************************************************/
41
42/*****************************************************************************/
50 int i;
51 char tmp[64];
52 struct tm *st;
53 time_t lt;
54
55 if(ECAT7_TEST) fprintf(stdout, "ecat7PrintMainheader()\n");
56 fprintf(fp, "magic_number := %.14s\n", h->magic_number);
57 fprintf(fp, "original_file_name := %.32s\n", h->original_file_name);
58 fprintf(fp, "sw_version := %d\n", h->sw_version);
59 fprintf(fp, "system_type := %d\n", h->system_type);
60 fprintf(fp, "file_type := %d (%s)\n", h->file_type, ecat7filetype(h->file_type) );
61 fprintf(fp, "serial_number := %.10s\n", h->serial_number);
62 lt=(time_t)h->scan_start_time; st=localtime(&lt);
63 if(st!=NULL) strftime(tmp, 32, "%Y-%m-%d %H:%M:%S", st); /* %T did not work with Mingw */
64 else strcpy(tmp, "1900-01-01 00:00:00");
65 fprintf(fp, "scan_start_time := %s\n", tmp);
66 fprintf(fp, "isotope_name := %.8s\n", h->isotope_name);
67 fprintf(fp, "isotope_halflife := %E sec\n", h->isotope_halflife);
68 fprintf(fp, "radiopharmaceutical := %.32s\n", h->radiopharmaceutical);
69 fprintf(fp, "gantry_tilt := %g\n", h->gantry_tilt);
70 fprintf(fp, "gantry_rotation := %g\n", h->gantry_rotation);
71 fprintf(fp, "bed_elevation := %g\n", h->bed_elevation);
72 fprintf(fp, "intrinsic_tilt := %g\n", h->intrinsic_tilt);
73 fprintf(fp, "wobble_speed := %d\n", h->wobble_speed);
74 fprintf(fp, "transm_source_type := %d\n", h->transm_source_type);
75 fprintf(fp, "distance_scanned := %g\n", h->distance_scanned);
76 fprintf(fp, "transaxial_fov := %g\n", h->transaxial_fov);
77 fprintf(fp, "angular_compression := %d\n", h->angular_compression);
78 fprintf(fp, "coin_samp_mode := %d\n", h->coin_samp_mode);
79 fprintf(fp, "axial_samp_mode := %d\n", h->axial_samp_mode);
80 fprintf(fp, "ecat_calibration_factor := %E\n", h->ecat_calibration_factor);
81 fprintf(fp, "calibration_units := %d\n", h->calibration_units);
82 fprintf(fp, "calibration_units_label := %d\n", h->calibration_units_label);
83 fprintf(fp, "compression_code := %d\n", h->compression_code);
84 fprintf(fp, "study_type := %.12s\n", h->study_type);
85 fprintf(fp, "patient_id := %.16s\n", h->patient_id);
86 fprintf(fp, "patient_name := %.32s\n", h->patient_name);
87 fprintf(fp, "patient_sex := %c\n", (h->patient_sex!=0)?h->patient_sex:(char)32);
88 fprintf(fp, "patient_dexterity := %c\n", (h->patient_dexterity!=0)?h->patient_dexterity:(char)32 );
89 fprintf(fp, "patient_age := %g\n", h->patient_age);
90 fprintf(fp, "patient_height := %g\n", h->patient_height);
91 fprintf(fp, "patient_weight := %g\n", h->patient_weight);
92 fprintf(fp, "patient_birth_date := %d\n", h->patient_birth_date);
93 fprintf(fp, "physician_name := %.32s\n", h->physician_name);
94 fprintf(fp, "operator_name := %.32s\n", h->operator_name);
95 fprintf(fp, "study_description := %.32s\n", h->study_description);
96 fprintf(fp, "acquisition_type := %d (%s)\n", h->acquisition_type,
98 fprintf(fp, "patient_orientation := %d\n", h->patient_orientation);
99 fprintf(fp, "facility_name := %.20s\n", h->facility_name);
100 fprintf(fp, "num_planes := %d\n", h->num_planes);
101 fprintf(fp, "num_frames := %d\n", h->num_frames);
102 fprintf(fp, "num_gates := %d\n", h->num_gates);
103 fprintf(fp, "num_bed_pos := %d\n", h->num_bed_pos);
104 fprintf(fp, "init_bed_position := %g\n", h->init_bed_position);
105 fprintf(fp, "bed_position :=");
106 for(i=0; i<15; i++) fprintf(fp, " %g", h->bed_position[i]);
107 fprintf(fp, "\n");
108 fprintf(fp, "plane_separation := %g cm\n", h->plane_separation);
109 fprintf(fp, "lwr_sctr_thres := %d\n", h->lwr_sctr_thres);
110 fprintf(fp, "lwr_true_thres := %d\n", h->lwr_true_thres);
111 fprintf(fp, "upr_true_thres := %d\n", h->upr_true_thres);
112 fprintf(fp, "user_process_code := %.10s\n", h->user_process_code);
113 fprintf(fp, "acquisition_mode := %d\n", h->acquisition_mode);
114 fprintf(fp, "bin_size := %g cm\n", h->bin_size);
115 fprintf(fp, "branching_fraction := %g\n", h->branching_fraction);
116 lt=(time_t)h->dose_start_time; st=localtime(&lt);
117 if(st!=NULL) strftime(tmp, 32, "%Y-%m-%d %H:%M:%S", st); /* %T did not work with Mingw */
118 else strcpy(tmp, "1900-01-01 00:00:00");
119 fprintf(fp, "dose_start_time := %s\n", tmp);
120 fprintf(fp, "dosage := %g\n", h->dosage);
121 fprintf(fp, "well_counter_corr_factor := %E\n", h->well_counter_corr_factor);
122 fprintf(fp, "data_units := %.32s\n", h->data_units);
123 fprintf(fp, "septa_state := %d\n", h->septa_state);
124 fprintf(fp, "fill_cti :=");
125 for(i=0; i<6; i++) fprintf(fp, " %d", h->fill_cti[i]);
126 fprintf(fp, "\n");
127}
128/*****************************************************************************/
129
130/*****************************************************************************/
138 int i;
139
140 if(ECAT7_TEST) fprintf(stdout, "ecat7PrintImageheader()\n");
141 fprintf(fp, "data_type := %d (%s)\n", h->data_type,
143 fprintf(fp, "num_dimensions := %d\n", h->num_dimensions);
144 fprintf(fp, "x_dimension := %d\n", h->x_dimension);
145 fprintf(fp, "y_dimension := %d\n", h->y_dimension);
146 fprintf(fp, "z_dimension := %d\n", h->z_dimension);
147 fprintf(fp, "x_offset := %g\n", h->x_offset);
148 fprintf(fp, "y_offset := %g\n", h->y_offset);
149 fprintf(fp, "z_offset := %g\n", h->z_offset);
150 fprintf(fp, "recon_zoom := %g\n", h->recon_zoom);
151 fprintf(fp, "scale_factor := %E\n", h->scale_factor);
152 fprintf(fp, "image_min := %d\n", h->image_min);
153 fprintf(fp, "image_max := %d\n", h->image_max);
154 fprintf(fp, "x_pixel_size := %g\n", h->x_pixel_size);
155 fprintf(fp, "y_pixel_size := %g\n", h->y_pixel_size);
156 fprintf(fp, "z_pixel_size := %g\n", h->z_pixel_size);
157 fprintf(fp, "frame_duration := %d\n", h->frame_duration);
158 fprintf(fp, "frame_start_time := %d\n", h->frame_start_time);
159 fprintf(fp, "filter_code := %d\n", h->filter_code);
160 fprintf(fp, "x_resolution := %g\n", h->x_resolution);
161 fprintf(fp, "y_resolution := %g\n", h->y_resolution);
162 fprintf(fp, "z_resolution := %g\n", h->z_resolution);
163 fprintf(fp, "num_r_elements := %g\n", h->num_r_elements);
164 fprintf(fp, "num_angles := %g\n", h->num_angles);
165 fprintf(fp, "z_rotation_angle := %g\n", h->z_rotation_angle);
166 fprintf(fp, "decay_corr_fctr := %g\n", h->decay_corr_fctr);
167 fprintf(fp, "processing_code := %d\n", h->processing_code);
168 fprintf(fp, "gate_duration := %d\n", h->gate_duration);
169 fprintf(fp, "r_wave_offset := %d\n", h->r_wave_offset);
170 fprintf(fp, "num_accepted_beats := %d\n", h->num_accepted_beats);
171 fprintf(fp, "filter_cutoff_frequency := %E\n", h->filter_cutoff_frequency);
172 fprintf(fp, "filter_resolution := %E\n", h->filter_resolution);
173 fprintf(fp, "filter_ramp_slope := %E\n", h->filter_ramp_slope);
174 fprintf(fp, "filter_order := %d\n", h->filter_order);
175 fprintf(fp, "filter_scatter_fraction := %E\n", h->filter_scatter_fraction);
176 fprintf(fp, "filter_scatter_slope := %E\n", h->filter_scatter_slope);
177 fprintf(fp, "annotation := %.40s\n", h->annotation);
178 fprintf(fp, "mt_1_1 := %g\n", h->mt_1_1);
179 fprintf(fp, "mt_1_2 := %g\n", h->mt_1_2);
180 fprintf(fp, "mt_1_3 := %g\n", h->mt_1_3);
181 fprintf(fp, "mt_2_1 := %g\n", h->mt_2_1);
182 fprintf(fp, "mt_2_2 := %g\n", h->mt_2_2);
183 fprintf(fp, "mt_2_3 := %g\n", h->mt_2_3);
184 fprintf(fp, "mt_3_1 := %g\n", h->mt_3_1);
185 fprintf(fp, "mt_3_2 := %g\n", h->mt_3_2);
186 fprintf(fp, "mt_3_3 := %g\n", h->mt_3_3);
187 fprintf(fp, "rfilter_cutoff := %g\n", h->rfilter_cutoff);
188 fprintf(fp, "rfilter_resolution := %g\n", h->rfilter_resolution);
189 fprintf(fp, "rfilter_code := %d\n", h->rfilter_code);
190 fprintf(fp, "rfilter_order := %d\n", h->rfilter_order);
191 fprintf(fp, "zfilter_cutoff := %g\n", h->zfilter_cutoff);
192 fprintf(fp, "zfilter_resolution := %g\n", h->zfilter_resolution);
193 fprintf(fp, "zfilter_code := %d\n", h->zfilter_code);
194 fprintf(fp, "zfilter_order := %d\n", h->zfilter_order);
195 fprintf(fp, "mt_1_4 := %g\n", h->mt_1_4);
196 fprintf(fp, "mt_2_4 := %g\n", h->mt_2_4);
197 fprintf(fp, "mt_3_4 := %g\n", h->mt_3_4);
198 fprintf(fp, "scatter_type := %d\n", h->scatter_type);
199 fprintf(fp, "recon_type := %d\n", h->recon_type);
200 fprintf(fp, "recon_views := %d\n", h->recon_views);
201 fprintf(fp, "fill_cti :=");
202 for(i=0; i<87; i++) fprintf(fp, " %d", h->fill_cti[i]); fprintf(fp, "\n");
203 fprintf(fp, "fill_user :=");
204 for(i=0; i<49; i++) fprintf(fp, " %d", h->fill_user[i]); fprintf(fp, "\n");
205}
206/*****************************************************************************/
207
208/*****************************************************************************/
216 int i;
217
218 if(ECAT7_TEST) fprintf(stdout, "ecat7PrintScanheader()\n");
219 fprintf(fp, "data_type := %d (%s)\n", h->data_type,
221 fprintf(fp, "num_dimensions := %d\n", h->num_dimensions);
222 fprintf(fp, "num_r_elements := %d\n", h->num_r_elements);
223 fprintf(fp, "num_angles := %d\n", h->num_angles);
224 fprintf(fp, "corrections_applied := %d\n", h->corrections_applied);
225 fprintf(fp, "num_z_elements :=");
226 for(i=0; i<64; i++) fprintf(fp, " %d", h->num_z_elements[i]);
227 fprintf(fp, "\n");
228 fprintf(fp, "ring_difference := %d\n", h->ring_difference);
229 fprintf(fp, "storage_order := %d\n", h->storage_order);
230 fprintf(fp, "axial_compression := %d (span)\n", h->axial_compression);
231 fprintf(fp, "x_resolution := %g cm\n", h->x_resolution);
232 fprintf(fp, "v_resolution := %g rad\n", h->v_resolution);
233 fprintf(fp, "z_resolution := %g cm\n", h->z_resolution);
234 fprintf(fp, "w_resolution := %g\n", h->w_resolution);
235 fprintf(fp, "gate_duration := %d\n", h->gate_duration);
236 fprintf(fp, "r_wave_offset := %d\n", h->r_wave_offset);
237 fprintf(fp, "num_accepted_beats := %d\n", h->num_accepted_beats);
238 fprintf(fp, "scale_factor := %E\n", h->scale_factor);
239 fprintf(fp, "scan_min := %d\n", h->scan_min);
240 fprintf(fp, "scan_max := %d\n", h->scan_max);
241 fprintf(fp, "prompts := %d\n", h->prompts);
242 fprintf(fp, "delayed := %d\n", h->delayed);
243 fprintf(fp, "multiples := %d\n", h->multiples);
244 fprintf(fp, "net_trues := %d\n", h->net_trues);
245 fprintf(fp, "tot_avg_cor := %g\n", h->tot_avg_cor);
246 fprintf(fp, "tot_avg_uncor := %g\n", h->tot_avg_uncor);
247 fprintf(fp, "total_coin_rate := %d\n", h->total_coin_rate);
248 fprintf(fp, "frame_start_time := %d\n", h->frame_start_time);
249 fprintf(fp, "frame_duration := %d\n", h->frame_duration);
250 fprintf(fp, "deadtime_correction_factor := %g\n", h->deadtime_correction_factor);
251 fprintf(fp, "uncor_singles :=");
252 for(i=0; i<128; i++) fprintf(fp, " %g", h->uncor_singles[i]);
253 fprintf(fp, "\n");
254}
255/*****************************************************************************/
256
257/*****************************************************************************/
265 int i;
266
267 if(ECAT7_TEST) fprintf(stdout, "ecat7PrintAttenheader()\n");
268 fprintf(fp, "data_type := %d (%s)\n", h->data_type,
270 fprintf(fp, "num_dimensions := %d\n", h->num_dimensions);
271 fprintf(fp, "attenuation_type := %d\n", h->attenuation_type);
272 fprintf(fp, "num_r_elements := %d\n", h->num_r_elements);
273 fprintf(fp, "num_angles := %d\n", h->num_angles);
274 fprintf(fp, "num_z_elements := %d\n", h->num_z_elements);
275 fprintf(fp, "ring_difference := %d\n", h->ring_difference);
276 fprintf(fp, "x_resolution := %g\n", h->x_resolution);
277 fprintf(fp, "y_resolution := %g\n", h->y_resolution);
278 fprintf(fp, "z_resolution := %g\n", h->z_resolution);
279 fprintf(fp, "w_resolution := %g\n", h->w_resolution);
280 fprintf(fp, "scale_factor := %E\n", h->scale_factor);
281 fprintf(fp, "x_offset := %g\n", h->x_offset);
282 fprintf(fp, "y_offset := %g\n", h->y_offset);
283 fprintf(fp, "x_radius := %g\n", h->x_radius);
284 fprintf(fp, "y_radius := %g\n", h->y_radius);
285 fprintf(fp, "tilt_angle := %g\n", h->tilt_angle);
286 fprintf(fp, "attenuation_coeff := %E\n", h->attenuation_coeff);
287 fprintf(fp, "attenuation_min := %E\n", h->attenuation_min);
288 fprintf(fp, "attenuation_max := %E\n", h->attenuation_max);
289 fprintf(fp, "skull_thickness := %g\n", h->skull_thickness);
290 fprintf(fp, "num_additional_atten_coeff := %d\n", h->num_additional_atten_coeff);
291 fprintf(fp, "additional_atten_coeff :=");
292 for(i=0; i<8; i++) fprintf(fp, " %E", h->additional_atten_coeff[i]);
293 fprintf(fp, "\n");
294 fprintf(fp, "edge_finding_threshold := %g\n", h->edge_finding_threshold);
295 fprintf(fp, "storage_order := %d\n", h->storage_order);
296 fprintf(fp, "span := %d\n", h->span);
297 fprintf(fp, "z_elements :=");
298 for(i=0; i<64; i++) fprintf(fp, " %d", h->z_elements[i]);
299 fprintf(fp, "\n");
300}
301/*****************************************************************************/
302
303/*****************************************************************************/
311 int i;
312
313 if(ECAT7_TEST) fprintf(stdout, "ecat7PrintPolmapheader()\n");
314 fprintf(fp, "data_type := %d (%s)\n", h->data_type,
316 fprintf(fp, "polar_map_type := %d\n", h->polar_map_type);
317 fprintf(fp, "num_rings := %d\n", h->num_rings);
318 fprintf(fp, "sectors_per_ring :=");
319 for(i=0; i<32; i++) fprintf(fp, " %d", h->sectors_per_ring[i]);
320 fprintf(fp, "\n");
321 fprintf(fp, "ring_position :=");
322 for(i=0; i<32; i++) fprintf(fp, " %g", h->ring_position[i]);
323 fprintf(fp, "\n");
324 fprintf(fp, "ring_angle :=");
325 for(i=0; i<32; i++) fprintf(fp, " %d", h->ring_angle[i]);
326 fprintf(fp, "\n");
327 fprintf(fp, "start_angle := %d\n", h->start_angle);
328 fprintf(fp, "long_axis_left :=");
329 for(i=0; i<3; i++) fprintf(fp, " %d", h->long_axis_left[i]);
330 fprintf(fp, "\n");
331 fprintf(fp, "long_axis_right :=");
332 for(i=0; i<3; i++) fprintf(fp, " %d", h->long_axis_right[i]);
333 fprintf(fp, "\n");
334 fprintf(fp, "position_data := %d\n", h->position_data);
335 fprintf(fp, "image_min := %d\n", h->image_min);
336 fprintf(fp, "image_max := %d\n", h->image_max);
337 fprintf(fp, "scale_factor := %E\n", h->scale_factor);
338 fprintf(fp, "pixel_size := %g\n", h->pixel_size);
339 fprintf(fp, "frame_duration := %d\n", h->frame_duration);
340 fprintf(fp, "frame_start_time := %d\n", h->frame_start_time);
341 fprintf(fp, "processing_code := %d\n", h->processing_code);
342 fprintf(fp, "quant_units := %d\n", h->quant_units);
343 fprintf(fp, "annotation := %.40s\n", h->annotation);
344 fprintf(fp, "gate_duration := %d\n", h->gate_duration);
345 fprintf(fp, "r_wave_offset := %d\n", h->r_wave_offset);
346 fprintf(fp, "num_accepted_beats := %d\n", h->num_accepted_beats);
347 fprintf(fp, "polar_map_protocol := %.20s\n", h->polar_map_protocol);
348 fprintf(fp, "database_name := %.30s\n", h->database_name);
349}
350/*****************************************************************************/
351
352/*****************************************************************************/
360 int i;
361
362 if(ECAT7_TEST) fprintf(stdout, "ecat7PrintNormheader()\n");
363 fprintf(fp, "data_type := %d (%s)\n", h->data_type,
365 fprintf(fp, "num_r_elements := %d\n", h->num_r_elements);
366 fprintf(fp, "num_transaxial_crystals := %d\n", h->num_transaxial_crystals);
367 fprintf(fp, "num_crystal_rings := %d\n", h->num_crystal_rings);
368 fprintf(fp, "crystals_per_ring := %d\n", h->crystals_per_ring);
369 fprintf(fp, "num_geo_corr_planes := %d\n", h->num_geo_corr_planes);
370 fprintf(fp, "uld := %d\n", h->uld);
371 fprintf(fp, "lld := %d\n", h->lld);
372 fprintf(fp, "scatter_energy := %d\n", h->scatter_energy);
373 fprintf(fp, "norm_quality_factor := %g\n", h->norm_quality_factor);
374 fprintf(fp, "norm_quality_factor_code := %d\n", h->norm_quality_factor_code);
375 fprintf(fp, "ring_dtcor1 :=");
376 for(i=0; i<32; i++) fprintf(fp, " %E", h->ring_dtcor1[i]);
377 fprintf(fp, "\n");
378 fprintf(fp, "ring_dtcor2 :=");
379 for(i=0; i<32; i++) fprintf(fp, " %E", h->ring_dtcor2[i]);
380 fprintf(fp, "\n");
381 fprintf(fp, "crystal_dtcor :=");
382 for(i=0; i<8; i++) fprintf(fp, " %E", h->crystal_dtcor[i]);
383 fprintf(fp, "\n");
384 fprintf(fp, "span := %d\n", h->span);
385 fprintf(fp, "max_ring_diff := %d\n", h->max_ring_diff);
386}
387/*****************************************************************************/
388
389/*****************************************************************************/
397 int i;
398
399 if(ECAT7_TEST) fprintf(stdout, "ecat7Print2DScanheader()\n");
400 fprintf(fp, "data_type := %d (%s)\n", h->data_type,
402 fprintf(fp, "num_dimensions := %d\n", h->num_dimensions);
403 fprintf(fp, "num_r_elements := %d\n", h->num_r_elements);
404 fprintf(fp, "num_angles := %d\n", h->num_angles);
405 fprintf(fp, "corrections_applied := %d\n", h->corrections_applied);
406 fprintf(fp, "num_z_elements := %d\n", h->num_z_elements);
407 fprintf(fp, "ring_difference := %d\n", h->ring_difference);
408 fprintf(fp, "x_resolution := %g\n", h->x_resolution);
409 fprintf(fp, "y_resolution := %g\n", h->y_resolution);
410 fprintf(fp, "z_resolution := %g\n", h->z_resolution);
411 fprintf(fp, "w_resolution := %g\n", h->w_resolution);
412 fprintf(fp, "gate_duration := %d\n", h->gate_duration);
413 fprintf(fp, "r_wave_offset := %d\n", h->r_wave_offset);
414 fprintf(fp, "num_accepted_beats := %d\n", h->num_accepted_beats);
415 fprintf(fp, "scale_factor := %E\n", h->scale_factor);
416 fprintf(fp, "scan_min := %d\n", h->scan_min);
417 fprintf(fp, "scan_max := %d\n", h->scan_max);
418 fprintf(fp, "prompts := %d\n", h->prompts);
419 fprintf(fp, "delayed := %d\n", h->delayed);
420 fprintf(fp, "multiples := %d\n", h->multiples);
421 fprintf(fp, "net_trues := %d\n", h->net_trues);
422 fprintf(fp, "cor_singles :=");
423 for(i=0; i<16; i++) fprintf(fp, " %g", h->cor_singles[i]);
424 fprintf(fp, "\n");
425 fprintf(fp, "uncor_singles :=");
426 for(i=0; i<16; i++) fprintf(fp, " %g", h->uncor_singles[i]);
427 fprintf(fp, "\n");
428 fprintf(fp, "tot_avg_cor := %g\n", h->tot_avg_cor);
429 fprintf(fp, "tot_avg_uncor := %g\n", h->tot_avg_uncor);
430 fprintf(fp, "total_coin_rate := %d\n", h->total_coin_rate);
431 fprintf(fp, "frame_start_time := %d\n", h->frame_start_time);
432 fprintf(fp, "frame_duration := %d\n", h->frame_duration);
433 fprintf(fp, "deadtime_correction_factor := %E\n", h->deadtime_correction_factor);
434 fprintf(fp, "physical_planes :=");
435 for(i=0; i<8; i++) fprintf(fp, " %d", h->physical_planes[i]);
436 fprintf(fp, "\n");
437}
438/*****************************************************************************/
439
440/*****************************************************************************/
448 int i;
449
450 if(ECAT7_TEST) fprintf(stdout, "ecat7Print2DNormheader()\n");
451 fprintf(fp, "data_type := %d (%s)\n", h->data_type,
453 fprintf(fp, "num_dimensions := %d\n", h->num_dimensions);
454 fprintf(fp, "num_r_elements := %d\n", h->num_r_elements);
455 fprintf(fp, "num_angles := %d\n", h->num_angles);
456 fprintf(fp, "num_z_elements := %d\n", h->num_z_elements);
457 fprintf(fp, "ring_difference := %d\n", h->ring_difference);
458 fprintf(fp, "scale_factor := %E\n", h->scale_factor);
459 fprintf(fp, "norm_min := %g\n", h->norm_min);
460 fprintf(fp, "norm_max := %g\n", h->norm_max);
461 fprintf(fp, "fov_source_width := %g\n", h->fov_source_width);
462 fprintf(fp, "norm_quality_factor := %g\n", h->norm_quality_factor);
463 fprintf(fp, "norm_quality_factor_code := %d\n", h->norm_quality_factor_code);
464 fprintf(fp, "storage_order := %d\n", h->storage_order);
465 fprintf(fp, "span := %d\n", h->span);
466 fprintf(fp, "z_elements :=");
467 for(i=0; i<64; i++) fprintf(fp, " %d", h->z_elements[i]);
468 fprintf(fp, "\n");
469}
470/*****************************************************************************/
471
472/*****************************************************************************/
479char* ecat7filetype(short int file_type) {
480 static char *info[] = {
481 "unknown", "2D sinogram", "image-16", "attenuation correction",
482 "2D normalization", "polar map", "volume 8", "volume 16",
483 "projection 8", "projection 16", "image 8", "3D sinogram 16",
484 "3D sinogram 8", "3D normalization", "3D sinogram fit",
485 0};
486 if(file_type>=0 && file_type<=14) return((char*)info[file_type]);
487 else return((char*)info[0]);
488}
489/*****************************************************************************/
490
491/*****************************************************************************/
498char* ecat7acquisitiontype(short int acquisition_type) {
499 static char *info[] = {
500 "undefined", "blank", "transmission", "static emission",
501 "dynamic emission", "gated emission", "transmission rectilinear",
502 "emission rectilinear",
503 0};
504 if(acquisition_type>=0 && acquisition_type<=7)
505 return((char*)info[acquisition_type]);
506 else return((char*)info[0]);
507}
508/*****************************************************************************/
509
510/*****************************************************************************/
517char* ecat7datatype(short int data_type) {
518 static char *info[] = {
519 "unknown", "byte", "VAX 2 byte integer", "VAX 4 byte integer",
520 "VAX 4 byte float", "IEEE 4 byte float", "SUN 2 byte integer",
521 "SUN 4 byte integer",
522 0};
523 if(data_type>=0 && data_type<=7) return((char*)info[data_type]);
524 else return((char*)info[0]);
525}
526/*****************************************************************************/
527
528/*****************************************************************************/
536 FILE *fp,
538 int plane,
540 int frame,
542 FILE *ofp
543) {
544 int mi, ret, nr=0;
545 ECAT7_imageheader image_header;
546 ECAT7_scanheader scan_header;
547 ECAT7_2Dscanheader scan2D_header;
548 ECAT7_2Dnormheader norm2D_header;
549 ECAT7_normheader norm_header;
550 ECAT7_attenheader atten_header;
551 ECAT7_polmapheader polmap_header;
552 static ECAT7_MATRIXLIST mlist;
553 ECAT7_Matval matval;
554
555
556 /*
557 * Read matrix list
558 */
559 ecat7InitMatlist(&mlist);
560 ret=ecat7ReadMatlist(fp, &mlist);
561 if(ret) {
562 fprintf(stderr, "Error (%d): cannot read matrix list.\n", ret);
563 return(2);
564 }
565 if(mlist.matrixNr<=0) {
566 fprintf(stderr, "Error: matrix list is empty.\n");
567 return(2);
568 }
569 if(ECAT7_TEST>1) ecat7PrintMatlist(&mlist);
570
571 /*
572 * Read and print subheaders one at a time
573 */
574 for(mi=nr=0; mi<mlist.matrixNr; mi++) {
575 /* Get frame nr */
576 ecat7_id_to_val(mlist.matdir[mi].id, &matval);
577 /* Check if this is supposed to be listed or not */
578 if(frame>=0 && frame!=matval.frame) continue;
579 if(plane>=0 && plane!=matval.plane) continue;
580 fprintf(fp, "Matrix: plane %d frame %d gate %d bed %d\n",
581 matval.plane, matval.frame, matval.gate, matval.bed);
582 /* Read and print subheader */
583 ret=0;
584 switch(mh.file_type) {
585 case ECAT7_ATTEN:
586 ret=ecat7ReadAttenheader(fp, mlist.matdir[mi].strtblk, &atten_header);
587 if(ret==0) ecat7PrintAttenheader(&atten_header, stdout);
588 break;
589 case ECAT7_3DNORM:
590 ret=ecat7ReadNormheader(fp, mlist.matdir[mi].strtblk, &norm_header);
591 if(ret==0) ecat7PrintNormheader(&norm_header, stdout);
592 break;
593 case ECAT7_IMAGE8:
594 case ECAT7_IMAGE16:
595 case ECAT7_VOLUME8:
596 case ECAT7_VOLUME16:
597 ret=ecat7ReadImageheader(fp, mlist.matdir[mi].strtblk, &image_header);
598 if(ret==0) ecat7PrintImageheader(&image_header, stdout);
599 break;
600 case ECAT7_3DSCAN:
601 case ECAT7_3DSCAN8:
602 case ECAT7_3DSCANFIT:
603 ret=ecat7ReadScanheader(fp, mlist.matdir[mi].strtblk, &scan_header);
604 if(ret==0) ecat7PrintScanheader(&scan_header, stdout);
605 break;
606 case ECAT7_POLARMAP:
607 ret=ecat7ReadPolmapheader(fp, mlist.matdir[mi].strtblk, &polmap_header);
608 if(ret==0) ecat7PrintPolmapheader(&polmap_header, stdout);
609 break;
610 case ECAT7_2DSCAN:
611 ret=ecat7Read2DScanheader(fp, mlist.matdir[mi].strtblk, &scan2D_header);
612 if(ret==0) ecat7Print2DScanheader(&scan2D_header, stdout);
613 break;
614 case ECAT7_2DNORM:
615 ret=ecat7Read2DNormheader(fp, mlist.matdir[mi].strtblk, &norm2D_header);
616 if(ret==0) ecat7Print2DNormheader(&norm2D_header, stdout);
617 break;
618 default:
619 fprintf(stderr, "Error: matrix filetype %d is not yet supported.\n",
620 mh.file_type);
621 ecat7EmptyMatlist(&mlist);
622 return(8);
623 }
624 if(ret) {
625 fprintf(stderr, "Error %d in reading subheader.\n", ret);
626 ecat7EmptyMatlist(&mlist); return(5);
627 }
628 nr++; // counter
629 } /* next matrix */
630 ecat7EmptyMatlist(&mlist);
631
632 if(nr==0 && (plane>=0 || frame>=0)) {
633 fprintf(stderr, "Error: specified matrices not found.\n");
634 return(11);
635 }
636
637 return(0);
638}
639/*****************************************************************************/
640
641/*****************************************************************************/
642
#define ECAT7_VOLUME8
Definition: ecat7.h:73
#define ECAT7_ATTEN
Definition: ecat7.h:70
#define ECAT7_3DSCAN
Definition: ecat7.h:78
#define ECAT7_3DSCAN8
Definition: ecat7.h:79
#define ECAT7_IMAGE16
Definition: ecat7.h:69
#define ECAT7_3DSCANFIT
Definition: ecat7.h:81
#define ECAT7_VOLUME16
Definition: ecat7.h:74
#define ECAT7_3DNORM
Definition: ecat7.h:80
#define ECAT7_IMAGE8
Definition: ecat7.h:77
#define ECAT7_2DNORM
Definition: ecat7.h:71
#define ECAT7_POLARMAP
Definition: ecat7.h:72
int ECAT7_TEST
Definition: ecat7.h:101
#define ECAT7_2DSCAN
Definition: ecat7.h:68
int ecat7ReadMatlist(FILE *fp, ECAT7_MATRIXLIST *ml)
Definition: ecat7ml.c:86
void ecat7InitMatlist(ECAT7_MATRIXLIST *mlist)
Definition: ecat7ml.c:59
void ecat7_id_to_val(int matrix_id, ECAT7_Matval *matval)
Definition: ecat7ml.c:299
void ecat7EmptyMatlist(ECAT7_MATRIXLIST *mlist)
Definition: ecat7ml.c:70
void ecat7PrintMatlist(ECAT7_MATRIXLIST *ml)
Definition: ecat7ml.c:149
void ecat7PrintNormheader(ECAT7_normheader *h, FILE *fp)
Definition: ecat7p.c:359
void ecat7PrintImageheader(ECAT7_imageheader *h, FILE *fp)
Definition: ecat7p.c:137
char * ecat7acquisitiontype(short int acquisition_type)
Definition: ecat7p.c:498
char * ecat7filetype(short int file_type)
Definition: ecat7p.c:479
void ecat7PrintPolmapheader(ECAT7_polmapheader *h, FILE *fp)
Definition: ecat7p.c:310
char * ecat7datatype(short int data_type)
Definition: ecat7p.c:517
void ecat7PrintAttenheader(ECAT7_attenheader *h, FILE *fp)
Definition: ecat7p.c:264
void ecat7Print2DScanheader(ECAT7_2Dscanheader *h, FILE *fp)
Definition: ecat7p.c:396
void ecat7PrintMainheader(ECAT7_mainheader *h, FILE *fp)
Definition: ecat7p.c:49
int ecat7PrintSubheader(ECAT7_mainheader mh, FILE *fp, int plane, int frame, FILE *ofp)
Definition: ecat7p.c:532
void ecat7PrintScanheader(ECAT7_scanheader *h, FILE *fp)
Definition: ecat7p.c:215
void ecat7Print2DNormheader(ECAT7_2Dnormheader *h, FILE *fp)
Definition: ecat7p.c:447
int ecat7ReadScanheader(FILE *fp, int blk, ECAT7_scanheader *h)
Definition: ecat7r.c:424
int ecat7ReadPolmapheader(FILE *fp, int blk, ECAT7_polmapheader *h)
Definition: ecat7r.c:325
int ecat7ReadNormheader(FILE *fp, int blk, ECAT7_normheader *h)
Definition: ecat7r.c:378
int ecat7ReadAttenheader(FILE *fp, int blk, ECAT7_attenheader *h)
Definition: ecat7r.c:268
int ecat7Read2DScanheader(FILE *fp, int blk, ECAT7_2Dscanheader *h)
Definition: ecat7r.c:485
int ecat7ReadImageheader(FILE *fp, int blk, ECAT7_imageheader *h)
Definition: ecat7r.c:177
int ecat7Read2DNormheader(FILE *fp, int blk, ECAT7_2Dnormheader *h)
Definition: ecat7r.c:546
ECAT7_MatDir * matdir
Definition: ecat7.h:614
int id
Definition: ecat7.h:606
int strtblk
Definition: ecat7.h:607
int plane
Definition: ecat7.h:617
int gate
Definition: ecat7.h:617
int bed
Definition: ecat7.h:617
int frame
Definition: ecat7.h:617
short int storage_order
Definition: ecat7.h:471
short int num_dimensions
Definition: ecat7.h:460
float norm_min
Definition: ecat7.h:466
short int z_elements[64]
Definition: ecat7.h:473
float scale_factor
Definition: ecat7.h:465
float norm_quality_factor
Definition: ecat7.h:469
short int num_angles
Definition: ecat7.h:462
float fov_source_width
Definition: ecat7.h:468
short int num_z_elements
Definition: ecat7.h:463
short int span
Definition: ecat7.h:472
short int norm_quality_factor_code
Definition: ecat7.h:470
short int num_r_elements
Definition: ecat7.h:461
short int ring_difference
Definition: ecat7.h:464
float norm_max
Definition: ecat7.h:467
short int data_type
Definition: ecat7.h:459
int num_accepted_beats
Definition: ecat7.h:437
int total_coin_rate
Definition: ecat7.h:449
short int physical_planes[8]
Definition: ecat7.h:453
float tot_avg_uncor
Definition: ecat7.h:448
short int num_dimensions
Definition: ecat7.h:424
short int num_z_elements
Definition: ecat7.h:428
short int ring_difference
Definition: ecat7.h:429
short int scan_min
Definition: ecat7.h:439
float x_resolution
Definition: ecat7.h:430
float deadtime_correction_factor
Definition: ecat7.h:452
int frame_start_time
Definition: ecat7.h:450
short int corrections_applied
Definition: ecat7.h:427
float w_resolution
Definition: ecat7.h:433
short int data_type
Definition: ecat7.h:423
float tot_avg_cor
Definition: ecat7.h:447
float y_resolution
Definition: ecat7.h:431
short int scan_max
Definition: ecat7.h:440
short int num_angles
Definition: ecat7.h:426
short int num_r_elements
Definition: ecat7.h:425
float uncor_singles[16]
Definition: ecat7.h:446
float scale_factor
Definition: ecat7.h:438
float z_resolution
Definition: ecat7.h:432
float cor_singles[16]
Definition: ecat7.h:445
int frame_duration
Definition: ecat7.h:451
short int data_type
Definition: ecat7.h:480
short int num_dimensions
Definition: ecat7.h:482
float edge_finding_threshold
Definition: ecat7.h:526
float z_resolution
Definition: ecat7.h:498
short int span
Definition: ecat7.h:530
short int attenuation_type
Definition: ecat7.h:484
short int num_angles
Definition: ecat7.h:488
float attenuation_min
Definition: ecat7.h:516
float scale_factor
Definition: ecat7.h:502
short int num_z_elements
Definition: ecat7.h:490
float y_radius
Definition: ecat7.h:510
float tilt_angle
Definition: ecat7.h:512
float w_resolution
Definition: ecat7.h:500
float y_resolution
Definition: ecat7.h:496
float x_radius
Definition: ecat7.h:508
short int ring_difference
Definition: ecat7.h:492
short int num_r_elements
Definition: ecat7.h:486
float additional_atten_coeff[8]
Definition: ecat7.h:524
float attenuation_max
Definition: ecat7.h:518
short int num_additional_atten_coeff
Definition: ecat7.h:522
float attenuation_coeff
Definition: ecat7.h:514
float x_resolution
Definition: ecat7.h:494
float skull_thickness
Definition: ecat7.h:520
float x_offset
Definition: ecat7.h:504
short int storage_order
Definition: ecat7.h:528
short int z_elements[64]
Definition: ecat7.h:532
float y_offset
Definition: ecat7.h:506
float mt_2_2
Definition: ecat7.h:310
float num_angles
Definition: ecat7.h:274
short int recon_type
Definition: ecat7.h:344
short int image_max
Definition: ecat7.h:252
short int filter_order
Definition: ecat7.h:294
float mt_1_2
Definition: ecat7.h:304
short int y_dimension
Definition: ecat7.h:236
float filter_scatter_slope
Definition: ecat7.h:298
short int scatter_type
Definition: ecat7.h:342
float scale_factor
Definition: ecat7.h:248
short int rfilter_code
Definition: ecat7.h:324
float x_offset
Definition: ecat7.h:240
short int x_dimension
Definition: ecat7.h:234
float x_pixel_size
Definition: ecat7.h:254
float mt_3_2
Definition: ecat7.h:316
float z_pixel_size
Definition: ecat7.h:258
float zfilter_cutoff
Definition: ecat7.h:328
float mt_1_1
Definition: ecat7.h:302
int gate_duration
Definition: ecat7.h:282
int frame_start_time
Definition: ecat7.h:262
int processing_code
Definition: ecat7.h:280
short int fill_cti[87]
Definition: ecat7.h:348
float recon_zoom
Definition: ecat7.h:246
float decay_corr_fctr
Definition: ecat7.h:278
short int z_dimension
Definition: ecat7.h:238
short int rfilter_order
Definition: ecat7.h:326
float num_r_elements
Definition: ecat7.h:272
float y_resolution
Definition: ecat7.h:268
short int zfilter_order
Definition: ecat7.h:334
float filter_resolution
Definition: ecat7.h:290
float mt_3_1
Definition: ecat7.h:314
float x_resolution
Definition: ecat7.h:266
int num_accepted_beats
Definition: ecat7.h:286
float mt_2_1
Definition: ecat7.h:308
short int data_type
Definition: ecat7.h:230
float mt_2_3
Definition: ecat7.h:312
float z_resolution
Definition: ecat7.h:270
float filter_ramp_slope
Definition: ecat7.h:292
float zfilter_resolution
Definition: ecat7.h:330
float z_offset
Definition: ecat7.h:244
float rfilter_resolution
Definition: ecat7.h:322
float mt_1_3
Definition: ecat7.h:306
short int fill_user[49]
Definition: ecat7.h:350
float filter_scatter_fraction
Definition: ecat7.h:296
float z_rotation_angle
Definition: ecat7.h:276
short int num_dimensions
Definition: ecat7.h:232
short int image_min
Definition: ecat7.h:250
short int filter_code
Definition: ecat7.h:264
char annotation[40]
Definition: ecat7.h:300
float y_offset
Definition: ecat7.h:242
float mt_2_4
Definition: ecat7.h:338
float mt_3_4
Definition: ecat7.h:340
short int recon_views
Definition: ecat7.h:346
float mt_1_4
Definition: ecat7.h:336
int frame_duration
Definition: ecat7.h:260
short int zfilter_code
Definition: ecat7.h:332
float y_pixel_size
Definition: ecat7.h:256
float rfilter_cutoff
Definition: ecat7.h:320
int r_wave_offset
Definition: ecat7.h:284
float mt_3_3
Definition: ecat7.h:318
float filter_cutoff_frequency
Definition: ecat7.h:288
float dosage
Definition: ecat7.h:217
char serial_number[10]
Definition: ecat7.h:115
char patient_name[32]
Definition: ecat7.h:158
char study_description[32]
Definition: ecat7.h:178
float well_counter_corr_factor
Definition: ecat7.h:219
short int compression_code
Definition: ecat7.h:152
char physician_name[32]
Definition: ecat7.h:174
short int patient_orientation
Definition: ecat7.h:183
short int file_type
Definition: ecat7.h:113
char isotope_name[8]
Definition: ecat7.h:119
int scan_start_time
Definition: ecat7.h:117
float distance_scanned
Definition: ecat7.h:137
char original_file_name[32]
Definition: ecat7.h:107
char facility_name[20]
Definition: ecat7.h:185
char patient_id[16]
Definition: ecat7.h:156
float transaxial_fov
Definition: ecat7.h:139
short int sw_version
Definition: ecat7.h:109
short int num_gates
Definition: ecat7.h:191
short int upr_true_thres
Definition: ecat7.h:205
short int angular_compression
Definition: ecat7.h:141
short int calibration_units
Definition: ecat7.h:148
short int fill_cti[6]
Definition: ecat7.h:225
float patient_weight
Definition: ecat7.h:168
float gantry_tilt
Definition: ecat7.h:125
short int transm_source_type
Definition: ecat7.h:135
short int wobble_speed
Definition: ecat7.h:133
char magic_number[14]
Definition: ecat7.h:105
float plane_separation
Definition: ecat7.h:199
int dose_start_time
Definition: ecat7.h:215
short int num_frames
Definition: ecat7.h:189
float gantry_rotation
Definition: ecat7.h:127
float init_bed_position
Definition: ecat7.h:195
short int coin_samp_mode
Definition: ecat7.h:143
short int acquisition_type
Definition: ecat7.h:181
float bed_elevation
Definition: ecat7.h:129
float isotope_halflife
Definition: ecat7.h:121
char user_process_code[10]
Definition: ecat7.h:207
short int axial_samp_mode
Definition: ecat7.h:145
char operator_name[32]
Definition: ecat7.h:176
short int calibration_units_label
Definition: ecat7.h:150
char data_units[32]
Definition: ecat7.h:221
short int num_planes
Definition: ecat7.h:187
short int acquisition_mode
Definition: ecat7.h:209
float patient_height
Definition: ecat7.h:166
char radiopharmaceutical[32]
Definition: ecat7.h:123
int patient_birth_date
Definition: ecat7.h:172
short int septa_state
Definition: ecat7.h:223
float bin_size
Definition: ecat7.h:211
float intrinsic_tilt
Definition: ecat7.h:131
float branching_fraction
Definition: ecat7.h:213
char patient_dexterity
Definition: ecat7.h:162
short int num_bed_pos
Definition: ecat7.h:193
float patient_age
Definition: ecat7.h:164
float ecat_calibration_factor
Definition: ecat7.h:146
short int lwr_true_thres
Definition: ecat7.h:203
short int lwr_sctr_thres
Definition: ecat7.h:201
short int system_type
Definition: ecat7.h:111
char patient_sex
Definition: ecat7.h:160
char study_type[12]
Definition: ecat7.h:154
float bed_position[15]
Definition: ecat7.h:197
short int num_crystal_rings
Definition: ecat7.h:546
short int lld
Definition: ecat7.h:553
float norm_quality_factor
Definition: ecat7.h:557
short int norm_quality_factor_code
Definition: ecat7.h:559
short int scatter_energy
Definition: ecat7.h:555
short int num_geo_corr_planes
Definition: ecat7.h:549
short int max_ring_diff
Definition: ecat7.h:569
short int span
Definition: ecat7.h:567
float ring_dtcor1[32]
Definition: ecat7.h:561
short int num_transaxial_crystals
Definition: ecat7.h:544
short int uld
Definition: ecat7.h:551
short int crystals_per_ring
Definition: ecat7.h:547
float ring_dtcor2[32]
Definition: ecat7.h:563
float crystal_dtcor[8]
Definition: ecat7.h:565
short int num_r_elements
Definition: ecat7.h:542
short int data_type
Definition: ecat7.h:540
short int processing_code
Definition: ecat7.h:593
short int polar_map_type
Definition: ecat7.h:578
float ring_position[32]
Definition: ecat7.h:581
short int image_max
Definition: ecat7.h:588
float pixel_size
Definition: ecat7.h:590
short int num_rings
Definition: ecat7.h:579
char database_name[30]
Definition: ecat7.h:600
short int sectors_per_ring[32]
Definition: ecat7.h:580
short int data_type
Definition: ecat7.h:577
char annotation[40]
Definition: ecat7.h:595
short int quant_units
Definition: ecat7.h:594
short int long_axis_left[3]
Definition: ecat7.h:584
int num_accepted_beats
Definition: ecat7.h:598
char polar_map_protocol[20]
Definition: ecat7.h:599
int frame_start_time
Definition: ecat7.h:592
short int image_min
Definition: ecat7.h:587
float scale_factor
Definition: ecat7.h:589
short int start_angle
Definition: ecat7.h:583
int frame_duration
Definition: ecat7.h:591
short int position_data
Definition: ecat7.h:586
short int ring_angle[32]
Definition: ecat7.h:582
short int long_axis_right[3]
Definition: ecat7.h:585
short int corrections_applied
Definition: ecat7.h:363
float z_resolution
Definition: ecat7.h:377
float uncor_singles[128]
Definition: ecat7.h:419
float w_resolution
Definition: ecat7.h:379
float v_resolution
Definition: ecat7.h:375
float x_resolution
Definition: ecat7.h:373
short int num_dimensions
Definition: ecat7.h:357
short int num_angles
Definition: ecat7.h:361
int gate_duration
Definition: ecat7.h:383
short int scan_max
Definition: ecat7.h:393
short int num_z_elements[64]
Definition: ecat7.h:365
int frame_start_time
Definition: ecat7.h:409
float scale_factor
Definition: ecat7.h:389
float tot_avg_uncor
Definition: ecat7.h:405
float deadtime_correction_factor
Definition: ecat7.h:413
float tot_avg_cor
Definition: ecat7.h:403
short int data_type
Definition: ecat7.h:355
short int axial_compression
Definition: ecat7.h:371
short int ring_difference
Definition: ecat7.h:367
int r_wave_offset
Definition: ecat7.h:385
int frame_duration
Definition: ecat7.h:411
int num_accepted_beats
Definition: ecat7.h:387
short int scan_min
Definition: ecat7.h:391
short int num_r_elements
Definition: ecat7.h:359
short int storage_order
Definition: ecat7.h:369
int total_coin_rate
Definition: ecat7.h:407