Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TMath.h
Go to the documentation of this file.
1// @(#)root/mathcore:$Id$
2// Authors: Rene Brun, Anna Kreshuk, Eddy Offermann, Fons Rademakers 29/07/95
3
4/*************************************************************************
5 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef ROOT_TMath
13#define ROOT_TMath
14
15#include "TMathBase.h"
16
17#include "TError.h"
18#include "ROOT/RSpan.hxx"
19
20#include <algorithm>
21#include <limits>
22#include <cmath>
23#include <vector>
24
25////////////////////////////////////////////////////////////////////////////////
26///
27/// TMath
28///
29/// Encapsulate most frequently used Math functions.
30/// NB. The basic functions Min, Max, Abs and Sign are defined
31/// in TMathBase.
32
33namespace TMath {
34
35////////////////////////////////////////////////////////////////////////////////
36// Fundamental constants
37
38////////////////////////////////////////////////////////////////////////////////
39/// \f$ \pi\f$
40constexpr Double_t Pi()
41{
42 return 3.14159265358979323846;
43}
44
45////////////////////////////////////////////////////////////////////////////////
46/// \f$ 2\pi\f$
47constexpr Double_t TwoPi()
48{
49 return 2.0 * Pi();
50}
51
52////////////////////////////////////////////////////////////////////////////////
53/// \f$ \frac{\pi}{2} \f$
54constexpr Double_t PiOver2()
55{
56 return Pi() / 2.0;
57}
58
59////////////////////////////////////////////////////////////////////////////////
60/// \f$ \frac{\pi}{4} \f$
61constexpr Double_t PiOver4()
62{
63 return Pi() / 4.0;
64}
65
66////////////////////////////////////////////////////////////////////////////////
67/// \f$ \frac{1.}{\pi}\f$
68constexpr Double_t InvPi()
69{
70 return 1.0 / Pi();
71}
72
73////////////////////////////////////////////////////////////////////////////////
74/// Conversion from radian to degree: \f$ \frac{180}{\pi} \f$
75constexpr Double_t RadToDeg()
76{
77 return 180.0 / Pi();
78}
79
80////////////////////////////////////////////////////////////////////////////////
81/// Conversion from degree to radian: \f$ \frac{\pi}{180} \f$
82constexpr Double_t DegToRad()
83{
84 return Pi() / 180.0;
85}
86
87////////////////////////////////////////////////////////////////////////////////
88/// \f$ \sqrt{2} \f$
89constexpr Double_t Sqrt2()
90{
91 return 1.4142135623730950488016887242097;
92}
93
94////////////////////////////////////////////////////////////////////////////////
95/// Base of natural log: \f$ e \f$
96constexpr Double_t E()
97{
98 return 2.71828182845904523536;
99}
100
101////////////////////////////////////////////////////////////////////////////////
102/// Natural log of 10 (to convert log to ln)
103constexpr Double_t Ln10()
104{
105 return 2.30258509299404568402;
106}
107
108////////////////////////////////////////////////////////////////////////////////
109/// Base-10 log of e (to convert ln to log)
110constexpr Double_t LogE()
111{
112 return 0.43429448190325182765;
113}
114
115////////////////////////////////////////////////////////////////////////////////
116/// Velocity of light in \f$ m s^{-1} \f$
117constexpr Double_t C()
118{
119 return 2.99792458e8;
120}
121
122////////////////////////////////////////////////////////////////////////////////
123/// \f$ cm s^{-1} \f$
124constexpr Double_t Ccgs()
125{
126 return 100.0 * C();
127}
128
129////////////////////////////////////////////////////////////////////////////////
130/// Speed of light uncertainty.
132{
133 return 0.0;
134}
135
136////////////////////////////////////////////////////////////////////////////////
137/// Gravitational constant in: \f$ m^{3} kg^{-1} s^{-2} \f$
138constexpr Double_t G()
139{
140 // use 2018 value from NIST (https://physics.nist.gov/cgi-bin/cuu/Value?bg|search_for=G)
141 return 6.67430e-11;
142}
143
144////////////////////////////////////////////////////////////////////////////////
145/// \f$ cm^{3} g^{-1} s^{-2} \f$
146constexpr Double_t Gcgs()
147{
148 return G() * 1000.0;
149}
150
151////////////////////////////////////////////////////////////////////////////////
152/// Gravitational constant uncertainty.
154{
155 // use 2018 value from NIST
156 return 0.00015e-11;
157}
158
159////////////////////////////////////////////////////////////////////////////////
160/// \f$ \frac{G}{\hbar C} \f$ in \f$ (GeV/c^{2})^{-2} \f$
161constexpr Double_t GhbarC()
162{
163 // use new value from NIST (2018)
164 return 6.70883e-39;
165}
166
167////////////////////////////////////////////////////////////////////////////////
168/// \f$ \frac{G}{\hbar C} \f$ uncertainty.
170{
171 // use new value from NIST (2018)
172 return 0.00015e-39;
173}
174
175////////////////////////////////////////////////////////////////////////////////
176/// Standard acceleration of gravity in \f$ m s^{-2} \f$
177constexpr Double_t Gn()
178{
179 return 9.80665;
180}
181
182////////////////////////////////////////////////////////////////////////////////
183/// Standard acceleration of gravity uncertainty.
185{
186 return 0.0;
187}
188
189////////////////////////////////////////////////////////////////////////////////
190/// Planck's constant in \f$ J s \f$: \f$ h \f$
191constexpr Double_t H()
192{
193 return 6.62607015e-34;
194}
195
196////////////////////////////////////////////////////////////////////////////////
197/// \f$ erg s \f$
198constexpr Double_t Hcgs()
199{
200 return 1.0e7 * H();
201}
202
203////////////////////////////////////////////////////////////////////////////////
204/// Planck's constant uncertainty.
206{
207 // Planck constant is exact according to 2019 redefinition
208 // (https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units)
209 return 0.0;
210}
211
212////////////////////////////////////////////////////////////////////////////////
213/// \f$ \hbar \f$ in \f$ J s \f$: \f$ \hbar = \frac{h}{2\pi} \f$
214constexpr Double_t Hbar()
215{
216 return 1.054571817e-34;
217}
218
219////////////////////////////////////////////////////////////////////////////////
220/// \f$ erg s \f$
221constexpr Double_t Hbarcgs()
222{
223 return 1.0e7 * Hbar();
224}
225
226////////////////////////////////////////////////////////////////////////////////
227/// \f$ \hbar \f$ uncertainty.
229{
230 // hbar is an exact constant
231 return 0.0;
232}
233
234////////////////////////////////////////////////////////////////////////////////
235/// \f$ hc \f$ in \f$ J m \f$
236constexpr Double_t HC()
237{
238 return H() * C();
239}
240
241////////////////////////////////////////////////////////////////////////////////
242/// \f$ erg cm \f$
243constexpr Double_t HCcgs()
244{
245 return Hcgs() * Ccgs();
246}
247
248////////////////////////////////////////////////////////////////////////////////
249/// Boltzmann's constant in \f$ J K^{-1} \f$: \f$ k \f$
250constexpr Double_t K()
251{
252 return 1.380649e-23;
253}
254
255////////////////////////////////////////////////////////////////////////////////
256/// \f$ erg K^{-1} \f$
257constexpr Double_t Kcgs()
258{
259 return 1.0e7 * K();
260}
261
262////////////////////////////////////////////////////////////////////////////////
263/// Boltzmann's constant uncertainty.
265{
266 // constant is exact according to 2019 redefinition
267 // (https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units)
268 return 0.0;
269}
270
271////////////////////////////////////////////////////////////////////////////////
272/// Stefan-Boltzmann constant in \f$ W m^{-2} K^{-4}\f$: \f$ \sigma \f$
273constexpr Double_t Sigma()
274{
275 return 5.670373e-8;
276}
277
278////////////////////////////////////////////////////////////////////////////////
279/// Stefan-Boltzmann constant uncertainty.
281{
282 return 0.0;
283}
284
285////////////////////////////////////////////////////////////////////////////////
286/// Avogadro constant (Avogadro's Number) in \f$ mol^{-1} \f$
287constexpr Double_t Na()
288{
289 return 6.02214076e+23;
290}
291
292////////////////////////////////////////////////////////////////////////////////
293/// Avogadro constant (Avogadro's Number) uncertainty.
295{
296 // constant is exact according to 2019 redefinition
297 // (https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units)
298 return 0.0;
299}
300
301////////////////////////////////////////////////////////////////////////////////
302/// [Universal gas constant](http://scienceworld.wolfram.com/physics/UniversalGasConstant.html)
303/// (\f$ Na K \f$) in \f$ J K^{-1} mol^{-1} \f$
304//
305constexpr Double_t R()
306{
307 return K() * Na();
308}
309
310////////////////////////////////////////////////////////////////////////////////
311/// Universal gas constant uncertainty.
313{
314 return R() * ((KUncertainty() / K()) + (NaUncertainty() / Na()));
315}
316
317////////////////////////////////////////////////////////////////////////////////
318/// [Molecular weight of dry air 1976 US Standard Atmosphere](http://atmos.nmsu.edu/jsdap/encyclopediawork.html)
319/// in \f$ kg kmol^{-1} \f$ or \f$ gm mol^{-1} \f$
320constexpr Double_t MWair()
321{
322 return 28.9644;
323}
324
325////////////////////////////////////////////////////////////////////////////////
326/// [Dry Air Gas Constant (R / MWair)](http://atmos.nmsu.edu/education_and_outreach/encyclopedia/gas_constant.htm)
327/// in \f$ J kg^{-1} K^{-1} \f$
328constexpr Double_t Rgair()
329{
330 return (1000.0 * R()) / MWair();
331}
332
333////////////////////////////////////////////////////////////////////////////////
334/// Euler-Mascheroni Constant.
336{
337 return 0.577215664901532860606512090082402431042;
338}
339
340////////////////////////////////////////////////////////////////////////////////
341/// Elementary charge in \f$ C \f$ .
342constexpr Double_t Qe()
343{
344 return 1.602176634e-19;
345}
346
347////////////////////////////////////////////////////////////////////////////////
348/// Elementary charge uncertainty.
350{
351 // constant is exact according to 2019 redefinition
352 // (https://en.wikipedia.org/wiki/2019_redefinition_of_the_SI_base_units)
353 return 0.0;
354}
355
356////////////////////////////////////////////////////////////////////////////////
357// Mathematical Functions
358
359////////////////////////////////////////////////////////////////////////////////
360// Trigonometrical Functions
361
362inline Double_t Sin(Double_t);
363inline Double_t Cos(Double_t);
364inline Double_t Tan(Double_t);
365inline Double_t SinH(Double_t);
366inline Double_t CosH(Double_t);
367inline Double_t TanH(Double_t);
368inline Double_t ASin(Double_t);
369inline Double_t ACos(Double_t);
370inline Double_t ATan(Double_t);
376
377////////////////////////////////////////////////////////////////////////////////
378// Elementary Functions
379
380inline Double_t Ceil(Double_t x);
381inline Int_t CeilNint(Double_t x);
382inline Double_t Floor(Double_t x);
383inline Int_t FloorNint(Double_t x);
384template <typename T>
385inline Int_t Nint(T x);
386
387inline Double_t Sq(Double_t x);
388inline Double_t Sqrt(Double_t x);
389inline Double_t Exp(Double_t x);
390inline Double_t Ldexp(Double_t x, Int_t exp);
396inline Double_t Power(Double_t x, Int_t y);
397inline Double_t Log(Double_t x);
399inline Double_t Log10(Double_t x);
400inline Int_t Finite(Double_t x);
401inline Int_t Finite(Float_t x);
402inline Bool_t IsNaN(Double_t x);
403inline Bool_t IsNaN(Float_t x);
404
405inline Double_t QuietNaN();
406inline Double_t SignalingNaN();
407inline Double_t Infinity();
408
409template <typename T>
410struct Limits {
411 inline static T Min();
412 inline static T Max();
413 inline static T Epsilon();
414 };
415
416 // Some integer math
418
419 /// Comparing floating points.
420 /// Returns `kTRUE` if the absolute difference between `af` and `bf` is less than `epsilon`.
422 return af == bf || // shortcut for exact equality (necessary because otherwise (inf != inf))
423 TMath::Abs(af-bf) < epsilon ||
424 TMath::Abs(af - bf) < Limits<Double_t>::Min(); // handle 0 < 0 case
425
426 }
427 /// Comparing floating points.
428 /// Returns `kTRUE` if the relative difference between `af` and `bf` is less than `relPrec`.
430 return af == bf || // shortcut for exact equality (necessary because otherwise (inf != inf))
431 TMath::Abs(af - bf) <= 0.5 * relPrec * (TMath::Abs(af) + TMath::Abs(bf)) ||
432 TMath::Abs(af - bf) < Limits<Double_t>::Min(); // handle denormals
433 }
434
435 /////////////////////////////////////////////////////////////////////////////
436 // Array Algorithms
437
438 // Min, Max of an array
439 template <typename T> T MinElement(Long64_t n, const T *a);
440 template <typename T> T MaxElement(Long64_t n, const T *a);
441
442 // Locate Min, Max element number in an array
443 template <typename T> Long64_t LocMin(Long64_t n, const T *a);
444 template <typename Iterator> Iterator LocMin(Iterator first, Iterator last);
445 template <typename T> Long64_t LocMax(Long64_t n, const T *a);
446 template <typename Iterator> Iterator LocMax(Iterator first, Iterator last);
447
448 // Derivatives of an array
449 template <typename T>
450 T *Gradient(Long64_t n, T const *f, double h = 1);
451 template <typename T>
452 T *Laplacian(Long64_t n, T const *f, double h = 1);
453
454 // Hashing
455 ULong_t Hash(const void *txt, Int_t ntxt);
456 ULong_t Hash(const char *str);
457
460
461 Bool_t Permute(Int_t n, Int_t *a); // Find permutations
462
463 /////////////////////////////////////////////////////////////////////////////
464 // Geometrical Functions
465
466 //Sample quantiles
468 Bool_t isSorted=kTRUE, Int_t *index = nullptr, Int_t type=7);
469
470 // IsInside
471 template <typename T> Bool_t IsInside(T xp, T yp, Int_t np, T *x, T *y);
472
473 // Calculate the Cross Product of two vectors
474 template <typename T> T *Cross(const T v1[3],const T v2[3], T out[3]);
475
476 Float_t Normalize(Float_t v[3]); // Normalize a vector
477 Double_t Normalize(Double_t v[3]); // Normalize a vector
478
479 //Calculate the Normalized Cross Product of two vectors
480 template <typename T> inline T NormCross(const T v1[3],const T v2[3],T out[3]);
481
482 // Calculate a normal vector of a plane
483 template <typename T> T *Normal2Plane(const T v1[3],const T v2[3],const T v3[3], T normal[3]);
484
485 /////////////////////////////////////////////////////////////////////////////
486 // Polynomial Functions
487
488 Bool_t RootsCubic(const Double_t coef[4],Double_t &a, Double_t &b, Double_t &c);
489
490 /////////////////////////////////////////////////////////////////////////////
491 // Statistic Functions
492
493 Double_t Binomial(Int_t n,Int_t k); // Calculate the binomial coefficient n over k
519
520 /////////////////////////////////////////////////////////////////////////////
521 // Statistics over arrays
522
523 // Mean, Geometric Mean, Median, RMS(sigma), ModeHalfSample
524
525 template <typename T> Double_t Mean(Long64_t n, const T *a, const Double_t *w=nullptr);
526 template <typename Iterator> Double_t Mean(Iterator first, Iterator last);
527 template <typename Iterator, typename WeightIterator> Double_t Mean(Iterator first, Iterator last, WeightIterator wfirst);
528
529 template <typename T> Double_t GeomMean(Long64_t n, const T *a);
530 template <typename Iterator> Double_t GeomMean(Iterator first, Iterator last);
531
532 template <typename T> Double_t RMS(Long64_t n, const T *a, const Double_t *w=nullptr);
533 template <typename Iterator> Double_t RMS(Iterator first, Iterator last);
534 template <typename Iterator, typename WeightIterator> Double_t RMS(Iterator first, Iterator last, WeightIterator wfirst);
535
536 template <typename T> Double_t StdDev(Long64_t n, const T *a, const Double_t * w = nullptr) { return RMS<T>(n,a,w); } /// Same as RMS
537 template <typename Iterator> Double_t StdDev(Iterator first, Iterator last) { return RMS<Iterator>(first,last); } /// Same as RMS
538 template <typename Iterator, typename WeightIterator> Double_t StdDev(Iterator first, Iterator last, WeightIterator wfirst) { return RMS<Iterator,WeightIterator>(first,last,wfirst); } /// Same as RMS
539
540 template <typename T> Double_t Median(Long64_t n, const T *a, const Double_t *w=nullptr, Long64_t *work=nullptr);
541 template <typename T> Double_t ModeHalfSample(Long64_t n, const T *a, const Double_t *w = nullptr);
542
543 //k-th order statistic
544 template <class Element, typename Size> Element KOrdStat(Size n, const Element *a, Size k, Size *work = 0);
545
546 /////////////////////////////////////////////////////////////////////////////
547 // Special Functions
548
554
555 // Bessel functions
556 Double_t BesselI(Int_t n,Double_t x); /// Integer order modified Bessel function I_n(x)
557 Double_t BesselK(Int_t n,Double_t x); /// Integer order modified Bessel function K_n(x)
558 Double_t BesselI0(Double_t x); /// Modified Bessel function I_0(x)
559 Double_t BesselK0(Double_t x); /// Modified Bessel function K_0(x)
560 Double_t BesselI1(Double_t x); /// Modified Bessel function I_1(x)
561 Double_t BesselK1(Double_t x); /// Modified Bessel function K_1(x)
562 Double_t BesselJ0(Double_t x); /// Bessel function J0(x) for any real x
563 Double_t BesselJ1(Double_t x); /// Bessel function J1(x) for any real x
564 Double_t BesselY0(Double_t x); /// Bessel function Y0(x) for positive x
565 Double_t BesselY1(Double_t x); /// Bessel function Y1(x) for positive x
566 Double_t StruveH0(Double_t x); /// Struve functions of order 0
567 Double_t StruveH1(Double_t x); /// Struve functions of order 1
568 Double_t StruveL0(Double_t x); /// Modified Struve functions of order 0
569 Double_t StruveL1(Double_t x); /// Modified Struve functions of order 1
570
579 Double_t GammaDist(Double_t x, Double_t gamma, Double_t mu=0, Double_t beta=1);
581
582 void KNNDensity(std::span<const double> observations, std::span<const double> queries, std::span<double> result,
583 int k, double dmin = 0.0);
584}
585
586////////////////////////////////////////////////////////////////////////////////
587// Trig and other functions
588
589#include <cfloat>
590#include <cmath>
591
592#if defined(R__WIN32)
593# ifndef finite
594# define finite _finite
595# endif
596#endif
597
598////////////////////////////////////////////////////////////////////////////////
599/// Returns the sine of an angle of `x` radians.
600
602 { return sin(x); }
603
604////////////////////////////////////////////////////////////////////////////////
605/// Returns the cosine of an angle of `x` radians.
606
608 { return cos(x); }
609
610////////////////////////////////////////////////////////////////////////////////
611/// Returns the tangent of an angle of `x` radians.
612
614 { return tan(x); }
615
616////////////////////////////////////////////////////////////////////////////////
617/// Returns the hyperbolic sine of `x`.
618
620 { return sinh(x); }
621
622////////////////////////////////////////////////////////////////////////////////
623/// Returns the hyperbolic cosine of `x`.
624
626 { return cosh(x); }
627
628////////////////////////////////////////////////////////////////////////////////
629/// Returns the hyperbolic tangent of `x`.
630
632 { return tanh(x); }
633
634////////////////////////////////////////////////////////////////////////////////
635/// Returns the principal value of the arc sine of `x`, expressed in radians.
636
638 {
639 return asin(x);
640 }
641
642////////////////////////////////////////////////////////////////////////////////
643/// Returns the principal value of the arc cosine of `x`, expressed in radians.
644
646 {
647 return acos(x);
648 }
649
650////////////////////////////////////////////////////////////////////////////////
651/// Returns the principal value of the arc tangent of `x`, expressed in radians.
652
654 { return atan(x); }
655
656////////////////////////////////////////////////////////////////////////////////
657/// Returns the principal value of the arc tangent of `y/x`, expressed in radians.
658
660 { if (x != 0) return atan2(y, x);
661 if (y == 0) return 0;
662 if (y > 0) return Pi()/2;
663 else return -Pi()/2;
664 }
665
666////////////////////////////////////////////////////////////////////////////////
667/// Returns `x*x`.
668
670 { return x*x; }
671
672////////////////////////////////////////////////////////////////////////////////
673/// Returns the square root of x.
674
676 { return sqrt(x); }
677
678////////////////////////////////////////////////////////////////////////////////
679/// Rounds `x` upward, returning the smallest integral value that is not less than `x`.
680
682 { return ceil(x); }
683
684////////////////////////////////////////////////////////////////////////////////
685/// Returns the nearest integer of `TMath::Ceil(x)`.
686
688 { return TMath::Nint(ceil(x)); }
689
690////////////////////////////////////////////////////////////////////////////////
691/// Rounds `x` downward, returning the largest integral value that is not greater than `x`.
692
694 { return floor(x); }
695
696////////////////////////////////////////////////////////////////////////////////
697/// Returns the nearest integer of `TMath::Floor(x)`.
698
700 { return TMath::Nint(floor(x)); }
701
702////////////////////////////////////////////////////////////////////////////////
703/// Round to nearest integer. Rounds half integers to the nearest even integer.
704
705template<typename T>
707{
708 int i;
709 if (x >= 0) {
710 i = int(x + 0.5);
711 if ( i & 1 && x + 0.5 == T(i) ) i--;
712 } else {
713 i = int(x - 0.5);
714 if ( i & 1 && x - 0.5 == T(i) ) i++;
715 }
716 return i;
717}
718
719////////////////////////////////////////////////////////////////////////////////
720/// Returns the base-e exponential function of x, which is e raised to the power `x`.
721
723 { return exp(x); }
724
725////////////////////////////////////////////////////////////////////////////////
726/// Returns the result of multiplying `x` (the significant) by 2 raised to the power of `exp` (the exponent).
727
729 { return ldexp(x, exp); }
730
731////////////////////////////////////////////////////////////////////////////////
732/// Returns `x` raised to the power `y`.
733
735 { return std::pow(x,y); }
736
737////////////////////////////////////////////////////////////////////////////////
738/// Returns `x` raised to the power `y`.
739
741 { return std::pow(x,(LongDouble_t)y); }
742
743////////////////////////////////////////////////////////////////////////////////
744/// Returns `x` raised to the power `y`.
745
747 { return std::pow(x,y); }
748
749////////////////////////////////////////////////////////////////////////////////
750/// Returns `x` raised to the power `y`.
751
753 { return pow(x, y); }
754
755////////////////////////////////////////////////////////////////////////////////
756/// Returns `x` raised to the power `y`.
757
759#ifdef R__ANSISTREAM
760 return std::pow(x, y);
761#else
762 return pow(x, (Double_t) y);
763#endif
764}
765
766////////////////////////////////////////////////////////////////////////////////
767/// Returns the natural logarithm of `x`.
768
770 { return log(x); }
771
772////////////////////////////////////////////////////////////////////////////////
773/// Returns the common (base-10) logarithm of `x`.
774
776 { return log10(x); }
777
778////////////////////////////////////////////////////////////////////////////////
779/// Check if it is finite with a mask in order to be consistent in presence of
780/// fast math.
781/// Inspired from the CMSSW FWCore/Utilities package
782
784#if defined(R__FAST_MATH)
785
786{
787 const unsigned long long mask = 0x7FF0000000000000LL;
788 union { unsigned long long l; double d;} v;
789 v.d =x;
790 return (v.l&mask)!=mask;
791}
792#else
793# if defined(R__HPUX11)
794 { return isfinite(x); }
795# elif defined(R__MACOSX)
796# ifdef isfinite
797 // from math.h
798 { return isfinite(x); }
799# else
800 // from cmath
801 { return std::isfinite(x); }
802# endif
803# else
804 { return finite(x); }
805# endif
806#endif
807
808////////////////////////////////////////////////////////////////////////////////
809/// Check if it is finite with a mask in order to be consistent in presence of
810/// fast math.
811/// Inspired from the CMSSW FWCore/Utilities package
812
814#if defined(R__FAST_MATH)
815
816{
817 const unsigned int mask = 0x7f800000;
818 union { unsigned int l; float d;} v;
819 v.d =x;
820 return (v.l&mask)!=mask;
821}
822#else
823{ return std::isfinite(x); }
824#endif
825
826// This namespace provides all the routines necessary for checking if a number
827// is a NaN also in presence of optimisations affecting the behaviour of the
828// floating point calculations.
829// Inspired from the CMSSW FWCore/Utilities package
830
831#if defined (R__FAST_MATH)
832namespace ROOT {
833namespace Internal {
834namespace Math {
835// abridged from GNU libc 2.6.1 - in detail from
836// math/math_private.h
837// sysdeps/ieee754/ldbl-96/math_ldbl.h
838
839// part of this file:
840 /*
841 * ====================================================
842 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
843 *
844 * Developed at SunPro, a Sun Microsystems, Inc. business.
845 * Permission to use, copy, modify, and distribute this
846 * software is freely granted, provided that this notice
847 * is preserved.
848 * ====================================================
849 */
850
851 // A union which permits us to convert between a double and two 32 bit ints.
852 typedef union {
854 struct {
855 UInt_t lsw;
856 UInt_t msw;
857 } parts;
859
860#define EXTRACT_WORDS(ix0,ix1,d) \
861 do { \
862 ieee_double_shape_type ew_u; \
863 ew_u.value = (d); \
864 (ix0) = ew_u.parts.msw; \
865 (ix1) = ew_u.parts.lsw; \
866 } while (0)
867
868 inline Bool_t IsNaN(Double_t x)
869 {
870 UInt_t hx, lx;
871
872 EXTRACT_WORDS(hx, lx, x);
873
874 lx |= hx & 0xfffff;
875 hx &= 0x7ff00000;
876 return (hx == 0x7ff00000) && (lx != 0);
877 }
878
879 typedef union {
881 UInt_t word;
883
884#define GET_FLOAT_WORD(i,d) \
885 do { \
886 ieee_float_shape_type gf_u; \
887 gf_u.value = (d); \
888 (i) = gf_u.word; \
889 } while (0)
890
891 inline Bool_t IsNaN(Float_t x)
892 {
893 UInt_t wx;
895 wx &= 0x7fffffff;
896 return (Bool_t)(wx > 0x7f800000);
897 }
898} } } // end NS ROOT::Internal::Math
899#endif // End R__FAST_MATH
900
901#if defined(R__FAST_MATH)
902 inline Bool_t TMath::IsNaN(Double_t x) { return ROOT::Internal::Math::IsNaN(x); }
903 inline Bool_t TMath::IsNaN(Float_t x) { return ROOT::Internal::Math::IsNaN(x); }
904#else
905 inline Bool_t TMath::IsNaN(Double_t x) { return std::isnan(x); }
906 inline Bool_t TMath::IsNaN(Float_t x) { return std::isnan(x); }
907#endif
908
909////////////////////////////////////////////////////////////////////////////////
910// Wrapper to numeric_limits
911
912////////////////////////////////////////////////////////////////////////////////
913/// Returns a quiet NaN as [defined by IEEE 754](http://en.wikipedia.org/wiki/NaN#Quiet_NaN).
914
916
917 return std::numeric_limits<Double_t>::quiet_NaN();
918}
919
920////////////////////////////////////////////////////////////////////////////////
921/// Returns a signaling NaN [as defined by IEEE 754](http://en.wikipedia.org/wiki/NaN#Signaling_NaN).
922
924 return std::numeric_limits<Double_t>::signaling_NaN();
925}
926
927////////////////////////////////////////////////////////////////////////////////
928/// Returns an infinity as defined by the IEEE standard.
929
931 return std::numeric_limits<Double_t>::infinity();
932}
933
934////////////////////////////////////////////////////////////////////////////////
935/// Returns maximum representation for type T.
936
937template<typename T>
939 return (std::numeric_limits<T>::min)(); //N.B. use this signature to avoid clashes with macro min() on Windows
940}
941
942////////////////////////////////////////////////////////////////////////////////
943/// Returns minimum double representation.
944
945template<typename T>
947 return (std::numeric_limits<T>::max)(); //N.B. use this signature to avoid clashes with macro max() on Windows
948}
949
950////////////////////////////////////////////////////////////////////////////////
951/// Returns minimum double representation.
952
953template<typename T>
955 return std::numeric_limits<T>::epsilon();
956}
957
958////////////////////////////////////////////////////////////////////////////////
959// Advanced.
960
961////////////////////////////////////////////////////////////////////////////////
962/// Calculates the Normalized Cross Product of two vectors.
963
964template <typename T> inline T TMath::NormCross(const T v1[3],const T v2[3],T out[3])
965{
966 return Normalize(Cross(v1,v2,out));
967}
968
969////////////////////////////////////////////////////////////////////////////////
970/// Returns minimum of array a of length n.
971
972template <typename T>
974 return *std::min_element(a,a+n);
975}
976
977////////////////////////////////////////////////////////////////////////////////
978/// Returns maximum of array a of length n.
979
980template <typename T>
982 return *std::max_element(a,a+n);
983}
984
985////////////////////////////////////////////////////////////////////////////////
986/// Returns index of array with the minimum element.
987/// If more than one element is minimum returns first found.
988///
989/// Implement here since this one is found to be faster (mainly on 64 bit machines)
990/// than stl generic implementation.
991/// When performing the comparison, the STL implementation needs to de-reference both the array iterator
992/// and the iterator pointing to the resulting minimum location
993
994template <typename T>
996 if (n <= 0 || !a) return -1;
997 T xmin = a[0];
998 Long64_t loc = 0;
999 for (Long64_t i = 1; i < n; i++) {
1000 if (xmin > a[i]) {
1001 xmin = a[i];
1002 loc = i;
1003 }
1004 }
1005 return loc;
1006}
1007
1008////////////////////////////////////////////////////////////////////////////////
1009/// Returns index of array with the minimum element.
1010/// If more than one element is minimum returns first found.
1011
1012template <typename Iterator>
1013Iterator TMath::LocMin(Iterator first, Iterator last) {
1014
1015 return std::min_element(first, last);
1016}
1017
1018////////////////////////////////////////////////////////////////////////////////
1019/// \brief Calculate the one-dimensional finite gradient of an array with length n.
1020/// It is assumed that the values in the array are spaced uniformly in "x", which
1021/// would amount to taking the derivative w.r.t. x with an infinitesimal step size `h`.
1022///
1023/// The first value in the returned array is a forward difference,
1024/// the next n-2 values are central differences, and the last is a backward difference.
1025///
1026/// \param n the number of points in the array
1027/// \param f the array of points. It is assumed that these are spaced uniformly in "x".
1028/// \param h the distance between the points in `f`.
1029/// \return an array of size n with the gradient. Returns nullptr if n < 2 or f empty. Ownership is transferred to the
1030/// caller.
1031
1032template <typename T>
1033T *TMath::Gradient(const Long64_t n, T const *f, const double h)
1034{
1035 if (!f) {
1036 ::Error("TMath::Gradient", "Input parameter f is empty.");
1037 return nullptr;
1038 } else if (n < 2) {
1039 ::Error("TMath::Gradient", "Input parameter n=%lld is smaller than 2.", n);
1040 return nullptr;
1041 }
1042 Long64_t i = 1;
1043 T *result = new T[n];
1044
1045 // Forward difference
1046 result[0] = (f[1] - f[0]) / h;
1047
1048 // Central difference
1049 while (i < n - 1) {
1050 result[i] = (f[i + 1] - f[i - 1]) / (2 * h);
1051 i++;
1052 }
1053 // Backward difference
1054 result[i] = (f[i] - f[i - 1]) / h;
1055 return result;
1056}
1057
1058////////////////////////////////////////////////////////////////////////////////
1059/// \brief Calculate second-order finite differences of an array with length n at second-order accuracy.
1060/// It is assumed that the values in the array are spaced uniformly in "x", where
1061/// the spacing is represented by the argument `h`.
1062///
1063/// The first value in the returned array is a forward difference at 2nd order accuracy,
1064/// the next n-2 values are central differences, and the last is the backward difference.
1065///
1066/// \param n the number of points in the array
1067/// \param f the array of points. It is assumed that these are spaced uniformly in "x".
1068/// \param h the distance between the points in `f`.
1069/// \return an array of size n with the laplacian. Returns nullptr if n < 4 or f empty. Ownership is transferred to the
1070/// caller.
1071
1072template <typename T>
1073T *TMath::Laplacian(const Long64_t n, T const *f, const double h)
1074{
1075 if (!f) {
1076 ::Error("TMath::Laplacian", "Input parameter f is empty.");
1077 return nullptr;
1078 } else if (n < 4) {
1079 ::Error("TMath::Laplacian", "Need at least four elements, got %lld", n);
1080 return nullptr;
1081 }
1082 Long64_t i = 1;
1083 T *result = new T[n];
1084
1085 // Forward difference
1086 result[0] = (4 * f[2] + 2 * f[0] - 5 * f[1] - f[3]) / (h * h);
1087
1088 // Central difference
1089 while (i < n - 1) {
1090 result[i] = (f[i + 1] + f[i - 1] - 2 * f[i]) / (h * h);
1091 i++;
1092 }
1093 // Backward difference
1094 result[i] = (2 * f[i] - 5 * f[i - 1] + 4 * f[i - 2] - f[i - 3]) / (h * h);
1095 return result;
1096}
1097
1098////////////////////////////////////////////////////////////////////////////////
1099/// Returns index of array with the maximum element.
1100/// If more than one element is maximum returns first found.
1101///
1102/// Implement here since it is faster (see comment in LocMin function)
1103
1104template <typename T>
1106 if (n <= 0 || !a) return -1;
1107 T xmax = a[0];
1108 Long64_t loc = 0;
1109 for (Long64_t i = 1; i < n; i++) {
1110 if (xmax < a[i]) {
1111 xmax = a[i];
1112 loc = i;
1113 }
1114 }
1115 return loc;
1116}
1117
1118////////////////////////////////////////////////////////////////////////////////
1119/// Returns index of array with the maximum element.
1120/// If more than one element is maximum returns first found.
1121
1122template <typename Iterator>
1123Iterator TMath::LocMax(Iterator first, Iterator last)
1124{
1125
1126 return std::max_element(first, last);
1127}
1128
1129////////////////////////////////////////////////////////////////////////////////
1130/// Returns the weighted mean of an array defined by the iterators.
1131
1132template <typename Iterator>
1133Double_t TMath::Mean(Iterator first, Iterator last)
1134{
1135 Double_t sum = 0;
1136 Double_t sumw = 0;
1137 while ( first != last )
1138 {
1139 sum += *first;
1140 sumw += 1;
1141 first++;
1142 }
1143
1144 return sum/sumw;
1145}
1146
1147////////////////////////////////////////////////////////////////////////////////
1148/// Returns the weighted mean of an array defined by the first and
1149/// last iterators. The w iterator should point to the first element
1150/// of a vector of weights of the same size as the main array.
1151
1152template <typename Iterator, typename WeightIterator>
1153Double_t TMath::Mean(Iterator first, Iterator last, WeightIterator w)
1154{
1155
1156 Double_t sum = 0;
1157 Double_t sumw = 0;
1158 int i = 0;
1159 while ( first != last ) {
1160 if ( *w < 0) {
1161 ::Error("TMath::Mean","w[%d] = %.4e < 0 ?!",i,*w);
1162 return 0;
1163 }
1164 sum += (*w) * (*first);
1165 sumw += (*w) ;
1166 ++w;
1167 ++first;
1168 ++i;
1169 }
1170 if (sumw <= 0) {
1171 ::Error("TMath::Mean","sum of weights == 0 ?!");
1172 return 0;
1173 }
1174
1175 return sum/sumw;
1176}
1177
1178////////////////////////////////////////////////////////////////////////////////
1179/// Returns the weighted mean of an array a with length n.
1180
1181template <typename T>
1183{
1184 if (w) {
1185 return TMath::Mean(a, a+n, w);
1186 } else {
1187 return TMath::Mean(a, a+n);
1188 }
1189}
1190
1191////////////////////////////////////////////////////////////////////////////////
1192/// Returns the geometric mean of an array defined by the iterators.
1193/// \f[ GeomMean = (\prod_{i=0}^{n-1} |a[i]|)^{1/n} \f]
1194
1195template <typename Iterator>
1196Double_t TMath::GeomMean(Iterator first, Iterator last)
1197{
1198 Double_t logsum = 0.;
1199 Long64_t n = 0;
1200 while ( first != last ) {
1201 if (*first == 0) return 0.;
1202 Double_t absa = (Double_t) TMath::Abs(*first);
1204 ++first;
1205 ++n;
1206 }
1207
1208 return TMath::Exp(logsum/n);
1209}
1210
1211////////////////////////////////////////////////////////////////////////////////
1212/// Returns the geometric mean of an array a of size n.
1213/// \f[ GeomMean = (\prod_{i=0}^{n-1} |a[i]|)^{1/n} \f]
1214
1215template <typename T>
1217{
1218 return TMath::GeomMean(a, a+n);
1219}
1220
1221////////////////////////////////////////////////////////////////////////////////
1222/// Returns the Standard Deviation of an array defined by the iterators.
1223/// Note that this function returns the sigma(standard deviation) and
1224/// not the root mean square of the array.
1225///
1226/// Use the two pass algorithm, which is slower (! a factor of 2) but much more
1227/// precise. Since we have a vector the 2 pass algorithm is still faster than the
1228/// Welford algorithm. (See also ROOT-5545)
1229
1230template <typename Iterator>
1231Double_t TMath::RMS(Iterator first, Iterator last)
1232{
1233
1234 Double_t n = 0;
1235
1236 Double_t tot = 0;
1237 Double_t mean = TMath::Mean(first,last);
1238 while ( first != last ) {
1239 Double_t x = Double_t(*first);
1240 tot += (x - mean)*(x - mean);
1241 ++first;
1242 ++n;
1243 }
1244 Double_t rms = (n > 1) ? TMath::Sqrt(tot/(n-1)) : 0.0;
1245 return rms;
1246}
1247
1248////////////////////////////////////////////////////////////////////////////////
1249/// Returns the weighted Standard Deviation of an array defined by the iterators.
1250/// Note that this function returns the sigma(standard deviation) and
1251/// not the root mean square of the array.
1252///
1253/// As in the unweighted case use the two pass algorithm
1254
1255template <typename Iterator, typename WeightIterator>
1256Double_t TMath::RMS(Iterator first, Iterator last, WeightIterator w)
1257{
1258 Double_t tot = 0;
1259 Double_t sumw = 0;
1260 Double_t sumw2 = 0;
1261 Double_t mean = TMath::Mean(first,last,w);
1262 while ( first != last ) {
1263 Double_t x = Double_t(*first);
1264 sumw += *w;
1265 sumw2 += (*w) * (*w);
1266 tot += (*w) * (x - mean)*(x - mean);
1267 ++first;
1268 ++w;
1269 }
1270 // use the correction neff/(neff -1) for the unbiased formula
1272 return rms;
1273}
1274
1275////////////////////////////////////////////////////////////////////////////////
1276/// Returns the Standard Deviation of an array a with length n.
1277/// Note that this function returns the sigma(standard deviation) and
1278/// not the root mean square of the array.
1279
1280template <typename T>
1282{
1283 return (w) ? TMath::RMS(a, a+n, w) : TMath::RMS(a, a+n);
1284}
1285
1286////////////////////////////////////////////////////////////////////////////////
1287/// Calculates the Cross Product of two vectors:
1288/// out = [v1 x v2]
1289
1290template <typename T> T *TMath::Cross(const T v1[3],const T v2[3], T out[3])
1291{
1292 out[0] = v1[1] * v2[2] - v1[2] * v2[1];
1293 out[1] = v1[2] * v2[0] - v1[0] * v2[2];
1294 out[2] = v1[0] * v2[1] - v1[1] * v2[0];
1295
1296 return out;
1297}
1298
1299////////////////////////////////////////////////////////////////////////////////
1300/// Calculates a normal vector of a plane.
1301///
1302/// \param[in] p1, p2,p3 3 3D points belonged the plane to define it.
1303/// \param[out] normal Pointer to 3D normal vector (normalized)
1304
1305template <typename T> T * TMath::Normal2Plane(const T p1[3],const T p2[3],const T p3[3], T normal[3])
1306{
1307 T v1[3], v2[3];
1308
1309 v1[0] = p2[0] - p1[0];
1310 v1[1] = p2[1] - p1[1];
1311 v1[2] = p2[2] - p1[2];
1312
1313 v2[0] = p3[0] - p1[0];
1314 v2[1] = p3[1] - p1[1];
1315 v2[2] = p3[2] - p1[2];
1316
1318 return normal;
1319}
1320
1321////////////////////////////////////////////////////////////////////////////////
1322/// Function which returns kTRUE if point xp,yp lies inside the
1323/// polygon defined by the np points in arrays x and y, kFALSE otherwise.
1324/// Note that the polygon may be open or closed.
1325
1326template <typename T> Bool_t TMath::IsInside(T xp, T yp, Int_t np, T *x, T *y)
1327{
1328 Int_t i, j = np-1 ;
1330
1331 for (i=0; i<np; i++) {
1332 if ((y[i]<yp && y[j]>=yp) || (y[j]<yp && y[i]>=yp)) {
1333 if (x[i]+(yp-y[i])/(y[j]-y[i])*(x[j]-x[i])<xp) {
1334 oddNodes = !oddNodes;
1335 }
1336 }
1337 j=i;
1338 }
1339
1340 return oddNodes;
1341}
1342
1343////////////////////////////////////////////////////////////////////////////////
1344/// Returns the median of the array a where each entry i has weight w[i] .
1345/// Both arrays have a length of at least n . The median is a number obtained
1346/// from the sorted array a through
1347///
1348/// median = (a[jl]+a[jh])/2. where (using also the sorted index on the array w)
1349///
1350/// sum_i=0,jl w[i] <= sumTot/2
1351/// sum_i=0,jh w[i] >= sumTot/2
1352/// sumTot = sum_i=0,n w[i]
1353///
1354/// If w=0, the algorithm defaults to the median definition where it is
1355/// a number that divides the sorted sequence into 2 halves.
1356/// When n is odd or n > 1000, the median is kth element k = (n + 1) / 2.
1357/// when n is even and n < 1000the median is a mean of the elements k = n/2 and k = n/2 + 1.
1358///
1359/// If the weights are supplied (w not 0) all weights must be >= 0
1360///
1361/// If work is supplied, it is used to store the sorting index and assumed to be
1362/// >= n . If work=0, local storage is used, either on the stack if n < kWorkMax
1363/// or on the heap for n >= kWorkMax .
1364
1365template <typename T> Double_t TMath::Median(Long64_t n, const T *a, const Double_t *w, Long64_t *work)
1366{
1367
1368 const Int_t kWorkMax = 100;
1369
1370 if (n <= 0 || !a) return 0;
1373 Long64_t *ind;
1374 Long64_t workLocal[kWorkMax];
1375
1376 if (work) {
1377 ind = work;
1378 } else {
1379 ind = workLocal;
1380 if (n > kWorkMax) {
1382 ind = new Long64_t[n];
1383 }
1384 }
1385
1386 if (w) {
1387 Double_t sumTot2 = 0;
1388 for (Int_t j = 0; j < n; j++) {
1389 if (w[j] < 0) {
1390 ::Error("TMath::Median","w[%d] = %.4e < 0 ?!",j,w[j]);
1391 if (isAllocated) delete [] ind;
1392 return 0;
1393 }
1394 sumTot2 += w[j];
1395 }
1396
1397 sumTot2 /= 2.;
1398
1399 Sort(n, a, ind, kFALSE);
1400
1401 Double_t sum = 0.;
1402 Int_t jl;
1403 for (jl = 0; jl < n; jl++) {
1404 sum += w[ind[jl]];
1405 if (sum >= sumTot2) break;
1406 }
1407
1408 Int_t jh;
1409 sum = 2.*sumTot2;
1410 for (jh = n-1; jh >= 0; jh--) {
1411 sum -= w[ind[jh]];
1412 if (sum <= sumTot2) break;
1413 }
1414
1415 median = 0.5*(a[ind[jl]]+a[ind[jh]]);
1416
1417 } else {
1418
1419 if (n%2 == 1)
1420 median = KOrdStat(n, a,n/2, ind);
1421 else {
1422 median = 0.5*(KOrdStat(n, a, n/2 -1, ind)+KOrdStat(n, a, n/2, ind));
1423 }
1424 }
1425
1426 if (isAllocated)
1427 delete [] ind;
1428 return median;
1429}
1430
1431////////////////////////////////////////////////////////////////////////////////
1432/// Returns the half-sample mode of the array a where each entry i has weight w[i].
1433/// Both arrays must have a length of n. The mode is a number obtained
1434/// according to the paper http://arxiv.org/ftp/math/papers/0505/0505419.pdf (page 19).
1435/// The algorithm searches for the smallest range of sorted a values that
1436/// contains ~n/2 values. Then it re-applies the same algorithm to
1437/// that range until the range has <= 3 elements in it.
1438///
1439/// \note See David R. Bickel: "On a Fast, Robust Estimator of the Mode"
1440/// http://arxiv.org/ftp/math/papers/0505/0505419.pdf (page 19)
1441/// Initial implementation suggestion by Jean-Fran\c{c}ois Caron, 2014 on JIRA-6849
1442///
1443/// \tparam T data type of the values array `a`
1444/// \param n Number of elements in array `a`
1445/// \param a Pointer to array of values (owned by user, preallocated), must have length of n, and none of them should be NaN. The array must not be necessarily sorted nor contain unique values.
1446/// \param w Pointer to array of weights (owned by user, preallocated), must have length of n. If the weights are supplied (w not nullptr) all weights must be >= 0 to properly work.
1447/// \return NaN if n <= 0, a[0] if n == 1, TMath::Mean(n,a,w) if n == 2,
1448/// the (weighted) mean of the closest two if n == 3; for the rest of the cases,
1449/// if all values of `a` are unique or have equal weights (or `w` is nullptr), then the Bickel half-sample-mode algorithm is applied; otherwise the
1450/// value associated with the highest sum of weights (if `w` is not nullptr)
1451/// is returned.
1452/// \note If in a given iteration step, there are several equally small subranges, then the first occurrence is chosen.
1453template <typename T> Double_t TMath::ModeHalfSample(Long64_t n, const T *a, const Double_t *w)
1454{
1455 if (n <= 0)
1456 return TMath::QuietNaN();
1457 else if (n == 1)
1458 return a[0];
1459 else if (n == 2)
1460 return TMath::Mean(n, a, w);
1461
1462 if (w && std::adjacent_find(w, w + n, std::not_equal_to<>()) == w + n) // If all weights are equal, ignore those
1463 w = nullptr;
1464
1465 // Sort the array and remove duplicates (if w != nullptr)
1466 std::vector<T> values;
1467 std::vector<Double_t> weights;
1468 values.reserve(n);
1469 weights.reserve(n);
1470 for (Long64_t i = 0; i < n; ++i) {
1471 const T value = a[i];
1472 const Double_t weight = w ? w[i] : 1;
1473 const auto vstart = values.begin();
1474 const auto vstop = values.end();
1475 const auto viter = std::lower_bound(vstart, vstop, value);
1476 const auto vidx = std::distance(vstart, viter);
1477 if (viter != vstop && w) {
1478 weights[vidx] += weight;
1479 } else {
1480 values.insert(viter, value);
1481 weights.insert(weights.begin() + vidx, weight);
1482 }
1483 }
1484
1485 const size_t sn = values.size();
1486 if (sn <= 0)
1487 return TMath::QuietNaN();
1488 else if (sn == 1)
1489 return values[0];
1490 else if (sn == 2)
1491 return TMath::Mean(sn, values.data(), weights.data());
1492
1493 if (sn == 3) {
1494 const double d1_0 = values[1] - values[0];
1495 const double d2_1 = values[2] - values[1];
1496 if (d2_1 < d1_0)
1497 return TMath::Mean(2, values.data() + 1, weights.data() + 1);
1498 else if (d2_1 > d1_0)
1499 return TMath::Mean(2, values.data(), weights.data());
1500 else
1501 return values[1];
1502 }
1503
1504 const auto wstart = weights.begin();
1505 const auto wstop = weights.end();
1506 if (std::adjacent_find(wstart, wstop, std::not_equal_to<>()) != wstop) {
1507 // Get highest (sum of) weight element
1508 const auto wmaxiter = std::max_element(wstart, wstop);
1509 const auto wmaxidx = std::distance(wstart, wmaxiter);
1510 return values[wmaxidx];
1511 }
1512
1513 // All elements have equal weights (and are unique if w != nullptr)
1514
1515 // Initialize search
1516 n = sn;
1517 size_t jMin = 0;
1518
1519 // Do recursive calls dividing each time the interval by two
1520 while (n > 3) {
1521 Double_t min_v_range = values[jMin + n - 1] - values[jMin];
1522 const size_t N = std::ceil(n * 0.5);
1523 const size_t start = jMin;
1524 const size_t stop = start + n - N + 1; // +1 since we use < and not <=
1525 // Find sequentially what v_range is smallest by sliding the half-window
1526 for (size_t i = start; i < stop; i++) {
1527 Double_t range = values[i + N - 1] - values[i];
1528 if (range < min_v_range) {
1530 jMin = i;
1531 }
1532 }
1533 // assert(min_v_range == values[N - 1 + start] - values[start]);
1534 n = N;
1535 }
1536 if (n == 3) {
1537 const double d1_0 = values[jMin + 1] - values[jMin + 0];
1538 const double d2_1 = values[jMin + 2] - values[jMin + 1];
1539 if (d2_1 < d1_0)
1540 return (values[jMin + 1] + values[jMin + 2]) * 0.5;
1541 else if (d2_1 > d1_0)
1542 return (values[jMin] + values[jMin + 1]) * 0.5;
1543 else
1544 return values[jMin + 1];
1545 } else if (n == 2) {
1546 return (values[jMin] + values[jMin + 1]) * 0.5;
1547 } else {
1548 Error("ModeHalfSample", "Error in recursive algorithm, returning NaN"); // this should not happen
1549 return TMath::QuietNaN();
1550 }
1551}
1552
1553////////////////////////////////////////////////////////////////////////////////
1554/// Returns k_th order statistic of the array a of size n
1555/// (k_th smallest element out of n elements).
1556///
1557/// C-convention is used for array indexing, so if you want
1558/// the second smallest element, call KOrdStat(n, a, 1).
1559///
1560/// If work is supplied, it is used to store the sorting index and
1561/// assumed to be >= n. If work=0, local storage is used, either on
1562/// the stack if n < kWorkMax or on the heap for n >= kWorkMax.
1563/// Note that the work index array will not contain the sorted indices but
1564/// all indices of the smaller element in arbitrary order in work[0,...,k-1] and
1565/// all indices of the larger element in arbitrary order in work[k+1,..,n-1]
1566/// work[k] will contain instead the index of the returned element.
1567///
1568/// Taken from "Numerical Recipes in C++" without the index array
1569/// implemented by Anna Khreshuk.
1570///
1571/// See also the declarations at the top of this file
1572
1573template <class Element, typename Size>
1574Element TMath::KOrdStat(Size n, const Element *a, Size k, Size *work)
1575{
1576
1577 const Int_t kWorkMax = 100;
1578
1579 typedef Size Index;
1580
1582 Size i, ir, j, l, mid;
1583 Index arr;
1584 Index *ind;
1585 Index workLocal[kWorkMax];
1586 Index temp;
1587
1588 if (work) {
1589 ind = work;
1590 } else {
1591 ind = workLocal;
1592 if (n > kWorkMax) {
1594 ind = new Index[n];
1595 }
1596 }
1597
1598 for (Size ii=0; ii<n; ii++) {
1599 ind[ii]=ii;
1600 }
1601 Size rk = k;
1602 l=0;
1603 ir = n-1;
1604 for(;;) {
1605 if (ir<=l+1) { //active partition contains 1 or 2 elements
1606 if (ir == l+1 && a[ind[ir]]<a[ind[l]])
1607 {temp = ind[l]; ind[l]=ind[ir]; ind[ir]=temp;}
1608 Element tmp = a[ind[rk]];
1609 if (isAllocated)
1610 delete [] ind;
1611 return tmp;
1612 } else {
1613 mid = (l+ir) >> 1; //choose median of left, center and right
1614 {temp = ind[mid]; ind[mid]=ind[l+1]; ind[l+1]=temp;}//elements as partitioning element arr.
1615 if (a[ind[l]]>a[ind[ir]]) //also rearrange so that a[l]<=a[l+1]
1616 {temp = ind[l]; ind[l]=ind[ir]; ind[ir]=temp;}
1617
1618 if (a[ind[l+1]]>a[ind[ir]])
1619 {temp=ind[l+1]; ind[l+1]=ind[ir]; ind[ir]=temp;}
1620
1621 if (a[ind[l]]>a[ind[l+1]])
1622 {temp = ind[l]; ind[l]=ind[l+1]; ind[l+1]=temp;}
1623
1624 i=l+1; //initialize pointers for partitioning
1625 j=ir;
1626 arr = ind[l+1];
1627 for (;;){
1628 do i++; while (a[ind[i]]<a[arr]);
1629 do j--; while (a[ind[j]]>a[arr]);
1630 if (j<i) break; //pointers crossed, partitioning complete
1631 {temp=ind[i]; ind[i]=ind[j]; ind[j]=temp;}
1632 }
1633 ind[l+1]=ind[j];
1634 ind[j]=arr;
1635 if (j>=rk) ir = j-1; //keep active the partition that
1636 if (j<=rk) l=i; //contains the k_th element
1637 }
1638 }
1639}
1640
1641#endif
#define IsNaN(a)
#define d(i)
Definition RSha256.hxx:102
#define b(i)
Definition RSha256.hxx:100
#define f(i)
Definition RSha256.hxx:104
#define c(i)
Definition RSha256.hxx:101
#define a(i)
Definition RSha256.hxx:99
#define h(i)
Definition RSha256.hxx:106
bool Bool_t
Boolean (0=false, 1=true) (bool)
Definition RtypesCore.h:77
int Int_t
Signed integer 4 bytes (int)
Definition RtypesCore.h:59
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
Definition RtypesCore.h:69
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
Definition RtypesCore.h:68
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
Definition RtypesCore.h:60
float Float_t
Float 4 bytes (float)
Definition RtypesCore.h:71
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
long double LongDouble_t
Long Double (not portable)
Definition RtypesCore.h:75
long long Long64_t
Portable signed long integer 8 bytes.
Definition RtypesCore.h:83
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Definition TError.cxx:208
#define N
TGLVector3 Cross(const TGLVector3 &v1, const TGLVector3 &v2)
Definition TGLUtil.h:323
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t option
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 mask
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 np
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 r
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 result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
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
float xmin
float * q
float xmax
const Double_t sigma
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
const Int_t n
Definition legend1.C:16
Namespace for new Math classes and functions.
TMath.
Definition TMathBase.h:35
Double_t FDistI(Double_t F, Double_t N, Double_t M)
Calculates the cumulative distribution function of F-distribution (see ROOT::Math::fdistribution_cdf)...
Definition TMath.cxx:2300
Double_t GeomMean(Long64_t n, const T *a)
Returns the geometric mean of an array a of size n.
Definition TMath.h:1216
Double_t LogNormal(Double_t x, Double_t sigma, Double_t theta=0, Double_t m=1)
Computes the density of LogNormal distribution at point x.
Definition TMath.cxx:2440
constexpr Double_t G()
Gravitational constant in: .
Definition TMath.h:138
Double_t CosH(Double_t)
Returns the hyperbolic cosine of x.
Definition TMath.h:625
T * Normal2Plane(const T v1[3], const T v2[3], const T v3[3], T normal[3])
Calculates a normal vector of a plane.
Definition TMath.h:1305
Double_t DiLog(Double_t x)
Modified Struve functions of order 1.
Definition TMath.cxx:116
Double_t BetaDist(Double_t x, Double_t p, Double_t q)
Computes the probability density function of the Beta distribution (the cumulative distribution funct...
Definition TMath.cxx:2071
void KNNDensity(std::span< const double > observations, std::span< const double > queries, std::span< double > result, int k, double dmin=0.0)
Computes a 1D k-nearest neighbor density estimate for a set of query points.
Definition TMath.cxx:3227
Double_t ACos(Double_t)
Returns the principal value of the arc cosine of x, expressed in radians.
Definition TMath.h:645
Double_t BesselI(Int_t n, Double_t x)
Computes the Integer Order Modified Bessel function I_n(x) for n=0,1,2,... and any real x.
Definition TMath.cxx:1590
Element KOrdStat(Size n, const Element *a, Size k, Size *work=0)
Returns k_th order statistic of the array a of size n (k_th smallest element out of n elements).
Definition TMath.h:1574
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
Calculates a gaussian function with mean and sigma.
Definition TMath.cxx:471
Bool_t IsNaN(Double_t x)
Definition TMath.h:905
constexpr Double_t GUncertainty()
Gravitational constant uncertainty.
Definition TMath.h:153
constexpr Double_t C()
Velocity of light in .
Definition TMath.h:117
Double_t Factorial(Int_t i)
Computes factorial(n).
Definition TMath.cxx:252
Double_t RMS(Long64_t n, const T *a, const Double_t *w=nullptr)
Returns the Standard Deviation of an array a with length n.
Definition TMath.h:1281
Double_t KolmogorovTest(Int_t na, const Double_t *a, Int_t nb, const Double_t *b, Option_t *option)
Statistical test whether two one-dimensional sets of points are compatible with coming from the same ...
Definition TMath.cxx:805
constexpr Double_t GhbarCUncertainty()
uncertainty.
Definition TMath.h:169
Long64_t LocMin(Long64_t n, const T *a)
Returns index of array with the minimum element.
Definition TMath.h:995
constexpr Double_t Ccgs()
Definition TMath.h:124
constexpr Double_t SigmaUncertainty()
Stefan-Boltzmann constant uncertainty.
Definition TMath.h:280
Int_t Nint(T x)
Round to nearest integer. Rounds half integers to the nearest even integer.
Definition TMath.h:706
Double_t ModeHalfSample(Long64_t n, const T *a, const Double_t *w=nullptr)
Returns the half-sample mode of the array a where each entry i has weight w[i].
Definition TMath.h:1453
Double_t BinomialI(Double_t p, Int_t n, Int_t k)
Suppose an event occurs with probability p per trial Then the probability P of its occurring k or mor...
Definition TMath.cxx:2144
Double_t Vavilov(Double_t x, Double_t kappa, Double_t beta2)
Returns the value of the Vavilov probability density function.
Definition TMath.cxx:2780
Double_t Binomial(Int_t n, Int_t k)
Calculates the binomial coefficient n over k.
Definition TMath.cxx:2112
Float_t Normalize(Float_t v[3])
Normalize a vector v in place.
Definition TMath.cxx:518
constexpr Double_t NaUncertainty()
Avogadro constant (Avogadro's Number) uncertainty.
Definition TMath.h:294
Double_t Prob(Double_t chi2, Int_t ndf)
Computation of the probability for a certain Chi-squared (chi2) and number of degrees of freedom (ndf...
Definition TMath.cxx:637
Bool_t IsInside(T xp, T yp, Int_t np, T *x, T *y)
Function which returns kTRUE if point xp,yp lies inside the polygon defined by the np points in array...
Definition TMath.h:1326
Double_t ASin(Double_t)
Returns the principal value of the arc sine of x, expressed in radians.
Definition TMath.h:637
Double_t Log2(Double_t x)
Returns the binary (base-2) logarithm of x.
Definition TMath.cxx:107
Double_t BesselK1(Double_t x)
Modified Bessel function I_1(x)
Definition TMath.cxx:1529
Double_t Median(Long64_t n, const T *a, const Double_t *w=nullptr, Long64_t *work=nullptr)
Same as RMS.
Definition TMath.h:1365
void BubbleHigh(Int_t Narr, Double_t *arr1, Int_t *arr2)
Bubble sort variant to obtain the order of an array's elements into an index in order to do more usef...
Definition TMath.cxx:1314
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.
Definition TMath.h:722
Double_t BesselI1(Double_t x)
Modified Bessel function K_0(x)
Definition TMath.cxx:1494
Double_t Erf(Double_t x)
Computation of the error function erf(x).
Definition TMath.cxx:190
Bool_t Permute(Int_t n, Int_t *a)
Simple recursive algorithm to find the permutations of n natural numbers, not necessarily all distinc...
Definition TMath.cxx:2560
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754.
Definition TMath.h:915
Double_t Floor(Double_t x)
Rounds x downward, returning the largest integral value that is not greater than x.
Definition TMath.h:693
Double_t PoissonI(Double_t x, Double_t par)
Computes the Discrete Poisson distribution function for (x,par).
Definition TMath.cxx:615
Double_t CauchyDist(Double_t x, Double_t t=0, Double_t s=1)
Computes the density of Cauchy distribution at point x by default, standard Cauchy distribution is us...
Definition TMath.cxx:2178
Double_t ATan(Double_t)
Returns the principal value of the arc tangent of x, expressed in radians.
Definition TMath.h:653
Double_t StruveL1(Double_t x)
Modified Struve functions of order 0.
Definition TMath.cxx:1970
constexpr Double_t Gn()
Standard acceleration of gravity in .
Definition TMath.h:177
Double_t ASinH(Double_t)
Returns the area hyperbolic sine of x.
Definition TMath.cxx:67
Double_t LaplaceDistI(Double_t x, Double_t alpha=0, Double_t beta=1)
Computes the cumulative distribution function (lower tail integral) of Laplace distribution at point ...
Definition TMath.cxx:2383
ULong_t Hash(const void *txt, Int_t ntxt)
Calculates hash index from any char string.
Definition TMath.cxx:1408
constexpr Double_t QeUncertainty()
Elementary charge uncertainty.
Definition TMath.h:349
constexpr Double_t K()
Boltzmann's constant in : .
Definition TMath.h:250
Double_t BreitWigner(Double_t x, Double_t mean=0, Double_t gamma=1)
Calculates a Breit Wigner function with mean and gamma.
Definition TMath.cxx:442
constexpr Double_t Sqrt2()
Definition TMath.h:89
constexpr Double_t KUncertainty()
Boltzmann's constant uncertainty.
Definition TMath.h:264
constexpr Double_t Hbarcgs()
Definition TMath.h:221
Double_t Landau(Double_t x, Double_t mpv=0, Double_t sigma=1, Bool_t norm=kFALSE)
The LANDAU function.
Definition TMath.cxx:492
Double_t Voigt(Double_t x, Double_t sigma, Double_t lg, Int_t r=4)
Computation of Voigt function (normalised).
Definition TMath.cxx:898
Double_t Student(Double_t T, Double_t ndf)
Computes density function for Student's t- distribution.
Definition TMath.cxx:2625
constexpr Double_t CUncertainty()
Speed of light uncertainty.
Definition TMath.h:131
constexpr Double_t Qe()
Elementary charge in .
Definition TMath.h:342
Double_t Ceil(Double_t x)
Rounds x upward, returning the smallest integral value that is not less than x.
Definition TMath.h:681
constexpr Double_t PiOver2()
Definition TMath.h:54
constexpr Double_t HCcgs()
Definition TMath.h:243
T MinElement(Long64_t n, const T *a)
Returns minimum of array a of length n.
Definition TMath.h:973
Double_t BetaDistI(Double_t x, Double_t p, Double_t q)
Computes the cumulative distribution function of the Beta distribution, i.e.
Definition TMath.cxx:2090
T NormCross(const T v1[3], const T v2[3], T out[3])
Calculates the Normalized Cross Product of two vectors.
Definition TMath.h:964
Int_t Finite(Double_t x)
Check if it is finite with a mask in order to be consistent in presence of fast math.
Definition TMath.h:783
Double_t TanH(Double_t)
Returns the hyperbolic tangent of x.
Definition TMath.h:631
Int_t FloorNint(Double_t x)
Returns the nearest integer of TMath::Floor(x).
Definition TMath.h:699
Double_t ACosH(Double_t)
Returns the nonnegative area hyperbolic cosine of x.
Definition TMath.cxx:81
Double_t BesselK0(Double_t x)
Modified Bessel function I_0(x)
Definition TMath.cxx:1460
Double_t BesselY0(Double_t x)
Bessel function J1(x) for any real x.
Definition TMath.cxx:1705
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
Definition TMath.h:659
constexpr Double_t RUncertainty()
Universal gas constant uncertainty.
Definition TMath.h:312
Double_t BetaCf(Double_t x, Double_t a, Double_t b)
Continued fraction evaluation by modified Lentz's method used in calculation of incomplete Beta funct...
Definition TMath.cxx:2020
Long64_t LocMax(Long64_t n, const T *a)
Returns index of array with the maximum element.
Definition TMath.h:1105
Double_t ErfInverse(Double_t x)
Returns the inverse error function.
Definition TMath.cxx:208
Double_t LaplaceDist(Double_t x, Double_t alpha=0, Double_t beta=1)
Computes the probability density function of Laplace distribution at point x, with location parameter...
Definition TMath.cxx:2367
constexpr Double_t E()
Base of natural log: .
Definition TMath.h:96
constexpr Double_t GnUncertainty()
Standard acceleration of gravity uncertainty.
Definition TMath.h:184
constexpr Double_t Hcgs()
Definition TMath.h:198
constexpr Double_t HUncertainty()
Planck's constant uncertainty.
Definition TMath.h:205
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Definition TMath.h:769
constexpr Double_t DegToRad()
Conversion from degree to radian: .
Definition TMath.h:82
Double_t Erfc(Double_t x)
Computes the complementary error function erfc(x).
Definition TMath.cxx:199
Double_t VavilovI(Double_t x, Double_t kappa, Double_t beta2)
Returns the value of the Vavilov cumulative distribution function (lower tail integral of the probabi...
Definition TMath.cxx:2817
constexpr Double_t Sigma()
Stefan-Boltzmann constant in : .
Definition TMath.h:273
Double_t Beta(Double_t p, Double_t q)
Calculates Beta-function Gamma(p)*Gamma(q)/Gamma(p+q).
Definition TMath.cxx:2011
T * Laplacian(Long64_t n, T const *f, double h=1)
Calculate second-order finite differences of an array with length n at second-order accuracy.
Definition TMath.h:1073
constexpr Double_t Kcgs()
Definition TMath.h:257
Double_t Sq(Double_t x)
Returns x*x.
Definition TMath.h:669
Double_t Poisson(Double_t x, Double_t par)
Computes the Poisson distribution function for (x,par).
Definition TMath.cxx:587
constexpr Double_t H()
Planck's constant in : .
Definition TMath.h:191
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:675
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Definition TMath.h:734
Int_t CeilNint(Double_t x)
Returns the nearest integer of TMath::Ceil(x).
Definition TMath.h:687
Double_t Ldexp(Double_t x, Int_t exp)
Returns the result of multiplying x (the significant) by 2 raised to the power of exp (the exponent).
Definition TMath.h:728
Double_t BesselJ0(Double_t x)
Modified Bessel function K_1(x)
Definition TMath.cxx:1634
constexpr Double_t LogE()
Base-10 log of e (to convert ln to log)
Definition TMath.h:110
Double_t Gamma(Double_t z)
Computation of gamma(z) for all z.
Definition TMath.cxx:353
constexpr Double_t MWair()
Molecular weight of dry air 1976 US Standard Atmosphere in or
Definition TMath.h:320
constexpr Double_t Gcgs()
Definition TMath.h:146
Double_t StruveL0(Double_t x)
Struve functions of order 1.
Definition TMath.cxx:1923
Double_t NormQuantile(Double_t p)
Computes quantiles for standard normal distribution N(0, 1) at probability p.
Definition TMath.cxx:2459
constexpr Double_t Ln10()
Natural log of 10 (to convert log to ln)
Definition TMath.h:103
Double_t Hypot(Double_t x, Double_t y)
Returns sqrt(x*x + y*y)
Definition TMath.cxx:59
constexpr Double_t EulerGamma()
Euler-Mascheroni Constant.
Definition TMath.h:335
constexpr Double_t PiOver4()
Definition TMath.h:61
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Definition TMath.h:607
void Quantiles(Int_t n, Int_t nprob, Double_t *x, Double_t *quantiles, Double_t *prob, Bool_t isSorted=kTRUE, Int_t *index=nullptr, Int_t type=7)
Computes sample quantiles, corresponding to the given probabilities.
Definition TMath.cxx:1207
constexpr Double_t Pi()
Definition TMath.h:40
Double_t StruveH0(Double_t x)
Bessel function Y1(x) for positive x.
Definition TMath.cxx:1777
constexpr Double_t R()
Universal gas constant ( ) in
Definition TMath.h:305
Double_t LnGamma(Double_t z)
Computation of ln[gamma(z)] for all z.
Definition TMath.cxx:509
Bool_t AreEqualRel(Double_t af, Double_t bf, Double_t relPrec)
Comparing floating points.
Definition TMath.h:429
Bool_t AreEqualAbs(Double_t af, Double_t bf, Double_t epsilon)
Comparing floating points.
Definition TMath.h:421
Double_t Mean(Long64_t n, const T *a, const Double_t *w=nullptr)
Returns the weighted mean of an array a with length n.
Definition TMath.h:1182
Double_t KolmogorovProb(Double_t z)
Calculates the Kolmogorov distribution function,.
Definition TMath.cxx:679
constexpr Double_t InvPi()
Definition TMath.h:68
Bool_t RootsCubic(const Double_t coef[4], Double_t &a, Double_t &b, Double_t &c)
Calculates roots of polynomial of 3rd order a*x^3 + b*x^2 + c*x + d, where.
Definition TMath.cxx:1107
Double_t ChisquareQuantile(Double_t p, Double_t ndf)
Evaluate the quantiles of the chi-squared probability distribution function.
Definition TMath.cxx:2196
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Definition TMath.h:601
Double_t FDist(Double_t F, Double_t N, Double_t M)
Computes the density function of F-distribution (probability function, integral of density,...
Definition TMath.cxx:2280
Double_t SignalingNaN()
Returns a signaling NaN as defined by IEEE 754.
Definition TMath.h:923
Double_t BreitWignerRelativistic(Double_t x, Double_t median=0, Double_t gamma=1)
Calculates a Relativistic Breit Wigner function with median and gamma.
Definition TMath.cxx:452
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.
Definition TMathBase.h:413
T * Cross(const T v1[3], const T v2[3], T out[3])
Calculates the Cross Product of two vectors: out = [v1 x v2].
Definition TMath.h:1290
void BubbleLow(Int_t Narr, Double_t *arr1, Int_t *arr2)
Opposite ordering of the array arr2[] to that of BubbleHigh.
Definition TMath.cxx:1353
Double_t BesselK(Int_t n, Double_t x)
Integer order modified Bessel function I_n(x)
Definition TMath.cxx:1561
constexpr Double_t Na()
Avogadro constant (Avogadro's Number) in .
Definition TMath.h:287
T MaxElement(Long64_t n, const T *a)
Returns maximum of array a of length n.
Definition TMath.h:981
Double_t BesselJ1(Double_t x)
Bessel function J0(x) for any real x.
Definition TMath.cxx:1669
Double_t BetaIncomplete(Double_t x, Double_t a, Double_t b)
Calculates the incomplete Beta-function.
Definition TMath.cxx:2103
constexpr Double_t Rgair()
Dry Air Gas Constant (R / MWair) in
Definition TMath.h:328
constexpr Double_t Hbar()
in :
Definition TMath.h:214
Double_t StruveH1(Double_t x)
Struve functions of order 0.
Definition TMath.cxx:1846
Double_t Freq(Double_t x)
Computation of the normal frequency function freq(x).
Definition TMath.cxx:270
Double_t Tan(Double_t)
Returns the tangent of an angle of x radians.
Definition TMath.h:613
Double_t LandauI(Double_t x)
Returns the cumulative (lower tail integral) of the Landau distribution function at point x.
Definition TMath.cxx:2847
Double_t StdDev(Long64_t n, const T *a, const Double_t *w=nullptr)
Definition TMath.h:536
Double_t ATanH(Double_t)
Returns the area hyperbolic tangent of x.
Definition TMath.cxx:95
constexpr Double_t RadToDeg()
Conversion from radian to degree: .
Definition TMath.h:75
Double_t BesselI0(Double_t x)
Integer order modified Bessel function K_n(x)
Definition TMath.cxx:1426
T * Gradient(Long64_t n, T const *f, double h=1)
Calculate the one-dimensional finite gradient of an array with length n.
Definition TMath.h:1033
Double_t Log10(Double_t x)
Returns the common (base-10) logarithm of x.
Definition TMath.h:775
Double_t StudentI(Double_t T, Double_t ndf)
Calculates the cumulative distribution function of Student's t-distribution second parameter stands f...
Definition TMath.cxx:2648
Double_t StudentQuantile(Double_t p, Double_t ndf, Bool_t lower_tail=kTRUE)
Computes quantiles of the Student's t-distribution 1st argument is the probability,...
Definition TMath.cxx:2676
Double_t BesselY1(Double_t x)
Bessel function Y0(x) for positive x.
Definition TMath.cxx:1739
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:122
Double_t GammaDist(Double_t x, Double_t gamma, Double_t mu=0, Double_t beta=1)
Computes the density function of Gamma distribution at point x.
Definition TMath.cxx:2350
constexpr Double_t GhbarC()
in
Definition TMath.h:161
constexpr Double_t HC()
in
Definition TMath.h:236
constexpr Double_t TwoPi()
Definition TMath.h:47
constexpr Double_t HbarUncertainty()
uncertainty.
Definition TMath.h:228
Double_t Infinity()
Returns an infinity as defined by the IEEE standard.
Definition TMath.h:930
Double_t ErfcInverse(Double_t x)
Returns the inverse of the complementary error function.
Definition TMath.cxx:242
Double_t SinH(Double_t)
Returns the hyperbolic sine of x.
Definition TMath.h:619
static T Min()
Returns maximum representation for type T.
Definition TMath.h:938
static T Epsilon()
Returns minimum double representation.
Definition TMath.h:954
static T Max()
Returns minimum double representation.
Definition TMath.h:946
TMarker m
Definition textangle.C:8
TLine l
Definition textangle.C:4
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2338