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  

afni_suma.h File Reference

#include "vecmat.h"

Go to the source code of this file.


Data Structures

struct  SUMA_ijk
struct  SUMA_irgba
struct  SUMA_ixyz
struct  SUMA_surface
struct  SUMA_surfacegroup
struct  SUMA_vnlist
struct  SUMA_vvlist

Defines

#define SUMA_TCP_PORT   53211
#define SUMA_ixyz_defn   "int,3*float"
#define SUMA_ijk_defn   "3*int"
#define SUMA_irgba_defn   "int,4*byte"
#define SUMA_SURFACE_TYPE   53001
#define WAY_BIG   1.e+10
#define DESTROY_VVLIST(vv)
#define SUMA_NODE_COUNT(su)   ((su)->num_ixyz)
#define SUMA_TRIANGLE_COUNT(su)   ((su)->num_ijk)
#define SUMA_MAX_NODES   (1<<26)
#define SUMA_VMAP_LEVMASK(ll)   (ll << 26)
#define SUMA_VMAP_UNMASK(v)   ((v) & ((1<<26)-1))
#define SUMA_VMAP_LEVEL(v)   (((v) & (7<<26)) >> 26)
#define SUMA_VMAP_LEVZERO(v)   (((v) & (7<<26)) == 0)
#define SUMA_VMAP_TO_ID(ag, v)   ((ag)->ixyz[SUMA_VMAP_UNMASK(v)])
#define SUMA_SURFACEGROUP_TYPE   53003

Functions

SUMA_surface * SUMA_create_empty_surface (void)
void SUMA_destroy_surface (SUMA_surface *)
void SUMA_add_nodes_ixyz (SUMA_surface *, int, int *, float *, float *, float *)
void SUMA_add_node_ixyz (SUMA_surface *, int, float, float, float)
int SUMA_add_norms_xyz (SUMA_surface *, int, float *, float *, float *)
void SUMA_add_triangles (SUMA_surface *, int, int *, int *, int *)
void SUMA_add_triangle (SUMA_surface *, int, int, int)
void SUMA_truncate_memory (SUMA_surface *)
void SUMA_ixyzsort_surface (SUMA_surface *)
int SUMA_find_node_id (SUMA_surface *, int)
SUMA_surface * SUMA_read_surface (char *, struct THD_3dim_dataset *)
void SUMA_get_surfname (struct THD_3dim_dataset *)
int * SUMA_map_vol_to_surf (SUMA_surface *, int nx, int ny, int nz, float xoff, float yoff, float zoff, float dx, float dy, float dz)
int * SUMA_map_dset_to_surf (SUMA_surface *, struct THD_3dim_dataset *)
SUMA_vnlist * SUMA_make_vnlist (SUMA_surface *, struct THD_3dim_dataset *)
int AFNI_find_closest_node (int, SUMA_ixyz *, float, float, float, float, float, float, float, float, float)
void AFNI_get_xhair_node (void *, int *, int *)
void SUMA_load (struct THD_3dim_dataset *)
void SUMA_unload (struct THD_3dim_dataset *)
THD_fvec3 THD_dicomm_to_surefit (struct THD_3dim_dataset *, THD_fvec3)
THD_fvec3 THD_surefit_to_dicomm (struct THD_3dim_dataset *, THD_fvec3)
void SUMA_import_surefit (SUMA_surface *, char *, struct THD_3dim_dataset *)
void SUMA_destroy_vnlist (SUMA_vnlist *vnlist)

Define Documentation

#define DESTROY_VVLIST (  vv    ) 
 

Value:

do{ if( vv != NULL ){                              \
       if( vv->voxijk != NULL ) free(vv->voxijk) ;  \
       if( vv->voxval != NULL ) free(vv->voxval) ;  \
       free(vv) ;                                   \
 }} while(0)
Macro to free a SUMA_vvlist struct

Definition at line 87 of file afni_suma.h.

Referenced by process_NIML_Node_ROI(), and SUMA_destroy_surface().

#define SUMA_ijk_defn   "3*int"
 

NIML rowtype definition for SUMA_ijk struct

Definition at line 42 of file afni_suma.h.

#define SUMA_irgba_defn   "int,4*byte"
 

NIML rowtype definition for SUMA_irgba struct

Definition at line 53 of file afni_suma.h.

#define SUMA_ixyz_defn   "int,3*float"
 

NIML rowtype definition for SUMA_ixyz struct

Definition at line 32 of file afni_suma.h.

#define SUMA_MAX_NODES   (1<<26)
 

Max number nodes allowed in a surface (67.1 million) [higher order bits are reserved for other purposes].

