Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions
G4CascadeFinalStateAlgorithm Class Reference

#include <G4CascadeFinalStateAlgorithm.hh>

Inheritance diagram for G4CascadeFinalStateAlgorithm:
G4VHadDecayAlgorithm

Public Member Functions

 G4CascadeFinalStateAlgorithm ()
 
virtual ~G4CascadeFinalStateAlgorithm ()
 
virtual void SetVerboseLevel (G4int verbose)
 
void Configure (G4InuclElementaryParticle *bullet, G4InuclElementaryParticle *target, const std::vector< G4int > &particle_kinds)
 
- Public Member Functions inherited from G4VHadDecayAlgorithm
 G4VHadDecayAlgorithm (const G4String &algName, G4int verbose=0)
 
virtual ~G4VHadDecayAlgorithm ()
 
void Generate (G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4int GetVerboseLevel () const
 
const G4StringGetName () const
 

Protected Member Functions

virtual void GenerateTwoBody (G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
virtual void GenerateMultiBody (G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
void SaveKinematics (G4InuclElementaryParticle *bullet, G4InuclElementaryParticle *target)
 
void ChooseGenerators (G4int is, G4int fs)
 
void FillMagnitudes (G4double initialMass, const std::vector< G4double > &masses)
 
G4bool satisfyTriangle (const std::vector< G4double > &pmod) const
 
void FillDirections (G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
void FillDirThreeBody (G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
void FillDirManyBody (G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4double GenerateCosTheta (G4int ptype, G4double pmod) const
 
void FillUsingKopylov (G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4double BetaKopylov (G4int K) const
 
- Protected Member Functions inherited from G4VHadDecayAlgorithm
virtual G4bool IsDecayAllowed (G4double initialMass, const std::vector< G4double > &masses) const
 
G4double TwoBodyMomentum (G4double M0, G4double M1, G4double M2) const
 
G4double UniformTheta () const
 
G4double UniformPhi () const
 
void PrintVector (const std::vector< G4double > &v, const G4String &name, std::ostream &os) const
 

Detailed Description

Definition at line 49 of file G4CascadeFinalStateAlgorithm.hh.

Constructor & Destructor Documentation

G4CascadeFinalStateAlgorithm::G4CascadeFinalStateAlgorithm ( )

Definition at line 72 of file G4CascadeFinalStateAlgorithm.cc.

73  : G4VHadDecayAlgorithm("G4CascadeFinalStateAlgorithm"),
74  momDist(0), angDist(0), multiplicity(0), bullet_ekin(0.) {;}
G4VHadDecayAlgorithm(const G4String &algName, G4int verbose=0)
G4CascadeFinalStateAlgorithm::~G4CascadeFinalStateAlgorithm ( )
virtual

Definition at line 76 of file G4CascadeFinalStateAlgorithm.cc.

76 {;}

Member Function Documentation

G4double G4CascadeFinalStateAlgorithm::BetaKopylov ( G4int  K) const
protected

Definition at line 504 of file G4CascadeFinalStateAlgorithm.cc.

References G4UniformRand, G4Pow::GetInstance(), N, and G4Pow::powN().

Referenced by FillUsingKopylov().

504  {
505  G4Pow* g4pow = G4Pow::GetInstance();
506 
507  G4int N = 3*K - 5;
508  G4double xN = G4double(N);
509  G4double Fmax = std::sqrt(g4pow->powN(xN/(xN+1.),N)/(xN+1.));
510 
511  G4double F, chi;
512  do {
513  chi = G4UniformRand();
514  F = std::sqrt(g4pow->powN(chi,N)*(1.-chi));
515  } while ( Fmax*G4UniformRand() > F);
516  return chi;
517 }
static G4Pow * GetInstance()
Definition: G4Pow.cc:53
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:125
Definition: G4Pow.hh:56
int G4int
Definition: G4Types.hh:78
#define G4UniformRand()
Definition: Randomize.hh:87
**D E S C R I P T I O N
double G4double
Definition: G4Types.hh:76
void G4CascadeFinalStateAlgorithm::ChooseGenerators ( G4int  is,
G4int  fs 
)
protected

Definition at line 133 of file G4CascadeFinalStateAlgorithm.cc.

References G4cout, G4endl, G4MultiBodyMomentumDist::GetDist(), G4TwoBodyAngularDist::GetDist(), G4VMultiBodyMomDst::GetName(), G4VTwoBodyAngDst::GetName(), G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), and G4CascadeParameters::usePhaseSpace().

Referenced by Configure().

133  {
134  if (GetVerboseLevel()>1)
135  G4cout << " >>> " << GetName() << "::ChooseGenerators"
136  << " is " << is << " fs " << fs << G4endl;
137 
138  // Get generators for momentum and angle
139  if (G4CascadeParameters::usePhaseSpace()) momDist = 0;
140  else momDist = G4MultiBodyMomentumDist::GetDist(is, multiplicity);
141 
142  if (fs > 0 && multiplicity == 2) {
143  G4int kw = (fs==is) ? 1 : 2;
144  angDist = G4TwoBodyAngularDist::GetDist(is, fs, kw);
145  } else if (multiplicity == 3) {
146  angDist = G4TwoBodyAngularDist::GetDist(is);
147  } else {
148  angDist = 0;
149  }
150 
151  if (GetVerboseLevel()>1) {
152  G4cout << " " << (momDist?momDist->GetName():"") << " "
153  << (angDist?angDist->GetName():"") << G4endl;
154  }
155 }
virtual const G4String & GetName() const
static const G4VTwoBodyAngDst * GetDist(G4int is, G4int fs, G4int kw)
G4int GetVerboseLevel() const
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
virtual const G4String & GetName() const
static G4bool usePhaseSpace()
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
static const G4VMultiBodyMomDst * GetDist(G4int is, G4int mult)
void G4CascadeFinalStateAlgorithm::Configure ( G4InuclElementaryParticle bullet,
G4InuclElementaryParticle target,
const std::vector< G4int > &  particle_kinds 
)

Definition at line 89 of file G4CascadeFinalStateAlgorithm.cc.

References ChooseGenerators(), G4cout, G4endl, G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), SaveKinematics(), and G4InuclElementaryParticle::type().

Referenced by G4CascadeFinalStateGenerator::Configure().

91  {
92  if (GetVerboseLevel()>1)
93  G4cout << " >>> " << GetName() << "::Configure" << G4endl;
94 
95  // Identify initial and final state (if two-body) for algorithm selection
96  multiplicity = particle_kinds.size();
97  G4int is = bullet->type() * target->type();
98  G4int fs = (multiplicity==2) ? particle_kinds[0]*particle_kinds[1] : 0;
99 
100  ChooseGenerators(is, fs);
101 
102  // Save kinematics for use with distributions
103  SaveKinematics(bullet, target);
104 
105  // Save particle types for use with distributions
106  kinds = particle_kinds;
107 }
G4int GetVerboseLevel() const
int G4int
Definition: G4Types.hh:78
void SaveKinematics(G4InuclElementaryParticle *bullet, G4InuclElementaryParticle *target)
G4GLOB_DLL std::ostream G4cout
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
void G4CascadeFinalStateAlgorithm::FillDirections ( G4double  initialMass,
const std::vector< G4double > &  masses,
std::vector< G4LorentzVector > &  finalState 
)
protected

Definition at line 310 of file G4CascadeFinalStateAlgorithm.cc.

References FillDirManyBody(), FillDirThreeBody(), G4cout, G4endl, G4VHadDecayAlgorithm::GetName(), and G4VHadDecayAlgorithm::GetVerboseLevel().

Referenced by GenerateMultiBody().

311  {
312  if (GetVerboseLevel()>1)
313  G4cout << " >>> " << GetName() << "::FillDirections" << G4endl;
314 
315  finalState.clear(); // Initialization and sanity check
316  if ((G4int)modules.size() != multiplicity) return;
317 
318  // Different order of processing for three vs. N body
319  if (multiplicity == 3)
320  FillDirThreeBody(initialMass, masses, finalState);
321  else
322  FillDirManyBody(initialMass, masses, finalState);
323 }
void FillDirThreeBody(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
G4int GetVerboseLevel() const
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
void FillDirManyBody(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
void G4CascadeFinalStateAlgorithm::FillDirManyBody ( G4double  initialMass,
const std::vector< G4double > &  masses,
std::vector< G4LorentzVector > &  finalState 
)
protected

Definition at line 359 of file G4CascadeFinalStateAlgorithm.cc.

References G4cout, G4endl, GenerateCosTheta(), G4InuclSpecialFunctions::generateWithFixedTheta(), G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), CLHEP::HepLorentzVector::rho(), G4LorentzConvertor::rotate(), and CLHEP::HepLorentzVector::set().

Referenced by FillDirections().

360  {
361  if (GetVerboseLevel()>1)
362  G4cout << " >>> " << GetName() << "::FillDirManyBody" << G4endl;
363 
364  // Fill all but the last two particles randomly
365  G4double costh = 0.;
366 
367  finalState.resize(multiplicity);
368 
369  for (G4int i=0; i<multiplicity-2; i++) {
370  costh = GenerateCosTheta(kinds[i], modules[i]);
371  finalState[i] = generateWithFixedTheta(costh, modules[i], masses[i]);
372  finalState[i] = toSCM.rotate(finalState[i]); // Align target axis
373  }
374 
375  // Total momentum so far, to compute recoil of last two particles
376  G4LorentzVector psum =
377  std::accumulate(finalState.begin(), finalState.end()-2, G4LorentzVector());
378  G4double pmod = psum.rho();
379 
380  costh = -0.5 * (pmod*pmod +
381  modules[multiplicity-2]*modules[multiplicity-2] -
382  modules[multiplicity-1]*modules[multiplicity-1])
383  / pmod / modules[multiplicity-2];
384 
385  if (GetVerboseLevel() > 2) G4cout << " ct last " << costh << G4endl;
386 
387  if (std::fabs(costh) >= maxCosTheta) { // Bad kinematics; abort generation
388  finalState.clear();
389  return;
390  }
391 
392  // Report success
393  if (GetVerboseLevel()>2) G4cout << " ok for mult " << multiplicity << G4endl;
394 
395  // First particle is at fixed angle to recoil system
396  finalState[multiplicity-2] =
397  generateWithFixedTheta(costh, modules[multiplicity-2],
398  masses[multiplicity-2]);
399  finalState[multiplicity-2] = toSCM.rotate(psum, finalState[multiplicity-2]);
400 
401  // Remaining particle is constrained to recoil from entire rest of system
402  finalState[multiplicity-1].set(0.,0.,0.,initialMass);
403  finalState[multiplicity-1] -= psum + finalState[multiplicity-2];
404 }
G4int GetVerboseLevel() const
G4LorentzVector rotate(const G4LorentzVector &mom) const
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
double rho() const
G4double GenerateCosTheta(G4int ptype, G4double pmod) const
const G4String & GetName() const
void set(double x, double y, double z, double t)
G4LorentzVector generateWithFixedTheta(G4double ct, G4double p, G4double mass=0.)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
CLHEP::HepLorentzVector G4LorentzVector
void G4CascadeFinalStateAlgorithm::FillDirThreeBody ( G4double  initialMass,
const std::vector< G4double > &  masses,
std::vector< G4LorentzVector > &  finalState 
)
protected

Definition at line 326 of file G4CascadeFinalStateAlgorithm.cc.

References G4cout, G4endl, GenerateCosTheta(), G4InuclSpecialFunctions::generateWithFixedTheta(), G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), G4LorentzConvertor::rotate(), and CLHEP::HepLorentzVector::set().

Referenced by FillDirections().

327  {
328  if (GetVerboseLevel()>1)
329  G4cout << " >>> " << GetName() << "::FillDirThreeBody" << G4endl;
330 
331  finalState.resize(3);
332 
333  G4double costh = GenerateCosTheta(kinds[2], modules[2]);
334  finalState[2] = generateWithFixedTheta(costh, modules[2], masses[2]);
335  finalState[2] = toSCM.rotate(finalState[2]); // Align target axis
336 
337  // Generate direction of first particle
338  costh = -0.5 * (modules[2]*modules[2] + modules[0]*modules[0] -
339  modules[1]*modules[1]) / modules[2] / modules[0];
340 
341  if (std::fabs(costh) >= maxCosTheta) { // Bad kinematics; abort generation
342  finalState.clear();
343  return;
344  }
345 
346  // Report success
347  if (GetVerboseLevel()>2) G4cout << " ok for mult 3" << G4endl;
348 
349  // First particle is at fixed angle to recoil system
350  finalState[0] = generateWithFixedTheta(costh, modules[0], masses[0]);
351  finalState[0] = toSCM.rotate(finalState[2], finalState[0]);
352 
353  // Remaining particle is constrained to recoil from entire rest of system
354  finalState[1].set(0.,0.,0.,initialMass);
355  finalState[1] -= finalState[0] + finalState[2];
356 }
G4int GetVerboseLevel() const
G4LorentzVector rotate(const G4LorentzVector &mom) const
G4GLOB_DLL std::ostream G4cout
G4double GenerateCosTheta(G4int ptype, G4double pmod) const
const G4String & GetName() const
void set(double x, double y, double z, double t)
G4LorentzVector generateWithFixedTheta(G4double ct, G4double p, G4double mass=0.)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
void G4CascadeFinalStateAlgorithm::FillMagnitudes ( G4double  initialMass,
const std::vector< G4double > &  masses 
)
protected

Definition at line 225 of file G4CascadeFinalStateAlgorithm.cc.

References G4cerr, G4cout, G4endl, G4VMultiBodyMomDst::GetMomentum(), G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), and satisfyTriangle().

Referenced by GenerateMultiBody().

225  {
226  if (GetVerboseLevel()>1)
227  G4cout << " >>> " << GetName() << "::FillMagnitudes" << G4endl;
228 
229  modules.clear(); // Initialization and sanity checks
230  if (!momDist) return;
231 
232  modules.resize(multiplicity,0.); // Pre-allocate to avoid resizing
233 
234  G4double mass_last = masses.back();
235  G4double pmod = 0.;
236 
237  if (GetVerboseLevel() > 3){
238  G4cout << " knd_last " << kinds.back() << " mass_last "
239  << mass_last << G4endl;
240  }
241 
242  G4int itry = -1;
243  while (++itry < itry_max) {
244  if (GetVerboseLevel() > 3) {
245  G4cout << " itry in fillMagnitudes " << itry << G4endl;
246  }
247 
248  G4double eleft = initialMass;
249 
250  G4int i; // For access outside of loop
251  for (i=0; i < multiplicity-1; i++) {
252  pmod = momDist->GetMomentum(kinds[i], bullet_ekin);
253 
254  if (pmod < small) break;
255  eleft -= std::sqrt(pmod*pmod + masses[i]*masses[i]);
256 
257  if (GetVerboseLevel() > 3) {
258  G4cout << " kp " << kinds[i] << " pmod " << pmod
259  << " mass2 " << masses[i]*masses[i] << " eleft " << eleft
260  << "\n x1 " << eleft - mass_last << G4endl;
261  }
262 
263  if (eleft <= mass_last) break;
264 
265  modules[i] = pmod;
266  }
267 
268  if (i < multiplicity-1) continue; // Failed to generate full kinematics
269 
270  G4double plast = eleft * eleft - masses.back()*masses.back();
271  if (GetVerboseLevel() > 2) G4cout << " plast ** 2 " << plast << G4endl;
272 
273  if (plast <= small) continue; // Not enough momentum left over
274 
275  plast = std::sqrt(plast); // Final momentum is what's left over
276  modules.back() = plast;
277 
278  if (multiplicity > 3 || satisfyTriangle(modules)) break; // Successful
279  } // while (itry < itry_max)
280 
281  if (itry >= itry_max) { // Too many attempts
282  if (GetVerboseLevel() > 2)
283  G4cerr << " Unable to generate momenta for multiplicity "
284  << multiplicity << G4endl;
285 
286  modules.clear(); // Something went wrong, throw away partial
287  }
288 }
G4int GetVerboseLevel() const
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
G4bool satisfyTriangle(const std::vector< G4double > &pmod) const
virtual G4double GetMomentum(G4int ptype, const G4double &ekin) const =0
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
G4GLOB_DLL std::ostream G4cerr
void G4CascadeFinalStateAlgorithm::FillUsingKopylov ( G4double  initialMass,
const std::vector< G4double > &  masses,
std::vector< G4LorentzVector > &  finalState 
)
protected

Definition at line 461 of file G4CascadeFinalStateAlgorithm.cc.

References BetaKopylov(), CLHEP::HepLorentzVector::boost(), CLHEP::HepLorentzVector::boostVector(), G4cout, G4endl, G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), N, CLHEP::Hep3Vector::setRThetaPhi(), CLHEP::HepLorentzVector::setVectM(), G4VHadDecayAlgorithm::TwoBodyMomentum(), G4VHadDecayAlgorithm::UniformPhi(), and G4VHadDecayAlgorithm::UniformTheta().

Referenced by GenerateMultiBody().

463  {
464  if (GetVerboseLevel()>2)
465  G4cout << " >>> " << GetName() << "::FillUsingKopylov" << G4endl;
466 
467  finalState.clear();
468 
469  size_t N = masses.size();
470  finalState.resize(N);
471 
472  G4double mtot = std::accumulate(masses.begin(), masses.end(), 0.0);
473  G4double mu = mtot;
474  G4double Mass = initialMass;
475  G4double T = Mass-mtot;
476  G4double recoilMass = 0.0;
477  G4ThreeVector momV, boostV; // Buffers to reduce memory churn
478  G4LorentzVector recoil(0.0,0.0,0.0,Mass);
479 
480  for (size_t k=N-1; k>0; --k) {
481  mu -= masses[k];
482  T *= (k>1) ? BetaKopylov(k) : 0.;
483 
484  recoilMass = mu + T;
485 
486  boostV = recoil.boostVector(); // Previous system's rest frame
487 
488  // Create momentum with a random direction isotropically distributed
489  // FIXME: Should theta distribution should use Bertini fit function?
490  momV.setRThetaPhi(TwoBodyMomentum(Mass,masses[k],recoilMass),
491  UniformTheta(), UniformPhi());
492 
493  finalState[k].setVectM(momV,masses[k]);
494  recoil.setVectM(-momV,recoilMass);
495 
496  finalState[k].boost(boostV);
497  recoil.boost(boostV);
498  Mass = recoilMass;
499  }
500 
501  finalState[0] = recoil;
502 }
G4double UniformTheta() const
G4int GetVerboseLevel() const
G4GLOB_DLL std::ostream G4cout
void setRThetaPhi(double r, double theta, double phi)
const G4String & GetName() const
G4double UniformPhi() const
G4double TwoBodyMomentum(G4double M0, G4double M1, G4double M2) const
#define G4endl
Definition: G4ios.hh:61
**D E S C R I P T I O N
double G4double
Definition: G4Types.hh:76
G4double G4CascadeFinalStateAlgorithm::GenerateCosTheta ( G4int  ptype,
G4double  pmod 
) const
protected

Definition at line 410 of file G4CascadeFinalStateAlgorithm.cc.

References G4cout, G4endl, G4VTwoBodyAngDst::GetCosTheta(), G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), and G4InuclSpecialFunctions::inuclRndm().

Referenced by FillDirManyBody(), and FillDirThreeBody().

410  {
411  if (GetVerboseLevel() > 2) {
412  G4cout << " >>> " << GetName() << "::GenerateCosTheta " << ptype
413  << " " << pmod << G4endl;
414  }
415 
416  if (multiplicity == 3) { // Use distribution for three-body
417  return angDist->GetCosTheta(bullet_ekin, ptype);
418  }
419 
420  // Throw multi-body distribution
421  G4double p0 = ptype<3 ? 0.36 : 0.25; // Nucleon vs. everything else
422  G4double alf = 1.0 / p0 / (p0 - (pmod+p0)*std::exp(-pmod / p0));
423 
424  G4double sinth = 2.0;
425 
426  G4int itry1 = -1;
427  while (std::fabs(sinth) > maxCosTheta && ++itry1 < itry_max) {
428  G4double s1 = pmod * inuclRndm();
429  G4double s2 = alf * oneOverE * p0 * inuclRndm();
430  G4double salf = s1 * alf * std::exp(-s1 / p0);
431  if (GetVerboseLevel() > 3) {
432  G4cout << " s1 * alf * std::exp(-s1 / p0) " << salf
433  << " s2 " << s2 << G4endl;
434  }
435 
436  if (salf > s2) sinth = s1 / pmod;
437  }
438 
439  if (GetVerboseLevel() > 3)
440  G4cout << " itry1 " << itry1 << " sinth " << sinth << G4endl;
441 
442  if (itry1 == itry_max) {
443  if (GetVerboseLevel() > 2)
444  G4cout << " high energy angles generation: itry1 " << itry1 << G4endl;
445 
446  sinth = 0.5 * inuclRndm();
447  }
448 
449  // Convert generated sin(theta) to cos(theta) with random sign
450  G4double costh = std::sqrt(1.0 - sinth * sinth);
451  if (inuclRndm() > 0.5) costh = -costh;
452 
453  return costh;
454 }
G4int GetVerboseLevel() const
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
virtual G4double GetCosTheta(const G4double &ekin, const G4double &pcm) const =0
void G4CascadeFinalStateAlgorithm::GenerateMultiBody ( G4double  initialMass,
const std::vector< G4double > &  masses,
std::vector< G4LorentzVector > &  finalState 
)
protectedvirtual

Implements G4VHadDecayAlgorithm.

Definition at line 202 of file G4CascadeFinalStateAlgorithm.cc.

References FillDirections(), FillMagnitudes(), FillUsingKopylov(), G4cout, G4endl, G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), and G4CascadeParameters::usePhaseSpace().

203  {
204  if (GetVerboseLevel()>1)
205  G4cout << " >>> " << GetName() << "::GenerateMultiBody" << G4endl;
206 
208  FillUsingKopylov(initialMass, masses, finalState);
209  return;
210  }
211 
212  finalState.clear(); // Initialization and sanity checks
213  if (multiplicity < 3) return;
214  if (!momDist) return;
215 
216  G4int itry = -1;
217  while ((G4int)finalState.size() != multiplicity && ++itry < itry_max) {
218  FillMagnitudes(initialMass, masses);
219  FillDirections(initialMass, masses, finalState);
220  }
221 }
G4int GetVerboseLevel() const
int G4int
Definition: G4Types.hh:78
void FillMagnitudes(G4double initialMass, const std::vector< G4double > &masses)
G4GLOB_DLL std::ostream G4cout
static G4bool usePhaseSpace()
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
void FillDirections(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
void FillUsingKopylov(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
void G4CascadeFinalStateAlgorithm::GenerateTwoBody ( G4double  initialMass,
const std::vector< G4double > &  masses,
std::vector< G4LorentzVector > &  finalState 
)
protectedvirtual

Implements G4VHadDecayAlgorithm.

Definition at line 161 of file G4CascadeFinalStateAlgorithm.cc.

References G4cout, G4endl, G4UniformRand, G4VTwoBodyAngDst::GetCosTheta(), G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), G4LorentzConvertor::rotate(), CLHEP::Hep3Vector::setRThetaPhi(), G4VHadDecayAlgorithm::TwoBodyMomentum(), G4VHadDecayAlgorithm::UniformPhi(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

162  {
163  if (GetVerboseLevel()>1)
164  G4cout << " >>> " << GetName() << "::GenerateTwoBody" << G4endl;
165 
166  finalState.clear(); // Initialization and sanity checks
167 
168  if (multiplicity != 2) return;
169 
170  // Generate momentum vector in CMS for back-to-back particles
171  G4double pscm = TwoBodyMomentum(initialMass, masses[0], masses[1]);
172 
173  G4double costh = angDist ? angDist->GetCosTheta(bullet_ekin, pscm)
174  : (2.*G4UniformRand() - 1.);
175 
176  mom.setRThetaPhi(pscm, std::acos(costh), UniformPhi());
177 
178  if (GetVerboseLevel()>3) { // Copied from old G4EPCollider
179  G4cout << " Particle kinds = " << kinds[0] << " , " << kinds[1]
180  << "\n pmod " << pscm
181  << "\n before rotation px " << mom.x() << " py " << mom.y()
182  << " pz " << mom.z() << G4endl;
183  }
184 
185  finalState.resize(2); // Allows filling by index
186 
187  finalState[0].setVectM(mom, masses[0]);
188  finalState[0] = toSCM.rotate(finalState[0]);
189 
190  if (GetVerboseLevel()>3) { // Copied from old G4EPCollider
191  G4cout << " after rotation px " << finalState[0].x() << " py "
192  << finalState[0].y() << " pz " << finalState[0].z() << G4endl;
193  }
194 
195  finalState[1].setVectM(-finalState[0].vect(), masses[1]);
196 }
double x() const
G4int GetVerboseLevel() const
G4LorentzVector rotate(const G4LorentzVector &mom) const
double z() const
#define G4UniformRand()
Definition: Randomize.hh:87
G4GLOB_DLL std::ostream G4cout
void setRThetaPhi(double r, double theta, double phi)
const G4String & GetName() const
G4double UniformPhi() const
double y() const
G4double TwoBodyMomentum(G4double M0, G4double M1, G4double M2) const
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
virtual G4double GetCosTheta(const G4double &ekin, const G4double &pcm) const =0
G4bool G4CascadeFinalStateAlgorithm::satisfyTriangle ( const std::vector< G4double > &  pmod) const
protected

Definition at line 293 of file G4CascadeFinalStateAlgorithm.cc.

References G4cout, G4endl, G4VHadDecayAlgorithm::GetName(), and G4VHadDecayAlgorithm::GetVerboseLevel().

Referenced by FillMagnitudes().

293  {
294  if (GetVerboseLevel() > 3)
295  G4cout << " >>> " << GetName() << "::satisfyTriangle" << G4endl;
296 
297  return ( (pmod.size() != 3) ||
298  !(pmod[0] < std::fabs(pmod[1] - pmod[2]) ||
299  pmod[0] > pmod[1] + pmod[2] ||
300  pmod[1] < std::fabs(pmod[0] - pmod[2]) ||
301  pmod[1] > pmod[0] + pmod[2] ||
302  pmod[2] < std::fabs(pmod[0] - pmod[1]) ||
303  pmod[2] > pmod[1] + pmod[0])
304  );
305 }
G4int GetVerboseLevel() const
G4GLOB_DLL std::ostream G4cout
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
void G4CascadeFinalStateAlgorithm::SaveKinematics ( G4InuclElementaryParticle bullet,
G4InuclElementaryParticle target 
)
protected

Definition at line 112 of file G4CascadeFinalStateAlgorithm.cc.

References G4cout, G4endl, G4LorentzConvertor::getKinEnergyInTheTRS(), G4VHadDecayAlgorithm::GetName(), G4VHadDecayAlgorithm::GetVerboseLevel(), G4InuclElementaryParticle::nucleon(), G4LorentzConvertor::setBullet(), G4LorentzConvertor::setTarget(), and G4LorentzConvertor::toTheCenterOfMass().

Referenced by Configure().

113  {
114  if (GetVerboseLevel()>1)
115  G4cout << " >>> " << GetName() << "::SaveKinematics" << G4endl;
116 
117  if (target->nucleon()) { // Which particle originated in nucleus?
118  toSCM.setBullet(bullet);
119  toSCM.setTarget(target);
120  } else {
121  toSCM.setBullet(target);
122  toSCM.setTarget(bullet);
123  }
124 
125  toSCM.toTheCenterOfMass();
126 
127  bullet_ekin = toSCM.getKinEnergyInTheTRS();
128 }
G4int GetVerboseLevel() const
void setBullet(const G4InuclParticle *bullet)
G4GLOB_DLL std::ostream G4cout
G4double getKinEnergyInTheTRS() const
const G4String & GetName() const
#define G4endl
Definition: G4ios.hh:61
void setTarget(const G4InuclParticle *target)
void G4CascadeFinalStateAlgorithm::SetVerboseLevel ( G4int  verbose)
virtual

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