3 #include <gsl/gsl_ntuple.h>
4 #include <gsl/gsl_test.h>
5 #include <gsl/gsl_ieee_utils.h>
14 int sel_func (void *ntuple_data, void * params);
15 double val_func (void *ntuple_data, void * params);
20 struct data ntuple_row;
23 double x[1000], y[1000], z[1000], f[100];
25 gsl_ntuple_select_fn S;
26 gsl_ntuple_value_fn V;
30 gsl_ieee_env_setup ();
32 S.function = &sel_func;
35 V.function = &val_func;
39 gsl_ntuple *ntuple = gsl_ntuple_create ("test.dat", &ntuple_row,
44 for (i = 0; i < 100; i++) f[i] = 0;
46 for (i = 0; i < 1000; i++)
48 double xi = 1.0 / (i + 1.5);
50 double zi = xi * xi * xi;
57 x[i] = xi; y[i] = yi; z[i] = zi;
61 double v = xi + yi + zi;
62 int k = (int)(100.0*v*scale);
66 /* printf ("x,y,z = %f,%f,%f; n=%x \n", ntuple_row.x,
67 ntuple_row.y, ntuple_row.z, ntuple_row.num); */
70 int s = gsl_ntuple_bookdata (ntuple);
79 gsl_ntuple_close (ntuple);
81 gsl_test (status, "writing ntuples");
85 gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
89 for (i = 0; i < 1000; i++)
91 gsl_ntuple_read (ntuple);
93 status = (ntuple_row.num != i);
94 status |= (ntuple_row.x != x[i]);
95 status |= (ntuple_row.y != y[i]);
96 status |= (ntuple_row.z != z[i]);
98 /* printf ("x,y,z = %f,%f,%f; n=%d\n", ntuple_row.x,
99 ntuple_row.y, ntuple_row.z, ntuple_row.num); */
101 gsl_ntuple_close (ntuple);
103 gsl_test (status, "reading ntuples");
109 gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
110 sizeof (ntuple_row));
112 gsl_histogram *h = gsl_histogram_calloc_uniform (100, 0., 1.);
114 gsl_ntuple_project (h, ntuple, &V, &S);
116 gsl_ntuple_close (ntuple);
118 /* gsl_histogram_fprintf (stdout, h, "%f", "%f"); */
120 for (i = 0; i < 100; i++)
122 /* printf ("h %g f %g\n", h->bin[i], f[i]); */
124 if (h->bin[i] != f[i])
130 gsl_test (status, "histogramming ntuples");
132 gsl_histogram_free (h);
135 exit (gsl_test_summary());
139 sel_func (void *ntuple_data, void * params)
141 double x, y, z, scale;
142 scale = *(double *)params;
144 x = ((struct data *) ntuple_data)->x;
145 y = ((struct data *) ntuple_data)->y;
146 z = ((struct data *) ntuple_data)->z;
148 return (x*scale < 0.1);
152 val_func (void *ntuple_data, void * params)
154 double x, y, z, scale;
155 scale = *(double *)params;
157 x = ((struct data *) ntuple_data)->x;
158 y = ((struct data *) ntuple_data)->y;
159 z = ((struct data *) ntuple_data)->z;
161 return (x + y + z) * scale;