#ifndef _SUMA_SURFMEASURES_H_
#define _SUMA_SURFMEASURES_H_
#define PROG_NAME "SurfMeasures"
#define ST_USE_LONG 1
#define ST_USE_SHORT 2
#define ST_USE_HIST 3
#define ST_USE_VERSION 4
#define ST_INFO_NONE 0
#define ST_INFO_AREA 1
#define ST_INFO_NORMS 2
#define ST_INFO_THICK 4
#define ST_INFO_VOL 8
#define ST_INFO_ALL 0xffff
#define ST_MAX_SURFS 2
#define ST_DEBUG_MAX_LEVEL 5
#define ST_DEFAULT_FALLOC 10 /* init alloc for num functions */
#define ST_SINFO 1 /* infomation type */
#define ST_SMEASURE 2 /* measure type */
#define ST_PI 3.141592653589793
#define RANGE(a,b,c) do {if ((b)<(a)) (b)=(a); if ((b)>(c)) (b)=(c);} while (0)
#define CHECK_NULL_STR(str) ( str ? str : "(NULL)" )
/* measure codes, to match g_smeasure_names */
typedef enum
{
E_SM_INVALID, /* do not change INVALID or FINAL */
E_SM_ANG_NORMS, /* give angle diff between normals */
E_SM_ANG_NS_A, /* give norm A angle to segment */
E_SM_ANG_NS_B, /* give norm B angle to segment */
E_SM_COORD_A, /* give coordinates of first node */
E_SM_COORD_B, /* give coordinates of second node */
E_SM_N_AREA_A, /* give node area of first node */
E_SM_N_AREA_B, /* give node area of second node */
E_SM_N_AVEAREA_A, /* average area of included triangles */
E_SM_N_AVEAREA_B, /* average area of included triangles */
E_SM_NTRI, /* give number of included triangles */
E_SM_NODE_VOL, /* give volume for each node */
E_SM_NODES, /* print out node indices */
E_SM_NORM_A, /* give normal vector for first node */
E_SM_NORM_B, /* give normal vector for second node */
E_SM_THICK, /* display between surface thickness */
E_SM_FINAL
} smeasure_codes_e;
#define ALLOC_CHECK(ptr,name,nel) \
do { if (!(ptr)) \
{ fprintf(stderr,"** failed to allocate %d '%s' elements\n", \
nel, name); \
exit(1); \
} } while (0)
typedef struct
{
SUMA_SurfSpecFile spec; /* spec file structure */
SUMA_SurfaceObject ** slist; /* list of SO pointers */
float * narea[2]; /* list of computed node areas */
float * nvol; /* list of computed node volumes */
float * fvol; /* list of computed face volumes */
int nsurf; /* number in list */
int salloc; /* number allocated for */
int nnodes; /* N_Nodes for each surf */
int nfaces; /* N_FaceSet for each surf */
} surf_t;
typedef struct
{
char ** names; /* list of function names */
int * codes; /* list of function codes */
int nalloc; /* number allocated for */
int nused; /* number actually used */
} func_t;
typedef struct
{
func_t F; /* funtion list struct */
char * spec_file; /* surface specification file */
char * sv_file; /* AFNI surface volume dataset */
char * out_1D_file; /* surface output filename */
char * cmask_cmd; /* 3dcalc style cmask command */
char * nodes_1D_file; /* node list to apply cmask to */
char * surf_names[ST_MAX_SURFS]; /* list of surfaces to be used */
int info; /* display final information */
int debug; /* level of debug output */
int dnode; /* node watched for debug */
} opts_t;
typedef struct
{
surf_t S;
func_t * F;
FILE * outfp;
int * nodes;
int nnodes; /* length of node_list */
byte * cmask;
int ncmask; /* length of cmask */
int ccount; /* number of set entries */
} param_t;
/* protos */
int add_to_flist ( func_t * F, char * fname );
int all_mappable_surfs ( opts_t * opts, param_t * p );
int check_func_name ( char * func );
int compute_face_vols ( opts_t * opts, param_t * p );
int compute_node_areas ( opts_t * opts, param_t * p, int sindex );
int compute_node_vols ( opts_t * opts, param_t * p );
int disp_f3_point ( char * info, float * d );
int disp_func_t ( char * info, func_t * d );
int disp_opts_t ( char * info, opts_t * d );
int disp_param_t ( char * info, param_t * d );
int disp_surf_t ( char * info, surf_t * d );
int final_cleanup ( opts_t * opts, param_t * p );
int get_cmask ( opts_t * opts, param_t * p );
int get_surf_data ( opts_t * opts, param_t * p );
int get_surf_measures ( opts_t * opts, param_t * p );
int init_options ( opts_t * opts, int argc, char * argv[] );
int init_opts_t ( opts_t * opts );
int print_column_headers ( opts_t * opts, param_t * p );
int read_nodes_file ( opts_t * opts, param_t * p );
int spec2SUMA ( SUMA_SurfSpecFile * spec, opts_t * opts );
int usage ( char * prog, int use_type );
int validate_option_lists( opts_t * opts, param_t * p );
int validate_options ( opts_t * opts, param_t * p );
int verify_surf_t ( opts_t * opts, param_t * p );
int write_output ( opts_t * opts, param_t * p );
/* geometric routines */
int cross_product ( double * res, double * u, double * v );
double dist_fn ( int len, float * p1, float * p2 );
double dot_product ( double * u, double * v );
float fvec_magnitude ( float * vec, int length );
float magnitude_vec_N ( float * vec, int length );
float norm2seg_angle ( THD_fvec3 * p0, THD_fvec3 * p1, float * norm );
int surf_triangle_match ( opts_t * opts, param_t * p);
double tetra_volume ( float * p0, float * p1, float * p2, float * p3 );
float vector_angle ( float * v0, float * v1 );
double lazy_det ( int width, double * data );
#endif /* #define _SUMA_SURFMEASURES_H_ */
syntax highlighted by Code2HTML, v. 0.9.1