G4-DESCSS/include/Particle.h

73 lines
1.8 KiB
C++

#ifndef DESCSS_Particle_h
#define DESCSS_Particle_h
#include "G4IonTable.hh"
#include "G4ParticleDefinition.hh"
#include "G4ParticleTable.hh"
#include "globals.hh"
class Particle {
public:
Particle(){};
Particle(G4int Z, G4int A) {
if (Z == 1)
ion = G4ParticleTable::GetParticleTable()->FindParticle("proton");
else if (Z == 2)
ion = G4ParticleTable::GetParticleTable()->FindParticle("alpha");
else
ion = G4IonTable::GetIonTable()->GetIon(Z, A, 0);
this->Z = Z, this->A = A;
};
virtual ~Particle(){};
public:
void setC1(G4double v) { C1 = v; };
void setC2(G4double v) { C2 = v; };
void setC3(G4double v) { C3 = v; };
void setC4(G4double v) { C4 = v; };
void setSum(G4double v) { sum = v; };
virtual G4double pdf(G4double E) { return 0; };
public:
G4ParticleDefinition* ion;
protected:
G4int Z, A;
G4double sum;
G4double C1, C2, C3, C4;
};
class TProton : public Particle {
public:
using Particle::Particle;
G4double pdf(G4double y) {
G4double C = C1 * pow(50 - C2, 1 - C3) / sum / (1 - C3);
return pow(sum * (C + y) * (1 - C3) / C1, 1 / (1 - C3)) + C2;
}
};
class GCRProton : public Particle {
public:
using Particle::Particle;
G4double pdf(G4double E) {
G4double pc = getPc(E);
G4double beta = getBeta(E);
return C1 * pow(beta, C2 - 1) * pow(pc / (pc + C3), C4) / pc / sum;
}
private:
G4double M = 931.5;
G4double getPc(G4double E) { return sqrt(2 * M * E + E * E); }
G4double getBeta(G4double E) {
G4double pc = getPc(E);
return pc / sqrt(M * M + pc * pc);
}
};
class GCRIon : public Particle {
public:
using Particle::Particle;
G4double pdf(G4double E) { return C1 * exp(-C2 * E) * (1 - exp(-C3 * E + C4)) / sum; }
};
#endif