Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

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_warpAFNI_make_voxwarp (THD_warp *inwarp, THD_3dim_dataset *old_dset, THD_3dim_dataset *new_dset)
THD_linear_mappingAFNI_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_mappingAFNI_concatenate_lmap (THD_linear_mapping *map_2, THD_linear_mapping *map_1)
THD_warpAFNI_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_warpAFNI_make_affwarp_mat (THD_mat33 mmm)
THD_warpAFNI_make_affwarp_matvec (THD_mat33 mmm, THD_fvec3 vvv)

Define Documentation

#define do_nothing iii   
 

Definition at line 85 of file thd_warps.c.

Referenced by AFNI_make_voxmap().


Function Documentation

THD_linear_mapping* AFNI_concatenate_lmap THD_linear_mapping   map_2,
THD_linear_mapping   map_1
 

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 }

void AFNI_concatenate_warp THD_warp   warp_in,
THD_warp   warp_prior
 

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 }

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
 

Make an affine warp from 12 input numbers:

  • [ a11 a12 a13 ] [ s1 ]
  • x_map = [ a21 a22 a23 ] x_in + [ s2 ]
  • [ a31 a32 a33 ] [ s3 ]
27 Aug 2002 - RWCox. ----------------------------------------------------------------------------

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 }

THD_warp* AFNI_make_affwarp_mat THD_mat33    mmm
 

Definition at line 329 of file thd_warps.c.

References AFNI_make_affwarp_12(), THD_mat33::mat, and mmm.

Referenced by THD_init_session().

00330 {
00331    return AFNI_make_affwarp_12( mmm.mat[0][0], mmm.mat[0][1], mmm.mat[0][2], 0.0 ,
00332                                 mmm.mat[1][0], mmm.mat[1][1], mmm.mat[1][2], 0.0 ,
00333                                 mmm.mat[2][0], mmm.mat[2][1], mmm.mat[2][2], 0.0  ) ;
00334 }

THD_warp* AFNI_make_affwarp_matvec THD_mat33    mmm,
THD_fvec3    vvv
 

Definition at line 338 of file thd_warps.c.

References AFNI_make_affwarp_12(), THD_mat33::mat, mmm, and THD_fvec3::xyz.

00339 {
00340    return AFNI_make_affwarp_12( mmm.mat[0][0], mmm.mat[0][1], mmm.mat[0][2], vvv.xyz[0] ,
00341                                 mmm.mat[1][0], mmm.mat[1][1], mmm.mat[1][2], vvv.xyz[1] ,
00342                                 mmm.mat[2][0], mmm.mat[2][1], mmm.mat[2][2], vvv.xyz[2]  ) ;
00343 }

THD_linear_mapping* AFNI_make_voxmap THD_linear_mapping   inmap,
THD_dataxes   old_daxes,
THD_dataxes   new_daxes
 

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 }

THD_warp* AFNI_make_voxwarp THD_warp   inwarp,
THD_3dim_dataset   old_dset,
THD_3dim_dataset   new_dset
 

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 }
 

Powered by Plone

This site conforms to the following standards: