51 #include "G4InuclSpecialFunctions.hh"    53 #include "G4MultiBodyMomentumDist.hh"    78     momDist(0), angDist(0), multiplicity(0), bullet_ekin(0.) {;}
    84   G4MultiBodyMomentumDist::setVerboseLevel(verbose);
    95       const std::vector<G4int>& particle_kinds) {
   110   kinds = particle_kinds;
   140        << 
" is " << is << 
" fs " << fs << 
G4endl;
   147     G4int kw = (fs==is) ? 1 : 2;
   166         std::vector<G4LorentzVector>& finalState) {
   184        << 
"\n pmod " << pscm
   185        << 
"\n before rotation px " << 
mom.
x() << 
" py " << 
mom.
y()
   189   finalState.resize(2);             
   191   finalState[0].setVectM(
mom, masses[0]);
   195     G4cout << 
" after rotation px " << finalState[0].x() << 
" py "   196        << finalState[0].y() << 
" pz " << finalState[0].z() << 
G4endl;
   199   finalState[1].setVectM(-finalState[0].vect(), masses[1]);
   207           std::vector<G4LorentzVector>& finalState) {
   242     G4cout << 
" knd_last " << 
kinds.back() << 
" mass_last "    258       if (pmod < 
small) 
break;
   259       eleft -= std::sqrt(pmod*pmod + masses[i]*masses[i]);
   263            << 
" mass2 " << masses[i]*masses[i] << 
" eleft " << eleft
   264            << 
"\n x1 " << eleft - mass_last << 
G4endl;
   267       if (eleft <= mass_last) 
break;
   272     if (i < multiplicity-1) 
continue;   
   274     G4double plast = eleft * eleft - masses.back()*masses.back();
   277     if (plast <= 
small) 
continue;   
   279     plast = std::sqrt(plast);       
   287       G4cerr << 
" Unable to generate momenta for multiplicity "   301   return ( (pmod.size() != 3) ||
   302        !(pmod[0] < std::fabs(pmod[1] - pmod[2]) ||
   303          pmod[0] > pmod[1] + pmod[2] ||
   304          pmod[1] < std::fabs(pmod[0] - pmod[2]) ||
   305          pmod[1] > pmod[0] + pmod[2] ||
   306          pmod[2] < std::fabs(pmod[0] - pmod[1]) ||
   307          pmod[2] > pmod[1] + pmod[0])
   315            std::vector<G4LorentzVector>& finalState) {
   331          std::vector<G4LorentzVector>& finalState) {
   335   finalState.resize(3);
   338   finalState[2] = generateWithFixedTheta(costh, 
modules[2], masses[2]);
   354   finalState[0] = generateWithFixedTheta(costh, 
modules[0], masses[0]);
   355   finalState[0] = 
toSCM.
rotate(finalState[2], finalState[0]);
   358   finalState[1].
set(0.,0.,0.,initialMass);
   359   finalState[1] -= finalState[0] + finalState[2];
   364         std::vector<G4LorentzVector>& finalState) {
   375     finalState[i] = generateWithFixedTheta(costh, 
modules[i], masses[i]);
   381     std::accumulate(finalState.begin(), finalState.end()-2, 
G4LorentzVector());
   384   costh = -0.5 * (pmod*pmod +
   387     / pmod / 
modules[multiplicity-2];
   400   finalState[multiplicity-2] =
   401     generateWithFixedTheta(costh, 
modules[multiplicity-2],
   402                masses[multiplicity-2]);
   403   finalState[multiplicity-2] = 
toSCM.
rotate(psum, finalState[multiplicity-2]);
   406   finalState[multiplicity-1].
set(0.,0.,0.,initialMass);
   407   finalState[multiplicity-1] -= psum + finalState[multiplicity-2];
   416     G4cout << 
" >>> " << 
GetName() << 
"::GenerateCosTheta " << ptype
   425   G4double p0 = ptype<3 ? 0.36 : 0.25;  
   426   G4double alf = 1.0 / p0 / (p0 - (pmod+p0)*
G4Exp(-pmod / p0));
   436       G4cout << 
" s1 * alf * G4Exp(-s1 / p0) " << salf
   437          << 
" s2 " << s2 << 
G4endl;
   440     if (salf > s2) sinth = s1 / pmod;
   444     G4cout << 
" itry1 " << itry1 << 
" sinth " << sinth << 
G4endl;
   448       G4cout << 
" high energy angles generation: itry1 " << itry1 << 
G4endl;
   450     sinth = 0.5 * inuclRndm();
   454   G4double costh = std::sqrt(1.0 - sinth * sinth);
   455   if (inuclRndm() > 0.5) costh = -costh;
   466          const std::vector<G4double>& masses,
   467          std::vector<G4LorentzVector>& finalState) {
   473   size_t N = masses.size();
   474   finalState.resize(N);
   476   G4double mtot = std::accumulate(masses.begin(), masses.end(), 0.0);
   484   for (
size_t k=N-1; k>0; --k) {
   497     finalState[k].setVectM(momV,masses[k]);
   500     finalState[k].boost(boostV);
   501     recoil.
boost(boostV);
   505   finalState[0] = recoil;
   513   G4double Fmax = std::sqrt(g4pow->
powN(xN/(xN+1.),N)/(xN+1.)); 
   518     F = std::sqrt(g4pow->
powN(chi,N)*(1.-chi));      
 
static G4Pow * GetInstance()
 
static const G4double small
 
static const G4VTwoBodyAngDst * GetDist(G4int is, G4int fs, G4int kw)
 
virtual void GenerateMultiBody(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4double BetaKopylov(G4int K) const
 
G4double GenerateCosTheta(G4int ptype, G4double pmod) const
 
void FillDirThreeBody(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4double powN(G4double x, G4int n) const
 
const G4String & GetName() const
 
G4double UniformPhi() const
 
void setBullet(const G4InuclParticle *bullet)
 
std::vector< G4int > kinds
 
virtual const G4String & GetName() const
 
void SaveKinematics(G4InuclElementaryParticle *bullet, G4InuclElementaryParticle *target)
 
G4LorentzVector rotate(const G4LorentzVector &mom) const
 
void setVectM(const Hep3Vector &spatial, double mass)
 
const G4VTwoBodyAngDst * angDist
 
void FillMagnitudes(G4double initialMass, const std::vector< G4double > &masses)
 
G4GLOB_DLL std::ostream G4cout
 
void setVerbose(G4int vb=0)
 
HepLorentzVector & boost(double, double, double)
 
static const G4int itry_max
 
std::vector< G4double > modules
 
void setRThetaPhi(double r, double theta, double phi)
 
virtual G4double GetMomentum(G4int ptype, const G4double &ekin) const =0
 
static void setVerboseLevel(G4int vb=0)
 
static G4bool usePhaseSpace()
 
G4double G4Exp(G4double initial_x)
Exponential Function double precision. 
 
virtual void SetVerboseLevel(G4int verbose)
 
void Configure(G4InuclElementaryParticle *bullet, G4InuclElementaryParticle *target, const std::vector< G4int > &particle_kinds)
 
const G4VMultiBodyMomDst * momDist
 
void set(double x, double y, double z, double t)
 
virtual void GenerateTwoBody(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
static const G4double oneOverE
 
Hep3Vector boostVector() const
 
cout<< "-> Edep in the target
 
G4bool satisfyTriangle(const std::vector< G4double > &pmod) const
 
void FillDirections(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4int GetVerboseLevel() const
 
static const G4double maxCosTheta
 
virtual const G4String & GetName() const
 
void FillUsingKopylov(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4double getKinEnergyInTheTRS() const
 
G4double UniformTheta() const
 
G4CascadeFinalStateAlgorithm()
 
virtual void SetVerboseLevel(G4int verbose)
 
void ChooseGenerators(G4int is, G4int fs)
 
void FillDirManyBody(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
 
G4double TwoBodyMomentum(G4double M0, G4double M1, G4double M2) const
 
virtual ~G4CascadeFinalStateAlgorithm()
 
virtual G4double GetCosTheta(const G4double &ekin, const G4double &pcm) const =0
 
G4GLOB_DLL std::ostream G4cerr
 
void setTarget(const G4InuclParticle *target)
 
CLHEP::HepLorentzVector G4LorentzVector