diff options
Diffstat (limited to 'src/test.c')
-rw-r--r-- | src/test.c | 135 |
1 files changed, 135 insertions, 0 deletions
@@ -1227,6 +1227,139 @@ int test_norm_cdf(char *err) return 0; } +static double gsl_time_pdf(double x, void *params) +{ + double mu_noise, mu_indirect, mu_direct, mu_shower, ts, ts_shower, tmean, tsigma, ts_sigma; + + double *pars = (double *) params; + + mu_noise = pars[0]; + mu_indirect = pars[1]; + mu_direct = pars[2]; + mu_shower = pars[3]; + ts = pars[4]; + ts_shower = pars[5]; + tmean = pars[6]; + tsigma = pars[7]; + ts_sigma = pars[8]; + + return time_pdf(x,mu_noise,mu_indirect,&mu_direct,&mu_shower,1,&ts,&ts_shower,tmean,tsigma,&ts_sigma); +} + +int test_time_pdf_norm(char *err) +{ + /* Tests the time_pdf() function. */ + size_t i; + gsl_integration_cquad_workspace *w; + gsl_function F; + double result, error; + int status; + size_t nevals; + double params[9]; + double expected; + + w = gsl_integration_cquad_workspace_alloc(100); + + params[0] = 0.1; + params[1] = 0.5; + params[2] = 1.0; + params[3] = 1.0; + params[4] = 100.0; + params[5] = 120.0; + params[6] = 100.0; + params[7] = PMT_TTS; + params[8] = 10.0; + + F.function = &gsl_time_pdf; + F.params = params; + + init_genrand(0); + + for (i = 0; i < 100; i++) { + params[0] = genrand_real2(); + params[1] = genrand_real2(); + params[2] = genrand_real2(); + params[3] = genrand_real2(); + + status = gsl_integration_cquad(&F, 0, GTVALID, 0, 1e-9, w, &result, &error, &nevals); + + if (status) { + sprintf(err, "error integrating time PDF: %s\n", gsl_strerror(status)); + goto err; + } + + expected = 1.0; + + if (!isclose(result, expected, 1e-2, 0)) { + sprintf(err, "integral of time_pdf = %.5f, but expected %.5f", result, expected); + return 1; + } + } + + return 0; + +err: + return 1; +} + +int test_time_cdf(char *err) +{ + /* Tests the time_cdf() function. */ + size_t i; + gsl_integration_cquad_workspace *w; + gsl_function F; + double result, error; + int status; + size_t nevals; + double params[9]; + double expected; + + w = gsl_integration_cquad_workspace_alloc(100); + + params[0] = 0.1; + params[1] = 0.5; + params[2] = 1.0; + params[3] = 1.0; + params[4] = 100.0; + params[5] = 120.0; + params[6] = 100.0; + params[7] = PMT_TTS; + params[8] = 10.0; + + F.function = &gsl_time_pdf; + F.params = params; + + init_genrand(0); + + for (i = 0; i < 100; i++) { + params[0] = genrand_real2(); + params[1] = genrand_real2(); + params[2] = genrand_real2(); + params[3] = genrand_real2(); + + double t = genrand_real2()*GTVALID; + + status = gsl_integration_cquad(&F, 0, t, 0, 1e-9, w, &result, &error, &nevals); + + if (status) { + sprintf(err, "error integrating time PDF: %s\n", gsl_strerror(status)); + goto err; + } + + expected = time_cdf(t,params[0],params[1],¶ms[2],¶ms[3],1,¶ms[4],¶ms[5],params[6],params[7],¶ms[8]); + + if (!isclose(result, expected, 1e-2, 0)) { + sprintf(err, "integral of time_pdf = %.5f, but expected %.5f", result, expected); + return 1; + } + } + + return 0; + +err: + return 1; +} + struct tests { testFunction *test; char *name; @@ -1263,6 +1396,8 @@ struct tests { {test_solid_angle_fast, "test_solid_angle_fast"}, {test_norm, "test_norm"}, {test_norm_cdf, "test_norm_cdf"}, + {test_time_pdf_norm, "test_time_pdf_norm"}, + {test_time_cdf, "test_time_cdf"}, }; int main(int argc, char **argv) |