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_surfaceSUMA_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_surfaceSUMA_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_vnlistSUMA_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: