Doxygen Source Code Documentation
3daxialize.c File Reference
#include "mrilib.h"
#include "thd.h"
Go to the source code of this file.
Defines | |
#define | MAIN |
Functions | |
int | main (int argc, char *argv[]) |
Define Documentation
|
Definition at line 3 of file 3daxialize.c. |
Function Documentation
|
compute the overall minimum and maximum voxel values for a dataset Definition at line 15 of file 3daxialize.c. References FD_brick::a123, a2, abs, ADN_none, ADN_nsl, ADN_nxyz, ADN_prefix, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, AFNI_logger(), argc, THD_diskptr::brick_name, COMPRESS_fclose(), COMPRESS_fopen_write(), THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, DBLK_BRICK_FACTOR, FD_brick::del1, FD_brick::del2, FD_brick::del3, THD_datablock::diskptr, DSET_BRICK_TYPE, DSET_BRIKNAME, DSET_BYTEORDER, DSET_load, DSET_LOADED, DSET_NUM_TTOFF, DSET_NVALS, DSET_unload, DSET_unload_one, EDIT_dset_items(), EDIT_empty_copy(), far, FD_warp_to_mri(), THD_ivec3::ijk, MRI_IMAGE::kind, LOAD_FVEC3, LOAD_IVEC3, machdep(), mainENTRY, MASTER_SHORTHELP_STRING, MCW_strncpy, mri_data_pointer(), mri_datum_size(), mri_free(), mri_short_order(), mri_swap2(), mri_swap4(), FD_brick::n1, FD_brick::n2, FD_brick::n3, OR3OK, ORCODE, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, PRINT_VERSION, THD_filename_ok(), THD_get_write_compression(), THD_get_write_order(), THD_load_statistics(), THD_MAX_PREFIX, THD_open_dataset(), THD_oriented_brick(), THD_setup_bricks(), THD_write_3dim_dataset(), tross_Copy_History(), tross_Make_History(), UNLOAD_IVEC3, THD_dataxes::xxdel, THD_dataxes::xxorg, THD_dataxes::yydel, THD_dataxes::yyorg, THD_dataxes::zzdel, and THD_dataxes::zzorg.
00016 { 00017 THD_3dim_dataset * old_dset , * new_dset ; 00018 FD_brick ** fbr , * brax ; 00019 int iarg , a1,a2,a3 , aa1,aa2,aa3 , ival,kk,cmode,npix,dsiz,code ; 00020 THD_ivec3 iv_nxyz , iv_xyzorient ; 00021 THD_fvec3 fv_xyzorg , fv_xyzdel ; 00022 float xyz_org[4] , xyz_del[4] , brfac_save ; 00023 MRI_IMAGE * im ; 00024 void * imar ; 00025 FILE * far ; 00026 THD_datablock * old_dblk , * new_dblk ; 00027 char new_prefix[THD_MAX_PREFIX] = "axialize" ; 00028 int verbose = 0 , nim , pim=2 ; 00029 int native_order , save_order ; /* 23 Nov 1999 */ 00030 00031 int axord=0 ; /* 06 Mar 2000 */ 00032 char orients[4]="\0" ; /* 07 Dec 2001 */ 00033 00034 /*- sanity check -*/ 00035 00036 if( argc < 2 || strcmp(argv[1],"-help") == 0 ){ 00037 printf("Usage: 3daxialize [options] dataset\n" 00038 "Purpose: Read in a dataset and write it out as a new dataset\n" 00039 " with the data brick oriented as axial slices.\n" 00040 " The input dataset must have a .BRIK file.\n" 00041 " One application is to create a dataset that can\n" 00042 " be used with the AFNI volume rendering plugin.\n" 00043 "\n" 00044 "Options:\n" 00045 " -prefix ppp = Use 'ppp' as the prefix for the new dataset.\n" 00046 " [default = 'axialize']\n" 00047 " -verb = Print out a progress report.\n" 00048 "\n" 00049 "The following options determine the order/orientation\n" 00050 "in which the slices will be written to the dataset:\n" 00051 " -sagittal = Do sagittal slice order [-orient ASL]\n" 00052 " -coronal = Do coronal slice order [-orient RSA]\n" 00053 " -axial = Do axial slice order [-orient RAI]\n" 00054 " This is the default AFNI axial order, and\n" 00055 " is the one currently required by the\n" 00056 " volume rendering plugin; this is also\n" 00057 " the default orientation output by this\n" 00058 " program (hence the program's name).\n" 00059 "\n" 00060 " -orient code = Orientation code for output.\n" 00061 " The code must be 3 letters, one each from the\n" 00062 " pairs {R,L} {A,P} {I,S}. The first letter gives\n" 00063 " the orientation of the x-axis, the second the\n" 00064 " orientation of the y-axis, the third the z-axis:\n" 00065 " R = Right-to-left L = Left-to-right\n" 00066 " A = Anterior-to-posterior P = Posterior-to-anterior\n" 00067 " I = Inferior-to-superior S = Superior-to-inferior\n" 00068 " If you give an illegal code (e.g., 'LPR'), then\n" 00069 " the program will print a message and stop.\n" 00070 " N.B.: 'Neurological order' is -orient LPI\n" 00071 ) ; 00072 00073 printf("\n" MASTER_SHORTHELP_STRING ) ; 00074 exit(0) ; 00075 } 00076 00077 mainENTRY("3daxialize main"); machdep(); AFNI_logger("3daxialize",argc,argv); 00078 PRINT_VERSION("3daxialize") ; 00079 00080 /*- scan options -*/ 00081 00082 iarg = 1 ; 00083 while( argv[iarg][0] == '-' ){ 00084 00085 if( strcmp(argv[iarg],"-orient") == 0 ){ /* 07 Dec 2001 */ 00086 int xx,yy,zz ; 00087 MCW_strncpy(orients,argv[++iarg],4) ; 00088 if( strlen(orients) != 3 ){ 00089 fprintf(stderr,"** Bad code after -orient: not 3 characters long\n"); 00090 exit(1); 00091 } 00092 xx = ORCODE(orients[0]) ; 00093 yy = ORCODE(orients[1]) ; zz = ORCODE(orients[2]) ; 00094 if( xx < 0 || yy < 0 || zz < 0 ){ 00095 fprintf(stderr,"** Bad code after -orient: illegal characters\n"); 00096 exit(1); 00097 } 00098 if( !OR3OK(xx,yy,zz) ){ 00099 fprintf(stderr,"** Bad code after -orient: dependent axes\n"); 00100 exit(1); 00101 } 00102 axord = -1 ; iarg++ ; continue ; 00103 } 00104 00105 if( strcmp(argv[iarg],"-axial") == 0 ){ /* 06 Mar 2000 */ 00106 axord = 0 ; iarg++ ; continue ; 00107 } 00108 00109 if( strcmp(argv[iarg],"-sagittal") == 0 ){ /* 06 Mar 2000 */ 00110 axord = 1 ; iarg++ ; continue ; 00111 } 00112 00113 if( strcmp(argv[iarg],"-coronal") == 0 ){ /* 06 Mar 2000 */ 00114 axord = 2 ; iarg++ ; continue ; 00115 } 00116 00117 if( strcmp(argv[iarg],"-prefix") == 0 ){ 00118 strcpy( new_prefix , argv[++iarg] ) ; 00119 if( !THD_filename_ok(new_prefix) ){ 00120 fprintf(stderr,"** illegal new prefix: %s\n",new_prefix); exit(1); 00121 } 00122 iarg++ ; continue ; 00123 } 00124 00125 if( strncmp(argv[iarg],"-verbose",5) == 0 ){ 00126 verbose++ ; iarg++ ; continue ; 00127 } 00128 00129 fprintf(stderr,"** Unknown option: %s\n",argv[iarg]); exit(1); 00130 } 00131 00132 /*- get input dataset -*/ 00133 00134 old_dset = THD_open_dataset( argv[iarg] ) ; 00135 if( old_dset == NULL ){ 00136 fprintf(stderr,"** can't open input dataset: %s\n",argv[iarg]) ; exit(1) ; 00137 } 00138 00139 if( verbose ) printf("++ Loading input dataset %s\n",argv[iarg]) ; 00140 00141 DSET_load(old_dset) ; 00142 if( !DSET_LOADED(old_dset) ){ 00143 fprintf(stderr,"** can't load input .BRIK: %s\n",argv[iarg]); exit(1); 00144 } 00145 00146 /*- setup output dataset -*/ 00147 00148 /* use FD bricks for axial, sagittal, coronal displays as basis */ 00149 00150 if( axord >= 0 ){ 00151 fbr = THD_setup_bricks( old_dset ) ; brax = fbr[axord] ; 00152 } else { 00153 brax = THD_oriented_brick( old_dset , orients ) ; 00154 if( brax == NULL ){ 00155 fprintf(stderr,"** Can't use -orient code: %s\n",orients); exit(1); 00156 } 00157 } 00158 00159 new_dset = EDIT_empty_copy( old_dset ) ; 00160 00161 tross_Copy_History( old_dset , new_dset ) ; 00162 tross_Make_History( "3daxialize" , argc,argv , new_dset ) ; 00163 00164 /* number of points along each axis */ 00165 00166 LOAD_IVEC3( iv_nxyz , brax->n1 , brax->n2 , brax->n3 ) ; 00167 00168 /* orientation codes for each axis */ 00169 00170 switch( axord ){ /* 06 Mar 2000 */ 00171 00172 case -1:{ 00173 int xx=ORCODE(orients[0]) , 00174 yy=ORCODE(orients[1]) , zz=ORCODE(orients[2]) ; 00175 00176 LOAD_IVEC3( iv_xyzorient , xx,yy,zz ) ; 00177 } 00178 break ; 00179 00180 case 0: 00181 LOAD_IVEC3( iv_xyzorient, ORI_R2L_TYPE, ORI_A2P_TYPE, ORI_I2S_TYPE ) ; 00182 break ; 00183 00184 case 1: 00185 LOAD_IVEC3( iv_xyzorient, ORI_A2P_TYPE, ORI_S2I_TYPE, ORI_L2R_TYPE ) ; 00186 break ; 00187 00188 case 2: 00189 LOAD_IVEC3( iv_xyzorient, ORI_R2L_TYPE, ORI_S2I_TYPE, ORI_A2P_TYPE ) ; 00190 break ; 00191 } 00192 00193 /* grid spacing for each axis */ 00194 00195 LOAD_FVEC3( fv_xyzdel , 00196 ORIENT_sign[iv_xyzorient.ijk[0]]=='+' ? brax->del1 : -brax->del1, 00197 ORIENT_sign[iv_xyzorient.ijk[1]]=='+' ? brax->del2 : -brax->del2, 00198 ORIENT_sign[iv_xyzorient.ijk[2]]=='+' ? brax->del3 : -brax->del3); 00199 00200 UNLOAD_IVEC3( brax->a123 , a1,a2,a3 ) ; 00201 aa1 = abs(a1) ; aa2 = abs(a2) ; aa3 = abs(a3) ; 00202 xyz_org[1] = new_dset->daxes->xxorg ; xyz_del[1] = new_dset->daxes->xxdel ; 00203 xyz_org[2] = new_dset->daxes->yyorg ; xyz_del[2] = new_dset->daxes->yydel ; 00204 xyz_org[3] = new_dset->daxes->zzorg ; xyz_del[3] = new_dset->daxes->zzdel ; 00205 LOAD_FVEC3( fv_xyzorg , 00206 (a1 > 0) ? xyz_org[aa1] : xyz_org[aa1]+(brax->n1-1)*xyz_del[aa1], 00207 (a2 > 0) ? xyz_org[aa2] : xyz_org[aa2]+(brax->n2-1)*xyz_del[aa2], 00208 (a3 > 0) ? xyz_org[aa3] : xyz_org[aa3]+(brax->n3-1)*xyz_del[aa3] ); 00209 00210 EDIT_dset_items( new_dset , 00211 ADN_nxyz , iv_nxyz , 00212 ADN_xyzdel , fv_xyzdel , 00213 ADN_xyzorg , fv_xyzorg , 00214 ADN_xyzorient , iv_xyzorient , 00215 ADN_prefix , new_prefix , 00216 ADN_none ) ; 00217 00218 if( DSET_NUM_TTOFF(new_dset) > 0 ) 00219 EDIT_dset_items( new_dset , ADN_nsl , 0 , ADN_none ) ; /* 28 Apr 1999 */ 00220 00221 /*- prepare to write new dataset -*/ 00222 00223 new_dblk = new_dset->dblk ; 00224 old_dblk = old_dset->dblk ; 00225 00226 cmode = THD_get_write_compression() ; 00227 far = COMPRESS_fopen_write( new_dblk->diskptr->brick_name, cmode ) ; 00228 npix = brax->n1 * brax->n2 ; 00229 00230 /*- get slices from input, write to disk -*/ 00231 00232 if( verbose ){ 00233 printf("++ Writing new dataset .BRIK"); fflush(stdout); 00234 pim = brax->n3 / 5 ; if( pim <= 1 ) pim = 2 ; 00235 } 00236 00237 native_order = mri_short_order() ; /* 23 Nov 1999 */ 00238 save_order = (DSET_BYTEORDER(new_dset) > 0) ? DSET_BYTEORDER(new_dset) 00239 : THD_get_write_order() ; 00240 00241 for( nim=ival=0 ; ival < DSET_NVALS(old_dset) ; ival++ ){ 00242 brfac_save = DBLK_BRICK_FACTOR(new_dblk,ival) ; 00243 DBLK_BRICK_FACTOR(new_dblk,ival) = 0.0 ; 00244 DBLK_BRICK_FACTOR(old_dblk,ival) = 0.0 ; 00245 dsiz = mri_datum_size( DSET_BRICK_TYPE(new_dset,ival) ) ; 00246 for( kk=0 ; kk < brax->n3 ; kk++ ){ 00247 im = FD_warp_to_mri( kk , ival , brax ) ; 00248 imar = mri_data_pointer(im) ; 00249 if( save_order != native_order ){ /* 23 Nov 1999 */ 00250 switch( im->kind ){ 00251 case MRI_short: mri_swap2( npix,imar) ; break ; 00252 case MRI_float: 00253 case MRI_int: mri_swap4( npix,imar) ; break ; 00254 case MRI_complex: mri_swap4(2*npix,imar) ; break ; 00255 } 00256 } 00257 code = fwrite( imar , dsiz , npix , far ) ; 00258 mri_free(im) ; 00259 00260 if( verbose && (++nim)%pim == 1 ){ printf("."); fflush(stdout); } 00261 } 00262 DBLK_BRICK_FACTOR(new_dblk,ival) = brfac_save ; 00263 DSET_unload_one(old_dset,ival) ; 00264 00265 if( verbose ){ printf("!"); fflush(stdout); } 00266 } 00267 COMPRESS_fclose(far) ; 00268 if( verbose ){ printf("\n") ; fflush(stdout); } 00269 00270 DSET_unload( old_dset ) ; 00271 00272 /*- do the output header -*/ 00273 00274 DSET_load( new_dset ) ; THD_load_statistics( new_dset ) ; 00275 THD_write_3dim_dataset( NULL,NULL , new_dset , False ) ; 00276 if( verbose ) fprintf(stderr,"++ Wrote new dataset: %s\n",DSET_BRIKNAME(new_dset)) ; 00277 00278 exit(0) ; 00279 } |