/*************************************************************************\ * Copyright (c) 2002 The University of Chicago, as Operator of Argonne * National Laboratory. * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * This file is distributed subject to a Software License Agreement found * in the file LICENSE that is included with this distribution. \*************************************************************************/ /* program: sddscontour * purpose: do contour plotting of SDDS data * * Michael Borland, 1993 $Log: sddscontour.c,v $ Revision 1.67 2011/05/05 19:06:13 shang added -xaxis option, and made -yaxis option to work for all plot modes, and added edit/format feature to topline. Revision 1.66 2011/03/22 15:51:37 shang fixed a typo. Revision 1.65 2011/03/22 15:43:22 shang added -drawline option. Revision 1.64 2011/03/04 15:15:33 soliday Added the -xyz plotting option. With this you can now supply the x, y and z columns. The x and y columns must define a grid. Revision 1.63 2009/04/30 21:14:30 shang now it is able to get the units of varible1 and variable2 from the parameeters and plot them along with the variable1 and variable2 names as the x/y labels Revision 1.62 2009/04/30 15:08:37 shang modified to plot no title when "-title=" provided Revision 1.61 2008/11/05 16:16:10 shang fixed 3 bugs: 1)filename was plotted on the topline when "-topline=" is given, nothing should be plotted instead since topline is emptystring, fixed by adding checking the string length of topline; 2)the swapxy did not work with -xrange and -yrange for even number plots, fixed by swaping the x/y range parameters after each plot; 3)the scale option did not work properly with -xrange, -yrange and -swapxy option together, fixed by restoring the original scale after each plot. Revision 1.60 2008/07/01 19:03:58 shang added -yaxis option to plot the y axis label by provided scale and offset for -columnMatch plot Revision 1.59 2008/03/19 21:58:10 shang changed to use "filename" for ploting the file name to topline and/or title. Revision 1.58 2008/03/19 21:04:22 shang made the print labels accept non-string parameter and added capability of printing file name or edited file name to the topline or title if request as -topline=file[,edit=] or -title=file[,edit=]. Revision 1.57 2008/02/18 21:53:59 soliday Fixed issue with writing multiple PNG files without breaking PNG output when the layout option is set. Revision 1.56 2006/10/19 21:48:47 soliday Fixed issue with tsetFlags Revision 1.55 2006/10/19 17:55:40 soliday Updated to work with linux-x86_64. Revision 1.54 2006/10/18 15:37:43 shang add -nocolorbar option for not plotting colro bar. Revision 1.53 2006/10/02 20:28:05 jiaox Added strlen check for p2 p3 p4 to checkLabelParameters(). Those are missing in last revision. Revision 1.52 2006/10/02 20:00:07 jiaox Modified to pre-sort the parameters and columns for -waterfall options to make sure the plot is correct if the dataset are not sorted. However if the parameters/column-values are not evenly spaced the plot may not be appropriate since the axis labels are always evenly spaced. ( Should throw a warning if so ?). Also fixed a bug that cause a segmentation fault for png output. Hairong fixed another bug that caused "array bounds read" for checkparameters. Revision 1.51 2006/09/06 20:00:39 shang added -xrange and -yrang option for -columnmatch such that the xlabel and ylabel can be numerically labeled by the provided xrange and yrange. Revision 1.50 2006/08/21 21:30:10 soliday Updated to get it to build on WIN32. Revision 1.49 2006/05/22 22:49:44 jiaox Added gray keyword to -shade option. Revision 1.48 2005/11/07 22:20:55 soliday Updated to remove compiler warnings on Linux. Revision 1.47 2005/11/04 22:46:39 soliday Updated code to be compiled by a 64 bit processor. Revision 1.46 2005/09/19 20:43:09 shang fixed the problem of plotting multiple layout for columnMatch option when the values of y-axis are much less than those of x-axis. Revision 1.45 2005/04/26 22:24:36 shang made swapxy work for matchColumn option and rpntransform work; added scale feature to xlabel and ylabel option to be able to change the x/y label size; added plotting enumerated x tick-label and plotting the x/y label with enumerated tick-labels. Revision 1.44 2005/04/25 20:56:36 soliday Updated to work with the updated make_intensity_bar procedure when using less than 100 colors. Revision 1.43 2005/03/07 22:51:26 shang added the ability to plot the color bar name Revision 1.42 2005/01/31 15:21:57 shang added -waterfall option to plot multi-page data in one plot Revision 1.41 2005/01/13 21:43:33 soliday Made the rpn function calls consistent with the updated rpn library. Revision 1.40 2004/11/16 19:31:25 soliday Added the ability to pipe an SDDS file into sddscontour. Revision 1.39 2004/09/14 19:02:01 soliday Fixed problem when not using -shade. Updated scan args section so that free_scanargs can be used. Added the -ticksettings=xtime option. Revision 1.38 2004/08/02 15:24:49 borland Can now handle files in which the contents of Variable1Name and Variable2Name change from page to page. Revision 1.37 2003/08/16 19:38:55 borland More fixes for the frame_end() business. Frame ending is only done in the main routine now. Removed special frame_end code for the columnMatch mode, since it shouldn't be needed now. Revision 1.36 2003/08/16 19:24:22 borland Renamed the variables ix and iy in main() so that there is no confusion with variables defined inside some if statements. Fixed bug in use of frame_end() which resulted in segmentation fault when plotting PNG with layout. Revision 1.35 2003/06/02 21:37:43 soliday Added a function to add parentheses around the string before passing it to if2pf. Revision 1.34 2002/12/11 21:23:44 borland Now plots shapes for -shade mode. Revision 1.33 2002/12/04 17:55:20 soliday Fixed the shape option when used with the contour option. Revision 1.32 2002/12/03 20:09:08 borland Added optional linetype for -shapes option. Revision 1.31 2002/12/03 19:05:43 borland Fixed problem with contour plotting due to uninitialized values for min_level and max_level. Revision 1.30 2002/08/14 17:35:28 soliday Added Open License Revision 1.29 2002/01/10 13:45:01 borland Added -thickness option. Revision 1.28 2002/01/09 03:37:09 borland Added support for device arguments for devices other than motif. Revision 1.27 2001/08/29 20:26:34 soliday Added the -swaparray option. Revision 1.26 2001/08/29 16:32:09 soliday Added the ability to plot SDDS arrays. Revision 1.25 2001/06/04 20:21:14 soliday Added the -layout option. Revision 1.24 2001/05/28 22:32:14 borland Replacing last changes as they were actually duplicating an existing feature. Revision 1.22 2001/04/10 20:42:57 soliday Added the ability to convert algebraic equations to rpn equations. Revision 1.21 2001/01/10 19:34:34 soliday Standardized usage message. Revision 1.20 2001/01/09 17:26:59 borland Added -mapShade option to sddscontour. Revision 1.19 2000/11/13 22:03:51 soliday Ticks are now used by default. Revision 1.18 2000/09/20 13:05:48 borland The fixedRange option now works properly. Revision 1.17 2000/06/15 16:53:24 borland No longer does ftell() on files unless it has to. Prevents (in a kludgey way) core dumps on .gz input files. Revision 1.16 2000/05/11 20:19:29 soliday Added extra argument to plot_lines. Revision 1.15 2000/04/10 19:01:06 borland -shapes option now works again, and uses SDDS files. Revision 1.14 1999/09/28 15:49:59 borland Added a test to avoid going over the end of a string array. Revision 1.13 1999/09/14 18:35:04 soliday Added fftpackC.h include statement Revision 1.12 1999/07/23 15:53:29 soliday Added WIN32 support Revision 1.11 1999/06/03 20:42:59 soliday Removed compiler warnings under Linux. Revision 1.10 1998/10/02 17:31:27 borland Added -v1v2preferred option to sddscontour so that it can be told to use the Variable1Name and Variable2Name parameters to figure out the image rather than NumberOfRows and NumberOfColumns. Revision 1.9 1998/08/25 14:16:40 borland Added code to flip the x dimension for columnMatch mode if the independent data is in decreasing order. Revision 1.8 1998/08/14 14:19:34 borland Compatible with new version of graphics library (for sddsplot upgrade). Removed most references to SDDS structure internals and replaced with calls to SDDS library routines. Revision 1.7 1997/05/29 16:08:55 borland Fixed x11 args parsing problem (conditional compilation statements too restrictive). * Revision 1.6 1996/03/27 14:46:34 borland * Fixed option parsing problem by switching to scanItemList(). * * Revision 1.5 1995/11/13 15:59:37 borland * Added long cast to strlen() in comparison to satisfy Solaris compiler. * * Revision 1.4 1995/10/31 02:40:05 borland * Added -ystrings option; it superseeds the -yeditstrings option (which is * still there, but not in the usage message). Added capabilities to the * enumerated scale routine. * * Revision 1.3 1995/10/17 05:59:42 borland * Added -editystrings option to sddscontour. * Added some set_linetype() calls to shade_grid.c routines because last color * of color bar was "sticking" and getting applied to labels; I think this is * actually a bug in the X11 routines. * * Revision 1.2 1995/09/05 21:08:55 saunders * First test release of the SDDS1.5 package. * */ #include "mdb.h" #include "SDDS.h" #include "scan.h" #include "graph.h" #include "matlib.h" #include "contour.h" #include "rpn.h" #include "fftpackC.h" #if defined(_WIN32) #include #define sleep(sec) Sleep(sec * 1000) #else #include #endif #define SET_QUANTITY 0 #define SET_SWAP_XY 1 #define SET_SHADE 2 #define SET_CONTOURS 3 #define SET_EQUATION 4 #define SET_SCALES 5 #define SET_LABEL_CONTOURS 6 #define SET_DEVICE 7 #define SET_OUTPUT 8 #define SET_INTERPOLATE 9 #define SET_FILTER 10 #define SET_SHAPES 11 #define SET_EQUAL_ASPECT 12 #define SET_XLABEL 13 #define SET_YLABEL 14 #define SET_TITLE 15 #define SET_TOPLINE 16 #define SET_TOPTITLE 17 #define SET_NO_LABELS 18 #define SET_NO_BORDER 19 #define SET_NO_SCALES 20 #define SET_DATE_STAMP 21 #define SET_VERBOSITY 22 #define SET_RPN_DEFNS_FILES 23 #define SET_RPN_EXPRESSIONS 24 #define SET_RPN_TRANSFORM 25 #define SET_FIXED_RANGE 26 #define SET_COLUMNMATCH 27 #define SET_LOGSCALE 28 #define SET_DELTAS 29 #define SET_YSTRINGS 30 #define SET_EDITYSTRINGS 31 #define SET_PREFERV1V2PARAMS 32 #define SET_MAPSHADE 33 #define SET_LAYOUT 34 #define SET_ARRAY 35 #define SET_SWAPARRAY 36 #define SET_THICKNESS 37 #define SET_TICKSETTINGS 38 #define SET_PIPE 39 #define SET_WATERFALL 40 #define SET_YRANGE 41 #define SET_XRANGE 42 #define SET_NO_COLOR_BAR 43 #define SET_YAXIS 44 #define SET_XAXIS 45 #define SET_XYZ 46 #define SET_DRAWLINE 47 #define OPTIONS 48 static char *option[OPTIONS] = { "quantity", "swapxy", "shade", "contours", "equation", "scales", "labelcontours", "device", "output", "interpolate", "filter", "shapes", "equalaspect", "xlabel", "ylabel", "title", "topline", "toptitle", "nolabels", "noborder", "noscales", "datestamp", "verbosity", "rpndefinitionsfiles", "rpnexpressions", "rpntransform", "fixedrange", "columnmatch", "logscale", "deltas", "ystrings", "yeditstrings", "v1v2preferred", "mapshade", "layout", "array", "swaparray", "thickness", "ticksettings", "pipe", "waterfall", "yrange", "xrange", "nocolorbar", "yaxis", "xaxis", "xyz", "drawline", } ; char *USAGE = "sddscontour [-pipe] []\n\ [{-quantity= | -equation=[,algebraic] |\n\ -waterfall=parameter=,independentColumn=,colorColumn=[,scroll=vertical|horizontal] | \n\ -columnmatch=, [-deltas[={fractional|normalize}]]}]]\n\ [-array=[,,]] [-swaparray]\n\ [-xyz=,,]\n\ [-rpndefinitionsfiles=[,...]]\n\ [-rpnexpressions=[,...][,algebraic]]\n\ [-rpntransform=[,algebraic]] [-fixedrange]\n\ [[-shade=[,,,gray]] | [-contours=[,,]]] \n\ [-mapShade=,] \n\ [-scales=,,,] [-v1v2Preferred] \n\ [-labelcontours=interval[,offset]] [-logscale[=]]\n\ [-device=[,]] [-output=]\n\ [-interpolate=,[,{floor|ceiling|antiripple}]] [-filter=,]\n\ [-shapes=,,] [-swapxy] [-equalaspect[={-1,1}]]\n\ [-xlabel=|@[,scale=][,edit=]] [-ylabel=|@[,scale=][,edit=]] \n\ [-title=|@|filename[,edit=]]\n\ [-topline=|@|filename[,edit=][,format=string]] [-toptitle] [-nolabels]\n\ [-yrange=minimum=|@,maximum=|@] \n\ [-xrange=minimum=|@,maximum=|@] \n\ [-ystrings=[edit=][,sparse=][,scale=]]\n\ [-noborder] [-noscales] [-datestamp] [-verbosity[=]]\n\ [-layout=,] [-thickness=]\n\ [-ticksettings=[{xy}time]] [-nocolorbar] [-yaxis=scaleValue=|scaleParameter=[,offsetValue=|offsetParameter=] \n\ [-xaxis=scaleValue=|scaleParameter=[,offsetValue=|offsetParameter=] \n\ [-drawLine={x0value= | p0value= | x0parameter= | p0parameter=},\n\ {x1value= | p1value= | x1parameter= | p1parameter=},\n\ {y0value= | q0value= | y0parameter= | q0parameter=},\n\ {y1value= | q1value= | y1parameter= | q1parameter=}\n\ [,linetype=][,thickness=][,clip]\n\ Program by Michael Borland. (This is version 3, January 2002.)\n"; static char *drawlineUsage = "-drawLine=\n\ {x0value= | p0value= | x0parameter= | p0parameter=}, \n\ {x1value= | p1value= | x1parameter= | p1parameter=}, \n\ {y0value= | q0value= | y0parameter= | q0parameter=}, \n\ {y1value= | q1value= | y1parameter= | q1parameter=} \n\ [,linetype=][,thickness=][,clip]\n"; #define DRAW_LINE_LINETYPEGIVEN 0x000001U #define DRAW_LINE_CLIPGIVEN 0x000002U #define DRAW_LINE_X0GIVEN 0x000040U #define DRAW_LINE_Y0GIVEN 0x000080U #define DRAW_LINE_P0GIVEN 0x000100U #define DRAW_LINE_Q0GIVEN 0x000200U #define DRAW_LINE_X1GIVEN 0x000400U #define DRAW_LINE_Y1GIVEN 0x000800U #define DRAW_LINE_P1GIVEN 0x001000U #define DRAW_LINE_Q1GIVEN 0x002000U #define DRAW_LINE_X0PARAM 0x004000U #define DRAW_LINE_Y0PARAM 0x008000U #define DRAW_LINE_P0PARAM 0x010000U #define DRAW_LINE_Q0PARAM 0x020000U #define DRAW_LINE_X1PARAM 0x040000U #define DRAW_LINE_Y1PARAM 0x080000U #define DRAW_LINE_P1PARAM 0x100000U #define DRAW_LINE_Q1PARAM 0x200000U typedef struct { /* The order of the data in this special section must not be changed */ double x0, y0, p0, q0; double x1, y1, p1, q1; char *x0Param, *y0Param, *p0Param, *q0Param; char *x1Param, *y1Param, *p1Param, *q1Param; /* end special section */ int32_t linetype; int32_t linethickness; unsigned long flags; } DRAW_LINE_SPEC; double *fill_levels(double **level, double min, double max, long levels); void getDimensionParameters(SDDS_TABLE *SDDS_table, char *name_of_name, char **variable, char **variableUnits, double *minimum, double *interval, int32_t *number); double **window_2d_array(double **data_value, double *xmin, double *xmax, double *ymin, double *ymax, double dx, double dy, int32_t *nx, int32_t *ny, double *limit); void PlotShapesData(SHAPE_DATA *shape, long shapes, double xmin, double xmax, double ymin, double ymax); char *getParameterLabel(SDDS_TABLE *SDDS_table, char *parameter_name, char *edit, char *format); void checkParameter(SDDS_TABLE *SDDS_table, char *parameter_name); void checkLabelParameters(SDDS_TABLE *SDDS_table, char *p1, char *p2, char *p3, char *p4); void freeParameterLabel(char *users_label, char *label); void make_enumerated_yscale(char **label, double *yposition, long labels, char *editCommand, long interval, double scale, long thickness, char *ylabel, double ylableScale); void make_enumerated_xscale(char **label, double *xposition, long labels, char *editCommand, long interval, double scale, long thickness, char *xlabel, double xlabelScale); long plot_contour(double **data_value, long nx, long ny, long verbosity, double xmin, double xmax, double ymin, double ymax, double dx, double dy, double *xintervals, double *yintervals, char *device, long *frameEnded, char *title, char *xlabel, char *ylabel, char *topline, double min_level, double max_level, long levels, double hue0, double hue1, long *layout, long *ixl, long *iyl, long thickness, unsigned long long tsetFlags, SHAPE_DATA *shape, long shapes, int *pen, long *flags, long pause_interval, long columnmatches, char **columnname, long columns, char *yEditCommand, long ySparseInterval, double yScale, long contour_label_interval, long contour_label_offset, long do_shade, long waterfall, char *colorName, char *colorUnits, long swap_xy, double xlabelScale, double ylabelScale, long yRangeProvided, long xRangeProvided, DRAW_LINE_SPEC *drawLineSpec, long drawlines); long get_plot_labels(SDDS_DATASET *SDDS_table, char *indeptcolumn, char **columnname, long columnnames, char *allmatches, char *waterfall_par, char *users_xlabel, char *users_ylabel, char *users_title, char **xlabel0, char **ylabel0, char **title0, long deltas, long xRangeProvide); long process_data_values(double ***data_value, long nx, long ny, long deltas); void make_waterfall_yscale(long interval, double scale, long ny, double min_y, double max_y, double dy, long thickness); void process_data(double ***data_value, int32_t *nx, int32_t *ny, double *xmin, double *xmax, double *ymin, double *ymax, double *dx, double *dy, double *limit, long logscale, double logfloor, long nx_interp, long ny_interp, long x_lowpass, long y_lowpass, long interp_flags, char **xyzArray, char **xyzColumn, long verbosity); int X11_args(int argc, char **argv); char *addOuterParentheses(char *arg); void jxyplot_string(double *x, double *y, char *s, char xmode, char ymode); char * rearrange_by_index(char *data,long *index,long element_size,long num); long drawline_AP(DRAW_LINE_SPEC **drawLineSpec, long *drawlines, char **item, long items); void determine_drawline(DRAW_LINE_SPEC *drawLineSpec, long drawlines, SDDS_TABLE *table); void draw_lines(DRAW_LINE_SPEC *drawLineSpec, long drawlines, long linetypeDefault, double *limit); void get_xyaxis_value(char *xscalePar, char *xoffsetPar, char *yscalPar, char *yoffsetPar, SDDS_DATASET *SDDS_table, double *xscaleValue, double *xoffsetValue, double *yscaleValue, double *yoffetValue, char **users_xlabel, char **users_ylabel); #ifndef COMPILE_AS_SUBROUTINE FILE *outfile; #endif #ifdef VAX_VMS #define DEFAULT_DEVICE "regis" #include #endif #if defined(UNIX) || defined(_WIN32) #define DEFAULT_DEVICE "motif" #endif #define SHADE_GRAY 0 #define SHADE_OPTIONS 1 static char *shadeOptions[SHADE_OPTIONS] = {"gray"}; #define WATERFALL_HORIZONTAL 0 #define WATERFALL_VERTICAL 1 #define WATERFALL_OPTIONS 2 static char *waterfallScroll[WATERFALL_OPTIONS] = { "horizontal", "vertical", }; #define DELTAS_PLAIN 0 #define DELTAS_NORMALIZED 1 #define DELTAS_FRACTIONAL 2 #define DELTAS_OPTIONS 3 static char *deltasOption[DELTAS_OPTIONS] = { "plain", "normalized", "fractional", } ; #define SPECTRUM_TRUE " -spectrum true" void ReadShapeData(SHAPE_DATA *shape, long shapes, long swapXY); #ifdef COMPILE_AS_SUBROUTINE #include "draw.h" void sddscontour_main(char *input_line) #else int main(int argc, char **argv) #endif { #ifdef COMPILE_AS_SUBROUTINE int argc; char **argv; #endif long i, j, i_arg, preferv1v2Parameters, thickness, yaxisScaleProvided=0, xaxisScaleProvided=0; double yaxisOffset=0, xaxisOffset=0; SCANNED_ARG *s_arg; SDDS_TABLE SDDS_table; char s[SDDS_MAXLINE]; char *quantity, *variable1, *variable2, **columnmatch, *allmatches, *indepcolumn, *yaxisScalePar=NULL, *yaxisOffsetPar=NULL,*xaxisScalePar=NULL, *xaxisOffsetPar=NULL ; char *waterfall_par, *waterfall_indeptcol, *waterfall_colorcol, *waterfall_scroll; char *variable1Units, *variable2Units, *variable1name, *variable2name; long columnmatches = 0, variable1Index, variable2Index; char *inputfile; char *users_title, *users_topline, *users_xlabel, *users_ylabel, *topline_editcommand=NULL, *topline_formatcommand=NULL, *title_editcommand=NULL; char *title, *topline, *xlabel, *ylabel=NULL, *xlabel_editcommand=NULL, *ylabel_editcommand=NULL; double **data_value, *waterfall_parValue, ylabelScale, xlabelScale; int32_t nx, ny; long swap_xy, swap_array, waterfall; double dx, dy, xmin, xmax, ymin, ymax, yaxisScale=0, xaxisScale=0, xmin0, xmax0, ymin0, ymax0; char *ymaxPar, *yminPar, *xmaxPar, *xminPar, *maxPar, *minPar; double *xintervals, *yintervals; long levels, label_contour_interval, contour_label_offset; long do_shade, interp_flags = 0; double max_level=0, min_level=0, *level, hue0, hue1; char *device, *output; long x_lowpass, y_lowpass, nx_interp, ny_interp; long pause_interval = 1; double orig_limit[4] = {0,0,0,0}; static char bufferstr[SDDS_MAXLINE]; /* double limit[4];*/ long flags, verbosity, contour_label_interval=0; SHAPE_DATA *shape; long shapes; int pen[4]={0,0,0,0}; char **rpn_definitions_file, **rpn_expression, *rpn_equation, *rpn_transform; long mem1, mem2; long rpn_expressions, rpn_definitions_files, deltas, vertical_waterfall; static char *equdf_name = "SCEQ.UDF"; static char *trudf_name = "SCTR.UDF"; long fixed_range, readstatus, logscale; int32_t ySparseInterval; int32_t columns=0; char **columnname, *devargs, *buffer=NULL, *yEditCommand; double logfloor, yScale; unsigned long dummyFlags; unsigned long long tsetFlags=0; long rowNumberType, columnNumberType, yRangeProvided, xRangeProvided; char pfix[IFPF_BUF_SIZE]; long layout[2]; long ixl=0, iyl=0, frameEnded=0; int xTimeMode=0; char *colorName=NULL, *colorUnits=NULL; char *xyzArray[3], *ptr2; char *xyzColumn[3]; long pipe=0; char **shadelist; long shade_items, drawlines=0; DRAW_LINE_SPEC *drawLineSpec=NULL; xlabelScale=ylabelScale=1.0; rpn_definitions_file = rpn_expression = NULL; rpn_equation = rpn_transform = NULL; rpn_expressions = rpn_definitions_files = 0; quantity = variable1 = variable2 = NULL; waterfall_parValue=NULL; waterfall=0; waterfall_par=waterfall_indeptcol=waterfall_colorcol=waterfall_scroll=NULL; variable1Units = variable2Units = variable1name = variable2name = NULL; inputfile = users_title = users_topline = users_xlabel = users_ylabel = NULL; data_value = NULL; level = NULL; shape = NULL; x_lowpass = y_lowpass = nx_interp = ny_interp = 0; levels = shapes = label_contour_interval = contour_label_offset = do_shade = 0; flags = verbosity = swap_xy = swap_array = fixed_range = 0; columnmatch = NULL; indepcolumn = NULL; logscale = logfloor = 0; deltas = -1; vertical_waterfall=0; columnname = NULL; yEditCommand = NULL; ySparseInterval = 1; yScale = 1; preferv1v2Parameters = 0; hue0 = 0; hue1 = 1; layout[0] = layout[1] = 0; xyzArray[0] = xyzArray[1] = xyzArray[2] = NULL; xyzColumn[0] = xyzColumn[1] = xyzColumn[2] = NULL; xintervals = yintervals = NULL; thickness = 1; dx=dy=xmin=ymin=xmax=ymax=0; yRangeProvided = xRangeProvided = 0; ymaxPar = yminPar = xmaxPar = xminPar = maxPar = minPar = NULL; #ifdef COMPILE_AS_SUBROUTINE make_argv(&argc, &argv, input_line); flags = NO_GREND + DEVICE_DEFINED; #else outfile = stdout; if ((device=getenv("MPL_DEVICE"))) { cp_str(&device, device); #ifdef VAX_VMS str_tolower(device); #endif } #endif if (argc<2) bomb(NULL, USAGE); #ifndef COMPILE_AS_SUBROUTINE #if defined(UNIX) || defined(_WIN32) if (1) { int n; n = X11_args(argc, argv); argc -= n; argv += n; } #endif #endif argc = scanargsg(&s_arg, argc, argv); for (i_arg=1; i_arg2) { gs_device_arguments(s_arg[i_arg].list[2], 0); /* for backward compatibility */ setDeviceArgv(s_arg[i_arg].list+2, s_arg[i_arg].n_items-2); } break; #ifndef COMPILE_AS_SUBROUTINE case SET_OUTPUT: if (s_arg[i_arg].n_items!=2) { fprintf(stderr, "Error (sddscontour): couldn't scan output filename\n"); return(1); } if (!SDDS_CopyString(&output,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): couldn't scan output filename\n"); return(1); } outfile = fopen_e(output, "w", FOPEN_INFORM_OF_OPEN); break; #endif case SET_SCALES: if (s_arg[i_arg].n_items!=5 || sscanf(s_arg[i_arg].list[1], "%lf", &orig_limit[0])!=1 || sscanf(s_arg[i_arg].list[2], "%lf", &orig_limit[1])!=1 || sscanf(s_arg[i_arg].list[3], "%lf", &orig_limit[2])!=1 || sscanf(s_arg[i_arg].list[4], "%lf", &orig_limit[3])!=1 ) { fprintf(stderr, "Error (sddscontour): incorrect -scales syntax\n"); return(1); } break; case SET_LABEL_CONTOURS: if ((s_arg[i_arg].n_items!=2 && s_arg[i_arg].n_items!=3) || sscanf(s_arg[i_arg].list[1], "%ld", &contour_label_interval)!=1) { fprintf(stderr, "Error (sddscontour): incorrect -label_contour syntax\n"); return(1); } contour_label_offset = 0; if (s_arg[i_arg].n_items==3 && (sscanf(s_arg[i_arg].list[2], "%ld", &contour_label_offset)!=1 || contour_label_offset<0)) { fprintf(stderr, "Error (sddscontour): incorrect -label_contour syntax\n"); return(1); } break; case SET_CONTOURS: if (s_arg[i_arg].n_items==2) { if (sscanf(s_arg[i_arg].list[1], "%ld", &levels)!=1) { fprintf(stderr, "Error (sddscontour): incorrect -contours syntax (invalid number of levels)\n"); return(1); } } else if (s_arg[i_arg].n_items==4) { if (sscanf(s_arg[i_arg].list[1], "%ld", &levels)!=1 || sscanf(s_arg[i_arg].list[2], "%lf", &min_level)!=1 || sscanf(s_arg[i_arg].list[3], "%lf", &max_level)!=1 || min_level>=max_level) { fprintf(stderr, "Error (sddscontour): incorrect -contours syntax\n"); return(1); } } else { fprintf(stderr, "Error (sddscontour): incorrect -contours syntax (wrong number of items)\n"); return(1); } break; case SET_SHAPES: if (s_arg[i_arg].n_items!=4 && s_arg[i_arg].n_items!=5) { fprintf(stderr, "Error (sddscontour): incorrect -shapes syntax--give filename(s)\n"); return(1); } shape = trealloc(shape, sizeof(*shape)*(s_arg[i_arg].n_items-1+shapes)); if (!SDDS_CopyString(&(shape[shapes].filename),s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): incorrect -shapes syntax--give filename(s)\n"); return(1); } if (!SDDS_CopyString(&(shape[shapes].xColumn),s_arg[i_arg].list[2])) { fprintf(stderr, "Error (sddscontour): incorrect -shapes syntax\n"); return(1); } if (!SDDS_CopyString(&(shape[shapes].yColumn),s_arg[i_arg].list[3])) { fprintf(stderr, "Error (sddscontour): incorrect -shapes syntax\n"); return(1); } if (s_arg[i_arg].n_items==5) { if (sscanf(s_arg[i_arg].list[4], "%ld", &shape[shapes].lineType)!=1) { fprintf(stderr, "Error (sddscontour): invalid -shapes sytnax\n"); return(1); } } else shape[shapes].lineType = 0; if (!fexists(shape[shapes].filename)) { fprintf(stderr, "Error (sddscontour): invalid -shapes syntax---file not found\n"); return(1); } shapes++; break; case SET_EQUAL_ASPECT: switch (s_arg[i_arg].n_items) { case 1: flags |= EQUAL_ASPECT1; break; case 2: if (sscanf(s_arg[i_arg].list[1], "%ld", &i)!=1) { fprintf(stderr, "Error (sddscontour): incorrect -equal_aspect syntax\n"); return(1); } if (i==1) flags |= EQUAL_ASPECT1; else if (i== -1) flags |= EQUAL_ASPECT_1; else { fprintf(stderr, "Error (sddscontour): incorrect -equal_aspect syntax\n"); return(1); } break; default: fprintf(stderr, "Error (sddscontour): incorrect -equal_aspect syntax\n"); return(1); } break; case SET_XLABEL: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): incorrect -xlabel syntax\n"); return(1); } if (!SDDS_CopyString(&users_xlabel,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): incorrect -xlabel syntax\n"); return(1); } s_arg[i_arg].n_items -=2; if (!scanItemList(&dummyFlags, s_arg[i_arg].list+2, &s_arg[i_arg].n_items, 0, "scale", SDDS_DOUBLE, &xlabelScale, 1, 0, "edit", SDDS_STRING, &xlabel_editcommand, 1, 0, NULL) || xlabelScale<=0) { fprintf(stderr, "Error (sddscontour): invalid -xlabel syntax/values\n"); return(1); } s_arg[i_arg].n_items +=2; break; case SET_YLABEL: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): incorrect -ylabel syntax\n"); return(1); } if (!SDDS_CopyString(&users_ylabel,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): incorrect -ylabel syntax\n"); return(1); } s_arg[i_arg].n_items -=2; if (!scanItemList(&dummyFlags, s_arg[i_arg].list+2, &s_arg[i_arg].n_items, 0, "scale", SDDS_DOUBLE, &ylabelScale, 1, 0, "edit", SDDS_STRING, &ylabel_editcommand, 1, 0, NULL) || ylabelScale<=0) { fprintf(stderr, "Error (sddscontour): invalid -ylabel syntax/values\n"); return(1); } s_arg[i_arg].n_items +=2; break; case SET_TITLE: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): incorrect -title syntax\n"); return(1); } if (!SDDS_CopyString(&users_title,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): incorrect -title syntax\n"); return(1); } if (s_arg[i_arg].n_items>2) { s_arg[i_arg].n_items -=2; if (!scanItemList(&dummyFlags, s_arg[i_arg].list+2, &s_arg[i_arg].n_items, 0, "edit", SDDS_STRING, &title_editcommand, 1, 0, NULL)) { fprintf(stderr, "Error (sddscontour): invalid -title syntax/values\n"); return(1); } s_arg[i_arg].n_items +=2; } break; case SET_TOPLINE: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): incorrect -topline syntax\n"); return(1); } if (!SDDS_CopyString(&users_topline,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): incorrect -topline syntax\n"); return(1); } if (s_arg[i_arg].n_items>2) { s_arg[i_arg].n_items -=2; if (!scanItemList(&dummyFlags, s_arg[i_arg].list+2, &s_arg[i_arg].n_items, 0, "edit", SDDS_STRING, &topline_editcommand, 1, 0, "format", SDDS_STRING, &topline_formatcommand, 1, 0, NULL)) { fprintf(stderr, "Error (sddscontour): invalid -topline syntax/values\n"); return(1); } s_arg[i_arg].n_items +=2; } break; case SET_NO_BORDER: flags |= NO_BORDER; break; case SET_NO_COLOR_BAR: flags |= NO_COLOR_BAR; break; case SET_NO_SCALES: flags |= NO_SCALES; break; case SET_NO_LABELS: flags |= NO_LABELS; break; case SET_DATE_STAMP: flags |= DATE_STAMP; break; case SET_MAPSHADE: if (s_arg[i_arg].n_items!=3) { fprintf(stderr, "Error (sddscontour): incorrect -mapshade syntax (wrong number of items)\n"); return(1); } if (sscanf(s_arg[i_arg].list[1], "%lf", &hue0)!=1 || sscanf(s_arg[i_arg].list[2], "%lf", &hue1)!=1 || hue0<0 || hue1<0 || hue0>1 || hue1>1 || hue0==hue1) { fprintf(stderr, "Error (sddscontour): -incorrect -mapshade syntax. Hues must be [0, 1].\n"); return(1); } break; case SET_LAYOUT: if (s_arg[i_arg].n_items!=3) { fprintf(stderr, "Error (sddscontour): invalid -layout syntax\n"); return(1); } if (sscanf(s_arg[i_arg].list[1], "%ld", &layout[0])!=1 || sscanf(s_arg[i_arg].list[2], "%ld", &layout[1])!=1 || layout[0]<=0 || layout[1]<=0) { fprintf(stderr, "Error (sddscontour): invalid -layout syntax\n"); return(1); } break; case SET_SHADE: do_shade = 1; levels = 100; min_level = max_level = 0; shadelist = tmalloc(sizeof(*shadelist)*s_arg[i_arg].n_items); shade_items=0; for(i=0;i=0) { do_shade=2; } else { shadelist[shade_items]=s_arg[i_arg].list[i]; shade_items++; } } if (shade_items==3 || shade_items>4) { fprintf(stderr, "Error (sddscontour): incorrect -shade syntax (wrong number of items)\n"); return(1); } if (shade_items>=2) { if (sscanf(shadelist[1], "%ld", &levels)!=1 || levels==0) { fprintf(stderr, "Error (sddscontour): incorrect -shade syntax (invalid number of levels)\n"); return(1); } } if (shade_items==4) { if (sscanf(shadelist[2], "%lf", &min_level)!=1 || sscanf(shadelist[3], "%lf", &max_level)!=1 || min_level>max_level) { fprintf(stderr, "Error (sddscontour): incorrect -shade syntax\n"); return(1); } } if (levels > 100) { levels = 100; } free(shadelist); break; case SET_TOPTITLE: flags |= TITLE_AT_TOP; break; case SET_VERBOSITY: verbosity = 1; if (s_arg[i_arg].n_items>1) { if (sscanf(s_arg[i_arg].list[1], "%ld", &verbosity)!=1 || verbosity<0) { fprintf(stderr, "Error (sddscontour): incorrect -verbosity syntax\n"); return(1); } } break; case SET_EQUATION: if ((s_arg[i_arg].n_items<2) || (s_arg[i_arg].n_items>3)) { fprintf(stderr, "Error (sddscontour): incorrect -equation syntax\n"); return(1); } if (s_arg[i_arg].n_items==2) { if (!SDDS_CopyString(&rpn_equation,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): incorrect -equation syntax\n"); return(1); } if (!strlen(rpn_equation)) { fprintf(stderr, "Error (sddscontour): incorrect -equation syntax\n"); return(1); } } else if (s_arg[i_arg].n_items==3) { if (strncmp(s_arg[i_arg].list[2], "algebraic", strlen(s_arg[i_arg].list[2]))==0) { ptr2 = addOuterParentheses(s_arg[i_arg].list[1]); if2pf(pfix, ptr2, sizeof pfix); free(ptr2); if (!SDDS_CopyString(&rpn_equation, pfix)) { fprintf(stderr, "Error (sddscontour): problem copying argument string\n"); return(1); } } else { fprintf(stderr, "Error (sddscontour): incorrect -equation syntax\n"); return(1); } } break; case SET_RPN_DEFNS_FILES: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): invalid -rpn_definitions_files syntax\n"); return(1); } rpn_definitions_file = trealloc(rpn_definitions_file, sizeof(*rpn_definitions_file)*(rpn_definitions_files+s_arg[i_arg].n_items-1)); for (i=1; i3)) { fprintf(stderr, "Error (sddscontour): incorrect -rpn_transform syntax\n"); return(1); } if (s_arg[i_arg].n_items==2) { if (!SDDS_CopyString(&rpn_transform,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): incorrect -rpn_transform syntax\n"); return(1); } if (!strlen(rpn_transform)) { fprintf(stderr, "Error (sddscontour): incorrect -rpn_transform syntax\n"); return(1); } } else if (s_arg[i_arg].n_items==3) { if (strncmp(s_arg[i_arg].list[2], "algebraic", strlen(s_arg[i_arg].list[2]))==0) { ptr2 = addOuterParentheses(s_arg[i_arg].list[1]); if2pf(pfix, ptr2, sizeof pfix); free(ptr2); if (!SDDS_CopyString(&rpn_transform, pfix)) { fprintf(stderr, "Error (sddscontour): incorrect -rpn_transform syntax\n"); return(1); } } else { fprintf(stderr, "Error (sddscontour): incorrect -rpn_transform syntax\n"); return(1); } } break; case SET_INTERPOLATE: if (s_arg[i_arg].n_items<3 || sscanf(s_arg[i_arg].list[1], "%ld", &nx_interp)!=1 || nx_interp<=0 || !(nx_interp==1 || power_of_2(nx_interp)) || sscanf(s_arg[i_arg].list[2], "%ld", &ny_interp)!=1 || ny_interp<=0 || !(ny_interp==1 || power_of_2(ny_interp)) ) { fprintf(stderr, "Error (sddscontour): invalid -interpolate syntax--integers must be 2^n\n"); return(1); } if (s_arg[i_arg].n_items>3) { char *flag_text[3] = {"floor", "ceiling", "antiripple"}; long flag_bit[3] = {CONTOUR_FLOOR, CONTOUR_CEILING, CONTOUR_ANTIRIPPLE}; interp_flags = 0; for (i=3; i=0) interp_flags |= flag_bit[j]; else { fprintf(stderr, "Error (sddscontour): unknown modifer given with -interpolate\n"); return(1); } } } break; case SET_FILTER: if (s_arg[i_arg].n_items!=3 || sscanf(s_arg[i_arg].list[1], "%ld", &x_lowpass)!=1 || x_lowpass<=0 || sscanf(s_arg[i_arg].list[2], "%ld", &y_lowpass)!=1 || y_lowpass<=0) { fprintf(stderr, "Error (sddscontour): invalid -filter syntax--integers must be > 0\n"); return(1); } if (nx_interp==0) nx_interp = 1; if (ny_interp==0) ny_interp = 1; break; case SET_FIXED_RANGE: fixed_range = 1; break; case SET_LOGSCALE: logscale = 1; if ((s_arg[i_arg].n_items!=1 && s_arg[i_arg].n_items!=2) || ((s_arg[i_arg].n_items==2 && sscanf(s_arg[i_arg].list[1], "%lf", &logfloor)!=1) || logfloor<0)) { fprintf(stderr, "Error (sddscontour): invalid -logscale syntax\n"); return(1); } break; case SET_DELTAS: deltas = DELTAS_PLAIN; if (s_arg[i_arg].n_items>=2) { if ((deltas=match_string(s_arg[i_arg].list[1], deltasOption, DELTAS_OPTIONS, 0))<0) { fprintf(stderr, "Error (sddscontour): invalid -deltas syntax\n"); return(1); } } break; case SET_YRANGE: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): invalid -yRange syntax\n"); return(1); } s_arg[i_arg].n_items --; if (!scanItemList(&dummyFlags, s_arg[i_arg].list+1, &s_arg[i_arg].n_items, 0, "maximum", SDDS_STRING, &maxPar, 1, 0, "minimum", SDDS_STRING, &minPar, 1, 0, NULL)) { fprintf(stderr, "Error (sddscontour): invalid -yRange syntax/values\n"); return(1); } if (maxPar) { if (wild_match(maxPar, "@*")) SDDS_CopyString(&ymaxPar, maxPar+1); else if (!get_double(&ymax, maxPar)) { fprintf(stderr, "Error (sddscontour): invalid -yRange syntax/values\n"); return(1); } free(maxPar); } if (minPar) { if (wild_match(minPar, "@*")) SDDS_CopyString(&yminPar, minPar+1); else if (!get_double(&ymin, minPar)) { fprintf(stderr, "Error (sddscontour): invalid -yRange syntax/values\n"); return(1); } free(minPar); } s_arg[i_arg].n_items ++; yRangeProvided = 1; break; case SET_XRANGE: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): invalid -xRange syntax\n"); return(1); } s_arg[i_arg].n_items --; if (!scanItemList(&dummyFlags, s_arg[i_arg].list+1, &s_arg[i_arg].n_items, 0, "maximum", SDDS_STRING, &maxPar, 1, 0, "minimum", SDDS_STRING, &minPar, 1, 0, NULL)) { fprintf(stderr, "Error (sddscontour): invalid -xRange syntax/values\n"); return(1); } if (maxPar) { if (wild_match(maxPar, "@*")) SDDS_CopyString(&xmaxPar, maxPar+1); else if (!get_double(&xmax, maxPar)) { fprintf(stderr, "Error (sddscontour): invalid -xRange syntax/values\n"); return(1); } free(maxPar); } if (minPar) { if (wild_match(minPar, "@*")) SDDS_CopyString(&xminPar, minPar+1); else if (!get_double(&xmin, minPar)) { fprintf(stderr, "Error (sddscontour): invalid -xRange syntax/values\n"); return(1); } free(minPar); } s_arg[i_arg].n_items ++; xRangeProvided=1; break; case SET_YSTRINGS: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): invalid -yStrings syntax\n"); return(1); } yEditCommand = NULL; ySparseInterval = 1; yScale = 1; s_arg[i_arg].n_items --; if (!scanItemList(&dummyFlags, s_arg[i_arg].list+1, &s_arg[i_arg].n_items, 0, "edit", SDDS_STRING, &yEditCommand, 1, 0, "sparse", SDDS_LONG, &ySparseInterval, 1, 0, "scale", SDDS_DOUBLE, &yScale, 1, 0, NULL) || ySparseInterval<=0 || yScale<=0) { fprintf(stderr, "Error (sddscontour): invalid -yStrings syntax/values\n"); return(1); } s_arg[i_arg].n_items ++; break; case SET_EDITYSTRINGS: if (s_arg[i_arg].n_items!=2) { fprintf(stderr, "Error (sddscontour): invalid -editYstrings syntax\n"); return(1); } if (!SDDS_CopyString(&yEditCommand,s_arg[i_arg].list[1])) { fprintf(stderr, "Error (sddscontour): invalid -editYstrings syntax\n"); return(1); } break; case SET_PREFERV1V2PARAMS: preferv1v2Parameters = 1; break; case SET_THICKNESS: if (s_arg[i_arg].n_items!=2 || sscanf(s_arg[i_arg].list[1], "%ld", &thickness)!=1 || thickness<=0 || thickness>9) { fprintf(stderr, "Error (sddscontour): invalid -thickness syntax\n"); return(1); } break; case SET_TICKSETTINGS: if (s_arg[i_arg].n_items<2) { fprintf(stderr, "Error (sddscontour): invalid -ticksettings syntax\n"); return(1); } s_arg[i_arg].n_items --; if (!scanItemListLong(&tsetFlags, s_arg[i_arg].list+1, &s_arg[i_arg].n_items, 0, "xtime", -1, NULL, 0, TICKSET_XTIME, NULL)) { fprintf(stderr, "Error (sddscontour): invalid -ticksettings syntax\n"); return(1); } s_arg[i_arg].n_items ++; if (tsetFlags&TICKSET_XTIME) { xTimeMode=1; } break; case SET_PIPE: pipe = 1; break; case SET_DRAWLINE: if (!drawline_AP(&drawLineSpec, &drawlines, s_arg[i_arg].list+1, s_arg[i_arg].n_items-1)) { fprintf(stderr, "Error (sddscontour): invalid -drawline syntax\n"); return(1); } break; default: fprintf(stderr, "unknown option - %s given.\n", s_arg[i_arg].list[0]); exit(1); break; } } else { /* argument is input filename */ if (inputfile) bomb("only one filename accepted", NULL); inputfile = s_arg[i_arg].list[0]; } } if (inputfile==NULL) { if (!pipe) bomb("no input file listed", NULL); } if (xRangeProvided && xaxisScaleProvided) bomb("-xrange and -xaxis options can not be provided at the same time.", NULL); if (yRangeProvided && yaxisScaleProvided) bomb("-yrange and -yaxis options can not be provided at the same time.", NULL); if (!device) device = DEFAULT_DEVICE; if (strncmp("motif", device, strlen(device))==0) { devargs = gs_device_arguments(NULL, 1); buffer = tmalloc(sizeof(*buffer)*(strlen(devargs?devargs:"")+strlen(SPECTRUM_TRUE)+1)); sprintf(buffer, "%s%s", devargs?devargs:"", SPECTRUM_TRUE); gs_device_arguments(buffer, 0); } if (rpn_definitions_files) { rpn(rpn_definitions_file[0]); if (rpn_check_error()) return(1); for (i=1; i1) SDDS_Bomb("no quantity specified and more than one column in file.\n"); SDDS_CopyString(&quantity, *ptr); SDDS_FreeStringArray(ptr, number); if (verbosity>0) printf("will do contour plotting for the quantity %s\n", quantity); } if (yaxisScalePar) { if (SDDS_GetParameterIndex(&SDDS_table, yaxisScalePar)<0) { fprintf(stderr, "parameter %s does not exist in the input file.\n", yaxisScalePar); return(1); } } if (yaxisOffsetPar) { if (SDDS_GetParameterIndex(&SDDS_table, yaxisOffsetPar)<0) { fprintf(stderr, "parameter %s does not exist in the input file.\n", yaxisOffsetPar); return(1); } } if (xaxisScalePar) { if (SDDS_GetParameterIndex(&SDDS_table, xaxisScalePar)<0) { fprintf(stderr, "parameter %s does not exist in the input file.\n", xaxisScalePar); return(1); } } if (xaxisOffsetPar) { if (SDDS_GetParameterIndex(&SDDS_table, xaxisOffsetPar)<0) { fprintf(stderr, "parameter %s does not exist in the input file.\n", xaxisOffsetPar); return(1); } } if (waterfall) { if (rpn_equation || columnmatch || quantity || xyzArray[0] || xyzColumn[2]) { SDDS_Bomb("waterfall option is not compatible with equation, columnmatch, xyz or array option!"); } if (0>SDDS_GetParameterIndex(&SDDS_table, waterfall_par) || 0>SDDS_GetColumnIndex(&SDDS_table, waterfall_indeptcol) || 0>SDDS_GetColumnIndex(&SDDS_table, waterfall_colorcol)) { SDDS_SetError("waterfall parameter or columns does not exist in the input file."); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); return(1); } if (SDDS_GetColumnInformation(&SDDS_table, "symbol", &colorName, SDDS_GET_BY_NAME, waterfall_colorcol)!=SDDS_STRING || SDDS_GetColumnInformation(&SDDS_table, "units", &colorUnits, SDDS_GET_BY_NAME, waterfall_colorcol)!=SDDS_STRING ) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); } if (!colorName) colorName=waterfall_colorcol; } else if (!rpn_equation && !columnmatch && !xyzArray[0] && !xyzColumn[2]) { if (0>SDDS_GetColumnIndex(&SDDS_table, quantity)) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } if (SDDS_GetColumnInformation(&SDDS_table, "symbol", &colorName, SDDS_GET_BY_NAME, quantity)!=SDDS_STRING || SDDS_GetColumnInformation(&SDDS_table, "units", &colorUnits, SDDS_GET_BY_NAME, quantity)!=SDDS_STRING ) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); } if (!colorName) colorName=quantity; if (rpn_transform) colorName=rpn_transform; } if (waterfall) { long pages, rows, rows1; double *indepdata=NULL; double *indepdata_page = NULL; double *tmpptr =NULL; double **tmpptr2 =NULL; long *sorted_index = NULL; nx=ny=0; pages=rows=0; while ((readstatus=SDDS_ReadPage(&SDDS_table))>0) { waterfall_parValue=(double*)SDDS_Realloc(waterfall_parValue,sizeof(*waterfall_parValue)*(pages+1)); data_value=(double**)SDDS_Realloc(data_value,sizeof(*data_value)*(pages+1)); data_value[pages]=NULL; if (!SDDS_GetParameterAsDouble(&SDDS_table, waterfall_par, &waterfall_parValue[pages])) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } if (pages==0) { if (!(indepdata=SDDS_GetColumnInDoubles(&SDDS_table, waterfall_indeptcol))) bomb("unable to read independent variable data", NULL); rows = SDDS_CountRowsOfInterest(&SDDS_table); if (!users_topline) { SDDS_GetDescription(&SDDS_table, &topline, NULL); if (!topline || !strlen(topline)) { sprintf(s, "Data from SDDS file %s, table %ld", inputfile, readstatus); SDDS_CopyString(&topline, s); } } else topline = users_topline; get_xyaxis_value(xaxisScalePar, xaxisOffsetPar, yaxisScalePar, yaxisOffsetPar, &SDDS_table, &xaxisScale, &xaxisOffset, &yaxisScale, &yaxisOffset, &users_xlabel, &users_ylabel); } else { rows1 = SDDS_CountRowsOfInterest(&SDDS_table); if (rows1=0 && variable2Index>=0) { if (SDDS_GetParameterType(&SDDS_table, variable1Index)!=SDDS_STRING || SDDS_GetParameterType(&SDDS_table, variable2Index)!=SDDS_STRING) { variable1Index = variable2Index = -1; } } if (variable1Index<0 || variable2Index<0) { rowNumberType = SDDS_GetNamedParameterType(&SDDS_table, "NumberOfRows"); columnNumberType = SDDS_GetNamedParameterType(&SDDS_table, "NumberOfColumns"); SDDS_ClearErrors(); if (rowNumberType && columnNumberType) { if (!SDDS_INTEGER_TYPE(rowNumberType) || !SDDS_INTEGER_TYPE(columnNumberType)) { fputs("NumberOfRows and NumberOfColumns parameters are present but at least one has a non-integer type--attempting alternative processing mode\n", stderr); SDDS_Bomb("Can't figure out how to turn column into 2D grid!\n"); } } } } } else if (!xyzArray[0] && !xyzColumn[2]) { if (!xRangeProvided) { if (SDDS_GetColumnIndex(&SDDS_table, indepcolumn)<0) { fprintf(stderr, "error: couldn't find column %s in file\n", indepcolumn); return(1); } } SDDS_SetColumnFlags(&SDDS_table, 0); s[0] = 0; for (i=0; i0) { if ((rows = SDDS_RowCount(&SDDS_table))<=0) continue; if (!(data = SDDS_GetColumnInDoubles(&SDDS_table, quantity))) { SDDS_SetError("problem reading data for fixed range determination"); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); } find_min_max(&thisMin, &thisMax, data, rows); free(data); if (thisMinmaxMax) maxMax = thisMax; page1++; } if (maxMax>minMin) { max_level = maxMax; min_level = minMin; } if (!SDDS_Terminate(&SDDS_table) || !SDDS_InitializeInput(&SDDS_table, inputfile)) { SDDS_SetError("problem closing and reopening input file"); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); } } while ((readstatus=SDDS_ReadPage(&SDDS_table))>0) { get_xyaxis_value(xaxisScalePar, xaxisOffsetPar, yaxisScalePar, yaxisOffsetPar, &SDDS_table, &xaxisScale, &xaxisOffset, &yaxisScale, &yaxisOffset, &users_xlabel, &users_ylabel); if (drawlines) determine_drawline(drawLineSpec, drawlines, &SDDS_table); if (rowNumberType && columnNumberType) { if (!SDDS_GetParameter(&SDDS_table, "NumberOfRows", &nx) || !SDDS_GetParameter(&SDDS_table, "NumberOfColumns", &ny)) { fprintf(stderr, "error: unable to read NumberOfRows or NumberOfColumns parameter\n"); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } if (!SDDS_CastValue(&nx, 0, rowNumberType, SDDS_LONG, &nx) || !SDDS_CastValue(&ny, 0, columnNumberType, SDDS_LONG, &ny) ) { fprintf(stderr, "error: unable to cast row or column numbers to type SDDS_LONG\n"); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } #ifndef COMPILE_AS_SUBROUTINE if (verbosity>0) printf("Data has %" PRId32 " rows by %" PRId32 " columns\n", nx, ny); #endif xmin = ymin = 0; dx = dy = 1; if (!users_xlabel) { SDDS_CopyString(&xlabel, "row"); users_xlabel = xlabel; } else xlabel = users_xlabel; if (!users_ylabel) { SDDS_CopyString(&ylabel, "column"); users_ylabel = ylabel; } else ylabel = users_ylabel; if (!users_title) { sprintf(s, "contours of constant %s", quantity?quantity:rpn_equation); SDDS_CopyString(&title, s); users_title = title; } else title = users_title; } /*end of if (rowNumberType && columnNumberType) */ else if (!columnmatch && !xyzArray[0] && !xyzColumn[2]) { getDimensionParameters(&SDDS_table, "Variable1Name", &variable1, &variable1Units, &xmin, &dx, &nx); getDimensionParameters(&SDDS_table, "Variable2Name", &variable2, &variable2Units, &ymin, &dy, &ny); if (!users_xlabel) { if (variable1Units) { sprintf(s, "%s (%s)", variable1, variable1Units); SDDS_CopyString(&xlabel, s); } else SDDS_CopyString(&xlabel, variable1); } else xlabel = users_xlabel; if (!users_ylabel) { if (variable2Units) { sprintf(s, "%s (%s)", variable2, variable2Units); SDDS_CopyString(&ylabel, s); } else SDDS_CopyString(&ylabel, variable2); } else ylabel = users_ylabel; if (!users_title) { if (rpn_transform) sprintf(s, "%s as a function of %s and %s", rpn_transform, swap_xy?variable2:variable1, swap_xy?variable1:variable2); else sprintf(s, "%s as a function of %s and %s", quantity?quantity:rpn_equation, swap_xy?variable2:variable1, swap_xy?variable1:variable2); SDDS_CopyString(&title, s); users_title = title; } else title = users_title; #ifndef COMPILE_AS_SUBROUTINE if (verbosity>1) { /* -- print out some information about the data */ printf("dimension 1: name = %s, minimum = %e, interval = %e, dimension = %" PRId32 "\n", variable1, xmin, dx, nx); printf("dimension 2: name = %s, minimum = %e, interval = %e, dimension = %" PRId32 "\n", variable2, ymin, dy, ny); } #endif } if (!users_topline) { SDDS_GetDescription(&SDDS_table, &topline, NULL); if (!topline || !strlen(topline)) { sprintf(s, "Data from SDDS file %s, table %ld", inputfile, readstatus); SDDS_CopyString(&topline, s); } } else topline = users_topline; if (quantity) { if (data_value) SDDS_FreeMatrix((void**)data_value, nx); data_value=NULL; get_xyaxis_value(xaxisScalePar, xaxisOffsetPar, yaxisScalePar, yaxisOffsetPar, &SDDS_table, &xaxisScale, &xaxisOffset, &yaxisScale, &yaxisOffset, &users_xlabel, &users_ylabel); if (swap_xy) { SWAP_PTR(xlabel, ylabel); SWAP_DOUBLE(xmin, ymin); SWAP_DOUBLE(dx, dy); SWAP_LONG(nx, ny); if (!(data_value=SDDS_GetDoubleMatrixFromColumn(&SDDS_table, quantity, nx, ny, SDDS_COLUMN_MAJOR_DATA))) { fputs("unable to get array from SDDS table\n", stderr); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } else if (!(data_value=SDDS_GetDoubleMatrixFromColumn(&SDDS_table, quantity, nx, ny, SDDS_ROW_MAJOR_DATA))) { fputs("unable to get array from SDDS table\n", stderr); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } /*end of if (quantity) */ else if (columnmatch) { long ix, iy, flip, colID, minID, maxID; double *indepdata; nx = SDDS_CountRowsOfInterest(&SDDS_table); flip = 0; if (!xRangeProvided) { SDDS_SetColumnFlags(&SDDS_table, 1); if (!(indepdata=SDDS_GetColumnInDoubles(&SDDS_table, indepcolumn))) bomb("unable to read independent variable data", NULL); if (indepdata[0]>indepdata[nx-1]) flip = 1; find_min_max(&xmin, &xmax, indepdata, nx); free(indepdata); } else { if (xmaxPar && !SDDS_GetParameterAsDouble(&SDDS_table, xmaxPar, &xmax)) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); if (xminPar && !SDDS_GetParameterAsDouble(&SDDS_table, xminPar, &xmin)) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); if (xmax1) printf("range of independent variable: %e to %e\n", xmin,xmax); SDDS_SetColumnFlags(&SDDS_table, 0); for (i=0; iymax)) continue; if (colID1) printf("%" PRId32 " rows and %" PRId32 " columns\n", nx, ny); dx = (xmax-xmin)/(nx-1); if (yaxisScaleProvided) { ymin = (minID - (long)yaxisOffset) * yaxisScale; ymax = (maxID - (long)yaxisOffset) * yaxisScale; dy = (ymax - ymin)/(ny-1); yRangeProvided = 1; } else { if (yRangeProvided) { dy = (ymax-ymin)/(ny-1); } else { ymin = 0; ymax = ny-1; dy = 1; } } get_plot_labels(&SDDS_table,indepcolumn,columnname,columns, allmatches,NULL,users_xlabel,users_ylabel,users_title, &xlabel,&ylabel,&title,deltas, xRangeProvided); if (swap_xy) { SWAP_LONG(xRangeProvided, yRangeProvided); } if (!users_title) users_title=title; if (!swap_xy && !yRangeProvided) flags |= NO_YSCALES; else if (swap_xy && !xRangeProvided) flags |= NO_XSCALES; if (swap_xy) { double **new_data; new_data=(double**)zarray_2d(sizeof(double), ny, nx); for (i=0;idefinition->dimensions != 2) { fprintf(stderr, "array %s must be 2 dimensions\n", xyzArray[0]); return(1); } if (xyzArray[1]) { if (xyzData[1]->definition->dimensions != 1) { fprintf(stderr, "array %s must be 1 dimension\n", xyzArray[1]); return(1); } if (xyzData[1]->dimension[0] != xyzData[0]->dimension[0]) { fprintf(stderr, "array dimension mismatch between %s and %s\n", xyzArray[0], xyzArray[1]); return(1); } } if (xyzArray[2]) { if (xyzData[2]->definition->dimensions != 1) { fprintf(stderr, "array %s must be 1 dimension\n", xyzArray[2]); return(1); } if (xyzData[2]->dimension[0] != xyzData[0]->dimension[1]) { fprintf(stderr, "array dimension mismatch between %s and %s\n", xyzArray[0], xyzArray[2]); return(1); } } if (swap_array) { nx = xyzData[0]->dimension[1]; ny = xyzData[0]->dimension[0]; } else { nx = xyzData[0]->dimension[0]; ny = xyzData[0]->dimension[1]; } if (data_value) SDDS_FreeMatrix((void**)data_value, nx); data_value = SDDS_AllocateMatrix(sizeof(**data_value), nx, ny); switch (type[0]) { case SDDS_SHORT: for (ix=0; ixdata)[ix * ny + iy]); } break; case SDDS_LONG: for (ix=0; ixdata)[ix * ny + iy]); } break; case SDDS_FLOAT: for (ix=0; ixdata)[ix * ny + iy]); } break; case SDDS_DOUBLE: for (ix=0; ixdata)[ix * ny + iy]; } break; } xintervals = malloc(sizeof(double) * nx); yintervals = malloc(sizeof(double) * ny); if (verbosity>1) printf("%" PRId32 " rows and %" PRId32 " columns\n", nx, ny); if (swap_array) { j = 2; } else { j = 1; } if (xyzArray[1]) { switch (type[1]) { case SDDS_SHORT: for (i=0; idata)[i]); break; case SDDS_LONG: for (i=0; idata)[i]); break; case SDDS_FLOAT: for (i=0; idata)[i]); break; case SDDS_DOUBLE: for (i=0; idata)[i]; break; } } else { for (i=0; idata)[i]); break; case SDDS_LONG: for (i=0; idata)[i]); break; case SDDS_FLOAT: for (i=0; idata)[i]); break; case SDDS_DOUBLE: for (i=0; idata)[i]; break; } } else { for (i=0; i=0; i--) { for (j=ny-1; j>=0; j--) { value = data_value[i][j]; if (min_value>value) { ix_min = i; iy_min = j; min_value = value; } if (max_value1) { printf("maximum value is %e, at x=%e, y=%e\n", max_value, ix_max*dx+xmin, iy_max*dy+ymin); printf("minimum value is %e, at x=%e, y=%e\n", min_value, ix_min*dx+xmin, iy_min*dy+ymin); if (strncmp(device, "regis", strlen(device))==0) { fputs("hit return to continue.", stdout); getchar(); } } #endif if (!xintervals) { xintervals = malloc(sizeof(double) * nx); for (i=0; i1) delta = (max-min)/(levels-1); else delta = 0; for (i=0; i=0 && !SDDS_GetParameter(SDDS_table, s, &units)) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); } *variableUnits = units; sprintf(s, "%sMinimum", *variable); if (!(SDDS_GetParameterAsDouble(SDDS_table, s, minimum))) { fprintf(stderr, "error: problem finding/casting %s\n", s); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); exit(1); } sprintf(s, "%sInterval", *variable); if (!(SDDS_GetParameterAsDouble(SDDS_table, s, interval))) { fprintf(stderr, "error: problem finding/casting %s\n", s); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); exit(1); } sprintf(s, "%sDimension", *variable); if (!(SDDS_GetParameterAsDouble(SDDS_table, s, &dValue))) { fprintf(stderr, "error: problem finding %s or with it's type\n", s); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); exit(1); } *number = dValue; } double **window_2d_array(double **data_value, double *xmin, double *xmax, double *ymin, double *ymax, double dx, double dy, int32_t *nx, int32_t *ny, double *limit) { double **new_data; long new_nx, new_ny, ix_min, iy_min, ix, iy; new_nx = *nx; new_ny = *ny; ix_min = 0; iy_min = 0; if (dx && limit[0]!=limit[1]) { if (limit[0]< *xmin) limit[0] = *xmin; else limit[0] = (ix_min=(long)((limit[0]- *xmin)/dx))*dx + *xmin; if (limit[1]> *xmax) { limit[1] = *xmax; new_nx -= ix_min; } else { new_nx = (limit[1]- limit[0])/dx + 1.5; limit[1] = (new_nx-1)*dx + limit[0]; } if (limit[1]<=limit[0]) bomb("horizontal scales are invalid", NULL); *xmin = limit[0]; *xmax = limit[1]; } if (dy && limit[2]!=limit[3]) { if (limit[2]< *ymin) limit[2] = *ymin; else limit[2] = (iy_min=(long)((limit[2]- *ymin)/dy))*dy + *ymin; if (limit[3]> *ymax) { limit[3] = *ymax; new_ny -= iy_min; } else { new_ny = (limit[3]- limit[2])/dy + 1.5; limit[3] = (new_ny-1)*dy + limit[2]; } if (limit[3]<=limit[2]) bomb("vertical scales are invalid", NULL); *ymin = limit[2]; *ymax = limit[3]; } if (dx==0 && dy==0) { return data_value; } else { new_data = (double**)zarray_2d(sizeof(double), new_nx, new_ny); for (ix=ix_min; ix1 && p1[1]=='@') checkParameter(SDDS_table, p1+1); if (p2 && strlen(p2)>1 && p2[1]=='@') checkParameter(SDDS_table, p2+1); if (p3 && strlen(p3)>1 && p3[1]=='@') checkParameter(SDDS_table, p3+1); if (p4 && strlen(p4)>1 && p4[1]=='@') checkParameter(SDDS_table, p4+1); } void freeParameterLabel(char *users_label, char *label) { if (users_label && users_label[0]=='@' && label) free(label); } void make_waterfall_yscale(long interval, double scale, long ny, double min_y, double max_y, double dy, long thickness) { double hsave, vsave, hsize, vsize; double xmin, xmax, ymin, ymax, deltay; double x, y, yrange, xrange; double pmin, pmax, qmin, qmax, value; double wpmin, wpmax, wqmin, wqmax; char label[256]; double tickFraction=0.0125; long i, digits=0; char format[256], *temp=NULL; get_mapping(&xmin, &xmax, &ymin, &ymax); get_pspace(&pmin, &pmax, &qmin, &qmax); get_wspace(&wpmin, &wpmax, &wqmin, &wqmax); yrange = ymax-ymin; xrange = xmax-xmin; deltay = yrange/(ny*1.0); get_char_size(&hsave, &vsave, 1); vsize = vsave; hsize = hsave; if (yrange0) digits=(long)(log10(max_y))+2+digits; if (xrange < digits*hsize) { hsize = xrange/digits; vsize = vsave/hsave*hsize; } hsize *= scale; vsize *= scale; set_char_size(hsize, vsize, 1); widen_window(1); i = 0; x = xmin - xrange*0.05; while (ny--) { value = min_y + ny * dy; y=value; if ((i++%interval)!=0) continue; set_linethickness(thickness); sprintf(label,format,value); jplot_string(&x, &y, label, 'r'); make_ticks('y', y, 1, 1, xmin, tickFraction*(xmax-xmin), 0, thickness); make_ticks('y', y, 1, 1, xmax, -tickFraction*(xmax-xmin), 0, thickness); } set_char_size(hsave, vsave, 1); } void make_enumerated_yscale(char **label0, double *yposition, long labels, char *yEdit, long interval, double scale, long thickness, char *ylabel, double ylabelScale) { double hsave, vsave, hsize, vsize; double xmin, xmax, ymin, ymax; double x, y, yrange, xrange; double pmin, pmax, qmin, qmax; double wpmin, wpmax, wqmin, wqmax; long i, maxlen; char buffer[1024], **label; double tickFraction=0.0125; get_mapping(&xmin, &xmax, &ymin, &ymax); get_pspace(&pmin, &pmax, &qmin, &qmax); get_wspace(&wpmin, &wpmax, &wqmin, &wqmax); yrange = ymax-ymin; xrange = xmax-xmin; label_character_size(1); get_char_size(&hsave, &vsave, 1); vsize = vsave; hsize = hsave; if (yrangemaxlen) maxlen = strlen(label[i]); } xrange = xrange/(pmax-pmin)*0.8*(pmin-wpmin); if (xrange < maxlen*hsize) { hsize = xrange/maxlen; vsize = vsave/hsave*hsize; } hsize *= scale; vsize *= scale; set_char_size(hsize, vsize, 1); widen_window(1); i = 0; while (labels--) { if (i++%interval!=0) { free(label[labels]); continue; } x = xmin - xrange*0.05; if (yposition) y = yposition[labels]; else y = labels; set_linethickness(thickness); jplot_string(&x, &y, label[labels], 'r'); make_ticks('y', y, 1, 1, xmin, tickFraction*(xmax-xmin), 0, thickness); make_ticks('y', y, 1, 1, xmax, -tickFraction*(xmax-xmin), 0, thickness); free(label[labels]); } free(label); set_char_size(hsave, vsave, 1); xrange=maxlen*hsize; if (ylabel) { get_char_size(&hsize, &vsize, 1); hsize *=ylabelScale; vsize *=ylabelScale; maxlen=strlen(ylabel); if (yrangemaxlen) maxlen = strlen(label[i]); } hsize *= scale; vsize *= scale; yrange= yrange*0.1; if (yrangexmax) continue; set_linethickness(thickness); jxyplot_string(&x, &y, label[labels], 'r', 'c'); make_ticks('x', x, 1, 1, ymin, tickFraction*(ymax-ymin), 0, thickness); make_ticks('x', x, 1, 1, ymax, -tickFraction*(ymax-ymin), 0, thickness); free(label[labels]); } free(label); vertical_print(0); set_char_size(hsave, vsave, 1); if (xlabel) { get_char_size(&hsize, &vsize, 1); hsize *=xlabelScale; vsize *=xlabelScale; y -= yrange; maxlen=strlen(xlabel); if (xrange0) { if (!(shape[iFile].xData = SDDS_Realloc(shape[iFile].xData, sizeof(*(shape[iFile].xData))*(page+1))) || !(shape[iFile].yData = SDDS_Realloc(shape[iFile].yData, sizeof(*(shape[iFile].yData))*(page+1))) || !(shape[iFile].nPoints = SDDS_Realloc(shape[iFile].nPoints, sizeof(*(shape[iFile].nPoints))*(page+1)))) SDDS_Bomb("Memory allocation failure reading shape file."); if ((shape[iFile].nPoints[page] = SDDS_RowCount(&SDDSin))<=0) continue; if (!(shape[iFile].xData[page] = SDDS_GetColumnInDoubles(&SDDSin, shape[iFile].xColumn)) || !(shape[iFile].yData[page] = SDDS_GetColumnInDoubles(&SDDSin, shape[iFile].yColumn))) SDDS_Bomb("Problem getting column data from shape file."); page++; } shape[iFile].nPages = page; if (!SDDS_Terminate(&SDDSin)) SDDS_Bomb("Problem terminating shape file."); } } char *addOuterParentheses(char *arg) { char *ptr; ptr = tmalloc(sizeof(*ptr)*(strlen(arg)+2)); sprintf(ptr, "(%s)", arg); return ptr; } long get_plot_labels(SDDS_DATASET *SDDS_table, char *indepcolumn, char **columnname, long columns, char *allmatches, char *waterfall_par, char *users_xlabel, char *users_ylabel, char *users_title, char **xlabel0, char **ylabel0, char **title0, long deltas, long xRangeProvided) { char *columnunits=NULL; char s[1024]; long i, is_par=0; char *xlabel, *ylabel, *title, *units; xlabel=ylabel=title=units=NULL; SDDS_GetColumnInformation(SDDS_table, "units", &columnunits, SDDS_GET_BY_NAME, columnname[0]); if (!xRangeProvided) { if (SDDS_GetColumnIndex(SDDS_table,indepcolumn)<0) { if (SDDS_GetParameterIndex(SDDS_table,indepcolumn)<0) { fprintf(stderr,"%s is neither a column or a parameter!\n", indepcolumn); exit(1); } is_par=1; } } if (!users_ylabel) { if (!waterfall_par) SDDS_CopyString(&ylabel, ""); else SDDS_CopyString(&ylabel, waterfall_par); } else SDDS_CopyString(&ylabel, users_ylabel); if (!users_xlabel) { if (!xRangeProvided) { if (is_par) SDDS_GetParameterInformation(SDDS_table, "units", &xlabel, SDDS_GET_BY_NAME, indepcolumn); else SDDS_GetColumnInformation(SDDS_table, "units", &xlabel, SDDS_GET_BY_NAME, indepcolumn); } if (xlabel && xlabel[0]) sprintf(s, "%s (%s)", indepcolumn, xlabel); else sprintf(s, "%s", indepcolumn); free(xlabel); SDDS_CopyString(&xlabel, s); } else SDDS_CopyString(&xlabel, users_xlabel); if (!users_title) { units = NULL; if (columnunits) { for (i=1; i=0; ix--) { average += data_value[ix][iy]; if (maxdata_value[ix][iy]) min = data_value[ix][iy]; } average /= nx; switch (deltas) { case DELTAS_PLAIN: for (ix=nx-1; ix>=0; ix--) data_value[ix][iy] -= average; break; case DELTAS_FRACTIONAL: for (ix=nx-1; ix>=0; ix--) data_value[ix][iy] = (data_value[ix][iy]-average)/average; break; case DELTAS_NORMALIZED: if ((range = max-min)) factor = 1/range; else factor = 0; for (ix=nx-1; ix>=0; ix--) data_value[ix][iy] = (data_value[ix][iy]-average)*factor; break; default: fprintf(stderr, "error: invalid -deltas code %ld detected\n", deltas); return(1); } } return 0; } void process_data(double ***data_value0, int32_t *nx, int32_t *ny, double *xmin, double *xmax, double *ymin, double *ymax, double *dx, double *dy, double *orig_limit, long logscale, double logfloor, long nx_interp, long ny_interp, long x_lowpass, long y_lowpass, long interp_flags, char **xyzArray, char **xyzColumn, long verbosity) { long i, j; double limit[4], **data_value, xmim0, xmax0, ymax0, ymin0; data_value=*data_value0; if (logscale) { for (i=0; i<*nx; i++) for (j=0; j<*ny; j++) data_value[i][j] = (data_value[i][j]<=0?(logfloor==0?-300:log10(logfloor)):log10(data_value[i][j])); } *xmax = *xmin + ((*nx)-1)*(*dx); *ymax = *ymin + ((*ny)-1)*(*dy); if (orig_limit[0]!=orig_limit[1] || orig_limit[2]!=orig_limit[3]) { memcpy((char*)limit, (char*)orig_limit, 4*sizeof(limit[0])); data_value = window_2d_array(data_value, xmin, xmax, ymin, ymax, *dx, *dy, nx, ny, limit); } if (nx_interp!=0 || ny_interp!=0) { if (xyzArray[0] || xyzColumn[2]) { fprintf(stderr, "warning: interpolation done using static dx and dy\n"); } if (nx_interp!=1 || x_lowpass>0) { #ifndef COMPILE_AS_SUBROUTINE if (verbosity>1 && nx_interp>1) printf("interpolating on %ld-times finer grid in x\n", nx_interp); if (verbosity>1 && x_lowpass>0) printf("low-pass filtering with cutoff at %ld steps below maximum x frequency\n", x_lowpass); #endif data_value = fft_interpolation_index1(data_value, *nx, *ny, nx_interp, x_lowpass, interp_flags); *dx /= nx_interp; *nx = nx_interp*((*nx)-1)+1; } if (ny_interp!=1 || y_lowpass>0) { #ifndef COMPILE_AS_SUBROUTINE if (verbosity>1 && ny_interp>1) printf("interpolating on %ld-times finer grid in y\n", ny_interp); if (verbosity>1 && y_lowpass>0) printf("low-pass filtering with cutoff at %ld steps below maximum y frequency\n", y_lowpass); #endif data_value = fft_interpolation_index2(data_value, *nx, *ny, ny_interp, y_lowpass, interp_flags); (*dy) /= ny_interp; (*ny) = ny_interp*((*ny)-1)+1; } } *data_value0=data_value; } char * rearrange_by_index(char *data,long *index,long element_size,long num) { char * tmpdata = NULL; long i, j,offset; tmpdata = tmalloc(element_size*num); offset = element_size/sizeof(char); for(i=0;i= 10) (*drawLineSpec)[i].linethickness = 9; *drawlines +=1 ; return 1; } void determine_drawline(DRAW_LINE_SPEC *drawLineSpec, long drawlines, SDDS_TABLE *table) { long i, j; double *positionPtr; unsigned long flagMask, flagSubs; char **namePtr; for (i=0; i