G4XPDGTotal Class Reference

#include <G4XPDGTotal.hh>

Inheritance diagram for G4XPDGTotal:

G4VCrossSectionSource

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 G4CrossSectionVectorGetComponents () const
virtual G4String Name () const
virtual G4bool IsValid (G4double e) const
virtual G4double LowLimit () const

Detailed Description

Definition at line 55 of file G4XPDGTotal.hh.


Constructor & Destructor Documentation

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]

Definition at line 141 of file G4XPDGTotal.cc.

00142 { }


Member Function Documentation

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]

Implements G4VCrossSectionSource.

Definition at line 69 of file G4XPDGTotal.hh.

00069 { return 0; }

G4bool G4XPDGTotal::IsValid ( G4double  e  )  const [virtual]

Reimplemented from G4VCrossSectionSource.

Definition at line 243 of file G4XPDGTotal.cc.

References G4VCrossSectionSource::InLimits().

00244 {
00245   G4bool answer = InLimits(e,_lowLimit,_highLimit);
00246 
00247   return answer;
00248 }

virtual G4double G4XPDGTotal::LowLimit (  )  const [inline, virtual]

Reimplemented from G4VCrossSectionSource.

Definition at line 75 of file G4XPDGTotal.hh.

00075 { return _lowLimit; }

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 }


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:54:00 2013 for Geant4 by  doxygen 1.4.7