43 :
G4VEmModel(nam),fParticleChange(0),smallEnergy(2.*MeV),
45 crossSectionHandler(0),meanFreePathTable(0)
47 lowEnergyLimit = 2.0*electron_mass_c2;
48 highEnergyLimit = 100 * GeV;
59 if(verboseLevel > 0) {
60 G4cout <<
"Livermore Nuclear Gamma conversion is constructed " <<
G4endl
62 << lowEnergyLimit / MeV <<
" MeV - "
63 << highEnergyLimit / GeV <<
" GeV"
72 if (crossSectionHandler)
delete crossSectionHandler;
82 G4cout <<
"Calling G4LivermoreNuclearGammaConversionModel::Initialise()" <<
G4endl;
84 if (crossSectionHandler)
86 crossSectionHandler->
Clear();
87 delete crossSectionHandler;
93 crossSectionHandler->
Initialise(0,lowEnergyLimit,100.*GeV,400);
94 G4String crossSectionFile =
"pairdata/pp-pair-cs-";
95 crossSectionHandler->
LoadData(crossSectionFile);
99 if (verboseLevel > 0) {
100 G4cout <<
"Loaded cross section files for Livermore GammaConversion" <<
G4endl;
101 G4cout <<
"To obtain the total cross section this should be used only " <<
G4endl
102 <<
"in connection with G4ElectronGammaConversion " <<
G4endl;
105 if (verboseLevel > 0) {
106 G4cout <<
"Livermore Nuclear Gamma Conversion model is initialized " <<
G4endl
113 if(isInitialised)
return;
115 isInitialised =
true;
126 if (verboseLevel > 3) {
127 G4cout <<
"Calling ComputeCrossSectionPerAtom() of G4LivermoreNuclearGammaConversionModel"
130 if (GammaEnergy < lowEnergyLimit || GammaEnergy > highEnergyLimit)
return 0;
155 if (verboseLevel > 3)
156 G4cout <<
"Calling SampleSecondaries() of G4LivermoreNuclearGammaConversionModel" <<
G4endl;
162 G4double epsilon0Local = electron_mass_c2 / photonEnergy ;
165 if (photonEnergy < smallEnergy )
167 epsilon = epsilon0Local + (0.5 - epsilon0Local) *
G4UniformRand();
178 G4cout <<
"G4LivermoreNuclearGammaConversionModel::SampleSecondaries - element = 0"
185 G4cout <<
"G4LivermoreNuclearGammaConversionModel::SampleSecondaries - ionisation = 0"
192 if (photonEnergy > 50. * MeV) fZ += 8. * (element->
GetfCoulomb());
196 G4double screenMax = std::exp ((42.24 - fZ)/8.368) - 0.952 ;
197 G4double screenMin = std::min(4.*screenFactor,screenMax) ;
200 G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ;
201 G4double epsilonMin = std::max(epsilon0Local,epsilon1);
202 G4double epsilonRange = 0.5 - epsilonMin ;
208 G4double f10 = ScreenFunction1(screenMin) - fZ;
209 G4double f20 = ScreenFunction2(screenMin) - fZ;
210 G4double normF1 = std::max(f10 * epsilonRange * epsilonRange,0.);
211 G4double normF2 = std::max(1.5 * f20,0.);
216 epsilon = 0.5 - epsilonRange * std::pow(
G4UniformRand(), 0.3333) ;
217 screen = screenFactor / (epsilon * (1. - epsilon));
218 gReject = (ScreenFunction1(screen) - fZ) / f10 ;
223 screen = screenFactor / (epsilon * (1 - epsilon));
224 gReject = (ScreenFunction2(screen) - fZ) / f20 ;
237 electronTotEnergy = (1. - epsilon) * photonEnergy;
238 positronTotEnergy = epsilon * photonEnergy;
242 positronTotEnergy = (1. - epsilon) * photonEnergy;
243 electronTotEnergy = epsilon * photonEnergy;
265 G4double thetaEle = u*electron_mass_c2/electronTotEnergy;
266 G4double thetaPos = u*electron_mass_c2/positronTotEnergy;
269 G4double dxEle= std::sin(thetaEle)*std::cos(phi),dyEle= std::sin(thetaEle)*std::sin(phi),dzEle=std::cos(thetaEle);
270 G4double dxPos=-std::sin(thetaPos)*std::cos(phi),dyPos=-std::sin(thetaPos)*std::sin(phi),dzPos=std::cos(thetaPos);
277 G4double electronKineEnergy = std::max(0.,electronTotEnergy - electron_mass_c2) ;
282 electronDirection.
rotateUz(photonDirection);
289 G4double positronKineEnergy = std::max(0.,positronTotEnergy - electron_mass_c2) ;
294 positronDirection.
rotateUz(photonDirection);
298 positronDirection, positronKineEnergy);
301 fvect->push_back(particle1);
302 fvect->push_back(particle2);
312G4double G4LivermoreNuclearGammaConversionModel::ScreenFunction1(
G4double screenVariable)
318 if (screenVariable > 1.)
319 value = 42.24 - 8.368 * std::log(screenVariable + 0.952);
321 value = 42.392 - screenVariable * (7.796 - 1.961 * screenVariable);
328G4double G4LivermoreNuclearGammaConversionModel::ScreenFunction2(
G4double screenVariable)
334 if (screenVariable > 1.)
335 value = 42.24 - 8.368 * std::log(screenVariable + 0.952);
337 value = 41.405 - screenVariable * (5.828 - 0.8945 * screenVariable);
G4DLLIMPORT std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
G4double GetfCoulomb() const
G4IonisParamElm * GetIonisation() const
G4double GetlogZ3() const
G4LivermoreNuclearGammaConversionModel(const G4ParticleDefinition *p=0, const G4String &nam="LivermoreNuclearGammaConversion")
virtual ~G4LivermoreNuclearGammaConversionModel()
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0, G4double cut=0, G4double emax=DBL_MAX)
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
G4ParticleChangeForGamma * fParticleChange
void SetProposedKineticEnergy(G4double proposedKinEnergy)
static G4Positron * Positron()
G4double FindValue(G4int Z, G4double e) const
void LoadData(const G4String &dataFile)
void Initialise(G4VDataSetAlgorithm *interpolation=0, G4double minE=250 *CLHEP::eV, G4double maxE=100 *CLHEP::GeV, G4int numberOfBins=200, G4double unitE=CLHEP::MeV, G4double unitData=CLHEP::barn, G4int minZ=1, G4int maxZ=99)
void SetHighEnergyLimit(G4double)
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4double LowEnergyLimit() const
G4double HighEnergyLimit() const
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void ProposeTrackStatus(G4TrackStatus status)