8#include "tpcclibConfig.h"
22static char *info[] = {
23 "Pools all samples in TAC files. Overlapping samples are preserved.",
24 "Each TAC file must contain the same number of TACs with equal names,",
25 "but sample number can be different.",
27 "Usage: @P [options] outputfile tacfiles",
31 " Program does not mind if the time or calibration units cannot be",
32 " converted to match, or if TAC names do not match.",
35 "See also: tacadd, taccat, tacjoin, tacunit, avgbolus, avgttac, tacmsamp",
37 "Keywords: TAC, tool",
56int main(
int argc,
char **argv)
58 int ai, help=0, version=0, verbose=1;
61 char tacfile[FILENAME_MAX], outfile[FILENAME_MAX];
62 int fileNr=0, file1=0;
68 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
69 tacfile[0]=outfile[0]=(char)0;
71 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
73 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
74 if(strcasecmp(cptr,
"F")==0 || strcasecmp(cptr,
"FORCE")==0) {
75 checkData=0;
continue;
77 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
86 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
91 if(ai<argc)
strlcpy(outfile, argv[ai++], FILENAME_MAX);
92 for(; ai<argc; ai++) {
93 if(fileNr==0) file1=ai;
100 for(ai=0; ai<argc; ai++) printf(
"%s ", argv[ai]);
102 printf(
"fileNr := %d\n", fileNr);
103 printf(
"outfile := %s\n", outfile);
108 if(!outfile[0]) {
tpcPrintUsage(argv[0], info, stdout);
return(1);}
110 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
114 fprintf(stderr,
"Error: only one input file specified.\n");
120 for(ai=file1; ai<argc; ai++) {
121 strlcpy(tacfile, argv[ai], FILENAME_MAX);
122 if(access(tacfile, 0) == -1) {
123 fprintf(stderr,
"Error: input file %s does not exist.\n", tacfile);
126 if(strcasecmp(outfile, tacfile)==0) {
127 fprintf(stderr,
"Error: input file would be overwritten.\n");
138 strlcpy(tacfile, argv[file1], FILENAME_MAX);
139 if(verbose>1) printf(
"reading %s\n", tacfile);
140 ret=
tacRead(&pool, tacfile, &status);
142 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
148 printf(
"tacNr := %d\n", pool.
tacNr);
149 printf(
"sampleNr := %d\n", pool.
sampleNr);
154 fprintf(stderr,
"Error: missing x values in %s\n", tacfile);
166 int differentTUnits=0;
167 int differentCUnits=0;
168 for(ai=file1+1; ai<argc; ai++) {
169 strlcpy(tacfile, argv[ai], FILENAME_MAX);
170 if(verbose>1) printf(
"reading %s\n", tacfile);
171 ret=
tacRead(&tac, tacfile, &status);
173 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
179 printf(
"tacNr := %d\n", tac.
tacNr);
180 printf(
"sampleNr := %d\n", tac.
sampleNr);
185 fprintf(stderr,
"Error: missing x values in %s\n", tacfile);
190 fprintf(stderr,
"Error: different number of TACs.\n");
195 fprintf(stderr,
"Error: TAC names do not match.\n");
202 if(verbose>2) fprintf(stderr,
"Status: %s\n",
errorMsg(status.
error));
204 fprintf(stderr,
"Error: non-compatible TAC time units.\n");
213 if(verbose>2) fprintf(stderr,
"Status: %s\n",
errorMsg(status.
error));
215 fprintf(stderr,
"Error: non-compatible TAC concentration units.\n");
225 fprintf(stderr,
"Error: cannot allocate memory.\n");
238 if(verbose>0 && differentTUnits>1) fprintf(stderr,
239 "Warning: time units could not be converted for %d file(s).\n", differentTUnits);
240 if(verbose>0 && differentCUnits>1) fprintf(stderr,
241 "Warning: concentration units could not be converted for %d file(s).\n", differentCUnits);
248 fprintf(stderr,
"Error: cannot sort the pooled data.\n");
258 if(verbose>1) printf(
"writing %s\n", outfile);
259 FILE *fp; fp=fopen(outfile,
"w");
261 fprintf(stderr,
"Error: cannot open file for writing (%s)\n", outfile);
267 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
271 printf(
"%d samples from %d TAC files pooled.\n", pool.
sampleNr, fileNr);
272 printf(
"%s saved.\n", outfile);
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)
IFT h
Optional (but often useful) header information.
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacAllocateMoreSamples(TAC *tac, int addNr)
Allocate memory for more samples in TAC data.
int tacCompareNames(TAC *d1, TAC *d2, const int i, TPCSTATUS *status)
int tacSetHeaderStudynr(IFT *h, const char *s)
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
char * tacFormattxt(tacformat c)
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
int tacSortByTime(TAC *d, TPCSTATUS *status)
int tacSortByName(TAC *d, TPCSTATUS *status)
int tacYUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
int tacXUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
Header file for library libtpcextensions.
@ WEIGHTING_OFF
Not weighted or weights not available (weights for all included samples are 1.0).
@ TPCERROR_UNKNOWN_UNIT
Unknown data unit.
char * unitName(int unit_code)
Header file for library libtpcift.
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.