Definition at line 146 of file afni_suma.h.

Referenced by SUMA_add_nodes_ixyz().

#define SUMA_NODE_COUNT (  su    )     ((su)->num_ixyz)
 

Macro for node count in a SUMA_surface struct

Definition at line 137 of file afni_suma.h.

#define SUMA_SURFACE_TYPE   53001
 

Type code for SUMA_surface structs

Definition at line 69 of file afni_suma.h.

#define SUMA_SURFACEGROUP_TYPE   53003
 

For the SUMA_surfacegroup typedef below.

Definition at line 161 of file afni_suma.h.

#define SUMA_TCP_PORT   53211
 

Port number for talking to AFNI

Definition at line 16 of file afni_suma.h.

#define SUMA_TRIANGLE_COUNT (  su    )     ((su)->num_ijk)
 

Macro for triangle count in a SUMA_surface struct

Definition at line 141 of file afni_suma.h.

#define SUMA_VMAP_LEVEL (  v    )     (((v) & (7<<26)) >> 26)
 

Definition at line 154 of file afni_suma.h.

#define SUMA_VMAP_LEVMASK (  ll    )     (ll << 26)
 

These macros are used in SUMA_map_dset_to_surf() to create an easily searched map between dataset voxel indexes and surface nodes (currently disabled) *

Definition at line 152 of file afni_suma.h.

#define SUMA_VMAP_LEVZERO (  v    )     (((v) & (7<<26)) == 0)
 

Definition at line 155 of file afni_suma.h.

#define SUMA_VMAP_TO_ID (  ag,
v    )     ((ag)->ixyz[SUMA_VMAP_UNMASK(v)])
 

Definition at line 157 of file afni_suma.h.

#define SUMA_VMAP_UNMASK (  v    )     ((v) & ((1<<26)-1))
 

Definition at line 153 of file afni_suma.h.

#define WAY_BIG   1.e+10
 

A large number

Definition at line 74 of file afni_suma.h.


Function Documentation

int AFNI_find_closest_node (  int    num_ixyz,
SUMA_ixyz *    ixyz,
float    xtarg,
float    ytarg,
float    ztarg,
float    xbot,
float    xtop,
float    ybot,
float    ytop,
float    zbot,
float    ztop
) 
 

Find node in surface closest to given DICOM vector, with limitation that node's x is in range xbot..xtop, etc. Return value is node index into ixyz array (not necessarily node ID), -1 if none is found. -------------------------------------------------------------------------

Definition at line 409 of file afni_sumafunc.c.

References ENTRY, RETURN, SUMA_ixyz::x, SUMA_ixyz::y, and SUMA_ixyz::z.

Referenced by AFNI_get_xhair_node().

00414 {
00415    int ii ,      ibest=-1 ;
00416    float x,y,z , dbest, d ;
00417 
00418 ENTRY("AFNI_find_closest_node") ;
00419 
00420    if( num_ixyz <= 0 || ixyz == NULL ) RETURN(-1) ;  /* bad inputs */
00421 
00422    /* if search ranges are incoherent, make them very wide */
00423 
00424    if( xbot >= xtop ){ xbot = -WAY_BIG; xtop = WAY_BIG; }
00425    if( ybot >= ytop ){ ybot = -WAY_BIG; ytop = WAY_BIG; }
00426    if( zbot >= ztop ){ zbot = -WAY_BIG; ztop = WAY_BIG; }
00427 
00428    for( ii=0 ; ii < num_ixyz ; ii++ ){
00429      x = ixyz[ii].x; y = ixyz[ii].y; z = ixyz[ii].z;
00430      if( x < xbot || x > xtop ||
00431          y < ybot || y > ytop ||
00432          z < zbot || z > ztop   ) continue ;  /* outside box */
00433 
00434      d = (xtarg-x)*(xtarg-x) + (ytarg-y)*(ytarg-y) + (ztarg-z)*(ztarg-z) ;
00435      if( ibest < 0 || d < dbest ){ ibest = ii; dbest = d; }
00436    }
00437 
00438    RETURN(ibest) ;
00439 }

void AFNI_get_xhair_node (  void *   ,
int *   ,
int *   
) 
 

Definition at line 1164 of file afni_niml.c.

References AFNI_find_closest_node(), Three_D_View::anat_now, AXIAL, CORONAL, DSET_DX, DSET_DY, DSET_DZ, SUMA_ixyz::id, IM3D_OPEN, SUMA_surface::ixyz, LOAD_FVEC3, SUMA_surface::num_ixyz, SAGITTAL, Three_D_View::ss_now, THD_session::su_num, THD_session::su_surf, THD_3dmm_to_dicomm(), AFNI_view_info::view_setter, Three_D_View::vinfo, AFNI_view_info::xi, THD_fvec3::xyz, AFNI_view_info::yj, and AFNI_view_info::zk.

Referenced by AFNI_brick_to_mri(), and AFNI_niml_viewpoint_CB().

01165 {
01166    Three_D_View *im3d = (Three_D_View *)qq3d ;
01167    int ks , kbest=-1,ibest=-1     ,ii , nnod ;
01168    float  xyz[3] ,   dbest=WAY_BIG,dd , xbot,xtop,ybot,ytop,zbot,ztop ;
01169    SUMA_surface *ag ;
01170    SUMA_ixyz *nod ;
01171 
01172    if( !IM3D_OPEN(im3d) || (kkbest==NULL && iibest==NULL) ) return ;
01173    if( im3d->ss_now->su_num     == 0   ||
01174        im3d->ss_now->su_surf[0] == NULL  ) return ;
01175 
01176    xyz[0] = im3d->vinfo->xi ;  /* current RAI coordinates */
01177    xyz[1] = im3d->vinfo->yj ;
01178    xyz[2] = im3d->vinfo->zk ;
01179 
01180    /* 20 Feb 2003: find closest node */
01181 
01182    xbot = ybot = zbot = xtop = ytop = ztop = 0.0 ;   /* unrestricted */
01183 
01184    if( im3d->vinfo->view_setter > 0 ){   /* restrict to a thick plane */
01185      THD_fvec3 fv ;
01186      LOAD_FVEC3(fv,DSET_DX(im3d->anat_now),
01187                    DSET_DY(im3d->anat_now),DSET_DZ(im3d->anat_now)) ;
01188      fv = THD_3dmm_to_dicomm(im3d->anat_now,fv) ;
01189      switch( im3d->vinfo->view_setter ){
01190        case AXIAL:
01191          dd = 0.499*fabs(fv.xyz[2]) ; zbot = xyz[2]-dd ; ztop = xyz[2]+dd ;
01192        break ;
01193        case SAGITTAL:
01194          dd = 0.499*fabs(fv.xyz[0]) ; xbot = xyz[0]-dd ; xtop = xyz[0]+dd ;
01195        break ;
01196        case CORONAL:
01197          dd = 0.499*fabs(fv.xyz[1]) ; ybot = xyz[1]-dd ; ytop = xyz[1]+dd ;
01198        break ;
01199      }
01200 #if 0
01201      fprintf(stderr,"view_setter=%d box=%f,%f  %f,%f  %f,%f\n",
01202              im3d->vinfo->view_setter , xbot,xtop,ybot,ytop,zbot,ztop ) ;
01203 #endif
01204    }
01205 
01206    /* search all surfaces */
01207 
01208    for( ks=0 ; ks < im3d->ss_now->su_num ; ks++ ){
01209      ag  = im3d->ss_now->su_surf[ks]; if( ag == NULL ) continue;
01210      nod = ag->ixyz ; nnod = ag->num_ixyz ;
01211      ii = AFNI_find_closest_node( nnod,nod , xyz[0],xyz[1],xyz[2] ,
01212                                   xbot,xtop,ybot,ytop,zbot,ztop    ) ;
01213      if( ii >= 0 ){
01214        dd = sqrt( (xyz[0]-nod[ii].x)*(xyz[0]-nod[ii].x)
01215                  +(xyz[1]-nod[ii].y)*(xyz[1]-nod[ii].y)
01216                  +(xyz[2]-nod[ii].z)*(xyz[2]-nod[ii].z) ) ;
01217        if( kbest < 0 || dd < dbest ){
01218          kbest = ks ; ibest = ii ; dbest = dd ;
01219        }
01220      }
01221    }
01222 
01223    /* if didn't find anything, try again unrestricted */
01224    if( kbest < 0 && im3d->vinfo->view_setter > 0 ){
01225      xbot = ybot = zbot = xtop = ytop = ztop = 0.0 ;
01226      for( ks=0 ; ks < im3d->ss_now->su_num ; ks++ ){
01227        ag  = im3d->ss_now->su_surf[ks]; if( ag == NULL ) continue;
01228        nod = ag->ixyz ; nnod = ag->num_ixyz ;
01229        ii = AFNI_find_closest_node( nnod,nod , xyz[0],xyz[1],xyz[2] ,
01230                                     xbot,xtop,ybot,ytop,zbot,ztop    ) ;
01231        if( ii >= 0 ){
01232          dd = sqrt( (xyz[0]-nod[ii].x)*(xyz[0]-nod[ii].x)
01233                    +(xyz[1]-nod[ii].y)*(xyz[1]-nod[ii].y)
01234                    +(xyz[2]-nod[ii].z)*(xyz[2]-nod[ii].z) ) ;
01235          if( kbest < 0 || dd < dbest ){
01236            kbest = ks ; ibest = ii ; dbest = dd ;
01237          }
01238        }
01239      }
01240    }
01241 
01242    if( kbest >= 0 ){
01243      ag = im3d->ss_now->su_surf[kbest] ; nod = ag->ixyz ;
01244      ibest = nod[ibest].id ;
01245    }
01246 
01247    if( kkbest != NULL ) *kkbest = kbest ;
01248    if( iibest != NULL ) *iibest = ibest ;
01249    return ;
01250 }

