IAP GITLAB

Skip to content
Snippets Groups Projects
SibStack.h 1.64 KiB
#ifndef _include_sibstack_h_
#define _include_sibstack_h_

#include <string>
#include <vector>

#include <corsika/cascade/sibyll2.3c.h>
#include <corsika/process/sibyll/ParticleConversion.h>
#include <corsika/stack/Stack.h>

using namespace std;
using namespace corsika::stack;

class SibStackData {

public:
  void Init();

  void Clear() { s_plist_.np = 0; }

  int GetSize() const { return s_plist_.np; }
  int GetCapacity() const { return 8000; }

  void SetId(const int i, const int v) { s_plist_.llist[i] = v; }
  void SetEnergy(const int i, const double v) { s_plist_.p[3][i] = v; }

  int GetId(const int i) const { return s_plist_.llist[i]; }
  double GetEnergy(const int i) const { return s_plist_.p[3][i]; }

  void Copy(const int i1, const int i2) {
    s_plist_.llist[i1] = s_plist_.llist[i2];
    s_plist_.p[3][i1] = s_plist_.p[3][i2];
  }

protected:
  void IncrementSize() { s_plist_.np++; }
  void DecrementSize() {
    if (s_plist_.np > 0) { s_plist_.np--; }
  }
};

template <typename StackIteratorInterface>
class ParticleInterface : public ParticleBase<StackIteratorInterface> {
  using ParticleBase<StackIteratorInterface>::GetStackData;
  using ParticleBase<StackIteratorInterface>::GetIndex;

public:
  void SetEnergy(const double v) { GetStackData().SetEnergy(GetIndex(), v); }
  double GetEnergy() const { return GetStackData().GetEnergy(GetIndex()); }
  void SetPID(const int v) { GetStackData().SetId(GetIndex(), v); }
  corsika::process::sibyll::SibyllCode GetPID() const {
    return static_cast<corsika::process::sibyll::SibyllCode>(
        GetStackData().GetId(GetIndex()));
  }
};

typedef Stack<SibStackData, ParticleInterface> SibStack;

#endif