// // ******************************************************************** // * 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. * // ******************************************************************** // // 24.11.08 V. Grichine - first implementation // #include "G4GGNuclNuclCrossSection.hh" #include "G4ParticleTable.hh" #include "G4IonTable.hh" #include "G4ParticleDefinition.hh" #include "G4HadTmpUtil.hh" G4GGNuclNuclCrossSection::G4GGNuclNuclCrossSection() : fUpperLimit( 100000 * GeV ), fLowerLimit( 0.1 * MeV ), fRadiusConst( 1.08*fermi ), // 1.1, 1.3 ? fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fProductionXsc(0.0), fDiffractionXsc(0.0), fHadronNucleonXsc(0.0) { theProton = G4Proton::Proton(); theNeutron = G4Neutron::Neutron(); } G4GGNuclNuclCrossSection::~G4GGNuclNuclCrossSection() {} G4bool G4GGNuclNuclCrossSection::IsApplicable(const G4DynamicParticle* aDP, const G4Element* anElement) { G4int Z = G4lrint(anElement->GetZ()); G4int N = G4lrint(anElement->GetN()); return IsIsoApplicable(aDP, Z, N); } /////////////////////////////////////////////////////////////////////////////// // // G4bool G4GGNuclNuclCrossSection::IsIsoApplicable(const G4DynamicParticle* aDP, G4int Z, G4int) { G4bool applicable = false; G4double kineticEnergy = aDP->GetKineticEnergy(); if (kineticEnergy >= fLowerLimit && Z > 1) applicable = true; return applicable; } /////////////////////////////////////////////////////////////////////////////// // // Calculates total and inelastic Xsc, derives elastic as total - inelastic // accordong to Glauber model with Gribov correction calculated in the dipole // approximation on light cone. Gaussian density helps to calculate rest // integrals of the model. [1] B.Z. Kopeliovich, nucl-th/0306044 G4double G4GGNuclNuclCrossSection:: GetCrossSection(const G4DynamicParticle* aParticle, const G4Element* anElement, G4double T) { G4int Z = G4lrint(anElement->GetZ()); G4int N = G4lrint(anElement->GetN()); return GetZandACrossSection(aParticle, Z, N, T); } /////////////////////////////////////////////////////////////////////////////// // // Calculates total and inelastic Xsc, derives elastic as total - inelastic // accordong to Glauber model with Gribov correction calculated in the dipole // approximation on light cone. Gaussian density of point-like nucleons helps // to calculate rest integrals of the model. [1] B.Z. Kopeliovich, // nucl-th/0306044 + simplification above G4double G4GGNuclNuclCrossSection:: GetZandACrossSection(const G4DynamicParticle* aParticle, G4int tZ, G4int tA, G4double) { G4double xsection; G4double sigma; G4double cofInelastic = 2.4; G4double cofTotal = 2.0; G4double nucleusSquare; G4double cB; G4double ratio; G4double pZ = aParticle->GetDefinition()->GetPDGCharge(); G4double pA = aParticle->GetDefinition()->GetBaryonNumber(); G4double pTkin = aParticle->GetKineticEnergy(); pTkin /= pA; G4double pN = pA - pZ; if( pN < 0. ) pN = 0.; G4double tN = tA - tZ; if( tN < 0. ) tN = 0.; G4double tR = GetNucleusRadius(tA); G4double pR = GetNucleusRadius(pA); cB = GetCoulombBarier(aParticle, G4double(tZ), G4double(tA), pR, tR); if (cB > 0.) { sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) + (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron); nucleusSquare = cofTotal*pi*( pR*pR + tR*tR ); // basically 2piRR ratio = sigma/nucleusSquare; xsection = nucleusSquare*std::log( 1. + ratio ); fTotalXsc = xsection; fTotalXsc *= cB; fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic; fInelasticXsc *= cB; fElasticXsc = fTotalXsc - fInelasticXsc; // if (fElasticXsc < DBL_MIN) fElasticXsc = DBL_MIN; /* G4double difratio = ratio/(1.+ratio); fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) ); */ // production to be checked !!! edit MK xsc //sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscMK(theProton, pTkin, theProton) + // (pZ*tN+pN*tZ)*GetHadronNucleonXscMK(theProton, pTkin, theNeutron); sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) + (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron); ratio = sigma/nucleusSquare; fProductionXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic; if (fElasticXsc < 0.) fElasticXsc = 0.; } else { fInelasticXsc = 0.; fTotalXsc = 0.; fElasticXsc = 0.; fProductionXsc = 0.; } return fInelasticXsc; // xsection; } /////////////////////////////////////////////////////////////////////////////// // // G4double G4GGNuclNuclCrossSection:: GetCoulombBarier(const G4DynamicParticle* aParticle, G4double tZ, G4double tA, G4double pR, G4double tR) { G4double ratio; G4double pZ = aParticle->GetDefinition()->GetPDGCharge(); G4double pTkin = aParticle->GetKineticEnergy(); // G4double pPlab = aParticle->GetTotalMomentum(); G4double pM = aParticle->GetDefinition()->GetPDGMass(); // G4double tM = tZ*proton_mass_c2 + (tA-tZ)*neutron_mass_c2; // ~ 1% accuracy G4double tM = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass( G4int(tZ), G4int(tA) ); G4double pElab = pTkin + pM; G4double totEcm = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM); // G4double pPcm = pPlab*tM/totEcm; // G4double pTcm = std::sqrt(pM*pM + pPcm*pPcm) - pM; G4double totTcm = totEcm - pM -tM; G4double bC = fine_structure_const*hbarc*pZ*tZ; bC /= pR + tR; bC /= 2.; // 4., 2. parametrisation cof ??? vmg // G4cout<<"pTkin = "<