void SUMA_add_node_ixyz (  SUMA_surface *    ag,
int    i,
float    x,
float    y,
float    z
) 
 

Add 1 pitiful node to a surface. --------------------------------------------------------------------

Definition at line 156 of file afni_suma.c.

References i, and SUMA_add_nodes_ixyz().

00157 {
00158    SUMA_add_nodes_ixyz( ag , 1 , &i,&x,&y,&z ) ;
00159 }

void SUMA_add_nodes_ixyz (  SUMA_surface *   ,
int   ,
int *   ,
float *   ,
float *   ,
float *   
) 
 

Definition at line 71 of file afni_suma.c.

References ENTRY, EXIT, SUMA_ixyz::id, SUMA_surface::ixyz, SUMA_surface::nall_ixyz, SUMA_surface::num_ixyz, realloc, SUMA_surface::seq, SUMA_surface::sorted, SUMA_EXTEND_FAC, SUMA_EXTEND_NUM, SUMA_MAX_NODES, SUMA_ixyz::x, SUMA_ixyz::y, SUMA_ixyz::z, and zadd.

Referenced by process_NIML_SUMA_ixyz(), and SUMA_add_node_ixyz().

00073 {
00074    int ii , nup ;
00075 
00076 ENTRY("SUMA_add_nodes_ixyz") ;
00077 
00078    if( ag == NULL || nadd < 1 ) EXRETURN ;
00079    if( xadd == NULL || yadd == NULL || zadd == NULL || iadd == NULL ) EXRETURN ;
00080 
00081    nup = ag->num_ixyz + nadd ;
00082 
00083    if( nup >= SUMA_MAX_NODES ){  /* 07 Sep 2001 */
00084      fprintf(stderr,
00085              "** SUMA surface can't have more than %d nodes!\n",
00086              SUMA_MAX_NODES-1 ) ;
00087      EXRETURN ;
00088    }
00089 
00090    if( nup > ag->nall_ixyz ){ /* extend length of array */
00091      ag->nall_ixyz = nup = nup*SUMA_EXTEND_FAC + SUMA_EXTEND_NUM ;
00092      ag->ixyz = (SUMA_ixyz *) realloc( (void *)ag->ixyz, sizeof(SUMA_ixyz)*nup );
00093      if( ag->ixyz == NULL ){
00094        fprintf(stderr,"SUMA_add_nodes_ixyz: can't malloc!\n"); EXIT(1);
00095      }
00096    }
00097 
00098    nup = ag->num_ixyz ;
00099 
00100    for( ii=0 ; ii < nadd ; ii++ ){
00101      ag->ixyz[ii+nup].x  = xadd[ii] ;
00102      ag->ixyz[ii+nup].y  = yadd[ii] ;
00103      ag->ixyz[ii+nup].z  = zadd[ii] ;
00104      ag->ixyz[ii+nup].id = iadd[ii] ;
00105    }
00106 
00107    ag->num_ixyz += nadd ;
00108 
00109    ag->seq = ag->sorted = 0 ; EXRETURN ;
00110 }

int SUMA_add_norms_xyz (  SUMA_surface *   ,
int   ,
float *   ,
float *   ,
float *   
) 
 

Definition at line 119 of file afni_suma.c.

References calloc, ENTRY, EXIT, SUMA_surface::norm, SUMA_surface::num_ixyz, RETURN, THD_fvec3::xyz, and zadd.

Referenced by process_NIML_SUMA_node_normals().

