From c15b0ef098761f3ddb6321397b421677272c0014 Mon Sep 17 00:00:00 2001 From: Felix Riehn <felix@matilda> Date: Fri, 9 Sep 2022 11:19:06 +0100 Subject: [PATCH] sophia stack --- corsika/modules/sophia/SophiaStack.hpp | 126 +++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 corsika/modules/sophia/SophiaStack.hpp diff --git a/corsika/modules/sophia/SophiaStack.hpp b/corsika/modules/sophia/SophiaStack.hpp new file mode 100644 index 000000000..7b3a9235f --- /dev/null +++ b/corsika/modules/sophia/SophiaStack.hpp @@ -0,0 +1,126 @@ +/* + * (c) Copyright 2022 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. + */ + +#pragma once + +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/stack/Stack.hpp> +#include <corsika/modules/sophia/ParticleConversion.hpp> + +#include <sophia.hpp> + +namespace corsika::sophia { + + typedef corsika::Vector<hepmomentum_d> MomentumVector; + + class SophiaStackData { + + public: + void dump() const {} + + void clear() { so_plist_.np = 0; } + unsigned int getSize() const { return so_plist_.np; } + unsigned int getCapacity() const { return 2000; } + + void setId(const unsigned int i, const int v) { so_plist_.llist[i] = v; } + void setEnergy(const unsigned int i, const HEPEnergyType v) { + so_plist_.p[3][i] = v / 1_GeV; + } + void setMass(const unsigned int i, const HEPMassType v) { + so_plist_.p[4][i] = v / 1_GeV; + } + void setMomentum(const unsigned int i, const MomentumVector& v) { + auto tmp = v.getComponents(); + for (int idx = 0; idx < 3; ++idx) so_plist_.p[idx][i] = tmp[idx] / 1_GeV; + } + + int getId(const unsigned int i) const { return so_plist_.llist[i]; } + HEPEnergyType getEnergy(const int i) const { return so_plist_.p[3][i] * 1_GeV; } + HEPEnergyType getMass(const unsigned int i) const { + return so_plist_.p[4][i] * 1_GeV; + } + + MomentumVector getMomentum(const unsigned int i, + const CoordinateSystemPtr& CS) const { + QuantityVector<hepmomentum_d> components = {so_plist_.p[0][i] * 1_GeV, + so_plist_.p[1][i] * 1_GeV, + so_plist_.p[2][i] * 1_GeV}; + return MomentumVector(CS, components); + } + + void copy(const unsigned int i1, const unsigned int i2) { + so_plist_.llist[i2] = so_plist_.llist[i1]; + for (unsigned int i = 0; i < 5; ++i) so_plist_.p[i][i2] = so_plist_.p[i][i1]; + } + + void swap(const unsigned int i1, const unsigned int i2) { + std::swap(so_plist_.llist[i1], so_plist_.llist[i2]); + for (unsigned int i = 0; i < 5; ++i) + std::swap(so_plist_.p[i][i1], so_plist_.p[i][i2]); + } + + void incrementSize() { so_plist_.np++; } + void decrementSize() { + if (so_plist_.np > 0) { so_plist_.np--; } + } + }; + + template <typename TStackIterator> + class ParticleInterface : public corsika::ParticleBase<TStackIterator> { + + using corsika::ParticleBase<TStackIterator>::getStackData; + using corsika::ParticleBase<TStackIterator>::getIndex; + + public: + void setParticleData(const int vID, const HEPEnergyType vE, const MomentumVector& vP, + const HEPMassType vM) { + setPID(vID); + setEnergy(vE); + setMomentum(vP); + setMass(vM); + } + + void setParticleData(ParticleInterface<TStackIterator>& /*parent*/, const int vID, + const HEPEnergyType vE, const MomentumVector& vP, + const HEPMassType vM) { + setPID(vID); + setEnergy(vE); + setMomentum(vP); + setMass(vM); + } + + void setEnergy(const HEPEnergyType v) { getStackData().setEnergy(getIndex(), v); } + + HEPEnergyType getEnergy() const { return getStackData().getEnergy(getIndex()); } + + bool hasDecayed() const { return abs(getStackData().getId(getIndex())) > 100; } + + void setMass(const HEPMassType v) { getStackData().setMass(getIndex(), v); } + + HEPEnergyType getMass() const { return getStackData().getMass(getIndex()); } + + void setPID(const int v) { getStackData().setId(getIndex(), v); } + + corsika::sophia::SophiaCode getPID() const { + return static_cast<corsika::sophia::SophiaCode>(getStackData().getId(getIndex())); + } + + MomentumVector getMomentum(const CoordinateSystemPtr& CS) const { + return getStackData().getMomentum(getIndex(), CS); + } + + void setMomentum(const MomentumVector& v) { + getStackData().setMomentum(getIndex(), v); + } + }; + + typedef corsika::Stack<SophiaStackData, ParticleInterface> SophiaStack; + +} // namespace corsika::sophia -- GitLab