119 PrintWelcomeMessage();
123 useAblation = useAblation1;
124 theAblation =
nullptr;
151 conserveEnergy =
false;
152 conserveMomentum =
true;
157 outFile <<
"G4WilsonAbrasionModel is a macroscopic treatment of\n"
158 <<
"nucleus-nucleus collisions using simple geometric arguments.\n"
159 <<
"The smaller projectile nucleus gouges out a part of the larger\n"
160 <<
"target nucleus, leaving a residual nucleus and a fireball\n"
161 <<
"region where the projectile and target intersect. The fireball"
162 <<
"is then treated as a highly excited nuclear fragment. This\n"
163 <<
"model is based on the NUCFRG2 model and is valid for all\n"
164 <<
"projectile energies between 70 MeV/n and 10.1 GeV/n. \n";
171 PrintWelcomeMessage();
177 theAblation =
nullptr;
185 theExcitationHandler = aExcitationHandler;
204 conserveEnergy =
false;
205 conserveMomentum =
true;
211 delete theExcitationHandler;
252 G4cout <<
"########################################"
253 <<
"########################################"
257 G4cout <<
"Initial projectile A=" <<AP
259 <<
", radius = " <<rP/fermi <<
" fm"
261 G4cout <<
"Initial target A=" <<AT
263 <<
", radius = " <<rT/fermi <<
" fm"
265 G4cout <<
"Projectile momentum and Energy/nuc = " <<pP <<
" ," <<E <<
G4endl;
272 G4double rm = ZP * ZT * elm_coupling / (E * AP);
290 G4bool skipInteraction =
false;
291 const G4int maxNumberOfLoops = 1000;
292 G4int loopCounter = -1;
293 while (Dabr == 0 && ++loopCounter < maxNumberOfLoops)
310 if (rm >= fradius * rPT) {
311 skipInteraction =
true;
320 while (r > rPT && ++evtcnt < 1000)
323 r = (rm + std::sqrt(rm*rm + 4.0*bsq)) / 2.0;
329 if (evtcnt >= 1000) {
330 skipInteraction =
true;
340 G4double x = (rPsq + rsq - rTsq) / 2.0 / r;
341 if (x > 0.0) CT = 2.0 * std::sqrt(rTsq - x*x);
342 else CT = 2.0 * std::sqrt(rTsq - rsq);
346 G4double x = (rTsq + rsq - rPsq) / 2.0 / r;
347 if (x > 0.0) CT = 2.0 * std::sqrt(rTsq - x*x);
358 delete theAbrasionGeometry;
360 F = theAbrasionGeometry->
F();
364 for (
G4int i = 0; i<10; ++i)
369 if (n>AP) Dabr = (
G4int) AP;
370 else Dabr = (
G4int) n;
376 if ( loopCounter >= maxNumberOfLoops || skipInteraction ) {
382 G4cout <<
"Particle energy too low to overcome repulsion." <<
G4endl;
383 G4cout <<
"Event rejected and original track maintained" <<
G4endl;
384 G4cout <<
"########################################"
385 <<
"########################################"
388 delete theAbrasionGeometry;
395 G4cout <<
"Impact parameter = " <<r/fermi <<
" fm" <<
G4endl;
416 G4Fragment *fragmentP = GetAbradedNucleons (Dabr, AP, ZP, rP);
419 for (i=0; i<nSecP; ++i)
422 GetParticle()->GetTotalEnergy();
430 if (DspcP <= 0) DspcP = 0;
431 else if (DspcP > AP-Dabr) DspcP = ((
G4int) AP) - Dabr;
439 G4bool excitationAbsorbedByProjectile =
false;
440 if (fragmentP !=
nullptr)
446 if (excitationAbsorbedByProjectile)
447 ExP = GetNucleonInducedExcitation(rP, rT, r);
449 if (xP > B*(AP-Dabr)) xP = B*(AP-Dabr);
451 lorentzVector.
setE(lorentzVector.e()+xP);
453 TotalEPost += lorentzVector.e();
465 G4Fragment *fragmentT = GetAbradedNucleons (Dabr, AT, ZT, rT);
467 for (i=nSecP; i<nSec; ++i)
470 GetParticle()->GetTotalEnergy();
478 if (DspcT <= 0) DspcT = 0;
479 else if (DspcT > AP-Dabr) DspcT = ((
G4int) AT) - Dabr;
487 if (fragmentT !=
nullptr)
491 if (!excitationAbsorbedByProjectile)
492 ExT = GetNucleonInducedExcitation(rT, rP, r);
494 if (xT > B*(AT-Dabr)) xT = B*(AT-Dabr);
496 lorentzVector.
setE(lorentzVector.e()+xT);
498 TotalEPost += lorentzVector.e();
506 G4double deltaE = TotalEPre - TotalEPost;
507 if (deltaE > 0.0 && conserveEnergy)
510 boost = boost / boost.
mag() * beta;
517 for (i=0; i<nSecP; ++i)
522 lorentzVector.
boost(-boost);
524 pBalance -= lorentzVector.
vect();
536 if (fragmentP !=
nullptr)
540 if (conserveMomentum)
546 fragmentP->
SetMomentum(lorentzVector.
boost(-boost * fragmentGroundStateM/fragmentM));
556 G4cout <<
"-----------------------------------" <<
G4endl;
557 G4cout <<
"Secondary nucleons from projectile:" <<
G4endl;
558 G4cout <<
"-----------------------------------" <<
G4endl;
560 for (i=0; i<nSecP; ++i)
572 if (fragmentP !=
nullptr)
581 for (i=nSecP; i<nSec; ++i)
593 if (fragmentT !=
nullptr)
603 if (fragmentP !=
nullptr)
607 products = theExcitationHandler->
BreakItUp(*fragmentP);
613 G4ReactionProductVector::iterator iter;
614 for (iter = products->begin(); iter != products->end(); ++iter)
618 (*iter)->GetTotalEnergy(), (*iter)->GetMomentum());
620 G4String particleName = (*iter)->GetDefinition()->GetParticleName();
622 if (
verboseLevel >= 2 && particleName.find(
"[",0) < particleName.size())
627 G4cout <<
" fragmentP = " <<particleName
640 if (fragmentT !=
nullptr)
644 products = theExcitationHandler->
BreakItUp(*fragmentT);
650 G4ReactionProductVector::iterator iter;
651 for (iter = products->begin(); iter != products->end(); ++iter)
655 (*iter)->GetTotalEnergy(), (*iter)->GetMomentum());
657 G4String particleName = (*iter)->GetDefinition()->GetParticleName();
659 if (
verboseLevel >= 2 && particleName.find(
"[",0) < particleName.size())
664 G4cout <<
" fragmentT = " <<particleName
673 G4cout <<
"########################################"
674 <<
"########################################"
677 delete theAbrasionGeometry;
717 G4bool isForLoopExitAnticipated =
false;
718 for (
G4int i=0; i<Dabr; ++i)
727 const G4int maxNumberOfLoops = 100000;
728 G4int loopCounter = -1;
729 while (!found && ++loopCounter < maxNumberOfLoops)
736 if ( loopCounter >= maxNumberOfLoops )
738 isForLoopExitAnticipated =
true;
763 G4double sintheta = std::sqrt((1.0 - costheta)*(1.0 + costheta));
765 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi),costheta);
767 G4double E = std::sqrt(p*p + nucleonMass*nucleonMass)-nucleonMass;
780 if ( ! isForLoopExitAnticipated && Z-Zabr>=1.0 )
784 G4double E = std::sqrt(pabr.mag2() + ionMass*ionMass);
794G4double G4WilsonAbrasionModel::GetNucleonInducedExcitation
810 if (r > rT) Cl = 2.0*std::sqrt(rPsq + 2.0*r*rT - rsq - rTsq);
820 if (rT > rP && rsq < rTsq - rPsq) Ct = 2.0 * rP;
821 else if (rP > rT && rsq < rPsq - rTsq) Ct = 2.0 * rT;
823 G4double bP = (rPsq+rsq-rTsq)/2.0/r;
826 G4cerr <<
"########################################"
827 <<
"########################################"
829 G4cerr <<
"ERROR IN G4WilsonAbrasionModel::GetNucleonInducedExcitation"
831 G4cerr <<
"rPsq - bP*bP < 0.0 and cannot be square-rooted" <<
G4endl;
833 G4cerr <<
"########################################"
834 <<
"########################################"
837 Ct = 2.0*std::sqrt(x);
842 Ex += 13.0 * Cl / fermi /3.0 * (Ct/fermi - 1.5);
850 if (useAblation != useAblation1)
852 useAblation = useAblation1;
861 delete theExcitationHandler;
862 theAblation =
nullptr;
870void G4WilsonAbrasionModel::PrintWelcomeMessage ()
873 G4cout <<
" *****************************************************************"
875 G4cout <<
" Nuclear abrasion model for nuclear-nuclear interactions activated"
877 G4cout <<
" (Written by QinetiQ Ltd for the European Space Agency)"
879 G4cout <<
" *****************************************************************"
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
CLHEP::HepLorentzVector G4LorentzVector
G4long G4Poisson(G4double mean)
std::vector< G4ReactionProduct * > G4ReactionProductVector
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
HepLorentzVector & boost(double, double, double)
Hep3Vector findBoostToCM() const
void DumpInfo(G4int mode=0) const
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4double GetKineticEnergy() const
void Set4Momentum(const G4LorentzVector &momentum)
void SetEvaporation(G4VEvaporation *ptr, G4bool isLocal=false)
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState)
G4double GetGroundStateMass() const
const G4LorentzVector & GetMomentum() const
void SetMomentum(const G4LorentzVector &value)
void SetStatusChange(G4HadFinalStateStatus aS)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
std::size_t GetNumberOfSecondaries() const
void SetEnergyChange(G4double anEnergy)
G4HadSecondary * GetSecondary(size_t i)
void SetMomentumChange(const G4ThreeVector &aV)
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double GetTotalEnergy() const
G4DynamicParticle * GetParticle()
G4HadFinalState theParticleChange
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4Neutron * NeutronDefinition()
G4double GetExcitationEnergyOfTarget()
G4double GetExcitationEnergyOfProjectile()
G4double GetEnergyDeposit()
G4double AtomicMass(const G4double A, const G4double Z) const
G4double GetPDGMass() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
const G4String & GetParticleName() const
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
static G4Pow * GetInstance()
G4double A13(G4double A) const
G4double powA(G4double A, G4double y) const
static G4Proton * ProtonDefinition()
void SetVerboseLevel(G4int)
virtual void ModelDescription(std::ostream &) const
G4WilsonAbrasionModel(G4bool useAblation1=false)
void SetUseAblation(G4bool)
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &, G4Nucleus &)
G4double GetWilsonRadius(G4double A)