8#include "tpcclibConfig.h"
20static char *info[] = {
21 "Calculates time difference between zero times of PET scan and blood data.",
22 "Zero times are given in two text files in format",
23 "scan_start_time := YYYY-MM-DD hh:mm:ss, or",
24 "injection_time := YYYY-MM-DD hh:mm:ss.",
26 "The result, time difference (time2-time1 in seconds) will be written in",
27 "stdout or specified file in format",
28 "time_difference := <time2-time1>.",
30 "Usage: @P [Options] timefile1 timefile2 [outputfile]",
34 " Time difference is written in minutes or in seconds (default).",
36 " Software ignores time differences of multiples of one hour, that may",
37 " have been caused by wrong time zone or daylight saving setting in",
38 " either of the zero times.",
42 " @P -small s95432dy1.v.ift s95432blo.kbq s95432.dift",
44 "See also: egetstrt, absscal, iftlist, tactime, blotimes, fitdelay",
46 "Keywords: input, header, IFT, tool",
65int main(
int argc,
char **argv)
67 int ai, help=0, version=0, verbose=1;
68 int ret, li, time_unit=
UNIT_SEC, hastobe_small=0;
69 char iftfile1[FILENAME_MAX], iftfile2[FILENAME_MAX],
70 outfile[FILENAME_MAX];
72 char *cptr, value1[256], value2[256];
81 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
82 iftfile1[0]=iftfile2[0]=outfile[0]=(char)0;
85 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
87 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
88 if(strncasecmp(cptr,
"MINUTES", 3)==0) {
90 }
else if(strncasecmp(cptr,
"SECONDS", 3)==0) {
92 }
else if(strncasecmp(cptr,
"SMALL", 3)==0) {
93 hastobe_small=1;
continue;
95 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
104 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
109 for(; ai<argc; ai++) {
111 strlcpy(iftfile1, argv[ai], FILENAME_MAX);
continue;
112 }
else if(!iftfile2[0]) {
113 strlcpy(iftfile2, argv[ai], FILENAME_MAX);
continue;
114 }
else if(!outfile[0]) {
115 strlcpy(outfile, argv[ai], FILENAME_MAX);
continue;
117 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
123 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
129 for(ai=0; ai<argc; ai++)
130 printf(
"%s ", argv[ai]);
132 printf(
"iftfile1 := %s\n", iftfile1);
133 printf(
"iftfile2 := %s\n", iftfile2);
134 printf(
"outfile := %s\n", outfile);
135 printf(
"time_unit := %d\n", time_unit);
136 printf(
"hastobe_small := %d\n", hastobe_small);
143 if(verbose>1) printf(
"reading %s\n", iftfile1);
144 fp=fopen(iftfile1,
"r");
if(fp==NULL) {
145 fprintf(stderr,
"Error: cannot open file %s\n", iftfile1);
148 ret=
iftRead(&ift1, fp, 1, 1, &status); fclose(fp);
150 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
153 if(verbose>2) printf(
"list1 size: %d item(s)\n", ift1.
keyNr);
155 if(verbose>1) printf(
"reading %s\n", iftfile2);
156 fp=fopen(iftfile2,
"r");
if(fp==NULL) {
157 fprintf(stderr,
"Error: cannot open file %s\n", iftfile2);
160 ret=
iftRead(&ift2, fp, 1, 1, &status); fclose(fp);
162 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
165 if(verbose>2) printf(
"list2 size: %d item(s)\n", ift2.
keyNr);
171 if(verbose>1) printf(
"reading times\n");
174 if(li<0) li=
iftFindKey(&ift1,
"injection_time", 0);
176 fprintf(stderr,
"Error: %s does not contain required key.\n", iftfile1);
180 if(verbose>2) printf(
"File #1:\n%s := %s\n", ift1.
item[li].
key, value1);
182 fprintf(stderr,
"Error: wrong date/time format in %s.\n", iftfile1);
187 if(li<0) li=
iftFindKey(&ift2,
"injection_time", 0);
189 fprintf(stderr,
"Error: %s does not contain required key.\n", iftfile2);
193 if(verbose>2) printf(
"File #2:\n%s := %s\n", ift2.
item[li].
key, value2);
195 fprintf(stderr,
"Error: wrong date/time format in %s.\n", iftfile2);
206 if(verbose>1) printf(
"tdif=%g s\n", tdiff);
211 f=tdiff/3600.0; f=(f<0.0)?(
int)(f-0.5):(int)(f+0.5);
214 printf(
"tdif=%g s , when ignoring %g hour(s)\n", tdiff, f);
222 fp=fopen(outfile,
"w");
if(fp==NULL) {
223 fprintf(stderr,
"Error: cannot open %s for writing.\n", outfile);
229 fprintf(fp,
"filename1 := %s\n", iftfile1);
230 fprintf(fp,
"filename2 := %s\n", iftfile2);
232 ret=fprintf(fp,
"time_difference := %g [s]\n", tdiff);
234 ret=fprintf(fp,
"time_difference := %g [min]\n", tdiff/60.0);
236 if(outfile[0]) fclose(fp);
238 fprintf(stderr,
"Error: cannot write into %s\n", outfile);
int strDateTimeRead(const char *str, struct tm *date)
double tmDifference(struct tm *tm1, struct tm *tm0)
int iftFindKey(IFT *ift, const char *key, int start_index)
int iftRead(IFT *ift, FILE *fp, int is_key_required, int is_comment_accepted, TPCSTATUS *status)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
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 strlcpy(char *dst, const char *src, size_t dstsize)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
Header file for library libtpcift.