void plot2DSignalAnalytisch( TString filename, TString histogramName, TString xtitle = "x", TString ytitle = "y", double rebinx = 1, double rebiny = 1, double xtitleOffset = 1.1, double ytitleOffset = 1.3 ) { // {{{ InitgStyle(); //gStyle->SetOptStat(0); //gCanvas = new TCanvas("gCanvas", "gCanvas", 0, 0, 800, 600); LoadHistogramTH2D(histogramName , filename, 1.0, histogram);// Summe (SM //gCanvas->Clear(); histogram->GetXaxis()->SetTitle(xtitle); histogram->GetXaxis()->SetTitleOffset(xtitleOffset); histogram->GetYaxis()->SetTitle(ytitle); histogram->GetYaxis()->SetTitleOffset(ytitleOffset); //histogram->GetZaxis()->SetTitle("d^{2}#sigma / dM_{#bar{t}}dM_{t} [pb]"); //histogram->GetZaxis()->SetTitleOffset(ytitleOffset); // gCanvas->Update(); //TF2 *fitFunction = new TF2("fitFunction", HistoSum, -1, 1, -1, 1, 4); //allgemeine "return"-Varianten //fitFunction->SetParameters(0.9,0.,0.); TF2 *fitFunction = new TF2("fitFunction", HistoSum, -1, 1, -1, 1, 2); histogram->Fit(fitFunction, "N"); // for(int i =1; i<=5;i++){ // for(int j=1;j<=5;j++){ // cout << "Bininhalt("<<i<<","<<j<<"): " << histogram->GetBinContent(i,j) << endl; // } // } histogram->RebinX(rebinx); histogram->RebinY(rebiny); histogram->Draw("lego"); fitFunction->SetLineColor(kRed); fitFunction->SetLineWidth(0.5); fitFunction->Draw("same"); cout << fitFunction->GetChisquare()/fitFunction->GetNDF() << endl; //gCanvas->Print(epsFilename(filename, histogramName)+".eps"); //cout << histogram[0]->Integral() << endl; // }}} };
int TwoHistoFit2D(bool global = true) { // create two histograms int nbx1 = 50; int nby1 = 50; int nbx2 = 50; int nby2 = 50; double xlow1 = 0.; double ylow1 = 0.; double xup1 = 10.; double yup1 = 10.; double xlow2 = 5.; double ylow2 = 5.; double xup2 = 20.; double yup2 = 20.; TH2D * h1 = new TH2D("h1","core",nbx1,xlow1,xup1,nby1,ylow1,yup1); TH2D * h2 = new TH2D("h2","tails",nbx2,xlow2,xup2,nby2,ylow2,yup2); double iniParams[10] = { 100, 6., 2., 7., 3, 100, 12., 3., 11., 2. }; // create fit function TF2 * func = new TF2("func",my2Dfunc,xlow2,xup2,ylow2,yup2, 10); func->SetParameters(iniParams); // fill Histos int n1 = 50000; int n2 = 50000; // h1->FillRandom("func", n1); //h2->FillRandom("func",n2); FillHisto(h1,n1,iniParams); FillHisto(h2,n2,iniParams); // scale histograms to same heights (for fitting) double dx1 = (xup1-xlow1)/double(nbx1); double dy1 = (yup1-ylow1)/double(nby1); double dx2 = (xup2-xlow2)/double(nbx2); double dy2 = (yup2-ylow2)/double(nby2); // h1->Sumw2(); // h1->Scale( 1.0 / ( n1 * dx1 * dy1 ) ); // scale histo 2 to scale of 1 h2->Sumw2(); h2->Scale( ( double(n1) * dx1 * dy1 ) / ( double(n2) * dx2 * dy2 ) ); if (global) { // fill data structure for fit (coordinates + values + errors) std::cout << "Do global fit" << std::endl; // fit now all the function together // fill data structure for fit (coordinates + values + errors) TAxis *xaxis1 = h1->GetXaxis(); TAxis *yaxis1 = h1->GetYaxis(); TAxis *xaxis2 = h2->GetXaxis(); TAxis *yaxis2 = h2->GetYaxis(); int nbinX1 = h1->GetNbinsX(); int nbinY1 = h1->GetNbinsY(); int nbinX2 = h2->GetNbinsX(); int nbinY2 = h2->GetNbinsY(); /// reset data structure coords = std::vector<std::pair<double,double> >(); values = std::vector<double>(); errors = std::vector<double>(); for (int ix = 1; ix <= nbinX1; ++ix) { for (int iy = 1; iy <= nbinY1; ++iy) { if ( h1->GetBinContent(ix,iy) > 0 ) { coords.push_back( std::make_pair(xaxis1->GetBinCenter(ix), yaxis1->GetBinCenter(iy) ) ); values.push_back( h1->GetBinContent(ix,iy) ); errors.push_back( h1->GetBinError(ix,iy) ); } } } for (int ix = 1; ix <= nbinX2; ++ix) { for (int iy = 1; iy <= nbinY2; ++iy) { if ( h2->GetBinContent(ix,iy) > 0 ) { coords.push_back( std::make_pair(xaxis2->GetBinCenter(ix), yaxis2->GetBinCenter(iy) ) ); values.push_back( h2->GetBinContent(ix,iy) ); errors.push_back( h2->GetBinError(ix,iy) ); } } } TVirtualFitter::SetDefaultFitter("Minuit"); TVirtualFitter * minuit = TVirtualFitter::Fitter(0,10); for (int i = 0; i < 10; ++i) { minuit->SetParameter(i, func->GetParName(i), func->GetParameter(i), 0.01, 0,0); } minuit->SetFCN(myFcn); double arglist[100]; arglist[0] = 0; // set print level minuit->ExecuteCommand("SET PRINT",arglist,2); // minimize arglist[0] = 5000; // number of function calls arglist[1] = 0.01; // tolerance minuit->ExecuteCommand("MIGRAD",arglist,2); //get result double minParams[10]; double parErrors[10]; for (int i = 0; i < 10; ++i) { minParams[i] = minuit->GetParameter(i); parErrors[i] = minuit->GetParError(i); } double chi2, edm, errdef; int nvpar, nparx; minuit->GetStats(chi2,edm,errdef,nvpar,nparx); func->SetParameters(minParams); func->SetParErrors(parErrors); func->SetChisquare(chi2); int ndf = coords.size()-nvpar; func->SetNDF(ndf); std::cout << "Chi2 Fit = " << chi2 << " ndf = " << ndf << " " << func->GetNDF() << std::endl; // add to list of functions h1->GetListOfFunctions()->Add(func); h2->GetListOfFunctions()->Add(func); } else { // fit independently h1->Fit(func); h2->Fit(func); } // Create a new canvas. TCanvas * c1 = new TCanvas("c1","Two HIstogram Fit example",100,10,900,800); c1->Divide(2,2); gStyle->SetOptFit(); gStyle->SetStatY(0.6); c1->cd(1); h1->Draw(); func->SetRange(xlow1,ylow1,xup1,yup1); func->DrawCopy("cont1 same"); c1->cd(2); h1->Draw("lego"); func->DrawCopy("surf1 same"); c1->cd(3); func->SetRange(xlow2,ylow2,xup2,yup2); h2->Draw(); func->DrawCopy("cont1 same"); c1->cd(4); h2->Draw("lego"); gPad->SetLogz(); func->Draw("surf1 same"); return 0; }
void plot2DSignalHisto( TString filename1, TString filename2, TString histogramName, // TString drawopts = "", TString xtitle = "x", TString ytitle = "y", double xtitleOffset = 1.1, double ytitleOffset = 1.3 ) { // {{{ InitgStyle(); //gStyle->SetOptStat(0); //gCanvas = new TCanvas("gCanvas", "gCanvas", 0, 0, 800, 600); TFile *outputFile = new TFile("FitErgebnisse.root","RECREATE"); TH2D *histogram__DiffAbs = new TH2D("histogram__DiffAbs","Differenz Fit - Input (Absolut)", 5, -1, 1, 5, -1, 1); TH2D *histogram__DiffRel = new TH2D("histogram__DiffRel","Differenz Fit - Input (Relativ)", 5, -1, 1, 5, -1, 1); TH2D *histogram__FitResult = new TH2D("histogram__FitResult ", "Ergebnis-Histogramm des Fits", 5, -1, 1, 5, -1, 1); // LoadHistogramTH2D(histogramName , filename1, 1.0, histogram);// Summe (SM) LoadHistogramTH2D("histogram__Correlation"+histogramName , filename1, 1.0, histogram);// Summe (SM //LoadHistogramTH2D(histogramName+"_LL" , filename2, 1.0, histo1); // LL //LoadHistogramTH2D(histogramName+"_LR" , filename2, 1.0, histo2); // LR //LoadHistogramTH2D(histogramName+"_RL" , filename2, 1.0, histo3); // RL //LoadHistogramTH2D(histogramName+"_RR" , filename2, 1.0, histo4); // RR //LoadHistogramTH2D("histogram__gen_N" , filename2, 1.0, histo1); //LoadHistogramTH2D("histogram__gen_A" , filename2, 1.0, histo2); LoadHistogramTH2D("histogram__N"+histogramName , filename2, 1.0, histo1); LoadHistogramTH2D("histogram__A"+histogramName , filename2, 1.0, histo2); //gCanvas->Clear(); histogram->GetXaxis()->SetTitle(xtitle); histogram->GetXaxis()->SetTitleOffset(xtitleOffset); histogram->GetYaxis()->SetTitle(ytitle); histogram->GetYaxis()->SetTitleOffset(ytitleOffset); //histogram->GetZaxis()->SetTitle("d^{2}#sigma / dM_{#bar{t}}dM_{t} [pb]"); //histogram->GetZaxis()->SetTitleOffset(ytitleOffset); // gCanvas->Update(); /* histo1->Scale(1.0/histo4->Integral()); histo2->Scale(1.0/histo4->Integral()); histo3->Scale(1.0/histo4->Integral()); histo4->Scale(1.0/histo4->Integral()); */ //faktor = 1.0; faktor=Double_t(histogram->Integral())/Double_t(histo1->Integral()); cout<<faktor<<endl; TF2 *fitFunction = new TF2("fitFunction", HistoSum, -1, 1, -1, 1, 2); //allgemeine "return"-Varianten //fitFunction->SetParameters(0.9,0.,0.); //fitFunction->SetLineColor(kRed); histogram->Fit(fitFunction, "N"); fitFunction->SetNpx(5); fitFunction->SetNpy(5); double p0 = fitFunction->GetParameter(0); double p1 = fitFunction->GetParameter(1); // double p2 = fitFunction->GetParameter(2); // double p3 = fitFunction->GetParameter(3); for(int i =1; i <= 5; i++) { for(int j = 1; j <= 5; j++) { //double sigmaLL = p0*faktor*histo1->GetBinError(i,j); //double sigmaLR = p1*faktor*histo2->GetBinError(i,j); //double sigmaRL = p2*faktor*histo3->GetBinError(i,j); //double sigmaRR = p3*faktor*histo4->GetBinError(i,j); double sigmaN = p0*faktor*histo1->GetBinError(i,j); double sigmaA = p1*faktor*histo2->GetBinError(i,j); //histogram->SetBinError(i,j, sqrt( histogram->GetBinContent(i,j) + pow(sigmaLL,2) + pow(sigmaRR,2) + pow(sigmaRL,2) + pow(sigmaLR, 2) )); histogram->SetBinError(i,j, sqrt( histogram->GetBinContent(i,j) + pow(sigmaN,2) + pow(sigmaA,2) )); } } histogram->Fit(fitFunction, "NE"); p0 = fitFunction->GetParameter(0); p1 = fitFunction->GetParameter(1); for(int i =1; i <= 5; i++) { for(int j = 1; j <= 5; j++) { //double sigmaLL = p0*faktor*histo1->GetBinError(i,j); //double sigmaLR = p1*faktor*histo2->GetBinError(i,j); //double sigmaRL = p2*faktor*histo3->GetBinError(i,j); //double sigmaRR = p3*faktor*histo4->GetBinError(i,j); double sigmaN = p0*faktor*histo1->GetBinError(i,j); double sigmaA = p1*faktor*histo2->GetBinError(i,j); //histogram->SetBinError(i,j, sqrt( histogram->GetBinContent(i,j) + pow(sigmaLL,2) + pow(sigmaRR,2) + pow(sigmaRL,2) + pow(sigmaLR, 2) )); histogram->SetBinError(i,j, sqrt( histogram->GetBinContent(i,j) + pow(sigmaN,2) + pow(sigmaA,2) )); } } histogram->Fit(fitFunction, "NE"); //histogram->Draw("lego1"); //fitFunction->Draw("lego"); cout << fitFunction->GetChisquare()/fitFunction->GetNDF() << endl; for(int i = 1; i <= 5; i++) { for(int j = 1; j <= 5; j++) { histogram__DiffAbs->SetBinContent(i,j, fitFunction->Eval(histogram->GetXaxis()->GetBinCenter(i),histogram->GetYaxis()->GetBinCenter(j))-histogram->GetBinContent(i,j) ); histogram__DiffRel->SetBinContent(i,j, (fitFunction->Eval(histogram->GetXaxis()->GetBinCenter(i),histogram->GetYaxis()->GetBinCenter(j))-histogram->GetBinContent(i,j))/histogram->GetBinContent(i,j) ); histogram__FitResult->SetBinContent(i,j, fitFunction->Eval(histogram->GetXaxis()->GetBinCenter(i),histogram->GetYaxis()->GetBinCenter(j))); } } outputFile->cd(""); histogram__DiffAbs->Write("histogram__DiffAbs"); histogram__DiffRel->Write("histogram__DiffRel"); histogram__FitResult->Write("histogram__FitResult"); outputFile->Close(); delete outputFile; //gCanvas->Print(epsFilename(filename, histogramName)+".eps"); //cout << histogram[0]->Integral() << endl; // }}} };