Doxygen Source Code Documentation
thd_warps.c File Reference
#include "mrilib.h"#include "thd.h"Go to the source code of this file.
| Defines | |
| #define | do_nothing(iii) | 
| Functions | |
| THD_warp * | AFNI_make_voxwarp (THD_warp *inwarp, THD_3dim_dataset *old_dset, THD_3dim_dataset *new_dset) | 
| THD_linear_mapping * | AFNI_make_voxmap (THD_linear_mapping *inmap, THD_dataxes *old_daxes, THD_dataxes *new_daxes) | 
| void | AFNI_concatenate_warp (THD_warp *warp_in, THD_warp *warp_prior) | 
| THD_linear_mapping * | AFNI_concatenate_lmap (THD_linear_mapping *map_2, THD_linear_mapping *map_1) | 
| THD_warp * | AFNI_make_affwarp_12 (float a11, float a12, float a13, float s1, float a21, float a22, float a23, float s2, float a31, float a32, float a33, float s3) | 
| THD_warp * | AFNI_make_affwarp_mat (THD_mat33 mmm) | 
| THD_warp * | AFNI_make_affwarp_matvec (THD_mat33 mmm, THD_fvec3 vvv) | 
Define Documentation
| 
 | 
| 
 Definition at line 85 of file thd_warps.c. Referenced by AFNI_make_voxmap(). | 
Function Documentation
| 
 | ||||||||||||
| 
 Definition at line 265 of file thd_warps.c. References ADD_FVEC3, THD_linear_mapping::bot, THD_linear_mapping::bvec, MAPPING_LINEAR_TYPE, MAT_INV, MAT_MUL, MATVEC, THD_linear_mapping::mbac, THD_linear_mapping::mfor, myXtNew, NEGATE_FVEC3, THD_linear_mapping::svec, THD_linear_mapping::top, and THD_linear_mapping::type. Referenced by AFNI_concatenate_warp(). 
 00267 {
00268    THD_linear_mapping * map_out ;
00269    THD_fvec3 tvec ;
00270 
00271    /* make a new linear mapping */
00272 
00273    map_out = myXtNew(THD_linear_mapping) ;
00274    map_out->type = MAPPING_LINEAR_TYPE ;
00275 
00276    /* matrix */
00277 
00278    map_out->mfor = MAT_MUL( map_2->mfor , map_1->mfor ) ;
00279    map_out->mbac = MAT_INV( map_out->mfor ) ;
00280 
00281    /* vector */
00282 
00283    tvec          = MATVEC( map_2->mfor , map_1->bvec ) ;
00284    map_out->bvec = ADD_FVEC3( tvec , map_2->bvec ) ;
00285    map_out->svec = MATVEC( map_out->mbac , map_out->bvec ) ;
00286    NEGATE_FVEC3(map_out->svec) ;
00287 
00288    map_out->bot  = map_2->bot ;
00289    map_out->top  = map_2->top ;
00290 
00291    return map_out ;
00292 }
 | 
| 
 | ||||||||||||
| 
 Definition at line 193 of file thd_warps.c. References AFNI_concatenate_lmap(), myXtFree, myXtNew, THD_warp::rig_bod, THD_warp::tal_12, THD_talairach_12_warp::type, THD_warp::type, THD_talairach_12_warp::warp, THD_affine_warp::warp, WARP_AFFINE_TYPE, and WARP_TALAIRACH_12_TYPE. Referenced by adwarp_follower_dataset(), AFNI_follower_dataset(), AFNI_init_warp(), and THD_init_session(). 
 00194 {
00195    THD_linear_mapping * prior_map , * new_map ;
00196 
00197    if( warp_in == NULL || warp_prior == NULL ) return ;
00198 
00199    switch( warp_in->type + 100*warp_prior->type ){
00200 
00201       default:
00202          warp_in->type = -1 ;  /* set error flag! */
00203          return ;
00204 
00205       /*-- 2 affine warps ==> a new affine warp --*/
00206 
00207       case WARP_AFFINE_TYPE + 100*WARP_AFFINE_TYPE:{
00208          prior_map = &(warp_prior->rig_bod.warp) ;
00209          new_map = AFNI_concatenate_lmap(
00210                       &(warp_in->rig_bod.warp) , prior_map ) ;
00211 
00212          warp_in->rig_bod.warp = *new_map ;  /* write over input warp */
00213          myXtFree( new_map ) ;
00214       }
00215       break ;
00216 
00217       /*--- Talairach preceeded by affine ==> new Talairach --*/
00218 
00219       case WARP_TALAIRACH_12_TYPE + 100*WARP_AFFINE_TYPE:{
00220          int iw ;
00221          prior_map = &(warp_prior->rig_bod.warp) ;
00222          for( iw=0 ; iw < 12 ; iw++ ){
00223 
00224             new_map = AFNI_concatenate_lmap(
00225                          &(warp_in->tal_12.warp[iw]) , prior_map ) ;
00226 
00227             warp_in->tal_12.warp[iw] = *new_map ;  /* write over input warp */
00228             myXtFree( new_map ) ;
00229          }
00230       }
00231       break ;
00232 
00233       /*-- affine preceeded by Talairach ==> new Talairach
00234            [this case is not currently used, since there are no warps
00235             AFTER a Talairach warp, but it may be useful in the future]
00236                                         -- RWCox, November 1994 A.D. --*/
00237 
00238       case WARP_AFFINE_TYPE + 100*WARP_TALAIRACH_12_TYPE:{
00239          int iw ;
00240          THD_talairach_12_warp * new_warp = myXtNew( THD_talairach_12_warp ) ;
00241 
00242          new_warp->type = WARP_TALAIRACH_12_TYPE ;
00243          for( iw=0 ; iw < 12 ; iw++ ){
00244             prior_map = &(warp_prior->tal_12.warp[iw]) ;
00245             new_map   = AFNI_concatenate_lmap(
00246                           &(warp_in->rig_bod.warp) , prior_map ) ;
00247             new_warp->warp[iw] = *new_map ;
00248             myXtFree( new_map ) ;
00249          }
00250 
00251          warp_in->tal_12 = *new_warp ;  /* write over input warp */
00252          myXtFree( new_warp ) ;
00253       }
00254       break ;
00255 
00256    }  /* end of switch on warp types */
00257 
00258    return ;
00259 }
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Make an affine warp from 12 input numbers: 
 Definition at line 303 of file thd_warps.c. References THD_linear_mapping::bvec, LOAD_FVEC3, LOAD_INVERSE_LMAP, LOAD_MAT, MAPPING_LINEAR_TYPE, MAT_DET, MAT_FNORM, THD_linear_mapping::mfor, myXtNew, THD_warp::rig_bod, s2, THD_linear_mapping::type, THD_warp::type, THD_affine_warp::warp, and WARP_AFFINE_TYPE. Referenced by AFNI_make_affwarp_mat(), AFNI_make_affwarp_matvec(), and THD_init_session(). 
 00306 {
00307    THD_warp *warp ;
00308    THD_linear_mapping map ;
00309    float dd , nn ;
00310 
00311    warp       = myXtNew( THD_warp ) ;
00312    warp->type = WARP_AFFINE_TYPE ;
00313 
00314    map.type = MAPPING_LINEAR_TYPE ;
00315 
00316    LOAD_MAT(map.mfor,a11,a12,a13,a21,a22,a23,a31,a32,a33) ;
00317    dd = MAT_DET(map.mfor) ; nn = MAT_FNORM(map.mfor) ;
00318    if( fabs(dd) < 1.e-5*nn*nn*nn ) return NULL ;  /* bad input */
00319    LOAD_FVEC3(map.bvec,-s1,-s2,-s3) ;
00320    LOAD_INVERSE_LMAP(map) ;
00321 
00322    warp->rig_bod.warp = map ;
00323 
00324    return warp ;
00325 }
 | 
| 
 | 
