4 #include "KVIonRangeTableMaterial.h"
7 #include "TGeoManager.h"
8 #include "TGeoMaterial.h"
54 const Char_t* state, Double_t density, Double_t Z, Double_t A)
135 SafeDelete(fComposition);
139 SafeDelete(fStopping);
185 fComposition =
new KVList;
187 else nel = fComposition->GetEntries();
195 fComposition->
Add(l);
218 if (!fComposition) fComposition =
new KVList;
219 else nel = fComposition->GetEntries();
225 l->
SetValue(
"Proportion", Proportion);
226 l->
SetValue(
"Weight", Proportion * Natoms);
228 fComposition->
Add(l);
249 TIter next(fComposition);
265 nvl->
SetValue(
"NormWeight", prop / totW);
282 printf(
"Material : %s (%s) State : %s\n",
292 printf(
"Material : %s (%s) State : %s\n",
294 printf(
"\tEffective Z=%f, A=%f ", fZmat, fAmat);
295 if (
IsGas()) printf(
" Molar Weight = %f g.", fMoleWt);
296 else printf(
" Density = %f g/cm**3", fDens);
298 if (
IsCompound()) printf(
"\tCompound material:\n");
299 else if (
IsMixture()) printf(
"\tMixed material:\n");
301 TIter next(fComposition);
332 printf(
" **** %s Range Table ****\n\n",
GetTable()->GetName());
334 printf(
" Element: Z=%d A=%d\n\n", Z, A);
335 printf(
"\tENERGY (MeV)\t\tRANGE (g/cm**2)");
336 if (!
IsGas() || (
IsGas() && T > 0 && P > 0)) printf(
"\t\tLIN. RANGE");
339 for (Double_t e = 0.1; (e <= 1.e+4 && e <=
GetEmaxValid(Z, A)); e *= 10) {
340 printf(
"\t%10.5g\t\t%10.5g", e, fRange->Eval(e));
341 if (!
IsGas() || (
IsGas() && T > 0 && P > 0)) printf(
"\t\t\t%10.5g", fRange->Eval(e) /
GetDensity() / units);
355 else if (
IsMixture()) output <<
"MIXTURE";
356 else output <<
"ELEMENT";
359 output << fComposition->GetEntries() << endl;
360 TIter next(fComposition);
427 Double_t isoAmat, Double_t T, Double_t P)
462 Double_t isoAmat, Double_t T, Double_t P)
484 Double_t R0 = fRange->Eval(Eres) + e;
497 Double_t isoAmat, Double_t T, Double_t P)
520 fDeltaE->GetRange(e1, e2);
541 Double_t isoAmat, Double_t T, Double_t P)
674 TGeoMaterial* gmat = 0x0;
675 if (!gGeoManager)
return gmat;
682 TGeoElement* gel = gGeoManager->GetElementTable()->FindElement(n.
GetSymbol(
"EL"));
684 ((TGeoMixture*)gmat)->AddElement(gel, poids);
691 if (
IsGas()) gmat->SetState(TGeoMaterial::kMatStateGas);
692 else gmat->SetState(TGeoMaterial::kMatStateSolid);
Base class for KaliVeda framework.
static Double_t ProtectedGetX(const TF1 *func, Double_t val, GetX_status &status, std::optional< Double_t > xmin={}, std::optional< Double_t > xmax={})
void Copy(TObject &) const override
Make a copy of this object.
Material for use in energy loss & range calculations.
virtual Double_t GetLinearEIncOfMaxDeltaEOfIon(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0., Double_t T=-1., Double_t P=-1.)
virtual Double_t GetLinearPunchThroughEnergy(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0., Double_t T=-1., Double_t P=-1.)
void Print(Option_t *="") const override
virtual Double_t GetDeltaEOfIon(Int_t Z, Int_t A, Double_t E, Double_t e, Double_t isoAmat=0.)
void AddCompoundElement(Int_t Z, Int_t A, Int_t Natoms)
virtual Double_t GetLinearMaxDeltaEOfIon(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0., Double_t T=-1., Double_t P=-1.)
virtual Double_t GetLinearEIncFromDeltaEOfIon(Int_t Z, Int_t A, Double_t DeltaE, Double_t e, enum KVIonRangeTable::SolType type=KVIonRangeTable::kEmax, Double_t isoAmat=0., Double_t T=-1., Double_t P=-1.)
virtual Double_t GetEResOfIon(Int_t Z, Int_t A, Double_t E, Double_t e, Double_t isoAmat=0.)
virtual Double_t GetLinearRangeOfIon(Int_t Z, Int_t A, Double_t E, Double_t isoAmat=0, Double_t T=-1., Double_t P=-1.)
TGeoMaterial * GetTGeoMaterial() const
const KVIonRangeTable * GetTable() const
virtual TF1 * GetEResFunction(Double_t e, Int_t Z, Int_t A, Double_t isoAmat=0)=0
const Char_t * GetSymbol() const
virtual Float_t GetEmaxValid(Int_t, Int_t) const
virtual TF1 * GetDeltaEFunction(Double_t e, Int_t Z, Int_t A, Double_t isoAmat=0)=0
void AddMixtureElement(Int_t Z, Int_t A, Int_t Natoms, Double_t Proportion)
KVIonRangeTableMaterial()
Default constructor.
virtual Double_t GetEIncFromDeltaEOfIon(Int_t Z, Int_t A, Double_t DeltaE, Double_t e, enum KVIonRangeTable::SolType type=KVIonRangeTable::kEmax, Double_t isoAmat=0.)
virtual Double_t GetLinearDeltaEOfIon(Int_t Z, Int_t A, Double_t E, Double_t e, Double_t isoAmat=0., Double_t T=-1., Double_t P=-1.)
virtual TF1 * GetRangeFunction(Int_t Z, Int_t A, Double_t isoAmat=0)=0
virtual ~KVIonRangeTableMaterial()
Destructor.
Bool_t IsCompound() const
virtual void Initialize()
void PrintComposition(std::ostream &) const
Print to stream the composition of this material, in a format compatible with the VEDALOSS parameter ...
KVList * GetComposition() const
Double_t GetDensity() const
virtual Double_t GetEIncFromEResOfIon(Int_t Z, Int_t A, Double_t Eres, Double_t e, Double_t isoAmat=0.)
void Copy(TObject &) const override
virtual Double_t GetLinearEResOfIon(Int_t Z, Int_t A, Double_t E, Double_t e, Double_t isoAmat=0., Double_t T=-1., Double_t P=-1.)
void ls(Option_t *="") const override
virtual Double_t GetPunchThroughEnergy(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0.)
virtual Double_t GetLinearEIncFromEResOfIon(Int_t Z, Int_t A, Double_t Eres, Double_t e, Double_t isoAmat=0., Double_t T=-1., Double_t P=-1.)
void SetTemperatureAndPressure(Double_t T, Double_t P)
void PrintRangeTable(Int_t Z, Int_t A, Double_t isoAmat=0, Double_t units=KVUnits::cm, Double_t T=-1, Double_t P=-1)
virtual Double_t GetEIncOfMaxDeltaEOfIon(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0.)
virtual Double_t GetMaxDeltaEOfIon(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0.)
virtual Double_t GetRangeOfIon(Int_t Z, Int_t A, Double_t E, Double_t isoAmat=0.)
Abstract base class for calculation of range & energy loss of charged particles in matter.
std::optional< double > get_element_density(int z) const
Extended TList class which owns its objects by default.
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Int_t GetIntValue(const Char_t *name) const
Double_t GetDoubleValue(const Char_t *name) const
void SetValue(const Char_t *name, value_type value)
Description of properties and kinematics of atomic nuclei.
const Char_t * GetSymbol(Option_t *opt="") const
Double_t GetAtomicMass(std::optional< int > z={}, std::optional< int > a={}) const
Int_t GetZ() const
Return the number of proton / atomic number.
void Add(TObject *obj) override