5#include "tpcclibConfig.h"
38 for(
int i=i1; i<=i2; i++) {
39 tac2->
x[i]=tac1->
x[i];
40 tac2->
x1[i]=tac1->
x1[i];
41 tac2->
x2[i]=tac1->
x2[i];
71 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
72 if(verbose>0) printf(
"%s()\n", __func__);
80 if(verbose>0) fprintf(stderr,
"Error: sample times are not in order.\n");
81 return(status->
error);
87 double overlap, flen1, flen2, overlap_limit=0.0;
88 for(
int fi=0; fi<d->
sampleNr-1; fi++) {
89 overlap=d->
x2[fi]-d->
x1[fi+1];
90 if(overlap==0.0)
continue;
92 flen1=d->
x2[fi]-d->
x1[fi]; flen2=d->
x2[fi+1]-d->
x1[fi+1];
93 if(flen1<0.0 || flen2<0.0)
return(1);
95 if(flen1<flen2) overlap_limit=0.2*flen1;
else overlap_limit=0.2*flen2;
97 if(overlap<-overlap_limit)
continue;
98 if(overlap>overlap_limit) {
104 if(flen1>flen2) d->
x2[fi]=d->
x1[fi+1];
else d->
x1[fi+1]=d->
x2[fi];
106 if(flen1>flen2) d->
x1[fi+1]=d->
x2[fi];
else d->
x2[fi]=d->
x1[fi+1];
132 if(xmin!=NULL) *xmin=nan(
"");
133 if(xmax!=NULL) *xmax=nan(
"");
135 if(d==NULL || d->
sampleNr<1)
return(1);
137 double mi, ma, *xi, *xa;
141 if(!isfinite(xi[i]) || !isfinite(xa[i]))
continue;
142 if(isnan(mi) || isnan(ma)) {mi=xi[i]; ma=xa[i];
continue;}
143 if(xi[i]<mi) mi=xi[i];
else if(xa[i]>ma) ma=xa[i];
145 if(xmin!=NULL) *xmin=mi;
146 if(xmax!=NULL) *xmax=ma;
147 if(!isfinite(mi) || !isfinite(ma))
return(2);
170 if(xmin!=NULL) *xmin=nan(
"");
171 if(xmax!=NULL) *xmax=nan(
"");
173 if(d==NULL || d->
sampleNr<1)
return(1);
175 double mi, ma, *xi, *xa;
181 if(!isfinite(xi[i]) || !isfinite(xa[i]))
continue;
182 if(weighted && !(d->
w[i]>0.0))
continue;
183 for(j=0; j<d->
tacNr; j++)
if(isfinite(d->
c[j].
y[i]))
break;
184 if(j==d->
tacNr)
continue;
185 if(isnan(mi) || isnan(ma)) {mi=xi[i]; ma=xa[i];
continue;}
186 if(xi[i]<mi) mi=xi[i];
else if(xa[i]>ma) ma=xa[i];
188 if(xmin!=NULL) *xmin=mi;
189 if(xmax!=NULL) *xmax=ma;
190 if(!isfinite(mi) || !isfinite(ma))
return(2);
205 if(d==NULL || !(d->
sampleNr>0))
return(-1);
206 int imin=-1;
double xmin=nan(
"");
208 double t1;
if(d->
isframe) t1=0.5*(d->
x1[i]+d->
x2[i]);
else t1=d->
x[i];
209 if(!isfinite(t1))
continue;
210 if(!isfinite(xmin) || imin<0 || t1<xmin) {xmin=t1; imin=i;
continue;}
230 if(d==NULL || d->
sampleNr<1)
return(0);
233 if(fabs(a)<1.0E-30 && fabs(b)<1.0E-30)
return(0);
234 if(fabs(a)<1.0E-30 && fabs(a-b)<1.0E-30)
return(0);
258 if(verbose>0) printf(
"\n%s()\n", __func__);
261 if(d1==NULL || d2==NULL)
return 0;
262 double xmin[2], xmax[2];
266 int smaller_sampleNr;
269 if(verbose>1) printf(
"smaller_sampleNr := %d\n", smaller_sampleNr);
270 if(smaller_sampleNr<=0)
return 0;
276 if(verbose>1) printf(
"cannot convert tac1 sample times to sec.\n");
281 if(verbose>1) printf(
"cannot convert tac2 sample times to sec.\n");
285 xmin[0]*=ts1; xmax[0]*=ts1;
286 xmin[1]*=ts2; xmax[1]*=ts2;
288 printf(
"tac1->isframe := %d\n", d1->
isframe);
289 if(verbose>2) printf(
"time_range1 := %g - %g\n", xmin[0], xmax[0]);
290 printf(
"tac2->isframe := %d\n", d2->
isframe);
291 if(verbose>2) printf(
"time_range2 := %g - %g\n", xmin[1], xmax[1]);
295 double f, accepted_timedif=2.2;
297 f=xmax[0]-xmin[0];
if((xmax[1]-xmin[1])>f) f=xmax[1]-xmin[1];
298 f*=0.01;
if(accepted_timedif>f) accepted_timedif=f;
300 printf(
"accepted_timedif := %g [s]\n", accepted_timedif);
307 if(verbose>2) {printf(
"frame mid times\n"); fflush(stdout);}
308 for(fi=0; fi<smaller_sampleNr; fi++) {
309 if(d1->
x[fi]*ts1==d2->
x[fi]*ts2)
continue;
310 if(isnan(d1->
x[fi]) && isnan(d2->
x[fi]))
continue;
311 if(isnan(d1->
x[fi]) || isnan(d2->
x[fi])) {n++;
continue;}
312 f=fabs(d1->
x[fi]*ts1-d2->
x[fi]*ts2);
313 if(verbose>3) printf(
"timedif[%d] := %g\n", fi, f);
314 if(verbose>4) printf(
" %g vs %g\n", ts1*d1->
x[fi], ts2*d2->
x[fi]);
315 if(f>accepted_timedif) n++;
318 if(verbose>2) {printf(
"frame start and end times\n"); fflush(stdout);}
319 for(fi=0; fi<smaller_sampleNr; fi++) {
320 if(d1->
x1[fi]*ts1==d2->
x1[fi]*ts2)
continue;
321 if(isnan(d1->
x1[fi]) && isnan(d2->
x1[fi]))
continue;
322 if(isnan(d1->
x1[fi]) || isnan(d2->
x1[fi])) {n++;
continue;}
323 f=fabs(d1->
x1[fi]*ts1-d2->
x1[fi]*ts2);
324 if(verbose>3) printf(
"timedif[%d] := %g\n", fi, f);
325 if(verbose>4) printf(
" %g vs %g\n", ts1*d1->
x1[fi], ts2*d2->
x1[fi]);
326 if(f>accepted_timedif) n++;
328 for(fi=0; fi<smaller_sampleNr; fi++) {
329 if(d1->
x2[fi]*ts1==d2->
x2[fi]*ts2)
continue;
330 if(isnan(d1->
x2[fi]) && isnan(d2->
x2[fi]))
continue;
331 if(isnan(d1->
x2[fi]) || isnan(d2->
x2[fi])) {n++;
continue;}
332 f=fabs(d1->
x2[fi]*ts1-d2->
x2[fi]*ts2);
333 if(verbose>3) printf(
"timedif[%d] := %g\n", fi, f);
334 if(verbose>4) printf(
" %g vs %g\n", ts1*d1->
x2[fi], ts2*d2->
x2[fi]);
335 if(f>accepted_timedif) n++;
338 if(verbose>2) {printf(
"mixed frame times\n"); fflush(stdout);}
340 for(fi=0; fi<smaller_sampleNr; fi++) {
341 if(d1->
isframe) x1=0.5*(d1->
x1[fi]+d1->
x2[fi]);
else x1=d1->
x[fi];
342 if(d2->
isframe) x2=0.5*(d2->
x1[fi]+d2->
x2[fi]);
else x2=d2->
x[fi];
343 if(x1*ts1==x2*ts2)
continue;
344 if(isnan(x1) && isnan(x2))
continue;
345 if(isnan(x1) || isnan(x2)) {n++;
continue;}
346 f=fabs(x1*ts1-x2*ts2);
347 if(verbose>3) printf(
"timedif[%d] := %g\n", fi, f);
348 if(verbose>4) printf(
" %g vs %g\n", x1, x2);
349 if(f>accepted_timedif) n++;
352 if(verbose>2) {printf(
"nr of different frame times := %d\n", n); fflush(stdout);}
353 if(n==0)
return 1;
else return 0;
372 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
373 if(verbose>0) printf(
"%s()\n", __func__);
390 for(
int j=0; j<d->
tacNr; j++) d->
c[j].
y[0]=0.0;
401 for(
int fi=d->
sampleNr; fi>0; fi--) {
402 d->
x[fi]=d->
x[fi-1]; d->
x1[fi]=d->
x1[fi-1]; d->
x2[fi]=d->
x2[fi-1];
403 for(
int ri=0; ri<d->
tacNr; ri++) d->
c[ri].
y[fi]=d->
c[ri].
y[fi-1];
408 for(
int ri=0; ri<d->
tacNr; ri++) d->
c[ri].
y[0]=0.0;
410 d->
x[0]=d->
x1[0]=d->
x2[0]=0.0;
412 d->
x1[0]=0.0; d->
x2[0]=d->
x1[1]; d->
x[0]=0.5*(d->
x1[0]+d->
x2[0]);
435 d->
x[fi-1]=d->
x[fi]; d->
x1[fi-1]=d->
x1[fi]; d->
x2[fi-1]=d->
x2[fi];
436 for(ri=0; ri<d->
tacNr; ri++) d->
c[ri].
y[fi-1]=d->
c[ri].
y[fi];
455 int fi, ri, n, delthat=0;
461 if(!isfinite(d->
x1[fi]) || !isfinite(d->
x2[fi])) delthat=1;
463 if(!isfinite(d->
x[fi])) delthat=1;
466 for(ri=n=0; ri<d->
tacNr; ri++)
if(isfinite(d->
c[ri].
y[fi])) n++;
511 beg=0.5*(tac.
x1[0]+tac.
x2[0]);
521 if(startT<=beg && endT>=end) {
528 int i, n=0, i1=-1, i2=-1;
531 if(tac.
isframe) x=0.5*(tac.
x1[i]+tac.
x2[i]);
else x=tac.
x[i];
532 if(x<startT)
continue;
547 for(
int j=0, ret=0; j<tac.
tacNr && ret==0; j++)
552 for(i=i1, n=0; i<=i2 && n<d2->
sampleNr; i++, n++) {
553 d2->
x[n]=tac.
x[i]; d2->
x1[n]=tac.
x1[i]; d2->
x2[n]=tac.
x2[i];
555 for(
int j=0; j<tac.
tacNr; j++) d2->
c[j].
y[n]=tac.
c[j].
y[i];
603 for(
int i=si, n=0; i<=ei && n<d2->
sampleNr; i++, n++) {
604 d2->
x[n]=d1->
x[i]; d2->
x1[n]=d1->
x1[i]; d2->
x2[n]=d1->
x2[i];
606 for(
int j=0; j<d1->
tacNr; j++) d2->
c[j].
y[n]=d1->
c[j].
y[i];
626 if(d==NULL || d->
sampleNr<1)
return(0);
628 double x1, x2, x, dx;
631 x1=d->
x1[i]; x2=d->
x2[i]; dx=x2-x1; x=0.5*(x1+x2);
635 if(i>0 && (x1+0.15*dx)<d->
x2[i-1]) {n++;
break;}
637 if(i>0 && i<d->sampleNr-1) {
638 if(x1-0.15*dx>d->
x2[i-1] && x2+0.15*dx<d->x1[i+1]) {n++;
break;}
641 if(n>0)
return(0);
else return(1);
662 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
663 if(verbose>0) printf(
"%s()\n", __func__);
681 if(verbose>1) printf(
"calculating x[] based on x1[] and x2[].\n");
684 d->
x[i]=0.5*(d->
x1[i]+d->
x2[i]);
685 if(isfinite(d->
x[i])) n++;
688 statusSet(status, __func__, __FILE__, __LINE__, ret);
693 if(verbose>1) printf(
"estimating x1[] and x2[] based on x[].\n");
703 if(verbose>2) printf(
"just one sample.\n");
704 if(d->
x[0]<=0.0) {d->
x1[0]=2.0*d->
x[0]; d->
x2[0]=0.0;}
705 else {d->
x1[0]=0.0; d->
x2[0]=2.0*d->
x[0];}
712 if(verbose>2) printf(
"just two samples.\n");
713 if(d->
x[0]>0.0 && 2.0*d->
x[0]<0.95*d->
x[1]) {
714 d->
x1[0]=0.0; d->
x2[0]=2.0*d->
x[0];
715 d->
x1[1]=d->
x2[0]; d->
x2[1]=d->
x2[0]+2.0*(d->
x[1]-d->
x2[0]);
717 double f; f=d->
x[1]-d->
x[0];
718 d->
x1[0]=d->
x[0]-0.5*f; d->
x2[0]=d->
x[0]+0.5*f;
719 d->
x1[1]=d->
x2[0]; d->
x2[1]=d->
x2[0]+2.0*f;
732 statusSet(status, __func__, __FILE__, __LINE__, ret);
735 double *x, *x1, *x2, *fa, *fb;
736 x=t.
x; x1=t.
x1; x2=t.
x2; fa=t.
c[0].
y; fb=t.
c[1].
y;
743 for(i=0; i<n; i++) x1[i]=x2[i]=x[i];
748 for(i=0; i<n-1; i++) {
749 v=x[i+1]-x[i];
if(!isfinite(v) || v<0.001)
continue;
750 if(isnan(gap)) {gap=v;
continue;}
759 if(verbose>2) printf(
"smallest gap := %g\n", gap);
767 if(verbose>2) printf(
"stepsize := %g\n", gap);
770 for(i=0; i<n; i++) fa[i]=fb[i]=0.0;
771 int fixed[n];
for(i=0; i<n; i++) fixed[i]=0;
778 for(i=0; i<n; i++) fa[i]=fb[i];
780 for(i=0; i<n; i++)
if(!fixed[i]) fa[i]+=gap;
782 for(i=0; i<n; i++) {x1[i]=x[i]-0.5*fa[i]; x2[i]=x[i]+0.5*fa[i];}
785 if(x2[i]<=x1[i+1]+0.001*gap && (x[i]<=0.0 || x1[i]>-0.001*gap)) {
786 fb[i]=fa[i];
if(!fixed[i]) anr++;
789 for(i=1; i<n-1; i++) {
790 if(x2[i]<=x1[i+1]+0.001*gap && x1[i]>=x2[i-1]-0.001*gap) {
791 fb[i]=fa[i];
if(!fixed[i]) anr++;}
else fixed[i]=1;
793 if(x1[i]>=x2[i-1]-0.001*gap) {
794 fb[i]=fa[i];
if(!fixed[i]) anr++;}
else fixed[i]=1;
797 for(i=0; i<n; i++) printf(
" %g", fb[i]);
803 printf(
"temp frames:");
804 for(i=0; i<n; i++) printf(
" %g", fa[i]);
809 for(i=0; i<n; i++) {x1[i]=x[i]-0.5*fb[i]; x2[i]=x[i]+0.5*fb[i];}
844 if(minfdur!=NULL) *minfdur=nan(
"");
845 if(maxfdur!=NULL) *maxfdur=nan(
"");
847 if(d==NULL || d->
sampleNr<1)
return(1);
848 double mi=nan(
""), ma=nan(
"");
851 double f=d->
x2[i]-d->
x1[i];
852 if(!isnan(ilimit) && !(f>=ilimit))
continue;
853 if(isnan(mi) || f<mi) mi=f;
854 if(isnan(ma) || f>ma) ma=f;
858 double f=d->
x[i]-d->
x[i-1];
859 if(!isnan(ilimit) && !(f>=ilimit))
continue;
860 if(isnan(mi) || f<mi) mi=f;
861 if(isnan(ma) || f>ma) ma=f;
863 if(isnan(mi) || isnan(ma)) {
865 if(f>0.0 && !isnan(ilimit) && f>=ilimit) {
871 if(minfdur!=NULL) *minfdur=mi;
872 if(maxfdur!=NULL) *maxfdur=ma;
874 if(minfdur!=NULL && isnan(mi))
return(2);
875 if(maxfdur!=NULL && isnan(ma))
return(2);
895 if(tac1==NULL || tac2==NULL || tac1->
sampleNr<1 || tac1->
tacNr<1)
return(1);
897 if(tac1->
isframe==0)
return(2);
910 for(
int fi=0; fi<tac1->
sampleNr; fi++) {
912 if(isnan(tac1->
x1[fi]) || isnan(tac1->
x2[fi]))
continue;
913 if(tac1->
tacNr==1 && isnan(tac1->
c[0].
y[fi]))
continue;
915 tac2->
x[fj]=tac1->
x1[fi];
916 for(
int ri=0; ri<tac2->
tacNr; ri++) tac2->
c[ri].
y[fj]=0.0;
918 tac2->
x[fj]=tac1->
x1[fi];
919 for(
int ri=0; ri<tac2->
tacNr; ri++) tac2->
c[ri].
y[fj]=tac1->
c[ri].
y[fi];
921 tac2->
x[fj]=tac1->
x2[fi];
922 for(
int ri=0; ri<tac2->
tacNr; ri++) tac2->
c[ri].
y[fj]=tac1->
c[ri].
y[fi];
924 tac2->
x[fj]=tac1->
x2[fi];
925 for(
int ri=0; ri<tac2->
tacNr; ri++) tac2->
c[ri].
y[fj]=0.0;
929 if(fj<1) {
tacFree(tac2);
return(5);}
953 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
954 if(verbose>0) printf(
"%s()\n", __func__);
955 if(inp==NULL || out==NULL) {
975 statusSet(status, __func__, __FILE__, __LINE__, ret);
1001 if(inp->
x1[0]>0.01*(inp->
x2[0]-inp->
x1[0])) {
1002 if(verbose>10) printf(
" add zero sample\n");
1004 for(
int ri=0; ri<out->
tacNr; ri++) out->
c[ri].
y[0]=0.0;
1008 if(verbose>10) printf(
" add first frame zero sample\n");
1014 for(
int fi=0; fi<inp->
sampleNr; fi++) {
1015 if(verbose>10) printf(
" frame %d: %g - %g\n", 1+fi, inp->
x1[fi], inp->
x2[fi]);
1021 for(
int ri=0; ri<out->
tacNr; ri++) {
1028 for(
int ri=0; ri<out->
tacNr; ri++)
1054 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
1055 if(verbose>0) printf(
"%s()\n", __func__);
1056 if(inp==NULL || out==NULL) {
1091 if(fabs(inp->
x1[fi])>1.0E-20) {
1092 out->
x[fj]=inp->
x1[fi];
1093 for(
int ri=0; ri<out->
tacNr; ri++) out->
c[ri].
y[fj]=0.0;
1096 for(fi=0; fi<inp->
sampleNr; fi++) {
1097 if(fi>0 && inp->
x1[fi]<inp->
x2[fi-1]) {
1098 double x=0.5*(inp->
x1[fi]+inp->
x2[fi-1]);
1099 if(x<out->x[fj-2]) {
1104 out->
x[fj-1]=out->
x[fj]=x;
1106 out->
x[fj]=inp->
x1[fi];
1108 for(
int ri=0; ri<out->
tacNr; ri++) out->
c[ri].
y[fj]=inp->
c[ri].
y[fi];
1110 out->
x[fj]=inp->
x2[fi];
1111 for(
int ri=0; ri<out->
tacNr; ri++) out->
c[ri].
y[fj]=inp->
c[ri].
y[fi];
1144 for(
int fi=0; fi<d->
sampleNr-1; fi++) {
1145 double e=d->
x2[fi]-d->
x1[fi+1];
1184 int fixed=0, large=0;
1185 for(
int fi=0; fi<d->
sampleNr-1; fi++) {
1186 double dif=d->
x1[fi+1]-d->
x2[fi];
if(dif==0.0)
continue;
1187 double fdur1=d->
x2[fi]-d->
x1[fi];
1188 double fdur2=d->
x2[fi+1]-d->
x1[fi+1];
1190 if(dif<0.2*fdur1 && dif<0.2*fdur2) {
1191 if(fdur1<fdur2) tac.
x2[fi]=d->
x1[fi+1];
else tac.
x1[fi+1]=d->
x2[fi];
1200 if(dif>0.2*fdur1 || dif>0.2*fdur2) {
1204 if(fdur1>fdur2) tac.
x2[fi]=d->
x1[fi+1];
else tac.
x1[fi+1]=d->
x2[fi];
1211 d->
x1[i]=tac.
x1[i]; d->
x2[i]=tac.
x2[i]; d->
x[i]=0.5*(d->
x1[i]+d->
x2[i]);
1224 for(
int fi=1; fi<tac.
sampleNr; fi++) {
1225 double dif=tac.
x1[fi]-tac.
x2[fi-1];
1231 double x1=0.5*(tac.
x1[fi-1]+tac.
x2[fi-1]);
1232 double x2=0.5*(tac.
x1[fi]+tac.
x2[fi]);
1233 for(
int ri=0; ri<tac.
tacNr; ri++) {
1234 double s=(tac.
c[ri].
y[fi]-tac.
c[ri].
y[fi-1])/(x2-x1);
1235 d->
c[ri].
y[d->
sampleNr]=tac.
c[ri].
y[fi-1] + s*(d->
x[fi]-x1);
int doubleMatch(const double v1, const double v2, const double lim)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacDuplicate(TAC *tac1, TAC *tac2)
Make a duplicate of TAC structure.
int tacAllocate(TAC *tac, int sampleNr, int tacNr)
int tacAllocateMoreSamples(TAC *tac, int addNr)
Allocate memory for more samples in TAC data.
int tacAllocateMore(TAC *tac, int tacNr)
int tacCopyTacchdr(TACC *d1, TACC *d2)
int tacCopyHdr(TAC *tac1, TAC *tac2)
Copy TAC header data from tac1 to tac2.
int tacSortByTime(TAC *d, TPCSTATUS *status)
int tacVerifyTimeOrder(TAC *d, TPCSTATUS *status)
int tacXUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
int tacIsWeighted(TAC *tac)
int tacSampleXRange(TAC *d, double *xmin, double *xmax)
Get the range of x values (times) in TAC structure.
int tacXMatch(TAC *d1, TAC *d2, const int verbose)
Check whether sample (frame) times are the same (or very close to) in two TAC structures.
int tacDeleteMissingSamples(TAC *d)
Delete those samples (time frames) from TAC structure, which contain only missing y values,...
int tacIsXContiguous(TAC *d)
Check that PET TAC frame times are contiguous, without even tiny overlap or gaps in between.
int tacMinX(TAC *d)
Get the minimum x value in TAC structure.
int tacCorrectFrameOverlap(TAC *d, TPCSTATUS *status)
Correct PET frame start and end times if frames are slightly overlapping or have small gaps in betwee...
int tacFramesToSteps(TAC *inp, TAC *out, TPCSTATUS *status)
Transform TAC with frames into TAC with frames represented with stepwise changing dot-to-dot data.
int tacAddZeroSample(TAC *d, TPCSTATUS *status)
Add an initial sample to TAC(s) with zero time and concentration.
int tacExtractSamples(TAC *d1, TAC *d2, int si, int ei)
Extract the specified sample range from TAC structure.
int tacToBars(TAC *tac1, TAC *tac2)
Transform TAC data with frame start and end times into suitable form for plotting with frames as bars...
int tacDeleteSample(TAC *d, int i)
Delete a certain sample (time frame) from TAC structure.
int tacGetSampleInterval(TAC *d, double ilimit, double *minfdur, double *maxfdur)
Get the shortest and longest sampling intervals or frame lengths in TAC structure.
int tacXCopy(TAC *tac1, TAC *tac2, int i1, int i2)
int tacExtractRange(TAC *d1, TAC *d2, double startT, double endT)
Extract the specified time (x) range from TAC structure.
int tacSetX(TAC *d, TPCSTATUS *status)
Set TAC x values based on x1 and x2 values, or guess x1 and x2 values based on x values.
int tacIsX(TAC *d)
Verify if TAC structure contains reasonable x values (times).
int tacSetXContiguous(TAC *d)
Set PET TAC frame times contiguous, without even tiny overlap or gaps in between.
int tacXRange(TAC *d, double *xmin, double *xmax)
Get the range of x values (times) in TAC structure.
int tacCheckX1X2X(TAC *d)
Check that sample (time frame) x, x1, and x2 values are reasonably set when compared to each other in...
@ WEIGHTING_OFF
Not weighted or weights not available (weights for all included samples are 1.0).
@ UNIT_UNKNOWN
Unknown unit.
@ TPCERROR_INVALID_XRANGE
Invalid sample time range.
@ TPCERROR_INVALID_VALUE
Invalid value.
@ TPCERROR_OVERLAPPING_DATA
Overlapping data.
@ TPCERROR_FAIL
General error.
@ TPCERROR_OUT_OF_MEMORY
Cannot allocate memory.
@ TPCERROR_INVALID_X
Invalid sample time.
@ TPCERROR_NO_X
No sample times.
@ TPCERROR_LARGE_GAP
Large gap in data.
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_MISSING_DATA
File contains missing values.
double unitConversionFactor(const int u1, const int u2)
Header file for library libtpcift.
Header file for library libtpctac.