Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
thd_fdbrick.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "mrilib.h"
00008 #include "thd.h"
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 FD_brick ** THD_setup_bricks( THD_3dim_dataset * dset )
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
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
00068
00069
00070
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);
00077 br[1] = THD_3dim_dataset_to_brick(dset, a2p,-i2s,-r2l);
00078 br[2] = THD_3dim_dataset_to_brick(dset,-r2l,-i2s,-a2p);
00079 #else
00080 br[0] = THD_3dim_dataset_to_brick(dset, r2l, a2p, i2s);
00081 br[1] = THD_3dim_dataset_to_brick(dset, a2p,-i2s,-r2l);
00082 br[2] = THD_3dim_dataset_to_brick(dset, r2l,-i2s, a2p);
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 }
00091
00092
00093
00094
00095
00096
00097 FD_brick * THD_oriented_brick( THD_3dim_dataset *dset , char *orients )
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
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 }
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 FD_brick * THD_3dim_dataset_to_brick( THD_3dim_dataset * dset ,
00195 int ax_1, int ax_2, int ax_3 )
00196 {
00197 FD_brick * br ;
00198 THD_dataxes * daxes ;
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
00206
00207 if( ! ISVALID_3DIM_DATASET(dset) ) return NULL ;
00208
00209 daxes = CURRENT_DAXES(dset) ;
00210
00211 aax_1 = abs(ax_1) ;
00212 aax_2 = abs(ax_2) ;
00213 aax_3 = abs(ax_3) ;
00214
00215 if( aax_1 < 1 || aax_1 > 3 ||
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 ;
00222 xyz_dir[aax_2] = ax_2 ;
00223 xyz_dir[aax_3] = ax_3 ;
00224
00225 x_dir = xyz_dir[1] ;
00226 y_dir = xyz_dir[2] ;
00227 z_dir = xyz_dir[3] ;
00228
00229 if( x_dir == 0 || y_dir == 0 || z_dir == 0 ) return NULL ;
00230
00231
00232
00233 br = myXtNew(FD_brick) ;
00234 br->dset = dset ;
00235 br->resam_code = RESAM_NN_TYPE ;
00236 br->parent = NULL ;
00237
00238 br->thr_resam_code = RESAM_NN_TYPE ;
00239
00240
00241
00242 nx = daxes->nxx ; ny = daxes->nyy ; nz = daxes->nzz ;
00243
00244 sx = (x_dir > 0) ? (0) : (nx-1) ;
00245 sy = (y_dir > 0) ? (0) : (ny-1) ;
00246 sz = (z_dir > 0) ? (0) : (nz-1) ;
00247
00248 br->start = sx + sy*nx + sz*nx*ny ;
00249
00250
00251
00252
00253 xyz_dim[1] = nx ;
00254 xyz_dim[2] = ny ;
00255 xyz_dim[3] = nz ;
00256
00257 LOAD_IVEC3( br->nxyz , nx,ny,nz ) ;
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 ;
00262 xyz_stp[2] = nx ;
00263 xyz_stp[3] = nx * ny ;
00264
00265 xyz_del[1] = daxes->xxdel ;
00266 xyz_del[2] = daxes->yydel ;
00267 xyz_del[3] = daxes->zzdel ;
00268
00269 xyz_org[1] = daxes->xxorg ;
00270 xyz_org[2] = daxes->yyorg ;
00271 xyz_org[3] = daxes->zzorg ;
00272
00273 br->n1 = xyz_dim[aax_1] ;
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 ;
00282 br->e2 = br->n2 * br->d2 ;
00283
00284 br->del1 = fabs(xyz_del[aax_1]) ;
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 }