00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef G4GlauberGribovCrossSection_h
00044 #define G4GlauberGribovCrossSection_h 1
00045
00046 #include "globals.hh"
00047 #include "G4Proton.hh"
00048 #include "G4Nucleus.hh"
00049
00050 #include "G4VCrossSectionDataSet.hh"
00051
00052 class G4ParticleDefinition;
00053 class G4HadronNucleonXsc;
00054
00055 class G4GlauberGribovCrossSection : public G4VCrossSectionDataSet
00056 {
00057 public:
00058
00059 G4GlauberGribovCrossSection ();
00060 virtual ~G4GlauberGribovCrossSection ();
00061
00062 static const char* Default_Name() {return "Glauber-Gribov";}
00063
00064 virtual
00065 G4bool IsIsoApplicable(const G4DynamicParticle* aDP, G4int Z, G4int A,
00066 const G4Element* elm = 0,
00067 const G4Material* mat = 0);
00068
00069 virtual
00070 G4double GetIsoCrossSection(const G4DynamicParticle*, G4int Z, G4int A,
00071 const G4Isotope* iso = 0,
00072 const G4Element* elm = 0,
00073 const G4Material* mat = 0);
00074
00075 G4double GetRatioSD(const G4DynamicParticle*, G4int At, G4int Zt);
00076 G4double GetRatioQE(const G4DynamicParticle*, G4int At, G4int Zt);
00077
00078 G4double GetHadronNucleonXsc(const G4DynamicParticle*, const G4Element*);
00079 G4double GetHadronNucleonXsc(const G4DynamicParticle*, G4int At, G4int Zt);
00080
00081 G4double GetHadronNucleonXscPDG(const G4DynamicParticle*, const G4Element*);
00082 G4double GetHadronNucleonXscPDG(const G4DynamicParticle*, G4int At, G4int Zt);
00083 G4double GetHadronNucleonXscNS(const G4DynamicParticle*, const G4Element*);
00084 G4double GetHadronNucleonXscNS(const G4DynamicParticle*, G4int At, G4int Zt);
00085 G4double GetKaonNucleonXscVector(const G4DynamicParticle*, G4int At, G4int Zt);
00086
00087 G4double GetHNinelasticXsc(const G4DynamicParticle*, const G4Element*);
00088 G4double GetHNinelasticXsc(const G4DynamicParticle*, G4int At, G4int Zt);
00089 G4double GetHNinelasticXscVU(const G4DynamicParticle*, G4int At, G4int Zt);
00090
00091 G4double CalculateEcmValue ( const G4double , const G4double , const G4double );
00092
00093 G4double CalcMandelstamS( const G4double , const G4double , const G4double );
00094
00095 G4double GetNucleusRadius(const G4DynamicParticle*, const G4Element*);
00096 G4double GetNucleusRadius(G4int At);
00097
00098 virtual void CrossSectionDescription(std::ostream&) const;
00099
00100 inline G4double GetElasticGlauberGribov(const G4DynamicParticle*, G4int Z, G4int A);
00101 inline G4double GetInelasticGlauberGribov(const G4DynamicParticle*, G4int Z, G4int A);
00102
00103 inline G4double GetTotalGlauberGribovXsc() { return fTotalXsc; };
00104 inline G4double GetElasticGlauberGribovXsc() { return fElasticXsc; };
00105 inline G4double GetInelasticGlauberGribovXsc(){ return fInelasticXsc; };
00106 inline G4double GetProductionGlauberGribovXsc(){ return fProductionXsc; };
00107 inline G4double GetDiffractionGlauberGribovXsc(){ return fDiffractionXsc; };
00108 inline G4double GetRadiusConst() { return fRadiusConst; };
00109
00110 inline G4double GetParticleBarCorTot(const G4ParticleDefinition* theParticle, G4int Z);
00111 inline G4double GetParticleBarCorIn(const G4ParticleDefinition* theParticle, G4int Z);
00112
00113 inline void SetEnergyLowerLimit(G4double E ){fLowerLimit=E;};
00114
00115 private:
00116
00117 const G4double fUpperLimit;
00118 G4double fLowerLimit;
00119 const G4double fRadiusConst;
00120
00121 static const G4double fNeutronBarCorrectionTot[93];
00122 static const G4double fNeutronBarCorrectionIn[93];
00123
00124 static const G4double fProtonBarCorrectionTot[93];
00125 static const G4double fProtonBarCorrectionIn[93];
00126
00127 static const G4double fPionPlusBarCorrectionTot[93];
00128 static const G4double fPionPlusBarCorrectionIn[93];
00129
00130 static const G4double fPionMinusBarCorrectionTot[93];
00131 static const G4double fPionMinusBarCorrectionIn[93];
00132
00133 G4double fTotalXsc, fElasticXsc, fInelasticXsc, fProductionXsc, fDiffractionXsc;
00134 G4double fHadronNucleonXsc;
00135
00136 G4ParticleDefinition* theGamma;
00137 G4ParticleDefinition* theProton;
00138 G4ParticleDefinition* theNeutron;
00139 G4ParticleDefinition* theAProton;
00140 G4ParticleDefinition* theANeutron;
00141 G4ParticleDefinition* thePiPlus;
00142 G4ParticleDefinition* thePiMinus;
00143 G4ParticleDefinition* thePiZero;
00144 G4ParticleDefinition* theKPlus;
00145 G4ParticleDefinition* theKMinus;
00146 G4ParticleDefinition* theK0S;
00147 G4ParticleDefinition* theK0L;
00148 G4ParticleDefinition* theL;
00149 G4ParticleDefinition* theAntiL;
00150 G4ParticleDefinition* theSPlus;
00151 G4ParticleDefinition* theASPlus;
00152 G4ParticleDefinition* theSMinus;
00153 G4ParticleDefinition* theASMinus;
00154 G4ParticleDefinition* theS0;
00155 G4ParticleDefinition* theAS0;
00156 G4ParticleDefinition* theXiMinus;
00157 G4ParticleDefinition* theXi0;
00158 G4ParticleDefinition* theAXiMinus;
00159 G4ParticleDefinition* theAXi0;
00160 G4ParticleDefinition* theOmega;
00161 G4ParticleDefinition* theAOmega;
00162 G4ParticleDefinition* theD;
00163 G4ParticleDefinition* theT;
00164 G4ParticleDefinition* theA;
00165 G4ParticleDefinition* theHe3;
00166
00167 G4HadronNucleonXsc* hnXsc;
00168
00169 };
00170
00172
00173
00174
00175 inline
00176 G4double
00177 G4GlauberGribovCrossSection::GetElasticGlauberGribov(const G4DynamicParticle* dp,
00178 G4int Z, G4int A)
00179 {
00180 GetIsoCrossSection(dp, Z, A);
00181 return fElasticXsc;
00182 }
00183
00185
00186 inline
00187 G4double
00188 G4GlauberGribovCrossSection::GetInelasticGlauberGribov(const G4DynamicParticle* dp,
00189 G4int Z, G4int A)
00190 {
00191 GetIsoCrossSection(dp, Z, A);
00192 return fInelasticXsc;
00193 }
00194
00196
00197
00198
00199
00200
00201 inline G4double G4GlauberGribovCrossSection::GetParticleBarCorTot(
00202 const G4ParticleDefinition* theParticle, G4int Z)
00203 {
00204 if(Z >= 2 && Z <= 92)
00205 {
00206 if( theParticle == theProton ) return fProtonBarCorrectionTot[Z];
00207 else if( theParticle == theNeutron) return fNeutronBarCorrectionTot[Z];
00208 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionTot[Z];
00209 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionTot[Z];
00210 else return 1.0;
00211 }
00212 else return 1.0;
00213 }
00214
00216
00217
00218
00219
00220
00221 inline G4double G4GlauberGribovCrossSection::GetParticleBarCorIn(
00222 const G4ParticleDefinition* theParticle, G4int Z)
00223 {
00224 if(Z >= 2 && Z <= 92)
00225 {
00226 if( theParticle == theProton ) return fProtonBarCorrectionIn[Z];
00227 else if( theParticle == theNeutron) return fNeutronBarCorrectionIn[Z];
00228 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionIn[Z];
00229 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionIn[Z];
00230 else return 1.0;
00231 }
00232 else return 1.0;
00233 }
00234
00235 #endif