52 const std::vector<G4double>& masses,
53 std::vector<G4LorentzVector>& finalState) {
59 G4int numberOfDaughters = masses.size();
61 std::accumulate(masses.begin(), masses.end(), 0.);
64 std::vector<G4double> daughtermomentum(numberOfDaughters);
65 std::vector<G4double> sm(numberOfDaughters);
68 G4int numberOfTry = 0;
71 std::vector<G4double> rd(numberOfDaughters);
75 std::generate(rd.begin()+1, rd.end(), uniformRand);
76 std::sort(rd.begin(), rd.end(), std::greater<G4double>());
81 tmas = initialMass - sumofmasses;
83 for(i =0; i < numberOfDaughters; i++) {
84 sm[i] = rd[i]*tmas + temp;
87 G4cout << i <<
" random number:" << rd[i]
88 <<
" virtual mass:" << sm[i]/GeV <<
" GeV/c2" <<
G4endl;
94 i = numberOfDaughters-1;
97 G4cout <<
" daughter " << i <<
": momentum "
98 << daughtermomentum[i]/GeV <<
" GeV/c" <<
G4endl;
100 for(i =numberOfDaughters-2; i>=0; i--) {
103 if(daughtermomentum[i] < 0.0) {
106 G4cout <<
"G4HadPhaseSpaceNBodyAsai::Generate "
107 <<
" can not calculate daughter momentum "
108 <<
"\n initialMass " << initialMass/GeV <<
" GeV/c2"
109 <<
"\n daughter " << i <<
": mass "
110 << masses[i]/GeV <<
" GeV/c2; momentum "
111 << daughtermomentum[i]/GeV <<
" GeV/c" <<
G4endl;
117 weight *= daughtermomentum[i]/sm[i];
119 G4cout <<
" daughter " << i <<
": momentum "
120 << daughtermomentum[i]/GeV <<
" GeV/c" <<
G4endl;
128 if (numberOfTry++ > 100) {
130 G4cout <<
"G4HadPhaseSpaceNBodyAsai::Generate "
131 <<
" can not determine Decay Kinematics " <<
G4endl;
138 G4cout <<
"Start calculation of daughters momentum vector "<<
G4endl;
143 finalState.resize(numberOfDaughters);
145 i = numberOfDaughters-2;
149 finalState[i].setVectM(direction, masses[i]);
150 finalState[i+1].setVectM(-direction, masses[i+1]);
152 for (i = numberOfDaughters-3; i >= 0; i--) {
156 finalState[i].setVectM(-daughtermomentum[i]*direction, masses[i]);
159 beta = daughtermomentum[i];
160 beta /= std::sqrt(beta*beta + sm[i+1]*sm[i+1]);
161 for (
G4int j = i+1; j<numberOfDaughters; j++) {
162 finalState[j].boost(beta*direction);
G4GLOB_DLL std::ostream G4cout
virtual void GenerateMultiBody(G4double initialMass, const std::vector< G4double > &masses, std::vector< G4LorentzVector > &finalState)
const G4String & GetName() const
void PrintVector(const std::vector< G4double > &v, const G4String &name, std::ostream &os) const
G4int GetVerboseLevel() const
G4double TwoBodyMomentum(G4double M0, G4double M1, G4double M2) const
G4ThreeVector UniformVector(G4double mag=1.) const