69 lines
1.8 KiB
C++
69 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(G4String name, 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->name = name;
|
|
this->Z = Z, this->A = A;
|
|
};
|
|
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);
|
|
|
|
protected:
|
|
G4ParticleDefinition* ion;
|
|
G4int Z, A;
|
|
G4String name;
|
|
G4double sum;
|
|
G4double C1, C2, C3, C4;
|
|
};
|
|
|
|
class TProton : public Particle {
|
|
public:
|
|
TProton();
|
|
G4double pdf(G4double E) {
|
|
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:
|
|
GCRProton();
|
|
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:
|
|
GCRIon();
|
|
G4double pdf(G4double E) { return C1 * exp(-C2 * E) * (1 - exp(-C3 * E + C4)) / sum; }
|
|
};
|
|
|
|
#endif |