How to use Eval(...) method for a function in TF1!

Dear all,

I have long code, but I will post the small portion to make the point. Normally, I create and fill a histogram, then I fit these functions on to the histogram. In the end, I need to read a Y value for a corresponding X value from a fitted gaussian function. I don’t want to use GetBinContent(bin) method to get the result from a histogram, instead.

Note that I made up the numbers to simplify the situation.

If I create a gaussian function on a terminal instead of writing in a macro, I can call Y value for any X value with Eval(). It seems getting he value from a fitted gaussian ruins everything. I used to run it OK before.

TF1 *g1 = new TF1(“g1”,“gaus”, 0, 1024 );
TF1 *pol1 = new TF1(“pol1”,“pol1”, 0, 1024 );
TF1 *total = new TF1(“total”,“gaus(0)+pol1(3)”, 0, 1024);

double par[5];
h1->Fit(total, “RNQ+”);
double p0 = par[0];
double p1 = par[1];
double p2 = par[2];
double p3 = par[3];
double p4 = par[4];
double e0 = g1->GetParError(0);
double e1 = g1->GetParError(1);
double e2 = g1->GetParError(2);
double e3 = pol1->GetParError(0);
double e4 = pol1->GetParError(1);
cout <<"!!!: 310. channel" << g1->Eval(310.) << " 320. channel " << g1->Eval(320.) <<endl;

This last cout line doesn’t read the Y value from a fitted function.

After the last “Fit” statement, try (see / compare the displayed values of parameters):
g1->Print("V"); pol1->Print("V"); total->Print("V");

BTW. It’s probably better to use:
TF1 *pol1 = new TF1("MyPol1", "pol1", 0., 1024.);

This option doesn’t seem doing the trick except printing the details. The problem of Eval() stays put.

Test “Eval” (note: “g1” is just a “Gaussian”):
std::cout << g1->Eval(g1->GetParameter(1)) << " = " << g1->GetParameter(0) << std::endl;

Your suggestion works perfectly and cleverly fine. I updated the code. Do you think the problem was the definition of the parameters which should have suited the definition of TF1 in ROOT? Probably, I set up them int before !

FindFittingValues.cpp (7.2 KB)

Co60.txt (3.6 KB)

Updated results match:

cout <<"!!!TESTING1!!!: 313.533 " << g1->Eval(313.533,0.,0.,0.) << endl;
std::cout <<"!!!TESTING2!!!: @channel " <GetParameter(1) <<", the count is: "<< g1->Eval(g1->GetParameter(1)) << " which equals to " << g1->GetParameter(0) << std::endl;

As a next step, I want to find the X and Y axis points where 2 Gaussians intercepts. What method can I try except solving the 2 Gaussian equations by making them equal to each other to find the common solution point?

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.