00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "G4alphaIonisation.hh"
00049
00050 #include "G4PhysicalConstants.hh"
00051 #include "G4SystemOfUnits.hh"
00052 #include "G4Electron.hh"
00053 #include "G4Alpha.hh"
00054 #include "G4BraggIonModel.hh"
00055 #include "G4BetheBlochModel.hh"
00056 #include "G4UnitsTable.hh"
00057 #include "G4LossTableManager.hh"
00058 #include "G4IonFluctuations.hh"
00059 #include "G4UniversalFluctuation.hh"
00060
00061
00062
00063 using namespace std;
00064
00065 G4alphaIonisation::G4alphaIonisation(const G4String& name)
00066 : G4VEnergyLossProcess(name),
00067 theParticle(0),
00068 isInitialised(false)
00069 {
00070 G4Exception("G4alphaIonisation::G4alphaIonisation","em0007",JustWarning,
00071 " The process is not ready for use - incorrect results are expected");
00072 SetLinearLossLimit(0.02);
00073 SetStepFunction(0.2, 0.01*mm);
00074
00075 SetProcessSubType(fIonisation);
00076
00077 mass = 0.0;
00078 ratio = 0.0;
00079 eth = 8*MeV;
00080 }
00081
00082
00083
00084 G4alphaIonisation::~G4alphaIonisation()
00085 {}
00086
00087
00088
00089 G4bool G4alphaIonisation::IsApplicable(const G4ParticleDefinition& p)
00090 {
00091 return (!p.IsShortLived() &&
00092 std::fabs(p.GetPDGCharge()/CLHEP::eplus - 2) < 0.01);
00093 }
00094
00095
00096
00097 G4double G4alphaIonisation::MinPrimaryEnergy(const G4ParticleDefinition*,
00098 const G4Material*,
00099 G4double cut)
00100 {
00101 G4double x = 0.5*cut/electron_mass_c2;
00102 G4double gam = x*ratio + std::sqrt((1. + x)*(1. + x*ratio*ratio));
00103 return mass*(gam - 1.0);
00104 }
00105
00106
00107
00108 void G4alphaIonisation::InitialiseEnergyLossProcess(
00109 const G4ParticleDefinition* part,
00110 const G4ParticleDefinition* bpart)
00111 {
00112 if(!isInitialised) {
00113
00114 theParticle = part;
00115 G4String pname = part->GetParticleName();
00116
00117
00118 const G4ParticleDefinition* theBaseParticle = 0;
00119 if(bpart == 0) {
00120 if(pname != "alpha") { theBaseParticle = G4Alpha::Alpha(); }
00121 } else { theBaseParticle = bpart; }
00122
00123 mass = part->GetPDGMass();
00124 ratio = electron_mass_c2/mass;
00125
00126 SetBaseParticle(theBaseParticle);
00127 SetSecondaryParticle(G4Electron::Electron());
00128
00129 if (!EmModel(1)) { SetEmModel(new G4BraggIonModel(), 1); }
00130 EmModel(1)->SetLowEnergyLimit(MinKinEnergy());
00131
00132
00133 eth = (EmModel(1)->HighEnergyLimit())*mass/proton_mass_c2;
00134 EmModel(1)->SetHighEnergyLimit(eth);
00135
00136 if (!FluctModel()) { SetFluctModel(new G4UniversalFluctuation()); }
00137 AddEmModel(1, EmModel(1), new G4IonFluctuations());
00138
00139 if (!EmModel(2)) { SetEmModel(new G4BetheBlochModel(),2); }
00140 EmModel(2)->SetLowEnergyLimit(eth);
00141 EmModel(2)->SetHighEnergyLimit(MaxKinEnergy());
00142 AddEmModel(2, EmModel(2), FluctModel());
00143
00144 isInitialised = true;
00145 }
00146 }
00147
00148
00149
00150 void G4alphaIonisation::PrintInfo()
00151 {}
00152
00153