53 {
55
56 finalState.clear();
57
58
59 G4int numberOfDaughters = (
G4int)masses.size();
61 std::accumulate(masses.begin(), masses.end(), 0.);
62
63
64 std::vector<G4double> daughtermomentum(numberOfDaughters);
65 std::vector<G4double>
sm(numberOfDaughters);
68 G4int numberOfTry = 0;
70
71 std::vector<G4double> rd(numberOfDaughters);
72 do {
73
74 rd[0] = 1.0;
75 std::generate(rd.begin()+1, rd.end(), uniformRand);
76 std::sort(rd.begin(), rd.end(), std::greater<G4double>());
77
79
80
81 tmas = initialMass - sumofmasses;
83 for(i =0; i < numberOfDaughters; i++) {
84 sm[i] = rd[i]*tmas + temp;
85 temp -= masses[i];
87 G4cout << i <<
" random number:" << rd[i]
88 <<
" virtual mass:" <<
sm[i]/GeV <<
" GeV/c2" <<
G4endl;
89 }
90 }
91
92
93 weight = 1.0;
94 i = numberOfDaughters-1;
97 G4cout <<
" daughter " << i <<
": momentum "
98 << daughtermomentum[i]/GeV <<
" GeV/c" <<
G4endl;
99 }
100 for(i =numberOfDaughters-2; i>=0; i--) {
101
103 if(daughtermomentum[i] < 0.0) {
104
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;
112 }
113 return;
114 }
115
116
117 weight *= daughtermomentum[i]/
sm[i];
119 G4cout <<
" daughter " << i <<
": momentum "
120 << daughtermomentum[i]/GeV <<
" GeV/c" <<
G4endl;
121 }
122 }
125 }
126
127
128 if (numberOfTry++ > 100) {
130 G4cout <<
"G4HadPhaseSpaceNBodyAsai::Generate "
131 <<
" can not determine Decay Kinematics " <<
G4endl;
132 }
133 return;
134 }
136
138 G4cout <<
"Start calculation of daughters momentum vector "<<
G4endl;
139 }
140
142
143 finalState.resize(numberOfDaughters);
144
145 i = numberOfDaughters-2;
146
148
149 finalState[i].setVectM(direction, masses[i]);
150 finalState[i+1].setVectM(-direction, masses[i+1]);
151
152 for (i = numberOfDaughters-3; i >= 0; i--) {
154
155
156 finalState[i].setVectM(-daughtermomentum[i]*direction, masses[i]);
157
158
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);
163 }
164 }
165}
G4GLOB_DLL std::ostream G4cout
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