00121 {
00122    int ii ;
00123 
00124 ENTRY("SUMA_add_norms_xyz") ;
00125 
00126    if( ag == NULL || nadd < 1 ) RETURN(-1) ;
00127    if( xadd == NULL || yadd == NULL || zadd == NULL ) RETURN(-1) ;
00128 
00129    if( nadd != ag->num_ixyz ){
00130      fprintf(stderr, "** SUMA surface has %d nodes but %d normals!\n",
00131              ag->num_ixyz, nadd ) ;
00132      RETURN(-1) ;
00133    }
00134 
00135    /* if norm is NULL, memory is needed */
00136    if( ag->norm == NULL ){
00137        ag->norm = (THD_fvec3 *)calloc(nadd, sizeof(THD_fvec3));
00138        if( ag->norm == NULL ){
00139            fprintf(stderr,"SUMA_add_norms_xyz: can't malloc!\n"); EXIT(1);
00140        }
00141    }
00142 
00143    for( ii=0 ; ii < nadd ; ii++ ){
00144      ag->norm[ii].xyz[0] = xadd[ii] ;
00145      ag->norm[ii].xyz[1] = yadd[ii] ;
00146      ag->norm[ii].xyz[2] = zadd[ii] ;
00147    }
00148 
00149    RETURN(0) ;
00150 }

void SUMA_add_triangle (  SUMA_surface *    ag,
int    it,
int    jt,
int    kt
) 
 

Add 1 pitiful triangle to a surface. --------------------------------------------------------------------

Definition at line 197 of file afni_suma.c.

References SUMA_add_triangles().

00198 {
00199    SUMA_add_triangles( ag , 1 , &it,&jt,&kt ) ;
00200 }

void SUMA_add_triangles (  SUMA_surface *    ag,
int    nadd,
int *    it,
int *    jt,
int *    kt
) 
 

Add a bunch of triangles (node id triples) to a surface. --------------------------------------------------------------------

Definition at line 165 of file afni_suma.c.

References ENTRY, EXIT, SUMA_ijk::id, SUMA_surface::ijk, SUMA_ijk::jd, SUMA_ijk::kd, SUMA_surface::nall_ijk, SUMA_surface::num_ijk, realloc, SUMA_EXTEND_FAC, and SUMA_EXTEND_NUM.

Referenced by process_NIML_SUMA_ijk(), and SUMA_add_triangle().

00166 {
00167    int ii , nup ;
00168 
00169 ENTRY("SUMA_add_triangles") ;
00170 
00171    if( ag == NULL || nadd < 1 ) EXRETURN ;
00172    if( it == NULL || jt == NULL || kt == NULL ) EXRETURN ;
00173 
00174    nup = ag->num_ijk + nadd ;
00175    if( nup > ag->nall_ijk ){ /* extend length of array */
00176      ag->nall_ijk = nup = nup*SUMA_EXTEND_FAC + SUMA_EXTEND_NUM ;
00177      ag->ijk = (SUMA_ijk *) realloc( (void *)ag->ijk , sizeof(SUMA_ijk)*nup ) ;
00178      if( ag->ijk == NULL ){
00179        fprintf(stderr,"SUMA_add_triangles: can't malloc!\n"); EXIT(1);
00180      }
00181    }
00182 
00183    nup = ag->num_ijk ;
00184    for( ii=0 ; ii < nadd ; ii++ ){
00185      ag->ijk[ii+nup].id = it[ii] ;
00186      ag->ijk[ii+nup].jd = jt[ii] ;
00187      ag->ijk[ii+nup].kd = kt[ii] ;
00188    }
00189 
00190    ag->num_ijk += nadd ; EXRETURN ;
00191 }

SUMA_surface* SUMA_create_empty_surface (  void    ) 
 

Create an empty surface description. --------------------------------------------------------------------

Definition at line 14 of file afni_suma.c.

References calloc, ENTRY, EXIT, SUMA_surface::idcode, SUMA_surface::idcode_dset, SUMA_surface::idcode_ldp, SUMA_surface::ijk, SUMA_surface::ixyz, SUMA_surface::label, SUMA_surface::label_ldp, malloc, SUMA_surface::nall_ijk, SUMA_surface::nall_ixyz, SUMA_surface::norm, SUMA_surface::num_ijk, SUMA_surface::num_ixyz, RETURN, SUMA_surface::seq, SUMA_surface::seqbase, SUMA_surface::sorted, SUMA_surface::type, SUMA_surface::vn, SUMA_surface::vv, SUMA_surface::xbot, SUMA_surface::xcen, SUMA_surface::xtop, SUMA_surface::ybot, SUMA_surface::ycen, SUMA_surface::ytop, SUMA_surface::zbot, SUMA_surface::zcen, and SUMA_surface::ztop.

