Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions
G4ExcitationHandler Class Reference

#include <G4ExcitationHandler.hh>

Public Member Functions

 G4ExcitationHandler ()
 
 ~G4ExcitationHandler ()
 
G4ReactionProductVector * BreakItUp (const G4Fragment &theInitialState) const
 
void SetEvaporation (G4VEvaporation *ptr)
 
void SetMultiFragmentation (G4VMultiFragmentation *ptr)
 
void SetFermiModel (G4VFermiBreakUp *ptr)
 
void SetPhotonEvaporation (G4VEvaporationChannel *ptr)
 
void SetMaxZForFermiBreakUp (G4int aZ)
 
void SetMaxAForFermiBreakUp (G4int anA)
 
void SetMaxAandZForFermiBreakUp (G4int anA, G4int aZ)
 
void SetMinEForMultiFrag (G4double anE)
 
G4VEvaporation * GetEvaporation ()
 
G4VMultiFragmentation * GetMultiFragmentation ()
 
G4VFermiBreakUp * GetFermiModel ()
 
G4VEvaporationChannel * GetPhotonEvaporation ()
 
void SetOPTxs (G4int opt)
 
void UseSICB ()
 

Detailed Description

Definition at line 63 of file G4ExcitationHandler.hh.

Constructor & Destructor Documentation

G4ExcitationHandler::G4ExcitationHandler ( )

Definition at line 89 of file G4ExcitationHandler.cc.

References fDelayedEmission, G4Pow::GetInstance(), G4ParticleTable::GetIonTable(), G4ParticleTable::GetParticleTable(), and G4FermiFragmentsPool::Instance().

89  :
90  maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),minEForMultiFrag(4*GeV),
91  minExcitation(keV),OPTxs(3),useSICB(false),isEvapLocal(true)
92 {
93  theTableOfIons = G4ParticleTable::GetParticleTable()->GetIonTable();
94 
95  theMultiFragmentation = new G4StatMF;
96  theFermiModel = new G4FermiBreakUp;
97  thePhotonEvaporation = new G4PhotonEvaporation("ExcitationHandler",fDelayedEmission);
98  theEvaporation = new G4Evaporation(thePhotonEvaporation);
100  SetParameters();
102 }
static G4Pow * GetInstance()
Definition: G4Pow.cc:53
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
static G4FermiFragmentsPool * Instance()
G4ExcitationHandler::~G4ExcitationHandler ( )

Definition at line 104 of file G4ExcitationHandler.cc.

105 {
106  if(isEvapLocal) { delete theEvaporation; }
107  delete theMultiFragmentation;
108  delete theFermiModel;
109 }

Member Function Documentation

G4ReactionProductVector * G4ExcitationHandler::BreakItUp ( const G4Fragment &  theInitialState) const

Definition at line 121 of file G4ExcitationHandler.cc.

References G4Alpha::AlphaDefinition(), G4VFermiBreakUp::BreakItUp(), G4VMultiFragmentation::BreakItUp(), G4VEvaporation::BreakItUp(), G4VEvaporationChannel::BreakUpFragment(), G4Deuteron::DeuteronDefinition(), G4Fragment::GetA_asInt(), G4VFermiFragment::GetExcitationEnergy(), G4Ions::GetExcitationEnergy(), G4Fragment::GetExcitationEnergy(), G4FermiFragmentsPool::GetFragment(), G4IonTable::GetIon(), G4NistManager::GetIsotopeAbundance(), G4ParticleDefinition::GetPDGMass(), G4Fragment::GetZ_asInt(), G4He3::He3Definition(), G4NistManager::Instance(), G4VFermiFragment::IsStable(), G4Neutron::NeutronDefinition(), G4Proton::ProtonDefinition(), G4ReactionProduct::SetFormationTime(), G4ReactionProduct::SetMomentum(), G4ReactionProduct::SetTotalEnergy(), and G4Triton::TritonDefinition().

Referenced by G4ParaFissionModel::ApplyYourself(), G4LowEIonFragmentation::ApplyYourself(), G4QMDReaction::ApplyYourself(), G4WilsonAbrasionModel::ApplyYourself(), and G4PreCompoundDeexcitation::deExcite().

122 {
123  //G4cout << "@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@" << G4endl;
124 
125  // Variables existing until end of method
126  G4Fragment * theInitialStatePtr = new G4Fragment(theInitialState);
127 
128  // pointer to fragment vector which receives temporal results
129  G4FragmentVector * theTempResult = 0;
130 
131  // list of fragments to apply Evaporation or Fermi Break-Up
132  std::list<G4Fragment*> theEvapList;
133 
134  // list of fragments to apply PhotonEvaporation
135  std::list<G4Fragment*> thePhotoEvapList;
136 
137  // list of fragments to store final result
138  std::list<G4Fragment*> theResults;
139  //
140  //G4cout << theInitialState << G4endl;
141 
142  // Variables to describe the excited configuration
143  G4double exEnergy = theInitialState.GetExcitationEnergy();
144  G4int A = theInitialState.GetA_asInt();
145  G4int Z = theInitialState.GetZ_asInt();
146 
148 
149  // In case A <= 1 the fragment will not perform any nucleon emission
150  if (A <= 1)
151  {
152  theResults.push_back( theInitialStatePtr );
153  }
154  // check if a fragment is stable
155  else if(exEnergy < minExcitation && nist->GetIsotopeAbundance(Z, A) > 0.0)
156  {
157  theResults.push_back( theInitialStatePtr );
158  }
159  else
160  {
161  // JMQ 150909: first step in de-excitation is treated separately
162  // Fragments after the first step are stored in theEvapList
163  // Statistical Multifragmentation will take place only once
164  //
165  // move to evaporation loop
166  if((A<maxAForFermiBreakUp && Z<maxZForFermiBreakUp)
167  || exEnergy <= minEForMultiFrag*A)
168  {
169  theEvapList.push_back(theInitialStatePtr);
170  }
171  else
172  {
173  theTempResult = theMultiFragmentation->BreakItUp(theInitialState);
174  if(!theTempResult) { theEvapList.push_back(theInitialStatePtr); }
175  else {
176  size_t nsec = theTempResult->size();
177  if(0 == nsec) { theEvapList.push_back(theInitialStatePtr); }
178  else {
179  // secondary are produced
180  // Sort out secondary fragments
181  G4bool deletePrimary = true;
182  G4FragmentVector::iterator j;
183  for (j = theTempResult->begin(); j != theTempResult->end(); ++j) {
184  if((*j) == theInitialStatePtr) { deletePrimary = false; }
185  A = (*j)->GetA_asInt();
186 
187  // gamma, p, n
188  if(A <= 1) { theResults.push_back(*j); }
189 
190  // Analyse fragment A > 1
191  else {
192  G4double exEnergy1 = (*j)->GetExcitationEnergy();
193 
194  // cold fragments
195  if(exEnergy1 < minExcitation) {
196  Z = (*j)->GetZ_asInt();
197  if(nist->GetIsotopeAbundance(Z, A) > 0.0) {
198  theResults.push_back(*j); // stable fragment
199 
200  } else {
201 
202  // check if the cold fragment is from FBU pool
203  const G4VFermiFragment* ffrag = thePool->GetFragment(Z, A);
204  if(ffrag) {
205  if(ffrag->IsStable()) { theResults.push_back(*j); }
206  else { theEvapList.push_back(*j); }
207 
208  // cold fragment may be unstable
209  } else {
210  theEvapList.push_back(*j);
211  }
212  }
213 
214  // hot fragments are unstable
215  } else { theEvapList.push_back(*j); }
216  }
217  }
218  if( deletePrimary ) { delete theInitialStatePtr; }
219  }
220  delete theTempResult;
221  }
222  }
223  }
224  /*
225  G4cout << "## After first step " << theEvapList.size() << " for evap; "
226  << thePhotoEvapList.size() << " for photo-evap; "
227  << theResults.size() << " results. " << G4endl;
228  */
229  // -----------------------------------
230  // FermiBreakUp and De-excitation loop
231  // -----------------------------------
232 
233  std::list<G4Fragment*>::iterator iList;
234  for (iList = theEvapList.begin(); iList != theEvapList.end(); ++iList)
235  {
236  //G4cout << "Next evaporate: " << G4endl;
237  //G4cout << *iList << G4endl;
238  A = (*iList)->GetA_asInt();
239  Z = (*iList)->GetZ_asInt();
240 
241  // Fermi Break-Up
242  G4bool wasFBU = false;
243  if (A < maxAForFermiBreakUp && Z < maxZForFermiBreakUp)
244  {
245  theTempResult = theFermiModel->BreakItUp(*(*iList));
246  wasFBU = true;
247  // if initial fragment returned unchanged try to evaporate it
248  if(1 == theTempResult->size()) {
249  delete *(theTempResult->begin());
250  delete theTempResult;
251  theTempResult = theEvaporation->BreakItUp(*(*iList));
252  }
253  }
254  else // apply Evaporation in another case
255  {
256  theTempResult = theEvaporation->BreakItUp(*(*iList));
257  }
258 
259  G4bool deletePrimary = true;
260  size_t nsec = theTempResult->size();
261  //G4cout << "Nproducts= " << nsec << G4endl;
262 
263  // Sort out secondary fragments
264  if ( nsec > 0 ) {
265  G4FragmentVector::iterator j;
266  for (j = theTempResult->begin(); j != theTempResult->end(); ++j) {
267  if((*j) == (*iList)) { deletePrimary = false; }
268 
269  //G4cout << *j << G4endl;
270  A = (*j)->GetA_asInt();
271  exEnergy = (*j)->GetExcitationEnergy();
272 
273  if(A <= 1) { theResults.push_back(*j); } // gamma, p, n
274 
275  // evaporation is not possible
276  else if(1 == nsec) {
277  if(exEnergy < minExcitation) { theResults.push_back(*j); }
278  else { thePhotoEvapList.push_back(*j); }
279 
280  } else { // Analyse fragment
281 
282  // cold fragment
283  if(exEnergy < minExcitation) {
284  Z = (*j)->GetZ_asInt();
285 
286  // natural isotope
287  if(nist->GetIsotopeAbundance(Z, A) > 0.0) {
288  theResults.push_back(*j); // stable fragment
289 
290  } else {
291  const G4VFermiFragment* ffrag = thePool->GetFragment(Z, A);
292 
293  // isotope from FBU pool
294  if(ffrag) {
295  if(ffrag->IsStable()) { theResults.push_back(*j); }
296  else { theEvapList.push_back(*j); }
297 
298  // isotope may be unstable
299  } else {
300  theEvapList.push_back(*j);
301  }
302  }
303 
304  // hot fragment
305  } else if (wasFBU) {
306  thePhotoEvapList.push_back(*j); // FBU applied only once
307  } else {
308  theEvapList.push_back(*j);
309  }
310  }
311  }
312  }
313  if( deletePrimary ) { delete (*iList); }
314  delete theTempResult;
315  } // end of the loop over theEvapList
316 
317  //G4cout << "## After 2nd step " << theEvapList.size() << " was evap; "
318  // << thePhotoEvapList.size() << " for photo-evap; "
319  // << theResults.size() << " results. " << G4endl;
320 
321  // -----------------------
322  // Photon-Evaporation loop
323  // -----------------------
324 
325  // at this point only photon evaporation is possible
326  for(iList = thePhotoEvapList.begin(); iList != thePhotoEvapList.end(); ++iList)
327  {
328  //G4cout << "Next photon evaporate: " << thePhotonEvaporation << G4endl;
329  //G4cout << *iList << G4endl;
330  exEnergy = (*iList)->GetExcitationEnergy();
331 
332  // only hot fragments
333  if(exEnergy > minExcitation) {
334  theTempResult = thePhotonEvaporation->BreakUpFragment(*iList);
335  size_t nsec = theTempResult->size();
336  //G4cout << "Nproducts= " << nsec << G4endl;
337 
338  // if there is a gamma emission then
339  if (nsec > 0)
340  {
341  G4FragmentVector::iterator j;
342  for (j = theTempResult->begin(); j != theTempResult->end(); ++j)
343  {
344  theResults.push_back(*j);
345  }
346  }
347  delete theTempResult;
348  }
349 
350  // priamry fragment is kept
351  theResults.push_back(*iList);
352 
353  } // end of photon-evaporation loop
354 
355  //G4cout << "## After 3d step " << theEvapList.size() << " was evap; "
356  // << thePhotoEvapList.size() << " was photo-evap; "
357  // << theResults.size() << " results. " << G4endl;
358 
359  G4ReactionProductVector * theReactionProductVector =
361 
362  // MAC (24/07/08)
363  // To optimise the storing speed, we reserve space in memory for the vector
364  theReactionProductVector->reserve( theResults.size() );
365 
366  G4int theFragmentA, theFragmentZ;
367 
368  std::list<G4Fragment*>::iterator i;
369  for (i = theResults.begin(); i != theResults.end(); ++i)
370  {
371  theFragmentA = (*i)->GetA_asInt();
372  theFragmentZ = (*i)->GetZ_asInt();
373  G4double etot= (*i)->GetMomentum().e();
374  G4ParticleDefinition* theKindOfFragment = 0;
375  if (theFragmentA == 0) { // photon or e-
376  theKindOfFragment = (*i)->GetParticleDefinition();
377  } else if (theFragmentA == 1 && theFragmentZ == 0) { // neutron
378  theKindOfFragment = G4Neutron::NeutronDefinition();
379  } else if (theFragmentA == 1 && theFragmentZ == 1) { // proton
380  theKindOfFragment = G4Proton::ProtonDefinition();
381  } else if (theFragmentA == 2 && theFragmentZ == 1) { // deuteron
382  theKindOfFragment = G4Deuteron::DeuteronDefinition();
383  } else if (theFragmentA == 3 && theFragmentZ == 1) { // triton
384  theKindOfFragment = G4Triton::TritonDefinition();
385  } else if (theFragmentA == 3 && theFragmentZ == 2) { // helium3
386  theKindOfFragment = G4He3::He3Definition();
387  } else if (theFragmentA == 4 && theFragmentZ == 2) { // alpha
388  theKindOfFragment = G4Alpha::AlphaDefinition();;
389  } else {
390 
391  // ground state by default
392  G4double eexc = (*i)->GetExcitationEnergy();
393  G4double excitation = eexc;
394 
395  G4int level = 0;
396  theKindOfFragment =
397  theTableOfIons->GetIon(theFragmentZ,theFragmentA,level);
398  /*
399  G4cout << "### Find ion Z= " << theFragmentZ << " A= " << theFragmentA
400  << " Eexc(MeV)= " << excitation/MeV << " "
401  << theKindOfFragment << G4endl;
402  */
403  // production of an isomer
404  if(eexc > minExcitation) {
405  G4double elevel1 = 0.0;
406  G4double elevel2 = 0.0;
408  for(level=1; level<9; ++level) {
409  ion = theTableOfIons->GetIon(theFragmentZ,theFragmentA,level);
410  //G4cout << level << " " << ion << G4endl;
411  if(ion) {
412  G4Ions* ip = dynamic_cast<G4Ions*>(ion);
413  if(ip) {
414  elevel2 = ip->GetExcitationEnergy();
415  //G4cout<<" Level "<<level<<" E(MeV)= "<<elevel2/MeV<<G4endl;
416  // close level
417  if(std::fabs(eexc - elevel2) < minExcitation) {
418  excitation = eexc - elevel2;
419  theKindOfFragment = ion;
420  break;
421  // previous level was closer
422  } else if(elevel2 - eexc >= eexc - elevel1) {
423  excitation = eexc - elevel1;
424  break;
425  // will check next level and save current
426  } else {
427  theKindOfFragment = ion;
428  excitation = eexc - elevel2;
429  elevel1 = elevel2;
430  }
431  }
432  } else {
433  break;
434  }
435  }
436  }
437  // correction of total energy for ground state isotopes
438  etot += excitation;
439  G4double ionmass = theKindOfFragment->GetPDGMass();
440  if(etot < ionmass) { etot = ionmass; }
441  }
442  if (theKindOfFragment != 0)
443  {
444  G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment);
445  theNew->SetMomentum((*i)->GetMomentum().vect());
446  theNew->SetTotalEnergy(etot);
447  theNew->SetFormationTime((*i)->GetCreationTime());
448  theReactionProductVector->push_back(theNew);
449  }
450  delete (*i);
451  }
452 
453  return theReactionProductVector;
454 }
static G4Triton * TritonDefinition()
Definition: G4Triton.cc:90
static G4He3 * He3Definition()
Definition: G4He3.cc:89
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
G4double GetExcitationEnergy() const
Definition: G4Ions.hh:113
virtual G4FragmentVector * BreakUpFragment(G4Fragment *theNucleus)
void SetMomentum(const G4double x, const G4double y, const G4double z)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
Definition: G4IonTable.cc:449
static G4Proton * ProtonDefinition()
Definition: G4Proton.cc:88
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
G4bool IsStable() const
std::vector< G4ReactionProduct * > G4ReactionProductVector
G4int GetA_asInt() const
Definition: G4Fragment.hh:238
Definition: G4Ions.hh:51
bool G4bool
Definition: G4Types.hh:79
void SetTotalEnergy(const G4double en)
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:65
G4double GetIsotopeAbundance(G4int Z, G4int N) const
const G4VFermiFragment * GetFragment(G4int Z, G4int A)
G4double GetPDGMass() const
G4int GetZ_asInt() const
Definition: G4Fragment.hh:243
G4double GetExcitationEnergy(void) const
void SetFormationTime(G4double aTime)
double G4double
Definition: G4Types.hh:76
static G4Deuteron * DeuteronDefinition()
Definition: G4Deuteron.cc:89
static G4Alpha * AlphaDefinition()
Definition: G4Alpha.cc:84
static G4Neutron * NeutronDefinition()
Definition: G4Neutron.cc:99
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:255
G4VEvaporation * G4ExcitationHandler::GetEvaporation ( )
inline

