1 /******************************* 3dAFNItoRaw **************************************/
2 #include "mrilib.h"
3
4 static char outfname[THD_MAX_PREFIX] = "rawxyz.dat";
5
6 /*! convert three sub-briks to a raw dataset with consecutive triplets */
main(int argc,char * argv[])7 int main( int argc , char * argv[] )
8 {
9 THD_3dim_dataset * old_dset; /* input dataset */
10 int nopt, nxyz;
11 int force_float = 0;
12 float voxval;
13 int ival;
14 short sval;
15 double dval;
16 byte bval;
17 void *voxptr;
18 int i,j;
19 FILE *fout;
20 double fac;
21 MRI_IMAGE *data_im = NULL;
22 MRI_TYPE out_kind = MRI_float;
23 int statcode;
24
25 /*----- Read command line -----*/
26
27 WARNING_message("This program (3dAFNItoRaw) is old, not maintained, and probably useless!") ;
28
29 if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
30 printf("Usage: 3dAFNItoRaw [options] dataset\n"
31 "Convert an AFNI brik file with multiple sub-briks to a raw file with\n"
32 " each sub-brik voxel concatenated voxel-wise.\n"
33 "For example, a dataset with 3 sub-briks X,Y,Z with elements x1,x2,x3,...,xn,\n"
34 " y1,y2,y3,...,yn and z1,z2,z3,...,zn will be converted to a raw dataset with\n"
35 " elements x1,y1,z1, x2,y2,z2, x3,y3,z3, ..., xn,yn,zn \n"
36 "The dataset is kept in the original data format (float/short/int)\n"
37 "Options:\n"
38 " -output / -prefix = name of the output file (not an AFNI dataset prefix)\n"
39 " the default output name will be rawxyz.dat\n\n"
40 " -datum float = force floating point output. Floating point forced if any\n"
41 " sub-brik scale factors not equal to 1.\n\n"
42 );
43 printf("\n" MASTER_SHORTHELP_STRING ) ;
44 PRINT_COMPILE_DATE; exit(0) ;
45 }
46
47 mainENTRY("3dAFNItoRaw main"); machdep(); AFNI_logger("3dAFNItoRaw",argc,argv);
48 PRINT_VERSION("3dAFNItoRaw") ;
49 nopt = 1;
50 while( nopt < argc && argv[nopt][0] == '-' ){
51 if( (strcmp(argv[nopt],"-output") == 0 ) || (strcmp(argv[nopt],"-prefix")==0))
52 {
53 if (++nopt >= argc)
54 {
55 fprintf (stderr, "*** Error - output / prefix needs an argument!\n");
56 exit (1);
57 }
58 MCW_strncpy (outfname, argv[nopt], THD_MAX_PREFIX); /* change name from default prefix */
59 if (!THD_filename_ok (outfname))
60 {
61 fprintf (stderr, "*** Error - %s is not a valid output name!\n", outfname);
62 exit (1);
63 }
64 if (THD_is_file(outfname))
65 {
66 fprintf (stderr, "*** Error - %s already exists!\n", outfname);
67 exit (1);
68 }
69 fout = fopen (outfname, "w") ;
70 if( fout == NULL ){
71 fprintf (stderr, "*** Error - can not create %s for some reason!\n", outfname);
72 exit (1);
73 }
74 nopt++; continue;
75 }
76 if (strcmp(argv[nopt],"-datum")==0) {
77 if (strcmp(argv[++nopt],"float")==0)
78 force_float = 1;
79 else {
80 fprintf (stderr, \
81 "*** Error - can only specify float; otherwise, original format assumed!\n");
82 exit (1);
83 }
84 nopt++; continue;
85 }
86 fprintf(stderr, "*** Error - unknown option %s\n", argv[nopt]);
87 exit(1);
88 }
89
90 old_dset = THD_open_dataset(argv[nopt]); CHECK_OPEN_ERROR(old_dset,argv[nopt]);
91
92 /* expect at least 2 values per voxel - otherwise what's the point? */
93 if (DSET_NVALS (old_dset) < 2){
94 fprintf (stderr, "*** Error - Dataset must have at least two sub-briks.\n");
95 exit (1);
96 }
97
98 nxyz = DSET_NVOX(old_dset) ; /* number of voxels in dataset */
99
100 fout = fopen (outfname, "w") ;
101 if( fout == NULL ){
102 fprintf (stderr, "*** Error - can not create %s for some reason!\n", outfname);
103 exit (1);
104 }
105
106 if(force_float==0) {
107 for(j=0;j<DSET_NVALS(old_dset);j++) {
108 fac = DSET_BRICK_FACTOR(old_dset, j); /* get scale factor for each sub-brik*/
109 if(fac==0.0) fac=1.0;
110 if(fac!=1.0) {
111 force_float = 1; /* if even one scale factor != 1, put output in float */
112 break;
113 }
114 }
115 }
116
117
118 DSET_mallocize (old_dset);
119 DSET_load (old_dset); /* load dataset */
120
121 for(i=0;i<nxyz;i++) { /* for every voxel in each sub-brik */
122 for(j=0;j<DSET_NVALS(old_dset);j++) { /* for each sub-brik */
123 data_im = DSET_BRICK (old_dset, j); /* set pointer to the jth sub-brik of the dataset */
124 fac = DSET_BRICK_FACTOR(old_dset, j); /* get scale factor for each sub-brik*/
125 if(fac==0.0) fac=1.0;
126 switch( data_im->kind ){
127 case MRI_short:{
128 short *ar = mri_data_pointer(data_im) ;
129 voxval = ar[i];
130 }
131 break ;
132
133 case MRI_byte:{
134 byte *ar = mri_data_pointer(data_im) ;
135 voxval = ar[i];
136 }
137 break ;
138
139 case MRI_float:{
140 float *ar = mri_data_pointer(data_im) ;
141 voxval = ar[i];
142 }
143 break ;
144
145 case MRI_double:{
146 double *ar = mri_data_pointer(data_im) ;
147 voxval = ar[i];
148 }
149 break ;
150
151 case MRI_int:{
152 int *ar = mri_data_pointer(data_im) ;
153 voxval = ar[i];
154 }
155 break ;
156
157 case MRI_complex:{
158 complex *ar = mri_data_pointer(data_im) ;
159 voxval = CABS(ar[i]);
160 }
161 break ;
162
163 case MRI_rgb:{
164 byte *ar = mri_data_pointer(data_im) ;
165 voxval = 0.299*ar[3*i]+0.587*ar[3*i+1]+0.114*ar[3*i+2];
166 }
167 break ;
168
169 default: /* unknown type */
170 voxval = 0.0; /* ignore this voxel */
171 fprintf(stderr,"Unknown type, %s, in sub-brik %d\n", MRI_TYPE_name[data_im->kind], i);
172 break;
173 }
174
175 voxval = voxval * fac;
176
177 if(force_float!=0)
178 out_kind = MRI_float;
179 else
180 out_kind = data_im->kind;
181
182 switch(out_kind) {
183 case MRI_short:{
184 sval = voxval;
185 voxptr = &sval;
186 }
187 break ;
188
189 case MRI_byte:{
190 bval = voxval;
191 voxptr = &sval;
192 }
193 break ;
194
195 case MRI_float:{
196 voxptr = &voxval;
197 }
198 break ;
199
200 case MRI_double:{
201 dval = voxval;
202 voxptr = &dval;
203 }
204 break ;
205
206 case MRI_int:{
207 ival = voxval;
208 voxptr = &ival;
209 }
210 break ;
211
212 default: /* unknown type */
213 fprintf(stderr,"Can't handle type, %s, in sub-brik %d\n",\
214 MRI_TYPE_name[data_im->kind], j);
215 fclose(fout);
216 exit(1);
217 break;
218 }
219
220 statcode = fwrite(voxptr, sizeof(out_kind), 1,fout); /* write one voxel value at a time */
221 if(statcode!=1) {
222 fprintf(stderr, "*** Error - writing output file!\n");
223 fclose(fout);
224 exit(1);
225 }
226 }
227 }
228
229 fprintf(stderr, "File output format is %s\n", MRI_TYPE_name[out_kind]);
230 fclose(fout);
231 exit(0);
232 }
233