Referenced by process_NIML_SUMA_ixyz().

00015 {
00016    SUMA_surface *ag ;
00017 
00018 ENTRY("SUMA_create_empty_surface") ;
00019 
00020    ag       = (SUMA_surface *) calloc(1,sizeof(SUMA_surface)) ;
00021    ag->type = SUMA_SURFACE_TYPE ;
00022 
00023    ag->num_ixyz  = ag->num_ijk  = 0 ;
00024    ag->nall_ixyz = ag->nall_ijk = 1 ;
00025    ag->ixyz = (SUMA_ixyz *) malloc(sizeof(SUMA_ixyz)) ; /* space for */
00026    ag->ijk  = (SUMA_ijk *)  malloc(sizeof(SUMA_ijk) ) ; /* 1 of each */
00027    ag->norm = NULL ;                                  ; /* none of this */
00028 
00029    if( ag->ixyz == NULL || ag->ijk == NULL ){
00030       fprintf(stderr,"SUMA_create_empty_surface: can't malloc!\n"); EXIT(1);
00031    }
00032 
00033    ag->idcode[0] = ag->idcode_dset[0] = ag->idcode_ldp[0] =
00034       ag->label[0] = ag->label_ldp[0] = '\0' ;
00035 
00036    ag->xbot = ag->ybot = ag->zbot =  WAY_BIG ;
00037    ag->xtop = ag->ytop = ag->ztop = -WAY_BIG ;
00038    ag->xcen = ag->ycen = ag->zcen = 0.0      ;
00039 
00040    ag->seq = ag->seqbase = ag->sorted = 0 ; /* not sequential; not sorted */
00041 
00042    ag->vv = NULL ;  /* 16 Jun 2003 */
00043    ag->vn = NULL ;  /* 22 Jan 2004 */
00044 
00045    RETURN( ag ) ;
00046 }

void SUMA_destroy_surface (  SUMA_surface *    ag ) 
 

Throw out some trash (i.e., free the contents of a surface). --------------------------------------------------------------------

Definition at line 52 of file afni_suma.c.

References DESTROY_VVLIST, ENTRY, free, SUMA_surface::ijk, SUMA_surface::ixyz, SUMA_surface::norm, SUMA_destroy_vnlist(), SUMA_surface::vn, and SUMA_surface::vv.

Referenced by process_NIML_SUMA_ixyz().

00053 {
00054 ENTRY("SUMA_destroy_surface") ;
00055 
00056    if( ag == NULL ) EXRETURN ;
00057    if( ag->ixyz != NULL ) free((void *)ag->ixyz) ;
00058    if( ag->ijk  != NULL ) free((void *)ag->ijk) ;
00059    if( ag->norm != NULL ) free((void *)ag->norm) ;
00060 
00061    if( ag->vv != NULL ) DESTROY_VVLIST(ag->vv) ;
00062    if( ag->vn != NULL ) SUMA_destroy_vnlist(ag->vn) ;
00063 
00064    free((void *)ag) ; EXRETURN ;
00065 }

void SUMA_destroy_vnlist (  SUMA_vnlist *    vnlist ) 
 

Destroy a SUMA_vnlist struct. ---------------------------------------------------------------------------

Definition at line 476 of file afni_suma.c.

References free, SUMA_vnlist::nlist, SUMA_vnlist::numnod, SUMA_vnlist::nvox, and SUMA_vnlist::voxijk.

Referenced by AFNI_vnlist_func_overlay(), AFNI_vol2surf_func_overlay(), and SUMA_destroy_surface().

00477 {
00478    int ii ;
00479    if( vnlist == NULL ) return ;
00480    if( vnlist->voxijk != NULL ) free( vnlist->voxijk ) ;
00481    if( vnlist->numnod != NULL ) free( vnlist->numnod ) ;
00482    if( vnlist->nlist  != NULL ){
00483      for( ii=0 ; ii < vnlist->nvox ; ii++ )
00484        if( vnlist->nlist[ii] != NULL ) free( vnlist->nlist[ii] ) ;
00485      free( vnlist->nlist ) ;
00486    }
00487    free( vnlist ) ;
00488 }

int SUMA_find_node_id (  SUMA_surface *    ag,
int    target
) 
 

Find a node id in a surface, and return its index into the node array; return -1 if not found. ----------------------------------------------------------------------

Definition at line 328 of file afni_suma.c.

References SUMA_ixyz::id, SUMA_surface::ixyz, SUMA_surface::num_ixyz, SUMA_surface::seq, SUMA_surface::seqbase, SUMA_surface::sorted, and SUMA_ixyzsort_surface().

