31 if(verbose>0) printf(
"dftInterpolateCheckStart()\n");
34 if(status!=NULL) sprintf(status,
"program error");
35 if(input==NULL || output==NULL)
return -1;
38 if(status!=NULL) sprintf(status,
"too short data for interpolation");
41 if(status!=NULL) sprintf(status,
"ok");
48 t1=input->
x1[0]; t2=output->
x1[0];
50 t1=input->
x[0]; t2=output->
x[0];
53 if(verbose>1) printf(
"t1 := %g\nt2 := %g\n", t1, t2);
58 for(ri=0; ri<input->
voiNr; ri++)
if(input->
voi[ri].
y[0] > f) {
59 if(status!=NULL) strcpy(status,
"data starts too late");
63 if(status!=NULL) strcpy(status,
"data starts late");
96 if(verbose>0) printf(
"dftInterpolateCheckEnd()\n");
99 if(status!=NULL) sprintf(status,
"program error");
100 if(input==NULL || output==NULL)
return -1;
103 if(status!=NULL) sprintf(status,
"too short data for interpolation");
106 if(status!=NULL) sprintf(status,
"ok");
118 if(status!=NULL) strcpy(status,
"too short data for interpolation");
119 if(verbose>1) printf(
"t1 := %g\nt2 := %g\n", t1, t2);
133 for(fi=n=0; fi<input->
frameNr; fi++)
134 if(input->
x[fi]>=t1 && input->
x[fi]<=t2) n++;
135 if(n<1 || (n<2 && t2>input->
x[input->
frameNr-1])) {
136 if(status!=NULL) strcpy(status,
"too sparse sampling for interpolation");
137 if(verbose>1) printf(
"n=%d t1=%g t2=%g\n", n, t1, t2);
141 if(n<2 || (n<3 && t2>input->
x[input->
frameNr-1])) {
142 if(status!=NULL) strcpy(status,
"too sparse sampling for interpolation");
143 if(verbose>1) printf(
"n=%d t1=%g t2=%g\n", n, t1, t2);
179 if(verbose>0) printf(
"dftInterpolate()");
182 if(input==NULL || tissue==NULL || output==NULL) {
183 if(status!=NULL) sprintf(status,
"program error");
193 for(fi=0; fi<input->
frameNr; fi++) {
194 input->
x[fi]=tissue->
x[fi];
195 input->
x1[fi]=tissue->
x1[fi]; input->
x2[fi]=tissue->
x2[fi];
211 if(status!=NULL) strcpy(status,
"memory allocation error");
222 for(fi=0; fi<tissue->
frameNr; fi++) {
223 output->
x[fi]=tissue->
x[fi];
224 output->
x1[fi]=tissue->
x1[fi]; output->
x2[fi]=tissue->
x2[fi];
225 output->
w[fi]=tissue->
w[fi];
234 for(ri=0, ret=0; ri<output->
voiNr && ret==0; ri++) {
235 for(fi=0; fi<tissue->
frameNr; fi++)
236 output->
voi[ri].
y[fi]=input->
voi[ri].
y[fi];
242 output->
x, output->
voi[ri].
y, output->
voi[ri].
y2,
246 if(status!=NULL) sprintf(status,
"cannot interpolate (%d)", ret);
254 for(ri=0, ret=0; ri<output->
voiNr && ret==0; ri++) {
257 output->
x1, output->
x2, output->
voi[ri].
y, output->
voi[ri].
y2,
261 output->
x, output->
voi[ri].
y, output->
voi[ri].
y2,
265 if(status!=NULL) sprintf(status,
"cannot interpolate (%d)", ret);
295 if(verbose>0) printf(
"dftInterpolateInto()\n");
298 if(inp==NULL || tis==NULL) {
299 if(status!=NULL) sprintf(status,
"program error");
303 if(status!=NULL) sprintf(status,
"missing sample(s)");
315 if(status!=NULL) strcpy(status,
"memory allocation error");
320 for(ri=0; ri<inp->
voiNr; ri++)
328 for(ri=0, ret=0; ri<inp->
voiNr && ret==0; ri++) {
329 for(fi=0; fi<tis->
frameNr; fi++)
342 if(status!=NULL) sprintf(status,
"cannot interpolate (%d)", ret);
351 for(ri=0, ret=0; ri<inp->
voiNr && ret==0; ri++) {
364 if(status!=NULL) sprintf(status,
"cannot interpolate (%d)", ret);
403 int ri, fi, ret, f1, f2;
404 double fdur, aucroi, t[2], auc[2];
405 double accept_tdif=1.0;
408 printf(
"dftTimeIntegral(dft, %g, %g, idft, %d, status, %d)\n", t1, t2, calc_mode, verbose);
411 if(status!=NULL) sprintf(status,
"program error");
412 if(dft==NULL || idft==NULL || t1<0.0 || t2<0.0)
return STATUS_FAULT;
413 fdur=t2-t1;
if(fdur<0.0)
return STATUS_FAULT;
414 if(fdur==0.0 && (calc_mode!=1 || dft->
frameNr>1))
return STATUS_FAULT;
418 if(dft->
timeunit==TUNIT_MIN) accept_tdif/=60.0;
423 if(status!=NULL) sprintf(status,
"cannot setup AUC data (%d)", ret);
431 for(ri=0; ri<idft->
voiNr; ri++) idft->
voi[ri].
y[0]=0.0;
441 if(fabs(dft->
x2[0]-t2)>accept_tdif || fabs(dft->
x1[0]-t1)>accept_tdif) {
443 strcpy(status,
"for static data the integration time range must");
444 strcat(status,
" be exactly as long as the scan");
449 dft->
x2[0]=t2; dft->
x1[0]=t1;
453 if(dft->
x1[0]>(0.66*t1+0.34*t2) ||
454 dft->
x2[dft->
frameNr-1]<(0.34*t1+0.66*t2)) {
456 strcpy(status,
"integration time range oversteps data range");
465 for(fi=0, f1=f2=-1; fi<dft->
frameNr; fi++) {
466 if(f1<0) {
if(dft->
x1[fi]>=t1 && dft->
x2[fi]<=t2) f1=f2=fi;}
467 if(f1>=0) {
if(t2>=dft->
x2[fi]) f2=fi;}
470 if(verbose>1) printf(
"f1=%d f2=%d\n", f1, f2);
474 for(ri=0; ri<dft->
voiNr; ri++) {
475 idft->
voi[ri].
y[0]+=(dft->
x2[fi]-dft->
x1[fi])*dft->
voi[ri].
y[fi];
477 for(fi=f1+1; fi<=f2; fi++) {
478 for(ri=0; ri<dft->
voiNr; ri++) {
479 idft->
voi[ri].
y[0]+=(dft->
x2[fi]-dft->
x1[fi])*dft->
voi[ri].
y[fi];
482 if(dft->
x1[fi]==dft->
x2[fi-1])
continue;
485 x=(dft->
x1[fi]+dft->
x2[fi-1])/2.0;
486 for(ri=0; ri<dft->
voiNr; ri++) {
487 a=(dft->
x1[fi]-dft->
x2[fi-1])*
488 (dft->
voi[ri].
y[fi]-(dft->
voi[ri].
y[fi]-dft->
voi[ri].
y[fi-1])
489 *(dft->
x2[fi]+dft->
x1[fi]-2.0*x)
490 /(dft->
x2[fi]+dft->
x1[fi]-dft->
x2[fi-1]-dft->
x1[fi-1]));
491 idft->
voi[ri].
y[0]+=a;
497 t[0]=t1; t[1]=dft->
x1[f1];
498 if(verbose>5) printf(
"t[0]=%g t[1]=%g\n", t[0], t[1]);
499 for(ri=0; ri<dft->
voiNr; ri++) {
501 if(ret) aucroi=0.0;
else aucroi=auc[1]-auc[0];
502 idft->
voi[ri].
y[0]+=aucroi;
506 t[0]=dft->
x2[f2]; t[1]=t2;
507 if(verbose>5) printf(
"t[0]=%g t[1]=%g\n", t[0], t[1]);
508 for(ri=0; ri<dft->
voiNr; ri++) {
510 if(ret) aucroi=0.0;
else aucroi=auc[1]-auc[0];
511 idft->
voi[ri].
y[0]+=aucroi;
518 for(ri=0; ri<dft->
voiNr; ri++) {
520 if(ret) aucroi=0.0;
else aucroi=auc[1]-auc[0];
521 idft->
voi[ri].
y[0]+=aucroi;
527 idft->
x2[0]=t2; idft->
x1[0]=t1; idft->
x[0]=0.5*(t1+t2);
533 if(calc_mode==1 && dft->
x[0]==t1 && dft->
x[0]==t2 && dft->
frameNr==1) {
534 for(ri=0; ri<dft->
voiNr; ri++)
535 idft->
voi[ri].
y[0]=dft->
voi[ri].
y[0];
540 if(dft->
x[0]>(0.66*t1+0.34*t2) ||
541 dft->
x[dft->
frameNr-1]<(0.34*t1+0.66*t2)) {
542 if(status!=NULL) sprintf(status,
"integration time range oversteps data range");
547 if(verbose>5) printf(
"t[0]=%g t[1]=%g\n", t[0], t[1]);
548 for(ri=0; ri<dft->
voiNr; ri++) {
550 if(ret) idft->
voi[ri].
y[0]=0.0;
else idft->
voi[ri].
y[0]=auc[1]-auc[0];
554 idft->
x2[0]=t2; idft->
x1[0]=t1; idft->
x[0]=0.5*(t1+t2);
558 sprintf(status,
"frame mid times or start and end times required");
566 for(ri=fi=0; ri<idft->
voiNr; ri++)
567 idft->
voi[ri].
y[fi]/=fdur;
568 if(status!=NULL) sprintf(status,
"average TAC [%g,%g] calculated", t1, t2);
572 strcpy(idft->
unit, dftUnit(CUNIT_UNKNOWN));
573 if(unit==CUNIT_KBQ_PER_ML) {
575 strcpy(idft->
unit, dftUnit(CUNIT_MIN_KBQ_PER_ML));
577 strcpy(idft->
unit, dftUnit(CUNIT_SEC_KBQ_PER_ML));
579 if(status!=NULL) sprintf(status,
"TAC integral [%g,%g] calculated", t1, t2);
604 if(status!=NULL) sprintf(status,
"invalid input for dftDerivative()");
605 if(dft==NULL || dft->
frameNr<1 || dft->
voiNr<1)
return 1;
609 if(status!=NULL) sprintf(status,
"frame start and end times are required");
614 for(fi=0; fi<dft->
frameNr; fi++) {
615 fdur=dft->
x2[fi]-dft->
x1[fi];
617 for(ri=0; ri<dft->
voiNr; ri++) deriv->
voi[ri].
y[fi]=0.0;
620 for(ri=0; ri<dft->
voiNr; ri++) {
621 deriv->
voi[ri].
y[fi]=dft->
voi[ri].
y[fi];
622 if(fi>0) deriv->
voi[ri].
y[fi]-=dft->
voi[ri].
y[fi-1];
623 deriv->
voi[ri].
y[fi]/=fdur;
648 if(status!=NULL) sprintf(status,
"invalid input for dftDerivative()");
649 if(dft==NULL || dft->
frameNr<1 || dft->
voiNr<1)
return 1;
654 sprintf(status,
"frame start and end times or mid times are required");
660 for(fi=0; fi<dft->
frameNr; fi++)
661 dft->
x[fi]=0.5*(dft->
x1[fi]+dft->
x2[fi]);
664 if(dft->
x[0]<=1.0E-20)
for(ri=0; ri<dft->
voiNr; ri++)
665 deriv->
voi[ri].
y[0]=0.0;
666 else for(ri=0; ri<dft->
voiNr; ri++)
667 deriv->
voi[ri].
y[0]=dft->
voi[ri].
y[0]/dft->
x[0];
668 for(fi=1; fi<dft->
frameNr; fi++) {
669 fdur=dft->
x[fi]-dft->
x[fi-1];
670 if(fdur<=1.0E-20)
for(ri=0; ri<dft->
voiNr; ri++)
671 deriv->
voi[ri].
y[fi]=0.0;
672 else for(ri=0; ri<dft->
voiNr; ri++)
673 deriv->
voi[ri].
y[fi]=(dft->
voi[ri].
y[fi]-dft->
voi[ri].
y[fi-1])/fdur;
675 for(ri=0; ri<dft->
voiNr; ri++)
for(fi=0; fi<dft->
frameNr-1; fi++) {
676 deriv->
voi[ri].
y[fi]+=deriv->
voi[ri].
y[fi+1];
677 deriv->
voi[ri].
y[fi]*=0.5;
int dftCopyvoihdr(DFT *dft1, int from, DFT *dft2, int to)
int dftAddmem(DFT *dft, int voiNr)
int dftSetmem(DFT *data, int frameNr, int voiNr)
double dft_kBqMax(DFT *data)
int dft_nr_of_NA(DFT *dft)
int dftAllocateWithHeader(DFT *dft, int frameNr, int voiNr, DFT *dft_from)
int dftCopymainhdr(DFT *dft1, DFT *dft2)
int dftInterpolateCheckStart(DFT *input, DFT *output, char *status, int verbose)
int dftDerivative_old(DFT *dft, DFT *deriv, char *status)
int dftInterpolate(DFT *input, DFT *tissue, DFT *output, char *status, int verbose)
int dftDerivative(DFT *dft, DFT *deriv, char *status)
int dftInterpolateInto(DFT *inp, DFT *tis, char *status, int verbose)
int dftTimeIntegral(DFT *dft, double t1, double t2, DFT *idft, int calc_mode, char *status, int verbose)
int dftInterpolateCheckEnd(DFT *input, DFT *output, char *status, int verbose)
int dftTimeunitConversion(DFT *dft, int tunit)
int dftMatchTimeunits(DFT *dft1, DFT *dft2, int *tunit2, int verbose)
int check_times_dft_vs_dft(DFT *dft1, DFT *dft2, int verbose)
int petintegral(double *x1, double *x2, double *y, int nr, double *ie, double *iie)
Integrate PET TAC data to frame mid times.
int interpolate(double *x, double *y, int nr, double *newx, double *newy, double *newyi, double *newyii, int newnr)
Linear interpolation and integration.
int interpolate4pet(double *x, double *y, int nr, double *newx1, double *newx2, double *newy, double *newyi, double *newyii, int newnr)
Interpolate and integrate TAC to PET frames.
#define DFT_FORMAT_STANDARD
#define DFT_TIME_STARTEND
int petCunitId(const char *unit)
Header file for libtpcmodext.
char unit[MAX_UNITS_LEN+1]