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); >> 75 >> 76 virtual >> 77 G4double GetProductionIsotopeCrossSection(const G4ParticleDefinition* aParticle, >> 78 G4double kinEnergy, >> 79 G4int Z, G4int A); >> 80 >> 81 virtual >> 82 G4double GetInelasticElementCrossSection(const G4ParticleDefinition* aParticle, >> 83 G4double kinEnergy, >> 84 G4int Z, G4double A); >> 85 virtual >> 86 G4double GetProductionElementCrossSection(const G4ParticleDefinition* aParticle, >> 87 G4double kinEnergy, >> 88 G4int Z, G4double A); 76 89 >> 90 virtual 77 G4double GetElasticElementCrossSection(const 91 G4double GetElasticElementCrossSection(const G4ParticleDefinition* aParticle, 78 G4double kinEnergy, 92 G4double kinEnergy, 79 G4int Z, G4double A) final; << 93 G4int Z, G4double A); 80 94 >> 95 virtual 81 G4double GetElasticIsotopeCrossSection(const 96 G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition* aParticle, 82 G4double kinEnergy, 97 G4double kinEnergy, 83 G4int Z, G4int A) final; << 98 G4int Z, G4int A); 84 99 >> 100 virtual 85 G4double ComputeQuasiElasticRatio(const G4Pa 101 G4double ComputeQuasiElasticRatio(const G4ParticleDefinition* aParticle, 86 G4double kinEnergy, << 102 G4double kinEnergy, 87 G4int Z, G4int A) final; << 103 G4int Z, G4int A); 88 << 104 89 // Glauber-Gribov cross section << 90 void ComputeCrossSections(const G4ParticleDe << 91 G4double kinEnergy, G4int Z, G4int A << 92 << 93 // additional public methods << 94 G4double GetProductionElementCrossSection(co << 95 G4double kinEnergy, << 96 G4int Z, G4double A); << 97 105 98 G4double GetProductionIsotopeCrossSection(co << 106 99 G4double kinEnergy, << 107 // virtual 100 G4int Z, G4int A); << 108 G4bool IsIsoApplicable(const G4DynamicParticle* aDP, G4int Z, G4int A, >> 109 const G4Element* elm = 0, >> 110 const G4Material* mat = 0); >> 111 >> 112 // virtual >> 113 G4double GetIsoCrossSection(const G4DynamicParticle*, G4int Z, G4int A, >> 114 const G4Isotope* iso = 0, >> 115 const G4Element* elm = 0, >> 116 const G4Material* mat = 0); 101 117 102 G4double GetRatioSD(const G4DynamicParticle* 118 G4double GetRatioSD(const G4DynamicParticle*, G4int At, G4int Zt); 103 G4double GetRatioQE(const G4DynamicParticle* 119 G4double GetRatioQE(const G4DynamicParticle*, G4int At, G4int Zt); 104 120 105 G4double GetHadronNucleonXsc(const G4Dynamic 121 G4double GetHadronNucleonXsc(const G4DynamicParticle*, const G4Element*); 106 G4double GetHadronNucleonXsc(const G4Dynamic 122 G4double GetHadronNucleonXsc(const G4DynamicParticle*, G4int At, G4int Zt); 107 123 108 G4double GetHadronNucleonXscPDG(const G4Dyna 124 G4double GetHadronNucleonXscPDG(const G4DynamicParticle*, const G4Element*); 109 G4double GetHadronNucleonXscPDG(const G4Dyna 125 G4double GetHadronNucleonXscPDG(const G4DynamicParticle*, G4int At, G4int Zt); 110 G4double GetHadronNucleonXscNS(const G4Dynam 126 G4double GetHadronNucleonXscNS(const G4DynamicParticle*, const G4Element*); 111 G4double GetHadronNucleonXscNS(const G4Dynam 127 G4double GetHadronNucleonXscNS(const G4DynamicParticle*, G4int At, G4int Zt); >> 128 G4double GetKaonNucleonXscVector(const G4DynamicParticle*, G4int At, G4int Zt); 112 129 113 G4double GetHNinelasticXsc(const G4DynamicPa 130 G4double GetHNinelasticXsc(const G4DynamicParticle*, const G4Element*); 114 G4double GetHNinelasticXsc(const G4DynamicPa 131 G4double GetHNinelasticXsc(const G4DynamicParticle*, G4int At, G4int Zt); 115 G4double GetHNinelasticXscVU(const G4Dynamic 132 G4double GetHNinelasticXscVU(const G4DynamicParticle*, G4int At, G4int Zt); 116 133 117 void Description(std::ostream&) const final; << 134 G4double CalculateEcmValue ( const G4double , const G4double , const G4double ); >> 135 >> 136 G4double CalcMandelstamS( const G4double , const G4double , const G4double ); 118 137 119 inline G4double GetIsoCrossSection(const G4D << 138 G4double GetNucleusRadius(const G4DynamicParticle*, const G4Element*); 120 const G4Isotope* iso = null << 139 G4double GetNucleusRadius(G4int At); 121 const G4Element* elm = null << 140 122 const G4Material* mat = nul << 141 virtual void CrossSectionDescription(std::ostream&) const; 123 142 124 inline G4double GetElasticGlauberGribov(cons 143 inline G4double GetElasticGlauberGribov(const G4DynamicParticle*, G4int Z, G4int A); 125 inline G4double GetInelasticGlauberGribov(co 144 inline G4double GetInelasticGlauberGribov(const G4DynamicParticle*, G4int Z, G4int A); 126 145 127 inline G4double GetAxsc2piR2() const << 146 inline G4double GetTotalGlauberGribovXsc() { return fTotalXsc; }; 128 inline G4double GetModelInLog() const << 147 inline G4double GetElasticGlauberGribovXsc() { return fElasticXsc; }; 129 inline G4double GetTotalGlauberGribovXsc() c << 148 inline G4double GetInelasticGlauberGribovXsc(){ return fInelasticXsc; }; 130 inline G4double GetElasticGlauberGribovXsc() << 149 inline G4double GetProductionGlauberGribovXsc(){ return fProductionXsc; }; 131 inline G4double GetInelasticGlauberGribovXsc << 150 inline G4double GetDiffractionGlauberGribovXsc(){ return fDiffractionXsc; }; 132 inline G4double GetProductionGlauberGribovXs << 151 inline G4double GetRadiusConst() { return fRadiusConst; }; 133 inline G4double GetDiffractionGlauberGribovX << 134 152 135 inline G4double GetParticleBarCorTot(const G 153 inline G4double GetParticleBarCorTot(const G4ParticleDefinition* theParticle, G4int Z); 136 inline G4double GetParticleBarCorIn(const G4 154 inline G4double GetParticleBarCorIn(const G4ParticleDefinition* theParticle, G4int Z); 137 155 >> 156 inline void SetEnergyLowerLimit(G4double E ){fLowerLimit=E;}; >> 157 138 private: 158 private: 139 159 >> 160 // const G4double fUpperLimit; >> 161 G4double fLowerLimit; >> 162 const G4double fRadiusConst; >> 163 140 static const G4double fNeutronBarCorrectionT 164 static const G4double fNeutronBarCorrectionTot[93]; 141 static const G4double fNeutronBarCorrectionI 165 static const G4double fNeutronBarCorrectionIn[93]; 142 166 143 static const G4double fProtonBarCorrectionTo 167 static const G4double fProtonBarCorrectionTot[93]; 144 static const G4double fProtonBarCorrectionIn 168 static const G4double fProtonBarCorrectionIn[93]; 145 169 146 static const G4double fPionPlusBarCorrection 170 static const G4double fPionPlusBarCorrectionTot[93]; 147 static const G4double fPionPlusBarCorrection 171 static const G4double fPionPlusBarCorrectionIn[93]; 148 172 149 static const G4double fPionMinusBarCorrectio 173 static const G4double fPionMinusBarCorrectionTot[93]; 150 static const G4double fPionMinusBarCorrectio 174 static const G4double fPionMinusBarCorrectionIn[93]; 151 175 152 G4double fTotalXsc, fElasticXsc, fInelasticX 176 G4double fTotalXsc, fElasticXsc, fInelasticXsc, fProductionXsc, fDiffractionXsc; 153 G4double fAxsc2piR2, fModelInLog; << 177 // G4double fHadronNucleonXsc; 154 G4double fEnergy; //Cache << 155 178 156 const G4ParticleDefinition* theGamma; << 179 G4ParticleDefinition* theGamma; 157 const G4ParticleDefinition* theProton; << 180 G4ParticleDefinition* theProton; 158 const G4ParticleDefinition* theNeutron; << 181 G4ParticleDefinition* theNeutron; 159 const G4ParticleDefinition* theAProton; << 182 G4ParticleDefinition* theAProton; 160 const G4ParticleDefinition* theANeutron; << 183 G4ParticleDefinition* theANeutron; 161 const G4ParticleDefinition* thePiPlus; << 184 G4ParticleDefinition* thePiPlus; 162 const G4ParticleDefinition* thePiMinus; << 185 G4ParticleDefinition* thePiMinus; 163 const G4ParticleDefinition* theKPlus; << 186 G4ParticleDefinition* thePiZero; 164 const G4ParticleDefinition* theKMinus; << 187 G4ParticleDefinition* theKPlus; 165 const G4ParticleDefinition* theK0S; << 188 G4ParticleDefinition* theKMinus; 166 const G4ParticleDefinition* theK0L; << 189 G4ParticleDefinition* theK0S; 167 const G4ParticleDefinition* theLambda; << 190 G4ParticleDefinition* theK0L; >> 191 G4ParticleDefinition* theL; >> 192 G4ParticleDefinition* theAntiL; >> 193 G4ParticleDefinition* theSPlus; >> 194 G4ParticleDefinition* theASPlus; >> 195 G4ParticleDefinition* theSMinus; >> 196 G4ParticleDefinition* theASMinus; >> 197 G4ParticleDefinition* theS0; >> 198 G4ParticleDefinition* theAS0; >> 199 G4ParticleDefinition* theXiMinus; >> 200 G4ParticleDefinition* theXi0; >> 201 G4ParticleDefinition* theAXiMinus; >> 202 G4ParticleDefinition* theAXi0; >> 203 G4ParticleDefinition* theOmega; >> 204 G4ParticleDefinition* theAOmega; >> 205 G4ParticleDefinition* theD; >> 206 G4ParticleDefinition* theT; >> 207 G4ParticleDefinition* theA; >> 208 G4ParticleDefinition* theHe3; 168 209 169 G4HadronNucleonXsc* hnXsc; 210 G4HadronNucleonXsc* hnXsc; 170 211 171 // Cache << 172 const G4ParticleDefinition* fParticle; << 173 G4int fZ, fA, fL; << 174 << 175 }; 212 }; 176 213 177 ////////////////////////////////////////////// 214 //////////////////////////////////////////////////////////////// 178 // 215 // 179 // Inlines 216 // Inlines 180 217 181 inline G4double << 218 inline 182 G4ComponentGGHadronNucleusXsc::GetIsoCrossSect << 219 G4double 183 G4int Z, G4int A, << 220 G4ComponentGGHadronNucleusXsc::GetElasticGlauberGribov(const G4DynamicParticle* dp, 184 const G4Isotope*, << 221 G4int Z, G4int A) 185 const G4Element*, << 186 const G4Material*) << 187 { 222 { 188 ComputeCrossSections(dp->GetDefinition(), dp << 223 GetIsoCrossSection(dp, Z, A); 189 return fTotalXsc; << 190 } << 191 << 192 inline G4double << 193 G4ComponentGGHadronNucleusXsc::GetElasticGlaub << 194 const G4DynamicParticle* dp, G4int << 195 { << 196 ComputeCrossSections(dp->GetDefinition(), dp << 197 return fElasticXsc; 224 return fElasticXsc; 198 } 225 } 199 226 200 ////////////////////////////////////////////// 227 ///////////////////////////////////////////////////////////////// 201 228 202 inline G4double << 229 inline 203 G4ComponentGGHadronNucleusXsc::GetInelasticGla << 230 G4double 204 const G4DynamicParticle* dp, G4int << 231 G4ComponentGGHadronNucleusXsc::GetInelasticGlauberGribov(const G4DynamicParticle* dp, >> 232 G4int Z, G4int A) 205 { 233 { 206 ComputeCrossSections(dp->GetDefinition(), dp << 234 GetIsoCrossSection(dp, Z, A); 207 return fInelasticXsc; 235 return fInelasticXsc; 208 } 236 } 209 237 210 ////////////////////////////////////////////// 238 ///////////////////////////////////////////////////////////////////// 211 // 239 // 212 // return correction at Tkin = 90*GeV GG -> Ba 240 // return correction at Tkin = 90*GeV GG -> Barashenkov tot xsc, when it 213 // is available, else return 1.0 241 // is available, else return 1.0 214 242 >> 243 215 inline G4double G4ComponentGGHadronNucleusXsc: 244 inline G4double G4ComponentGGHadronNucleusXsc::GetParticleBarCorTot( 216 const G4ParticleDef << 245 const G4ParticleDefinition* theParticle, G4int Z) 217 { 246 { 218 G4double cor = 1.0; << 247 if(Z >= 2 && Z <= 92) 219 G4int z = std::min(92, std::max(ZZ, 1)); << 248 { 220 if( theParticle == theProton ) cor = fP << 249 if( theParticle == theProton ) return fProtonBarCorrectionTot[Z]; 221 else if( theParticle == theNeutron) cor = fN << 250 else if( theParticle == theNeutron) return fNeutronBarCorrectionTot[Z]; 222 else if( theParticle == thePiPlus ) cor = fP << 251 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionTot[Z]; 223 else if( theParticle == thePiMinus) cor = fP << 252 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionTot[Z]; 224 return cor; << 253 else return 1.0; >> 254 } >> 255 else return 1.0; 225 } 256 } 226 257 227 ////////////////////////////////////////////// 258 ///////////////////////////////////////////////////////////////////// 228 // 259 // 229 // return correction at Tkin = 90*GeV GG -> Ba 260 // return correction at Tkin = 90*GeV GG -> Barashenkov in xsc, when it 230 // is available, else return 1.0 261 // is available, else return 1.0 231 262 232 263 233 inline G4double G4ComponentGGHadronNucleusXsc: 264 inline G4double G4ComponentGGHadronNucleusXsc::GetParticleBarCorIn( 234 const G4ParticleDef << 265 const G4ParticleDefinition* theParticle, G4int Z) 235 { 266 { 236 G4double cor = 1.0; << 267 if(Z >= 2 && Z <= 92) 237 G4int z = std::min(92, std::max(ZZ, 1)); << 268 { 238 if( theParticle == theProton ) cor = fP << 269 if( theParticle == theProton ) return fProtonBarCorrectionIn[Z]; 239 else if( theParticle == theNeutron) cor = fN << 270 else if( theParticle == theNeutron) return fNeutronBarCorrectionIn[Z]; 240 else if( theParticle == thePiPlus ) cor = fP << 271 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionIn[Z]; 241 else if( theParticle == thePiMinus) cor = fP << 272 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionIn[Z]; 242 return cor; << 273 else return 1.0; >> 274 } >> 275 else return 1.0; 243 } 276 } 244 277 245 #endif 278 #endif 246 279