Referenced by AFNI_brick_to_mri(), AFNI_process_plugout(), AFNI_sumato_CB(), and process_NIML_Node_ROI().

00329 {
00330    int nn , ii,jj,kk ;
00331 
00332    if( ag == NULL || ag->num_ixyz < 1 || target < 0 ) return( -1 );
00333 
00334    if( !ag->sorted ) SUMA_ixyzsort_surface( ag ) ;
00335 
00336    if( ag->seq ){  /* node id-s are sequential (the easy case) */
00337       kk = target - ag->seqbase ;
00338       if( kk >= 0 && kk < ag->num_ixyz ) return( kk );
00339       return( -1 );
00340    }
00341 
00342    /* node id-s are in increasing order, but not sequential;
00343       so, use binary search to find the node id (if present) */
00344 
00345    ii = 0 ; jj = ag->num_ixyz - 1 ;                 /* search bounds */
00346 
00347         if( target <  ag->ixyz[0].id  ) return( -1 ); /* not present */
00348    else if( target == ag->ixyz[0].id  ) return( ii ); /* at start!  */
00349 
00350         if( target >  ag->ixyz[jj].id ) return( -1 ); /* not present */
00351    else if( target == ag->ixyz[jj].id ) return( jj ); /* at end!    */
00352 
00353    while( jj - ii > 1 ){  /* while search bounds not too close */
00354 
00355       kk = (ii+jj) / 2 ;  /* midway between search bounds */
00356 
00357       nn = ag->ixyz[kk].id - target ;
00358       if( nn == 0 ) return( kk );     /* AHA! */
00359 
00360       if( nn < 0 ) ii = kk ;          /* kk before target => bottom = kk */
00361       else         jj = kk ;          /* kk after target  => top    = kk */
00362    }
00363 
00364    return( -1 );
00365 }

void SUMA_get_surfname (  struct THD_3dim_dataset *    ) 
 

void SUMA_import_surefit (  SUMA_surface *   ,
char *   ,
struct THD_3dim_dataset *   
) 
 

void SUMA_ixyzsort_surface (  SUMA_surface *    ag ) 
 

Sort the nodes by id-s, and mark if the id-s are sequential. --------------------------------------------------------------------

Definition at line 245 of file afni_suma.c.

References ENTRY, SUMA_ixyz::id, SUMA_surface::ixyz, SUMA_surface::num_ixyz, SUMA_surface::seq, SUMA_surface::seqbase, SUMA_surface::sorted, SUMA_truncate_memory(), SUMA_ixyz::x, SUMA_surface::xbot, xc, SUMA_surface::xcen, SUMA_surface::xtop, SUMA_ixyz::y, SUMA_surface::ybot, yc, SUMA_surface::ycen, SUMA_surface::ytop, SUMA_ixyz::z, SUMA_surface::zbot, SUMA_surface::zcen, and SUMA_surface::ztop.

Referenced by process_NIML_SUMA_ixyz(), SUMA_find_node_id(), and SUMA_make_vnlist().

