8#include "tpcclibConfig.h"
23static char *info[] = {
24 "Adjusts TACs in two files into the same level to make visual comparison",
25 "easier, or, adjust the TAC peak to specified value.",
27 "Usage: @P [Options] tacfile1 tacfile2 scaled_tacfile2",
29 "Usage: @P [Options] new_peak tacfile scaled_tacfile",
33 " Time where AUC calculation is started (by default start of data).",
35 " Time where AUC calculation is stopped (by default end of data).",
37 " Program does not mind if the time or calibration units",
38 " cannot be converted to match.",
41 "The procedure for adjusting TACs in file2 to TACs in file1 is:",
42 "1. if times x1 and x2 are not set by user, then set these based on",
43 " the common time ranges in data1 and data2",
44 "2. calculate AUC1 between x1 and x2 in data1 (mean AUC if several TACs)",
45 "3. calculate AUC2 between x1 and x2 in data2 (mean AUC if several TACs)",
46 "4. calculate the scale factor as AUC1/AUC2",
47 "5. multiply data2 with the scale factor, and save the file.",
49 "The procedure for adjusting TAC peak is:",
50 "1. find the maximum TAC value (max of all TACs, if several TACs)",
51 "2. calculate the scale factor as peak/maximum",
52 "3. multiply data with the scale factor, and save the file.",
54 "See also: taccalc, dftsuv, dftsums, dfteven, dftavg, dftmax, tac2svg",
56 "Keywords: TAC, input, simulation, plotting, AUC, peak, scaling",
75int main(
int argc,
char **argv)
77 int ai, help=0, version=0, verbose=1;
79 char *cptr, dfile1[FILENAME_MAX], ofile[FILENAME_MAX], dfile2[FILENAME_MAX];
80 char tmp[2*FILENAME_MAX];
84 double auc1=0.0, auc2=0.0, scalef=0.0, newmax, peakval;
90 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
91 dfile1[0]=dfile2[0]=ofile[0]=(char)0;
95 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
97 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
98 if(strncasecmp(cptr,
"X1=", 3)==0) {
99 x1=
atof_dpi(cptr+3);
if(x1>=0.0)
continue;
100 }
else if(strncasecmp(cptr,
"X2=", 3)==0) {
101 x2=
atof_dpi(cptr+3);
if(x2>=0.0)
continue;
102 }
else if(strcasecmp(cptr,
"FORCE")==0) {
103 checkUnits=0;
continue;
105 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
110 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
115 for(; ai<argc; ai++) {
116 if(!dfile1[0] && isnan(newmax)) {
117 if(access(argv[ai], 0)!=-1) {strcpy(dfile1, argv[ai]);
continue;}
118 newmax=
atof_dpi(argv[ai]);
if(newmax>0.0)
continue;
119 }
else if(!dfile2[0]) {
120 if(access(argv[ai], 0)!=-1) {strcpy(dfile2, argv[ai]);
continue;}
121 }
else if(!ofile[0]) {
122 strcpy(ofile, argv[ai]);
continue;
124 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
130 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
137 printf(
"dfile1 := %s\n", dfile1);
138 if(!isnan(newmax)) printf(
"newmax := %g\n", newmax);
139 printf(
"dfile2 := %s\n", dfile2);
140 printf(
"ofile := %s\n", ofile);
141 if(!isnan(x1)) printf(
"requested_x1 := %g\n", x1);
142 if(!isnan(x2)) printf(
"requested_x2 := %g\n", x2);
148 if(verbose>1) printf(
"reading %s\n", dfile1);
150 fprintf(stderr,
"Error in reading '%s': %s\n", dfile1,
dfterrmsg);
154 if(verbose>1) printf(
"reading %s\n", dfile2);
156 fprintf(stderr,
"Error in reading '%s': %s\n", dfile2,
dfterrmsg);
164 if(dfile1[0] && dfile2[0]) {
168 fprintf(stderr,
"Warning: unknown time units.\n");
173 fprintf(stderr,
"Warning: different time units.\n");
175 fprintf(stdout,
" converting units '%s' to '%s'\n",
179 fprintf(stderr,
"Error: cannot convert time units.\n");
187 unit1=dftUnitId(dft1.
unit);
188 unit2=dftUnitId(dft2.
unit);
189 if(unit1==CUNIT_UNKNOWN || unit2==CUNIT_UNKNOWN) {
190 fprintf(stderr,
"Warning: unknown concentration units.\n");
191 if(unit1!=CUNIT_UNKNOWN) strcpy(dft2.
unit, dft1.
unit);
192 else if(unit2!=CUNIT_UNKNOWN) strcpy(dft1.
unit, dft2.
unit);
195 fprintf(stderr,
"Warning: different concentration units.\n");
197 fprintf(stdout,
" converting units '%s' to '%s'\n",
201 fprintf(stderr,
"Error: cannot convert concentration units.\n");
208 double f1a, f1b, f2a, f2b;
209 ret=
dftMinMax(&dft1, &f1a, &f1b, NULL, NULL);
210 if(!ret) ret=
dftMinMax(&dft2, &f2a, &f2b, NULL, NULL);
212 fprintf(stderr,
"Error: invalid TAC data.\n");
217 if(isnan(x1) || x1<f1a) x1=f1a;
218 if(isnan(x2) || x2>f1b) x2=f1b;
220 printf(
"final_x1 := %g\n", x1);
221 printf(
"final_x2 := %g\n", x2);
224 fprintf(stderr,
"Error: invalid TAC data.\n");
238 fprintf(stderr,
"Error: %s\n", tmp);
241 for(ri=0, auc1=0.0; ri<dft1.
voiNr; ri++) auc1+=idft.
voi[ri].
y[0];
242 auc1/=(double)dft1.
voiNr;
if(verbose>1) printf(
"auc1 := %g\n", auc1);
246 fprintf(stderr,
"Error: %s\n", tmp);
249 for(ri=0, auc2=0.0; ri<dft2.
voiNr; ri++) auc2+=idft.
voi[ri].
y[0];
250 auc2/=(double)dft2.
voiNr;
if(verbose>1) printf(
"auc2 := %g\n", auc2);
253 if((fabs(auc2)<1.0E-30) || !isnormal(scalef=(auc1/auc2))) {
254 fprintf(stderr,
"Error: cannot calculate scale factor.\n");
261 if((peakval<1.0E-30) || !isnormal(scalef=(newmax/peakval))) {
262 fprintf(stderr,
"Error: cannot calculate scale factor.\n");
266 if(verbose>0) printf(
"scale_factor := %g\n", scalef);
269 for(ri=0; ri<dft2.
voiNr; ri++)
270 for(fi=0; fi<dft2.
frameNr; fi++)
271 dft2.
voi[ri].
y[fi]*=scalef;
277 if(verbose>1) printf(
"saving data\n");
279 sprintf(tmp,
"# scale_factor := %g\n", scalef);
283 fprintf(stderr,
"Error in writing '%s': %s\n", ofile,
dfterrmsg);
double atof_dpi(char *str)
int dftMinMax(DFT *dft, double *minx, double *maxx, double *miny, double *maxy)
double dft_kBqMax(DFT *data)
int dftTimeIntegral(DFT *dft, double t1, double t2, DFT *idft, int calc_mode, char *status, int verbose)
int dftRead(char *filename, DFT *data)
int dftWrite(DFT *data, char *filename)
int dftUnitConversion(DFT *dft, int dunit)
int dftTimeunitConversion(DFT *dft, int tunit)
Header file for libtpccurveio.
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)
Header file for libtpcmodel.
Header file for libtpcmodext.
char comments[_DFT_COMMENT_LEN+1]
char unit[MAX_UNITS_LEN+1]