5#include "tpcclibConfig.h"
41 if(verbose>0) printf(
"%s(itac, ttac, ...)\n", __func__);
44 if(itac==NULL || ttac==NULL || stac==NULL) {
78 for(
int i=0; i<inp.
sampleNr; i++)
if(isfinite(inp.
x[i])) {
79 int j;
for(j=0; j<n; j++)
if(fabs(x[j]-inp.
x[i])<1.0E-20)
break;
80 if(j==n) x[n++]=inp.
x[i];
83 for(
int i=0; i<inp.
sampleNr; i++)
if(isfinite(inp.
x1[i])) {
84 int j;
for(j=0; j<n; j++)
if(fabs(x[j]-inp.
x1[i])<1.0E-20)
break;
85 if(j==n) x[n++]=inp.
x1[i];
87 for(
int i=0; i<inp.
sampleNr; i++)
if(isfinite(inp.
x2[i])) {
88 int j;
for(j=0; j<n; j++)
if(fabs(x[j]-inp.
x2[i])<1.0E-20)
break;
89 if(j==n) x[n++]=inp.
x2[i];
93 for(
int i=0; i<ttac->
sampleNr; i++)
if(isfinite(ttac->
x2[i])) {
94 int j;
for(j=0; j<n; j++)
if(fabs(x[j]-ttac->
x2[i])<1.0E-20)
break;
95 if(j==n) x[n++]=ttac->
x2[i];
97 for(
int i=0; i<ttac->
sampleNr; i++)
if(isfinite(ttac->
x2[i])) {
98 int j;
for(j=0; j<n; j++)
if(fabs(x[j]-ttac->
x2[i])<1.0E-20)
break;
99 if(j==n) x[n++]=ttac->
x2[i];
102 for(
int i=0; i<ttac->
sampleNr; i++)
if(isfinite(ttac->
x[i])) {
103 int j;
for(j=0; j<n; j++)
if(fabs(x[j]-ttac->
x[i])<1.0E-20)
break;
104 if(j==n) x[n++]=ttac->
x[i];
107 if(verbose>2) printf(
"n=%d\n", n);
116 for(
int i=0; i<n; i++) stac->
x[i]=x[i];
119 for(
int i=0; i<inp.
tacNr; i++) {
121 stac->
x, stac->
c[i].
y, NULL, NULL, stac->
sampleNr, 4, 1, verbose-10);
157 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
158 if(verbose>0) printf(
"%s(ttac, %d, btac, %g, %d, %d)\n", __func__, i, Vb, simVb, petVolume);
159 if(ttac==NULL || btac==NULL) {
171 if(!(Vb>=0.0) || !(Vb<=1.0)) {
175 if(Vb==1.0 && petVolume==0 && simVb==0) {
186 if(verbose>1) printf(
"subtracting blood\n");
187 for(
int ri=0; ri<ttac->
tacNr; ri++)
if(i<0 || i==ri) {
188 for(
int fi=0; fi<ttac->
sampleNr; fi++) {
189 ttac->
c[ri].
y[fi]-=Vb*btac->
c[0].
y[fi];
190 if(petVolume==0) ttac->
c[ri].
y[fi]/=(1.0-Vb);
194 if(verbose>1) printf(
"adding blood\n");
195 for(
int ri=0; ri<ttac->
tacNr; ri++)
if(i<0 || i==ri) {
196 for(
int fi=0; fi<ttac->
sampleNr; fi++) {
197 if(petVolume==0) ttac->
c[ri].
y[fi]*=(1.0-Vb);
198 ttac->
c[ri].
y[fi]+=Vb*btac->
c[0].
y[fi];
230 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
231 if(verbose>0) {printf(
"%s(tac1, %g, %g, ...)\n", __func__, minfdur, maxfdur); fflush(stdout);}
232 if(tac==NULL || inp==NULL || inp->
sampleNr<1 || inp->
tacNr<1) {
236 if(minfdur>0.0 && maxfdur>0.0 && minfdur>maxfdur) {
250 if(minfdur>0.0 && freq<minfdur) freq=minfdur;
251 if(maxfdur>0.0 && freq>maxfdur) freq=maxfdur;
268 int nreq=ceil(xmax/freq);
270 if(nreq<1 || nreq>2E+06) {
287 for(
int i=0; i<nreq; i++) tac->
x1[i]=(
double)i*freq;
288 for(
int i=0; i<nreq; i++) tac->
x2[i]=(
double)(i+1)*freq;
289 for(
int i=0; i<nreq; i++) tac->
x[i]=0.5*(tac->
x1[i]+tac->
x2[i]);
292 if(verbose>2) {printf(
" interpolating...\n"); fflush(stdout);}
293 for(
int i=0; i<inp->
tacNr; i++) {
295 tac->
c[i].
y, NULL, NULL, tac->
sampleNr, 2, 1, 0)!=0) {
301 if(verbose>2) {printf(
" ... done.\n"); fflush(stdout);}
int liInterpolate(double *x, double *y, const int nr, double *newx, double *newy, double *newyi, double *newyii, const int newnr, const int se, const int ee, const int verbose)
Linear interpolation and/or integration with trapezoidal method.
int liInterpolateForPET(double *x, double *y, const int nr, double *newx1, double *newx2, double *newy, double *newyi, double *newyii, const int newnr, const int se, const int ee, const int verbose)
Linear TAC interpolation and/or integration to PET frames.
int tacInterpolateToEqualLengthFrames(TAC *inp, double minfdur, double maxfdur, TAC *tac, TPCSTATUS *status)
int tacVb(TAC *ttac, const int i, TAC *btac, double Vb, const int simVb, const int petVolume, TPCSTATUS *status)
Correct TTACs for vascular blood, or simulate its effect.
int tacInput2sim(TAC *itac, TAC *ttac, TAC *stac, TPCSTATUS *status)
Modify input TAC based on tissue TAC, for use in simulations.
void statSortDouble(double *data, unsigned int n, int order)
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 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 tacXUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
int tacAddZeroSample(TAC *d, TPCSTATUS *status)
Add an initial sample to TAC(s) with zero time and concentration.
int tacGetSampleInterval(TAC *d, double ilimit, double *minfdur, double *maxfdur)
Get the shortest and longest sampling intervals or frame lengths in 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 tacXRange(TAC *d, double *xmin, double *xmax)
Get the range of x values (times) in TAC structure.
Header file for library libtpcextensions.
@ TPCERROR_INVALID_XRANGE
Invalid sample time range.
@ TPCERROR_INVALID_VALUE
Invalid value.
@ TPCERROR_FAIL
General error.
@ TPCERROR_TOO_BIG
File is too big.
@ TPCERROR_OUT_OF_MEMORY
Cannot allocate memory.
@ TPCERROR_INVALID_X
Invalid sample time.
@ TPCERROR_NO_DATA
File contains no data.
@ TPCERROR_INCOMPATIBLE_DATA
Incompatible data.
Header file for libtpcli.
Header file for libtpcstatist.
Header file for library libtpctac.
Header file for libtpctacmod.