86 : maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),
87 fVerbose(0),isInitialised(false),isEvapLocal(true)
92 theMultiFragmentation =
nullptr;
93 theFermiModel =
nullptr;
97 theResults.reserve(60);
99 theEvapList.reserve(30);
100 thePhotoEvapList.reserve(10);
102 if(fVerbose > 0) {
G4cout <<
"### New handler " <<
this <<
G4endl; }
108 delete theMultiFragmentation;
109 delete theFermiModel;
110 if(isEvapLocal) {
delete theEvaporation; }
113 void G4ExcitationHandler::SetParameters()
125 if(isInitialised) {
return; }
127 G4cout <<
"G4ExcitationHandler::Initialise() started " <<
this <<
G4endl;
130 isInitialised =
true;
132 theMultiFragmentation =
new G4StatMF();
136 G4cout <<
"Number of de-excitation channels "
138 if(fVerbose > 0) {
G4cout <<
" " <<
this; }
145 if(ptr && ptr != theEvaporation) {
146 delete theEvaporation;
147 theEvaporation = ptr;
157 if(ptr && ptr != theMultiFragmentation) {
158 delete theMultiFragmentation;
159 theMultiFragmentation = ptr;
165 if(ptr && ptr != theFermiModel) {
166 delete theFermiModel;
175 if(ptr && ptr != thePhotonEvaporation) {
176 thePhotonEvaporation = ptr;
184 if(!evap) {
return; }
189 }
else if(val ==
fGEM) {
194 G4cout <<
"Number of de-excitation channels is changed to "
196 if(fVerbose > 0) {
G4cout <<
" " <<
this; }
207 G4cout <<
"@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@ " <<
G4endl;
216 thePhotoEvapList.clear();
226 theResults.push_back( theInitialStatePtr );
229 }
else if(exEnergy < minExcitation && nist->GetIsotopeAbundance(Z, A) > 0.0) {
230 theResults.push_back( theInitialStatePtr );
235 if((A<maxAForFermiBreakUp && Z<maxZForFermiBreakUp)
236 || exEnergy <= minEForMultiFrag*A) {
237 theEvapList.push_back(theInitialStatePtr);
241 theTempResult = theMultiFragmentation->
BreakItUp(theInitialState);
243 theEvapList.push_back(theInitialStatePtr);
245 size_t nsec = theTempResult->size();
249 theEvapList.push_back(theInitialStatePtr);
253 G4bool deletePrimary =
true;
254 G4FragmentVector::iterator j;
255 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) {
257 if((*j) == theInitialStatePtr) { deletePrimary =
false; }
258 A = (*j)->GetA_asInt();
262 theResults.push_back(*j);
266 G4double exEnergy1 = (*j)->GetExcitationEnergy();
269 if(exEnergy1 < minExcitation) {
270 Z = (*j)->GetZ_asInt();
272 theResults.push_back(*j);
274 theEvapList.push_back(*j);
278 theEvapList.push_back(*j);
282 if( deletePrimary ) {
delete theInitialStatePtr; }
284 delete theTempResult;
289 G4cout <<
"## After first step " << theEvapList.size() <<
" for evap; "
290 << thePhotoEvapList.size() <<
" for photo-evap; "
291 << theResults.size() <<
" results. " <<
G4endl;
297 static const G4int countmax = 1000;
300 for (kk=0; kk<theEvapList.size(); ++kk) {
301 frag = theEvapList[kk];
308 ed <<
"Infinite loop in the de-excitation module: " << kk
310 <<
" Initial fragment: \n" << theInitialState
311 <<
"\n Current fragment: \n" << *frag;
313 ed,
"Stop execution");
323 size_t nsec = results.size();
324 if(fVerbose > 2) {
G4cout <<
"FermiBreakUp Nsec= " << nsec <<
G4endl; }
328 for(
size_t j=0; j<nsec; ++j) {
329 exEnergy = results[j]->GetExcitationEnergy();
330 if(exEnergy < minExcitation) { theResults.push_back(results[j]); }
331 else { thePhotoEvapList.push_back(results[j]); }
337 size_t nsec = results.size();
338 if(fVerbose > 2) {
G4cout <<
"Evaporation Nsec= " << nsec <<
G4endl; }
342 theResults.push_back(frag);
347 for (
size_t j = 0; j<nsec; ++j) {
352 A = results[j]->GetA_asInt();
354 theResults.push_back(results[j]);
357 exEnergy = results[j]->GetExcitationEnergy();
360 if(exEnergy >= minExcitation) {
361 theEvapList.push_back(results[j]);
365 Z = results[j]->GetZ_asInt();
369 theResults.push_back(results[j]);
372 theEvapList.push_back(results[j]);
378 G4cout <<
"## After 2nd step " << theEvapList.size() <<
" was evap; "
379 << thePhotoEvapList.size() <<
" for photo-evap; "
380 << theResults.size() <<
" results. " <<
G4endl;
387 size_t kkmax = thePhotoEvapList.size();
388 for (kk=0; kk<kkmax; ++kk) {
389 frag = thePhotoEvapList[kk];
391 G4cout <<
"Next photon evaporate: " << thePhotonEvaporation <<
G4endl;
397 if(exEnergy > minExcitation) {
402 theResults.push_back(frag);
406 G4cout <<
"## After 3d step " << theEvapList.size() <<
" was evap; "
407 << thePhotoEvapList.size() <<
" was photo-evap; "
408 << theResults.size() <<
" results. " <<
G4endl;
415 theReactionProductVector->reserve( theResults.size() );
417 G4int theFragmentA, theFragmentZ;
420 G4cout <<
"### ExcitationHandler provides " << theResults.size()
421 <<
" evaporated products:" <<
G4endl;
423 kkmax = theResults.size();
424 for (kk=0; kk<kkmax; ++kk) {
425 frag = theResults[kk];
433 if (theFragmentA == 0) {
435 }
else if (theFragmentA == 1 && theFragmentZ == 0) {
437 }
else if (theFragmentA == 1 && theFragmentZ == 1) {
439 }
else if (theFragmentA == 2 && theFragmentZ == 1) {
441 }
else if (theFragmentA == 3 && theFragmentZ == 1) {
443 }
else if (theFragmentA == 3 && theFragmentZ == 2) {
445 }
else if (theFragmentA == 4 && theFragmentZ == 2) {
452 if(eexc < minExcitation) {
457 theKindOfFragment = theTableOfIons->
GetIon(theFragmentZ,theFragmentA,eexc,
460 G4cout <<
"### EXCH: Find ion Z= " << theFragmentZ <<
" A= " << theFragmentA
461 <<
" Eexc(MeV)= " << eexc/
MeV <<
" " << theKindOfFragment
466 if(theKindOfFragment) {
471 theReactionProductVector->push_back(theNew);
476 theTableOfIons->
GetIon(theFragmentZ,theFragmentA,0.0,
noFloat,0);
477 if(theKindOfFragment) {
480 if(etot <= ionmass) {
483 G4double ptot = std::sqrt((etot - ionmass)*(etot + ionmass));
490 theReactionProductVector->push_back(theNew);
492 G4cout <<
"### Find ion Z= " << theFragmentZ <<
" A= " << theFragmentA
493 <<
" ground state, energy corrected E(MeV)= " << etot <<
G4endl;
500 G4cout <<
"@@@@@@@@@@ End G4Excitation Handler "<<
G4endl;
502 return theReactionProductVector;
507 outFile <<
"G4ExcitationHandler description\n"
508 <<
"This class samples de-excitation of excited nucleus using\n"
509 <<
"Fermi Break-up model for light fragments (Z < 9, A < 17), "
510 <<
"evaporation, fission, and photo-evaporation models. Evaporated\n"
511 <<
"particle may be proton, neutron, and other light fragment \n"
512 <<
"(Z < 13, A < 29). During photon evaporation produced gamma \n"
513 <<
"or electrons due to internal conversion \n";
static G4Pow * GetInstance()
static G4Triton * TritonDefinition()
G4int GetFloatingLevelNumber() const
static G4He3 * He3Definition()
void ModelDescription(std::ostream &outFile) const
virtual void BreakFragment(G4FragmentVector *results, G4Fragment *theNucleus)=0
std::ostringstream G4ExceptionDescription
virtual G4bool BreakUpChain(G4FragmentVector *theResult, G4Fragment *theNucleus)
G4VEvaporationChannel * GetPhotonEvaporation()
void SetMomentum(const G4double x, const G4double y, const G4double z)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4Proton * ProtonDefinition()
virtual void BreakFragment(G4FragmentVector *, G4Fragment *theNucleus)
const G4ParticleDefinition * GetParticleDefinition() const
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
virtual G4bool IsApplicable(G4int Z, G4int A, G4double mass) const =0
static G4NistManager * Instance()
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState)
std::vector< G4ReactionProduct * > G4ReactionProductVector
G4IonTable * GetIonTable() const
static G4Ions::G4FloatLevelBase FloatLevelBase(char flbChar)
virtual void InitialiseChannels() final
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
G4double GetCreationTime() const
virtual void InitialiseChannels()
const G4LorentzVector & GetMomentum() const
void SetFermiModel(G4VFermiBreakUp *ptr)
void SetTotalEnergy(const G4double en)
size_t GetNumberOfChannels() const
std::vector< G4Fragment * > G4FragmentVector
G4DeexPrecoParameters * GetParameters()
void SetMultiFragmentation(G4VMultiFragmentation *ptr)
G4double GetIsotopeAbundance(G4int Z, G4int N) const
void SetEvaporation(G4VEvaporation *ptr, G4bool isLocal=false)
void SetFermiBreakUp(G4VFermiBreakUp *ptr)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
void SetCombinedChannel()
void SetDeexChannelsType(G4DeexChannelType val)
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
virtual void SetPhotonEvaporation(G4VEvaporationChannel *ptr)
G4double GetMinExPerNucleounForMF() const
static constexpr double MeV
void SetFormationTime(G4double aTime)
virtual void Initialise()=0
void SetPhotonEvaporation(G4VEvaporationChannel *ptr)
static G4Deuteron * DeuteronDefinition()
static G4Alpha * AlphaDefinition()
static G4Neutron * NeutronDefinition()
static G4NuclearLevelData * GetInstance()
G4double GetMinExcitation() const
G4double GetExcitationEnergy() const