31 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
32 if(verbose>0) {printf(
"%s(..., %s, ...)\n", __func__, fname); fflush(stdout);}
34 if(img==NULL ||
strnlen(fname, 2)<1) {
54 if(verbose>0) {fprintf(stderr,
"Error: cannot find modality.\n"); fflush(stderr);}
59 if(verbose>12) printf(
"Modality := '%s'\n", buf);
64 else if(verbose>0) fprintf(stderr,
"Warning: modality '%s' not supported.\n", buf);
69 if(verbose>10) {printf(
"reading matrix dimensions\n"); fflush(stdout);}
70 unsigned short int imgdim[4];
72 if(ret!=0 || imgdim[0]<=0 || imgdim[1]<=0 || imgdim[2]<=0 || imgdim[3]<=0) {
73 if(verbose>0) {fprintf(stderr,
"Error: cannot find matrix dimensions.\n"); fflush(stderr);}
77 unsigned short int dimx, dimy, sliceNr, frameNr;
78 dimx=imgdim[0]; dimy=imgdim[1]; sliceNr=imgdim[2]; frameNr=imgdim[3];
80 printf(
"dimx := %u\ndimy := %u\ndimz := %u\ndimt := %u\n", dimx, dimy, sliceNr, frameNr);
85 ret=
imgAllocate(img, sliceNr, dimy, dimx, frameNr, status);
91 if(ret!=0 && verbose>0) {
92 fprintf(stderr,
"Warning: decay correction and isotope unknown.\n"); fflush(stderr);
101 char zeroDateTime[32]; zeroDateTime[0]=(char)0;
112 if(!zeroDateTime[0]) {
113 if(verbose>0) fprintf(stderr,
"Error: missing Acquisition Date and Time.\n");
117 if(verbose>14) printf(
"zeroDateTime := %s\n", zeroDateTime);
122 for(
unsigned short int i=0; i<img->
dimt; i++) img->
x1[i]=img->
x2[i]=img->
x[i]=nanf(
"");
128 if(verbose>0) fprintf(stderr,
"Error: Per Frame Functional Groups Sequence not found.\n");
141 if(verbose>20) printf(
" found Frame Content Sequence\n");
145 if(jptr==NULL) {fptr=fptr->
next_item;
continue;}
147 unsigned short int frameIndex=(
unsigned short int)(
dcmitemGetInt(jptr)-1);
150 char facqDateTime[32]; facqDateTime[0]=(char)0;
152 if(!facqDateTime[0]) {
153 if(verbose>0) fprintf(stderr,
"Error: missing Frame Acquisition DateTime.\n");
157 if(verbose>20) printf(
"facqDateTime := %s\n", facqDateTime);
161 if(frameIndex<img->dimt) {
162 if(isnan(img->
x1[frameIndex])) {
164 img->
x1[frameIndex]=t1;
165 if(verbose>29) printf(
"t1[%u]=%g\n", frameIndex, t1);
170 if(verbose>1) printf(
" different t1=%g\n", t1);
177 if(jptr==NULL) {fptr=fptr->
next_item;
continue;}
179 if(frameIndex<img->dimt) {
181 img->
x[frameIndex]=0.5*(img->
x1[frameIndex]+img->
x2[frameIndex]);
193 if(verbose>0) fprintf(stderr,
"Error: missing Pixel size.\n");
197 img->
sizex=(float)pxlsize[0];
198 img->
sizey=(float)pxlsize[1];
199 img->
sizez=(float)pxlsize[2];
200 if(verbose>13) printf(
" pixel_size := %g x %g x %g\n", img->
sizex, img->
sizey, img->
sizez);
203 int ret1=
dcmImgPos(&dcm, ipp, verbose-2);
205 for(
int i=0; i<3; i++) img->
ipp[i]=ipp[i];
207 if(verbose>0) fprintf(stderr,
"Warning: missing Image Position (Patient).\n");
212 for(
int i=0; i<6; i++) img->
iop[i]=iop[i];
214 if(verbose>0) fprintf(stderr,
"Warning: missing Image Orientation (Patient).\n");
216 if(ret1==0 && ret2==0) {
218 ret=
dcmImgXform(iop, pxlsize, ipp, xform, verbose-2);
221 for(
int i=0; i<12; i++) img->
srow[i]=(
float)xform[i];
222 double quatern[3], qoffset[3];
224 for(
int i=0; i<3; i++) img->
quatern[i]=(
float)quatern[i];
225 for(
int i=0; i<3; i++) img->
quatern[3+i]=(
float)qoffset[i];
238 char *buf=
dcmValueString(iptr);
if(verbose>12) printf(
"Accession Number := '%s'\n", buf);
249 char *buf=
dcmValueString(iptr);
if(verbose>12) printf(
"Patient ID := '%s'\n", buf);
257 double rescale_intercept=0.0, rescale_slope=0.0;
263 if(verbose>0) fprintf(stderr,
"Error: missing Real World Value Mapping Sequence.\n");
273 if(rescale_slope<=0.0 && verbose>0) {
274 fprintf(stderr,
"Warning: rescale_slope := %g\n", rescale_slope); fflush(stderr);
275 }
else if(verbose>14) {
276 printf(
"rescale_slope := %g\n", rescale_slope);
277 printf(
"rescale_intercept := %g\n", rescale_intercept);
283 char *buf=
dcmValueString(jptr);
if(verbose>14) printf(
" buf := '%s'\n", buf);
287 if(verbose>14) printf(
"image_unit := %s\n",
unitName(img->
cunit));
294 if(iptr==NULL || iptr->
rd==NULL) {
298 unsigned long long bi=0, byteNr=iptr->
vl;
299 if(verbose>13) printf(
" pixel data byteNr := %llu\n", byteNr);
303 for(
unsigned int ti=0; ti<img->
dimt; ti++) {
304 for(
unsigned int zi=0; zi<img->
dimz; zi++)
305 for(
unsigned int yi=0; yi<img->
dimy; yi++)
306 for(
unsigned int xi=0; xi<img->
dimx; xi++) {
307 if(bi>=byteNr) {printf(
"missing pixel data\n"); fflush(stdout);
break;}
308 memcpy(&s, cptr, 2); cptr+=2; bi+=2;
309 img->
m[zi][yi][xi][ti]=(float)(rescale_slope*(
double)s + rescale_intercept);
344 if(status->
verbose>1) {printf(
"%s(..., %s, ...)\n", __func__, fname); fflush(stdout);}
345 if(img==NULL || img->
dimt<1 || img->
dimz<1) {
347 if(fname==NULL ||
strnlen(fname, 1)<1) {
369 dcmAddItem(&dcm, NULL, 0, tag,
DCM_VR_UI, 0xFFFFFFFF,
"1.2.826.0.1.3417726.3.0.20180616", 0);
375 snprintf(buf, 256,
"TPCCLIB_%d.%d.%d", tpcclib_VERSION_MAJOR, tpcclib_VERSION_MINOR, tpcclib_VERSION_PATCH);
385 struct tm *local_tm; local_tm=localtime(&t);
387 strftime(buf, 256,
"%Y%m%d", local_tm);
390 strftime(buf, 256,
"%H%M%S", local_tm);
396 dcmAddItem(&dcm, NULL, 0, tag,
DCM_VR_UI, 0xFFFFFFFF,
"1.2.826.0.1.3417726.3.0.20180616", 0);
404 snprintf(buf, 256,
"%g", img->
sizez);
424 fprintf(stdout,
" checking that folder '%s' is empty\n", fname); fflush(stdout);}
428 return(status->
error);
432 fprintf(stdout,
" creating subdirectory '%s'\n", fname); fflush(stdout);}
436 return(status->
error);
443 for(
int zi=0; zi<img->
dimz; zi++) {
444 char dname[strlen(fname)+25];
445 snprintf(dname, strlen(fname)+25,
"%s/%0*d.dcm", fname, 1+(
int)floor(log10(img->
dimz)), 1+zi);
446 if(status->
verbose>2) {printf(
" writing '%s'\n", dname); fflush(stdout);}
454 return(status->
error);