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