KaliVeda  1.12/06
Heavy-Ion Analysis Toolkit
KVIonRangeTableMaterial.cpp
Go to the documentation of this file.
1 //Created by KVClassFactory on Fri Sep 28 11:34:14 2012
2 //Author: John Frankland,,,
3 
5 #include "TF1.h"
6 #include "KVNucleus.h"
7 #include "TGeoManager.h"
8 #include "TGeoMaterial.h"
9 #include "KVElementDensity.h"
10 #include "KVNDTManager.h"
11 
12 using namespace std;
13 
15 
16 
17 
21  : KVBase(),
22  fTable(0),
23  fState("unknown"),
24  fComposition(0),
25  fCompound(kFALSE),
26  fMixture(kFALSE),
27  fDens(0.),
28  fZmat(0),
29  fAmat(0),
30  fMoleWt(0),
31  fDeltaE(0),
32  fEres(0),
33  fRange(0),
34  fStopping(0)
35 {
36  // Default constructor
37 }
38 
39 
40 
52 
54  const Char_t* state, Double_t density, Double_t Z, Double_t A)
55  : KVBase(name, symbol),
56  fTable(tab),
57  fState(state),
58  fComposition(0),
59  fCompound(kFALSE),
60  fMixture(kFALSE),
61  fDens(density),
62  fZmat(Z),
63  fAmat(A),
64  fMoleWt(0),
65  fDeltaE(0),
66  fEres(0),
67  fRange(0),
68  fStopping(0)
69 {
70  // Create new material with given (long) name and symbol
71  // symbol convention: for elements, use element symbol. for compounds, use chemical formula.
72  // e.g. silicon: name="Silicon" symbol="Si"
73  // C4H10: name="Isobutane", symbol="C4H10"
74  // state="solid", "liquid", "gas"
75  //
76  // Density [g/cm**3] must be given for solid compounds/mixtures.
77  // Densities of atomic elements are known (gNDTManager->GetValue(z, a, "ElementDensity")), they
78  // will be used automatically, unless a different value is given here.
79  // Densities of gases are calculated from the molar weight, temperature and pressure.
80 
81  if (Z > 0 && density < 0) {
82  KVElementDensity* ed = (KVElementDensity*)gNDTManager->GetData(Z, A, "ElementDensity");
83  if (!ed) {
84  Warning("KVIonRangeTableMaterial",
85  "No element found in density table with Z=%f, density unknown", Z);
86  }
87  else
88  fDens = ed->GetValue();
89  }
90 }
91 
92 
93 
94 
101 
103  fTable(0),
104  fState("unknown"),
105  fComposition(0),
106  fCompound(kFALSE),
107  fMixture(kFALSE),
108  fDens(0.),
109  fZmat(0),
110  fAmat(0),
111  fMoleWt(0),
112  fDeltaE(0),
113  fEres(0),
114  fRange(0),
115  fStopping(0)
116 {
117  // Copy constructor
118  // This ctor is used to make a copy of an existing object (for example
119  // when a method returns an object), and it is always a good idea to
120  // implement it.
121  // If your class allocates memory in its constructor(s) then it is ESSENTIAL :-)
122 
123  obj.Copy(*this);
124 }
125 
126 
127 
130 
132 {
133  // Destructor
136  SafeDelete(fEres);
139 }
140 
141 
142 
143 
151 
153 {
154  // This method copies the current state of 'this' object into 'obj'
155  // You should add here any member variables, for example:
156  // (supposing a member variable KVIonRangeTableMaterial::fToto)
157  // CastedObj.fToto = fToto;
158  // or
159  // CastedObj.SetToto( GetToto() );
160 
161  KVBase::Copy(obj);
162  //KVIonRangeTableMaterial& CastedObj = (KVIonRangeTableMaterial&)obj;
163 }
164 
165 
166 
172 
174 {
175  // Add an element to a compound material
176  // Example: to define C3F8 gas:
177  // toto.AddCompoundElement(6,12,3);
178  // toto.AddCompoundElement(9,19,8);
179 
180  fCompound = kTRUE;
181  KVNucleus n(Z, A);
182  Int_t nel = 0;
183  if (!fComposition) {
184  fComposition = new KVList;
185  }
186  else nel = fComposition->GetEntries();
187  KVNameValueList* l = new KVNameValueList(Form("Compound element %d", nel + 1));
188  l->SetValue("Z", Z);
189  l->SetValue("A", A);
190  l->SetValue("Ar", n.GetAtomicMass());
191  l->SetValue("Natoms", Natoms);
192  l->SetValue("Weight", Natoms);
193  l->SetValue("Ar*Weight", n.GetAtomicMass()*Natoms);
194  fComposition->Add(l);
195 }
196 
197 
198 
205 
207 {
208  // Add an element to a mixed material
209  // Example: to define air, assuming 78% nitrogen (N2) and 21% oxygen (O2) and 1% argon (Ar):
210  // toto.AddMixtureElement(7,14, 2, 0.78);
211  // toto.AddMixtureElement(8,16, 2, 0.21);
212  // toto.AddMixtureElement(18, 40, 2, 0.01);
213 
214  fMixture = kTRUE;
215  KVNucleus n(Z, A);
216  Int_t nel = 0;
217  if (!fComposition) fComposition = new KVList;
218  else nel = fComposition->GetEntries();
219  KVNameValueList* l = new KVNameValueList(Form("Mixture element %d", nel + 1));
220  l->SetValue("Z", Z);
221  l->SetValue("A", A);
222  l->SetValue("Ar", n.GetAtomicMass());
223  l->SetValue("Natoms", Natoms);
224  l->SetValue("Proportion", Proportion);
225  l->SetValue("Weight", Proportion * Natoms);
226  l->SetValue("Ar*Weight", n.GetAtomicMass()*Proportion * Natoms);
227  fComposition->Add(l);
228 }
229 
230 
231 
236 
238 {
239  // Correctly initialize material ready for use
240  // For compound or mixed materials, calculate normalised weights of components,
241  // effective Z and A, and molar weight of substance
242 
243  fMoleWt = 0.;
244  if (IsCompound() || IsMixture()) {
245  // mixture or compound
246  // calculate molar weight and effective Z & A
247  fZmat = fAmat = 0;
248  TIter next(fComposition);
249  KVNameValueList* nvl;
250  Double_t totW = 0;
251  while ((nvl = (KVNameValueList*)next())) {
252  Double_t arw = nvl->GetDoubleValue("Ar*Weight");
253  Double_t poid = nvl->GetDoubleValue("Weight");
254  fMoleWt += arw;
255  totW += poid;
256  fZmat += poid * nvl->GetIntValue("Z");
257  fAmat += poid * nvl->GetIntValue("A");
258  }
259  fZmat /= totW;
260  fAmat /= totW;
261  next.Reset();
262  while ((nvl = (KVNameValueList*)next())) {
263  Double_t prop = nvl->GetDoubleValue("Weight");
264  nvl->SetValue("NormWeight", prop / totW);
265  }
266  }
267  else {
268  // isotopically-pure elemental material
269  // get mass of 1 mole of element
271  fMoleWt = n.GetAtomicMass();
272  }
273 }
274 
275 
276 
278 
280 {
281  printf("Material : %s (%s) State : %s\n",
282  GetName(), GetSymbol(), fState.Data());
283 }
284 
285 
286 
288 
290 {
291  printf("Material : %s (%s) State : %s\n",
292  GetName(), GetSymbol(), fState.Data());
293  printf("\tEffective Z=%f, A=%f ", fZmat, fAmat);
294  if (IsGas()) printf(" Molar Weight = %f g.", fMoleWt);
295  else printf(" Density = %f g/cm**3", fDens);
296  printf("\n");
297  if (IsCompound()) printf("\tCompound material:\n");
298  else if (IsMixture()) printf("\tMixed material:\n");
299  if (IsCompound() || IsMixture()) {
300  TIter next(fComposition);
301  KVNameValueList* nvl;
302  while ((nvl = (KVNameValueList*)next())) {
303  KVNucleus n(nvl->GetIntValue("Z"), nvl->GetIntValue("A"));
304  printf("\t\tElement: %s Ar=%f g. Natoms=%d", n.GetSymbol(), n.GetAtomicMass(), nvl->GetIntValue("Natoms"));
305  if (IsMixture()) printf(" Proportion=%f", nvl->GetDoubleValue("Proportion"));
306  printf("\n");
307  }
308  }
309  printf("\n\n");
310 }
311 
312 
313 
314 
321 
323 {
324  // Print range of element (in g/cm**2) as a function of incident energy (in MeV).
325  // For solid elements, print also the linear range (in cm). To change the default units,
326  // set optional argument units (e.g. to have linear range in microns, call with units = KVUnits::um).
327  // For gaseous elements, give the temperature (in degrees) and the pressure (in torr)
328  // in order to print the range in terms of length units.
329 
330  GetRangeFunction(Z, A, isoAmat);
331  printf(" **** %s Range Table ****\n\n", GetTable()->GetName());
332  ls();
333  printf(" Element: Z=%d A=%d\n\n", Z, A);
334  printf("\tENERGY (MeV)\t\tRANGE (g/cm**2)");
335  if (!IsGas() || (IsGas() && T > 0 && P > 0)) printf("\t\tLIN. RANGE");
337  printf("\n\n");
338  for (Double_t e = 0.1; (e <= 1.e+4 && e <= GetEmaxValid(Z, A)); e *= 10) {
339  printf("\t%10.5g\t\t%10.5g", e, fRange->Eval(e));
340  if (!IsGas() || (IsGas() && T > 0 && P > 0)) printf("\t\t\t%10.5g", fRange->Eval(e) / GetDensity() / units);
341  printf("\n");
342  }
343 }
344 
345 
346 
349 
350 void KVIonRangeTableMaterial::PrintComposition(ostream& output) const
351 {
352  // Print to stream the composition of this material, in a format compatible with the VEDALOSS parameter file.
353  if (IsCompound()) output << "COMPOUND";
354  else if (IsMixture()) output << "MIXTURE";
355  else output << "ELEMENT";
356  output << endl;
357  if (IsCompound() || IsMixture()) {
358  output << fComposition->GetEntries() << endl;
359  TIter next(fComposition);
360  KVNameValueList* nvl;
361  while ((nvl = (KVNameValueList*)next())) {
362  KVNucleus n(nvl->GetIntValue("Z"), nvl->GetIntValue("A"));
363  output << n.GetZ() << " " << n.GetA() << " " << nvl->GetIntValue("Natoms");
364  if (IsMixture()) output << " " << nvl->GetDoubleValue("Proportion");
365  output << endl;
366  }
367  }
368 }
369 
370 
371 
375 
377 {
378  // Returns range (in g/cm**2) of ion (Z,A) with energy E (MeV) in material.
379  // Give Amat to change default (isotopic) mass of material,
380 
381  TF1* f = GetRangeFunction(Z, A, isoAmat);
382  return f->Eval(E);
383 }
384 
385 
386 
391 
393 {
394  // Returns range (in cm) of ion (Z,A) with energy E (MeV) in material.
395  // Give Amat to change default (isotopic) mass of material,
396  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
397 
399  if (fDens > 0) return GetRangeOfIon(Z, A, E, isoAmat) / GetDensity();
400  else return 0.;
401 }
402 
403 
404 
408 
410 {
411  // Returns energy lost (in MeV) by ion (Z,A) with energy E (MeV) after thickness e (in g/cm**2).
412  // Give Amat to change default (isotopic) mass of material,
413 
414  TF1* f = GetDeltaEFunction(e, Z, A, isoAmat);
415  return f->Eval(E);
416 }
417 
418 
419 
424 
426  Double_t isoAmat, Double_t T, Double_t P)
427 {
428  // Returns energy lost (in MeV) by ion (Z,A) with energy E (MeV) after thickness e (in cm).
429  // Give Amat to change default (isotopic) mass of material,
430  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
431 
433  e *= GetDensity();
434  return GetDeltaEOfIon(Z, A, E, e, isoAmat);
435 }
436 
437 
438 
442 
444  Double_t isoAmat)
445 {
446  // Returns energy lost (in MeV) by ion (Z,A) with energy E (MeV) after thickness e (in g/cm**2).
447  // Give Amat to change default (isotopic) mass of material,
448 
449  TF1* f = GetEResFunction(e, Z, A, isoAmat);
450  return f->Eval(E);
451 }
452 
453 
454 
459 
461  Double_t isoAmat, Double_t T, Double_t P)
462 {
463  // Returns energy lost (in MeV) by ion (Z,A) with energy E (MeV) after thickness e (in cm).
464  // Give Amat to change default (isotopic) mass of material,
465  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
466 
468  e *= GetDensity();
469  return GetEResOfIon(Z, A, E, e, isoAmat);
470 }
471 
472 
473 
477 
479 {
480  // Calculates incident energy (in MeV) of an ion (Z,A) with residual energy Eres (MeV) after thickness e (in g/cm**2).
481  // Give Amat to change default (isotopic) mass of material,
482  GetRangeFunction(Z, A, isoAmat);
483  Double_t R0 = fRange->Eval(Eres) + e;
484  return fRange->GetX(R0);
485 }
486 
487 
488 
493 
495  Double_t isoAmat, Double_t T, Double_t P)
496 {
497  // Calculates incident energy (in MeV) of an ion (Z,A) with residual energy Eres (MeV) after thickness e (in cm).
498  // Give Amat to change default (isotopic) mass of material,
499  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
500 
502  e *= GetDensity();
503  return GetEIncFromEResOfIon(Z, A, Eres, e, isoAmat);
504 }
505 
506 
507 
511 
513 {
514  // Calculates incident energy (in MeV) of an ion (Z,A) from energy loss DeltaE (MeV) in thickness e (in g/cm**2).
515  // Give Amat to change default (isotopic) mass of material,
516  GetDeltaEFunction(e, Z, A, isoAmat);
517  Double_t e1, e2;
518  fDeltaE->GetRange(e1, e2);
519  switch (type) {
521  e2 = GetEIncOfMaxDeltaEOfIon(Z, A, e, isoAmat);
522  break;
524  e1 = GetEIncOfMaxDeltaEOfIon(Z, A, e, isoAmat);
525  break;
526  }
527  return fDeltaE->GetX(DeltaE, e1, e2);
528 }
529 
530 
531 
536 
538  Double_t isoAmat, Double_t T, Double_t P)
539 {
540  // Calculates incident energy (in MeV) of an ion (Z,A) from energy loss DeltaE (MeV) in thickness e (in cm).
541  // Give Amat to change default (isotopic) mass of material,
542  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
543 
545  e *= GetDensity();
546  return GetEIncFromDeltaEOfIon(Z, A, deltaE, e, type, isoAmat);
547 }
548 
549 
550 
556 
558 {
559  // Calculate incident energy (in MeV) for ion (Z,A) for which the range is equal to the
560  // given thickness e (in g/cm**2). At this energy the residual energy of the ion is (just) zero,
561  // for all energies above this energy the residual energy is > 0.
562  // Give Amat to change default (isotopic) mass of material.
563 
564  return GetRangeFunction(Z, A, isoAmat)->GetX(e);
565 }
566 
567 
568 
575 
577 {
578  // Calculate incident energy (in MeV) for ion (Z,A) for which the range is equal to the
579  // given thickness e (in cm). At this energy the residual energy of the ion is (just) zero,
580  // for all energies above this energy the residual energy is > 0.
581  // Give Amat to change default (isotopic) mass of material.
582  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
583 
585  e *= GetDensity();
586  return GetPunchThroughEnergy(Z, A, e, isoAmat);
587 }
588 
589 
590 
594 
596 {
597  // Calculate maximum energy loss (in MeV) of ion (Z,A) in given thickness e (in g/cm**2).
598  // Give Amat to change default (isotopic) mass of material.
599 
600  return GetDeltaEFunction(e, Z, A, isoAmat)->GetMaximum();
601 }
602 
603 
604 
609 
611 {
612  // Calculate incident energy (in MeV) corresponding to maximum energy loss of ion (Z,A)
613  // in given thickness e (in g/cm**2).
614  // Give Amat to change default (isotopic) mass of material.
615 
616  return GetDeltaEFunction(e, Z, A, isoAmat)->GetMaximumX();
617 }
618 
619 
620 
625 
627 {
628  // Calculate maximum energy loss (in MeV) of ion (Z,A) in given thickness e (in cm).
629  // Give Amat to change default (isotopic) mass of material.
630  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
631 
633  e *= GetDensity();
634  return GetMaxDeltaEOfIon(Z, A, e, isoAmat);
635 }
636 
637 
638 
644 
646 {
647  // Calculate incident energy (in MeV) corresponding to maximum energy loss of ion (Z,A)
648  // in given thickness e (in cm).
649  // Give Amat to change default (isotopic) mass of material.
650  // give temperature (degrees C) & pressure (torr) (T,P) for gaseous materials.
651 
653  e *= GetDensity();
654  return GetEIncOfMaxDeltaEOfIon(Z, A, e, isoAmat);
655 }
656 
657 
658 
663 
665 {
666  // Create and return pointer to a TGeoMaterial or TGeoMixture (for compound materials)
667  // with the properties of this material.
668  // gGeoManager must exist.
669 
670  TGeoMaterial* gmat = 0x0;
671  if (!gGeoManager) return gmat;
672  if (IsCompound()) {
673  gmat = new TGeoMixture(GetTitle(), GetComposition()->GetEntries(), GetDensity());
674  TIter next(GetComposition());
675  KVNameValueList* nvl;
676  while ((nvl = (KVNameValueList*)next())) {
677  KVNucleus n(nvl->GetIntValue("Z"), nvl->GetIntValue("A"));
678  TGeoElement* gel = gGeoManager->GetElementTable()->FindElement(n.GetSymbol("EL"));
679  float poids = nvl->GetDoubleValue("NormWeight");
680  ((TGeoMixture*)gmat)->AddElement(gel, poids);
681  }
682  }
683  else {
684  gmat = new TGeoMaterial(GetTitle(), GetMass(), GetZ(), GetDensity());
685  }
686  // set state of material
689  return gmat;
690 }
691 
692 
int Int_t
KVNDTManager * gNDTManager
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
#define SafeDelete(p)
#define f(i)
#define e(i)
char Char_t
const Bool_t kFALSE
double Double_t
const Bool_t kTRUE
const char Option_t
int type
R__EXTERN TGeoManager * gGeoManager
char * Form(const char *fmt,...)
Base class for KaliVeda framework.
Definition: KVBase.h:135
virtual void Copy(TObject &) const
Make a copy of this object.
Definition: KVBase.cpp:397
Atomic element with name, symbol and density.
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.)
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.)
TF1 * fDeltaE
function parameterising energy loss in material
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.)
Double_t fZmat
effective atomic number of material
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)
Double_t fDens
density of material in g/cm**3
KVIonRangeTableMaterial()
Default constructor.
TString fState
state of material = "solid", "liquid", "gas", "unknown"
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.
void ls(Option_t *="") const
void PrintComposition(std::ostream &) const
Print to stream the composition of this material, in a format compatible with the VEDALOSS parameter ...
Double_t fAmat
effective mass number of material
TF1 * fEres
function parameterising residual energy after crossing material
virtual Double_t GetEIncFromEResOfIon(Int_t Z, Int_t A, Double_t Eres, Double_t e, Double_t isoAmat=0.)
TF1 * fRange
function parameterising range of charged particles in material
TF1 * fStopping
function parameterising stopping power of charged particles in material
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 Print(Option_t *="") const
virtual Double_t GetPunchThroughEnergy(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0.)
KVList * fComposition
composition of compound/mixture
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.)
Double_t fMoleWt
mass of one mole of substance in grammes
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.
Extended TList class which owns its objects by default.
Definition: KVList.h:27
KVNuclData * GetData(Int_t zz, Int_t aa, const Char_t *name) const
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)
Double_t GetValue() const
Definition: KVNuclData.cpp:108
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:125
virtual void Add(TObject *obj)
virtual Int_t GetEntries() const
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 void GetRange(Double_t &xmin, Double_t &xmax) 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 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
TGeoElement * FindElement(const char *name) const
TGeoElementTable * GetElementTable()
void SetState(EGeoMaterialState state)
void Reset()
virtual const char * GetName() const
virtual const char * GetTitle() const
virtual void Warning(const char *method, const char *msgfmt,...) const
const char * Data() const
const Int_t n
double T(double x)
constexpr Double_t E()
#define R0(v, w, x, y, z, i)
auto * l