[cernRoot] how to get contours from a TH2D

here, i use a TMultiGraph to save the gotten contours, because the contours may be not closed in a TH2D, with the function TMultiGraph * GetContours(const char * fn, const char * th2dname, int nlevel). And in the Test() function, the TGraph objects of the TMultiGraph are extracted.

void Test()
{
    TMultiGraph * mg = GetContours("res_b64_fit_3id_ddmts_mc.root", "0", 1);
    mg->DrawClone("ACP");
//    TList * list = mg->GetListOfGraphs();
//    TGraph * gr = (TGraph *)list->First();
//    gr->DrawClone("ACP");
//    cout << list->GetSize() << endl;
delete mg;
}
TMultiGraph * GetContours(const char * fn, const char * th2dname, int nlevel)
{
    TGraph ** gr;
    TFile * f = new TFile(fn, "read");
    TH2D * h = (TH2D *) f->Get(th2dname);
    double chisq = h->GetMinimum();
    double contours[2] = {chisq + 2.3, chisq + 6.14};
    h->SetContour(2, contours);
    TCanvas * cc = new TCanvas(th2dname, th2dname);
    cc->Divide(2,2);
    cc->cd(1);
    h->Draw("CONT1");
    cc->cd(2);
    h->Draw("CONT Z LIST");
    cc->Update();/////////////////////////////
    TObjArray * cont = (TObjArray *)(gROOT->GetListOfSpecials()->FindObject("contours"));
    TList * list = (TList *)cont->At(nlevel);
    int ngr = list->GetSize();
    TGraph * grtemp;
    if(ngr > 0)
    {
        gr = new TGraph * [ngr];
        grtemp = (TGraph *)list->First();
        gr[0] = grtemp->Clone();
        for(int igr = 1; igr < ngr; ++ igr)
        {
            grtemp = (TGraph *)list->After(grtemp);
            gr[igr] = grtemp->Clone();
        }
    }
    cc->Close();
    delete cc;
    f->Close();
    delete f;
    delete grtemp;
    TMultiGraph * mg = new TMultiGraph();
    for(int i = 0; i < ngr; ++ i)
        mg->Add(gr[i]);
    delete [] gr;
    return mg;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值