Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4ExcitationHandler.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27//
28// Hadronic Process: Nuclear De-excitations
29// by V. Lara (May 1998)
30//
31//
32// Modified:
33// 30 June 1998 by V. Lara:
34// -Modified the Transform method for use G4ParticleTable and
35// therefore G4IonTable. It makes possible to convert all kind
36// of fragments (G4Fragment) produced in deexcitation to
37// G4DynamicParticle
38// -It uses default algorithms for:
39// Evaporation: G4Evaporation
40// MultiFragmentation: G4StatMF
41// Fermi Breakup model: G4FermiBreakUp
42// 24 Jul 2008 by M. A. Cortes Giraldo:
43// -Max Z,A for Fermi Break-Up turns to 9,17 by default
44// -BreakItUp() reorganised and bug in Evaporation loop fixed
45// -Transform() optimised
46// (September 2008) by J. M. Quesada. External choices have been added for :
47// -inverse cross section option (default OPTxs=3)
48// -superimposed Coulomb barrier (if useSICB is set true, by default it is false)
49// September 2009 by J. M. Quesada:
50// -according to Igor Pshenichnov, SMM will be applied (just in case) only once.
51// 27 Nov 2009 by V.Ivanchenko:
52// -cleanup the logic, reduce number internal vectors, fixed memory leak.
53// 11 May 2010 by V.Ivanchenko:
54// -FermiBreakUp activated, used integer Z and A, used BreakUpFragment method for
55// final photon deexcitation; used check on adundance of a fragment, decay
56// unstable fragments with A <5
57// 22 March 2011 by V.Ivanchenko: general cleanup and addition of a condition:
58// products of Fermi Break Up cannot be further deexcited by this model
59// 30 March 2011 by V.Ivanchenko removed private inline methods, moved Set methods
60// to the source
61// 23 January 2012 by V.Ivanchenko general cleanup including destruction of
62// objects, propagate G4PhotonEvaporation pointer to G4Evaporation class and
63// not delete it here
64
65#include <list>
66
68#include "G4SystemOfUnits.hh"
69#include "G4LorentzVector.hh"
70#include "G4NistManager.hh"
71#include "G4ParticleTable.hh"
72#include "G4ParticleTypes.hh"
73
75#include "G4VFermiBreakUp.hh"
76#include "G4VFermiFragment.hh"
77
78#include "G4VEvaporation.hh"
81#include "G4Evaporation.hh"
82#include "G4StatMF.hh"
84#include "G4FermiBreakUp.hh"
86
88 maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),minEForMultiFrag(4*GeV),
89 minExcitation(keV),OPTxs(3),useSICB(false),isEvapLocal(true)
90{
92
93 theMultiFragmentation = new G4StatMF;
94 theFermiModel = new G4FermiBreakUp;
95 thePhotonEvaporation = new G4PhotonEvaporation;
96 theEvaporation = new G4Evaporation(thePhotonEvaporation);
98 SetParameters();
99}
100
102{
103 if(isEvapLocal) { delete theEvaporation; }
104 delete theMultiFragmentation;
105 delete theFermiModel;
106}
107
108void G4ExcitationHandler::SetParameters()
109{
110 //for inverse cross section choice
111 theEvaporation->SetOPTxs(OPTxs);
112 //for the choice of superimposed Coulomb Barrier for inverse cross sections
113 theEvaporation->UseSICB(useSICB);
114 theEvaporation->Initialise();
115}
116
118G4ExcitationHandler::BreakItUp(const G4Fragment & theInitialState) const
119{
120 //G4cout << "@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@" << G4endl;
121
122 // Variables existing until end of method
123 G4Fragment * theInitialStatePtr = new G4Fragment(theInitialState);
124
125 G4FragmentVector * theTempResult = 0; // pointer which receives temporal results
126 std::list<G4Fragment*> theEvapList; // list to apply Evaporation or Fermi Break-Up
127 std::list<G4Fragment*> thePhotoEvapList; // list to apply PhotonEvaporation
128 std::list<G4Fragment*> theResults; // list to store final result
129 //
130 //G4cout << theInitialState << G4endl;
131
132 // Variables to describe the excited configuration
133 G4double exEnergy = theInitialState.GetExcitationEnergy();
134 G4int A = theInitialState.GetA_asInt();
135 G4int Z = theInitialState.GetZ_asInt();
136
138
139 // In case A <= 1 the fragment will not perform any nucleon emission
140 if (A <= 1)
141 {
142 theResults.push_back( theInitialStatePtr );
143 }
144 // check if a fragment is stable
145 else if(exEnergy < minExcitation && nist->GetIsotopeAbundance(Z, A) > 0.0)
146 {
147 theResults.push_back( theInitialStatePtr );
148 }
149 else
150 {
151 // JMQ 150909: first step in de-excitation is treated separately
152 // Fragments after the first step are stored in theEvapList
153 // Statistical Multifragmentation will take place only once
154 //
155 // move to evaporation loop
156 if((A<maxAForFermiBreakUp && Z<maxZForFermiBreakUp)
157 || exEnergy <= minEForMultiFrag*A)
158 {
159 theEvapList.push_back(theInitialStatePtr);
160 }
161 else
162 {
163 theTempResult = theMultiFragmentation->BreakItUp(theInitialState);
164 if(!theTempResult) { theEvapList.push_back(theInitialStatePtr); }
165 else {
166 size_t nsec = theTempResult->size();
167 if(0 == nsec) { theEvapList.push_back(theInitialStatePtr); }
168 else {
169 // secondary are produced
170 // Sort out secondary fragments
171 G4bool deletePrimary = true;
172 G4FragmentVector::iterator j;
173 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) {
174 if((*j) == theInitialStatePtr) { deletePrimary = false; }
175 A = (*j)->GetA_asInt();
176
177 // gamma, p, n
178 if(A <= 1) { theResults.push_back(*j); }
179
180 // Analyse fragment A > 1
181 else {
182 G4double exEnergy1 = (*j)->GetExcitationEnergy();
183
184 // cold fragments
185 if(exEnergy1 < minExcitation) {
186 Z = (*j)->GetZ_asInt();
187 if(nist->GetIsotopeAbundance(Z, A) > 0.0) {
188 theResults.push_back(*j); // stable fragment
189
190 } else {
191
192 // check if the cold fragment is from FBU pool
193 const G4VFermiFragment* ffrag = thePool->GetFragment(Z, A);
194 if(ffrag) {
195 if(ffrag->IsStable()) { theResults.push_back(*j); }
196 else { theEvapList.push_back(*j); }
197
198 // cold fragment may be unstable
199 } else {
200 theEvapList.push_back(*j);
201 }
202 }
203
204 // hot fragments are unstable
205 } else { theEvapList.push_back(*j); }
206 }
207 }
208 if( deletePrimary ) { delete theInitialStatePtr; }
209 }
210 delete theTempResult;
211 }
212 }
213 }
214 /*
215 G4cout << "## After first step " << theEvapList.size() << " for evap; "
216 << thePhotoEvapList.size() << " for photo-evap; "
217 << theResults.size() << " results. " << G4endl;
218 */
219 // -----------------------------------
220 // FermiBreakUp and De-excitation loop
221 // -----------------------------------
222
223 std::list<G4Fragment*>::iterator iList;
224 for (iList = theEvapList.begin(); iList != theEvapList.end(); ++iList)
225 {
226 //G4cout << "Next evaporate: " << G4endl;
227 //G4cout << *iList << G4endl;
228 A = (*iList)->GetA_asInt();
229 Z = (*iList)->GetZ_asInt();
230
231 // Fermi Break-Up
232 G4bool wasFBU = false;
233 if (A < maxAForFermiBreakUp && Z < maxZForFermiBreakUp)
234 {
235 theTempResult = theFermiModel->BreakItUp(*(*iList));
236 wasFBU = true;
237 }
238 else // apply Evaporation in another case
239 {
240 theTempResult = theEvaporation->BreakItUp(*(*iList));
241 }
242
243 G4bool deletePrimary = true;
244 size_t nsec = theTempResult->size();
245 //G4cout << "Nproducts= " << nsec << G4endl;
246
247 // Sort out secondary fragments
248 if ( nsec > 0 ) {
249 G4FragmentVector::iterator j;
250 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) {
251 if((*j) == (*iList)) { deletePrimary = false; }
252
253 //G4cout << *j << G4endl;
254 A = (*j)->GetA_asInt();
255 exEnergy = (*j)->GetExcitationEnergy();
256
257 if(A <= 1) { theResults.push_back(*j); } // gamma, p, n
258
259 // evaporation is not possible
260 else if(1 == nsec) {
261 if(exEnergy < minExcitation) { theResults.push_back(*j); }
262 else { thePhotoEvapList.push_back(*j); }
263
264 } else { // Analyse fragment
265
266 // cold fragment
267 if(exEnergy < minExcitation) {
268 Z = (*j)->GetZ_asInt();
269
270 // natural isotope
271 if(nist->GetIsotopeAbundance(Z, A) > 0.0) {
272 theResults.push_back(*j); // stable fragment
273
274 } else {
275 const G4VFermiFragment* ffrag = thePool->GetFragment(Z, A);
276
277 // isotope from FBU pool
278 if(ffrag) {
279 if(ffrag->IsStable()) { theResults.push_back(*j); }
280 else { theEvapList.push_back(*j); }
281
282 // isotope may be unstable
283 } else {
284 theEvapList.push_back(*j);
285 }
286 }
287
288 // hot fragment
289 } else if (wasFBU) {
290 thePhotoEvapList.push_back(*j); // FBU applied only once
291 } else {
292 theEvapList.push_back(*j);
293 }
294 }
295 }
296 }
297 if( deletePrimary ) { delete (*iList); }
298 delete theTempResult;
299 } // end of the loop over theEvapList
300
301 //G4cout << "## After 2nd step " << theEvapList.size() << " was evap; "
302 // << thePhotoEvapList.size() << " for photo-evap; "
303 // << theResults.size() << " results. " << G4endl;
304
305 // -----------------------
306 // Photon-Evaporation loop
307 // -----------------------
308
309 // at this point only photon evaporation is possible
310 for(iList = thePhotoEvapList.begin(); iList != thePhotoEvapList.end(); ++iList)
311 {
312 //G4cout << "Next photon evaporate: " << thePhotonEvaporation << G4endl;
313 //G4cout << *iList << G4endl;
314 exEnergy = (*iList)->GetExcitationEnergy();
315
316 // only hot fragments
317 if(exEnergy >= minExcitation) {
318 theTempResult = thePhotonEvaporation->BreakUpFragment(*iList);
319 size_t nsec = theTempResult->size();
320 //G4cout << "Nproducts= " << nsec << G4endl;
321
322 // if there is a gamma emission then
323 if (nsec > 0)
324 {
325 G4FragmentVector::iterator j;
326 for (j = theTempResult->begin(); j != theTempResult->end(); ++j)
327 {
328 theResults.push_back(*j);
329 }
330 }
331 delete theTempResult;
332 }
333
334 // priamry fragment is kept
335 theResults.push_back(*iList);
336
337 } // end of photon-evaporation loop
338
339 //G4cout << "## After 3d step " << theEvapList.size() << " was evap; "
340 // << thePhotoEvapList.size() << " was photo-evap; "
341 // << theResults.size() << " results. " << G4endl;
342
343 G4ReactionProductVector * theReactionProductVector = new G4ReactionProductVector;
344
345 // MAC (24/07/08)
346 // To optimise the storing speed, we reserve space in memory for the vector
347 theReactionProductVector->reserve( theResults.size() );
348
349 G4int theFragmentA, theFragmentZ;
350
351 std::list<G4Fragment*>::iterator i;
352 for (i = theResults.begin(); i != theResults.end(); ++i)
353 {
354 theFragmentA = (*i)->GetA_asInt();
355 theFragmentZ = (*i)->GetZ_asInt();
356 G4ParticleDefinition* theKindOfFragment = 0;
357 if (theFragmentA == 0) { // photon or e-
358 theKindOfFragment = (*i)->GetParticleDefinition();
359 } else if (theFragmentA == 1 && theFragmentZ == 0) { // neutron
360 theKindOfFragment = G4Neutron::NeutronDefinition();
361 } else if (theFragmentA == 1 && theFragmentZ == 1) { // proton
362 theKindOfFragment = G4Proton::ProtonDefinition();
363 } else if (theFragmentA == 2 && theFragmentZ == 1) { // deuteron
364 theKindOfFragment = G4Deuteron::DeuteronDefinition();
365 } else if (theFragmentA == 3 && theFragmentZ == 1) { // triton
366 theKindOfFragment = G4Triton::TritonDefinition();
367 } else if (theFragmentA == 3 && theFragmentZ == 2) { // helium3
368 theKindOfFragment = G4He3::He3Definition();
369 } else if (theFragmentA == 4 && theFragmentZ == 2) { // alpha
370 theKindOfFragment = G4Alpha::AlphaDefinition();;
371 } else {
372 theKindOfFragment =
373 theTableOfIons->GetIon(theFragmentZ,theFragmentA,0.0);
374 }
375 if (theKindOfFragment != 0)
376 {
377 G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment);
378 theNew->SetMomentum((*i)->GetMomentum().vect());
379 theNew->SetTotalEnergy((*i)->GetMomentum().e());
380 theNew->SetFormationTime((*i)->GetCreationTime());
381 theReactionProductVector->push_back(theNew);
382 }
383 delete (*i);
384 }
385
386 return theReactionProductVector;
387}
388
390{
391 if(ptr && ptr != theEvaporation) {
392 delete theEvaporation;
393 theEvaporation = ptr;
394 thePhotonEvaporation = ptr->GetPhotonEvaporation();
395 SetParameters();
396 isEvapLocal = false;
397 }
398}
399
400void
402{
403 if(ptr && ptr != theMultiFragmentation) {
404 delete theMultiFragmentation;
405 theMultiFragmentation = ptr;
406 }
407}
408
410{
411 if(ptr && ptr != theFermiModel) {
412 delete theFermiModel;
413 theFermiModel = ptr;
414 }
415}
416
417void
419{
420 if(ptr && ptr != thePhotonEvaporation) {
421 thePhotonEvaporation = ptr;
422 theEvaporation->SetPhotonEvaporation(ptr);
423 }
424}
425
427{
428 maxZForFermiBreakUp = aZ;
429}
430
432{
433 maxAForFermiBreakUp = std::min(5,anA);
434}
435
437{
440}
441
443{
444 minEForMultiFrag = anE;
445}
446
447
448
449
450
451
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:65
std::vector< G4ReactionProduct * > G4ReactionProductVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
static G4Alpha * AlphaDefinition()
Definition: G4Alpha.cc:84
static G4Deuteron * DeuteronDefinition()
Definition: G4Deuteron.cc:89
void SetMaxAandZForFermiBreakUp(G4int anA, G4int aZ)
G4VEvaporationChannel * SetPhotonEvaporation()
void SetEvaporation(G4VEvaporation *ptr)
void SetFermiModel(G4VFermiBreakUp *ptr)
void SetMaxZForFermiBreakUp(G4int aZ)
void SetMaxAForFermiBreakUp(G4int anA)
void SetMultiFragmentation(G4VMultiFragmentation *ptr)
void SetMinEForMultiFrag(G4double anE)
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState) const
static G4FermiFragmentsPool * Instance()
const G4VFermiFragment * GetFragment(G4int Z, G4int A)
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:235
G4int GetZ_asInt() const
Definition: G4Fragment.hh:223
G4int GetA_asInt() const
Definition: G4Fragment.hh:218
static G4He3 * He3Definition()
Definition: G4He3.cc:89
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int J=0)
Definition: G4IonTable.cc:267
static G4Neutron * NeutronDefinition()
Definition: G4Neutron.cc:99
static G4NistManager * Instance()
G4double GetIsotopeAbundance(G4int Z, G4int N) const
static G4ParticleTable * GetParticleTable()
G4IonTable * GetIonTable()
static G4Proton * ProtonDefinition()
Definition: G4Proton.cc:88
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)
void SetFormationTime(G4double aTime)
static G4Triton * TritonDefinition()
Definition: G4Triton.cc:90
virtual G4FragmentVector * BreakUpFragment(G4Fragment *theNucleus)
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
G4VEvaporationChannel * GetPhotonEvaporation()
void SetOPTxs(G4int opt)
void UseSICB(G4bool use)
virtual void SetPhotonEvaporation(G4VEvaporationChannel *ptr)
virtual void Initialise()
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
G4bool IsStable() const
G4double GetExcitationEnergy(void) const
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0