00246 {
00247    int nn , ii , ndup ;
00248    float xb,yb,zb , xt,yt,zt , xc,yc,zc ;
00249 
00250 ENTRY("SUMA_ixyzsort_surface") ;
00251 
00252    if( ag == NULL || ag->num_ixyz < 1 ) EXRETURN ;
00253 
00254    SUMA_truncate_memory( ag ) ;
00255 
00256    nn = ag->num_ixyz ;
00257 
00258    /* check if nodes are already sorted [26 Oct 2001] */
00259 
00260    for( ii=1 ; ii < nn ; ii++ )
00261      if( ag->ixyz[ii].id <= ag->ixyz[ii-1].id ) break ;
00262 
00263    /* if not in increasing order,
00264       sort them using the function generated above */
00265 
00266    if( ii < nn ){
00267      qsort_SUMA_ixyz( nn , ag->ixyz ) ;
00268    }
00269 
00270    ag->sorted = 1 ;  /* mark as sorted */
00271 
00272    /* check if node id-s are sequential */
00273 
00274    for( ii=1 ; ii < nn ; ii++ )
00275      if( ag->ixyz[ii].id != ag->ixyz[ii-1].id+1 ) break ;
00276 
00277    /* if we finished that loop all the way,
00278       mark the nodes as being sequential, and
00279       store the base of the sequence (id of node #0) */
00280 
00281    if( ii == nn ){
00282      ag->seq = 1 ; ag->seqbase = ag->ixyz[0].id ;
00283    }
00284 
00285    /* 07 Sep 2001: check for duplicate node id-s */
00286 
00287    for( ndup=0,ii=1 ; ii < nn ; ii++ )
00288      if( ag->ixyz[ii].id == ag->ixyz[ii-1].id ) ndup++ ;
00289 
00290    if( ndup > 0 )
00291      fprintf(stderr,"** SUMA WARNING: %d duplicate surface node id's found!\n",ndup);
00292 
00293    /* find bounding box of all nodes (it's useful on occasion) */
00294 
00295    xb = xt = ag->ixyz[0].x ;
00296    yb = yt = ag->ixyz[0].y ;
00297    zb = zt = ag->ixyz[0].z ;
00298    xc = yc = zc = 0.0 ;
00299    for( ii=1 ; ii < nn ; ii++ ){
00300      xc += ag->ixyz[ii].x ;
00301      yc += ag->ixyz[ii].y ;
00302      zc += ag->ixyz[ii].z ;
00303 
00304           if( ag->ixyz[ii].x < xb ) xb = ag->ixyz[ii].x ;
00305      else if( ag->ixyz[ii].x > xt ) xt = ag->ixyz[ii].x ;
00306 
00307           if( ag->ixyz[ii].y < yb ) yb = ag->ixyz[ii].y ;
00308      else if( ag->ixyz[ii].y > yt ) yt = ag->ixyz[ii].y ;
00309 
00310           if( ag->ixyz[ii].z < zb ) zb = ag->ixyz[ii].z ;
00311      else if( ag->ixyz[ii].z > zt ) zt = ag->ixyz[ii].z ;
00312    }
00313 
00314    ag->xbot = xb ; ag->xtop = xt ;
00315    ag->ybot = yb ; ag->ytop = yt ;
00316    ag->zbot = zb ; ag->ztop = zt ;
00317 
00318    ag->xcen = xc/nn ; ag->ycen = yc/nn ; ag->zcen = zc/nn ;
00319 
00320    EXRETURN ;
00321 }

void SUMA_load (  struct THD_3dim_dataset *    ) 
 

SUMA_vnlist* SUMA_make_vnlist (  SUMA_surface *   ,
struct THD_3dim_dataset *   
) 
 

Referenced by AFNI_vnlist_func_overlay().

int* SUMA_map_dset_to_surf (  SUMA_surface *   ,
struct THD_3dim_dataset *   
) 
 

int* SUMA_map_vol_to_surf (  SUMA_surface *   ,
int    nx,
int    ny,
int    nz,
float    xoff,
float    yoff,
float    zoff,
float    dx,
float    dy,
float    dz
) 
 

SUMA_surface* SUMA_read_surface (  char *   ,
struct THD_3dim_dataset *   
) 
 

void SUMA_truncate_memory (  SUMA_surface *    ag ) 
 

Truncate the memory used by the node and triangle arrays back to the minimum they need. --------------------------------------------------------------------

Definition at line 207 of file afni_suma.c.

References ENTRY, SUMA_surface::ijk, SUMA_surface::ixyz, SUMA_surface::nall_ijk, SUMA_surface::nall_ixyz, SUMA_surface::num_ijk, SUMA_surface::num_ixyz, and realloc.

Referenced by SUMA_ixyzsort_surface().

00208 {
00209    int nn ;
00210 
00211 ENTRY("SUMA_truncate_memory") ;
00212 
00213    if( ag == NULL ) EXRETURN ;
00214 
00215    if( ag->num_ixyz < ag->nall_ixyz && ag->num_ixyz > 0 ){
00216      ag->nall_ixyz = nn = ag->num_ixyz ;
00217      ag->ixyz = (SUMA_ixyz *) realloc( (void *)ag->ixyz, sizeof(SUMA_ixyz)*nn );
00218    }
00219 
00220    if( ag->num_ijk < ag->nall_ijk && ag->num_ijk > 0 ){
00221      ag->nall_ijk = nn = ag->num_ijk ;
00222      ag->ijk = (SUMA_ijk *) realloc( (void *)ag->ijk , sizeof(SUMA_ijk)*nn ) ;
00223    }
00224 
00225    EXRETURN ;
00226 }

void SUMA_unload (  struct THD_3dim_dataset *    ) 
 

THD_fvec3 THD_dicomm_to_surefit (  struct THD_3dim_dataset *   ,
THD_fvec3   
) 
 

Referenced by main().

THD_fvec3 THD_surefit_to_dicomm (  struct THD_3dim_dataset *   ,
THD_fvec3   
) 
 

Referenced by main().

 

Powered by Plone

This site conforms to the following standards: