IAP GITLAB

Skip to content
Snippets Groups Projects
Commit 2edf0cfc authored by ralfulrich's avatar ralfulrich
Browse files

more unit tests

parent ecc99ec1
No related branches found
No related tags found
No related merge requests found
......@@ -48,9 +48,11 @@ namespace corsika::proposal {
calc[std::make_pair(comp.getHash(), code)] = std::move(calculator);
}
template <typename TEnvironment>
inline ContinuousProcess::ContinuousProcess(TEnvironment const& _env)
: ProposalProcessBase(_env) {}
template <typename TEnvironment, typename... TOutputArgs>
inline ContinuousProcess::ContinuousProcess(TEnvironment const& _env,
TOutputArgs&&... args)
: ProposalProcessBase(_env)
, TOutput(args) {}
template <typename TParticle>
inline void ContinuousProcess::scatter(TParticle& vP, HEPEnergyType const& loss,
......@@ -103,11 +105,14 @@ namespace corsika::proposal {
vP.getEnergy() / 1_MeV, dX / 1_g * 1_cm * 1_cm) *
1_MeV;
auto dE = vP.getEnergy() - final_energy;
energy_lost_ += dE;
// if the particle has a charge take multiple scattering into account
if (vP.getChargeNumber() != 0) scatter(vP, dE, dX);
vP.setEnergy(final_energy); // on the stack, this is just kinetic energy, E-m
// also send to output
TOutput::write(vT, vP.getPID(), dE);
return ProcessReturn::Ok;
}
......@@ -143,14 +148,4 @@ namespace corsika::proposal {
return dist;
}
inline void ContinuousProcess::showResults() const {
CORSIKA_LOG_DEBUG(
" ******************************\n"
" PROCESS::ContinuousProcess: \n"
" energy lost dE (GeV) : {}",
energy_lost_ / 1_GeV);
}
inline void ContinuousProcess::reset() { energy_lost_ = 0_GeV; }
} // namespace corsika::proposal
......@@ -40,8 +40,8 @@ namespace corsika {
using MeVgcm2 = decltype(1e6 * electronvolt / gram * square(1e-2 * meter));
public:
template <typename... TArgs>
BetheBlochPDG(TArgs&&... args);
template <typename... TOutputArgs>
BetheBlochPDG(TOutputArgs&&... args);
/**
* Interface function of ContinuousProcess.
......
......@@ -29,9 +29,11 @@ namespace corsika::proposal {
//! use of interpolation tables which are runtime intensive calculation, but can be
//! reused by setting the \param PROPOSAL::InterpolationDef::path_to_tables variable.
//!
template <typename TOutput = WriterOff>
class ContinuousProcess
: public corsika::ContinuousProcess<proposal::ContinuousProcess>,
ProposalProcessBase {
: public corsika::ContinuousProcess<proposal::ContinuousProcess<TOutput>>,
public ProposalProcessBase,
public TOutput {
struct Calculator {
std::unique_ptr<PROPOSAL::Displacement> disp;
......@@ -41,8 +43,6 @@ namespace corsika::proposal {
std::unordered_map<calc_key_t, Calculator, hash>
calc; //!< Stores the displacement and scattering calculators.
HEPEnergyType energy_lost_ = 0 * electronvolt;
//!
//! Build the displacement and scattering calculators and add it to calc.
//!
......@@ -53,8 +53,8 @@ namespace corsika::proposal {
//! Produces the continuous loss calculator for leptons based on nuclear
//! compositions and stochastic description limited by the particle cut.
//!
template <typename TEnvironment>
ContinuousProcess(TEnvironment const&);
template <typename TEnvironment, typename... TOutputArgs>
ContinuousProcess(TEnvironment const&, TOutputArgs&&...);
//!
//! Multiple Scattering of the lepton. Stochastic deflection is not yet taken into
......@@ -80,10 +80,6 @@ namespace corsika::proposal {
//!
template <typename TParticle, typename TTrack>
LengthType getMaxStepLength(TParticle const&, TTrack const&);
void showResults() const;
void reset();
HEPEnergyType getEnergyLost() const { return energy_lost_; }
};
} // namespace corsika::proposal
......
......@@ -7,6 +7,7 @@ set (test_output_sources
testWriterTracks.cpp
testWriterEnergyLoss.cpp
testWriterLongitudinal.cpp
testWriterOff.cpp
)
CORSIKA_ADD_TEST (testOutput SOURCES ${test_output_sources})
......
......@@ -49,8 +49,6 @@ class TestEnergyLoss : public corsika::EnergyLossWriter<> {
public:
TestEnergyLoss(corsika::ShowerAxis const& axis)
: EnergyLossWriter(axis) {}
YAML::Node getConfig() const { return YAML::Node(); }
};
TEST_CASE("EnergyLossWriter") {
......@@ -90,21 +88,37 @@ TEST_CASE("EnergyLossWriter") {
// generate straight simple track
CoordinateSystemPtr rootCS = get_root_CoordinateSystem();
Point r0(rootCS, {0_m, 0_m, 5_km});
Point r0(rootCS, {0_m, 0_m, 7_km});
SpeedType const V0 = constants::c;
VelocityVector v0(rootCS, {V0, 0_m / second, 0_m / second});
Line const line(r0, v0);
auto const time = 10_ns;
auto const time = 1000_ns;
StraightTrajectory track(line, time);
// test write
test.write(track, Code::Proton, 100_GeV);
// incompatible binning
CHECK_THROWS(
test.write(100_g / square(1_cm), 120_g / square(1_cm), Code::Photon, 100_GeV));
CHECK_THROWS(test.write(100_g / square(1_cm), // extra line break by purpose
120_g / square(1_cm), Code::Photon, 100_GeV));
test.write(100000_g / square(1_cm), 100010_g / square(1_cm), Code::Photon,
100_GeV); // this doesn't throw, but it skips
test.endOfShower(0);
test.endOfLibrary();
CHECK(boost::filesystem::exists("./output_dir_eloss/dEdX.parquet"));
auto const config = test.getConfig();
CHECK(config["type"].as<std::string>() == "EnergyLoss");
CHECK(config["units"]["energy"].as<std::string>() == "GeV");
CHECK(config["units"]["grammage"].as<std::string>() == "g/cm^2");
CHECK(config["bin-size"].as<double>() == 10.);
CHECK(config["nbins"].as<int>() == 200);
CHECK(config["grammage_threshold"].as<double>() == Approx(0.0001));
auto const summary = test.getSummary();
CHECK(summary["sum_dEdX"].as<double>() == 300);
// makes not yet sense:
// CHECK(summary["Xmax"].as<double>() == 200);
// CHECK(summary["dEdXmax"].as<double>() == 200);
}
......@@ -23,6 +23,8 @@
#include <corsika/framework/core/PhysicalUnits.hpp>
#include <corsika/framework/core/Logging.hpp>
#include <string>
using namespace corsika;
const auto density = 1_kg / (1_m * 1_m * 1_m);
......@@ -50,8 +52,6 @@ class TestLongitudinal : public corsika::LongitudinalWriter<> {
public:
TestLongitudinal(corsika::ShowerAxis const& axis)
: LongitudinalWriter(axis) {}
YAML::Node getConfig() const { return YAML::Node(); }
};
TEST_CASE("LongitudinalWriter") {
......@@ -85,17 +85,42 @@ TEST_CASE("LongitudinalWriter") {
// generate straight simple track
CoordinateSystemPtr rootCS = get_root_CoordinateSystem();
Point r0(rootCS, {0_km, 0_m, 5_m});
Point r0(rootCS, {0_km, 0_m, 7_m});
SpeedType const V0 = constants::c;
VelocityVector v0(rootCS, {V0, 0_m / second, 0_m / second});
Line const line(r0, v0);
auto const time = 10_ns;
auto const time = 1000_ns;
StraightTrajectory track(line, time);
// test write
test.write(track, Code::Proton, 1.0);
test.write(track, Code::Photon, 1.0);
test.write(track, Code::Electron, 1.0);
test.write(track, Code::Positron, 1.0);
test.write(track, Code::MuPlus, 1.0);
test.write(track, Code::MuMinus, 1.0);
test.write(10_g / square(1_cm), 20_g / square(1_cm), Code::PiPlus, 1.0);
test.write(10_g / square(1_cm), 20_g / square(1_cm), Code::Electron, 1.0);
test.write(10_g / square(1_cm), 20_g / square(1_cm), Code::Positron, 1.0);
test.write(10_g / square(1_cm), 20_g / square(1_cm), Code::Photon, 1.0);
test.write(10_g / square(1_cm), 20_g / square(1_cm), Code::MuPlus, 1.0);
test.write(10_g / square(1_cm), 20_g / square(1_cm), Code::MuMinus, 1.0);
// wrong binning
CHECK_THROWS(test.write(10_g / square(1_cm), 10.1_g / square(1_cm), Code::PiPlus, 1.0));
test.write(100000_g / square(1_cm), 100010_g / square(1_cm), Code::PiPlus,
1.0); // this doesn't throw, it just skips
test.endOfShower(0);
test.endOfLibrary();
CHECK(boost::filesystem::exists("./output_dir_long/profile.parquet"));
auto const config = test.getConfig();
CHECK(config["type"].as<std::string>() == "LongitudinalProfile");
CHECK(config["units"]["grammage"].as<std::string>() == "g/cm^2");
CHECK(config["bin-size"].as<double>() == 10.);
CHECK(config["nbins"].as<int>() == 200);
auto const summary = test.getSummary(); // nothing to check yet
}
......@@ -22,7 +22,11 @@ struct TestWriterPlane : public ParticleWriterParquet {
YAML::Node getConfig() const { return YAML::Node(); }
void checkWrite() {
ParticleWriterParquet::write(Code::Unknown, 1_eV, 2_m, 3_m, 0_m, 1.0);
ParticleWriterParquet::write(Code::Unknown, 1_GeV, 2_m, 3_m, 0_m, 1.0);
ParticleWriterParquet::write(Code::Proton, 1_GeV, 2_m, 3_m, 0_m, 1.0);
ParticleWriterParquet::write(Code::MuPlus, 1_GeV, 2_m, 3_m, 0_m, 1.0);
ParticleWriterParquet::write(Code::MuMinus, 1_GeV, 2_m, 3_m, 0_m, 1.0);
ParticleWriterParquet::write(Code::Photon, 1_GeV, 2_m, 3_m, 0_m, 1.0);
}
};
......@@ -41,10 +45,21 @@ TEST_CASE("ObservationPlaneWriterParquet") {
TestWriterPlane test;
test.startOfLibrary("./output_dir");
test.startOfShower(0);
// write a few particles
test.checkWrite();
test.endOfShower(0);
test.endOfLibrary();
CHECK(boost::filesystem::exists("./output_dir/particles.parquet"));
auto const summary = test.getSummary();
CHECK(summary["Eground"].as<double>() == Approx(5));
CHECK(summary["hadrons"].as<int>() == Approx(1));
CHECK(summary["muons"].as<int>() == Approx(2));
CHECK(summary["em"].as<int>() == Approx(1));
CHECK(summary["others"].as<int>() == Approx(1));
}
}
/*
* (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
*
* This software is distributed under the terms of the GNU General Public
* Licence version 3 (GPL Version 3). See file LICENSE for a full version of
* the license.
*/
#include <catch2/catch.hpp>
#include <boost/filesystem.hpp>
#include <corsika/modules/writers/WriterOff.hpp>
#include <corsika/framework/core/Logging.hpp>
using namespace corsika;
/*
class TestEnergyLoss : public corsika::EnergyLossWriter<> {
public:
TestEnergyLoss(corsika::ShowerAxis const& axis)
: EnergyLossWriter(axis) {}
YAML::Node getConfig() const { return YAML::Node(); }
};
*/
TEST_CASE("WriterOff") {
logging::set_level(logging::level::info);
WriterOff test("irrelevant", 3);
WriterOff test2();
test.startOfLibrary("./output_dir_eloss");
test.startOfShower(0);
test.endOfShower(0);
test.endOfLibrary();
auto const config = test.getConfig();
auto const summary = test.getSummary();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment