168{
169
170
171
172
173
175 fragmentVector->clear();
176
177
178
179
183 if (verboseLevel >= 2)
184 {
185 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
186 <<"oooooooooooooooooooooooooooooooooooooooo"
190 G4cout <<
"Initial prefragment A=" <<A
191 <<", Z=" <<Z
192 <<", excitation energy = " <<ex/MeV <<" MeV"
194 }
195
196
197
198
199
200
201 if (A == 0)
202 {
203 if (verboseLevel >= 2)
204 {
206 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
207 <<"oooooooooooooooooooooooooooooooooooooooo"
209 }
210 return fragmentVector;
211 }
212 else if (A == 1)
213 {
215 lorentzVector.
setE(lorentzVector.
e()-ex+10.0*eV);
216 if (Z == 0)
217 {
219 fragmentVector->push_back(fragment);
220 }
221 else
222 {
224 fragmentVector->push_back(fragment);
225 }
226 if (verboseLevel >= 2)
227 {
228 G4cout <<
"Final fragment is in fact only a nucleon) :" <<
G4endl;
230 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
231 <<"oooooooooooooooooooooooooooooooooooooooo"
233 }
234 return fragmentVector;
235 }
236
237
238
239
240
242 if (DAabl > A) DAabl = A;
243
244
245
246
247
248
249
250
251
252 G4int AF = A - DAabl;
254 if (AF > 0)
255 {
257 G4double R = 11.8 / std::pow(AFd, 0.45);
258 G4int minZ = Z - DAabl;
259 if (minZ <= 0) minZ = 1;
260
261
262
263
264
267 for (
G4int ii=minZ; ii<= Z; ii++)
268 {
269 sum += std::exp(-R*std::pow(std::abs(ii - 0.486*AFd + 3.8E-04*AFd*AFd),1.5));
270 sig[ii] = sum;
271 }
272
273
274
275
279 while (iz <= Z && !found)
280 {
281 found = (xi <= sig[iz]/sum);
282 if (!found) iz++;
283 }
284 if (iz > Z)
285 ZF = Z;
286 else
287 ZF = iz;
288 }
289 G4int DZabl = Z - ZF;
290
291
292
293
294
295
296
297
299 evapType.clear();
300 for (
G4int ift=0; ift<nFragTypes; ift++)
301 {
305 if (fragType[ift]->GetPDGCharge() > 0.0)
308 if (n > 0.0)
309 {
312 {
313 totalEpost += mass;
314 evapType.push_back(type);
315 }
318 }
319 }
320
321
322
323
324
325
326
327
329 if (AF > 0)
331 GetIonMass(ZF,AF);
332 else
333 {
337 evapType.erase(evapType.end()-1);
338 }
339 totalEpost += massFinalFrag;
340
341
342
343
344 if (verboseLevel >= 2)
345 {
346 G4cout <<
"Final fragment A=" <<AF
347 <<", Z=" <<ZF
349 for (
G4int ift=0; ift<nFragTypes; ift++)
350 {
352 G4int n = std::count(evapType.begin(),evapType.end(),type);
353 if (n > 0)
355 <<
", number of particles emitted = " <<
n <<
G4endl;
356 }
357 }
358
359
360
361
362
364 G4double totalEpre = massPreFrag + ex;
365 G4double excess = totalEpre - totalEpost;
366
370 if (produceSecondaries && evapType.size()>0)
371 {
372 if (excess > 0.0)
373 {
374 SelectSecondariesByEvaporation (resultNucleus);
375 nEvap = fragmentVector->size();
377 if (evapType.size() > 0)
378 SelectSecondariesByDefault (boost);
379 }
380 else
382 }
383
384 if (AF > 0)
385 {
387 GetIonMass(ZF,AF);
389 G4double p = std::sqrt(e*e-mass*mass);
392 lorentzVector.
boost(-boost);
394 fragmentVector->push_back(frag);
395 }
396 delete resultNucleus;
397
398
399
400
401 if (verboseLevel >= 2)
402 {
403 if (nEvap > 0)
404 {
408 }
410 G4FragmentVector::iterator iter;
411 for (iter = fragmentVector->begin(); iter != fragmentVector->end(); iter++)
412 {
413 if (ie == nEvap)
414 {
415
419 }
421 }
422 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
423 <<"oooooooooooooooooooooooooooooooooooooooo"
425 }
426
427 return fragmentVector;
428}
std::vector< G4Fragment * > G4FragmentVector
CLHEP::HepLorentzVector G4LorentzVector
CLHEP::Hep3Vector G4ThreeVector
G4DLLIMPORT std::ostream G4cout
HepLorentzVector & boost(double, double, double)
Hep3Vector findBoostToCM() const
G4double GetGroundStateMass() const
G4double GetExcitationEnergy() const
const G4LorentzVector & GetMomentum() const
G4double GetPDGMass() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
const G4String & GetParticleName() const
static G4ParticleTable * GetParticleTable()
G4IonTable * GetIonTable()