295 G4cout <<
"@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@ " <<
G4endl;
313 if (exEnergy >
A*maxExcitation &&
A > 0) {
317 ed <<
"High excitation Fragment Z= " << Z <<
" A= " <<
A
318 <<
" Eex/A(MeV)= " << exEnergy/
A;
329 if(
A >= 3 &&
A <= 5 && nL <= 2) {
331 if(3 ==
A && 1 == nL) {
333 }
else if(5 ==
A && 2 == Z && 1 == nL) {
336 if(1 == Z && 1 == nL) {
338 }
else if(2 == Z && 1 == nL) {
340 }
else if(0 == Z && 2 == nL) {
342 }
else if(1 == Z && 2 == nL) {
349 if(
nullptr != part) {
352 if ( lambdaLV.
vect().
mag() > CLHEP::eV ) {
356 G4double etot = std::max(lambdaLV.
e(), mass);
357 dir *= std::sqrt((etot - mass)*(etot + mass));
363 v->push_back(theNew);
369 lambdaF = nL*(fLambdaMass - CLHEP::neutron_mass_c2)/mass;
380 ed <<
"Fragment with negative L: Z=" << Z <<
" A=" <<
A <<
" L=" << nL
381 <<
" Eex/A(MeV)= " << exEnergy/
A;
387 if (
A <= 1 || !isActive) {
388 theResults.push_back( theInitialStatePtr );
391 }
else if (exEnergy < minExcitation && nist->GetIsotopeAbundance(Z,
A) > 0.0) {
392 theResults.push_back( theInitialStatePtr );
397 if ((
A<maxAForFermiBreakUp && Z<maxZForFermiBreakUp)
398 || exEnergy <= minEForMultiFrag*
A) {
399 theEvapList.push_back(theInitialStatePtr);
403 theTempResult = theMultiFragmentation->
BreakItUp(theInitialState);
404 if (
nullptr == theTempResult) {
405 theEvapList.push_back(theInitialStatePtr);
407 std::size_t nsec = theTempResult->size();
411 theEvapList.push_back(theInitialStatePtr);
415 G4bool deletePrimary =
true;
416 for (
auto const & ptr : *theTempResult) {
417 if (ptr == theInitialStatePtr) { deletePrimary =
false; }
418 SortSecondaryFragment(ptr);
420 if (deletePrimary) {
delete theInitialStatePtr; }
422 delete theTempResult;
427 G4cout <<
"## After first step of handler " << theEvapList.size()
429 << theResults.size() <<
" results. " <<
G4endl;
435 static const G4int countmax = 1000;
437 for (kk=0; kk<theEvapList.size(); ++kk) {
443 if (kk >= countmax) {
445 ed <<
"Infinite loop in the de-excitation module: " << kk
447 <<
" Initial fragment: \n" << theInitialState
448 <<
"\n Current fragment: \n" << *frag;
450 ed,
"Stop execution");
457 G4cout <<
"G4ExcitationHandler# " << kk <<
" Z= " << Z <<
" A= " <<
A
463 std::size_t nsec = results.size();
464 if (fVerbose > 2) {
G4cout <<
"FermiBreakUp Nsec= " << nsec <<
G4endl; }
469 for (
auto const & res : results) {
470 SortSecondaryFragment(res);
480 G4cout <<
"Evaporation Nsec= " << results.size() <<
G4endl;
482 if (0 == results.size()) {
483 theResults.push_back(frag);
485 SortSecondaryFragment(frag);
489 for (
auto const & res : results) {
493 SortSecondaryFragment(res);
497 G4cout <<
"## After 2nd step of handler " << theEvapList.size()
499 << theResults.size() <<
" results. " <<
G4endl;
507 theReactionProductVector->reserve( theResults.size() );
510 G4cout <<
"### ExcitationHandler provides " << theResults.size()
511 <<
" evaporated products:" <<
G4endl;
514 if ( nL > 0 ) partOfLambdaLV = lambdaLV/(
G4double)nL;
515 for (
auto const & frag : theResults) {
522 G4double mass = frag->GetGroundStateMass();
524 G4double fac = (etot <= mass || 0.0 == ptot) ? 0.0
525 : std::sqrt((etot - mass)*(etot + mass))/ptot;
527 (frag->GetMomentum()).py()*fac,
528 (frag->GetMomentum()).pz()*fac, etot);
529 frag->SetMomentum(lv);
533 if (frag->NuclearPolarization()) {
534 G4cout <<
" " << frag->NuclearPolarization();
539 G4int fragmentA = frag->GetA_asInt();
540 G4int fragmentZ = frag->GetZ_asInt();
544 if (fragmentA == 0) {
545 theKindOfFragment = frag->GetParticleDefinition();
546 }
else if (fragmentA == 1 && fragmentZ == 0) {
547 theKindOfFragment = theNeutron;
548 }
else if (fragmentA == 1 && fragmentZ == 1) {
549 theKindOfFragment = theProton;
550 }
else if (fragmentA == 2 && fragmentZ == 1) {
551 theKindOfFragment = theDeuteron;
552 }
else if (fragmentA == 3 && fragmentZ == 1) {
553 theKindOfFragment = theTriton;
557 theKindOfFragment = p;
562 }
else if (fragmentA == 3 && fragmentZ == 2) {
563 theKindOfFragment = theHe3;
564 }
else if (fragmentA == 4 && fragmentZ == 2) {
565 theKindOfFragment = theAlpha;
569 theKindOfFragment = p;
577 eexc = frag->GetExcitationEnergy();
578 G4int idxf = frag->GetFloatingLevelNumber();
579 if (eexc < minExcitation) {
584 theKindOfFragment = theTableOfIons->
GetIon(fragmentZ, fragmentA, eexc,
587 G4cout <<
"### EXCH: Find ion Z= " << fragmentZ
588 <<
" A= " << fragmentA
589 <<
" Eexc(MeV)= " << eexc/MeV <<
" idx= " << idxf
594 if (
nullptr != theKindOfFragment) {
600 etot = std::max(lv.
e(), mass);
601 G4double ptot = std::sqrt((etot - mass)*(etot + mass));
611 if (theKindOfFragment == theElectron) {
616 theReactionProductVector->push_back(theNew);
622 if (theKindOfFragment) {
625 if (etot <= ionmass) {
628 G4double ptot = std::sqrt((etot - ionmass)*(etot + ionmass));
629 mom = (frag->GetMomentum().vect().unit())*ptot;
636 theReactionProductVector->push_back(theNew);
638 G4cout <<
" ground state, energy corrected E(MeV)= "
649 if (lambdaLV.
vect().
mag() > CLHEP::eV) {
653 dir *= std::sqrt((etot - fLambdaMass)*(etot + fLambdaMass));
654 for (
G4int i=0; i<nL; ++i) {
660 theReactionProductVector->push_back(theNew);
664 G4cout <<
"@@@@@@@@@@ End G4Excitation Handler "<<
G4endl;
666 return theReactionProductVector;
G4ParticleDefinition * FindParticle(G4int PDGEncoding)