37 for (
int i = 0; i < 5; i++) {
44 fThetaLabVsThetaCM[i] =
nullptr;
45 fELabVsThetaCM[i] =
nullptr;
46 fELabVsThetaLab[i] =
nullptr;
48 fKoxReactionXSec =
nullptr;
49 fEqbmChargeState =
nullptr;
50 fEqbmChargeStateShSol =
nullptr;
51 fEqbmChargeStateShGas =
nullptr;
54 SetIntegralPrecision(1
e-10);
116 scouple = syst.
Next();
157 Obsolete(
"KV2Body(KVNucleus*, KVNucleus*, KVNucleus*, Double_t)",
"1.11",
"1.12");
160 Info(
"KV2Body",
"Use constructor KV2Body(const KVNucleus& compound) to simulate binary decay of compound");
162 else if (!proj_out) {
163 Info(
"KV2Body",
"Use constructor KV2Body(const KVNucleus& proj, const KVNucleus& targ) to define entrance channel");
166 Info(
"KV2Body",
"Use constructor KV2Body(const KVNucleus& proj, const KVNucleus& targ, const KVNucleus& outgoing) to define entrance & exit channels");
198 : fNuclei(5), fEDiss(-Exx)
244 fNuclei(5), fEDiss(Ediss)
284 fNuclei(5), fEDiss(Ediss)
367 for (
int i = 0; i < 5; i++) {
409 for (
unsigned i = 1; i <= 4; ++i)
if (
fNuclei[i].IsDefined())
fNuclei[i].SetExcitEnergy(0);
467 if (i > 0 && i < 5) {
471 Warning(
"GetNucleus(Int_t i)",
"Index i out of bounds, i=%d", i);
486 Warning(
"GetQReaction",
"Parameters for outgoing nuclei not set");
506 "Parameters for outgoing nuclei not set");
541 if (i < 3 || i > 4) {
542 Warning(
"GetMaxAngleLab(Int_t i)",
543 "Returns maximum scattering angle in lab for nuclei i=3 (quasiproj) and i=4 (quasitarget)");
559 if (i < 3 || i > 4) {
560 Warning(
"GetMinAngleLab(Int_t i)",
561 "Returns minimum scattering angle in lab for nuclei i=3 (quasiproj) and i=4 (quasitarget)");
610 if (i < 1 || i > 2) {
611 Warning(
"GetLabGrazingAngle(Int_t i)",
612 "i should be 1 (proj) or 2 (targ)");
616 Warning(
"GetLabGrazingAngle(Int_t i)",
617 "No target defined for reaction");
626 Double_t RINT = CP + CT + 4.49 - (CT + CP) / 6.35;
694 Error(
"CalculateKinematics",
"Set outgoing (decay) product first");
703 for (
int i = 0; i < 5; i++) {
830 cout <<
" ******" << endl;
839 cout <<
" ==> Q-REACTION = " <<
GetQReaction() <<
" MEV";
842 cout <<
" AVAILABLE ENERGY IN C.M. : ECM = " <<
GetCMEnergy() <<
845 GetA() : 0.)) <<
" MEV/A)" << endl;
849 Mag() <<
" CM/NS" << endl;
851 for (
int i = 1; i <= 4; i++) {
853 cout <<
" ENERGY - VELOCITY OF NUCLEUS " << i <<
" IN CM : " <<
858 cout <<
" MAXIMUM SCATTERING ANGLE IN LABORATORY" << endl;
866 cout <<
" GRAZING ANGLE IN LABORATORY : PROJECTILE " <<
868 cout <<
" GRAZING ANGLE IN LABORATORY : TARGET " <<
875 if (!strcmp(opt,
"lab") || !strcmp(opt,
"LAB")
876 || !strcmp(opt,
"Lab")) {
879 " LABORATORY ANGULAR DISTRIBUTION" << endl
882 " TETA 3 EN.DIF.3 V3 TETA 4 EN.DIF.4 TETA 3"
885 " (LAB) (LAB) (LAB) (LAB) (LAB) (C.M)"
888 for (
int step = 0; step <= nsteps; step++) {
896 GetELab(3, theta, 3, elabP1, elabP2);
898 GetVLab(3, theta, 3, vP1, vP2);
900 GetELab(4, theta, 3, elabT1, elabT2);
902 (
" %6.2f %7.2f/%7.2f %5.2f/%5.2f %6.2f/%6.2f %7.2f/%7.2f %6.2f/%6.2f\n",
903 theta, elabP1, elabP2, vP1, vP2,
904 tlT1, tlT2, elabT1, elabT2,
908 if (
GetNucleus(2) && (!strcmp(opt,
"ruth") || !strcmp(opt,
"RUTH")
909 || !strcmp(opt,
"Ruth"))) {
912 " RUTHERFORD LABORATORY ANGULAR DISTRIBUTION" <<
915 " TETA 3 TETA 3 EN.DIF.3 SIG.RUT. SIG.RUT."
918 " (LAB) (CM) (LAB) (LAB) (b/sr) (CM) (b/sr)"
922 for (
int step = 0; step < nsteps; step++) {
923 Double_t theta = dtheta * (step + 1);
926 GetELab(3, theta, 3, elabP1, elabP2);
929 (
" %6.2f %6.2f %7.2f %10.4g %10.4g\n",
955 if (ThetaLab >
TETAMAX[AngleNucleus])
return 0;
959 TCM1 =
GetThetaCM(OfNucleus, TCM1, AngleNucleus);
960 if (nsol > 1) TCM2 =
GetThetaCM(OfNucleus, TCM2, AngleNucleus);
963 if (nsol == 2) e2 =
GetELab(TCM2, OfNucleus);
1035 if (ThetaL < 0.) ThetaL += 180.;
1099 Int_t nsol =
GetELab(OfNucleus, ThetaLab, AngleNucleus, e1, e2);
1100 if (!nsol)
return nsol;
1127 if (ThetaLab >
TETAMAX[AngleNucleus])
return 0;
1128 if (!(
TMath::Abs(OfNucleus - AngleNucleus) % 2)) {
1136 TCM1 =
GetThetaCM(OfNucleus, TCM1, AngleNucleus);
1137 if (nsol > 1) TCM2 =
GetThetaCM(OfNucleus, TCM2, AngleNucleus);
1203 Warning(
"GetXSecRuthCM",
"No target defined for reaction");
1229 if (!nsol)
return -1.;
1252 Warning(
"XSecRuthCMVsThetaCM",
"No target defined for reaction");
1260 if (OfNucleus == 2 || OfNucleus == 4) TCM =
TMath::Pi() - TCM;
1311 if (DSIDTB * RLC < 0) {
1312 Warning(
"GetXSecRuthLab",
"negative value for choosen parameters : %lf %d\n",
x[0], (
Int_t)par[0]);
1315 return (DSIDTB * RLC);
1394 if (phi1 == -1 || phi2 == -1) dphi = 2 *
TMath::Pi();
1395 else if (phi1 == phi2) dphi = 1;
1402 if (
th1 < theta_min) theta_min =
th1;
1403 if (
th2 > theta_max) theta_max =
th2;
1405 #if ROOT_VERSION_CODE > ROOT_VERSION(5,99,01)
1431 Double_t R12 = r0 * (A1third + A2third);
1434 - 2.9 * A1third * A2third / (A1third + A2third);
1486 pow((A1third + A2third +
a * A1third * A2third / (A1third + A2third) -
c), 2) *
1508 pow(A1third + A2third, 2);
1711 x = Vp / V0 *
pow(Zp, -0.52) *
pow(Zt,
x) / 1.68;
1712 x =
pow(
x, 1. + 1.8 / Zp);
1714 q = (Zp * (12 *
x +
pow(
x, 4.))) /
q;
1744 name +=
" SHIWIETZ-SOLID";
1771 x = Vp / V0 *
pow(Zp, -0.52) *
pow(Zt,
x);
1772 x =
pow(
x, 1. + 0.4 / Zp);
1774 q = (Zp * (376.*
x +
pow(
x, 6.))) /
q;
1805 name +=
" SHIWIETZ-GAS";
1833 name +=
Form(
"%6.1f AMeV ", elab);
1834 if (OfNucleus == 3) name +=
"(projectile)";
1835 else name +=
"(target)";
1876 TString name =
"RuthXSecInt: ";
1882 name +=
Form(
"%6.1f AMeV ", elab);
1883 if (OfNucleus == 3) name +=
"(projectile)";
1884 else name +=
"(target)";
1921 x1 = x2 =
xmin - 1.;
1924 if (val > max)
return nRoots;
1932 if ((maxX <
xmax) && (maxX >
xmin)) nRoots = 2;
1935 if (nRoots == 1)
return nRoots;
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
double pow(double, double)
char * Form(const char *fmt,...)
Relativistic binary kinematics calculator.
Double_t XSecRuthLabInt(Double_t *, Double_t *)
Double_t TETAMIN[5]
defined only for nuclei 3 et 4
Double_t eqbm_charge_state_shiwietz_gas(Double_t *t, Double_t *)
Double_t VC[5]
cm velocities
void SetTarget(const KVNucleus &)
Set target for reaction.
TF1 * GetEqbmChargeStateFunc() const
TF1 * GetXSecRuthLabFunc(Int_t OfNucleus=3, Double_t theta_min=1., Double_t theta_max=179.) const
Double_t K[5]
ratio of c.m. velocity to velocity of nucleus in c.m. v_cm/v_i_cm
Double_t GetMaxAngleLab(Int_t i) const
std::vector< KVNucleus > fNuclei
nuclei involved in calculation
void Print(Option_t *opt="") const
TF1 * GetXSecRuthLabIntegralFunc(Int_t OfNucleus=3, Double_t theta_min=1., Double_t theta_max=179.) const
Double_t WCT
total cm energy
Double_t GetSphereDureReactionXSec(Double_t r0=1.05)
Double_t ELabVsThetaLab(Double_t *, Double_t *)
Function calculating lab energy of nucleus par[0] for any lab angle x[0].
TF1 * fThetaLabVsThetaCM[5]
Double_t GetMinAngleLab(Int_t i) const
Double_t GetThetaLab(Double_t ThetaCM, Int_t OfNucleus) const
void SetProjectile(const KVNucleus &)
Set projectile for reaction.
Double_t fIntPrec
Precision of the TF1::Integral method.
Double_t GetXSecRuthLab(Double_t ThetaLab_Proj, Int_t OfNucleus=3) const
Double_t GetQReaction() const
Calculate Q-value for reaction, including dissipated (excitation) energy.
TF1 * fEqbmChargeStateShSol
function equilibrium charge state of projectile vs. E/A projectile (Shiwietz et al solid)
Double_t EqbmChargeState(Double_t *t, Double_t *)
TF1 * GetThetaLabVsThetaCMFunc(Int_t OfNucleus) const
void SetOutgoing(const KVNucleus &proj_out)
TF1 * fKoxReactionXSec
function Kox reaction cross-section [barns] vs. E/A projectile
TF1 * GetELabVsThetaCMFunc(Int_t OfNucleus) const
Double_t XSecRuthCM(Double_t *, Double_t *)
TF1 * GetShiwietzEqbmChargeStateFuncForGasTargets() const
Double_t XSecRuthLab(Double_t *, Double_t *)
TF1 * GetKoxReactionXSecFunc() const
Double_t BCM
beta of centre of mass
TF1 * fEqbmChargeStateShGas
function equilibrium charge state of projectile vs. E/A projectile (Shiwietz et al gas)
Double_t GetELab(Double_t ThetaCM, Int_t OfNucleus) const
Int_t FindRoots(TF1 *, Double_t, Double_t, Double_t, Double_t &, Double_t &) const
Double_t GetEDiss() const
static Double_t GetVelocity(Double_t mass, Double_t E)
Double_t GetIntegratedXSecRuthLab(Float_t th1, Float_t th2, Float_t phi1=-1, Float_t phi2=-1, Int_t OfNucleus=3)
Double_t GetBmaxFromReactionXSec(Double_t ReacXsec)
TVector3 VCM
velocity of centre of mass
Double_t KoxReactionXSec(Double_t *, Double_t *)
Double_t ELabVsThetaCM(Double_t *, Double_t *)
Function calculating lab energy of nucleus par[0] for any CM angle x[0].
Double_t ThetaLabVsThetaCM(Double_t *, Double_t *)
Double_t GetCMGamma() const
Double_t TETAMAX[5]
defined only for nuclei 3 et 4
Bool_t fSetOutgoing
= kTRUE if SetOutgoing is called before CalculateKinematics
Double_t WC[5]
cm energy of each nucleus
Double_t EC[5]
cm energies
Double_t GetExcitEnergy() const
Double_t GetMinThetaCMFromThetaLab(Int_t OfNucleus, Double_t theta, Int_t OtherNucleus) const
Double_t WLT
total lab energy
Int_t GetVLab(Int_t OfNucleus, Double_t ThetaLab, Int_t AngleNucleus, Double_t &e1, Double_t &e2) const
Double_t BassIntBarrier()
TVector3 GetCMVelocity() const
Return vector velocity of centre of mass of reaction (units: cm/ns)
void CalculateKinematics()
void init()
Default initialisations.
Double_t GetIntegratedXsec(Double_t b1, Double_t b2)
Double_t GetLabGrazingAngle(Int_t i=1) const
Double_t GetQGroundStates() const
Calculate Q-value for reaction, assuming all nuclei in ground state.
KVNucleus * GetNucleus(Int_t i) const
Double_t XSecRuthCMVsThetaCM(Double_t *, Double_t *)
Double_t GetCMEnergy() const
Return available kinetic energy in centre of mass.
TF1 * fEqbmChargeState
function equilibrium charge state of projectile vs. E/A projectile (Leon et al)
Double_t eqbm_charge_state_shiwietz_solid(Double_t *t, Double_t *)
Double_t GetXSecRuthCM(Double_t ThetaLab_Proj, Int_t OfNucleus=3) const
Double_t fEDiss
dissipated energy, 0 means elastic scattering
Int_t GetThetaCM(Double_t ThetaLab, Int_t OfNucleus, Double_t &t1, Double_t &t2) const
TF1 * GetShiwietzEqbmChargeStateFuncForSolidTargets() const
TF1 * GetELabVsThetaLabFunc(Int_t OfNucleus) const
Description of properties and kinematics of atomic nuclei.
const Char_t * GetSymbol(Option_t *opt="") const
Double_t GetExcitEnergy() const
Double_t GetMassExcess(Int_t z=-1, Int_t a=-1) const
Int_t GetZ() const
Return the number of proton / atomic number.
TVector3 GetMomentum() const
Double_t GetEnergy() const
void SetFrame(const Char_t *frame, const KVFrameTransform &)
KVParticle const * GetFrame(const Char_t *frame, Bool_t warn_and_return_null_if_unknown=kTRUE) const
void SetEnergy(Double_t e)
TVector3 GetVelocity() const
returns velocity vector in cm/ns units
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
void Begin(TString delim) const
KVString Next(Bool_t strip_whitespace=kFALSE) const
virtual void SetRange(Double_t xmin, Double_t xmax)
virtual Double_t Integral(Double_t a, Double_t b, Double_t epsrel=1.e-12)
virtual void SetNpx(Int_t npx=100)
virtual Double_t GetX(Double_t y, Double_t xmin=0, Double_t xmax=0, Double_t epsilon=1.E-10, Int_t maxiter=100, Bool_t logx=false) const
virtual Double_t GetMaximum(Double_t xmin=0, Double_t xmax=0, Double_t epsilon=1.E-10, Int_t maxiter=100, Bool_t logx=false) const
virtual void SetParameter(const TString &name, Double_t value)
virtual Double_t GetMaximumX(Double_t xmin=0, Double_t xmax=0, Double_t epsilon=1.E-10, Int_t maxiter=100, Bool_t logx=false) const
virtual void SetTitle(const char *title="")
virtual void Warning(const char *method, const char *msgfmt,...) const
R__ALWAYS_INLINE Bool_t IsZombie() const
virtual void Error(const char *method, const char *msgfmt,...) const
virtual void Info(const char *method, const char *msgfmt,...) const
void Obsolete(const char *method, const char *asOfVers, const char *removedFromVers) const
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const char *s1, const char *s2)
void SetXYZ(Double_t x, Double_t y, Double_t z)
double beta(double x, double y)
T Mag(const SVector< T, D > &rhs)
const long double g
masses
Double_t Min(Double_t a, Double_t b)
constexpr Double_t PiOver2()
Double_t Power(Double_t x, Double_t y)
constexpr Double_t DegToRad()
Double_t Sqrt(Double_t x)
Bool_t AreEqualAbs(Double_t af, Double_t bf, Double_t epsilon)
Double_t Max(Double_t a, Double_t b)
constexpr Double_t RadToDeg()