9#include "tpcclibConfig.h"
27static char *info[] = {
28 "Find the highest slope in TAC file. The intercept with x axis",
29 "can be used as an estimate of tracer appearance time.",
31 "Usage: @P [options] tacfile [parfile]",
34 " -n=<fitted sample number>",
35 " Number of samples used to determine the slopes; by default 3.",
37 " Slope is verified to be positive, and if not, then error is returned.",
39 " Sample values before estimated appearance time are set to zero.",
42 "See also: tactime, fitdelay, taccut, tacpeak, inpstart, tacrange",
44 "Keywords: TAC, input, time delay, time",
63int main(
int argc,
char **argv)
65 int ai, help=0, version=0, verbose=1;
66 char tacfile[FILENAME_MAX], parfile[FILENAME_MAX];
74 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
75 tacfile[0]=parfile[0]=(char)0;
77 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
79 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
80 if(strncasecmp(cptr,
"RMBKG", 2)==0) {
81 rmBkg=1; reqPos=1;
continue;
82 }
else if(strncasecmp(cptr,
"POSITIVE", 3)==0) {
84 }
else if(strncasecmp(cptr,
"N=", 2)==0) {
85 if(
atoiCheck(cptr+2, &nFit)==0 && nFit>1)
continue;
87 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
96 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
102 if(ai<argc)
strlcpy(tacfile, argv[ai++], FILENAME_MAX);
103 if(ai<argc)
strlcpy(parfile, argv[ai++], FILENAME_MAX);
104 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
107 if(!tacfile[0]) {
tpcPrintUsage(argv[0], info, stdout);
return(1);}
111 for(ai=0; ai<argc; ai++) printf(
"%s ", argv[ai]);
113 printf(
"tacfile := %s\n", tacfile);
114 printf(
"nFit := %d\n", nFit);
115 printf(
"reqPos := %d\n", reqPos);
116 printf(
"rmBkg := %d\n", rmBkg);
123 if(verbose>1) printf(
"reading %s\n", tacfile);
131 printf(
"tacNr := %d\n", tac.
tacNr);
132 printf(
"sampleNr := %d\n", tac.
sampleNr);
144 fprintf(stderr,
"Error: invalid data sample times.\n");
148 printf(
"xmin := %g\n", xmin);
149 printf(
"xmax := %g\n", xmax);
153 fprintf(stderr,
"Error: cannot process duplicate samples.\n");
158 fprintf(stderr,
"Error: too few samples for fitting.\n");
166 if(verbose>1) printf(
"preparing space for parameters\n");
175 for(
int i=0; i<tac.
tacNr; i++) {
182 strcpy(par.
n[0].
name,
"sMax");
191 if(verbose>1) {printf(
"searching for maximal slopes...\n"); fflush(stdout);}
192 for(
int i=0; i<tac.
tacNr; i++) {
193 double slope, yi, xi, xh;
196 fprintf(stderr,
"Error: cannot calculate max slope.\n");
197 if(verbose>2) fprintf(stderr,
"ret := %d\n", ret);
204 if(reqPos && !(slope>0.0)) {
205 fprintf(stderr,
"Error: slope is not positive.\n");
209 if(verbose>1) {printf(
"... done.\n"); fflush(stdout);}
219 if(verbose>1) printf(
" saving %s\n", parfile);
220 FILE *fp=fopen(parfile,
"w");
222 fprintf(stderr,
"Error: cannot open file for writing.\n");
231 if(verbose>0) printf(
"parameters saved in %s\n", parfile);
237 for(
int pi=0; pi<par.
parNr; pi++) {
238 double psum=0.0;
int n=0;
239 for(
int i=0; i<par.
tacNr; i++)
if(isfinite(par.
r[i].
p[pi])) {psum+=par.
r[i].
p[pi]; n++;}
240 if(n>0) printf(
"%s := %g\n", par.
n[pi].
name, psum/(
double)n);
248 if(verbose>1) printf(
"setting values before Ta to zero...\n");
256 for(
int ri=0; ri<tac.
tacNr; ri++) {
257 for(
int fi=0; fi<tac.
sampleNr; fi++)
258 if(!(tac.
x[fi]>=par.
r[ri].
p[2]) && !isnan(tac.
c[ri].
y[fi]) && tac.
c[ri].
y[fi]!=0.0) {
259 tac.
c[ri].
y[fi]=0.0; nChanged++;
264 if(verbose>0) printf(
"no changes made to %s\n", tacfile);
266 if(verbose>1) printf(
"writing %s\n", tacfile);
267 FILE *fp; fp=fopen(tacfile,
"w");
269 fprintf(stderr,
"Error: cannot open file for writing (%s)\n", tacfile);
279 if(verbose>0) printf(
"edited TAC file saved.\n");
int atoiCheck(const char *s, int *v)
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parAllocateWithTAC(PAR *par, TAC *tac, int parNr, TPCSTATUS *status)
Allocate PAR based on data in TAC.
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)
int highestSlope(double *x, double *y, const int n, const int slope_n, double x_start, double *m, double *yi, double *xi, double *xh)
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)
char name[MAX_PARNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
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 tacMultipleSamples(TAC *d1, const int fixMode, TAC *d2, const int verbose)
Check TAC data for multiple samples with the same sample time. Optionally replace the multiple sample...
unsigned int tacWSampleNr(TAC *tac)
int tacXRange(TAC *d, double *xmin, double *xmax)
Get the range of x values (times) in TAC structure.
Header file for library libtpcextensions.
char * unitName(int unit_code)
Header file for libtpcfunc.
Header file for library libtpcift.
Header file for libtpclinopt.
Header file for libtpcmodels.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator).
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.
Header file for libtpctacmod.