Doxygen Source Code Documentation
thd_fdbrick.c File Reference
#include "mrilib.h"#include "thd.h"Go to the source code of this file.
Functions | |
| FD_brick ** | THD_setup_bricks (THD_3dim_dataset *dset) |
| FD_brick * | THD_oriented_brick (THD_3dim_dataset *dset, char *orients) |
| FD_brick * | THD_3dim_dataset_to_brick (THD_3dim_dataset *dset, int ax_1, int ax_2, int ax_3) |
Function Documentation
|
||||||||||||||||||||
|
Definition at line 194 of file thd_fdbrick.c. References FD_brick::a123, abs, CURRENT_DAXES, FD_brick::d1, FD_brick::d2, FD_brick::d3, FD_brick::del1, FD_brick::del2, FD_brick::del3, FD_brick::dset, FD_brick::e1, FD_brick::e2, ISVALID_3DIM_DATASET, LOAD_IVEC3, myXtNew, FD_brick::n1, FD_brick::n2, FD_brick::n3, FD_brick::namecode, THD_dataxes::nxx, FD_brick::nxyz, THD_dataxes::nyy, nz, THD_dataxes::nzz, FD_brick::parent, FD_brick::resam_code, RESAM_NN_TYPE, FD_brick::start, FD_brick::sxyz, FD_brick::thr_resam_code, THD_dataxes::xxdel, THD_dataxes::xxorg, THD_dataxes::yydel, THD_dataxes::yyorg, THD_dataxes::zzdel, and THD_dataxes::zzorg. Referenced by T3D_open_view_CB(), THD_oriented_brick(), and THD_setup_bricks().
00196 {
00197 FD_brick * br ; /* will be output */
00198 THD_dataxes * daxes ; /* connection to actual axes */
00199
00200 int xyz_dim[4] , xyz_stp[4] , xyz_dir[4] ;
00201 float xyz_del[4] , xyz_org[4] ;
00202
00203 int x_dir,y_dir,z_dir , sx,sy,sz , aax_1,aax_2,aax_3 , nx,ny,nz ;
00204
00205 /*-- sanity check --*/
00206
00207 if( ! ISVALID_3DIM_DATASET(dset) ) return NULL ;
00208
00209 daxes = CURRENT_DAXES(dset) ;
00210
00211 aax_1 = abs(ax_1) ; /* which axes, regardless of + or - */
00212 aax_2 = abs(ax_2) ;
00213 aax_3 = abs(ax_3) ;
00214
00215 if( aax_1 < 1 || aax_1 > 3 || /* range checks */
00216 aax_2 < 1 || aax_2 > 3 ||
00217 aax_3 < 1 || aax_3 > 3 ) return NULL ;
00218
00219 xyz_dir[1] = xyz_dir[2] = xyz_dir[3] = 0 ;
00220
00221 xyz_dir[aax_1] = ax_1 ; /* assign to original directions */
00222 xyz_dir[aax_2] = ax_2 ;
00223 xyz_dir[aax_3] = ax_3 ;
00224
00225 x_dir = xyz_dir[1] ; /* if any |ax_n| is duplicated */
00226 y_dir = xyz_dir[2] ; /* then one of these will end */
00227 z_dir = xyz_dir[3] ; /* up as zero --> bad inputs! */
00228
00229 if( x_dir == 0 || y_dir == 0 || z_dir == 0 ) return NULL ;
00230
00231 /*-- the inputs are good, so create a brick: --*/
00232
00233 br = myXtNew(FD_brick) ; /* new brick */
00234 br->dset = dset ; /* dataset */
00235 br->resam_code = RESAM_NN_TYPE ; /* crudest type */
00236 br->parent = NULL ;
00237
00238 br->thr_resam_code = RESAM_NN_TYPE ; /* 09 Dec 1997 */
00239
00240 /*-- at this point, x_dir is +1 or -1, y_dir is +2 or -2, etc. --*/
00241
00242 nx = daxes->nxx ; ny = daxes->nyy ; nz = daxes->nzz ;
00243
00244 sx = (x_dir > 0) ? (0) : (nx-1) ; /* starting voxel indices */
00245 sy = (y_dir > 0) ? (0) : (ny-1) ; /* for each original dimension */
00246 sz = (z_dir > 0) ? (0) : (nz-1) ;
00247
00248 br->start = sx + sy*nx + sz*nx*ny ; /* overall starting voxel index */
00249
00250 /*-- assign original dimensions to arrays,
00251 then pick out the permuted dimensions --*/
00252
00253 xyz_dim[1] = nx ; /* dimensions */
00254 xyz_dim[2] = ny ;
00255 xyz_dim[3] = nz ;
00256
00257 LOAD_IVEC3( br->nxyz , nx,ny,nz ) ; /* save stuff in br */
00258 LOAD_IVEC3( br->sxyz , sx,sy,sz ) ;
00259 LOAD_IVEC3( br->a123 , ax_1,ax_2,ax_3 ) ;
00260
00261 xyz_stp[1] = 1 ; /* index step sizes */
00262 xyz_stp[2] = nx ;
00263 xyz_stp[3] = nx * ny ;
00264
00265 xyz_del[1] = daxes->xxdel ; /* voxel physical step sizes (mm) */
00266 xyz_del[2] = daxes->yydel ;
00267 xyz_del[3] = daxes->zzdel ;
00268
00269 xyz_org[1] = daxes->xxorg ; /* voxel origins (mm) */
00270 xyz_org[2] = daxes->yyorg ;
00271 xyz_org[3] = daxes->zzorg ;
00272
00273 br->n1 = xyz_dim[aax_1] ; /* permute dimensions, etc. */
00274 br->n2 = xyz_dim[aax_2] ;
00275 br->n3 = xyz_dim[aax_3] ;
00276
00277 br->d1 = (ax_1 > 0) ? (xyz_stp[aax_1]) : (-xyz_stp[aax_1]) ;
00278 br->d2 = (ax_2 > 0) ? (xyz_stp[aax_2]) : (-xyz_stp[aax_2]) ;
00279 br->d3 = (ax_3 > 0) ? (xyz_stp[aax_3]) : (-xyz_stp[aax_3]) ;
00280
00281 br->e1 = br->n1 * br->d1 ; /* last indices for readout */
00282 br->e2 = br->n2 * br->d2 ;
00283
00284 br->del1 = fabs(xyz_del[aax_1]) ; /* dimensions */
00285 br->del2 = fabs(xyz_del[aax_2]) ;
00286 br->del3 = fabs(xyz_del[aax_3]) ;
00287
00288 br->namecode[0] = '\0' ;
00289
00290 return br ;
00291 }
|
|
||||||||||||
|
Definition at line 97 of file thd_fdbrick.c. References CURRENT_DAXES, ENTRY, ISVALID_DATAXES, ISVALID_DSET, OR3OK, ORCODE, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, RETURN, THD_3dim_dataset_to_brick(), THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by main(), r_new_resam_dset(), and RCREND_reload_dataset().
00098 {
00099 int r2l=0 , a2p=0 , i2s=0 , xx,yy,zz , pp=0,qq=0,rr=0 ;
00100 THD_dataxes *daxes ;
00101 FD_brick *br ;
00102
00103 ENTRY("THD_oriented_brick") ;
00104
00105 if( !ISVALID_DSET(dset) ||
00106 orients == NULL ||
00107 strlen(orients) < 3 ) RETURN(NULL) ;
00108
00109 daxes = CURRENT_DAXES(dset) ;
00110 if( !ISVALID_DATAXES(daxes) ) RETURN(NULL) ;
00111
00112 xx = ORCODE( orients[0] ) ;
00113 yy = ORCODE( orients[1] ) ;
00114 zz = ORCODE( orients[2] ) ;
00115 if( !OR3OK(xx,yy,zz) ) RETURN(NULL) ;
00116
00117 /*----- create FD_bricks for viewing purposes -----*/
00118
00119 switch( daxes->xxorient ){
00120 case ORI_R2L_TYPE: r2l = 1 ; break ;
00121 case ORI_L2R_TYPE: r2l = -1 ; break ;
00122 case ORI_P2A_TYPE: a2p = -1 ; break ;
00123 case ORI_A2P_TYPE: a2p = 1 ; break ;
00124 case ORI_I2S_TYPE: i2s = 1 ; break ;
00125 case ORI_S2I_TYPE: i2s = -1 ; break ;
00126 }
00127
00128 switch( daxes->yyorient ){
00129 case ORI_R2L_TYPE: r2l = 2 ; break ;
00130 case ORI_L2R_TYPE: r2l = -2 ; break ;
00131 case ORI_P2A_TYPE: a2p = -2 ; break ;
00132 case ORI_A2P_TYPE: a2p = 2 ; break ;
00133 case ORI_I2S_TYPE: i2s = 2 ; break ;
00134 case ORI_S2I_TYPE: i2s = -2 ; break ;
00135 }
00136
00137 switch( daxes->zzorient ){
00138 case ORI_R2L_TYPE: r2l = 3 ; break ;
00139 case ORI_L2R_TYPE: r2l = -3 ; break ;
00140 case ORI_P2A_TYPE: a2p = -3 ; break ;
00141 case ORI_A2P_TYPE: a2p = 3 ; break ;
00142 case ORI_I2S_TYPE: i2s = 3 ; break ;
00143 case ORI_S2I_TYPE: i2s = -3 ; break ;
00144 }
00145
00146 if( r2l==0 || a2p==0 || i2s==0 ) RETURN(NULL) ;
00147
00148 switch( xx ){
00149 case ORI_R2L_TYPE: pp = r2l ; break ;
00150 case ORI_L2R_TYPE: pp = -r2l ; break ;
00151 case ORI_P2A_TYPE: pp = -a2p ; break ;
00152 case ORI_A2P_TYPE: pp = a2p ; break ;
00153 case ORI_I2S_TYPE: pp = i2s ; break ;
00154 case ORI_S2I_TYPE: pp = -i2s ; break ;
00155 }
00156
00157 switch( yy ){
00158 case ORI_R2L_TYPE: qq = r2l ; break ;
00159 case ORI_L2R_TYPE: qq = -r2l ; break ;
00160 case ORI_P2A_TYPE: qq = -a2p ; break ;
00161 case ORI_A2P_TYPE: qq = a2p ; break ;
00162 case ORI_I2S_TYPE: qq = i2s ; break ;
00163 case ORI_S2I_TYPE: qq = -i2s ; break ;
00164 }
00165
00166 switch( zz ){
00167 case ORI_R2L_TYPE: rr = r2l ; break ;
00168 case ORI_L2R_TYPE: rr = -r2l ; break ;
00169 case ORI_P2A_TYPE: rr = -a2p ; break ;
00170 case ORI_A2P_TYPE: rr = a2p ; break ;
00171 case ORI_I2S_TYPE: rr = i2s ; break ;
00172 case ORI_S2I_TYPE: rr = -i2s ; break ;
00173 }
00174
00175 if( pp==0 || qq==0 || rr==0 ) RETURN(NULL) ;
00176
00177 br = THD_3dim_dataset_to_brick(dset,pp,qq,rr) ;
00178 RETURN(br) ;
00179 }
|
|
|
Definition at line 20 of file thd_fdbrick.c. References CURRENT_DAXES, ISVALID_3DIM_DATASET, ISVALID_DATAXES, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, THD_3dim_dataset_to_brick(), THD_FATAL_ERROR, XtMalloc, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by AFNI_setup_viewing(), and main().
00021 {
00022 int r2l=0 , a2p=0 , i2s=0 ;
00023 THD_dataxes * daxes ;
00024 FD_brick ** br ;
00025
00026 if( ! ISVALID_3DIM_DATASET(dset) ) return NULL ;
00027
00028 daxes = CURRENT_DAXES(dset) ;
00029 if( ! ISVALID_DATAXES(daxes) ) return NULL ;
00030
00031 /*----- create FD_bricks for viewing purposes -----*/
00032
00033 switch( daxes->xxorient ){
00034 case ORI_R2L_TYPE: r2l = 1 ; break ;
00035 case ORI_L2R_TYPE: r2l = -1 ; break ;
00036 case ORI_P2A_TYPE: a2p = -1 ; break ;
00037 case ORI_A2P_TYPE: a2p = 1 ; break ;
00038 case ORI_I2S_TYPE: i2s = 1 ; break ;
00039 case ORI_S2I_TYPE: i2s = -1 ; break ;
00040 }
00041
00042 switch( daxes->yyorient ){
00043 case ORI_R2L_TYPE: r2l = 2 ; break ;
00044 case ORI_L2R_TYPE: r2l = -2 ; break ;
00045 case ORI_P2A_TYPE: a2p = -2 ; break ;
00046 case ORI_A2P_TYPE: a2p = 2 ; break ;
00047 case ORI_I2S_TYPE: i2s = 2 ; break ;
00048 case ORI_S2I_TYPE: i2s = -2 ; break ;
00049 }
00050
00051 switch( daxes->zzorient ){
00052 case ORI_R2L_TYPE: r2l = 3 ; break ;
00053 case ORI_L2R_TYPE: r2l = -3 ; break ;
00054 case ORI_P2A_TYPE: a2p = -3 ; break ;
00055 case ORI_A2P_TYPE: a2p = 3 ; break ;
00056 case ORI_I2S_TYPE: i2s = 3 ; break ;
00057 case ORI_S2I_TYPE: i2s = -3 ; break ;
00058 }
00059
00060 if( r2l==0 || a2p==0 || i2s==0 ){
00061 char buf[256] ;
00062 sprintf(buf,"Illegal orientation codes: %d %d %d",
00063 daxes->xxorient,daxes->yyorient,daxes->zzorient ) ;
00064 THD_FATAL_ERROR(buf) ;
00065 }
00066
00067 /* now we can set up views: axial, sagittal, coronal;
00068 the top option is the way I think it ought to be, so that
00069 in the axial and coronal views, left is left and right is right;
00070 the bottom options are the radiologists conventions, so sue me! */
00071
00072 br = (FD_brick **) XtMalloc( sizeof(FD_brick *) * 3 ) ;
00073
00074 #undef LEFT_IS_LEFT
00075 #ifdef LEFT_IS_LEFT
00076 br[0] = THD_3dim_dataset_to_brick(dset,-r2l, a2p,-i2s); /* axi */
00077 br[1] = THD_3dim_dataset_to_brick(dset, a2p,-i2s,-r2l); /* sag */
00078 br[2] = THD_3dim_dataset_to_brick(dset,-r2l,-i2s,-a2p); /* cor */
00079 #else
00080 br[0] = THD_3dim_dataset_to_brick(dset, r2l, a2p, i2s); /* axi */
00081 br[1] = THD_3dim_dataset_to_brick(dset, a2p,-i2s,-r2l); /* sag */
00082 br[2] = THD_3dim_dataset_to_brick(dset, r2l,-i2s, a2p); /* cor */
00083 #endif
00084
00085 strcpy( br[0]->namecode , "Axial" ) ;
00086 strcpy( br[1]->namecode , "Sagittal" ) ;
00087 strcpy( br[2]->namecode , "Coronal" ) ;
00088
00089 return br ;
00090 }
|