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