Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCL::NNToMissingStrangenessChannel Class Reference

#include <G4INCLNNToMissingStrangenessChannel.hh>

+ Inheritance diagram for G4INCL::NNToMissingStrangenessChannel:

Public Member Functions

 NNToMissingStrangenessChannel (Particle *, Particle *)
 
virtual ~NNToMissingStrangenessChannel ()
 
void fillFinalState (FinalState *fs)
 
- Public Member Functions inherited from G4INCL::IChannel
 IChannel ()
 
virtual ~IChannel ()
 
FinalStategetFinalState ()
 
virtual void fillFinalState (FinalState *fs)=0
 

Detailed Description

Definition at line 47 of file G4INCLNNToMissingStrangenessChannel.hh.

Constructor & Destructor Documentation

◆ NNToMissingStrangenessChannel()

G4INCL::NNToMissingStrangenessChannel::NNToMissingStrangenessChannel ( Particle p1,
Particle p2 
)

Definition at line 51 of file G4INCLNNToMissingStrangenessChannel.cc.

52 : particle1(p1), particle2(p2)
53 {}

◆ ~NNToMissingStrangenessChannel()

G4INCL::NNToMissingStrangenessChannel::~NNToMissingStrangenessChannel ( )
virtual

Definition at line 55 of file G4INCLNNToMissingStrangenessChannel.cc.

55{}

Member Function Documentation

◆ fillFinalState()

void G4INCL::NNToMissingStrangenessChannel::fillFinalState ( FinalState fs)
virtual

Implements G4INCL::IChannel.

Definition at line 57 of file G4INCLNNToMissingStrangenessChannel.cc.

