Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4INCLDeltaDecayChannel.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// Pekka Kaitaniemi, CEA and Helsinki Institute of Physics
28// Davide Mancusi, CEA
29// Alain Boudard, CEA
30// Sylvie Leray, CEA
31// Joseph Cugnon, University of Liege
32//
33// INCL++ revision: v5.1.8
34//
35#define INCLXX_IN_GEANT4_MODE 1
36
37#include "globals.hh"
38
42#include "G4INCLRandom.hh"
43#include "G4INCLGlobals.hh"
44
45namespace G4INCL {
46
48 :theParticle(p), theNucleus(n), incidentDirection(dir)
49 { }
50
52
54 const G4double m = p->getMass();
55 const G4double g0 = 115.0;
56 G4double gg = g0;
57 if(m > 1500.0) gg = 200.0;
58 const G4double geff = p->getEnergy()/m;
60 const G4double psf = std::pow(qqq, 3)/(std::pow(qqq, 3) + 5832000.0);
61 const G4double tdel = -G4INCL::PhysicalConstants::hc/(gg*psf)*std::log(Random::shoot())*geff;
62 return tdel;
63 }
64
65 void DeltaDecayChannel::sampleAngles(G4double *ctet_par, G4double *stet_par, G4double *phi_par) {
66 const G4double hel = theParticle->getHelicity();
67 do {
68 (*ctet_par) = -1.0 + 2.0*Random::shoot();
69 if(std::abs(*ctet_par) > 1.0) (*ctet_par) = Math::sign(*ctet_par);
70 } while(Random::shoot() > ((1.0 + 3.0 * hel * (*ctet_par) * (*ctet_par))
71 /(1.0 + 3.0 * hel)));
72 (*stet_par) = std::sqrt(1.-(*ctet_par)*(*ctet_par));
73 (*phi_par) = Math::twoPi * Random::shoot();
74 }
75
77 // SUBROUTINE DECAY2(P1,P2,P3,WP,ij,
78 // s X1,X2,hel,B1,B2,B3)
79
80 // This routine describes the anisotropic decay of a particle of mass
81 // xi into 2 particles of masses x1,x2.
82 // The anisotropy is supposed to follow a 1+3*hel*(cos(theta))**2
83 // law with respect to the direction of the incoming particle.
84 // In the input, p1,p2,p3 is the momentum of particle xi.
85 // In the output, p1,p2,p3 is the momentum of particle x1 , while
86 // q1,q2,q3 is the momentum of particle x2.
87
88 // COMMON/bl12/QQ1(200),QQ2(200),QQ3(200),QQ4(200),
89 // s YY1(200),YY2(200),YY3(200),YM(200),IPI(200)
90 // common/hazard/ial,IY1,IY2,IY3,IY4,IY5,IY6,IY7,IY8,IY9,IY10,
91 // s IY11,IY12,IY13,IY14,IY15,IY16,IY17,IY18,IY19
92
93 // DATA IY8,IY9,IY10/82345,92345,45681/
94 // PCM(E,A,C)=0.5*SQRT((E**2-(A+C)**2)*(E**2-(A-C)**2))/E P-N20800
95 // XI=YM(ij)
96
97 // XE=WP P-N20810
98 // B1=P1/XE P-N20820
99 // B2=P2/XE P-N20830
100 // B3=P3/XE
101 // XQ=PCM(XI,X1,X2)
102
103 const G4double deltaMass = theParticle->getMass();
104
105 G4double fi, ctet, stet;
106 sampleAngles(&ctet, &stet, &fi);
107
108 G4double cfi = std::cos(fi);
109 G4double sfi = std::sin(fi);
110 G4double beta = incidentDirection.mag();
111
112 G4double q1, q2, q3;
113 G4double sal=0.0;
114 if (beta >= 1.0e-10)
115 sal = incidentDirection.perp()/beta;
116 if (sal >= 1.0e-6) {
117 G4double b1 = incidentDirection.getX();
118 G4double b2 = incidentDirection.getY();
119 G4double b3 = incidentDirection.getZ();
120 G4double cal = b3/beta;
121 G4double t1 = ctet+cal*stet*sfi/sal;
122 G4double t2 = stet/sal;
123 q1=(b1*t1+b2*t2*cfi)/beta;
124 q2=(b2*t1-b1*t2*cfi)/beta;
125 q3=(b3*t1/beta-t2*sfi);
126 } else {
127 q1 = stet*cfi;
128 q2 = stet*sfi;
129 q3 = ctet;
130 }
131 theParticle->setHelicity(0.0);
132
133 ParticleType pionType;
134 switch(theParticle->getType()) {
135 case DeltaPlusPlus:
136 theParticle->setType(Proton);
137 pionType = PiPlus;
138 break;
139 case DeltaPlus:
140 if(Random::shoot() < 1.0/3.0) {
141 theParticle->setType(Neutron);
142 pionType = PiPlus;
143 } else {
144 theParticle->setType(Proton);
145 pionType = PiZero;
146 }
147 break;
148 case DeltaZero:
149 if(Random::shoot() < 1.0/3.0) {
150 theParticle->setType(Proton);
151 pionType = PiMinus;
152 } else {
153 theParticle->setType(Neutron);
154 pionType = PiZero;
155 }
156 break;
157 case DeltaMinus:
158 theParticle->setType(Neutron);
159 pionType = PiMinus;
160 break;
161 default:
162 FATAL("Unrecognized delta type; type=" << theParticle->getType() << std::endl);
163 abort();
164 break;
165 }
166
168 theParticle->getMass(),
170
171 q1 *= xq;
172 q2 *= xq;
173 q3 *= xq;
174
175 ThreeVector pionMomentum(q1, q2, q3);
176 ThreeVector pionPosition(theParticle->getPosition());
177 Particle *pion = new Particle(pionType, pionMomentum, pionPosition);
178 theParticle->setMomentum(-pionMomentum);
179 theParticle->adjustEnergyFromMomentum();
180
181 FinalState *fs = new FinalState;
182 fs->addModifiedParticle(theParticle);
183 fs->addCreatedParticle(pion);
184 // call loren(q1,q2,q3,b1,b2,b3,wq)
185 // call loren(p1,p2,p3,b1,b2,b3,wp)
186 // qq1(ij)=q1
187 // qq2(ij)=q2
188 // qq3(ij)=q3
189 // qq4(ij)=wq
190 // ym(ij)=xi
191 // RETURN P-N21120
192 // END P-N21130
193 return fs;
194 }
195}
#define FATAL(x)
double G4double
Definition: G4Types.hh:64
static G4double computeDecayTime(Particle *p)
DeltaDecayChannel(Nucleus *n, Particle *, ThreeVector const)
void addModifiedParticle(Particle *p)
void addCreatedParticle(Particle *p)
static G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
static G4double getINCLMass(const G4int A, const G4int Z)
Get INCL nuclear mass (in MeV/c^2)
static const G4double effectiveNucleonMass
static const G4double effectivePionMass
G4double getEnergy() const
G4double getHelicity()
void setHelicity(G4double h)
const G4INCL::ThreeVector & getPosition() const
G4double adjustEnergyFromMomentum()
Recompute the energy to match the momentum.
virtual void setMomentum(const G4INCL::ThreeVector &momentum)
G4INCL::ParticleType getType() const
void setType(ParticleType t)
G4double getMass() const
Get the cached particle mass.
static G4double shoot()
Definition: G4INCLRandom.hh:99
G4double getY() const
G4double getZ() const
G4double mag() const
G4double perp() const
G4double getX() const
G4int sign(T t)
const G4double twoPi
const G4double hc
[MeV*fm]