9#include "tpcclibConfig.h"
21static char *info[] = {
22 "Calculate Asymmetry Index (AI) from PET results inside a parameter file.",
25 " Asymmetry index AI = ------------ x 100 ",
28 "The right and left hemisphere is recognized from the following strings:",
29 " dx, dex, dexter, right, rgt, sn, sin, sinist, left, lft",
31 "Usage: @P [options] file [resultfile]",
36 "See also: pardiff, paradd, parcoll, parformat, tacren, parget, parrenp",
38 "Keywords: parameter, tool, ratio",
57int main(
int argc,
char **argv)
59 int ai, help=0, version=0, verbose=1;
60 char parfile[FILENAME_MAX], outfile[FILENAME_MAX];
62 static char *dx_string[] = {
"dx",
"dex",
"dexter",
"right",
"rgt",
"d", 0};
63 static char *sin_string[] = {
"sn",
"sin",
"sinist",
"left",
"lft",
"s", 0};
69 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
70 parfile[0]=outfile[0]=(char)0;
72 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
74 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
75 if(strcasecmp(cptr,
"DRY")==0) {
78 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
87 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
92 if(ai<argc)
strlcpy(parfile, argv[ai++], FILENAME_MAX);
93 if(ai<argc)
strlcpy(outfile, argv[ai++], FILENAME_MAX);
94 if(ai<argc) {fprintf(stderr,
"Error: too many arguments: '%s'.\n", argv[ai]);
return(1);}
97 if(!parfile[0]) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
98 if(strcasecmp(parfile, outfile)==0) {
99 fprintf(stderr,
"Error: input file would be overwritten.\n");
105 printf(
"parfile := %s\n", parfile);
106 if(outfile[0]) printf(
"outfile := %s\n", outfile);
114 if(verbose>1) printf(
"reading %s\n", parfile);
122 printf(
"parNr := %d\n", par.
parNr);
123 printf(
"tacNr := %d\n", par.
tacNr);
126 fprintf(stderr,
"Error: no data to calculate AI.\n");
138 for(
int i=0; i<par.
tacNr; i++) printf(
"%s\n", par.
r[i].
name);
147 if(verbose>1) {printf(
"counting dx and sin regions\n"); fflush(stdout);}
151 for(
int ri=0; ri<par.
tacNr; ri++) {
152 if(verbose>3) printf(
"--------------\n%s\n", par.
r[ri].
name);
157 while(dx_string[j]!=0) {
159 sprintf(test_string,
"-%s-", dx_string[j]);
160 if(verbose>6) printf(
" testing '%s'\n", test_string);
162 par.
r[ri].
sw=1;
break;
164 sprintf(test_string,
"_%s_", dx_string[j]);
165 if(verbose>6) printf(
" testing '%s'\n", test_string);
167 par.
r[ri].
sw=1;
break;
169 sprintf(test_string,
" %s ", dx_string[j]);
170 if(verbose>6) printf(
" testing '%s'\n", test_string);
172 par.
r[ri].
sw=1;
break;
175 unsigned int n=strlen(par.
r[ri].
name);
176 sprintf(test_string,
"-%s", dx_string[j]);
177 if(verbose>6) printf(
" testing '%s'\n", test_string);
178 if(n>strlen(test_string) && strcasecmp(par.
r[ri].
name+n-strlen(test_string), test_string)==0) {
179 par.
r[ri].
sw=1;
break;
181 sprintf(test_string,
"_%s", dx_string[j]);
182 if(verbose>6) printf(
" testing '%s'\n", test_string);
183 if(n>strlen(test_string) && strcasecmp(par.
r[ri].
name+n-strlen(test_string), test_string)==0) {
184 par.
r[ri].
sw=1;
break;
186 sprintf(test_string,
" %s", dx_string[j]);
187 if(verbose>6) printf(
" testing '%s'\n", test_string);
188 if(n>strlen(test_string) && strcasecmp(par.
r[ri].
name+n-strlen(test_string), test_string)==0) {
189 par.
r[ri].
sw=1;
break;
193 if(par.
r[ri].
sw!=0) {
195 if(verbose>3) printf(
" found string '%s'\n", test_string);
200 while(sin_string[j]!=0) {
201 sprintf(test_string,
"-%s-", sin_string[j]);
202 if(verbose>6) printf(
" testing '%s'\n", test_string);
204 par.
r[ri].
sw=2;
break;
206 sprintf(test_string,
"_%s_", sin_string[j]);
207 if(verbose>6) printf(
" testing '%s'\n", test_string);
209 par.
r[ri].
sw=2;
break;
211 sprintf(test_string,
" %s ", sin_string[j]);
212 if(verbose>6) printf(
" testing '%s'\n", test_string);
214 par.
r[ri].
sw=2;
break;
217 unsigned int n=strlen(par.
r[ri].
name);
218 sprintf(test_string,
"-%s", sin_string[j]);
219 if(verbose>6) printf(
" testing '%s'\n", test_string);
220 if(n>strlen(test_string) && strcasecmp(par.
r[ri].
name+n-strlen(test_string), test_string)==0) {
221 par.
r[ri].
sw=2;
break;
223 sprintf(test_string,
"_%s", sin_string[j]);
224 if(verbose>6) printf(
" testing '%s'\n", test_string);
225 if(n>strlen(test_string) && strcasecmp(par.
r[ri].
name+n-strlen(test_string), test_string)==0) {
226 par.
r[ri].
sw=2;
break;
228 sprintf(test_string,
" %s", sin_string[j]);
229 if(verbose>6) printf(
" testing '%s'\n", test_string);
230 if(n>strlen(test_string) && strcasecmp(par.
r[ri].
name+n-strlen(test_string), test_string)==0) {
231 par.
r[ri].
sw=2;
break;
235 if(par.
r[ri].
sw!=0) {
237 if(verbose>3) printf(
" found string '%s'\n", test_string);
242 if(ndx<1 || nsin<1) {
243 fprintf(stderr,
"Error: no dx/sin pairs were identified.\n");
247 if(verbose>2) {printf(
"deleting unidentified regions from list\n"); fflush(stdout);}
257 for(
int i=0; i<par.
tacNr; i++) printf(
"%s\n", par.
r[i].
name);
264 if(verbose>2) {printf(
"allocating place for AIs\n"); fflush(stdout);}
266 int pn=ndx;
if(nsin<pn) pn=nsin;
268 fprintf(stderr,
"Error: cannot allocate memory for AIs.\n");
274 for(
int i=0; i<pai.
parNr; i++) {
281 iftPut(&pai.
h,
"program", buf, 0, NULL);
285 iftPut(&pai.
h,
"datafile", parfile, 0, NULL);
291 if(verbose>1) {printf(
"computing AIs\n"); fflush(stdout);}
292 for(
int ri=0; ri<par.
tacNr; ri++)
if(par.
r[ri].
sw==1) {
294 for(
int rj=0; rj<par.
tacNr; rj++)
if(par.
r[rj].
sw==2) {
296 if(strcasecmp(par.
r[ri].
name, par.
r[rj].
name)!=0)
continue;
300 for(
int pi=0; pi<par.
parNr; pi++) {
301 double f=par.
r[ri].
p[pi]+par.
r[rj].
p[pi];
302 if(f==0.) pai.
r[pai.
tacNr].
p[pi]=0.;
303 else pai.
r[pai.
tacNr].
p[pi]=200.*(par.
r[ri].
p[pi]-par.
r[rj].
p[pi])/f;
316 fprintf(stderr,
"Error: no data to calculate AI.\n");
325 if(verbose>1) printf(
" saving %s\n", outfile);
327 fp=fopen(outfile,
"w");
329 fprintf(stderr,
"Error: cannot open file for writing.\n");
338 if(verbose>0) printf(
"parameter AIs saved in %s\n", outfile);
char * ctime_r_int(const time_t *t, char *buf)
Convert calendar time t into a null-terminated string of the form YYYY-MM-DD hh:mm:ss,...
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
int parAllocate(PAR *par, int parNr, int tacNr)
int parDeleteTAC(PAR *par, int ti)
char * parFormattxt(parformat c)
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
int parSortByName(PAR *d, TPCSTATUS *status)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
void tpcProgramName(const char *program, int version, int copyright, char *prname, int n)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strnlen(const char *s, size_t n)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char * strdelstr(char *s1, const char *s2)
char * strcasestr(const char *haystack, const char *needle)
IFT h
Optional (but often useful) header information.
char name[MAX_PARNAME_LEN+1]
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero).
@ UNIT_PERCENTAGE
Percentage (%).
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator).