Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4EMDissociationCrossSection.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// * *
21// * Parts of this code which have been developed by QinetiQ Ltd *
22// * under contract to the European Space Agency (ESA) are the *
23// * intellectual property of ESA. Rights to use, copy, modify and *
24// * redistribute this software for general public use are granted *
25// * in compliance with any licensing, distribution and development *
26// * policy adopted by the Geant4 Collaboration. This code has been *
27// * written by QinetiQ Ltd for the European Space Agency, under ESA *
28// * contract 17191/03/NL/LvH (Aurora Programme). *
29// * *
30// * By using, copying, modifying or distributing the software (or *
31// * any work based on the software) you agree to acknowledge its *
32// * use in resulting scientific publications, and indicate your *
33// * acceptance of all terms of the Geant4 Software license. *
34// ********************************************************************
35//
36// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37//
38// MODULE: G4EMDissociationCrossSection.cc
39//
40// Version: B.1
41// Date: 15/04/04
42// Author: P R Truscott
43// Organisation: QinetiQ Ltd, UK
44// Customer: ESA/ESTEC, NOORDWIJK
45// Contract: 17191/03/NL/LvH
46//
47// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48//
49// CHANGE HISTORY
50// --------------
51//
52// 17 October 2003, P R Truscott, QinetiQ Ltd, UK
53// Created.
54//
55// 15 March 2004, P R Truscott, QinetiQ Ltd, UK
56// Beta release
57//
58// 30 May 2005, J.P. Wellisch removed a compilation warning on gcc 3.4 for
59// geant4 7.1.
60// 09 November 2010, V.Ivanchenko make class applicable for Hydrogen but
61// set cross section for Hydrogen to zero
62//
63// 17 August 2011, V.Ivanchenko, provide migration to new design of cross
64// sections considering this cross section as element-wise
65//
66// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67//////////////////////////////////////////////////////////////////////////////
68//
71#include "G4SystemOfUnits.hh"
72#include "G4ParticleTable.hh"
73#include "G4IonTable.hh"
74#include "G4HadTmpUtil.hh"
75#include "globals.hh"
76#include "G4NistManager.hh"
77
78
80 : G4VCrossSectionDataSet("Electromagnetic dissociation")
81{
82 // This function makes use of the class which can sample the virtual photon
83 // spectrum, G4EMDissociationSpectrum.
84
85 thePhotonSpectrum = new G4EMDissociationSpectrum();
86
87 // Define other constants.
88
89 r0 = 1.18 * fermi;
90 J = 36.8 * MeV;
91 Qprime = 17.0 * MeV;
92 epsilon = 0.0768;
93 xd = 0.25;
94}
95
96//////////////////////////////////////////////////////////////////////////////
97
99{
100 delete thePhotonSpectrum;
101}
102/////////////////////////////////////////////////////////////////////////////
103//
104G4bool
106 G4int /*ZZ*/, const G4Material*)
107{
108//
109// The condition for the applicability of this class is that the projectile
110// must be an ion and the target must have more than one nucleon. In reality
111// the value of A for either the projectile or target could be much higher,
112// since for cases where both he projectile and target are medium to small
113// Z, the probability of the EMD process is, I think, VERY small.
114//
115 if (G4ParticleTable::GetParticleTable()->GetIonTable()->IsIon(part->GetDefinition())) {
116 return true;
117 } else {
118 return false;
119 }
120}
121
122//////////////////////////////////////////////////////////////////////////////
123//
125 (const G4DynamicParticle* theDynamicParticle, G4int Z,
126 const G4Material*)
127{
128 // VI protection for Hydrogen
129 if(1 >= Z) { return 0.0; }
130
131 // Zero cross-section for particles with kinetic energy less than 2 MeV to prevent
132 // possible abort signal from bad arithmetic in GetCrossSectionForProjectile
133 if ( theDynamicParticle->GetKineticEnergy() < 2.0*CLHEP::MeV ) { return 0.0; }
134
135 //
136 // Get relevant information about the projectile and target (A, Z) and
137 // velocity of the projectile.
138 //
139 const G4ParticleDefinition *definitionP = theDynamicParticle->GetDefinition();
140 G4double AP = definitionP->GetBaryonNumber();
141 G4double ZP = definitionP->GetPDGCharge();
142 G4double b = theDynamicParticle->Get4Momentum().beta();
143
145 G4double ZT = (G4double)Z;
146 G4double bmin = thePhotonSpectrum->GetClosestApproach(AP, ZP, AT, ZT, b);
147 //
148 //
149 // Calculate the cross-section for the projectile and then the target. The
150 // information is returned in a G4PhysicsFreeVector, which separates out the
151 // cross-sections for the E1 and E2 moments of the virtual photon field, and
152 // the energies (GDR and GQR).
153 //
154 G4PhysicsFreeVector *theProjectileCrossSections =
155 GetCrossSectionForProjectile (AP, ZP, AT, ZT, b, bmin);
156 G4double crossSection =
157 (*theProjectileCrossSections)[0]+(*theProjectileCrossSections)[1];
158 delete theProjectileCrossSections;
159 G4PhysicsFreeVector *theTargetCrossSections =
160 GetCrossSectionForTarget (AP, ZP, AT, ZT, b, bmin);
161 crossSection +=
162 (*theTargetCrossSections)[0]+(*theTargetCrossSections)[1];
163 delete theTargetCrossSections;
164 return crossSection;
165}
166////////////////////////////////////////////////////////////////////////////////
167//
170 G4double ZP, G4double /* AT */, G4double ZT, G4double b, G4double bmin)
171{
172//
173//
174// Use Wilson et al's approach to calculate the cross-sections due to the E1
175// and E2 moments of the field at the giant dipole and quadrupole resonances
176// respectively, Note that the algorithm is traditionally applied to the
177// EMD break-up of the projectile in the field of the target, as is implemented
178// here.
179//
180// Initialise variables and calculate the energies for the GDR and GQR.
181//
182 G4double AProot3 = G4Pow::GetInstance()->powA(AP,1.0/3.0);
183 G4double u = 3.0 * J / Qprime / AProot3;
184 G4double R0 = r0 * AProot3;
185 G4double E_GDR = hbarc / std::sqrt(0.7*amu_c2*R0*R0/8.0/J*
186 (1.0 + u - (1.0 + epsilon + 3.0*u)/(1.0 + epsilon + u)*epsilon));
187 G4double E_GQR = 63.0 * MeV / AProot3;
188//
189//
190// Determine the virtual photon spectra at these energies.
191//
192 G4double ZTsq = ZT * ZT;
193 G4double nE1 = ZTsq *
194 thePhotonSpectrum->GetGeneralE1Spectrum(E_GDR, b, bmin);
195 G4double nE2 = ZTsq *
196 thePhotonSpectrum->GetGeneralE2Spectrum(E_GQR, b, bmin);
197//
198//
199// Now calculate the cross-section of the projectile for interaction with the
200// E1 and E2 fields.
201//
202 G4double sE1 = 60.0 * millibarn * MeV * (AP-ZP)*ZP/AP;
203 G4double sE2 = 0.22 * microbarn / MeV * ZP * AProot3 * AProot3;
204 if (AP > 100.0) sE2 *= 0.9;
205 else if (AP > 40.0) sE2 *= 0.6;
206 else sE2 *= 0.3;
207//
208//
209// ... and multiply with the intensity of the virtual photon spectra to get
210// the probability of interaction.
211//
212 G4PhysicsFreeVector *theCrossSectionVector = new G4PhysicsFreeVector(2);
213 theCrossSectionVector->PutValue(0, E_GDR, sE1*nE1);
214 theCrossSectionVector->PutValue(1, E_GQR, sE2*nE2*E_GQR*E_GQR);
215
216 return theCrossSectionVector;
217}
218
219////////////////////////////////////////////////////////////////////////////////
220//
223 G4double ZP, G4double AT, G4double ZT, G4double b, G4double bmin)
224{
225//
226// This is a cheaky little member function to calculate the probability of
227// EMD for the target in the field of the projectile ... just by reversing the
228// A and Z's for the participants.
229//
230 return GetCrossSectionForProjectile (AT, ZT, AP, ZP, b, bmin);
231}
232
233////////////////////////////////////////////////////////////////////////////////
234//
237 G4double Z)
238{
239//
240// This is a simple algorithm to choose whether a proton or neutron is ejected
241// from the nucleus in the EMD interaction.
242//
243 G4double p = 0.0;
244 if (Z < 2.0)
245 p = 0.0; // To avoid to remove one proton from hydrogen isotopes
246 else if (Z < 6.0)
247 p = 0.5;
248 else if (Z < 8.0)
249 p = 0.6;
250 else if (Z < 14.0)
251 p = 0.7;
252 else
253 {
254 G4double p1 = (G4double) Z / (G4double) A;
255 G4double p2 = 1.95*G4Exp(-0.075*Z);
256 if (p1 < p2) p = p1;
257 else p = p2;
258 }
259
260 return p;
261}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:180
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4double GetKineticEnergy() const
G4PhysicsFreeVector * GetCrossSectionForProjectile(G4double, G4double, G4double, G4double, G4double, G4double)
virtual G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *)
virtual G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *)
G4double GetWilsonProbabilityForProtonDissociation(G4double, G4double)
G4PhysicsFreeVector * GetCrossSectionForTarget(G4double, G4double, G4double, G4double, G4double, G4double)
G4double GetGeneralE1Spectrum(G4double, G4double, G4double)
G4double GetClosestApproach(const G4double, const G4double, G4double, G4double, G4double)
G4double GetGeneralE2Spectrum(G4double, G4double, G4double)
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
G4double GetPDGCharge() const
static G4ParticleTable * GetParticleTable()
void PutValue(const std::size_t index, const G4double e, const G4double value)
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powA(G4double A, G4double y) const
Definition: G4Pow.hh:230