Definition at line 132 of file G4ExcitationHandler.hh.

133 {
134  return theEvaporation;
135 }
G4VFermiBreakUp * G4ExcitationHandler::GetFermiModel ( )
inline

Definition at line 142 of file G4ExcitationHandler.hh.

143 {
144  return theFermiModel;
145 }
G4VMultiFragmentation * G4ExcitationHandler::GetMultiFragmentation ( )
inline

Definition at line 137 of file G4ExcitationHandler.hh.

138 {
139  return theMultiFragmentation;
140 }
G4VEvaporationChannel * G4ExcitationHandler::GetPhotonEvaporation ( )
inline

Definition at line 147 of file G4ExcitationHandler.hh.

148 {
149  return thePhotonEvaporation;
150 }
void G4ExcitationHandler::SetEvaporation ( G4VEvaporation *  ptr)

Definition at line 456 of file G4ExcitationHandler.cc.

References G4VEvaporation::GetPhotonEvaporation().

Referenced by B03PhysicsList::ConstructHad(), exrdmPhysListHadron::ConstructProcess(), G4EMDissociation::G4EMDissociation(), G4QMDReaction::G4QMDReaction(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().

457 {
458  if(ptr && ptr != theEvaporation) {
459  delete theEvaporation;
460  theEvaporation = ptr;
461  thePhotonEvaporation = ptr->GetPhotonEvaporation();
462  SetParameters();
463  isEvapLocal = false;
464  }
465 }
G4VEvaporationChannel * GetPhotonEvaporation()
void G4ExcitationHandler::SetFermiModel ( G4VFermiBreakUp *  ptr)

Definition at line 476 of file G4ExcitationHandler.cc.

Referenced by B03PhysicsList::ConstructHad(), exrdmPhysListHadron::ConstructProcess(), G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().

477 {
478  if(ptr && ptr != theFermiModel) {
479  delete theFermiModel;
480  theFermiModel = ptr;
481  }
482 }
void G4ExcitationHandler::SetMaxAandZForFermiBreakUp ( G4int  anA,
G4int  aZ 
)
void G4ExcitationHandler::SetMaxAForFermiBreakUp ( G4int  anA)

Definition at line 498 of file G4ExcitationHandler.cc.

Referenced by SetMaxAandZForFermiBreakUp().

499 {
500  maxAForFermiBreakUp = anA;
501 }
void G4ExcitationHandler::SetMaxZForFermiBreakUp ( G4int  aZ)

Definition at line 493 of file G4ExcitationHandler.cc.

Referenced by SetMaxAandZForFermiBreakUp().

494 {
495  maxZForFermiBreakUp = aZ;
496 }
void G4ExcitationHandler::SetMinEForMultiFrag ( G4double  anE)
void G4ExcitationHandler::SetMultiFragmentation ( G4VMultiFragmentation *  ptr)

Definition at line 468 of file G4ExcitationHandler.cc.

Referenced by B03PhysicsList::ConstructHad(), exrdmPhysListHadron::ConstructProcess(), G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().

469 {
470  if(ptr && ptr != theMultiFragmentation) {
471  delete theMultiFragmentation;
472  theMultiFragmentation = ptr;
473  }
474 }
void G4ExcitationHandler::SetOPTxs ( G4int  opt)
inline

Definition at line 152 of file G4ExcitationHandler.hh.

153 {
154  OPTxs = opt;
155  SetParameters();
156 }
void G4ExcitationHandler::SetPhotonEvaporation ( G4VEvaporationChannel *  ptr)

Definition at line 485 of file G4ExcitationHandler.cc.

References G4VEvaporation::SetPhotonEvaporation().

486 {
487  if(ptr && ptr != thePhotonEvaporation) {
488  thePhotonEvaporation = ptr;
489  theEvaporation->SetPhotonEvaporation(ptr);
490  }
491 }
virtual void SetPhotonEvaporation(G4VEvaporationChannel *ptr)
void G4ExcitationHandler::UseSICB ( )
inline

Definition at line 158 of file G4ExcitationHandler.hh.

159 {
160  useSICB = true;
161  SetParameters();
162 }

The documentation for this class was generated from the following files: