KaliVeda
Toolkit for HIC analysis
KVedaLossMaterial.cpp
1 //Created by KVClassFactory on Wed Feb 2 16:13:08 2011
2 //Author: frankland,,,,
3 
4 #include "KVedaLossMaterial.h"
5 #include <TMath.h>
6 #include "KVIonRangeTable.h"
7 #include <TEnv.h>
8 #include <TF1.h>
9 #include "KVedaLossInverseRangeFunction.h"
10 #include "KVedaLoss.h"
11 
13 
16 
17 
20 
22  : KVIonRangeTableMaterial(), fInvRange(ZMAX_VEDALOSS, 1),
23  fEmin(ZMAX_VEDALOSS), fEmax(ZMAX_VEDALOSS), fCoeff(ZMAX_VEDALOSS, std::vector<Double_t>(14))
24 {
25  // Default constructor
26  for (int i = 0; i < ZMAX_VEDALOSS; i++) {
27  fEmin[i] = 0.0;
28  fEmax[i] = 500.0;
29  }
31 }
32 
33 
34 
37 
38 KVedaLossMaterial::KVedaLossMaterial(const KVIonRangeTable* t, const Char_t* name, const Char_t* type, const Char_t* state,
39  Double_t density, Double_t Z, Double_t A, Double_t)
40  : KVIonRangeTableMaterial(t, name, type, state, density, Z, A), fInvRange(ZMAX_VEDALOSS, 1),
41  fEmin(ZMAX_VEDALOSS), fEmax(ZMAX_VEDALOSS), fCoeff(ZMAX_VEDALOSS, std::vector<Double_t>(14))
42 {
43  // create new material
44  fgTable = static_cast<KVedaLoss*>(const_cast<KVIonRangeTable*>(t));
45  for (int i = 0; i < ZMAX_VEDALOSS; i++) {
46  fEmin[i] = 0.0;
47  fEmax[i] = 500.0;
48  }
50 }
51 
52 
53 
56 
58 {
59  // Destructor
60 }
61 
62 
63 
79 
81 {
82  // Read Z- & A-dependent range parameters for material
83  //
84  // For each material we create 4 TF1 objects:
85  // - KVedaLossMaterial:[type]:Range - gives range in g/cm**2 as a function of particle energy
86  // - KVedaLossMaterial:[type]:StoppingPower - gives dE/dx in MeV/(g/cm**2) as a function of particle energy
87  // - KVedaLossMaterial:[type]:EnergyLoss - gives dE as a function of particle energy
88  // - KVedaLossMaterial:[type]:ResidualEnergy - gives energy after material (0 if particle stops)
89  //
90  // The TF1::fNpx parameter for these functions is defined by the environment variables
91  //
92  // - KVedaLoss.Range.Npx: 20 /* also used for StoppingPower */
93  // - KVedaLoss.EnergyLoss.Npx: 50
94  // - KVedaLoss.ResidualEnergy.Npx: 20
95  //
96 
97  char line[132];
98 
99  //look for energy limits to calculation validity
100  if (!fgets(line, 132, fp)) {
101  Warning("ReadRangeTable", "Problem reading energy limits in range table file for %s (%s)",
102  GetName(), GetType());
103  return kFALSE;
104  }
105  else {
106  if (!strncmp(line, "COMPOUND", 8)) {
107  // material is compound. read composition for TGeoMixture.
108  if (fgets(line, 132, fp)) {}
109  int nel = atoi(line); // read number of elements
110  for (int el = 0; el < nel; el++) {
111  if (fgets(line, 132, fp)) {}
112  int z, a, w;
113  sscanf(line, "%d %d %d", &z, &a, &w);
114  AddCompoundElement(z, a, w);
115  }
116  }
117  else if (!strncmp(line, "MIXTURE", 7)) {
118  // material is mixture. read composition for TGeoMixture.
119  if (fgets(line, 132, fp)) {}
120  int nel = atoi(line); // read number of elements
121  for (int el = 0; el < nel; el++) {
122  if (fgets(line, 132, fp)) {}
123  int z, a, nat;
124  float w;
125  sscanf(line, "%d %d %d %f", &z, &a, &nat, &w);
126  AddMixtureElement(z, a, nat, w);
127  }
128  }
129  }
130  if (!fgets(line, 132, fp)) {
131  Warning("ReadRangeTable", "Problem reading energy limits in range table file for %s (%s)",
132  GetName(), GetType());
133  return kFALSE;
134  }
135  else {
136  while (line[0] == 'Z') {
137  Int_t z1, z2;
138  Float_t e1, e2;
139  if (sscanf(line, "Z = %d,%d %f < E/A < %f MeV", &z1,
140  &z2, &e1, &e2) != 4) {
141  Error("ReadRangeTable", "Problem reading energy limits in range table file for %s (%s)",
142  GetName(), GetType());
143  return kFALSE;
144  }
145  line[0] = '\0';
146  if (!fgets(line, 132, fp)) break;
147  for (int i = z1; i <= z2; i++) {
148  fEmin[i - 1] = e1;
149  fEmax[i - 1] = e2;
150  }
151  }
152  if (line[0] == '\0') {
153  Error("ReadRangeTable", "Problem with range table file for %s (%s)",
154  GetName(), GetType());
155  return kFALSE;
156  }
157  }
158 
159  // get require Npx value from (user-defined) environment variables
160  Int_t my_npx = gEnv->GetValue("KVedaLoss.Range.Npx", 100);
161 
162  fRange = new TF1(Form("KVedaLossMaterial:%s:Range", GetType()), this, &KVedaLossMaterial::RangeFunc,
163  0., 1.e+03, 0, "KVedaLossMaterial", "RangeFunc");
164  fRange->SetNpx(my_npx);
165 
166  fStopping = new TF1(Form("KVedaLossMaterial:%s:StoppingPower", GetType()), this, &KVedaLossMaterial::StoppingFunc,
167  0., 1.e+03, 0, "KVedaLossMaterial", "StoppingFunc");
168  fStopping->SetNpx(my_npx);
169 
170  my_npx = gEnv->GetValue("KVedaLoss.EnergyLoss.Npx", 100);
171  fDeltaE = new TF1(Form("KVedaLossMaterial:%s:EnergyLoss", GetType()), this, &KVedaLossMaterial::DeltaEFunc,
172  0., 1.e+03, 0, "KVedaLossMaterial", "DeltaEFunc");
173  fDeltaE->SetNpx(my_npx);
174 
175  my_npx = gEnv->GetValue("KVedaLoss.ResidualEnergy.Npx", 100);
176  fEres = new TF1(Form("KVedaLossMaterial:%s:ResidualEnergy", GetType()), this, &KVedaLossMaterial::EResFunc,
177  0., 1.e+03, 0, "KVedaLossMaterial", "EResFunc");
178  fEres->SetNpx(my_npx);
179 
180  for (int count = 0; count < ZMAX_VEDALOSS; count++) {
181 
182  if (sscanf(line, "%lf %lf %lf %lf %lf %lf %lf %lf",
183  &fCoeff[count][0], &fCoeff[count][1],
184  &fCoeff[count][2], &fCoeff[count][3],
185  &fCoeff[count][4], &fCoeff[count][5],
186  &fCoeff[count][6], &fCoeff[count][7])
187  != 8) {
188  Error("ReadRangeTable", "problem reading coeffs 0-7 in range table for %s (%s)", GetName(), GetType());
189  return kFALSE;
190  }
191  if (!fgets(line, 132, fp)) {
192  Warning("ReadRangeTable", "file too short ??? %s (%s)", GetName(), GetType());
193  return kFALSE;
194  }
195  else {
196  if (sscanf(line, "%lf %lf %lf %lf %lf %lf",
197  &fCoeff[count][8], &fCoeff[count][9],
198  &fCoeff[count][10], &fCoeff[count][11],
199  &fCoeff[count][12], &fCoeff[count][13])
200  != 6) {
201  Error("ReadRangeTable", "problem reading coeffs 8-13 in range table for %s (%s)", GetName(), GetType());
202  return kFALSE;
203  }
204  }
205  if (fNoLimits) {
206  // if we ignore nominal validity limits on incident energy, we must still use energy limits
207  // such that all range functions increase monotonically in the energy interval
208  GetRangeFunction(fCoeff[count][0], fCoeff[count][1])->SetRange(GetEminValid(fCoeff[count][0], fCoeff[count][1]), VERY_BIG_ENERGY);
209  Double_t emax = fRange->GetMaximumX() - 1;
210  emax /= fCoeff[count][1];
211  Double_t original_emax = fEmax[count];
212  // the new emax is only accepted if it is > than the nominal emax (400 or 250 AMeV),
213  // and at most 1 GeV/nucleon
214  fEmax[count] = TMath::Min(TMath::Max(original_emax, emax), 1000.);
215  // we may further reduce the upper limit to correspond to the minimum of stopping,
216  // if one exists
217  GetStoppingFunction(fCoeff[count][0], fCoeff[count][1])->SetRange(GetEminValid(fCoeff[count][0], fCoeff[count][1]), GetEmaxValid(fCoeff[count][0], fCoeff[count][1]));
218  emax = fStopping->GetMinimumX();
219  emax /= fCoeff[count][1];
220  // again, the new emax is only accepted if it is > than the nominal emax (400 or 250 AMeV),
221  // and at most 1 GeV/nucleon
222  fEmax[count] = TMath::Min(TMath::Max(original_emax, emax), 1000.);
223  //if(fEmax[count]!=original_emax) Info("ReadRangeTable", "Max. incident E for Z=%d ===> E/A = %f", count+1, fEmax[count]);
224  }
225  if (fgets(line, 132, fp)) {}
226  }
227 
228  return kTRUE;
229 }
230 
231 
232 
238 
240 {
241  // Function parameterising the energy loss of charged particles in this material.
242  //
243  // \param E[0] incident energy given in MeV.
244  // \returns energy loss calculated in MeV.
245 
246  return (E[0] - EResFunc(E, nullptr));
247 }
248 
249 
250 
256 
258 {
259  // Function parameterising the residual energy of charged particles in this material.
260  //
261  // \param E[0] incident energy given in MeV.
262  // \returns residual energy calculated in MeV.
263 
264  Double_t R0 = RangeFunc(E, nullptr);
265  if (R0 < thickness) {// if range < thickness, particle stops: Eres=0
266  fRangeOfLastDE = R0;
267  return 0.0;
268  }
269  else
271 
272  // calculate energy after absorber - invert range function to find Eres corresponding to (R0 - thickness)
273  R0 -= thickness;
274 
275  // invert range function to get energy after absorber
277  return static_cast<KVedaLossInverseRangeFunction*>(fInvRange[RF_Z])->GetEnergyPerNucleon(R0, riso) * RF_A;
278  }
279  int status;
280  return ProtectedGetX(fRange,R0,status);
281 }
282 
283 
284 
285 
290 
292 {
293  // Return function giving range (in \f$g/cm^2\f$) as a function of energy (in MeV) for
294  // charged particles \f$Z,A\f$ in this material.
295  // \param isoAmat If required, the isotopic mass of the material can be given.
296 
297  RF_Z = Z;
298  RF_A = A;
299  // get parameters for this Z
300  par = &fCoeff[Z - 1];
301  // set up polynomial
302  Double_t x1 = TMath::Log(0.1);
303  Double_t x2 = TMath::Log(0.2);
304  ran = 0.0;
305  for (int j = 2; j < 7; j++)
306  ran += (*par)[j + 1] * TMath::Power(x2, (Double_t)(j - 1));
307  ran += (*par)[2];
308  Double_t y2 = ran;
309  ran = 0.0;
310  for (int jj = 2; jj < 7; jj++)
311  ran += (*par)[jj + 1] * TMath::Power(x1, (Double_t)(jj - 1));
312  ran += (*par)[2];
313  Double_t y1 = ran;
314  adm = (y2 - y1) / (x2 - x1);
315  adn = (y1 - adm * x1);
316  riso = RF_A / (*par)[1];
317  if (isoAmat > 0.0) riso *= (isoAmat / fAmat);
318 
319  fRange->SetRange(0., GetEmaxValid(Z, A));
320 
321  /*
322  * New inversion of range-energy curve (if KVedaLoss::fgNewRangeInversion=kTRUE)
323  */
325  if (!fInvRange[Z]) {
327  }
328  }
329 
330  return fRange;
331 }
332 
333 
334 
339 
341 {
342  // Return function giving stopping power (in \f$MeV/(g/cm^2)\f$) as a function of energy (in MeV) for
343  // charged particles \f$Z,A\f$ in this material.
344  // \param isoAmat If required, the isotopic mass of the material can be given.
345 
346  RF_Z = Z;
347  RF_A = A;
348  // get parameters for this Z
349  par = &fCoeff[Z - 1];
350  // set up polynomial
351  Double_t x1 = TMath::Log(0.1);
352  Double_t x2 = TMath::Log(0.2);
353  ran = 0.0;
354  for (int j = 2; j < 7; j++)
355  ran += (*par)[j + 1] * TMath::Power(x2, (Double_t)(j - 1));
356  ran += (*par)[2];
357  Double_t y2 = ran;
358  ran = 0.0;
359  for (int jj = 2; jj < 7; jj++)
360  ran += (*par)[jj + 1] * TMath::Power(x1, (Double_t)(jj - 1));
361  ran += (*par)[2];
362  Double_t y1 = ran;
363  adm = (y2 - y1) / (x2 - x1);
364  adn = (y1 - adm * x1);
365  riso = RF_A / (*par)[1];
366  if (isoAmat > 0.0) riso *= (isoAmat / fAmat);
367  fStopping->SetRange(0., GetEmaxValid(Z, A));
368  return fStopping;
369 }
370 
371 
372 
377 
379 {
380  // Function parameterising the range of charged particles in this material.
381  // \param E[0] energy is given in MeV.
382  // \returns range calculated in units of \f$g/cm^2\f$
383 
384  eps = E[0] / RF_A;
385  dleps = TMath::Log(eps);
386  if (eps < 0.1)
387  ran = adm * dleps + adn;
388  else {
389  DLEP = dleps;
390  ran = (*par)[2] + (*par)[3] * DLEP;
391  ran += (*par)[4] * (DLEP *= dleps);
392  ran += (*par)[5] * (DLEP *= dleps);
393  ran += (*par)[6] * (DLEP *= dleps);
394  ran += (*par)[7] * (DLEP *= dleps);
395  }
396 
397  // range in g/cm**2
398  return riso * TMath::Exp(ran) * KVUnits::mg;
399 }
400 
401 
402 
407 
409 {
410  // Function parameterising the stopping power of charged particles in this material.
411  // \param E[0] energy is given in MeV.
412  // \returns stopping power calculated in units of \f$Mev/(g/cm^2)\f$
413 
414  eps = E[0] / RF_A;
415  dleps = TMath::Log(eps);
416  if (eps < 0.1) {
417  ran = adm * dleps + adn;
418  drande = E[0] / (riso * TMath::Exp(ran) * KVUnits::mg) / adm;
419  return drande;
420  }
421  DLEP = dleps;
422  ran = (*par)[2] + (*par)[3] * DLEP;
423  drande = (*par)[3];
424  for (int i = 4; i < 8; i++) {
425  drande += (i - 2) * (*par)[i] * DLEP;
426  ran += (*par)[i] * (DLEP *= dleps);
427  }
428  // range in g/cm**2
429  return E[0] / (riso * TMath::Exp(ran) * KVUnits::mg) / drande;
430 }
431 
432 
433 
439 
441 {
442  // Return function giving energy loss (in MeV) as a function of incident energy (in MeV) for
443  // charged particles (Z,A) traversing (or not) material
444  // \param e thickness (in \f$g/cm^2\f$) of this material.
445  // \param isoAmat If required, the isotopic mass of the material can be given.
446 
447  GetRangeFunction(Z, A, isoAmat);
448  thickness = e;
449  fDeltaE->SetRange(0., GetEmaxValid(Z, A));
450  return fDeltaE;
451 }
452 
453 
454 
460 
462 {
463  // Return function giving residual energy (in MeV) as a function of incident energy (in MeV) for
464  // charged particles (Z,A) traversing (or not) material
465  // \param e thickness (in \f$g/cm^2\f$) of this material.
466  // \param isoAmat If required, the isotopic mass of the material can be given.
467 
468  GetRangeFunction(Z, A, isoAmat);
469  thickness = e;
470  fEres->SetRange(0., GetEmaxValid(Z, A));
471  return fEres;
472 }
473 
474 
475 
479 
481 {
482  // \returns range (in \f$g/cm^2\f$) of ion (Z,A) with energy E (MeV) in material.
483  // \param isoAmat change default (isotopic) mass of material,
484 
485  if (Z == 0) return 0.0; //only charged particles
486  TF1* f = GetRangeFunction(Z, A, isoAmat);
487  return f->Eval(E);
488 }
489 
490 
491 
497 
499 {
500  // \returns energy lost (in MeV) by ion (Z,A)
501  // \param E incident energy (MeV)
502  // \param e thickness (in \f$g/cm^2\f$)
503  // \param isoAmat change default (isotopic) mass of material,
504 
505  if (Z == 0) return 0.0; //only charged particles
506  TF1* f = GetDeltaEFunction(e, Z, A, isoAmat);
507  return f->Eval(E);
508 }
509 
510 
511 
517 
519  Double_t isoAmat)
520 {
521  // \returns energy lost (in MeV) by ion (Z,A)
522  // \param E incident energy (MeV)
523  // \param e thickness (in \f$g/cm^2\f$)
524  // \param isoAmat change default (isotopic) mass of material,
525 
526  if (Z == 0) return 0.0; //only charged particles
527  TF1* f = GetEResFunction(e, Z, A, isoAmat);
528  return f->Eval(E);
529 }
530 
531 
532 
538 
540 {
541  // Calculate incident energy (in MeV) for ion (Z,A) for which the range is equal to the
542  // given thickness e (in \f$g/cm^2\f$). At this energy the residual energy of the ion is (just) zero,
543  // for all energies above this energy the residual energy is > 0.
544  // \param isoAmat change default (isotopic) mass of material,
545 
546  if (Z == 0) return 0.0; //only charged particles
547  GetRangeFunction(Z, A, isoAmat);
549  return static_cast<KVedaLossInverseRangeFunction*>(fInvRange[Z])->GetEnergyPerNucleon(e, riso) * A;
550  }
551  int status;
552  return ProtectedGetX(fRange,e,status);
553 }
554 
555 
556 
560 
562 {
563  // Calculates incident energy (in MeV) of an ion (Z,A) with residual energy Eres (MeV) after thickness e (in \f$g/cm^2\f$).
564  // \param isoAmat change default (isotopic) mass of material,
565 
566  if (Z == 0) return 0.0; //only charged particles
567  GetRangeFunction(Z, A, isoAmat);
568  Double_t R0 = fRange->Eval(Eres) + e;
570  return static_cast<KVedaLossInverseRangeFunction*>(fInvRange[Z])->GetEnergyPerNucleon(R0, riso) * A;
571  }
572  int status;
573  return ProtectedGetX(fRange,R0,status);
574 }
575 
576 
577 
584 
585 void KVedaLossMaterial::GetParameters(Int_t Zion, Int_t& Aion, std::vector<Double_t>& rangepar)
586 {
587  // For the given ion atomic number, give the reference mass used and the six
588  // parameters for the range function fit
589  // \param[in] Zion ion atomic number
590  // \param[out] Aion reference mass used by table
591  // \param[out] rangepar vector containing the six parameters for the range function fit
592 
593  rangepar = std::vector<Double_t>(fCoeff[Zion - 1].begin() + 2, fCoeff[Zion - 1].end());
594  Aion = fCoeff[Zion - 1][1];
595 }
596 
597 
598 
int Int_t
#define f(i)
#define e(i)
bool Bool_t
char Char_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
R__EXTERN TEnv * gEnv
winID w
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char y1
char name[80]
char * Form(const char *fmt,...)
virtual const Char_t * GetType() const
Definition: KVBase.h:176
void Error(const char *method, const char *msgfmt,...) const override
Definition: KVBase.cpp:1683
static Double_t ProtectedGetX(const TF1 *func, Double_t val, int &status, Double_t xmin=0.0, Double_t xmax=0.0)
Definition: KVBase.cpp:1622
void Warning(const char *method, const char *msgfmt,...) const override
Definition: KVBase.cpp:1670
Material for use in energy loss & range calculations.
void AddCompoundElement(Int_t Z, Int_t A, Int_t Natoms)
TF1 * fDeltaE
function parameterising energy loss in material
void AddMixtureElement(Int_t Z, Int_t A, Int_t Natoms, Double_t Proportion)
Double_t fAmat
effective mass number of material
TF1 * fEres
function parameterising residual energy after crossing material
TF1 * fRange
function parameterising range of charged particles in material
TF1 * fStopping
function parameterising stopping power of charged particles in material
Double_t fRangeOfLastDE
range corresponding to last calculated DE
Abstract base class for calculation of range & energy loss of charged particles in matter.
Dedicated optimised inversion of range-energy function for KVedaLoss.
Description of material in the KVedaLoss range table.
Double_t EResFunc(Double_t *, Double_t *)
TObjArray fInvRange
KVedaLossInverseRangeFunction objects.
static KVedaLoss * fgTable
Double_t thickness
in g/cm**2
Float_t GetEminValid(Int_t Z, Int_t A) const override
Double_t GetEResOfIon(Int_t Z, Int_t A, Double_t E, Double_t e, Double_t isoAmat=0.) override
Double_t StoppingFunc(Double_t *, Double_t *)
TF1 * GetStoppingFunction(Int_t Z, Int_t A, Double_t isoAmat=0) override
Bool_t ReadRangeTable(FILE *fp)
Double_t RF_Z
internal variables used by RangeFunc/DeltaEFunc
std::vector< Double_t > fEmin
Z-dependent minimum energy/nucleon for calculation to be valid.
Double_t GetRangeOfIon(Int_t Z, Int_t A, Double_t E, Double_t isoAmat=0.) override
virtual ~KVedaLossMaterial()
Destructor.
Double_t RangeFunc(Double_t *, Double_t *)
std::vector< Double_t > fEmax
Z-dependent maximum energy/nucleon for calculation to be valid.
Double_t GetPunchThroughEnergy(Int_t Z, Int_t A, Double_t e, Double_t isoAmat=0.) override
TF1 * GetEResFunction(Double_t e, Int_t Z, Int_t A, Double_t isoAmat=0) override
static Bool_t fNoLimits
if kTRUE, ignore max E limit for validity of calculation
Float_t GetEmaxValid(Int_t Z, Int_t A) const override
Double_t GetDeltaEOfIon(Int_t Z, Int_t A, Double_t E, Double_t e, Double_t isoAmat=0.) override
void GetParameters(Int_t Zion, Int_t &Aion, std::vector< Double_t > &rangepar)
std::vector< Double_t > * par
Double_t DeltaEFunc(Double_t *, Double_t *)
Double_t GetEIncFromEResOfIon(Int_t Z, Int_t A, Double_t Eres, Double_t e, Double_t isoAmat=0.) override
KVedaLossMaterial()
Default constructor.
TF1 * GetRangeFunction(Int_t Z, Int_t A, Double_t isoAmat=0) override
TF1 * GetDeltaEFunction(Double_t e, Int_t Z, Int_t A, Double_t isoAmat=0) override
std::vector< std::vector< Double_t > > fCoeff
parameters for range tables
C++ implementation of VEDALOSS stopping power calculation.
Definition: KVedaLoss.h:63
static Bool_t IsUseNewRangeInversion()
Definition: KVedaLoss.h:92
virtual void SetOwner(Bool_t enable=kTRUE)
virtual const char * GetValue(const char *name, const char *dflt) const
virtual Double_t GetMinimumX(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 SetRange(Double_t xmin, Double_t xmax)
virtual void SetNpx(Int_t npx=100)
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) 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
const char * GetName() const override
TLine * line
end
Double_t Min(Double_t a, Double_t b)
Double_t Exp(Double_t x)
Double_t Power(Double_t x, Double_t y)
constexpr Double_t E()
Double_t Log(Double_t x)
Double_t Max(Double_t a, Double_t b)
#define R0(v, w, x, y, z, i)
TArc a
ClassImp(TPyArg)