00001
00015 #ifndef RADIATION_H
00016 #define RADIATION_H
00017
00018 #include "GaudiKernel/RndmGenerators.h"
00019 #include <string>
00020 #include <iostream>
00021
00022 namespace GenDecay {
00023
00024 enum RadiationType {
00025 Unknown = 0,
00026 Alpha, BetaMinus, BetaPlus, Gamma, EleCapture,
00027 };
00028
00029 class Radiation {
00030 protected:
00031
00032 double m_energy;
00033
00034 public:
00035
00036 Radiation(double characteristic_energy);
00037 virtual ~Radiation();
00038
00039 virtual double kineticEnergy() const;
00040
00041
00042 virtual std::string asString() const = 0;
00043
00044 virtual RadiationType type() const = 0;
00045 virtual int pid() const = 0;
00046 virtual double mass() const = 0;
00047 virtual std::string typeString() const = 0;
00048
00049 };
00050
00051
00052 class AlphaRadiation : public Radiation
00053 {
00054 int m_parentA;
00055
00056 public:
00057
00058 AlphaRadiation(double energy, int parentA);
00059 virtual ~AlphaRadiation();
00060
00061 std::string asString() const;
00062
00063 double kineticEnergy() const;
00064 int pid() const;
00065 double mass() const;
00066
00067 RadiationType type() const { return Alpha; }
00068 std::string typeString() const { return "Alpha"; }
00069 };
00070
00071 class BetaRadiation : public Radiation
00072 {
00073 int m_parentZ;
00074 int m_daughterZ;
00075 int m_betaSign;
00076 double m_endpoint;
00077
00078 double m_norm, m_maximum;
00079 mutable Rndm::Numbers m_rand;
00080
00081 void normalize();
00082
00083 public:
00084
00085 BetaRadiation(double energy, int parentZ);
00086 virtual ~BetaRadiation();
00087
00088 RadiationType type() const { return (m_betaSign < 0 ? BetaMinus : BetaPlus); }
00089 std::string typeString() const { return (m_betaSign < 0 ? "BetaMinus" : "BetaPlus"); }
00090
00091 std::string asString() const;
00092
00093 int sign() const { return m_betaSign; }
00094
00095 double kineticEnergy() const;
00096 int pid() const;
00097 double mass() const;
00098
00099 double dnde(double kineticEnergy) const;
00100 double dnde_noff(double kineticEnergy) const;
00101 double fermi_function(double kineticEnergy) const;
00102 };
00103
00104 class GammaRadiation : public Radiation
00105 {
00106 public:
00107 GammaRadiation(double energy);
00108 virtual ~GammaRadiation();
00109
00110 int pid() const;
00111 double mass() const;
00112
00113 std::string asString() const;
00114 RadiationType type() const { return Gamma; }
00115 std::string typeString() const { return "Gamma"; }
00116 };
00117
00118 class ElectronCapture: public Radiation
00119 {
00120 public:
00121 ElectronCapture(double characteristic_energy);
00122 virtual ~ElectronCapture();
00123
00124 std::string asString() const;
00125 int pid() const;
00126 double mass() const;
00127 RadiationType type() const { return EleCapture; }
00128 std::string typeString() const { return "EleCapture"; }
00129 };
00130
00131 }
00132
00133 std::ostream& operator<<(std::ostream& o, const GenDecay::Radiation& r);
00134
00135
00136 #endif // RADIATION_H