8#include "tpcclibConfig.h"
22static char *info[] = {
23 "Scanditronics and GEMS on-line blood sampler have sometimes failed to",
24 "correctly record the count data from either of the two channels, seen as",
25 "substantially lower or zero counts.",
26 "Use this program to examine the channel coincidence count ratio from",
27 "multiple files. Program examines individual ABSS data files whether",
28 "the channel ratio exceeds a predermined limit, and if it does, then prints",
29 "the following information:",
30 " column #1: measurement date,",
31 " column #2: Lower-to-higher channel ratio (the closer to 1 the better),",
32 " column #3: channel 1 mean cps from ten highest overall measurements,",
33 " column #4: channel 2 mean cps from ten highest overall measurements,",
34 " column #5: file name.",
36 "Usage: @P [options] abssfile(s)",
39 " -limit=<limit for channel ratio>",
40 " Limit for the lower-to-higher channel ratio; by default, 0.7.",
46 "See also: abssfch, absscal, abssbkg, absszero, absstime",
48 "Keywords: input, blood, calibration, ABSS",
67int main(
int argc,
char **argv)
69 int ai, help=0, version=0, verbose=1;
70 int ret, fileNr=0, printNr, firstfile=0;
72 double ratioLimit=0.70;
78 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
80 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
82 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
83 if(strncasecmp(cptr,
"LIMIT=", 6)==0 && strlen(cptr)>6) {
84 ratioLimit=
atofVerified(cptr+6);
if(!isnan(ratioLimit))
continue;
86 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
95 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
100 for(; ai<argc; ai++) {
101 if(firstfile==0) firstfile=ai;
105 if(fileNr==0) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
110 printf(
"fileNr := %d\n", fileNr);
111 printf(
"ratioLimit := %g\n", ratioLimit);
119 char abssfile[FILENAME_MAX];
123 for(ai=firstfile; ai<argc; ai++) {
128 strlcpy(abssfile, argv[ai], FILENAME_MAX);
129 if(verbose>5) {fprintf(stdout,
"%s\n", abssfile); fflush(stdout);}
130 ret=
tacRead(&abss, abssfile, &status);
133 fprintf(stdout,
"%s\n", abssfile); fflush(stdout);
144 fprintf(stderr,
"bypassed %s : %s format.\n",
158 fprintf(stderr,
"bypassed %s : invalid contents.\n", abssfile);
165 fprintf(stderr,
"bypassed %s : invalid contents.\n", abssfile);
177 unsigned int n, m1=0, m2=0;
182 if(ret==0) ret=
statMeanSD(abss.
c[c2].
y, n, &avg2, NULL, &m2);
183 if(ret!=0 || m1!=m2) {
185 fprintf(stderr,
"bypassed %s : invalid contents.\n", abssfile);
193 if(fabs(avg1)>1.0E-10) r=avg2/avg1;
194 }
else if(avg1<avg2) {
195 if(fabs(avg2)>1.0E-10) r=avg1/avg2;
196 }
else if(avg1==avg2) {
204 abssdate[10]=(char)0;
206 strcpy(abssdate,
"1900-01-01");
215 fprintf(stdout,
"%-10s\t%-s\t%-s\t%-s\t%-s\n",
216 "date",
"ratio",
"ch1",
"ch2",
"file");
217 fprintf(stdout,
"%s\t%5.3f\t\%6.1f\t%6.1f\t%s\tOK\n",
218 abssdate, r, avg1, avg2, abssfile);
228 if(printNr==0 && verbose>0)
229 fprintf(stdout,
"%-10s\t%-s\t%-s\t%-s\t%-s\n",
230 "date",
"ratio",
"ch1",
"ch2",
"file");
231 fprintf(stdout,
"%s\t%5.3f\t\%6.1f\t%6.1f\t%s",
232 abssdate, r, avg1, avg2, abssfile);
233 if(verbose>1) printf(
"\tFAILED\n");
else printf(
"\n");
242 "Error: no on-line sampler datafile was successfully examined.\n");
246 fprintf(stdout,
"Ready: %d datafiles were examined.\n", fileNr);
int abssChannelMean(TAC *abss, double *mean)
int abssCalculateCps(TAC *abss)
double atofVerified(const char *s)
int statMeanSD(double *data, unsigned int n, double *mean, double *sd, unsigned int *vn)
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)
char name[MAX_TACNAME_LEN+1]
IFT h
Optional (but often useful) header information.
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacAllocateMore(TAC *tac, int tacNr)
int tacGetHeaderScanstarttime(IFT *h, char *s, TPCSTATUS *status)
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
char * tacFormattxt(tacformat c)
int tacSortByConc(TAC *d, const int i, TPCSTATUS *status)
Header file for libtpcabss.
Header file for library libtpcextensions.
Header file for libtpcstatist.
Header file for library libtpctac.
@ TAC_FORMAT_ABSS_GEMS
GEMS ABSS data; reading supported.
@ TAC_FORMAT_ABSS_SCANDITRONICS
Scanditronics ABSS data; reading supported.