summaryrefslogtreecommitdiff
path: root/gsl-1.9/ntuple/test.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/ntuple/test.c')
-rw-r--r--gsl-1.9/ntuple/test.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/gsl-1.9/ntuple/test.c b/gsl-1.9/ntuple/test.c
new file mode 100644
index 0000000..68e7dca
--- /dev/null
+++ b/gsl-1.9/ntuple/test.c
@@ -0,0 +1,162 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_ntuple.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+struct data
+{
+ int num;
+ double x;
+ double y;
+ double z;
+};
+int sel_func (void *ntuple_data, void * params);
+double val_func (void *ntuple_data, void * params);
+
+int
+main (void)
+{
+ struct data ntuple_row;
+ int i;
+
+ double x[1000], y[1000], z[1000], f[100];
+
+ gsl_ntuple_select_fn S;
+ gsl_ntuple_value_fn V;
+
+ double scale = 1.5;
+
+ gsl_ieee_env_setup ();
+
+ S.function = &sel_func;
+ S.params = &scale;
+
+ V.function = &val_func;
+ V.params = &scale;
+
+ {
+ gsl_ntuple *ntuple = gsl_ntuple_create ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+
+ int status = 0;
+
+ for (i = 0; i < 100; i++) f[i] = 0;
+
+ for (i = 0; i < 1000; i++)
+ {
+ double xi = 1.0 / (i + 1.5);
+ double yi = xi * xi ;
+ double zi = xi * xi * xi;
+
+ ntuple_row.x = xi;
+ ntuple_row.y = yi;
+ ntuple_row.z = zi;
+ ntuple_row.num = i;
+
+ x[i] = xi; y[i] = yi; z[i] = zi;
+
+ if (xi * scale < 0.1)
+ {
+ double v = xi + yi + zi;
+ int k = (int)(100.0*v*scale);
+ f[k]++;
+ }
+
+ /* printf ("x,y,z = %f,%f,%f; n=%x \n", ntuple_row.x,
+ ntuple_row.y, ntuple_row.z, ntuple_row.num); */
+
+ {
+ int s = gsl_ntuple_bookdata (ntuple);
+
+ if (s != GSL_SUCCESS)
+ {
+ status = 1;
+ }
+ }
+ }
+
+ gsl_ntuple_close (ntuple);
+
+ gsl_test (status, "writing ntuples");
+ }
+
+ {
+ gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+ int status = 0;
+
+ for (i = 0; i < 1000; i++)
+ {
+ gsl_ntuple_read (ntuple);
+
+ status = (ntuple_row.num != i);
+ status |= (ntuple_row.x != x[i]);
+ status |= (ntuple_row.y != y[i]);
+ status |= (ntuple_row.z != z[i]);
+
+ /* printf ("x,y,z = %f,%f,%f; n=%d\n", ntuple_row.x,
+ ntuple_row.y, ntuple_row.z, ntuple_row.num); */
+ }
+ gsl_ntuple_close (ntuple);
+
+ gsl_test (status, "reading ntuples");
+ }
+
+ {
+ int status = 0;
+
+ gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+
+ gsl_histogram *h = gsl_histogram_calloc_uniform (100, 0., 1.);
+
+ gsl_ntuple_project (h, ntuple, &V, &S);
+
+ gsl_ntuple_close (ntuple);
+
+ /* gsl_histogram_fprintf (stdout, h, "%f", "%f"); */
+
+ for (i = 0; i < 100; i++)
+ {
+ /* printf ("h %g f %g\n", h->bin[i], f[i]); */
+
+ if (h->bin[i] != f[i])
+ {
+ status = 1;
+ }
+ }
+
+ gsl_test (status, "histogramming ntuples");
+
+ gsl_histogram_free (h);
+ }
+
+ exit (gsl_test_summary());
+}
+
+int
+sel_func (void *ntuple_data, void * params)
+{
+ double x, y, z, scale;
+ scale = *(double *)params;
+
+ x = ((struct data *) ntuple_data)->x;
+ y = ((struct data *) ntuple_data)->y;
+ z = ((struct data *) ntuple_data)->z;
+
+ return (x*scale < 0.1);
+}
+
+double
+val_func (void *ntuple_data, void * params)
+{
+ double x, y, z, scale;
+ scale = *(double *)params;
+
+ x = ((struct data *) ntuple_data)->x;
+ y = ((struct data *) ntuple_data)->y;
+ z = ((struct data *) ntuple_data)->z;
+
+ return (x + y + z) * scale;
+}