1 
2 #include "mrilib.h"
3 #include "mayo_analyze.h"
4 
5 void ShowHdr(char *, struct dsr *);
6 void swap_hdr(struct dsr *pntr);
7 void swap_long(void *);
8 void swap_short(void *);
9 
10 static int swapped ;
11 
main(int argc,char * argv[])12 int main( int argc , char * argv[] )
13 {
14     struct dsr hdr;
15     int size, nn ;
16     double cmax, cmin;
17     FILE *fp;
18 
19     if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
20       printf("Usage: mayo_analyze file.hdr ...\n"
21              "Prints out info from the Mayo Analyze 7.5 header file(s)\n"
22       ) ;
23       exit(0) ;
24     }
25 
26     for( nn=1 ; nn < argc ; nn++ ){
27 
28        if((fp=fopen(argv[nn],"r"))==NULL){
29            fprintf(stderr,"Can't open:<%s>\n", argv[1]);
30            continue ;
31        }
32        fread(&hdr,1,sizeof(struct dsr),fp);
33 
34        if(hdr.dime.dim[0] < 0 || hdr.dime.dim[0] > 15){
35           printf("Byte swapping header %s\n",argv[nn]) ;
36           swap_hdr(&hdr); swapped = 1 ;
37        } else {
38           swapped = 0 ;
39        }
40 
41        ShowHdr(argv[nn], &hdr);
42        fclose(fp) ;
43        if( nn < argc-1 )
44           printf("======================================================\n") ;
45     }
46     exit(0) ;
47 }
48 
49 
ShowHdr(char * fileName,struct dsr * hdr)50 void ShowHdr(char *fileName, struct dsr *hdr)
51 {
52    int i;
53    char string[128];
54    printf("Analyze Header Dump of: <%s> \n", fileName);
55 /* Header Key */
56    printf("sizeof_hdr: <%d> \n", hdr->hk.sizeof_hdr);
57    printf("data_type:  <%s> \n", hdr->hk.data_type);
58    printf("db_name:    <%s> \n", hdr->hk.db_name);
59    printf("extents:    <%d> \n", hdr->hk.extents);
60    printf("session_error: <%d> \n", hdr->hk.session_error);
61    printf("regular:  <%c> \n", hdr->hk.regular);
62    printf("hkey_un0: <%c> \n", hdr->hk.hkey_un0);
63 
64 /* Image Dimension */
65    for(i=0;i<8;i++)
66        printf("dim[%d]: <%d> \n", i, hdr->dime.dim[i]);
67 
68 #if 0
69    strncpy(string,hdr->dime.vox_units,4);
70    printf("vox_units:  <%s> \n", string);
71 #endif
72 
73 #if 0
74    strncpy(string,hdr->dime.cal_units,8);
75    printf("cal_units: <%s> \n", string);
76    printf("unused1:   <%d> \n", hdr->dime.unused1);
77 #endif
78    printf("datatype:  <%d> \n", hdr->dime.datatype);
79    printf("bitpix:    <%d> \n", hdr->dime.bitpix);
80 
81    for(i=0;i<8;i++)
82        printf("pixdim[%d]: <%6.4f> \n",i, hdr->dime.pixdim[i]);
83 
84    printf("vox_offset: <%6.4f> \n",  hdr->dime.vox_offset);
85    printf("funused1:   <%6.4f> \n", hdr->dime.funused1);
86    printf("funused2:   <%6.4f> \n", hdr->dime.funused2);
87    printf("funused3:   <%6.4f> \n", hdr->dime.funused3);
88    printf("cal_max:    <%6.4f> \n", hdr->dime.cal_max);
89    printf("cal_min:    <%6.4f> \n", hdr->dime.cal_min);
90    printf("compressed: <%6.4f> \n", hdr->dime.compressed);
91    printf("verified:   <%6.4f> \n", hdr->dime.verified);
92    printf("glmax:      <%d>    \n", hdr->dime.glmax);
93    printf("glmin:      <%d>    \n", hdr->dime.glmin);
94 
95 /* Data History */
96    strncpy(string,hdr->hist.descrip,80);
97    printf("descrip:  <%s> \n", string);
98    strncpy(string,hdr->hist.aux_file,24);
99    printf("aux_file: <%s> \n", string);
100    printf("orient:   <%d> \n", (int) hdr->hist.orient);
101 
102    /* 28 Nov 2001: attempt to decode originator a la SPM */
103 
104    { short xyzuv[5] , xx,yy,zz ;
105      memcpy( xyzuv , hdr->hist.originator , 10 ) ;
106      if( xyzuv[3] == 0 && xyzuv[4] == 0 ){
107         xx = xyzuv[0] ; yy = xyzuv[1] ; zz = xyzuv[2] ;
108         if( swapped ){ swap_short(&xx); swap_short(&yy); swap_short(&zz); }
109         if( xx > 0 && xx < hdr->dime.dim[1] &&
110             yy > 0 && yy < hdr->dime.dim[2] &&
111             zz > 0 && zz < hdr->dime.dim[3]   ){
112 
113            printf("SPM originator decodes to %d %d %d\n",xx,yy,zz) ;
114         }
115      }
116    }
117 
118    strncpy(string,hdr->hist.originator,10);
119    printf("originator: <%s> \n", string);
120 
121    strncpy(string,hdr->hist.generated,10);
122    printf("generated: <%s> \n", string);
123 
124    strncpy(string,hdr->hist.scannum,10);
125    printf("scannum: <%s> \n", string);
126 
127    strncpy(string,hdr->hist.patient_id,10);
128    printf("patient_id: <%s> \n", string);
129 
130    strncpy(string,hdr->hist.exp_date,10);
131    printf("exp_date: <%s> \n", string);
132 
133    strncpy(string,hdr->hist.exp_time,10);
134    printf("exp_time: <%s> \n", string);
135 
136    strncpy(string,hdr->hist.hist_un0,10);
137    printf("hist_un0: <%s> \n", string);
138 
139    printf("views:      <%d> \n", hdr->hist.views);
140    printf("vols_added: <%d> \n", hdr->hist.vols_added);
141    printf("start_field:<%d> \n", hdr->hist.start_field);
142    printf("field_skip: <%d> \n", hdr->hist.field_skip);
143    printf("omax: <%d> \n", hdr->hist.omax);
144    printf("omin: <%d> \n", hdr->hist.omin);
145    printf("smin: <%d> \n", hdr->hist.smax);
146    printf("smin: <%d> \n", hdr->hist.smin);
147 
148 }
149 
swap_hdr(struct dsr * pntr)150 void swap_hdr(struct dsr *pntr)
151 {
152        swap_long(&pntr->hk.sizeof_hdr) ;
153        swap_long(&pntr->hk.extents) ;
154        swap_short(&pntr->hk.session_error) ;
155        swap_short(&pntr->dime.dim[0]) ;
156        swap_short(&pntr->dime.dim[1]) ;
157        swap_short(&pntr->dime.dim[2]) ;
158        swap_short(&pntr->dime.dim[3]) ;
159        swap_short(&pntr->dime.dim[4]) ;
160        swap_short(&pntr->dime.dim[5]) ;
161        swap_short(&pntr->dime.dim[6]) ;
162        swap_short(&pntr->dime.dim[7]) ;
163 #if 0
164        swap_short(&pntr->dime.unused1) ;
165 #endif
166        swap_short(&pntr->dime.datatype) ;
167        swap_short(&pntr->dime.bitpix) ;
168        swap_long(&pntr->dime.pixdim[0]) ;
169        swap_long(&pntr->dime.pixdim[1]) ;
170        swap_long(&pntr->dime.pixdim[2]) ;
171        swap_long(&pntr->dime.pixdim[3]) ;
172        swap_long(&pntr->dime.pixdim[4]) ;
173        swap_long(&pntr->dime.pixdim[5]) ;
174        swap_long(&pntr->dime.pixdim[6]) ;
175        swap_long(&pntr->dime.pixdim[7]) ;
176        swap_long(&pntr->dime.vox_offset) ;
177        swap_long(&pntr->dime.funused1) ;
178        swap_long(&pntr->dime.funused2) ;
179        swap_long(&pntr->dime.cal_max) ;
180        swap_long(&pntr->dime.cal_min) ;
181        swap_long(&pntr->dime.compressed) ;
182        swap_long(&pntr->dime.verified) ;
183        swap_short(&pntr->dime.dim_un0) ;
184        swap_long(&pntr->dime.glmax) ;
185        swap_long(&pntr->dime.glmin) ;
186 }
187 
swap_long(void * ppp)188 void swap_long(void *ppp)
189 {
190    unsigned char *pntr = (unsigned char *) ppp ;
191         unsigned char b0, b1, b2, b3;
192 
193         b0 = *pntr;
194         b1 = *(pntr+1);
195         b2 = *(pntr+2);
196         b3 = *(pntr+3);
197 
198         *pntr = b3;
199         *(pntr+1) = b2;
200         *(pntr+2) = b1;
201         *(pntr+3) = b0;
202 }
203 
swap_short(void * ppp)204 void swap_short(void *ppp)
205 {
206    unsigned char *pntr = (unsigned char *) ppp ;
207         unsigned char b0, b1;
208 
209         b0 = *pntr;
210         b1 = *(pntr+1);
211 
212         *pntr = b1;
213         *(pntr+1) = b0;
214 }
215