#ifndef ROOT_TMath
#define ROOT_TMath
#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif
#ifndef ROOT_TMathBase
#include "TMathBase.h"
#endif
#include "TError.h"
#include <algorithm>
namespace TMath {
inline Double_t Pi() { return 3.14159265358979323846; }
inline Double_t TwoPi() { return 2.0 * Pi(); }
inline Double_t PiOver2() { return Pi() / 2.0; }
inline Double_t PiOver4() { return Pi() / 4.0; }
inline Double_t InvPi() { return 1.0 / Pi(); }
inline Double_t RadToDeg() { return 180.0 / Pi(); }
inline Double_t DegToRad() { return Pi() / 180.0; }
inline Double_t Sqrt2() { return 1.4142135623730950488016887242097; }
inline Double_t E() { return 2.71828182845904523536; }
inline Double_t Ln10() { return 2.30258509299404568402; }
inline Double_t LogE() { return 0.43429448190325182765; }
inline Double_t C() { return 2.99792458e8; }
inline Double_t Ccgs() { return 100.0 * C(); }
inline Double_t CUncertainty() { return 0.0; }
inline Double_t G() { return 6.673e-11; }
inline Double_t Gcgs() { return G() / 1000.0; }
inline Double_t GUncertainty() { return 0.010e-11; }
inline Double_t GhbarC() { return 6.707e-39; }
inline Double_t GhbarCUncertainty() { return 0.010e-39; }
inline Double_t Gn() { return 9.80665; }
inline Double_t GnUncertainty() { return 0.0; }
inline Double_t H() { return 6.62606876e-34; }
inline Double_t Hcgs() { return 1.0e7 * H(); }
inline Double_t HUncertainty() { return 0.00000052e-34; }
inline Double_t Hbar() { return 1.054571596e-34; }
inline Double_t Hbarcgs() { return 1.0e7 * Hbar(); }
inline Double_t HbarUncertainty() { return 0.000000082e-34; }
inline Double_t HC() { return H() * C(); }
inline Double_t HCcgs() { return Hcgs() * Ccgs(); }
inline Double_t K() { return 1.3806503e-23; }
inline Double_t Kcgs() { return 1.0e7 * K(); }
inline Double_t KUncertainty() { return 0.0000024e-23; }
inline Double_t Sigma() { return 5.6704e-8; }
inline Double_t SigmaUncertainty() { return 0.000040e-8; }
inline Double_t Na() { return 6.02214199e+23; }
inline Double_t NaUncertainty() { return 0.00000047e+23; }
inline Double_t R() { return K() * Na(); }
inline Double_t RUncertainty() { return R()*((KUncertainty()/K()) + (NaUncertainty()/Na())); }
inline Double_t MWair() { return 28.9644; }
inline Double_t Rgair() { return (1000.0 * R()) / MWair(); }
inline Double_t EulerGamma() { return 0.577215664901532860606512090082402431042; }
inline Double_t Qe() { return 1.602176462e-19; }
inline Double_t QeUncertainty() { return 0.000000063e-19; }
inline Double_t Sin(Double_t);
inline Double_t Cos(Double_t);
inline Double_t Tan(Double_t);
inline Double_t SinH(Double_t);
inline Double_t CosH(Double_t);
inline Double_t TanH(Double_t);
inline Double_t ASin(Double_t);
inline Double_t ACos(Double_t);
inline Double_t ATan(Double_t);
inline Double_t ATan2(Double_t, Double_t);
Double_t ASinH(Double_t);
Double_t ACosH(Double_t);
Double_t ATanH(Double_t);
Double_t Hypot(Double_t x, Double_t y);
inline Double_t Sqrt(Double_t x);
inline Double_t Ceil(Double_t x);
inline Int_t CeilNint(Double_t x);
inline Double_t Floor(Double_t x);
inline Int_t FloorNint(Double_t x);
inline Double_t Exp(Double_t x);
inline Double_t Ldexp(Double_t x, Int_t exp);
Double_t Factorial(Int_t i);
inline Double_t Power(Double_t x, Double_t y);
inline Double_t Log(Double_t x);
Double_t Log2(Double_t x);
inline Double_t Log10(Double_t x);
Int_t Nint(Float_t x);
Int_t Nint(Double_t x);
inline Int_t Finite(Double_t x);
inline Int_t IsNaN(Double_t x);
Long_t Hypot(Long_t x, Long_t y);
template <typename T> T MinElement(Long64_t n, const T *a);
template <typename T> T MaxElement(Long64_t n, const T *a);
template <typename T> Long64_t LocMin(Long64_t n, const T *a);
template <typename Iterator> Iterator LocMin(Iterator first, Iterator last);
template <typename T> Long64_t LocMax(Long64_t n, const T *a);
template <typename Iterator> Iterator LocMax(Iterator first, Iterator last);
template <typename T> Long64_t BinarySearch(Long64_t n, const T *array, T value);
template <typename T> Long64_t BinarySearch(Long64_t n, const T **array, T value);
template <typename Iterator, typename Element> Iterator BinarySearch(Iterator first, Iterator last, Element value);
ULong_t Hash(const void *txt, Int_t ntxt);
ULong_t Hash(const char *str);
template <typename Element, typename Index>
void Sort(Long64_t n, const Element* a, Index* index, Bool_t down=kTRUE);
template <typename Iterator, typename IndexIterator>
void SortItr(Iterator first, Iterator last, IndexIterator index, Bool_t down=kTRUE);
void BubbleHigh(Int_t Narr, Double_t *arr1, Int_t *arr2);
void BubbleLow (Int_t Narr, Double_t *arr1, Int_t *arr2);
Bool_t Permute(Int_t n, Int_t *a);
void Quantiles(Int_t n, Int_t nprob, Double_t *x, Double_t *quantiles, Double_t *prob,
Bool_t isSorted=kTRUE, Int_t *index = 0, Int_t type=7);
template <typename T> Bool_t IsInside(T xp, T yp, Int_t np, T *x, T *y);
template <typename T> T *Cross(const T v1[3],const T v2[3], T out[3]);
Float_t Normalize(Float_t v[3]);
Double_t Normalize(Double_t v[3]);
template <typename T> inline T NormCross(const T v1[3],const T v2[3],T out[3]);
template <typename T> T *Normal2Plane(const T v1[3],const T v2[3],const T v3[3], T normal[3]);
Bool_t RootsCubic(const Double_t coef[4],Double_t &a, Double_t &b, Double_t &c);
Double_t Binomial(Int_t n,Int_t k);
Double_t BinomialI(Double_t p, Int_t n, Int_t k);
Double_t BreitWigner(Double_t x, Double_t mean=0, Double_t gamma=1);
Double_t CauchyDist(Double_t x, Double_t t=0, Double_t s=1);
Double_t ChisquareQuantile(Double_t p, Double_t ndf);
Double_t FDist(Double_t F, Double_t N, Double_t M);
Double_t FDistI(Double_t F, Double_t N, Double_t M);
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE);
Double_t KolmogorovProb(Double_t z);
Double_t KolmogorovTest(Int_t na, const Double_t *a, Int_t nb, const Double_t *b, Option_t *option);
Double_t Landau(Double_t x, Double_t mpv=0, Double_t sigma=1, Bool_t norm=kFALSE);
Double_t LandauI(Double_t x);
Double_t LaplaceDist(Double_t x, Double_t alpha=0, Double_t beta=1);
Double_t LaplaceDistI(Double_t x, Double_t alpha=0, Double_t beta=1);
Double_t LogNormal(Double_t x, Double_t sigma, Double_t theta=0, Double_t m=1);
Double_t NormQuantile(Double_t p);
Double_t Poisson(Double_t x, Double_t par);
Double_t PoissonI(Double_t x, Double_t par);
Double_t Prob(Double_t chi2,Int_t ndf);
Double_t Student(Double_t T, Double_t ndf);
Double_t StudentI(Double_t T, Double_t ndf);
Double_t StudentQuantile(Double_t p, Double_t ndf, Bool_t lower_tail=kTRUE);
Double_t Vavilov(Double_t x, Double_t kappa, Double_t beta2);
Double_t VavilovI(Double_t x, Double_t kappa, Double_t beta2);
Double_t Voigt(Double_t x, Double_t sigma, Double_t lg, Int_t R = 4);
template <typename T> Double_t Mean(Long64_t n, const T *a, const Double_t *w=0);
template <typename Iterator> Double_t Mean(Iterator first, Iterator last);
template <typename Iterator, typename WeightIterator> Double_t Mean(Iterator first, Iterator last, WeightIterator w);
template <typename T> Double_t GeomMean(Long64_t n, const T *a);
template <typename Iterator> Double_t GeomMean(Iterator first, Iterator last);
template <typename T> Double_t RMS(Long64_t n, const T *a);
template <typename Iterator> Double_t RMS(Iterator first, Iterator last);
template <typename T> Double_t Median(Long64_t n, const T *a, const Double_t *w=0, Long64_t *work=0);
template <class Element, typename Size> Element KOrdStat(Size n, const Element *a, Size k, Size *work = 0);
Double_t Beta(Double_t p, Double_t q);
Double_t BetaCf(Double_t x, Double_t a, Double_t b);
Double_t BetaDist(Double_t x, Double_t p, Double_t q);
Double_t BetaDistI(Double_t x, Double_t p, Double_t q);
Double_t BetaIncomplete(Double_t x, Double_t a, Double_t b);
Double_t BesselI(Int_t n,Double_t x);
Double_t BesselK(Int_t n,Double_t x);
Double_t BesselI0(Double_t x);
Double_t BesselK0(Double_t x);
Double_t BesselI1(Double_t x);
Double_t BesselK1(Double_t x);
Double_t BesselJ0(Double_t x);
Double_t BesselJ1(Double_t x);
Double_t BesselY0(Double_t x);
Double_t BesselY1(Double_t x);
Double_t StruveH0(Double_t x);
Double_t StruveH1(Double_t x);
Double_t StruveL0(Double_t x);
Double_t StruveL1(Double_t x);
Double_t DiLog(Double_t x);
Double_t Erf(Double_t x);
Double_t ErfInverse(Double_t x);
Double_t Erfc(Double_t x);
inline Double_t ErfcInverse(Double_t x) {return TMath::ErfInverse(1-x);}
Double_t Freq(Double_t x);
Double_t Gamma(Double_t z);
Double_t Gamma(Double_t a,Double_t x);
Double_t GammaDist(Double_t x, Double_t gamma, Double_t mu=0, Double_t beta=1);
Double_t LnGamma(Double_t z);
}
#include <float.h>
#if defined(R__WIN32) && !defined(__CINT__)
# ifndef finite
# define finite _finite
# define isnan _isnan
# endif
#endif
#if defined(R__AIX) || defined(R__SOLARIS_CC50) || \
defined(R__HPUX11) || defined(R__GLIBC) || \
(defined(R__MACOSX) && defined(__INTEL_COMPILER))
# include <math.h>
# ifdef R__SOLARIS_CC50
extern "C" { int finite(double); }
# endif
# if defined(R__GLIBC) && defined(__STRICT_ANSI__)
# ifndef finite
# define finite __finite
# endif
# ifndef isnan
# define isnan __isnan
# endif
# endif
#else
extern "C" {
extern double sin(double);
extern double cos(double);
extern double tan(double);
extern double sinh(double);
extern double cosh(double);
extern double tanh(double);
extern double asin(double);
extern double acos(double);
extern double atan(double);
extern double atan2(double, double);
extern double sqrt(double);
extern double exp(double);
extern double pow(double, double);
extern double log(double);
extern double log10(double);
#ifndef R__WIN32
# if !defined(finite)
extern int finite(double);
# endif
# if !defined(isnan)
extern int isnan(double);
# endif
extern double ldexp(double, int);
extern double ceil(double);
extern double floor(double);
#else
_CRTIMP double ldexp(double, int);
_CRTIMP double ceil(double);
_CRTIMP double floor(double);
#endif
}
#endif
inline Double_t TMath::Sin(Double_t x)
{ return sin(x); }
inline Double_t TMath::Cos(Double_t x)
{ return cos(x); }
inline Double_t TMath::Tan(Double_t x)
{ return tan(x); }
inline Double_t TMath::SinH(Double_t x)
{ return sinh(x); }
inline Double_t TMath::CosH(Double_t x)
{ return cosh(x); }
inline Double_t TMath::TanH(Double_t x)
{ return tanh(x); }
inline Double_t TMath::ASin(Double_t x)
{ if (x < -1.) return -TMath::Pi()/2;
if (x > 1.) return TMath::Pi()/2;
return asin(x);
}
inline Double_t TMath::ACos(Double_t x)
{ if (x < -1.) return TMath::Pi();
if (x > 1.) return 0;
return acos(x);
}
inline Double_t TMath::ATan(Double_t x)
{ return atan(x); }
inline Double_t TMath::ATan2(Double_t y, Double_t x)
{ if (x != 0) return atan2(y, x);
if (y == 0) return 0;
if (y > 0) return Pi()/2;
else return -Pi()/2;
}
inline Double_t TMath::Sqrt(Double_t x)
{ return sqrt(x); }
inline Double_t TMath::Ceil(Double_t x)
{ return ceil(x); }
inline Int_t TMath::CeilNint(Double_t x)
{ return TMath::Nint(ceil(x)); }
inline Double_t TMath::Floor(Double_t x)
{ return floor(x); }
inline Int_t TMath::FloorNint(Double_t x)
{ return TMath::Nint(floor(x)); }
inline Double_t TMath::Exp(Double_t x)
{ return exp(x); }
inline Double_t TMath::Ldexp(Double_t x, Int_t exp)
{ return ldexp(x, exp); }
inline Double_t TMath::Power(Double_t x, Double_t y)
{ return pow(x, y); }
inline Double_t TMath::Log(Double_t x)
{ return log(x); }
inline Double_t TMath::Log10(Double_t x)
{ return log10(x); }
inline Int_t TMath::Finite(Double_t x)
#ifdef R__HPUX11
{ return isfinite(x); }
#else
{ return finite(x); }
#endif
inline Int_t TMath::IsNaN(Double_t x)
{ return isnan(x); }
template <typename T> inline T TMath::NormCross(const T v1[3],const T v2[3],T out[3])
{
return Normalize(Cross(v1,v2,out));
}
template <typename T>
T TMath::MinElement(Long64_t n, const T *a) {
return *std::min_element(a,a+n);
}
template <typename T>
T TMath::MaxElement(Long64_t n, const T *a) {
return *std::max_element(a,a+n);
}
template <typename T>
Long64_t TMath::LocMin(Long64_t n, const T *a) {
if (n <= 0 || !a) return -1;
T xmin = a[0];
Long64_t loc = 0;
for (Long64_t i = 1; i < n; i++) {
if (xmin > a[i]) {
xmin = a[i];
loc = i;
}
}
return loc;
}
template <typename Iterator>
Iterator TMath::LocMin(Iterator first, Iterator last) {
return std::min_element(first, last);
}
template <typename T>
Long64_t TMath::LocMax(Long64_t n, const T *a) {
if (n <= 0 || !a) return -1;
T xmax = a[0];
Long64_t loc = 0;
for (Long64_t i = 1; i < n; i++) {
if (xmax < a[i]) {
xmax = a[i];
loc = i;
}
}
return loc;
}
template <typename Iterator>
Iterator TMath::LocMax(Iterator first, Iterator last)
{
return std::max_element(first, last);
}
template<typename T>
struct CompareDesc {
CompareDesc(T d) : fData(d) {}
bool operator()(int i1, int i2) {
return *(fData + i1) > *(fData + i2);
}
T fData;
};
template<typename T>
struct CompareAsc {
CompareAsc(T d) : fData(d) {}
bool operator()(int i1, int i2) {
return *(fData + i1) < *(fData + i2);
}
T fData;
};
template <typename Iterator>
Double_t TMath::Mean(Iterator first, Iterator last)
{
Double_t sum = 0;
Double_t sumw = 0;
while ( first != last )
{
sum += *first;
sumw += 1;
first++;
}
return sum/sumw;
}
template <typename Iterator, typename WeightIterator>
Double_t TMath::Mean(Iterator first, Iterator last, WeightIterator w)
{
Double_t sum = 0;
Double_t sumw = 0;
int i = 0;
while ( first != last ) {
if ( *w < 0) {
::Error("TMath::Mean","w[%d] = %.4e < 0 ?!",i,*w);
return 0;
}
sum += (*w) * (*first);
sumw += (*w) ;
++w;
++first;
++i;
}
if (sumw <= 0) {
::Error("TMath::Mean","sum of weights == 0 ?!");
return 0;
}
return sum/sumw;
}
template <typename T>
Double_t TMath::Mean(Long64_t n, const T *a, const Double_t *w)
{
if (w) {
return TMath::Mean(a, a+n, w);
} else {
return TMath::Mean(a, a+n);
}
}
template <typename Iterator>
Double_t TMath::GeomMean(Iterator first, Iterator last)
{
Double_t logsum = 0.;
Long64_t n = 0;
while ( first != last ) {
if (*first == 0) return 0.;
Double_t absa = (Double_t) TMath::Abs(*first);
logsum += TMath::Log(absa);
++first;
++n;
}
return TMath::Exp(logsum/n);
}
template <typename T>
Double_t TMath::GeomMean(Long64_t n, const T *a)
{
return TMath::GeomMean(a, a+n);
}
template <typename Iterator>
Double_t TMath::RMS(Iterator first, Iterator last)
{
Double_t n = 0;
Double_t tot = 0, tot2 =0, adouble;
while ( first != last ) {
adouble=Double_t(*first);
tot += adouble; tot2 += adouble*adouble;
++first;
++n;
}
Double_t n1 = 1./n;
Double_t mean = tot*n1;
Double_t rms = TMath::Sqrt(TMath::Abs(tot2*n1 -mean*mean));
return rms;
}
template <typename T>
Double_t TMath::RMS(Long64_t n, const T *a)
{
return TMath::RMS(a, a+n);
}
template <typename Iterator, typename Element>
Iterator TMath::BinarySearch(Iterator first, Iterator last, Element value)
{
Iterator pind;
pind = std::lower_bound(first, last, value);
if ( (pind != last) && (*pind == value) )
return pind;
else
return ( pind - 1);
}
template <typename T> Long64_t TMath::BinarySearch(Long64_t n, const T *array, T value)
{
const T* pind;
pind = std::lower_bound(array, array + n, value);
if ( (pind != array + n) && (*pind == value) )
return (pind - array);
else
return ( pind - array - 1);
}
template <typename T> Long64_t TMath::BinarySearch(Long64_t n, const T **array, T value)
{
const T* pind;
pind = std::lower_bound(*array, *array + n, value);
if ( (pind != *array + n) && (*pind == value) )
return (pind - *array);
else
return ( pind - *array - 1);
}
template <typename Iterator, typename IndexIterator>
void TMath::SortItr(Iterator first, Iterator last, IndexIterator index, Bool_t down)
{
int i = 0;
IndexIterator cindex = index;
for ( Iterator cfirst = first; cfirst != last; ++cfirst )
{
*cindex = i++;
++cindex;
}
if ( down )
std::sort(index, cindex, CompareDesc<Iterator>(first) );
else
std::sort(index, cindex, CompareAsc<Iterator>(first) );
}
template <typename Element, typename Index> void TMath::Sort(Long64_t n, const Element* a, Index* index, Bool_t down)
{
for(Long64_t i = 0; i < n; i++) { index[i] = i; }
if ( down )
std::sort(index, index + n, CompareDesc<const Element*>(a) );
else
std::sort(index, index + n, CompareAsc<const Element*>(a) );
}
template <typename T> T *TMath::Cross(const T v1[3],const T v2[3], T out[3])
{
out[0] = v1[1] * v2[2] - v1[2] * v2[1];
out[1] = v1[2] * v2[0] - v1[0] * v2[2];
out[2] = v1[0] * v2[1] - v1[1] * v2[0];
return out;
}
template <typename T> T * TMath::Normal2Plane(const T p1[3],const T p2[3],const T p3[3], T normal[3])
{
T v1[3], v2[3];
v1[0] = p2[0] - p1[0];
v1[1] = p2[1] - p1[1];
v1[2] = p2[2] - p1[2];
v2[0] = p3[0] - p1[0];
v2[1] = p3[1] - p1[1];
v2[2] = p3[2] - p1[2];
NormCross(v1,v2,normal);
return normal;
}
template <typename T> Bool_t TMath::IsInside(T xp, T yp, Int_t np, T *x, T *y)
{
Double_t xint;
Int_t i;
Int_t inter = 0;
for (i=0;i<np-1;i++) {
if (y[i] == y[i+1]) continue;
if (yp <= y[i] && yp <= y[i+1]) continue;
if (y[i] < yp && y[i+1] < yp) continue;
xint = x[i] + (yp-y[i])*(x[i+1]-x[i])/(y[i+1]-y[i]);
if ((Double_t)xp < xint) inter++;
}
if (inter%2) return kTRUE;
return kFALSE;
}
template <typename T> Double_t TMath::Median(Long64_t n, const T *a, const Double_t *w, Long64_t *work)
{
const Int_t kWorkMax = 100;
if (n <= 0 || !a) return 0;
Bool_t isAllocated = kFALSE;
Double_t median;
Long64_t *ind;
Long64_t workLocal[kWorkMax];
if (work) {
ind = work;
} else {
ind = workLocal;
if (n > kWorkMax) {
isAllocated = kTRUE;
ind = new Long64_t[n];
}
}
if (w) {
Double_t sumTot2 = 0;
for (Int_t j = 0; j < n; j++) {
if (w[j] < 0) {
::Error("TMath::Median","w[%d] = %.4e < 0 ?!",j,w[j]);
return 0;
}
sumTot2 += w[j];
}
sumTot2 /= 2.;
Sort(n, a, ind, kFALSE);
Double_t sum = 0.;
Int_t jl;
for (jl = 0; jl < n; jl++) {
sum += w[ind[jl]];
if (sum >= sumTot2) break;
}
Int_t jh;
sum = 2.*sumTot2;
for (jh = n-1; jh >= 0; jh--) {
sum -= w[ind[jh]];
if (sum <= sumTot2) break;
}
median = 0.5*(a[ind[jl]]+a[ind[jh]]);
} else {
if (n%2 == 1)
median = KOrdStat(n, a,n/2, ind);
else {
median = 0.5*(KOrdStat(n, a, n/2 -1, ind)+KOrdStat(n, a, n/2, ind));
}
}
if (isAllocated)
delete [] ind;
return median;
}
template <class Element, typename Size>
Element TMath::KOrdStat(Size n, const Element *a, Size k, Size *work)
{
const Int_t kWorkMax = 100;
typedef Size Index;
Bool_t isAllocated = kFALSE;
Size i, ir, j, l, mid;
Index arr;
Index *ind;
Index workLocal[kWorkMax];
Index temp;
if (work) {
ind = work;
} else {
ind = workLocal;
if (n > kWorkMax) {
isAllocated = kTRUE;
ind = new Index[n];
}
}
for (Size ii=0; ii<n; ii++) {
ind[ii]=ii;
}
Size rk = k;
l=0;
ir = n-1;
for(;;) {
if (ir<=l+1) {
if (ir == l+1 && a[ind[ir]]<a[ind[l]])
{temp = ind[l]; ind[l]=ind[ir]; ind[ir]=temp;}
Element tmp = a[ind[rk]];
if (isAllocated)
delete [] ind;
return tmp;
} else {
mid = (l+ir) >> 1;
{temp = ind[mid]; ind[mid]=ind[l+1]; ind[l+1]=temp;}
if (a[ind[l]]>a[ind[ir]])
{temp = ind[l]; ind[l]=ind[ir]; ind[ir]=temp;}
if (a[ind[l+1]]>a[ind[ir]])
{temp=ind[l+1]; ind[l+1]=ind[ir]; ind[ir]=temp;}
if (a[ind[l]]>a[ind[l+1]])
{temp = ind[l]; ind[l]=ind[l+1]; ind[l+1]=temp;}
i=l+1;
j=ir;
arr = ind[l+1];
for (;;){
do i++; while (a[ind[i]]<a[arr]);
do j--; while (a[ind[j]]>a[arr]);
if (j<i) break;
{temp=ind[i]; ind[i]=ind[j]; ind[j]=temp;}
}
ind[l+1]=ind[j];
ind[j]=arr;
if (j>=rk) ir = j-1;
if (j<=rk) l=i;
}
}
}
#endif
Last change: Wed Jul 16 12:59:04 2008
Last generated: 2008-07-16 12:59
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.