7#include "tpcclibConfig.h"
16static const char *img_modality[] = {
32 return (
char*)img_modality[c];
40static const char *img_content[] = {
56 return (
char*)img_content[c];
76 for(
int i=0; i<20; i++) img->
scanStart[i]=(
char)0;
83 for(
int i=0; i<6; i++) img->
quatern[i]=0.0;
84 for(
int i=0; i<12; i++) img->
srow[i]=0.0;
85 for(
int i=0; i<6; i++) img->
iop[i]=0.0;
86 for(
int i=0; i<3; i++) img->
ipp[i]=0.0;
87 for(
int i=0; i<12; i++) img->
mt[i]=0.0;
97 img->
x1=img->
x2=img->
x=NULL;
98 img->
m=(
float****)0; img->
p=0;
99 img->_z=(
float****)0; img->_y=(
float***)0; img->_x=(
float**)0; img->_t=(
float*)0;
111 if(img==NULL)
return;
115 free(img->
x1); free(img->
x2); free(img->
x);
116 free(img->_t); free(img->_z); free(img->_x); free(img->_y);
131 const unsigned int dimz,
133 const unsigned int dimy,
135 const unsigned int dimx,
137 const unsigned int dimt,
141 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
143 printf(
"%s(img, %u, %u, %u, %u)\n", __func__, dimz, dimy, dimx, dimt); fflush(stdout);}
145 if(img==NULL || dimz<1 || dimy<1 || dimx<1 || dimt<1) {
154 int ret=0; {img->
x1=calloc(dimt,
sizeof(
float));
if(img->
x1==NULL) ret++;}
155 if(!ret) {img->
x2=calloc(dimt,
sizeof(
float));
if(img->
x2==NULL) ret++;}
156 if(!ret) {img->
x=calloc(dimt,
sizeof(
float));
if(img->
x==NULL) ret++;}
164 ret=0; {img->
weight=calloc(dimt,
sizeof(
float));
if(img->
weight==NULL) ret++;}
165 if(!ret) {img->
prompts=calloc(dimt,
sizeof(
float));
if(img->
prompts==NULL) ret++;}
166 if(!ret) {img->
randoms=calloc(dimt,
sizeof(
float));
if(img->
randoms==NULL) ret++;}
174 ret=0; {img->_t=(
float*)malloc((
size_t)dimz*dimy*dimx*dimt*
sizeof(
float));
if(img->_t==NULL) ret++;}
175 if(!ret) {img->_x=(
float**)malloc((
size_t)dimz*dimy*dimx*
sizeof(
float*));
if(img->_x==NULL) ret++;}
176 if(!ret) {img->_y=(
float***)malloc((
size_t)dimz*dimy*
sizeof(
float**));
if(img->_y==NULL) ret++;}
177 if(!ret) {img->_z=(
float****)malloc((
size_t)dimz*
sizeof(
float***));
if(img->_z==NULL) ret++;}
185 float ***yptr, **xptr, *tptr;
186 yptr=img->_y; xptr=img->_x; tptr=img->_t;
187 for(
unsigned int zi=0; zi<dimz; zi++) {
189 for(
unsigned int yi=0; yi<dimy; yi++) {
191 for(
unsigned int xi=0; xi<dimx; xi++) {
192 *xptr++=tptr; tptr+=dimt;
200 for(
unsigned int zi=0; zi<dimz; zi++)
201 for(
unsigned int yi=0; yi<dimy; yi++)
202 for(
unsigned int xi=0; xi<dimx; xi++)
203 for(
unsigned int ti=0; ti<dimt; ti++)
204 img->
m[zi][yi][xi][ti]=(
float)0.0;
222 if(img==NULL)
return(0);
224 if(img->
m==NULL || img->
p==NULL)
return(0);
225 if(img->
x1==NULL || img->
x2==NULL)
return(0);
240 for(
int i=0; i<img->
dimt; i++)
if(img->
x2[i]>0.00000001)
return(1);
255 if(img==NULL || img->
dimt<1)
return(0);
259 if(img->
prompts[0]>0.000000001) p=1;
260 if(img->
randoms[0]>0.000000001) r=2;
264 for(
unsigned short int i=1; i<img->
dimt; i++) {
282 if(img==NULL || img->
dimt<1)
return(0);
284 if(img->
weighting<WEIGHTING_LAST)
return(1);
300 if(img==NULL) {fprintf(fp,
"IMG pointer is NULL\n"); fflush(fp);
return;}
308 fprintf(fp,
"hasData := %d\n",
imgHasData(img));
314 fprintf(fp,
"dimensions: %u x %u x %u x %u\n", img->
dimx, img->
dimy, img->
dimz, img->
dimt);
316 fprintf(fp,
"voxel_size: %g x %g x %g\n", img->
sizex, img->
sizey, img->
sizez);
318 fprintf(fp,
"voxel_gaps: %g x %g x %g\n", img->
gapx, img->
gapy, img->
gapz);
320 fprintf(fp,
"qform := %d\n", img->
xform[0]);
321 fprintf(fp,
"sform := %d\n", img->
xform[1]);
323 fprintf(fp,
"quatern_b := %g\n", img->
quatern[0]);
324 fprintf(fp,
"quatern_c := %g\n", img->
quatern[1]);
325 fprintf(fp,
"quatern_d := %g\n", img->
quatern[2]);
326 fprintf(fp,
"quatern_x_shift := %g\n", img->
quatern[3]);
327 fprintf(fp,
"quatern_y_shift := %g\n", img->
quatern[4]);
328 fprintf(fp,
"quatern_z_shift := %g\n", img->
quatern[5]);
331 for(
int i=0; i<4; i++) fprintf(fp,
"srow_x[%d] := %g\n", i, img->
srow[i]);
332 for(
int i=0; i<4; i++) fprintf(fp,
"srow_y[%d] := %g\n", i, img->
srow[4+i]);
333 for(
int i=0; i<4; i++) fprintf(fp,
"srow_z[%d] := %g\n", i, img->
srow[8+i]);
336 fprintf(fp,
"image_orientation_patient := %g", img->
iop[0]);
337 for(
int i=1; i<6; i++) fprintf(fp,
", %g", img->
iop[i]);
341 fprintf(fp,
"image_position_patient := %g", img->
ipp[0]);
342 for(
int i=1; i<3; i++) fprintf(fp,
", %g", img->
ipp[i]);
346 fprintf(fp,
"image_matrix_transformation_parameters := %g", img->
mt[0]);
347 for(
int i=1; i<12; i++) fprintf(fp,
", %g", img->
mt[i]);
356 else fprintf(fp,
"weighting: yes\n");
361 fprintf(fp,
"original header: %d items\n", img->
ih.
keyNr);
379 if(img==NULL)
return(0);
381 for(i=0; i<pxlNr; i++) {
382 if(!isfinite(img->
p[i])) {
384 if(fix!=0) img->
p[i]=0.0;
407 if(minvalue!=NULL) *minvalue=f1;
408 if(maxvalue!=NULL) *maxvalue=f2;
411 for(i=0; i<n; i++)
if(isfinite(img->
p[i]))
break;
415 if(img->
p[i]>f2) f2=img->
p[i];
416 else if(img->
p[i]<f1) f1=img->
p[i];
418 if(minvalue!=NULL) *minvalue=f1;
419 if(maxvalue!=NULL) *maxvalue=f2;
438 if(xmin!=NULL) *xmin=nan(
"");
439 if(xmax!=NULL) *xmax=nan(
"");
441 float f1=nanf(
""), f2=nanf(
"");
442 for(
int i=0; i<img->
dimt; i++) {
443 if(isfinite(img->
x1[i])) {
444 if(isnan(f1) || img->
x1[i]<f1) f1=img->
x1[i];
446 if(isfinite(img->
x2[i])) {
447 if(isnan(f2) || img->
x2[i]>f2) f2=img->
x2[i];
450 if(xmin!=NULL) *xmin=f1;
451 if(xmax!=NULL) *xmax=f2;
unsigned int floatNonzeroes(float *a, const unsigned int n)
char * imgModalityDescr(imgmodality c)
void imgContents(IMG *img, FILE *fp)
unsigned long long imgNaNs(IMG *img, int fix)
int imgHasWeights(IMG *img)
char * imgContentDescr(imgcontent c)
int imgHasTimes(IMG *img)
int imgHasCounts(IMG *img)
int imgMinMax(IMG *img, float *minvalue, float *maxvalue)
int imgAllocate(IMG *img, const unsigned int dimz, const unsigned int dimy, const unsigned int dimx, const unsigned int dimt, TPCSTATUS *status)
int imgXRange(IMG *img, double *xmin, double *xmax)
char * imgFormatDescr(imgformat c)
char * isotopeName(int isotope_code)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
decaycorrection decayCorrection
char studyNr[MAX_STUDYNR_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
@ WEIGHTING_OFF
Not weighted or weights not available (weights for all included samples are 1.0).
@ WEIGHTING_UNKNOWN
Not known; usually assumed that not weighted.
@ UNIT_UNKNOWN
Unknown unit.
@ TPCERROR_FAIL
General error.
@ TPCERROR_OUT_OF_MEMORY
Cannot allocate memory.
@ TPCERROR_MISSING_DATA
File contains missing values.
char * unitName(int unit_code)
#define MAX_STUDYNR_LEN
Define max study number length.
Header file for libtpcimage.
@ IMG_MODALITY_LAST
End of list.
@ IMG_MODALITY_UNKNOWN
Unknown modality.
@ IMG_FORMAT_UNKNOWN
Unknown format.
@ IMG_CONTENT_LAST
End of list.
@ IMG_CONTENT_UNKNOWN
Unknown data content.
@ DECAY_UNKNOWN
Not known; usually assumed that data is corrected.
@ DECAY_NOTCORRECTED
Data is not corrected for physical decay.
@ DECAY_CORRECTED
Data is corrected for physical decay.
@ ISOTOPE_UNKNOWN
Unknown.