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