29 struct FitterGlobals {
30 FitterGlobals() : fFitter(nullptr),fMaxPar(0) {}
32 TVirtualFitter *fFitter;
36 static FitterGlobals &GetGlobals() {
37 TTHREAD_TLS_DECL(FitterGlobals,globals);
40 static TVirtualFitter *&GetGlobalFitter() {
41 return GetGlobals().fFitter;
43 static Int_t &GetGlobalMaxPar() {
44 return GetGlobals().fMaxPar;
46 static TString &GetGlobalDefault() {
47 return GetGlobals().fDefault;
56 ClassImp(TVirtualFitter);
58 #ifdef R__COMPLETE_MEM_TERMINATION
60 struct TVirtualFitterCleanup {
61 ~TVirtualFitterCleanup() {
62 delete TVirtualFitter::GetFitter();
65 TVirtualFitterCleanup cleanup;
72 TVirtualFitter::TVirtualFitter() :
93 TVirtualFitter::TVirtualFitter(
const TVirtualFitter& tvf) :
100 fZfirst(tvf.fZfirst),
102 fNpoints(tvf.fNpoints),
103 fPointSize(tvf.fPointSize),
104 fCacheSize(tvf.fCacheSize),
106 fObjectFit(tvf.fObjectFit),
107 fUserFunc(tvf.fUserFunc),
108 fMethodCall(tvf.fMethodCall),
116 TVirtualFitter& TVirtualFitter::operator=(
const TVirtualFitter& tvf)
119 TNamed::operator=(tvf);
127 fNpoints=tvf.fNpoints;
128 fPointSize=tvf.fPointSize;
129 fCacheSize=tvf.fCacheSize;
131 fObjectFit=tvf.fObjectFit;
132 fUserFunc=tvf.fUserFunc;
133 fMethodCall=tvf.fMethodCall;
142 TVirtualFitter::~TVirtualFitter()
146 if ( GetGlobalFitter() ==
this ) {
147 GetGlobalFitter() = 0;
148 GetGlobalMaxPar() = 0;
159 TVirtualFitter *TVirtualFitter::Fitter(TObject *obj, Int_t maxpar)
161 if (GetGlobalFitter() && maxpar > GetGlobalMaxPar()) {
162 delete GetGlobalFitter();
163 GetGlobalFitter() = 0;
166 if (!GetGlobalFitter()) {
168 if (GetGlobalDefault().Length() == 0) GetGlobalDefault() = gEnv->GetValue(
"Root.Fitter",
"Minuit");
169 if ((h = gROOT->GetPluginManager()->FindHandler(
"TVirtualFitter",GetGlobalDefault()))) {
170 if (h->LoadPlugin() == -1)
172 GetGlobalFitter() = (TVirtualFitter*) h->ExecPlugin(1, maxpar);
173 GetGlobalMaxPar() = maxpar;
177 if (GetGlobalFitter()) GetGlobalFitter()->SetObjectFit(obj);
178 return GetGlobalFitter();
185 void TVirtualFitter::GetConfidenceIntervals(Int_t , Int_t ,
const Double_t * , Double_t * , Double_t )
193 void TVirtualFitter::GetConfidenceIntervals(TObject * , Double_t )
200 const char *TVirtualFitter::GetDefaultFitter()
203 return ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str();
209 TVirtualFitter *TVirtualFitter::GetFitter()
211 return GetGlobalFitter();
218 Int_t TVirtualFitter::GetMaxIterations()
221 return ROOT::Math::MinimizerOptions::DefaultMaxFunctionCalls();
227 Double_t TVirtualFitter::GetErrorDef()
230 return ROOT::Math::MinimizerOptions::DefaultErrorDef();
236 Double_t TVirtualFitter::GetPrecision()
239 return ROOT::Math::MinimizerOptions::DefaultTolerance();
245 void TVirtualFitter::SetDefaultFitter(
const char *name)
247 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(name,
"");
248 if (GetGlobalDefault() == name)
return;
249 delete GetGlobalFitter();
250 GetGlobalFitter() = 0;
251 GetGlobalDefault() = name;
257 void TVirtualFitter::SetFitter(TVirtualFitter *fitter, Int_t maxpar)
259 GetGlobalFitter() = fitter;
260 GetGlobalMaxPar() = maxpar;
267 void TVirtualFitter::SetFCN(
void (*fcn)(Int_t &, Double_t *, Double_t &f, Double_t *, Int_t))
281 Double_t *TVirtualFitter::SetCache(Int_t npoints, Int_t psize)
283 if (npoints*psize > fCacheSize) {
285 fCacheSize = npoints*psize;
286 fCache =
new Double_t[fCacheSize];
298 void TVirtualFitter::SetMaxIterations(Int_t niter)
300 ROOT::Math::MinimizerOptions::SetDefaultMaxFunctionCalls(niter);
308 void TVirtualFitter::SetErrorDef(Double_t errdef)
311 ROOT::Math::MinimizerOptions::SetDefaultErrorDef(errdef);
312 if (!GetGlobalFitter())
return;
315 GetGlobalFitter()->ExecuteCommand(
"SET ERRORDEF", arglist, 1);
323 void TVirtualFitter::SetPrecision(Double_t prec)
326 ROOT::Math::MinimizerOptions::SetDefaultTolerance(prec);