#include "SUMA_suma.h"
SUMA_SurfaceViewer *SUMAg_cSV = NULL; /*!< Global pointer to current Surface Viewer structure*/
SUMA_SurfaceViewer *SUMAg_SVv = NULL; /*!< Global pointer to the vector containing the various Surface Viewer Structures
SUMAg_SVv contains SUMA_MAX_SURF_VIEWERS structures */
int SUMAg_N_SVv = 0; /*!< Number of SVs realized by X */
SUMA_DO *SUMAg_DOv = NULL; /*!< Global pointer to Displayable Object structure vector*/
int SUMAg_N_DOv = 0; /*!< Number of DOs stored in DOv */
SUMA_CommonFields *SUMAg_CF = NULL; /*!< Global pointer to structure containing info common to all viewers */
void SUMA_ScaleToMap_usage ()
{
static char FuncName[]={"SUMA_ScaleToMap_usage"};
char * s = NULL;
SUMA_ENTRY;
s = SUMA_help_basics();
fprintf (SUMA_STDOUT, "\nUsage: ScaleToMap <-input IntFile icol vcol> \n"
" [-cmap MapType] [-cmapfile Mapfile] [-cmapdb Palfile] [-frf] \n"
" [-clp/-perc_clp clp0 clp1] [-apr/-anr range]\n"
" [-interp/-nointerp/-direct] [-msk msk0 msk1] [-nomsk_col]\n"
" [-msk_col R G B] [-br BrightFact]\n"
" [-h/-help] [-verb] [-showmap] [-showdb]\n"
"\n"
" -input IntFile icol vcol: input data.\n"
" Infile: 1D formatted ascii file containing node values\n"
" icol: index of node index column \n"
" (-1 if the node index is implicit)\n"
" vcol: index of node value column.\n"
" Example: -input ValOnly.1D -1 0 \n"
" for a 1D file containing node values\n"
" in the first column and no node indices.\n"
" Example: -input NodeVal.1D 1 3\n"
" for a 1D file containing node indices in\n"
" the SECOND column and node values in the \n"
" FOURTH column (index counting begins at 0)\n"
" -v and -iv options are now obsolete.\n"
" Use -input option instead.\n"
" -cmap MapName: (optional, default RGYBR20) \n"
" choose one of the standard colormaps available with SUMA:\n"
" RGYBR20, BGYR19, BW20, GRAY20, MATLAB_DEF_BYR64, \n"
" ROI64, ROI128\n"
" You can also use AFNI's default paned color maps:\n"
" The maps are labeled according to the number of \n"
" panes and their sign. Example: afni_p10\n"
" uses the positive 10-pane afni colormap.\n"
" afni_n10 is the negative counterpart.\n"
" These maps are meant to be used with\n"
" the options -apr and -anr listed below.\n"
" You can also load non-default AFNI colormaps\n"
" from .pal files (AFNI's colormap format); see option\n"
" -cmapdb below.\n"
" -cmapdb Palfile: read color maps from AFNI .pal file\n"
" In addition to the default paned AFNI colormaps, you\n"
" can load colormaps from a .pal file.\n"
" To access maps in the Palfile you must use the -cmap option\n"
" with the label formed by the name of the palette, its sign\n"
" and the number of panes. For example, to following palette:\n"
" ***PALETTES deco [13]\n"
" should be accessed with -cmap deco_n13\n"
" ***PALETTES deco [13+]\n"
" should be accessed with -cmap deco_p13\n"
" -cmapfile Mapfile: read color map from Mapfile.\n"
" Mapfile:1D formatted ascii file containing colormap.\n"
" each row defines a color in one of two ways:\n"
" R G B or\n"
" R G B f \n"
" where R, G, B specify the red, green and blue values, \n"
" between 0 and 1 and f specifies the fraction of the range\n"
" reached at this color. THINK values of right of AFNI colorbar.\n"
" The use of fractions (it is optional) would allow you to create\n"
" non-linear color maps where colors cover differing fractions of \n"
" the data range.\n"
" Sample colormap with positive range only (a la AFNI):\n"
" 0 0 1 1.0\n"
" 0 1 0 0.8\n"
" 1 0 0 0.6\n"
" 1 1 0 0.4\n"
" 0 1 1 0.2\n"
" Note the order in which the colors and fractions are specified.\n"
" The bottom color of the +ve colormap should be at the bottom of the\n"
" file and have the lowest +ve fraction. The fractions here define a\n"
" a linear map so they are not necessary but they illustrate the format\n"
" of the colormaps.\n"
" Comparable colormap with negative range included:\n"
" 0 0 1 1.0\n"
" 0 1 0 0.6\n"
" 1 0 0 0.2\n"
" 1 1 0 -0.2\n"
" 0 1 1 -0.6\n"
" The bottom color of the -ve colormap should have the \n"
" lowest -ve fraction. \n"
" You can use -1 -1 -1 for a color to indicate a no color\n"
" (like the 'none' color in AFNI). Values mapped to this\n"
" 'no color' will be masked as with the -msk option.\n"
" If your 1D color file has more than three or 4 columns,\n"
" you can use the [] convention adopted by AFNI programs\n"
" to select the columns you need.\n"
" -frf: (optional) first row in file is the first color.\n"
" As explained in the -cmapfile option above, the first \n"
" or bottom (indexed 0 )color of the colormap should be \n"
" at the bottom of the file. If the opposite is true, use\n"
" the -frf option to signal that.\n"
" This option is only useful with -cmapfile.\n"
" -clp/-perc_clp clp0 clp1: (optional, default no clipping)\n"
" clips values in IntVect. if -clp is used then values in vcol\n"
" < clp0 are clipped to clp0 and > clp1 are clipped to clp1\n"
" if -perc_clp is used them vcol is clipped to the values \n"
" corresponding to clp0 and clp1 percentile.\n"
" The -clp/-prec_clp options are mutually exclusive with -apr/-anr.\n"
" -apr range: (optional) clips the values in IntVect to [0 range].\n"
" This option allows range of colormap to be set as in AFNI, \n"
" with Positive colorbar (Pos selected).\n"
" This option is mutually exclusive with -clp/-perc_clp).\n"
" set range = 0 for autoranging.\n"
" If you use -apr and your colormap contains fractions, you\n"
" must use a positive range colormap.\n"
" -anr range: (optional) clips the values in IntVect to [-range range].\n"
" This option allows range of colormap to be set as in AFNI, \n"
" with Negative colorbar (Pos NOT selected).\n"
" This option is mutually exclusive with -clp/-perc_clp).\n"
" set range = 0 for autoranging.\n"
" If you use -anr and your colormap contains fractions, you\n"
" must use a negative range colormap.\n"
" -interp: (default) use color interpolation between colors in colormap\n"
" If a value is assigned between two colors on the colorbar,\n"
" it receives a color that is an interpolation between those two colors.\n"
" This is the default behaviour in SUMA and AFNI when using the continuous\n"
" colorscale. Mutually exclusive with -nointerp and -direct options.\n"
" -nointerp: (optional) turns off color interpolation within the colormap\n"
" Color assigniment is done a la AFNI when the paned colormaps are used.\n"
" Mutually exclusive with -interp and -direct options.\n"
" -direct: (optional) values (typecast to integers) are mapped directly\n"
" to index of color in color maps. Example: value 4 is assigned\n"
" to the 5th (index 4) color in the color map (same for values\n"
" 4.2 and 4.7). This mapping scheme is useful for ROI indexed type\n"
" data. Negative data values are set to 0 and values >= N_col \n"
" (the number of colors in the colormap) are set to N_col -1\n"
" -msk_zero: (optional) values that are 0 will get masked no matter\n"
" what colormaps or mapping schemes you are using. \n"
" AFNI masks all zero values by default.\n"
" -msk msk0 msk1: (optinal, default is no masking) \n"
" Values in vcol (BEFORE clipping is performed) \n"
" between [msk0 msk1] are masked by the masking color.\n"
" -msk_col R G B: (optional, default is 0.3 0.3 0.3) \n"
" Sets the color of masked voxels.\n"
" -nomsk_col: do not output nodes that got masked.\n"
" It does not make sense to use this option with\n"
" -msk_col.\n"
" -br BrightFact: (optional, default is 1) \n"
" Applies a brightness factor to the colors \n"
" of the colormap and the mask color.\n"
" -h or -help: displays this help message.\n"
"\n"
" The following options are for debugging and sanity checks.\n"
" -verb: (optional) verbose mode.\n"
" -showmap: (optional) print the colormap to the screen and quit.\n"
" This option is for debugging and sanity checks.\n"
" -showdb: (optional) print the colors and colormaps of AFNI\n"
" along with any loaded from the file Palfile.\n"
"%s"
"\n", s);
SUMA_free(s); s = NULL;
s = SUMA_New_Additions(0, 1); printf("%s\n", s);SUMA_free(s); s = NULL;
fprintf (SUMA_STDOUT, " Ziad S. Saad SSCC/NIMH/NIH saadz@mail.nih.gov \n"
" July 31/02 \n"
"\n");
SUMA_RETURNe;
}
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;
SUMA_STANDARD_CMAP MapType;
SUMA_COLOR_SCALED_VECT * SV;
SUMA_AFNI_COLORS *SAC=NULL;
SUMA_Boolean FromAFNI = NOPE;
int imap, isPmap, isNmap;
SUMA_Boolean LocalHead = NOPE;
#if 0
/* allocate space for CommonFields structure and initialize debug*/
SUMAg_CF = SUMA_Create_CommonFields ();
if (SUMAg_CF == NULL) {
fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_Create_CommonFields\n", FuncName);
exit(1);
}
SUMAg_CF->isGraphical = YUP;
/* fill the color maps */
SUMAg_CF->scm = SUMA_Build_Color_maps();
if (!SUMAg_CF->scm) {
SUMA_SL_Err("Failed to build color maps.\n");
exit(1);
}
SUMA_INOUT_NOTIFY_OFF;
#else
SUMA_STANDALONE_INIT;
SUMAg_CF->isGraphical = YUP;
#endif
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];
MapType = SUMA_CMAP_UNDEFINED;
if (strcmp(argv[kar], "RYGBR20") == 0) MapType = SUMA_CMAP_RGYBR20;
if (strcmp(argv[kar], "BW20") == 0) MapType = SUMA_CMAP_BW20;
if (strcmp(argv[kar], "GRAY02") == 0) MapType = SUMA_CMAP_GRAY02;
if (strcmp(argv[kar], "flpGRAY02") == 0) MapType = SUMA_CMAP_flpGRAY02;
if (strcmp(argv[kar], "GRAY20") == 0) MapType = SUMA_CMAP_GRAY20;
if (strcmp(argv[kar], "BGYR19") == 0) MapType = SUMA_CMAP_BGYR19;
if (strcmp(argv[kar], "MATLAB_DEF_BYR64") == 0) MapType = SUMA_CMAP_MATLAB_DEF_BYR64;
if (strcmp(argv[kar], "BGYR64") == 0) MapType = SUMA_CMAP_BGYR64;
if (strcmp(argv[kar], "ROI64") == 0) MapType = SUMA_CMAP_ROI64;
if (strcmp(argv[kar], "ROI128") == 0) MapType = SUMA_CMAP_ROI128;
if (strcmp(argv[kar], "ROI256") == 0) MapType = SUMA_CMAP_ROI256;
if (MapType == SUMA_CMAP_UNDEFINED) {
/* hold till later, could be a map from SAC */
/*
fprintf (SUMA_STDERR, "Color map type not recognized.\n");
exit (1);*/
}
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 0
/* ++ Feb 20, Now inside SUMAg_CF */
/* Load AFNI default color maps */
SAC = SUMA_Get_AFNI_Default_Color_Maps ();
if (!SAC) {
fprintf (SUMA_STDERR,"Error %s: Failed to obtain AFNI's standard colors.\n", FuncName);
exit(1);
} else {
/* are there database files to read */
if (dbfile) {
SUMA_LH("Now trying to read db file");
if (SUMA_AFNI_Extract_Colors ( dbfile, SAC ) < 0) {
fprintf (SUMA_STDERR,"Error %s: Failed to read %s colormap file.\n", FuncName, dbfile);
exit(1);
}
}
}
#else
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) {
fprintf (SUMA_STDERR,"Error %s: Failed to read %s colormap file.\n", FuncName, dbfile);
exit(1);
}
}
#endif
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) {
fprintf (SUMA_STDERR,"Error %s: Could not load colormap.\n", FuncName);
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 (MapType != SUMA_CMAP_UNDEFINED) {
CM = SUMA_GetStandardMap (MapType);
if (CM) {
/* good, sign it and out you go */
CM->Sgn = Sgn;
} else {
fprintf (SUMA_STDERR,"Error %s: Could not get standard colormap.\n", FuncName);
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) {
fprintf (SUMA_STDERR,"Error %s: Could not find colormap %s.\n", FuncName, 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 };
SUMA_SL_Note("JUST FOR TESTING");
SO = SUMA_Cmap_To_SO (CM, orig, topright, 2);
SUMA_SL_Note("Cleanup");
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);
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\nor 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) 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);
}
syntax highlighted by Code2HTML, v. 0.9.1