void CurveLivello() { // Serve in questo caso a definire il package di minimizzazione TVirtualFitter::SetDefaultFitter("Minuit"); // Genero numeri casuali secondo la distribuzione normale // e riempio un istogramma TH1F *h = new TH1F("h","My histogram",100,-5.,5.); h->FillRandom("gaus",6000); //h->FillRandom("pol0",6000); // La gaussiana usata per la regressione ha 3 parametri // questi sono indicati con il numero 0 1 e 2 // 0 costante // 1 media // 2 sigma h->Fit("gaus"); h->Draw(); // estraggo i risultati della regressione TVirtualFitter * fitter = TVirtualFitter::GetFitter(); // Estraggo e stampo il valore dei parametri. double p2=fitter->GetParameter(2); double p1=fitter->GetParameter(1); double p0=fitter->GetParameter(0); printf("\n p2=%f p1=%f p0=%f\n",p2,p1,p0); // estraggo e stampo la matrice di covarianza double * covMatrix = fitter->GetCovarianceMatrix(); printf("\n c11=%f c12=%f c13=%f ",covMatrix[0],covMatrix[1],covMatrix[2]); printf("\n c21=%f c22=%f c23=%f ",covMatrix[3],covMatrix[4],covMatrix[5]); printf("\n c31=%f c32=%f c33=%f\n ",covMatrix[6],covMatrix[7],covMatrix[8]); printf("\n p2=%f err %f",p2,sqrt(covMatrix[8])); printf("\n p1=%f err %f",p1,sqrt(covMatrix[4])); printf("\n p0=%f err %f\n",p0,sqrt(covMatrix[0])); TCanvas* c12 = new TCanvas("c12","c12",800,600); // Chiedo a codice di graficarmi la regione di confidenza // ad una sigma (68.3%) e a due sigma (95.5% ) entro la quale si possonomuovere // i parametri 1 e 2 (media e varianza) // Per ottenere curve di livello a n-sigma, l'argomento deve essere n^2. gMinuit->SetErrorDef(4.); //la variazione del chi2 che definisce la regione dipendera' dal numero di parametri liberi TGraph *gr11 = (TGraph*)gMinuit->Contour(80,1,2); gr11->SetFillColor(40); gr11->GetXaxis()->SetTitle("p1"); gr11->GetYaxis()->SetTitle("p2"); gr11->Draw("alf"); // Per ottenere curve di livello a n-sigma, l'argomento deve essere n^2. gMinuit->SetErrorDef(1.); //la variazione del chi2 che definisce la regione dipendera' dal numero di parametri liberi TGraph *gr12 = (TGraph*)gMinuit->Contour(80,1,2); gr12->SetFillColor(38); gr12->Draw("lf"); TLine* line1p = new TLine(p1+sqrt(covMatrix[4]),p2-5.*sqrt(covMatrix[8]),p1+sqrt(covMatrix[4]),p2+5.*sqrt(covMatrix[8]) ); TLine* line1m = new TLine(p1-sqrt(covMatrix[4]),p2-5.*sqrt(covMatrix[8]),p1-sqrt(covMatrix[4]),p2+5.*sqrt(covMatrix[8]) ); TLine* line1 = new TLine(p1,p2-5.*sqrt(covMatrix[8]),p1,p2+5.*sqrt(covMatrix[8]) ); TLine* line12 = new TLine(p1-5.*sqrt(covMatrix[4]), p2, p1+5.*sqrt(covMatrix[4]), p2 ); TLine* line12p = new TLine(p1-5.*sqrt(covMatrix[4]),p2+sqrt(covMatrix[8]),p1+5.*sqrt(covMatrix[4]), p2+sqrt(covMatrix[8]) ); TLine* line12m = new TLine(p1-5.*sqrt(covMatrix[4]),p2-sqrt(covMatrix[8]),p1+5.*sqrt(covMatrix[4]), p2-sqrt(covMatrix[8]) ); line1->SetLineStyle(2); line12->SetLineStyle(2); line1->Draw(); line12->Draw(); line1p->Draw(); line1m->Draw(); line12p->Draw(); line12m->Draw(); TCanvas* c02 = new TCanvas("c02","c02",800,600); //Ora mi sposto e identifico la regione a 2 sigma gMinuit->SetErrorDef(4.); //nota 4 e non 2!!! //Chiedo di produrmi la stessa cosa per i parametri 0 e 2 TGraph *gr1 = (TGraph*)gMinuit->Contour(80,0,2); gr1->SetFillColor(40); gr1->GetXaxis()->SetTitle("p0"); gr1->GetYaxis()->SetTitle("p2"); gr1->Draw("alf"); // ritorno ad 1 sigma e sovrappolgo le curve gMinuit->SetErrorDef(1.); TGraph *gr2 = (TGraph*)gMinuit->Contour(80,0,2); gr2->SetFillColor(38); gr2->Draw("lf"); TLine* line0p = new TLine(p0+sqrt(covMatrix[0]),p2-5.*sqrt(covMatrix[8]),p0+sqrt(covMatrix[0]),p2+5.*sqrt(covMatrix[8]) ); TLine* line0m = new TLine(p0-sqrt(covMatrix[0]),p2-5.*sqrt(covMatrix[8]),p0-sqrt(covMatrix[0]),p2+5.*sqrt(covMatrix[8]) ); TLine* line0 = new TLine(p0,p2-5.*sqrt(covMatrix[8]),p0,p2+5.*sqrt(covMatrix[8]) ); TLine* line2 = new TLine(p0-5.*sqrt(covMatrix[0]), p2, p0+5.*sqrt(covMatrix[0]), p2 ); TLine* line2p = new TLine(p0-5.*sqrt(covMatrix[0]),p2+sqrt(covMatrix[8]),p0+5.*sqrt(covMatrix[0]), p2+sqrt(covMatrix[8]) ); TLine* line2m = new TLine(p0-5.*sqrt(covMatrix[0]),p2-sqrt(covMatrix[8]),p0+5.*sqrt(covMatrix[0]), p2-sqrt(covMatrix[8]) ); line0->SetLineStyle(2); line0->Draw(); line0m->Draw(); line0p->Draw(); line2->SetLineStyle(2); line2->Draw(); line2m->Draw(); line2p->Draw(); }