KaliVeda
Toolkit for HIC analysis
KV2Body.h
1 /***************************************************************************
2  KV2Body.h - description
3  -------------------
4  begin : 28/11/2003
5  copyright : (C) 2002 by J.D. Frankland
6  email : frankland@ganil.fr
7 
8 $Id: KV2Body.h,v 1.5 2009/02/02 13:52:29 ebonnet Exp $
9  ***************************************************************************/
10 
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  ***************************************************************************/
19 
20 #ifndef KV2BODY_H
21 #define KV2BODY_H
22 
23 #include "KVBase.h"
24 #include <vector>
25 #include <optional>
26 #include "TVector3.h"
27 #include "KVNucleus.h"
28 #include "TF1.h"
29 #include "TGraph.h"
30 #include "KVDrawable.h"
31 
94 
128 
178 class KV2Body: public KVBase {
179 
180  std::vector<KVNucleus> fNuclei;
182 
188 
194 
199 
200  void Set4thNucleus();
208 
209  mutable TF1* fThetaLabVsThetaCM[5];
210  mutable TF1* fELabVsThetaCM[5];
211  mutable TF1* fELabVsThetaLab[5];
212 
214  mutable TF1* fXSecRuthLab[5];
215 
217 
219 
235  std::array<std::optional<double>, 2> solutions;
236  void iterate_solutions(std::function<void(double)> f)
237  {
239  for (auto& s : solutions)
240  if (s)
241  f(*s);
242  }
243  double val(int i)
244  {
246  return solutions[i].value_or(0.);
247  }
248  std::optional<double> first() const
249  {
251  return solutions[0];
252  }
253  std::optional<double> second() const
254  {
256  return solutions[1];
257  }
258  };
259  using KinematicSolutions_v = std::optional<KinematicSolutions>;
261 
262 public:
268  };
273  };
274 
275  void init();
276  KV2Body();
277  KV2Body(const Char_t* systemname);
278  KV2Body(const KVNucleus& compound, double Exx = 0.0);
279  KV2Body(const KVNucleus& proj, const KVNucleus& targ, double Ediss = 0.0);
280  KV2Body(const KVNucleus& proj, const KVNucleus& targ, const KVNucleus& outgoing, double Ediss = 0.0);
281  KV2Body(KVNucleus*, KVNucleus* = nullptr, KVNucleus* = nullptr, Double_t = 0.0);
282  virtual ~ KV2Body();
283 
284  void CalculateKinematics();
286 
287  static Double_t GetVelocity(Double_t mass, Double_t E);
288 
289  void SetProjectile(const KVNucleus&);
290  void SetProjectile(Int_t z, Int_t a = 0);
291  void SetTarget(const KVNucleus&);
292  void SetTarget(Int_t z, Int_t a = 0);
293  void SetOutgoing(const KVNucleus& proj_out);
294 
296  {
302  fEDiss = ex;
303  }
305  {
308  return fEDiss;
309  }
311  {
314  }
316  {
318  return GetExcitEnergy();
319  }
321 
322  Double_t GetQReaction() const;
323  Double_t GetQGroundStates() const;
325 
326  Double_t GetCMEnergy() const;
328 
331 
332  TVector3 GetCMVelocity() const;
335  {
336  Double_t gamma =
337  1.0 - TMath::Power(BCM, 2.);
338  if (gamma > 0.)
339  gamma = 1. / TMath::Sqrt(gamma);
340  else {
341  Warning("GetCMGamma", "1 - (beta)**2 = %f ... strange!", gamma);
342  gamma = 0.0;
343  }
344  return gamma;
345  }
346 
349  KVDrawable<TF1> GetELabVsThetaLabFunc(nucleus_of_interest OfNucleus, kinematic_solution kine_sol = kinematic_solution::high_E_branch) const;
350 
352  {
356  return const_cast<KV2Body*>(this)->GetThetaLabVsThetaCMFunc(OfNucleus)->Eval(ThetaCM);
357  }
358  Double_t GetELab(Double_t ThetaCM, nucleus_of_interest OfNucleus) const
359  {
363  return const_cast<KV2Body*>(this)->GetELabVsThetaCMFunc(OfNucleus)->Eval(ThetaCM);
364  }
365  KinematicSolutions_v GetThetaCM(Double_t ThetaLab, nucleus_of_interest OfNucleus) const;
366  std::optional<double> GetThetaCM(Double_t ThetaLab, nucleus_of_interest OfNucleus, kinematic_solution kine_sol) const;
368  {
370  if (TMath::Abs(OfNucleus - OtherNucleus) % 2) return 180. - theta;
371  return theta;
372  }
373 
375 
376  KinematicSolutions_v GetELab(nucleus_of_interest OfNucleus, Double_t ThetaLab, std::optional<nucleus_of_interest> AngleNucleus = {}) const;
377  KinematicSolutions_v GetVLab(nucleus_of_interest OfNucleus, Double_t ThetaLab, std::optional<nucleus_of_interest> AngleNucleus = {}) const;
378  KinematicSolutions_v GetThetaLab(nucleus_of_interest OfNucleus, Double_t ThetaLab, nucleus_of_interest AngleNucleus) const;
379 
382 
386 
387  KVDrawable<TF1> GetXSecRuthCMFunc(nucleus_of_interest OfNucleus = projectile_like, Double_t theta_cm_min = 1., Double_t theta_cm_max = 179.) const;
388  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;
390 
391  void Print(Option_t* opt = "") const override;
392 
396 
400 
407 
409  {
411  return fIntPrec;
412  }
414  {
416  fIntPrec = precision;
417  }
418 
420  {
422  return GetNucleus(projectile)->GetA() > GetNucleus(target)->GetA();
423  }
424 
425  ClassDefOverride(KV2Body, 0) //Relativistic binary kinematical calculation
426 };
427 
428 #endif
int Int_t
#define f(i)
bool Bool_t
char Char_t
float Float_t
double Double_t
const char Option_t
#define ClassDefOverride(name, id)
Relativistic binary kinematics calculator.
Definition: KV2Body.h:178
Double_t XSecRuthLabInt(Double_t *, Double_t *)
Definition: KV2Body.cpp:1546
Double_t TETAMIN[5]
defined only for nuclei 3 et 4
Definition: KV2Body.h:193
Double_t eqbm_charge_state_shiwietz_gas(Double_t *t, Double_t *)
Definition: KV2Body.cpp:1971
Double_t VC[5]
cm velocities
Definition: KV2Body.h:189
void SetTarget(const KVNucleus &)
Set target for reaction.
Definition: KV2Body.cpp:328
TString GetReactionEquation() const
Definition: KV2Body.cpp:815
void Set4thNucleus()
Definition: KV2Body.cpp:436
TF1 * fELabVsThetaLab[5]
Definition: KV2Body.h:211
Double_t K[5]
ratio of c.m. velocity to velocity of nucleus in c.m. v_cm/v_i_cm
Definition: KV2Body.h:191
std::vector< KVNucleus > fNuclei
nuclei involved in calculation
Definition: KV2Body.h:180
void SetIntegralPrecision(Double_t precision)
Definition: KV2Body.h:413
Double_t WCT
total cm energy
Definition: KV2Body.h:186
void SetEDiss(Double_t ex)
Definition: KV2Body.h:310
KVDrawable< TF1 > GetELabVsThetaLabFunc(nucleus_of_interest OfNucleus, kinematic_solution kine_sol=kinematic_solution::high_E_branch) const
Definition: KV2Body.cpp:1198
Double_t GetIntegralPrecision()
Definition: KV2Body.h:408
Double_t GetSphereDureReactionXSec(Double_t r0=1.05)
Definition: KV2Body.cpp:1712
Double_t ELabVsThetaLab(Double_t *, Double_t *)
Definition: KV2Body.cpp:1094
TF1 * fThetaLabVsThetaCM[5]
Definition: KV2Body.h:209
Double_t GetMaxAngleLab(nucleus_of_interest i) const
Definition: KV2Body.cpp:546
KinematicSolutions_v FindRoots(TF1 *, Double_t) const
Definition: KV2Body.cpp:2150
Double_t GetThetaCM(nucleus_of_interest OfNucleus, Double_t theta, nucleus_of_interest OtherNucleus) const
Definition: KV2Body.h:367
void SetExcitEnergy(Double_t ex)
Definition: KV2Body.h:295
KinematicSolutions_v GetThetaCM(Double_t ThetaLab, nucleus_of_interest OfNucleus) const
Definition: KV2Body.cpp:1045
void SetProjectile(const KVNucleus &)
Set projectile for reaction.
Definition: KV2Body.cpp:353
Double_t fIntPrec
Precision of the TF1::Integral method.
Definition: KV2Body.h:218
KVDrawable< TF1 > GetXSecRuthCMFunc(nucleus_of_interest OfNucleus=projectile_like, Double_t theta_cm_min=1., Double_t theta_cm_max=179.) const
Definition: KV2Body.cpp:1382
Double_t GetXSecRuthLab(Double_t ThetaLab, nucleus_of_interest OfNucleus=projectile_like, kinematic_solution kineSol=high_E_branch) const
Definition: KV2Body.cpp:1524
Double_t GetQReaction() const
Calculate Q-value for reaction, including dissipated (excitation) energy.
Definition: KV2Body.cpp:490
std::optional< KinematicSolutions > KinematicSolutions_v
Definition: KV2Body.h:259
TF1 * fEqbmChargeStateShSol
function equilibrium charge state of projectile vs. E/A projectile (Shiwietz et al solid)
Definition: KV2Body.h:197
Double_t EqbmChargeState(Double_t *t, Double_t *)
Definition: KV2Body.cpp:1819
KVDrawable< TF1 > GetShiwietzEqbmChargeStateFuncForSolidTargets() const
Definition: KV2Body.cpp:1942
void SetOutgoing(const KVNucleus &proj_out)
Definition: KV2Body.cpp:411
TF1 * fKoxReactionXSec
function Kox reaction cross-section [barns] vs. E/A projectile
Definition: KV2Body.h:195
Double_t GetELab(Double_t ThetaCM, nucleus_of_interest OfNucleus) const
Definition: KV2Body.h:358
Double_t XSecRuthCM(Double_t *, Double_t *)
Definition: KV2Body.cpp:1422
virtual ~ KV2Body()
Double_t XSecRuthLab(Double_t *, Double_t *)
Definition: KV2Body.cpp:1488
Double_t BCM
beta of centre of mass
Definition: KV2Body.h:184
TF1 * fEqbmChargeStateShGas
function equilibrium charge state of projectile vs. E/A projectile (Shiwietz et al gas)
Definition: KV2Body.h:198
KVDrawable< TGraph > GetGraphELabVsThetaLab(nucleus_of_interest OfNucleus=projectile_like, int npoints=50) const
Definition: KV2Body.cpp:1319
Double_t GetThetaLab(Double_t ThetaCM, nucleus_of_interest OfNucleus) const
Definition: KV2Body.h:351
KVDrawable< TF1 > GetELabVsThetaCMFunc(nucleus_of_interest OfNucleus) const
Definition: KV2Body.cpp:1166
Double_t GetEDiss() const
Definition: KV2Body.h:315
KinematicSolutions_v GetVLab(nucleus_of_interest OfNucleus, Double_t ThetaLab, std::optional< nucleus_of_interest > AngleNucleus={}) const
Definition: KV2Body.cpp:1230
static Double_t GetVelocity(Double_t mass, Double_t E)
Definition: KV2Body.cpp:394
KVDrawable< TF1 > GetEqbmChargeStateFunc() const
Definition: KV2Body.cpp:1882
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
Definition: KV2Body.cpp:2035
Double_t GetBmaxFromReactionXSec(Double_t ReacXsec)
Definition: KV2Body.cpp:1733
Double_t GetLabGrazingAngle(nucleus_of_interest i=projectile) const
Definition: KV2Body.cpp:613
TVector3 VCM
velocity of centre of mass
Definition: KV2Body.h:183
KVDrawable< TF1 > GetShiwietzEqbmChargeStateFuncForGasTargets() const
Definition: KV2Body.cpp:2003
Double_t KoxReactionXSec(Double_t *, Double_t *)
Definition: KV2Body.cpp:1674
nucleus_of_interest
Definition: KV2Body.h:263
@ target_like
Definition: KV2Body.h:267
@ target
Definition: KV2Body.h:265
@ projectile_like
Definition: KV2Body.h:266
@ projectile
Definition: KV2Body.h:264
Double_t ELabVsThetaCM(Double_t *, Double_t *)
Function calculating lab energy of nucleus par[0] for any CM angle x[0].
Definition: KV2Body.cpp:1111
Double_t ThetaLabVsThetaCM(Double_t *, Double_t *)
Definition: KV2Body.cpp:1130
Double_t GetCMGamma() const
Definition: KV2Body.h:334
Double_t GetMinAngleLab(nucleus_of_interest i) const
Definition: KV2Body.cpp:565
Double_t TETAMAX[5]
defined only for nuclei 3 et 4
Definition: KV2Body.h:192
Bool_t fSetOutgoing
= kTRUE if SetOutgoing is called before CalculateKinematics
Definition: KV2Body.h:216
Double_t WC[5]
cm energy of each nucleus
Definition: KV2Body.h:187
TF1 * fXSecRuthLabIntegral[5]
Definition: KV2Body.h:213
Double_t EC[5]
cm energies
Definition: KV2Body.h:190
Double_t GetExcitEnergy() const
Definition: KV2Body.h:304
Double_t WLT
total lab energy
Definition: KV2Body.h:185
TF1 * fXSecRuthLab[5]
Definition: KV2Body.h:214
Double_t BassIntBarrier()
Definition: KV2Body.cpp:1647
TVector3 GetCMVelocity() const
Return vector velocity of centre of mass of reaction (units: cm/ns)
Definition: KV2Body.cpp:583
void CalculateKinematics()
Definition: KV2Body.cpp:693
void Print(Option_t *opt="") const override
Definition: KV2Body.cpp:874
void init()
Default initialisations.
Definition: KV2Body.cpp:32
KVDrawable< TF1 > GetKoxReactionXSecFunc() const
Definition: KV2Body.cpp:1771
KV2Body()
default ctor
Definition: KV2Body.cpp:61
Double_t GetIntegratedXsec(Double_t b1, Double_t b2)
Definition: KV2Body.cpp:1752
Double_t GetQGroundStates() const
Calculate Q-value for reaction, assuming all nuclei in ground state.
Definition: KV2Body.cpp:509
Double_t XSecRuthCMVsThetaCM(Double_t *, Double_t *)
Definition: KV2Body.cpp:1360
KVDrawable< TF1 > GetThetaLabVsThetaCMFunc(nucleus_of_interest OfNucleus) const
Definition: KV2Body.cpp:1282
Double_t GetXSecRuthCM(Double_t ThetaLab, nucleus_of_interest OfNucleus=projectile_like, kinematic_solution kineSol=high_E_branch) const
Definition: KV2Body.cpp:1463
Double_t GetCMEnergy() const
Return available kinetic energy in centre of mass.
Definition: KV2Body.cpp:532
Bool_t IsInverseKinematics() const
Definition: KV2Body.h:419
kinematic_solution
Definition: KV2Body.h:269
@ low_E_branch
Definition: KV2Body.h:271
@ both_branches
Definition: KV2Body.h:272
@ high_E_branch
Definition: KV2Body.h:270
TF1 * fEqbmChargeState
function equilibrium charge state of projectile vs. E/A projectile (Leon et al)
Definition: KV2Body.h:196
Double_t eqbm_charge_state_shiwietz_solid(Double_t *t, Double_t *)
Definition: KV2Body.cpp:1911
KVNucleus * GetNucleus(nucleus_of_interest i) const
Definition: KV2Body.cpp:468
Double_t fEDiss
dissipated energy, 0 means elastic scattering
Definition: KV2Body.h:181
TF1 * fELabVsThetaCM[5]
Definition: KV2Body.h:210
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
Definition: KV2Body.cpp:2084
Double_t GetIntegratedXSecRuthLab(Float_t th1, Float_t th2, Float_t phi1=-1, Float_t phi2=-1, nucleus_of_interest OfNucleus=projectile_like)
Definition: KV2Body.cpp:1604
Base class for KaliVeda framework.
Definition: KVBase.h:139
void Warning(const char *method, const char *msgfmt,...) const override
Definition: KVBase.cpp:1696
Simple wrapper for objects which can be drawn (graphs, histograms)
Definition: KVDrawable.h:29
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:123
Int_t GetA() const
Definition: KVNucleus.cpp:796
Double_t ex[n]
double gamma(double x)
Double_t Power(Double_t x, Double_t y)
Double_t Sqrt(Double_t x)
Double_t Abs(Double_t d)
Maybe single- or double-valued.
Definition: KV2Body.h:234
std::array< std::optional< double >, 2 > solutions
Definition: KV2Body.h:235
std::optional< double > first() const
Definition: KV2Body.h:248
void iterate_solutions(std::function< void(double)> f)
Definition: KV2Body.h:236
std::optional< double > second() const
Definition: KV2Body.h:253