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