Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ChargeExchangeProcess.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id: G4ChargeExchangeProcess.cc 91806 2015-08-06 12:20:45Z gcosmo $
28 //
29 //
30 // Geant4 Hadron Charge Exchange Process -- source file
31 //
32 // Created 21 April 2006 V.Ivanchenko
33 //
34 // Modified:
35 // 24-Apr-06 V.Ivanchenko add neutron scattering on hydrogen from CHIPS
36 // 07-Jun-06 V.Ivanchenko fix problem of rotation of final state
37 // 25-Jul-06 V.Ivanchenko add 19 MeV low energy for CHIPS
38 // 23-Jan-07 V.Ivanchenko add cross section interfaces with Z and A
39 // and do not use CHIPS for cross sections
40 // 14-Sep-12 M.Kelsey -- Pass subType code to base ctor
41 // 06-Aug-15 A.Ribon migrating to G4Pow
42 
44 #include "globals.hh"
45 #include "G4SystemOfUnits.hh"
48 #include "G4Element.hh"
49 #include "G4ElementVector.hh"
50 #include "G4IsotopeVector.hh"
51 #include "G4Neutron.hh"
52 #include "G4Proton.hh"
53 #include "G4PhysicsLinearVector.hh"
54 
55 #include "G4Pow.hh"
56 
57 
59  : G4HadronicProcess(procName,fChargeExchange), first(true)
60 {
61  thEnergy = 20.*MeV;
62  pPDG = 0;
63  verboseLevel= 1;
65  theProton = G4Proton::Proton();
66  theNeutron = G4Neutron::Neutron();
67  theAProton = G4AntiProton::AntiProton();
68  theANeutron = G4AntiNeutron::AntiNeutron();
69  thePiPlus = G4PionPlus::PionPlus();
70  thePiMinus = G4PionMinus::PionMinus();
71  thePiZero = G4PionZero::PionZero();
72  theKPlus = G4KaonPlus::KaonPlus();
73  theKMinus = G4KaonMinus::KaonMinus();
76  theL = G4Lambda::Lambda();
77  theAntiL = G4AntiLambda::AntiLambda();
78  theSPlus = G4SigmaPlus::SigmaPlus();
79  theASPlus = G4AntiSigmaPlus::AntiSigmaPlus();
80  theSMinus = G4SigmaMinus::SigmaMinus();
81  theASMinus = G4AntiSigmaMinus::AntiSigmaMinus();
82  theS0 = G4SigmaZero::SigmaZero();
84  theXiMinus = G4XiMinus::XiMinus();
85  theXi0 = G4XiZero::XiZero();
86  theAXiMinus = G4AntiXiMinus::AntiXiMinus();
87  theAXi0 = G4AntiXiZero::AntiXiZero();
88  theOmega = G4OmegaMinus::OmegaMinus();
90  theD = G4Deuteron::Deuteron();
91  theT = G4Triton::Triton();
92  theA = G4Alpha::Alpha();
93  theHe3 = G4He3::He3();
94 }
95 
97 {
98  if (factors) delete factors;
99 }
100 
103 {
104  if(first) {
105  first = false;
106  theParticle = &aParticleType;
107  pPDG = theParticle->GetPDGEncoding();
108 
110 
111  const size_t n = 10;
112  if(theParticle == thePiPlus || theParticle == thePiMinus ||
113  theParticle == theKPlus || theParticle == theKMinus ||
114  theParticle == theK0S || theParticle == theK0L) {
115 
116  G4double F[n] = {0.33,0.27,0.29,0.31,0.27,0.18,0.13,0.1,0.09,0.07};
117  factors = new G4PhysicsLinearVector(0.0,2.0*GeV,n);
118  for(size_t i=0; i<n; i++) {factors->PutValue(i,F[i]);}
119 
120  } else {
121 
122  G4double F[n] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
123  factors = new G4PhysicsLinearVector(0.0,4.0*GeV,n);
124  for(size_t i=0; i<n; i++) {factors->PutValue(i,F[i]);}
125  }
126  //factors->SetSpline(true);
127 
128  if(verboseLevel>1)
129  G4cout << "G4ChargeExchangeProcess for "
130  << theParticle->GetParticleName()
131  << G4endl;
132  }
134 }
135 
137  const G4DynamicParticle* dp,
138  const G4Element* elm,
139  const G4Material* mat)
140 {
141  // gives the microscopic cross section in GEANT4 internal units
142  G4double Z = elm->GetZ();
143  G4int iz = G4int(Z);
144  G4double x = 0.0;
145 
146  // The process is effective only above the threshold
147  if(iz == 1 || dp->GetKineticEnergy() < thEnergy) return x;
148 
149  if(verboseLevel>1)
150  G4cout << "G4ChargeExchangeProcess compute GHAD CS for element "
151  << elm->GetName()
152  << G4endl;
153  x = store->GetCrossSection(dp, elm, mat);
154 
155  if(verboseLevel>1)
156  G4cout << "G4ChargeExchangeProcess cross(mb)= " << x/millibarn
157  << " E(MeV)= " << dp->GetKineticEnergy()
158  << " " << theParticle->GetParticleName()
159  << " in Z= " << iz
160  << G4endl;
161  G4bool b;
162  G4double A = elm->GetN();
163  G4double ptot = dp->GetTotalMomentum();
164  x *= factors->GetValue(ptot, b)/G4Pow::GetInstance()->powA(A, 0.42);
165  if(theParticle == thePiPlus || theParticle == theProton ||
166  theParticle == theKPlus || theParticle == theANeutron)
167  { x *= (1.0 - Z/A); }
168 
169  else if(theParticle == thePiMinus || theParticle == theNeutron ||
170  theParticle == theKMinus || theParticle == theAProton)
171  { x *= Z/A; }
172 
173  if(theParticle->GetPDGMass() < GeV) {
174  if(ptot > 2.*GeV) x *= 4.0*GeV*GeV/(ptot*ptot);
175  }
176 
177  if(verboseLevel>1)
178  G4cout << "Corrected cross(mb)= " << x/millibarn << G4endl;
179 
180  return x;
181 }
182 
184 IsApplicable(const G4ParticleDefinition& aParticleType)
185 {
186  const G4ParticleDefinition* p = &aParticleType;
187  return (p == thePiPlus || p == thePiMinus ||
188  p == theProton || p == theNeutron ||
189  p == theAProton|| p == theANeutron||
190  p == theKPlus || p == theKMinus ||
191  p == theK0S || p == theK0L ||
192  p == theL);
193 }
194 
197 {
198  store->DumpPhysicsTable(aParticleType);
199 }
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
virtual G4bool IsApplicable(const G4ParticleDefinition &aParticleType)
G4double powA(G4double A, G4double y) const
Definition: G4Pow.hh:259
G4double GetValue(G4double theEnergy, G4bool &isOutRange) const
G4int verboseLevel
Definition: G4VProcess.hh:368
static G4AntiOmegaMinus * AntiOmegaMinus()
G4double GetKineticEnergy() const
G4double GetN() const
Definition: G4Element.hh:135
const char * p
Definition: xmltok.h:285
static G4OmegaMinus * OmegaMinus()
G4double GetZ() const
Definition: G4Element.hh:131
static G4KaonZeroLong * KaonZeroLong()
static G4AntiSigmaPlus * AntiSigmaPlus()
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
static G4SigmaZero * SigmaZero()
Definition: G4SigmaZero.cc:102
static G4KaonMinus * KaonMinus()
Definition: G4KaonMinus.cc:113
G4double GetTotalMomentum() const
static G4AntiSigmaMinus * AntiSigmaMinus()
G4ChargeExchangeProcess(const G4String &procName="chargeExchange")
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
static G4XiZero * XiZero()
Definition: G4XiZero.cc:106
void AddDataSet(G4VCrossSectionDataSet *aDataSet)
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
virtual G4double GetElementCrossSection(const G4DynamicParticle *aParticle, const G4Element *anElement, const G4Material *mat=0)
static G4KaonZeroShort * KaonZeroShort()
static G4AntiProton * AntiProton()
Definition: G4AntiProton.cc:93
bool G4bool
Definition: G4Types.hh:79
static G4XiMinus * XiMinus()
Definition: G4XiMinus.cc:106
G4CrossSectionDataStore * GetCrossSectionDataStore()
void PutValue(size_t index, G4double theValue)
static G4AntiXiMinus * AntiXiMinus()
static G4Triton * Triton()
Definition: G4Triton.cc:95
G4double GetCrossSection(const G4DynamicParticle *, const G4Material *)
static G4Proton * Proton()
Definition: G4Proton.cc:93
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:98
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
static G4PionZero * PionZero()
Definition: G4PionZero.cc:108
static G4Deuteron * Deuteron()
Definition: G4Deuteron.cc:94
static G4SigmaMinus * SigmaMinus()
void DumpPhysicsTable(const G4ParticleDefinition &)
G4double GetPDGMass() const
static G4AntiLambda * AntiLambda()
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:98
static G4AntiSigmaZero * AntiSigmaZero()
static constexpr double GeV
Definition: G4SIunits.hh:217
static G4AntiXiZero * AntiXiZero()
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
static G4Alpha * Alpha()
Definition: G4Alpha.cc:89
static G4SigmaPlus * SigmaPlus()
Definition: G4SigmaPlus.cc:108
static G4Lambda * Lambda()
Definition: G4Lambda.cc:108
double G4double
Definition: G4Types.hh:76
const G4String & GetName() const
Definition: G4Element.hh:127
static G4KaonPlus * KaonPlus()
Definition: G4KaonPlus.cc:113
static G4He3 * He3()
Definition: G4He3.cc:94
virtual void BuildPhysicsTable(const G4ParticleDefinition &aParticleType)
static G4AntiNeutron * AntiNeutron()
static constexpr double millibarn
Definition: G4SIunits.hh:106
virtual void DumpPhysicsTable(const G4ParticleDefinition &aParticleType)