int fit_doublePeak() { double x; fstream f; TH1F *h1 = new TH1F("h1","Istogramma 1D",100,-10.,10.); f.open("h1.dat",ios::in); for (int i = 0; i < 10000; i++) { f >> x; h1->Fill(x); } TCanvas *c1 = new TCanvas("c1","Gauss",600,400); h1->Draw(); // ***************************************** // Fit con somma di due funzioni predefinite // ***************************************** TF1 *somma = new TF1("somma","gaus(0)+gaus(3)",-10.,10.); h1->Fit("somma"); // Il fit non converge! ==> TF1 *g1 = new TF1("g1","gaus",-10.,10.); TF1 *g2 = new TF1("g2","gaus",-10.,10.); double parg1[3], parg2[3]; h1->Fit("g1","","",0.,10.); // Fit della prima gaussiana h1->Fit("g2","","",-8.,0.); // Fit della seconda gaussiana g1->GetParameters(parg1); // Recupero dei parameteri g2->GetParameters(parg2); somma->SetParameters(parg1[0],parg1[1],parg1[2],parg2[0],parg2[1],parg2[2]); h1->Fit("somma"); // Il fit converge! cout << "Chi2 = " << somma->GetChisquare() << endl; return 0; }