void THD_load_tcat( THD_datablock *dblk ) { int ivout , dd , iv ; THD_3dim_dataset *dset_in , *dset_out ; NI_str_array *sar ; ENTRY("THD_load_tcat") ; if( !ISVALID_DBLK(dblk) ) EXRETURN ; dset_out = (THD_3dim_dataset *)dblk->parent ; if( !ISVALID_DSET(dset_out) ) EXRETURN ; sar = NI_decode_string_list( dset_out->tcat_list , "~" ) ; if( sar == NULL ) EXRETURN ; if( sar->num != dset_out->tcat_num ){ NI_delete_str_array(sar); EXRETURN; } ivout = 0 ; for( dd=0 ; dd < sar->num ; dd++ ){ dset_in = THD_open_dataset( sar->str[dd] ) ; if( dset_in == NULL ){ NI_delete_str_array(sar) ; DSET_unload(dset_out) ; EXRETURN ; } DSET_mallocize(dset_in) ; DSET_load(dset_in) ; if( !DSET_LOADED(dset_in) ){ NI_delete_str_array(sar) ; DSET_unload(dset_out) ; DSET_delete(dset_in) ; EXRETURN ; } for( iv=0 ; iv < DSET_NVALS(dset_in) ; iv++ ){ EDIT_substitute_brick( dset_out , ivout , DSET_BRICK_TYPE(dset_in,iv), DSET_ARRAY(dset_in,iv) ); mri_fix_data_pointer( NULL , DSET_BRICK(dset_in,iv) ) ; EDIT_BRICK_FACTOR( dset_out , ivout , DSET_BRICK_FACTOR(dset_in,iv) ) ; EDIT_BRICK_LABEL(dset_out, ivout, DSET_BRICK_LABEL(dset_in, iv)); /* ZSS Aug. 27 2012 */ ivout++ ; } DSET_delete(dset_in) ; } NI_delete_str_array(sar) ; EXRETURN ; }
THD_3dim_dataset * THD_open_tcat( char *dlist ) { THD_3dim_dataset *dset_out , **dset_in ; int ndset_in , dd , nerr , new_nvals, sb=0 ; NI_str_array *sar ; double angle=0.0; char *dp, *dlocal = dlist; /* local dlist, in case it is altered */ ENTRY("THD_open_tcat") ; if( dlocal == NULL || *dlocal == '\0' ) RETURN(NULL) ; /* allow file list to be read from a file 23 Jul 2012 [rickr] */ if( ! strncmp(dlocal, "filelist:", 9) ) { dlocal = AFNI_suck_file(dlocal+9) ; if ( ! dlocal ) { ERROR_message("THD_open_tcat: failed to open '%s' as filelist", dlocal+9); RETURN(NULL) ; } /* make it look more like expected */ for( dd=0, dp=dlocal; dd < strlen(dlocal); dd++, dp++ ) if( *dp == '\n' || *dp == '\r' ) *dp = ' '; } if( strchr(dlocal,' ') == NULL ){ dset_out = THD_open_dataset(dlocal) ; RETURN(dset_out) ; } sar = NI_decode_string_list( dlocal , "~" ) ; if( sar == NULL ) RETURN(NULL) ; ndset_in = sar->num ; dset_in = (THD_3dim_dataset **)malloc(sizeof(THD_3dim_dataset *)*sar->num) ; for( nerr=dd=0 ; dd < ndset_in ; dd++ ){ dset_in[dd] = THD_open_dataset( sar->str[dd] ) ; if( dset_in[dd] == NULL ){ fprintf(stderr,"** THD_open_tcat: can't open dataset %s\n",sar->str[dd]) ; nerr++ ; } } if( nerr > 0 ){ for( dd=0 ; dd < ndset_in ; dd++ ) if( dset_in[dd] != NULL ) DSET_delete(dset_in[dd]) ; free((void *)dset_in) ; NI_delete_str_array(sar) ; RETURN(NULL) ; } if( ndset_in == 1 ){ dset_out = dset_in[0] ; free((void *)dset_in) ; NI_delete_str_array(sar) ; RETURN(dset_out) ; } (void)THD_check_for_duplicates( sar->num , sar->str , 1 ) ; /* 31 May 2007 */ for( nerr=0,dd=1 ; dd < ndset_in ; dd++ ){ if( DSET_NX(dset_in[0]) != DSET_NX(dset_in[dd]) || DSET_NY(dset_in[0]) != DSET_NY(dset_in[dd]) || DSET_NZ(dset_in[0]) != DSET_NZ(dset_in[dd]) ){ ERROR_message( "THD_open_tcat: %s [%dx%dx%d] doesn't match %s [%dx%dx%d]\n", sar->str[0] ,DSET_NX(dset_in[0]) , DSET_NY(dset_in[0]) ,DSET_NZ(dset_in[0]) , sar->str[dd],DSET_NX(dset_in[dd]), DSET_NY(dset_in[dd]),DSET_NZ(dset_in[dd]) ) ; nerr++ ; } else { if( !EQUIV_DATAXES(dset_in[dd]->daxes,dset_in[0]->daxes) ){ WARNING_message( "THD_open_tcat: %s grid mismatch with %s\n", sar->str[0] , sar->str[dd] ) ; /* don't increment nerr! */ } angle = dset_obliquity_angle_diff(dset_in[dd], dset_in[0], -1.0); if (angle > 0.0) { WARNING_message( "dataset %s has an obliquity difference of %f degress with %s\n", dset_in[dd] , angle, dset_in[0] ); } } } if( nerr > 0 ){ for( dd=0 ; dd < ndset_in ; dd++ ) if( dset_in[dd] != NULL ) DSET_delete(dset_in[dd]) ; free((void *)dset_in) ; NI_delete_str_array(sar) ; RETURN(NULL) ; } /*-- Check for type problems ZSS: Aug 27 2012 --*/ for (nerr=0,dd=0; dd < ndset_in ; dd++) { for (sb=0; sb < DSET_NVALS(dset_in[dd]); ++sb) { if ( DSET_BRICK_TYPE(dset_in[0],0) != DSET_BRICK_TYPE(dset_in[dd],sb) ) { ++nerr; } } } if (nerr > 0) { /* don't die, just complain */ WARNING_message( "Command-line catenated dataset has %d sub-bricks that differ \n" " in data type from the first sub-brick of the first set.\n" " Mme Irma sees potential for grief if you go down that path. \n" " Use 3dinfo -datum on each input to understand why this is happening.\n" " You can use 3dcalc's -datum option to rewrite the dataset with \n" " all sub-bricks set to the same type then start over.\n\n", nerr); nerr=0; } /*-- OK, start making new dataset --*/ new_nvals = 0 ; for( dd=0 ; dd < ndset_in ; dd++ ) new_nvals += DSET_NVALS(dset_in[dd]) ; for( dd=0 ; dd < ndset_in ; dd++ ) if( DSET_TIMESTEP(dset_in[dd]) > 0.0 ) break ; /* 1st 3D+time */ if( dd == ndset_in ) dd = 0 ; dset_out = EDIT_empty_copy( dset_in[dd] ) ; /* since this is basically an input dataset, set the storage_mode * to match 27 Jul 2010 [rickr] */ if( DSET_ONDISK(dset_out) && IS_VALID_NON_AFNI_DSET(dset_in[dd]) ) THD_set_storage_mode(dset_out, dset_in[dd]->dblk->diskptr->storage_mode); EDIT_dset_items( dset_out , ADN_prefix , "tcat" , ADN_func_type , ISANAT(dset_in[dd]) ? ANAT_EPI_TYPE : FUNC_FIM_TYPE , ADN_ntt , new_nvals , ADN_nvals , new_nvals , ADN_none ) ; DSET_mallocize( dset_out ) ; /* check if we have a valid time axis; if not, make one up */ if( DSET_TIMESTEP(dset_out) <= 0.0f ){ float TR=1.0f , torg=0.0f , tdur=0.0f ; int tunits=UNITS_SEC_TYPE ; EDIT_dset_items( dset_out , ADN_tunits , tunits , ADN_ttdel , TR , ADN_ttorg , torg , ADN_ttdur , tdur , ADN_none ) ; } dset_out->tcat_list = strdup( dlocal ) ; dset_out->tcat_num = ndset_in ; dset_out->tcat_len = (int *)malloc(sizeof(int)*ndset_in) ; for( dd=0 ; dd < ndset_in ; dd++ ){ dset_out->tcat_len[dd] = DSET_NVALS(dset_in[dd]) ; DSET_delete(dset_in[dd]) ; } free((void *)dset_in) ; NI_delete_str_array(sar) ; #if 0 fprintf(stderr,"THD_open_tcat('%s'):",dset_out->tcat_list); for(dd=0;dd<ndset_in;dd++)fprintf(stderr," %d",dset_out->tcat_len[dd]); fprintf(stderr,"\n"); #endif RETURN(dset_out) ; }
int THD_datablock_from_atr( THD_datablock *dblk, char *dirname, char *headname ) { THD_diskptr *dkptr ; ATR_int *atr_rank , *atr_dimen , *atr_scene , *atr_btype ; ATR_float *atr_flt ; ATR_string *atr_labs ; int ii , view_type , func_type , dset_type , nx,ny,nz,nvox , nvals , ibr,typ ; Boolean ok ; char prefix[THD_MAX_NAME]="Unknown" ; MRI_IMAGE *qim ; int brick_ccode ; char name[666] ; ENTRY("THD_datablock_from_atr") ; if( dblk == NULL || dblk->natr <= 0 ) RETURN(0) ; /* bad input */ dkptr = dblk->diskptr ; /*-- get relevant attributes: rank, dimensions, view_type & func_type --*/ atr_rank = THD_find_int_atr( dblk , ATRNAME_DATASET_RANK ) ; atr_dimen = THD_find_int_atr( dblk , ATRNAME_DATASET_DIMENSIONS ) ; atr_scene = THD_find_int_atr( dblk , ATRNAME_SCENE_TYPE ) ; /*-- missing an attribute ==> quit now --*/ if( atr_rank == NULL || atr_dimen == NULL || atr_scene == NULL ) RETURN(0) ; /*-- load type codes from SCENE attribute --*/ STATUS("loading *_type from SCENE") ; view_type = atr_scene->in[0] ; func_type = atr_scene->in[1] ; dset_type = atr_scene->in[2] ; /*-- load other values from attributes into relevant places --*/ ok = True ; nvox = 1 ; STATUS("loading from RANK") ; dkptr->rank = atr_rank->in[0] ; /* N.B.: rank isn't used much */ dkptr->nvals = dblk->nvals = nvals = atr_rank->in[1] ; /* but nvals is used */ STATUS("loading from DIMENSIONS") ; for( ii=0 ; ii < dkptr->rank ; ii++ ){ dkptr->dimsizes[ii] = atr_dimen->in[ii] ; ok = ( ok && dkptr->dimsizes[ii] >= 1 ) ; nvox *= dkptr->dimsizes[ii] ; } #if 0 if( PRINT_TRACING ){ char str[256] ; sprintf(str,"rank=%d nvals=%d dim[0]=%d dim[1]=%d dim[2]=%d nvox=%d", dkptr->rank , dkptr->nvals , dkptr->dimsizes[0] , dkptr->dimsizes[1] , dkptr->dimsizes[2] , nvox ) ; STATUS(str) ; } #endif if( !ok || nvals < 1 || dkptr->rank < THD_MIN_RANK || dkptr->rank > THD_MAX_RANK ){ STATUS("bad rank!!??") ; RETURN(0) ; } /*-- create the storage filenames --*/ STATUS("creating storage filenames") ; if( headname != NULL && strchr(headname,'+') != NULL ){ FILENAME_TO_PREFIX(headname,prefix) ; THD_init_diskptr_names( dkptr, dirname,NULL,prefix , view_type , True ) ; } else { if( headname != NULL ) MCW_strncpy(prefix,headname,THD_MAX_NAME) ; THD_init_diskptr_names( dkptr, dirname,NULL,prefix , view_type , True ) ; } /*-- determine if the BRIK file exists --*/ STATUS("checking if .BRIK file exists") ; brick_ccode = COMPRESS_filecode(dkptr->brick_name) ; if (dkptr->storage_mode == STORAGE_UNDEFINED) { /* ZSS: Oct. 2011 the next line was being called all the time before */ if( brick_ccode != COMPRESS_NOFILE ) dkptr->storage_mode = STORAGE_BY_BRICK ; /* a .BRIK file */ } /*-- if VOLUME_FILENAMES attribute exists, make it so [20 Jun 2002] --*/ if( headname != NULL && dkptr->storage_mode == STORAGE_UNDEFINED ){ atr_labs = THD_find_string_atr(dblk,"VOLUME_FILENAMES") ; if( atr_labs != NULL ){ dkptr->storage_mode = STORAGE_BY_VOLUMES ; dblk->malloc_type = DATABLOCK_MEM_MALLOC ; } } /*-- now set the memory allocation codes, etc. --*/ dblk->brick_fac = (float *) XtMalloc( sizeof(float) * nvals ) ; for( ibr=0 ; ibr < nvals ; ibr++ ) dblk->brick_fac[ibr] = 0.0 ; /* scaling factors from short type to float type, if nonzero */ if( !AFNI_yesenv("AFNI_IGNORE_BRICK_FLTFAC") ){ atr_flt = THD_find_float_atr( dblk , ATRNAME_BRICK_FLTFAC ) ; if( atr_flt != NULL ){ for( ibr=0 ; ibr < nvals && ibr < atr_flt->nfl ; ibr++ ) dblk->brick_fac[ibr] = atr_flt->fl[ibr] ; } } /** Now create an empty shell of the "brick" == the data structure that will hold all the voxel data. Note that all datablocks will have a brick, even if they never actually contain data themselves (are only warp-on-demand). If the BRICK_TYPES input attribute doesn't exist, then all sub-bricks are shorts. This makes the code work with old-style datasets, which were always made up of shorts. **/ atr_btype = THD_find_int_atr( dblk , ATRNAME_BRICK_TYPES ) ; if( atr_btype == NULL ){ THD_init_datablock_brick( dblk , MRI_short , NULL ) ; } else { THD_init_datablock_brick( dblk , atr_btype->nin , atr_btype->in ) ; } if( !THD_datum_constant(dblk) ){ /* 15 Sep 2004 */ fprintf(stderr, "\n** WARNING: File %s has mixed-type sub-bricks. ", MYHEAD ) ; } /* 25 April 1998: check if the byte order is stored inside */ atr_labs = THD_find_string_atr( dblk , ATRNAME_BYTEORDER ) ; if( atr_labs != NULL && atr_labs->nch > 0 ){ if( strncmp(atr_labs->ch,LSB_FIRST_STRING,ORDER_LEN) == 0 ) dkptr->byte_order = LSB_FIRST ; else if( strncmp(atr_labs->ch,MSB_FIRST_STRING,ORDER_LEN) == 0 ) dkptr->byte_order = MSB_FIRST ; else fprintf(stderr,"*** Unknown %s found in dataset %s\n", ATRNAME_BYTEORDER , MYHEAD ) ; } else if( !no_ordwarn && DBLK_BRICK_TYPE(dblk,0) != MRI_byte && dblk->diskptr->storage_mode == STORAGE_BY_BRICK ){ /* 20 Sep 1999 */ static int first=1 ; if( first ){ fprintf(stderr, "\n*** The situation below can be rectified with program '3drefit -byteorder':\n"); first = 0 ; } fprintf(stderr," ** Dataset %s: assuming byteorder %s\n", MYHEAD , BYTE_ORDER_STRING(dkptr->byte_order) ) ; } /* if the data is not on disk, the flag remains at DATABLOCK_MEM_UNDEFINED, otherwise the flag says how the memory for the bricks is to be created. */ if( dkptr->storage_mode == STORAGE_BY_BRICK ){ #if MMAP_THRESHOLD > 0 dblk->malloc_type = (dblk->total_bytes > MMAP_THRESHOLD) ? DATABLOCK_MEM_MMAP : DATABLOCK_MEM_MALLOC ; DBLK_mmapfix(dblk) ; /* 18 Mar 2005 */ #else dblk->malloc_type = DATABLOCK_MEM_MALLOC ; #endif /* must be malloc-ed if: data is compressed, data is not in native byte order, or user explicity forbids use of mmap */ if( brick_ccode >= 0 || dkptr->byte_order != native_order || no_mmap ) dblk->malloc_type = DATABLOCK_MEM_MALLOC ; } /* 30 Nov 1997: create the labels for sub-bricks */ THD_init_datablock_labels( dblk ) ; atr_labs = THD_find_string_atr( dblk , ATRNAME_BRICK_LABS ) ; if( atr_labs != NULL && atr_labs->nch > 0 ){ /* create labels from attribute */ int ipos = -1 , ipold , ngood ; for( ibr=0 ; ibr < nvals ; ibr++ ){ /* loop over bricks */ for( ipold = ipos++ ; /* skip to */ ipos < atr_labs->nch && atr_labs->ch[ipos] != '\0' ; /* next \0 */ ipos++ ) /* nada */ ; /* or end. */ ngood = ipos - ipold - 1 ; /* number of good chars */ if( ngood > 0 ){ XtFree(dblk->brick_lab[ibr]) ; /* 27 Oct 2011 - increase to 64 */ if( ngood > THD_MAX_SBLABEL ) ngood = THD_MAX_SBLABEL; dblk->brick_lab[ibr] = (char *) XtMalloc(sizeof(char)*(ngood+2)) ; memcpy( dblk->brick_lab[ibr] , atr_labs->ch+(ipold+1) , ngood ) ; dblk->brick_lab[ibr][ngood] = '\0' ; } if( ipos >= atr_labs->nch ) break ; /* nothing more to do */ } /* end of loop over sub-bricks */ } /* create the keywords for sub-bricks */ THD_init_datablock_keywords( dblk ) ; atr_labs = THD_find_string_atr( dblk , ATRNAME_BRICK_KEYWORDS ) ; if( atr_labs != NULL && atr_labs->nch > 0 ){ /* create keywords from attribute */ int ipos = -1 , ipold , ngood ; for( ibr=0 ; ibr < nvals ; ibr++ ){ /* loop over bricks */ for( ipold = ipos++ ; /* skip to */ ipos < atr_labs->nch && atr_labs->ch[ipos] != '\0' ; /* next \0 */ ipos++ ) /* nada */ ; /* or end. */ ngood = ipos - ipold - 1 ; /* number of good chars */ if( ngood > 0 ){ XtFree(dblk->brick_keywords[ibr]) ; dblk->brick_keywords[ibr] = (char *) XtMalloc(sizeof(char)*(ngood+2)) ; memcpy( dblk->brick_keywords[ibr] , atr_labs->ch+(ipold+1) , ngood ) ; dblk->brick_keywords[ibr][ngood] = '\0' ; } if( ipos >= atr_labs->nch ) break ; /* nothing more to do */ } /* end of loop over sub-bricks */ } /* create the auxiliary statistics stuff for each brick, if present */ atr_labs = THD_find_string_atr( dblk , "BRICK_STATSYM" ) ; /* 01 Jun 2005 */ if( atr_labs != NULL && atr_labs->nch > 0 ){ NI_str_array *sar ; int scode,np ; float parm[3] ; sar = NI_decode_string_list( atr_labs->ch , ";" ) ; if( sar != NULL && sar->num > 0 ){ for( ibr=0 ; ibr < nvals && ibr < sar->num ; ibr++ ){ NI_stat_decode( sar->str[ibr] , &scode , parm,parm+1,parm+2 ) ; if( scode >= AFNI_FIRST_STATCODE && scode <= AFNI_LAST_STATCODE ){ np = NI_stat_numparam(scode) ; THD_store_datablock_stataux( dblk , ibr,scode,np,parm ) ; } } NI_delete_str_array(sar) ; } } else { /*--- the olde way to get ye brick stataux parameters ---*/ atr_flt = THD_find_float_atr( dblk , ATRNAME_BRICK_STATAUX ) ; if( atr_flt != NULL && atr_flt->nfl >= 3 ){ int ipos=0 , iv,nv,jv ; /* attribute stores all stataux stuff as follows: sub-brick-index statcode no.-of-values value ... value sub-brick-index statcode no.-of-values value ... value, etc. */ while( ipos <= atr_flt->nfl - 3 ){ iv = (int) ( atr_flt->fl[ipos++] ) ; /* which sub-brick */ jv = (int) ( atr_flt->fl[ipos++] ) ; /* statcode */ nv = (int) ( atr_flt->fl[ipos++] ) ; /* # of values that follow */ if( nv > atr_flt->nfl - ipos ) nv = atr_flt->nfl - ipos ; THD_store_datablock_stataux( dblk , iv , jv , nv , atr_flt->fl + ipos ) ; ipos += nv ; } } } #if 0 if( PRINT_TRACING ){ char str[256] ; sprintf(str,"rank=%d nvals=%d dim[0]=%d dim[1]=%d dim[2]=%d", dkptr->rank , dkptr->nvals , dkptr->dimsizes[0] , dkptr->dimsizes[1] , dkptr->dimsizes[2] ) ; STATUS(str) ; } #endif /*-- FDR curves [23 Jan 2008] --*/ for( ibr=0 ; ibr < dblk->nvals ; ibr++ ){ sprintf(name,"FDRCURVE_%06d",ibr) ; atr_flt = THD_find_float_atr( dblk , name ) ; if( atr_flt != NULL && atr_flt->nfl > 3 ){ int nv = atr_flt->nfl - 2 ; floatvec *fv ; MAKE_floatvec(fv,nv) ; fv->x0 = atr_flt->fl[0] ; fv->dx = atr_flt->fl[1] ; memcpy( fv->ar , atr_flt->fl + 2 , sizeof(float)*nv ) ; if( dblk->brick_fdrcurve == NULL ) dblk->brick_fdrcurve = (floatvec **)calloc(sizeof(floatvec *),dblk->nvals); dblk->brick_fdrcurve[ibr] = fv ; } } for( ibr=0 ; ibr < dblk->nvals ; ibr++ ){ sprintf(name,"MDFCURVE_%06d",ibr) ; atr_flt = THD_find_float_atr( dblk , name ) ; if( atr_flt != NULL && atr_flt->nfl > 3 ){ int nv = atr_flt->nfl - 2 ; floatvec *fv ; MAKE_floatvec(fv,nv) ; fv->x0 = atr_flt->fl[0] ; fv->dx = atr_flt->fl[1] ; memcpy( fv->ar , atr_flt->fl + 2 , sizeof(float)*nv ) ; if( dblk->brick_mdfcurve == NULL ) dblk->brick_mdfcurve = (floatvec **)calloc(sizeof(floatvec *),dblk->nvals); dblk->brick_mdfcurve[ibr] = fv ; } } RETURN(1) ; }
SEG_OPTS *GenFeatureDist_ParseInput (SEG_OPTS *Opt, char *argv[], int argc) { static char FuncName[]={"GenFeatureDist_ParseInput"}; int kar, i, ind, exists; char *outname, cview[10], *sbuf=NULL; int brk = 0; SUMA_GENERIC_ARGV_PARSE *ps=NULL; SUMA_ENTRY; brk = 0; kar = 1; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { Opt->helpfunc(0); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); #ifdef USE_TRACING if( strncmp(argv[kar],"-trace",5) == 0 ){ DBG_trace = 1 ; brk = 1 ; } if( strncmp(argv[kar],"-TRACE",5) == 0 ){ DBG_trace = 2 ; brk = 1 ; } #endif if (!brk && (strcmp(argv[kar], "-debug") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -debug \n"); exit (1); } Opt->debug = atoi(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-talk_afni") == 0)) { Opt->ps->cs->talk_suma = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-openmp") == 0)) { Opt->openmp = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-no_openmp") == 0)) { Opt->openmp = 0; brk = 1; } if (!brk && (strcmp(argv[kar], "-vox_debug") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need 1D vox index after -vox_debug \n"); exit (1); } if (kar+2<argc) { /* see if we have ijk */ int iii, jjj, kkk; if (argv[kar][0]!='-' && argv[kar][1]!='-' && argv[kar][2]!='-' && (iii = atoi(argv[kar ])) >= 0 && (jjj = atoi(argv[kar+1])) >= 0 && (kkk = atoi(argv[kar+2])) >= 0 ) { Opt->VoxDbg3[0]=iii; Opt->VoxDbg3[1]=jjj; Opt->VoxDbg3[2]=kkk; ++kar; ++kar; } } if (Opt->VoxDbg3[0] < 0) { Opt->VoxDbg = atoi(argv[kar]); } brk = 1; } if (!brk && (strcmp(argv[kar], "-vox_debug_file") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need filename after -vox_debug_file \n"); exit (1); } if (!strcmp(argv[kar],"-")) { Opt->VoxDbgOut = stdout; } else if (!strcmp(argv[kar],"+")) { Opt->VoxDbgOut = stderr; } else { Opt->VoxDbgOut = fopen(argv[kar],"w"); } brk = 1; } if (!brk && (strcmp(argv[kar], "-cmask") == 0)) { kar ++; if (kar >= argc) { ERROR_exit("-cmask option requires a following argument!\n"); } Opt->cmask = EDT_calcmask( argv[kar] , &(Opt->dimcmask), 0 ) ; if( Opt->cmask == NULL ) ERROR_exit("Can't compute -cmask!\n"); brk = 1; } if (!brk && (strcmp(argv[kar], "-mask") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -mask \n"); exit (1); } Opt->mset_name = argv[kar]; brk = 1; } if( !brk && (strncmp(argv[kar],"-mrange",5) == 0) ){ if( kar+2 >= argc ) ERROR_exit("-mrange option requires 2 following arguments!\n"); Opt->mask_bot = strtod( argv[++kar] , NULL ) ; Opt->mask_top = strtod( argv[++kar] , NULL ) ; if( Opt->mask_top < Opt->mask_bot ) ERROR_exit("-mrange inputs are illegal!\n") ; brk = 1; } if (!brk && (strcmp(argv[kar], "-anat") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -anat \n"); exit (1); } Opt->aset_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-sig") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -sig \n"); exit (1); } while (kar < argc && argv[kar][0] != '-') { sbuf = SUMA_append_replace_string(sbuf, argv[kar], " ", 1); ++kar; } if (kar < argc && argv[kar][0] == '-') --kar; /* unwind */ Opt->sig_names = SUMA_NI_str_array(Opt->sig_names, sbuf, "add"); SUMA_free(sbuf); sbuf = NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-samp") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -samp \n"); exit (1); } while (kar < argc && argv[kar][0] != '-') { sbuf = SUMA_append_replace_string(sbuf, argv[kar], " ", 1); ++kar; } if (kar < argc && argv[kar][0] == '-') --kar; /* unwind */ Opt->samp_names = SUMA_NI_str_array(Opt->samp_names, sbuf, "add"); SUMA_free(sbuf); sbuf = NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-hspec") == 0)) { kar ++; if (kar+3 >= argc) { fprintf (stderr, "need 4 arguments after -hspec \n"); exit (1); } Opt->hspec = (SUMA_HIST **) SUMA_realloc(Opt->hspec, (Opt->N_hspec+1)*sizeof(SUMA_HIST *)); Opt->hspec[Opt->N_hspec] = (SUMA_HIST*)SUMA_calloc(1,sizeof(SUMA_HIST)); Opt->hspec[Opt->N_hspec]->label = SUMA_copy_string(argv[kar++]); Opt->hspec[Opt->N_hspec]->min = (float)strtod(argv[kar++],NULL); Opt->hspec[Opt->N_hspec]->max = (float)strtod(argv[kar++],NULL); Opt->hspec[Opt->N_hspec]->K = (float)strtod(argv[kar],NULL); ++Opt->N_hspec; brk = 1; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -prefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->proot = argv[kar]; Opt->prefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->crefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->pgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->cgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->frefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->xrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->prefix,"%s.p", argv[kar]); sprintf(Opt->pgrefix,"%s.pg", argv[kar]); sprintf(Opt->crefix,"%s.c", argv[kar]); sprintf(Opt->cgrefix,"%s.cg", argv[kar]); sprintf(Opt->frefix,"%s.f", argv[kar]); sprintf(Opt->xrefix,"%s.x", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-classes") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -classes \n"); exit (1); } Opt->clss = NI_strict_decode_string_list(argv[kar] ,";, "); brk = 1; } if (!brk && (strcmp(argv[kar], "-features") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -features \n"); exit (1); } Opt->feats = NI_strict_decode_string_list(argv[kar] ,";, "); brk = 1; } if (!brk && (strcmp(argv[kar], "-keys") == 0)) { NI_str_array *nstr=NULL; int ii; kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -keys \n"); exit (1); } if (!(nstr = NI_strict_decode_string_list(argv[kar] ,";, "))){ ERROR_exit("Bad option %s after -keys", argv[kar]); } Opt->keys = (int *)calloc(nstr->num, sizeof(int)); for (ii=0;ii<nstr->num; ++ii) Opt->keys[ii] = strtol(nstr->str[ii],NULL,10); NI_delete_str_array(nstr);nstr=NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-labeltable") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -labeltable \n"); exit (1); } Opt->labeltable_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-uid") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -uid \n"); exit (1); } snprintf(Opt->uid,128,"%s",argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-ShowTheseHists") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -ShowTheseHists \n"); exit (1); } { NI_str_array *hisnames=NULL; SUMA_HIST *hh=NULL; int ii=0; hisnames = NI_strict_decode_string_list(argv[kar],";, "); for (ii=0; ii<hisnames->num; ++ii) { if ((hh = SUMA_read_hist(hisnames->str[ii]))) { SUMA_Show_hist(hh, 1, NULL); hh = SUMA_Free_hist(hh); } else { SUMA_S_Errv("Hist %s not found.\n", hisnames->str[ii]); exit(1); } } hisnames = SUMA_free_NI_str_array(hisnames); } exit(0); brk = 1; } if (!brk) { fprintf (stderr,"Option #%d %s not understood. \n" "Try -help for usage\n", kar, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = 0; kar ++; } } if (!Opt->prefix) Opt->prefix = strdup("./GenFeatureDistOut.p"); if (!Opt->frefix) Opt->frefix = strdup("./GenFeatureDistOut.f"); if (!Opt->xrefix) Opt->xrefix = strdup("./GenFeatureDistOut.x"); if (!Opt->crefix) Opt->crefix = strdup("./GenFeatureDistOut.c"); if (Opt->uid[0]=='\0') UNIQ_idcode_fill(Opt->uid); if (Opt->VoxDbg > -1 && !Opt->VoxDbgOut) { char stmp[256]; sprintf(stmp,"%d.GFD.dbg", Opt->VoxDbg); Opt->VoxDbgOut = fopen(stmp,"w"); } SUMA_RETURN(Opt); }
int main( int argc , char * argv[] ) { int nim , ii , jj , kk , nx, narg, oform ; MRI_IMAGE **inim ; float *far; char *formatstr=NULL, *sel=NULL, *fname=NULL; int nonconst=0 , ncol,ncold , cc , nonfixed=0 , stack=0; intvec *ncv=NULL ; char *hline=NULL ; mainENTRY("1dcat:main"); /*-- help? --*/ if( argc < 2 || strcmp(argv[1],"-help") == 0 ){ printf( "Usage: 1dcat [options] a.1D b.1D ...\n" " where each file a.1D, b.1D, etc. is a 1D file.\n" " In the simplest form, a 1D file is an ASCII file of numbers\n" " arranged in rows and columns.\n" "\n" "1dcat takes as input one or more 1D files, and writes out a 1D file\n" "containing the side-by-side concatenation of all or a subset of the\n" "columns from the input files.\n" "\n" "* Output goes to stdout (the screen); redirect (e.g., '>') to save elsewhere.\n" "* All files MUST have the same number of rows!\n" "* Any header lines (i.e., lines that start with '#') will be lost.\n" "* For generic 1D file usage help and information, see '1dplot -help'\n" "\n" "OPTIONS:\n" "--------\n" " -nonconst: Columns that are identically constant should be omitted\n" " from the output.\n" "\n" " -nonfixed: Keep only columns that are marked as 'free' in the \n" " 3dAllineate header from '-1Dparam_save'.\n" " If there is no such header, all columns are kept.\n" "\n" " -form FORM: Format of the numbers to be output.\n" " You can also substitute -form FORM with shortcuts such \n" " as -i, -f, or -c.\n" " For help on -form's usage, and its shortcut versions\n" " see ccalc's help for the option of the same name. \n" "\n" " -stack: Stack the columns of the resultant matrix in the output.\n" "\n" " -sel SEL: Apply the same column/row selection string to all filenames\n" " on the command line.\n" " For example:\n" " 1dcat -sel '[0,2]' f1.1D f2.1D\n" " is the same as: 1dcat f1.1D'[1,2]' f2.1D'[1,2]'\n" " The advantage of the option is that it allows wildcard use\n" " in file specification so that you can run something like:\n" " 1dcat -sel '[0,2]' f?.1D\n" "\n" "EXAMPLE:\n" "--------\n" " Input file 1:\n 1\n 2\n 3\n 4\n" " Input file 2:\n 5\n 6\n 7\n 8\n" "\n" " 1dcat data1.1D data2.1D > catout.1D\n" " Output file: \n 1 5\n 2 6\n 3 7\n 4 8\n" "\n" ) ; PRINT_COMPILE_DATE ; exit(0) ; } machdep() ; /* do we have any options? */ oform = CCALC_NOT_SET; sel = NULL; stack = 0; narg = 1; while (narg < argc && argv[narg][0] == '-') { if( strncmp(argv[narg],"-nonconst",7) == 0 ){ /* 04 Dec 2010 */ nonconst++ ; narg++ ; continue ; } if( strncmp(argv[narg],"-nonfixed",7) == 0 ){ /* 06 Dec 2010 */ nonfixed++ ; narg++ ; continue ; } if( strncmp(argv[narg],"-stack",6) == 0 ){ /* 05 Sep 2013 */ stack = 1 ; narg++ ; continue ; } if (strcmp(argv[narg],"-form") == 0) { ++narg; if (narg >= argc) { fprintf (stderr, "need argument after -form "); exit (1); } if (strcmp(argv[narg],"double") == 0 ) oform = CCALC_DOUBLE; else if (strcmp(argv[narg],"nice") == 0 ) oform = CCALC_NICE; else if (strcmp(argv[narg],"int") == 0 ) oform = CCALC_INT; else if (strcmp(argv[narg],"rint") == 0 ) oform = CCALC_INT; else if (strcmp(argv[narg],"fint") == 0 ) oform = CCALC_FINT; else if (strcmp(argv[narg],"cint") == 0 ) oform = CCALC_CINT; else if (strlen(argv[narg])<=256) { oform = CCALC_CUSTOM; formatstr = argv[narg]; } else { fprintf (stderr, "Format type '%s' not supported.\n" "See -help for details.\n", argv[narg]); exit (1); } ++narg; } else if (strcmp(argv[narg],"-sel") == 0) { ++narg; if (narg >= argc) { fprintf (stderr, "need argument after -sel "); exit (1); } sel = argv[narg]; ++narg; } else if (strncmp(argv[narg],"-d",2) == 0) { oform = CCALC_DOUBLE; ++narg; } else if (strncmp(argv[narg],"-n",2) == 0) { oform = CCALC_NICE; ++narg; } else if (strncmp(argv[narg],"-i",2) == 0) { oform = CCALC_INT; ++narg; } else if (strncmp(argv[narg],"-r",2) == 0) { oform = CCALC_INT; ++narg; } else if (strncmp(argv[narg],"-f",2) == 0) { oform = CCALC_FINT; ++narg; } else if (strncmp(argv[narg],"-c",2) == 0) { oform = CCALC_CINT; ++narg; } else { /* break if option is not recognized */ ++narg; break; } } /* read input files */ nim = argc-narg ; inim = (MRI_IMAGE **) malloc( sizeof(MRI_IMAGE *) * nim ) ; ncol = 0 ; if( nonconst || nonfixed ) MAKE_intvec(ncv,1) ; for( jj=0 ; jj < nim ; jj++ ){ #if 0 /** for testing only **/ if( AFNI_yesenv("ragged") ){ MRI_IMAGE *qim ; qim = mri_read_ascii_ragged( argv[jj+narg] , 3.e+33 ) ; fprintf(stderr,"qim: nx=%d ny=%d\n",qim->nx,qim->ny) ; inim[jj] = mri_transpose(qim) ; mri_free(qim) ; } else #endif if (sel) { fname = (char *) calloc((strlen(argv[jj+narg])+strlen(sel)+1), sizeof(char)); strcat(fname, argv[jj+narg]); strcat(fname, sel); } else { fname = argv[jj+narg]; } inim[jj] = mri_read_1D( fname ) ; if( inim[jj] == NULL ) ERROR_exit("Can't read input file '%s'",fname) ; if( jj > 0 && inim[jj]->nx != inim[0]->nx ) ERROR_exit("Input file %s doesn't match first file %s in length!", fname,argv[1]) ; ncold = ncol ; ncol += inim[jj]->ny ; if( ncv != NULL ){ /* check for constant columns [04 Dec 2010] */ RESIZE_intvec(ncv,ncol) ; for( kk=0 ; kk < inim[jj]->ny ; kk++ ) ncv->ar[ncold+kk] = 1 ; far = MRI_FLOAT_PTR(inim[jj]) ; nx = inim[jj]->nx ; if( nonconst ){ for( kk=0 ; kk < inim[jj]->ny ; kk++ ){ /* loop over columns */ for( ii=1 ; ii < nx ; ii++ ){ /* loop down column */ if( far[ii+kk*nx] != far[kk*nx] ) break ; } if( ii == nx ) ncv->ar[ncold+kk] = 0 ; /* constant */ } } if( nonfixed ){ char *hl = mri_read_1D_headerlines( fname ) ; if( hl != NULL && *hl == '#' ){ char *spt = strchr(hl,'\n') ; if( spt != NULL ) spt = strchr(spt,'#') ; /* start of line 2 */ if( spt != NULL ){ NI_str_array *sar = NI_decode_string_list( spt+1 , "~" ) ; if( sar != NULL && sar->num >= inim[jj]->ny ){ for( kk=0 ; kk < inim[jj]->ny ; kk++ ){ spt = strchr(sar->str[kk],'$') ; if( spt != NULL && spt[1] == '\0' ) ncv->ar[ncold+kk] = 0 ; else { if( hline == NULL ) hline = strdup("#") ; hline = THD_zzprintf( hline , " %s" , sar->str[kk] ) ; } } } NI_delete_str_array(sar) ; } } } } /* end of computing ncv = array marking non-constant vectors */ if (sel) { free(fname); fname = NULL; } } /* end of input loop */ /* now do the output */ if( hline != NULL ) printf("%s\n",hline) ; nx = inim[0]->nx ; if (stack) { if (oform == CCALC_NOT_SET) { for( cc=jj=0 ; jj < nim ; jj++ ){ far = MRI_FLOAT_PTR(inim[jj]) ; for( kk=0 ; kk < inim[jj]->ny ; kk++,cc++ ){ for( ii=0 ; ii < nx ; ii++ ){ if( ncv == NULL || ncv->ar[cc] ) printf(" %g\n", far[ii+kk*nx] ) ; } } } } else { for( cc=jj=0 ; jj < nim ; jj++ ){ far = MRI_FLOAT_PTR(inim[jj]) ; for( kk=0 ; kk < inim[jj]->ny ; kk++,cc++ ){ for( ii=0 ; ii < nx ; ii++ ){ if( ncv == NULL || ncv->ar[cc] ) printf(" %s\n", format_value_4print(far[ii+kk*nx], oform, formatstr )); } } } } } else { if (oform == CCALC_NOT_SET) { for( ii=0 ; ii < nx ; ii++ ){ for( cc=jj=0 ; jj < nim ; jj++ ){ far = MRI_FLOAT_PTR(inim[jj]) ; for( kk=0 ; kk < inim[jj]->ny ; kk++,cc++ ){ if( ncv == NULL || ncv->ar[cc] ) printf(" %g", far[ii+kk*nx] ) ; /* printf(" %+.2f", far[ii+kk*nx] ) ;*/ } } printf("\n") ; } } else { for( ii=0 ; ii < nx ; ii++ ){ for( cc=jj=0 ; jj < nim ; jj++ ){ far = MRI_FLOAT_PTR(inim[jj]) ; for( kk=0 ; kk < inim[jj]->ny ; kk++,cc++ ){ if( ncv == NULL || ncv->ar[cc] ) printf(" %s", format_value_4print(far[ii+kk*nx], oform, formatstr )); } } printf("\n") ; } } } exit(0) ; }
floatvecvec * SYM_expand_ranges( int nlast, int nrang, SYM_irange *rang, char *str ) { floatvec *fv ; floatvecvec *fvv=NULL ; int rr , ii , ss , gg, *qlist , nvec=0 , iv ; NI_str_array *sar ; char qname[64] , *qstr , *qpt , *qls ; float fac ; ENTRY("SYM_expand_ranges") ; if( nlast < 0 ) RETURN(NULL) ; /* bad input */ /* check if have anything to scan for */ if( nrang < 1 || rang == NULL || str == NULL || *str == '\0' ) RETURN(NULL) ; /* check if input line is a comment */ for( ii=0 ; str[ii] != '\0' && isspace(str[ii]) ; ii++ ) ; /*nada*/ if( str[ii] == '\0' || /* all blank */ str[ii] == '#' || /* starts with "#" */ (str[ii] == '/' && str[ii+1] == '/') /* starts with "//" */ ) RETURN(NULL) ; fv = (floatvec *)malloc(sizeof(floatvec)) ; /* create empty output */ fv->nar = nlast+1 ; fv->ar = (float *)calloc(sizeof(float),nlast+1) ; /* break input string into separate chunks */ sar = NI_decode_string_list( str , "~" ) ; if( sar == NULL ){ fvv = (floatvecvec *)malloc(sizeof(floatvecvec)) ; fvv->nvec = 1 ; fvv->fvar = fv ; ERROR_message("empty line in -gltsym?") ; nerr++ ; RETURN(fvv) ; } /* scan each chunk */ for( ss=0 ; ss < sar->num ; ss++ ){ qstr = sar->str[ss] ; if( qstr == NULL || *qstr == '\0' ) continue ; /* bad entry? */ if( *qstr == '#' || /* comment ends line */ (*qstr == '/' && *(qstr+1) == '/') ) break ; qstr = strdup(sar->str[ss]) ; /* duplicate for surgery */ qls = strchr(qstr,'[') ; /* find and decode "[...]" subscripts */ qlist = NULL ; /* if they are present, that is */ if( qls != NULL ){ *qls = '\0' ; /* cut string off at '[' subscripts */ qls++ ; /* will scan for intlist starting here */ } qpt = strchr(qstr,'*') ; /* find and decode factor in front */ if( qpt != NULL ){ /* if it is present, that is */ char *ept ; fac = (float)strtod(qstr,&ept) ; if( fac == 0.0f && ept == qstr ){ /* bad factor interpretation? */ fac = 1.0f ; /* ==> replace with 1, and bitch about it */ WARNING_message( "-gltsym: Can't interpret '*' scale factor in '%s' -- replaced by 1", qstr) ; } if( ept != qpt ) /* 27 May 2008 */ WARNING_message( "-gltsym: '*' scale factor in '%s' not at start of string?",qstr ) ; qpt++ ; } else if( *qstr == '+' ){ /* "+" is same as "+1.0*" */ qpt = qstr+1 ; fac = 1.0 ; } else if( *qstr == '-' ){ /* "-" is same as "-1.0*" */ qpt = qstr+1 ; fac = -1.0 ; } else { /* default is "+" */ qpt = qstr ; fac = 1.0 ; } for( rr=0 ; rr < nrang ; rr++ ) /* match name in list */ if( strcmp(qpt,rang[rr].name) == 0 ) break ; if( rr == nrang ){ /* no match!? */ ERROR_message("-gltsym: can't match symbolic name '%s'\n",qpt) ; nerr++ ; free((void *)qstr) ; continue ; } /* now scan for intlist, if present */ if( qls != NULL ){ MCW_intlist_allow_negative( (rang[rr].nbot < 0) ) ; qlist = MCW_get_intlist( rang[rr].ntop+1 , qls ) ; if( qlist != NULL && *qls == '[' ){ /** [[...]] type of subscript **/ if( nvec == 0 ){ nvec = qlist[0] ; fvv = (floatvecvec *)malloc(sizeof(floatvecvec)) ; fvv->nvec = nvec ; fvv->fvar = (floatvec *)calloc(sizeof(floatvec),nvec) ; for( iv=0 ; iv < nvec ; iv++ ){ fvv->fvar[iv].nar = nlast+1 ; fvv->fvar[iv].ar = (float *)calloc(sizeof(float),nlast+1) ; } } else if( qlist[0] != nvec ){ ERROR_message("mismatch in use of -gltsym [[...]]: '%s'\n", sar->str[ss] ) ; nerr++ ;free((void *)qlist) ; free((void *)qstr) ; continue ; } for( iv=0 ; iv < nvec ; iv++ ){ gg = qlist[iv+1] - rang[rr].nbot + rang[rr].gbot ; if( gg >= 0 && gg <= nlast ) fvv->fvar[iv].ar[gg] = fac ; } free((void *)qlist) ; free((void *)qstr) ; continue ; /** skip to next one, since this was special **/ } } /* make up a fake list, if needed */ if( qlist == NULL ){ qlist = (int *)malloc(sizeof(int)*(rang[rr].ntop-rang[rr].nbot+2)) ; qlist[0] = rang[rr].ntop-rang[rr].nbot+1 ; for( ii=0 ; ii < qlist[0] ; ii++ ) qlist[ii+1] = rang[rr].nbot+ii ; } /* insert values into output list */ for( ii=0 ; ii < qlist[0] ; ii++ ){ if( qlist[ii+1] < rang[rr].nbot || qlist[ii+1] > rang[rr].ntop ){ ERROR_message("-gltsym subscript %s[%d] out of range %d..%d\n", rang[rr].name , qlist[ii+1] , rang[rr].nbot,rang[rr].ntop ) ; nerr++ ; continue ; } gg = qlist[ii+1] - rang[rr].nbot + rang[rr].gbot ; if( gg >= 0 && gg <= nlast ) fv->ar[gg] = fac ; } free((void *)qlist) ; free((void *)qstr) ; } MCW_intlist_allow_negative(0) ; NI_delete_str_array(sar); /* if had no [[...]] subscripts, only have 1 vector for output */ if( nvec == 0 ){ fvv = (floatvecvec *)malloc(sizeof(floatvecvec)) ; fvv->nvec = 1 ; fvv->fvar = fv ; } else { /* have multiple outputs */ for( iv=0 ; iv < nvec ; iv++ ){ for( gg=0 ; gg <= nlast ; gg++ ){ if( fvv->fvar[iv].ar[gg] == 0.0f ) fvv->fvar[iv].ar[gg] = fv->ar[gg] ; } } KILL_floatvec(fv) ; } RETURN(fvv) ; }
SEG_OPTS *Seg_ParseInput (SEG_OPTS *Opt, char *argv[], int argc) { static char FuncName[]={"Seg_ParseInput"}; int kar, i, ind, exists; char *outname, cview[10]; int brk = 0; ENTRY("Seg_ParseInput"); brk = 0; kar = 1; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { Opt->helpfunc(0); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); #ifdef USE_TRACING if( strncmp(argv[kar],"-trace",5) == 0 ){ DBG_trace = 1 ; brk = 1 ; } if( strncmp(argv[kar],"-TRACE",5) == 0 ){ DBG_trace = 2 ; brk = 1 ; } #endif if (!brk && (strcmp(argv[kar], "-debug") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -debug \n"); exit (1); } Opt->debug = atoi(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-talk_afni") == 0)) { Opt->ps->cs->talk_suma = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-do") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -do \n"); exit (1); } if (strchr(argv[kar], 'c')) Opt->DO_c = 1; if (strchr(argv[kar], 'f')) Opt->DO_f = 1; if (strchr(argv[kar], 'x')) Opt->DO_x = 1; if (strchr(argv[kar], 'p')) Opt->DO_p = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-L2") == 0)) { Opt->fitmeth = SEG_LSQFIT; brk = 1; } if (!brk && (strcmp(argv[kar], "-L1") == 0)) { Opt->fitmeth = SEG_L1FIT; brk = 1; } if (!brk && (strcmp(argv[kar], "-openmp") == 0)) { Opt->openmp = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-no_openmp") == 0)) { Opt->openmp = 0; brk = 1; } if (!brk && (strcmp(argv[kar], "-pweight") == 0)) { Opt->pweight = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-no_pweight") == 0)) { Opt->pweight = 0; brk = 1; } if (!brk && (strcmp(argv[kar], "-no_edge") == 0)) { Opt->edge = 0; brk = 1; } if (!brk && (strcmp(argv[kar], "-edge") == 0)) { Opt->edge = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-edge1") == 0)) { Opt->edge = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-edge2") == 0)) { Opt->edge = 2; brk = 1; } if (!brk && (strcmp(argv[kar], "-vox_debug") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need 1D vox index after -vox_debug \n"); exit (1); } if (kar+2<argc) { /* see if we have ijk */ int iii, jjj, kkk; if ( argv[kar ][0]!='-' && argv[kar+1][0]!='-' && argv[kar+2][0]!='-' && (iii = atoi(argv[kar ])) >= 0 && (jjj = atoi(argv[kar+1])) >= 0 && (kkk = atoi(argv[kar+2])) >= 0 ) { Opt->VoxDbg3[0]=iii; Opt->VoxDbg3[1]=jjj; Opt->VoxDbg3[2]=kkk; ++kar; ++kar; } } if (Opt->VoxDbg3[0] < 0) { Opt->VoxDbg = atoi(argv[kar]); } brk = 1; } if (!brk && (strcmp(argv[kar], "-vox_debug_file") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need filename after -vox_debug_file \n"); exit (1); } if (!strcmp(argv[kar],"-")) { Opt->VoxDbgOut = stdout; } else if (!strcmp(argv[kar],"+")) { Opt->VoxDbgOut = stderr; } else { Opt->VoxDbgOut = fopen(argv[kar],"w"); } brk = 1; } if (strcmp(argv[kar],"-logp") == 0 ) { Opt->logp = 1; brk = 1; } if (strcmp(argv[kar],"-p") == 0 ) { Opt->logp = 0; brk = 1; } if( strcmp(argv[kar],"-use_tmp") == 0 ){ Opt->UseTmp = 1 ; brk = 1; } if( strcmp(argv[kar],"-no_tmp") == 0 ){ Opt->UseTmp = 0 ; brk = 1; } if (!brk && (strcmp(argv[kar], "-vox_debug") == 0)) { kar ++; if (kar+2 >= argc) { fprintf (stderr, "need 3 arguments after -vox_debug \n"); exit (1); } Opt->idbg = atoi(argv[kar]); ++kar; Opt->jdbg = atoi(argv[kar]); ++kar; Opt->kdbg = atoi(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-cmask") == 0)) { kar ++; if (kar >= argc) { ERROR_exit("-cmask option requires a following argument!\n"); } Opt->cmask = EDT_calcmask( argv[kar] , &(Opt->dimcmask), 0 ) ; if( Opt->cmask == NULL ) ERROR_exit("Can't compute -cmask!\n"); brk = 1; } if (!brk && (strcmp(argv[kar], "-mask") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -mask \n"); exit (1); } Opt->mset_name = argv[kar]; brk = 1; } if( !brk && (strncmp(argv[kar],"-mrange",5) == 0) ){ if( kar+2 >= argc ) ERROR_exit("-mrange option requires 2 following arguments!\n"); Opt->mask_bot = strtod( argv[++kar] , NULL ) ; Opt->mask_top = strtod( argv[++kar] , NULL ) ; if( Opt->mask_top < Opt->mask_bot ) ERROR_exit("-mrange inputs are illegal!\n") ; brk = 1; } if (!brk && (strcmp(argv[kar], "-anat") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -anat \n"); exit (1); } Opt->aset_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-sig") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -sig \n"); exit (1); } Opt->sig_name = SUMA_copy_string(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-pset") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -pset \n"); exit (1); } Opt->this_pset_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-gold") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -gold \n"); exit (1); } Opt->gold_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-gold_bias") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -gold_bias \n"); exit (1); } Opt->gold_bias_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-pstCgALL") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -pstCgALL \n"); exit (1); } Opt->pstCgALLname = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-priCgL") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -priCgL \n"); exit (1); } Opt->priCgLname = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-priCgALL") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -priCgALL \n"); exit (1); } Opt->priCgALLname = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-wL") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -wL \n"); exit (1); } Opt->wL = atof(argv[kar]); if (Opt->wL < 0.0 || Opt->wL > 1.0) { SUMA_S_Errv("-wL must be between 0 and 1.0, have %s", argv[kar]); exit(1); } brk = 1; } if (!brk && (strcmp(argv[kar], "-priCgA") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -priCgA \n"); exit (1); } Opt->priCgAname = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-wA") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -wA \n"); exit (1); } Opt->wA = atof(argv[kar]); if (Opt->wA < 0.0 || Opt->wA > 1.0) { SUMA_S_Errv("-wA must be between 0 and 1.0, have %s", argv[kar]); exit(1); } brk = 1; } if (!brk && (strcmp(argv[kar], "-cset") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -cset \n"); exit (1); } Opt->this_cset_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-fset") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -fset \n"); exit (1); } Opt->this_fset_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-xset") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -xset \n"); exit (1); } Opt->this_xset_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-tdist") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -tdist \n"); exit (1); } Opt->ndist_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-labeltable") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -labeltable \n"); exit (1); } Opt->labeltable_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-sphere_hood") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -sphere_hood \n"); exit (1); } Opt->na = atof(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-blur_meth") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -blur_meth \n"); exit (1); } if (!strcmp(argv[kar],"BIM")) Opt->blur_meth = SEG_BIM; else if (!strncmp(argv[kar],"LS",2)) Opt->blur_meth = SEG_LSB; else if (!strcmp(argv[kar],"BNN")) Opt->blur_meth = SEG_BNN; else if (!strcmp(argv[kar],"BFT")) Opt->blur_meth = SEG_BFT; else { SUMA_S_Errv("-blur_meth %s not valid\n", argv[kar]); exit(1); } brk = 1; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -prefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->proot = argv[kar]; Opt->prefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->crefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->pgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->cgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->frefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->xrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->prefix,"%s.p", argv[kar]); sprintf(Opt->pgrefix,"%s.pg", argv[kar]); sprintf(Opt->crefix,"%s.c", argv[kar]); sprintf(Opt->cgrefix,"%s.cg", argv[kar]); sprintf(Opt->frefix,"%s.f", argv[kar]); sprintf(Opt->xrefix,"%s.x", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-pprefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -pprefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->prefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->prefix,"%s", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-fprefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -fprefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->frefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->frefix,"%s", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-cprefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -cprefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->crefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->crefix,"%s", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-cgprefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -cgprefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->cgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->cgrefix,"%s", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-pgprefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -pgprefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->pgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->pgrefix,"%s", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-xprefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -xprefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->xrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->xrefix,"%s", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-bias_classes") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -bias_classes \n"); exit (1); } Opt->bias_classes = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-group_classes") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -group_classes \n"); exit (1); } Opt->group_classes = NI_strict_decode_string_list(argv[kar] ,";"); brk = 1; } if (!brk && (strcmp(argv[kar], "-group_keys") == 0)) { NI_str_array *nstr=NULL; int ii; kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -group_keys \n"); exit (1); } if (!(nstr = NI_strict_decode_string_list(argv[kar] ,";, "))){ ERROR_exit("Bad option %s after -group_keys", argv[kar]); } Opt->group_keys = (int *)calloc(nstr->num, sizeof(int)); for (ii=0;ii<nstr->num; ++ii) Opt->group_keys[ii] = strtol(nstr->str[ii],NULL,10); NI_delete_str_array(nstr);nstr=NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-classes") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -classes \n"); exit (1); } Opt->clss = NI_strict_decode_string_list(argv[kar] ,";, "); brk = 1; } if (!brk && (strcmp(argv[kar], "-split_classes") == 0)) { NI_str_array *nstr=NULL; int ii; kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -split_classes \n"); exit (1); } nstr = NI_strict_decode_string_list(argv[kar] ,";, "); Opt->Split = (int *)calloc(nstr->num+1, sizeof(int)); for (ii=0;ii<nstr->num; ++ii) { Opt->Split[ii] = strtol(nstr->str[ii],NULL,10); if (Opt->Split[ii]<1 || Opt->Split[ii]>9) { SUMA_S_Errv("Bad split value of %d in %s\n", Opt->Split[ii], argv[kar]); exit(1); } } Opt->Split[nstr->num]=-1; /* plug */ brk = 1; } if (!brk && (strcmp(argv[kar], "-other") == 0)) { Opt->Other = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-no_other") == 0)) { Opt->Other = 0; brk = 1; } if (!brk && (strcmp(argv[kar], "-keys") == 0)) { NI_str_array *nstr=NULL; int ii; kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -keys \n"); exit (1); } if (!(nstr = NI_strict_decode_string_list(argv[kar] ,";, "))){ ERROR_exit("Bad option %s after -keys", argv[kar]); } Opt->keys = (int *)calloc(nstr->num, sizeof(int)); for (ii=0;ii<nstr->num; ++ii) Opt->keys[ii] = strtol(nstr->str[ii],NULL,10); NI_delete_str_array(nstr);nstr=NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-bias_order") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need integer after -bias_order \n"); exit (1); } Opt->bias_param = atof(argv[kar]); Opt->bias_meth = "Poly"; brk = 1; } if (!brk && (strcmp(argv[kar], "-bias_fwhm") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need integer after -bias_fwhm \n"); exit (1); } Opt->bias_param = atof(argv[kar]); Opt->bias_meth = "Wells"; brk = 1; } if (!brk && (strcmp(argv[kar], "-enhance_cset_init") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need integer after -enhance_cset_init \n"); exit (1); } Opt->N_enhance_cset_init = atoi(argv[kar]); SUMA_S_Err("Option not in use at the moment"); brk = 1; } if (!brk && (strcmp(argv[kar], "-main_N") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need integer after -main_N \n"); exit (1); } Opt->N_main = atoi(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-mixfloor") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need value between 0 and 1/(number of classes)" " after -mixfloor \n"); exit (1); } Opt->mix_frac_floor = atof(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-clust_cset_init") == 0)) { Opt->clust_cset_init = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-no_clust_cset_init") == 0)) { Opt->clust_cset_init = 0; brk = 1; } if (!brk && (strcmp(argv[kar], "-uid") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -uid \n"); exit (1); } snprintf(Opt->uid,128,"%s",argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-mixfrac") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -mixfrac \n"); exit (1); } Opt->mixopt = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-Bmrf") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need value after -Bmrf \n"); exit (1); } Opt->B = atof(argv[kar]); brk = 1; } if (!brk) { fprintf (stderr,"Option %s not understood. \n" "Try -help for usage\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = 0; kar ++; } } if (!Opt->prefix) Opt->prefix = strdup("./GenPriorsOut.p"); if (!Opt->frefix) Opt->frefix = strdup("./GenPriorsOut.f"); if (!Opt->xrefix) Opt->xrefix = strdup("./GenPriorsOut.x"); if (!Opt->crefix) Opt->crefix = strdup("./GenPriorsOut.c"); if (Opt->uid[0]=='\0') UNIQ_idcode_fill(Opt->uid); if (Opt->VoxDbg > -1 && !Opt->VoxDbgOut) { char stmp[256]; sprintf(stmp,"%d.dbg", Opt->VoxDbg); Opt->VoxDbgOut = fopen(stmp,"w"); } RETURN(Opt); }
SEG_OPTS *free_SegOpts(SEG_OPTS *Opt) { static char FuncName[]={"free_SegOpts"}; SUMA_ENTRY; if (!Opt) SUMA_RETURN(NULL); if (Opt->gold) DSET_delete(Opt->gold); Opt->gold = NULL; if (Opt->gold_bias) DSET_delete(Opt->gold_bias); Opt->gold_bias = NULL; if (Opt->aset) DSET_delete(Opt->aset); Opt->aset = NULL; if (Opt->mset) DSET_delete(Opt->mset); Opt->mset = NULL; if (Opt->pset) DSET_delete(Opt->pset); Opt->pset = NULL; if (Opt->cset) DSET_delete(Opt->cset); Opt->cset = NULL; if (Opt->fset) DSET_delete(Opt->fset); Opt->fset = NULL; if (Opt->xset) DSET_delete(Opt->xset); Opt->xset = NULL; if (Opt->gset) DSET_delete(Opt->gset); Opt->gset = NULL; if (Opt->outl) DSET_delete(Opt->outl); Opt->outl = NULL; if (Opt->sig) DSET_delete(Opt->sig); Opt->sig = NULL; if (Opt->priCgA) DSET_delete(Opt->priCgA); Opt->priCgA = NULL; if (Opt->priCgL) DSET_delete(Opt->priCgL); Opt->priCgL = NULL; if (Opt->priCgALL) DSET_delete(Opt->priCgALL); Opt->priCgALL = NULL; if (Opt->feats) NI_delete_str_array(Opt->feats);Opt->feats = NULL; if (Opt->featsfam) NI_delete_str_array(Opt->featsfam);Opt->featsfam = NULL; if (Opt->feat_exp) { if (!Opt->clss) { SUMA_S_Err("This should not happen!"); } else { SUMA_free2D((char**)Opt->feat_exp, Opt->clss->num); } Opt->feat_exp = NULL; } if (Opt->clss) NI_delete_str_array(Opt->clss );Opt->clss = NULL; if (Opt->keys) free(Opt->keys); Opt->keys = NULL; if (Opt->mixfrac) free(Opt->mixfrac);Opt->mixfrac = NULL; if (Opt->VoxDbgOut && Opt->VoxDbgOut != stdout) fclose(Opt->VoxDbgOut); Opt->VoxDbgOut = NULL; if (Opt->prefix) free(Opt->prefix);Opt->prefix = NULL; if (Opt->frefix) free(Opt->frefix);Opt->frefix = NULL; if (Opt->crefix) free(Opt->crefix);Opt->crefix = NULL; if (Opt->xrefix) free(Opt->xrefix);Opt->xrefix = NULL; if (Opt->cgrefix) free(Opt->cgrefix); Opt->cgrefix = NULL; if (Opt->pgrefix) free(Opt->pgrefix); Opt->pgrefix = NULL; if (Opt->group_classes) NI_delete_str_array(Opt->group_classes) ; Opt->group_classes = NULL; if (Opt->group_keys) free(Opt->group_keys); Opt->group_keys = NULL; if (Opt->cs) Opt->cs = SUMA_Free_Class_Stat(Opt->cs); if (Opt->Gcs) Opt->cs = SUMA_Free_Class_Stat(Opt->Gcs); if (Opt->hist) free(Opt->hist); Opt->hist=NULL; if (Opt->Split) free(Opt->Split); Opt->Split=NULL; if (Opt->samp_names) Opt->samp_names = SUMA_free_NI_str_array(Opt->samp_names); if (Opt->sig_names) Opt->sig_names = SUMA_free_NI_str_array(Opt->sig_names); if (Opt->sig_name) SUMA_free(Opt->sig_name); if (Opt->N_hspec && Opt->hspec) { int ii; for (ii=0; ii<Opt->N_hspec; ++ii) { SUMA_Free_hist(Opt->hspec[ii]); } } if (Opt->hspec) SUMA_free(Opt->hspec); Opt->hspec = NULL; Opt->N_hspec = 0; Opt->FDV = SUMA_free_dists(Opt->FDV); free(Opt); Opt = NULL; SUMA_RETURN(NULL); }