diff options
author | tlatorre <tlatorre@uchicago.edu> | 2018-10-18 09:37:49 -0500 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2018-10-18 09:37:49 -0500 |
commit | ca2a9c2df4eb142f8d4b605e3334ce9bac691521 (patch) | |
tree | 5c9c13ca25f470b7362bbdde6e5eac02c0a98a63 /src/test.c | |
parent | 643204e807d5e78f883fc30dc7383a209e86dbc5 (diff) | |
download | sddm-ca2a9c2df4eb142f8d4b605e3334ce9bac691521.tar.gz sddm-ca2a9c2df4eb142f8d4b605e3334ce9bac691521.tar.bz2 sddm-ca2a9c2df4eb142f8d4b605e3334ce9bac691521.zip |
update fit to fit for electrons and protons
Diffstat (limited to 'src/test.c')
-rw-r--r-- | src/test.c | 174 |
1 files changed, 157 insertions, 17 deletions
@@ -14,6 +14,10 @@ #include <gsl/gsl_spline.h> #include "vector.h" #include <gsl/gsl_statistics.h> +#include "electron.h" +#include "proton.h" +#include "likelihood.h" +#include "id_particles.h" typedef int testFunction(char *err); @@ -111,17 +115,89 @@ struct solid_angle_results { {2.0,2.0,0.282707} }; +int test_proton_get_energy(char *err) +{ + /* A very simple test to make sure the energy as a function of distance + * along the track makes sense. Should include more detailed tests later. */ + double T0, T; + particle *p; + + /* Assume initial kinetic energy is 1 GeV. */ + T0 = 1000.0; + p = particle_init(IDP_PROTON, T0,1.0,10000); + T = particle_get_energy(1e-9,p); + + /* At the beginning of the track we should have roughly the same energy. */ + if (!isclose(T, T0, 1e-5, 0)) { + sprintf(err, "KE = %.5f, but expected %.5f", T, T0); + goto err; + } + + T = particle_get_energy(p->range,p); + + /* At the end of the track the energy should be approximately 0. */ + if (!isclose(T, 0, 1e-5, 1e-5)) { + sprintf(err, "KE = %.5f, but expected %.5f", T, 0.0); + goto err; + } + + particle_free(p); + + return 0; + +err: + particle_free(p); + + return 1; +} + +int test_electron_get_energy(char *err) +{ + /* A very simple test to make sure the energy as a function of distance + * along the track makes sense. Should include more detailed tests later. */ + double T0, T; + particle *p; + + /* Assume initial kinetic energy is 1 GeV. */ + T0 = 1000.0; + p = particle_init(IDP_E_MINUS, T0,1.0,10000); + T = particle_get_energy(1e-9,p); + + /* At the beginning of the track we should have roughly the same energy. */ + if (!isclose(T, T0, 1e-5, 0)) { + sprintf(err, "KE = %.5f, but expected %.5f", T, T0); + goto err; + } + + T = particle_get_energy(p->range,p); + + /* At the end of the track the energy should be approximately 0. */ + if (!isclose(T, 0, 1e-5, 1e-5)) { + sprintf(err, "KE = %.5f, but expected %.5f", T, 0.0); + goto err; + } + + particle_free(p); + + return 0; + +err: + particle_free(p); + + return 1; +} + int test_muon_get_energy(char *err) { /* A very simple test to make sure the energy as a function of distance * along the track makes sense. Should include more detailed tests later. */ - double T0, T, range; - muon_energy *m; + double T0, T; + particle *p; /* Assume initial kinetic energy is 1 GeV. */ T0 = 1000.0; - m = muon_init_energy(T0,1.0,10000); - T = muon_get_energy(1e-9,m); + p = particle_init(IDP_MU_MINUS, T0,1.0,10000); + T = particle_get_energy(1e-9,p); /* At the beginning of the track we should have roughly the same energy. */ if (!isclose(T, T0, 1e-5, 0)) { @@ -129,8 +205,7 @@ int test_muon_get_energy(char *err) goto err; } - range = get_range(T0,1.0); - T = muon_get_energy(range,m); + T = particle_get_energy(p->range,p); /* At the end of the track the energy should be approximately 0. */ if (!isclose(T, 0, 1e-5, 1e-5)) { @@ -138,15 +213,44 @@ int test_muon_get_energy(char *err) goto err; } - muon_free_energy(m); + particle_free(p); return 0; err: - muon_free_energy(m); + particle_free(p); return 1; +} +int test_proton_get_range(char *err) +{ + /* A very simple test to make sure we read in the PDG table correctly. */ + double value; + + value = proton_get_range(1.0,1.0); + + if (!isclose(value, 2.458E-03, 1e-5, 0)) { + sprintf(err, "range = %.5f, but expected %.5f", value, 2.458E-03); + return 1; + } + + return 0; +} + +int test_electron_get_range(char *err) +{ + /* A very simple test to make sure we read in the PDG table correctly. */ + double value; + + value = electron_get_range(1.0,1.0); + + if (!isclose(value, 4.367e-01, 1e-5, 0)) { + sprintf(err, "range = %.5f, but expected %.5f", value, 4.367e-01); + return 1; + } + + return 0; } int test_muon_get_range(char *err) @@ -154,7 +258,7 @@ int test_muon_get_range(char *err) /* A very simple test to make sure we read in the PDG table correctly. */ double value; - value = get_range(1.0,1.0); + value = muon_get_range(1.0,1.0); if (!isclose(value, 2.071e-3, 1e-5, 0)) { sprintf(err, "range = %.5f, but expected %.5f", value, 1.863e-3); @@ -164,12 +268,42 @@ int test_muon_get_range(char *err) return 0; } +int test_proton_get_dEdx(char *err) +{ + /* A very simple test to make sure we read in the PDG table correctly. */ + double value; + + value = proton_get_dEdx(1.0,1.0); + + if (!isclose(value, 2.608E+02, 1e-5, 0)) { + sprintf(err, "dE/dx = %.5f, but expected %.5f", value, 2.608E+02); + return 1; + } + + return 0; +} + +int test_electron_get_dEdx(char *err) +{ + /* A very simple test to make sure we read in the PDG table correctly. */ + double value; + + value = electron_get_dEdx(1.0,1.0); + + if (!isclose(value, 1.862, 1e-5, 0)) { + sprintf(err, "dE/dx = %.5f, but expected %.5f", value, 1.862); + return 1; + } + + return 0; +} + int test_muon_get_dEdx(char *err) { /* A very simple test to make sure we read in the PDG table correctly. */ double value; - value = get_dEdx(1.0,1.0); + value = muon_get_dEdx(1.0,1.0); if (!isclose(value, 5.471, 1e-5, 0)) { sprintf(err, "dE/dx = %.5f, but expected %.5f", value, 6.097); @@ -341,10 +475,10 @@ int test_path(char *err) /* Tests the logsumexp() function. */ int i, j, k; double pos0[3], dir0[3], T0, range, m; - double T, t; + double beta, t; double pos_expected[3], t_expected; double pos[3], dir[3]; - double E, mom, beta; + double E, mom, beta0; double s; double theta0; @@ -372,11 +506,11 @@ int test_path(char *err) /* Calculate total energy */ E = T0 + m; mom = sqrt(E*E - m*m); - beta = mom/E; + beta0 = mom/E; - t_expected = s/(beta*SPEED_OF_LIGHT); + t_expected = s/(beta0*SPEED_OF_LIGHT); - path_eval(p,s,pos,dir,&T,&t,&theta0); + path_eval(p,s,pos,dir,&beta,&t,&theta0); for (k = 0; k < 3; k++) { if (!isclose(pos[k], pos_expected[k], 1e-9, 1e-9)) { @@ -392,8 +526,8 @@ int test_path(char *err) } } - if (!isclose(T, 1.0, 1e-9, 1e-9)) { - sprintf(err, "path_eval(%.2g) returned T = %.5g, but expected %.5g", s, T, 1.0); + if (!isclose(beta, beta0, 1e-9, 1e-9)) { + sprintf(err, "path_eval(%.2g) returned beta = %.5g, but expected %.5g", s, beta, beta0); return 1; } @@ -737,6 +871,12 @@ struct tests { {test_get_path_length, "test_get_path_length"}, {test_mean, "test_mean"}, {test_std, "test_std"}, + {test_electron_get_dEdx, "test_electron_get_dEdx"}, + {test_electron_get_range, "test_electron_get_range"}, + {test_electron_get_energy, "test_electron_get_energy"}, + {test_proton_get_dEdx, "test_proton_get_dEdx"}, + {test_proton_get_range, "test_proton_get_range"}, + {test_proton_get_energy, "test_proton_get_energy"}, }; int main(int argc, char **argv) |