/* Copyright (c) 2019, Anthony Latorre * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ #ifndef LIKELIHOOD_H #define LIKELIHOOD_H #include "event.h" #include /* for size_t */ #include #include /* Probability that a channel is miscalibrated and/or not working even though * it's marked as OK in DQXX, etc. */ #define P_MISCALIBRATION 1e-4 #define EPSILON 1e-10 #define PSUP_REFLECTION_TIME 80.0 /* Minimum number of points in the track integral. */ #define MIN_NPOINTS 10 /* To avoid having to allocate new arrays every time we evaluate the likelihood * function, we just allocate static arrays with `MAX_POINTS` elements. */ #define MAX_NPOINTS 1000 /* Maximum number of PE to consider if the PMT was hit. */ #define MAX_PE 10000 /* Maximum number of PE to consider if the PMT wasn't hit. * * Note: This must be less than MAX_PE. */ #define MAX_PE_NO_HIT 10 /* To speed things up we quit calculating the probability of a hit when the * ratio between the current probability and the maximum probability is less * than 10**(-MIN_RATIO). So if MIN_RATIO is -10, that means that we ignore * probabilities which are 10 million times less likely than the most probable * value for n. */ #define MIN_RATIO -10 /* Same as above but for the "fast" likelihood calculation. */ #define MIN_RATIO_FAST -2 /* The fraction of reflected light which is detected. */ #define CHARGE_FRACTION 0.4 /* Dark rate of the PMTs (Hz). * * From pmt_response.dat in SNOMAN. */ #define DARK_RATE 1000.0 /* Single PE transit time spread (ns). * * From pmt_response.dat in SNOMAN. */ #define PMT_TTS 1.61 /* Event window (ns) */ #define GTVALID 400.0 #define BETA_MIN 0.8 /* Maximum number of vertices to fit. */ #define MAX_VERTICES 10 typedef struct vertex { int id; double T0; double pos[3]; double dir[3]; double t0; double z1[10]; double z2[10]; size_t n; } vertex; typedef struct particle { int id; double mass; double range; double *x; double *T; double *cos_theta; double *cdf_shower; /* Spline for looking up cdf -> cos(theta). */ gsl_spline *spline_shower; gsl_interp_accel *acc_shower; double *cdf_delta; double *x_shower; double *gamma_pdf; double xlo_shower; double xhi_shower; double pos_a; double pos_b; gsl_spline *spline_delta; gsl_interp_accel *acc_delta; size_t n; double a; double b; double shower_photons; double delta_ray_a; double delta_ray_b; double delta_ray_photons; } particle; particle *particle_init(int id, double T0, size_t n); double particle_get_energy(double x, particle *p); void particle_free(particle *p); double time_pdf(double t, double mu_noise, double mu_indirect, double *mu, size_t n, double *ts, double tmean, double *ts_sigma); double time_cdf(double t, double mu_noise, double mu_indirect, double *mu, size_t n, double *ts, double tmean, double *ts_sigma); double nll_best(event *ev); double nll(event *ev, vertex *v, size_t n, double dx, int ns, const int fast, int charge_only, int hit_only); #endif