[ROOT] multiple TMinuit fits

From: Ben Kilminster (bjk@fnal.gov)
Date: Thu Dec 20 2001 - 19:04:45 MET


Hi,

I have a function which has a loop containing minuit fits to a user
defined function. After the loop, TH1F::Fit() is called. When I execute
the function twice in a row, it segmentation faults at the TH1F::Fit()
line.   

The problem may be related to the fact that I delete the instance of 
TMinuit after each use (I do this to guarantee that in each iteration
minuit does not retain any information) - but this doesn't explain why the
function works the first time.

The problem is recreated in the folowing code when the following is run:

.L testHFit.C
testH()   // runs okay
testH()   // segmentation faults at h->Fit("gaus")


//-------------------  FILE:  testHFit.C ------------------

#include "TMinuit.h"
#include "TH1.h"

double value, MyX, MyY;

Double_t func(double x,double y,Double_t *par) {
  value  = par[1]*(par[0]*x + (1.-par[0])*y);
  return(value);
}

void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t
iflag) {
  f = func(MyX,MyY,par);
}

void testH () {

  for (int i=0; i < 2; i++) {
     TMinuit *minuit = new TMinuit(2); 
     minuit->SetFCN(fcn);
     Double_t arglist[2];
     Int_t ierflg = 0;
     arglist[0] = 1;
     minuit->mnexcm("SET ERR", arglist ,1,ierflg);
     Double_t vstart[2] = {0.5, 10};
     Double_t step[2] = {0.01, 1.0};
     minuit->mnparm(0, "Frac", vstart[0], step[0], 0,0,ierflg);
     minuit->mnparm(1, "Normaliz", vstart[1], step[1], 0,0,ierflg);
     arglist[0] = 6000;
     arglist[1] = 1.;
     MyX = 0.3;
     MyY = 0.7; 
     minuit->mnexcm("MIGRAD", arglist ,2,ierflg);
     minuit->Clear();
     delete minuit;
  }

TH1F *h = new TH1F("h","test",10,0,10);
h->Fill(1);h->Fill(2);h->Fill(3);h->Fill(4);h->Fill(3);

// seg faults here the second time that testH() is run.
h->Fit("gaus");

}

//------------------- END FILE:  testHFit.C ------------------



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:13 MET