errors while fitting

From: Robert Feuerbach (feuerbac@ernest.phys.cmu.edu)
Date: Tue Mar 07 2000 - 19:02:01 MET


Hi,

I'm trying to write a function that will fit a passed through histogram,
and so it will be called many times. In debugging and trying to find
reason for the "*** Break *** segmentation violation" errors I'm getting,
I now have a very simple histogram fitting routine that still isn't
working.

I'm using ROOT 2.23/12 on a Linux Redhat5.2 dual-processor machine.

What is happening is:

root [0] TFile *hfile = new TFile("histos-oct13-mar6.root","UPDATE")
root [1] Double_t obs,err,bck,ebck
root [2] gDirectory->cd("masshists")
(Bool_t)1
root [3] .L /home/feuerbac/kaon/root/fithist-test.cc                     
Which: /home/feuerbac/kaon/root/fithist-test.cc =
/home/feuerbac/kaon/root/fithist-test.cc
root [4] obs = massfithist(qwcL1_1_4,1,0,&err,&bck,&ebck)
 FCN=15.5904 FROM MIGRAD    STATUS=CONVERGED      74 CALLS          75
TOTAL
                     EDM=7.19503e-05    STRATEGY= 1      ERROR MATRIX
ACCURATE 
  EXT PARAMETER                                   STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  Constant     2.56006e+01   5.70256e+00   5.07459e-03  -4.34415e-04
   2  Mean         4.97567e-01   3.18574e-03   3.42157e-06   1.29586e+00
   3  Sigma        1.56528e-02   3.12983e-03   3.94029e-05  -1.83671e-01

 *** Break *** segmentation violation
Root > Function massfithist() busy flag cleared

.V shows that the error is happening at the first

hist->Fit("g1","",0,0.45,0.55");


What am I doing wrong?

Rob


// fit histogram with gaussian AREA, width and other parameters

Double_t SQR(Double_t x) {
  return x*x;
}

static Double_t mid_pnt=0.493677;

Double_t dga(Double_t *x, Double_t *param) {
  Double_t xx=x[0];
  Double_t pi2sqrt = TMath::Sqrt(TMath::Pi()*2.);
  Double_t f;
  if (param[2] != 0.)
    f = param[0]/(param[2]*pi2sqrt)*exp(-0.5*((xx-param[1])/param[2]*(xx-param[1])/param[2]));
  else
    f = 0.;
  return f;
}

Double_t dmassfit(Double_t *x, Double_t *param) {
  Double_t xx=x[0];
  Double_t f = TMath::Abs(dga(x,param) + param[3] + param[4]*(xx-mid_pnt));
  return f;
}


Double_t massfithist(TH1D *hist, int choice, int useold, Double_t *err, Double_t *bckg, Double_t *dbckg) {
  Text_t *FitFunc=0;
  Text_t MassFit[] = "massfit";
  
  TF1 *fitfunc = 0;

  Int_t npar;

  Float_t range[2] = {0.35,0.65};
  Double_t par[5]  = {0.,0.,0.,0.,0.};
  Double_t epar[5] = {0.,0.,0.,0.,0.};
  Double_t maxm;
  Double_t xbinsize;
  static Double_t pi2sqrt = TMath::Sqrt(2.*TMath::Pi());

  Double_t obs=0., dobs=0., bck=0., dbck=0.;

  if (!hist) return -999;

  FitFunc = MassFit;
  fitfunc = new TF1(MassFit,dmassfit,0.35,0.65,5);

  if (!fitfunc) return -999;

  npar = fitfunc->GetNpar();  // number of parameters of function
    
  TF1 *g1 = new TF1("g1","gaus",0.45,0.55);

  maxm = hist->GetMaximum();
  // seed the fit first time through

  hist->Fit("g1","",0,0.45,0.55);       // looks like crashing here!
  hist->Fit("g1","R0",0,0.45,0.55);

  // Clean up!

  delete g1;
  delete fitfunc;

  return obs;
}



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:21 MET