| 
 Definition at line 329 of file thd_warps.c. References AFNI_make_affwarp_12(), THD_mat33::mat, and mmm. Referenced by THD_init_session(). 
 | 
| 
 | ||||||||||||
| 
 Definition at line 338 of file thd_warps.c. References AFNI_make_affwarp_12(), THD_mat33::mat, mmm, and THD_fvec3::xyz. 
 | 
| 
 | ||||||||||||||||
| 
 Definition at line 107 of file thd_warps.c. References ADD_FVEC3, THD_linear_mapping::bvec, do_nothing, LOAD_DIAG_MAT, LOAD_FVEC3, MAPPING_LINEAR_TYPE, MAT_INV, MAT_MUL, MATVEC, THD_linear_mapping::mbac, THD_linear_mapping::mfor, myXtNew, NEGATE_FVEC3, SUB_FVEC3, THD_linear_mapping::svec, THD_dataxes::to_dicomm, TRANSPOSE_MAT, THD_linear_mapping::type, THD_dataxes::xxdel, THD_dataxes::xxorg, THD_dataxes::yydel, THD_dataxes::yyorg, THD_dataxes::zzdel, and THD_dataxes::zzorg. Referenced by AFNI_make_voxwarp(). 
 00110 {
00111    THD_mat33 old_scale , old_3dmm_to_dicomm ,
00112              dd_trans  , new_scale , new_dicomm_to_3dmm ,
00113              mt ; /* temp matrix */
00114 
00115    THD_fvec3 dd_base , new_origin , old_origin , vt0,vt1,vt2 ;
00116 
00117    THD_linear_mapping * newmap ;
00118 
00119    /*--- set up the elements of the transformation ---*/
00120 
00121    dd_trans = inmap->mfor ;
00122 
00123    LOAD_DIAG_MAT( old_scale , old_daxes->xxdel ,
00124                               old_daxes->yydel ,
00125                               old_daxes->zzdel  ) ;
00126 
00127    LOAD_DIAG_MAT( new_scale , 1.0/new_daxes->xxdel ,     /* notice */
00128                               1.0/new_daxes->yydel ,     /* inversion */
00129                               1.0/new_daxes->zzdel  ) ;
00130 
00131    old_3dmm_to_dicomm = old_daxes->to_dicomm ;
00132    new_dicomm_to_3dmm = TRANSPOSE_MAT(new_daxes->to_dicomm) ; /* inversion */
00133 
00134    /* vector elements */
00135 
00136    dd_base = inmap->bvec ;                        /* in new dicomm */
00137 
00138    LOAD_FVEC3( new_origin , new_daxes->xxorg ,    /* in old 3dmm */
00139                             new_daxes->yyorg ,
00140                             new_daxes->zzorg  ) ;
00141 
00142    LOAD_FVEC3( old_origin , old_daxes->xxorg ,    /* in new 3dmm */
00143                             old_daxes->yyorg ,
00144                             old_daxes->zzorg  ) ;
00145 
00146    /* multiply the matrices together */
00147 
00148    mt = MAT_MUL( old_3dmm_to_dicomm , old_scale ) ;   do_nothing(0) ;
00149    mt = MAT_MUL( dd_trans , mt ) ;                    do_nothing(0) ;
00150    mt = MAT_MUL( new_dicomm_to_3dmm , mt ) ;          do_nothing(0) ;
00151    mt = MAT_MUL( new_scale , mt ) ;                   do_nothing(0) ;
00152 
00153    /* compute the new bvec */
00154 
00155    vt0 = MATVEC( old_3dmm_to_dicomm , old_origin ) ;
00156    vt0 = MATVEC( dd_trans , vt0 ) ;
00157    vt0 = MATVEC( new_dicomm_to_3dmm , vt0 ) ;
00158    vt0 = MATVEC( new_scale , vt0 ) ;
00159 
00160    vt1 = MATVEC( new_dicomm_to_3dmm , dd_base ) ;
00161    vt1 = MATVEC( new_scale , vt1 ) ;
00162 
00163    vt2 = MATVEC( new_scale , new_origin ) ;  /* want vt1 + vt2 - vt0 */
00164 
00165    vt2 = ADD_FVEC3( vt1 , vt2 ) ;
00166    vt2 = SUB_FVEC3( vt2 , vt0 ) ;
00167 
00168    /* make the output map */
00169 
00170    newmap = myXtNew( THD_linear_mapping ) ;
00171 
00172    newmap->type = MAPPING_LINEAR_TYPE ;
00173    newmap->mfor = mt ;
00174    newmap->mbac = MAT_INV(mt) ;
00175    newmap->bvec = vt2 ;
00176 
00177    newmap->svec = MATVEC(newmap->mbac,newmap->bvec) ;
00178    NEGATE_FVEC3(newmap->svec) ;
00179 
00180    return newmap ;
00181 }
 | 
