From 184fbaf548200ac7124cafe5fd3c6da93043826b Mon Sep 17 00:00:00 2001 From: Rene Brun <Rene.Brun@cern.ch> Date: Tue, 22 Apr 2008 06:20:04 +0000 Subject: [PATCH] From Eddy: Improve setting/restoring of fitters git-svn-id: http://root.cern.ch/svn/root/trunk@23377 27541ba8-7e3a-0410-8455-c3a389f83636 --- graf2d/graf/src/TGraph.cxx | 52 +++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/graf2d/graf/src/TGraph.cxx b/graf2d/graf/src/TGraph.cxx index 6b3ec1b34cc..f93d196b59d 100644 --- a/graf2d/graf/src/TGraph.cxx +++ b/graf2d/graf/src/TGraph.cxx @@ -1423,33 +1423,35 @@ Int_t TGraph::Fit(TF1 *f1, Option_t *option, Option_t *, Axis_t rxmin, Axis_t rx if (fitOption.Bound || fitOption.User || fitOption.Errors || fitOption.Minuit) linear = kFALSE; - char l[] = "TLinearFitter"; - Int_t strdiff = 0; - Bool_t isSet = kFALSE; - if (TVirtualFitter::GetFitter()){ - //Is a fitter already set? Is it linear? - isSet = kTRUE; - strdiff = strcmp(TVirtualFitter::GetFitter()->IsA()->GetName(), l); - } - if (linear){ + const TString linearFitterClass = "TLinearFitter"; + Bool_t fitterSet = kFALSE; + Bool_t linearSet = kFALSE; + if (TVirtualFitter::GetFitter()) { + // Is a fitter already set? Is it linear? + fitterSet = kTRUE; + linearSet = (TVirtualFitter::GetFitter()->IsA()->GetName() == linearFitterClass); + } + + TVirtualFitter *origFitter = 0; + if (linear) { // - TClass *cl = TClass::GetClass("TLinearFitter"); - if (isSet && strdiff!=0) { - delete TVirtualFitter::GetFitter(); - isSet = kFALSE; + TClass *cl = TClass::GetClass(linearFitterClass); + if (fitterSet && !linearSet) { + origFitter = TVirtualFitter::GetFitter(); + fitterSet = kFALSE; } - if (!isSet && cl) { + if (!fitterSet && cl) { TVirtualFitter::SetFitter((TVirtualFitter *)cl->New()); } } else { - if (isSet && strdiff==0){ - delete TVirtualFitter::GetFitter(); - isSet = kFALSE; + if (fitterSet && linearSet) { + origFitter = TVirtualFitter::GetFitter(); + fitterSet = kFALSE; } - if (!isSet) + if (!fitterSet) TVirtualFitter::SetFitter(0); } - TVirtualFitter *grFitter = TVirtualFitter::Fitter(this, f1->GetNpar()); + TVirtualFitter *grFitter = TVirtualFitter::Fitter(this,f1->GetNpar()); grFitter->Clear(); // Get pointer to the function by searching in the list of functions in ROOT @@ -1477,7 +1479,7 @@ Int_t TGraph::Fit(TF1 *f1, Option_t *option, Option_t *, Axis_t rxmin, Axis_t rx // If case of a predefined function, then compute initial values of parameters - if (linear){ + if (linear) { if (fitOption.Robust) fitResult = grFitter->ExecuteCommand("FitGraph", &h, 0); else @@ -1529,7 +1531,7 @@ Int_t TGraph::Fit(TF1 *f1, Option_t *option, Option_t *, Axis_t rxmin, Axis_t rx if (we <= TMath::Abs(par)*1e-6) we = 1; grFitter->SetParameter(i,f1->GetParName(i),par,we,al,bl); } - if(nfixed > 0)grFitter->ExecuteCommand("FIX",arglist,nfixed); // Otto + if (nfixed > 0)grFitter->ExecuteCommand("FIX",arglist,nfixed); // Otto // Reset Print level if (!fitOption.Quiet) { @@ -1609,6 +1611,14 @@ Int_t TGraph::Fit(TF1 *f1, Option_t *option, Option_t *, Axis_t rxmin, Axis_t rx if (TestBit(kCanDelete)) return fitResult; if (gPad) gPad->Modified(); } + + // Restore the original fitter + if (origFitter) + { + delete TVirtualFitter::GetFitter(); + TVirtualFitter::SetFitter(origFitter); + } + return fitResult; } -- GitLab