8#include "tpcclibConfig.h"
21static char *info[] = {
22 "Subtract constant background radioactivity in on-line blood sampler data.",
23 "The average of coincidence cps from 0 to specified time is calculated",
24 "and subtracted from the data; in case of Scanditronics/GEMS this is",
25 "a separate process for the two detector pairs, and in case of Allogg",
26 "separate for the two channels.",
27 "The background radioactivity is assumed to be stable during the assay",
28 "(not decaying); do not use this program in case of momentary background",
30 "Notice that the original data file is overwritten by default.",
32 "Usage: @P [options] abssfile time",
36 " Name for corrected file; by default the original file is overwritten.",
38 " Dry run: background is shown but data is not changed.",
41 "Example 1: calculate background from 0-60 s and subtract it.",
42 " @P -o=us1328_corr.bld us1328.bld 60",
43 "Example 2: calculate mean radioactivity [cps] from the measurement.",
44 " @P --dry us1328.bld 999999",
46 "See also: absszero, absscal, absstime, abssfch, abssexam, fitdelay",
48 "Keywords: input, blood, background, ABSS",
67int main(
int argc,
char **argv)
69 int ai, help=0, version=0, verbose=1;
70 char abssfile[FILENAME_MAX], outfile[FILENAME_MAX];
72 double bkgTime=nan(
"");
80 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
81 abssfile[0]=outfile[0]=(char)0;
83 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
85 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
86 if(strncasecmp(cptr,
"O=", 2)==0 && strlen(cptr)>2) {
87 strlcpy(outfile, cptr+2, FILENAME_MAX);
continue;
88 }
else if(strcasecmp(cptr,
"DRY")==0) {
91 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
100 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
105 if(ai<argc)
strlcpy(abssfile, argv[ai++], FILENAME_MAX);
107 if(
atofCheck(argv[ai], &bkgTime) || bkgTime<1.0) {
108 fprintf(stderr,
"Error: invalid bkg time '%s'.\n", argv[ai]);
114 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
119 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
122 if(!outfile[0]) strcpy(outfile, abssfile);
127 printf(
"abssfile := %s\n", abssfile);
128 printf(
"bkgTime := %g\n", bkgTime);
129 printf(
"dryRun := %d\n", dryRun);
130 printf(
"outfile := %s\n", outfile);
137 if(verbose>1) printf(
"reading %s\n", abssfile);
139 ret=
tacRead(&abss, abssfile, &status);
145 printf(
"sampleNr := %d\n", abss.
sampleNr);
148 printf(
"fileformat := %d\n", abss.
format);
149 printf(
"tacNr := %d\n", abss.
tacNr);
156 fprintf(stderr,
"Error: not valid ABSS format.\n");
159 if(verbose>100)
abssWrite(&abss, stdout, NULL);
161 fprintf(stderr,
"Error: not valid ABSS format.\n");
169 if(verbose>1) {printf(
"calculating the background\n"); fflush(stdout);}
171 double fdur, a1, a2, bkg1, bkg2;
176 for(i=0, n1=n2=0; i<abss.
sampleNr; i++) {
177 a1=abss.
c[0].
y[i]; a2=abss.
c[3].
y[i];
179 printf(
"%g %g %g %g\n", abss.
x1[i], abss.
x2[i], a1, a2);
182 fdur=abss.
x2[i]-abss.
x1[i];
183 if(isnan(fdur) || fdur<1.0E-06 || isnan(abss.
x[i]))
continue;
184 if(abss.
x[i]>bkgTime)
break;
186 if(!isnan(a1)) {bkg1+=a1; n1++;}
187 if(!isnan(a2)) {bkg2+=a2; n2++;}
191 if(verbose>0 || dryRun!=0) {
192 printf(
"background_ch1[cps] := %g\n", bkg1);
193 printf(
"background_ch2[cps] := %g\n", bkg2);
198 for(i=0, n1=n2=0; i<abss.
sampleNr; i++) {
199 a1=abss.
c[0].
y[i]; a2=abss.
c[1].
y[i];
201 printf(
"%g %g %g %g\n", abss.
x1[i], abss.
x2[i], a1, a2);
204 fdur=abss.
x2[i]-abss.
x1[i];
205 if(isnan(fdur) || fdur<1.0E-06 || isnan(abss.
x[i]))
continue;
206 if(abss.
x[i]>bkgTime)
break;
208 if(!isnan(a1)) {bkg1+=a1; n1++;}
209 if(!isnan(a2)) {bkg2+=a2; n2++;}
213 if(verbose>0 || dryRun!=0) {
214 printf(
"background_ch1[cps] := %g\n", bkg1);
215 printf(
"background_ch2[cps] := %g\n", bkg2);
218 if(verbose>0 || dryRun!=0) {fflush(stdout);}
231 printf(
"subtracting background from samples\n"); fflush(stdout);}
236 fdur=abss.
x2[i]-abss.
x1[i];
237 if(isnan(fdur) || fdur<1.0E-06)
continue;
238 abss.
c[0].
y[i]-=bkg1*fdur;
239 abss.
c[3].
y[i]-=bkg2*fdur;
245 fdur=abss.
x2[i]-abss.
x1[i];
246 if(isnan(fdur) || fdur<1.0E-06 || isnan(abss.
x[i]))
continue;
247 abss.
c[0].
y[i]-=bkg1*fdur;
248 abss.
c[1].
y[i]-=bkg2*fdur;
252 printf(
"writing corrected data file in %s\n", outfile); fflush(stdout);}
254 fp=fopen(outfile,
"w");
256 fprintf(stderr,
"Error: cannot open file for writing.\n");
266 printf(
"corrected data written in %s\n", outfile);
int abssWrite(TAC *d, FILE *fp, TPCSTATUS *status)
int atofCheck(const char *s, double *v)
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.
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
Header file for libtpcabss.
Header file for library libtpcextensions.
Header file for library libtpctac.
@ TAC_FORMAT_ABSS_ALLOGG
ALLOGG ABSS data; reading supported.
@ TAC_FORMAT_ABSS_GEMS
GEMS ABSS data; reading supported.
@ TAC_FORMAT_ABSS_ALLOGG_OLD
ALLOGG ABSS data (old format); reading supported.
@ TAC_FORMAT_ABSS_SCANDITRONICS
Scanditronics ABSS data; reading supported.