float inputFormular(float x0) { float p0 = 0; float p1 = 1; float p2 = 2; return p0 +x0*p1 + x0*x0*p2; } Double_t GetValue(TLinearFitter *myFit, Double_t par0) { TVectorD params; myFit->GetParameters(params); float fitResult = params(0) + params(1)*par0 + params(2)*par0*par0; return fitResult; } Double_t GetError(TLinearFitter *myFit, Double_t par0) { TVectorD errors; myFit->GetErrors(errors); TVectorD params; myFit->GetParameters(params); float fitResult = sqrt( std::pow(errors(0),2) + std::pow((errors(1)*par0),2) + std::pow((errors(2)*par0*par0),2) ); return fitResult; } TGraph * GetGraph1D(TLinearFitter *myFit, Double_t min, Double_t max, std::string opt) { TGraph *gr = new TGraph(); Double_t stepwidth = (max-min)/10.; Double_t pVar; for (int i = 0; i < 10; i++) { pVar = min + stepwidth*i; if (opt == "ul") { gr->SetPoint(i,pVar, GetValue(myFit,pVar) + GetError(myFit,pVar)); } else if (opt == "ll") { gr->SetPoint(i,pVar, GetValue(myFit,pVar) - GetError(myFit,pVar)); } else if (opt == "mid") { gr->SetPoint(i,pVar, GetValue(myFit,pVar)); } } return gr; } int LFtest2() { TLinearFitter *myFit = new TLinearFitter(1); myFit->SetFormula("1 ++ x[0] ++ x[0]*x[0]"); Double_t params[1]; Double_t val; auto rng = new TRandom(); float sigma = 1000; TGraph *grSimple = new TGraph(); for (int i = 0; i < 100; i++) { params[0] = 10; val = inputFormular(params[0]); val += rng->Gaus(0,sigma); myFit->AddPoint(params, val); grSimple->SetPoint(grSimple->GetN(), 10,val); params[0] = 20; val = inputFormular(params[0]); val += rng->Gaus(0,sigma); myFit->AddPoint(params, val); grSimple->SetPoint(grSimple->GetN(), 20,val); params[0] = 30; val = inputFormular(params[0]); val += rng->Gaus(0,sigma); myFit->AddPoint(params, val); grSimple->SetPoint(grSimple->GetN(), 30,val); } std::cout << "Evaluate..." << std::endl; myFit->Eval(); TVectorD result; TVectorD error; myFit->GetParameters(result); myFit->GetErrors(error); for (int i = 0; i < 3; i++) { std::cout << "par[" << i << "]: " << result(i) << " +- " << error(i) << " TValue: " << myFit->GetParTValue(i) << " Significance: " << myFit->GetParSignificance(i) << std::endl; } std::cout << "Chisquare: " << myFit->GetChisquare() << std::endl; std::cout << "Calculating Point at (10,10,1):" << GetValue(myFit,10) << " +- " << GetError(myFit, 10) << std::endl; myFit->PrintResults(3); grSimple->Draw("a*"); TGraph *grSimpleFromFitMID = GetGraph1D(myFit,10,30,"mid"); TGraph *grSimpleFromFitUL = GetGraph1D(myFit,10,30,"ul"); TGraph *grSimpleFromFitLL = GetGraph1D(myFit,10,30,"ll"); grSimpleFromFitMID->Draw("l"); grSimpleFromFitUL->Draw("l"); grSimpleFromFitLL->Draw("l"); return 0; }