| 
 | ||||||||||||||||
| 
 Definition at line 19 of file thd_warps.c. References AFNI_make_voxmap(), THD_linear_mapping::bot, CURRENT_DAXES, THD_3dim_dataset::daxes, EXIT, LOAD_FVEC3, myXtFree, myXtNew, THD_dataxes::nxx, THD_dataxes::nyy, THD_dataxes::nzz, THD_warp::rig_bod, THD_warp::tal_12, THD_3dmm_to_3dfind(), THD_dicomm_to_3dmm(), THD_linear_mapping::top, THD_warp::type, THD_talairach_12_warp::warp, THD_affine_warp::warp, WARP_AFFINE_TYPE, and WARP_TALAIRACH_12_TYPE. Referenced by AFNI_dataset_slice(). 
 00022 {
00023    THD_warp * newwarp ;
00024    THD_linear_mapping * map ;
00025    THD_dataxes * new_daxes ;
00026 
00027    newwarp       = myXtNew( THD_warp ) ;
00028    newwarp->type = inwarp->type ;
00029    new_daxes     = CURRENT_DAXES(new_dset) ;
00030 
00031    switch( inwarp->type ){
00032 
00033       default:{
00034          fprintf(stderr,"\a\n*** ILLEGAL warp code!!! %d\n",inwarp->type) ;
00035          sleep(1) ; EXIT(1) ;
00036       }
00037       break ;
00038 
00039       case WARP_AFFINE_TYPE:{
00040 
00041          map = AFNI_make_voxmap( &(inwarp->rig_bod.warp),
00042                                  old_dset->daxes , new_daxes ) ;
00043 
00044          /* load the (inclusive) voxel index ranges into the affine map */
00045 
00046          LOAD_FVEC3( map->bot, 0,0,0 ) ;
00047          LOAD_FVEC3( map->top, new_daxes->nxx-1,
00048                                new_daxes->nyy-1, new_daxes->nzz-1 ) ;
00049 
00050 
00051          newwarp->rig_bod.warp = *map ;
00052 
00053          myXtFree( map ) ;
00054       }
00055       break ;
00056 
00057       case WARP_TALAIRACH_12_TYPE:{
00058          int iw ;
00059          for( iw=0 ; iw < 12 ; iw++ ){
00060             map = AFNI_make_voxmap( &(inwarp->tal_12.warp[iw]) ,
00061                                     old_dset->daxes , new_daxes ) ;
00062 
00063             map->bot = THD_dicomm_to_3dmm(new_dset,inwarp->tal_12.warp[iw].bot);
00064             map->top = THD_dicomm_to_3dmm(new_dset,inwarp->tal_12.warp[iw].top);
00065 
00066             map->bot = THD_3dmm_to_3dfind( new_dset , map->bot ) ;
00067             map->top = THD_3dmm_to_3dfind( new_dset , map->top ) ;
00068 
00069             newwarp->tal_12.warp[iw] = *map ;
00070 
00071             myXtFree( map ) ;
00072          }
00073       }
00074       break ;
00075    }
00076 
00077    return newwarp ;
00078 }
 | 
 
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
 
 
 
 
       
	   
	   
	   
	  