2009年7月17日金曜日

How to use pyROOT 基礎編 その5

2次元データのプロット

TGraph というクラスを使用する


次のコードでは、引数にプロットするデータファイルを指定する。

データファイルの形式は
data_x data_y



#/bin/usr/env python

import sys, os
import ROOT


if __name__=='__main__':


if len(sys.argv) < 2 :
sys.exit(1)

if not os.path.exists(sys.argv[1]) :
sys.exit(1)

# read data from file
fin = open(sys.argv[1], "r")
fins = fin.readlines()
fin.close()


graph = ROOT.TGraph()

# set data point
for data in fins :
item = data.split(None)
np = graph.GetN()
graph.SetPoint(np, float(item[0]), float(item[1]))


cv = ROOT.TCanvas("cv", "Graph Example", 200, 10, 700, 500)

pad = cv.cd()
pad.SetGridx(1)
pad.SetGridy(1)

graph.Draw("APL")
cv.Update()


# export
cv.Print("graph1.png")






エラーバー付きのプロット

エラーバーを付けてプロットするには、 TGraphErrors クラスを使用する

ここでの引数にしていするデータファイルの形式は
data_x data_y data_x_err data_y_err



#/bin/usr/env python

import sys, os, array
import ROOT


if __name__=='__main__':


if len(sys.argv) < 2 :
sys.exit(1)

if not os.path.exists(sys.argv[1]) :
sys.exit(1)

# read data from file
fin = open(sys.argv[1], "r")
fins = fin.readlines()
fin.close()


dat = {'X' : array.array('f'),
'X_ERR' : array.array('f'),
'Y' : array.array('f'),
'Y_ERR' : array.array('f')}


# set data point
for data in fins :
item = data.split(None)
dat['X'].append(float(item[0]))
dat['X_ERR'].append(float(item[2]))
dat['Y'].append(float(item[1]))
dat['Y_ERR'].append(float(item[3]))


graph = ROOT.TGraphErrors(len(dat), dat['X'], dat['Y'],
dat['X_ERR'], dat['Y_ERR'])


cv = ROOT.TCanvas("cv", "Graph Example", 200, 10, 700, 500)

pad = cv.cd()
pad.SetGridx(1)
pad.SetGridy(1)

graph.Draw("APL")
cv.Update()


# export
cv.Print("graph2.png")






Tips プロット時のオプション

Draw("**") のときの ** を変えることで、いろいろなグラフが描ける

A : 軸をグラフの周りに描く
P : データを指定したマーカー (default は ・) でプロットする
L : 折れ線グラフ
C : データの間を滑らかな曲線で結ぶ


1次関数で fitting


#/bin/usr/env python

import sys, os, array
import ROOT


if __name__=='__main__':


if len(sys.argv) < 2 :
sys.exit(1)

if not os.path.exists(sys.argv[1]) :
sys.exit(1)

# read data from file
fin = open(sys.argv[1], "r")
fins = fin.readlines()
fin.close()


dat = {'X' : array.array('f'),
'X_ERR' : array.array('f'),
'Y' : array.array('f'),
'Y_ERR' : array.array('f')}


# set data point
for data in fins :
item = data.split(None)
dat['X'].append(float(item[0]))
dat['X_ERR'].append(float(item[2]))
dat['Y'].append(float(item[1]))
dat['Y_ERR'].append(float(item[3]))


graph = ROOT.TGraphErrors(len(dat), dat['X'], dat['Y'],
dat['X_ERR'], dat['Y_ERR'])


# fitting
graph.Fit("pol1")

# output fitting parameters
ROOT.gStyle.SetOptFit()

cv = ROOT.TCanvas("cv", "Graph Example", 200, 10, 700, 500)

pad = cv.cd()
pad.SetGridx(1)
pad.SetGridy(1)

graph.Draw("AP")
cv.Update()

# export
cv.Print("graph3.png")


0 件のコメント:

コメントを投稿