9#include "tpcclibConfig.h"
22static char *info[] = {
23 "Catenate the TACs from the second TAC file to the first one, or to a new",
24 "datafile. Sample times or correction for physical decay are not changed.",
26 "Deprecated. Please use taccat instead.",
28 "Usage: @P tacfile1 tacfile2 [catenated_file]",
31 " -both | -first | -second | -cut=<time>",
32 " In case of overlapping samples, either samples from both (-both),",
33 " first (-first), or second (-second, default) TAC are saved in",
34 " combined file, or specified cut time is used.",
35 " Cut time can also be given in file with keys 'x' or 'time'.",
39 " @P t455ap_pump.kbq t455ap_manual.kbq t455ap_combined.kbq",
41 "See also: taccat, taccut, tacadd, tactime, inpstart, taccross, tacframe",
43 "Keywords: TAC, input, blood, modelling, tool, simulation",
62int main(
int argc,
char **argv)
64 int ai, help=0, version=0, verbose=1;
70 DFT data1, data2, data3;
71 char *cptr, dfile1[FILENAME_MAX], dfile2[FILENAME_MAX], rfile[FILENAME_MAX];
72 double cut_time=-1.0E+20;
79 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
80 dfile1[0]=dfile2[0]=rfile[0]=(char)0;
83 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
84 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
86 if(strncasecmp(cptr,
"BOTH", 1)==0) {
87 useboth=1; cut_time=-1.0E+20;
continue;
88 }
else if(strncasecmp(cptr,
"FIRST", 2)==0) {
89 more_reliable=0; useboth=0;
continue;
90 }
else if(strncasecmp(cptr,
"SECOND", 2)==0) {
91 more_reliable=1; useboth=0;
continue;
92 }
else if(strncasecmp(cptr,
"CUT=", 4)==0) {
97 if(access(cptr, 0)!=-1) {
110 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
115 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
120 for(; ai<argc; ai++) {
121 if(!dfile1[0]) {strcpy(dfile1, argv[ai]);
continue;}
122 else if(!dfile2[0]) {strcpy(dfile2, argv[ai]);
continue;}
123 else if(!rfile[0]) {strcpy(rfile, argv[ai]);
continue;}
124 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
130 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n",
135 if(!rfile[0]) strcpy(rfile, dfile1);
139 printf(
"dfile1 := %s\n", dfile1);
140 printf(
"dfile2 := %s\n", dfile2);
141 printf(
"rfile := %s\n", rfile);
142 printf(
"useboth := %d\n", useboth);
143 printf(
"more_reliable := %d\n", more_reliable);
144 printf(
"cut_time := %g\n", cut_time);
151 if(verbose>1) printf(
"reading %s\n", dfile1);
153 fprintf(stderr,
"Error in reading '%s': %s\n", dfile1,
dfterrmsg);
157 printf(
"voiNr1 := %d\n", data1.
voiNr);
158 printf(
"frameNr1 := %d\n", data1.
frameNr);
162 if(verbose>1) printf(
"reading %s\n", dfile2);
164 fprintf(stderr,
"Error in reading '%s': %s\n", dfile2,
dfterrmsg);
168 printf(
"voiNr2 := %d\n", data2.
voiNr);
169 printf(
"frameNr2 := %d\n", data2.
frameNr);
175 fprintf(stderr,
"Error: different nr of regions.\n");
181 fprintf(stderr,
"Warning: unknown time units.\n");
186 fprintf(stderr,
"Warning: different time units.\n");
188 fprintf(stdout,
" converting units '%s' to '%s'\n",
192 fprintf(stderr,
"Error: cannot convert time units.\n");
199 unit1=dftUnitId(data1.
unit);
200 unit2=dftUnitId(data2.
unit);
201 if(unit1==CUNIT_UNKNOWN || unit2==CUNIT_UNKNOWN) {
202 fprintf(stderr,
"Warning: unknown concentration units.\n");
203 if(unit1!=CUNIT_UNKNOWN) strcpy(data2.
unit, data1.
unit);
204 else if(unit2!=CUNIT_UNKNOWN) strcpy(data1.
unit, data2.
unit);
207 fprintf(stderr,
"Warning: different concentration units.\n");
209 fprintf(stdout,
" converting units '%s' to '%s'\n",
213 fprintf(stderr,
"Error: cannot convert concentration units.\n");
223 if(data1.
x1[0]>data2.
x[0] && useboth==0 && cut_time<0.0) ret=1;
225 if(data1.
x[0]>data2.
x2[0] && useboth==0 && cut_time<0.0) ret=2;
227 if(data1.
x[0]>data2.
x[0] && useboth==0 && cut_time<0.0) ret=3;
230 fprintf(stderr,
"Error: check datafile times and their order!\n");
233 if(cut_time>=0.0 && data1.
x[data1.
frameNr-1]>=data2.
x[0]) {
235 if(data1.
x[data1.
frameNr-1]>=cut_time && data2.
x[0]<cut_time) {
237 if(verbose>1) printf(
"cutting both TACs at %g\n", cut_time);
242 fprintf(stderr,
"Error: invalid cut time.\n");
245 }
else if(data2.
x[0]<cut_time) {
248 }
else if(data1.
x[data1.
frameNr-1]>=cut_time) {
253 if(data1.
x[data1.
frameNr-1]>=data2.
x[0]) {
255 if(verbose>0 && cut_time<0.0 && useboth==0)
256 fprintf(stderr,
"Warning: times in datafiles overlap.\n");
259 if(more_reliable==1) {
261 if(ret!=0 || data1.
frameNr==0) {
262 fprintf(stderr,
"Error: check datafile times and their order!\n");
270 fprintf(stderr,
"Error: check datafile times and their order!\n");
274 if(verbose>0) fprintf(stderr,
"Warning: datafiles overlap fully.\n");
278 printf(
"first_tac_range := %g - %g\n",
280 printf(
"second_tac_range := %g - %g\n",
291 fprintf(stderr,
"Error: cannot allocate memory.\n");
299 for(voi=0; voi<data1.
voiNr; voi++)
302 if(strlen(data3.
unit)==0) strcpy(data3.
unit, data2.
unit);
309 for(fi=0; fi<data1.
frameNr; fi++) {
310 data3.
x[fi]=data1.
x[fi];
311 data3.
x1[fi]=data1.
x1[fi]; data3.
x2[fi]=data1.
x2[fi];
312 for(voi=0; voi<data1.
voiNr; voi++)
313 data3.
voi[voi].
y[fi]=data1.
voi[voi].
y[fi];
316 for(fi=0; fi<data2.
frameNr; fi++) {
320 for(voi=0; voi<data1.
voiNr; voi++)
332 strcat(data3.
comments,
"# catenated\n");
338 fprintf(stderr,
"Error (%d) in writing '%s': %s\n", ret, rfile,
dfterrmsg);
343 printf(
" %d+%d=%d frames written in %s\n", data1.
frameNr, data2.
frameNr,
int atof_with_check(char *double_as_string, double *result_value)
int dftCopyvoihdr(DFT *dft1, int from, DFT *dft2, int to)
int dftRemoveTimeRange(DFT *dft, double startT, double endT)
void dftSetComments(DFT *dft)
int dftSortByFrame(DFT *dft)
int dftCopymainhdr2(DFT *dft1, DFT *dft2, int ow)
int dftSetmem(DFT *data, int frameNr, int voiNr)
int dftRead(char *filename, DFT *data)
int dftWrite(DFT *data, char *filename)
int dftUnitConversion(DFT *dft, int dunit)
int dftTimeunitConversion(DFT *dft, int tunit)
int iftRead(IFT *ift, char *filename, int is_key_required, int verbose)
int iftGetDoubleValue(IFT *ift, int si, const char *key, double *value, int verbose)
Header file for libtpccurveio.
#define DFT_FORMAT_STANDARD
#define DFT_TIME_STARTEND
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
char * petCunit(int cunit)
char * petTunit(int tunit)
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)
char studynr[MAX_STUDYNR_LEN+1]
char comments[_DFT_COMMENT_LEN+1]
char unit[MAX_UNITS_LEN+1]