#include "TFile.h" #include "TTree.h" #include "TCanvas.h" #include "TF1.h" #include "TH1F.h" #include "TStyle.h" #include "TLegend.h" #include "TPaveStats.h" void fittingBetter() { // gStyle->ToggleEditor(); TFile *fr = new TFile("simeventsNew.root"); TTree *tr = (TTree*)fr->Get("simevents"); TCanvas *c1 = new TCanvas("name1", "title of canvas 1"); c1->Divide(2,2); c1->cd(1); tr->Draw("E", "E>0"); c1->cd(2); TH1F *hE = new TH1F("hE", "Interesting region", 200, 0.7, 1.3); tr->Draw("E>>hE", "E>0.7"); // tr1->SetLineColor(kRed); // tr1->Draw("E", "E>0", "same"); // tr2->SetLineColor(kBlue); // tr2->Draw("E", "E>0", "same"); c1->cd(3); // fr.cd(); TH1F *hEfitSep = new TH1F("hEfitSep", "Fit by two functions", 200, 0.7, 1.3); hE->Draw(); tr->Draw("E >> hEfitSep", "", ""); TF1 *g1 = new TF1("m1","gaus",0.9,1.05); TF1 *g2 = new TF1("m2","gaus",1.08,1.15); g2->SetLineColor(kBlue); // The total is the sum of the three, each has 3 parameters TF1 *total = new TF1("mstotal","gaus(0)+gaus(3)",0.8,1.3); TLegend *legend = new TLegend(0.6,0.65,0.88,0.85); legend->SetTextFont(72); legend->SetTextSize(0.04); legend->AddEntry(hEfitSep,"Data","lpe"); legend->AddEntry(g1,"Broad peak","l"); legend->AddEntry(g2,"Narrow peak","l"); legend->SetX1(0.15); legend->SetX2(0.35); legend->Draw(); cout << legend->GetX1NDC() << endl; cout << legend->GetX1() << endl; cout << legend->GetX2() << endl; Double_t par[6]; // Fit each function and add it to the list of functions hEfitSep->Fit(g1,"R"); hEfitSep->Fit(g2,"R+"); c1->cd(4); TH1F *hEtot = new TH1F("hEtot", "Fit by multiple function", 200, 0.7, 1.3); hEtot->Draw(); tr->Draw("E >> hEtot", "", ""); // Get the parameters from the fit g1->GetParameters(&par[0]); g2->GetParameters(&par[3]); // Use the parameters on the sum total->SetParameters(par); hEtot->Fit(total,"R+"); // gStyle->SetOptFit(); gStyle->SetOptStat("ne"); gStyle->SetOptFit(); // hEtot->GetObjectStat(); TPaveStats *cstats = (TPaveStats*)gPad->GetPrimitive("stats"); cout << cstats->GetX1NDC() << endl; cout << cstats->GetX1() << endl; cout << cstats->GetX2NDC() << endl; cout << cstats->GetX2() << endl; cout << cstats->GetY1() << endl; cout << cstats->GetY2() << endl; cstats->SetY1(3000); c1->Update(); gStyle->ToggleEditor(); return; TCanvas *c2 = new TCanvas("name2", "title of canvas 2"); c2->Divide(2,2); c2->cd(1); tr->Draw("E", "E>0.95"); TH1F *h = (TH1F*)gPad->GetPrimitive("htemp"); c2->cd(2); // fr.cd(); TH1F *hE = new TH1F("hE", "histogram title", 100, 0.95, 1.4); hE->Draw(); tr->Draw("E >> hE", "", ""); TF1 *g1 = new TF1("m1","gaus",1.,1.15); TF1 *g2 = new TF1("m2","gaus",1.2,1.3); // The total is the sum of the three, each has 3 parameters TF1 *total = new TF1("mstotal","gaus(0)+gaus(3)",1.,1.3); Double_t par[6]; // Fit each function and add it to the list of functions hE->Fit(g1,"R"); hE->Fit(g2,"R+"); c2->cd(3); TH1F *hEtot = new TH1F("hEtot", "histogram title", 100, 0.95, 1.4); hEtot->Draw(); tr->Draw("E >> hEtot", "", ""); // Get the parameters from the fit g1->GetParameters(&par[0]); g2->GetParameters(&par[3]); // Use the parameters on the sum total->SetParameters(par); hEtot->Fit(total,"R+"); TCanvas *c3 = new TCanvas("name3", "title of canvas 3"); c3->Divide(2,2); c3->cd(1); // tr1->Draw("E", "E>0.95"); // TH1F *h = (TH1F*)gPad->GetPrimitive("htemp"); c3->cd(2); // fr.cd(); TH1F *hE1 = new TH1F("hE1", "histogram title", 100, 0.95, 1.4); hE1->Draw(); // tr1->Draw("E >> hE1", "", ""); TF1 *g11 = new TF1("m11","gaus",1.,1.15); TF1 *g21 = new TF1("m21","gaus",1.2,1.3); // The total is the sum of the three, each has 3 parameters TF1 *total1 = new TF1("mstotal1","gaus(0)+gaus(3)",1.,1.3); Double_t par1[6]; // Fit each function and add it to the list of functions hE1->Fit(g11,"R"); hE1->Fit(g21,"R+"); c3->cd(3); TH1F *hEtot1 = new TH1F("hEtot1", "histogram title", 100, 0.95, 1.4); hEtot1->Draw(); // tr1->Draw("E >> hEtot1", "", ""); // Get the parameters from the fit g11->GetParameters(&par1[0]); g21->GetParameters(&par1[3]); // Use the parameters on the sum total1->SetParameters(par1); hEtot1->Fit(total1,"R+"); c3->cd(4); TH1F *hEtot11 = new TH1F("hEtot11", "histogram title", 100, 0.95, 1.4); // tr1->Draw("E >> hEtot11", "", ""); Double_t par12[6]; total1->GetParameters(&par12[0]); TF1 *gLow = new TF1("mLow","gaus",0.95,1.2); TF1 *gHigh = new TF1("mHigh","gaus",1.0,1.4); gHigh->SetLineColor(kGreen); gLow->SetParameter(0, par12[0]); gLow->SetParameter(1, par12[1]); gLow->SetParameter(2, par12[2]); gHigh->SetParameter(0, par12[3]); gHigh->SetParameter(1, par12[4]); gHigh->SetParameter(2, par12[5]); gLow->Draw("same"); gHigh->Draw("same"); }