159{
160
161 if (fEmin >= fEmax) { return fEmin; }
162
163
164
172
173
174
176 Q0 = std::max(Q0, Q4);
177 if (Q1 > 0.0) { Q1 = std::max(Q1, Q4); }
178
179
182
183
184 if (p2 < 1.e-8*p1) {
185 p2 = 0.0;
186 p1 = (fE2 - fEmin)*Q0;
187 fE1 = fE2;
188 }
189
190
191 if (Q2 > 0.0 && fE2 < fEmax) {
192 E3 = fEmax - 0.5*(fEmax - fE2);
194 Q2 = std::max(Q2, Q3);
195 Q3 = std::max(Q3, Q4);
196 p3 = (E3 - fE2)*Q2;
197 p4 = (fEmax - E3)*Q3;
198 }
199
202 G4double del2 = (p2 > 0.0) ? (fE2 - fE1)/p2 : 0.0;
203 G4double del3 = (p3 > 0.0) ? (E3 - fE2)/p3 : 0.0;
204 G4double del4 = (p4 > 0.0) ? (fEmax - E3)/p4 : 0.0;
205
206 CLHEP::HepRandomEngine* rndm = G4Random::getTheEngine();
207 const G4int nmax = 100000;
209 for (
G4int n=0;
n < nmax; ++
n) {
213 if (p <= p1) {
214 gmax = Q0;
215 e = del1*p + fEmin;
216 } else if (p <= p1 + p2) {
217 gmax = Q1;
218 e = del2*(p - p1) + fE1;
219 idx = 1;
220 } else if (p <= p1 + p2 + p3) {
221 gmax = Q2;
222 e = del3*(p - p1 - p2) + fE2;
223 idx = 2;
224 } else {
225 gmax = Q3;
226 e = del4*(p - p1 - p2 - p3) + E3;
227 idx = 3;
228 }
230 if ((gg > gmax || n >= nmax) && fVerbose > 0) {
231 ++fnWarn;
232 if (fnWarn < fWarnLimit) {
234 <<
" in area=" << idx <<
" n=" <<
n <<
" gg/gmax=" << gg/gmax
235 <<
" prob=" << gg <<
" gmax=" << gmax <<
G4endl;
236 G4cout <<
" E=" << e <<
" Emin=" << fEmin <<
" Emax=" << fEmax
237 << " E1=" << fE1 << " E2=" << fE2 << " E3=" << E3
238 << " F0=" << Q0 << " F1=" << Q1 << " F2=" << Q2 << " F3=" << Q3
239 <<
" F4=" << Q4 <<
G4endl;
240 }
241 }
242 if (gmax*rndm->
flat() <= gg) {
243#ifdef G4VERBOSE
244 if (fVerbose > 1) {
246 <<
" E=" << e <<
" Ntry=" <<
n
247 <<
" Emin=" << fEmin <<
" Emax=" << fEmax <<
G4endl;
248 }
249#endif
250 return e;
251 }
252 }
253
254 e = fEmin + rndm->
flat()*(fE1 - fEmin);
255#ifdef G4VERBOSE
256 if (fVerbose > 1) {
258 << " E=" << e << " Ntry=" << nmax
259 <<
" Emin=" << fEmin <<
" Emax=" << fEmax <<
G4endl;
260 }
261#endif
262 return e;
263}
virtual const G4String & ModelName() const