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++) {
812 eqn.
Form(
"%s(%s,%s)%s",
816 eqn.
Form(
"%s(%s,%s)",
820 eqn.
Form(
"(%s,%s)%s",
824 eqn.
Form(
"%s(%s,%s)%s",
874 cout <<
" ******" << endl;
883 cout <<
" ==> Q-REACTION = " <<
GetQReaction() <<
" MEV";
886 cout <<
" AVAILABLE ENERGY IN C.M. : ECM = " <<
GetCMEnergy() <<
889 GetA() : 0.)) <<
" MEV/A)" << endl;
893 Mag() <<
" CM/NS" << endl;
895 for (
int i = 1; i <= 4; i++) {
897 cout <<
" ENERGY - VELOCITY OF NUCLEUS " << i <<
" IN CM : " <<
902 cout <<
" MAXIMUM SCATTERING ANGLE IN LABORATORY" << endl;
910 cout <<
" GRAZING ANGLE IN LABORATORY : PROJECTILE " <<
912 cout <<
" GRAZING ANGLE IN LABORATORY : TARGET " <<
919 if (!strcmp(opt,
"lab") || !strcmp(opt,
"LAB")
920 || !strcmp(opt,
"Lab")) {
923 " LABORATORY ANGULAR DISTRIBUTION" << endl
926 " TETA 3 EN.DIF.3 V3 TETA 4 EN.DIF.4 TETA 3"
929 " (LAB) (LAB) (LAB) (LAB) (LAB) (C.M)"
932 for (
int step = 0; step <= nsteps; step++) {
940 GetELab(3, theta, 3, elabP1, elabP2);
942 GetVLab(3, theta, 3, vP1, vP2);
944 GetELab(4, theta, 3, elabT1, elabT2);
946 (
" %6.2f %7.2f/%7.2f %5.2f/%5.2f %6.2f/%6.2f %7.2f/%7.2f %6.2f/%6.2f\n",
947 theta, elabP1, elabP2, vP1, vP2,
948 tlT1, tlT2, elabT1, elabT2,
952 if (
GetNucleus(2) && (!strcmp(opt,
"ruth") || !strcmp(opt,
"RUTH")
953 || !strcmp(opt,
"Ruth"))) {
956 " RUTHERFORD LABORATORY ANGULAR DISTRIBUTION" <<
959 " TETA 3 TETA 3 EN.DIF.3 SIG.RUT. SIG.RUT."
962 " (LAB) (CM) (LAB) (LAB) (b/sr) (CM) (b/sr)"
966 for (
int step = 0; step < nsteps; step++) {
967 Double_t theta = dtheta * (step + 1);
970 GetELab(3, theta, 3, elabP1, elabP2);
973 (
" %6.2f %6.2f %7.2f %10.4g %10.4g\n",
999 if (ThetaLab >
TETAMAX[AngleNucleus])
return 0;
1003 TCM1 =
GetThetaCM(OfNucleus, TCM1, AngleNucleus);
1004 if (nsol > 1) TCM2 =
GetThetaCM(OfNucleus, TCM2, AngleNucleus);
1006 e1 =
GetELab(TCM1, OfNucleus);
1007 if (nsol == 2) e2 =
GetELab(TCM2, OfNucleus);
1040 if (!nsol)
return 0;
1079 if (ThetaL < 0.) ThetaL += 180.;
1143 Int_t nsol =
GetELab(OfNucleus, ThetaLab, AngleNucleus, e1, e2);
1144 if (!nsol)
return nsol;
1171 if (ThetaLab >
TETAMAX[AngleNucleus])
return 0;
1172 if (!(
TMath::Abs(OfNucleus - AngleNucleus) % 2)) {
1180 TCM1 =
GetThetaCM(OfNucleus, TCM1, AngleNucleus);
1181 if (nsol > 1) TCM2 =
GetThetaCM(OfNucleus, TCM2, AngleNucleus);
1247 Warning(
"GetXSecRuthCM",
"No target defined for reaction");
1255 if (TCM < 0)
return 0;
1276 if (theta >
TETAMAX[OtherNucleus])
return -1;
1279 if (!nsol)
return -1.;
1335 double dth = 180. / (npoints - 1.);
1337 while (i < npoints) {
1338 auto thcm = i * dth;
1359 Warning(
"XSecRuthCMVsThetaCM",
"No target defined for reaction");
1367 if (OfNucleus == 2 || OfNucleus == 4) TCM =
TMath::Pi() - TCM;
1419 if (DSIDTB * RLC < 0) {
1420 Warning(
"GetXSecRuthLab",
"negative value for choosen parameters : %lf %d\n",
x[0], (
Int_t)par[0]);
1504 if (phi1 == -1 || phi2 == -1) dphi = 2 *
TMath::Pi();
1505 else if (phi1 == phi2) dphi = 1;
1512 if (
th1 < theta_min) theta_min =
th1;
1513 if (
th2 > theta_max) theta_max =
th2;
1515 #if ROOT_VERSION_CODE > ROOT_VERSION(5,99,01)
1543 if (OfNucleus == 3)
name +=
"(projectile)";
1544 else name +=
"(target)";
1545 TF1* fXSecRuthCM = (
TF1*)
gROOT->GetListOfFunctions()->FindObject(
name.Data());
1547 fXSecRuthCM =
new TF1(
name.Data(),
1549 theta_cm_min, theta_cm_max, 1,
"KV2Body",
"XSecRuthCMVsThetaCM");
1551 fXSecRuthCM->
SetNpx(1000);
1553 fXSecRuthCM->
SetRange(theta_cm_min, theta_cm_max);
1575 Double_t R12 = r0 * (A1third + A2third);
1578 - 2.9 * A1third * A2third / (A1third + A2third);
1613 Double_t BC = proj->
GetZ() * targ->
GetZ() * e2 / (rc * (A1third + A2third));
1617 pow((A1third + A2third +
a * A1third * A2third / (A1third + A2third) -
c), 2) *
1639 pow(A1third + A2third, 2);
1842 x = Vp / V0 *
pow(Zp, -0.52) *
pow(Zt,
x) / 1.68;
1843 x =
pow(
x, 1. + 1.8 / Zp);
1845 q = (Zp * (12 *
x +
pow(
x, 4.))) /
q;
1875 name +=
" SHIWIETZ-SOLID";
1902 x = Vp / V0 *
pow(Zp, -0.52) *
pow(Zt,
x);
1903 x =
pow(
x, 1. + 0.4 / Zp);
1905 q = (Zp * (376.*
x +
pow(
x, 6.))) /
q;
1936 name +=
" SHIWIETZ-GAS";
1960 Info(
"GetXSecRuthLabFunc",
"Maximum angle set to %lf degrees", theta_max);
1970 if (OfNucleus == 3)
name +=
"(projectile)";
1971 else name +=
"(target)";
2019 if (OfNucleus == 3)
name +=
"(projectile)";
2020 else name +=
"(target)";
2060 if (val >
max)
return nRoots;
2072 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
TString GetReactionEquation() 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
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
KVDrawable< TGraph > GraphELabVsThetaLab(int ofNuc=3, int npoints=50) const
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 Print(Option_t *opt="") const override
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
void Error(const char *method, const char *msgfmt,...) const override
void Warning(const char *method, const char *msgfmt,...) const override
Simple wrapper for objects which can be drawn (graphs, histograms)
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 AddPoint(Double_t x, Double_t y)
void SetTitle(const char *title="") override
virtual void SetTitle(const char *title="")
R__ALWAYS_INLINE Bool_t IsZombie() const
virtual void Info(const char *method, const char *msgfmt,...) const
void Obsolete(const char *method, const char *asOfVers, const char *removedFromVers) const
TString & Append(char c, Ssiz_t rep=1)
void Form(const char *fmt,...)
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 T0 &x, const RVec< T1 > &v)
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)