Hi
I am working with the TF1 formula. i want to fir a pol5 into some data I have. Then what I did first is before I modified my main program writen in c++, I wrote a small scrip in root to make sure I was coding it right. i even used the same values from my data to fit the polynomial. Then after the root script was working, I modified my main program and it happens that I had the following error:
x: 1.200000 y: 1466.705322
x: 1.100000 y: 879.823364
x: 1.000000 y: 512.609497
x: 0.900000 y: 272.953857
x: 0.900000 y: 275.149445
x: 0.800000 y: 136.832687
x: 0.700000 y: 60.892311
x: 0.700000 y: 60.892311
x: 0.600000 y: 25.235888
x: 0.500000 y: 9.096155
x: 0.400000 y: 2.264582
Error in TDecompChol::Decompose(): matrix not positive definite
Error in TDecompChol::Solve(): Decomposition failed
Error in TLinearFitter::Eval: Matrix inversion failed
Parameters:
NO. VALUE ERROR
0 0.000000e+00 0.000000e+00
1 0.000000e+00 0.000000e+00
2 0.000000e+00 0.000000e+00
3 0.000000e+00 0.000000e+00
4 0.000000e+00 0.000000e+00
5 0.000000e+00 0.000000e+00
Normal termination…
bash-3.1$
{End of output}
Here next I have attached the relevant c++ code where I want to introduce the TF1 object for fitting and plotting. In the last part of this post is the root script I wrote. As you noticed both are the pretty-close the same. Does anyone knows why I get this error?
Relevant code in c++
c1->cd(2);
color_marker=2;
//this for loop loads chooses the energy peak of interest. Here “+24”
//I have choosen only one energy i.e this loop only runs once
for (ii=MEAN;ii<PK_A;ii=ii+NO_OUT_PARAM+24){
g25 = fitResults[6][ii]/fitResults[7][ii];
float gain[]={1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, g25, g25, g25, g25}; //LaBr3
//This loop load all the col values of the matrix into array y
//note that array "volts" is a copy of "x"
for (jj=0;jj<(sizeof(x)/sizeof(x[0]));jj++){
y[jj] = fitResults[jj][ii]*gain[jj]; //MEAN
volts[jj]=x[jj];
}
fPol = new TF1("fPol","pol5",volts[0],volts[(sizeof(x)/sizeof(x[0]))]);
gr=new TGraph((sizeof(x)/sizeof(x[0])),volts,y);
//gr->Draw("ap"); //<-I tried this
gr->Fit(fPol,"R","",volts[(sizeof(x)/sizeof(x[0]))],volts[0]);
//for(k=0;k<(sizeof(x)/sizeof(x[0]));k++)printf("x: %f \t y: %f\n",volts[k],y[k]);
fPol->Draw("l");
gr->SetMarkerColor(color_marker++);
gr->SetMarkerStyle(21);
mg->Add(gr);
}
mg->Draw("apl");
mg->GetXaxis()->SetTitle("Voltage [kV]");
mg->GetXaxis()->CenterTitle();
mg->GetYaxis()->SetTitle("FWHM/E [channel/channel]"); //Resolution
mg->GetYaxis()->CenterTitle();
{end c++ code}
Next in the script code run in root:
==================================================root fitPol.C
void fitPol(){
int i;
TCanvas *c1=new TCanvas(“c1”,"",200,10,700,500);
TGraph *g;
c1->Divide(2,1);
c1->cd(1);
c1->SetGrid();
Float_t x[] = {1.2, 1.1, 1.0, 0.9, 0.9, 0.8, 0.7, 0.7, 0.6, 0.5, 0.4};
int n=(sizeof(x)/sizeof(x[0]));
//Float_t y[n];
//for(i=0;i<n;i++)y[i]=0.5*x[i]**5;
Float_t y[]={1466.70,879.82,512.61,272.95,275.15,136.83,60.89,60.89,25.23,9.10,2.26};
TF1 *f =new TF1(“fp”,“pol5”,1.2,0.4);
gr=new TGraph(n,x,y);
gr->Draw(“ap”);
gr->SetMarkerStyle(21);
c1->cd(2);
gr->Fit(f,“R”,"",x[n-1],x[0]);
f->Draw(“l”);
}
data.tar.gz (380 KB)
MainFrame.tar (30 KB)
fitPol.C (1.58 KB)