Doxygen Source Code Documentation
SUMA_3dSurf2Vol.c File Reference
#include "mrilib.h"
#include "parser.h"
#include "SUMA_suma.h"
#include "SUMA_3dSurf2Vol.h"
Go to the source code of this file.
Define Documentation
|
Definition at line 156 of file SUMA_3dSurf2Vol.c. |
|
Definition at line 128 of file SUMA_3dSurf2Vol.c. Referenced by usage(). |
Function Documentation
|
Definition at line 747 of file SUMA_3dSurf2Vol.c. References dist_f3mm(), ENTRY, s2v_opts_t::f_p1_fr, s2v_opts_t::f_p1_mm, s2v_opts_t::f_pn_fr, s2v_opts_t::f_pn_mm, s2v_opts_t::map, RETURN, and THD_fvec3::xyz. Referenced by compute_results().
00748 { 00749 THD_fvec3 f3_diff; 00750 float dist, factor; 00751 00752 ENTRY("adjust_endpts"); 00753 00754 if ( !sopt || !p1 || !pn ) 00755 { 00756 fprintf(stderr,"** ae: invalid params (%p,%p,%p)\n", sopt, p1, pn); 00757 RETURN(-1); 00758 } 00759 00760 /* first, get the difference, and distance */ 00761 f3_diff.xyz[0] = pn->xyz[0] - p1->xyz[0]; 00762 f3_diff.xyz[1] = pn->xyz[1] - p1->xyz[1]; 00763 f3_diff.xyz[2] = pn->xyz[2] - p1->xyz[2]; 00764 00765 dist = dist_f3mm( p1, pn ); 00766 00767 if ( (sopt->f_p1_fr != 0.0) || (sopt->f_p1_mm != 0.0) ) 00768 { 00769 if ( sopt->f_p1_fr != 0.0 ) /* what the heck, choose fr if both */ 00770 factor = sopt->f_p1_fr; 00771 else 00772 factor = (dist == 0.0) ? 0.0 : sopt->f_p1_mm / dist; 00773 00774 p1->xyz[0] += factor * f3_diff.xyz[0]; 00775 p1->xyz[1] += factor * f3_diff.xyz[1]; 00776 p1->xyz[2] += factor * f3_diff.xyz[2]; 00777 } 00778 00779 if ( (sopt->f_pn_fr != 0.0) || (sopt->f_pn_mm != 0.0) ) 00780 { 00781 if ( sopt->f_pn_fr != 0.0 ) 00782 factor = sopt->f_pn_fr; 00783 else 00784 factor = (dist == 0.0) ? 0.0 : sopt->f_pn_mm / dist; 00785 00786 pn->xyz[0] += factor * f3_diff.xyz[0]; 00787 pn->xyz[1] += factor * f3_diff.xyz[1]; 00788 pn->xyz[2] += factor * f3_diff.xyz[2]; 00789 } 00790 00791 switch ( sopt->map ) 00792 { 00793 default: 00794 fprintf(stderr,"** ae: mapping %d not ready\n", sopt->map ); 00795 RETURN(-1); 00796 00797 case E_SMAP_AVE: 00798 case E_SMAP_COUNT: 00799 case E_SMAP_MAX_ABS: 00800 case E_SMAP_MAX: 00801 case E_SMAP_MIN: 00802 case E_SMAP_MASK: 00803 case E_SMAP_MASK2: 00804 break; 00805 } 00806 00807 RETURN(0); 00808 } |
|
Definition at line 2092 of file SUMA_3dSurf2Vol.c. References c, dt, ENTRY, and RETURN. Referenced by set_smap_opts().
02093 { 02094 int c, dt = -1; 02095 02096 ENTRY("check_datum_type"); 02097 02098 if ( datum_str ) 02099 { 02100 for ( c = 0; c <= MRI_rgba; c++ ) 02101 if ( ! strcmp( datum_str, MRI_TYPE_name[c] ) ) 02102 { 02103 dt = c; 02104 break; 02105 } 02106 02107 /* if we didn't find the requested type, inform the user and quit */ 02108 if ( c > MRI_rgba ) 02109 { 02110 fprintf( stderr, "** invalid datum type name '%s'\n", 02111 datum_str ); 02112 RETURN(-1); 02113 } 02114 } 02115 else 02116 { 02117 dt = default_type; 02118 } 02119 02120 if ( ( dt != MRI_byte ) && 02121 ( dt != MRI_short ) && 02122 ( dt != MRI_float ) && 02123 ( dt != MRI_double ) ) 02124 { 02125 fprintf( stderr, "** data type '%s' is not supported\n", 02126 MRI_TYPE_name[dt] ); 02127 RETURN(-1); 02128 } 02129 02130 RETURN(dt); 02131 } |
|
Definition at line 2141 of file SUMA_3dSurf2Vol.c.
02142 { 02143 int map; 02144 02145 ENTRY("check_map_func"); 02146 02147 if ( map_str == NULL ) 02148 { 02149 fprintf( stderr, "** missing option: '-map_func FUNCTION'\n" ); 02150 RETURN(E_SMAP_INVALID); 02151 } 02152 02153 map = s2v_map_type( map_str ); 02154 02155 if ( map == E_SMAP_INVALID ) 02156 { 02157 fprintf( stderr, "** invalid map string '%s'\n", map_str ); 02158 RETURN(-1); 02159 } 02160 02161 RETURN(map); 02162 } |
|
Definition at line 408 of file SUMA_3dSurf2Vol.c. References adjust_endpts(), s2v_opts_t::debug, node_list_t::depth, dist_f3mm(), s2v_opts_t::dnode, DSET_NVOX, ENTRY, param_t::f3mm_max, param_t::f3mm_min, f3mm_out_of_bounds(), final_computations(), param_t::gpar, node_list_t::ilen, node_list_t::ilist, insert_list(), make_point_list(), node_list_t::nnodes, node_list_t::nodes, p, RETURN, s2v_opts_t::sxyz_ori_gpar, THD_dicomm_to_3dmm(), and THD_fvec3::xyz. Referenced by s2v_nodes2volume().
00410 { 00411 THD_fvec3 p1, pn; 00412 float dist, min_dist, max_dist; 00413 int nindex, node; 00414 int oobc; 00415 00416 ENTRY("compute_results"); 00417 00418 if ( !p || !N || !sopt || !ddata || !cdata ) 00419 { 00420 fprintf(stderr,"** cr: bad params (%p,%p,%p,%p,%p)\n", 00421 p, N, sopt, ddata, cdata); 00422 RETURN(-1); 00423 } 00424 00425 min_dist = 9999.9; 00426 max_dist = -1.0; 00427 oobc = 0; /* init out-of-bounds counter */ 00428 00429 for ( nindex = 0; nindex < N->ilen; nindex++ ) 00430 { 00431 node = N->ilist[nindex]; 00432 if ( node < 0 || node >= N->nnodes ) 00433 { 00434 fprintf(stderr,"** node %d (%d) out-of-range [0,%d]\n", 00435 nindex, node, N->nnodes); 00436 RETURN(-1); 00437 } 00438 00439 /* initiate the endpoints */ 00440 p1 = N->nodes[node]; 00441 00442 if ( N->depth > 1 ) 00443 pn = N->nodes[node+N->nnodes]; 00444 else 00445 pn = p1; 00446 00447 if ( ! sopt->sxyz_ori_gpar ) /* if orient is not as gpar it is Dicom */ 00448 { 00449 p1 = THD_dicomm_to_3dmm(p->gpar, p1); 00450 pn = THD_dicomm_to_3dmm(p->gpar, pn); 00451 } 00452 00453 if ( sopt->debug > 0 && sopt->dnode == node ) 00454 { 00455 fprintf(stderr,"-- debug node: %d\n", node ); 00456 fprintf(stderr,"-- orig endpts: (%f, %f, %f)\n" 00457 " (%f, %f, %f)\n", 00458 p1.xyz[0], p1.xyz[1], p1.xyz[2], 00459 pn.xyz[0], pn.xyz[1], pn.xyz[2]); 00460 } 00461 00462 adjust_endpts( sopt, &p1, &pn ); /* per user options */ 00463 00464 /* if both points are outside gpar box, skip the node */ 00465 if ( f3mm_out_of_bounds( &p1, &p->f3mm_min, &p->f3mm_max ) && 00466 f3mm_out_of_bounds( &pn, &p->f3mm_min, &p->f3mm_max ) ) 00467 { 00468 oobc++; 00469 continue; 00470 } 00471 00472 dist = dist_f3mm( &p1, &pn ); 00473 if ( dist < min_dist ) min_dist = dist; 00474 if ( dist > max_dist ) max_dist = dist; 00475 00476 make_point_list( pary, &p1, &pn, sopt ); 00477 00478 /* do all the work to insert data */ 00479 if ( insert_list(N, p, sopt, pary, nindex, ddata, cdata) ) 00480 RETURN(-1); 00481 } 00482 00483 if ( sopt->debug > 0 ) 00484 fprintf(stderr, "-- (min_dist, max_dist) = (%f, %f)\n" 00485 " %d of %d nodes were out of bounds\n", 00486 min_dist, max_dist, oobc, N->ilen); 00487 00488 if ( final_computations(ddata, cdata, sopt, DSET_NVOX(p->gpar)) ) 00489 RETURN(-1); 00490 00491 RETURN(0); 00492 } |
|
Definition at line 3045 of file SUMA_3dSurf2Vol.c. References node_list_t::depth, ENTRY, node_list_t::fdata, node_list_t::ilen, node_list_t::ilist, node_list_t::nnodes, node_list_t::nodes, and RETURN. Referenced by fill_node_list(), and verify_node_list().
03046 { 03047 ENTRY("disp_node_list_t"); 03048 03049 if ( info ) 03050 fputs( info, stderr ); 03051 03052 if ( d == NULL ) 03053 { 03054 fprintf(stderr,"disp_node_list_t: d == NULL\n"); 03055 RETURN(-1); 03056 } 03057 03058 fprintf(stderr, 03059 "node_list_t struct at %p :\n" 03060 " nodes = %p\n" 03061 " depth, nnodes = %d, %d\n" 03062 " fdata, ilist = %p, %p\n" 03063 " ilen = %d\n" 03064 , d, 03065 d->nodes, d->depth, d->nnodes, 03066 d->fdata, d->ilist, d->ilen 03067 ); 03068 03069 RETURN(0); 03070 } |
|
Definition at line 2952 of file SUMA_3dSurf2Vol.c.
02953 { 02954 ENTRY("disp_opts_t"); 02955 02956 if ( info ) 02957 fputs( info, stderr ); 02958 02959 if ( opts == NULL ) 02960 { 02961 fprintf(stderr, "disp_opts_t: opts == NULL\n" ); 02962 RETURN(-1); 02963 } 02964 02965 fprintf(stderr, 02966 "options struct at %p :\n" 02967 " gpar_file = %s\n" 02968 " oset_file = %s\n" 02969 " spec_file = %s\n" 02970 " sv_file = %s\n" 02971 " surf_xyz_1D_file = %s\n" 02972 " sdata_file_1D = %s\n" 02973 " sdata_file_niml = %s\n" 02974 " cmask_cmd = %s\n" 02975 " data_expr = %s\n" 02976 " map_str = %s\n" 02977 " datum_str = %s\n" 02978 " f_index_str = %s\n" 02979 " sxyz_ori_gpar = %d\n" 02980 " debug, dnode, dvox = %d, %d, %d\n" 02981 " noscale, f_steps = %d, %d\n" 02982 " f_p1_fr, f_pn_fr = %f, %f\n" 02983 " f_p1_mm, f_pn_mm = %f, %f\n" 02984 , opts, 02985 CHECK_NULL_STR(opts->gpar_file), CHECK_NULL_STR(opts->oset_file), 02986 CHECK_NULL_STR(opts->spec_file), CHECK_NULL_STR(opts->sv_file), 02987 CHECK_NULL_STR(opts->surf_xyz_1D_file), 02988 CHECK_NULL_STR(opts->sdata_file_1D), 02989 CHECK_NULL_STR(opts->sdata_file_niml), 02990 CHECK_NULL_STR(opts->cmask_cmd), CHECK_NULL_STR(opts->data_expr), 02991 CHECK_NULL_STR(opts->map_str), CHECK_NULL_STR(opts->datum_str), 02992 CHECK_NULL_STR(opts->f_index_str), opts->sxyz_ori_gpar, 02993 opts->debug, opts->dnode, opts->dvox, opts->noscale, opts->f_steps, 02994 opts->f_p1_fr, opts->f_pn_fr, opts->f_p1_mm, opts->f_pn_mm 02995 ); 02996 02997 RETURN(0); 02998 } |
|
Definition at line 3005 of file SUMA_3dSurf2Vol.c.
03006 { 03007 ENTRY("disp_param_t"); 03008 03009 if ( info ) 03010 fputs( info, stderr ); 03011 03012 if ( p == NULL ) 03013 { 03014 fprintf(stderr,"disp_param_t: p == NULL\n"); 03015 RETURN(-1); 03016 } 03017 03018 fprintf(stderr, 03019 "param_t struct at %p :\n" 03020 " gpar : vcheck = %p : %s\n" 03021 " oset : vcheck = %p : %s\n" 03022 " sxyz_im, sdata_im = %p, %p\n" 03023 " f3mm_min (xyz) = (%f, %f, %f)\n" 03024 " f3mm_max (xyz) = (%f, %f, %f)\n" 03025 " nvox, nsubs = %d, %d\n" 03026 " cmask = %p\n" 03027 " ncmask, ccount = %d, %d\n" 03028 , p, 03029 p->gpar, ISVALID_DSET(p->gpar) ? "valid" : "invalid", 03030 p->oset, ISVALID_DSET(p->oset) ? "valid" : "invalid", 03031 p->sxyz_im, p->sdata_im, 03032 p->f3mm_min.xyz[0], p->f3mm_min.xyz[1], p->f3mm_min.xyz[2], 03033 p->f3mm_max.xyz[0], p->f3mm_max.xyz[1], p->f3mm_max.xyz[2], 03034 p->nvox, p->nsubs, p->cmask, p->ncmask, p->ccount 03035 ); 03036 03037 RETURN(0); 03038 } |
|
Definition at line 3114 of file SUMA_3dSurf2Vol.c. References c, PARSER_code::c_code, ENTRY, parser_t::has_sym, parser_t::max_sym, PARSER_code::num_code, parser_t::pcode, and RETURN. Referenced by validate_options().
03115 { 03116 int c; 03117 03118 ENTRY("disp_parser_t"); 03119 03120 if ( info ) 03121 fputs( info, stderr ); 03122 03123 if ( d == NULL ) 03124 { 03125 fprintf(stderr,"disp_parser_t: d == NULL\n" ); 03126 RETURN(-1); 03127 } 03128 03129 fprintf(stderr, "parser_t struct at %p :\n" 03130 " pcode = %p\n" 03131 " max_sym = %d\n", 03132 d, d->pcode, d->max_sym ); 03133 03134 if ( d->pcode ) 03135 { 03136 fprintf(stderr, " num_code = %d\n" 03137 " c_code = %s\n", 03138 d->pcode->num_code, d->pcode->c_code ); 03139 03140 fprintf(stderr, " has_sym ="); 03141 for ( c = 0; c < 26; c++ ) 03142 fprintf(stderr, " %d", d->has_sym[c]); 03143 fputc('\n', stderr); 03144 } 03145 03146 RETURN(0); 03147 } |
|
Definition at line 3077 of file SUMA_3dSurf2Vol.c. References s2v_opts_t::cmask, s2v_opts_t::datum, s2v_opts_t::debug, s2v_opts_t::dnode, s2v_opts_t::dvox, ENTRY, s2v_opts_t::f_index, s2v_opts_t::f_p1_fr, s2v_opts_t::f_p1_mm, s2v_opts_t::f_pn_fr, s2v_opts_t::f_pn_mm, s2v_opts_t::f_steps, s2v_opts_t::map, s2v_opts_t::noscale, RETURN, and s2v_opts_t::sxyz_ori_gpar. Referenced by set_smap_opts().
03078 { 03079 ENTRY("disp_s2v_opts_t"); 03080 03081 if ( info ) 03082 fputs( info, stderr ); 03083 03084 if ( sopt == NULL ) 03085 { 03086 fprintf(stderr,"disp_s2v_opts_t: sopt == NULL\n" ); 03087 RETURN(-1); 03088 } 03089 03090 fprintf(stderr, 03091 "s2v_opts_t struct at %p :\n" 03092 " map, datum, noscale = %d, %d, %d\n" 03093 " debug, dnode, dvox = %d, %d, %d\n" 03094 " sxyz_ori_gpar = %d\n" 03095 " cmask = %p\n" 03096 " f_steps, f_index = %d, %d\n" 03097 " f_p1_fr, f_pn_fr = %f, %f\n" 03098 " f_p1_mm, f_pn_mm = %f, %f\n" 03099 , sopt, 03100 sopt->map, sopt->datum, sopt->noscale, 03101 sopt->debug, sopt->dnode, sopt->dvox, sopt->sxyz_ori_gpar, 03102 sopt->cmask, sopt->f_steps, sopt->f_index, 03103 sopt->f_p1_fr, sopt->f_pn_fr, sopt->f_p1_mm, sopt->f_pn_mm 03104 ); 03105 03106 RETURN(0); 03107 } |
|
Definition at line 3196 of file SUMA_3dSurf2Vol.c. References ENTRY, RETURN, and THD_fvec3::xyz. Referenced by adjust_endpts(), compute_results(), dump_surf_3dt(), and v2s_adjust_endpts().
03197 { 03198 double d0, d1, d2; 03199 03200 ENTRY("dist_f3mm"); 03201 03202 if ( p1 == NULL || p2 == NULL ) 03203 { 03204 fprintf( stderr, "** dist_f3mm: invalid params (%p,%p)\n", p1, p2 ); 03205 RETURN(0.0); 03206 } 03207 03208 d0 = p1->xyz[0] - p2->xyz[0]; 03209 d1 = p1->xyz[1] - p2->xyz[1]; 03210 d2 = p1->xyz[2] - p2->xyz[2]; 03211 03212 RETURN(sqrt(d0*d0 + d1*d1 + d2*d2)); 03213 } |
|
Definition at line 3221 of file SUMA_3dSurf2Vol.c. References c, ENTRY, RETURN, and THD_fvec3::xyz. Referenced by compute_results(), dump_surf_3dt(), insert_list(), and segment_imarr().
03222 { 03223 int c; 03224 03225 ENTRY("f3mm_out_of_bounds"); 03226 03227 if ( !cp || !min || !max ) 03228 RETURN(-1); 03229 03230 for ( c = 0; c < 3; c++ ) 03231 { 03232 if ( ( cp->xyz[c] < min->xyz[c] ) || 03233 ( cp->xyz[c] > max->xyz[c] ) ) 03234 RETURN(-1); 03235 } 03236 03237 RETURN(0); 03238 } |
|
Definition at line 1394 of file SUMA_3dSurf2Vol.c. References opts_t::debug, disp_node_list_t(), ENTRY, param_t::nsubs, MRI_IMAGE::nx, p, param_t::parser, parser_t::pcode, RETURN, opts_t::sdata_file_1D, sdata_from_1D(), sdata_from_default(), param_t::sdata_im, and verify_node_list(). Referenced by read_surf_files().
01395 { 01396 int rv; 01397 01398 ENTRY("fill_node_list"); 01399 01400 if ( !opts || !p || !N ) 01401 { 01402 fprintf(stderr,"** fill_node_list: bad params (%p,%p,%p)\n",opts,p,N); 01403 RETURN(-1); 01404 } 01405 01406 p->nsubs = 1; /* unless we get additional surface data */ 01407 01408 if ( opts->sdata_file_1D ) 01409 { 01410 if ( (rv = sdata_from_1D( opts, p, N )) != 0 ) 01411 RETURN(rv); 01412 if ( ! p->parser.pcode ) 01413 p->nsubs = p->sdata_im->nx - 1; 01414 } 01415 else 01416 { 01417 if ( (rv = sdata_from_default( N )) != 0 ) 01418 RETURN(rv); 01419 } 01420 01421 if ( (rv = verify_node_list( N )) != 0 ) 01422 RETURN(rv); 01423 01424 if ( opts->debug > 1 ) 01425 disp_node_list_t( "++ node list filled: ", N ); 01426 01427 RETURN(0); 01428 } |
|
Definition at line 1628 of file SUMA_3dSurf2Vol.c. References opts_t::debug, SUMA_CommonFields::DsetList, ENTRY, SUMA_CommonFields::InOut_Notify, SUMA_CommonFields::MemTrace, SUMA_SurfSpecFile::N_Groups, SUMA_SurfSpecFile::N_Surfs, RETURN, S2V_MAX_SURFS, opts_t::snames, opts_t::spec_file, SUMA_Alloc_DisplayObject_Struct(), SUMA_Create_CommonFields(), SUMA_LoadSpec_eng(), SUMA_MAX_DISPLAYABLE_OBJECTS, SUMA_Read_SpecFile(), SUMA_ShowSpecStruct(), SUMA_spec_select_surfs(), SUMA_spec_set_map_refs(), SUMAg_N_DOv, and opts_t::sv_file. Referenced by read_surf_files().
01629 { 01630 int debug = 0, rv; 01631 ENTRY("fill_SUMA_structs"); 01632 01633 if ( opts->debug > 2 ) 01634 debug = 1; 01635 01636 if ( debug ) 01637 fputs( "-- SUMA_Create_CommonFields()...\n", stderr ); 01638 01639 if ( opts->spec_file == NULL ) 01640 RETURN(-1); 01641 01642 /* initialize common fields struct */ 01643 SUMAg_CF = SUMA_Create_CommonFields(); 01644 01645 if ( SUMAg_CF == NULL ) 01646 { 01647 fprintf( stderr, "** failed SUMA_Create_CommonFields(), exiting...\n" ); 01648 RETURN(-1); 01649 } 01650 01651 /* for SUMA type notifications */ 01652 if ( opts->debug > 3 ) 01653 { 01654 SUMAg_CF->MemTrace = 1; 01655 01656 if ( opts->debug > 4 ) 01657 SUMAg_CF->InOut_Notify = 1; 01658 } 01659 01660 if ( debug ) 01661 fputs( "-- SUMA_Alloc_DisplayObject_Struct()...\n", stderr ); 01662 01663 SUMAg_DOv = SUMA_Alloc_DisplayObject_Struct(SUMA_MAX_DISPLAYABLE_OBJECTS); 01664 01665 if ( debug ) 01666 fputs( "-- SUMA_Read_SpecFile()...\n", stderr ); 01667 01668 if ( SUMA_Read_SpecFile( opts->spec_file, spec) == 0 ) 01669 { 01670 fprintf( stderr, "** failed SUMA_Read_SpecFile(), exiting...\n" ); 01671 RETURN(-1); 01672 } 01673 01674 if ( debug ) 01675 SUMA_ShowSpecStruct(spec, stderr, 1); 01676 01677 rv = SUMA_spec_select_surfs(spec, opts->snames, S2V_MAX_SURFS, opts->debug); 01678 if ( rv < 1 ) 01679 { 01680 if ( rv == 0 ) 01681 fprintf(stderr,"** no named surfaces found in spec file\n"); 01682 RETURN(-1); 01683 } 01684 01685 if ( opts->debug > 0 ) 01686 SUMA_ShowSpecStruct(spec, stderr, 1); 01687 01688 if ( SUMA_spec_set_map_refs(spec, opts->debug) != 0 ) 01689 RETURN(-1); 01690 01691 /* make sure only group was read from spec file */ 01692 if ( spec->N_Groups != 1 ) 01693 { 01694 fprintf( stderr,"** error: N_Groups <%d> must be 1 in spec file <%s>\n", 01695 spec->N_Groups, opts->spec_file ); 01696 RETURN(-1); 01697 } 01698 01699 if ( debug ) 01700 fputs( "-- SUMA_LoadSpec_eng()...\n", stderr ); 01701 01702 /* actually load the surface(s) from the spec file */ 01703 if (SUMA_LoadSpec_eng(spec,SUMAg_DOv,&SUMAg_N_DOv,opts->sv_file,debug, 01704 SUMAg_CF->DsetList) == 0) /* DsetList - 26 Mar 2004 [ziad] */ 01705 { 01706 fprintf( stderr, "** error: failed SUMA_LoadSpec_eng(), exiting...\n" ); 01707 RETURN(-1); 01708 } 01709 01710 if ( opts->debug > 1 ) 01711 fprintf(stderr, "++ %d surfaces loaded.\n", spec->N_Surfs ); 01712 01713 RETURN(0); 01714 } |
|
Definition at line 1277 of file SUMA_3dSurf2Vol.c.
01278 { 01279 ENTRY("final_clean_up"); 01280 01281 if ( ( SUMAg_DOv != NULL ) && 01282 ( SUMA_Free_Displayable_Object_Vect(SUMAg_DOv, SUMAg_N_DOv) == 0 ) ) 01283 fprintf(stderr, "** failed SUMA_Free_Displayable_Object_Vect()\n" ); 01284 01285 if ( ( SUMAg_SVv != NULL ) && 01286 ( SUMA_Free_SurfaceViewer_Struct_Vect(SUMAg_SVv, SUMAg_N_SVv) == 0 ) ) 01287 fprintf( stderr, "** failed SUMA_Free_SurfaceViewer_Struct_Vect()\n" ); 01288 01289 if ( ( SUMAg_CF != NULL ) && ( SUMA_Free_CommonFields(SUMAg_CF) == 0 ) ) 01290 fprintf( stderr, "** failed SUMA_Free_CommonFields()\n" ); 01291 01292 if ( N ) 01293 { 01294 if ( N->nodes ) free( N->nodes ); 01295 if ( N->fdata ) free( N->fdata ); 01296 if ( N->ilist ) free( N->ilist ); 01297 } 01298 01299 RETURN(0); 01300 } |
|
Definition at line 499 of file SUMA_3dSurf2Vol.c. References s2v_opts_t::debug, s2v_opts_t::dvox, ENTRY, s2v_opts_t::map, and RETURN. Referenced by compute_results().
00500 { 00501 int index; 00502 00503 ENTRY("final_computations"); 00504 00505 if ( (sopt->debug > 1) && (sopt->dvox >= 0) && (sopt->dvox < nvox) ) 00506 fprintf(stderr,"++ final: voxel %d, from values (%d, %f) ", 00507 sopt->dvox,cdata[sopt->dvox],ddata[sopt->dvox]); 00508 00509 switch ( sopt->map ) 00510 { 00511 default: 00512 fprintf(stderr,"** fc: mapping %d not ready\n", sopt->map ); 00513 RETURN(-1); 00514 00515 case E_SMAP_AVE: 00516 /* we have sum, divide for average */ 00517 for ( index = 0; index < nvox; index++ ) 00518 if ( cdata[index] > 0 ) 00519 ddata[index] /= cdata[index]; 00520 break; 00521 00522 case E_SMAP_COUNT: 00523 case E_SMAP_MAX_ABS: 00524 case E_SMAP_MAX: 00525 case E_SMAP_MIN: 00526 case E_SMAP_MASK: 00527 case E_SMAP_MASK2: 00528 break; 00529 } 00530 00531 if ( (sopt->debug > 1) && (sopt->dvox >= 0) && (sopt->dvox < nvox) ) 00532 fprintf(stderr,"to values (%d, %f)\n", 00533 cdata[sopt->dvox],ddata[sopt->dvox]); 00534 00535 RETURN(0); 00536 } |
|
Definition at line 1138 of file SUMA_3dSurf2Vol.c.
01139 { 01140 SUMA_SurfaceObject * so; 01141 int count, socount = 0; 01142 01143 ENTRY("get_mappable_surfts"); 01144 01145 if ( slist == NULL ) 01146 { 01147 fprintf( stderr, "** gms: missing slist!\n" ); 01148 RETURN(-1); 01149 } 01150 01151 for ( count = 0; count < SUMAg_N_DOv; count++ ) 01152 { 01153 if ( ! SUMA_isSO(SUMAg_DOv[count]) ) 01154 continue; 01155 01156 so = (SUMA_SurfaceObject *)SUMAg_DOv[count].OP; 01157 01158 if ( ! so->AnatCorrect ) 01159 { 01160 if ( debug ) 01161 fprintf(stderr,"-- surf #%d '%s', anat not correct, skipping\n", 01162 socount, CHECK_NULL_STR(so->Label)); 01163 if ( debug > 1 ) 01164 fprintf(stderr,"** consider adding the following to the " 01165 "surface definition in the spec file:\n" 01166 " Anatomical = Y\n"); 01167 continue; 01168 } 01169 01170 if ( debug > 1 ) 01171 { 01172 fprintf( stderr, "\n---------- surface #%d '%s' -----------\n", 01173 socount, CHECK_NULL_STR(so->Label) ); 01174 SUMA_Print_Surface_Object( so, stderr ); 01175 } 01176 01177 if ( socount < how_many ) /* store a good surface */ 01178 slist[socount] = so; 01179 01180 socount++; 01181 } 01182 01183 if ( debug > 1 ) 01184 fprintf( stderr, "++ found %d mappable surfaces\n", socount ); 01185 01186 RETURN(socount); 01187 } |
|
Definition at line 906 of file SUMA_3dSurf2Vol.c. References s2v_opts_t::debug, ENTRY, node_list_t::fdata, gs2v_map_names, node_list_t::ilist, s2v_opts_t::map, node_list_t::nodes, p, RETURN, S2V_MAX_SURFS, SUMAg_N_DOv, surf_to_node_list(), sxyz_1D_to_nlist(), and param_t::sxyz_im. Referenced by read_surf_files().
00907 { 00908 int nsurf, rv; 00909 00910 ENTRY("init_node_list"); 00911 00912 if ( opts == NULL || p == NULL || sopt == NULL || N == NULL ) 00913 { 00914 fprintf(stderr, "** inl - bad params (%p,%p,%p,%p)\n",opts,p,sopt,N); 00915 RETURN(-1); 00916 } 00917 00918 memset(N,0,sizeof(*N)); /* first, clear it out - have care w/pointers */ 00919 N->nodes = NULL; N->fdata = NULL; N->ilist = NULL; 00920 00921 nsurf = SUMAg_N_DOv; /* verify, as long as there is no sxyz_im */ 00922 if ( !p->sxyz_im && ((nsurf < 1) || (nsurf > S2V_MAX_SURFS)) ) 00923 { 00924 fprintf(stderr,"** inl: SUMAg_N_DOv has invalid value of %d\n", nsurf); 00925 RETURN(-1); 00926 } 00927 00928 #if 0 /* remove requrement of 2 surfaces for functions [v3.0] */ 00929 00930 if ( sopt->map == E_SMAP_MASK ) 00931 nsurf = 1; 00932 else 00933 { 00934 /* do a quick check before slow reading action */ 00935 if ( ! p->sxyz_im && (SUMAg_N_DOv < 2) ) 00936 { 00937 fprintf(stderr,"** function '%s' requires 2 surfaces\n", 00938 gs2v_map_names[sopt->map]); 00939 RETURN(-1); 00940 } 00941 00942 nsurf = 2; 00943 } 00944 #endif 00945 00946 if ( p->sxyz_im ) 00947 rv = sxyz_1D_to_nlist( opts, sopt, p, N, &nsurf ); 00948 else 00949 rv = surf_to_node_list( sopt, N, nsurf ); 00950 00951 if ( sopt->debug > 1 && rv == 0 ) /* errors reported separately */ 00952 fprintf(stderr,"++ node list initialized\n"); 00953 00954 RETURN(rv); 00955 } |
|
Definition at line 1721 of file SUMA_3dSurf2Vol.c.
01722 { 01723 int ac, ind; 01724 01725 ENTRY("init_options"); 01726 01727 if ( argc < 2 ) 01728 { 01729 usage( PROG_NAME, S2V_USE_LONG ); 01730 RETURN(-1); 01731 } 01732 01733 /* clear out the options structure, pointers get explicit NULL */ 01734 memset( opts, 0, sizeof( opts_t) ); 01735 opts->gpar_file = NULL; opts->oset_file = NULL; 01736 opts->spec_file = NULL; opts->sv_file = NULL; 01737 opts->surf_xyz_1D_file = NULL; opts->sdata_file_1D = NULL; 01738 opts->sdata_file_niml = NULL; opts->cmask_cmd = NULL; 01739 opts->data_expr = NULL; opts->map_str = NULL; 01740 opts->datum_str = NULL; opts->f_index_str = NULL; 01741 opts->snames[0] = NULL; opts->snames[1] = NULL; 01742 01743 01744 opts->dnode = -1; /* init to something invalid */ 01745 opts->dvox = -1; /* init to something invalid */ 01746 01747 for ( ac = 1; ac < argc; ac++ ) 01748 { 01749 /* alphabetical... */ 01750 if ( ! strncmp(argv[ac], "-cmask", 6) ) 01751 { 01752 if ( (ac+1) >= argc ) 01753 { 01754 fputs( "option usage: -cmask COMMAND\n\n", stderr ); 01755 usage( PROG_NAME, S2V_USE_SHORT ); 01756 RETURN(-1); 01757 } 01758 01759 opts->cmask_cmd = argv[++ac]; 01760 } 01761 else if ( ! strncmp(argv[ac], "-data_expr", 8) ) 01762 { 01763 if ( (ac+1) >= argc ) 01764 { 01765 fputs( "option usage: -data_expr EXPR\n\n", stderr ); 01766 usage( PROG_NAME, S2V_USE_SHORT ); 01767 RETURN(-1); 01768 } 01769 01770 opts->data_expr = argv[++ac]; 01771 } 01772 else if ( ! strncmp(argv[ac], "-datum", 6) ) 01773 { 01774 if ( (ac+1) >= argc ) 01775 { 01776 fputs( "option usage: -datum DTYPE\n\n", stderr ); 01777 usage( PROG_NAME, S2V_USE_SHORT ); 01778 RETURN(-1); 01779 } 01780 01781 opts->datum_str = argv[++ac]; 01782 } 01783 else if ( ! strncmp(argv[ac], "-debug", 6) ) 01784 { 01785 if ( (ac+1) >= argc ) 01786 { 01787 fputs( "option usage: -debug LEVEL\n\n", stderr ); 01788 usage( PROG_NAME, S2V_USE_SHORT ); 01789 RETURN(-1); 01790 } 01791 01792 opts->debug = atoi(argv[++ac]); 01793 if ( opts->debug < 0 || opts->debug > S2V_DEBUG_MAX_LEV ) 01794 { 01795 fprintf( stderr, "bad debug level <%d>, should be in [0,%d]\n", 01796 opts->debug, S2V_DEBUG_MAX_LEV ); 01797 usage( PROG_NAME, S2V_USE_SHORT ); 01798 RETURN(-1); 01799 } 01800 } 01801 else if ( ! strncmp(argv[ac], "-dnode", 6) ) 01802 { 01803 if ( (ac+1) >= argc ) 01804 { 01805 fputs( "option usage: -dnode DEBUG_NODE\n\n", stderr ); 01806 usage( PROG_NAME, S2V_USE_SHORT ); 01807 RETURN(-1); 01808 } 01809 01810 opts->dnode = atoi(argv[++ac]); 01811 } 01812 else if ( ! strncmp(argv[ac], "-dvoxel", 5) ) 01813 { 01814 if ( (ac+1) >= argc ) 01815 { 01816 fputs( "option usage: -dvoxel DEBUG_VOXEL\n\n", stderr ); 01817 usage( PROG_NAME, S2V_USE_SHORT ); 01818 RETURN(-1); 01819 } 01820 01821 opts->dvox = atoi(argv[++ac]); 01822 } 01823 else if ( ! strncmp(argv[ac], "-f_index", 7) ) 01824 { 01825 if ( (ac+1) >= argc ) 01826 { 01827 fputs( "option usage: -f_index INDEX_TYPE\n\n", stderr ); 01828 usage( PROG_NAME, S2V_USE_SHORT ); 01829 RETURN(-1); 01830 } 01831 opts->f_index_str = argv[++ac]; 01832 } 01833 else if ( ! strncmp(argv[ac], "-f_p1_fr", 9) ) 01834 { 01835 if ( (ac+1) >= argc ) 01836 { 01837 fputs( "option usage: -f_p1_fr FRACTION\n\n", stderr ); 01838 usage( PROG_NAME, S2V_USE_SHORT ); 01839 RETURN(-1); 01840 } 01841 01842 opts->f_p1_fr = atof(argv[++ac]); 01843 } 01844 else if ( ! strncmp(argv[ac], "-f_pn_fr", 9) ) 01845 { 01846 if ( (ac+1) >= argc ) 01847 { 01848 fputs( "option usage: -f_pn_fr FRACTION\n\n", stderr ); 01849 usage( PROG_NAME, S2V_USE_SHORT ); 01850 RETURN(-1); 01851 } 01852 01853 opts->f_pn_fr = atof(argv[++ac]); 01854 } 01855 else if ( ! strncmp(argv[ac], "-f_p1_mm", 9) ) 01856 { 01857 if ( (ac+1) >= argc ) 01858 { 01859 fputs( "option usage: -f_p1_mm DISTANCE\n\n", stderr ); 01860 usage( PROG_NAME, S2V_USE_SHORT ); 01861 RETURN(-1); 01862 } 01863 01864 opts->f_p1_mm = atof(argv[++ac]); 01865 } 01866 else if ( ! strncmp(argv[ac], "-f_pn_mm", 9) ) 01867 { 01868 if ( (ac+1) >= argc ) 01869 { 01870 fputs( "option usage: -f_pn_mm DISTANCE\n\n", stderr ); 01871 usage( PROG_NAME, S2V_USE_SHORT ); 01872 RETURN(-1); 01873 } 01874 01875 opts->f_pn_mm = atof(argv[++ac]); 01876 } 01877 else if ( ! strncmp(argv[ac], "-f_steps", 6) ) 01878 { 01879 if ( (ac+1) >= argc ) 01880 { 01881 fputs( "option usage: -f_steps NUM_STEPS\n\n", stderr ); 01882 usage( PROG_NAME, S2V_USE_SHORT ); 01883 RETURN(-1); 01884 } 01885 01886 opts->f_steps = atoi(argv[++ac]); 01887 } 01888 else if ( ! strncmp(argv[ac], "-grid_parent", 5)|| 01889 ! strncmp(argv[ac], "-inset", 6) || 01890 ! strncmp(argv[ac], "-input", 6) ) 01891 01892 { 01893 if ( (ac+1) >= argc ) 01894 { 01895 fputs( "option usage: -grid_parent INPUT_DSET\n\n", stderr ); 01896 usage( PROG_NAME, S2V_USE_SHORT ); 01897 RETURN(-1); 01898 } 01899 01900 opts->gpar_file = argv[++ac]; 01901 } 01902 else if ( ! strncmp(argv[ac], "-help", 5) ) 01903 { 01904 usage( PROG_NAME, S2V_USE_LONG ); 01905 RETURN(-1); 01906 } 01907 else if ( ! strncmp(argv[ac], "-hist", 5) ) 01908 { 01909 usage( PROG_NAME, S2V_USE_HIST ); 01910 RETURN(-1); 01911 } 01912 else if ( ! strncmp(argv[ac], "-map_func", 4) ) /* mapping function */ 01913 { 01914 if ( (ac+1) >= argc ) 01915 { 01916 fputs( "option usage: -map_func FUNCTION\n\n", stderr ); 01917 RETURN(-1); 01918 } 01919 01920 opts->map_str = argv[++ac]; /* store user string for now */ 01921 } 01922 else if ( ! strncmp(argv[ac], "-noscale", 4) ) 01923 { 01924 opts->noscale = 1; 01925 } 01926 else if ( ! strncmp(argv[ac], "-prefix", 4) ) 01927 { 01928 if ( (ac+1) >= argc ) 01929 { 01930 fputs( "option usage: -prefix OUTPUT_PREFIX\n\n", stderr ); 01931 usage( PROG_NAME, S2V_USE_SHORT ); 01932 RETURN(-1); 01933 } 01934 01935 opts->oset_file = argv[++ac]; 01936 } 01937 else if ( ! strncmp(argv[ac], "-sdata_1D", 9) ) 01938 { 01939 if ( (ac+1) >= argc ) 01940 { 01941 fputs( "option usage: -sdata_1D SURF_DATA.1D\n\n", stderr ); 01942 usage( PROG_NAME, S2V_USE_SHORT ); 01943 RETURN(-1); 01944 } 01945 01946 opts->sdata_file_1D = argv[++ac]; 01947 } 01948 else if ( ! strncmp(argv[ac], "-sdata_niml", 9) ) 01949 { 01950 if ( (ac+1) >= argc ) 01951 { 01952 fputs( "option usage: -sdata_niml SURF_DATA.niml\n\n", stderr ); 01953 usage( PROG_NAME, S2V_USE_SHORT ); 01954 RETURN(-1); 01955 } 01956 01957 opts->sdata_file_niml = argv[++ac]; 01958 } 01959 else if ( ! strncmp(argv[ac], "-spec", 5) ) 01960 { 01961 if ( (ac+1) >= argc ) 01962 { 01963 fputs( "option usage: -spec SPEC_FILE\n\n", stderr ); 01964 usage( PROG_NAME, S2V_USE_SHORT ); 01965 RETURN(-1); 01966 } 01967 01968 opts->spec_file = argv[++ac]; 01969 } 01970 else if ( ! strncmp(argv[ac], "-surf_xyz_1D", 9) ) 01971 { 01972 if ( (ac+1) >= argc ) 01973 { 01974 fputs( "option usage: -surf_xyz_1D NODE_FILE\n\n", stderr ); 01975 usage( PROG_NAME, S2V_USE_SHORT ); 01976 RETURN(-1); 01977 } 01978 01979 opts->surf_xyz_1D_file = argv[++ac]; 01980 } 01981 else if ( ! strncmp(argv[ac], "-surf_", 6) ) 01982 { 01983 if ( (ac+1) >= argc ) 01984 { 01985 fputs( "option usage: -surf_X SURF_NAME\n\n", stderr ); 01986 usage( PROG_NAME, S2V_USE_SHORT ); 01987 RETURN(-1); 01988 } 01989 ind = argv[ac][6] - 'A'; 01990 if ( (ind < 0) || (ind >= S2V_MAX_SURFS) ) 01991 { 01992 fprintf(stderr,"** -surf_X option: '%s' out of range,\n" 01993 " use one of '-surf_A' through '-surf_%c'\n", 01994 argv[ac], 'A'+S2V_MAX_SURFS-1); 01995 RETURN(-1); 01996 } 01997 01998 opts->snames[ind] = argv[++ac]; 01999 } 02000 else if ( ! strncmp(argv[ac], "-sv", 3) ) 02001 { 02002 if ( (ac+1) >= argc ) 02003 { 02004 fputs( "option usage: -sv SURFACE_VOLUME\n\n", stderr ); 02005 usage( PROG_NAME, S2V_USE_SHORT ); 02006 RETURN(-1); 02007 } 02008 02009 opts->sv_file = argv[++ac]; 02010 } 02011 else if ( ! strncmp(argv[ac], "-sxyz_orient_as_gpar", 20) ) 02012 { 02013 opts->sxyz_ori_gpar = 1; 02014 } 02015 else if ( ! strncmp(argv[ac], "-version", 2) ) 02016 { 02017 usage( PROG_NAME, S2V_USE_VERSION ); 02018 RETURN(-1); 02019 } 02020 else /* invalid option */ 02021 { 02022 fprintf( stderr, "invalid option <%s>\n", argv[ac] ); 02023 usage( PROG_NAME, S2V_USE_SHORT ); 02024 RETURN(-1); 02025 } 02026 } 02027 02028 if ( opts->debug > 1 ) 02029 disp_opts_t ( "++ opts read: ", opts ); 02030 02031 RETURN(0); 02032 } |
|
Definition at line 552 of file SUMA_3dSurf2Vol.c. References s2v_opts_t::cmask, s2v_opts_t::debug, s2v_opts_t::dnode, DSET_NX, DSET_NY, ENTRY, param_t::f3mm_max, param_t::f3mm_min, f3mm_out_of_bounds(), s2v_opts_t::f_index, s2v_opts_t::f_steps, node_list_t::fdata, param_t::gpar, THD_ivec3::ijk, node_list_t::ilist, insert_value(), p, RETURN, S2V_F_INDEX_VOXEL, THD_3dmm_to_3dind(), and THD_fvec3::xyz. Referenced by compute_results().
00554 { 00555 THD_ivec3 i3; 00556 int vindex, prev_vind; 00557 int step, node; 00558 int nx, ny, debug; 00559 00560 ENTRY("insert_list"); 00561 00562 if ( !N || !p || !sopt || !pary || nindex < 0 || !ddata || !cdata ) 00563 { 00564 fprintf(stderr,"** ID params (%p,%p,%p,%p,%d,%p,%p)\n", 00565 N, p, sopt, pary, nindex, ddata, cdata); 00566 RETURN(-1); 00567 } 00568 00569 node = N->ilist[nindex]; 00570 00571 debug = sopt->debug && node == sopt->dnode; 00572 00573 if ( debug ) /* show xyz coords? */ 00574 fprintf(stderr,"++ point list for N[%d] = %d:\n", nindex, node); 00575 00576 nx = DSET_NX(p->gpar); 00577 ny = DSET_NY(p->gpar); 00578 prev_vind = -1; 00579 for ( step = 0; step < sopt->f_steps; step++ ) 00580 { 00581 if ( f3mm_out_of_bounds( pary+step, &p->f3mm_min, &p->f3mm_max ) ) 00582 continue; 00583 00584 i3 = THD_3dmm_to_3dind(p->gpar, pary[step]); 00585 vindex = i3.ijk[0] + nx * (i3.ijk[1] + ny * i3.ijk[2]); 00586 00587 if ( debug ) 00588 fprintf(stderr," %3d, vox %d, [%3d,%3d,%3d]: %f, %f, %f", 00589 step, vindex, i3.ijk[0], i3.ijk[1], i3.ijk[2], 00590 pary[step].xyz[0], pary[step].xyz[1], pary[step].xyz[2]); 00591 00592 if ( sopt->cmask && !sopt->cmask[vindex] ) 00593 { 00594 if ( debug ) fprintf(stderr, " : skip (mask)\n"); 00595 continue; 00596 } 00597 00598 if ( (vindex == prev_vind) && (sopt->f_index == S2V_F_INDEX_VOXEL) ) 00599 { 00600 if ( debug ) fprintf(stderr, " : skip (repeat voxel)\n"); 00601 continue; 00602 } 00603 00604 /* hey, we finally have a new voxel to add */ 00605 00606 prev_vind = vindex; 00607 00608 if ( debug ) 00609 fprintf( stderr, " : (old) %d %f", cdata[vindex],ddata[vindex]); 00610 00611 if (insert_value(sopt, ddata, cdata, vindex, node, N->fdata[nindex])) 00612 RETURN(-1); 00613 00614 if ( debug ) 00615 fprintf( stderr, " : (new) %d %f\n", cdata[vindex],ddata[vindex]); 00616 } 00617 00618 RETURN(0); 00619 } |
|
Definition at line 629 of file SUMA_3dSurf2Vol.c. References s2v_opts_t::debug, s2v_opts_t::dvox, ENTRY, s2v_opts_t::map, and RETURN. Referenced by insert_list().
00631 { 00632 ENTRY("insert_value"); 00633 00634 if ( !sopt || !dv || !cv || vox < 0 ) 00635 { 00636 fprintf(stderr, "** IV: bad params (%p,%p,%p,%d)\n",sopt,dv,cv,vox); 00637 RETURN(-1); 00638 } 00639 00640 if ( (sopt->debug > 1) && (vox == sopt->dvox) ) 00641 fprintf(stderr,"++ voxel %d, node %d, values (%d, %f) ", 00642 vox, node, cv[vox], dv[vox]); 00643 00644 switch ( sopt->map ) 00645 { 00646 default: 00647 fprintf(stderr,"** IV: mapping %d not ready\n", sopt->map ); 00648 RETURN(-1); 00649 00650 case E_SMAP_AVE: 00651 if ( cv[vox] == 0 ) 00652 dv[vox] = value; 00653 else 00654 dv[vox] += value; /* divide by count later */ 00655 break; 00656 00657 case E_SMAP_COUNT: 00658 if ( cv[vox] == 0 ) 00659 dv[vox] = 1.0; 00660 else 00661 dv[vox]++; 00662 break; 00663 00664 case E_SMAP_MAX: 00665 if ( cv[vox] == 0 ) 00666 dv[vox] = value; 00667 else if (value > dv[vox]) 00668 dv[vox] = value; 00669 00670 break; 00671 00672 case E_SMAP_MAX_ABS: 00673 if ( cv[vox] == 0 ) 00674 dv[vox] = value; 00675 else if (fabs(value) > fabs(dv[vox])) 00676 dv[vox] = value; 00677 00678 break; 00679 00680 case E_SMAP_MIN: 00681 if ( cv[vox] == 0 ) 00682 dv[vox] = value; 00683 else if (value < dv[vox]) 00684 dv[vox] = value; 00685 00686 break; 00687 00688 case E_SMAP_MASK: 00689 case E_SMAP_MASK2: 00690 dv[vox] = 1.0; 00691 break; 00692 } 00693 00694 cv[vox]++; /* in any case, increment the counter */ 00695 00696 if ( (sopt->debug > 1) && (vox == sopt->dvox) ) 00697 fprintf(stderr,"to (%d, %f)\n",cv[vox],dv[vox]); 00698 00699 RETURN(0); 00700 } |
|
Definition at line 3246 of file SUMA_3dSurf2Vol.c. Referenced by s2v_nodes2volume().
|
|
Definition at line 14 of file machdep.c.
00015 { 00016 /*-- force use of mcw_malloc.c functions - 05 Nov 2001 --*/ 00017 00018 #ifdef USING_MCW_MALLOC 00019 if( AFNI_yesenv("AFNI_FORCE_MCW_MALLOC") ) enable_mcw_malloc(); 00020 #endif 00021 00022 /*-- disable mmap() in malloc() [21 Aug 2002: mostly] --*/ 00023 00024 #if defined(LINUX) && defined(M_MMAP_MAX) 00025 mallopt( M_MMAP_MAX , 1 ) ; 00026 #endif 00027 00028 } |
|
\** File : SUMA.c
Input paramters :
Definition at line 160 of file SUMA_3dSurf2Vol.c. References AFNI_logger(), argc, final_clean_up(), init_options(), machdep(), mainENTRY, read_surf_files(), set_smap_opts(), validate_options(), and write_output().
00161 { 00162 SUMA_SurfSpecFile spec; 00163 node_list_t node_list; 00164 param_t params; 00165 s2v_opts_t sopt; 00166 opts_t opts; 00167 int ret_val; 00168 00169 mainENTRY("3dSurf2Vol main"); 00170 machdep(); 00171 AFNI_logger("3dSurf2Vol",argc,argv); 00172 00173 /* validate inputs and init options structure */ 00174 if ( ( ret_val = init_options(&opts, argc, argv) ) != 0 ) 00175 return ret_val; 00176 00177 if ( ( ret_val = validate_options(&opts, ¶ms) ) != 0 ) 00178 return ret_val; 00179 00180 if ( (ret_val = set_smap_opts( &opts, ¶ms, &sopt )) != 0 ) 00181 return ret_val; 00182 00183 /* read surface files */ 00184 ret_val = read_surf_files(&opts, ¶ms, &spec, &sopt, &node_list); 00185 00186 if ( ret_val == 0 ) 00187 ret_val = write_output( &sopt, &opts, ¶ms, &node_list, argc, argv ); 00188 00189 /* free memory */ 00190 final_clean_up( &node_list ); 00191 00192 return ret_val; 00193 } |
|
Definition at line 710 of file SUMA_3dSurf2Vol.c. References ENTRY, s2v_opts_t::f_steps, RETURN, and THD_fvec3::xyz. Referenced by compute_results().
00712 { 00713 float rat1, ratn; 00714 int step; 00715 00716 ENTRY("make_point_list"); 00717 00718 if ( !list || !p1 || !pn || !sopt ) 00719 { 00720 fprintf(stderr,"** mpl: bad params (%p,%p,%p,%p)\n", list,p1,pn,sopt); 00721 RETURN(-1); 00722 } 00723 00724 list[0] = *p1; 00725 00726 for ( step = 1; step < sopt->f_steps; step++ ) 00727 { 00728 ratn = step / (sopt->f_steps - 1.0); 00729 rat1 = 1.0 - ratn; 00730 00731 list[step].xyz[0] = rat1 * p1->xyz[0] + ratn * pn->xyz[0]; 00732 list[step].xyz[1] = rat1 * p1->xyz[1] + ratn * pn->xyz[1]; 00733 list[step].xyz[2] = rat1 * p1->xyz[2] + ratn * pn->xyz[2]; 00734 } 00735 00736 RETURN(0); 00737 } |
|
Definition at line 1307 of file SUMA_3dSurf2Vol.c.
01309 { 01310 int rv; 01311 01312 ENTRY("read_surf_files"); 01313 01314 /* get surface coordinates */ 01315 if ( opts->spec_file ) 01316 { 01317 if ( (rv = fill_SUMA_structs(opts, spec)) != 0 ) 01318 RETURN(rv); 01319 } 01320 else if ( opts->surf_xyz_1D_file ) 01321 { 01322 if ( (rv = read_sxyz_1D( opts, p )) != 0 ) 01323 RETURN(rv); 01324 } 01325 else 01326 { 01327 fprintf(stderr,"** missing spec or sdata file, exiting...\n"); 01328 RETURN(-1); 01329 } 01330 01331 /* assign node list nodes (xyz coords) */ 01332 if ( (rv = init_node_list(opts, p, sopt, N)) != 0 ) 01333 RETURN(rv); 01334 01335 /* check status and allocate memory in node list */ 01336 if ( (rv = fill_node_list(opts, p, N)) != 0 ) 01337 RETURN(rv); 01338 01339 if ( (rv = verify_parser_expr(opts, p)) != 0 ) 01340 RETURN(rv); 01341 01342 RETURN(0); 01343 } |
|
Definition at line 1350 of file SUMA_3dSurf2Vol.c. References opts_t::debug, ENTRY, mri_free(), mri_read_1D(), mri_transpose(), MRI_IMAGE::nx, MRI_IMAGE::ny, p, RETURN, opts_t::surf_xyz_1D_file, and param_t::sxyz_im. Referenced by read_surf_files().
01351 { 01352 MRI_IMAGE * im; 01353 01354 ENTRY("read_sxyz_1D"); 01355 01356 if ( !opts || !p ) 01357 { 01358 fprintf(stderr,"** rsxyz1D: bad params (%p,%p)\n", opts, p); 01359 RETURN(-1); 01360 } 01361 01362 if ( (im = mri_read_1D(opts->surf_xyz_1D_file)) == NULL ) 01363 { 01364 fprintf(stderr,"** failed to read sxyz 1D file '%s'\n", 01365 opts->surf_xyz_1D_file); 01366 RETURN(-1); 01367 } 01368 if ( im->nx < 1 || im->ny < 3 ) /* must have xyz coords, at least */ 01369 { 01370 fprintf(stderr,"** bad sxyz file '%s'?\n", opts->surf_xyz_1D_file); 01371 RETURN(-1); 01372 } 01373 01374 /* transpose list to node-major order, and lose temp image */ 01375 p->sxyz_im = mri_transpose(im); 01376 mri_free(im); 01377 01378 if ( opts->debug > 0 ) 01379 fprintf(stderr,"++ read 1D xyz surface file '%s' (nx = %d, ny = %d)\n", 01380 opts->surf_xyz_1D_file, p->sxyz_im->nx, p->sxyz_im->ny ); 01381 01382 RETURN(0); 01383 } |
|
Definition at line 2172 of file SUMA_3dSurf2Vol.c. References ENTRY, gs2v_map_names, RETURN, and s2v_map_num. Referenced by check_map_func().
02173 { 02174 s2v_map_num map; 02175 02176 ENTRY("s2v_map_type"); 02177 02178 if ( map_str == NULL ) 02179 { 02180 fprintf( stderr, "** s2v_map_type: missing map_str parameter\n" ); 02181 RETURN((int)E_SMAP_INVALID); 02182 } 02183 02184 if ( sizeof(gs2v_map_names) / sizeof(char *) != (int)E_SMAP_FINAL ) 02185 { 02186 fprintf( stderr, "** error: gs2v_map_names/s2v_map_num mis-match\n"); 02187 RETURN((int)E_SMAP_INVALID); 02188 } 02189 02190 for ( map = E_SMAP_MASK; map < E_SMAP_FINAL; map++ ) 02191 if ( !strcmp( map_str, gs2v_map_names[map] ) ) 02192 RETURN((int)map); 02193 02194 RETURN((int)E_SMAP_INVALID); 02195 } |
|
Definition at line 254 of file SUMA_3dSurf2Vol.c. References ADN_datum_all, ADN_func_type, ADN_none, ADN_ntt, ADN_nvals, ADN_type, amax, compute_results(), s2v_opts_t::datum, s2v_opts_t::debug, DSET_BRICK_FACTOR, DSET_delete, DSET_HEADNAME, DSET_NVOX, EDIT_coerce_scale_type(), EDIT_dset_items(), EDIT_empty_copy(), EDIT_substitute_brick(), ENTRY, s2v_opts_t::f_steps, free, FUNC_BUCK_TYPE, param_t::gpar, HEAD_FUNC_TYPE, integral_doubles(), ISVALID_3DIM_DATASET, ISVALID_DSET, malloc, MCW_vol_amax(), mri_datum_size(), MRI_IS_INT_TYPE, s2v_opts_t::noscale, param_t::nsubs, p, RETURN, and set_node_list_data(). Referenced by write_output().
00256 { 00257 THD_3dim_dataset * dout; 00258 THD_fvec3 * pary; 00259 double * ddata; 00260 void * vdata = NULL; 00261 int * cdata; 00262 float fac; 00263 int nvox, dsize, valid; 00264 int sub; 00265 00266 ENTRY("s2v_nodes2volume"); 00267 00268 if ( N == NULL || ! ISVALID_DSET(p->gpar) ) 00269 { 00270 fprintf(stderr,"** s2v_nodes2volume: bad params (%p,%p)\n", N, p->gpar); 00271 RETURN(NULL); 00272 } 00273 00274 dout = EDIT_empty_copy( p->gpar ); 00275 if ( ! ISVALID_3DIM_DATASET( dout ) ) 00276 { 00277 fprintf( stderr, "** failed EDIT_empty_copy()\n" ); 00278 RETURN(NULL); 00279 } 00280 00281 /* output dataset will have nsubs sub-bricks */ 00282 EDIT_dset_items( dout, ADN_nvals, p->nsubs, 00283 ADN_type, HEAD_FUNC_TYPE, 00284 ADN_func_type, FUNC_BUCK_TYPE, 00285 ADN_datum_all, sopt->datum, 00286 ADN_ntt, 0, 00287 ADN_none ); 00288 00289 if ( sopt->debug > 1 ) 00290 fprintf( stderr, "++ creating dataset '%s' of type '%s', nvals = %d\n", 00291 DSET_HEADNAME(dout), MRI_TYPE_name[sopt->datum], p->nsubs ); 00292 00293 nvox = DSET_NVOX(p->gpar); 00294 00295 /* allocate a computational array of doubles */ 00296 if ( (ddata = (double *)malloc(nvox * sizeof(double))) == NULL ) 00297 { 00298 fprintf( stderr, "** n2v: failed to allocate %d doubles\n", nvox ); 00299 DSET_delete( dout ); 00300 RETURN(NULL); 00301 } 00302 00303 /* allocate an array of ints for functional counting */ 00304 if ( (cdata = (int *)malloc(nvox * sizeof(int))) == NULL ) 00305 { 00306 fprintf( stderr, "** n2v: failed to allocate %d ints\n", nvox ); 00307 DSET_delete( dout ); free( ddata ); 00308 RETURN(NULL); 00309 } 00310 00311 /* allocate space for the point list */ 00312 if ( (pary = (THD_fvec3 *)malloc(sopt->f_steps*sizeof(THD_fvec3))) == NULL ) 00313 { 00314 fprintf(stderr,"** n2v: cannot allocate %d THD_fvec3s\n",sopt->f_steps); 00315 DSET_delete( dout ); free( ddata ); free( cdata ); 00316 RETURN(NULL); 00317 } 00318 00319 dsize = mri_datum_size(sopt->datum); 00320 /* create the sub-brick data for output */ 00321 for ( sub = 0; sub < p->nsubs; sub++ ) 00322 { 00323 valid = 0; 00324 00325 /* need new data after each sub-brick is attached to the dset */ 00326 if ( (vdata = malloc( nvox * dsize )) == NULL ) 00327 { 00328 fprintf( stderr, "** failed to allocate %d bytes for vdata\n", 00329 nvox * dsize ); 00330 DSET_delete( dout ); free( ddata ); free( cdata ); 00331 RETURN(NULL); 00332 } 00333 00334 /* init data to zeros */ 00335 memset(cdata, 0, nvox*sizeof(int)); 00336 memset(ddata, 0, nvox*sizeof(double)); 00337 00338 /* set node_list data */ 00339 if ( set_node_list_data( N, p, sopt, sub ) != 0 ) 00340 { 00341 DSET_delete(dout); 00342 free(ddata); 00343 free(cdata); 00344 free(vdata); 00345 00346 RETURN(NULL); 00347 } 00348 00349 if ( compute_results( p, N, sopt, ddata, cdata, pary ) == 0 ) 00350 valid = 1; 00351 00352 if ( ! valid ) /* then clean up memory */ 00353 { 00354 free( ddata ); 00355 free( vdata ); 00356 DSET_delete( dout ); 00357 RETURN(NULL); 00358 } 00359 00360 /* convert to output data type */ 00361 fac = 0.0; 00362 00363 if ( sopt->debug > 1 ) 00364 fprintf(stderr,"++ sub-brick %d, integral_doubles = %d\n", 00365 sub, integral_doubles( ddata, nvox )); 00366 00367 /* for int output and scaling, fac is maxval/maxabs */ 00368 if ( MRI_IS_INT_TYPE( sopt->datum ) && !sopt->noscale ) 00369 { 00370 float amax = MCW_vol_amax( nvox, 1, 1, MRI_double, ddata ); 00371 00372 if ( amax > MRI_TYPE_maxval[sopt->datum] ) /* we must scale */ 00373 fac = MRI_TYPE_maxval[sopt->datum]/amax; 00374 else if ( integral_doubles( ddata, nvox ) ) /* don't need scale */ 00375 fac = 0.0; 00376 else if ( amax != 0.0 ) 00377 fac = MRI_TYPE_maxval[sopt->datum]/amax; 00378 00379 if ( sopt->debug > 1 ) 00380 fprintf(stderr,"++ fac = %f, amax = %f \n", fac, amax); 00381 } 00382 00383 EDIT_coerce_scale_type(nvox, fac, MRI_double,ddata, sopt->datum,vdata); 00384 00385 /* attach the final vdata to the dataset */ 00386 EDIT_substitute_brick( dout, sub, sopt->datum, vdata ); 00387 DSET_BRICK_FACTOR( dout, sub ) = (fac != 0.0) ? 1.0/fac : 0.0; 00388 } 00389 00390 if (sopt->debug > 0) 00391 fprintf(stderr,"++ %d sub-brick(s) computed\n", p->nsubs); 00392 00393 free(ddata); 00394 free(cdata); 00395 free(pary); 00396 00397 RETURN(dout); 00398 } |
|
Definition at line 1573 of file SUMA_3dSurf2Vol.c. References c, opts_t::debug, ENTRY, fim, node_list_t::ilen, node_list_t::ilist, malloc, MRI_FLOAT_PTR, mri_free(), mri_read_1D(), mri_transpose(), MRI_IMAGE::nx, MRI_IMAGE::ny, p, RETURN, opts_t::sdata_file_1D, and param_t::sdata_im. Referenced by fill_node_list().
01574 { 01575 MRI_IMAGE * im; 01576 float * fim; 01577 int c; 01578 01579 ENTRY("sdata_from_1D"); 01580 01581 if ( !opts || !N || !p ) 01582 RETURN(-1); 01583 01584 if ( (im = mri_read_1D(opts->sdata_file_1D)) == NULL ) 01585 { 01586 fprintf(stderr,"** failed to read 1D file '%s'\n", opts->sdata_file_1D); 01587 RETURN(-2); 01588 } 01589 /* transpose list to node-major order, and lose temp image */ 01590 p->sdata_im = mri_transpose(im); 01591 mri_free(im); 01592 01593 if ( p->sdata_im->nx < 2 || p->sdata_im->ny < 1 ) 01594 { 01595 fprintf(stderr,"** bad (%d x %d) surf data 1D file '%s'\n", 01596 p->sdata_im->ny, p->sdata_im->nx, opts->sdata_file_1D); 01597 RETURN(-3); 01598 } 01599 01600 N->ilen = p->sdata_im->ny; 01601 01602 if ( opts->debug > 0 ) 01603 fprintf(stderr,"++ read 1D surface file '%s' (nx = %d, ny = %d)\n", 01604 opts->sdata_file_1D, p->sdata_im->nx, p->sdata_im->ny ); 01605 01606 /* only allocate space ilist */ 01607 if ( (N->ilist = (int *)malloc(N->ilen*sizeof(int))) == NULL ) 01608 { 01609 fprintf(stderr,"** sf1D a: failed to allocate %d ints\n", N->ilen); 01610 RETURN(-1); 01611 } 01612 01613 /* first set the node index values */ 01614 fim = MRI_FLOAT_PTR( p->sdata_im ); 01615 for ( c = 0; c < N->ilen; c++, fim += p->sdata_im->nx ) 01616 N->ilist[c] = (int)*fim; /* set node index */ 01617 01618 RETURN(0); 01619 } |
|
Definition at line 1544 of file SUMA_3dSurf2Vol.c. References c, ENTRY, node_list_t::ilen, node_list_t::ilist, malloc, node_list_t::nnodes, and RETURN. Referenced by fill_node_list().
01545 { 01546 int c; 01547 01548 ENTRY("sdata_from_default"); 01549 01550 if ( !N ) 01551 RETURN(-1); 01552 01553 if ( (N->ilist = (int *)malloc(N->nnodes * sizeof(int))) == NULL ) 01554 { 01555 fprintf(stderr,"** failed to allocate %d ints for ilist\n",N->nnodes); 01556 RETURN(-1); 01557 } 01558 01559 N->ilen = N->nnodes; 01560 01561 /* now fill ilist with default node indices */ 01562 for ( c = 0; c < N->ilen; c++ ) 01563 N->ilist[c] = c; 01564 01565 RETURN(0); 01566 } |
|
Definition at line 3156 of file SUMA_3dSurf2Vol.c. References c, DSET_DX, DSET_DY, DSET_DZ, DSET_NX, DSET_NY, DSET_NZ, DSET_XORG, DSET_YORG, DSET_ZORG, ENTRY, RETURN, and THD_fvec3::xyz. Referenced by dump_surf_3dt(), and validate_datasets().
03157 { 03158 float tmp; 03159 int c; 03160 03161 ENTRY("set_3dmm_bounds"); 03162 03163 if ( !dset || !min || !max ) 03164 { 03165 fprintf(stderr, "** invalid params to set_3dmm_bounds: (%p,%p,%p)\n", 03166 dset, min, max ); 03167 RETURN(-1); 03168 } 03169 03170 /* get undirected bounds */ 03171 min->xyz[0] = DSET_XORG(dset) - 0.5 * DSET_DX(dset); 03172 max->xyz[0] = min->xyz[0] + DSET_NX(dset) * DSET_DX(dset); 03173 03174 min->xyz[1] = DSET_YORG(dset) - 0.5 * DSET_DY(dset); 03175 max->xyz[1] = min->xyz[1] + DSET_NY(dset) * DSET_DY(dset); 03176 03177 min->xyz[2] = DSET_ZORG(dset) - 0.5 * DSET_DZ(dset); 03178 max->xyz[2] = min->xyz[2] + DSET_NZ(dset) * DSET_DZ(dset); 03179 03180 for ( c = 0; c < 3; c++ ) 03181 if ( min->xyz[c] > max->xyz[c] ) 03182 { 03183 tmp = min->xyz[c]; 03184 min->xyz[c] = max->xyz[c]; 03185 max->xyz[c] = tmp; 03186 } 03187 03188 RETURN(0); 03189 } |
|
Definition at line 817 of file SUMA_3dSurf2Vol.c. References parser_t::atoz, c, s2v_opts_t::debug, ENTRY, node_list_t::fdata, node_list_t::ilen, parser_t::max_sym, MRI_FLOAT_PTR, MRI_IMAGE::nx, MRI_IMAGE::ny, p, param_t::parser, PARSER_evaluate_one(), parser_t::pcode, RETURN, and param_t::sdata_im. Referenced by s2v_nodes2volume().
00818 { 00819 float * fp, fval; 00820 int c, lposn; 00821 00822 ENTRY("set_node_list_data"); 00823 00824 if ( !N || !p || !sopt || col < 0 ) 00825 { 00826 fprintf(stderr,"** snld: bad params (%p,%p,%p,%d)\n", N, p, sopt, col); 00827 RETURN(-1); 00828 } 00829 00830 if ( sopt->debug > 1 ) 00831 fprintf(stderr, "-- setting fdata for column %d\n", col); 00832 00833 /* if sdata_im does not exist, fill as mask and return */ 00834 if ( !p->sdata_im ) 00835 { 00836 fval = 1.0; /* init to mask value */ 00837 00838 /* if we have a PARSER_code (presumably without symbols), use it */ 00839 if ( p->parser.pcode ) 00840 { 00841 for ( c = 0; c < 26; c++ ) 00842 p->parser.atoz[c] = 0.0; 00843 fval = PARSER_evaluate_one( p->parser.pcode, p->parser.atoz ); 00844 } 00845 00846 for ( c = 0; c < N->ilen; c++ ) 00847 N->fdata[c] = fval; 00848 00849 RETURN(0); 00850 } 00851 00852 /* else sdata exists: check column, and copy data from sdata_im */ 00853 if ( col > (p->sdata_im->nx - 2) && !p->parser.pcode ) 00854 { 00855 fprintf(stderr,"** snld error: col > nx-2 (%d > %d)\n", 00856 col, p->sdata_im->nx-2); 00857 RETURN(-1); 00858 } 00859 else if ( p->sdata_im->ny < N->ilen ) 00860 { 00861 fprintf(stderr,"** snld error: ny < ilen (%d < %d)\n", 00862 p->sdata_im->ny, N->ilen); 00863 RETURN(-1); 00864 } 00865 else if ( !N->fdata ) 00866 { 00867 fprintf(stderr,"** snld error: missing idata\n"); 00868 RETURN(-1); 00869 } 00870 else if ( p->parser.pcode && col != 0 ) /* let's be safe */ 00871 { 00872 fprintf(stderr,"** snld error: cannot use parser with col = %d\n", col); 00873 RETURN(-1); 00874 } 00875 00876 /* hmmmm, we're still missing something... oh yes, data! */ 00877 00878 fp = MRI_FLOAT_PTR( p->sdata_im ) + col+1; /* offset by column number */ 00879 00880 for ( c = 0; c < N->ilen; c++ ) 00881 { 00882 if ( p->parser.pcode ) 00883 { 00884 /* fill atoz with surface node data */ 00885 for ( lposn = 0; lposn < p->parser.max_sym; lposn++ ) 00886 p->parser.atoz[lposn] = fp[lposn]; 00887 00888 N->fdata[c] = PARSER_evaluate_one(p->parser.pcode, p->parser.atoz); 00889 } 00890 else 00891 N->fdata[c] = *fp; 00892 00893 fp += p->sdata_im->nx; 00894 } 00895 00896 RETURN(0); 00897 } |
|
Definition at line 1197 of file SUMA_3dSurf2Vol.c.
01198 { 01199 int nsurf; 01200 01201 ENTRY("set_smap_opts"); 01202 01203 memset( sopt, 0, sizeof(*sopt) ); /* clear the sopt struct */ 01204 sopt->cmask = NULL; 01205 01206 if ( (sopt->map = check_map_func( opts->map_str )) == E_SMAP_INVALID ) 01207 RETURN(-1); 01208 01209 sopt->datum = check_datum_type(opts->datum_str, DSET_BRICK_TYPE(p->gpar,0)); 01210 if (sopt->datum < 0) 01211 RETURN(-1); 01212 01213 if ( opts->noscale == 1 ) 01214 sopt->noscale = 1; 01215 01216 sopt->debug = opts->debug; /* for output in library functions */ 01217 sopt->dnode = opts->dnode; 01218 sopt->dvox = opts->dvox; 01219 sopt->sxyz_ori_gpar = opts->sxyz_ori_gpar; 01220 sopt->cmask = p->cmask; 01221 01222 if ( opts->f_steps < S2V_F_STEPS_MIN ) /* minimum is 1 */ 01223 { 01224 /* if f_steps was not given, init to the number of surfaces - v3.6 */ 01225 for ( nsurf = 0; nsurf < S2V_MAX_SURFS && opts->snames[nsurf]; nsurf++ ) 01226 ; 01227 if ( nsurf <= 0 ) 01228 { 01229 fprintf(stderr,"** error: sso: no input surfaces\n"); 01230 RETURN(-1); 01231 } 01232 sopt->f_steps = nsurf; 01233 } 01234 else 01235 sopt->f_steps = opts->f_steps; 01236 01237 sopt->f_index = S2V_F_INDEX_VOXEL; 01238 if ( (opts->f_index_str != NULL) && 01239 ( !strncmp(opts->f_index_str, "point", 5) || 01240 !strncmp(opts->f_index_str, "node", 4) ) ) /* preserve old use */ 01241 sopt->f_index = S2V_F_INDEX_POINT; 01242 01243 sopt->f_p1_fr = opts->f_p1_fr; /* copy fractions & distances */ 01244 sopt->f_pn_fr = opts->f_pn_fr; 01245 sopt->f_p1_mm = opts->f_p1_mm; 01246 sopt->f_pn_mm = opts->f_pn_mm; 01247 01248 01249 switch (sopt->map) 01250 { 01251 default: 01252 01253 case E_SMAP_AVE: 01254 case E_SMAP_MAX: 01255 case E_SMAP_MIN: 01256 case E_SMAP_MAX_ABS: 01257 break; 01258 01259 case E_SMAP_COUNT: 01260 case E_SMAP_MASK: 01261 case E_SMAP_MASK2: 01262 sopt->noscale = 1; 01263 break; 01264 } 01265 01266 if ( opts->debug > 1 ) 01267 disp_s2v_opts_t( "++ s2v_opts_set :", sopt ); 01268 01269 RETURN(0); 01270 } |
|
Definition at line 1055 of file SUMA_3dSurf2Vol.c. References calloc, s2v_opts_t::debug, node_list_t::depth, ENTRY, free, get_mappable_surfs(), malloc, SUMA_SurfaceObject::N_Node, node_list_t::nnodes, SUMA_SurfaceObject::NodeList, node_list_t::nodes, RETURN, and THD_fvec3::xyz. Referenced by init_node_list().
01056 { 01057 SUMA_SurfaceObject ** so; 01058 THD_fvec3 * fvp; 01059 float * fp; 01060 int rv, nindex, sindex; 01061 01062 ENTRY("surf_to_node_list"); 01063 01064 if ( sopt == NULL || N == NULL || nsurf < 0 || nsurf > 2 ) 01065 { 01066 fprintf( stderr, "** anl: bad params (%p,%p,%d)\n", 01067 sopt, N, nsurf ); 01068 RETURN(-1); 01069 } 01070 01071 /* create a temporary list of surface pointers */ 01072 so = (SUMA_SurfaceObject **)calloc(nsurf, sizeof(SUMA_SurfaceObject *)); 01073 if ( so == NULL ) 01074 { 01075 fprintf( stderr, "** anl: failed to alloc %d surf pointers\n", nsurf ); 01076 RETURN(-1); 01077 } 01078 01079 if ( (rv = get_mappable_surfs( so, nsurf, sopt->debug )) != nsurf ) 01080 { 01081 fprintf( stderr, "** error: found %d (of %d) mappable surfaces\n", 01082 rv, nsurf ); 01083 RETURN(-1); 01084 } 01085 01086 /* fill node list struct */ 01087 N->depth = nsurf; 01088 N->nnodes = so[0]->N_Node; 01089 N->nodes = (THD_fvec3 *)malloc(N->depth * N->nnodes * sizeof(THD_fvec3)); 01090 if ( N->nodes == NULL ) 01091 { 01092 fprintf( stderr, "** cnlm: failed to allocate %d THD_fvec3 structs\n", 01093 N->depth * N->nnodes ); 01094 free(so); 01095 RETURN(-1); 01096 } 01097 01098 /* copy the xyz coordinates for each node */ 01099 01100 fvp = N->nodes; /* linear coverage of all nodes */ 01101 for ( sindex = 0; sindex < N->depth; sindex++ ) 01102 { 01103 if ( so[sindex]->N_Node != N->nnodes ) 01104 { 01105 fprintf(stderr, "** surf #%d (%s) has %d nodes (but expected %d)\n", 01106 sindex, 01107 so[sindex]->Label ? so[sindex]->Label : "<unnamed>", 01108 so[sindex]->N_Node, N->nnodes ); 01109 free( N->nodes ); N->nodes = NULL; 01110 free(so); 01111 RETURN(-1); 01112 } 01113 01114 for ( nindex = 0, fp = so[sindex]->NodeList; 01115 nindex < N->nnodes; 01116 nindex++, fp += 3 ) 01117 { 01118 memcpy( fvp->xyz, fp, 3*sizeof(float) ); 01119 fvp++; 01120 } 01121 } 01122 01123 if ( sopt->debug > 1 ) 01124 fprintf( stderr, "++ allocated %d x %d (x %d) node list\n", 01125 N->depth, N->nnodes, (int)sizeof(THD_fvec3) ); 01126 01127 free(so); 01128 RETURN(0); 01129 } |
|
Definition at line 963 of file SUMA_3dSurf2Vol.c. References c, s2v_opts_t::debug, node_list_t::depth, s2v_opts_t::dnode, ENTRY, malloc, MRI_FLOAT_PTR, node_list_t::nnodes, node_list_t::nodes, MRI_IMAGE::nx, MRI_IMAGE::ny, p, RETURN, opts_t::surf_xyz_1D_file, param_t::sxyz_im, and THD_fvec3::xyz. Referenced by init_node_list().
00965 { 00966 THD_fvec3 * fvp; 00967 float * fp; 00968 int c, sc; 00969 00970 ENTRY("sxyz_1D_to_nlist"); 00971 00972 if ( !sopt || !p || !N ) 00973 { 00974 fprintf(stderr,"** sxyz2nl: bad params (%p,%p,%p)\n",sopt,p,N); 00975 RETURN(-1); 00976 } 00977 00978 if ( !p->sxyz_im ) 00979 { 00980 fprintf(stderr,"** missing sxyz_im for sxyz surf '%s'\n", 00981 opts->surf_xyz_1D_file); 00982 RETURN(-1); 00983 } 00984 00985 *nsurf = p->sxyz_im->nx / 3; 00986 00987 if ( p->sxyz_im->nx != 3 * *nsurf ) 00988 { 00989 fprintf(stderr,"** sxyz surf '%s' has %d columns (%d expected)\n", 00990 opts->surf_xyz_1D_file, p->sxyz_im->nx, 3**nsurf); 00991 RETURN(-1); 00992 } 00993 else if ( p->sxyz_im->ny <= 0 ) 00994 { 00995 fprintf(stderr,"** sxyz surf '%s': bad sxyz dimensions (%d,%d)\n", 00996 opts->surf_xyz_1D_file, p->sxyz_im->nx, p->sxyz_im->ny); 00997 RETURN(-1); 00998 } 00999 01000 N->depth = *nsurf; 01001 N->nnodes = p->sxyz_im->ny; 01002 01003 N->nodes = (THD_fvec3 *)malloc(N->depth*N->nnodes*sizeof(THD_fvec3)); 01004 if ( N->nodes == NULL ) 01005 { 01006 fprintf(stderr,"** failed to allocate %dx%d THD_fvec3's for nodes\n", 01007 N->nnodes, N->depth); 01008 RETURN(-1); 01009 } 01010 01011 fvp = N->nodes; 01012 for ( sc = 0; sc < *nsurf; sc++ ) 01013 { 01014 fp = MRI_FLOAT_PTR( p->sxyz_im ) + sc * 3; /* offset for surf */ 01015 for ( c = 0; c < N->nnodes; c++ ) 01016 { 01017 fvp->xyz[0] = fp[0]; 01018 fvp->xyz[1] = fp[1]; 01019 fvp->xyz[2] = fp[2]; 01020 01021 fp += p->sxyz_im->nx; 01022 fvp++; 01023 } 01024 } 01025 01026 if ( sopt->debug > 0 ) 01027 { 01028 fprintf(stderr, "++ sxyz_1D nodes from '%s': nxyz = %d, nsurf = %d\n", 01029 opts->surf_xyz_1D_file, N->nnodes, N->depth); 01030 if ( sopt->dnode >= 0 && sopt->dnode <= p->sxyz_im->ny ) 01031 { 01032 fprintf(stderr," debug node (%d) loc", sopt->dnode); 01033 for ( sc = 0; sc < *nsurf; sc++ ) 01034 fprintf(stderr," : (%f, %f, %f)", 01035 N->nodes[sopt->dnode + sc*N->nnodes].xyz[0], 01036 N->nodes[sopt->dnode + sc*N->nnodes].xyz[1], 01037 N->nodes[sopt->dnode + sc*N->nnodes].xyz[2]); 01038 fputc('\n', stderr); 01039 } 01040 } 01041 01042 RETURN(0); 01043 } |
|
Definition at line 2358 of file SUMA_3dSurf2Vol.c. References ENTRY, g_history, RETURN, S2V_USE_HIST, S2V_USE_LONG, S2V_USE_SHORT, S2V_USE_VERSION, and VERSION.
02359 { 02360 ENTRY("usage"); 02361 02362 if ( level == S2V_USE_SHORT ) 02363 fprintf(stderr, 02364 " usage: %s [options] -spec SPEC_FILE -surf_A SURF_NAME \\\n" 02365 " -grid_parent AFNI_DSET -sv SURF_VOL \\\n" 02366 " -map_func MAP_FUNC -prefix OUTPUT_DSET\n" 02367 "usage: %s -help\n", 02368 prog, prog ); 02369 else if ( level == S2V_USE_LONG ) 02370 { 02371 printf( 02372 "\n" 02373 "%s - map data from a surface domain to an AFNI volume domain\n" 02374 "\n" 02375 " usage: %s [options] -spec SPEC_FILE -surf_A SURF_NAME \\\n" 02376 " -grid_parent AFNI_DSET -sv SURF_VOL \\\n" 02377 " -map_func MAP_FUNC -prefix OUTPUT_DSET\n" 02378 "\n" 02379 " This program is meant to take as input a pair of surfaces,\n" 02380 " optionally including surface data, and an AFNI grid parent\n" 02381 " dataset, and to output a new AFNI dataset consisting of the\n" 02382 " surface data mapped to the dataset grid space. The mapping\n" 02383 " function determines how to map the surface values from many\n" 02384 " nodes to a single voxel.\n" 02385 "\n" 02386 " Surfaces (from the spec file) are specified using '-surf_A'\n" 02387 " (and '-surf_B', if a second surface is input). If two\n" 02388 " surfaces are input, then the computed segments over node\n" 02389 " pairs will be in the direction from surface A to surface B.\n" 02390 "\n" 02391 " The basic form of the algorithm is:\n" 02392 "\n" 02393 " o for each node pair (or single node)\n" 02394 " o form a segment based on the xyz node coordinates,\n" 02395 " adjusted by any '-f_pX_XX' options\n" 02396 " o divide the segment up into N steps, according to \n" 02397 " the '-f_steps' option\n" 02398 " o for each segment point\n" 02399 " o if the point is outside the space of the output\n" 02400 " dataset, skip it\n" 02401 " o locate the voxel in the output dataset which\n" 02402 " corresponds to this segment point\n" 02403 " o if the '-cmask' option was given, and the voxel\n" 02404 " is outside the implied mask, skip it\n" 02405 " o if the '-f_index' option is by voxel, and this\n" 02406 " voxel has already been considered, skip it\n" 02407 " o insert the surface node value, according to the\n" 02408 " user-specified '-map_func' option\n" 02409 "\n" 02410 " Surface Coordinates:\n" 02411 "\n" 02412 " Surface coordinates are assumed to be in the Dicom\n" 02413 " orientation. This information may come from the option\n" 02414 " pair of '-spec' and '-sv', with which the user provides\n" 02415 " the name of the SPEC FILE and the SURFACE VOLUME, along\n" 02416 " with '-surf_A' and optionally '-surf_B', used to specify\n" 02417 " actual surfaces by name. Alternatively, the surface\n" 02418 " coordinates may come from the '-surf_xyz_1D' option.\n" 02419 " See these option descriptions below.\n" 02420 "\n" 02421 " Note that the user must provide either the three options\n" 02422 " '-spec', '-sv' and '-surf_A', or the single option,\n" 02423 " '-surf_xyz_1D'.\n" 02424 "\n" 02425 " Surface Data:\n" 02426 "\n" 02427 " Surface domain data can be input via the '-sdata_1D'\n" 02428 " option. In such a case, the data is with respect to the\n" 02429 " input surface. The first column of the sdata_1D file\n" 02430 " should be a node index, and following columns are that\n" 02431 " node's data. See the '-sdata_1D' option for more info.\n" 02432 "\n" 02433 " If the surfaces have V values per node (pair), then the\n" 02434 " resulting AFNI dataset will have V sub-bricks (unless the\n" 02435 " user applies the '-data_expr' option).\n" 02436 "\n" 02437 " Mapping Functions:\n" 02438 "\n" 02439 " Mapping functions exist because a single volume voxel may\n" 02440 " be occupied by multiple surface nodes or segment points.\n" 02441 " Depending on how dense the surface mesh is, the number of\n" 02442 " steps provided by the '-f_steps' option, and the indexing\n" 02443 " type from '-f_index', even a voxel which is only 1 cubic\n" 02444 " mm in volume may have quite a few contributing points.\n" 02445 "\n" 02446 " The mapping function defines how multiple surface values\n" 02447 " are combined to get a single result in each voxel. For\n" 02448 " example, the 'max' function will take the maximum of all\n" 02449 " surface values contributing to each given voxel.\n" 02450 "\n" 02451 " Current mapping functions are listed under the '-map_func'\n" 02452 " option, below.\n" 02453 "\n" 02454 "------------------------------------------------------------\n" 02455 "\n" 02456 " examples:\n" 02457 "\n" 02458 " 1. Map a single surface to an anatomical volume domain,\n" 02459 " creating a simple mask of the surface. The output\n" 02460 " dataset will be fred_surf+orig, and the orientation and\n" 02461 " grid spacing will follow that of the grid parent. The\n" 02462 " output voxels will be 1 where the surface exists, and 0\n" 02463 " elsewhere.\n" 02464 "\n" 02465 " %s \\\n" 02466 " -spec fred.spec \\\n" 02467 " -surf_A pial \\\n" 02468 " -sv fred_anat+orig \\\n" 02469 " -grid_parent fred_anat+orig \\\n" 02470 " -map_func mask \\\n" 02471 " -prefix fred_surf\n" 02472 "\n" 02473 " 2. Map the cortical grey ribbon (between the white matter\n" 02474 " surface and the pial surface) to an AFNI volume, where\n" 02475 " the resulting volume is restriced to the mask implied by\n" 02476 " the -cmask option.\n" 02477 "\n" 02478 " Surface data will come from the file sdata_10.1D, which\n" 02479 " has 10 values per node, and lists only a portion of the\n" 02480 " entire set of surface nodes. Each node pair will be form\n" 02481 " a segment of 15 equally spaced points, the values from\n" 02482 " which will be applied to the output dataset according to\n" 02483 " the 'ave' filter. Since the index is over points, each\n" 02484 " of the 15 points will have its value applied to the\n" 02485 " appropriate voxel, even multiple times. This weights the\n" 02486 " resulting average by the fraction of each segment that\n" 02487 " occupies a given voxel.\n" 02488 "\n" 02489 " The output dataset will have 10 sub-bricks, according to\n" 02490 " the 10 values per node index in sdata_10.1D.\n" 02491 "\n" 02492 " %s \\\n" 02493 " -spec fred.spec \\\n" 02494 " -surf_A smoothwm \\\n" 02495 " -surf_B pial \\\n" 02496 " -sv fred_anat+orig \\\n" 02497 " -grid_parent 'fred_func+orig[0]' \\\n" 02498 " -cmask '-a fred_func+orig[2] -expr step(a-0.6)' \\\n" 02499 " -sdata_1D sdata_10.1D \\\n" 02500 " -map_func ave \\\n" 02501 " -f_steps 15 \\\n" 02502 " -f_index points \\\n" 02503 " -prefix fred_surf_ave\n" 02504 "\n" 02505 " 3. The inputs in this example are identical to those in\n" 02506 " example 2, including the surface dataset, sdata_10.1D.\n" 02507 " Again, the output dataset will have 10 sub-bricks.\n" 02508 "\n" 02509 " The surface values will be applied via the 'max_abs'\n" 02510 " filter, with the intention of assigning to each voxel the\n" 02511 " node value with the most significance. Here, the index\n" 02512 " method does not matter, so it is left as the default,\n" 02513 " 'voxel'.\n" 02514 "\n" 02515 " In this example, each node pair segment will be extended\n" 02516 " by 20%% into the white matter, and by 10%% outside of the\n" 02517 " grey matter, generating a \"thicker\" result.\n" 02518 "\n" 02519 " %s \\\n" 02520 " -spec fred.spec \\\n" 02521 " -surf_A smoothwm \\\n" 02522 " -surf_B pial \\\n" 02523 " -sv fred_anat+orig \\\n" 02524 " -grid_parent 'fred_func+orig[0]' \\\n" 02525 " -cmask '-a fred_func+orig[2] -expr step(a-0.6)' \\\n" 02526 " -sdata_1D sdata_10.1D \\\n" 02527 " -map_func max_abs \\\n" 02528 " -f_steps 15 \\\n" 02529 " -f_p1_fr -0.2 \\\n" 02530 " -f_pn_fr 0.1 \\\n" 02531 " -prefix fred_surf_max_abs\n" 02532 "\n" 02533 " 4. This is simliar to example 2. Here, the surface nodes\n" 02534 " (coordinates) come from 'surf_coords_2.1D'. But these\n" 02535 " coordinates do not happen to be in Dicomm orientation,\n" 02536 " they are in the same orientation as the grid parent, so\n" 02537 " the '-sxyz_orient_as_gpar' option is applied.\n" 02538 "\n" 02539 " Even though the data comes from 'sdata_10.1D', the output\n" 02540 " AFNI dataset will only have 1 sub-brick. That is because\n" 02541 " of the '-data_expr' option. Here, each applied surface\n" 02542 " value will be the average of the sines of the first 3\n" 02543 " data values (columns of sdata_10.1D).\n" 02544 "\n" 02545 " %s \\\n" 02546 " -surf_xyz_1D surf_coords_2.1D \\\n" 02547 " -sxyz_orient_as_gpar \\\n" 02548 " -grid_parent 'fred_func+orig[0]' \\\n" 02549 " -sdata_1D sdata_10.1D \\\n" 02550 " -data_expr '(sin(a)+sin(b)+sin(c))/3' \\\n" 02551 " -map_func ave \\\n" 02552 " -f_steps 15 \\\n" 02553 " -f_index points \\\n" 02554 " -prefix fred_surf_ave_sine\n" 02555 "\n" 02556 " 5. In this example, voxels will get the maximum value from\n" 02557 " column 3 of sdata_10.1D (as usual, column 0 is used for\n" 02558 " node indices). The output dataset will have 1 sub-brick.\n" 02559 "\n" 02560 " Here, the output dataset is forced to be of type 'short',\n" 02561 " regardless of what the grid parent is. Also, there will\n" 02562 " be no scaling factor applied.\n" 02563 "\n" 02564 " To track the numbers for surface node #1234, the '-dnode'\n" 02565 " option has been used, along with '-debug'. Additionally,\n" 02566 " '-dvoxel' is used to track the results for voxel #6789.\n" 02567 "\n" 02568 " %s \\\n" 02569 " -spec fred.spec \\\n" 02570 " -surf_A smoothwm \\\n" 02571 " -surf_B pial \\\n" 02572 " -sv fred_anat+orig \\\n" 02573 " -grid_parent 'fred_func+orig[0]' \\\n" 02574 " -sdata_1D sdata_10.1D'[0,3]' \\\n" 02575 " -map_func max \\\n" 02576 " -f_steps 15 \\\n" 02577 " -datum short \\\n" 02578 " -noscale \\\n" 02579 " -debug 2 \\\n" 02580 " -dnode 1234 \\\n" 02581 " -dvoxel 6789 \\\n" 02582 " -prefix fred_surf_max\n" 02583 "\n" 02584 "------------------------------------------------------------\n" 02585 "\n" 02586 " REQUIRED COMMAND ARGUMENTS:\n" 02587 "\n" 02588 " -spec SPEC_FILE : SUMA spec file\n" 02589 "\n" 02590 " e.g. -spec fred.spec\n" 02591 "\n" 02592 " The surface specification file contains the list of\n" 02593 " mappable surfaces that are used.\n" 02594 "\n" 02595 " See @SUMA_Make_Spec_FS and @SUMA_Make_Spec_SF.\n" 02596 "\n" 02597 " Note: this option, along with '-sv', may be replaced\n" 02598 " by the '-surf_xyz_1D' option.\n" 02599 "\n" 02600 " -surf_A SURF_NAME : specify surface A (from spec file)\n" 02601 " -surf_B SURF_NAME : specify surface B (from spec file)\n" 02602 "\n" 02603 " e.g. -surf_A smoothwm\n" 02604 " e.g. -surf_A lh.smoothwm\n" 02605 " e.g. -surf_B lh.pial\n" 02606 "\n" 02607 " This parameter is used to tell the program with surfaces\n" 02608 " to use. The '-surf_A' parameter is required, but the\n" 02609 " '-surf_B' parameter is an option.\n" 02610 "\n" 02611 " The surface names must uniquely match those in the spec\n" 02612 " file, though a sub-string match is good enough. The\n" 02613 " surface names are compared with the names of the surface\n" 02614 " node coordinate files.\n" 02615 "\n" 02616 " For instance, given a spec file that has only the left\n" 02617 " hemisphere in it, 'pial' should produce a unique match\n" 02618 " with lh.pial.asc. But if both hemispheres are included,\n" 02619 " then 'pial' would not be unique (matching rh.pail.asc,\n" 02620 " also). In that case, 'lh.pial' would be better.\n" 02621 "\n" 02622 " -sv SURFACE_VOLUME : AFNI dataset\n" 02623 "\n" 02624 " e.g. -sv fred_anat+orig\n" 02625 "\n" 02626 " This is the AFNI dataset that the surface is mapped to.\n" 02627 " This dataset is used for the initial surface node to xyz\n" 02628 " coordinate mapping, in the Dicom orientation.\n" 02629 "\n" 02630 " Note: this option, along with '-spec', may be replaced\n" 02631 " by the '-surf_xyz_1D' option.\n" 02632 "\n" 02633 " -surf_xyz_1D SXYZ_NODE_FILE : 1D coordinate file\n" 02634 "\n" 02635 " e.g. -surf_xyz_1D my_surf_coords.1D\n" 02636 "\n" 02637 " This ascii file contains a list of xyz coordinates to be\n" 02638 " considered as a surface, or 2 sets of xyz coordinates to\n" 02639 " considered as a surface pair. As usual, these points\n" 02640 " are assumed to be in Dicom orientation. Another option\n" 02641 " for coordinate orientation is to use that of the grid\n" 02642 " parent dataset. See '-sxyz_orient_as_gpar' for details.\n" 02643 "\n" 02644 " This option is an alternative to the pair of options, \n" 02645 " '-spec' and '-sv'.\n" 02646 "\n" 02647 " The number of rows of the file should equal the number\n" 02648 " of nodes on each surface. The number of columns should\n" 02649 " be either 3 for a single surface, or 6 for two surfaces.\n" 02650 " \n" 02651 " sample line of an input file (one surface):\n" 02652 " \n" 02653 " 11.970287 2.850751 90.896111\n" 02654 " \n" 02655 " sample line of an input file (two surfaces):\n" 02656 " \n" 02657 " 11.97 2.85 90.90 12.97 2.63 91.45\n" 02658 " \n" 02659 "\n" 02660 " -grid_parent AFNI_DSET : AFNI dataset\n" 02661 "\n" 02662 " e.g. -grid_parent fred_function+orig\n" 02663 "\n" 02664 " This dataset is used as a grid and orientation master\n" 02665 " for the output AFNI dataset.\n" 02666 "\n" 02667 " -map_func MAP_FUNC : surface to dataset function\n" 02668 "\n" 02669 " e.g. -map_func max\n" 02670 " e.g. -map_func mask -f_steps 20\n" 02671 "\n" 02672 " This function applies to the case where multiple data\n" 02673 " points get mapped to a single voxel, which is expected\n" 02674 " since surfaces tend to have a much higher resolution\n" 02675 " than AFNI volumes. In the general case data points come\n" 02676 " from each point on each partitioned line segment, with\n" 02677 " one segment per node pair. Note that these segments may\n" 02678 " have length zero, such as when only a single surface is\n" 02679 " input.\n" 02680 "\n" 02681 " See \"Mapping Functions\" above, for more information.\n" 02682 "\n" 02683 " The current mapping function for one surface is:\n" 02684 "\n" 02685 " mask : For each xyz location, set the corresponding\n" 02686 " voxel to 1.\n" 02687 "\n" 02688 " The current mapping functions for two surfaces are as\n" 02689 " follows. These descriptions are per output voxel, and\n" 02690 " over the values of all points mapped to a given voxel.\n" 02691 "\n" 02692 " mask2 : if any points are mapped to the voxel, set\n" 02693 " the voxel value to 1\n" 02694 "\n" 02695 " ave : average all values\n" 02696 "\n" 02697 " count : count the number of mapped data points\n" 02698 "\n" 02699 " min : find the minimum value from all mapped points\n" 02700 "\n" 02701 " max : find the maximum value from all mapped points\n" 02702 "\n" 02703 " max_abs: find the number with maximum absolute value\n" 02704 " (the resulting value will retain its sign)\n" 02705 "\n" 02706 " -prefix OUTPUT_PREFIX : prefix for the output dataset\n" 02707 "\n" 02708 " e.g. -prefix anat_surf_mask\n" 02709 "\n" 02710 " This is used to specify the prefix of the resulting AFNI\n" 02711 " dataset.\n" 02712 "\n" 02713 " ------------------------------\n" 02714 " SUB-SURFACE DATA FILE OPTIONS:\n" 02715 "\n" 02716 " -sdata_1D SURF_DATA.1D : 1D sub-surface file, with data\n" 02717 "\n" 02718 " e.g. -sdata_1D roi3.1D\n" 02719 "\n" 02720 " This is used to specify a 1D file, which contains\n" 02721 " surface indices and data. The indices refer to the\n" 02722 " surface(s) read from the spec file.\n" 02723 " \n" 02724 " The format of this data file is a surface index and a\n" 02725 " list of data values on each row. To be a valid 1D file,\n" 02726 " each row must have the same number of columns.\n" 02727 "\n" 02728 " ------------------------------\n" 02729 " OPTIONS SPECIFIC TO SEGMENT SELECTION:\n" 02730 "\n" 02731 " (see \"The basic form of the algorithm\" for more details)\n" 02732 "\n" 02733 " -f_steps NUM_STEPS : partition segments\n" 02734 "\n" 02735 " e.g. -f_steps 10\n" 02736 " default: -f_steps 2 (or 1, the number of surfaces)\n" 02737 "\n" 02738 " This option specifies the number of points to divide\n" 02739 " each line segment into, before mapping the points to the\n" 02740 " AFNI volume domain. The default is the number of input\n" 02741 " surfaces (usually, 2). The default operation is to have\n" 02742 " the segment endpoints be the actual surface nodes,\n" 02743 " unless they are altered with the -f_pX_XX options.\n" 02744 "\n" 02745 " -f_index TYPE : index by points or voxels\n" 02746 "\n" 02747 " e.g. -f_index points\n" 02748 " e.g. -f_index voxels\n" 02749 " default: -f_index voxels\n" 02750 "\n" 02751 " Along a single segment, the default operation is to\n" 02752 " apply only those points mapping to a new voxel. The\n" 02753 " effect of the default is that a given voxel will have\n" 02754 " at most one value applied per voxel pair.\n" 02755 "\n" 02756 " If the user applies this option with 'points' or 'nodes'\n" 02757 " as the argument, then every point along the segment will\n" 02758 " be applied. This may be preferred if, for example, the\n" 02759 " user wishes to have the average weighted by the number\n" 02760 " of points occupying a voxel, not just the number of node\n" 02761 " pair segments.\n" 02762 "\n" 02763 " Note: the following -f_pX_XX options are used to alter the\n" 02764 " locations of the segment endpoints, per node pair.\n" 02765 " The segments are directed, from the node on the first\n" 02766 " surface to the node on the second surface. To modify\n" 02767 " the first endpoint, use a -f_p1_XX option, and use\n" 02768 " -f_pn_XX to modify the second.\n" 02769 "\n" 02770 " -f_p1_fr FRACTION : offset p1 by a length fraction\n" 02771 "\n" 02772 " e.g. -f_p1_fr -0.2\n" 02773 " e.g. -f_p1_fr -0.2 -f_pn_fr 0.2\n" 02774 "\n" 02775 " This option moves the first endpoint, p1, by a distance\n" 02776 " of the FRACTION times the original segment length. If\n" 02777 " the FRACTION is positive, it moves in the direction of\n" 02778 " the second endpoint, pn.\n" 02779 "\n" 02780 " In the example, p1 is moved by 20%% away from pn, which\n" 02781 " will increase the length of each segment.\n" 02782 "\n" 02783 " -f_pn_fr FRACTION : offset pn by a length fraction\n" 02784 "\n" 02785 " e.g. -f_pn_fr 0.2\n" 02786 " e.g. -f_p1_fr -0.2 -f_pn_fr 0.2\n" 02787 "\n" 02788 " This option moves pn by a distance of the FRACTION times\n" 02789 " the original segment length, in the direction from p1 to\n" 02790 " pn. So a positive fraction extends the segment, and a\n" 02791 " negative fraction reduces it.\n" 02792 "\n" 02793 " In the example above, using 0.2 adds 20%% to the segment\n" 02794 " length past the original pn.\n" 02795 "\n" 02796 " -f_p1_mm DISTANCE : offset p1 by a distance in mm.\n" 02797 "\n" 02798 " e.g. -f_p1_mm -1.0\n" 02799 " e.g. -f_p1_mm -1.0 -f_pn_fr 1.0\n" 02800 "\n" 02801 " This option moves p1 by DISTANCE mm., in the direction\n" 02802 " of pn. If the DISTANCE is positive, the segment gets\n" 02803 " shorter. If DISTANCE is negative, the segment will get\n" 02804 " longer.\n" 02805 "\n" 02806 " In the example, p1 is moved away from pn, extending the\n" 02807 " segment by 1 millimeter.\n" 02808 "\n" 02809 " -f_pn_mm DISTANCE : offset pn by a distance in mm.\n" 02810 "\n" 02811 " e.g. -f_pn_mm 1.0\n" 02812 " e.g. -f_p1_mm -1.0 -f_pn_fr 1.0\n" 02813 "\n" 02814 " This option moves pn by DISTANCE mm., in the direction\n" 02815 " from the first point to the second. So if DISTANCE is\n" 02816 " positive, the segment will get longer. If DISTANCE is\n" 02817 " negative, the segment will get shorter.\n" 02818 "\n" 02819 " In the example, pn is moved 1 millimeter farther from\n" 02820 " p1, extending the segment by that distance.\n" 02821 "\n" 02822 " ------------------------------\n" 02823 " GENERAL OPTIONS:\n" 02824 "\n" 02825 " -cmask MASK_COMMAND : command for dataset mask\n" 02826 "\n" 02827 " e.g. -cmask '-a fred_func+orig[2] -expr step(a-0.8)'\n" 02828 "\n" 02829 " This option will produce a mask to be applied to the\n" 02830 " output dataset. Note that this mask should form a\n" 02831 " single sub-brick.\n" 02832 "\n" 02833 " This option follows the style of 3dmaskdump (since the\n" 02834 " code for it was, uh, borrowed from there (thanks Bob!)).\n" 02835 "\n" 02836 " See '3dmaskdump -help' for more information.\n" 02837 "\n" 02838 " -data_expr EXPRESSION : apply expression to surface input\n" 02839 "\n" 02840 " e.g. -data_expr 17\n" 02841 " e.g. -data_expr '(a+b+c+d)/4'\n" 02842 " e.g. -data_expr '(sin(a)+sin(b))/2'\n" 02843 "\n" 02844 " This expression is applied to the list of data values\n" 02845 " from the surface data file input via '-sdata_1D'. The\n" 02846 " expression is applied for each node or node pair, to the\n" 02847 " list of data values corresponding to that node.\n" 02848 "\n" 02849 " The letters 'a' through 'z' may be used as input, and\n" 02850 " refer to columns 1 through 26 of the data file (where\n" 02851 " column 0 is a surface node index). The data file must\n" 02852 " have enough columns to support the expression. Is is\n" 02853 " valid to have a constant expression without a data file.\n" 02854 "\n" 02855 " -datum DTYPE : set data type in output dataset\n" 02856 "\n" 02857 " e.g. -datum short\n" 02858 " default: same as that of grid parent\n" 02859 "\n" 02860 " This option specifies the data type for the output AFNI\n" 02861 " dataset. Valid choices are byte, short and float, which\n" 02862 " are 1, 2 and 4 bytes for each data point, respectively.\n" 02863 "\n" 02864 " -debug LEVEL : verbose output\n" 02865 "\n" 02866 " e.g. -debug 2\n" 02867 "\n" 02868 " This option is used to print out status information \n" 02869 " during the execution of the program. Current levels are\n" 02870 " from 0 to 5.\n" 02871 "\n" 02872 " -dnode DEBUG_NODE : extra output for that node\n" 02873 "\n" 02874 " e.g. -dnode 123456\n" 02875 "\n" 02876 " This option requests additional debug output for the\n" 02877 " given surface node. This index is with respect to the\n" 02878 " input surface (included in the spec file, or through the\n" 02879 " '-surf_xyz_1D' option).\n" 02880 "\n" 02881 " This will have no effect without the '-debug' option.\n" 02882 "\n" 02883 " -dvoxel DEBUG_VOXEL : extra output for that voxel\n" 02884 "\n" 02885 " e.g. -dvoxel 234567\n" 02886 "\n" 02887 " This option requests additional debug output for the\n" 02888 " given volume voxel. This 1-D index is with respect to\n" 02889 " the output AFNI dataset. One good way to find a voxel\n" 02890 " index to supply is from output via the '-dnode' option.\n" 02891 "\n" 02892 " This will have no effect without the '-debug' option.\n" 02893 "\n" 02894 " -hist : show revision history\n" 02895 "\n" 02896 " Display module history over time.\n" 02897 "\n" 02898 " -help : show this help\n" 02899 "\n" 02900 " If you can't get help here, please get help somewhere.\n" 02901 "\n" 02902 " -noscale : no scale factor in output dataset\n" 02903 "\n" 02904 " If the output dataset is an integer type (byte, shorts\n" 02905 " or ints), then the output dataset may end up with a\n" 02906 " scale factor attached (see 3dcalc -help). With this\n" 02907 " option, the output dataset will not be scaled.\n" 02908 "\n" 02909 " -sxyz_orient_as_gpar : assume gpar orientation for sxyz\n" 02910 "\n" 02911 " This option specifies that the surface coordinate points\n" 02912 " in the '-surf_xyz_1D' option file have the orientation\n" 02913 " of the grid parent dataset.\n" 02914 "\n" 02915 " When the '-surf_xyz_1D' option is applied the surface\n" 02916 " coordinates are assumed to be in Dicom orientation, by\n" 02917 " default. This '-sxyz_orient_as_gpar' option overrides\n" 02918 " the Dicom default, specifying that the node coordinates\n" 02919 " are in the same orientation as the grid parent dataset.\n" 02920 "\n" 02921 " See the '-surf_xyz_1D' option for more information.\n" 02922 "\n" 02923 " -version : show version information\n" 02924 "\n" 02925 " Show version and compile date.\n" 02926 "\n" 02927 "------------------------------------------------------------\n" 02928 "\n" 02929 " Author: R. Reynolds - %s\n" 02930 "\n" 02931 " (many thanks to Z. Saad and R.W. Cox)\n" 02932 "\n", 02933 prog, prog, 02934 prog, prog, prog, prog, prog, 02935 VERSION ); 02936 } 02937 else if ( level == S2V_USE_HIST ) 02938 fputs(g_history, stdout); 02939 else if ( level == S2V_USE_VERSION ) 02940 printf( "%s : %s, compile date: %s\n", prog, VERSION, __DATE__ ); 02941 else 02942 fprintf( stderr, "usage called with illegal level <%d>\n", level ); 02943 02944 RETURN(-1); 02945 } |
|
Definition at line 2269 of file SUMA_3dSurf2Vol.c.
02270 { 02271 ENTRY("validate_datasets"); 02272 02273 p->gpar = THD_open_dataset( opts->gpar_file ); 02274 02275 if ( !ISVALID_DSET(p->gpar) ) 02276 { 02277 if ( opts->gpar_file == NULL ) 02278 fprintf( stderr, "** error: missing '-grid_parent DSET' option\n" ); 02279 else 02280 fprintf( stderr, "** error: invalid input dataset '%s'\n", 02281 opts->gpar_file); 02282 RETURN(-1); 02283 } 02284 else if ( DSET_BRICK_TYPE(p->gpar, 0) == MRI_complex ) 02285 { 02286 fprintf(stderr, 02287 "** failure: cannot deal with complex-valued dataset, '%s'\n", 02288 opts->gpar_file); 02289 RETURN(-1); 02290 } 02291 02292 p->nvox = DSET_NVOX( p->gpar ); 02293 set_3dmm_bounds( p->gpar, &p->f3mm_min, &p->f3mm_max ); 02294 02295 if ( ! THD_filename_ok( opts->oset_file ) ) 02296 { 02297 fprintf( stderr, "** illegal output prefix: '%s'\n", 02298 opts->oset_file ? opts->oset_file : "<none>" ); 02299 RETURN(-1); 02300 } 02301 02302 /* -------------------------------------------------------------------- */ 02303 /* check for cmask - casually stolen from 3dmaskdump.c (thanks, Bob! :) */ 02304 02305 if ( opts->cmask_cmd != NULL ) 02306 { 02307 int clen = strlen( opts->cmask_cmd ); 02308 char * cmd; 02309 02310 /* save original cmask command, as EDT_calcmask() is destructive */ 02311 cmd = (char *)malloc((clen + 1) * sizeof(char)); 02312 strcpy( cmd, opts->cmask_cmd ); 02313 02314 p->cmask = EDT_calcmask( cmd, &p->ncmask ); 02315 02316 free( cmd ); /* free EDT_calcmask() string */ 02317 02318 if ( p->cmask == NULL ) 02319 { 02320 fprintf( stderr, "** failure: cannot compute mask from option:\n" 02321 " -cmask '%s'\n", opts->cmask_cmd ); 02322 RETURN(-1); 02323 } 02324 if ( p->ncmask != p->nvox ) 02325 { 02326 fprintf( stderr, "** error: input and cmask datasets do not have " 02327 "the same dimensions\n" ); 02328 RETURN(-1); 02329 } 02330 if ( ( p->ccount = THD_countmask( p->ncmask, p->cmask ) ) <= 0 ) 02331 { 02332 fprintf( stderr, "** Warning! No voxels in computed cmask!\n" ); 02333 /* return -1; continue, and let the user deal with it... */ 02334 } 02335 } 02336 02337 if ( opts->debug > 0 ) 02338 { 02339 fprintf( stderr, "++ input dset has nvox = %d, nvals = %d", 02340 p->nvox, DSET_NVALS(p->gpar) ); 02341 if ( p->cmask == NULL ) 02342 fputc( '\n', stderr ); 02343 else 02344 fprintf( stderr, " (%d voxels in mask)\n", p->ccount ); 02345 } 02346 02347 RETURN(0); 02348 } |
|
Definition at line 2041 of file SUMA_3dSurf2Vol.c.
02042 { 02043 ENTRY("validate_options"); 02044 02045 /* clear param struct - pointer get explicit NULL */ 02046 memset( p, 0, sizeof(*p) ); 02047 p->gpar = NULL; p->oset = NULL; 02048 p->sxyz_im = NULL; p->sdata_im = NULL; 02049 p->parser.pcode = NULL; p->cmask = NULL; 02050 02051 if ( check_map_func( opts->map_str ) == E_SMAP_INVALID ) 02052 RETURN(-1); 02053 02054 if ( validate_datasets( opts, p ) != 0 ) 02055 RETURN(-1); 02056 02057 if ( validate_surface( opts, p ) != 0 ) 02058 RETURN(-1); 02059 02060 if ( opts->data_expr ) 02061 { 02062 PARSER_set_printout(1); 02063 p->parser.pcode = PARSER_generate_code( opts->data_expr ); 02064 if ( p->parser.pcode == NULL ) 02065 { 02066 fprintf(stderr,"** failed to generate code from expression '%s'\n", 02067 opts->data_expr); 02068 RETURN(-1); 02069 } 02070 PARSER_mark_symbols( p->parser.pcode, p->parser.has_sym ); 02071 02072 if ( opts->debug > 1 ) 02073 disp_parser_t( "-- PARSER expr okay: ", &p->parser ); 02074 } 02075 02076 if ( opts->debug > 1 ) 02077 disp_param_t( "++ params set: ", p ); 02078 02079 RETURN(0); 02080 } |
|
Definition at line 2205 of file SUMA_3dSurf2Vol.c.
02206 { 02207 int errs = 0; 02208 02209 ENTRY("validate_surface"); 02210 02211 if ( ! opts->surf_xyz_1D_file ) /* then check the surface input */ 02212 { 02213 if ( opts->spec_file == NULL ) 02214 { 02215 fprintf( stderr, "** missing '-spec_file SPEC_FILE' option\n" ); 02216 errs++; 02217 } 02218 02219 if ( opts->sv_file == NULL ) 02220 { 02221 fprintf( stderr, "** missing '-sv SURF_VOL' option\n" ); 02222 errs++; 02223 } 02224 02225 if ( opts->snames[0] == NULL ) 02226 { 02227 fprintf( stderr, "** missing '-surf_A SURF_NAME' option\n" ); 02228 errs++; 02229 } 02230 } 02231 else if ( opts->spec_file != NULL ) 02232 { 02233 fprintf(stderr, 02234 "** cannot use both spec and xyz surface files, %s and %s\n", 02235 opts->spec_file, opts->surf_xyz_1D_file); 02236 errs++; 02237 } 02238 02239 if ( opts->sdata_file_1D && opts->sdata_file_niml ) 02240 { 02241 fprintf(stderr,"** cannot use both NIML and 1D surface files\n"); 02242 errs++; 02243 } 02244 02245 /* rcr - hopefully this will disappear someday */ 02246 if ( opts->sdata_file_niml ) 02247 { 02248 fprintf(stderr,"** sorry, the niml feature is coming soon...\n"); 02249 errs++; 02250 } 02251 02252 if ( errs > 0 ) 02253 RETURN(-1); 02254 02255 RETURN(0); 02256 } |
|
Definition at line 1488 of file SUMA_3dSurf2Vol.c. References node_list_t::depth, disp_node_list_t(), ENTRY, node_list_t::fdata, free, node_list_t::ilen, node_list_t::ilist, malloc, node_list_t::nnodes, node_list_t::nodes, and RETURN. Referenced by fill_node_list().
01489 { 01490 int icount, errs = 0; 01491 01492 ENTRY("verify_node_list"); 01493 01494 if ( !N ) 01495 { 01496 fprintf(stderr, "** vnl - no node list\n" ); 01497 RETURN(-1); 01498 } 01499 01500 if ( !N->nodes || !N->ilist ) 01501 { 01502 fprintf(stderr,"** missing nodes or ilist\n" ); 01503 errs++; 01504 } 01505 01506 if ( N->depth < 1 || N->nnodes < 1 || N->ilen < 1 ) 01507 { 01508 fprintf(stderr,"** invalid depth, nnodes or ilen" ); 01509 errs++; 01510 } 01511 01512 if ( errs ) 01513 { 01514 disp_node_list_t("** invalid data : ", N ); 01515 RETURN(-errs); 01516 } 01517 01518 /* now check that the indices are within nnodes range */ 01519 for ( icount = 0; icount < N->ilen; icount++ ) 01520 if ( N->ilist[icount] < 0 || N->ilist[icount] >= N->nnodes ) 01521 { 01522 fprintf(stderr,"** surf data index number %d is out of range:\n" 01523 " index = %d, range is [%d,%d]\n", 01524 icount, N->ilist[icount], 0, N->nnodes-1); 01525 RETURN(-10); 01526 } 01527 01528 /* node_list is okay, so make space for the actual data */ 01529 if ( (N->fdata = (float *)malloc(N->ilen*sizeof(float))) == NULL ) 01530 { 01531 fprintf(stderr,"** vnl: failed to allocate %d floats\n",N->ilen); 01532 free(N->ilist); 01533 RETURN(-20); 01534 } 01535 01536 RETURN(0); 01537 } |
|
Definition at line 1435 of file SUMA_3dSurf2Vol.c. References opts_t::data_expr, opts_t::debug, ENTRY, parser_t::has_sym, parser_t::max_sym, MRI_IMAGE::nx, p, param_t::parser, parser_t::pcode, RETURN, and param_t::sdata_im. Referenced by read_surf_files().
01436 { 01437 int max_used; 01438 01439 ENTRY("verify_parser_expr"); 01440 01441 if ( !opts || !p ) 01442 { 01443 fprintf(stderr,"** vpe: invalid params (%p,%p)\n", opts, p); 01444 RETURN(-1); 01445 } 01446 01447 /* if no parser code, there is nothing to do */ 01448 if ( ! p->parser.pcode ) 01449 RETURN(0); 01450 01451 for ( max_used = 25; max_used >= 0; max_used-- ) 01452 if ( p->parser.has_sym[max_used] ) 01453 break; 01454 max_used++; /* this is the number of surface values needed */ 01455 p->parser.max_sym = max_used; 01456 01457 /* if the expression is not constant, we need some data */ 01458 if ( max_used > 0 ) 01459 { 01460 if ( !p->sdata_im ) 01461 { 01462 fprintf(stderr, "** parser expression requires surface data\n" 01463 " (see '-sdata_1D')\n"); 01464 RETURN(-1); 01465 } 01466 else if ( max_used > p->sdata_im->nx - 1 ) 01467 { 01468 fprintf(stderr, 01469 "** error: not enough surface values for expression\n" 01470 " svals = %d, exp_vals = %d, expr = '%s'\n", 01471 p->sdata_im->nx - 1, max_used, opts->data_expr); 01472 RETURN(-1); 01473 } 01474 } 01475 01476 if ( opts->debug > 1 ) 01477 fprintf(stderr,"-- surf_vals = %d, expr_vals = %d\n", 01478 p->sdata_im ? (p->sdata_im->nx - 1) : 0, max_used); 01479 01480 RETURN(0); 01481 } |
|
Definition at line 200 of file SUMA_3dSurf2Vol.c.
00202 { 00203 ENTRY("write_output"); 00204 00205 if ( sopt == NULL || opts == NULL || p == NULL || N == NULL ) 00206 { 00207 fprintf( stderr, "** s2v_wo - bad params (%p,%p,%p,%p)\n", 00208 sopt, opts, p, N ); 00209 RETURN(-1); 00210 } 00211 00212 p->oset = s2v_nodes2volume( N, p, sopt ); 00213 00214 if ( p->oset == NULL ) 00215 RETURN(-1); 00216 00217 EDIT_dset_items( p->oset, ADN_prefix, opts->oset_file, ADN_none ); 00218 00219 if ( THD_is_file(DSET_HEADNAME(p->oset)) ) 00220 { 00221 fprintf( stderr, "** cannot overwrite existing dataset '%s'\n", 00222 DSET_HEADNAME(p->oset) ); 00223 DSET_delete( p->oset ); 00224 RETURN(-1); 00225 } 00226 00227 tross_Copy_History( p->gpar, p->oset ); 00228 tross_Make_History( PROG_NAME, argc, argv, p->oset ); 00229 00230 if ( DSET_write( p->oset ) != True ) 00231 { 00232 fprintf( stderr, "** failed to write dataset '%s', exiting...\n", 00233 opts->oset_file ); 00234 RETURN(-1); 00235 } 00236 00237 RETURN(0); 00238 } |
Variable Documentation
|
Definition at line 68 of file SUMA_3dSurf2Vol.c. Referenced by usage(). |
|
Initial value: { "none", "mask", "mask2", "ave", "count", "min", "max", "max_abs" } Definition at line 150 of file SUMA_3dSurf2Vol.c. Referenced by init_node_list(), and s2v_map_type(). |
|
Definition at line 147 of file SUMA_3dSurf2Vol.c. |
|
Definition at line 145 of file SUMA_3dSurf2Vol.c. |
|
Definition at line 146 of file SUMA_3dSurf2Vol.c. Referenced by fill_SUMA_structs(), final_clean_up(), get_mappable_surfs(), and init_node_list(). |
|
Definition at line 144 of file SUMA_3dSurf2Vol.c. Referenced by final_clean_up(). |
|
Definition at line 143 of file SUMA_3dSurf2Vol.c. |