KaliVeda
Toolkit for HIC analysis
KVMaterialStack.h
1 #ifndef __KVMATERIALSTACK_H
2 #define __KVMATERIALSTACK_H
3 
4 #include "KVBase.h"
5 #include "KVDetector.h"
6 
21 class KVMaterialStack : public KVBase {
22 private:
23  TF1 fELossF;
24  TF1 fEResF;
25  TF1 fmaxELossF;
26  const KVDetector* fDetector = nullptr;
27  std::vector<KVMaterial> fAbsorbers;
28  std::vector<double> fLayThick;
29  Int_t fActiveLayer = 0;
30  Double_t fIncAngle = 0.;
31  Double_t fIncAngleCosine = 1.;
32 
33  Double_t ELossActive(Double_t* x, Double_t* par);
34  Double_t EResDet(Double_t* x, Double_t* par);
35  Double_t MaxELossActive(Double_t* x, Double_t* par);
36 
37 public:
38  KVMaterialStack() = default;
39  KVMaterialStack(const KVDetector*, double = 0.0);
40 
41  void SetIncidenceAngle(double psi)
42  {
44  fIncAngle = psi;
45  fIncAngleCosine = TMath::Abs(TMath::Cos(TMath::DegToRad() * psi));
46  }
47 
51 
53  {
57 
58  return GetELossFunction(Z, A).GetMaximum();
59  }
61  {
63 
64  return GetELossFunction(Z, A).GetMaximumX();
65  }
66 
68  {
71  KVBase::GetX_status status;
72  return 1.01 * ProtectedGetX(GetMaxELossFunction(Z, A),Emax,status); // increase returned angle by 1% just to be sure
73  }
75  Double_t GetIncidentEnergy(Int_t Z, Int_t A, Double_t delta_e, enum KVMaterial::SolType type = KVMaterial::SolType::kEmax);
76  Double_t GetERes(Int_t Z, Int_t A, Double_t Einc);
79 
80  ClassDef(KVMaterialStack, 1) //A stack of materials in which successive energy losses of charged particles can be calculated
81 };
82 
83 #endif
int Int_t
double Double_t
#define ClassDef(name, id)
Base class for KaliVeda framework.
Definition: KVBase.h:140
GetX_status
Definition: KVBase.h:321
static Double_t ProtectedGetX(const TF1 *func, Double_t val, GetX_status &status, std::optional< Double_t > xmin={}, std::optional< Double_t > xmax={})
Definition: KVBase.cpp:1622
Base class for detector geometry description, interface to energy-loss calculations.
Definition: KVDetector.h:173
A stack of materials in which successive energy losses of charged particles can be calculated ,...
Double_t GetIncidentEnergyFromERes(Int_t Z, Int_t A, Double_t Eres)
TF1 & GetEResFunction(Int_t Z, Int_t A)
Double_t GetEIncOfMaxDeltaE(Int_t Z, Int_t A)
Double_t GetERes(Int_t Z, Int_t A, Double_t Einc)
TF1 & GetELossFunction(Int_t Z, Int_t A)
TF1 & GetMaxELossFunction(Int_t Z, Int_t A)
Double_t GetMinimumIncidentAngleForDEMax(Int_t Z, Int_t A, Double_t Emax)
Double_t GetIncidentEnergy(Int_t Z, Int_t A, Double_t delta_e, enum KVMaterial::SolType type=KVMaterial::SolType::kEmax)
Double_t GetTotalDeltaE(Int_t Z, Int_t A, Double_t Einc)
KVMaterialStack()=default
void SetIncidenceAngle(double psi)
Double_t GetDeltaE(Int_t Z, Int_t A, Double_t Einc)
Returns energy loss of given nucleus in the active layer of the detector.
Double_t GetMaxDeltaE(Int_t Z, Int_t A)
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 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
Double_t x[n]
constexpr Double_t DegToRad()
Double_t Cos(Double_t)
Double_t Abs(Double_t d)