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