57 {
58
59 const G4double sqrtS = KinematicsUtils::totalEnergyInCM(particle1, particle2); // MeV
60 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(particle1, particle2); // GeV
61// assert(sqrtS > 3100); // ! > 3047.34. Not supposed to be under 3,626 GeV.
62
63 const G4int iso = ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
64// assert(iso == -2 || iso == 0 || iso == 2);
65 G4int iso_system = 0;
66 G4int available_iso = 0;
67 G4int nbr_pions = 0;
68 G4int min_pions = 0;
69 G4int max_pions = 0;
70
71 G4double rdm = Random::shoot();
72
73 if(rdm < 0.35){
74 // N-K-Lambda chosen
75 particle2->setType(Lambda);
76 available_iso = 2;
77 min_pions = 3;
79 }
80 else if((iso == 0 && rdm < 0.55) || rdm < 0.5){
81 // N-N-K-Kb chosen
82 available_iso = 4;
83 min_pions = 1;
85 }
86 else{
87 // N-K-Sigma chosen
88 available_iso = 4;
89 min_pions = 3;
91 }
92 /* Gaussian noise + mean value nbr pions fonction energy (choice)*/
93 G4double intermediaire = min_pions + Random::gauss(2) + std::sqrt(pLab-5);
94 nbr_pions = std::min(max_pions,std::max(min_pions,G4int(intermediaire )));
95
96 available_iso += nbr_pions*2;
97
98 ParticleList list;
99 ParticleType PionType = PiZero;
100 const ThreeVector &rcol1 = particle1->getPosition();
101 const ThreeVector zero;
102 Particle *kaon = new Particle(KPlus,zero,rcol1);
103
104 for(Int_t i=0; i<nbr_pions; i++){
105 Particle *pion = new Particle(PionType,zero,rcol1);
106 if(available_iso-std::abs(iso-iso_system) >= 4){ // pp(pn) pip:0.40(0.3) piz:0.35(0.4) pim:0.25(0.3)
107 rdm = Random::shoot();
108 if(((iso == 0) && rdm < 0.3) || ((iso == -2) && rdm < 0.40) || rdm < 0.25){
109 pion->setType(PiMinus);
110 iso_system -= 2;
111 available_iso -= 2;
112 }
113 else if(((iso == 0) && rdm < 0.7) || ((iso == -2) && rdm < 0.75) || rdm < 0.60){
114 pion->setType(PiZero);
115 available_iso -= 2;
116 }
117 else{
118 pion->setType(PiPlus);
119 iso_system += 2;
120 available_iso -= 2;
121 }
122 }
123 else if(available_iso-std::abs(iso-iso_system) == 2){
124 rdm = Random::shoot();
125 // pn pp too high (nn too low) -> PiMinus(PiPlus) pp too low (nn too high) -> PiPlus(PiMinus)
126 if(((iso == 0) && (rdm*0.7 < 0.3)) || ((rdm*0.60 < 0.25) && (Math::sign(iso-iso_system)*2-iso != 0)) || ((rdm*0.75 < 0.40) && (Math::sign(iso-iso_system)*2+iso != 0) && (iso != 0))){
127 pion->setType(ParticleTable::getPionType(Math::sign(iso-iso_system)*2));
128 iso_system += Math::sign(iso-iso_system)*2;
129 available_iso -= 2;
130 }
131 else{
132 PionType = PiZero;
133 available_iso -= 2;
134 }
135 }
136 else if(available_iso-std::abs(iso-iso_system) == 0){
137 pion->setType(ParticleTable::getPionType(Math::sign(iso-iso_system)*2));
138 iso_system += Math::sign(iso-iso_system)*2;
139 available_iso -= 2;
140 }
141 else INCL_ERROR("Pion Generation Problem in NNToMissingStrangenessChannel" << '\n');
142 list.push_back(pion);
143 }
144
145 if(particle2->isLambda()){ // N-K-Lambda
146// assert(available_iso == 2);
147 if(std::abs(iso-iso_system) == 2){
148 particle1->setType(ParticleTable::getNucleonType((iso-iso_system)/2));
149 kaon->setType(ParticleTable::getKaonType((iso-iso_system)/2));
150 }
151 else if(std::abs(iso-iso_system) == 0){
152 rdm = G4int(Random::shoot()*2.)*2-1;
154 kaon->setType(ParticleTable::getKaonType(G4int(-rdm)));
155 }
156 else INCL_ERROR("Isospin non-conservation in NNToMissingStrangenessChannel" << '\n');
157 }
158 else if(min_pions == 1){ // N-N-K-Kb chosen
159// assert(available_iso == 4);
160 Particle *antikaon = new Particle(KMinus,zero,rcol1);
161 if(std::abs(iso-iso_system) == 4){
162 particle1->setType(ParticleTable::getNucleonType((iso-iso_system)/4));
163 particle2->setType(ParticleTable::getNucleonType((iso-iso_system)/4));
164 kaon->setType(ParticleTable::getKaonType((iso-iso_system)/4));
165 antikaon->setType(ParticleTable::getAntiKaonType((iso-iso_system)/4));
166 }
167 else if(std::abs(iso-iso_system) == 2){ // choice: kaon type free, nucleon type fixed
168 rdm = G4int(Random::shoot()*2.)*2-1;
169 particle1->setType(ParticleTable::getNucleonType((iso-iso_system)/2));
170 particle2->setType(ParticleTable::getNucleonType((iso-iso_system)/2));
171 kaon->setType(ParticleTable::getKaonType(G4int(rdm)));
172 antikaon->setType(ParticleTable::getAntiKaonType(G4int(-rdm)));
173 }
174 else if(std::abs(iso-iso_system) == 0){ // particle1 3/4 proton, 1/4 neutron; particle2 1/4 proton, 3/4 neutron
175 rdm = G4int(Random::shoot()*2.)*2-1;
176 G4double rdm2 = G4int(Random::shoot()*2.)*2-1;
177 particle1->setType(ParticleTable::getNucleonType(std::max(rdm,rdm2)));
178 particle2->setType(ParticleTable::getNucleonType(std::min(rdm,rdm2)));
179 kaon->setType(ParticleTable::getKaonType(-G4int(rdm)));
180 antikaon->setType(ParticleTable::getAntiKaonType(-G4int(rdm2)));
181 }
182 else INCL_ERROR("Isospin non-conservation in NNToMissingStrangenessChannel" << '\n');
183 list.push_back(antikaon);
184 nbr_pions += 1; // need for addCreatedParticle loop
185 }
186 else{// N-K-Sigma
187// assert(available_iso == 4);
188 if(std::abs(iso-iso_system) == 4){
189 particle1->setType(ParticleTable::getNucleonType((iso-iso_system)/4));
190 particle2->setType(ParticleTable::getSigmaType((iso-iso_system)/2));
191 kaon->setType(ParticleTable::getKaonType((iso-iso_system)/4));
192 }
193 else if(std::abs(iso-iso_system) == 2){ // choice: sigma quasi-free, kaon type semi-free, nucleon type fixed
194 rdm = Random::shoot();
195 // pp(pn) sp:0.42(0.23) sz:0.51(0.54) sm:0.07(0.23)
196 if(((iso == 0) && (rdm*0.77 < 0.23)) || ((rdm*0.58 < 0.07) && (Math::sign(iso-iso_system)*2-iso != 0)) || ((rdm*0.93 < 0.42) && (Math::sign(iso-iso_system)*2+iso != 0) && (iso != 0))){
197 particle2->setType(ParticleTable::getSigmaType(Math::sign(iso-iso_system)*2));
198 rdm = G4int(Random::shoot()*2.)*2-1;
200 kaon->setType(ParticleTable::getKaonType(-G4int(rdm)));
201 }
202 else{
203 particle2->setType(SigmaZero);
204 particle1->setType(ParticleTable::getNucleonType((iso-iso_system)/2));
205 kaon->setType(ParticleTable::getKaonType((iso-iso_system)/2));
206 }
207 }
208 else if(std::abs(iso-iso_system) == 0){ // choice: sigma free, kaontype semi-free, nucleon type fixed
209 if(((iso == 0) && rdm < 0.23) || ((iso == 2) && rdm < 0.42) || rdm < 0.07){
210 particle2->setType(SigmaPlus);
211 particle1->setType(Neutron);
212 kaon->setType(KZero);
213 }
214 else if(((iso == 0) && rdm < 0.77) || ((iso == 2) && rdm < 0.93) || rdm < 0.58){
215 particle2->setType(SigmaZero);
216 rdm = G4int(Random::shoot()*2.)*2-1;
218 kaon->setType(ParticleTable::getKaonType(-G4int(rdm)));
219 }
220 else{
221 particle2->setType(SigmaMinus);
222 particle1->setType(Proton);
223 kaon->setType(KPlus);
224 }
225 }
226 else INCL_ERROR("Isospin non-conservation in NNToMissingStrangenessChannel" << '\n');
227 }
228
229 list.push_back(particle1);
230 list.push_back(particle2);
231 list.push_back(kaon);
232
233 PhaseSpaceGenerator::generateBiased(sqrtS, list, list.size()-3, angularSlope);
234
235 fs->addModifiedParticle(particle1);
236 fs->addModifiedParticle(particle2);
237 fs->addCreatedParticle(kaon);
238 for(Int_t i=0; i<nbr_pions; i++) fs->addCreatedParticle(list[i]);
239
240 }
#define INCL_ERROR(x)
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4bool isLambda() const
Is this a Lambda?
const G4INCL::ThreeVector & getPosition() const
G4INCL::ParticleType getType() const
void setType(ParticleType t)
G4double totalEnergyInCM(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.
G4int sign(const T t)
ParticleType getKaonType(const G4int isosp)
Get the type of kaon.
ParticleType getSigmaType(const G4int isosp)
Get the type of sigma.
G4double getINCLMass(const G4int A, const G4int Z, const G4int S)
Get INCL nuclear mass (in MeV/c^2)
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
ParticleType getNucleonType(const G4int isosp)
Get the type of nucleon.
ParticleType getPionType(const G4int isosp)
Get the type of pion.
ParticleType getAntiKaonType(const G4int isosp)
Get the type of antikaon.
void generateBiased(const G4double sqrtS, ParticleList &particles, const size_t index, const G4double slope)
Generate a biased event in the CM system.
G4double gauss(G4double sigma=1.)
G4double shoot()
Definition: G4INCLRandom.cc:93
G4int Int_t
G4bool pion(G4int ityp)

The documentation for this class was generated from the following files: