int main (int argc,char *argv[]) {/* Main */ static char FuncName[]={"ScaleToMap"}; char *IntName = NULL, *Prfx, h[9], *CmapFileName = NULL, *dbfile = NULL, *MapName=NULL; MRI_IMAGE *im = NULL; float *far=NULL; int N_V, N_Int, kar, k, ii, i, icol=-1, vcol=-1, Sgn, interpmode, k3; int Vminloc, Vmaxloc, *iV = NULL; float Vmin, Vmax, brfact; float *V = NULL, *Vsort = NULL; float IntRange[2], MaskColor[3], MaskRange[2]={0.0, 0.0}, arange; SUMA_Boolean ApplyClip, ApplyMask, setMaskCol, ApplyPercClip, Vopt; SUMA_Boolean iVopt, inopt, NoMaskCol, MapSpecified, alaAFNI, MaskZero; SUMA_Boolean brk, frf, ShowMap, ShowMapdb; SUMA_COLOR_MAP *CM; SUMA_SCALE_TO_MAP_OPT * OptScl; int MapType, freecm = 1; SUMA_COLOR_SCALED_VECT * SV; SUMA_AFNI_COLORS *SAC=NULL; SUMA_Boolean FromAFNI = NOPE; int imap, isPmap, isNmap; SUMA_Boolean LocalHead = NOPE; SUMA_STANDALONE_INIT; SUMAg_CF->isGraphical = YUP; SUMA_mainENTRY; /* this is placed down here to */ /* if (argc < 3) { SUMA_ScaleToMap_usage(); exit (1); } */ kar = 1; brfact = 1; /* the brightness factor */ MaskColor[0] = MaskColor[1] = MaskColor[2] = 0.3; ApplyClip = NOPE; ApplyPercClip = NOPE; ApplyMask = NOPE; NoMaskCol = NOPE; MaskZero = NOPE; setMaskCol = NOPE; Vopt = NOPE; iVopt = NOPE; inopt = NOPE; MapType = SUMA_CMAP_RGYBR20; brk = NOPE; MapSpecified = NOPE; CmapFileName = NULL; interpmode = SUMA_UNDEFINED_MODE; ShowMap = NOPE; alaAFNI = NOPE; /* applying the alaAFNI mapping */ frf = NOPE; arange = -1.0; /* afni range specified */ Sgn = 0; ShowMapdb = NOPE; 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) { SUMA_ScaleToMap_usage(); exit (1); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && strcmp(argv[kar], "-verb") == 0) { LocalHead = NOPE; brk = YUP; } if (!brk && strcmp(argv[kar], "-ionot") == 0) { SUMA_SL_Err("-ionot is obsolete. \n" "Use -trace option."); exit (1); SUMA_INOUT_NOTIFY_ON; brk = YUP; } if (!brk && strcmp(argv[kar], "-msk_zero") == 0) { MaskZero = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-input") == 0)) { kar ++; if (kar+2 >= argc) { fprintf (SUMA_STDERR, "need 3 arguments after -input \n"); exit (1); } IntName = argv[kar]; kar ++; icol = atoi(argv[kar]); kar ++; vcol = atoi(argv[kar]); inopt = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-apr") == 0)) { if (arange >= 0) { fprintf (SUMA_STDERR, "range has already been specified.\n"); exit (1); } kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -apr \n"); exit (1); } arange = atof(argv[kar]); if (arange < 0) { fprintf (SUMA_STDERR, "range must be positive.\n"); exit (1); } Sgn = 1; alaAFNI = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-anr") == 0)) { if (arange >= 0) { fprintf (SUMA_STDERR, "range has already been specified.\n"); exit (1); } kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -anr \n"); exit (1); } arange = atof(argv[kar]); if (arange < 0) { fprintf (SUMA_STDERR, "range must be positive.\n"); exit (1); } Sgn = -1; alaAFNI = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-v") == 0)) { fprintf (SUMA_STDERR, "\n -v option is now obsolete.\nUse -input option instead.\n"); exit (1); kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -v \n"); exit (1); } IntName = argv[kar]; Vopt = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-iv") == 0)) { fprintf (SUMA_STDERR, "\n -iv option is now obsolete.\nUse -input option instead.\n"); exit (1); kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -iv \n"); exit (1); } IntName = argv[kar]; iVopt = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-br") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -br \n"); exit (1); } brfact = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-frf") == 0)) { frf = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-showmap") == 0)) { ShowMap = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-showdb") == 0)) { ShowMapdb = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-nointerp") == 0)) { if (interpmode != SUMA_UNDEFINED_MODE) { fprintf (SUMA_STDERR, "Color interpolation mode already set.\n"); } interpmode = SUMA_NO_INTERP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-direct") == 0)) { if (interpmode != SUMA_UNDEFINED_MODE) { fprintf (SUMA_STDERR, "Color interpolation mode already set.\n"); } interpmode = SUMA_DIRECT; brk = YUP; } if (!brk && (strcmp(argv[kar], "-interp") == 0)) { if (interpmode != SUMA_UNDEFINED_MODE) { fprintf (SUMA_STDERR, "Color interpolation mode already set.\n(-nointerp, -direct and -interp are mutually exclusive.\n"); } interpmode = SUMA_INTERP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-clp") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 arguments after -clp \n"); exit (1); } ApplyClip = YUP; IntRange[0] = atof(argv[kar]); kar ++; IntRange[1] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-perc_clp") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 arguments after -perc_clp "); exit (1); } ApplyPercClip = YUP; IntRange[0] = atof(argv[kar]); kar ++; IntRange[1] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-msk") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 arguments after -msk "); exit (1); } ApplyMask = YUP; MaskRange[0] = atof(argv[kar]); kar ++; MaskRange[1] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-nomsk_col") == 0)) { NoMaskCol = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-msk_col") == 0)) { kar ++; if (kar+2 >= argc) { fprintf (SUMA_STDERR, "need 3 arguments after -msk_col "); exit (1); } setMaskCol = YUP; MaskColor[0] = atof(argv[kar]); kar ++; MaskColor[1] = atof(argv[kar]); kar ++; MaskColor[2] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-cmapfile") ==0)) { if (MapSpecified) { fprintf (SUMA_STDERR, "Color map already specified.\n-cmap and -cmapfile are mutually exclusive\n"); exit (1); } MapSpecified = YUP; kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 arguments after -cmapfile "); exit (1); } CmapFileName = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-cmapdb") ==0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 arguments after -cmapdb "); exit (1); } dbfile = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-cmap") ==0)) { if (MapSpecified) { fprintf (SUMA_STDERR, "Color map already specified.\n-cmap and -cmapfile are mutually exclusive\n"); exit (1); } MapSpecified = YUP; kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 arguments after -cmap "); exit (1); } MapName = argv[kar]; brk = YUP; } if (!brk) { fprintf (SUMA_STDERR,"Error %s: Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); exit (1); } else { brk = NOPE; kar ++; } }/* loop accross command ine options */ /* Get your colors straightened out */ if (!SUMAg_CF->scm) { SUMAg_CF->scm = SUMA_Build_Color_maps(); if (!SUMAg_CF->scm) { SUMA_SL_Err("Failed to build color maps.\n"); exit(1); } } SAC = SUMAg_CF->scm; /* are there database files to read */ if (dbfile) { SUMA_LH("Now trying to read db file"); if (SUMA_AFNI_Extract_Colors ( dbfile, SAC ) < 0) { SUMA_S_Errv("Failed to read %s colormap file.\n", dbfile); exit(1); } } FromAFNI = NOPE; /* assume colormap is not coming from SAC (the colormap database structure) */ if (CmapFileName) { /* load the color map */ CM = SUMA_Read_Color_Map_1D (CmapFileName); if (CM == NULL) { SUMA_S_Err("Could not load colormap.\n"); exit (1); } if (frf) { SUMA_LH("Flipping colormap"); SUMA_Flip_Color_Map (CM); } if (!CM->Sgn) CM->Sgn = Sgn; }else{ /* dunno what kind of map yet. Try default first */ if (MapName) { CM = SUMA_FindNamedColMap (MapName); freecm = 0; if (CM) { /* good, sign it and out you go */ CM->Sgn = Sgn; } else { SUMA_S_Err("Could not get standard colormap.\n"); exit (1); } } else { SUMA_LH("An AFNI color map "); /* a color from AFNI's maps */ FromAFNI = YUP; imap = SUMA_Find_ColorMap ( MapName, SAC->CMv, SAC->N_maps, -2); if (imap < 0) { SUMA_S_Errv("Could not find colormap %s.\n", MapName); exit (1); } CM = SAC->CMv[imap]; } } /* show the colromap on STDERR */ if (ShowMap) { fprintf (SUMA_STDERR, "%s: Colormap used:\n", FuncName); SUMA_Show_ColorMapVec (&CM, 1, NULL, 2); { SUMA_SurfaceObject *SO = NULL; float orig[3] = { SUMA_CMAP_ORIGIN }; float topright[3] = { SUMA_CMAP_TOPLEFT }; SO = SUMA_Cmap_To_SO (CM, orig, topright, 2); if (SO) SUMA_Free_Surface_Object(SO); } exit(0); } /* show all the colors and colormaps in SAC on STDERR */ if (ShowMapdb) { fprintf (SUMA_STDERR, "%s: AFNI colormaps found in db:\n", FuncName); SUMA_Show_ColorVec (SAC->Cv, SAC->N_cols, NULL); SUMA_Show_ColorMapVec (SAC->CMv, SAC->N_maps, NULL, 2); exit(0); } if (!IntName) { fprintf (SUMA_STDERR,"Error %s: No input file specified.\n", FuncName); exit(1); } /* default interpolation mode */ if (interpmode == SUMA_UNDEFINED_MODE) interpmode = SUMA_INTERP; /* check input */ if (!SUMA_filexists (IntName)) { fprintf (SUMA_STDERR,"Error %s: File %s could not be found.\n", FuncName, IntName); exit(1); } if (frf && !CmapFileName) { fprintf (SUMA_STDERR,"Error %s: -frf option is only valid with -cmapfile.\n", FuncName); exit(1); } if (ApplyPercClip && ApplyClip) { fprintf (SUMA_STDERR,"Error %s: Simultaneous use of -clp and -perc_clp. You should be punished.\n", FuncName); exit(1); } if ((ApplyPercClip || ApplyClip) && arange >= 0.0) { fprintf (SUMA_STDERR,"Error %s: Simultaneous use of -clp/-perc_clp and -apr/anr.\n Read the help.\n", FuncName); exit(1); } if (iVopt || Vopt) { fprintf (SUMA_STDERR,"Error %s: -v and -iv are obsolete.\n Use -input option instead.\n", FuncName); exit(1); } if (!inopt) { fprintf (SUMA_STDERR,"Error %s: -input option must be specified.\n", FuncName); exit(1); } im = mri_read_1D (IntName); if (!im) { SUMA_S_Err("Failed to read file"); exit (1); } if (vcol < 0) { fprintf (SUMA_STDERR,"Error %s: vcol must be > 0\n", FuncName); exit(1); } far = MRI_FLOAT_PTR(im); if (icol < 0 && icol != -1) { fprintf (SUMA_STDERR,"Error %s: icol(%d) can only have -1 for a negative value\n", FuncName, icol); exit(1); } if (icol >= im->ny || vcol >= im->ny) { fprintf (SUMA_STDERR,"Error %s: icol(%d) and vcol(%d) must be < %d\nwhich is the number of columns in %s\n", FuncName, icol, vcol, im->ny, IntName); exit(1); } if (brfact <=0 || brfact > 1) { fprintf (SUMA_STDERR,"Error %s: BrightFact must be > 0 and <= 1.\n", FuncName); exit (1); } if (MaskColor[0] < 0 || MaskColor[0] > 1 || MaskColor[1] < 0 || MaskColor[1] > 1 || MaskColor[2] < 0 || MaskColor[2] > 1) { fprintf (SUMA_STDERR,"Error %s: MaskColor values must be >=0 <=1.\n", FuncName); exit(1); } N_V = im->nx; V = (float *) SUMA_calloc (N_V, sizeof(float)); iV = (int *) SUMA_calloc (N_V, sizeof(int)); if (!V || !iV) { fprintf (SUMA_STDERR,"Error %s: Could not allocate for V or iV.\n", FuncName); exit(1); } if (icol < 0) { for (ii=0; ii < N_V; ++ii) { iV[ii] = ii; V[ii] = far[vcol*N_V+ii]; } } else { for (ii=0; ii < N_V; ++ii) { iV[ii] = (int)far[icol*N_V+ii]; V[ii] = far[vcol*N_V+ii]; } } mri_free(im); im = NULL; /* read values per node */ /* SUMA_disp_vect (V, 3); */ /* find the min/max of V */ SUMA_MIN_MAX_VEC(V, N_V, Vmin, Vmax, Vminloc, Vmaxloc) /* fprintf (SUMA_STDERR,"%s: Vmin=%f, Vmax = %f\n", FuncName, Vmin, Vmax);*/ if (arange == 0.0) { if (fabs((double)Vmin) > fabs((double)Vmax)) arange = (float)fabs((double)Vmin); else arange = (float)fabs((double)Vmax); } /* figure out the range if PercRange is used */ if (ApplyPercClip) { fprintf (SUMA_STDERR,"%s: Percentile range [%f..%f] is equivalent to ", FuncName, IntRange[0], IntRange[1]); Vsort = SUMA_PercRange (V, NULL, N_V, IntRange, IntRange, NULL); fprintf (SUMA_STDERR,"[%f..%f]\n", IntRange[0], IntRange[1]); ApplyClip = YUP; if (Vsort) SUMA_free(Vsort); else { fprintf (SUMA_STDERR,"Error %s: Error in SUMA_PercRange.\n", FuncName); exit(1); } } /* get the options for creating the scaled color mapping */ OptScl = SUMA_ScaleToMapOptInit(); if (!OptScl) { fprintf (SUMA_STDERR, "Error %s: Could not get scaling option structure.\n", FuncName); exit (1); } /* work the options a bit */ if (ApplyMask) { OptScl->ApplyMask = ApplyMask; OptScl->MaskRange[0] = MaskRange[0]; OptScl->MaskRange[1] = MaskRange[1]; OptScl->MaskColor[0] = MaskColor[0]; OptScl->MaskColor[1] = MaskColor[1]; OptScl->MaskColor[2] = MaskColor[2]; } if (ApplyClip) { OptScl->ApplyClip = YUP; OptScl->IntRange[0] = IntRange[0]; OptScl->IntRange[1] = IntRange[1]; } OptScl->interpmode = interpmode; OptScl->BrightFact = brfact; if (MaskZero) OptScl->MaskZero = YUP; /* map the values in V to the colormap */ /* allocate space for the result */ SV = SUMA_Create_ColorScaledVect(N_V, 0); if (!SV) { fprintf (SUMA_STDERR, "Error %s: Could not allocate for SV.\n", FuncName); exit(1); } /* finally ! */ if (alaAFNI) { if (LocalHead) { fprintf (SUMA_STDERR, "%s: Calling SUMA_ScaleToMap_alaAFNI\n", FuncName); fprintf (SUMA_STDERR,"%s: arange = %f\n", FuncName, arange); } if (CM->frac) { if (CM->frac[0] > 0 && CM->Sgn == -1) { SUMA_S_Err ("Color map fractions positive with -anr option"); exit(1); } if (CM->frac[0] < 0 && CM->Sgn == 1) { SUMA_S_Err ("Color map fractions negative with -apr option"); exit(1); } } if (Sgn) { if (Sgn != CM->Sgn) { SUMA_S_Warn ("Mixing positive maps (all fractions > 0) " "with -anr option\n" "or vice versa. That is allowed but know what" " you're doing.\n"); } } if (!SUMA_ScaleToMap_alaAFNI (V, N_V, arange, CM, OptScl, SV)) { fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_ScaleToMap_alaAFNI.\n", FuncName); exit(1); } } else { if (LocalHead) fprintf (SUMA_STDERR,"%s: Calling SUMA_ScaleToMap\n", FuncName); if (!SUMA_ScaleToMap (V, N_V, Vmin, Vmax, CM, OptScl, SV)) { fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_ScaleToMap.\n", FuncName); exit(1); } } /* Now write the colored vector back to disk */ if (NoMaskCol) { for (k=0; k < N_V; ++k) { k3 = 3*k; if (!SV->isMasked[k]) fprintf (SUMA_STDOUT, "%d %f %f %f\n", iV[k], SV->cV[k3 ], SV->cV[k3+1], SV->cV[k3+2]); } } else { for (k=0; k < N_V; ++k) { k3 = 3*k; fprintf (SUMA_STDOUT, "%d %f %f %f\n", iV[k], SV->cV[k3 ], SV->cV[k3+1], SV->cV[k3+2]); } } /* freeing time */ if (V) SUMA_free(V); if (iV) SUMA_free(iV); if (!FromAFNI && freecm) if (CM) SUMA_Free_ColorMap (CM); /* only free CM if it was a pointer copy from a map in SAC */ if (OptScl) SUMA_free(OptScl); if (SV) SUMA_Free_ColorScaledVect (SV); #if 0 if (SAC) SAC = SUMA_DestroyAfniColors(SAC); /* destroy SAC */ #else SAC = NULL; /* freeing is done in SUMAg_CF */ #endif SUMA_Free_CommonFields(SUMAg_CF); SUMA_RETURN (0); }
SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_SpharmReco_ParseInput(char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SpharmReco_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); Opt->iopt = 86; Opt->out_prefix = NULL; Opt->bases_prefix = NULL; Opt->unit_sphere_name = NULL; Opt->n_in_namev = 0; Opt->v0 = 0.0001; kar = 1; brk = NOPE; 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) { usage_SpharmReco(ps); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-coef") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need an prefix after -coef \n"); exit (1); } Opt->in_namev[Opt->n_in_namev++] = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-l") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need an integer after -l \n"); exit (1); } Opt->iopt = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -prefix\n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-bases_prefix") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -bases_prefix\n"); exit (1); } Opt->bases_prefix = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-bases") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -bases\n"); exit (1); } Opt->bases_prefix = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-unit_sph") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -unit_sph\n"); exit (1); } Opt->unit_sphere_name = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -debug \n"); exit (1); } Opt->debug = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-sigma") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -sigma \n"); exit (1); } Opt->v0 = atof(argv[++kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\n" "Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } SUMA_RETURN(Opt); }
/*!\** File : SUMA.c \author : Ziad Saad Date : Thu Dec 27 16:21:01 EST 2001 Purpose : Input paramters : \param \param Usage : SUMA ( ) Returns : \return \return Support : \sa OpenGL prog. Guide 3rd edition \sa varray.c from book's sample code Side effects : ***/ int main (int argc,char *argv[]) {/* Main */ static char FuncName[]={"suma"}; int kar, i; SUMA_SFname *SF_name; SUMA_Boolean brk, SurfIn; char *NameParam, *AfniHostName = NULL, *s = NULL, *pdspec=NULL, *pdsv=NULL; char *specfilename[SUMA_MAX_N_GROUPS], *VolParName[SUMA_MAX_N_GROUPS]; byte InMem[SUMA_MAX_N_GROUPS]; SUMA_SurfSpecFile *Specp[SUMA_MAX_N_GROUPS]; SUMA_Axis *EyeAxis; SUMA_EngineData *ED= NULL; DList *list = NULL; DListElmt *Element= NULL; int iv15[15], N_iv15, ispec, nspec; struct stat stbuf; float fff=0.0; int Start_niml = 0; SUMA_Boolean Domemtrace = YUP; SUMA_GENERIC_ARGV_PARSE *ps=NULL; SUMA_Boolean LocalHead = NOPE; SUMA_STANDALONE_INIT; SUMA_mainENTRY; SUMAg_CF->isGraphical = YUP; ps = SUMA_Parse_IO_Args(argc, argv, "-i;-t;-dset;-do;"); /* initialize Volume Parent and AfniHostName to nothing */ for (ispec=0; ispec < SUMA_MAX_N_GROUPS; ++ispec) { specfilename[ispec] = NULL; VolParName[ispec] = NULL; Specp[ispec] = NULL; InMem[ispec] = 0; } AfniHostName = NULL; /* Allocate space for DO structure */ SUMAg_DOv = SUMA_Alloc_DisplayObject_Struct (SUMA_MAX_DISPLAYABLE_OBJECTS); /* call the function to parse the other surface mode inputs */ ispec = 0; if (LocalHead) SUMA_Show_IO_args(ps); if (ps->i_N_surfnames || ps->t_N_surfnames || ps->N_DO) { SUMA_LH("-i and/or -t surfaces on command line!"); Specp[ispec] = SUMA_IO_args_2_spec (ps, &nspec); if (Specp[ispec]) { ++ispec; if (nspec != 1) { SUMA_S_Errv("-spec is being parsed separately here, " "expecting one spec only from SUMA_IO_args_2_spec, \n" "got %d\n", nspec); exit (1); } } else { SUMA_S_Err("Failed to load -i/-t surfaces"); exit(1); } } /* Work the options */ kar = 1; brk = NOPE; SurfIn = NOPE; Domemtrace = YUP; 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) { SUMA_usage (ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); /* return a good status on -help 12 Jul 2013 [rickr] */ } /* -list_ports list and quit */ if( strncmp(argv[kar],"-list_ports", 8) == 0) { show_ports_list(); exit(0); } /* -port_number and quit */ if( strncmp(argv[kar],"-port_number", 8) == 0) { int pp = 0; if( ++kar >= argc ) ERROR_exit("need an argument after -port_number!"); pp = get_port_named(argv[kar]); if (strcmp(argv[kar-1], "-port_number_quiet")) { fprintf(stdout, "\nPort %s: %d\n", argv[kar], pp); } else { fprintf(stdout, "%d\n", pp); } if (pp < 1) exit(1); else exit(0); } if (strcmp(argv[kar], "-visuals") == 0) { SUMA_ShowAllVisuals (); exit (0); } if (strcmp(argv[kar], "-brethren_windows") == 0) { Display *dd=NULL; Window ww; if (!(dd = XOpenDisplay(NULL))) { SUMA_S_Err("No display "); exit(1); } ww = XDefaultRootWindow(dd); SUMA_WindowsOnRootDisplay(dd, ww , 0); exit (0); } if (strcmp(argv[kar], "-version") == 0) { s = SUMA_New_Additions (0.0, 1); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-sources") == 0) { s = SUMA_sources_Info(); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-help_nido") == 0) { s = SUMA_NIDO_Info(); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-all_latest_news") == 0) { s = SUMA_New_Additions (-1.0, 0); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-help_sphinx_interactive") == 0) { FILE *fout = NULL; if( ++kar >= argc ) ERROR_exit("need a file name after -help_sphinx_interactive!"); fout = fopen(argv[kar],"w"); if (!fout) { SUMA_S_Err("Failed to open %s for writing", argv[kar]); exit(1); } SUMA_help_message(fout,SPX); fclose(fout); fout = NULL; exit (0); } if (strcmp(argv[kar], "-help_interactive") == 0) { FILE *fout = fopen("Mouse_Keyboard_Controls.txt","w"); if (!fout) { SUMA_S_Err("Failed to open Mouse_Keyboard_Controls.txt for writing"); exit(1); } SUMA_help_message(fout,TXT); fclose(fout); fout = NULL; exit (0); } if (strcmp(argv[kar], "-test_help_string_edit") == 0) { SUMA_Sphinx_String_Edit_Help(SUMA_STDOUT, 0); exit(0); } if (strcmp(argv[kar], "-test_help_string_edit_web") == 0) { SUMA_Sphinx_String_Edit_Help(SUMA_STDOUT, 1); exit(0); } if (strcmp(argv[kar], "-environment") == 0) { s = SUMA_env_list_help (0, TXT); fprintf (SUMA_STDOUT, "#SUMA ENVIRONMENT \n" "# If you do not have a ~/.sumarc file, cannot find a SUMA\n" "# environment variable that's been mentioned in documentation,\n" "# or fervently desire to update your current ~/.sumarc with \n" "# all the latest variables that SUMA uses, you should run: \n" "# \n" "# suma -update_env\n" "# \n" "# Unless you have setup SUMA environment variables outside of\n" "# your ~/.sumarc file, updating your ~/.sumarc file with \n" "# 'suma -update_env' WILL NOT ALTER changes you have already\n" "# made to the variables in your current ~/.sumarc. \n" "# For this reason consider running the update command after each \n" "# upgrade of your AFNI/SUMA binaries.\n" "***ENVIRONMENT\n" "%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-default_env") == 0) { s = SUMA_env_list_help (1, NO_FORMAT); fprintf (SUMA_STDOUT, "#SUMA DEFAULT ENVIRONMENT (user settings ignored)\n" "# see also suma -udate_env or suma -environment\n" "# \n" "***ENVIRONMENT\n" "%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-update_env") == 0) { if (system("suma -environment > ___sumarc")) { SUMA_S_Err("Failed to create env file."); exit(1); } if (SUMA_filexists("~/.sumarc")) { if (system("\\cp -f ~/.sumarc ~/.sumarc-bak")) { SUMA_S_Err("Failed to backup ~/.sumarc to ~/.sumarc-bak."); exit(1); } } if (system("\\mv ___sumarc ~/.sumarc")) { SUMA_S_Err("Failed to copy newrc (___sumarc) to ~/.sumarc"); exit(1); } SUMA_S_Note("Environment update done."); exit(0); } if (strcmp(argv[kar], "-latest_news") == 0) { s = SUMA_New_Additions (0.0, 0); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-progs") == 0) { s = SUMA_All_Programs(); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-motif_ver") == 0) { /* 9 Mar 2009 [rickr] */ show_motif_version_string(); exit (0); } if (!brk && (strcmp(argv[kar], "-iodbg") == 0)) { fprintf(SUMA_STDERR,"Error %s: Obsolete, use -trace\n", FuncName); exit (0); /* fprintf(SUMA_STDOUT, "Warning %s: SUMA running in in/out debug mode.\n", FuncName); SUMA_INOUT_NOTIFY_ON; brk = YUP; */ } SUMA_SKIP_COMMON_OPTIONS(brk, kar); #if SUMA_MEMTRACE_FLAG if (!brk && (strcmp(argv[kar], "-memdbg") == 0)) { fprintf(SUMA_STDOUT,"Error %s: -memdbg is obsolete, use -trace\n", FuncName); exit (0); fprintf( SUMA_STDOUT, "Warning %s: SUMA running in memory trace mode.\n", FuncName); SUMAg_CF->MemTrace = YUP; #ifdef USING_MCW_MALLOC #endif brk = YUP; } #endif if (!brk && (strcmp(argv[kar], "-dev") == 0)) { fprintf(SUMA_STDOUT, "Warning %s: SUMA running in developer mode, " "some options may malfunction.\n", FuncName); SUMAg_CF->Dev = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fake_cmap") == 0)) { SUMA_S_Warn("-fake_cmap is for automatic selfies of the widgets.\n" "You should not use this option for any other reason\n"); SUMAg_CF->Fake_Cmap = YUP; brk = YUP; } if (!brk && SUMAg_CF->Dev && (strcmp(argv[kar], "-truth_table") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need expression after -truth_table \n"); exit (1); } SUMA_bool_eval_truth_table(argv[kar], 0); exit(0); brk = YUP; } if (!brk && (strcmp(argv[kar], "-niml") == 0)) { Start_niml = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-noniml") == 0)) { Start_niml = -1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-vp") == 0 || strcmp(argv[kar], "-sa") == 0 || strcmp(argv[kar], "-sv") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -vp|-sa|-sv \n"); exit (1); } if (ispec < 1) { fprintf (SUMA_STDERR, "a -spec option must precede the first -sv option\n"); exit (1); } if (!specfilename[ispec-1] && !Specp[ispec-1]) { fprintf (SUMA_STDERR, "a -spec option must precede each -sv option\n"); exit (1); } VolParName[ispec-1] = argv[kar]; if (LocalHead) { fprintf(SUMA_STDOUT, "Found: %s\n", VolParName[ispec]); } brk = YUP; } if (!brk && strcmp(argv[kar], "-drive_com") == 0) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -drive_com\n"); exit (1); } SUMAg_CF->dcom = (char **)SUMA_realloc(SUMAg_CF->dcom, (SUMAg_CF->N_dcom+1)*sizeof(char *)); SUMAg_CF->dcom[SUMAg_CF->N_dcom] = SUMA_copy_string(argv[kar]); ++SUMAg_CF->N_dcom; brk = YUP; } if (!brk && strcmp(argv[kar], "-ah") == 0) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -ah\n"); exit (1); } if (strcmp(argv[kar],"localhost") != 0) { AfniHostName = argv[kar]; }else { fprintf (SUMA_STDERR, "localhost is the default for -ah\n" "No need to specify it.\n"); } /*fprintf(SUMA_STDOUT, "Found: %s\n", AfniHostName);*/ brk = YUP; } if (!brk && strcmp(argv[kar], "-spec") == 0) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -spec \n"); exit (1); } if (ispec >= SUMA_MAX_N_GROUPS) { fprintf (SUMA_STDERR, "Cannot accept more than %d spec files.\n", SUMA_MAX_N_GROUPS); exit(1); } if (SUMA_is_predefined_SO_name(argv[kar], NULL, &pdspec, &pdsv, NULL) == 3) { specfilename[ispec] = pdspec; pdspec = NULL; /* Memory leak! */ VolParName[ispec] = pdsv; pdsv = NULL; /* Memory leak! */ } else { specfilename[ispec] = argv[kar]; } if (LocalHead) { fprintf(SUMA_STDOUT, "Found: %s\n", specfilename[ispec]); } ++ispec; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { if ( !strcmp(argv[kar], "-i") || !strncmp(argv[kar], "-i_",3) ) { fprintf (SUMA_STDERR, "Error %s: Option %s not understood. \n" " Make sure parameter after -i or -i_ is the full name of a surface.\n" "%s", FuncName, argv[kar], strlen(argv[kar])==2 ? "For -i to work, SUMA needs to guess at the surface type from\n" " the filename extensions. If SUMA fails try the full -i_* option" " instead.\n" : "" ); } else { fprintf (SUMA_STDERR, "Error %s: Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); } exit (1); } else { brk = NOPE; kar ++; } }/* loop accross command ine options */ /* -ah option now checked for in ps */ if (ps->cs->afni_host_name && !AfniHostName) { AfniHostName = SUMA_copy_string(ps->cs->afni_host_name); } #if 0 SUMA_S_Note("KILL ME"); { int i,j, nl; SUMA_TextBoxSize("Hello", &i,&j,&nl,NULL); SUMA_TextBoxSize("", &i,&j,&nl,GLUT_BITMAP_8_BY_13); SUMA_TextBoxSize("O", &i,&j,&nl,GLUT_BITMAP_8_BY_13); SUMA_TextBoxSize(NULL, &i,&j,&nl,GLUT_BITMAP_8_BY_13); } SUMA_ReadNIDO("/Users/ziad/SUMA_test_dirs/DO/TextDO/sample.niml.do", NULL); exit(1); #endif /* Make surface loading pacifying */ SetLoadPacify(1); #if 0 if (ps->N_DO) { /* Have DOs on command line */ if (Specp[0]) { /* Add to Specp[0] */ if (ps->N_DO + Specp[0]->N_DO > SUMA_MAX_DO_SPEC) { SUMA_S_Warn("Too many DOs, increase static limit.."); /* ignore extras for now */ ps->N_DO = SUMA_MAX_DO_SPEC - Specp[0]->N_DO; } for (i=0; i<ps->N_DO; ++i) { strcpy(Specp[0]->DO_name[Specp[0]->N_DO], ps->DO_name[i]); Specp[0]->DO_type[Specp[0]->N_DO] = ps->DO_type[i]; ++Specp[0]->N_DO; } } else { Specp[0] } } #endif /* any Specp to be found ?*/ if (specfilename[0] == NULL && Specp[0] == NULL) { SUMA_SurfaceObject **SOv=NULL; int N_SOv = 0; fprintf (SUMA_STDERR, "\n" "%s: \n" " No input specified, loading some toy surfaces...\n" " Use '.' and ',' to cycle between them.\n" " See suma -help for assistance.\n" "\n", FuncName); /* create your own surface and put it in a spec file */ SOv = SUMA_GimmeSomeSOs(&N_SOv); Specp[ispec] = SUMA_SOGroup_2_Spec (SOv, N_SOv); SUMA_free(SOv); SOv = NULL; InMem[ispec] = 1; ++ispec; } if(!SUMA_Assign_HostName (SUMAg_CF, AfniHostName, -1)) { fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_Assign_HostName\n", FuncName); exit (1); } #ifdef SUMA_DISASTER /* a function to test Memtracing */ { int *jnk; jnk = SUMA_disaster(); SUMA_free(jnk); /* without the -trace, you'll get a warning here if jnk is corrupted */ } #endif /* create an Eye Axis DO */ EyeAxis = SUMA_Alloc_Axis ("Eye Axis", AO_type); if (EyeAxis == NULL) { SUMA_error_message (FuncName,"Error Creating Eye Axis",1); exit(1); } /* Store it into SUMAg_DOv */ if (!SUMA_AddDO( SUMAg_DOv, &SUMAg_N_DOv, (void *)EyeAxis, AO_type, SUMA_SCREEN)) { SUMA_error_message (FuncName,"Error Adding DO", 1); exit(1); } /*fprintf (SUMA_STDERR, "SUMAg_N_DOv = %d created\n", SUMAg_N_DOv); SUMA_Show_DOv(SUMAg_DOv, SUMAg_N_DOv, NULL);*/ /* Allocate space (and initialize) Surface Viewer Structure */ SUMAg_SVv = SUMA_Alloc_SurfaceViewer_Struct (SUMA_MAX_SURF_VIEWERS); /* SUMAg_N_SVv gets updated in SUMA_X_SurfaceViewer_Create and reflects not the number of elements in SUMAg_SVv which is SUMA_MAX_SURF_VIEWERS, but the number of viewers that were realized by X */ /* Check on initialization */ /*SUMA_Show_SurfaceViewer_Struct (SUMAg_cSV, stdout);*/ /* Create the Surface Viewer Window */ if (!SUMA_X_SurfaceViewer_Create ()) { fprintf(stderr,"Error in SUMA_X_SurfaceViewer_Create. Exiting\n"); return 1; } for (i=0; i<ispec; ++i) { if (!list) list = SUMA_CreateList(); ED = SUMA_InitializeEngineListData (SE_Load_Group); if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_cp, (void *)specfilename[i], SES_Suma, NULL, NOPE, SEI_Head, NULL ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_ip, (void *)Specp[i], SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } fff = (float) InMem[i]; if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_f, (void *)&fff, SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_vp, (void *)VolParName[i], SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } N_iv15 = SUMA_MAX_SURF_VIEWERS; if (N_iv15 > 15) { fprintf( SUMA_STDERR, "Error %s: trying to register more than 15 viewers!\n", FuncName); exit(1); } for (kar=0; kar<N_iv15; ++kar) iv15[kar] = kar; if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_iv15, (void *)iv15, SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_i, (void *)&N_iv15, SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } } if (ispec > 0 && !SUMA_Engine (&list)) { fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_Engine\n", FuncName); exit (1); } /* For some reason, I had to add the glLightfv line below to force the lightflipping done in SUMA_SetupSVforDOs to take place in the A viewer when first opened. I don't know why that is, especially since other controllers would show up lit correctly without this glLightfv line below. To make matters worse, the A controller's light0_position is correctly flipped. It is just that the shading is done as if the position was never flipped. Actually, without the line below, the first time you hit the F key (to manually flip the light), nothing changes, that's because the light's position is unflipped, which is supposed to show the incorrect lighting. You'll have to hit F again to have the lighting correctly flipped and the shading reflecting it.... ZSS, Aug. 05 04 */ glLightfv(GL_LIGHT0, GL_POSITION, SUMAg_SVv[0].light0_position); if (Start_niml != -1 && (Start_niml == 1|| AFNI_yesenv("SUMA_START_NIML"))) { if (!list) list = SUMA_CreateList(); SUMA_REGISTER_HEAD_COMMAND_NO_DATA( list, SE_StartListening, SES_Suma, NULL); if (!SUMA_Engine (&list)) { fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName); exit (1); } } /* load the datasets onto the first SO, if any, else hope that dset is some form of DO */ if (ps->N_dsetname>0) { SUMA_SurfaceObject *SO = SUMA_findanySOp_inDOv(SUMAg_DOv, SUMAg_N_DOv, NULL); if (!SO) { SUMA_LH("Could not find any SO, here is hoping dset is a DO"); } for (i=0; i<ps->N_dsetname; ++i) { if (!(SUMA_LoadDsetOntoSO_eng(ps->dsetname[i], SO, 1, 1, 1, NULL))) { SUMA_S_Errv("Failed to load %s onto %s\n", ps->dsetname[i], SO?SO->Label:"NULL"); } } } SUMA_FreeGenericArgParse(ps); ps = NULL; /* A Warning about no sumarc */ if (NoSumaRcFound()) { SUMA_S_Warn( "\n" " No sumarc file found. You should create one by running the following:\n" "\n" " suma -update_env\n" "\n" " I also recommend you run 'suma -update_env' whenever you update AFNI.\n" "\n" " See details for -environment and -update_env options in suma -help's output.\n" "\n"); } /*Main loop */ XtAppMainLoop(SUMAg_CF->X->App); /* Done, clean up time */ if (ispec) { int k=0; for (k=0; k<ispec; ++k) { if (!SUMA_FreeSpecFields((Specp[k]))) { SUMA_S_Err("Failed to free spec fields"); } Specp[k] = NULL; } } ispec = 0; if (!SUMA_Free_Displayable_Object_Vect (SUMAg_DOv, SUMAg_N_DOv)) SUMA_error_message(FuncName,"DO Cleanup Failed!",1); if (!SUMA_Free_SurfaceViewer_Struct_Vect (SUMAg_SVv, SUMA_MAX_SURF_VIEWERS)) SUMA_error_message(FuncName,"SUMAg_SVv Cleanup Failed!",1); if (!SUMA_Free_CommonFields(SUMAg_CF)) SUMA_error_message(FuncName,"SUMAg_CF Cleanup Failed!",1); SUMA_RETURN(0); /* ANSI C requires main to return int. */ }/* Main */
SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_SurfMatch_ParseInput( char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SurfMatch_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); Opt->s=NULL; Opt->flt1 = 1.0; Opt->b1 = 0; Opt->efrac = 0.0; kar = 1; brk = NOPE; 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) { usage_SurfMatch(ps, strlen(argv[kar])>3?1:0); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-warp") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a string after -warp \n"); exit (1); } ++kar; if (!strcmp(argv[kar],"shift_only") || !strcmp(argv[kar],"sho")) { Opt->s = SUMA_copy_string("shft"); } else if (!strcmp(argv[kar],"shift_rotate") || !strcmp(argv[kar],"sro")) { Opt->s = SUMA_copy_string("shft+rot"); } else if (!strcmp(argv[kar],"shift_rotate_scale") || !strcmp(argv[kar],"srs")) { Opt->s = SUMA_copy_string("shft+rot+scl"); } else if (!strcmp(argv[kar],"affine_general") || !strcmp(argv[kar],"aff")) { Opt->s = SUMA_copy_string("shft+rot+scl+shr"); } else { SUMA_S_Errv("Bad -warp parameter of %s\n" "Choose from sho, sro, srs, or aff\n", argv[kar]); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-city") == 0)) { Opt->b1 = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-depthlimit") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -depthlimit \n"); exit (1); } Opt->flt1 = atof(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-reduce_ref") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -reduce_ref \n"); exit (1); } Opt->efrac = atof(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -debug \n"); exit (1); } Opt->debug = atoi(argv[++kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error SurfMatch: Option %s not understood\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } if (!Opt->out_prefix) { Opt->out_prefix = SUMA_copy_string("SurfMatch.gii"); THD_force_ok_overwrite(1) ; } if (!Opt->s) { Opt->s = SUMA_copy_string("shft"); } SUMA_RETURN(Opt); }
/*! \brief parse the arguments for SurfSmooth program \param argv (char *) \param argc (int) \return Opt (SUMA_SURFCLUST_OPTIONS *) options structure. To free it, use SUMA_free(Opt->out_name); SUMA_free(Opt); */ SUMA_SURFCLUST_OPTIONS *SUMA_SurfClust_ParseInput (char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SurfClust_ParseInput"}; SUMA_SURFCLUST_OPTIONS *Opt=NULL; int kar, i, ind; char *outname; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_create_SurfClust_Opt("SurfClust"); kar = 1; outname = NULL; BuildMethod = SUMA_OFFSETS2_NO_REC; brk = NOPE; 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) { usage_SUMA_SurfClust(strlen(argv[kar]) > 3 ? 2:1); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-no_cent") == 0)) { Opt->DoCentrality = 0; brk = YUP; } if (!brk && (strcmp(argv[kar], "-cent") == 0)) { Opt->DoCentrality = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-O2") == 0)) { BuildMethod = SUMA_OFFSETS2; brk = YUP; } if (!brk && (strcmp(argv[kar], "-O2_NR") == 0)) { BuildMethod = SUMA_OFFSETS2_NO_REC; brk = YUP; } if (!brk && (strcmp(argv[kar], "-Oll") == 0)) { BuildMethod = SUMA_OFFSETS_LL; brk = YUP; } if (!brk && (strcmp(argv[kar], "-update") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -update \n"); exit (1); } Opt->update = atof(argv[kar]); if (Opt->update < 1 || Opt->update > 100) { fprintf (SUMA_STDERR, "-update needs a parameter between " "1 and 50 (I have %.1f)\n", Opt->update); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->oform = SUMA_GuessFormatFromExtension(argv[kar], NULL); if (Opt->oform == SUMA_NO_DSET_FORMAT) Opt->oform = SUMA_ASCII_NIML; Opt->out_prefix = SUMA_RemoveDsetExtension_s(argv[kar], Opt->oform); Opt->WriteFile = YUP; brk = YUP; } #if 0 if (!brk && (strcmp(argv[kar], "-spec") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -spec \n"); exit (1); } Opt->spec_file = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sv") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -sv \n"); exit (1); } Opt->sv_name = argv[kar]; brk = YUP; } if (!brk && (strncmp(argv[kar], "-surf_", 6) == 0)) { if (kar + 1>= argc) { fprintf (SUMA_STDERR, "need argument after -surf_X SURF_NAME \n"); exit (1); } ind = argv[kar][6] - 'A'; if (ind < 0 || ind >= SURFCLUST_MAX_SURF) { fprintf (SUMA_STDERR, "-surf_X SURF_NAME option is out of range.\n" "Only %d surfaces are allowed. \n" "Must start with surf_A for first surface.\n", SURFCLUST_MAX_SURF); exit (1); } kar ++; Opt->surf_names[ind] = argv[kar]; Opt->N_surf = ind+1; brk = YUP; } #endif if (!brk && (strcmp(argv[kar], "-input") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 arguments after -input \n"); exit (1); } Opt->in_name = argv[kar]; kar ++; /* no need for that one Opt->nodecol = atoi(argv[kar]); kar ++; */ Opt->labelcol = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-rmm") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -rmm \n"); exit (1); } Opt->DistLim = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-in_range") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need two arguments after -in_range \n"); exit (1); } Opt->DoThreshold = SUMA_THRESH_INSIDE_RANGE; Opt->ThreshR[0] = atof(argv[kar]); ++kar; Opt->ThreshR[1] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-ex_range") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need two arguments after -ex_range \n"); exit (1); } Opt->DoThreshold = SUMA_THRESH_OUTSIDE_RANGE; Opt->ThreshR[0] = atof(argv[kar]); ++kar; Opt->ThreshR[1] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-thresh") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -thresh \n"); exit (1); } Opt->DoThreshold = SUMA_LESS_THAN; Opt->ThreshR[0] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-athresh") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -athresh \n"); exit (1); } Opt->DoThreshold = SUMA_ABS_LESS_THAN; Opt->ThreshR[0] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-thresh_col") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -thresh_col \n"); exit (1); } Opt->tind = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-amm2") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -amm2 \n"); exit (1); } Opt->AreaLim = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-n") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -n \n"); exit (1); } Opt->NodeLim = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_roidset") == 0)) { Opt->OutROI = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prepend_node_index") == 0)) { Opt->prepend_node_index = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_clusterdset") == 0)) { Opt->OutClustDset = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_fulllist") == 0)) { Opt->FullROIList = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sort_none") == 0)) { Opt->SortMode = SUMA_SORT_CLUST_NO_SORT; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sort_n_nodes") == 0)) { Opt->SortMode = SUMA_SORT_CLUST_BY_NUMBER_NODES; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sort_area") == 0)) { Opt->SortMode = SUMA_SORT_CLUST_BY_AREA; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { SUMA_S_Errv("Option %s not understood.\n" "Try -help for usage\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* sanitorium */ if (Opt->DistLim == -1.5f) { fprintf (SUMA_STDERR, "must use option -rmm \n"); exit(1); } if (!Opt->out_prefix) { Opt->out_prefix = SUMA_RemoveDsetExtension_s(Opt->in_name, SUMA_NO_DSET_FORMAT); } if (Opt->SortMode == SUMA_SORT_CLUST_NOT_SET) { Opt->SortMode = SUMA_SORT_CLUST_BY_AREA; } if (BuildMethod == SUMA_OFFSETS2) { SUMA_S_Note("Using Offsets2"); } else if (BuildMethod == SUMA_OFFSETS_LL) { SUMA_S_Note("Using Offsets_ll"); } else if (BuildMethod == SUMA_OFFSETS2_NO_REC) { if (LocalHead) SUMA_S_Note("Using no recursion"); } else { SUMA_SL_Err("Bad BuildMethod"); exit(1); } SUMA_SurfClust_Set_Method(BuildMethod); if (Opt->FullROIList && !(Opt->OutROI || Opt->OutClustDset)) { SUMA_SL_Err("-out_fulllist must be used in conjunction " "with -out_ROIdset or -out_clusterdset"); exit(1); } SUMA_RETURN(Opt); }
SUMA_GENERIC_PROG_OPTIONS_STRUCT *SUMA_SurfToSurf_ParseInput( char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_BrainWrap_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk, accepting_out; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); kar = 1; brk = NOPE; Opt->in_1D = NULL; Opt->NodeDbg = -1; Opt->debug = 0; Opt->NearestNode = 0; Opt->NearestTriangle = 0; Opt->DistanceToMesh = 0; Opt->ProjectionOnMesh = 0; Opt->NearestNodeCoords = 0; Opt->Data = 0; Opt->in_name = NULL; Opt->out_prefix = NULL; Opt->fix_winding = 0; Opt->iopt = 0; Opt->oform = SUMA_NO_DSET_FORMAT; accepting_out = NOPE; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (!brk && accepting_out) { /* make sure you have not begun with new options */ if (*(argv[kar]) == '-') accepting_out = NOPE; } if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { usage_SurfToSurf(ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -debug \n"); exit (1); } Opt->debug = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-node_debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -node_debug \n"); exit (1); } Opt->NodeDbg = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-node_indices") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a parameter after -node_indices \n"); exit (1); } Opt->in_nodeindices = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-closest_possible") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -closest_possible \n"); exit (1); } Opt->iopt = atoi(argv[++kar]); if (Opt->iopt != 0 && Opt->iopt != 1 && Opt->iopt != 2 && Opt->iopt != 3) { SUMA_S_Errv("Must choose from 0, 1, 2, or 3 for -closest_possible." " Have %d\n", Opt->iopt); exit (1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-output_params") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need at least one parameter after output_params \n"); exit (1); } accepting_out = YUP; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestNode") == 0)) { if (Opt->NearestNode < 1) Opt->NearestNode = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestTriangleNodes") == 0)) { if (Opt->NearestNode < 3) Opt->NearestNode = 3; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestTriangle") == 0)) { if (Opt->NearestTriangle < 1) Opt->NearestTriangle = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "DistanceToSurf") == 0)) { Opt->DistanceToMesh = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "ProjectionOnSurf") == 0)) { Opt->ProjectionOnMesh = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestNodeCoords") == 0)) { Opt->NearestNodeCoords = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "Data") == 0)) { if (Opt->Data < 0) { fprintf (SUMA_STDERR, "Cannot mix parameter Data with -dset option \n"); exit (1); } Opt->Data = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-data") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -data \n"); exit (1); } ++kar; if (strcmp(argv[kar],"_XYZ_") == 0) { /* default Opt->in_name = NULL*/ if (Opt->in_name) { SUMA_SL_Err("Input already specified." "Do not mix -data and -dset"); exit (1); } } else { Opt->in_name = SUMA_copy_string(argv[kar]); } Opt->Data = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-dset") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -dset \n"); exit (1); } ++kar; if (strcmp(argv[kar],"_XYZ_") == 0 || Opt->Data > 0) { /* default Opt->in_name = NULL*/ if (Opt->in_name || Opt->Data > 0) { SUMA_SL_Err("Input already specified." "Do not mix -data and -dset." "Or use parameter DATA with -dset"); exit (1); } } else { Opt->in_name = SUMA_copy_string(argv[kar]); } Opt->Data = -1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_RemoveDsetExtension_eng(argv[++kar], &(Opt->oform)); brk = YUP; } if (!brk && (strcmp(argv[kar], "-mapfile") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -mapfile \n"); exit (1); } Opt->s = SUMA_Extension(argv[++kar],".niml.M2M", NOPE); if (!SUMA_filexists(Opt->s)) { SUMA_S_Errv("File %s not found\n" , Opt->s); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-proj_dir") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -proj_dir \n"); exit (1); } Opt->in_1D = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-make_consistent") == 0)) { Opt->fix_winding = 1; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\n" "Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* set default for NearestNode if nothing has been set */ if (Opt->NearestNode < 1) Opt->NearestNode = 3; if (!Opt->out_prefix) Opt->out_prefix = SUMA_copy_string("SurfToSurf"); if (Opt->in_1D && Opt->s) { SUMA_S_Err("Cannot use -proj_dir along with -mapfile"); exit(1); } SUMA_RETURN(Opt); }
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[]) {/* Main */ static char FuncName[]={"MakeColorMap"}; char *fscolutname = NULL, *FidName = NULL, *Prfx = NULL, h[9], *StdType=NULL, *dbfile=NULL, *MapName=NULL; int Ncols = 0, N_Fid = 0, kar, i, ifact, *Nind = NULL, imap = -1, MapSpecified = 0; int fsbl0, fsbl1, showfscolut, exists=0; float **Fid=NULL, **M=NULL; MRI_IMAGE *im = NULL; float *far=NULL; int AfniHex=0, freesm; int suc, idISi=0; char stmp[256], *s=NULL, *ooo=NULL, *sdset_prefix; SUMA_PARSED_NAME *sname=NULL; NI_group *ngr=NULL; SUMA_Boolean brk, SkipLast, PosMap, Usage1, Usage2, Usage3, Usage4, flipud, fscolut, LocalHead = NOPE; SUMA_COLOR_MAP *SM=NULL; SUMA_DSET_FORMAT iform; SUMA_DSET *sdset=NULL; SUMA_STANDALONE_INIT; SUMA_mainENTRY; if (argc < 2) { SUMA_MakeColorMap_usage(); exit (0); } kar = 1; freesm = 1; fscolutname = NULL; fsbl0 = -1; fsbl1 = -1; brk = NOPE; SkipLast = NOPE; AfniHex = 0; PosMap = NOPE; Usage1 = NOPE; Usage2 = NOPE; Usage3 = NOPE; Usage4 = NOPE; flipud = NOPE; fscolut = NOPE; showfscolut = 0; MapSpecified = NOPE; idISi=0; iform = SUMA_NO_DSET_FORMAT; sdset_prefix=NULL; while (kar < argc) { /* loop accross command ine options */ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { SUMA_MakeColorMap_usage(); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-v") == 0)) { LocalHead = NOPE; brk = YUP; } if (!brk && (strcmp(argv[kar], "-flipud") == 0)) { flipud = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-f") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -f "); exit (1); } FidName = argv[kar]; Usage1 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fscolutfile") == 0)) { Usage4=YUP; kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 argument after -fscolutfile "); exit (1); } fscolutname = argv[kar]; if (fsbl0 < 0) { fsbl0 = 0; fsbl1 = 255; } brk = YUP; } if (!brk && (strcmp(argv[kar], "-usercolutfile") == 0)) { Usage4=YUP; kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 argument after -fscolutfile "); exit (1); } fscolutname = argv[kar]; if (fsbl0 < 0) { fsbl0 = 0; fsbl1 = -1; } idISi=1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fscolut") == 0)) { fscolut = YUP; Usage4=YUP; kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 arguments after -fscolut "); exit (1); } fsbl0 = atoi(argv[kar]); ++kar; fsbl1 = atoi(argv[kar]); if (fsbl0 > fsbl1 || fsbl0 < -1 || fsbl1 > 10000) { SUMA_S_Errv("-fscolut values of %d and %d either\n" "do not make sense or exceed range 0 to 10000\n", fsbl0, fsbl1); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-show_fscolut") == 0)) { showfscolut = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fn") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -fn "); exit (1); } FidName = argv[kar]; Usage2 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-nc") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -nc "); exit (1); } Ncols = atoi(argv[kar]); Usage1 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-ah") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -ah "); exit (1); } Prfx = argv[kar]; AfniHex = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-ahc") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -ahc "); exit (1); } Prfx = argv[kar]; AfniHex = 2; brk = YUP; } if (!brk && (strcmp(argv[kar], "-suma_cmap") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -suma_cmap"); exit (1); } Prfx = argv[kar]; AfniHex = 3; brk = YUP; } if (!brk && (strcmp(argv[kar], "-std") == 0)) { kar ++; if (MapSpecified) { SUMA_S_Err( "Color map already specified.\n" "-cmap and -std are mutually exclusive\n"); exit (1); } if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -std "); exit (1); } MapSpecified = YUP; StdType = argv[kar]; Usage3 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-cmapdb") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -cmapdb "); exit (1); } SUMAg_CF->isGraphical = YUP; /* WILL NEED X DISPLAY TO RESOLVE COLOR NAMES */ dbfile = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-cmap") ==0)) { if (MapSpecified) { SUMA_S_Err( "Color map already specified.\n" "-cmap and -std are mutually exclusive\n"); exit (1); } MapSpecified = YUP; kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 arguments after -cmap "); exit (1); } Usage3 = YUP; MapName = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sl") == 0)) { SkipLast = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-pos") == 0)) { /* obsolete */ PosMap = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sdset") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need surface dataset after -sdset \n"); exit (1); } iform = SUMA_NO_DSET_FORMAT; if (!(sdset = SUMA_LoadDset_s (argv[kar], &iform, 0))) { SUMA_S_Err("Failed to load surface dset"); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-sdset_prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need prefix dataset after -sdset_prefix \n"); exit (1); } sdset_prefix = argv[kar]; brk = YUP; } if (!brk) { SUMA_S_Errv("Option %s not understood. Try -help for usage\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } }/* loop accross command ine options */ /* check input */ if ( (Usage1 && (Usage2 || Usage3 || Usage4)) || (Usage2 && (Usage1 || Usage3 || Usage4)) || (Usage3 && (Usage1 || Usage2 || Usage4)) || (Usage4 && (Usage1 || Usage2 || Usage3)) ) { SUMA_S_Err("Mixing options from multiple usage modes.\n"); exit(1); } if (!Usage1 && !Usage2 && !Usage3 && !Usage4) { SUMA_S_Err("One of these options must be used:\n" "-f, -fn, -std, or -fscolut.\n"); exit(1); } /* are there database files to read */ if (dbfile) { SUMA_LH("Now trying to read db file"); if (!SUMAg_CF->scm) { SUMAg_CF->scm = SUMA_Build_Color_maps(); if (!SUMAg_CF->scm) { SUMA_SL_Err("Failed to build color maps.\n"); exit(1); } } if (SUMA_AFNI_Extract_Colors ( dbfile, SUMAg_CF->scm ) < 0) { SUMA_S_Errv("Failed to read %s colormap file.\n", dbfile); exit(1); } } if (Usage1 || Usage2) { if (!SUMA_filexists (FidName)) { SUMA_S_Errv("File %s could not be found.\n", FidName); exit(1); } /* read the fiducials file */ im = mri_read_1D (FidName); if (!im) { SUMA_S_Err("Failed to read file"); exit(1); } far = MRI_FLOAT_PTR(im); N_Fid = im->nx * im->ny; } if (PosMap) { fprintf (SUMA_STDERR,"\nWarning %s: -pos option is obsolete.\n", FuncName); } /* allocate for fiducials */ if (Usage1) { if (N_Fid % 3) { fprintf (SUMA_STDERR, "Error %s: Not all rows in %s appear to have RGB triplets.\n", FuncName, FidName); exit (1); } Fid = (float **) SUMA_allocate2D (N_Fid / 3, 3, sizeof(float)); if (Fid == NULL) { fprintf (SUMA_STDERR, "Error %s: Could not allocate for Fid.\n", FuncName); exit(1); } for (i=0; i < im->nx; ++i) { Fid[i][0] = far[i]; Fid[i][1] = far[i+im->nx]; Fid[i][2] = far[i+2*im->nx]; } mri_free(im); im = NULL; /* now create the color map */ SM = SUMA_MakeColorMap (Fid, N_Fid/3, 0, Ncols, SkipLast, FuncName); if (SM == NULL) { fprintf (SUMA_STDERR, "Error %s: Error in SUMA_MakeColorMap.\n", FuncName); exit(1); } } if (Usage2) { /* second usage */ if (N_Fid % 4) { fprintf (SUMA_STDERR, "Error %s: Not all rows in %s appear to have " "RGB N quadruplets.\n", FuncName, FidName); exit (1); } Fid = (float **) SUMA_allocate2D (N_Fid / 4, 3, sizeof(float)); Nind = (int *) SUMA_calloc (N_Fid/4, sizeof(int)); if (Fid == NULL || !Nind) { fprintf (SUMA_STDERR, "Error %s: Could not allocate for Fid or Nind.\n", FuncName); exit(1); } for (i=0; i < im->nx; ++i) { Fid[i][0] = far[i]; Fid[i][1] = far[i+im->nx]; Fid[i][2] = far[i+2*im->nx]; Nind[i] = (int)far[i+3*im->nx]; } mri_free(im); im = NULL; /* now create the color map */ SM = SUMA_MakeColorMap_v2 (Fid, N_Fid/4, 0, Nind, SkipLast, FuncName); if (SM == NULL) { fprintf (SUMA_STDERR, "Error %s: Error in SUMA_MakeColorMap.\n", FuncName); exit(1); } Ncols = SM->N_M[0]; } if (Usage3) { /* third usage */ if (!MapName) { SM = SUMA_FindNamedColMap (StdType); freesm = 0; if (SM == NULL) { fprintf (SUMA_STDERR, "Error %s: Error in SUMA_MakeColorMap.\n", FuncName); exit(1); } Ncols = SM->N_M[0]; } else { imap = SUMA_Find_ColorMap ( MapName, SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps, -2); if (imap < 0) { fprintf (SUMA_STDERR, "Error %s: Could not find colormap %s.\n", FuncName, MapName); exit (1); } SM = SUMAg_CF->scm->CMv[imap]; Ncols = SM->N_M[0]; } } if (Usage4) { /* 4th usage */ if (!(SM = SUMA_FScolutToColorMap(fscolutname, fsbl0, fsbl1, showfscolut, idISi))) { SUMA_S_Err("Failed to get FreeSurfer colormap."); exit(1); } Ncols = SM->N_M[0]; } if (flipud) { SUMA_Flip_Color_Map (SM); } M = SM->M; if (AfniHex && Ncols > 20) { if (!Usage4) { SUMA_S_Note("Writing colormap in colorscale format.\n"); } } if (!AfniHex) { SUMA_disp_mat (M, Ncols, 3, 1); /*SUMA_Show_ColorMapVec (&SM, 1, NULL, 2);*/ } else { if (Usage4 || Ncols > 20) { if (AfniHex == 1) { fprintf (stdout, "%s \n", Prfx); for (i=0; i < Ncols; ++i) { /* Now create the hex form */ r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][0]*255)), 1, 0); fprintf (stdout, "#%s", h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][1]*255)), 1, 0); fprintf (stdout, "%s", h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][2]*255)), 1, 0); fprintf (stdout, "%s \n", h); } fprintf (stdout, "\n") ; } else if (AfniHex == 2){ /* to go in the C code (see pbardef.h and pbar.c)*/ char *p2 = SUMA_copy_string(Prfx); SUMA_TO_UPPER(p2); fprintf (stdout, "static char %s[] = {\n \"%s \"\n \"", p2, Prfx); SUMA_free(p2); p2 = NULL; for (i=0; i < Ncols; ++i) { if (i) { if (!(i % 4)) { fprintf (stdout, " \"\n \""); } else { fprintf (stdout, " "); } } /* Now create the hex form */ r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][0]*255)), 1, 0); fprintf (stdout, "#%s", h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][1]*255)), 1, 0); fprintf (stdout, "%s", h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][2]*255)), 1, 0); fprintf (stdout, "%s", h); } fprintf (stdout, " \"\n};\n") ; } else if (AfniHex == 3){ SUMA_LHv("Now turn %s to niml\n", SM->Name); sname = SUMA_ParseFname(Prfx, NULL); snprintf(stmp, 128*sizeof(char), "file:%s.niml.cmap", sname->FileName_NoExt); if (SM->Name) SUMA_free(SM->Name); SM->Name = SUMA_copy_string(sname->FileName_NoExt); ngr = SUMA_CmapToNICmap(SM); NEL_WRITE_TX(ngr, stmp, suc); if (!suc) { SUMA_S_Errv("Failed to write %s\n", stmp); } SUMA_Free_Parsed_Name(sname); sname = NULL; } else { SUMA_S_Err("AfniHex should be 0, 1, or 2\n"); exit(1); } } else { fprintf (stdout, "\n***COLORS\n"); for (i=0; i < Ncols; ++i) { /* Now create the hex form */ r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][0]*255)), 1, 0); if (i<10) fprintf (stdout, "%s_0%d = #%s", Prfx, i, h); else fprintf (stdout, "%s_%d = #%s", Prfx, i, h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][1]*255)), 1, 0); fprintf (stdout, "%s", h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][2]*255)), 1, 0); fprintf (stdout, "%s\n", h); } /* color map */ fprintf (stdout, "\n***PALETTES %s [%d]\n//1 to -1 range\n", Prfx, Ncols); ifact = 2; for (i=0; i < Ncols; ++i) { fprintf (stdout, "%f -> ", 1.0 - (float)(ifact*i)/Ncols); if (i<10) fprintf (stdout, "%s_0%d\n", Prfx, i); else fprintf (stdout, "%s_%d\n", Prfx, i); } fprintf (stdout, "\n***PALETTES %s [%d+]\n//1 to 0 range\n", Prfx, Ncols); ifact = 1; for (i=0; i < Ncols; ++i) { fprintf (stdout, "%f -> ", 1.0 - (float)(ifact*i)/Ncols); if (i<10) fprintf (stdout, "%s_0%d\n", Prfx, i); else fprintf (stdout, "%s_%d\n", Prfx, i); } } } /* free allocated space */ if (Usage1) { if (Fid) SUMA_free2D((char **)Fid, N_Fid / 3); } else { if (Fid) SUMA_free2D((char **)Fid, N_Fid / 4); if (Nind) SUMA_free(Nind); } /* add colormap to a surface dset ? */ if (sdset) { SUMA_DSET *idset; if (!SUMA_is_AllConsistentCastType_dset(sdset, SUMA_int)) { idset = SUMA_CoercedCopyofDset(sdset, SUMA_int, NULL); } else { idset = sdset; } if (!(SUMA_dset_to_Label_dset_cmap(idset, SM))) { SUMA_S_Err("Failed to make change"); exit(1); } s = SUMA_OutputDsetFileStatus( sdset_prefix?sdset_prefix:SDSET_FILENAME(sdset), NULL, &iform, NULL, ".lbl", &exists); SUMA_AddNgrHist(sdset->ngr, FuncName, argc, argv); ooo = SUMA_WriteDset_s(s, idset, iform, THD_ok_overwrite(), 0); SUMA_free(ooo); ooo=NULL; SUMA_free(s); s = NULL; if (idset != sdset) SUMA_FreeDset(idset); SUMA_FreeDset(sdset); sdset=NULL; } if (SM && !MapName && freesm) SUMA_Free_ColorMap(SM); if (!SUMA_Free_CommonFields(SUMAg_CF)) { SUMA_SL_Err("Failed to free commonfields."); } SUMA_RETURN (0); }
/*! \brief parse the arguments for SurfSmooth program \param argv (char *) \param argc (int) \return Opt (SUMA_GETPATCH_OPTIONS *) options structure. To free it, use SUMA_free(Opt->out_prefix); SUMA_free(Opt); */ SUMA_GETPATCH_OPTIONS *SUMA_GetPatch_ParseInput (char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_GetPatch_ParseInput"}; SUMA_GETPATCH_OPTIONS *Opt=NULL; int kar, i, ind; char *outprefix; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = (SUMA_GETPATCH_OPTIONS *)SUMA_malloc(sizeof(SUMA_GETPATCH_OPTIONS)); kar = 1; Opt->iType = SUMA_FT_NOT_SPECIFIED; Opt->out_prefix = NULL; Opt->out_volprefix = NULL; Opt->in_name = NULL; Opt->minhits = 2; Opt->labelcol = -1; Opt->nodecol = -1; Opt->thislabel = -1; Opt->DoVol = 0; Opt->VolOnly = 0; Opt->coordgain = 0.0; Opt->Do_p2s = NOPE; Opt->FixBowTie = -1; Opt->adjust_contour = -1; Opt->oType = SUMA_FT_NOT_SPECIFIED; Opt->verb = 1; Opt->flip = 0; brk = NOPE; 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) { usage_SUMA_getPatch(ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-hits") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -hits \n"); exit (1); } Opt->minhits = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-coord_gain") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -coord_gain \n"); exit (1); } Opt->coordgain = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-masklabel") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -masklabel \n"); exit (1); } Opt->thislabel = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-patch2surf") == 0)) { Opt->Do_p2s = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-vol") == 0)) { Opt->DoVol = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-flip_orientation") == 0)) { Opt->flip = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-vol_only") == 0)) { Opt->DoVol = 1; Opt->VolOnly = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-adjust_contour") == 0)) { Opt->adjust_contour = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-do-not-adjust_contour") == 0)) { Opt->adjust_contour = 0; brk = YUP; } if (!brk && (strcmp(argv[kar], "-check_bowtie") == 0)) { Opt->FixBowTie = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fix_bowtie") == 0)) { Opt->FixBowTie = 2; brk = YUP; } if (!brk && (strcmp(argv[kar], "-ok_bowtie") == 0)) { Opt->FixBowTie = 0; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-verb") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -verb \n"); exit (1); } Opt->verb = atoi(argv[kar]); if (Opt->verb < 0 || Opt->verb > 10) { SUMA_S_Errv("Something fishy with -verb value of %s\n" "Need integer from 0 to 2\n", argv[kar]); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-stiched_surface") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -stiched_surface \n"); exit (1); } Opt->out_volprefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_type") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -out_type \n"); exit (1); } Opt->oType = SUMA_guess_surftype_argv(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-input") == 0)) { kar ++; if (kar+2 >= argc) { fprintf (SUMA_STDERR, "need 3 arguments after -input \n"); exit (1); } Opt->in_name = argv[kar]; kar ++; Opt->nodecol = atoi(argv[kar]); kar ++; Opt->labelcol = atoi(argv[kar]); brk = YUP; } #if 0 if (!brk && (strcmp(argv[kar], "-spec") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -spec \n"); exit (1); } Opt->spec_file = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sv") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -sv \n"); exit (1); } Opt->sv_name = argv[kar]; brk = YUP; } if (!brk && (strncmp(argv[kar], "-surf_", 6) == 0)) { if (kar + 1>= argc) { fprintf (SUMA_STDERR, "need argument after -surf_X SURF_NAME \n"); exit (1); } ind = argv[kar][6] - 'A'; if (ind < 0 || ind >= SURFPATCH_MAX_SURF) { fprintf (SUMA_STDERR, "-surf_X SURF_NAME option is out of range.\n"); exit (1); } kar ++; Opt->surf_names[ind] = argv[kar]; Opt->N_surf = ind+1; brk = YUP; } #endif if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\nOption %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* sanity checks */ if (Opt->FixBowTie < 0) { if (Opt->DoVol) Opt->FixBowTie = 1; /* important to check in this case */ else Opt->FixBowTie = 0; } if (Opt->adjust_contour < 0) { if (Opt->DoVol) Opt->adjust_contour = 0; else Opt->adjust_contour = 0; } if (!Opt->out_prefix) Opt->out_prefix = SUMA_copy_string("SurfPatch"); if (Opt->thislabel >= 0 && Opt->labelcol < 0) { SUMA_SL_Err("Cannot use -masklabel without specifying " "ilabel in -input option"); exit(1); } if (Opt->minhits < 1 || Opt->minhits > 3) { SUMA_SL_Err("minhits must be > 0 and < 3"); exit(1); } if (!Opt->in_name) { SUMA_SL_Err("No input specified."); exit(1); } SUMA_RETURN (Opt); }
/*! \brief parse the arguments for SurfQual program \param argv (char *) \param argc (int) \return Opt (SUMA_SURFQUAL_OPTIONS *) options structure. To free it, use SUMA_free(Opt->out_prefix); SUMA_free(Opt); */ SUMA_SURFQUAL_OPTIONS *SUMA_SurfQual_ParseInput (char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]= {"SUMA_SurfQual_ParseInput"}; SUMA_SURFQUAL_OPTIONS *Opt=NULL; int kar, i, ind; char *outprefix; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = (SUMA_SURFQUAL_OPTIONS *)SUMA_malloc(sizeof(SUMA_SURFQUAL_OPTIONS)); kar = 1; Opt->out_prefix = NULL; Opt->surftype = NULL; Opt->self_intersect = 0; Opt->DoSum = 0; brk = NOPE; 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) { usage_SUMA_SurfQual(ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); } /* skip the options parsed in SUMA_ParseInput_basics_s */ SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-sphere") == 0)) { if (Opt->surftype) { SUMA_S_Err( "Surface type already specified.\n" "Only one type allowed."); exit(1); } Opt->surftype = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-self_intersect") == 0)) { Opt->self_intersect = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-summary") == 0)) { Opt->DoSum = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\nOption %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } #if 0 if (Spec->N_Surfs < 1) { SUMA_SL_Err("No surface specified."); exit(1); } #endif SUMA_RETURN (Opt); }
/*! \brief parse the arguments for SurfSmooth program \param argv (char *) \param argc (int) \return Opt (SUMA_GENERIC_PROG_OPTIONS_STRUCT *) options structure. To free it, use SUMA_free(Opt->out_name); SUMA_free(Opt); */ SUMA_GENERIC_PROG_OPTIONS_STRUCT *SUMA_ConvexHull_ParseInput (char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_ConvexHull_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar, i, ind; char *outname; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = (SUMA_GENERIC_PROG_OPTIONS_STRUCT *)SUMA_malloc(sizeof(SUMA_GENERIC_PROG_OPTIONS_STRUCT)); kar = 1; Opt->spec_file = NULL; Opt->out_prefix = NULL; Opt->sv_name = NULL; Opt->N_surf = -1; Opt->in_name = NULL; Opt->cmask = NULL; Opt->MaskMode = SUMA_ISO_UNDEFINED; for (i=0; i<SUMA_GENERIC_PROG_MAX_SURF; ++i) { Opt->surf_names[i] = NULL; } outname = NULL; Opt->in_vol = NULL; Opt->nvox = -1; Opt->ninmask = -1; Opt->mcdatav = NULL; Opt->debug = 0; Opt->v0 = 0.0; Opt->v1 = -1.0; Opt->fvec = NULL; Opt->SurfFileType = SUMA_PLY; Opt->SurfFileFormat = SUMA_ASCII; Opt->xform = SUMA_ISO_XFORM_MASK; Opt->obj_type = -1; Opt->obj_type_res = -1; Opt->XYZ = NULL; Opt->in_1D = NULL; Opt->N_XYZ = 0; Opt->s = SUMA_copy_string("convex_hull"); Opt->geom = 1; Opt->corder = 0; Opt->unif = 0; Opt->UseThisBrain = NULL; brk = NOPE; 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) { usage_SUMA_ConvexHull(ps); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-xform") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -xform \n"); exit (1); } if (!strcmp(argv[kar], "mask")) { Opt->xform = SUMA_ISO_XFORM_MASK; } else if (!strcmp(argv[kar], "none")) { Opt->xform = SUMA_ISO_XFORM_NONE; } else if (!strcmp(argv[kar], "shift")) { Opt->xform = SUMA_ISO_XFORM_SHIFT; }else { fprintf (SUMA_STDERR, "%s is a bad parameter for -xform option. \n", argv[kar]); exit (1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-input_1D") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -input_1D \n"); exit (1); } Opt->in_1D = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-these_coords") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -these_coords \n"); exit (1); } Opt->UseThisBrain = argv[kar]; Opt->unif = 2; brk = YUP; } if (!brk && (strcmp(argv[kar], "-q_opt") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need option after -q_opt \n"); exit (1); } if (!strcmp(argv[kar],"triangulate_xy")) { Opt->geom = 2; } else if (!strcmp(argv[kar],"convex_hull")) { Opt->geom = 1; } else { SUMA_S_Errv("Bad value of %s for -q_opt", argv[kar]); exit(1); } Opt->s = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-proj_xy") == 0)) { Opt->corder = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-orig_coord") == 0)) { Opt->unif = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-debug") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -debug \n"); exit (1); } Opt->debug = atoi(argv[kar]); if (Opt->debug > 2) { LocalHead = YUP; } brk = YUP; } if (!brk && (strcmp(argv[kar], "-isocmask") == 0)) { if (Opt->MaskMode != SUMA_ISO_UNDEFINED) { fprintf (SUMA_STDERR, "only one masking mode (-iso*) allowed.\n"); } kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -isocmask \n"); exit (1); } Opt->cmask = argv[kar]; Opt->MaskMode = SUMA_ISO_CMASK; brk = YUP; } if (!brk && (strcmp(argv[kar], "-isoval") == 0)) { if (Opt->MaskMode != SUMA_ISO_UNDEFINED) { fprintf (SUMA_STDERR, "only one masking mode (-iso*) allowed.\n"); } kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -isoval \n"); exit (1); } Opt->v0 = atof(argv[kar]); Opt->MaskMode = SUMA_ISO_VAL; brk = YUP; } if (!brk && (strcmp(argv[kar], "-isorange") == 0)) { if (Opt->MaskMode != SUMA_ISO_UNDEFINED) { fprintf (SUMA_STDERR, "only one masking mode (-iso*) allowed.\n"); } kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 arguments after -isorange \n"); exit (1); } Opt->v0 = atof(argv[kar]);kar ++; Opt->v1 = atof(argv[kar]); Opt->MaskMode = SUMA_ISO_RANGE; if (Opt->v1 < Opt->v0) { fprintf (SUMA_STDERR, "range values wrong. Must have %f <= %f \n", Opt->v0, Opt->v1); exit (1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-input") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -input \n"); exit (1); } Opt->in_name = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\n" "Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* transfer some options to Opt from ps. Clunky because this is retrofitting */ if (ps->o_N_surfnames) { Opt->out_prefix = SUMA_copy_string(ps->o_surfnames[0]); Opt->SurfFileType = ps->o_FT[0]; Opt->SurfFileFormat = ps->o_FF[0]; } if (ps->i_N_surfnames) { if (Opt->in_name || Opt->in_1D) { SUMA_S_Err( "Options -i_TYPE, -input and -input_1D" " are mutually exclusive."); exit(1); } } if (Opt->in_name) { if (ps->i_N_surfnames !=0 || Opt->in_1D) { fprintf (SUMA_STDERR,"Error %s:\nOptions -i_TYPE, -input and -input_1D are mutually exclusive.\n", FuncName); exit(1); } } if (Opt->in_1D) { if (ps->i_N_surfnames !=0 || Opt->in_name) { fprintf (SUMA_STDERR,"Error %s:\nOptions -i_TYPE, -input and -input_1D are mutually exclusive.\n", FuncName); exit(1); } } if (Opt->in_name && Opt->obj_type >= 0) { fprintf (SUMA_STDERR,"Error %s:\nOptions -input and -shape are mutually exclusive.\n", FuncName); exit(1); } if ((!Opt->in_name && Opt->obj_type < 0) && (!Opt->in_1D && !ps->i_N_surfnames)) { fprintf (SUMA_STDERR,"Error %s:\nEither -input or -input_1D or -i_TYPE options must be used.\n", FuncName); exit(1); } if (Opt->in_1D || ps->i_N_surfnames) { if (Opt->MaskMode != SUMA_ISO_UNDEFINED) { fprintf (SUMA_STDERR,"Error %s:\nCannot use -iso* options with either -input_1D or -i_TYPE options.\n", FuncName); exit(1); } if (Opt->xform != SUMA_ISO_XFORM_MASK) { fprintf (SUMA_STDERR,"Error %s:\nCannot use -xform option with either -input_1D or -i_TYPE options.\n", FuncName); exit(1); } } if (!Opt->out_prefix) Opt->out_prefix = SUMA_copy_string("convexhull_out"); if (Opt->xform == SUMA_ISO_XFORM_NONE) { if (Opt->v0 != 0) { fprintf (SUMA_STDERR,"Error %s: Bad %f isovalue\nWith -xform none you can only extract the 0 isosurface.\n(i.e. -isoval 0)\n", FuncName, Opt->v0); exit(1); } if (Opt->MaskMode != SUMA_ISO_VAL) { fprintf (SUMA_STDERR,"Error %s: \nWith -xform none you can only use -isoval 0\n", FuncName); exit(1); } } if (Opt->xform == SUMA_ISO_XFORM_SHIFT) { if (Opt->MaskMode != SUMA_ISO_VAL) { fprintf (SUMA_STDERR,"Error %s: \nWith -xform shift you can only use -isoval val\n", FuncName); exit(1); } } SUMA_RETURN(Opt); }
SUMA_GENERIC_PROG_OPTIONS_STRUCT *SUMA_SurfInfo_ParseInput(char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SurfInfo_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); Opt->b2=0; Opt->in_1D=" ; "; kar = 1; brk = NOPE; 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) { usage_SurfInfo(ps); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -debug \n"); exit (1); } Opt->debug = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-detail") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -detail \n"); exit (1); } Opt->b1 = (byte)atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-sep") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a string after -sep \n"); exit (1); } Opt->in_1D = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-input") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need surface dset after -input \n"); exit (1); } if (Opt->n_in_namev < SUMA_GENERIC_PROG_MAX_IN_NAME) { Opt->in_namev[Opt->n_in_namev] = argv[++kar]; ++Opt->n_in_namev; } else { SUMA_S_Err("Too many input dsets on command line"); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-N_Node") == 0)) { Opt->s = SUMA_append_replace_string(Opt->s,"N_Node","|",1); brk = YUP; } if (!brk && (strcmp(argv[kar], "-COM") == 0)) { Opt->s = SUMA_append_replace_string(Opt->s,"COM","|",1); brk = YUP; } if (!brk && (strcmp(argv[kar], "-N_FaceSet") == 0 || strcmp(argv[kar], "-N_Tri") == 0)) { Opt->s = SUMA_append_replace_string(Opt->s,(argv[kar]+1),"|",1); brk = YUP; } if (!brk && (strcmp(argv[kar], "-quiet") == 0)) { Opt->b2 = 1; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { /* Assume the rest is input data */ while (kar < argc) { if (Opt->n_in_namev < SUMA_GENERIC_PROG_MAX_IN_NAME) { Opt->in_namev[Opt->n_in_namev] = argv[kar]; ++Opt->n_in_namev; ++kar; } else { SUMA_S_Err("Too many input surfaces on command line"); } } } else { brk = NOPE; kar ++; } } SUMA_RETURN(Opt); }
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); }
/*! \brief parse the arguments for SurfSmooth program \param argv (char *) \param argc (int) \return Opt (SUMA_GETPATCH_OPTIONS *) options structure. To free it, use SUMA_free(Opt->outfile); SUMA_free(Opt->histnote); SUMA_free(Opt); */ SUMA_KUBATEST_OPTIONS *SUMA_SampBias_ParseInput( char *argv[], int argc, SUMA_KUBATEST_OPTIONS* Opt, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SampBias_ParseInput"}; int kar, i, ind; char *outprefix; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; kar = 1; brk = NOPE; Opt->debug = 0; Opt->plimit = 50; Opt->dlimit = 1000; Opt->outfile = NULL; Opt->prefix = NULL; Opt->segdo = NULL; Opt->ps=ps; 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) { ps->hverb = strlen(argv[kar])>3?2:1; usage_SUMA_SampBias(ps); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-plimit") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -plimit \n"); exit (1); } Opt->plimit = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-dlimit") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -dlimit \n"); exit (1); } Opt->dlimit = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-out") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -out \n"); exit (1); } Opt->outfile = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-segdo") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -segdo \n"); exit (1); } Opt->segdo = SUMA_Extension(argv[kar], ".1D.do", NOPE); brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->prefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { SUMA_S_Errv("Option %s not understood. Try -help for usage\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* sanity checks */ if (Opt->outfile == NULL && Opt->prefix == NULL) { SUMA_SL_Err("No outfile, or prefix specified."); exit(1); } if (Opt->outfile) { if (!THD_ok_overwrite() && SUMA_filexists(Opt->outfile)) { SUMA_S_Errv("Outfile %s already exists\n", Opt->outfile); exit(1); } } if (Opt->prefix) { SUMA_DSET_NAME_CHECK(Opt->prefix); } Opt->histnote = SUMA_HistString (NULL, argc, argv, NULL); SUMA_RETURN (Opt); }
SUMA_GENERIC_PROG_OPTIONS_STRUCT *SUMA_prompt_user_ParseInput( char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_prompt_user_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); Opt->ps = ps; /* just hold it there for convenience */ Opt->ps = ps; /* for convenience */ kar = 1; brk = NOPE; 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) { ps->hverb = 1; usage_prompt_user(ps); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -debug \n"); exit (1); } Opt->debug = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-pause") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a string after -pause \n"); exit (1); } Opt->b1 = 1; Opt->in_name = argv[++kar]; brk = YUP; if (!strcmp(Opt->in_name, "-")) Opt->in_name = read_file_text(stdin); } if (!brk && !ps->arg_checked[kar]) { SUMA_S_Errv("Option %s not understood.\n" "Try -help for usage\n", argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } SUMA_RETURN(Opt); }
SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_3dBRAIN_VOYAGERtoAFNI_ParseInput(char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_3dBRAIN_VOYAGERtoAFNI_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); Opt->b1 = 0; Opt->b2 = 0; Opt->Icold = -1; Opt->out_prefix = NULL; kar = 1; brk = NOPE; 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) { usage_3dBRAIN_VOYAGERtoAFNI(ps); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-input") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -input\n"); exit (1); } Opt->in_name = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix\n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-tlrc") == 0)) { Opt->Icold = VIEW_TALAIRACH_TYPE; brk = YUP; } if (!brk && (strcmp(argv[kar], "-acpc") == 0)) { Opt->Icold = VIEW_ACPCALIGNED_TYPE; brk = YUP; } if (!brk && (strcmp(argv[kar], "-orig") == 0)) { Opt->Icold = VIEW_ORIGINAL_TYPE; brk = YUP; } if (!brk && (strcmp(argv[kar], "-bs") == 0)) { Opt->b1 = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-qx") == 0)) { Opt->b2 = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-debug") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need integer argument after -debug\n"); exit (1); } Opt->debug = atoi(argv[kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR,"Error %s:\nOption %s not understood. Try -help for usage\n", FuncName, argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } SUMA_RETURN(Opt); }
int main (int argc,char *argv[]) {/* Main */ static char FuncName[]={"ConvertSurface"}; int kar, volexists, i, j, Doinv, randseed, Domergesurfs=0, pciref; float DoR2S, fv[3], *pcxyzref; double xcen[3], sc[3]; double xform[4][4]; char *if_name = NULL, *of_name = NULL, *if_name2 = NULL, *of_name2 = NULL, *sv_name = NULL, *vp_name = NULL, *OF_name = NULL, *OF_name2 = NULL, *tlrc_name = NULL, *acpc_name=NULL, *xmat_name = NULL, *ifpar_name = NULL, *ifpar_name2 = NULL; SUMA_SO_File_Type iType = SUMA_FT_NOT_SPECIFIED, iparType = SUMA_FT_NOT_SPECIFIED, oType = SUMA_FT_NOT_SPECIFIED; SUMA_SO_File_Format iForm = SUMA_FF_NOT_SPECIFIED, iparForm = SUMA_FF_NOT_SPECIFIED, oFormat = SUMA_FF_NOT_SPECIFIED; SUMA_SurfaceObject *SO = NULL, *SOpar = NULL, *SOsurf = NULL; SUMA_PARSED_NAME *of_name_strip = NULL, *of_name2_strip = NULL; SUMA_SFname *SF_name = NULL; void *SO_name = NULL; char orsurf[6], orcode[6], *PCprojpref=NULL, *NodeDepthpref=NULL; THD_warp *warp=NULL ; THD_3dim_dataset *aset=NULL; SUMA_Boolean brk, Do_tlrc, Do_mni_RAI, Do_mni_LPI, Do_acpc, Docen, Do_flip; SUMA_Boolean Doxmat, Do_wind, Do_p2s, onemore, Do_native, Do_PolDec; int Do_PCproj, Do_PCrot, Do_NodeDepth; SUMA_GENERIC_ARGV_PARSE *ps=NULL; SUMA_Boolean exists; SUMA_Boolean LocalHead = NOPE; SUMA_STANDALONE_INIT; SUMA_mainENTRY; /* Allocate space for DO structure */ SUMAg_DOv = SUMA_Alloc_DisplayObject_Struct (SUMA_MAX_DISPLAYABLE_OBJECTS); ps = SUMA_Parse_IO_Args(argc, argv, "-o;-i;-sv;-ipar;"); kar = 1; xmat_name = NULL; xcen[0] = 0.0; xcen[1] = 0.0; xcen[2] = 0.0; brk = NOPE; orcode[0] = '\0'; randseed = 1234; sprintf(orsurf,"RAI"); Docen = NOPE; Doxmat = NOPE; Do_tlrc = NOPE; Do_mni_RAI = NOPE; Do_mni_LPI = NOPE; Do_acpc = NOPE; Do_wind = NOPE; Do_flip = NOPE; Do_p2s = NOPE; Do_native = NOPE; DoR2S = 0.0; Do_PolDec = NOPE; Do_PCproj = NO_PRJ; Do_PCrot = NO_ROT; pciref = -1; pcxyzref = NULL; PCprojpref = NULL; NodeDepthpref = NULL; Do_NodeDepth = 0; Doinv = 0; Domergesurfs = 0; onemore = NOPE; 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) { usage_SUMA_ConvertSurface(ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); SUMA_TO_LOWER(argv[kar]); if (!brk && (strcmp(argv[kar], "-seed") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 integer after -seed\n"); exit (1); } randseed = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-xyzscale") == 0)) { kar ++; if (kar+2 >= argc) { fprintf (SUMA_STDERR, "need 3 values after -XYZscale\n"); exit (1); } sc[0] = strtod(argv[kar], NULL); kar ++; sc[1] = strtod(argv[kar], NULL); kar ++; sc[2] = strtod(argv[kar], NULL); xmat_name = "Scale"; Doxmat = YUP; Doinv = 0; brk = YUP; } if (!brk && ( (strcmp(argv[kar], "-xmat_1d") == 0) || (strcmp(argv[kar], "-xmat_1D") == 0) ) ) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 argument after -xmat_1D\n"); exit (1); } xmat_name = argv[kar]; Doxmat = YUP; Doinv = 0; brk = YUP; } if (!brk && ( (strcmp(argv[kar], "-ixmat_1d") == 0) || (strcmp(argv[kar], "-ixmat_1D") == 0) ) ) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 argument after -ixmat_1D\n"); exit (1); } xmat_name = argv[kar]; Doxmat = YUP; Doinv = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-polar_decomp") == 0)) { Do_PolDec = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-merge_surfs") == 0)) { Domergesurfs = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-pc_proj") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 argument after -pc_proj\n"); exit (1); } if (!strcmp(argv[kar],"PC0_plane")) Do_PCproj = E1_PLN_PRJ; else if (!strcmp(argv[kar],"PC1_plane")) Do_PCproj = E2_PLN_PRJ; else if (!strcmp(argv[kar],"PC2_plane")) Do_PCproj = E3_PLN_PRJ; else if (!strcmp(argv[kar],"PCZ_plane")) Do_PCproj = EZ_PLN_PRJ; else if (!strcmp(argv[kar],"PCY_plane")) Do_PCproj = EY_PLN_PRJ; else if (!strcmp(argv[kar],"PCX_plane")) Do_PCproj = EX_PLN_PRJ; else if (!strcmp(argv[kar],"PC0_dir")) Do_PCproj = E1_DIR_PRJ; else if (!strcmp(argv[kar],"PC1_dir")) Do_PCproj = E2_DIR_PRJ; else if (!strcmp(argv[kar],"PC2_dir")) Do_PCproj = E3_DIR_PRJ; else if (!strcmp(argv[kar],"PCZ_dir")) Do_PCproj = EZ_DIR_PRJ; else if (!strcmp(argv[kar],"PCY_dir")) Do_PCproj = EY_DIR_PRJ; else if (!strcmp(argv[kar],"PCX_dir")) Do_PCproj = EX_DIR_PRJ; else { SUMA_S_Err("Bad value of %s for -pca_proj", argv[kar]); exit(1); } ++kar; if (argv[kar][0] == '-') { SUMA_S_Err("Prefix for -pc_proj should not start with '-'.\n" "Could it be that %s is another option and \n" "the prefix was forgtotten?", argv[kar]); exit(1); } PCprojpref = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-node_depth") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need a prefix argument after -node_depth\n"); exit (1); } Do_NodeDepth = 1; if (argv[kar][0] == '-') { SUMA_S_Err("Prefix for -node_depth should not start with '-'.\n" "Could it be that %s is another option and \n" "the prefix was forgtotten?", argv[kar]); exit(1); } NodeDepthpref = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-make_consistent") == 0)) { Do_wind = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-flip_orient") == 0)) { Do_flip = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-xcenter") == 0)) { kar ++; if (kar+2>= argc) { fprintf (SUMA_STDERR, "need 3 arguments after -xcenter\n"); exit (1); } xcen[0] = atof(argv[kar]); ++kar; xcen[1] = atof(argv[kar]); ++kar; xcen[2] = atof(argv[kar]); Docen = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-native") == 0)) { Do_native = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-orient_out") == 0)) { kar ++; if (kar>= argc) { fprintf (SUMA_STDERR, "need 1 argument after -orient_out\n"); exit (1); } snprintf(orcode, 4*sizeof(char), "%s", argv[kar]); if (!SUMA_ok_orstring(orcode)) { fprintf (SUMA_STDERR, "%s is a bad orientation string\n", orcode); exit (1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-radial_to_sphere") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need 1 argument after -radial_to_sphere\n"); exit (1); } DoR2S = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-patch2surf") == 0)) { Do_p2s = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-xml_ascii") == 0)) { oFormat = SUMA_XML_ASCII_SURF; brk = YUP; } if (!brk && (strcmp(argv[kar], "-xml_b64") == 0)) { oFormat = SUMA_XML_B64_SURF; brk = YUP; } if (!brk && (strcmp(argv[kar], "-xml_b64gz") == 0)) { oFormat = SUMA_XML_B64GZ_SURF; brk = YUP; } if (!brk && (strcmp(argv[kar], "-tlrc") == 0)) { Do_tlrc = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-acpc") == 0)) { Do_acpc = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-mni_rai") == 0)) { Do_mni_RAI = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-mni_lpi") == 0)) { Do_mni_LPI = YUP; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s: Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } if (argc < 3) { SUMA_S_Err("Too few options"); usage_SUMA_ConvertSurface (ps, 0); exit (1); } /* transfer info from ps structure (backward compat) */ if (ps->o_N_surfnames) { of_name = ps->o_surfnames[0]; of_name2 = ps->o_surftopo[0]; oType = ps->o_FT[0]; if (oFormat == SUMA_FF_NOT_SPECIFIED) { oFormat = ps->o_FF[0]; } } if (ps->i_N_surfnames) { if_name = ps->i_surfnames[0]; if_name2 = ps->i_surftopo[0]; iType = ps->i_FT[0]; iForm = ps->i_FF[0]; } if (ps->ipar_N_surfnames) { ifpar_name = ps->ipar_surfnames[0]; ifpar_name2 = ps->ipar_surftopo[0]; iparType = ps->ipar_FT[0]; iparForm = ps->ipar_FF[0]; } if (ps->N_sv) sv_name = ps->sv[0]; if (ps->N_vp) vp_name = ps->vp[0]; /* sanity checks */ if (Do_native && orcode[0] != '\0') { SUMA_S_Err("Options -native and -orient_out are mutually exclusive"); exit(1); } if (Do_mni_LPI && Do_mni_RAI) { SUMA_S_Err("\nCombining -MNI_lpi and -MNI_rai options.\nNot good."); exit(1); } if (!if_name) { SUMA_S_Err("input surface not specified.\n"); exit(1); } if (!of_name && (Do_PCproj < 0 && !Do_NodeDepth) ) { SUMA_S_Err("output surface or projection PREFIX not specified.\n"); exit(1); } if (iType == SUMA_FT_NOT_SPECIFIED) { SUMA_S_Err("input type not recognized.\n"); exit(1); } if (oType == SUMA_FT_NOT_SPECIFIED && (Do_PCproj < 0 && !Do_NodeDepth) ) { SUMA_S_Err("output type not recognized.\n"); exit(1); } if ( oType != SUMA_GIFTI && oFormat >= SUMA_XML_SURF && oFormat <= SUMA_XML_B64GZ_SURF && (Do_PCproj < 0 && !Do_NodeDepth) ){ SUMA_S_Err("XML output options only valid with -o_gii\n"); exit(1); } if (iType == SUMA_SUREFIT) { if (!if_name2) { SUMA_S_Err("input SureFit surface incorrectly specified.\n"); exit(1); } if (sv_name && !vp_name) { SUMA_S_Err("VolParent needs the -sv option for SureFit surfaces."); exit(1); } } if (iType == SUMA_VEC) { if (!if_name2) { SUMA_S_Err("Input vec surface incorrectly specified.\n"); exit(1); } } if (( Do_mni_RAI || Do_mni_LPI) && !Do_tlrc) { SUMA_SL_Warn ( "I hope you know what you're doing.\n" "The MNI transform should only be applied to a\n" "Surface in the AFNI tlrc coordinate space.\n"); } if (Do_acpc && Do_tlrc) { SUMA_S_Err("You can't do -tlrc and -acpc simultaneously."); exit(1); } if ((Doxmat || Docen) && (Do_acpc || Do_tlrc)) { SUMA_S_Err("You can't do -tlrc or -acpc with -xmat_1D and -xcenter.\n"); exit(1); } if ((!Doxmat && Docen)) { SUMA_S_Err("You can't use -xcenter without -xmat_1D.\n"); exit(1); } if (oType == SUMA_SUREFIT) { if (!of_name2) { SUMA_S_Err("output SureFit surface incorrectly specified. \n"); exit(1); } } if (oType == SUMA_VEC) { if (!of_name2) { SUMA_S_Err("output vec surface incorrectly specified. \n"); exit(1); } } if ( ps->i_N_surfnames > 1 && !Domergesurfs) { SUMA_S_Err("Multiple surfaces specified without -merge_surfs option\n" "Nothing to do for such an input\n"); exit(1); } /* test for existence of input files */ if (!SUMA_is_predefined_SO_name(if_name, NULL, NULL, NULL, NULL) && !SUMA_filexists(if_name)) { SUMA_S_Errv("if_name %s not found.\n", if_name); exit(1); } if (if_name2) { if (!SUMA_filexists(if_name2)) { SUMA_S_Errv("if_name2 %s not found.\n", if_name2); exit(1); } } if (ifpar_name2) { if (!SUMA_filexists(ifpar_name2)) { SUMA_S_Errv("ifpar_name2 %s not found.\n", ifpar_name2); exit(1); } } if (ifpar_name) { if (!SUMA_filexists(ifpar_name)) { SUMA_S_Errv("ifpar_name %s not found.\n", ifpar_name); exit(1); } } if (xmat_name) { if (!strstr(special_xmats,xmat_name) && !SUMA_filexists(xmat_name)) { SUMA_S_Errv("xmat file %s not found.\n", xmat_name); exit(1); } } else { if (Do_PolDec) { SUMA_S_Err("-polar_decomp is useless without -xmat_1D"); exit(1); } } if (sv_name) { char *head = NULL, view[10]; head = SUMA_AfniPrefix(sv_name, view, NULL, &volexists); if (!SUMA_AfniExistsView(volexists, view) && !SUMA_filexists(sv_name)) { fprintf (SUMA_STDERR, "Error %s: volume %s not found.\n", FuncName, head); exit(1); } if (head) SUMA_free(head); head = NULL; } if ((Do_tlrc || Do_acpc) && (!sv_name)) { fprintf (SUMA_STDERR, "Error %s: -tlrc must be used with -sv option.\n", FuncName); exit(1); } if (vp_name) { if (!SUMA_filexists(vp_name)) { fprintf (SUMA_STDERR, "Error %s: %s not found.\n", FuncName, vp_name); exit(1); } } /* check for existence of output files */ if ((Do_PCproj < 0 && !Do_NodeDepth) ) { if (of_name2) { SUMA_SFname *SFname; SO_name = SUMA_2Prefix2SurfaceName (of_name, of_name2, NULL, vp_name, oType, &exists); SFname = (SUMA_SFname *)SO_name; OF_name2 = SUMA_copy_string(SFname->name_topo); OF_name = SUMA_copy_string(SFname->name_coord); } else { SO_name = SUMA_Prefix2SurfaceName (of_name, NULL, vp_name, oType, &exists); OF_name = SUMA_copy_string((char *) SO_name); } if (exists && !THD_ok_overwrite()) { if (OF_name2) fprintf (SUMA_STDERR, "Error %s: output file(s) %s and/or %s exist already.\n", FuncName, OF_name, OF_name2); else fprintf ( SUMA_STDERR, "Error %s: output file %s exists already.\n", FuncName, OF_name); exit(1); } } /* now for the real work */ if (Doxmat) { MRI_IMAGE *im = NULL; double *far=NULL; int nrow, ncol; if (!strcmp(xmat_name,"RandRigid")) { SUMA_FillRandXform(xform, randseed, 2); } else if (!strcmp(xmat_name,"RandAffine")) { SUMA_FillRandXform(xform, randseed, 3); } else if (!strcmp(xmat_name,"RandShift")) { SUMA_FillRandXform(xform, randseed, 1); } else if (!strcmp(xmat_name,"Scale")) { SUMA_FillScaleXform(xform, sc); } else if (!strcmp(xmat_name,"NegXY")) { SUMA_FillXYnegXform(xform); } else { im = mri_read_double_1D (xmat_name); if (!im) { SUMA_SLP_Err("Failed to read 1D file"); exit(1); } far = MRI_DOUBLE_PTR(im); nrow = im->nx; ncol = im->ny; if (nrow == 1) { if (ncol != 12) { SUMA_SL_Err("Mat file must have\n" "one row of 12 columns."); mri_free(im); im = NULL; /* done with that baby */ exit(1); } i = 0; while (i < 12) { xform[i/4][0] = far[i]; ++i; xform[i/4][1] = far[i]; ++i; xform[i/4][2] = far[i]; ++i; xform[i/4][3] = far[i]; ++i; } xform[3][0] = 0.0; xform[3][1] = 0.0; xform[3][2] = 0.0; xform[3][3] = 1.0; } else { if (ncol < 4 ) { SUMA_SL_Err("Mat file must have\n" "at least 4 columns."); mri_free(im); im = NULL; /* done with that baby */ exit(1); } if (nrow < 3 ) { SUMA_SL_Err("Mat file must have\n" "at least 3 rows."); mri_free(im); im = NULL; /* done with that baby */ exit(1); } if (ncol > 4) { SUMA_SL_Warn( "Ignoring entries beyond 4th \n" "column in transform file."); } if (nrow > 3) { SUMA_SL_Warn( "Ignoring entries beyond 3rd\n" "row in transform file.\n"); } for (i=0; i < 3; ++i) { xform[i][0] = far[i]; xform[i][1] = far[i+nrow]; xform[i][2] = far[i+2*nrow]; xform[i][3] = far[i+3*nrow]; } xform[3][0] = 0.0; xform[3][1] = 0.0; xform[3][2] = 0.0; xform[3][3] = 1.0; } } if (LocalHead) { fprintf(SUMA_STDERR,"\n++ ConvertSurface xform:\n"); for (i=0; i < 4; ++i) { fprintf(SUMA_STDERR," %+.5f\t%+.5f\t%+.5f\t%+.5f\n", xform[i][0], xform[i][1], xform[i][2], xform[i][3]); } fprintf(SUMA_STDERR,"\n"); } mri_free(im); im = NULL; if (Doinv) { mat44 A, A0; LOAD_MAT44( A0, \ xform[0][0], xform[0][1], xform[0][2], xform[0][3], \ xform[1][0], xform[1][1], xform[1][2], xform[1][3], \ xform[2][0], xform[2][1], xform[2][2], xform[2][3] ); A = nifti_mat44_inverse(A0); UNLOAD_MAT44(A, \ xform[0][0], xform[0][1], xform[0][2], xform[0][3], \ xform[1][0], xform[1][1], xform[1][2], xform[1][3], \ xform[2][0], xform[2][1], xform[2][2], xform[2][3] ); } if (Do_PolDec) { #ifdef USE_DECOMPOSE_SHOEMAKE /* a little something to do a polar decomposition on M into M = Q*S*/ { float det, m[4][4], q[4][4], s[4][4]; char *stmp = SUMA_append_string("QS_",xmat_name); FILE *fout = fopen(stmp,"w"); SUMA_free(stmp); stmp = NULL; SUMA_S_Note("FixMe! #include above and if(1) here ..."); det = polar_decomp(M, q,s); fprintf(fout,"#[M][D]: (D is the shift)\n"); for (i=0;i<3; ++i) fprintf(fout, "#%.5f %.5f %.5f %.5f\n", M[i][0], M[i][1], M[i][2], M[i][3]); fprintf(fout,"#Q:\n"); for (i=0;i<3; ++i) fprintf(fout, "#%.5f %.5f %.5f %.5f\n", q[i][0], q[i][1], q[i][2], q[i][3]); fprintf(fout,"#S:\n"); for (i=0;i<3; ++i) fprintf(fout, "#%.5f %.5f %.5f %.5f\n", s[i][0], s[i][1], s[i][2], s[i][3]); fprintf(fout,"#det: %f\n", det); fprintf(fout, "#[Q][D]: A close xform to [M][D], " "without scaling.\n#M = Q*S\n"); for (i=0;i<3; ++i) fprintf(fout, "%.5f %.5f %.5f %.5f\n", q[i][0], q[i][1], q[i][2], M[i][3]); fclose(fout); SUMA_free(stmp); stmp = NULL; } /* replace user's xform with orthogonal one: */ fprintf(SUMA_STDOUT,"Replacing matrix:\n"); for (i=0;i<3; ++i) fprintf( SUMA_STDOUT, " %.5f %.5f %.5f %.5f\n", M[i][0], M[i][1], M[i][2], M[i][3]); fprintf(SUMA_STDOUT," with matrix:\n"); for (i=0;i<3; ++i) fprintf(SUMA_STDOUT, " %.5f %.5f %.5f %.5f\n", q[i][0], q[i][1], q[i][2], M[i][3]); for (i=0;i<3; ++i) { M[i][0] = q[i][0]; M[i][1] = q[i][1]; M[i][2] = q[i][2]; } #else {/* use the NIFTI polar decomposition function (same results as above)*/ mat33 Q, A; for (i=0;i<3;++i) { A.m[i][0] = xform[i][0]; A.m[i][1] = xform[i][1]; A.m[i][2] = xform[i][2]; } Q = nifti_mat33_polar( A ); /* replace user's xform with orthogonal one: */ fprintf(SUMA_STDOUT,"Replacing matrix:\n"); for (i=0;i<3; ++i) fprintf( SUMA_STDOUT, " %.5f %.5f %.5f %.5f\n", xform[i][0], xform[i][1], xform[i][2], xform[i][3]); fprintf(SUMA_STDOUT," with matrix:\n"); for (i=0;i<3; ++i) fprintf( SUMA_STDOUT, " %.5f %.5f %.5f %.5f\n", Q.m[i][0], Q.m[i][1], Q.m[i][2], xform[i][3]); for (i=0;i<3; ++i) { xform[i][0] = Q.m[i][0]; xform[i][1] = Q.m[i][1]; xform[i][2] = Q.m[i][2]; } } #endif } } if ( ps->i_N_surfnames == 1) { /* load that one surface */ SO = SUMA_Load_Surface_Object_Wrapper ( if_name, if_name2, vp_name, iType, iForm, sv_name, 1); if (!SO) { SUMA_S_Err("Failed to read input surface.\n"); exit (1); } } else if ( ps->i_N_surfnames > 1 && Domergesurfs) { SUMA_SurfaceObject **SOar=NULL; int ii; SUMA_S_Notev("Merging %d surfaces into 1\n", ps->i_N_surfnames); SOar = (SUMA_SurfaceObject **) SUMA_calloc(ps->i_N_surfnames, sizeof(SUMA_SurfaceObject *)); if (ps->N_sv > 1 || ps->N_vp > 1) { SUMA_S_Errv("Cannot handle multiple (%d) -sv or multiple (%d) -vp\n", ps->N_sv, ps->N_vp); exit(1); } for (ii = 0; ii<ps->i_N_surfnames; ++ii) { SOar[ii] = SUMA_Load_Surface_Object_Wrapper(ps->i_surfnames[ii], ps->i_surftopo[ii], vp_name, ps->i_FT[0], ps->i_FF[0], sv_name, 1); } if (!(SO = SUMA_MergeSurfs(SOar, ps->i_N_surfnames))) { SUMA_S_Err("Failed to merge"); exit(1); } for (ii = 0; ii<ps->i_N_surfnames; ++ii) { SUMA_Free_Surface_Object(SOar[ii]); SOar[ii]=NULL; } SUMA_free(SOar); SOar=NULL; } if (DoR2S > 0.0000001) { if (!SUMA_ProjectSurfaceToSphere(SO, NULL , DoR2S , NULL)) { SUMA_S_Err("Failed to project to surface"); exit(1); } } if (ifpar_name) { SOpar = SUMA_Load_Surface_Object_Wrapper ( ifpar_name, ifpar_name2, vp_name, iparType, iparForm, sv_name, 1); if (!SOpar) { SUMA_S_Err("Failed to read input parent surface.\n"); exit (1); } /* need edge list */ if (!SUMA_SurfaceMetrics_eng (SOpar,"EdgeList", NULL, 0, SUMAg_CF->DsetList)) { SUMA_SL_Err("Failed to create edgelist for parent"); exit(1); } } /* if Do_wind */ if (Do_wind) { fprintf (SUMA_STDOUT, "Checking and repairing mesh's winding consistency...\n"); /* check the winding, but that won't fix the normals, you'll have to recalculate those things, if need be ... */ if (!SUMA_SurfaceMetrics_eng (SO, "CheckWind", NULL, 0, SUMAg_CF->DsetList)) { SUMA_S_Err("Failed in SUMA_SurfaceMetrics.\n"); exit(1); } } if (Do_flip) { fprintf (SUMA_STDOUT, "Flipping triangle winding...\n"); SUMA_FlipSOTriangles(SO); } if (Do_tlrc) { fprintf (SUMA_STDOUT,"Performing talairach transform...\n"); /* form the tlrc version of the surface volume */ tlrc_name = (char *) SUMA_calloc (strlen(SO->VolPar->dirname)+ strlen(SO->VolPar->prefix)+60, sizeof(char)); sprintf (tlrc_name, "%s%s+tlrc.HEAD", SO->VolPar->dirname, SO->VolPar->prefix); if (!SUMA_filexists(tlrc_name)) { fprintf (SUMA_STDERR,"Error %s: %s not found.\n", FuncName, tlrc_name); exit(1); } /* read the tlrc header */ aset = THD_open_dataset(tlrc_name) ; if( !ISVALID_DSET(aset) ){ SUMA_S_Err("%s is not a valid data set.\n", tlrc_name) ; exit(1); } if( aset->warp == NULL ){ SUMA_S_Err("tlrc_name does not contain a talairach transform.\n"); exit(1); } warp = aset->warp ; /* now warp the coordinates, one node at a time */ if (!SUMA_AFNI_forward_warp_xyz(warp, SO->NodeList, SO->N_Node)) { SUMA_S_Err("Failed in SUMA_AFNI_forward_warp_xyz.\n"); exit(1); } } if (Do_acpc) { fprintf (SUMA_STDOUT,"Performing acpc transform...\n"); /* form the acpc version of the surface volume */ acpc_name = (char *) SUMA_calloc (strlen(SO->VolPar->dirname)+ strlen(SO->VolPar->prefix)+60, sizeof(char)); sprintf (acpc_name, "%s%s+acpc.HEAD", SO->VolPar->dirname, SO->VolPar->prefix); if (!SUMA_filexists(acpc_name)) { fprintf (SUMA_STDERR,"Error %s: %s not found.\n", FuncName, acpc_name); exit(1); } /* read the acpc header */ aset = THD_open_dataset(acpc_name) ; if( !ISVALID_DSET(aset) ){ fprintf (SUMA_STDERR, "Error %s: %s is not a valid data set.\n", FuncName, acpc_name) ; exit(1); } if( aset->warp == NULL ){ fprintf (SUMA_STDERR, "Error %s: acpc_name does not contain an acpc transform.\n", FuncName); exit(1); } warp = aset->warp ; /* now warp the coordinates, one node at a time */ if (!SUMA_AFNI_forward_warp_xyz(warp, SO->NodeList, SO->N_Node)) { fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_AFNI_forward_warp_xyz.\n", FuncName); exit(1); } } if (Do_mni_RAI) { fprintf (SUMA_STDOUT,"Performing MNI_RAI transform...\n"); /* apply the mni warp */ if (!SUMA_AFNItlrc_toMNI(SO->NodeList, SO->N_Node, "RAI")) { fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_AFNItlrc_toMNI.\n", FuncName); exit(1); } sprintf(orsurf,"RAI"); } if (Do_mni_LPI) { fprintf (SUMA_STDOUT,"Performing MNI_LPI transform...\n"); /* apply the mni warp */ if (!SUMA_AFNItlrc_toMNI(SO->NodeList, SO->N_Node, "LPI")) { fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_AFNItlrc_toMNI.\n", FuncName); exit(1); } sprintf(orsurf,"LPI"); } if (Doxmat) { fprintf (SUMA_STDOUT,"Performing affine transform...\n"); if (LocalHead) { for (i=0; i<3 ; ++i) { fprintf (SUMA_STDERR, "M[%d][:] = %f %f %f %f\n", i, xform[i][0], xform[i][1], xform[i][2], xform[i][3]); } fprintf (SUMA_STDERR,"Cen[:] %f %f %f\n", xcen[0], xcen[1], xcen[2]); } if (Docen) { if (!SUMA_Apply_Coord_xform( SO->NodeList, SO->N_Node, SO->NodeDim, xform, 0, xcen)) { SUMA_SL_Err("Failed to xform coordinates"); exit(1); } } else { if (!SUMA_Apply_Coord_xform( SO->NodeList, SO->N_Node, SO->NodeDim, xform, 0, NULL)) { SUMA_SL_Err("Failed to xform coordinates"); exit(1); } } SUMA_Blank_AfniSO_Coord_System(SO->aSO); } if (orcode[0] != '\0') { SUMA_LHv("Changing coordinates from %s to %s\n", orsurf, orcode); if (!SUMA_CoordChange(orsurf, orcode, SO->NodeList, SO->N_Node)) { SUMA_S_Err("Failed to change coords."); exit(1); } SUMA_Blank_AfniSO_Coord_System(SO->aSO); } if (Do_p2s) { SUMA_SurfaceObject *SOold = SO; SUMA_LH("Changing patch to surface..."); SO = SUMA_Patch2Surf(SOold->NodeList, SOold->N_Node, SO->FaceSetList, SO->N_FaceSet, 3); if (!SO) { SUMA_S_Err("Failed to change patch to surface."); exit(1); } /* get rid of old surface object */ SUMA_Free_Surface_Object(SOold); } if (Do_native) { if (!SUMA_Delign_to_VolPar (SO, NULL)) { SUMA_S_Err("Failed to transform coordinates to native space"); exit(1); } } if (Do_NodeDepth) { float *dpth=NULL, mx=0.0; SUMA_PC_XYZ_PROJ *pcp=NULL; if (SUMA_NodeDepth(SO->NodeList, SO->N_Node, E1_DIR_PRJ, &dpth, 0.0, NULL, &mx, &pcp) < 0) { SUMA_S_Err("Failed to compute node depth"); exit(1); } else { if (!SUMA_WriteNodeDepth(NodeDepthpref,pcp,dpth, mx)) { SUMA_S_Err("Failed to write node depth"); exit(1); } } SUMA_ifree(dpth); pcp = SUMA_Free_PC_XYZ_Proj(pcp); } if (Do_PCproj > NO_PRJ) { SUMA_PC_XYZ_PROJ *pcp=NULL; pciref = 0; pcxyzref = NULL; if (!(pcp = SUMA_Project_Coords_PCA(SO->NodeList, SO->N_Node, pciref, pcxyzref, Do_PCproj, Do_PCrot, 1))) { SUMA_S_Err("Failed to project"); exit(1); } else { if (!SUMA_Write_PC_XYZ_Proj(pcp, PCprojpref)) { SUMA_S_Err("Failed to write out projections"); exit(1); } else { pcp = SUMA_Free_PC_XYZ_Proj(pcp); } exit(0); } } /* write the surface object */ if (SO_name) { if (LocalHead) SUMA_Print_Surface_Object (SO, stderr); fprintf (SUMA_STDOUT,"Writing surface...\n"); if (!(SUMA_Save_Surface_Object ( SO_name, SO, oType, oFormat, SOpar))) { fprintf (SUMA_STDERR, "Error %s: Failed to write surface object.\n", FuncName); exit (1); } } if (of_name_strip) of_name_strip = SUMA_Free_Parsed_Name (of_name_strip); if (of_name2_strip) of_name2_strip = SUMA_Free_Parsed_Name (of_name2_strip); if (OF_name) SUMA_free(OF_name); if (OF_name2) SUMA_free(OF_name2); if (SF_name) SUMA_free(SF_name); if (SO_name) SUMA_free(SO_name); if (SO) SUMA_Free_Surface_Object(SO); if (SOpar) SUMA_Free_Surface_Object(SOpar); if (ps) SUMA_FreeGenericArgParse(ps); ps = NULL; return (0); }