Exemplo n.º 1
0
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 makegraph_xyhits_mchamp1000(){

  //bool save_plots = false;
  bool save_plots = true;

  TCanvas* canvas = new TCanvas("c1","c1",10,10,700,550);
  //canvas_style(canvas);

  //TH2* h1=new TH2F("h1","",2000,0,2000,2000,-1000,1000);
  TH2* h1=new TH2F("h1","",1000,-1000,0,1000,0,1000);
  h1->SetStats(kFALSE);
  h1->SetTitle(";x [cm];y [cm]");
  //h2_style(h1,3,1,1,1001,50,-1111.,-1111.,510,510,20,1,1.4,0);

  const Int_t n_hits = 20;
  Float_t x[n_hits] = {-522.992,
		       -524.292,
		       -525.592,
		       -526.892,
		       -606.525,
		       -607.825,
		       -609.124,
		       -610.424,
		       -630.144,
		       -631.444,
		       -632.744,
		       -634.044,
		       -741.681,
		       -743.086,
		       -744.378,
		       -745.665,
		       -765.758,
		       -767.126,
		       -768.413,
		       -769.755};
  
  Float_t y[n_hits] = {82.024,
		       82.388,
		       82.661,
		       82.971,
		       101.400,
		       101.678,
		       101.929,
		       102.318,
		       106.826,
		       107.214,
		       107.421,
		       107.769,
		       132.755,
		       132.924,
		       133.286,
		       133.657,
		       138.406,
		       138.637,
		       139.007,
		       139.285};

  graph = new TGraph(n_hits, x, y);
  //gr_style(graph,1,1,1,1001,50,-1111,-1111,510,510,20,1,1.3,1);
  graph->SetMarkerStyle(20);
  graph->SetMarkerSize(1);
  graph->SetMarkerColor(1);
  graph->SetTitle(";x [cm];y [cm]");
  //graph->GetYaxis()->SetRangeUser(0,20);


  //Fit a circle to the graph points
  TVirtualFitter::SetDefaultFitter("Minuit");  //default is Minuit
  TVirtualFitter *fitter = TVirtualFitter::Fitter(0, 3);
  Int_t a,c;
  Double_t b,f,par;
  fitter->SetFCN(myfcn);

  fitter->SetParameter(0, "x0",   0,    0.1, -1000, 1000);
  fitter->SetParameter(1, "y0",   1000, 0.1, 0,     2000);
  fitter->SetParameter(2, "R",    1000, 0.1, 0,     1000);

  Double_t arglist[1] = {0};
  fitter->ExecuteCommand("MIGRAD", arglist, 0);

  //Draw the circle on top of the points
  TArc *arc = new TArc(fitter->GetParameter(0),
		       fitter->GetParameter(1),fitter->GetParameter(2));
  arc->SetLineColor(kRed);
  arc->SetLineWidth(4);



  Leg1 = new TLegend(0.45,0.75,0.75,0.85);
  //Leg1->AddEntry(graph_noChaCut,"Average Before TS","p");
  Leg1->AddEntry(graph,"After TS","p");
  //Leg1->AddEntry(graph_predicted,"Predicted After TS","p");
  Leg1->SetBorderSize(0);
  Leg1->SetTextSize(0.04);
  Leg1->SetFillColor(0);


  //TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary    #sqrt{s}=8 TeV","NDC");
  //TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary    #sqrt{s}=8 TeV    3.4 fb^{-1}","NDC");
  //TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary    #sqrt{s}=8 TeV    4.4 fb^{-1}","NDC");
  TPaveLabel *text1 = new TPaveLabel(.17,.85,.37,.89,"CMS Preliminary    #sqrt{s}=8 TeV","NDC");
  text1->SetBorderSize(0);
  text1->SetTextSize(0.7);
  text1->SetFillColor(0);

  TPaveLabel *text2 = new TPaveLabel(.17,.85,.37,.89,"1000 GeV H++, Event 58654","NDC");
  text2->SetBorderSize(0);
  text2->SetTextSize(0.7);
  text2->SetFillColor(0);


  TPaveText* text1a = new TPaveText(-500,500,-300,700);
  text1a->SetBorderSize(0);
  text1a->SetTextSize(0.05);
  text1a->SetFillColor(0);
  double p0  = fitter->GetParameter(0);
  double p1  = fitter->GetParameter(1);
  double p2  = fitter->GetParameter(2);
  double e0  = fitter->GetParError(0);
  double e1  = fitter->GetParError(1);
  double e2  = fitter->GetParError(2);
  char p0name[50], p1name[50], p2name[50];
  sprintf(p0name,"x0 = %.2f #pm %.2f",p0,e0);
  sprintf(p1name,"y0 = %.2f #pm %.2f",p1,e1);
  sprintf(p2name,"R = %.2f #pm %.2f",p2,e2);
  text1a->AddText(p0name);
  text1a->AddText(p1name);
  text1a->AddText(p2name);


  canvas->cd();
  h1->Draw();
  arc->Draw("same");
  graph->Draw("Psame");
  //text1->Draw();
  text1a->Draw();
  text2->Draw();
  //Leg1->Draw();
  if(save_plots) canvas->SaveAs("../plots/hits_xy_mchamp1000.eps");

  //return 0;

}