// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // $Id: G4PairProductionRelModel.cc,v 1.3 2009/05/15 17:12:33 vnivanch Exp $ // GEANT4 tag $Name: geant4-09-03 $ // // ------------------------------------------------------------------- // // GEANT4 Class file // // // File name: G4PairProductionRelModel // // Author: Andreas Schaelicke // // Creation date: 02.04.2009 // // Modifications: // // Class Description: // // Main References: // J.W.Motz et.al., Rev. Mod. Phys. 41 (1969) 581. // S.Klein, Rev. Mod. Phys. 71 (1999) 1501. // T.Stanev et.al., Phys. Rev. D25 (1982) 1291. // M.L.Ter-Mikaelian, High-energy Electromagnetic Processes in Condensed Media, Wiley, 1972. // // ------------------------------------------------------------------- // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... #include "G4PairProductionRelModel.hh" #include "G4Gamma.hh" #include "G4Electron.hh" #include "G4Positron.hh" #include "G4ParticleChangeForGamma.hh" #include "G4LossTableManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... using namespace std; const G4double G4PairProductionRelModel::facFel = log(184.15); const G4double G4PairProductionRelModel::facFinel = log(1194.); // 1440. const G4double G4PairProductionRelModel::preS1 = 1./(184.15*184.15); const G4double G4PairProductionRelModel::logTwo = log(2.); const G4double G4PairProductionRelModel::xgi[]={ 0.0199, 0.1017, 0.2372, 0.4083, 0.5917, 0.7628, 0.8983, 0.9801 }; const G4double G4PairProductionRelModel::wgi[]={ 0.0506, 0.1112, 0.1569, 0.1813, 0.1813, 0.1569, 0.1112, 0.0506 }; const G4double G4PairProductionRelModel::Fel_light[] = {0., 5.31 , 4.79 , 4.74 , 4.71} ; const G4double G4PairProductionRelModel::Finel_light[] = {0., 6.144 , 5.621 , 5.805 , 5.924} ; G4PairProductionRelModel::G4PairProductionRelModel(const G4ParticleDefinition*, const G4String& nam) : G4VEmModel(nam), theCrossSectionTable(0), nbins(10), fLPMconstant(fine_structure_const*electron_mass_c2*electron_mass_c2/(4.*pi*hbarc)*0.5), fLPMflag(true), lpmEnergy(0.), use_completescreening(false) { fParticleChange = 0; theGamma = G4Gamma::Gamma(); thePositron = G4Positron::Positron(); theElectron = G4Electron::Electron(); nist = G4NistManager::Instance(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4PairProductionRelModel::~G4PairProductionRelModel() { if(theCrossSectionTable) { theCrossSectionTable->clearAndDestroy(); delete theCrossSectionTable; } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void G4PairProductionRelModel::Initialise(const G4ParticleDefinition*, const G4DataVector&) { fParticleChange = GetParticleChangeForGamma(); if(theCrossSectionTable) { theCrossSectionTable->clearAndDestroy(); delete theCrossSectionTable; } const G4ElementTable* theElementTable = G4Element::GetElementTable(); size_t nvect = G4Element::GetNumberOfElements(); theCrossSectionTable = new G4PhysicsTable(nvect); G4PhysicsLogVector* ptrVector; G4double emin = LowEnergyLimit(); G4double emax = HighEnergyLimit(); G4int n = nbins*G4int(log10(emax/emin)); G4bool spline = G4LossTableManager::Instance()->SplineFlag(); G4double e, value; for(size_t j=0; jSetSpline(spline); G4double Z = (*theElementTable)[j]->GetZ(); G4VEmModel::SetCurrentElement((*theElementTable)[j]); G4int iz = G4int(Z); indexZ[iz] = j; for(G4int i=0; iGetLowEdgeEnergy( i ) ; value = ComputeCrossSectionPerAtom(theGamma, e, Z); ptrVector->PutValue( i, value ); } theCrossSectionTable->insert(ptrVector); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... /* G4double G4PairProductionRelModel::ComputeRelXSectionPerAtom(G4double k, G4double Z) { G4double cross = 0.0; } */ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4double G4PairProductionRelModel::ComputeXSectionPerAtom(G4double totalEnergy, G4double Z) { G4double cross = 0.0; // number of intervals and integration step G4double vcut = electron_mass_c2/totalEnergy ; // limits by the screening variable G4double dmax = DeltaMax(); G4double dmin = min(DeltaMin(totalEnergy),dmax); G4double vcut1 = 0.5 - 0.5*sqrt(1. - dmin/dmax) ; vcut = max(vcut, vcut1); G4double vmax = 0.5; G4int n = 1; // needs optimisation G4double delta = (vmax - vcut)*totalEnergy/G4double(n); G4double e0 = vcut*totalEnergy; G4double xs; // simple integration for(G4int l=0; l100.*GeV) xs = ComputeRelDXSectionPerAtom(eg,totalEnergy,Z); else xs = ComputeDXSectionPerAtom(eg,totalEnergy,Z); cross += wgi[i]*xs; } } cross *= delta*2.; return cross; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4double G4PairProductionRelModel::ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double /*Z*/) { // most simple case - complete screening: // dsig/dE+ = 4 * alpha * Z**2 * r0**2 / k // * [ (y**2 + (1-y**2) + 2/3*y*(1-y) ) * ( log (183 * Z**-1/3) + 1/9 * y*(1-y) ] // y = E+/k G4double yp=eplusEnergy/totalEnergy; G4double ym=1.-yp; G4double cross = 0.; if (use_completescreening) cross = (yp*yp + ym*ym + 2./3.*ym*yp)*(Fel - fCoulomb) + 1./9.*yp*ym; else { G4double delta = 0.25*DeltaMin(totalEnergy)/(yp*ym); cross = (yp*yp + ym*ym)*(0.25*Phi1(delta) - lnZ/3. - fCoulomb) + 2./3.*ym*yp*(0.25*Phi2(delta) - lnZ/3. - fCoulomb); } return cross/totalEnergy; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... G4double G4PairProductionRelModel::ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double /*Z*/) { // most simple case - complete screening: // dsig/dE+ = 4 * alpha * Z**2 * r0**2 / k // * [ (y**2 + (1-y**2) + 2/3*y*(1-y) ) * ( log (183 * Z**-1/3) + 1/9 * y*(1-y) ] // y = E+/k G4double yp=eplusEnergy/totalEnergy; G4double ym=1.-yp; CalcLPMFunctions(totalEnergy,eplusEnergy); // gamma G4double cross = 0.; if (use_completescreening) cross = xiLPM*(2./3.*phiLPM*(yp*yp + ym*ym) + gLPM)*(Fel - fCoulomb); else { G4double delta = 0.25*DeltaMin(totalEnergy)/(yp*ym); cross = (1./3.*gLPM + 2./3.*phiLPM)*(yp*yp + ym*ym) *(0.25*Phi1(delta) - lnZ/3. - fCoulomb) + 2./3.*gLPM*ym*yp*(0.25*Phi2(delta) - lnZ/3. - fCoulomb); cross *= xiLPM; } return cross/totalEnergy; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void G4PairProductionRelModel::CalcLPMFunctions(G4double k, G4double eplus) { // *** calculate lpm variable s & sprime *** // Klein eqs. (78) & (79) G4double sprime = sqrt(0.125*k*lpmEnergy/(eplus*(k-eplus))); G4double s1 = preS1*z23; G4double logS1 = 2./3.*lnZ-2.*facFel; G4double logTS1 = logTwo+logS1; xiLPM = 2.; if (sprime>1) xiLPM = 1.; else if (sprime>sqrt(2.)*s1) { G4double h = log(sprime)/logTS1; xiLPM = 1+h-0.08*(1-h)*(1-sqr(1-h))/logTS1; } G4double s = sprime/sqrt(xiLPM); // G4cout<<"k="<