Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TFumiliMinimizer.cxx
Go to the documentation of this file.
1// @(#)root/fumili:$Id$
2// Author: L. Moneta Wed Oct 25 16:28:55 2006
3
4/**********************************************************************
5 * *
6 * Copyright (c) 2006 LCG ROOT Math Team, CERN/PH-SFT *
7 * *
8 * *
9 **********************************************************************/
10
11// Implementation file for class TFumiliMinimizer
12
13#include "TFumiliMinimizer.h"
14#include "Math/IFunction.h"
15#include "Math/Util.h"
16#include "TError.h"
17
18#include "TFumili.h"
19
20#include <iostream>
21#include <cassert>
22#include <algorithm>
23#include <functional>
24
25
26// setting USE_FUMILI_FUNCTION will use the Derivatives provided by Fumili
27// instead of what proided in FitUtil::EvalChi2Residual
28// t.d.: use still standard Chi2 but replace model function
29// with a gradient function where gradient is computed by TFumili
30// since TFumili knows the step size can calculate it better
31// Derivative in Fumili are very fast (1 extra call for each parameter)
32// + 1 function evaluation
33//
34//#define USE_FUMILI_FUNCTION
35#ifdef USE_FUMILI_FUNCTION
36bool gUseFumiliFunction = true;
37//#include "FumiliFunction.h"
38// fit method function used in TFumiliMinimizer
39
42#include "Fit/Chi2FCN.h"
43#include "TF1.h"
44#include "TFumili.h"
45
46template<class MethodFunc>
47class FumiliFunction : public ROOT::Math::FitMethodFunction {
48
50
51public:
52 FumiliFunction(TFumili * fumili, const ROOT::Math::FitMethodFunction * func) :
53 ROOT::Math::FitMethodFunction(func->NDim(), func->NPoints() ),
54 fFumili(fumili),
55 fObjFunc(0)
56 {
57 fObjFunc = dynamic_cast<const MethodFunc *>(func);
58 assert(fObjFunc != 0);
59
60 // create TF1 class from model function
61 fModFunc = new TF1("modfunc",ROOT::Math::ParamFunctor( &fObjFunc->ModelFunction() ) );
62 fFumili->SetUserFunc(fModFunc);
63 }
64
65 ROOT::Math::FitMethodFunction::Type_t Type() const { return fObjFunc->Type(); }
66
67 FumiliFunction * Clone() const { return new FumiliFunction(fFumili, fObjFunc); }
68
69
70 // recalculate data element using Fumili stuff
71 double DataElement(const double * /*par */, unsigned int i, double * g, double *) const {
72
73 // parameter values are inside TFumili
74
75 // suppose type is bin likelihood
76 unsigned int npar = fObjFunc->NDim();
77 double y = 0;
78 double invError = 0;
79 const double *x = fObjFunc->Data().GetPoint(i,y,invError);
80 double fval = fFumili->EvalTFN(g,const_cast<double *>( x));
81 fFumili->Derivatives(g, const_cast<double *>( x));
82
84 double logPdf = y * ROOT::Math::Util::EvalLog( fval) - fval;
85 for (unsigned int k = 0; k < npar; ++k) {
86 g[k] *= ( y/fval - 1.) ;
87 }
88
89 return logPdf;
90 }
91 else if (fObjFunc->Type() == ROOT::Math::FitMethodFunction::kLeastSquare ) {
92 double resVal = (y-fval)*invError;
93 for (unsigned int k = 0; k < npar; ++k) {
94 g[k] *= -invError;
95 }
96 return resVal;
97 }
98
99 return 0;
100 }
101
102
103private:
104
105 double DoEval(const double *x ) const {
106 return (*fObjFunc)(x);
107 }
108
109 TFumili * fFumili;
110 const MethodFunc * fObjFunc;
111 TF1 * fModFunc;
112
113};
114#else
116#endif
117//______________________________________________________________________________
118//
119// TFumiliMinimizer class implementing the ROOT::Math::Minimizer interface using
120// TFumili.
121// This class is normally instantiates using the plug-in manager
122// (plug-in with name Fumili or TFumili)
123// In addition the user can choose the minimizer algorithm: Migrad (the default one), Simplex, or Minimize (combined Migrad + Simplex)
124//
125//__________________________________________________________________________________________
126
127// initialize the static instances
128
132
133
135
136
138 fDim(0),
139 fNFree(0),
140 fMinVal(0),
141 fEdm(-1),
142 fFumili(nullptr)
143{
144 // Constructor for TFumiliMinimier class
145
146 // construct with npar = 0 (by default a value of 25 is used in TFumili for allocating the arrays)
147#ifdef USE_STATIC_TMINUIT
148 // allocate here only the first time
149 if (fgFumili == 0) fgFumili = new TFumili(0);
151#else
152 if (fFumili) delete fFumili;
153 fFumili = new TFumili(0);
155#endif
156
157}
158
159
161{
162 // Destructor implementation.
163 if (fFumili) delete fFumili;
164}
165
166
167
169 // Set the objective function to be minimized, by passing a function object implement the
170 // basic multi-dim Function interface. In this case the derivatives will be
171 // calculated by Fumili
172
173 // Here a TFumili instance is created since only at this point we know the number of parameters
174 // needed to create TFumili
175 fDim = func.NDim();
177
178 if(func.HasGradient()) {
179 // In this case the function derivatives are provided
180 // by the user via this interface and there not calculated by Fumili.
181
182 fDim = func.NDim();
184
185 // for Fumili the fit method function interface is required
186 const ROOT::Math::FitMethodGradFunction * fcnfunc = dynamic_cast<const ROOT::Math::FitMethodGradFunction *>(&func);
187 if (!fcnfunc) {
188 Error("SetFunction","Wrong Fit method function type used for Fumili");
189 return;
190 }
191 // assign to the static pointer (NO Thread safety here)
192 fgFunc = nullptr;
193 fgGradFunc = const_cast<ROOT::Math::FitMethodGradFunction *>(fcnfunc);
195
196 return;
197 }
198
199 // for Fumili the fit method function interface is required
200 const ROOT::Math::FitMethodFunction * fcnfunc = dynamic_cast<const ROOT::Math::FitMethodFunction *>(&func);
201 if (!fcnfunc) {
202 Error("SetFunction","Wrong Fit method function type used for Fumili");
203 return;
204 }
205 // assign to the static pointer (NO Thread safety here)
206 fgFunc = const_cast<ROOT::Math::FitMethodFunction *>(fcnfunc);
207 fgGradFunc = nullptr;
209
210#ifdef USE_FUMILI_FUNCTION
211 if (gUseFumiliFunction) {
216 }
217#endif
218
219}
220
221void TFumiliMinimizer::Fcn( int & , double * g , double & f, double * x , int /* iflag */) {
222 // implementation of FCN static function used internally by TFumili.
223 // Adapt IMultiGenFunction interface to TFumili FCN static function
224 f = TFumiliMinimizer::EvaluateFCN(const_cast<double*>(x),g);
225}
226
227// void TFumiliMinimizer::FcnGrad( int &, double * g, double & f, double * x , int iflag ) {
228// // implementation of FCN static function used internally by TFumili.
229// // Adapt IMultiGradFunction interface to TFumili FCN static function in the case of user
230// // provided gradient.
231// ROOT::Math::IMultiGradFunction * gFunc = dynamic_cast<ROOT::Math::IMultiGradFunction *> ( fgFunc);
232
233// assert(gFunc != 0);
234// f = gFunc->operator()(x);
235
236// // calculates also derivatives
237// if (iflag == 2) gFunc->Gradient(x,g);
238// }
239
240double TFumiliMinimizer::EvaluateFCN(const double * x, double * grad) {
241 // function called to evaluate the FCN at the value x
242 // calculates also the matrices of the second derivatives of the objective function needed by FUMILI
243
244
245 //typedef FumiliFCNAdapter::Function Function;
246
247
248
249 // reset
250// assert(grad.size() == npar);
251// grad.assign( npar, 0.0);
252// hess.assign( hess.size(), 0.0);
253
254 double sum = 0;
255 unsigned int ndata = 0;
256 unsigned int npar = 0;
257 if (fgFunc) {
258 ndata = fgFunc->NPoints();
259 npar = fgFunc->NDim();
261 }
262 else if (fgGradFunc) {
263 ndata = fgGradFunc->NPoints();
264 npar = fgGradFunc->NDim();
266 }
267
268 // eventually store this matrix as static member to optimize speed
269 std::vector<double> gf(npar);
270 std::vector<double> hess(npar*(npar+1)/2);
271 std::vector<double> h(npar*(npar+1)/2);
272
273 // reset gradients
274 for (unsigned int ipar = 0; ipar < npar; ++ipar)
275 grad[ipar] = 0;
276
277
278 //loop on the data points
279//#define DEBUG
280#ifdef DEBUG
281 std::cout << "=============================================";
282 std::cout << "par = ";
283 for (unsigned int ipar = 0; ipar < npar; ++ipar)
284 std::cout << x[ipar] << "\t";
285 std::cout << std::endl;
286 if (fgFunc) std::cout << "type " << fgFunc->Type() << std::endl;
287#endif
288
289
290 // assume for now least-square
291 // since TFumili does not use errordef we must divide chi2 by 2
294
295 double fval = 0;
296 for (unsigned int i = 0; i < ndata; ++i) {
297 // calculate data element and gradient
298 // DataElement returns (f-y)/s and gf is derivatives of model function multiplied by (-1/sigma)
299 if (gUseFumiliFunction) {
300 fval = fgFunc->DataElement( x, i, &gf[0]);
301 }
302 else {
303 if (fgFunc != nullptr)
304 fval = fgFunc->DataElement(x, i, gf.data(), h.data() );
305 else
306 fval = fgGradFunc->DataElement(x, i, gf.data(), h.data());
307 }
308
309 // t.b.d should protect for bad values of fval
310 sum += 0.5 * fval * fval; // neeedd to divide chi2 by 2
311
312 for (unsigned int j = 0; j < npar; ++j) {
313 grad[j] += fval * gf[j];
314 for (unsigned int k = j; k < npar; ++ k) {
315 int idx = j + k*(k+1)/2;
316 //hess[idx] += gf[j] * gf[k];
317 hess[idx] += 0.5 * h[idx]; // h is gradient of full residual (2 * gf[j] n* gf[k] )
318 }
319 }
320 }
321 }
324
325
326 double fval = 0;
327
328 //std::cout << "\t x " << x[0] << " " << x[1] << " " << x[2] << std::endl;
329
330 for (unsigned int i = 0; i < ndata; ++i) {
331
332 if (gUseFumiliFunction) {
333 fval = fgFunc->DataElement( x, i, &gf[0]);
334 }
335 else {
336 // calculate data element and gradient
337 if (fgFunc != nullptr)
338 fval = fgFunc->DataElement(x, i, &gf[0], h.data());
339 else
340 fval = fgGradFunc->DataElement(x, i, &gf[0], h.data());
341 }
342
343 sum += fval;
344
345 for (unsigned int j = 0; j < npar; ++j) {
346 grad[j] += gf[j];
347 for (unsigned int k = j; k < npar; ++ k) {
348 int idx = j + k*(k+1)/2;
349 hess[idx] += h[idx];
350 }
351 }
352 }
355
356 double fval = 0;
357
358 for (unsigned int i = 0; i < ndata; ++i) {
359
360 if (gUseFumiliFunction) {
361 fval = fgFunc->DataElement(x, i, &gf[0]);
362 } else {
363 // calculate data element and gradient
364 if (fgFunc != nullptr)
365 fval = fgFunc->DataElement(x, i, &gf[0]);
366 else
367 fval = fgGradFunc->DataElement(x, i, &gf[0]);
368 }
369 sum -= fval;
370
371 for (unsigned int j = 0; j < npar; ++j) {
372 double gfj = gf[j]; // / fval;
373 grad[j] -= gfj;
374 for (unsigned int k = j; k < npar; ++k) {
375 int idx = j + k * (k + 1) / 2;
376 hess[idx] += gfj * gf[k]; // / (fval );
377 }
378 }
379 }
380 } else {
381 Error("EvaluateFCN", " type of fit method is not supported, it must be chi2 or log-likelihood");
382 }
383
384 // now TFumili excludes fixed parameter in second-derivative matrix
385 // ned to get them using the static instance of TFumili
386 double * zmatrix = fgFumili->GetZ();
387 double * pl0 = fgFumili->GetPL0(); // parameter limits
388 assert(zmatrix != nullptr);
389 assert(pl0 != nullptr);
390 unsigned int k = 0;
391 unsigned int l = 0;
392 for (unsigned int i = 0; i < npar; ++i) {
393 for (unsigned int j = 0; j <= i; ++j) {
394 if (pl0[i] > 0 && pl0[j] > 0) { // only for non-fixed parameters
395 zmatrix[l++] = hess[k];
396 }
397 k++;
398 }
399 }
400
401#ifdef DEBUG
402 std::cout << "FCN value " << sum << " grad ";
403 for (unsigned int ipar = 0; ipar < npar; ++ipar)
404 std::cout << grad[ipar] << "\t";
405 std::cout << std::endl << std::endl;
406#endif
407
408
409 return sum;
410
411}
412
413
414
415bool TFumiliMinimizer::SetVariable(unsigned int ivar, const std::string & name, double val, double step) {
416 // set a free variable.
417 if (fFumili == nullptr) {
418 Error("SetVariableValue","invalid TFumili pointer. Set function first ");
419 return false;
420 }
421#ifdef DEBUG
422 std::cout << "set variable " << ivar << " " << name << " value " << val << " step " << step << std::endl;
423#endif
424
425 int ierr = fFumili->SetParameter(ivar , name.c_str(), val, step, 0., 0. );
426 if (ierr) {
427 Error("SetVariable","Error for parameter %d ",ivar);
428 return false;
429 }
430 return true;
431}
432
433bool TFumiliMinimizer::SetLimitedVariable(unsigned int ivar, const std::string & name, double val, double step, double lower, double upper) {
434 // set a limited variable.
435 if (fFumili == nullptr) {
436 Error("SetVariableValue","invalid TFumili pointer. Set function first ");
437 return false;
438 }
439#ifdef DEBUG
440 std::cout << "set limited variable " << ivar << " " << name << " value " << val << " step " << step << std::endl;
441#endif
442 int ierr = fFumili->SetParameter(ivar, name.c_str(), val, step, lower, upper );
443 if (ierr) {
444 Error("SetLimitedVariable","Error for parameter %d ",ivar);
445 return false;
446 }
447 return true;
448}
449#ifdef LATER
450bool Fumili2Minimizer::SetLowerLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double lower ) {
451 // add a lower bounded variable as a double bound one, using a very large number for the upper limit
452 double s = val-lower;
453 double upper = s*1.0E15;
454 if (s != 0) upper = 1.0E15;
455 return SetLimitedVariable(ivar, name, val, step, lower,upper);
456}
457#endif
458
459
460bool TFumiliMinimizer::SetFixedVariable(unsigned int ivar, const std::string & name, double val) {
461 // set a fixed variable.
462 if (fFumili == nullptr) {
463 Error("SetVariableValue","invalid TFumili pointer. Set function first ");
464 return false;
465 }
466
467
468 int ierr = fFumili->SetParameter(ivar, name.c_str(), val, 0., val, val );
469 fFumili->FixParameter(ivar);
470
471#ifdef DEBUG
472 std::cout << "Fix variable " << ivar << " " << name << " value " << std::endl;
473#endif
474
475 if (ierr) {
476 Error("SetFixedVariable","Error for parameter %d ",ivar);
477 return false;
478 }
479 return true;
480}
481
482bool TFumiliMinimizer::SetVariableValue(unsigned int ivar, double val) {
483 // set the variable value
484 if (fFumili == nullptr) {
485 Error("SetVariableValue","invalid TFumili pointer. Set function first ");
486 return false;
487 }
489 double oldval, verr, vlow, vhigh = 0;
490 int ierr = fFumili->GetParameter( ivar, &name[0], oldval, verr, vlow, vhigh);
491 if (ierr) {
492 Error("SetVariableValue","Error for parameter %d ",ivar);
493 return false;
494 }
495#ifdef DEBUG
496 std::cout << "set variable " << ivar << " " << name << " value "
497 << val << " step " << verr << std::endl;
498#endif
499
500 ierr = fFumili->SetParameter(ivar , name , val, verr, vlow, vhigh );
501 if (ierr) {
502 Error("SetVariableValue","Error for parameter %d ",ivar);
503 return false;
504 }
505 return true;
506}
507
509 // perform the minimization using the algorithm chosen previously by the user
510 // By default Migrad is used.
511 // Return true if the found minimum is valid and update internal cached values of
512 // minimum values, errors and covariance matrix.
513
514 if (fFumili == nullptr) {
515 Error("SetVariableValue","invalid TFumili pointer. Set function first ");
516 return false;
517 }
518
519 // need to set static instance to be used when calling FCN
521
522
523 double arglist[10];
524
525 // error cannot be set in TFumili (always the same)
526// arglist[0] = ErrorUp();
527// fFumili->ExecuteCommand("SET Err",arglist,1);
528
529 int printlevel = PrintLevel();
530 // not implemented in TFumili yet
531 //arglist[0] = printlevel - 1;
532 //fFumili->ExecuteCommand("SET PRINT",arglist,1,ierr);
533
534 // suppress warning in case Printlevel() == 0
535 if (printlevel == 0) fFumili->ExecuteCommand("SET NOW",arglist,0);
536 else fFumili->ExecuteCommand("SET WAR",arglist,0);
537
538
539 // minimize: use ExecuteCommand instead of Minimize to set tolerance and maxiter
540
541 arglist[0] = MaxFunctionCalls();
542 arglist[1] = Tolerance();
543
544 if (printlevel > 0)
545 std::cout << "Minimize using TFumili with tolerance = " << Tolerance()
546 << " max calls " << MaxFunctionCalls() << std::endl;
547
548 int iret = fFumili->ExecuteCommand("MIGRAD",arglist,2);
549 fStatus = iret;
550 //int iret = fgFumili->Minimize();
551
552 // Hesse and IMP not implemented
553// // run improved if needed
554// if (ierr == 0 && fType == ROOT::Fumili::kMigradImproved)
555// fFumili->mnexcm("IMPROVE",arglist,1,ierr);
556
557// // check if Hesse needs to be run
558// if (ierr == 0 && IsValidError() ) {
559// fFumili->mnexcm("HESSE",arglist,1,ierr);
560// }
561
562
563 int ntot;
564 int nfree;
565 double errdef = 0; // err def is not used by Fumili
566 fFumili->GetStats(fMinVal,fEdm,errdef,nfree,ntot);
567
568 if (printlevel > 0)
569 fFumili->PrintResults(printlevel,fMinVal);
570
571
572 assert (static_cast<unsigned int>(ntot) == fDim);
573 assert( nfree == fFumili->GetNumberFreeParameters() );
574 fNFree = nfree;
575
576
577 // get parameter values and correlation matrix
578 // fumili stores only lower part of diagonal matrix of the free parameters
579 fParams.resize( fDim);
580 fErrors.resize( fDim);
581 fCovar.resize(fDim*fDim);
582 const double * cv = fFumili->GetCovarianceMatrix();
583 unsigned int l = 0;
584 for (unsigned int i = 0; i < fDim; ++i) {
585 fParams[i] = fFumili->GetParameter( i );
586 fErrors[i] = fFumili->GetParError( i );
587
588 if ( !fFumili->IsFixed(i) ) {
589 for (unsigned int j = 0; j <=i ; ++j) {
590 if ( !fFumili->IsFixed(j) ) {
591 fCovar[i*fDim + j] = cv[l];
592 fCovar[j*fDim + i] = fCovar[i*fDim + j];
593 l++;
594 }
595 }
596 }
597 }
598
599 return (iret==0) ? true : false;
600}
601
602
603// } // end namespace Fit
604
605// } // end namespace ROOT
#define f(i)
Definition RSha256.hxx:104
#define g(i)
Definition RSha256.hxx:105
#define h(i)
Definition RSha256.hxx:106
#define ClassImp(name)
Definition Rtypes.h:382
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Definition TError.cxx:185
bool gUseFumiliFunction
char name[80]
Definition TGX11.cxx:110
Chi2FCN class for binned fits using the least square methods.
Definition Chi2FCN.h:46
class evaluating the log likelihood for binned Poisson likelihood fits it is template to distinguish ...
FitMethodFunction class Interface for objective functions (like chi2 and likelihood used in the fit) ...
virtual Type_t Type() const
return the type of method, override if needed
Type_t
enumeration specifying the possible fit method types
virtual double DataElement(const double *x, unsigned int i, double *g=nullptr, double *h=nullptr, bool fullHessian=false) const =0
method returning the data i-th contribution to the fit objective function For example the residual fo...
virtual unsigned int NPoints() const
return the number of data points used in evaluating the function
unsigned int NDim() const override
Number of dimension (parameters) .
virtual void UpdateNCalls() const
update number of calls
Documentation for the abstract class IBaseFunctionMultiDim.
Definition IFunction.h:61
virtual unsigned int NDim() const =0
Retrieve the dimension of the function.
double Tolerance() const
absolute tolerance
Definition Minimizer.h:300
unsigned int MaxFunctionCalls() const
max number of function calls
Definition Minimizer.h:294
int fStatus
status of minimizer
Definition Minimizer.h:371
int PrintLevel() const
minimizer configuration parameters
Definition Minimizer.h:291
Param Functor class for Multidimensional functions.
1-Dim function class
Definition TF1.h:233
TFumiliMinimizer class: minimizer implementation based on TFumili.
static ROOT::Math::FitMethodFunction * fgFunc
bool SetFixedVariable(unsigned int, const std::string &, double) override
set fixed variable (override if minimizer supports them )
TFumiliMinimizer(int dummy=0)
Default constructor (an argument is needed by plug-in manager)
std::vector< double > fParams
bool SetLimitedVariable(unsigned int ivar, const std::string &name, double val, double step, double, double) override
set upper/lower limited variable (override if minimizer supports them )
static double EvaluateFCN(const double *x, double *g)
implementation of FCN for Fumili when user provided gradient is used
~TFumiliMinimizer() override
Destructor (no operations)
bool Minimize() override
method to perform the minimization
static ROOT::Math::FitMethodGradFunction * fgGradFunc
static TFumili * fgFumili
bool SetVariableValue(unsigned int ivar, double val) override
set the value of an existing variable
std::vector< double > fErrors
std::vector< double > fCovar
void SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the function to minimize
bool SetVariable(unsigned int ivar, const std::string &name, double val, double step) override
set free variable
static void Fcn(int &, double *, double &f, double *, int)
implementation of FCN for Fumili
Double_t GetParameter(Int_t ipar) const override
Return current value of parameter ipar.
Definition TFumili.cxx:835
Double_t GetParError(Int_t ipar) const override
Return error of parameter ipar.
Definition TFumili.cxx:826
Bool_t IsFixed(Int_t ipar) const override
Return kTRUE if parameter ipar is fixed, kFALSE otherwise)
Definition TFumili.cxx:1060
Int_t ExecuteCommand(const char *command, Double_t *args, Int_t nargs) override
Execute MINUIT commands.
Definition TFumili.cxx:391
void PrintResults(Int_t k, Double_t p) const override
Prints fit results.
Definition TFumili.cxx:1483
Int_t GetNumberFreeParameters() const override
Return the number of free parameters.
Definition TFumili.cxx:814
Double_t * GetCovarianceMatrix() const override
Return a pointer to the covariance matrix.
Definition TFumili.cxx:784
Int_t GetStats(Double_t &amin, Double_t &edm, Double_t &errdef, Int_t &nvpar, Int_t &nparx) const override
Return global fit parameters.
Definition TFumili.cxx:904
const char * GetParName(Int_t ipar) const override
Return name of parameter ipar.
Definition TFumili.cxx:872
void FixParameter(Int_t ipar) override
Fixes parameter number ipar.
Definition TFumili.cxx:774
Double_t * GetPL0() const
Definition TFumili.h:95
void SetParNumber(Int_t ParNum)
Definition TFumili.cxx:168
Double_t * GetZ() const
Definition TFumili.h:102
Int_t SetParameter(Int_t ipar, const char *parname, Double_t value, Double_t verr, Double_t vlow, Double_t vhigh) override
Sets for parameter number ipar initial parameter value, name parname, initial error verr and limits v...
Definition TFumili.cxx:1641
Basic string class.
Definition TString.h:139
virtual void SetFCN(void(*fcn)(Int_t &, Double_t *, Double_t &f, Double_t *, Int_t))
To set the address of the minimization objective function called by the native compiler (see function...
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Namespace for new Math classes and functions.
T EvalLog(T x)
safe evaluation of log(x) with a protections against negative or zero argument to the log smooth line...
Definition Util.h:64
BasicFitMethodFunction< ROOT::Math::IMultiGenFunction > FitMethodFunction
Definition Fitter.h:43
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
TLine l
Definition textangle.C:4
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2345