Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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