Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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// Hadronic Process: Nuclear De-excitations
27// by V. Lara (May 1998)
28//
29//
30// Modified:
31// 30 June 1998 by V. Lara:
32// -Modified the Transform method for use G4ParticleTable and
33// therefore G4IonTable. It makes possible to convert all kind
34// of fragments (G4Fragment) produced in deexcitation to
35// G4DynamicParticle
36// -It uses default algorithms for:
37// Evaporation: G4Evaporation
38// MultiFragmentation: G4StatMF
39// Fermi Breakup model: G4FermiBreakUp
40// 24 Jul 2008 by M. A. Cortes Giraldo:
41// -Max Z,A for Fermi Break-Up turns to 9,17 by default
42// -BreakItUp() reorganised and bug in Evaporation loop fixed
43// -Transform() optimised
44// (September 2008) by J. M. Quesada. External choices have been added for :
45// -inverse cross section option (default OPTxs=3)
46// -superimposed Coulomb barrier (if useSICB is set true, by default it is false)
47// September 2009 by J. M. Quesada:
48// -according to Igor Pshenichnov, SMM will be applied (just in case) only once.
49// 27 Nov 2009 by V.Ivanchenko:
50// -cleanup the logic, reduce number internal vectors, fixed memory leak.
51// 11 May 2010 by V.Ivanchenko:
52// -FermiBreakUp activated, used integer Z and A, used BreakUpFragment method for
53// final photon deexcitation; used check on adundance of a fragment, decay
54// unstable fragments with A <5
55// 22 March 2011 by V.Ivanchenko: general cleanup and addition of a condition:
56// products of Fermi Break Up cannot be further deexcited by this model
57// 30 March 2011 by V.Ivanchenko removed private inline methods, moved Set methods
58// to the source
59// 23 January 2012 by V.Ivanchenko general cleanup including destruction of
60// objects, propagate G4PhotonEvaporation pointer to G4Evaporation class and
61// not delete it here
62
64#include "G4SystemOfUnits.hh"
65#include "G4LorentzVector.hh"
66#include "G4ThreeVector.hh"
67#include "G4ParticleTable.hh"
68#include "G4ParticleTypes.hh"
69#include "G4Ions.hh"
70#include "G4Electron.hh"
71#include "G4Lambda.hh"
72
74#include "G4VFermiBreakUp.hh"
75#include "G4Element.hh"
76#include "G4ElementTable.hh"
77
78#include "G4VEvaporation.hh"
80#include "G4Evaporation.hh"
82#include "G4StatMF.hh"
83#include "G4FermiBreakUpVI.hh"
84#include "G4NuclearLevelData.hh"
85#include "G4Pow.hh"
87
89 : icID(0),maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),
90 fVerbose(1),fWarnings(0),minEForMultiFrag(1.*CLHEP::TeV),
91 minExcitation(1.*CLHEP::eV),maxExcitation(100.*CLHEP::MeV),
92 isInitialised(false),isEvapLocal(true),isActive(true)
93{
94 thePartTable = G4ParticleTable::GetParticleTable();
95 theTableOfIons = thePartTable->GetIonTable();
97
98 theMultiFragmentation = nullptr;
99 theFermiModel = nullptr;
100 theEvaporation = nullptr;
101 thePhotonEvaporation = nullptr;
102 theResults.reserve(60);
103 results.reserve(30);
104 theEvapList.reserve(30);
105
107 theElectron = G4Electron::Electron();
108 theNeutron = G4Neutron::NeutronDefinition();
109 theProton = G4Proton::ProtonDefinition();
110 theDeuteron = G4Deuteron::DeuteronDefinition();
111 theTriton = G4Triton::TritonDefinition();
112 theHe3 = G4He3::He3Definition();
113 theAlpha = G4Alpha::AlphaDefinition();
114 theLambda = G4Lambda::Lambda();
115
116 fLambdaMass = theLambda->GetPDGMass();
117
118 if(fVerbose > 1) { G4cout << "### New handler " << this << G4endl; }
119}
120
122{
123 delete theMultiFragmentation;
124 delete theFermiModel;
125 if(isEvapLocal) { delete theEvaporation; }
126}
127
128void G4ExcitationHandler::SetParameters()
129{
131 auto param = ndata->GetParameters();
132 isActive = true;
133 // check if de-excitation is needed
134 if(fDummy == param->GetDeexChannelsType()) {
135 isActive = false;
136 } else {
137 // upload data for elements used in geometry
138 G4int Zmax = 20;
140 for(auto & elm : *table) { Zmax = std::max(Zmax, elm->GetZasInt()); }
141 ndata->UploadNuclearLevelData(Zmax+1);
142 }
143 minEForMultiFrag = param->GetMinExPerNucleounForMF();
144 minExcitation = param->GetMinExcitation();
145 maxExcitation = param->GetPrecoHighEnergy();
146 icID = G4PhysicsModelCatalog::GetModelID("model_e-InternalConversion");
147
148 // allowing local debug printout
149 fVerbose = std::max(fVerbose, param->GetVerbose());
150 if(isActive) {
151 if(!thePhotonEvaporation) { SetPhotonEvaporation(new G4PhotonEvaporation()); }
152 if(!theEvaporation) {
153 SetEvaporation(new G4Evaporation(thePhotonEvaporation), true);
154 }
155 if(!theFermiModel) { SetFermiModel(new G4FermiBreakUpVI()); }
156 if(!theMultiFragmentation) { SetMultiFragmentation(new G4StatMF()); }
157 }
158 theFermiModel->SetVerbose(fVerbose);
159 if(fVerbose > 1) {
160 G4cout << "G4ExcitationHandler::SetParameters() done " << this << G4endl;
161 }
162}
163
165{
166 if(isInitialised) { return; }
167 if(fVerbose > 1) {
168 G4cout << "G4ExcitationHandler::Initialise() started " << this << G4endl;
169 }
170 G4DeexPrecoParameters* param =
172 isInitialised = true;
173 SetParameters();
174 if(isActive) {
175 theFermiModel->Initialise();
176 theEvaporation->InitialiseChannels();
177 }
178 // dump level is controlled by parameter class
179 param->Dump();
180}
181
183{
184 if(ptr && ptr != theEvaporation) {
185 delete theEvaporation;
186 theEvaporation = ptr;
188 theEvaporation->SetFermiBreakUp(theFermiModel);
189 isEvapLocal = flag;
190 if(fVerbose > 1) {
191 G4cout << "G4ExcitationHandler::SetEvaporation() for " << this << G4endl;
192 }
193 }
194}
195
196void
198{
199 if(ptr && ptr != theMultiFragmentation) {
200 delete theMultiFragmentation;
201 theMultiFragmentation = ptr;
202 }
203}
204
206{
207 if(ptr && ptr != theFermiModel) {
208 delete theFermiModel;
209 theFermiModel = ptr;
210 if(theEvaporation) { theEvaporation->SetFermiBreakUp(theFermiModel); }
211 }
212}
213
214void
216{
217 if(ptr && ptr != thePhotonEvaporation) {
218 delete thePhotonEvaporation;
219 thePhotonEvaporation = ptr;
220 if(theEvaporation) { theEvaporation->SetPhotonEvaporation(ptr); }
221 if(fVerbose > 1) {
222 G4cout << "G4ExcitationHandler::SetPhotonEvaporation() " << ptr
223 << " for handler " << this << G4endl;
224 }
225 }
226}
227
229{
230 G4Evaporation* evap = static_cast<G4Evaporation*>(theEvaporation);
231 if(fVerbose > 1) {
232 G4cout << "G4ExcitationHandler::SetDeexChannelsType " << val
233 << " for " << this << G4endl;
234 }
235 if(val == fDummy) {
236 isActive = false;
237 return;
238 }
239 if(!evap) { return; }
240 if(val == fEvaporation) {
241 evap->SetDefaultChannel();
242 } else if(val == fCombined) {
243 evap->SetCombinedChannel();
244 } else if(val == fGEM) {
245 evap->SetGEMChannel();
246 } else if(val == fGEMVI) {
247 evap->SetGEMVIChannel();
248 }
249 evap->InitialiseChannels();
250 if(fVerbose > 1) {
252 G4cout << "Number of de-excitation channels is changed to: "
253 << theEvaporation->GetNumberOfChannels();
254 G4cout << " " << this;
255 }
256 G4cout << G4endl;
257 }
258}
259
261{
262 if(!theEvaporation) { SetParameters(); }
263 return theEvaporation;
264}
265
267{
268 if(!theMultiFragmentation) { SetParameters(); }
269 return theMultiFragmentation;
270}
271
273{
274 if(!theFermiModel) { SetParameters(); }
275 return theFermiModel;
276}
277
279{
280 if(!thePhotonEvaporation) { SetParameters(); }
281 return thePhotonEvaporation;
282}
283
286{
287 // Variables existing until end of method
288 G4Fragment * theInitialStatePtr = new G4Fragment(theInitialState);
289 if(fVerbose > 1) {
290 G4cout << "@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@ " << G4endl;
291 G4cout << theInitialState << G4endl;
292 }
293 if(!isInitialised) { Initialise(); }
294
295 // pointer to fragment vector which receives temporal results
296 G4FragmentVector * theTempResult = nullptr;
297
298 theResults.clear();
299 theEvapList.clear();
300
301 // Variables to describe the excited configuration
302 G4double exEnergy = theInitialState.GetExcitationEnergy();
303 G4int A = theInitialState.GetA_asInt();
304 G4int Z = theInitialState.GetZ_asInt();
305 G4int nL = theInitialState.GetNumberOfLambdas();
306
307 // too much excitation
308 if(exEnergy > A*maxExcitation && A > 0) {
309 ++fWarnings;
310 if(fWarnings < 0) {
312 ed << "High excitation Fragment Z= " << Z << " A= " << A
313 << " Eex/A(MeV)= " << exEnergy/A;
314 G4Exception("G4ExcitationHandler::BreakItUp()","had0034",JustWarning,ed,"");
315 }
316 }
317
318 // for hyper-nuclei subtract lambdas from the projectile fragment
319 G4double lambdaF = 0.0;
320 G4LorentzVector lambdaLV = theInitialStatePtr->GetMomentum();
321 if(0 < nL) {
322
323 // is it a stable hyper-nuclei?
324 if(A >= 3 && A <= 5 && nL <= 2) {
325 G4int pdg = 0;
326 if(3 == A && 1 == nL) {
327 pdg = 1010010030;
328 } else if(5 == A && 2 == Z && 1 == nL) {
329 pdg = 1010020050;
330 } else if(4 == A) {
331 if(1 == Z && 1 == nL) {
332 pdg = 1010010040;
333 } else if(2 == Z && 1 == nL) {
334 pdg = 1010020040;
335 } else if(0 == Z && 2 == nL) {
336 pdg = 1020000040;
337 } else if(1 == Z && 2 == nL) {
338 pdg = 1020010040;
339 }
340 }
341 // initial state is one of hyper-nuclei
342 if(0 < pdg) {
343 const G4ParticleDefinition* part = thePartTable->FindParticle(pdg);
344 if(nullptr != part) {
345 G4ReactionProduct* theNew = new G4ReactionProduct(part);
346 G4ThreeVector dir = G4ThreeVector( 0.0, 0.0, 0.0 );
347 if ( lambdaLV.vect().mag() > CLHEP::eV ) {
348 dir = lambdaLV.vect().unit();
349 }
350 G4double mass = part->GetPDGMass();
351 G4double etot = std::max(lambdaLV.e(), mass);
352 dir *= std::sqrt((etot - mass)*(etot + mass));
353 theNew->SetMomentum(dir);
354 theNew->SetTotalEnergy(etot);
355 theNew->SetFormationTime(theInitialState.GetCreationTime());
356 theNew->SetCreatorModelID(theInitialState.GetCreatorModelID());
358 v->push_back(theNew);
359 return v;
360 }
361 }
362 }
363 G4double mass = theInitialStatePtr->GetGroundStateMass();
364 lambdaF = nL*(fLambdaMass - CLHEP::neutron_mass_c2)/mass;
365
366 // de-excitation with neutrons instead of lambda inside the fragment
367 theInitialStatePtr->SetZAandMomentum(lambdaLV*(1. - lambdaF), Z, A, 0);
368
369 // 4-momentum not used in de-excitation
370 lambdaLV *= lambdaF;
371 } else if(0 > nL) {
372 ++fWarnings;
373 if(fWarnings < 0) {
375 ed << "Fragment with negative L: Z=" << Z << " A=" << A << " L=" << nL
376 << " Eex/A(MeV)= " << exEnergy/A;
377 G4Exception("G4ExcitationHandler::BreakItUp()","had0034",JustWarning,ed,"");
378 }
379 }
380
381 // In case A <= 1 the fragment will not perform any nucleon emission
382 if (A <= 1 || !isActive) {
383 theResults.push_back( theInitialStatePtr );
384
385 // check if a fragment is stable
386 } else if(exEnergy < minExcitation &&
387 nist->GetIsotopeAbundance(Z, A) > 0.0) {
388 theResults.push_back( theInitialStatePtr );
389
390 // JMQ 150909: first step in de-excitation is treated separately
391 // Fragments after the first step are stored in theEvapList
392 } else {
393 if((A<maxAForFermiBreakUp && Z<maxZForFermiBreakUp)
394 || exEnergy <= minEForMultiFrag*A) {
395 theEvapList.push_back(theInitialStatePtr);
396
397 // Statistical Multifragmentation will take place only once
398 } else {
399 theTempResult = theMultiFragmentation->BreakItUp(theInitialState);
400 if(!theTempResult) {
401 theEvapList.push_back(theInitialStatePtr);
402 } else {
403 size_t nsec = theTempResult->size();
404
405 // no fragmentation
406 if(0 == nsec) {
407 theEvapList.push_back(theInitialStatePtr);
408
409 // secondary are produced - sort out secondary fragments
410 } else {
411 G4bool deletePrimary = true;
412 for (auto ptr : *theTempResult) {
413 if(ptr == theInitialStatePtr) { deletePrimary = false; }
414 SortSecondaryFragment(ptr);
415 }
416 if( deletePrimary ) { delete theInitialStatePtr; }
417 }
418 delete theTempResult; // end multifragmentation
419 }
420 }
421 }
422 if(fVerbose > 2) {
423 G4cout << "## After first step of handler " << theEvapList.size()
424 << " for evap; "
425 << theResults.size() << " results. " << G4endl;
426 }
427 // -----------------------------------
428 // FermiBreakUp and De-excitation loop
429 // -----------------------------------
430
431 static const G4int countmax = 1000;
432 size_t kk;
433 for (kk=0; kk<theEvapList.size(); ++kk) {
434 G4Fragment* frag = theEvapList[kk];
435 if(fVerbose > 3) {
436 G4cout << "Next evaporate: " << G4endl;
437 G4cout << *frag << G4endl;
438 }
439 if(kk >= countmax) {
441 ed << "Infinite loop in the de-excitation module: " << kk
442 << " iterations \n"
443 << " Initial fragment: \n" << theInitialState
444 << "\n Current fragment: \n" << *frag;
445 G4Exception("G4ExcitationHandler::BreakItUp","had0333",FatalException,
446 ed,"Stop execution");
447
448 }
449 A = frag->GetA_asInt();
450 Z = frag->GetZ_asInt();
451 results.clear();
452 if(fVerbose > 2) {
453 G4cout << "G4ExcitationHandler# " << kk << " Z= " << Z << " A= " << A
454 << " Eex(MeV)= " << frag->GetExcitationEnergy() << G4endl;
455 }
456 // Fermi Break-Up
457 if(theFermiModel->IsApplicable(Z, A, frag->GetExcitationEnergy())) {
458 theFermiModel->BreakFragment(&results, frag);
459 size_t nsec = results.size();
460 if(fVerbose > 2) { G4cout << "FermiBreakUp Nsec= " << nsec << G4endl; }
461
462 // FBU takes care to delete input fragment or add it to the results
463 // The secondary may be excited - photo-evaporation should be applied
464 if(1 < nsec) {
465 for(auto & res : results) {
466 SortSecondaryFragment(res);
467 }
468 continue;
469 }
470 // evaporation will be applied
471 }
472 // apply Evaporation, residual nucleus is always added to the results
473 // photon evaporation is possible
474 theEvaporation->BreakFragment(&results, frag);
475 if(fVerbose > 3) {
476 G4cout << "Evaporation Nsec= " << results.size() << G4endl;
477 }
478 if(0 == results.size()) {
479 theResults.push_back(frag);
480 } else {
481 SortSecondaryFragment(frag);
482 }
483
484 // Sort out secondary fragments
485 for (auto & res : results) {
486 if(fVerbose > 4) {
487 G4cout << "Evaporated product #" << *res << G4endl;
488 }
489 SortSecondaryFragment(res);
490 } // end of loop on secondary
491 } // end of the loop over theEvapList
492 if(fVerbose > 2) {
493 G4cout << "## After 2nd step of handler " << theEvapList.size()
494 << " was evap; "
495 << theResults.size() << " results. " << G4endl;
496 }
497 G4ReactionProductVector * theReactionProductVector =
499
500 // MAC (24/07/08)
501 // To optimise the storing speed, we reserve space
502 // in memory for the vector
503 theReactionProductVector->reserve( theResults.size() );
504
505 if(fVerbose > 2) {
506 G4cout << "### ExcitationHandler provides " << theResults.size()
507 << " evaporated products:" << G4endl;
508 }
509 G4LorentzVector partOfLambdaLV;
510 if ( nL > 0 ) partOfLambdaLV = lambdaLV/(G4double)nL;
511 for (auto & frag : theResults) {
512 G4LorentzVector lv0 = frag->GetMomentum();
513 G4double etot = lv0.e();
514
515 // in the case of dummy de-excitation, excitation energy is transfered
516 // into kinetic energy of output ion
517 if(!isActive) {
518 G4double mass = frag->GetGroundStateMass();
519 G4double ptot = lv0.vect().mag();
520 G4double fac = (etot <= mass || 0.0 == ptot) ? 0.0
521 : std::sqrt((etot - mass)*(etot + mass))/ptot;
522 G4LorentzVector lv((frag->GetMomentum()).px()*fac,
523 (frag->GetMomentum()).py()*fac,
524 (frag->GetMomentum()).pz()*fac, etot);
525 frag->SetMomentum(lv);
526 }
527 if(fVerbose > 3) {
528 G4cout << *frag;
529 if(frag->NuclearPolarization()) {
530 G4cout << " " << frag->NuclearPolarization();
531 }
532 G4cout << G4endl;
533 }
534
535 G4int fragmentA = frag->GetA_asInt();
536 G4int fragmentZ = frag->GetZ_asInt();
537 G4double eexc = 0.0;
538 const G4ParticleDefinition* theKindOfFragment = nullptr;
539 G4bool isHyperN = false;
540 if (fragmentA == 0) { // photon or e-
541 theKindOfFragment = frag->GetParticleDefinition();
542 } else if (fragmentA == 1 && fragmentZ == 0) { // neutron
543 theKindOfFragment = theNeutron;
544 } else if (fragmentA == 1 && fragmentZ == 1) { // proton
545 theKindOfFragment = theProton;
546 } else if (fragmentA == 2 && fragmentZ == 1) { // deuteron
547 theKindOfFragment = theDeuteron;
548 } else if (fragmentA == 3 && fragmentZ == 1) { // triton
549 theKindOfFragment = theTriton;
550 if(0 < nL) {
551 const G4ParticleDefinition* p = thePartTable->FindParticle(1010010030);
552 if(nullptr != p) {
553 theKindOfFragment = p;
554 isHyperN = true;
555 --nL;
556 }
557 }
558 } else if (fragmentA == 3 && fragmentZ == 2) { // helium3
559 theKindOfFragment = theHe3;
560 } else if (fragmentA == 4 && fragmentZ == 2) { // alpha
561 theKindOfFragment = theAlpha;
562 if(0 < nL) {
563 const G4ParticleDefinition* p = thePartTable->FindParticle(1010020040);
564 if(nullptr != p) {
565 theKindOfFragment = p;
566 isHyperN = true;
567 --nL;
568 }
569 }
570 } else {
571
572 // fragment
573 eexc = frag->GetExcitationEnergy();
574 G4int idxf = frag->GetFloatingLevelNumber();
575 if(eexc < minExcitation) {
576 eexc = 0.0;
577 idxf = 0;
578 }
579
580 theKindOfFragment = theTableOfIons->GetIon(fragmentZ, fragmentA, eexc,
582 if(fVerbose > 3) {
583 G4cout << "### EXCH: Find ion Z= " << fragmentZ
584 << " A= " << fragmentA
585 << " Eexc(MeV)= " << eexc/MeV << " idx= " << idxf
586 << G4endl;
587 }
588 }
589 // fragment identified
590 if(nullptr != theKindOfFragment) {
591 G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment);
592 if(isHyperN) {
593 G4LorentzVector lv = lv0 + partOfLambdaLV;
594 G4ThreeVector dir = lv.vect().unit();
595 G4double mass = theKindOfFragment->GetPDGMass();
596 etot = std::max(lv.e(), mass);
597 G4double ptot = std::sqrt((etot - mass)*(etot + mass));
598 dir *= ptot;
599 theNew->SetMomentum(dir);
600 // remaining not compensated 4-momentum
601 lambdaLV += (lv0 - G4LorentzVector(dir, etot));
602 } else {
603 theNew->SetMomentum(lv0.vect());
604 }
605 theNew->SetTotalEnergy(etot);
606 theNew->SetFormationTime(frag->GetCreationTime());
607 if(theKindOfFragment == theElectron) {
608 theNew->SetCreatorModelID(icID);
609 } else {
610 theNew->SetCreatorModelID(frag->GetCreatorModelID());
611 }
612 theReactionProductVector->push_back(theNew);
613
614 // fragment not found out ground state is created
615 } else {
616 theKindOfFragment =
617 theTableOfIons->GetIon(fragmentZ,fragmentA,0.0,noFloat,0);
618 if(theKindOfFragment) {
619 G4ThreeVector mom(0.0,0.0,0.0);
620 G4double ionmass = theKindOfFragment->GetPDGMass();
621 if(etot <= ionmass) {
622 etot = ionmass;
623 } else {
624 G4double ptot = std::sqrt((etot - ionmass)*(etot + ionmass));
625 mom = (frag->GetMomentum().vect().unit())*ptot;
626 }
627 G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment);
628 theNew->SetMomentum(mom);
629 theNew->SetTotalEnergy(etot);
630 theNew->SetFormationTime(frag->GetCreationTime());
631 theNew->SetCreatorModelID(frag->GetCreatorModelID());
632 theReactionProductVector->push_back(theNew);
633 if(fVerbose > 3) {
634 G4cout << " ground state, energy corrected E(MeV)= "
635 << etot << G4endl;
636 }
637 }
638 }
639 delete frag;
640 }
641 // remaining lambdas are free; conserve quantum numbers but
642 // not 4-momentum
643 if(0 < nL) {
644 G4ThreeVector dir = G4ThreeVector( 0.0, 0.0, 0.0 );
645 if ( lambdaLV.vect().mag() > CLHEP::eV ) {
646 dir = lambdaLV.vect().unit();
647 }
648 G4double etot = std::max(lambdaLV.e()/(G4double)nL, fLambdaMass);
649 dir *= std::sqrt((etot - fLambdaMass)*(etot + fLambdaMass));
650 for(G4int i=0; i<nL; ++i) {
651 G4ReactionProduct* theNew = new G4ReactionProduct(theLambda);
652 theNew->SetMomentum(dir);
653 theNew->SetTotalEnergy(etot);
654 theNew->SetFormationTime(theInitialState.GetCreationTime());
655 theNew->SetCreatorModelID(theInitialState.GetCreatorModelID());
656 theReactionProductVector->push_back(theNew);
657 }
658 }
659 if(fVerbose > 3) {
660 G4cout << "@@@@@@@@@@ End G4Excitation Handler "<< G4endl;
661 }
662 return theReactionProductVector;
663}
664
665void G4ExcitationHandler::ModelDescription(std::ostream& outFile) const
666{
667 outFile << "G4ExcitationHandler description\n"
668 << "This class samples de-excitation of excited nucleus using\n"
669 << "Fermi Break-up model for light fragments (Z < 9, A < 17), "
670 << "evaporation, fission, and photo-evaporation models. Evaporated\n"
671 << "particle may be proton, neutron, and other light fragment \n"
672 << "(Z < 13, A < 29). During photon evaporation produced gamma \n"
673 << "or electrons due to internal conversion \n";
674}
675
676
677
@ fEvaporation
std::vector< G4Element * > G4ElementTable
@ JustWarning
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:65
#define noFloat
Definition: G4Ions.hh:112
CLHEP::HepLorentzVector G4LorentzVector
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
Hep3Vector unit() const
double mag() const
Hep3Vector vect() const
static G4Alpha * AlphaDefinition()
Definition: G4Alpha.cc:83
static G4Deuteron * DeuteronDefinition()
Definition: G4Deuteron.cc:88
static G4Electron * Electron()
Definition: G4Electron.cc:93
static G4ElementTable * GetElementTable()
Definition: G4Element.cc:403
virtual void InitialiseChannels() final
void SetGEMChannel()
void SetDefaultChannel()
void SetCombinedChannel()
void SetGEMVIChannel()
G4VEvaporationChannel * GetPhotonEvaporation()
G4VEvaporation * GetEvaporation()
void SetEvaporation(G4VEvaporation *ptr, G4bool isLocal=false)
void SetFermiModel(G4VFermiBreakUp *ptr)
void SetPhotonEvaporation(G4VEvaporationChannel *ptr)
void ModelDescription(std::ostream &outFile) const
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState)
void SetMultiFragmentation(G4VMultiFragmentation *ptr)
G4VMultiFragmentation * GetMultiFragmentation()
G4VFermiBreakUp * GetFermiModel()
void SetDeexChannelsType(G4DeexChannelType val)
G4double GetGroundStateMass() const
Definition: G4Fragment.hh:317
G4int GetCreatorModelID() const
Definition: G4Fragment.hh:428
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:312
const G4LorentzVector & GetMomentum() const
Definition: G4Fragment.hh:322
G4double GetCreationTime() const
Definition: G4Fragment.hh:479
G4int GetZ_asInt() const
Definition: G4Fragment.hh:289
G4int GetNumberOfLambdas() const
Definition: G4Fragment.hh:307
G4int GetA_asInt() const
Definition: G4Fragment.hh:284
void SetZAandMomentum(const G4LorentzVector &, G4int Z, G4int A, G4int nLambdas=0)
Definition: G4Fragment.hh:334
static G4He3 * He3Definition()
Definition: G4He3.cc:88
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
Definition: G4IonTable.cc:522
static G4Ions::G4FloatLevelBase FloatLevelBase(char flbChar)
Definition: G4Ions.cc:110
static G4Lambda * Lambda()
Definition: G4Lambda.cc:107
static G4Neutron * NeutronDefinition()
Definition: G4Neutron.cc:98
static G4NistManager * Instance()
G4double GetIsotopeAbundance(G4int Z, G4int N) const
G4DeexPrecoParameters * GetParameters()
void UploadNuclearLevelData(G4int Z)
static G4NuclearLevelData * GetInstance()
G4IonTable * GetIonTable() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
static G4int GetModelID(const G4int modelIndex)
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
static G4Proton * ProtonDefinition()
Definition: G4Proton.cc:87
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)
void SetCreatorModelID(const G4int mod)
void SetFormationTime(G4double aTime)
static G4Triton * TritonDefinition()
Definition: G4Triton.cc:88
virtual void BreakFragment(G4FragmentVector *, G4Fragment *theNucleus)
size_t GetNumberOfChannels() const
G4VEvaporationChannel * GetPhotonEvaporation()
virtual void SetPhotonEvaporation(G4VEvaporationChannel *ptr)
void SetFermiBreakUp(G4VFermiBreakUp *ptr)
virtual void InitialiseChannels()
virtual void Initialise()=0
virtual G4bool IsApplicable(G4int Z, G4int A, G4double mass) const =0
virtual void BreakFragment(G4FragmentVector *results, G4Fragment *theNucleus)=0
void SetVerbose(G4int val)
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)=0
Definition: DoubConv.h:17
G4bool IsMasterThread()
Definition: G4Threading.cc:124