Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ExcitationHandler Class Reference

#include <G4ExcitationHandler.hh>

Public Member Functions

 G4ExcitationHandler ()
 
 ~G4ExcitationHandler ()
 
G4ReactionProductVectorBreakItUp (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)
 
G4VEvaporationGetEvaporation ()
 
G4VMultiFragmentationGetMultiFragmentation ()
 
G4VFermiBreakUpGetFermiModel ()
 
G4VEvaporationChannelSetPhotonEvaporation ()
 
void SetOPTxs (G4int opt)
 
void UseSICB ()
 

Detailed Description

Definition at line 63 of file G4ExcitationHandler.hh.

Constructor & Destructor Documentation

◆ G4ExcitationHandler()

G4ExcitationHandler::G4ExcitationHandler ( )

Definition at line 87 of file G4ExcitationHandler.cc.

87 :
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}
static G4FermiFragmentsPool * Instance()
static G4ParticleTable * GetParticleTable()
G4IonTable * GetIonTable()

◆ ~G4ExcitationHandler()

G4ExcitationHandler::~G4ExcitationHandler ( )

Definition at line 101 of file G4ExcitationHandler.cc.

102{
103 if(isEvapLocal) { delete theEvaporation; }
104 delete theMultiFragmentation;
105 delete theFermiModel;
106}

Member Function Documentation

◆ BreakItUp()

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

Definition at line 118 of file G4ExcitationHandler.cc.

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}
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
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 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
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
G4bool IsStable() const
G4double GetExcitationEnergy(void) const
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0

Referenced by G4WilsonAbrasionModel::ApplyYourself(), G4EMDissociation::ApplyYourself(), G4QMDReaction::ApplyYourself(), G4ParaFissionModel::ApplyYourself(), G4INCLXXInterface::ApplyYourself(), G4LowEIonFragmentation::ApplyYourself(), G4StopTheoDeexcitation::BreakUp(), and G4PreCompoundDeexcitation::deExcite().

◆ GetEvaporation()

G4VEvaporation * G4ExcitationHandler::GetEvaporation ( )
inline

Definition at line 132 of file G4ExcitationHandler.hh.

133{
134 return theEvaporation;
135}

◆ GetFermiModel()

G4VFermiBreakUp * G4ExcitationHandler::GetFermiModel ( )
inline

Definition at line 142 of file G4ExcitationHandler.hh.

143{
144 return theFermiModel;
145}

◆ GetMultiFragmentation()

G4VMultiFragmentation * G4ExcitationHandler::GetMultiFragmentation ( )
inline

Definition at line 137 of file G4ExcitationHandler.hh.

138{
139 return theMultiFragmentation;
140}

◆ SetEvaporation()

void G4ExcitationHandler::SetEvaporation ( G4VEvaporation ptr)

Definition at line 389 of file G4ExcitationHandler.cc.

390{
391 if(ptr && ptr != theEvaporation) {
392 delete theEvaporation;
393 theEvaporation = ptr;
394 thePhotonEvaporation = ptr->GetPhotonEvaporation();
395 SetParameters();
396 isEvapLocal = false;
397 }
398}
G4VEvaporationChannel * GetPhotonEvaporation()

Referenced by G4EMDissociation::G4EMDissociation(), G4QMDReaction::G4QMDReaction(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().

◆ SetFermiModel()

void G4ExcitationHandler::SetFermiModel ( G4VFermiBreakUp ptr)

Definition at line 409 of file G4ExcitationHandler.cc.

410{
411 if(ptr && ptr != theFermiModel) {
412 delete theFermiModel;
413 theFermiModel = ptr;
414 }
415}

Referenced by G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().

◆ SetMaxAandZForFermiBreakUp()

void G4ExcitationHandler::SetMaxAandZForFermiBreakUp ( G4int  anA,
G4int  aZ 
)

◆ SetMaxAForFermiBreakUp()

void G4ExcitationHandler::SetMaxAForFermiBreakUp ( G4int  anA)

Definition at line 431 of file G4ExcitationHandler.cc.

432{
433 maxAForFermiBreakUp = std::min(5,anA);
434}

Referenced by SetMaxAandZForFermiBreakUp().

◆ SetMaxZForFermiBreakUp()

void G4ExcitationHandler::SetMaxZForFermiBreakUp ( G4int  aZ)

Definition at line 426 of file G4ExcitationHandler.cc.

427{
428 maxZForFermiBreakUp = aZ;
429}

Referenced by SetMaxAandZForFermiBreakUp().

◆ SetMinEForMultiFrag()

void G4ExcitationHandler::SetMinEForMultiFrag ( G4double  anE)

◆ SetMultiFragmentation()

void G4ExcitationHandler::SetMultiFragmentation ( G4VMultiFragmentation ptr)

Definition at line 401 of file G4ExcitationHandler.cc.

402{
403 if(ptr && ptr != theMultiFragmentation) {
404 delete theMultiFragmentation;
405 theMultiFragmentation = ptr;
406 }
407}

Referenced by G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().

◆ SetOPTxs()

void G4ExcitationHandler::SetOPTxs ( G4int  opt)
inline

Definition at line 152 of file G4ExcitationHandler.hh.

153{
154 OPTxs = opt;
155 SetParameters();
156}

◆ SetPhotonEvaporation() [1/2]

G4VEvaporationChannel * G4ExcitationHandler::SetPhotonEvaporation ( )
inline

Definition at line 147 of file G4ExcitationHandler.hh.

148{
149 return thePhotonEvaporation;
150}

◆ SetPhotonEvaporation() [2/2]

void G4ExcitationHandler::SetPhotonEvaporation ( G4VEvaporationChannel ptr)

Definition at line 418 of file G4ExcitationHandler.cc.

419{
420 if(ptr && ptr != thePhotonEvaporation) {
421 thePhotonEvaporation = ptr;
422 theEvaporation->SetPhotonEvaporation(ptr);
423 }
424}
virtual void SetPhotonEvaporation(G4VEvaporationChannel *ptr)

◆ UseSICB()

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: