// // ******************************************************************** // * 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. * // ******************************************************************** // // // The lust update: M.V. Kossov, CERN/ITEP(Moscow) 19-Aug-07 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ // // // G4 Physics class: G4QIonIonCrossSection for gamma+A cross sections // Created: M.V. Kossov, CERN/ITEP(Moscow), 20-Dec-03 // The last update: M.V. Kossov, CERN/ITEP (Moscow) 15-Feb-04 // -------------------------------------------------------------------------------- // **************************************************************************************** // ***** This HEADER is a property of the CHIPS hadronic package in Geant4 (M. Kosov) ***** // *********** DO NOT MAKE ANY CHANGE without approval of Mikhail.Kossov@cern.ch ********** // **************************************************************************************** // Short description: CHIPS cross-sectons for Ion-Ion interactions // --------------------------------------------------------------- // //#define debug //#define pdebug //#define debug3 //#define debugn //#define debugs #include "G4QIonIonCrossSection.hh" // Initialization of the G4double* G4QIonIonCrossSection::lastLENI=0;// Pointer to the lastArray of LowEn Inelast CS G4double* G4QIonIonCrossSection::lastHENI=0;// Pointer to the lastArray of HighEn InelastCS G4double* G4QIonIonCrossSection::lastLENE=0;// Pointer to the lastArray of LowEn Elastic CS G4double* G4QIonIonCrossSection::lastHENE=0;// Pointer to the lastArray of HighEn ElasticCS G4int G4QIonIonCrossSection::lastPDG=0; // The last PDG code of the projectile G4int G4QIonIonCrossSection::lastN=0; // The last N of calculated nucleus G4int G4QIonIonCrossSection::lastZ=0; // The last Z of calculated nucleus G4double G4QIonIonCrossSection::lastP=0.; // Last used in cross section Momentum G4double G4QIonIonCrossSection::lastTH=0.; // Last threshold momentum G4double G4QIonIonCrossSection::lastICS=0.;// Last value of the Inelastic Cross Section G4double G4QIonIonCrossSection::lastECS=0.;// Last value of the Elastic Cross Section G4int G4QIonIonCrossSection::lastI=0; // The last position in the DAMDB // Returns Pointer to the G4VQCrossSection class G4VQCrossSection* G4QIonIonCrossSection::GetPointer() { static G4QIonIonCrossSection theCrossSection; //**Static body of Cross Section** return &theCrossSection; } // The main member function giving the collision cross section (P is in IU, CS is in mb) // Make pMom in independent units !(Now it is MeV): fCS=true->Inelastic, fCS=false->Elastic G4double G4QIonIonCrossSection::GetCrossSection(G4bool fCS, G4double pMom, G4int tZ, G4int tN, G4int pPDG) { static G4int j; // A#0f records found in DB for this projectile static std::vector colPDG;// Vector of the projectile PDG code static std::vector colN; // Vector of N for calculated nuclei (isotops) static std::vector colZ; // Vector of Z for calculated nuclei (isotops) static std::vector colP; // Vector of last momenta for the reaction static std::vector colTH; // Vector of energy thresholds for the reaction static std::vector colICS;// Vector of last inelastic cross-sections static std::vector colECS;// Vector of last elastic cross-sections // ***---*** End of the mandatory Static Definitions of the Associative Memory ***---*** #ifdef pdebug G4cout<<"G4QIICS::GetCS:>>> f="< CS=0"<XS=0"<New(inDB) InCS="<lastTH) // Correct the threshold { #ifdef pdebug G4cout<<"G4QIonIonCS::GetCS:New,T="< Threshold="<G4QIonIonCrossSec::GetCrosSec: pPDG="<Thresh="<XS=0"< CS=0 } else if(std::fabs(lastP/pMom-1.)R conversion [R=1.1*A^(1/3)] //static const G4double conv=38.; // coeff. R2->sig=c*(pR+tR)^2, c=pi*10(mb/fm^2)*1.21 // If change the following, please change in ::GetFunctions: static const G4double THmin=0.; // @@ start from threshold (?) minimum Energy Threshold static const G4double dP=10.; // step for the LEN table static const G4int nL=100; // A#of LENesonance points in E (each MeV from 2 to 106) static const G4double Pmin=THmin+(nL-1)*dP; // minE for the HighE part static const G4double Pmax=300000.; // maxE for the HighE part static const G4int nH=100; // A#of HResonance points in lnE static const G4double milP=std::log(Pmin); // Low logarithm energy for the HighE part static const G4double malP=std::log(Pmax); // High logarithm energy (each 2.75 percent) static const G4double dlP=(malP-milP)/(nH-1); // Step in log energy in the HighE part // // Associative memory for acceleration static std::vector LENI; // Vector of pointers: LowEnIneIonIonCrossSection static std::vector HENI; // Vector of pointers: HighEnIneIonIonCrossSection static std::vector LENE; // Vector of pointers: LowEnElaIonIonCrossSection static std::vector HENE; // Vector of pointers: HighEnElaIonIonCrossSection #ifdef debug G4cout<<"G4QIonIonCrossSection::CalcCS: Z="< inelel = CalculateXS(pZ, pN, tZ, tN, Momentum); if(XS) sigma=inelel.first; else sigma=inelel.second; } #ifdef debug G4cout<<"G4IonIonCrossSection::CalculateCrossSection: sigma="< G4QIonIonCrossSection::CalculateXS(G4int pZ,G4int pN,G4int tZ, G4int tN, G4double Mom) { static G4VQCrossSection* PElCSman = G4QProtonElasticCrossSection::GetPointer(); static G4VQCrossSection* NElCSman = G4QNeutronElasticCrossSection::GetPointer(); static G4VQCrossSection* InelPCSman = G4QProtonNuclearCrossSection::GetPointer(); static G4VQCrossSection* InelNCSman = G4QNeutronNuclearCrossSection::GetPointer(); G4double pA=pZ+pN; G4double tA=tZ+tN; if(pA<.9 || tA<.9 ||pA>239. || tA>239 || Mom < 0.) return std::make_pair(0.,0.); G4double inCS=0.; G4double elCS=0.; if(pA<1.1 ) // nucleon-ion interaction use NA(in,el) { if (pZ == 1 && !pN) // proton-nuclear { inCS=InelPCSman->GetCrossSection(true, Mom, tZ, tN, 2212); elCS=PElCSman->GetCrossSection(true, Mom, tZ, tN, 2212); } else if(pN == 1 && !pZ) // neutron-nuclear { inCS=InelNCSman->GetCrossSection(true, Mom, tZ, tN, 2112); elCS=NElCSman->GetCrossSection(true, Mom, tZ, tN, 2112); } else G4cerr<<"-Warn-G4QIICS::CaCS:pZ="<4. && tA>4.) f=3.3+130./ab/ab+2.25/e; G4double c=(385.+11.*ab/(1.+.02*ab*al)+(.5*ab+500./al/al)/al)*std::pow(d,f); G4double r=y-3.-4./ap/ap; #ifdef pdebug G4cout<<"G4QIonIonCS::CalcTot:P="<