void hist006_TH1_bar_charts() { // Try to open first the file cernstaff.root in tutorials/io/tree directory TString filedir = gROOT->GetTutorialDir(); filedir += TString("/io/tree/"); TString filename = "cernstaff.root"; // Note that `AccessPathName` returns 0 (false) on success! bool fileNotFound = gSystem->AccessPathName(filename); // If the file is not found try to generate it using the macro io/tree/tree500_cernbuild.C if (fileNotFound) { TString macroName = filedir + "tree500_cernbuild.C"; if (!gInterpreter->IsLoaded(macroName)) gInterpreter->LoadMacro(macroName); gROOT->ProcessLineFast("tree500_cernbuild()"); } auto file = std::unique_ptr(TFile::Open(filename, "READ")); if (!file) { Error("hist006_TH1_bar_charts", "file cernstaff.root not found"); return; } // Retrieve the TTree named "T" contained in the file auto tree = file->Get("T"); if (!tree) { Error("hist006_TH1_bar_charts", "Tree T is not present in file %s", file->GetName()); return; } tree->SetFillColor(45); // Create the canvas to draw on TCanvas *c1 = new TCanvas("c1","histograms with bars", 700, 800); c1->SetFillColor(42); // Divide it vertically in 2 sections int ndivsX = 1; int ndivsY = 2; c1->Divide(ndivsX, ndivsY); // Horizontal bar chart auto *curPad = c1->cd(1); // select top section. Section 1 is the first sub-section. curPad->SetGrid(); curPad->SetLogx(); curPad->SetFrameFillColor(33); // Use the "hbar2" option to draw the tree as a horizontal bar chart tree->Draw("Nation","","hbar2"); // Vertical bar chart curPad = c1->cd(2); curPad->SetGrid(); curPad->SetFrameFillColor(33); // This line makes the TTree draw its "Division" branch to a new histogram called "hDiv". // We use "goff" because we don't want to really draw it to screen but we are only interested // in generating the histogram from it (which we'll display ourselves later). tree->Draw("Division>>hDiv","","goff"); // Retrieve the generated histogram TH1F *hDiv = file->Get("hDiv"); hDiv->SetStats(0); // Clone the histogram into a new one called "hDivFR". TH1F *hDivFR = static_cast(hDiv->Clone("hDivFR")); // Overwrite the contents of the newly-cloned histogram to only keep the entries matching our // selection (second argument of TTree::Draw()). tree->Draw("Division>>hDivFR","Nation==\"FR\"","goff"); // Now draw both histograms side-by-side ("same" option) as vertical bar charts ("bar2" option) hDiv->SetBarWidth(0.45); hDiv->SetBarOffset(0.1); hDiv->SetFillColor(49); TH1 *h1 = hDiv->DrawCopy("bar2"); hDivFR->SetBarWidth(0.4); hDivFR->SetBarOffset(0.55); hDivFR->SetFillColor(50); TH1 *h2 = hDivFR->DrawCopy("bar2,same"); TLegend *legend = new TLegend(0.55,0.65,0.76,0.82); legend->AddEntry(h1,"All nations","f"); legend->AddEntry(h2,"French only","f"); legend->Draw(); c1->cd(); }