#include <G4XPDGTotal.hh>
Inheritance diagram for G4XPDGTotal:
Public Member Functions | |
G4XPDGTotal () | |
virtual | ~G4XPDGTotal () |
G4bool | operator== (const G4XPDGTotal &right) const |
G4bool | operator!= (const G4XPDGTotal &right) const |
virtual G4double | CrossSection (const G4KineticTrack &trk1, const G4KineticTrack &trk2) const |
virtual const G4CrossSectionVector * | GetComponents () const |
virtual G4String | Name () const |
virtual G4bool | IsValid (G4double e) const |
virtual G4double | LowLimit () const |
Definition at line 55 of file G4XPDGTotal.hh.
G4XPDGTotal::G4XPDGTotal | ( | ) |
Definition at line 69 of file G4XPDGTotal.cc.
References G4Gamma::GammaDefinition(), G4KaonMinus::KaonMinusDefinition(), G4KaonPlus::KaonPlusDefinition(), G4Neutron::NeutronDefinition(), G4InuclParticleNames::nn, G4PionMinus::PionMinusDefinition(), G4PionPlus::PionPlusDefinition(), G4InuclParticleNames::pn, G4InuclParticleNames::pp, and G4Proton::ProtonDefinition().
00070 { 00071 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> pp(G4Proton::ProtonDefinition(), 00072 G4Proton::ProtonDefinition()); 00073 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> pn(G4Proton::ProtonDefinition(), 00074 G4Neutron::NeutronDefinition()); 00075 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> piPlusp(G4PionPlus::PionPlusDefinition(), 00076 G4Proton::ProtonDefinition()); 00077 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> piMinusp(G4PionMinus::PionMinusDefinition(), 00078 G4Proton::ProtonDefinition()); 00079 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> KPlusp(G4KaonPlus::KaonPlusDefinition(), 00080 G4Proton::ProtonDefinition()); 00081 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> KPlusn(G4KaonPlus::KaonPlusDefinition(), 00082 G4Neutron::NeutronDefinition()); 00083 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> KMinusp(G4KaonMinus::KaonMinusDefinition(), 00084 G4Proton::ProtonDefinition()); 00085 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> KMinusn(G4KaonMinus::KaonMinusDefinition(), 00086 G4Neutron::NeutronDefinition()); 00087 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> gp(G4Gamma::GammaDefinition(), 00088 G4Proton::ProtonDefinition()); 00089 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> gg(G4Gamma::GammaDefinition(), 00090 G4Gamma::GammaDefinition()); 00091 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> nn(G4Neutron::NeutronDefinition(), 00092 G4Neutron::NeutronDefinition()); 00093 00094 std::vector<G4double> nnData; 00095 std::vector<G4double> ppData; 00096 std::vector<G4double> pnData; 00097 std::vector<G4double> pipData; 00098 std::vector<G4double> KpData; 00099 std::vector<G4double> KnData; 00100 std::vector<G4double> gpData; 00101 std::vector<G4double> ggData; 00102 00103 G4int i; 00104 for (i=0; i<2; i++) 00105 { 00106 nnData.push_back(ppPDGFit[i] * GeV); 00107 ppData.push_back(ppPDGFit[i] * GeV); 00108 pnData.push_back(npPDGFit[i] * GeV); 00109 pipData.push_back(pipPDGFit[i] * GeV); 00110 KpData.push_back(KpPDGFit[i] * GeV); 00111 KnData.push_back(KnPDGFit[i] * GeV); 00112 gpData.push_back(gammapPDGFit[i] * GeV); 00113 ggData.push_back(gammagammaPDGFit[i] * GeV); 00114 } 00115 for (i=2; i<nFit; i++) 00116 { 00117 nnData.push_back(ppPDGFit[i]); 00118 ppData.push_back(ppPDGFit[i]); 00119 pnData.push_back(npPDGFit[i]); 00120 pipData.push_back(pipPDGFit[i]); 00121 KpData.push_back(KpPDGFit[i]); 00122 KnData.push_back(KnPDGFit[i]); 00123 gpData.push_back(gammapPDGFit[i]); 00124 ggData.push_back(gammagammaPDGFit[i]); 00125 } 00126 00127 xMap[pp] = ppData; 00128 xMap[pn] = pnData; 00129 xMap[piPlusp] = pipData; 00130 xMap[piMinusp] = pipData; 00131 xMap[KPlusp] = KpData; 00132 xMap[KPlusn] = KnData; 00133 xMap[KMinusp] = KpData; 00134 xMap[KMinusn] = KnData; 00135 xMap[gp] = gpData; 00136 xMap[gg] = ggData; 00137 xMap[nn] = nnData; 00138 }
G4XPDGTotal::~G4XPDGTotal | ( | ) | [virtual] |
G4double G4XPDGTotal::CrossSection | ( | const G4KineticTrack & | trk1, | |
const G4KineticTrack & | trk2 | |||
) | const [virtual] |
Implements G4VCrossSectionSource.
Definition at line 157 of file G4XPDGTotal.cc.
References G4cout, G4endl, G4KineticTrack::Get4Momentum(), G4KineticTrack::GetDefinition(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetPDGEncoding(), and G4ParticleDefinition::GetPDGMass().
Referenced by G4XpipNTotal::CrossSection(), and G4XpimNTotal::CrossSection().
00159 { 00160 G4double sigma = 0.; 00161 00162 G4double sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag(); 00163 00164 G4ParticleDefinition* def1 = trk1.GetDefinition(); 00165 G4ParticleDefinition* def2 = trk2.GetDefinition(); 00166 00167 G4double enc1 = def1->GetPDGEncoding(); 00168 G4double enc2 = def2->GetPDGEncoding(); 00169 G4double coeff = -1.; 00170 if ( (enc1 < 0 && enc2 >0) || (enc2 < 0 && enc1 >0) ) coeff = 1.; 00171 00172 // Order the pair: first is the lower mass particle, second is the higher mass one 00173 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> trkPair(def1,def2); 00174 00175 if (def1->GetPDGMass() > def2->GetPDGMass()) 00176 trkPair = std::pair<G4ParticleDefinition *,G4ParticleDefinition *>(def2,def1); 00177 00178 std::vector<G4double> data; 00179 00180 if (xMap.find(trkPair) != xMap.end()) 00181 { 00182 00183 PairDoubleMap::const_iterator iter; 00184 for (iter = xMap.begin(); iter != xMap.end(); ++iter) 00185 { 00186 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> thePair = (*iter).first; 00187 if (thePair == trkPair) 00188 { 00189 data = (*iter).second; 00190 00191 G4double eMinFit = data[0]; 00192 G4double eMaxFit = data[1]; 00193 G4double xFit = data[2]; 00194 G4double y1Fit = data[3]; 00195 G4double y2Fit = data[4]; 00196 00197 // Total Cross-section fit, 1998 Review of Particle Properties, European Phys. J. 3(1998), 1 00198 00199 // Parameters from the PDG fit 00200 const G4double epsilon = 0.095; 00201 const G4double eta1 = -0.34; 00202 const G4double eta2 = -0.55; 00203 00204 if (sqrtS < eMinFit || sqrtS > eMaxFit) 00205 { 00206 G4cout << "WARNING! G4XPDGTotal::PDGTotal extrapolating cross section at " 00207 << sqrtS / GeV 00208 << " GeV outside the PDG fit range " 00209 << eMinFit / GeV << " - " << eMaxFit / GeV << " GeV " << G4endl; 00210 } 00211 00212 G4double S = (sqrtS * sqrtS) / (GeV*GeV); 00213 00214 sigma = ( (xFit * std::pow(S,epsilon)) + 00215 (y1Fit * std::pow(S,eta1)) + 00216 (coeff * y2Fit * std::pow(S,eta2)) ) * millibarn; 00217 00218 if (sigma < 0.) 00219 { 00220 G4String name1 = def1->GetParticleName(); 00221 G4String name2 = def2->GetParticleName(); 00222 G4cout << "WARNING! G4XPDGTotal::PDGTotal " 00223 << name1 << "-" << name2 00224 << " total cross section: Ecm " 00225 << sqrtS / GeV << " GeV, negative cross section " 00226 << sigma / millibarn << " mb set to 0" << G4endl; 00227 sigma = 0.; 00228 } 00229 } 00230 } 00231 } 00232 return sigma; 00233 }
virtual const G4CrossSectionVector* G4XPDGTotal::GetComponents | ( | ) | const [inline, virtual] |
Reimplemented from G4VCrossSectionSource.
Definition at line 243 of file G4XPDGTotal.cc.
References G4VCrossSectionSource::InLimits().
virtual G4double G4XPDGTotal::LowLimit | ( | ) | const [inline, virtual] |
G4String G4XPDGTotal::Name | ( | ) | const [virtual] |
Implements G4VCrossSectionSource.
Definition at line 236 of file G4XPDGTotal.cc.
00237 { 00238 G4String name = "PDGTotal "; 00239 return name; 00240 }
G4bool G4XPDGTotal::operator!= | ( | const G4XPDGTotal & | right | ) | const |
Definition at line 151 of file G4XPDGTotal.cc.
00152 { 00153 return (this != (G4XPDGTotal *) &right); 00154 }
G4bool G4XPDGTotal::operator== | ( | const G4XPDGTotal & | right | ) | const |
Definition at line 145 of file G4XPDGTotal.cc.
00146 { 00147 return (this == (G4XPDGTotal *) &right); 00148 }