27 #include "KVNucleus.h"
30 #include "KVDrawable.h"
180 std::vector<KVNucleus> fNuclei;
195 mutable TF1* fKoxReactionXSec;
196 mutable TF1* fEqbmChargeState;
197 mutable TF1* fEqbmChargeStateShSol;
198 mutable TF1* fEqbmChargeStateShGas;
200 void Set4thNucleus();
209 mutable TF1* fThetaLabVsThetaCM[5];
210 mutable TF1* fELabVsThetaCM[5];
211 mutable TF1* fELabVsThetaLab[5];
213 mutable TF1* fXSecRuthLabIntegral[5];
214 mutable TF1* fXSecRuthLab[5];
234 struct KinematicSolutions {
235 std::array<std::optional<double>, 2> solutions;
236 void iterate_solutions(std::function<
void(
double)>
f)
239 for (
auto& s : solutions)
246 return solutions[i].value_or(0.);
248 std::optional<double>
first()
const
253 std::optional<double> second()
const
259 using KinematicSolutions_v = std::optional<KinematicSolutions>;
260 KinematicSolutions_v FindRoots(
TF1*,
Double_t)
const;
370 if (
TMath::Abs(OfNucleus - OtherNucleus) % 2)
return 180. - theta;
416 fIntPrec = precision;
#define ClassDefOverride(name, id)
Relativistic binary kinematics calculator.
Double_t eqbm_charge_state_shiwietz_gas(Double_t *t, Double_t *)
void SetTarget(const KVNucleus &)
Set target for reaction.
TString GetReactionEquation() const
void SetIntegralPrecision(Double_t precision)
void SetEDiss(Double_t ex)
KVDrawable< TF1 > GetELabVsThetaLabFunc(nucleus_of_interest OfNucleus, kinematic_solution kine_sol=kinematic_solution::high_E_branch) const
Double_t GetIntegralPrecision()
Double_t GetSphereDureReactionXSec(Double_t r0=1.05)
Double_t GetMaxAngleLab(nucleus_of_interest i) const
Double_t GetThetaCM(nucleus_of_interest OfNucleus, Double_t theta, nucleus_of_interest OtherNucleus) const
void SetExcitEnergy(Double_t ex)
KinematicSolutions_v GetThetaCM(Double_t ThetaLab, nucleus_of_interest OfNucleus) const
void SetProjectile(const KVNucleus &)
Set projectile for reaction.
KVDrawable< TF1 > GetXSecRuthCMFunc(nucleus_of_interest OfNucleus=projectile_like, Double_t theta_cm_min=1., Double_t theta_cm_max=179.) const
Double_t GetXSecRuthLab(Double_t ThetaLab, nucleus_of_interest OfNucleus=projectile_like, kinematic_solution kineSol=high_E_branch) const
Double_t GetQReaction() const
Calculate Q-value for reaction, including dissipated (excitation) energy.
Double_t EqbmChargeState(Double_t *t, Double_t *)
KVDrawable< TF1 > GetShiwietzEqbmChargeStateFuncForSolidTargets() const
void SetOutgoing(const KVNucleus &proj_out)
Double_t GetELab(Double_t ThetaCM, nucleus_of_interest OfNucleus) const
KVDrawable< TGraph > GetGraphELabVsThetaLab(nucleus_of_interest OfNucleus=projectile_like, int npoints=50) const
Double_t GetThetaLab(Double_t ThetaCM, nucleus_of_interest OfNucleus) const
KVDrawable< TF1 > GetELabVsThetaCMFunc(nucleus_of_interest OfNucleus) const
Double_t GetEDiss() const
KinematicSolutions_v GetVLab(nucleus_of_interest OfNucleus, Double_t ThetaLab, std::optional< nucleus_of_interest > AngleNucleus={}) const
static Double_t GetVelocity(Double_t mass, Double_t E)
KVDrawable< TF1 > GetEqbmChargeStateFunc() const
KVDrawable< TF1 > GetXSecRuthLabFunc(nucleus_of_interest OfNucleus=projectile_like, kinematic_solution kineSol=high_E_branch, Double_t theta_min=1., Double_t theta_max=179.) const
Double_t GetBmaxFromReactionXSec(Double_t ReacXsec)
Double_t GetLabGrazingAngle(nucleus_of_interest i=projectile) const
KVDrawable< TF1 > GetShiwietzEqbmChargeStateFuncForGasTargets() const
Double_t KoxReactionXSec(Double_t *, Double_t *)
Double_t GetCMGamma() const
Double_t GetMinAngleLab(nucleus_of_interest i) const
Double_t GetExcitEnergy() 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.
KVDrawable< TF1 > GetKoxReactionXSecFunc() const
Double_t GetIntegratedXsec(Double_t b1, Double_t b2)
Double_t GetQGroundStates() const
Calculate Q-value for reaction, assuming all nuclei in ground state.
KVDrawable< TF1 > GetThetaLabVsThetaCMFunc(nucleus_of_interest OfNucleus) const
Double_t GetXSecRuthCM(Double_t ThetaLab, nucleus_of_interest OfNucleus=projectile_like, kinematic_solution kineSol=high_E_branch) const
Double_t GetCMEnergy() const
Return available kinetic energy in centre of mass.
Bool_t IsInverseKinematics() const
Double_t eqbm_charge_state_shiwietz_solid(Double_t *t, Double_t *)
KVNucleus * GetNucleus(nucleus_of_interest i) const
KVDrawable< TF1 > GetXSecRuthLabIntegralFunc(nucleus_of_interest OfNucleus=projectile_like, Double_t theta_min=1., Double_t theta_max=179., kinematic_solution kineSol=high_E_branch) const
Double_t GetIntegratedXSecRuthLab(Float_t th1, Float_t th2, Float_t phi1=-1, Float_t phi2=-1, nucleus_of_interest OfNucleus=projectile_like)
Base class for KaliVeda framework.
Simple wrapper for objects which can be drawn (graphs, histograms)
Description of properties and kinematics of atomic nuclei.
void Warning(UserClass p, const char *location, const char *va_(fmt),...)
Double_t Power(Double_t x, Double_t y)
Double_t Sqrt(Double_t x)