TPCCLIB
Loading...
Searching...
No Matches
e7evhdr.c
Go to the documentation of this file.
1
7/*****************************************************************************/
8#include "tpcclibConfig.h"
9/*****************************************************************************/
10#include <stdio.h>
11#include <stdlib.h>
12#include <math.h>
13#include <string.h>
14#include <unistd.h>
15#include <ctype.h>
16#include <time.h>
17/*****************************************************************************/
18#include "libtpcmisc.h"
19#include "libtpcimgio.h"
20//#include "libtpcimgp.h"
21/*****************************************************************************/
22
23/*****************************************************************************/
24static char *info[] = {
25 "Edit the information in the ECAT 7.x image volume subheaders.",
26 " ",
27 "Usage: @P [options] ecatfile headerfile",
28 " ",
29 "Options:",
30 " -stdoptions", // List standard options like --help, -v, etc
31 " ",
32 "Header file can contain one or more subheader field names and values",
33 "in interfile-like format, for example:",
34 " x_pixel_size := 0.257426",
35 " y_pixel_size := 0.257426",
36 " z_pixel_size := 0.2425",
37 " ",
38 "See also: lshdr, e7emhdr, e7eshdr, lmlist, lmhdr, eframe",
39 " ",
40 "Keywords: ECAT, image, header, tool, IFT",
41 0};
42/*****************************************************************************/
43
44/*****************************************************************************/
45/* Turn on the globbing of the command line, since it is disabled by default in
46 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
47 In Unix&Linux wildcard command line processing is enabled by default. */
48/*
49#undef _CRT_glob
50#define _CRT_glob -1
51*/
52int _dowildcard = -1;
53/*****************************************************************************/
54
55/*****************************************************************************/
59int main(int argc, char **argv)
60{
61 int ai, help=0, version=0, verbose=1;
62 int li, mi, ret;
63 char *cptr, petfile[FILENAME_MAX], iftfile[FILENAME_MAX];
64 IFT ift;
65 ECAT7_mainheader main_header;
66 ECAT7_imageheader image_header;
67 static ECAT7_MATRIXLIST mlist;
68 FILE *fp;
69
70
71 /*
72 * Get arguments
73 */
74 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
75 petfile[0]=iftfile[0]=(char)0;
76 iftInit(&ift);
77 ecat7InitMatlist(&mlist);
78 /* Options */
79 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') { /* options */
80 cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(cptr==NULL) continue;
81 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
82 fprintf(stderr, "Error: invalid option %s\n", argv[ai]);
83 return(1);
84 } else break;
85
86 /* Print help or version? */
87 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
88 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
89 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
90
91 /* Process other arguments, starting from the first non-option */
92 for(; ai<argc; ai++) {
93 if(!petfile[0]) {strcpy(petfile, argv[ai]); continue;}
94 if(!iftfile[0]) {strcpy(iftfile, argv[ai]); continue;}
95 fprintf(stderr, "Error: invalid argument '%s'\n", argv[ai]);
96 return(1);
97 }
98
99 /* Is something missing? */
100 if(!iftfile[0]) {
101 fprintf(stderr, "Error: missing command-line argument; use option --help\n");
102 return(1);
103 }
104
105 /* In verbose mode print arguments and options */
106 if(verbose>1) {
107 printf("petfile := %s\n", petfile);
108 printf("iftfile := %s\n", iftfile);
109 }
110
111
112 /*
113 * Read key names and values from file, if necessary
114 */
115 if(verbose>1) printf("reading %s\n", iftfile);
116 ret=iftRead(&ift, iftfile, 1, 0);
117 if(ret) {
118 fprintf(stderr, "Error: %s\n", ift.status);
119 iftEmpty(&ift); return(2);
120 }
121 if(verbose>9) iftWrite(&ift, "stdout", 0);
122
123
124 /*
125 * Open ECAT volume file
126 */
127 if(verbose) printf("opening %s\n", petfile);
128 if((fp=fopen(petfile, "r+b")) == NULL) {
129 fprintf(stderr, "Error: cannot open file %s\n", petfile);
130 iftEmpty(&ift); return(3);
131 }
132 /* Read main header */
133 if((ret=ecat7ReadMainheader(fp, &main_header))) {
134 fprintf(stderr, "Error (%d): cannot read main header.\n", ret);
135 iftEmpty(&ift); fclose(fp); return(3);
136 }
137 if(verbose>9) ecat7PrintMainheader(&main_header, stdout);
138 /* Check file format */
139 if(strncmp(main_header.magic_number, ECAT7V_MAGICNR, 7)!=0) {
140 fprintf(stderr, "Error: %s is not an ECAT 7.x file.\n", petfile);
141 iftEmpty(&ift); fclose(fp); return(3);
142 }
143 /* Check the file type */
144 if(main_header.file_type!=ECAT7_VOLUME8 &&
145 main_header.file_type!=ECAT7_VOLUME16) {
146 fprintf(stderr, "Error: filetype %s is not supported.\n",
147 ecat7filetype(main_header.file_type) );
148 iftEmpty(&ift); fclose(fp); return(3);
149 }
150
151 /*
152 * Read matrix list
153 */
154 if(verbose>1) printf("reading matrix list\n");
155 ret=ecat7ReadMatlist(fp, &mlist, verbose-1);
156 if(ret) {
157 fprintf(stderr, "Error (%d): cannot read matrix list.\n", ret);
158 iftEmpty(&ift); fclose(fp); return(4);
159 }
160 if(mlist.matrixNr<=0) {
161 fprintf(stderr, "Error: matrix list is empty.\n");
162 iftEmpty(&ift); fclose(fp); return(4);
163 }
164 if(verbose>8) ecat7PrintMatlist(&mlist);
165
166
167 /*
168 * Edit subheaders one at a time
169 */
170 if(verbose>1) printf("editing matrices\n");
171 for(mi=0; mi<mlist.matrixNr; mi++) {
172 /* Read subheader */
173 if(verbose>2) printf("reading subheader from matrix %d\n", mi+1);
174 ret=ecat7ReadImageheader(fp, mlist.matdir[mi].strtblk, &image_header);
175 if(ret) {
176 fprintf(stderr, "Error %d in reading subheader.\n", ret);
177 iftEmpty(&ift); ecat7EmptyMatlist(&mlist); fclose(fp);
178 return(5);
179 }
180 /* Change requested header fields */
181 for(li=0; li<ift.keyNr; li++) {
182 ret=ecat7EditVHeader(&image_header, ift.item[li].key, ift.item[li].value,
183 verbose-2);
184 if(ret==1)
185 fprintf(stderr, "Error: invalid field name: %s\n", ift.item[li].key);
186 else if(ret==2)
187 fprintf(stderr, "Error: invalid field value: %s\n", ift.item[li].value);
188 if(ret==1 || ret==2) {
189 iftEmpty(&ift); ecat7EmptyMatlist(&mlist); fclose(fp);
190 return(6);
191 }
192 } // next field
193 if(verbose>5) ecat7PrintImageheader(&image_header, stdout);
194 /* Write subheader */
195 if(verbose>2) printf("writing header\n");
196 ret=ecat7WriteImageheader(fp, mlist.matdir[mi].strtblk, &image_header);
197 if(ret) {
198 fprintf(stderr, "Error %d in writing subheader.\n", ret);
199 iftEmpty(&ift); ecat7EmptyMatlist(&mlist); fclose(fp);
200 return(11);
201 }
202 } /* next matrix */
203 if(verbose>2) printf("all matrices processed.\n");
204
205 /*
206 * Close ECAT file
207 */
208 fclose(fp);
209
210 /*
211 * Free memory
212 */
213 iftEmpty(&ift); ecat7EmptyMatlist(&mlist);
214
215 return(0);
216}
217/*****************************************************************************/
218
219/*****************************************************************************/
int ecat7EditVHeader(ECAT7_imageheader *h, char *field, char *value, int verbose)
Definition ecat7h.c:320
void ecat7InitMatlist(ECAT7_MATRIXLIST *mlist)
Definition ecat7ml.c:15
int ecat7ReadMatlist(FILE *fp, ECAT7_MATRIXLIST *ml, int verbose)
Definition ecat7ml.c:41
void ecat7EmptyMatlist(ECAT7_MATRIXLIST *mlist)
Definition ecat7ml.c:26
void ecat7PrintMatlist(ECAT7_MATRIXLIST *ml)
Definition ecat7ml.c:112
void ecat7PrintImageheader(ECAT7_imageheader *h, FILE *fp)
Definition ecat7p.c:102
char * ecat7filetype(short int file_type)
Definition ecat7p.c:447
void ecat7PrintMainheader(ECAT7_mainheader *h, FILE *fp)
Definition ecat7p.c:16
int ecat7ReadMainheader(FILE *fp, ECAT7_mainheader *h)
Definition ecat7r.c:15
int ecat7ReadImageheader(FILE *fp, int blk, ECAT7_imageheader *h)
Definition ecat7r.c:162
int ecat7WriteImageheader(FILE *fp, int blk, ECAT7_imageheader *h)
Definition ecat7w.c:113
void iftEmpty(IFT *ift)
Definition ift.c:60
void iftInit(IFT *ift)
Definition ift.c:45
int iftRead(IFT *ift, char *filename, int is_key_required, int verbose)
Definition iftfile.c:24
int iftWrite(IFT *ift, char *filename, int verbose)
Definition iftfile.c:282
Header file for libtpcimgio.
#define ECAT7_VOLUME8
#define ECAT7_VOLUME16
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:40
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:213
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:383
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:158
ECAT7_MatDir * matdir
short int file_type
char magic_number[14]
int keyNr
Definition libtpcmisc.h:270
const char * status
Definition libtpcmisc.h:277
IFT_KEY_AND_VALUE * item
Definition libtpcmisc.h:279