41 printf(
"%s(*inp, *img, %d, *out, *ti1, *ti2, %d, status)\n", __func__, frame_nr, verbose);
44 if(input==NULL || img==NULL || output==NULL) {
45 if(status!=NULL) strcpy(status,
"program error");
49 if(status!=NULL) strcpy(status,
"no pet data");
53 if(status!=NULL) strcpy(status,
"unknown time units");
56 if(frame_nr<1 || frame_nr>img->
dimt) frame_nr=img->
dimt;
60 *ti1=input->
x1[0];
else *ti1=input->
x[0];
64 else *ti2=input->
x[input->
frameNr-1];
71 if(verbose>10) printf(
"allocating memory for interpolated data\n");
73 if(status!=NULL) strcpy(status,
"memory allocation error");
80 if(status!=NULL) strcpy(status,
"frame time error");
84 printf(
"time range := %g - %g %s\n", output->
x[0],
86 printf(
" timetype := %d\n", output->
timetype);
92 if(verbose>10) printf(
"frame times are assumed to be the same\n");
94 for(
int ri=0; ri<output->
voiNr && ret==0; ri++) {
95 for(
int fi=0; fi<output->
frameNr; fi++)
96 output->
voi[ri].
y[fi]=input->
voi[ri].
y[fi];
101 if(status!=NULL) sprintf(status,
"cannot interpolate (%d)", ret);
106 if(verbose>10) printf(
"frame times are not the same\n");
121 for(
int ri=0; ri<output->
voiNr && ret==0; ri++) {
123 output->
x1, output->
x2, output->
voi[ri].
y, output->
voi[ri].
y2,
127 if(status!=NULL) sprintf(status,
"cannot interpolate (%d)", ret);
166 double accept_tdif=1.0;
169 printf(
"%s(img, %g, %g, iimg, %d, status, %d)\n", __func__, t1, t2, calc_mode, verbose);
174 if(status!=NULL) sprintf(status,
"program error");
175 if(img==NULL || iimg==NULL || t1<0.0 || t2<0.0)
return STATUS_FAULT;
177 float fdur=t2-t1;
if(fdur<=0.0)
return STATUS_FAULT;
178 if(img->
dimt<1)
return STATUS_FAULT;
183 if(fabs(img->
end[0]-t2)>accept_tdif || fabs(img->
start[0]-t1)>accept_tdif) {
184 if(status!=NULL) sprintf(status,
185 "for static image the integration time range must be exactly as long as the scan");
189 img->
end[0]=t2; img->
start[0]=t1; img->
mid[0]=0.5*(t1+t2);
193 if(img->
start[0]>(0.66*t1+0.34*t2) || img->
end[img->
dimt-1]<(0.34*t1+0.66*t2)) {
194 if(status!=NULL) sprintf(status,
"integration time range oversteps data range");
198 if(verbose>10) printf(
"t1=%g t2=%g fdur=%g\n", t1, t2, fdur);
206 for(
int fi=0; fi<img->
dimt; fi++) {
207 if(f1<0) {
if(img->
start[fi]>=t1 && img->
end[fi]<=t2) f1=f2=fi;}
208 if(f1>=0) {
if(t2>=img->
end[fi]) f2=fi;}
211 if(verbose>10) printf(
"f1=%d f2=%d\n", f1, f2);
213 float aucroi, t[2], auc[2];
219 if(status!=NULL) sprintf(status,
"cannot integrate (%d)", ret);
224 if(img->
start[f1]>t1) {
225 t[0]=t1; t[1]=img->
start[f1];
226 if(verbose>20) printf(
"t[0]=%g t[1]=%g\n", t[0], t[1]);
227 for(
int zi=0; zi<img->
dimz; zi++)
228 for(
int yi=0; yi<img->
dimy; yi++)
229 for(
int xi=0; xi<img->
dimx; xi++) {
231 if(ret) aucroi=0.0;
else aucroi=auc[1]-auc[0];
232 iimg->
m[zi][yi][xi][0]+=aucroi;
235 if(t2>img->
end[f2]) {
236 t[0]=img->
end[f2]; t[1]=t2;
237 if(verbose>20) printf(
"t[0]=%g t[1]=%g\n", t[0], t[1]);
238 for(
int zi=0; zi<img->
dimz; zi++)
239 for(
int yi=0; yi<img->
dimy; yi++)
240 for(
int xi=0; xi<img->
dimx; xi++) {
242 if(ret) aucroi=0.0;
else aucroi=auc[1]-auc[0];
243 iimg->
m[zi][yi][xi][0]+=aucroi;
252 if(status!=NULL) sprintf(status,
"cannot setup integral image");
257 for(
int zi=0; zi<img->
dimz; zi++)
258 for(
int yi=0; yi<img->
dimy; yi++)
259 for(
int xi=0; xi<img->
dimx; xi++) {
261 if(ret) aucroi=0.0;
else aucroi=auc[1]-auc[0];
262 iimg->
m[zi][yi][xi][0]+=aucroi;
268 iimg->
end[0]=t2; iimg->
start[0]=t1; iimg->
mid[0]=0.5*(t1+t2);
275 if(status!=NULL) sprintf(status,
"cannot divide integral image");
279 if(status!=NULL) sprintf(status,
"average image [%g,%g] calculated",t1,t2);
281 if(img->
unit==CUNIT_KBQ_PER_ML) iimg->
unit=CUNIT_SEC_KBQ_PER_ML;
282 else iimg->
unit=CUNIT_UNKNOWN;
283 if(status!=NULL) sprintf(status,
"integral image [%g,%g] calculated",t1,t2);
308 if(dft==NULL || img==NULL)
return 1;
310 if(img->
dimt<1)
return 3;
315 if(tacNr<1)
return 4;
320 if(ret)
return(100+ret);
326 for(fi=0; fi<dft->
frameNr; fi++) {
327 dft->
x[fi]=img->
mid[fi];
329 dft->
x2[fi]=img->
end[fi];
335 for(ri=0; ri<dft->
voiNr; ri++) {
336 snprintf(dft->
voi[ri].
voiname, 6,
"%06d", ri+1);
356 int fi, ri, tacNr, ret;
359 if(dft==NULL || sif==NULL)
return 1;
361 tacNr=sif->
colNr-2;
if(tacNr<=0) tacNr=1;
365 if(ret)
return(100+ret);
372 for(fi=0; fi<dft->
frameNr; fi++) {
373 dft->
x[fi]=0.5*(sif->
x1[fi]+sif->
x2[fi]);
374 dft->
x1[fi]=sif->
x1[fi];
375 dft->
x2[fi]=sif->
x2[fi];
380 for(ri=0; ri<dft->
voiNr; ri++) {
382 if(ri==0) sprintf(dft->
voi[ri].
voiname,
"Prompt");
383 else if(ri==1) sprintf(dft->
voi[ri].
voiname,
"Random");
384 else if(ri==2) sprintf(dft->
voi[ri].
voiname,
"True");
385 else if(ri==3) sprintf(dft->
voi[ri].
voiname,
"Weight");
386 else snprintf(dft->
voi[ri].
voiname, 7,
"%06d", ri+1);
389 if(ri==0 && ri<sif->colNr-2) {
391 }
else if(ri==1 && ri<sif->colNr-2) {
393 }
else if(ri==2 && ri<sif->colNr-2) {
395 }
else if(ri==3 && ri<sif->colNr-2) {
398 for(fi=0; fi<dft->
frameNr; fi++) dft->
voi[ri].
y[fi]=0.0;
432 if(verbose>0) {printf(
"%s(*sif, *img, %d, ...)\n", __func__, doCounts); fflush(stdout);}
434 if(sif==NULL || img==NULL)
return 1;
436 if(img->
dimt<1)
return 3;
437 if(doCounts<0 || doCounts>1)
return 4;
451 for(fi=0; fi<img->
dimt; fi++) {sif->
x1[fi]=img->
start[fi]; sif->
x2[fi]=img->
end[fi];}
453 if(doCounts==0)
return 0;
456 if(verbose>1) printf(
"calculate image average curve.\n");
457 cs=(
float*)malloc(img->
dimt*
sizeof(
float));
458 if(cs==NULL) {
sifEmpty(sif);
return(20);}
461 for(fi=0, mf=0.0; fi<sif->
frameNr; fi++) {
462 f=sif->
x2[fi]-sif->
x1[fi];
if(f<=0.1) f=0.1;
463 cs[fi]*=f;
if(cs[fi]>mf) mf=cs[fi];
466 if(mf>0.0) f=1.0E+007/mf;
else f=1.0;
467 for(fi=0, mf=0.0; fi<sif->
frameNr; fi++) {
int dftSetmem(DFT *data, int frameNr, int voiNr)
int dftAllocateWithHeader(DFT *dft, int frameNr, int voiNr, DFT *dft_from)
int dftInterpolateCheckStart(DFT *input, DFT *output, char *status, int verbose)
int dftInterpolateCheckEnd(DFT *input, DFT *output, char *status, int verbose)
int copy_times_from_img_to_dft(IMG *img, DFT *dft, int verbose)
int check_times_dft_vs_dft(DFT *dft1, DFT *dft2, int verbose)
char * hlCorrectIsotopeCode(char *isocode)
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
void imgSetStatus(IMG *img, int status_index)
int imgFrameIntegral(IMG *img, int first, int last, IMG *iimg, int verbose)
int imgArithmConst(IMG *img, float operand, char operation, float ulimit, int verbose)
char * imgIsotope(IMG *img)
int imgAverageTAC(IMG *img, float *tac)
char * imgUnit(int dunit)
int petintegral(double *x1, double *x2, double *y, int nr, double *ie, double *iie)
Integrate PET TAC data to frame mid times.
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.
#define DFT_FORMAT_STANDARD
#define DFT_TIME_STARTEND
#define IMG_STATUS_OCCUPIED
int sifSetmem(SIF *data, int frameNr)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char * petTunit(int tunit)
Header file for libtpcmodext.
int sifAllocateWithIMG(SIF *sif, IMG *img, int doCounts, int verbose)
int dftAllocateWithIMG(DFT *dft, int tacNr, IMG *img)
int sif2dft(SIF *sif, DFT *dft)
int imgTimeIntegral(IMG *img, float t1, float t2, IMG *iimg, int calc_mode, char *status, int verbose)
int dftInterpolateForIMG(DFT *input, IMG *img, int frame_nr, DFT *output, double *ti1, double *ti2, int verbose, char *status)
char studynr[MAX_STUDYNR_LEN+1]
char unit[MAX_UNITS_LEN+1]
char studyNr[MAX_STUDYNR_LEN+1]
char studynr[MAX_STUDYNR_LEN+1]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char name[MAX_REGIONNAME_LEN+1]