76 char temp[FILENAME_MAX];
78 if(dbname==NULL || strlen(dbname)==0)
return(0);
80 strcpy(temp, dbname); strcat(temp,
".hdr");
81 if(access(temp, 0) == -1)
return(0);
83 strcpy(temp, dbname); strcat(temp,
".img");
84 if(access(temp, 0) == -1)
return(0);
86 strcat(temp,
".sif");
if(access(temp, 0) != -1)
return(2);
87 strcpy(temp, dbname); strcat(temp,
".sif");
88 if(access(temp, 0) != -1)
return(2);
108 int ret, nr=0, s1, s2, same_order;
110 if(
ANALYZE_TEST) printf(
"anaReadHeader(%s, *dsr)\n", filename);
113 if(strlen(filename)<1 || h==NULL)
return(1);
114 little=little_endian();
116 fp=fopen(filename,
"rb");
if(fp==NULL)
return(2);
118 nr=0;
while((ret=fgetc(fp))!=EOF) nr++; rewind(fp);
119 if(nr<1) {fclose(fp);
return(3);}
127 if(
ANALYZE_TEST>1 && ret) printf(
" complete data_history not found.\n");
132 memcpy(&s1, buf1+0, 4); s2=s1; swawbip(&s2, 4);
133 if(abs(s1-nr)<abs(s2-nr)) same_order=1;
else same_order=0;
134 if(
ANALYZE_TEST>1) printf(
"same byte order: %d (s1=%d s2=%d nr=%d)\n",
135 same_order, s1, s2, nr);
136 if(same_order) h->
little=little;
140 if(!same_order) swawbip(buf1+0, 4); memcpy(&h->
hk.
sizeof_hdr, buf1+0, 4);
143 if(!same_order) swawbip(buf1+32, 4); memcpy(&h->
hk.
extents, buf1+32, 4);
144 if(!same_order) swabip(buf1+36, 2); memcpy(&h->
hk.
session_error, buf1+36, 2);
149 if(!same_order) swabip(buf2+0, 16); memcpy(h->
dime.
dim, buf2+0, 16);
150 if(!same_order) swabip(buf2+16, 2); memcpy(&h->
dime.
unused8, buf2+16, 2);
151 if(!same_order) swabip(buf2+18, 2); memcpy(&h->
dime.
unused9, buf2+18, 2);
152 if(!same_order) swabip(buf2+20, 2); memcpy(&h->
dime.
unused10, buf2+20, 2);
153 if(!same_order) swabip(buf2+22, 2); memcpy(&h->
dime.
unused11, buf2+22, 2);
154 if(!same_order) swabip(buf2+24, 2); memcpy(&h->
dime.
unused12, buf2+24, 2);
155 if(!same_order) swabip(buf2+26, 2); memcpy(&h->
dime.
unused13, buf2+26, 2);
156 if(!same_order) swabip(buf2+28, 2); memcpy(&h->
dime.
unused14, buf2+28, 2);
157 if(!same_order) swabip(buf2+30, 2); memcpy(&h->
dime.
datatype, buf2+30, 2);
158 if(!same_order) swabip(buf2+32, 2); memcpy(&h->
dime.
bitpix, buf2+32, 2);
159 if(!same_order) swabip(buf2+34, 2); memcpy(&h->
dime.
dim_un0, buf2+34, 2);
160 if(!same_order) swawbip(buf2+36, 32); memcpy(h->
dime.
pixdim, buf2+36, 32);
161 if(!same_order) swawbip(buf2+68, 4); memcpy(&h->
dime.
vox_offset, buf2+68, 4);
162 if(!same_order) swawbip(buf2+72, 4); memcpy(&h->
dime.
funused1, buf2+72, 4);
163 if(!same_order) swawbip(buf2+76, 4); memcpy(&h->
dime.
funused2, buf2+76, 4);
164 if(!same_order) swawbip(buf2+80, 4); memcpy(&h->
dime.
funused3, buf2+80, 4);
165 if(!same_order) swawbip(buf2+84, 4); memcpy(&h->
dime.
cal_max, buf2+84, 4);
166 if(!same_order) swawbip(buf2+88, 4); memcpy(&h->
dime.
cal_min, buf2+88, 4);
167 if(!same_order) swawbip(buf2+92, 4); memcpy(&h->
dime.
compressed, buf2+92, 4);
168 if(!same_order) swawbip(buf2+96, 4); memcpy(&h->
dime.
verified, buf2+96, 4);
169 if(!same_order) swawbip(buf2+100, 4); memcpy(&h->
dime.
glmax, buf2+100, 4);
170 if(!same_order) swawbip(buf2+104, 4); memcpy(&h->
dime.
glmin, buf2+104, 4);
183 if(!same_order) swawbip(buf3+168, 4); memcpy(&h->
hist.
views, buf3+168, 4);
184 if(!same_order) swawbip(buf3+172, 4); memcpy(&h->
hist.
vols_added, buf3+172, 4);
185 if(!same_order) swawbip(buf3+176, 4); memcpy(&h->
hist.
start_field, buf3+176, 4);
186 if(!same_order) swawbip(buf3+180, 4); memcpy(&h->
hist.
field_skip, buf3+180, 4);
187 if(!same_order) swawbip(buf3+184, 4); memcpy(&h->
hist.
omax, buf3+184, 4);
188 if(!same_order) swawbip(buf3+188, 4); memcpy(&h->
hist.
omin, buf3+188, 4);
189 if(!same_order) swawbip(buf3+192, 4); memcpy(&h->
hist.
smax, buf3+192, 4);
190 if(!same_order) swawbip(buf3+196, 4); memcpy(&h->
hist.
smin, buf3+196, 4);
214 int same_order, little;
217 if(
ANALYZE_TEST) printf(
"anaWriteHeader(%s, *dsr)\n", filename);
220 if(strlen(filename)<1 || h==NULL)
return(1);
221 little=little_endian();
222 if(little==h->
little) same_order=1;
else same_order=0;
227 memcpy(buf1+0, &h->
hk.
sizeof_hdr, 4);
if(!same_order) swawbip(buf1+0, 4);
230 memcpy(buf1+32, &h->
hk.
extents, 4);
if(!same_order) swawbip(buf1+32, 4);
231 memcpy(buf1+36, &h->
hk.
session_error, 2);
if(!same_order) swabip(buf1+36, 2);
236 memcpy(buf2+0, h->
dime.
dim, 16);
if(!same_order) swabip(buf2+0, 16);
237 memcpy(buf2+16, &h->
dime.
unused8, 2);
if(!same_order) swabip(buf2+16, 2);
238 memcpy(buf2+18, &h->
dime.
unused9, 2);
if(!same_order) swabip(buf2+18, 2);
239 memcpy(buf2+20, &h->
dime.
unused10, 2);
if(!same_order) swabip(buf2+20, 2);
240 memcpy(buf2+22, &h->
dime.
unused11, 2);
if(!same_order) swabip(buf2+22, 2);
241 memcpy(buf2+24, &h->
dime.
unused12, 2);
if(!same_order) swabip(buf2+24, 2);
242 memcpy(buf2+26, &h->
dime.
unused13, 2);
if(!same_order) swabip(buf2+26, 2);
243 memcpy(buf2+28, &h->
dime.
unused14, 2);
if(!same_order) swabip(buf2+28, 2);
244 memcpy(buf2+30, &h->
dime.
datatype, 2);
if(!same_order) swabip(buf2+30, 2);
245 memcpy(buf2+32, &h->
dime.
bitpix, 2);
if(!same_order) swabip(buf2+32, 2);
246 memcpy(buf2+34, &h->
dime.
dim_un0, 2);
if(!same_order) swabip(buf2+34, 2);
247 memcpy(buf2+36, h->
dime.
pixdim, 32);
if(!same_order) swawbip(buf2+36, 32);
248 memcpy(buf2+68, &h->
dime.
vox_offset, 4);
if(!same_order) swawbip(buf2+68, 4);
249 memcpy(buf2+72, &h->
dime.
funused1, 4);
if(!same_order) swawbip(buf2+72, 4);
250 memcpy(buf2+76, &h->
dime.
funused2, 4);
if(!same_order) swawbip(buf2+76, 4);
251 memcpy(buf2+80, &h->
dime.
funused3, 4);
if(!same_order) swawbip(buf2+80, 4);
252 memcpy(buf2+84, &h->
dime.
cal_max, 4);
if(!same_order) swawbip(buf2+84, 4);
253 memcpy(buf2+88, &h->
dime.
cal_min, 4);
if(!same_order) swawbip(buf2+88, 4);
254 memcpy(buf2+92, &h->
dime.
compressed, 4);
if(!same_order) swawbip(buf2+92, 4);
255 memcpy(buf2+96, &h->
dime.
verified, 4);
if(!same_order) swawbip(buf2+96, 4);
256 memcpy(buf2+100, &h->
dime.
glmax, 4);
if(!same_order) swawbip(buf2+100, 4);
257 memcpy(buf2+104, &h->
dime.
glmin, 4);
if(!same_order) swawbip(buf2+104, 4);
270 memcpy(buf3+168, &h->
hist.
views, 4);
if(!same_order) swawbip(buf3+168, 4);
271 memcpy(buf3+172, &h->
hist.
vols_added, 4);
if(!same_order) swawbip(buf3+172, 4);
272 memcpy(buf3+176, &h->
hist.
start_field, 4);
if(!same_order) swawbip(buf3+176, 4);
273 memcpy(buf3+180, &h->
hist.
field_skip, 4);
if(!same_order) swawbip(buf3+180, 4);
274 memcpy(buf3+184, &h->
hist.
omax, 4);
if(!same_order) swawbip(buf3+184, 4);
275 memcpy(buf3+188, &h->
hist.
omin, 4);
if(!same_order) swawbip(buf3+188, 4);
276 memcpy(buf3+192, &h->
hist.
smax, 4);
if(!same_order) swawbip(buf3+192, 4);
277 memcpy(buf3+196, &h->
hist.
smin, 4);
if(!same_order) swawbip(buf3+196, 4);
280 fp=fopen(filename,
"wb");
if(fp==NULL)
return(2);
283 fclose(fp);
return(3);
287 fclose(fp);
return(4);
291 fclose(fp);
return(5);
310 if(fp==NULL || h==NULL)
return(1);
311 fprintf(fp,
"original_byte_order := %d (1=little, 0=big)\n", h->
little);
313 fprintf(fp,
"header_key.sizeof_hdr := %d\n", h->
hk.
sizeof_hdr);
314 fprintf(fp,
"header_key.data_type := %.10s\n", h->
hk.
data_type);
315 fprintf(fp,
"header_key.db_name := %.18s\n", h->
hk.
db_name);
316 fprintf(fp,
"header_key.extents := %d\n", h->
hk.
extents);
319 fprintf(fp,
"header_key.hkey_un0 := %d\n", (
int)h->
hk.
hkey_un0);
321 fprintf(fp,
"header_image_dimension.dim :=");
322 for(i=0; i<8; i++) fprintf(fp,
" %d", h->
dime.
dim[i]);
324 fprintf(fp,
"header_image_dimension.unused8 := %d\n", h->
dime.
unused8);
325 fprintf(fp,
"header_image_dimension.unused9 := %d\n", h->
dime.
unused9);
326 fprintf(fp,
"header_image_dimension.unused10 := %d\n", h->
dime.
unused10);
327 fprintf(fp,
"header_image_dimension.unused11 := %d\n", h->
dime.
unused11);
328 fprintf(fp,
"header_image_dimension.unused12 := %d\n", h->
dime.
unused12);
329 fprintf(fp,
"header_image_dimension.unused13 := %d\n", h->
dime.
unused13);
330 fprintf(fp,
"header_image_dimension.unused14 := %d\n", h->
dime.
unused14);
331 fprintf(fp,
"header_image_dimension.datatype := %d\n", h->
dime.
datatype);
332 fprintf(fp,
"header_image_dimension.bitpix := %d\n", h->
dime.
bitpix);
333 fprintf(fp,
"header_image_dimension.dim_un0 := %d\n", h->
dime.
dim_un0);
334 fprintf(fp,
"header_image_dimension.pixdim :=");
335 for(i=0; i<8; i++) fprintf(fp,
" %g", h->
dime.
pixdim[i]);
337 fprintf(fp,
"header_image_dimension.vox_offset := %g\n", h->
dime.
vox_offset);
338 fprintf(fp,
"header_image_dimension.funused1 := %g\n", h->
dime.
funused1);
339 fprintf(fp,
"header_image_dimension.funused2 := %g\n", h->
dime.
funused2);
340 fprintf(fp,
"header_image_dimension.funused3 := %g\n", h->
dime.
funused3);
341 fprintf(fp,
"header_image_dimension.cal_max := %g\n", h->
dime.
cal_max);
342 fprintf(fp,
"header_image_dimension.cal_min := %g\n", h->
dime.
cal_min);
343 fprintf(fp,
"header_image_dimension.compressed := %g\n", h->
dime.
compressed);
344 fprintf(fp,
"header_image_dimension.verified := %g\n", h->
dime.
verified);
345 fprintf(fp,
"header_image_dimension.glmax := %d\n", h->
dime.
glmax);
346 fprintf(fp,
"header_image_dimension.glmin := %d\n", h->
dime.
glmin);
348 fprintf(fp,
"header_data_history.descrip := %s.80\n", h->
hist.
descrip);
349 fprintf(fp,
"header_data_history.aux_file := %.24s\n", h->
hist.
aux_file);
350 fprintf(fp,
"header_data_history.orient := %d\n", (
int)h->
hist.
orient);
351 fprintf(fp,
"header_data_history.originator := %.10s\n", h->
hist.
originator);
352 fprintf(fp,
"header_data_history.generated := %.10s\n", h->
hist.
generated);
353 fprintf(fp,
"header_data_history.scannum := %.10s\n", h->
hist.
scannum);
354 fprintf(fp,
"header_data_history.patient_id := %.10s\n", h->
hist.
patient_id);
355 fprintf(fp,
"header_data_history.exp_date := %.10s\n", h->
hist.
exp_date);
356 fprintf(fp,
"header_data_history.exp_time := %.10s\n", h->
hist.
exp_time);
357 fprintf(fp,
"header_data_history.hist_un0 := %.3s\n", h->
hist.
hist_un0);
358 fprintf(fp,
"header_data_history.views := %d\n", h->
hist.
views);
359 fprintf(fp,
"header_data_history.vols_added := %d\n", h->
hist.
vols_added);
360 fprintf(fp,
"header_data_history.start_field := %d\n", h->
hist.
start_field);
361 fprintf(fp,
"header_data_history.field_skip := %d\n", h->
hist.
field_skip);
362 fprintf(fp,
"header_data_history.omax := %d\n", h->
hist.
omax);
363 fprintf(fp,
"header_data_history.omin := %d\n", h->
hist.
omin);
364 fprintf(fp,
"header_data_history.smax := %d\n", h->
hist.
smax);
365 fprintf(fp,
"header_data_history.smin := %d\n", h->
hist.
smin);
382 int dimNr, dimx, dimy, dimz=1, dimt=1, pxlNr=0;
383 int i, n, little, start_pos, rawSize;
391 if(
ANALYZE_TEST) printf(
"anaReadImagedata(fp, h, %d, data)\n", frame);
394 if(frame<=0 || fp==NULL || h==NULL || data==NULL)
return(1);
397 dimNr=h->
dime.
dim[0];
if(dimNr<2)
return(2);
400 if(dimNr>2) dimz=h->
dime.
dim[3];
401 if(dimNr>3) dimt=h->
dime.
dim[4];
if(frame>dimt)
return(3);
402 pxlNr=dimx*dimy*dimz;
if(pxlNr<1)
return(4);
406 rawSize=pxlNr*(h->
dime.
bitpix/8);
if(rawSize<1)
return(5);
407 if(
ANALYZE_TEST>0) printf(
" pxlNr=%d rawSize=%d\n", pxlNr, rawSize);
408 mdata=(
char*)malloc(rawSize);
if(mdata==NULL)
return(11);
411 start_pos=(frame-1)*rawSize;
412 n=(int)h->
dime.
vox_offset;
if((n>0 && frame==1) || (n<0)) start_pos+=abs(n);
414 fseek(fp, start_pos, SEEK_SET);
415 if(ftell(fp)!=start_pos) {
416 if(
ANALYZE_TEST>5) printf(
"could not move to start_pos\n");
417 free(mdata);
return(7);
422 if((n=fread(mptr, rawSize, 1, fp)) < 1) {
424 printf(
"could read only %d bytes when request was %d\n", n, rawSize);
425 free(mdata);
return(8);
429 little=little_endian(); mptr=mdata;
434 case 16: swabip(mptr, rawSize);
break;
435 case 32: swawbip(mptr, rawSize);
break;
436 case 64: swawbip(mptr, rawSize);
break;
439 printf(
"unsupported anahdr.dime.bitpix := %d\n", h->
dime.
bitpix);
440 free(mdata);
return(5);
449 mptr=mdata; fptr=data;
454 printf(
"invalid combination of datatype and bitpix (%d, %d)\n",
456 free(mdata);
return(5);
458 for(i=0; i<pxlNr; i++, mptr++, fptr++) *fptr=f*(
float)(*mptr);
463 printf(
"invalid combination of datatype and bitpix (%d, %d)\n",
465 free(mdata);
return(5);
467 for(i=0; i<pxlNr; i++, mptr+=2, fptr++) {
468 sptr=(
short int*)mptr; *fptr=f*(float)(*sptr);
474 printf(
"invalid combination of datatype and bitpix (%d, %d)\n",
476 free(mdata);
return(5);
479 for(i=0; i<pxlNr; i++, mptr+=4, fptr++) {
480 iptr=(
int*)mptr; *fptr=f*(float)(*iptr);
483 for(i=0; i<pxlNr; i++, mptr+=4, fptr++) {
484 iptr=(
int*)mptr; *fptr=f*(float)(*iptr);
491 printf(
"invalid combination of datatype and bitpix (%d, %d)\n",
493 free(mdata);
return(5);
496 memcpy(fptr, mptr, pxlNr*4);
497 for(i=0; i<pxlNr; i++, fptr++) *fptr*=f;
499 memcpy(fptr, mptr, pxlNr*4);
500 for(i=0; i<pxlNr; i++, fptr++) *fptr*=f;
506 printf(
"invalid combination of datatype and bitpix (%d, %d)\n",
508 free(mdata);
return(5);
511 memcpy(fptr, mptr, pxlNr*4);
512 for(i=0; i<pxlNr; i++, fptr++) *fptr*=f;
518 printf(
"invalid combination of datatype and bitpix (%d, %d)\n",
520 free(mdata);
return(5);
522 for(i=0; i<pxlNr; i++, mptr+=8, fptr++) {
523 memcpy(&d, mptr, 8); *fptr=f*d;
528 printf(
"unsupported anahdr.dime.datatype := %d\n", h->
dime.
datatype);
529 free(mdata);
return(5);
533 if(
ANALYZE_TEST>1) printf(
"anaReadImagedata() succeeded\n");
550 cptr=getenv(
"ANALYZE_FLIP");
551 if(cptr==NULL) cptr=getenv(
"ANALYZE_FLIPPING");
552 if(cptr==NULL) cptr=getenv(
"analyze_flip");
553 if(cptr==NULL) cptr=getenv(
"analyze_flipping");
555 if(
ANALYZE_TEST>1) printf(
"ANALYZE_FLIP = not defined\n");
558 if(
ANALYZE_TEST>1) printf(
"ANALYZE_FLIP = '%s'\n", cptr);
559 if(*cptr==
'y' || *cptr==
'Y' || *cptr==
'1') ret=1;
560 else if(*cptr==
'n' || *cptr==
'N' || *cptr==
'0') ret=0;
577 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
581 if(
ANALYZE_TEST>2) printf(
" removing %s and %s\n", hdrfile, datfile);
582 if(
remove(hdrfile)!=0)
return 1;
583 if(
remove(datfile)!=0)
return 2;
597 cptr=strrchr(fname,
'.');
if(cptr==NULL)
return;
598 if(strcasecmp(cptr,
".")==0 || strcasecmp(cptr,
".img")==0 ||
599 strcasecmp(cptr,
".hdr")==0 || strcasecmp(cptr,
".sif")==0)
620 char temp[FILENAME_MAX], database[FILENAME_MAX];
624 printf(
"\nanaDatabaseExists(%s, *hdrfile, *imgfile, *siffile)\n", dbname);
627 if(hdrfile!=NULL) strcpy(hdrfile,
"");
628 if(imgfile!=NULL) strcpy(imgfile,
"");
629 if(siffile!=NULL) strcpy(siffile,
"");
630 if(dbname==NULL || strlen(dbname)==0)
return(0);
632 strcpy(database, dbname);
635 strcpy(temp, database); strcat(temp,
".hdr");
636 if(access(temp, 0) != -1) {
638 strcpy(temp, database); strcat(temp,
".img");
639 if(access(temp, 0) != -1) {
640 if(hdrfile!=NULL) sprintf(hdrfile,
"%s.hdr", database);
641 if(imgfile!=NULL) sprintf(imgfile,
"%s.img", database);
644 if(siffile!=NULL) strcpy(siffile, temp);
return(2);
650 if(checked==1)
break;
668 if(dbname==NULL || siffile==NULL)
return(1);
669 sprintf(siffile,
"%s.sif", dbname);
if(access(siffile, 0) != -1)
return(0);
670 sprintf(siffile,
"%s.SIF", dbname);
if(access(siffile, 0) != -1)
return(0);
671 sprintf(siffile,
"%s.img.sif", dbname);
if(access(siffile, 0) != -1)
return(0);
672 sprintf(siffile,
"%s.IMG.SIF", dbname);
if(access(siffile, 0) != -1)
return(0);
673 sprintf(siffile,
"%s.sif", dbname);
return(2);
int anaExists(const char *dbname)
int anaWriteHeader(char *filename, ANALYZE_DSR *h)
int anaRemove(const char *dbname)
ANALYZE_HEADER_HISTORY hist
int anaReadHeader(char *filename, ANALYZE_DSR *h)
#define ANALYZE_HEADER_KEY_SIZE
#define ANALYZE_DT_SIGNED_INT
int anaPrintHeader(ANALYZE_DSR *h, FILE *fp)
#define ANALYZE_DT_COMPLEX
#define ANALYZE_HEADER_HISTORY_SIZE
#define ANALYZE_DT_DOUBLE
int anaDatabaseExists(const char *dbname, char *hdrfile, char *imgfile, char *siffile)
int anaReadImagedata(FILE *fp, ANALYZE_DSR *h, int frame, float *data)
#define ANALYZE_DT_SIGNED_SHORT
#define ANALYZE_HEADER_IMGDIM_SIZE
#define ANALYZE_FLIP_DEFAULT
int anaMakeSIFName(const char *dbname, char *siffile)
void anaRemoveFNameExtension(char *fname)
ANALYZE_HEADER_IMGDIM dime
#define ANALYZE_DT_UNSIGNED_CHAR