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; }