49 int zi, yi, xi, fi, nr, ret=0;
51 double *plotData, *xaxis, *yaxis, slope, ic, f;
55 printf(
"%s(input, dyn_img, %d, %d, range, %g, ki_img, ", __func__, start, end, thrs);
56 if(ic_img==NULL) printf(
"NULL, ");
else printf(
"ic_img, ");
57 if(nr_img==NULL) printf(
"NULL, ");
else printf(
"nr_img, ");
58 if(status==NULL) printf(
"NULL)\n");
else printf(
"status)\n");
61 if(status!=NULL) sprintf(status,
"invalid data");
63 if(input==NULL || input->
frameNr<1)
return(2);
64 nr=1+end-start;
if(nr<2)
return(3);
65 if(end>dyn_img->
dimt-1 || start<0)
return(4);
66 if(ki_img==NULL)
return(5);
72 printf(
"input_last_sample_time := %g\n", input->
x[input->
frameNr-1]);
73 printf(
"patlak_start_time := %g\n", dyn_img->
start[start]/60.0);
74 printf(
"patlak_end_time := %g\n", dyn_img->
end[end]/60.0);
76 if(input->
x[input->
frameNr-1] < (0.2*dyn_img->
mid[start]+0.8*dyn_img->
mid[end])/60.0) {
77 sprintf(status,
"too few input samples");
return(6);
82 dftInit(&tac);
if(
dftSetmem(&tac, nr, 2)!=0) {sprintf(status,
"out of memory");
return(11);}
85 for(fi=0; fi<tac.
frameNr; fi++) {
86 tac.
x1[fi]=dyn_img->
start[start+fi]/60.;
87 tac.
x2[fi]=dyn_img->
end[start+fi]/60.;
88 tac.
x[fi]=dyn_img->
mid[start+fi]/60.;
98 if(verbose>1) printf(
"copying input curve and using petintegral()\n");
102 sprintf(status,
"cannot set input sample times");
109 if(ret==0)
for(fi=0; fi<tac.
frameNr; fi++) {
110 tac.
voi[0].
y[fi]=input->
voi[0].
y[start+fi];
115 if(verbose>1) printf(
"using interpolate4pet() for input curve\n");
123 sprintf(status,
"cannot interpolate input data");
return(12);
134 sprintf(status,
"cannot setup memory for Ki image");
137 ki_img->
unit=CUNIT_ML_PER_ML_PER_MIN;
146 sprintf(status,
"cannot setup memory for Ic image");
149 ic_img->
unit=CUNIT_ML_PER_ML;
159 sprintf(status,
"cannot setup memory for nr image");
163 nr_img->
unit=CUNIT_UNITLESS;
170 plotData=malloc(2*nr*
sizeof(
double));
172 sprintf(status,
"cannot allocate memory for plots");
175 xaxis=plotData; yaxis=plotData+nr;
179 if(verbose>1) printf(
" threshold-AUC := %g\n", thrs);
184 if(verbose>1) printf(
"computing MTGA pixel-by-pixel\n");
185 float pxlauc[dyn_img->
dimt];
187 for(zi=0; zi<dyn_img->
dimz; zi++) {
188 for(yi=0; yi<dyn_img->
dimy; yi++) {
189 for(xi=0; xi<dyn_img->
dimx; xi++) {
191 ki_img->
m[zi][yi][xi][0]=0.0;
192 if(ic_img!=NULL) ic_img->
m[zi][yi][xi][0]=0.0;
193 if(nr_img!=NULL) nr_img->
m[zi][yi][xi][0]=0;
196 dyn_img->
dimt, pxlauc, NULL);
198 if((pxlauc[dyn_img->
dimt-1]/60.0) < thrs)
continue;
200 for(fi=0; fi<tac.
frameNr; fi++) tac.
voi[1].
y[fi]=dyn_img->
m[zi][yi][xi][start+fi];
204 ret=
llsqperp(xaxis, yaxis, pn, &slope, &ic, &f);
210 ki_img->
m[zi][yi][xi][0]=slope;
211 if(ic_img!=NULL) ic_img->
m[zi][yi][xi][0]=ic;
212 if(nr_img!=NULL) nr_img->
m[zi][yi][xi][0]=best_nr;
262 int zi, yi, xi, fi, nr, ret=0;
264 double *plotData, *xaxis, *yaxis, slope, ic, f;
269 printf(
"img_logan(%s, dyn_img, %d, %d, %g, %g, ki_img, ", __func__, start, end, thrs, k2);
270 if(ic_img==NULL) printf(
"NULL, ");
else printf(
"ic_img, ");
271 if(nr_img==NULL) printf(
"NULL, ");
else printf(
"nr_img, ");
272 if(status==NULL) printf(
"NULL)\n");
else printf(
"status)\n");
275 if(status!=NULL) sprintf(status,
"invalid data");
277 if(input==NULL || input->
frameNr<1)
return(2);
278 nr=1+end-start;
if(nr<2)
return(3);
279 if(end>dyn_img->
dimt-1 || start<0)
return(4);
280 if(vt_img==NULL)
return(5);
286 printf(
"input_last_sample_time := %g\n", input->
x[input->
frameNr-1]);
287 printf(
"logan_start_time := %g\n", dyn_img->
start[start]/60.0);
288 printf(
"logan_end_time := %g\n", dyn_img->
end[end]/60.0);
290 if(input->
x[input->
frameNr-1] < (0.2*dyn_img->
mid[start]+0.8*dyn_img->
mid[end])/60.0) {
291 sprintf(status,
"too few input samples");
return(6);
296 dftInit(&tac);
if(
dftSetmem(&tac, nr, 2)!=0) {sprintf(status,
"out of memory");
return(11);}
299 for(
int fi=0; fi<tac.
frameNr; fi++) {
300 tac.
x1[fi]=dyn_img->
start[start+fi]/60.;
301 tac.
x2[fi]=dyn_img->
end[start+fi]/60.;
302 tac.
x[fi]=dyn_img->
mid[start+fi]/60.;
312 if(verbose>1) printf(
"copying input curve and using petintegral()\n");
316 sprintf(status,
"cannot set input sample times");
323 if(ret==0)
for(fi=0; fi<tac.
frameNr; fi++) {
324 tac.
voi[0].
y[fi]=input->
voi[0].
y[start+fi];
329 if(verbose>1) printf(
"using interpolate4pet() for input curve\n");
337 sprintf(status,
"cannot interpolate input data");
return(12);
348 sprintf(status,
"cannot setup memory for Vt image");
351 vt_img->
unit=CUNIT_ML_PER_ML;
360 sprintf(status,
"cannot setup memory for Ic image");
363 ic_img->
unit=CUNIT_UNITLESS;
373 sprintf(status,
"cannot setup memory for nr image");
377 nr_img->
unit=CUNIT_UNITLESS;
384 plotData=malloc(2*nr*
sizeof(
double));
386 sprintf(status,
"cannot allocate memory for plots");
390 xaxis=plotData; yaxis=plotData+nr;
391 float pxlauc[dyn_img->
dimt];
395 if(verbose>1) printf(
" threshold-AUC := %g\n", thrs);
400 if(verbose>1) printf(
"computing MTGA pixel-by-pixel\n");
402 for(zi=0; zi<dyn_img->
dimz; zi++) {
403 for(yi=0; yi<dyn_img->
dimy; yi++) {
404 for(xi=0; xi<dyn_img->
dimx; xi++) {
406 vt_img->
m[zi][yi][xi][0]=0.0;
407 if(ic_img!=NULL) ic_img->
m[zi][yi][xi][0]=0.0;
408 if(nr_img!=NULL) nr_img->
m[zi][yi][xi][0]=0.0;
410 for(fi=0; fi<tac.
frameNr; fi++) tac.
voi[1].
y[fi]=dyn_img->
m[zi][yi][xi][start+fi];
413 dyn_img->
dimt, pxlauc, NULL);
415 if((pxlauc[dyn_img->
dimt-1]/60.0) < thrs)
continue;
416 for(fi=0; fi<tac.
frameNr; fi++)
417 tac.
voi[1].
y2[fi]=pxlauc[start+fi]/60.0;
422 ret=
llsqperp(xaxis, yaxis, pn, &slope, &ic, &f);
431 if(slope>10.0*aucrat) {
432 if(verbose>50) printf(
"%g > 10 x %g\n", slope, aucrat);
436 vt_img->
m[zi][yi][xi][0]=slope;
437 if(ic_img!=NULL) ic_img->
m[zi][yi][xi][0]=-ic;
438 if(nr_img!=NULL) nr_img->
m[zi][yi][xi][0]=best_nr;
int dftSetmem(DFT *data, int frameNr, int voiNr)
int dftTimeunitConversion(DFT *dft, int tunit)
int copy_times_from_img_to_dft(IMG *img, DFT *dft, int verbose)
int check_times_dft_vs_img(IMG *img, DFT *dft, int verbose)
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
void imgEmpty(IMG *image)
int img_patlak(DFT *input, IMG *dyn_img, int start, int end, linefit_range fit_range, float thrs, IMG *ki_img, IMG *ic_img, IMG *nr_img, char *status, int verbose)
int img_logan(DFT *input, IMG *dyn_img, int start, int end, linefit_range fit_range, float thrs, double k2, IMG *vt_img, IMG *ic_img, IMG *nr_img, char *status, 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 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 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 IMG_STATUS_OCCUPIED
#define IMG_DC_NONCORRECTED
int llsqperp(double *x, double *y, int nr, double *slope, double *ic, double *ssd)
int patlak_data(int data_nr, double *i, double *ii, double *c, double *x, double *y)
int mtga_best_perp(double *x, double *y, int nr, double *slope, double *ic, double *ssd, int *fnr)
int logan_data(int data_nr, double *i, double *ii, double *c, double *ci, double k2, double *x, double *y)
Header file for libtpcmodext.
char voiname[MAX_REGIONSUBNAME_LEN+1]