Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCLElasticChannel.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// INCL++ intra-nuclear cascade model
27// Alain Boudard, CEA-Saclay, France
28// Joseph Cugnon, University of Liege, Belgium
29// Jean-Christophe David, CEA-Saclay, France
30// Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31// Sylvie Leray, CEA-Saclay, France
32// Davide Mancusi, CEA-Saclay, France
33//
34#define INCLXX_IN_GEANT4_MODE 1
35
36#include "globals.hh"
37
39#include "G4INCLRandom.hh"
44#include "G4INCLGlobals.hh"
45
46namespace G4INCL {
47
49 : particle1(p1), particle2(p2), thenucleus(n) {}
50
52 // delete srcChannel;
53 }
54
56 {
57 ParticleType p1TypeOld = particle1->getType();
58 ParticleType p2TypeOld = particle2->getType();
59
60 /* Concerning the way we calculate the lab momentum, see the considerations
61 * in CrossSections::elasticNNLegacy().
62 */
63 const G4double s = KinematicsUtils::squareTotalEnergyInCM(particle1, particle2);
65
66 const G4int isospin = ParticleTable::getIsospin(particle1->getType()) +
67 ParticleTable::getIsospin(particle2->getType());
68
69 // Calculate the outcome of the channel:
70 G4double psq = particle1->getMomentum().mag2();
71 G4double pnorm = std::sqrt(psq);
73 G4double btmax = 4.0 * psq * b;
74 G4double z = std::exp(-btmax);
75 G4double ranres = Random::shoot();
76 G4double y = 1.0 - ranres * (1.0 - z);
77 G4double T = std::log(y)/b;
78 G4int iexpi = 0;
79 G4double apt = 1.0;
80
81 // Handle np case
82 if((particle1->getType() == Proton && particle2->getType() == Neutron) ||
83 (particle1->getType() == Neutron && particle2->getType() == Proton)) {
84 if(pl > 800.0) {
85 const G4double x = 0.001 * pl; // Transform to GeV
86 apt = (800.0/pl)*(800.0/pl);
87 G4double cpt = std::max(6.23 * std::exp(-1.79*x), 0.3);
88 G4double alphac = 100.0 * 1.0e-6;
89 G4double aaa = (1 + apt) * (1 - std::exp(-btmax))/b;
90 G4double argu = psq * alphac;
91
92 if(argu >= 8) {
93 argu = 0.0;
94 } else {
95 argu = std::exp(-4.0 * argu);
96 }
97
98 G4double aac = cpt * (1.0 - argu)/alphac;
99 G4double fracpn = aaa/(aac + aaa);
100 if(Random::shoot() > fracpn) {
101 z = std::exp(-4.0 * psq *alphac);
102 iexpi = 1;
103 y = 1.0 - ranres*(1.0 - z);
104 T = std::log(y)/alphac;
105 }
106 }
107 }
108
109 G4double ctet = 1.0 + 0.5*T/psq;
110 if(std::abs(ctet) > 1.0) ctet = Math::sign(ctet);
111 G4double stet = std::sqrt(1.0 - ctet*ctet);
112 G4double rndm = Random::shoot();
113
114 G4double fi = Math::twoPi * rndm;
115 G4double cfi = std::cos(fi);
116 G4double sfi = std::sin(fi);
117
118 G4double xx = particle1->getMomentum().perp2();
119 G4double zz = std::pow(particle1->getMomentum().getZ(), 2);
120
121 if(xx >= (zz * 1.0e-8)) {
122 ThreeVector p = particle1->getMomentum();
123 G4double yn = std::sqrt(xx);
124 G4double zn = yn * pnorm;
125 G4double ex[3], ey[3], ez[3];
126 ez[0] = p.getX() / pnorm;
127 ez[1] = p.getY() / pnorm;
128 ez[2] = p.getZ() / pnorm;
129
130 // Vector Ex is chosen arbitrarily:
131 ex[0] = p.getY() / yn;
132 ex[1] = -p.getX() / yn;
133 ex[2] = 0.0;
134
135 ey[0] = p.getX() * p.getZ() / zn;
136 ey[1] = p.getY() * p.getZ() / zn;
137 ey[2] = -xx/zn;
138
139 G4double pX = (ex[0]*cfi*stet + ey[0]*sfi*stet + ez[0]*ctet) * pnorm;
140 G4double pY = (ex[1]*cfi*stet + ey[1]*sfi*stet + ez[1]*ctet) * pnorm;
141 G4double pZ = (ex[2]*cfi*stet + ey[2]*sfi*stet + ez[2]*ctet) * pnorm;
142
143 ThreeVector p1momentum = ThreeVector(pX, pY, pZ);
144 particle1->setMomentum(p1momentum);
145 particle2->setMomentum(-p1momentum);
146 } else { // if(xx < (zz * 1.0e-8)) {
147 G4double momZ = particle1->getMomentum().getZ();
148 G4double pX = momZ * cfi * stet;
149 G4double pY = momZ * sfi * stet;
150 G4double pZ = momZ * ctet;
151
152 ThreeVector p1momentum(pX, pY, pZ);
153 particle1->setMomentum(p1momentum);
154 particle2->setMomentum(-p1momentum);
155 }
156
157 if (thenucleus) {
158 srcChannel = new SrcChannel(particle1, particle2, thenucleus);
159 srcChannel->fillFinalState(fs, particle1->getType(), particle2->getType());
160 delete srcChannel;
161 } else {
162
163 // Handle backward scattering here.
164
165 if((particle1->getType() == Proton && particle2->getType() == Neutron) ||
166 (particle1->getType() == Neutron && particle2->getType() == Proton)) {
167 rndm = Random::shoot();
168 apt = 1.0;
169 if(pl > 800.0) {
170 apt = std::pow(800.0/pl, 2);
171 }
172 if(iexpi == 1 || rndm > 1.0/(1.0 + apt)) {
173 particle1->setType(p2TypeOld);
174 particle2->setType(p1TypeOld);
175 }
176 }
177
178 // Note: there is no need to update the kinetic energies of the particles,
179 // as this is elastic scattering.
180
181 fs->addModifiedParticle(particle1);
182 fs->addModifiedParticle(particle2);
183
184 }
185 }
186} // namespace G4INCL
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
ElasticChannel(Particle *p1, Particle *p2, Nucleus *n=nullptr)
void fillFinalState(FinalState *fs)
void addModifiedParticle(Particle *p)
G4double getY() const
G4double getZ() const
G4double getX() const
G4double calculateNNAngularSlope(G4double energyCM, G4int iso)
Calculate the slope of the NN DDXS.
G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
G4double momentumInLab(Particle const *const p1, Particle const *const p2)
gives the momentum in the lab frame of two particles.
const G4double twoPi
G4int sign(const T t)
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
const G4double effectiveNucleonMass
G4double shoot()