123 PrintWelcomeMessage();
140 produceSecondaries =
true;
153 for(
G4int i=0; i<200; ++i) { fSig[i] = 0.0; }
188 fragmentVector->clear();
196 if (verboseLevel >= 2)
198 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
199 <<
"oooooooooooooooooooooooooooooooooooooooo"
203 G4cout <<
"Initial prefragment A=" <<
A
205 <<
", excitation energy = " <<ex/MeV <<
" MeV"
216 if (verboseLevel >= 2)
219 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
220 <<
"oooooooooooooooooooooooooooooooooooooooo"
223 return fragmentVector;
228 lorentzVector.
setE(lorentzVector.
e()-ex+10.0*eV);
233 fragmentVector->push_back(fragment);
239 fragmentVector->push_back(fragment);
241 if (verboseLevel >= 2)
243 G4cout <<
"Final fragment is in fact only a nucleon) :" <<
G4endl;
245 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
246 <<
"oooooooooooooooooooooooooooooooooooooooo"
249 return fragmentVector;
257 if (DAabl >
A) DAabl =
A;
275 G4int minZ = std::max(1,
Z - DAabl);
281 G4int zmax = std::min(199,
Z);
283 for (ZF=minZ; ZF<=zmax; ++ZF)
285 sum +=
G4Exp(-R*g4calc->
powA(std::abs(ZF - 0.486*AFd + 3.8E-04*AFd*AFd),1.5));
293 for (ZF=minZ; ZF<=zmax; ++ZF) {
294 if(sum <= fSig[ZF]) {
break; }
308 for (
G4int ift=0; ift<nFragTypes; ift++)
313 if (fragType[ift]->GetPDGCharge() > 0.0)
322 evapType.push_back(type);
345 evapType.erase(evapType.end()-1);
347 totalEpost += massFinalFrag;
352 if (verboseLevel >= 2)
354 G4cout <<
"Final fragment A=" <<AF
357 for (
G4int ift=0; ift<nFragTypes; ift++)
360 G4long n = std::count(evapType.cbegin(),evapType.cend(),type);
363 <<
", number of particles emitted = " <<n <<
G4endl;
372 G4double totalEpre = massPreFrag + ex;
373 G4double excess = totalEpre - totalEpost;
377 std::size_t nEvap = 0;
378 if (produceSecondaries && evapType.size()>0)
382 SelectSecondariesByEvaporation (resultNucleus);
383 nEvap = fragmentVector->size();
385 if (evapType.size() > 0)
386 SelectSecondariesByDefault (boost);
397 G4double p = std::sqrt(e*e-mass*mass);
400 lorentzVector.
boost(-boost);
403 fragmentVector->push_back(frag);
405 delete resultNucleus;
410 if (verboseLevel >= 2)
419 for (
auto iter = fragmentVector->cbegin();
420 iter != fragmentVector->cend(); ++iter)
431 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
432 <<
"oooooooooooooooooooooooooooooooooooooooo"
436 return fragmentVector;
440void G4WilsonAblationModel::SelectSecondariesByEvaporation
443 G4Fragment theResidualNucleus = *intermediateNucleus;
446 while (evaporate && evapType.size() != 0)
454 std::vector <G4VEvaporationChannel*> theChannels1;
455 theChannels1.clear();
456 std::vector <G4VEvaporationChannel*>::iterator i;
457 VectorOfFragmentTypes::iterator iter;
458 std::vector <VectorOfFragmentTypes::iterator> iters;
460 iter = std::find(evapType.begin(), evapType.end(),
G4Alpha::Alpha());
461 if (iter != evapType.end())
464 i = theChannels1.end() - 1;
465 (*i)->SetOPTxs(
OPTxs);
468 iters.push_back(iter);
470 iter = std::find(evapType.begin(), evapType.end(),
G4He3::He3());
471 if (iter != evapType.end())
474 i = theChannels1.end() - 1;
475 (*i)->SetOPTxs(
OPTxs);
478 iters.push_back(iter);
481 if (iter != evapType.end())
484 i = theChannels1.end() - 1;
485 (*i)->SetOPTxs(
OPTxs);
488 iters.push_back(iter);
491 if (iter != evapType.end())
494 i = theChannels1.end() - 1;
495 (*i)->SetOPTxs(
OPTxs);
498 iters.push_back(iter);
501 if (iter != evapType.end())
504 i = theChannels1.end() - 1;
505 (*i)->SetOPTxs(
OPTxs);
508 iters.push_back(iter);
511 if (iter != evapType.end())
514 i = theChannels1.end() - 1;
515 (*i)->SetOPTxs(
OPTxs);
518 iters.push_back(iter);
520 std::size_t nChannels = theChannels1.size();
525 for (
auto iterEv=theChannels1.cbegin();
526 iterEv!=theChannels1.cend(); ++iterEv) {
527 totalProb += (*iterEv)->GetEmissionProbability(intermediateNucleus);
528 probEvapType[ich] = totalProb;
531 if (totalProb > 0.0) {
540 for (ii=0; ii<nChannels; ++ii)
542 if (xi < probEvapType[ii]) {
break; }
544 if (ii >= nChannels) { ii = nChannels - 1; }
546 BreakUpFragment(intermediateNucleus);
547 if ((*evaporationResult)[0] !=
nullptr)
549 (*evaporationResult)[0]->SetCreatorModelID(secID);
551 fragmentVector->push_back((*evaporationResult)[0]);
552 intermediateNucleus = (*evaporationResult)[1];
553 delete evaporationResult;
570void G4WilsonAblationModel::SelectSecondariesByDefault (
G4ThreeVector boost)
572 for (std::size_t i=0; i<evapType.size(); ++i)
577 G4double p = std::sqrt(e*e-mass*mass);
579 G4double sintheta = std::sqrt((1.0 - costheta)*(1.0 + costheta));
581 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi),costheta);
583 lorentzVector.
boost(-boost);
593 fragmentVector->push_back(fragment);
598void G4WilsonAblationModel::PrintWelcomeMessage ()
601 G4cout <<
" *****************************************************************"
603 G4cout <<
" Nuclear ablation model for nuclear-nuclear interactions activated"
605 G4cout <<
" (Written by QinetiQ Ltd for the European Space Agency)"
607 G4cout <<
" !!! WARNING: This model is not well validation and should not be used for accurate simulation !!!"
609 G4cout <<
" *****************************************************************"
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
std::vector< G4Fragment * > G4FragmentVector
CLHEP::HepLorentzVector G4LorentzVector
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
HepLorentzVector & boost(double, double, double)
Hep3Vector findBoostToCM() const
static G4Deuteron * Deuteron()
G4double GetGroundStateMass() const
G4double GetExcitationEnergy() const
const G4LorentzVector & GetMomentum() const
void SetCreatorModelID(G4int value)
static G4Neutron * Neutron()
G4double GetPDGMass() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
const G4String & GetParticleName() const
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
static G4int GetModelID(const G4int modelIndex)
static G4Pow * GetInstance()
G4double powZ(G4int Z, G4double y) const
G4double powA(G4double A, G4double y) const
static G4Proton * Proton()
static G4Triton * Triton()
virtual std::vector< G4VEvaporationChannel * > * GetChannel()=0
G4VEvaporationFactory * theChannelFactory
std::vector< G4VEvaporationChannel * > * theChannels
G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)
virtual ~G4WilsonAblationModel()