#include "lest.hpp" #include using namespace std; #include "catima/catima.h" using lest::approx; bool rcompare(double a, double b,double eps){ if(fabs((a-b)/fabs(b)) 0.0); EXPECT(res.dEdxo == 0.0); EXPECT(res.tof == 0.0); catima::Layers mat; mat.add(water); auto res2= catima::calculate(p,mat); EXPECT(res2.results.size() == 1); EXPECT(res2.total_result.Eout == res2.results[0].Eout); EXPECT(res2.total_result.Eout == 0.0); EXPECT(res2.total_result.Eloss == 1000*12); EXPECT(res2.total_result.sigma_E == 0.0); EXPECT(res2.total_result.sigma_a == 0.0); EXPECT(res2.total_result.tof == 0.0); }, CASE("constant results from material"){ catima::Projectile p{12,6,6,1000}; catima::Material water({ {1.00794,1,2}, {15.9994,8,1} }); water.density(1.0); water.thickness(10.0); auto res = catima::calculate(p,water); auto res2 = catima::calculate(p,water); EXPECT(res.Eout == res2.Eout); EXPECT(res.Eloss == res2.Eloss); EXPECT(res.sigma_E == res2.sigma_E); EXPECT(res.sigma_a == res2.sigma_a); EXPECT(res.sigma_r == res2.sigma_r); EXPECT(res.dEdxo == res2.dEdxo); EXPECT(res.tof == res2.tof); }, CASE("simplified calculation"){ catima::Projectile p{12,6,6,1000}; catima::Material graphite({ {12.011,6,1}, }); graphite.density(2.0).thickness(1.0); auto res1 = catima::calculate(p,graphite); auto res2 = catima::calculate(12,6,1000,12.011,6,1.0,2.0); EXPECT(res1.Eout == res2.Eout); EXPECT(res1.Eloss == res2.Eloss); EXPECT(res1.sigma_E == res2.sigma_E); EXPECT(res1.sigma_a == res2.sigma_a); EXPECT(res1.sigma_r == res2.sigma_r); EXPECT(res1.dEdxo == res2.dEdxo); EXPECT(res1.tof == res2.tof); auto ra = catima::angular_straggling_from_E(p,res1.Ein,res1.Eout,graphite); EXPECT(res1.sigma_a == ra); auto re = catima::energy_straggling_from_E(p,res1.Ein,res1.Eout,graphite); EXPECT(res1.sigma_E == re); auto eo1 = catima::energy_out(p,1000,graphite); EXPECT(res1.Eout == eo1); auto de1 = catima::dedx_from_range(p,1000,graphite); EXPECT(res1.dEdxi == de1); }, CASE("multilayer basic"){ catima::Projectile p{12,6,6,1000}; catima::Material water({ {1.00794,1,2}, {15.9994,8,1} }); water.density(1.0); water.thickness(10.0); catima::Material graphite({ {12.011,6,1}, }); graphite.density(2.0).thickness(1.0); catima::Layers mat; mat.add(water); mat.add(graphite); auto res = catima::calculate(p(1000),mat); EXPECT(rcompare(res.total_result.Eout,926.3,0.01)); EXPECT(rcompare(res.total_result.sigma_a,0.00269,0.1)); EXPECT(rcompare(res.total_result.tof,0.402,0.01)); EXPECT(rcompare(res.total_result.Eloss,884.218,0.01)); //EXPECT(rcompare(res.total_result.sigma_E,0.7067,0.2)); EXPECT(rcompare(res.results[0].Eout,932.24,0.01)); EXPECT(rcompare(res.results[0].sigma_a,0.00258,0.1)); EXPECT(rcompare(res.results[0].range,107.163,0.01)); EXPECT(rcompare(res.results[1].Eout,926.3,0.01)); EXPECT(rcompare(res.results[1].sigma_a,0.000774,0.1)); EXPECT(rcompare(res.results[1].range,110.715,0.01)); auto res0 = catima::calculate(p(1000),water); EXPECT(res0.Eout == res.results[0].Eout); EXPECT(res0.sigma_a == res.results[0].sigma_a); EXPECT(res0.sigma_E == res.results[0].sigma_E); EXPECT(res0.sigma_r == res.results[0].sigma_r); EXPECT(res0.tof == res.results[0].tof); }, CASE("default material calculations"){ catima::Projectile p{12,6,6,350}; auto air = catima::get_material(catima::material::Air); air.thickness(0.500); auto res = catima::calculate(p(350),air); EXPECT(res.Eout == approx(345.6).epsilon(1e-2)); EXPECT(res.sigma_a == approx(0.0013).epsilon(1e-2)); EXPECT(res.sigma_E == approx(0.12).epsilon(1e-2)); } }; int main( int argc, char * argv[] ) { return lest::run( specification, argc, argv ); }