This is hdisplay.c in view mode; [Download] [Up]
/*
* hippodisplay.c - display parameter routines for hippo.
*
* Copyright (C) 1991 The Board of Trustees of The Leland Stanford
* Junior University. All Rights Reserved.
*
* $Id: hdisplay.c,v 5.0.2.2 1994/05/09 21:59:49 mfg Exp $
*
* by jonas karlsson, at SLAC, August 1990
* split up by Paul Rensing, Feb 28,1991
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <float.h>
#include "hippo.h"
#include "h3D.h"
#include "hutil.h"
#include "hdata.h"
GLOB_QUAL const char hippodisplay_c_rcsid[] =
"$Id: hdisplay.c,v 5.0.2.2 1994/05/09 21:59:49 mfg Exp $";
#define WINDWIDTH 500.0
#define WINDHEIGHT 500.0
#define TOPMARGIN 40.0 /* 1 inch margins */
#define BOTTOMMARGIN 80.0
#define LEFTMARGIN 80.0
#define RIGHTMARGIN 40.0
#ifdef THINK_C
/* can't do arithmetic with constants *8-( */
#define WWMINUSLR 380.0
#define WHMINUSTB 380.0
#else
#define WWMINUSLR (WINDWIDTH-LEFTMARGIN-RIGHTMARGIN)
#define WHMINUSTB (WINDHEIGHT-TOPMARGIN-BOTTOMMARGIN)
#endif
/*
* bug fix for IBM & THINKC: FLT_MAX calls a function, so it can't be used
* to initialize global variables.
*/
#ifdef VM
#define FLOT_MAX 7.2e75
#else
#if defined THINK_C || (! defined __STDC__ && defined ultrix)
#define FLOT_MAX 3.4e38
#else
#define FLOT_MAX FLT_MAX
#endif
#endif
#define BININDEX(x, y, z, xs, ys) ((xs) * (ys) * (z) + (x) * (ys) + y)
display h_newDisp( graphtype_t type )
{
display disp = NULL;
/*
* use this as the starting point
*/
static display_t firstdisp =
{
NULL, /* ntuple */
0, /* revision number */
NULL, /* ntFile */
1, /* dimension */
HISTOGRAM, /* graphtype */
BOX, /* drawtype */
{1,1,0,1,0,0,0,0}, /* flags */
NULL, /* title */
{{0,0,0,0}, /* bin flags */
{50,-1.0,1.0,0.0,0.0}, /* bins xAxis */
{50,-1.0,1.0,0.0,0.0}, /* bins yAxis */
NULL, /* pointer to bin data */
NULL, /* pointer to variances */
{{0.0,0.0,0.0},{0.0,0.0,0.0},{0.0,0.0,0.0}}, /* totals */
FLOT_MAX,-FLOT_MAX, /* binMin, binMax */
0, /* binAlloc */
0, /* ndata */
}, /* struct bins */
{-1.0,1.0,NULL,
{0,1,TOPBOTTOM,PLOTBOTTOM,PLOTBOTTOM,1,0,0},
5.0,0.0,0.0,1.0,0}, /* xaxis */
{-1.0,1.0,NULL,
{0,1,LEFTRIGHT,PLOTLEFT,PLOTLEFT,1,0,0},
5.0,0.0,0.0,1.0,0}, /* yaxis */
{-1.0,1.0,NULL,
{0,1,LEFTRIGHT,PLOTLEFT,PLOTLEFT,1,0,0},
5.0,0.0,0.0,1.0,0}, /* zaxis */
SOLIDSQUARE, /* plot symbol */
2.0, /* plot symbol size */
SOLID, /* line style */
{0,-1,-1,-1,-1,-1}, /* bindings to n-tuple variable */
{{0, 0},{WINDWIDTH,WINDHEIGHT}}, /* draw window */
{{LEFTMARGIN,BOTTOMMARGIN}, /* margin rectangle */
{WWMINUSLR,WHMINUSTB}},
NULL, /* nt_cut */
NULL, /* bin_func */
NULL, /* plot_func */
SOLID, /* func Sum line style */
NULL, /* bin to color transfer function */
NULL, /* pointer to 3D plot workarea or null */
0.0,0.0,2.0, /* theta, phi, and distance for 3D */
1,0,0,0,0,0, /* doCube etc flags */
0.60, 0.20, 0.00, 0.40, 0.90 /* greys for lego plots */
};
if ( (disp = (display) malloc( sizeof(display_t)) ) == NULL )
{
h_error("Unable to allocate memory for display structure");
goto error;
}
memcpy(disp,&firstdisp,sizeof(display_t));
disp->graphtype = type;
/*
* set titles and axis labels
*/
if (h_setTitle(disp,"%t") != 0)
{
h_error("Unable to set title");
goto error;
}
if (h_setAxisLabel(disp,XAXIS,"%x") != 0)
{
h_error("Unable to set xAxis label");
goto error;
}
if (disp->graphtype != LEGOPLOT)
{
if (h_setAxisLabel(disp,ZAXIS,"%z") != 0)
{
h_error("Unable to set zAxis label");
goto error;
}
}
else
{
if (h_setAxisLabel(disp,ZAXIS,"Entries / (%dx*%dy) bin") != 0)
{
h_error("Unable to set zAxis label");
goto error;
}
}
if (disp->graphtype != HISTOGRAM)
{
if (h_setAxisLabel(disp,YAXIS,"%y") != 0)
{
h_error("Unable to set yAxis label");
goto error;
}
}
else
{
if (h_setAxisLabel(disp,YAXIS,"Entries / %dx bin") != 0)
{
h_error("Unable to set yAxis label");
goto error;
}
}
/*
* other details
*/
switch (disp->graphtype)
{
case HISTOGRAM:
break;
case XYPLOT:
case STRIPCHART:
disp->drawtype = POINT + LINE;
disp->dim = 2;
disp->binding.y = 1;
break;
case COLORPLOT:
disp->dim = 2;
disp->binding.y = 1;
disp->drawtype = NONE;
break;
case LEGOPLOT:
disp->dim = 2;
disp->binding.y = 1;
disp->drawtype = NONE;
disp->bins.xAxis.nBins = 20;
disp->bins.yAxis.nBins = 20;
disp->doMesh = 1;
disp->doCube = 1;
h3D_init3D(disp);
break;
case SCATTERPLOT:
disp->dim = 2;
disp->binding.y = 1;
disp->drawtype = POINT;
break;
case THREEDSCATTER:
disp->dim = 3;
disp->binding.y = 1;
disp->binding.z = 2;
disp->drawtype = POINT;
disp->symbolSize = 2.0;
disp->doScatter = 1;
disp->doCube = 1;
h3D_init3D(disp);
break;
}
return disp;
error:
if (disp != NULL) h_freeDisp(disp);
return NULL;
}
display h_copyDisp(display olddisp)
{
display disp = NULL;
func_id fid;
if (olddisp == NULL) goto error;
if ( (disp = (display) malloc( sizeof(display_t)) ) == NULL )
{
h_error("Unable to allocate memory for display structure");
goto error;
}
memcpy(disp,olddisp,sizeof(display_t));
/*
* set all pointers to NULL so we don't free something in case of error
*/
disp->ntFile = NULL;
disp->bins.data = NULL;
disp->bins.variance = NULL;
disp->title = NULL;
disp->xAxis.label = NULL;
disp->yAxis.label = NULL;
disp->zAxis.label = NULL;
disp->nt_cut = NULL;
disp->bin_func = NULL;
disp->plot_func = NULL;
disp->binToColor = NULL;
/*
* Allocate space and copy title and labels
*/
if (h_setTitle(disp,olddisp->title) != 0)
{
h_error("Unable to set title");
goto error;
}
if (h_setAxisLabel(disp,XAXIS,olddisp->xAxis.label) != 0)
{
h_error("Unable to set xAxis label");
goto error;
}
if (h_setAxisLabel(disp,YAXIS,olddisp->yAxis.label) != 0)
{
h_error("Unable to set yAxis label");
goto error;
}
if (h_setAxisLabel(disp,ZAXIS,olddisp->zAxis.label) != 0)
{
h_error("Unable to set zAxis label");
goto error;
}
/*
* Copy over cuts and plot functions
*/
fid = NULL;
while ((fid = h_nextCut(olddisp,fid)))
h_addUserCut(disp, fid->name, fid->paramBlk, fid->blkSize );
fid = NULL;
while ((fid = h_nextPlotFunc(olddisp,fid)))
h_addPlotFunc(disp, fid->name, fid->paramBlk, fid->blkSize,
fid->lineStyle );
/*
* copy ntFile if it exists.
*/
if (olddisp->flags.ntByReference || olddisp->ntFile != NULL)
h_setNtByRef(disp,olddisp->flags.ntByReference,
olddisp->ntFile);
disp->bins.flags.dirty = 0;
disp->bins.ndata = 0;
disp->bins.binAlloc = 0;
return disp;
error:
if (disp != NULL) h_freeDisp( disp );
return NULL;
}
int h_freeDisp( display disp )
{
func_id c,next;
threeD_t *threeD;
if (disp == NULL) return 0;
if (disp->bins.data != NULL) free( disp->bins.data );
if (disp->bins.variance != NULL) free( disp->bins.variance );
if (disp->title != NULL) free( disp->title );
if (disp->xAxis.label != NULL) free( disp->xAxis.label );
if (disp->yAxis.label != NULL) free( disp->yAxis.label );
if (disp->zAxis.label != NULL) free( disp->zAxis.label );
/*
* free any 3D workareas
*/
if (disp->threeDWorkArea != NULL) {
threeD = disp->threeDWorkArea;
if (threeD->legoPoints[0] != NULL) free (threeD->legoPoints[0]);
if (threeD->legoResults[0] != NULL) free (threeD->legoResults[0]);
if (threeD->scatterResults != NULL) free (threeD->scatterResults);
if (threeD->cubeResults != NULL) free (threeD->cubeResults);
if (threeD->cArray != NULL) free (threeD->cArray);
if (threeD->oArray != NULL) free (threeD->oArray);
if (threeD->plotCharBuffer != NULL) free (threeD->plotCharBuffer);
if (threeD->blockBank != NULL) free (threeD->blockBank);
free (disp->threeDWorkArea);
}
if (disp->ntFile != NULL) free( disp->ntFile );
/*
* free the lists of functions
*/
c = disp->nt_cut;
while (c != NULL)
{
next = c->next;
/* if this is standard function, free parameter block */
if (c->funcPtr == h_cut_lt || c->funcPtr == h_cut_gt ||
c->funcPtr == h_cut_le || c->funcPtr == h_cut_ge ||
c->funcPtr == h_cut_inside || c->funcPtr == h_cut_outside ||
c->funcPtr == h_cut_in_incl || c->funcPtr == h_cut_out_incl )
free(c->paramBlk);
free(c);
c = next;
}
c = disp->bin_func;
while (c != NULL)
{
next = c->next;
free(c);
c = next;
}
c = disp->plot_func;
while (c != NULL)
{
next = c->next;
free(c);
c = next;
}
free( disp );
return 0;
}
int h_bindNtuple(display disp, ntuple nt)
{
char string[80];
if (disp == NULL)
return -1;
if (disp->tuple == nt)
return 0;
if (nt == NULL)
{
/*
* user is removing reference to ntuple.
* pick up the title and labels before removing reference.
*/
h_expandLabel( string, disp->title, 80, disp );
h_setTitle( disp, string );
h_expandLabel( string, disp->xAxis.label, 80, disp );
h_setAxisLabel( disp, XAXIS, string );
h_expandLabel( string, disp->yAxis.label, 80, disp );
h_setAxisLabel( disp, YAXIS, string );
h_expandLabel( string, disp->zAxis.label, 80, disp );
h_setAxisLabel( disp, ZAXIS, string );
disp->tuple = nt;
return 0;
}
/*
* first, check if there are enough columns
*/
if (disp->graphtype != HISTOGRAM && nt->ndim <= 1)
return -1;
disp->tuple = nt;
disp->bins.flags.dirty = 1;
disp->nt_rev = -1;
/*
* check axis bindings
*/
switch (disp->graphtype)
{
default:
if (disp->binding.y >= disp->tuple->ndim ||
disp->binding.y < 0)
disp->binding.y = 0;
case HISTOGRAM:
if (disp->binding.x >= disp->tuple->ndim ||
disp->binding.x < 0)
disp->binding.x = 0;
}
if (disp->binding.weight >= disp->tuple->ndim) return -1;
return 0;
}
int h_setNtByRef( display disp, int flag, const char *filenm )
{
int i;
if (disp == NULL) return -1;
disp->flags.ntByReference = flag;
if (disp->ntFile != NULL)
{
free(disp->ntFile);
disp->ntFile = NULL;
}
if (filenm == NULL || (i=strlen(filenm)) == 0) return 0;
if ( (disp->ntFile = (char *)malloc((i+1)*sizeof(char))) == NULL)
{
h_error("Unable to allocate space for ntFile name");
return -1;
}
strncpy(disp->ntFile,filenm,i+1);
return 0;
}
int h_setLogAxis(display disp, binding_t axis, int onOff)
{
if (disp == NULL) return -1;
switch (axis)
{
case XAXIS:
if (disp->graphtype == HISTOGRAM ||
disp->graphtype == COLORPLOT || disp->graphtype == LEGOPLOT)
return -1;
disp->xAxis.flags.log = onOff;
break;
case YAXIS:
if (disp->graphtype == COLORPLOT || disp->graphtype == LEGOPLOT)
return -1;
disp->yAxis.flags.log = onOff;
break;
case ZAXIS:
if (disp->graphtype == COLORPLOT || disp->graphtype == LEGOPLOT)
return -1;
disp->zAxis.flags.log = onOff;
break;
default:
return -1;
}
return 0;
}
int h_getLogAxis(display disp, binding_t axis)
{
if (disp == NULL) return -1;
switch (axis)
{
case XAXIS:
return disp->xAxis.flags.log;
case YAXIS:
return disp->yAxis.flags.log;
case ZAXIS:
return disp->zAxis.flags.log;
default:
return -1;
}
}
int h_setAutoScale(display disp, binding_t axis, int onOff)
{
if (disp == NULL) return -1;
switch (axis)
{
case XAXIS:
disp->xAxis.flags.autoScale = onOff;
break;
case YAXIS:
disp->yAxis.flags.autoScale = onOff;
break;
case ZAXIS:
disp->zAxis.flags.autoScale = onOff;
break;
default:
return -1;
}
return 0;
}
int h_getAutoScale(display disp, binding_t axis)
{
if (disp == NULL) return -1;
switch (axis)
{
case XAXIS:
return disp->xAxis.flags.autoScale;
case YAXIS:
return disp->yAxis.flags.autoScale;
case ZAXIS:
return disp->zAxis.flags.autoScale;
default:
return -1;
}
}
int h_setDispType(display disp, graphtype_t type)
{
if (disp == NULL) return -1;
if ( disp->tuple == NULL ) return -1;
disp->graphtype = type;
switch (disp->graphtype)
{
case HISTOGRAM:
disp->dim = 1;
disp->bins.flags.dirty = 1;
break;
case XYPLOT:
case STRIPCHART:
disp->dim = 1;
break;
case SCATTERPLOT:
case LEGOPLOT:
disp->dim = 2;
disp->bins.flags.dirty = 1;
break;
case COLORPLOT:
case THREEDSCATTER:
disp->dim = 2;
break;
}
/*
* now, check if binding is consistent
*/
/* display dimension */
if (disp->graphtype != HISTOGRAM && disp->tuple->ndim <= 1)
return -1;
/* axis bindings */
switch (disp->graphtype)
{
default:
if (disp->binding.y >= disp->tuple->ndim ||
disp->binding.y < 0)
disp->binding.y = 0;
case HISTOGRAM:
if (disp->binding.x >= disp->tuple->ndim ||
disp->binding.x < 0)
disp->binding.x = 0;
}
if (disp->binding.weight >= disp->tuple->ndim) return -1;
/*
* remove bins if they are useless
*/
if (disp->graphtype == XYPLOT || disp->graphtype == STRIPCHART
|| disp->graphtype == SCATTERPLOT)
{
if (disp->bins.data != NULL)
{
free(disp->bins.data);
disp->bins.data = NULL;
}
if (disp->bins.variance != NULL)
{
free(disp->bins.variance);
disp->bins.variance = NULL;
}
disp->bins.binAlloc = 0;
}
return 0;
}
int h_setDrawType(display disp, drawtype_t type)
{
if (disp == NULL) return -1;
disp->drawtype = type;
return 0;
}
int h_orDrawType(display disp, drawtype_t type)
{
if (disp == NULL) return -1;
disp->drawtype |= type;
return 0;
}
int h_bind(display disp, binding_t axis, int dataDim)
{
if (disp == NULL) return -1;
if (disp->tuple != NULL && dataDim > disp->tuple->ndim)
return -1;
switch (axis)
{
case XAXIS:
if (disp->binding.x != dataDim && dataDim >= 0)
{
disp->binding.x = dataDim;
disp->bins.flags.dirty = 1;
}
break;
case YAXIS:
if (disp->binding.y != dataDim && dataDim >= 0)
{
disp->binding.y = dataDim;
disp->bins.flags.dirty = 1;
}
break;
case ZAXIS:
if (disp->binding.z != dataDim && dataDim >= 0)
{
disp->binding.z = dataDim;
disp->bins.flags.dirty = 1;
}
break;
case WEIGHT:
if (disp->binding.weight != dataDim)
{
disp->binding.weight = dataDim;
disp->bins.flags.dirty = 1;
}
break;
case XERROR:
if (disp->binding.xerror != dataDim)
{
disp->binding.xerror = dataDim;
disp->bins.flags.dirty = 1;
}
break;
case YERROR:
if (disp->binding.yerror != dataDim)
{
disp->binding.yerror = dataDim;
disp->bins.flags.dirty = 1;
}
break;
}
return 0;
}
int h_getBinding( display disp, binding_t axis )
{
if (disp == NULL) return -1;
/* note: some tolower routines are dumb, so check first */
switch (axis)
{
case XAXIS:
return disp->binding.x;
case YAXIS:
return disp->binding.y;
case ZAXIS:
return disp->binding.z;
case WEIGHT:
return disp->binding.weight;
case XERROR:
return disp->binding.xerror;
case YERROR:
return disp->binding.yerror;
default:
return -1;
}
}
int h_bindMany(display disp, int n, ...)
{
va_list argPtr;
int i, d;
binding_t axis;
va_start(argPtr, n);
for (i = 0; i < n; i++)
{
axis = va_arg(argPtr, binding_t );
d = va_arg(argPtr, int);
if (h_bind(disp,axis,d) != 0)
{
va_end(argPtr);
return -1;
}
}
va_end(argPtr);
return 0;
}
int h_setBinWidth(display disp, binding_t axis, float width)
{
if (disp == NULL) return -1;
if (width <= 0) return -1;
if (disp->bins.flags.fixed &&
(disp->graphtype == HISTOGRAM || disp->graphtype == LEGOPLOT
|| disp->graphtype == COLORPLOT) ) return -1;
switch (axis)
{
case XAXIS:
disp->bins.xAxis.nBins =
floor((disp->xAxis.high - disp->xAxis.low) / width + 0.5);
disp->xAxis.high = disp->xAxis.low + disp->bins.xAxis.nBins*width;
disp->bins.xAxis.high = disp->xAxis.high;
disp->xAxis.flags.autoScale = 0;
break;
case YAXIS:
disp->bins.yAxis.nBins =
floor((disp->yAxis.high - disp->yAxis.low) / width + 0.5);
disp->yAxis.high = disp->yAxis.low + disp->bins.yAxis.nBins*width;
disp->bins.yAxis.high = disp->yAxis.high;
disp->yAxis.flags.autoScale = 0;
break;
default:
return -1;
}
disp->bins.flags.dirty = 1;
return 0;
}
float h_getBinWidth(display disp, binding_t axis)
{
if (disp == NULL) return -1;
switch (axis )
{
case XAXIS:
return (disp->xAxis.high - disp->xAxis.low) / disp->bins.xAxis.nBins;
case YAXIS:
return (disp->yAxis.high - disp->yAxis.low) / disp->bins.yAxis.nBins;
default:
return -1;
}
}
int h_setBinNum(display disp, binding_t axis, int n)
{
if (disp == NULL || n<1) return -1;
if (disp->bins.flags.fixed &&
(disp->graphtype == HISTOGRAM || disp->graphtype == LEGOPLOT
|| disp->graphtype == COLORPLOT) ) return -1;
switch (axis )
{
case XAXIS:
if (disp->bins.xAxis.nBins != n)
{
disp->bins.xAxis.nBins = n;
disp->bins.flags.dirty = 1;
}
break;
case YAXIS:
if (disp->bins.yAxis.nBins != n)
{
disp->bins.yAxis.nBins = n;
disp->bins.flags.dirty = 1;
}
break;
default:
return -1;
}
return 0;
}
int h_getBinNum( display disp, binding_t axis )
{
if (disp == NULL) return -1;
switch (axis )
{
case XAXIS:
return disp->bins.xAxis.nBins;
break;
case YAXIS:
return disp->bins.yAxis.nBins;
break;
default:
return -1;
}
}
int h_setRange(display disp, binding_t axis, float low, float high)
{
int Auto = 0;
if (disp->bins.flags.fixed &&
(disp->graphtype == HISTOGRAM || disp->graphtype == LEGOPLOT
|| disp->graphtype == COLORPLOT) ) return -1;
if (low >= high)
{
Auto = 1;
high = low + 1.0;
}
if (disp == NULL) return -1;
switch (axis )
{
case XAXIS:
if (disp->xAxis.low != low || disp->xAxis.high != high)
{
disp->xAxis.low = low;
disp->xAxis.high = high;
disp->bins.xAxis.low = low;
disp->bins.xAxis.high = high;
disp->xAxis.flags.autoScale = Auto;
disp->bins.flags.dirty = 1;
}
break;
case YAXIS:
if (disp->yAxis.low != low || disp->yAxis.high != high)
{
disp->yAxis.low = low;
disp->yAxis.high = high;
disp->bins.yAxis.low = low;
disp->bins.yAxis.high = high;
disp->yAxis.flags.autoScale = Auto;
disp->bins.flags.dirty = 1;
}
break;
case ZAXIS:
if (disp->zAxis.low != low || disp->zAxis.high != high)
{
disp->zAxis.low = low;
disp->zAxis.high = high;
disp->zAxis.flags.autoScale = Auto;
disp->bins.flags.dirty = 1;
}
break;
default:
return -1;
}
return 0;
}
int h_getRange(display disp, binding_t axis, float *low, float *high)
{
if (disp == NULL) return -1;
switch (axis )
{
case XAXIS:
*low = disp->xAxis.low;
*high = disp->xAxis.high;
break;
case YAXIS:
*low = disp->yAxis.low;
*high = disp->yAxis.high;
break;
case ZAXIS:
*low = disp->zAxis.low;
*high = disp->zAxis.high;
break;
default:
return -1;
}
return 0;
}
int h_getBinExtreme( display disp, float *min, float *max )
{
if (disp == NULL) return -1;
*min = disp->bins.binMin;
*max = disp->bins.binMax;
return 0;
}
int h_dispSize( display disp )
{
int i = 0;
func_id p;
i += 4; /* magic number */
i += (strlen(STRUCT_VERSION)/4 + 2)*4;
i += sizeof( display_t )+8;
i += (strlen(disp->title)/4 + 2)*4;
i += (strlen(disp->ntFile)/4 + 2)*4;
if (disp->bins.flags.fixed)
i += 2 * (disp->bins.binAlloc * sizeof(float) + 4);
i += (strlen(disp->xAxis.label)/4 + 2)*4;
i += (strlen(disp->yAxis.label)/4 + 2)*4;
i += (strlen(disp->zAxis.label)/4 + 2)*4;
for (p=disp->nt_cut; p!=NULL; p=p->next )
{
i += sizeof(func_id_t) + 4;
i += p->blkSize * sizeof(double) + 4;
}
for (p=disp->bin_func; p!=NULL; p=p->next )
{
i += sizeof(func_id_t) + 4;
i += p->blkSize * sizeof(double) + 4;
}
for (p=disp->plot_func; p!=NULL; p=p->next )
{
i += sizeof(func_id_t) + 4;
i += p->blkSize * sizeof(double) + 4;
}
for (p=disp->binToColor; p!=NULL; p=p->next )
{
i += sizeof(func_id_t) + 4;
i += p->blkSize * sizeof(double) + 4;
}
i += 100; /* just in case */
return i;
}
void h_autoScale( display disp )
{
/*
* do autoscaling of bins if requested.
*/
if ( disp == NULL || disp->tuple == NULL || disp->tuple->ndata == 0)
return;
switch (disp->dim)
{
#ifdef junk
case 3:
if (disp->zAxis.flags.autoScale)
{
disp->zAxis.low = disp->tuple->nlow[disp->binding.z];
disp->zAxis.high = disp->tuple->nhigh[disp->binding.z];
if (disp->graphtype == SCATTERPLOT || disp->graphtype == XYPLOT
|| disp->graphtype == STRIPCHART)
h_adjustAxis(&(disp->zAxis.low), &(disp->zAxis.high),
0, disp->zAxis.flags.log);
else
h_adjustAxis(&(disp->zAxis.low), &(disp->zAxis.high),
disp->zAxis.nBins, disp->zAxis.flags.log );
disp->bins.flags.dirty = 1;
}
#endif
case 2:
if (disp->yAxis.flags.autoScale)
{
disp->yAxis.low = disp->tuple->nlow[disp->binding.y];
disp->yAxis.high = disp->tuple->nhigh[disp->binding.y];
if (disp->yAxis.high <= disp->yAxis.low + FLT_EPSILON*4)
disp->yAxis.high = disp->yAxis.low + 1.0;
if (disp->graphtype == SCATTERPLOT || disp->graphtype == XYPLOT
|| disp->graphtype == STRIPCHART)
h_adjustAxis(&(disp->yAxis.low), &(disp->yAxis.high),
0, disp->yAxis.flags.log);
else
h_adjustAxis(&(disp->yAxis.low), &(disp->yAxis.high),
disp->bins.yAxis.nBins, disp->yAxis.flags.log );
disp->bins.flags.dirty = 1;
}
case 1:
if (disp->xAxis.flags.autoScale)
{
disp->xAxis.low = disp->tuple->nlow[disp->binding.x];
disp->xAxis.high = disp->tuple->nhigh[disp->binding.x];
if (disp->xAxis.high <= disp->xAxis.low + FLT_EPSILON*4)
disp->xAxis.high = disp->xAxis.low + 1.0;
if (disp->graphtype == SCATTERPLOT || disp->graphtype == XYPLOT
|| disp->graphtype == STRIPCHART)
h_adjustAxis(&(disp->xAxis.low), &(disp->xAxis.high),
0, disp->xAxis.flags.log );
else
h_adjustAxis(&(disp->xAxis.low), &(disp->xAxis.high),
disp->bins.xAxis.nBins, disp->xAxis.flags.log );
disp->bins.flags.dirty = 1;
}
}
return;
}
int h_ptToBin(display disp, float f, binding_t axis)
{
float bwin = 0;
int underBin = 0;
switch (axis)
{
case XAXIS:
bwin = ((float) disp->bins.xAxis.nBins) /
(float) (disp->xAxis.high - disp->xAxis.low) ;
underBin = disp->xAxis.low * bwin - 1;
break;
case YAXIS:
bwin = ((float) disp->bins.yAxis.nBins) /
(float) (disp->yAxis.high - disp->yAxis.low) ;
underBin = disp->yAxis.low * bwin - 1;
break;
default:
return -1;
}
return (floor(f * bwin) - underBin - 1);
}
float h_binVal(display disp, ...)
{
va_list argPtr;
int i;
#ifndef __STDC__
static
#endif
int bin[3]={0,0,0};
if (disp->bins.ndata == 0) return 0;
va_start(argPtr, disp);
for (i = 0; i < disp->dim; i++) bin[i] = va_arg(argPtr, int);
va_end(argPtr);
return disp->bins.data[BININDEX(bin[0], bin[1], bin[2],
disp->bins.xAxis.nBins,
( (disp->dim > 1) ?
disp->bins.yAxis.nBins : 1) )];
}
/*
* conversion routines :
*/
float h_wPtTogPt(display disp, float wPt, binding_t axis)
{
switch (axis )
{
case XAXIS:
return (((wPt - disp->marginRect.origin.x)
/ disp->marginRect.size.width)
* (disp->xAxis.high - disp->xAxis.low)
+ disp->xAxis.low);
break;
case YAXIS:
return (((wPt - disp->marginRect.origin.y)
/ disp->marginRect.size.height)
* (disp->yAxis.high - disp->yAxis.low)
+ disp->yAxis.low);
break;
default:
return -1;
}
}
float h_gPtTowPt(display disp, float gPt, binding_t axis)
{
switch (axis )
{
case XAXIS:
return (((gPt - disp->xAxis.low)
/ (disp->xAxis.high - disp->xAxis.low))
* disp->marginRect.size.width
+ disp->marginRect.origin.x);
break;
case YAXIS:
return (((gPt - disp->yAxis.low)
/ (disp->yAxis.high - disp->yAxis.low))
* disp->marginRect.size.height
+ disp->marginRect.origin.y);
break;
default:
return -1;
}
}
int h_setDrawRect(display disp, rectangle *rect)
{
if (disp == NULL) return -1;
memcpy (&disp->drawRect, rect, sizeof(rectangle));
return 0;
}
int h_setMarginRect(display disp, rectangle *rect)
{
if (disp == NULL) return -1;
memcpy (&disp->marginRect, rect, sizeof(rectangle));
return 0;
}
int h_getDrawRect(display disp, rectangle *rect)
{
if (disp == NULL) return -1;
memcpy (rect, &disp->drawRect, sizeof(rectangle));
if (rect->size.width != 0 && rect->size.height != 0)
return 0;
else
return -1;
}
int h_getMarginRect(display disp, rectangle *rect)
{
if (disp == NULL) return -1;
memcpy (rect, &disp->marginRect, sizeof(rectangle));
if (rect->size.width != 0 && rect->size.height != 0)
return 0;
else
return -1;
}
int h_setTitle(display disp, const char *title)
{
int l;
if (disp == NULL) return -1;
if (title == NULL) return -1;
l = strlen(title);
if (disp->title != NULL) free(disp->title);
if ( (disp->title=(char *)malloc((l+1)*sizeof(char)) )==NULL)
{
h_error("Unable to allocate memory for title");
return -1;
}
return strcpy(disp->title, title) ? 0 : -1;
}
int h_setAxisLabel(display disp, binding_t axis, const char *title)
{
int l;
char *p;
if (disp == NULL || title == NULL) return -1;
l = strlen(title);
if ( (p=(char *)malloc((l+1)*sizeof(char)) )==NULL)
{
h_error("Unable to allocate memory for title");
return -1;
}
l = strcpy(p, title) ? 0: -1;
switch (axis)
{
case XAXIS:
if (disp->xAxis.label != NULL) free(disp->xAxis.label);
disp->xAxis.label = p;
break;
case YAXIS:
if (disp->yAxis.label != NULL) free(disp->yAxis.label);
disp->yAxis.label = p;
break;
case ZAXIS:
if (disp->zAxis.label != NULL) free(disp->zAxis.label);
disp->zAxis.label = p;
break;
default:
free(p);
l = -1;
}
return l;
}
const char *h_getAxisLabel( display disp, binding_t axis )
{
if (disp == NULL) return NULL;
switch (axis)
{
case XAXIS:
return disp->xAxis.label;
case YAXIS:
return disp->yAxis.label;
case ZAXIS:
return disp->zAxis.label;
default:
return NULL;
}
}
/*
* Set/get flags specifying location of axis frills (label, ticks, scale)
*/
int h_setTickLocation( display disp, binding_t axis, plotloc_t location )
{
switch (axis)
{
case XAXIS:
disp->xAxis.flags.tickLocation = location;
break;
case YAXIS:
disp->yAxis.flags.tickLocation = location;
break;
case ZAXIS:
disp->zAxis.flags.tickLocation = location;
break;
default:
return -1;
}
return 0;
}
int h_setScaleLocation( display disp, binding_t axis, plotloc_t location )
{
switch (axis)
{
case XAXIS:
disp->xAxis.flags.scaleLocation = location;
break;
case YAXIS:
disp->yAxis.flags.scaleLocation = location;
break;
case ZAXIS:
disp->zAxis.flags.scaleLocation = location;
break;
default:
return -1;
}
return 0;
}
int h_setLabelLocation( display disp, binding_t axis, plotloc_t location )
{
switch (axis)
{
case XAXIS:
disp->xAxis.flags.labelLocation = location;
break;
case YAXIS:
disp->yAxis.flags.labelLocation = location;
break;
case ZAXIS:
disp->zAxis.flags.labelLocation = location;
break;
default:
return -1;
}
return 0;
}
plotloc_t h_getTickLocation( display disp, binding_t axis )
{
switch (axis)
{
case XAXIS:
return disp->xAxis.flags.tickLocation;
case YAXIS:
return disp->yAxis.flags.tickLocation;
case ZAXIS:
return disp->zAxis.flags.tickLocation;
default:
return -1;
}
return 0;
}
plotloc_t h_getScaleLocation( display disp, binding_t axis )
{
switch (axis)
{
case XAXIS:
return disp->xAxis.flags.scaleLocation;
case YAXIS:
return disp->yAxis.flags.scaleLocation;
case ZAXIS:
return disp->zAxis.flags.scaleLocation;
default:
return -1;
}
return 0;
}
plotloc_t h_getLabelLocation( display disp, binding_t axis )
{
switch (axis)
{
case XAXIS:
return disp->xAxis.flags.labelLocation;
case YAXIS:
return disp->yAxis.flags.labelLocation;
case ZAXIS:
return disp->zAxis.flags.labelLocation;
default:
return -1;
}
return 0;
}
int h_setScaleFontSize( display disp, binding_t axis, float fontSize )
{
switch (axis)
{
case XAXIS:
disp->xAxis.scaleFontSize = fontSize;
break;
case YAXIS:
disp->yAxis.scaleFontSize = fontSize;
break;
case ZAXIS:
disp->zAxis.scaleFontSize = fontSize;
break;
default:
return -1;
}
return 0;
}
float h_getScaleFontSize( display disp, binding_t axis )
{
switch (axis)
{
case XAXIS:
return disp->xAxis.scaleFontSize;
case YAXIS:
return disp->yAxis.scaleFontSize;
case ZAXIS:
return disp->zAxis.scaleFontSize;
default:
return -1;
}
return 0;
}
int h_setTickLength( display disp, binding_t axis, float f )
{
switch (axis)
{
case XAXIS:
disp->xAxis.tickLength = f;
break;
case YAXIS:
disp->yAxis.tickLength = f;
break;
case ZAXIS:
disp->zAxis.tickLength = f;
break;
default:
return -1;
}
return 0;
}
float h_getTickLength( display disp, binding_t axis )
{
switch (axis)
{
case XAXIS:
return disp->xAxis.tickLength;
case YAXIS:
return disp->yAxis.tickLength;
case ZAXIS:
return disp->zAxis.tickLength;
default:
return -1;
}
return 0;
}
/*
* Functions dealing with cuts.
*/
func_id h_addCut( display disp, const char *cutfunc, int cut_dim,
double val1, ... )
{
va_list argPtr;
void *fptr;
double *parm;
int nval;
typedef int (*cutf)(float *,double *);
/*
* check that the cut variable is in ntuple.
*/
if (cut_dim < 0 || cut_dim >= disp->tuple->ndim)
{
h_error("h_addCut: Column used for cut is not in the ntuple");
return NULL;
}
/*
* determine the function
*/
fptr = h_fNameSrch(cutfunc);
if (fptr==h_cut_le ||
fptr==h_cut_lt ||
fptr==h_cut_ge ||
fptr==h_cut_gt )
nval = 2;
else if (fptr==h_cut_inside ||
fptr==h_cut_outside ||
fptr==h_cut_in_incl ||
fptr==h_cut_out_incl )
nval = 3;
else
{
h_error("h_addCut: function is not supported by hippo.");
h_error("h_addCut: use the user-function routines.");
return NULL;
}
/*
* build the parameter list
*/
if ( (parm=(double *)malloc(nval*sizeof(double))) == NULL)
{
h_error("Could not allocate cut parameter block.");
return NULL;
}
parm[0] = (double) cut_dim;
parm[1] = val1;
if (nval > 2)
{
va_start(argPtr, val1);
parm[2] = va_arg(argPtr, double );
va_end(argPtr);
}
/*
* now it looks like a user cut!
*/
return h_addUserCut(disp, cutfunc, parm, nval );
}
int h_changeCut( display disp, func_id cut, double val1, ... )
{
va_list argPtr ;
double *f;
int i;
if (cut==NULL) return 0;
f = (double *) cut->paramBlk;
f[1] = val1;
if (cut->blkSize >2)
{
va_start(argPtr, val1);
for (i=2; i<cut->blkSize; i++)
f[i] = va_arg(argPtr, double);
va_end(argPtr);
}
/*
* bins are now dirty.
*/
disp->bins.flags.dirty = 1;
return 0;
}
int h_deleteCut( display disp, func_id cut )
{
func_id c,c_p=NULL;
if (disp == NULL || cut == NULL) return 0;
c = disp->nt_cut;
while (c!=cut && c!=NULL)
{
c_p = c;
c = c->next;
}
if (c!=NULL)
{
if (c_p!=NULL)
c_p->next = c->next;
else
disp->nt_cut = c->next;
free(c);
}
else
return 0;
/*
* bins are now dirty.
*/
disp->bins.flags.dirty = 1;
return 0;
}
func_id h_addUserCut( display disp, const char *cutfunc, double *paramBlk,
int nParam )
{
func_id newcut,nextf;
/*
* allocate a new cut.
*/
if ( (newcut = (func_id) malloc(sizeof(func_id_t))) == NULL)
{
h_error("Could not allocate cut structure.");
return NULL;
}
/*
* initialize all the fields of the new cut.
*/
strncpy(newcut->name, cutfunc, FUNCNAMELEN);
if ( (newcut->funcPtr = h_fNameSrch(newcut->name))
== NULL)
{
h_error("h_addUserCut - function is not registered.");
h_error("use h_funcReg");
free(newcut);
return NULL;
}
newcut->blkSize = nParam;
newcut->paramBlk = (void *) paramBlk;
nextf = disp->nt_cut;
disp->nt_cut = newcut;
newcut->next = nextf;
/*
* bins are now dirty.
*/
disp->bins.flags.dirty = 1;
return newcut;
}
func_id h_nextCut( display disp, func_id thiscut )
{
if (disp == NULL) return NULL;
if (thiscut == NULL) return disp->nt_cut;
return thiscut->next;
}
/*
* overplot function routines
*/
func_id h_addPlotFunc(display disp, const char *plotfunc, double *paramBlk,
int nParam, linestyle_t ls )
{
func_id newpfunc,nextf;
/*
* allocate a new cut.
*/
if ( (newpfunc = (func_id) malloc(sizeof(func_id_t))) == NULL)
{
h_error("Could not allocate cut structure.");
return NULL;
}
/*
* initialize all the fields of the new cut.
*/
strncpy(newpfunc->name, plotfunc, FUNCNAMELEN);
if ( (newpfunc->funcPtr = h_fNameSrch(newpfunc->name))
== NULL)
{
h_error("h_addPlotFunc - function is not registered.");
h_error("use h_funcReg");
free(newpfunc);
return NULL;
}
newpfunc->blkSize = nParam;
newpfunc->paramBlk = (void *)paramBlk;
newpfunc->lineStyle = ls;
nextf = disp->plot_func;
disp->plot_func = newpfunc;
newpfunc->next = nextf;
return newpfunc;
}
func_id h_nextPlotFunc( display disp, func_id thispfunc )
{
if (disp == NULL) return NULL;
if (thispfunc == NULL) return disp->plot_func;
return thispfunc->next;
}
int h_deletePlotFunc( display disp, func_id pfunc )
{
func_id c,c_p=NULL;
if (disp == NULL || pfunc == NULL) return 0;
c = disp->plot_func;
while (c!=pfunc && c!=NULL)
{
c_p = c;
c = c->next;
}
if (c!=NULL)
{
if (c_p!=NULL)
c_p->next = c->next;
else
disp->plot_func = c->next;
free(c);
}
else
return 0;
return 0;
}
/*
* function to get xy and scatter plot xy moments, also correlation
*/
void h_getXYMoments (display disp, float *xmoments, float *ymoments, float *r)
{
int npts, i;
float *xylist;
struct maxs max;
float ax, ay, sxx = 0.0, syy = 0.0, sxy = 0.0;
for (i=0; i<3; i++) {
xmoments[i] = 0.0;
ymoments[i] = 0.0;
}
npts = getScatData( disp, &xylist, &max );
if (npts == 0) return;
xmoments[0] = npts;
ymoments[0] = npts;
xmoments[1] = max.xsum;
ymoments[1] = max.ysum;
xmoments[2] = max.x2sum;
ymoments[2] = max.y2sum;
ax = max.xsum / npts;
ay = max.ysum / npts;
sxy = max.xysum - (max.xsum * max.ysum / npts);
sxx = max.x2sum - (max.xsum * max.xsum / npts);
syy = max.y2sum - (max.ysum * max.ysum / npts);
*r = sxy / sqrt(sxx*syy);
free( xylist );
return;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.