Added MACS source
[htsworkflow.git] / htswanalysis / MACS / lib / gsl / gsl-1.11 / ntuple / test.c
1 #include <config.h>
2 #include <stdlib.h>
3 #include <gsl/gsl_ntuple.h>
4 #include <gsl/gsl_test.h>
5 #include <gsl/gsl_ieee_utils.h>
6
7 struct data
8 {
9   int num;
10   double x;
11   double y;
12   double z;
13 };
14 int sel_func (void *ntuple_data, void * params);
15 double val_func (void *ntuple_data, void * params);
16
17 int
18 main (void)
19 {
20   struct data ntuple_row;
21   int i;
22
23   double x[1000], y[1000], z[1000], f[100];
24
25   gsl_ntuple_select_fn S;
26   gsl_ntuple_value_fn V;
27   
28   double scale = 1.5;
29   
30   gsl_ieee_env_setup ();
31
32   S.function = &sel_func;
33   S.params = &scale;
34   
35   V.function = &val_func;
36   V.params = &scale;
37
38   {
39     gsl_ntuple *ntuple = gsl_ntuple_create ("test.dat", &ntuple_row, 
40                                             sizeof (ntuple_row));
41
42     int status = 0;
43
44     for (i = 0; i < 100; i++) f[i] = 0;
45     
46     for (i = 0; i < 1000; i++)
47       {
48         double xi = 1.0 / (i + 1.5);
49         double yi = xi * xi ;
50         double zi = xi * xi * xi;
51         
52         ntuple_row.x = xi;
53         ntuple_row.y = yi;
54         ntuple_row.z = zi;
55         ntuple_row.num = i;
56         
57         x[i] = xi; y[i] = yi; z[i] = zi;
58         
59         if (xi * scale < 0.1)
60           {
61             double v = xi + yi + zi;
62             int k = (int)(100.0*v*scale);
63             f[k]++;
64           }
65
66         /* printf ("x,y,z = %f,%f,%f; n=%x \n", ntuple_row.x,
67            ntuple_row.y, ntuple_row.z, ntuple_row.num); */
68         
69         {
70           int s = gsl_ntuple_bookdata (ntuple);
71
72           if (s != GSL_SUCCESS)
73             {
74               status = 1;
75             }
76         }
77       }
78     
79     gsl_ntuple_close (ntuple);
80
81     gsl_test (status, "writing ntuples");
82   }
83
84   {
85     gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row, 
86                                           sizeof (ntuple_row));
87     int status = 0;
88
89     for (i = 0; i < 1000; i++)
90       {
91         gsl_ntuple_read (ntuple);
92
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]);
97
98         /* printf ("x,y,z = %f,%f,%f; n=%d\n", ntuple_row.x,
99                 ntuple_row.y, ntuple_row.z, ntuple_row.num); */
100       }
101     gsl_ntuple_close (ntuple);
102
103     gsl_test (status, "reading ntuples");
104   }    
105
106   {
107     int status = 0;
108
109     gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row, 
110                                           sizeof (ntuple_row));
111
112     gsl_histogram *h = gsl_histogram_calloc_uniform (100, 0., 1.);
113
114     gsl_ntuple_project (h, ntuple, &V, &S);
115
116     gsl_ntuple_close (ntuple);
117
118     /* gsl_histogram_fprintf (stdout, h, "%f", "%f"); */
119
120     for (i = 0; i < 100; i++)
121       {
122         /* printf ("h  %g f  %g\n", h->bin[i], f[i]); */
123
124         if (h->bin[i] != f[i])
125           {
126             status = 1;
127           }
128       }
129
130     gsl_test (status, "histogramming ntuples");
131
132     gsl_histogram_free (h);
133   }
134
135   exit (gsl_test_summary());
136 }
137
138 int
139 sel_func (void *ntuple_data, void * params)
140 {
141   double x, y, z, scale;
142   scale = *(double *)params;
143
144   x = ((struct data *) ntuple_data)->x;
145   y = ((struct data *) ntuple_data)->y;
146   z = ((struct data *) ntuple_data)->z;
147
148   return (x*scale < 0.1);
149 }
150
151 double
152 val_func (void *ntuple_data, void * params)
153 {
154   double x, y, z, scale;
155   scale = *(double *)params;
156
157   x = ((struct data *) ntuple_data)->x;
158   y = ((struct data *) ntuple_data)->y;
159   z = ((struct data *) ntuple_data)->z;
160
161   return (x + y + z) * scale;
162 }