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