1 minute read

CERN의 ROOT를 사용할 때 알아두면 좋은 명령어들과 코드들을 정리했습니다.

ROOT Data Analysis FrameWork https://root.cern.ch/root/htmldoc/guides/users-guide/ROOTUsersGuide.html

Install

ROOT 설치: https://root.cern.ch
ROOT가 설치된 경로 찾기 및 버전 확인

$echo $ROOTSYS

Execute

터미널에서 루트를 실행하는 방법

#in the workstation,
$root # or root -l
root [0]
root [0].q #root 끄기
$

root -l 옵션을 붙이면 루트 부팅 메세지 및 로고가 안나옵니다.
터미널에서 root 명령어를 사용하면 root가 실행되고, root [0] 상태로 들어갑니다. root []상태에서 .q 를 입력하면 root를 종료할 수 있습니다.

roofile을 여는 방법

TFile f("filename.root")

이 때부터 TFile function을 이용하여, 여러가지 방법으로 루트를 가지고 놀 수 있습니다.
예제로 nanoAOD_3.root 파일을 열어보겠습니다.

root []f.ls()
TFile**		nanoAOD_3.root
 TFile*		nanoAOD_3.root
  OBJ: TTree	event	event : 0 at: 0x2838b40
  KEY: TTree	event;1	event
  KEY: TH1D	nevents;1	nevents
  KEY: TH1D	genweight;1	genweight
  KEY: TH1D	weight;1	weight
  KEY: TH1D	cutflow;1	cutflow

여기서

t = f.Get("treename")
t.Scan() # Scan("변수1") 이용하면 특정하게 보기

을 이용하여 tree별로 데이터 구조를 확인할 수도 있고,

treename->Show() #Show("eventnumber") 특정하게 보기
treename->Print()
treename->Scan()
treename->Scan("변수1:변수2:변수3:...")

으로 내용을 자세하게 살펴볼 수 있습니다.

Draw

변수별로 plot을 그리는 방법은

treename->Draw("변수1")
treename->Draw("변수1:변수2")
treenam->Draw("변수1", "변수2>0&&변수7<8")

이와 같고, condition을 넣어서 그릴 수도 있습니다.

Merge, hadd

Merge the files, 파일 합치기

# ex) hadd -f 결과물이름.파일형식 합치려는파일1.파일형식 합치려는파일2.파일형식 합치려는파일3.파일형식
hadd -f combinedResult.root file1.root file2.root file3.root

100GB 이상일 때에는 약간의 코드가 더 필요합니다.

combineFiles.py

import ROOT
import os, sys

print 'Merging %s' % sys.argv[1]

print "Max tree size",ROOT.TTree.GetMaxTreeSize()
ROOT.TTree.SetMaxTreeSize(200000000000) # 200 Gb
print "Updated tree size",ROOT.TTree.GetMaxTreeSize()

rootMerge = ROOT.TFileMerger(False)
rootMerge.SetFastMethod(True)

path = '/path/to/files/'
file_output = '%s.root' % sys.argv[1]
file_list = ["file1.root", "file2.root", "file3.root", "file4.root"]
for path, dirs, files in os.walk(path):
  for filename in files:
    if ('%s_part' % sys.argv[1]) in filename: file_list.append(path+filename)

print "Input file list:",file_list
print "Output file:",file_output

for file in file_list:

    print "Adding ->", file
    rootMerge.AddFile(file)

rootMerge.OutputFile(file_output)
rootMerge.Merge()

Categories:

Updated: