Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // Calculation of the total, elastic and inela 26 // Calculation of the total, elastic and inelastic cross-sections 27 // based on parametrisations of (proton, pion, 27 // based on parametrisations of (proton, pion, kaon, photon) nucleon 28 // cross-sections and the hadron-nucleous cros 28 // cross-sections and the hadron-nucleous cross-section model in 29 // the framework of Glauber-Gribov approach 29 // the framework of Glauber-Gribov approach 30 // 30 // 31 // 25.04.12 V. Grichine - first implementation << 32 // G4GlauberGribovCross << 33 // 31 // 34 // 04.09.18 V. Ivantchenko Major revision of i << 32 // 35 // 01.10.18 V. Grichine strange hyperon xsc << 33 // 36 // 27.05.19 V. Ivantchenko Removed obsolete me << 34 // >> 35 // 25.04.12 V. Grichine - first implementation based on G4GlauberGribovCrossSection old interface >> 36 // >> 37 // 37 38 38 #ifndef G4ComponentGGHadronNucleusXsc_h 39 #ifndef G4ComponentGGHadronNucleusXsc_h 39 #define G4ComponentGGHadronNucleusXsc_h 1 40 #define G4ComponentGGHadronNucleusXsc_h 1 40 41 41 #include "globals.hh" 42 #include "globals.hh" 42 #include "G4Proton.hh" 43 #include "G4Proton.hh" 43 #include "G4Nucleus.hh" 44 #include "G4Nucleus.hh" 44 45 45 #include "G4VComponentCrossSection.hh" 46 #include "G4VComponentCrossSection.hh" 46 47 47 class G4ParticleDefinition; 48 class G4ParticleDefinition; 48 class G4HadronNucleonXsc; 49 class G4HadronNucleonXsc; 49 class G4Pow; << 50 50 51 class G4ComponentGGHadronNucleusXsc final : pu << 51 class G4ComponentGGHadronNucleusXsc : public G4VComponentCrossSection 52 { 52 { 53 public: 53 public: 54 54 55 explicit G4ComponentGGHadronNucleusXsc(); << 55 G4ComponentGGHadronNucleusXsc (); 56 ~G4ComponentGGHadronNucleusXsc() final; << 56 virtual ~G4ComponentGGHadronNucleusXsc (); 57 57 58 static const char* Default_Name() { return " << 59 58 60 // virtual interface methods 59 // virtual interface methods 61 G4double GetTotalElementCrossSection(const G << 62 G4double kinEnergy, << 63 G4int Z, G4double A) final; << 64 60 >> 61 virtual 65 G4double GetTotalIsotopeCrossSection(const G 62 G4double GetTotalIsotopeCrossSection(const G4ParticleDefinition* aParticle, 66 G4double kinEnergy, 63 G4double kinEnergy, 67 G4int Z, G4int A) final; << 64 G4int Z, G4int A); 68 65 69 G4double GetInelasticElementCrossSection(con << 66 virtual 70 G4double kinEnergy, << 67 G4double GetTotalElementCrossSection(const G4ParticleDefinition* aParticle, 71 G4int Z, G4double A) final; << 68 G4double kinEnergy, >> 69 G4int Z, G4double A); 72 70 >> 71 virtual 73 G4double GetInelasticIsotopeCrossSection(con 72 G4double GetInelasticIsotopeCrossSection(const G4ParticleDefinition* aParticle, 74 G4double kinEnergy, 73 G4double kinEnergy, 75 G4int Z, G4int A) final; << 74 G4int Z, G4int A); 76 75 >> 76 virtual >> 77 G4double GetInelasticElementCrossSection(const G4ParticleDefinition* aParticle, >> 78 G4double kinEnergy, >> 79 G4int Z, G4double A); >> 80 >> 81 virtual 77 G4double GetElasticElementCrossSection(const 82 G4double GetElasticElementCrossSection(const G4ParticleDefinition* aParticle, 78 G4double kinEnergy, 83 G4double kinEnergy, 79 G4int Z, G4double A) final; << 84 G4int Z, G4double A); 80 85 >> 86 virtual 81 G4double GetElasticIsotopeCrossSection(const 87 G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition* aParticle, 82 G4double kinEnergy, 88 G4double kinEnergy, 83 G4int Z, G4int A) final; << 89 G4int Z, G4int A); 84 90 >> 91 virtual 85 G4double ComputeQuasiElasticRatio(const G4Pa 92 G4double ComputeQuasiElasticRatio(const G4ParticleDefinition* aParticle, 86 G4double kinEnergy, << 93 G4double kinEnergy, 87 G4int Z, G4int A) final; << 94 G4int Z, G4int A); >> 95 88 96 89 // Glauber-Gribov cross section << 97 90 void ComputeCrossSections(const G4ParticleDe << 98 // virtual 91 G4double kinEnergy, G4int Z, G4int A << 99 G4bool IsIsoApplicable(const G4DynamicParticle* aDP, G4int Z, G4int A, 92 << 100 const G4Element* elm = 0, 93 // additional public methods << 101 const G4Material* mat = 0); 94 G4double GetProductionElementCrossSection(co << 102 95 G4double kinEnergy, << 103 // virtual 96 G4int Z, G4double A); << 104 G4double GetIsoCrossSection(const G4DynamicParticle*, G4int Z, G4int A, 97 << 105 const G4Isotope* iso = 0, 98 G4double GetProductionIsotopeCrossSection(co << 106 const G4Element* elm = 0, 99 G4double kinEnergy, << 107 const G4Material* mat = 0); 100 G4int Z, G4int A); << 101 108 102 G4double GetRatioSD(const G4DynamicParticle* 109 G4double GetRatioSD(const G4DynamicParticle*, G4int At, G4int Zt); 103 G4double GetRatioQE(const G4DynamicParticle* 110 G4double GetRatioQE(const G4DynamicParticle*, G4int At, G4int Zt); 104 111 105 G4double GetHadronNucleonXsc(const G4Dynamic 112 G4double GetHadronNucleonXsc(const G4DynamicParticle*, const G4Element*); 106 G4double GetHadronNucleonXsc(const G4Dynamic 113 G4double GetHadronNucleonXsc(const G4DynamicParticle*, G4int At, G4int Zt); 107 114 108 G4double GetHadronNucleonXscPDG(const G4Dyna 115 G4double GetHadronNucleonXscPDG(const G4DynamicParticle*, const G4Element*); 109 G4double GetHadronNucleonXscPDG(const G4Dyna 116 G4double GetHadronNucleonXscPDG(const G4DynamicParticle*, G4int At, G4int Zt); 110 G4double GetHadronNucleonXscNS(const G4Dynam 117 G4double GetHadronNucleonXscNS(const G4DynamicParticle*, const G4Element*); 111 G4double GetHadronNucleonXscNS(const G4Dynam 118 G4double GetHadronNucleonXscNS(const G4DynamicParticle*, G4int At, G4int Zt); >> 119 G4double GetKaonNucleonXscVector(const G4DynamicParticle*, G4int At, G4int Zt); 112 120 113 G4double GetHNinelasticXsc(const G4DynamicPa 121 G4double GetHNinelasticXsc(const G4DynamicParticle*, const G4Element*); 114 G4double GetHNinelasticXsc(const G4DynamicPa 122 G4double GetHNinelasticXsc(const G4DynamicParticle*, G4int At, G4int Zt); 115 G4double GetHNinelasticXscVU(const G4Dynamic 123 G4double GetHNinelasticXscVU(const G4DynamicParticle*, G4int At, G4int Zt); 116 124 117 void Description(std::ostream&) const final; << 125 G4double CalculateEcmValue ( const G4double , const G4double , const G4double ); 118 126 119 inline G4double GetIsoCrossSection(const G4D << 127 G4double CalcMandelstamS( const G4double , const G4double , const G4double ); 120 const G4Isotope* iso = null << 128 121 const G4Element* elm = null << 129 G4double GetNucleusRadius(const G4DynamicParticle*, const G4Element*); 122 const G4Material* mat = nul << 130 G4double GetNucleusRadius(G4int At); >> 131 >> 132 virtual void CrossSectionDescription(std::ostream&) const; 123 133 124 inline G4double GetElasticGlauberGribov(cons 134 inline G4double GetElasticGlauberGribov(const G4DynamicParticle*, G4int Z, G4int A); 125 inline G4double GetInelasticGlauberGribov(co 135 inline G4double GetInelasticGlauberGribov(const G4DynamicParticle*, G4int Z, G4int A); 126 136 127 inline G4double GetAxsc2piR2() const << 137 inline G4double GetTotalGlauberGribovXsc() { return fTotalXsc; }; 128 inline G4double GetModelInLog() const << 138 inline G4double GetElasticGlauberGribovXsc() { return fElasticXsc; }; 129 inline G4double GetTotalGlauberGribovXsc() c << 139 inline G4double GetInelasticGlauberGribovXsc(){ return fInelasticXsc; }; 130 inline G4double GetElasticGlauberGribovXsc() << 140 inline G4double GetProductionGlauberGribovXsc(){ return fProductionXsc; }; 131 inline G4double GetInelasticGlauberGribovXsc << 141 inline G4double GetDiffractionGlauberGribovXsc(){ return fDiffractionXsc; }; 132 inline G4double GetProductionGlauberGribovXs << 142 inline G4double GetRadiusConst() { return fRadiusConst; }; 133 inline G4double GetDiffractionGlauberGribovX << 134 143 135 inline G4double GetParticleBarCorTot(const G 144 inline G4double GetParticleBarCorTot(const G4ParticleDefinition* theParticle, G4int Z); 136 inline G4double GetParticleBarCorIn(const G4 145 inline G4double GetParticleBarCorIn(const G4ParticleDefinition* theParticle, G4int Z); 137 146 >> 147 inline void SetEnergyLowerLimit(G4double E ){fLowerLimit=E;}; >> 148 138 private: 149 private: 139 150 >> 151 const G4double fUpperLimit; >> 152 G4double fLowerLimit; >> 153 const G4double fRadiusConst; >> 154 140 static const G4double fNeutronBarCorrectionT 155 static const G4double fNeutronBarCorrectionTot[93]; 141 static const G4double fNeutronBarCorrectionI 156 static const G4double fNeutronBarCorrectionIn[93]; 142 157 143 static const G4double fProtonBarCorrectionTo 158 static const G4double fProtonBarCorrectionTot[93]; 144 static const G4double fProtonBarCorrectionIn 159 static const G4double fProtonBarCorrectionIn[93]; 145 160 146 static const G4double fPionPlusBarCorrection 161 static const G4double fPionPlusBarCorrectionTot[93]; 147 static const G4double fPionPlusBarCorrection 162 static const G4double fPionPlusBarCorrectionIn[93]; 148 163 149 static const G4double fPionMinusBarCorrectio 164 static const G4double fPionMinusBarCorrectionTot[93]; 150 static const G4double fPionMinusBarCorrectio 165 static const G4double fPionMinusBarCorrectionIn[93]; 151 166 152 G4double fTotalXsc, fElasticXsc, fInelasticX 167 G4double fTotalXsc, fElasticXsc, fInelasticXsc, fProductionXsc, fDiffractionXsc; 153 G4double fAxsc2piR2, fModelInLog; << 168 G4double fHadronNucleonXsc; 154 G4double fEnergy; //Cache << 155 169 156 const G4ParticleDefinition* theGamma; << 170 G4ParticleDefinition* theGamma; 157 const G4ParticleDefinition* theProton; << 171 G4ParticleDefinition* theProton; 158 const G4ParticleDefinition* theNeutron; << 172 G4ParticleDefinition* theNeutron; 159 const G4ParticleDefinition* theAProton; << 173 G4ParticleDefinition* theAProton; 160 const G4ParticleDefinition* theANeutron; << 174 G4ParticleDefinition* theANeutron; 161 const G4ParticleDefinition* thePiPlus; << 175 G4ParticleDefinition* thePiPlus; 162 const G4ParticleDefinition* thePiMinus; << 176 G4ParticleDefinition* thePiMinus; 163 const G4ParticleDefinition* theKPlus; << 177 G4ParticleDefinition* thePiZero; 164 const G4ParticleDefinition* theKMinus; << 178 G4ParticleDefinition* theKPlus; 165 const G4ParticleDefinition* theK0S; << 179 G4ParticleDefinition* theKMinus; 166 const G4ParticleDefinition* theK0L; << 180 G4ParticleDefinition* theK0S; 167 const G4ParticleDefinition* theLambda; << 181 G4ParticleDefinition* theK0L; >> 182 G4ParticleDefinition* theL; >> 183 G4ParticleDefinition* theAntiL; >> 184 G4ParticleDefinition* theSPlus; >> 185 G4ParticleDefinition* theASPlus; >> 186 G4ParticleDefinition* theSMinus; >> 187 G4ParticleDefinition* theASMinus; >> 188 G4ParticleDefinition* theS0; >> 189 G4ParticleDefinition* theAS0; >> 190 G4ParticleDefinition* theXiMinus; >> 191 G4ParticleDefinition* theXi0; >> 192 G4ParticleDefinition* theAXiMinus; >> 193 G4ParticleDefinition* theAXi0; >> 194 G4ParticleDefinition* theOmega; >> 195 G4ParticleDefinition* theAOmega; >> 196 G4ParticleDefinition* theD; >> 197 G4ParticleDefinition* theT; >> 198 G4ParticleDefinition* theA; >> 199 G4ParticleDefinition* theHe3; 168 200 169 G4HadronNucleonXsc* hnXsc; 201 G4HadronNucleonXsc* hnXsc; 170 202 171 // Cache << 172 const G4ParticleDefinition* fParticle; << 173 G4int fZ, fA, fL; << 174 << 175 }; 203 }; 176 204 177 ////////////////////////////////////////////// 205 //////////////////////////////////////////////////////////////// 178 // 206 // 179 // Inlines 207 // Inlines 180 208 181 inline G4double << 209 inline 182 G4ComponentGGHadronNucleusXsc::GetIsoCrossSect << 210 G4double 183 G4int Z, G4int A, << 211 G4ComponentGGHadronNucleusXsc::GetElasticGlauberGribov(const G4DynamicParticle* dp, 184 const G4Isotope*, << 212 G4int Z, G4int A) 185 const G4Element*, << 186 const G4Material*) << 187 { << 188 ComputeCrossSections(dp->GetDefinition(), dp << 189 return fTotalXsc; << 190 } << 191 << 192 inline G4double << 193 G4ComponentGGHadronNucleusXsc::GetElasticGlaub << 194 const G4DynamicParticle* dp, G4int << 195 { 213 { 196 ComputeCrossSections(dp->GetDefinition(), dp << 214 GetIsoCrossSection(dp, Z, A); 197 return fElasticXsc; 215 return fElasticXsc; 198 } 216 } 199 217 200 ////////////////////////////////////////////// 218 ///////////////////////////////////////////////////////////////// 201 219 202 inline G4double << 220 inline 203 G4ComponentGGHadronNucleusXsc::GetInelasticGla << 221 G4double 204 const G4DynamicParticle* dp, G4int << 222 G4ComponentGGHadronNucleusXsc::GetInelasticGlauberGribov(const G4DynamicParticle* dp, >> 223 G4int Z, G4int A) 205 { 224 { 206 ComputeCrossSections(dp->GetDefinition(), dp << 225 GetIsoCrossSection(dp, Z, A); 207 return fInelasticXsc; 226 return fInelasticXsc; 208 } 227 } 209 228 210 ////////////////////////////////////////////// 229 ///////////////////////////////////////////////////////////////////// 211 // 230 // 212 // return correction at Tkin = 90*GeV GG -> Ba 231 // return correction at Tkin = 90*GeV GG -> Barashenkov tot xsc, when it 213 // is available, else return 1.0 232 // is available, else return 1.0 214 233 >> 234 215 inline G4double G4ComponentGGHadronNucleusXsc: 235 inline G4double G4ComponentGGHadronNucleusXsc::GetParticleBarCorTot( 216 const G4ParticleDef << 236 const G4ParticleDefinition* theParticle, G4int Z) 217 { 237 { 218 G4double cor = 1.0; << 238 if(Z >= 2 && Z <= 92) 219 G4int z = std::min(92, std::max(ZZ, 1)); << 239 { 220 if( theParticle == theProton ) cor = fP << 240 if( theParticle == theProton ) return fProtonBarCorrectionTot[Z]; 221 else if( theParticle == theNeutron) cor = fN << 241 else if( theParticle == theNeutron) return fNeutronBarCorrectionTot[Z]; 222 else if( theParticle == thePiPlus ) cor = fP << 242 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionTot[Z]; 223 else if( theParticle == thePiMinus) cor = fP << 243 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionTot[Z]; 224 return cor; << 244 else return 1.0; >> 245 } >> 246 else return 1.0; 225 } 247 } 226 248 227 ////////////////////////////////////////////// 249 ///////////////////////////////////////////////////////////////////// 228 // 250 // 229 // return correction at Tkin = 90*GeV GG -> Ba 251 // return correction at Tkin = 90*GeV GG -> Barashenkov in xsc, when it 230 // is available, else return 1.0 252 // is available, else return 1.0 231 253 232 254 233 inline G4double G4ComponentGGHadronNucleusXsc: 255 inline G4double G4ComponentGGHadronNucleusXsc::GetParticleBarCorIn( 234 const G4ParticleDef << 256 const G4ParticleDefinition* theParticle, G4int Z) 235 { 257 { 236 G4double cor = 1.0; << 258 if(Z >= 2 && Z <= 92) 237 G4int z = std::min(92, std::max(ZZ, 1)); << 259 { 238 if( theParticle == theProton ) cor = fP << 260 if( theParticle == theProton ) return fProtonBarCorrectionIn[Z]; 239 else if( theParticle == theNeutron) cor = fN << 261 else if( theParticle == theNeutron) return fNeutronBarCorrectionIn[Z]; 240 else if( theParticle == thePiPlus ) cor = fP << 262 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionIn[Z]; 241 else if( theParticle == thePiMinus) cor = fP << 263 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionIn[Z]; 242 return cor; << 264 else return 1.0; >> 265 } >> 266 else return 1.0; 243 } 267 } 244 268 245 #endif 269 #endif 246 270