Geant4  10.02.p03
G4ElementaryParticleCollider Class Reference

#include <G4ElementaryParticleCollider.hh>

Inheritance diagram for G4ElementaryParticleCollider:
Collaboration diagram for G4ElementaryParticleCollider:

Public Member Functions

 G4ElementaryParticleCollider ()
 
virtual ~G4ElementaryParticleCollider ()
 
void collide (G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
 
void setNucleusState (G4int a, G4int z)
 
- Public Member Functions inherited from G4CascadeColliderBase
 G4CascadeColliderBase (const G4String &name, G4int verbose=0)
 
virtual ~G4CascadeColliderBase ()
 
virtual void rescatter (G4InuclParticle *, G4KineticTrackVector *, G4V3DNucleus *, G4CollisionOutput &)
 
virtual void setVerboseLevel (G4int verbose=0)
 
- Public Member Functions inherited from G4VCascadeCollider
 G4VCascadeCollider (const G4String &name, G4int verbose=0)
 
virtual ~G4VCascadeCollider ()
 

Private Member Functions

G4int generateMultiplicity (G4int is, G4double ekin) const
 
void generateOutgoingPartTypes (G4int is, G4int mult, G4double ekin)
 
void generateSCMfinalState (G4double ekin, G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
 
void generateSCMpionAbsorption (G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
 
void generateSCMmuonAbsorption (G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
 
void generateSCMpionNAbsorption (G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
 
G4bool pionNucleonAbsorption (G4double ekin) const
 
G4bool splitQuasiDeuteron (G4int qdtype)
 
void fillOutgoingMasses ()
 
 G4ElementaryParticleCollider (const G4ElementaryParticleCollider &)
 
G4ElementaryParticleCollideroperator= (const G4ElementaryParticleCollider &)
 

Private Attributes

G4CascadeFinalStateGenerator fsGenerator
 
std::vector< G4InuclElementaryParticleparticles
 
std::vector< G4LorentzVectorscm_momentums
 
std::vector< G4doublemodules
 
std::vector< G4doublemasses
 
std::vector< G4doublemasses2
 
std::vector< G4intparticle_kinds
 
G4int nucleusA
 
G4int nucleusZ
 

Additional Inherited Members

- Protected Member Functions inherited from G4CascadeColliderBase
virtual G4bool useEPCollider (G4InuclParticle *bullet, G4InuclParticle *target) const
 
virtual G4bool inelasticInteractionPossible (G4InuclParticle *bullet, G4InuclParticle *target, G4double ekin) const
 
virtual G4bool validateOutput (G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
 
virtual G4bool validateOutput (const G4Fragment &fragment, G4CollisionOutput &output)
 
virtual G4bool validateOutput (G4InuclParticle *bullet, G4InuclParticle *target, const std::vector< G4InuclElementaryParticle > &particles)
 
- Protected Member Functions inherited from G4VCascadeCollider
virtual void setName (const G4String &name)
 
- Protected Attributes inherited from G4CascadeColliderBase
G4InteractionCase interCase
 
G4CascadeCheckBalancebalance
 
- Protected Attributes inherited from G4VCascadeCollider
G4String theName
 
G4int verboseLevel
 

Detailed Description

Definition at line 74 of file G4ElementaryParticleCollider.hh.

Constructor & Destructor Documentation

◆ G4ElementaryParticleCollider() [1/2]

G4ElementaryParticleCollider::G4ElementaryParticleCollider ( )

Definition at line 138 of file G4ElementaryParticleCollider.cc.

139  : G4CascadeColliderBase("G4ElementaryParticleCollider"),
140  nucleusA(0), nucleusZ(0) {;}
G4CascadeColliderBase(const G4String &name, G4int verbose=0)

◆ ~G4ElementaryParticleCollider()

virtual G4ElementaryParticleCollider::~G4ElementaryParticleCollider ( )
inlinevirtual

Definition at line 77 of file G4ElementaryParticleCollider.hh.

77 {};
Here is the call graph for this function:

◆ G4ElementaryParticleCollider() [2/2]

G4ElementaryParticleCollider::G4ElementaryParticleCollider ( const G4ElementaryParticleCollider )
private

Member Function Documentation

◆ collide()

void G4ElementaryParticleCollider::collide ( G4InuclParticle bullet,
G4InuclParticle target,
G4CollisionOutput output 
)
virtual

Implements G4VCascadeCollider.

Definition at line 144 of file G4ElementaryParticleCollider.cc.

147 {
148  if (verboseLevel > 1)
149  G4cout << " >>> G4ElementaryParticleCollider::collide" << G4endl;
150 
151  if (!useEPCollider(bullet,target)) { // Sanity check
152  G4cerr << " ElementaryParticleCollider -> can collide only particle with particle "
153  << G4endl;
154  return;
155  }
156 
157 #ifdef G4CASCADE_DEBUG_SAMPLER
158  static G4bool doPrintTables = true; // Once and only once per job
159  if (doPrintTables) {
161  doPrintTables = false;
162  }
163 #endif
164 
165  interCase.set(bullet, target); // To identify kind of collision
166 
167  if (verboseLevel > 1) G4cout << *bullet << G4endl << *target << G4endl;
168 
169  G4InuclElementaryParticle* particle1 =
170  dynamic_cast<G4InuclElementaryParticle*>(bullet);
171  G4InuclElementaryParticle* particle2 =
172  dynamic_cast<G4InuclElementaryParticle*>(target);
173 
174  if (!particle1 || !particle2) { // Redundant with useEPCollider()
175  G4cerr << " ElementaryParticleCollider -> can only collide hadrons"
176  << G4endl;
177  return;
178  }
179 
180  if (particle1->isNeutrino() || particle2->isNeutrino()) return;
181 
182  // Check for available interaction, or pion+dibaryon special case
184  !particle1->quasi_deutron() && !particle2->quasi_deutron()) {
185  G4cerr << " ElementaryParticleCollider -> cannot collide "
186  << particle1->getDefinition()->GetParticleName() << " with "
187  << particle2->getDefinition()->GetParticleName() << G4endl;
188  return;
189  }
190 
191  G4LorentzConvertor convertToSCM; // Utility to handle frame manipulation
192  if (particle2->nucleon() || particle2->quasi_deutron()) {
193  convertToSCM.setBullet(particle1);
194  convertToSCM.setTarget(particle2);
195  } else {
196  convertToSCM.setBullet(particle2);
197  convertToSCM.setTarget(particle1);
198  }
199 
200  convertToSCM.setVerbose(verboseLevel);
201  convertToSCM.toTheCenterOfMass();
202 
203  G4double etot_scm = convertToSCM.getTotalSCMEnergy();
204 
205  // Generate any particle collision with nucleon
206  if (particle1->nucleon() || particle2->nucleon()) {
207  G4double ekin = convertToSCM.getKinEnergyInTheTRS();
208 
209  // SPECIAL: Very low energy pions may be absorbed by a nucleon
210  if (pionNucleonAbsorption(ekin)) {
211  generateSCMpionNAbsorption(etot_scm, particle1, particle2);
212  } else {
213  generateSCMfinalState(ekin, etot_scm, particle1, particle2);
214  }
215  }
216 
217  // Generate pion or photon collision with quasi-deuteron
218  if (particle1->quasi_deutron() || particle2->quasi_deutron()) {
219  if (!G4NucleiModel::useQuasiDeuteron(particle1->type(),particle2->type()) &&
220  !G4NucleiModel::useQuasiDeuteron(particle2->type(),particle1->type())) {
221  G4cerr << " ElementaryParticleCollider -> can only collide pi,mu,gamma with"
222  << " dibaryons " << G4endl;
223  return;
224  }
225 
226  if (particle1->isMuon() || particle2->isMuon()) {
227  generateSCMmuonAbsorption(etot_scm, particle1, particle2);
228  } else { // Currently, pion absoprtion also handles gammas
229  generateSCMpionAbsorption(etot_scm, particle1, particle2);
230  }
231  }
232 
233  if (particles.empty()) { // No final state possible, pass bullet through
234  if (verboseLevel) {
235  G4cerr << " ElementaryParticleCollider -> failed to collide "
236  << particle1->getMomModule() << " GeV/c "
237  << particle1->getDefinition()->GetParticleName() << " with "
238  << particle2->getDefinition()->GetParticleName() << G4endl;
239  }
240  return;
241  }
242 
243  // Convert final state back to lab frame
244  G4LorentzVector mom; // Buffer to avoid memory churn
246  for(ipart = particles.begin(); ipart != particles.end(); ipart++) {
247  mom = convertToSCM.backToTheLab(ipart->getMomentum());
248  ipart->setMomentum(mom);
249  };
250 
251  // Check conservation in multibody final state
252  if (verboseLevel && !validateOutput(bullet, target, particles)) {
253  G4cout << " incoming particles: \n" << *particle1 << G4endl
254  << *particle2 << G4endl
255  << " outgoing particles: " << G4endl;
256  for(ipart = particles.begin(); ipart != particles.end(); ipart++)
257  G4cout << *ipart << G4endl;
258 
259  G4cout << " <<< Non-conservation in G4ElementaryParticleCollider"
260  << G4endl;
261  }
262 
263  std::sort(particles.begin(), particles.end(), G4ParticleLargerEkin());
265 }
G4int hadrons() const
void generateSCMpionNAbsorption(G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
void generateSCMpionAbsorption(G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
static const G4CascadeChannel * GetTable(G4int initialState)
virtual G4bool useEPCollider(G4InuclParticle *bullet, G4InuclParticle *target) const
Int_t ipart
static G4bool useQuasiDeuteron(G4int ptype, G4int qdtype=0)
void setBullet(const G4InuclParticle *bullet)
void generateSCMmuonAbsorption(G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
void generateSCMfinalState(G4double ekin, G4double etot_scm, G4InuclElementaryParticle *particle1, G4InuclElementaryParticle *particle2)
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
void setVerbose(G4int vb=0)
std::vector< G4InuclElementaryParticle > particles
bool G4bool
Definition: G4Types.hh:79
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
static void Print(std::ostream &os=G4cout)
void addOutgoingParticles(const std::vector< G4InuclElementaryParticle > &particles)
void set(G4InuclParticle *part1, G4InuclParticle *part2)
virtual G4bool validateOutput(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
G4double getMomModule() const
cout<< "-> Edep in the target
Definition: analysis.C:54
std::vector< G4InuclElementaryParticle >::iterator particleIterator
Definition: G4BigBanger.cc:65
#define G4endl
Definition: G4ios.hh:61
G4bool pionNucleonAbsorption(G4double ekin) const
G4double getKinEnergyInTheTRS() const
G4double getTotalSCMEnergy() const
double G4double
Definition: G4Types.hh:76
const G4ParticleDefinition * getDefinition() const
G4GLOB_DLL std::ostream G4cerr
void setTarget(const G4InuclParticle *target)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ fillOutgoingMasses()

void G4ElementaryParticleCollider::fillOutgoingMasses ( )
private

Definition at line 384 of file G4ElementaryParticleCollider.cc.

384  {
385  G4int mult = particle_kinds.size();
386 
387  masses.resize(mult,0.);
388  masses2.resize(mult,0.); // Allows direct [i] setting
389 
390  for (G4int i = 0; i < mult; i++) {
392  masses2[i] = masses[i] * masses[i];
393  }
394 }
static G4double getParticleMass(G4int type)
int G4int
Definition: G4Types.hh:78
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generateMultiplicity()

G4int G4ElementaryParticleCollider::generateMultiplicity ( G4int  is,
G4double  ekin 
) const
private

Definition at line 269 of file G4ElementaryParticleCollider.cc.

271 {
272  G4int mul = 0;
273 
274  const G4CascadeChannel* xsecTable = G4CascadeChannelTables::GetTable(is);
275 
276  if (xsecTable) mul = xsecTable->getMultiplicity(ekin);
277  else {
278  G4cerr << " G4ElementaryParticleCollider: Unknown interaction channel "
279  << is << " - multiplicity not generated " << G4endl;
280  }
281 
282  if(verboseLevel > 3){
283  G4cout << " G4ElementaryParticleCollider::generateMultiplicity: "
284  << " multiplicity = " << mul << G4endl;
285  }
286 
287  return mul;
288 }
static const G4CascadeChannel * GetTable(G4int initialState)
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61
virtual G4int getMultiplicity(G4double ke) const =0
G4GLOB_DLL std::ostream G4cerr
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generateOutgoingPartTypes()

void G4ElementaryParticleCollider::generateOutgoingPartTypes ( G4int  is,
G4int  mult,
G4double  ekin 
)
private

Definition at line 292 of file G4ElementaryParticleCollider.cc.

294 {
295  particle_kinds.clear(); // Initialize buffer for generation
296 
297  const G4CascadeChannel* xsecTable = G4CascadeChannelTables::GetTable(is);
298 
299  if (xsecTable)
300  xsecTable->getOutgoingParticleTypes(particle_kinds, mult, ekin);
301  else {
302  G4cerr << " G4ElementaryParticleCollider: Unknown interaction channel "
303  << is << " - outgoing kinds not generated " << G4endl;
304  }
305 
306  return;
307 }
static const G4CascadeChannel * GetTable(G4int initialState)
virtual void getOutgoingParticleTypes(std::vector< G4int > &kinds, G4int mult, G4double ke) const =0
#define G4endl
Definition: G4ios.hh:61
G4GLOB_DLL std::ostream G4cerr
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generateSCMfinalState()

void G4ElementaryParticleCollider::generateSCMfinalState ( G4double  ekin,
G4double  etot_scm,
G4InuclElementaryParticle particle1,
G4InuclElementaryParticle particle2 
)
private

Definition at line 311 of file G4ElementaryParticleCollider.cc.

314  {
315  if (verboseLevel > 2) {
316  G4cout << " >>> G4ElementaryParticleCollider::generateSCMfinalState"
317  << G4endl;
318  }
319 
321 
322  const G4int itry_max = 10;
323 
324  G4int type1 = particle1->type();
325  G4int type2 = particle2->type();
326 
327  G4int is = type1 * type2;
328 
329  if (verboseLevel > 3) G4cout << " is " << is << G4endl;
330 
331  G4int multiplicity = 0;
332  G4bool generate = true;
333 
334  G4int itry = 0;
335  while (generate && itry++ < itry_max) { /* Loop checking 08.06.2015 MHK */
336  particles.clear(); // Initialize buffers for this event
337  particle_kinds.clear();
338 
339  // Generate list of final-state particles
340  multiplicity = generateMultiplicity(is, ekin);
341 
342  generateOutgoingPartTypes(is, multiplicity, ekin);
343  if (particle_kinds.empty()) {
344  if (verboseLevel > 3) {
345  G4cout << " generateOutgoingPartTypes failed mult " << multiplicity
346  << G4endl;
347  }
348  continue;
349  }
350 
351  fillOutgoingMasses(); // Fill mass buffer from particle types
352 
353  // Attempt to produce final state kinematics
354  fsGenerator.Configure(particle1, particle2, particle_kinds);
355  generate = !fsGenerator.Generate(etot_scm, masses, scm_momentums);
356  } // while (generate)
357 
358  if (itry >= itry_max) { // Unable to generate valid final state
359  if (verboseLevel > 2)
360  G4cout << " generateSCMfinalState failed " << itry << " attempts"
361  << G4endl;
362  return;
363  }
364 
365  // Store generated momenta into outgoing particles
366 
367  particles.resize(multiplicity); // Preallocate buffer
368  for (G4int i=0; i<multiplicity; i++) {
369  particles[i].fill(scm_momentums[i], particle_kinds[i],
371  }
372 
373  if (verboseLevel > 3) {
374  G4cout << " <<< G4ElementaryParticleCollider::generateSCMfinalState"
375  << G4endl;
376  }
377 
378  return; // Particles buffer filled
379 }
G4bool Generate(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
G4CascadeFinalStateGenerator fsGenerator
int G4int
Definition: G4Types.hh:78
std::vector< G4LorentzVector > scm_momentums
G4GLOB_DLL std::ostream G4cout
std::vector< G4InuclElementaryParticle > particles
bool G4bool
Definition: G4Types.hh:79
void Configure(G4InuclElementaryParticle *bullet, G4InuclElementaryParticle *target, const std::vector< G4int > &particle_kinds)
void generateOutgoingPartTypes(G4int is, G4int mult, G4double ekin)
void generate(const G4double sqrtS, ParticleList &particles)
Generate an event in the CM system.
void SetVerboseLevel(G4int verbose)
#define G4endl
Definition: G4ios.hh:61
G4int generateMultiplicity(G4int is, G4double ekin) const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generateSCMmuonAbsorption()

void G4ElementaryParticleCollider::generateSCMmuonAbsorption ( G4double  etot_scm,
G4InuclElementaryParticle particle1,
G4InuclElementaryParticle particle2 
)
private

Definition at line 446 of file G4ElementaryParticleCollider.cc.

449 {
450  if (verboseLevel > 3)
451  G4cout << " >>> G4ElementaryParticleCollider::generateSCMmuonAbsorption"
452  << G4endl;
453 
454  // A phase space generator is required for the 3-body final state
455 
456  particles.clear(); // Initialize buffers for this event
457  particles.resize(3);
458 
459  scm_momentums.clear();
460  scm_momentums.resize(3);
461 
462  particle_kinds.clear();
463 
464  G4int type1 = particle1->type();
465  G4int type2 = particle2->type();
466 
467  if (type1 != muonMinus) return; // Sanity check, only mu- absorption
468 
469  // Ensure that absportion is valid (charge conservable)
470  if (!G4NucleiModel::useQuasiDeuteron(type1, type2)) {
471  G4cerr << " mu- absorption: "
472  << particle1->getDefinition()->GetParticleName() << " + "
473  << particle2->getDefinition()->GetParticleName() << " -> ?"
474  << G4endl;
475  return;
476  }
477 
478  if (!splitQuasiDeuteron(type2)) return; // Get constituents of [NN]
479  particle_kinds.push_back(mnu);
480 
482 
483  G4GDecay3 breakup(etot_scm, masses[0], masses[1], masses[2]);
484  std::vector<G4ThreeVector> theMomenta = breakup.GetThreeBodyMomenta();
485 
486  if (theMomenta.empty()) {
487  G4cerr << " generateSCMmuonAbsorption: GetThreeBodyMomenta() failed"
488  << " for " << type2 << " dibaryon" << G4endl;
489  particle_kinds.clear();
490  masses.clear();
491  return;
492  }
493 
494  for (size_t i=0; i<3; i++) {
495  scm_momentums[i].setVectM(theMomenta[i], masses[i]);
497  }
498 }
static G4bool useQuasiDeuteron(G4int ptype, G4int qdtype=0)
int G4int
Definition: G4Types.hh:78
std::vector< G4LorentzVector > scm_momentums
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
std::vector< G4InuclElementaryParticle > particles
#define G4endl
Definition: G4ios.hh:61
const G4ParticleDefinition * getDefinition() const
G4GLOB_DLL std::ostream G4cerr
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generateSCMpionAbsorption()

void G4ElementaryParticleCollider::generateSCMpionAbsorption ( G4double  etot_scm,
G4InuclElementaryParticle particle1,
G4InuclElementaryParticle particle2 
)
private

Definition at line 401 of file G4ElementaryParticleCollider.cc.

403  {
404  if (verboseLevel > 3)
405  G4cout << " >>> G4ElementaryParticleCollider::generateSCMpionAbsorption"
406  << G4endl;
407 
408  particles.clear(); // Initialize buffers for this event
409  particles.resize(2);
410 
411  particle_kinds.clear();
412 
413  G4int type1 = particle1->type();
414  G4int type2 = particle2->type();
415 
416  // Ensure that absportion is valid (charge conservable)
417  if (!G4NucleiModel::useQuasiDeuteron(type1, type2)) {
418  G4cerr << " pion absorption: "
419  << particle1->getDefinition()->GetParticleName() << " + "
420  << particle2->getDefinition()->GetParticleName() << " -> ?"
421  << G4endl;
422  return;
423  }
424 
425  if (!splitQuasiDeuteron(type2)) return; // Get constituents of [NN]
426 
428 
429  G4double a = 0.5 * (etot_scm * etot_scm - masses2[0] - masses2[1]);
430 
431  G4double pmod = std::sqrt((a*a - masses2[0]*masses2[1])
432  / (etot_scm*etot_scm) );
433  G4LorentzVector mom1 = generateWithRandomAngles(pmod, masses[0]);
434  G4LorentzVector mom2;
435  mom2.setVectM(-mom1.vect(), masses[1]);
436 
439 }
static G4bool useQuasiDeuteron(G4int ptype, G4int qdtype=0)
int G4int
Definition: G4Types.hh:78
Hep3Vector vect() const
void setVectM(const Hep3Vector &spatial, double mass)
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
std::vector< G4InuclElementaryParticle > particles
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
const G4ParticleDefinition * getDefinition() const
G4GLOB_DLL std::ostream G4cerr
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generateSCMpionNAbsorption()

void G4ElementaryParticleCollider::generateSCMpionNAbsorption ( G4double  etot_scm,
G4InuclElementaryParticle particle1,
G4InuclElementaryParticle particle2 
)
private

Definition at line 504 of file G4ElementaryParticleCollider.cc.

506  {
507  if (verboseLevel > 3)
508  G4cout << " >>> G4ElementaryParticleCollider::generateSCMpionNAbsorption"
509  << G4endl;
510 
511  particles.clear(); // Initialize buffers for this event
512  particles.resize(1);
513 
514  particle_kinds.clear();
515 
516  G4int type1 = particle1->type();
517  G4int type2 = particle2->type();
518 
519  // Ensure that single-nucleon absportion is valid (charge exchangeable)
520  if ((type1*type2 != pim*pro && type1*type2 != pip*neu)) {
521  G4cerr << " pion-nucleon absorption: "
522  << particle1->getDefinition()->GetParticleName() << " + "
523  << particle2->getDefinition()->GetParticleName() << " -> ?"
524  << G4endl;
525  return;
526  }
527 
528  // Get outgoing nucleon type using charge exchange
529  // Proton code is 1, neutron code is 2, so 3-# swaps them
530  G4int ntype = (particle2->nucleon() ? type2 : type1);
531  G4int outType = 3 - ntype;
532  particle_kinds.push_back(outType);
533 
535 
536  // Get mass of residual nucleus (2-ntype = 1 for proton, 0 for neutron)
537  G4double mRecoil =
539  G4double mRecoil2 = mRecoil*mRecoil;
540 
541  // Recompute Ecm to include nucleus (for recoil kinematics)
542  G4LorentzVector piN4 = particle1->getMomentum() + particle2->getMomentum();
543  G4LorentzVector vsum(0.,0.,0.,mRecoil);
544  vsum += piN4;
545 
546  // Two-body kinematics (nucleon against nucleus) in overall CM system
547  G4double esq_scm = vsum.m2();
548  G4double a = 0.5 * (esq_scm - masses2[0] - mRecoil2);
549 
550  G4double pmod = std::sqrt((a*a - masses2[0]*mRecoil2) / esq_scm );
551  G4LorentzVector mom1 = generateWithRandomAngles(pmod, masses[0]);
552 
553  if (verboseLevel > 3) {
554  G4cout << " outgoing type " << outType << " recoiling on nuclear mass "
555  << mRecoil << "\n a " << a << " p " << pmod << " Ekin "
556  << mom1.e()-masses[0] << G4endl;
557  }
558 
559  mom1.boost(-piN4.boostVector()); // Boost into CM of pi-N collision
560 
561  if (verboseLevel > 3) {
562  G4cout << " in original pi-N frame p(SCM) " << mom1.rho() << " Ekin "
563  << mom1.e()-masses[0] << G4endl;
564  }
565 
566  // Fill only the ejected nucleon
568 }
G4LorentzVector getMomentum() const
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
std::vector< G4InuclElementaryParticle > particles
HepLorentzVector & boost(double, double, double)
G4double getNucleiMass() const
Hep3Vector boostVector() const
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
const G4ParticleDefinition * getDefinition() const
G4GLOB_DLL std::ostream G4cerr
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=()

G4ElementaryParticleCollider& G4ElementaryParticleCollider::operator= ( const G4ElementaryParticleCollider )
private

◆ pionNucleonAbsorption()

G4bool G4ElementaryParticleCollider::pionNucleonAbsorption ( G4double  ekin) const
private

Definition at line 574 of file G4ElementaryParticleCollider.cc.

574  {
575  if (verboseLevel > 3)
576  G4cout << " >>> G4ElementaryParticleCollider::pionNucleonAbsorption ?"
577  << " ekin " << ekin << " is " << interCase.hadrons() << G4endl;
578 
579  // Absorption occurs with specified probability
581 
582  // Absorption occurs only for pi- p -> n, or pi+ n -> p
583  // Restrict to "very slow" pions, to allow for some normal scattering
584  return ((interCase.hadrons() == pim*pro ||
585  interCase.hadrons() == pip*neu)
586  && (ekin < 0.05) // 50 MeV kinetic energy or less
587  && (G4UniformRand() < absProb)
588  );
589 }
G4int hadrons() const
static G4double piNAbsorption()
#define G4UniformRand()
Definition: Randomize.hh:97
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setNucleusState()

void G4ElementaryParticleCollider::setNucleusState ( G4int  a,
G4int  z 
)
inline

Definition at line 82 of file G4ElementaryParticleCollider.hh.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ splitQuasiDeuteron()

G4bool G4ElementaryParticleCollider::splitQuasiDeuteron ( G4int  qdtype)
private

Definition at line 594 of file G4ElementaryParticleCollider.cc.

594  {
595  if (qdtype != diproton && qdtype != unboundPN && qdtype != dineutron) {
596  G4cerr << " type " << qdtype << " not dibaryon!" << G4endl;
597  return false;
598  }
599 
600  G4int b2 = qdtype % 10; // Dibaryon codes are 1ab (a=1,2; b=1,2)
601  G4int b1 = (qdtype/10) % 10;
602 
603  particle_kinds.push_back(b1);
604  particle_kinds.push_back(b2);
605 
606  return true;
607 }
int G4int
Definition: G4Types.hh:78
static const G4double b2
static const G4double b1
#define G4endl
Definition: G4ios.hh:61
G4GLOB_DLL std::ostream G4cerr
Here is the caller graph for this function:

Member Data Documentation

◆ fsGenerator

G4CascadeFinalStateGenerator G4ElementaryParticleCollider::fsGenerator
private

Definition at line 117 of file G4ElementaryParticleCollider.hh.

◆ masses

std::vector<G4double> G4ElementaryParticleCollider::masses
private

Definition at line 123 of file G4ElementaryParticleCollider.hh.

◆ masses2

std::vector<G4double> G4ElementaryParticleCollider::masses2
private

Definition at line 124 of file G4ElementaryParticleCollider.hh.

◆ modules

std::vector<G4double> G4ElementaryParticleCollider::modules
private

Definition at line 122 of file G4ElementaryParticleCollider.hh.

◆ nucleusA

G4int G4ElementaryParticleCollider::nucleusA
private

Definition at line 128 of file G4ElementaryParticleCollider.hh.

◆ nucleusZ

G4int G4ElementaryParticleCollider::nucleusZ
private

Definition at line 128 of file G4ElementaryParticleCollider.hh.

◆ particle_kinds

std::vector<G4int> G4ElementaryParticleCollider::particle_kinds
private

Definition at line 125 of file G4ElementaryParticleCollider.hh.

◆ particles

std::vector<G4InuclElementaryParticle> G4ElementaryParticleCollider::particles
private

Definition at line 120 of file G4ElementaryParticleCollider.hh.

◆ scm_momentums

std::vector<G4LorentzVector> G4ElementaryParticleCollider::scm_momentums
private

Definition at line 121 of file G4ElementaryParticleCollider.hh.


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