Geant4-11
G4INCLStrangeAbsorbtionChannel.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
41#include "G4INCLRandom.hh"
42#include "G4INCLGlobals.hh"
43#include "G4INCLLogger.hh"
44
45namespace G4INCL {
46
48 : particle1(p1), particle2(p2)
49 {
50
51 }
52
54
56 (*ctet_par) = -1.0 + 2.0*Random::shoot();
57 if(std::abs(*ctet_par) > 1.0) (*ctet_par) = Math::sign(*ctet_par); // needed?
58 (*stet_par) = std::sqrt(1.-(*ctet_par)*(*ctet_par));
59 (*phi_par) = Math::twoPi * Random::shoot();
60 }
61
64 Particle * strange;
65
66 ThreeVector const incidentDirection = particle1->getMomentum() + particle2->getMomentum();
67
68 if(particle1->isNucleon()) {
70 strange = particle2;
71 } else {
73 strange = particle1;
74 }
75// assert(strange->isSigma() || strange->isAntiKaon());
76
77 ParticleType finalType = Neutron;
79 finalType = PiZero;
80 } else if(ParticleConfig::isPair(nucleon, strange, Proton, KZeroBar)) {
81 finalType = PiPlus;
82 } else if(ParticleConfig::isPair(nucleon, strange, Neutron, KMinus)) {
83 finalType = PiMinus;
84 } else if(ParticleConfig::isPair(nucleon, strange, Proton, KMinus)) {
85 finalType = PiZero;
86 } else if(ParticleConfig::isPair(nucleon, strange, Proton, SigmaMinus)) {
87 finalType = Neutron;
88 } else if(ParticleConfig::isPair(nucleon, strange, Neutron, SigmaZero)) {
89 finalType = Neutron;
90 } else if(ParticleConfig::isPair(nucleon, strange, Proton, SigmaZero)) {
91 finalType = Proton;
92 } else if(ParticleConfig::isPair(nucleon, strange, Neutron, SigmaPlus)) {
93 finalType = Proton;
94 } else {
95 INCL_ERROR("Unknown particle pair in Strange-N absorption: " << nucleon << '\t' << strange << '\n');
96 return;
97 }
98
100
101 G4double finalTypemass = ParticleTable::getINCLMass(finalType);
102 nucleon->setType(Lambda); // nucleon becomes the lambda
103 G4double lambdamass = nucleon->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
133 lambdamass,
134 finalTypemass);
135
136 q1 *= xq;
137 q2 *= xq;
138 q3 *= xq;
139
140 ThreeVector finalMomentum(q1, q2, q3);
141
142 strange->setType(finalType);
143 strange->setMomentum(finalMomentum);
144 strange->adjustEnergyFromMomentum();
145 nucleon->setMomentum(-finalMomentum);
146 nucleon->adjustEnergyFromMomentum();
147
148 fs->addModifiedParticle(nucleon); // nucleon became a lambda
149 fs->addModifiedParticle(strange); // the strange particle became an unstange particle
150 }
151
152}
#define INCL_ERROR(x)
double G4double
Definition: G4Types.hh:83
void addModifiedParticle(Particle *p)
G4double adjustEnergyFromMomentum()
Recompute the energy to match the momentum.
const G4INCL::ThreeVector & getMomentum() const
virtual void setMomentum(const G4INCL::ThreeVector &momentum)
void setType(ParticleType t)
G4bool isNucleon() const
void sampleAngles(G4double *, G4double *, G4double *)
G4double getY() const
G4double getZ() const
G4double mag() const
G4double perp() const
G4double getX() const
G4double totalEnergyInCM(Particle const *const p1, Particle const *const p2)
G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
const G4double twoPi
G4int sign(const T t)
G4bool isPair(Particle const *const p1, Particle const *const p2, ParticleType t1, ParticleType t2)
G4double getINCLMass(const G4int A, const G4int Z, const G4int S)
Get INCL nuclear mass (in MeV/c^2)
G4double shoot()
Definition: G4INCLRandom.cc:93
G4bool nucleon(G4int ityp)