47 : theDecay(nullptr), rndmEngine(nullptr), maxZ(9), maxA(17)
52 mass = elim = excitation = 0.0;
53 tolerance = CLHEP::MeV;
54 frag1 = frag2 =
nullptr;
70 G4cout <<
"### G4FermiBreakUpVI::Initialise(): " << thePool <<
G4endl;
72 if(thePool ==
nullptr) { InitialisePool(); }
77void G4FermiBreakUpVI::InitialisePool()
80 G4MUTEXLOCK(&G4FermiBreakUpVI::FermiBreakUpVIMutex);
82 if(thePool ==
nullptr) {
92 return (ZZ < maxZ && AA < maxA && AA > 0 && eexc <= elim
100 G4cout <<
"### G4FermiBreakUpVI::BreakFragment start new fragment "
113 rndmEngine = G4Random::getTheEngine();
124 static const G4int imax = 100;
128 for(
size_t i=0; i<frag.size(); ++i) {
131 spin = frag[i]->GetSpin();
132 mass = frag[i]->GetTotalEnergy();
135 G4cout <<
"# FermiFrag " << i <<
". Z= " << Z <<
" A= " << A
136 <<
" mass= " << mass <<
" exc= "
137 << frag[i]->GetExcitationEnergy() <<
G4endl;
145 theResult->push_back(f);
156G4bool G4FermiBreakUpVI::SampleDecay()
159 if(!chan) {
return false; }
162 G4cout <<
"== SampleDecay " <<
nn <<
" channels Eex= "
165 if(0 == nn) {
return false; }
177 if(std::abs(excitation - chan->
GetExcitation()) < tolerance) {
183 const std::vector<const G4FermiPair*>& pvect = chan->
GetChannels();
184 if(nn > 12) { prob.resize(nn, 0.0); }
189 for(
size_t i=0; i<
nn; ++i) {
191 pvect[i]->GetFragment1(),
192 pvect[i]->GetFragment2());
195 G4cout << i <<
". " << prob[i]
196 <<
" Z1= " << pvect[i]->GetFragment1()->GetZ()
197 <<
" A1= " << pvect[i]->GetFragment1()->GetA()
198 <<
" Z2= " << pvect[i]->GetFragment2()->GetZ()
199 <<
" A2= " << pvect[i]->GetFragment2()->GetA()
203 ptot *= rndmEngine->
flat();
204 for(
size_t i=0; i<
nn; ++i) {
205 if(ptot <= prob[i] || i+1 == nn) {
212 if(!fpair) {
return false; }
220 G4cout <<
" M= " << mass <<
" M1= " << mass1 <<
" M2= " << mass2
225 G4double e1 = 0.5*(mass*mass - mass2*mass2 + mass1*mass1)/mass;
229 p1 = std::sqrt((e1 - mass1)*(e1 + mass1));
238 lv1.
boost(boostVector);
244 lv0.
set(0.,0.,0.,mass2);
247 frag.push_back(frag1);
248 frag.push_back(frag2);
249 lvect.push_back(lv1);
250 lvect.push_back(lv0);
std::vector< G4Fragment * > G4FragmentVector
CLHEP::HepLorentzVector G4LorentzVector
G4ThreeVector G4RandomDirection()
#define G4MUTEX_INITIALIZER
#define G4MUTEXLOCK(mutex)
#define G4MUTEXUNLOCK(mutex)
G4GLOB_DLL std::ostream G4cout
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
void set(double x, double y, double z, double t)
void BreakFragment(G4FragmentVector *, G4Fragment *theNucleus) final
~G4FermiBreakUpVI() final
G4bool IsApplicable(G4int ZZ, G4int AA, G4double etot) const final
G4double GetExcitation() const
const G4FermiPair * SamplePair(G4double rand) const
const G4FermiPair * GetPair(size_t idx) const
size_t GetNumberOfChannels() const
const std::vector< const G4FermiPair * > & GetChannels() const
G4double ComputeProbability(G4int Z, G4int A, G4int spin, G4double TotalE, const G4FermiFragment *f1, const G4FermiFragment *f2) const
G4double GetExcitationEnergy(void) const
G4double GetTotalEnergy(void) const
G4double GetEnergyLimit() const
const G4FermiDecayProbability * FermiDecayProbability() const
G4bool HasChannels(G4int Z, G4int A, G4double exc) const
const G4FermiChannels * ClosestChannels(G4int Z, G4int A, G4double mass) const
const G4FermiFragment * GetFragment2() const
const G4FermiFragment * GetFragment1() const
G4double GetGroundStateMass() const
G4double GetExcitationEnergy() const
const G4LorentzVector & GetMomentum() const
G4double GetCreationTime() const
void SetCreationTime(G4double time)
void SetSpin(G4double value)