36 for (
int i = 0; i < 5; i++) {
43 fThetaLabVsThetaCM[i] =
nullptr;
44 fELabVsThetaCM[i] =
nullptr;
45 fELabVsThetaLab[i] =
nullptr;
47 fKoxReactionXSec =
nullptr;
48 fEqbmChargeState =
nullptr;
49 fEqbmChargeStateShSol =
nullptr;
50 fEqbmChargeStateShGas =
nullptr;
53 SetIntegralPrecision(1
e-10);
115 scouple = syst.
Next();
156 Obsolete(
"KV2Body(KVNucleus*, KVNucleus*, KVNucleus*, Double_t)",
"1.11",
"1.12");
159 Info(
"KV2Body",
"Use constructor KV2Body(const KVNucleus& compound) to simulate binary decay of compound");
161 else if (!proj_out) {
162 Info(
"KV2Body",
"Use constructor KV2Body(const KVNucleus& proj, const KVNucleus& targ) to define entrance channel");
165 Info(
"KV2Body",
"Use constructor KV2Body(const KVNucleus& proj, const KVNucleus& targ, const KVNucleus& outgoing) to define entrance & exit channels");
197 : fNuclei(5), fEDiss(-Exx)
243 fNuclei(5), fEDiss(Ediss)
283 fNuclei(5), fEDiss(Ediss)
366 for (
int i = 0; i < 5; i++) {
408 for (
unsigned i = 1; i <= 4; ++i)
if (
fNuclei[i].IsDefined())
fNuclei[i].SetExcitEnergy(0);
466 if (i > 0 && i < 5) {
470 Warning(
"GetNucleus(Int_t i)",
"Index i out of bounds, i=%d", i);
485 Warning(
"GetQReaction",
"Parameters for outgoing nuclei not set");
505 "Parameters for outgoing nuclei not set");
540 if (i < 3 || i > 4) {
541 Warning(
"GetMaxAngleLab(Int_t i)",
542 "Returns maximum scattering angle in lab for nuclei i=3 (quasiproj) and i=4 (quasitarget)");
558 if (i < 3 || i > 4) {
559 Warning(
"GetMinAngleLab(Int_t i)",
560 "Returns minimum scattering angle in lab for nuclei i=3 (quasiproj) and i=4 (quasitarget)");
609 if (i < 1 || i > 2) {
610 Warning(
"GetLabGrazingAngle(Int_t i)",
611 "i should be 1 (proj) or 2 (targ)");
615 Warning(
"GetLabGrazingAngle(Int_t i)",
616 "No target defined for reaction");
625 Double_t RINT = CP + CT + 4.49 - (CT + CP) / 6.35;
693 Error(
"CalculateKinematics",
"Set outgoing (decay) product first");
702 for (
int i = 0; i < 5; i++) {
829 cout <<
" ******" << endl;
838 cout <<
" ==> Q-REACTION = " <<
GetQReaction() <<
" MEV";
841 cout <<
" AVAILABLE ENERGY IN C.M. : ECM = " <<
GetCMEnergy() <<
844 GetA() : 0.)) <<
" MEV/A)" << endl;
848 Mag() <<
" CM/NS" << endl;
850 for (
int i = 1; i <= 4; i++) {
852 cout <<
" ENERGY - VELOCITY OF NUCLEUS " << i <<
" IN CM : " <<
857 cout <<
" MAXIMUM SCATTERING ANGLE IN LABORATORY" << endl;
865 cout <<
" GRAZING ANGLE IN LABORATORY : PROJECTILE " <<
867 cout <<
" GRAZING ANGLE IN LABORATORY : TARGET " <<
874 if (!strcmp(opt,
"lab") || !strcmp(opt,
"LAB")
875 || !strcmp(opt,
"Lab")) {
878 " LABORATORY ANGULAR DISTRIBUTION" << endl
881 " TETA 3 EN.DIF.3 V3 TETA 4 EN.DIF.4 TETA 3"
884 " (LAB) (LAB) (LAB) (LAB) (LAB) (C.M)"
887 for (
int step = 0; step <= nsteps; step++) {
895 GetELab(3, theta, 3, elabP1, elabP2);
897 GetVLab(3, theta, 3, vP1, vP2);
899 GetELab(4, theta, 3, elabT1, elabT2);
901 (
" %6.2f %7.2f/%7.2f %5.2f/%5.2f %6.2f/%6.2f %7.2f/%7.2f %6.2f/%6.2f\n",
902 theta, elabP1, elabP2, vP1, vP2,
903 tlT1, tlT2, elabT1, elabT2,
907 if (
GetNucleus(2) && (!strcmp(opt,
"ruth") || !strcmp(opt,
"RUTH")
908 || !strcmp(opt,
"Ruth"))) {
911 " RUTHERFORD LABORATORY ANGULAR DISTRIBUTION" <<
914 " TETA 3 TETA 3 EN.DIF.3 SIG.RUT. SIG.RUT."
917 " (LAB) (CM) (LAB) (LAB) (b/sr) (CM) (b/sr)"
921 for (
int step = 0; step < nsteps; step++) {
922 Double_t theta = dtheta * (step + 1);
925 GetELab(3, theta, 3, elabP1, elabP2);
928 (
" %6.2f %6.2f %7.2f %10.4g %10.4g\n",
954 if (ThetaLab >
TETAMAX[AngleNucleus])
return 0;
958 TCM1 =
GetThetaCM(OfNucleus, TCM1, AngleNucleus);
959 if (nsol > 1) TCM2 =
GetThetaCM(OfNucleus, TCM2, AngleNucleus);
962 if (nsol == 2) e2 =
GetELab(TCM2, OfNucleus);
1034 if (ThetaL < 0.) ThetaL += 180.;
1098 Int_t nsol =
GetELab(OfNucleus, ThetaLab, AngleNucleus, e1, e2);
1099 if (!nsol)
return nsol;
1126 if (ThetaLab >
TETAMAX[AngleNucleus])
return 0;
1127 if (!(
TMath::Abs(OfNucleus - AngleNucleus) % 2)) {
1135 TCM1 =
GetThetaCM(OfNucleus, TCM1, AngleNucleus);
1136 if (nsol > 1) TCM2 =
GetThetaCM(OfNucleus, TCM2, AngleNucleus);
1202 Warning(
"GetXSecRuthCM",
"No target defined for reaction");
1210 if (TCM < 0)
return 0;
1231 if (theta >
TETAMAX[OtherNucleus])
return -1;
1234 if (!nsol)
return -1.;
1257 Warning(
"XSecRuthCMVsThetaCM",
"No target defined for reaction");
1265 if (OfNucleus == 2 || OfNucleus == 4) TCM =
TMath::Pi() - TCM;
1317 if (DSIDTB * RLC < 0) {
1318 Warning(
"GetXSecRuthLab",
"negative value for choosen parameters : %lf %d\n",
x[0], (
Int_t)par[0]);
1402 if (phi1 == -1 || phi2 == -1) dphi = 2 *
TMath::Pi();
1403 else if (phi1 == phi2) dphi = 1;
1410 if (
th1 < theta_min) theta_min =
th1;
1411 if (
th2 > theta_max) theta_max =
th2;
1413#if ROOT_VERSION_CODE > ROOT_VERSION(5,99,01)
1441 if (OfNucleus == 3)
name +=
"(projectile)";
1442 else name +=
"(target)";
1443 TF1* fXSecRuthCM = (
TF1*)
gROOT->GetListOfFunctions()->FindObject(
name.Data());
1445 fXSecRuthCM =
new TF1(
name.Data(),
1447 theta_cm_min, theta_cm_max, 1,
"KV2Body",
"XSecRuthCMVsThetaCM");
1449 fXSecRuthCM->
SetNpx(1000);
1451 fXSecRuthCM->
SetRange(theta_cm_min, theta_cm_max);
1473 Double_t R12 = r0 * (A1third + A2third);
1476 - 2.9 * A1third * A2third / (A1third + A2third);
1511 Double_t BC = proj->
GetZ() * targ->
GetZ() * e2 / (rc * (A1third + A2third));
1515 pow((A1third + A2third +
a * A1third * A2third / (A1third + A2third) -
c), 2) *
1537 pow(A1third + A2third, 2);
1740 x = Vp / V0 *
pow(Zp, -0.52) *
pow(Zt,
x) / 1.68;
1741 x =
pow(
x, 1. + 1.8 / Zp);
1743 q = (Zp * (12 *
x +
pow(
x, 4.))) /
q;
1773 name +=
" SHIWIETZ-SOLID";
1800 x = Vp / V0 *
pow(Zp, -0.52) *
pow(Zt,
x);
1801 x =
pow(
x, 1. + 0.4 / Zp);
1803 q = (Zp * (376.*
x +
pow(
x, 6.))) /
q;
1834 name +=
" SHIWIETZ-GAS";
1858 Info(
"GetXSecRuthLabFunc",
"Maximum angle set to %lf degrees", theta_max);
1868 if (OfNucleus == 3)
name +=
"(projectile)";
1869 else name +=
"(target)";
1917 if (OfNucleus == 3)
name +=
"(projectile)";
1918 else name +=
"(target)";
1958 if (val >
max)
return nRoots;
1970 if (nRoots == 1)
return nRoots;
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t g
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)
TF1 * GetXSecRuthCMFunc(Int_t OfNucleus=3, Double_t theta_cm_min=1., Double_t theta_cm_max=179.) const
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 Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) 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
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)
RVec< PromoteTypes< T0, T1 > > pow(const RVec< T0 > &v, const T1 &y)
double max(double x, double y)
Double_t Min(Double_t a, Double_t b)
Double_t Landau(Double_t x, Double_t mpv=0, Double_t sigma=1, Bool_t norm=kFALSE)
constexpr Double_t PiOver2()
Double_t ATan2(Double_t y, Double_t x)
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)
constexpr Double_t RadToDeg()
Double_t Log10(Double_t x)