Blame ntuple/test.c

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
}