308 G4cout <<
"@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@ " <<
G4endl;
328 if(
A >= 3 &&
A <= 5 && nL <= 2) {
330 if(3 ==
A && 1 == nL) {
332 }
else if(5 ==
A && 2 == Z && 1 == nL) {
335 if(1 == Z && 1 == nL) {
337 }
else if(2 == Z && 1 == nL) {
339 }
else if(0 == Z && 2 == nL) {
341 }
else if(1 == Z && 2 == nL) {
348 if(
nullptr != part) {
351 if ( lambdaLV.
vect().
mag() > CLHEP::eV ) {
355 G4double etot = std::max(lambdaLV.
e(), mass);
356 dir *= std::sqrt((etot - mass)*(etot + mass));
362 v->push_back(theNew);
368 lambdaF = nL*(fLambdaMass - CLHEP::neutron_mass_c2)/mass;
379 ed <<
"Fragment with negative L: Z=" << Z <<
" A=" <<
A <<
" L=" << nL
380 <<
" Eex/A(MeV)= " << exEnergy/
A;
387 theResults.push_back( theInitialStatePtr );
390 }
else if (exEnergy < minExcitation && nist->GetIsotopeAbundance(Z,
A) > 0.0) {
391 theResults.push_back( theInitialStatePtr );
396 theEvapList.push_back(theInitialStatePtr);
399 G4cout <<
"## After first step of handler " << theEvapList.size()
401 << theResults.size() <<
" results. " <<
G4endl;
407 static const G4int countmax = 1000;
409 for (kk=0; kk<theEvapList.size(); ++kk) {
415 if (kk >= countmax) {
417 ed <<
"Infinite loop in the de-excitation module: " << kk
419 <<
" Initial fragment: \n" << theInitialState
420 <<
"\n Current fragment: \n" << *frag;
422 ed,
"Stop execution");
429 G4cout <<
"G4ExcitationHandler# " << kk <<
" Z= " << Z <<
" A= " <<
A
434 theFermiModel->BreakFragment(&results, frag);
435 std::size_t nsec = results.size();
436 if (fVerbose > 2) {
G4cout <<
"FermiBreakUp Nsec= " << nsec <<
G4endl; }
441 for (
auto const & res : results) {
442 SortSecondaryFragment(res);
450 theEvaporation->BreakFragment(&results, frag);
452 G4cout << kk <<
". Evaporation: Nsec=" << results.size()
459 if (0 == results.size()) {
460 theResults.push_back(frag);
462 SortSecondaryFragment(frag);
466 for (
auto const & res : results) {
470 SortSecondaryFragment(res);
474 G4cout <<
"## After 2nd step of handler " << theEvapList.size()
476 << theResults.size() <<
" results. " <<
G4endl;
483 theReactionProductVector->reserve(theResults.size());
486 G4cout <<
"### ExcitationHandler provides " << theResults.size()
487 <<
" evaporated products:" <<
G4endl;
490 if ( nL > 0 ) partOfLambdaLV = lambdaLV/(
G4double)nL;
491 for (
auto const & frag : theResults) {
498 G4double mass = frag->GetGroundStateMass();
500 G4double fac = (etot <= mass || 0.0 == ptot) ? 0.0
501 : std::sqrt((etot - mass)*(etot + mass))/ptot;
503 (frag->GetMomentum()).py()*fac,
504 (frag->GetMomentum()).pz()*fac, etot);
505 frag->SetMomentum(lv);
509 if (frag->NuclearPolarization()) {
510 G4cout <<
" " << frag->NuclearPolarization();
515 G4int fragmentA = frag->GetA_asInt();
516 G4int fragmentZ = frag->GetZ_asInt();
520 if (fragmentA == 0) {
521 theKindOfFragment = frag->GetParticleDefinition();
522 }
else if (fragmentA == 1 && fragmentZ == 0) {
523 theKindOfFragment = theNeutron;
524 }
else if (fragmentA == 1 && fragmentZ == 1) {
525 theKindOfFragment = theProton;
526 }
else if (fragmentA == 2 && fragmentZ == 1) {
527 theKindOfFragment = theDeuteron;
528 }
else if (fragmentA == 3 && fragmentZ == 1) {
529 theKindOfFragment = theTriton;
533 theKindOfFragment = p;
538 }
else if (fragmentA == 3 && fragmentZ == 2) {
539 theKindOfFragment = theHe3;
540 }
else if (fragmentA == 4 && fragmentZ == 2) {
541 theKindOfFragment = theAlpha;
545 theKindOfFragment = p;
553 eexc = frag->GetExcitationEnergy();
554 G4int idxf = frag->GetFloatingLevelNumber();
555 if (eexc < minExcitation) {
560 theKindOfFragment = theTableOfIons->GetIon(fragmentZ, fragmentA, eexc,
563 G4cout <<
"### EXCH: Find ion Z= " << fragmentZ
564 <<
" A= " << fragmentA
565 <<
" Eexc(MeV)= " << eexc/MeV <<
" idx= " << idxf
571 if (
nullptr != theKindOfFragment) {
577 etot = std::max(lv.
e(), mass);
578 G4double ptot = std::sqrt((etot - mass)*(etot + mass));
589 theReactionProductVector->push_back(theNew);
594 theTableOfIons->GetIon(fragmentZ,fragmentA,0.0,
noFloat,0);
595 if (theKindOfFragment) {
598 if (etot <= ionmass) {
601 G4double ptot = std::sqrt((etot - ionmass)*(etot + ionmass));
602 mom = (frag->GetMomentum().vect().unit())*ptot;
609 theReactionProductVector->push_back(theNew);
611 G4cout <<
" ground state, energy corrected E(MeV)= "
622 if (lambdaLV.
vect().
mag() > CLHEP::eV) {
626 dir *= std::sqrt((etot - fLambdaMass)*(etot + fLambdaMass));
627 for (
G4int i=0; i<nL; ++i) {
633 theReactionProductVector->push_back(theNew);
637 G4cout <<
"@@@@@@@@@@ End G4Excitation Handler "<<
G4endl;
639 return theReactionProductVector;
static G4ParticleTable * GetParticleTable()