48 double ox1, ox2, oy1, oy2, oi1, oi2, oii1, oii2, dt, ndt;
51 if(verbose>0) printf(
"in interpolate()\n");
53 if(nr<1 || newnr<1)
return 1;
55 if(newy==NULL && newyi==NULL && newyii==NULL)
return 2;
67 if(y[0]>0.0 && (nr>1 && x[0]<=x[1]-x[0])) ox1=0.0;
71 oi2=oi1 + (ox2-ox1)*(oy1+oy2)/2.0;
72 oii2=oii1 + (ox2-ox1)*(oi1+oi2)/2.0;
74 printf(
"ox1=%g oy1=%g oi1=%g oii1=%g\n", ox1, oy1, oi1, oii1);
75 printf(
"ox2=%g oy2=%g oi2=%g oii2=%g\n", ox2, oy2, oi2, oii2);
79 j=0;
while(j<newnr && newx[j]<ox1) {
80 ty=tyi=tyii=0.0;
if(verbose>4) printf(
" ndt=%g\n", ox1-newx[j]);
81 if(verbose>4) printf(
" j=%d newx=%g ty=%g tyi=%g tyii=%g\n", j, newx[j], ty, tyi, tyii);
82 if(newy!=NULL) newy[j]=ty;
83 if(newyi!=NULL) newyi[j]=tyi;
84 if(newyii!=NULL) newyii[j]=tyii;
89 dt=ox2-ox1;
if(dt>0.0)
while(j<newnr && newx[j]<=ox2) {
90 ndt=newx[j]-ox1;
if(verbose>4) printf(
" ndt=%g\n", ndt);
91 ty=((oy2-oy1)/dt)*ndt + oy1;
if(newy!=NULL) newy[j]=ty;
92 tyi=oi1 + 0.5*(ty+oy1)*ndt;
if(newyi!=NULL) newyi[j]=tyi;
93 if(newyii!=NULL) newyii[j]=tyii= oii1 + 0.5*(tyi+oi1)*ndt;
94 if(verbose>4) printf(
" j=%d newx=%g ty=%g tyi=%g\n", j, newx[j], ty, tyi);
99 for(i=0; i<nr && j<newnr; i++) {
101 ox1=ox2; oy1=oy2; oi1=oi2; oii1=oii2;
103 oi2=oi1 + (ox2-ox1)*(oy1+oy2)/2.0;
104 oii2=oii1 + (ox2-ox1)*(oi1+oi2)/2.0;
106 printf(
"ox1=%g oy1=%g oi1=%g oii1=%g\n", ox1, oy1, oi1, oii1);
107 printf(
"ox2=%g oy2=%g oi2=%g oii2=%g\n", ox2, oy2, oi2, oii2);
111 dt=ox2-ox1;
if(dt<0.0)
return 3;
else if(dt==0.0)
continue;
114 while(j<newnr && newx[j]<=ox2) {
116 ty=((oy2-oy1)/dt)*ndt + oy1;
if(newy!=NULL) newy[j]=ty;
117 tyi=oi1 + 0.5*(ty+oy1)*ndt;
if(newyi!=NULL) newyi[j]=tyi;
118 if(newyii!=NULL) newyii[j]=tyii= oii1 + 0.5*(tyi+oi1)*ndt;
119 if(verbose>5) printf(
" j=%d newx=%g ty=%g tyi=%g\n", j, newx[j], ty, tyi);
130 tyii=oii2 + 0.5*(tyi+oi2)*ndt;
131 if(newy!=NULL) newy[j]=ty;
132 if(newyi!=NULL) newyi[j]=tyi;
133 if(newyii!=NULL) newyii[j]=tyii;
134 if(verbose>5) printf(
" j=%d newx=%g ty=%g tyi=%g\n", j, newx[j], ty, tyi);
138 if(verbose>0) printf(
"out interpolate()\n");
181 float ox1, ox2, oy1, oy2, oi1, oi2, oii1, oii2, dt, ndt;
184 if(verbose>0) printf(
"in finterpolate()\n");
186 if(nr<1 || newnr<1)
return 1;
188 if(newy==NULL && newyi==NULL && newyii==NULL)
return 2;
200 if(y[0]>0.0 && (nr>1 && x[0]<=x[1]-x[0])) ox1=0.0;
204 oi2=oi1 + (ox2-ox1)*(oy1+oy2)/2.0;
205 oii2=oii1 + (ox2-ox1)*(oi1+oi2)/2.0;
208 j=0;
while(j<newnr && newx[j]<ox1) {
210 if(newy!=NULL) newy[j]=ty;
211 if(newyi!=NULL) newyi[j]=tyi;
212 if(newyii!=NULL) newyii[j]=tyii;
217 dt=ox2-ox1;
if(dt>0.0)
while(j<newnr && newx[j]<=ox2) {
219 ty=((oy2-oy1)/dt)*ndt + oy1;
if(newy!=NULL) newy[j]=ty;
220 tyi=oi1 + 0.5*(ty+oy1)*ndt;
if(newyi!=NULL) newyi[j]=tyi;
221 if(newyii!=NULL) newyii[j]=tyii= oii1 + 0.5*(tyi+oi1)*ndt;
226 for(i=0; i<nr && j<newnr; i++) {
228 ox1=ox2; oy1=oy2; oi1=oi2; oii1=oii2;
230 oi2=oi1 + (ox2-ox1)*(oy1+oy2)/2.0;
231 oii2=oii1 + (ox2-ox1)*(oi1+oi2)/2.0;
234 dt=ox2-ox1;
if(dt<0.0)
return 3;
else if(dt==0.0)
continue;
237 while(j<newnr && newx[j]<=ox2) {
239 ty=((oy2-oy1)/dt)*ndt + oy1;
if(newy!=NULL) newy[j]=ty;
240 tyi=oi1 + 0.5*(ty+oy1)*ndt;
if(newyi!=NULL) newyi[j]=tyi;
241 if(newyii!=NULL) newyii[j]=tyii= oii1 + 0.5*(tyi+oi1)*ndt;
252 tyii=oii2 + 0.5*(tyi+oi2)*ndt;
253 if(newy!=NULL) newy[j]=ty;
254 if(newyi!=NULL) newyi[j]=tyi;
255 if(newyii!=NULL) newyii[j]=tyii;
259 if(verbose>0) printf(
"out finterpolate()\n");
284 if(nr==1 || x[0]<=(x[1]-x[0])) yi[0]=0.5*y[0]*x[0];
287 for(j=1; j<nr; j++) yi[j]=yi[j-1]+0.5*(y[j]+y[j-1])*(x[j]-x[j-1]);
313 if(nr==1 || x[0]<=(x[1]-x[0])) yi[0]=0.5*y[0]*x[0];
316 for(j=1; j<nr; j++) yi[j]=yi[j-1]+0.5*(y[j]+y[j-1])*(x[j]-x[j-1]);
353 if(nr<1 || x1[0]<0)
return 1;
354 for(i=0; i<nr; i++)
if(x2[i]<x1[i])
return 2;
355 for(i=1; i<nr; i++)
if(x1[i]<=x1[i-1])
return 3;
360 ti=(
double*)malloc(nr*
sizeof(
double));
if(ti==NULL)
return 4;
365 ti[0]=(x2[0]-x1[0])*y[0];
370 if(x1[0]<=x2[0]-x1[0]) {
372 a=(x1[0]*(y[0]/x)*x1[0])/2.0;
378 for(i=1; i<nr; i++) {
380 a=(x2[i]-x1[i])*y[i]; ti[i]=ti[i-1]+a;
382 if(x1[i]==x2[i-1])
continue;
384 x=(x1[i]+x2[i-1])/2.0;
386 (y[i]-(y[i]-y[i-1])*(x2[i]+x1[i]-2.0*x)/(x2[i]+x1[i]-x2[i-1]-x1[i-1]));
391 if(allocated)
for(i=0; i<nr; i++) newyi[i]=ti[i];
395 newyii[0]=x2[0]*ti[0]/2.0;
397 newyii[i]=newyii[i-1]+(x2[i]-x2[i-1])*(ti[i-1]+ti[i])/2.0;
401 if(allocated) free((
char*)ti);
437 if(nr<1 || x1[0]<0)
return 1;
438 for(i=0; i<nr; i++)
if(x2[i]<x1[i])
return 2;
439 for(i=1; i<nr; i++)
if(x1[i]<=x1[i-1])
return 3;
444 ti=(
float*)malloc(nr*
sizeof(
float));
if(ti==NULL)
return 4;
449 ti[0]=(x2[0]-x1[0])*y[0];
454 if(x1[0]<=x2[0]-x1[0]) {
456 a=(x1[0]*(y[0]/x)*x1[0])/2.0;
462 for(i=1; i<nr; i++) {
464 a=(x2[i]-x1[i])*y[i]; ti[i]=ti[i-1]+a;
466 if(x1[i]==x2[i-1])
continue;
468 x=(x1[i]+x2[i-1])/2.0;
470 (y[i]-(y[i]-y[i-1])*(x2[i]+x1[i]-2.0*x)/(x2[i]+x1[i]-x2[i-1]-x1[i-1]));
475 if(allocated)
for(i=0; i<nr; i++) newyi[i]=ti[i];
479 newyii[0]=x2[0]*ti[0]/2.0;
481 newyii[i]=newyii[i-1]+(x2[i]-x2[i-1])*(ti[i-1]+ti[i])/2.0;
485 if(allocated) free((
char*)ti);
531 int ret, fi, overlap=0, zeroframe=0;
532 double petx[3], pety[3], petyi[3], petyii[3], fdur;
535 if(verbose>0) printf(
"in interpolate4pet()\n");
538 if(nr<1 || newnr<1)
return 1;
540 if(newy==NULL && newyi==NULL && newyii==NULL)
return 2;
542 if(newx2[newnr-1]<=x[0] || newx1[0]>=x[nr-1])
return 3;
545 for(fi=0; fi<newnr; fi++) {
547 fdur=newx2[fi]-newx1[fi];
549 if(fdur<0.0)
return 4;
550 if(fdur==0.0) zeroframe++;
552 if(fi>0 && newx2[fi-1]>newx1[fi]) overlap++;
555 printf(
"overlap := %d\n", overlap);
556 printf(
"zeroframe := %d\n", zeroframe);
567 if(overlap>0 || zeroframe>0 || newnr<=3 || newy==NULL || (newyi==NULL && newyii==NULL) ) {
569 if(verbose>1) printf(
"frame-by-frame interpolation/integration\n");
570 for(fi=0; fi<newnr; fi++) {
572 petx[0]=newx1[fi]; petx[2]=newx2[fi]; petx[1]=0.5*(petx[0]+petx[2]);
574 fdur=petx[2]-petx[0];
576 if(fdur<0.0)
return 4;
579 ret=
interpolate(x, y, nr, petx, pety, petyi, petyii, 1);
580 if(ret)
return 10+ret;
581 if(newy!=NULL) newy[fi]=petyi[0];
582 if(newyi!=NULL) newyi[fi]=petyi[0];
583 if(newyii!=NULL) newyii[fi]=petyii[0];
587 ret=
interpolate(x, y, nr, petx, NULL, petyi, petyii, 3);
588 if(ret)
return 20+ret;
590 if(newyi!=NULL) newyi[fi]=petyi[1];
591 if(newyii!=NULL) newyii[fi]=petyii[1];
593 if(newy!=NULL) newy[fi]=(petyi[2]-petyi[0])/fdur;
598 if(verbose>1) printf(
"all-frames-at-once interpolation/integration\n");
600 double *tp;
if(newyii!=NULL) tp=newyii;
else tp=newyi;
602 ret=
interpolate(x, y, nr, newx1, NULL, tp, NULL, newnr);
603 if(ret)
return 10+ret;
605 ret=
interpolate(x, y, nr, newx2, NULL, newy, NULL, newnr);
606 if(ret)
return 10+ret;
608 for(fi=0; fi<newnr; fi++)
609 newy[fi]=(newy[fi]-tp[fi])/(newx2[fi]-newx1[fi]);
611 if(newyi!=NULL || newyii!=NULL) {
612 for(fi=0; fi<newnr; fi++) newx1[fi]+=0.5*(newx2[fi]-newx1[fi]);
613 ret=
interpolate(x, y, nr, newx1, NULL, newyi, newyii, newnr);
614 if(ret)
return 10+ret;
615 for(fi=0; fi<newnr; fi++) newx1[fi]-=(newx2[fi]-newx1[fi]);
619 if(verbose>0) printf(
"out interpolate4pet()\n");
667 int ret, fi, overlap=0, zeroframe=0;
668 float petx[3], pety[3], petyi[3], petyii[3], fdur;
671 if(verbose>0) printf(
"in finterpolate4pet()\n");
674 if(nr<1 || newnr<1)
return 1;
676 if(newy==NULL && newyi==NULL && newyii==NULL)
return 2;
678 if(newx2[newnr-1]<=x[0] || newx1[0]>=x[nr-1])
return 3;
681 for(fi=0; fi<newnr; fi++) {
683 fdur=newx2[fi]-newx1[fi];
685 if(fdur<0.0)
return 4;
686 if(fdur==0.0) zeroframe++;
688 if(fi>0 && newx2[fi-1]>newx1[fi]) overlap++;
691 printf(
"overlap := %d\n", overlap);
692 printf(
"zeroframe := %d\n", zeroframe);
703 if(overlap>0 || zeroframe>0 || newnr<=3 || newy==NULL || (newyi==NULL && newyii==NULL) ) {
705 if(verbose>1) printf(
"frame-by-frame interpolation/integration\n");
706 for(fi=0; fi<newnr; fi++) {
708 petx[0]=newx1[fi]; petx[2]=newx2[fi]; petx[1]=0.5*(petx[0]+petx[2]);
710 fdur=petx[2]-petx[0];
712 if(fdur<0.0)
return 4;
715 ret=
finterpolate(x, y, nr, petx, pety, petyi, petyii, 1);
716 if(ret)
return 10+ret;
717 if(newy!=NULL) newy[fi]=petyi[0];
718 if(newyi!=NULL) newyi[fi]=petyi[0];
719 if(newyii!=NULL) newyii[fi]=petyii[0];
723 ret=
finterpolate(x, y, nr, petx, NULL, petyi, petyii, 3);
724 if(ret)
return 20+ret;
726 if(newyi!=NULL) newyi[fi]=petyi[1];
727 if(newyii!=NULL) newyii[fi]=petyii[1];
729 if(newy!=NULL) newy[fi]=(petyi[2]-petyi[0])/fdur;
734 if(verbose>1) printf(
"all-frames-at-once interpolation/integration\n");
736 float *tp;
if(newyii!=NULL) tp=newyii;
else tp=newyi;
738 ret=
finterpolate(x, y, nr, newx1, NULL, tp, NULL, newnr);
739 if(ret)
return 10+ret;
741 ret=
finterpolate(x, y, nr, newx2, NULL, newy, NULL, newnr);
742 if(ret)
return 10+ret;
744 for(fi=0; fi<newnr; fi++)
745 newy[fi]=(newy[fi]-tp[fi])/(newx2[fi]-newx1[fi]);
747 if(newyi!=NULL || newyii!=NULL) {
748 for(fi=0; fi<newnr; fi++) newx1[fi]+=0.5*(newx2[fi]-newx1[fi]);
749 ret=
finterpolate(x, y, nr, newx1, NULL, newyi, newyii, newnr);
750 if(ret)
return 10+ret;
751 for(fi=0; fi<newnr; fi++) newx1[fi]-=(newx2[fi]-newx1[fi]);
756 if(verbose>0) printf(
"out finterpolate4pet()\n");
786 double x, last_x, last_x2, last_y, last_integral, box_integral, half_integral;
787 double gap_integral, integral, integral2, frame_len, xdist, s;
790 if(nr<1 || nr<1)
return(1);
792 if(ie==NULL && iie==NULL)
return(2);
795 last_x=last_x2=last_y=last_integral=0.0;
796 box_integral=integral=integral2=frame_len=0.0;
798 for(i=0; i<nr; i++) {
799 frame_len=x2[i]-x1[i];
if(frame_len<0.0)
return(5);
800 x=0.5*(x1[i]+x2[i]); xdist=x-last_x;
801 if(last_x>0.0 && xdist<=0.0)
return(6);
803 if(ie!=NULL) ie[i]=integral;
804 if(iie!=NULL) iie[i]=integral2;
807 s=(y[i]-last_y)/xdist;
809 if(i==0)
if(x1[0]>x2[0]-x1[0]){last_x2=last_x=x1[0];}
811 gap_integral=(x1[i]-last_x2)*(last_y+s*((last_x2+x1[i])/2.0-last_x));
813 half_integral=(x-x1[i])*(last_y+s*((x1[i]+x)/2.0-last_x));
814 integral=box_integral+gap_integral+half_integral;
817 box_integral+=gap_integral+frame_len*y[i];
818 integral2+=xdist*(integral+last_integral)*0.5;
819 if(ie!=NULL) ie[i]=integral;
820 if(iie!=NULL) iie[i]=integral2;
821 last_x=x; last_x2=x2[i];
822 last_y=y[i]; last_integral=integral;
853 float x, last_x, last_x2, last_y, last_integral, box_integral, half_integral;
854 float gap_integral, integral, integral2, frame_len, xdist, s;
857 if(nr<1 || nr<1)
return(1);
859 if(ie==NULL && iie==NULL)
return(2);
862 last_x=last_x2=last_y=last_integral=0.0;
863 box_integral=gap_integral=integral=integral2=frame_len=0.0;
865 for(i=0; i<nr; i++) {
866 frame_len=x2[i]-x1[i];
if(frame_len<0.0)
return(5);
867 x=0.5*(x1[i]+x2[i]); xdist=x-last_x;
if(last_x>0.0 && xdist<=0.0)
return(6);
869 if(ie!=NULL) ie[i]=integral;
870 if(iie!=NULL) iie[i]=integral2;
873 s=(y[i]-last_y)/xdist;
875 if(i==0)
if(x1[0]>x2[0]-x1[0]){last_x2=last_x=x1[0];}
877 gap_integral=(x1[i]-last_x2)*(last_y+s*((last_x2+x1[i])/2.0-last_x));
879 half_integral=(x-x1[i])*(last_y+s*((x1[i]+x)/2.0-last_x));
880 integral=box_integral+gap_integral+half_integral;
883 box_integral+=gap_integral+frame_len*y[i];
884 integral2+=xdist*(integral+last_integral)*0.5;
885 if(ie!=NULL) ie[i]=integral;
886 if(iie!=NULL) iie[i]=integral2;
887 last_x=x; last_x2=x2[i];
888 last_y=y[i]; last_integral=integral;
922 double x, last_x, last_x2, last_y, last_integral;
923 double value, integral, integral2, frame_len, xdist, s;
926 if(nr<1 || nr<1)
return(1);
928 if(e==NULL && ie==NULL && iie==NULL)
return(2);
931 last_x=last_x2=last_y=last_integral=value=integral=integral2=frame_len=s=0.0;
933 for(i=0; i<nr; i++) {
934 frame_len=x2[i]-x1[i];
if(frame_len<0.0)
return(5);
935 x=0.5*(x1[i]+x2[i]); xdist=x-last_x;
if(last_x>0.0 && xdist<=0.0)
return(6);
937 if(e!=NULL) e[i]=value;
938 if(ie!=NULL) ie[i]=integral;
939 if(iie!=NULL) iie[i]=integral2;
942 s=(y[i]-last_y)/xdist;
944 if(i==0 && x1[0]>x2[0]-x1[0]) {last_x2=last_x=x1[0];}
945 integral+=(x1[i]-last_x2)*(last_y+s*((last_x2+x1[i])/2.0-last_x));
946 integral+=frame_len*y[i];
947 integral2+=(x2[i]-last_x2)*(integral+last_integral)*0.5;
949 value=last_y+s*(last_x2-last_x);
952 if(ie!=NULL) ie[i]=integral;
953 if(iie!=NULL) iie[i]=integral2;
954 last_x=x; last_x2=x2[i]; last_y=y[i]; last_integral=integral;
957 value=last_y+s*(last_x2-last_x);
991 float x, last_x, last_x2, last_y, last_integral;
992 float value, integral, integral2, frame_len, xdist, s;
995 if(nr<1 || nr<1)
return(1);
997 if(e==NULL && ie==NULL && iie==NULL)
return(2);
1000 last_x=last_x2=last_y=last_integral=value=integral=integral2=frame_len=s=0.0;
1002 for(i=0; i<nr; i++) {
1003 frame_len=x2[i]-x1[i];
if(frame_len<0.0)
return(5);
1004 x=0.5*(x1[i]+x2[i]); xdist=x-last_x;
if(last_x>0.0 && xdist<=0.0)
return(6);
1006 if(e!=NULL) e[i]=value;
1007 if(ie!=NULL) ie[i]=integral;
1008 if(iie!=NULL) iie[i]=integral2;
1011 s=(y[i]-last_y)/xdist;
1013 if(i==0 && x1[0]>x2[0]-x1[0]) {last_x2=last_x=x1[0];}
1014 integral+=(x1[i]-last_x2)*(last_y+s*((last_x2+x1[i])/2.0-last_x));
1015 integral+=frame_len*y[i];
1016 integral2+=(x2[i]-last_x2)*(integral+last_integral)*0.5;
1017 if(e!=NULL && i>0) {
1018 value=last_y+s*(last_x2-last_x);
1021 if(ie!=NULL) ie[i]=integral;
1022 if(iie!=NULL) iie[i]=integral2;
1023 last_x=x; last_x2=x2[i]; last_y=y[i]; last_integral=integral;
1026 value=last_y+s*(last_x2-last_x);
int fpetintegrate(float *x1, float *x2, float *y, int nr, float *newyi, float *newyii)
Calculates integrals of PET data at frame end times. Float version of petintegrate().
int fintegrate(float *x, float *y, int nr, float *yi)
float version of integrate().
int petintegral(double *x1, double *x2, double *y, int nr, double *ie, double *iie)
Integrate PET TAC data to frame mid times.
int fpetintegrate2fe(float *x1, float *x2, float *y, int nr, float *e, float *ie, float *iie)
Integrate PET TAC data to frame end times. Float version of petintegrate2fe().
int petintegrate(double *x1, double *x2, double *y, int nr, double *newyi, double *newyii)
int finterpolate4pet(float *x, float *y, int nr, float *newx1, float *newx2, float *newy, float *newyi, float *newyii, int newnr)
Interpolate and integrate TAC to PET frames. Float version of interpolate4pet().
int petintegrate2fe(double *x1, double *x2, double *y, int nr, double *e, double *ie, double *iie)
Integrate PET TAC data to frame end times.
int integrate(double *x, double *y, int nr, double *yi)
int fpetintegral(float *x1, float *x2, float *y, int nr, float *ie, float *iie)
Integrate PET TAC data to frame mid times. Float version of petintegral().
int interpolate(double *x, double *y, int nr, double *newx, double *newy, double *newyi, double *newyii, int newnr)
Linear interpolation and integration.
int finterpolate(float *x, float *y, int nr, float *newx, float *newy, float *newyi, float *newyii, int newnr)
float version of interpolate().
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.
Header file for libtpcmodel.