Hi Robert,
Thanks for reporting this interesting case. If you add the statement
marked with <=== in your code below, the program will work.
In your case, your histogram already contains a function called
"massfit"
from a previous session. This function is of a different type than your
new function massfit.
I have now protected this situation in my development version.
Rene Brun
Robert Feuerbach wrote:
>
> 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->GetListOfFunctions()->Delete(); //<====================
> 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