[[root:root|Getting started with ROOT]] -> [[root:pyroot|Useful pyROOT snippets]] → [[root:pyroot_th1|Handling TH1 histograms]] ====== Handling TH1 histograms ====== [[https://root.cern.ch/doc/master/classTH1.html|Here]] is the class reference for ''TH1''. ===== Importing ROOT classes ===== To use ''TH1D'' in ''python'', you can either only import a ''TH1D'' class: from ROOT import TH1D hist = TH1D("hist_name","hist_title",100,0,100) or //all// classes: from ROOT import * # loads all classes, and thus takes longer hist = TH1D("hist_name","hist_title",100,0,100) or only the ''ROOT'' module: import ROOT hist = ROOT.TH1D("hist_name","hist_title",100,0,100) The examples below also make use of ''ROOT'''s ''gRandom'' to make some random variables. ===== Filling a histogram ===== Simple enough: hist = TH1D("hist_name","hist title",100,0,100) for i in xrange(10000): hist.Fill(gRandom.Gauss()) With some weight: weight = gRandom.Gauss(1,0.1) hist.Fill(gRandom.Gauss(),weight) ===== Filling a histogram from a tree ===== The classic way would be with a simple for loop hist = TH1D("hist_name","hist title",100,0,100) for event in tree: hist.Fill(tree.px) But the simplest and most powerful way to draw some variable into a histogram, is with the [[https://root.cern.ch/doc/master/classTTree.html#a73450649dc6e54b5b94516c468523e45|TTree::Draw function]]: hist = TH1D("hist_name","hist title",100,0,100) tree.Draw("px >> hist_name") Note that the histogram has been saved into ''ROOT'''s working memory and is therefore accessible via its name in the ''Draw'' function, ''"hist_name"'' in this example. You can also use **mathematical expressions**, including **boolean expressions** (which can take the value ''0.0'' or ''1.0''): tree.Draw("2*sqrt(px*px+py*py) >> hist_name") tree.Draw("abs(eta) >> hist_name") tree.Draw("pt1*(eta1<2.4) + pt2*(eta2<2.4) >> hist_name") # boolean expressions This also includes custom functions, which you can load into ''ROOT'' with a ''C'' file: from ROOT import gROOT, ... gROOT.Macro("myfunctions.C+") ... tree.Draw("deltaR(eta1,phi1,eta2,phi2) >> hist_name") # deltaR function defined in "myfunctions.C+" tree.Draw("pt1 >> hist_name","(pt>30)*weightEta1(eta1)") # weightEta1 function defined in "myfunctions.C+" You can apply some **selections** using variable, available in the tree's branches: tree.Draw("px >> hist_name","pt>20 && E>20") You can apply some selections and/or a **weight**, if a weight variable is available in the tree: tree.Draw("px >> hist_name","weight") tree.Draw("px >> hist_name","(pt>20 && E>20)*weight") An equivalent method is creating the histogram in the ''Draw'' method. If you need the ''TH1F'' object, you can still get it with ''gDirectory'' (see [[root:pyroot_TFile#gDirectory|here]]): from ROOT import gDirectory ... tree.Draw("pt >> h(100,0,100)") hist = gDirectory.Get("h") # will be a TH1F object It's also possible to pass some **draw option** you would normally use in "TH1::Draw()". It is passed as the third string. tree.Draw("px >> h1(100,0,100)","","E2") tree.Draw("py >> h2(100,0,100)","","E2 SAME") tree.Draw("px >> h1(100,0,100)","abs(eta)>2","E2") tree.Draw("px >> h2(100,0,100)","abs(eta)<2","E2 SAME") __Protip__: This is very useful for quick drawing and comparing, for example in the ''ROOT'' command line. $ root -l tree.root [1] tree->Draw("px >> h1(100,0,100)","") [2] tree->Draw("px >> h1(100,0,100)","pt>20") [3] tree->Draw("px >> h1(100,0,100)","","E2") [4] tree->Draw("py >> h2(100,0,100)","","E2 SAME") // compare to px