|
Packit |
67cb25 |
#include <config.h>
|
|
Packit |
67cb25 |
#include <stdlib.h>
|
|
Packit |
67cb25 |
#include <string.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_ntuple.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_test.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_ieee_utils.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
struct data
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
int num;
|
|
Packit |
67cb25 |
double x;
|
|
Packit |
67cb25 |
double y;
|
|
Packit |
67cb25 |
double z;
|
|
Packit |
67cb25 |
};
|
|
Packit |
67cb25 |
int sel_func (void *ntuple_data, void * params);
|
|
Packit |
67cb25 |
double val_func (void *ntuple_data, void * params);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
main (void)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
struct data ntuple_row;
|
|
Packit |
67cb25 |
int i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double x[1000], y[1000], z[1000], f[100];
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_ntuple_select_fn S;
|
|
Packit |
67cb25 |
gsl_ntuple_value_fn V;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double scale = 1.5;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_ieee_env_setup ();
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* zero struct including padding bytes to avoid valgrind errors */
|
|
Packit |
67cb25 |
memset(&ntuple_row, 0, sizeof(struct data));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
S.function = &sel_func;
|
|
Packit |
67cb25 |
S.params = &scal;;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
V.function = &val_func;
|
|
Packit |
67cb25 |
V.params = &scal;;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_ntuple *ntuple = gsl_ntuple_create ("test.dat", &ntuple_row,
|
|
Packit |
67cb25 |
sizeof (ntuple_row));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int status = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < 100; i++) f[i] = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < 1000; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double xi = 1.0 / (i + 1.5);
|
|
Packit |
67cb25 |
double yi = xi * xi ;
|
|
Packit |
67cb25 |
double zi = xi * xi * xi;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
ntuple_row.x = xi;
|
|
Packit |
67cb25 |
ntuple_row.y = yi;
|
|
Packit |
67cb25 |
ntuple_row.z = zi;
|
|
Packit |
67cb25 |
ntuple_row.num = i;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
x[i] = xi; y[i] = yi; z[i] = zi;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (xi * scale < 0.1)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double v = xi + yi + zi;
|
|
Packit |
67cb25 |
int k = (int)(100.0*v*scale);
|
|
Packit |
67cb25 |
f[k]++;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* printf ("x,y,z = %f,%f,%f; n=%x \n", ntuple_row.x,
|
|
Packit |
67cb25 |
ntuple_row.y, ntuple_row.z, ntuple_row.num); */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
int s = gsl_ntuple_bookdata (ntuple);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (s != GSL_SUCCESS)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
status = 1;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_ntuple_close (ntuple);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test (status, "writing ntuples");
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
|
|
Packit |
67cb25 |
sizeof (ntuple_row));
|
|
Packit |
67cb25 |
int status = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < 1000; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
gsl_ntuple_read (ntuple);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
status = (ntuple_row.num != i);
|
|
Packit |
67cb25 |
status |= (ntuple_row.x != x[i]);
|
|
Packit |
67cb25 |
status |= (ntuple_row.y != y[i]);
|
|
Packit |
67cb25 |
status |= (ntuple_row.z != z[i]);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* printf ("x,y,z = %f,%f,%f; n=%d\n", ntuple_row.x,
|
|
Packit |
67cb25 |
ntuple_row.y, ntuple_row.z, ntuple_row.num); */
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
gsl_ntuple_close (ntuple);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test (status, "reading ntuples");
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
int status = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
|
|
Packit |
67cb25 |
sizeof (ntuple_row));
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_histogram *h = gsl_histogram_calloc_uniform (100, 0., 1.);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_ntuple_project (h, ntuple, &V, &S);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_ntuple_close (ntuple);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* gsl_histogram_fprintf (stdout, h, "%f", "%f"); */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (i = 0; i < 100; i++)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* printf ("h %g f %g\n", h->bin[i], f[i]); */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (h->bin[i] != f[i])
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
status = 1;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_test (status, "histogramming ntuples");
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_histogram_free (h);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
exit (gsl_test_summary());
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
sel_func (void *ntuple_data, void * params)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double x, y, z, scale;
|
|
Packit |
67cb25 |
scale = *(double *)params;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
x = ((struct data *) ntuple_data)->x;
|
|
Packit |
67cb25 |
y = ((struct data *) ntuple_data)->y;
|
|
Packit |
67cb25 |
z = ((struct data *) ntuple_data)->z;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return (x*scale < 0.1);
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
double
|
|
Packit |
67cb25 |
val_func (void *ntuple_data, void * params)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double x, y, z, scale;
|
|
Packit |
67cb25 |
scale = *(double *)params;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
x = ((struct data *) ntuple_data)->x;
|
|
Packit |
67cb25 |
y = ((struct data *) ntuple_data)->y;
|
|
Packit |
67cb25 |
z = ((struct data *) ntuple_data)->z;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return (x + y + z) * scale;
|
|
Packit |
67cb25 |
}
|