28
ROOT-System Cho Người Mi Nhp Môn Trn Hi Nam

Root_Cho sinh viên mới nhập môn

Embed Size (px)

DESCRIPTION

root system

Citation preview

ROOT-System Cho Người Mới Nhập Môn

Trần Hải Nam

Mục Lục

Chương 1: Welcome to ROOT

1.1 Chuẩn bị

1.2 Khởi động và thoát khỏi ROOT

Chương 2: Histogram

2.1 Viết biểu đồ

2.1.1 Biểu đồ 1 chiều

2.1.2 Làm khớp biểu đồ

2.1.3 Chọn 1 khoảng trong biểu đồ

Chương 3: Graph

3.1 Đồ thị của dữ liệu

3.1.1 Bản vẽ 2 chiều

3.1.2 Vẽ thanh sai số

Chương 4: Function

4.1 TF1, TF2

4.2 Hàm với các hệ số

4.3 Các hàm thường dung

Chương 5: Ntuple

5.1 Sử dụng Ntuple

5.2 Xử lý biểu đồ

5.3 Định nghĩa thuật ngữ TCut

Chương 6: Graphics

6.1 Vẽ từ Terminal và Script

6.2 Graphics Editor

6.3 Thay đổi thuộc tính

Chương 7: Các thủ thuật

7.1 Chia màn hình

7.2 Trục tọa độ

7.3 Các vấn đề

7.4 Sửa đổi biểu đồ

7.5 Sửa đổi Graph

7.6 Global Style

7.7 Hoàn thành

Chương 8: In và chỉnh sửa Sourcefile

8.1 In ấn

8.2 Tạo Sourcefile

8.3 ~/.root_hist

Chương 9: Thư viện nguồn của ROOT

9.1 makefile

9.2 phần thân chương trình

Chương 1: Welcome to ROOT

Phương thức thiết lập, khởi động và thoát khỏi ROOT

1.1 Chuẩn bị

Để khởi chạy ROOT lần đầu tiên, chúng ta cần phải thực hiện các bước sần thiết sau:

thnam@thnam(100)> setenv ROOTSYS /home/thnam/Root

thnam@thnam(101)> set path=( $path ${ROOTSYS}/bin )

thnam@thnam(102)> setenv LD_LIBRARY_PATH ${ROOTSYS}/lib

1.2 Khởi động và thoát khỏi ROOT

Khi đăng nhập vào ROOT bằng cách

thnam@thnam(103)> root

Màn hình Welcome to ROOT sẽ hiện ra

******************************************* * * * W E L C O M E to R O O T * * * * Version 2.22/09 19 July 1999 * * * * You are welcome to visit our Web site * * http://root.cern.ch * * *

*******************************************

Prompt của CINT sẽ xuất hiện bên dưới

root[0]

Để thoát ra khỏi ROOT, chúng to gõ lệnh trong của sổ này

root[?] .q

khi đó chúng ta sẽ thoát ra, nếu muốn khởi động root, chúng ta chỉ cần rõ

thnam@thnam(104)> root

Ngoài ra ROOT cũng có ứng dụng chạy trên windows, chức năng và cách thức làm việc giống hệt như

trên linux, việc cài đặt cũng rất đơn giản, tham khảo thêm ở trang http://root.cern.ch/drupal/

Chương 2: Histogram

Chương này chủ yếu đề cập cách thức để vẽ một biểu đồ

2.1 Viết biểu đồ

2.1.1 Biểu đồ 1 chiều

Chúng ta sẽ tìm hiểu về TH1 trước, nó được sử dụng khi ta muốn tạo 1 histogram, chẳng hạn như ta

có 1 file dữ liệu “filename.dat” có nội dung như sau:

1.6

2.0

0.23

Khi đó chúng ta có thể vẽ một histogram bằng lệnh

root[0] TH1S h1(“name”,”title”,150,-10,20);

TH1S() khai báo histogram 1 chiều kiểu short int

“name” tên của histogram

“title” tựa đề của histogram

150,-10,20 150 là số bin của histogram

-10,20 là khoảng mà chúng ta vẽ

Thêm vào đó, để đọc sữ liệu từ file “filename.dat” ta dùng các lệnh sau

root [1] #include<fstream.h>

root [2] ifstream data(“filename.dat”);

root [3] double x;

root [4] while (data>>x) h1.Fill(x);

root [5] data.close();

root [6] data.Draw();

and here is our histogram (hình 2.1)

Hình 2.1 : histogram TH1

Ngoài ra, 1 số các tùy chọn khác có thể được sử dụng

root [7] h1.Draw(“E”);

trong đó “E” được dùng khi muốn vẽ sai số, hình 2.2a

root [8] h1.Draw(“L”);

nếu sử dụng tùy chọn “L” sẽ cho histogram theo dạng như hình 2.2b

root [9] h1.Draw(“P”);

dạng point “P”, hình 2.2

(a) Error bar (b) Line mode (c) Point mode

Hình 2.2: Các dạng khác nhau của TH1 theo các tùy chọn khác nhau

(a) (b)

Hình 2.3: histogram được fit từ hình 2.2

2.1.2 Làm khớp biểu đồ

Để fit 1 biểu đồ theo 1 dạng phân bố nào đó

root [10] h1.Fit(“gaus”);

sẽ fit histogram h1 theo dạng hàm gauss, ta có thể thấy thông qua hình 2.3a

ngoài ra còn có những dạng phân bố khác

root [11] h1.Fit(“expo”);

root [12] h1.Fit(“pol1”);

root [13] h1.Fit(“pol2”);

“expo” là hàm mũ, còn “pol1”, “pol2” là hàm bậc 1 và bậc 2, chúng ta có thể fit theo bậc n bằng hàm poln

(n là số tùy ý)

sau khi fit, nếu muốn xuất ra các thông số của hàm fit lên histogram, ta dùng

root [14] gStyle->SetOptFit();

kết quả sẽ được như hình 2.3b

Fit theo 1 hàm bất kì

Chúng ta sẽ fit histogram h1 với 1 hàm bất kì, chẳng hạn

(2.1)

Đầu tiên chúng ta tạo hàm 1 biến TF1

root [15] TF1 f1(“f1”,”[0]*cos([1]*x+[2]”);

giả sử rằng ta đã có histogram h1, chúng ta tiến hành gán giá trị ban đầu cho hàm fit

root [16] f1.SetParameters(10,1,10);

(a) (b) (c)

Hình 2.4 : fit theo hàm

với giá trị ban đầu là 10,1,10 chúng ta sẽ có dạng hàm fit như trên hình 2.4b

root [17] h1.Fit(“f1”);

ta có thể thay đổi tham số hàm fit

root [18] f1.SetParameters(10,10,10);

và kết quả là hình 2.4c

2.1.3 Chọn 1 khoảng trong biểu đồ

Để chỉ vẽ 1 phần của biểu đồ bằng cách sử dụng SerRange trong Taxis, ví dụ, ta muốn biểu diễn trên

histogram dữ liệu nằm trong khoảng [-5,5] thay vì [-10,20]

root [0] h1 = new TH1S(“name”,”title”,150,-10,20);

:

:

root [5] h1->GetXaxis()->SetRange(h1->GetXaxis()->FindBin(-5),

h1->GetXaxis()->FindBin(5));

root [6] h1->Draw();

Chương 3: Graph

Chương này chúng ta sẽ tìm hiểu về các bản vẽ hai chiều

3.1 Đồ thị của dữ liệu

3.1.1 Bản vẽ 2 chiều

Đầu tiên, để có được một bản vẽ 2 chiều, chúng ta cần file dữ liệu “filename.dat” có cấu trúc như sau

386.0 7.5384

406.0 10.7109

421.0 14.525

… …

khi chúng ta đã có được dữ liệu với trình tự như vậy, chẳng hạn như dữ liệu là 1 chuỗi số thực x[10[,

y[10]. trong đó 10 là kích thước của chuỗi, thường thì chúng ta nên làm việc với 1 chuỗi lớn hơn cần thiết

để tránh tình trạng tràn dữ liệu.

root [0] #include <fstream.h>

root [1] float x[10], y[10];

root [2] ifstream data (“filename.dat”);

root [3] int index=0;

root [4] while(!data.eof()){data>>x[index]>>y[index];index++;}

root [5] data.close();

bây giờ, hãy thử tạo 1 file với tên “filename.dat” chứa cấu trúc dữ liệu như đã đề cập ở trên, và nó có thể

được vẽ thông qua

root [6] graph = new Tgraph(index, x, y);

root [7] graph->Draw(“AP”);

“AP” là tùy chọn.

A: Vẽ trên trục tọa độ

P: vẽ theo dạng điểm

Hình 3.1: vẽ bằng TGraph

ngoài ra ta còn có thể vẽ với nhiều tùy chọn khác nữa

root [6] graph->Draw(“APL”);

tùy chọn “L” sẽ nối các điểm lại với nhau theo đường thẳng (hình 3.2a)

root [8] graph->Draw(“APC”);

tùy chọn “C” sẽ nối các điểm lại với nhau theo đường cong (hình 3.2b)

3.1.2 Vẽ thanh sai số

Bây giờ chúng ta sẽ nói về cách biểu diễn sai số trên bản vẽ, để vẽ sai số cho cả y và x cùng trên 1 bản

vẽ, giả sử rằng chúng ta có thêm cột sai số x_error và y_error trong file “filename.dat”, cách đọc dữ liệu

thì cũng giống như đã ví dụ ở trên

root [9] graph = new TgraphErrors(index, x, y, x_error, y_error);

root [10] graph->Draw(“AP”);

hình 3.3a cho thấy bản vẽ với sai số

thêm vào đó, làm khớp cũng y hệt như histogram

root [11] graph->Fit(“pol1”);

hàm được làm khớp trên hình 3.3b

(a) (b)

Hình 3.2: Một vài bản vẽ bằng TGraph

(a) (b)

Hình 3.3: Sai số và làm khớp

Chương 4: Function

Sử dụng các hàm khác nhau trong ROOT (1-D và 2-D)

4.1 TF1, TF2

Hàm được viết trong ROOT cũng tương tự như viết trong ngôn ngữ C, và được bổ sung hàm bằng

giống như trong ngôn ngữ FORTRAN, dưới đây là ví dụ cho hàm 1 biến

root [0] TF1 f1(“f1”,”x*sin(x)*exp(-0.1*x)”,-10,10); f1.Draw();

khi diễn giải ra thì hàm f1

(4.1)

và sẽ vẽ trong khoảng từ -10 đến 10 (hình 4.1)

Tiếp theo là hàm với 2 biến

root [1] TF2 f2(“f2”,”abs(sin(x)/x)*(cos(y)*y)”,-6,6,-6,6);

hàm trên tương đương với

|

| (4.2)

và được vẽ trong khoảng , (hình 4.2)

là hàm trị tuyệt đối.

cũng có các tùy chọn thêm cho việc biễu diễn hàm f2 này (hãy thử vẽ bằng các lệnh sau)

root [2] f2.Draw(“surf”);

root [3] f2.Draw(“cont1”);

root [4] f2.Draw(“lego”);

4.2 Hàm với các hệ số

Một hàm trong ROOT có thể chứa nhiều hệ số, thường thì chúng ta sử dụng hệ số khi ta dùng hàm để

làm khớp cho 1 histogram nào đó, để tạo ra 1 hàm với các hệ số, chẳng hạn hàm 1 biến TF1 hay 2 biến

TF2, chúng ta chỉ cần đưa vào vị trí của hệ số [0],[1],[2]…

root [5] TF1 f3("f3", "[0]+[1]*exp(x)", -5, 5);

Hình 4.1: hàm 1 biến

Hình 4.2: Hàm 2 biến |

|

Giá trị ban đầu của các hệ số đều là 0, do đó hiện tại hàm của chúng ta chỉ là 1 đường thẳng, chúng ta

phải tiến hành thay đổi hệ số của nó

root [6] f3.SetParameters(1, 2);

tương ứng ta có hệ số [0] bây giờ có giá trị là 1, [1] có giá trị là 2

4.3 Các hàm thường dung

Có một số hàm rất thường hay được sử dụng, chẳng hạn như hàm gaussian hay landau

ví dụ:

hàm trên được viết như sau

root [7] TF1 f4(“f4”,”gaus(0)+gaus(3)”,-10,10);

root [8] f4.SetParameters(100,0,1,20,0,3);

Chương 5: Ntuple

Ntuple là phương thức lưu trữ dữ liệu theo 1 định dạng có thể dễ

dàng truy xuất, trong đó các biến dữ liệu có thể được xử lý, vẽ và làm

khớp.

Mục đích của chương này là mô tả cách thức tạo và sử dụng

ntuple trong ROOT

5.1 Sử dụng Ntuple

Để sử dụng Ntuple, đầu tiên, cần phải tạo ra 1 Ntuple rỗng

root [0] ntuple=new TNtuple(“name”,”title”,”danh sách biến”,”kích thước”)

Biến ở đây ám chỉ biến trong “danh sách biến” và biến được tạo ra bên trong Ntuple, nó phải là 1 chuỗi kí

tự được giới hạn trong dấu ngoặc kép ngăn cách nhau bởi dấu: “ : ”

“x:y:z:energy”

“px:py”

Sau khi tạo ra 1 Ntuple rỗng, tôi sẽ đọc dữ liệu ra từ 1 tập tin filename.dat

root [1] ifstream data(“filename.dat”);

root [2] float x, y, z, energy;

root [3] while(data >> x >>y >>z >> energy)

ntuple->Fill(x, y, z, energy);

root [4] data.close();

Một khi dữ liệu đã được đọc, hãy thử kiểm tra bằng lệnh

ntuple->Print();

nội dung của ntuple sẽ được in ra.

Sau đó, chúng ta có thể tạo ra một biểu đồ từ dữ liệu này bằng lệnh Draw() của Ntuple

root [5] ntuple->Draw(“danh sách biến”,”điều kiện”,”tùy chọn hiển thị”);

ở phần danh sách biến, ta có thể viết như sau

“x” kết quả sẽ cho 1 biểu đồ 1 chiều của biến x

“sqrt(x)” các phép toán với biến cũng có thể được sử dụng

“x+y/z” cũng có thể dùng nhiều biến 1 lúc

nếu viết như sau sẽ cho ra các biểu đồ 2 hoặc 3 chiều

“x:y” cho đồ thị 2 chiều với 1 trục x và 1 trục y

“x:y:z” 3 chiều

“x*2:sqrt(y)” cũng có thể chấp nhận các phép toán như thế này

cũng có thể tạo ra các biểu đồ với những “điều kiện” được khai báo như

“x<0” thêm vào phần “điều kiện” thì chỉ các giá trị với “x<0” được biểu diễn

“x>0&&z<0” kết hợp các điều kiện với nhau cũng được chấp nhận

ví dụ:

root [5] ntuple->Draw(“sqrt(x):y*2”,”z<0”);

biểu diễn các cặp giá trị sqrt(x0 trên trục tung và y*2 trên trục hoành với điều kiện z<0

5.2 Xử lý biểu đồ

Khi 1 histogram được tạo ra, theo mặc định nó sẽ tạo ra các biến tạm thời, gọi là “htemp”. tuy nhiên,

ta cũng có thể tạo ra các biến cho riêng mình và có thể thay đổi nó theo ý muốn.

Để tạo ra 1 biến, ta thêm bào “>>” vào danh sách biến

root [6] ntuple->Draw(“sqrt(x):y*2>>hist”,”z<0”);

như thế, biểu đồ được tao ra sẽ có 1 biến tên là hist, mỗi khi biểu đồ bị xóa đi thì biến tạm “htemp” cũng

bị xóa, nhưng biến mà chúng ta tạo ra “hist” sẽ không bị xóa và có thể được dùng để thêm vào các

histogram khác bằng dấu +

root [7] ntuple->Draw(‘‘sqrt(x):y*4 >>+ hist’’, ‘‘z<0’’);

điều này rất tiện lợi, bằng cách tạo ra các biến mới, chúng ta có thể thao tác với nó sau đó, cách thức thao

tác cũng tương tự như thao tác với histogram.

chẳng hạn như ta có thể fit bằng hàm gaussian

root [8] hist->Fit(“gaus”);

5.3 Định nghĩa điều kiện bằng Tcut

Khi chúng ta muốn tạo ra nhiều biểu đồ với cùng 1 chuỗi các điều kiện, gõ điều kiện giống hệt nhiều

lần quả không phải là một cách hay, khi đó sử dụng TCut sẽ tiết kiệm rất nhiều thời gian, dưới đây là cách

dùng

root [9] TCut positiveCut = “x>0 && y>0 && z>0”;

root [10] ntuple->Draw(“sqrt(x):y*2”,positiveCut);

root [11] ntuple->Draw(“sqrt(x):z”,positiveCut);

các điều kiện cũng có thể được kết hợp lại, chẳng hạn như

root [12] ntuple->Draw(“sqrt(x):y*2”,positiveCut && energyCut);

5.4 Ví dụ

Sau đây tôi sẽ trình bày 1 ví dụ cụ thể, bây giờ chúng ta tạo ra 1 file có tên là “ntuple_example.c” và

lưu nó tại thư mục đang làm việc, nội dụng của file này như sau, tôi sẽ ghi chú thích bên cạnh các dòng

lệnh cho các bạn dễ hiểu

void ntuple_example(){

\\khởi tạo 1 TNtuple

TNtuple cond_data(“cond_data”,”Example N-Tuple”,”Potential:Current:Temperature:Pressure”);

\\ do không có sẵn file data nên bây h chúng ta sẽ tạo ra dữ liệu bằng hàm Random

float pot, cur, temp, pres;

for (int i=0;i<10000;++i){

pot=gRandom->Uniform(0.,10.); \\ tạo ra 1 số ngẫu nhiên trong khoảng từ 0 đến 10

temp=gRandom->Uniform(250.,350.);

pres=gRandom->Uniform(0.5,1.5);

cur=pot/(10.+0.05*(temp-300.)-0.2*(pres-1.));

\\ chúng ta cũng tạo ra sai số luôn và thêm nó vào các biến ở trên

pot*=gRandom->Gaus(1. ,0.01); \\ sai số 1%

temp+=gRandom->Gaus(0. ,0.3); \\ sai số tuyệt đối 0.3

pres*=gRandom->Gaus(1. ,0.02);

cur*= gRandom->Gaus(1. ,0.01);

\\ ghi vào ntuple

cond_data.Fill(pot , cur , temp , pres);

}

\\ mở 1 file, nếu chưa có thì tạo ra 1 file

Tfile ofile(“conductivity_experiment.root”,”RECREATE”);

cond_data.Write();

ofile.Close();

}

Bây giờ, nếu muốn chạy file này, ta gõ vào cửa sổ terminal

root [0] .x ntuple_expample.c

Chương trình sẽ chạy và sẽ tạo ra 1 file có tên là conductivity_experiment.root chứa các dữ liệu mà

chúng ta đã tạo ra, file này có thể được dùng rất thuận tiện, chẳng hạn khi ta gõ

root[1] TFile f(“conductivity_experiment.root”)

root [2] cond_data.Draw(“Current:Potential”)

hoặc có thể thêm điều kiện vào như thế này

root [3] cond_data.Draw(“Current:Potential”,”Temperature<270”)

hoặc là như thế này

root [4] cond_data.Draw()”Current/Potential:Temparature”)

Chương 6: Graphics

Chương này sẽ hướng dẫn cách thức để vẽ các

dạng khác nhau, chẳng hạn như là thêm chữ lên bản vẽ

6.1 Vẽ từ Terminal và Script

Vẽ 1 đường thẳng nối 2 điểm ( 1 , 2 ) và ( 3 , 4 )

root [1] TLine L1(1 2, 3, 4); L1.Draw();

Vẽ 1 khung chữ nhật

root [2] TBox b1(1 2, 3, 4); b1.Draw();

Vẽ một mũi tên

root [3] TArrow a1(1, 2, 3, 4); a1.Draw();

Nếu muốn vẽ mũi tên 2 chiều

root [4] a1.SetOption("<>"); a1.Draw();

Hoặc là có thể vẽ mũi tên 2 chiều trực tiếp

root [5] TArrow a1(1, 2, 3, 4, 0.05, "<>"); a1.Draw();

trong đó 0.05 là độ lớn, mặc định là 0.05

Vẽ 1 vòng tròn bán kính 2 tại điểm ( 4 , 5 )

root [6] TArc ar1(4, 5, 2); ar1.Draw();

thêm chữ

root [8] TText t1(2, 3, "root-system is easy which even monkeys can use"); t1.Draw();

6.2 Graphics Editor

Tất cả những thứ được trình bày trong mục 6.1

đều có thể làm được với graphic editor, nó rất tốt

theo một khía cạnh nào đó, để làm xuất hiện graphic

editor, click vào Editor -> Edit trên thanh menu của

canvas.

Nhớ click và giữ chuột rồi rê đến vị trí Edit

6.3 Thay đổi thuộc tính

Nếu muốn thay thuộc tính của các hình đã vẽ thì chỉ việc nhấp chuột phải vào hình muốn thay đổi,

một hộp thoại sẽ xuất hiện liệt kê những thuộc tính mà ta có thể thay đổi được

Chương 7: Các thủ thuật

Chương này hướng dẫn một số thủ thuật tinh chỉnh

7.1 Chia màn hình

Khi muốn vẽ nhiều hơn 1 histogram, chúng ta sẽ cần chia canvas ra, chúng ta sẹ tạo ra 1 canvas kích

thước 800x800 trước rồi sau đó chia nó ra làm 4

root [0] Tcanvas c1(“Name”,”Title”,800,800);

root [1] c1.Divide(2,2);

4 mảnh nhỏ được tạo ra sẽ được tự động đánh số từ trái sang phải và từ trên xuống dưới

root [2] c1.cd(1); \\ di chuyển đến pad thứ nhất

root [3] TF1 f1("f1", "sin(x)", -2, 2); f1.Draw();\\ vẽ vào pad thứ nhất

root [4] c1.cd(4);\\ di chuyển đến pad thứ 4

root [5] TF1 f2("f2", "cos(x)", -2, 2); f2.Draw();\\ vẽ vào pad thứ 4

Hình 7.1 : mỗi histogram được vẽ vào 1 pad

7.2 Trục tọa độ

Khi chúng ta tạo ra một histogram 1 chiều TH1F đồng thời ta cũng định nghĩa luôn khoảng biểu diễn

trên trục hoành, để hay đổi khoảng giá trị được biểu diễn trên trục tung, ta thực hiện như sau

root [8] TH1F hist(“hist”,”title of hist”,2,350,500);

root [9] hist.SetMinimun(10.0);

root [10] hist.SetMaximum(100.0);

root [11] c1.cd(2); hist.Draw();

Cũng có thể được biểu diễn theo hàm log

root [12] TCanvas c2(“c2”,”title”);

root [13] hist2 = new TH1F(“h2”,”title of h2”,100,-10,10);

root [14] hist2.Fillrandom(“gaus”,1000);

root [15] hist2.Draw();

root [16] c2.SetLogx();

root [17] c2.SetLogy();

nếu muốn trở về tọa độ trục bình thường

root [18] c2.SetLog(0);

root [19] c2.SetLog(0);

Kẻ ô trong histogram với lệnh

root [20] c2.SetGridx();

root [21] c2.SetGridy();

7.3 Tiêu đề

Ở phía trên cùng của canvas khi chúng ta vẽ bằng ROOT sẽ có 1 tiêu đề cho mỗi hình, chúng ta có

thể thêm vào 1 tiêu đề to hơn, chẳng hạn

root [0] TCanvas c1("c1", "Title", 50, 50, 700, 500);

root [1] TPaveLabel l1(0.3, 0.91, 0.7, 0.99, "Global Title");

root [2] l1.Draw();

root [3] TPad p1("p1", "title", 0, 0, 1, 0.9); p1.Draw(); p1.cd();

đây là một cách rất tiện lợi, tiêu đề đã có sẵn ở đó dù chúng ta có làm gì đi nữa, khi code hay vẽ, để hiểu

được tác dụng của các con số ở trên thì các bạn hãy thay đổi nó và tự rút ra kết luận cho mình.

Nếu như muốn thay đổi font chữ thì

root [4] TF1 f1(“f1”,”sin(x)”,-3,3); f1. Draw();

root [5] TPaveText* t1 = gROOT.FindObject(“title”);

root [6] t1.SetTextFont(131);\\chỉnh font

root [7] t1.SetN1NDC(0.4); t1.SetX2NDC(0.6);\\ chỉnh vị trí đặt title

root [8] t1.Draw();

Để gán nhãn cho hệ trục tọa độ, chẳng hạn như trục x là kênh, còn trục y là số đếm

root [9] h1.SetXTitle(“counts”);

root [10] h1.SetYTitle(“channels”);

Tinh chỉnh kích thước, font của title

root [11] h1.GetXaxis()->SetLabelFont(112);

root [12] h1.GetXaxis()->SetTitleOffset(0.5);

root [13] h1.SetXaxis()->SetTitleSize(0.07);

Nếu như ta muốn viết 1 dòng chữ vào trong bản vẽ

root [14] Ttext t1(1.8, 0.44, “text here”); t1.Draw();

bằng cách đó chúng ta đã thêm vào bản vẽ tại vị trí (1.8, 0.44) một dòng chữ “text here”, nếu muốn

thay đổi font chữ hay kích thước, có thể dùng lệnh SetTextFont() và SetTextSize() cho t1.

7.4 Sửa đổi biểu đồ

Khi ta biểu diễn nhiều dữ liệu trên cùng 1 biểu đồ để so sánh với nhau thì thay đổi màu sắc của chúng

rất hữu dụng

root [15] h1.SetFillColor(2);

root[16] h1.SetFillStyle(3002); h1.Draw();

Để vẽ cả h1 và h2 lên cùng 1 đồ thị và phân biệt chúng bằng các màu khác nhau thì ra viết như sau

root[17] h1.SetFillColor(2);

root [18] h1.SetFillStyle(3002); h1.Draw();

root [19] h2.SetFillColor(4);

root [20] h2.SetFillStyle(3002); h2.Draw(“SAME”);

và nếu muốn thay đổi độ dày

root [21] h1.SetWidth(5); h1.Draw();

7.5 Sửa đổi Graph

Đối với graph, chúng ta có thể tùy ý thay đổi độ dày, màu sắc, font chữ, kích cỡ chữ 1 cách tùy ý

root [22] graph.SetFillColor(5);

root [23] graph.SetLineColor(3);

root [24] graph.SetLineWidth(4);

root [25] graph.SetMarkerColor(6); graph.Draw("ALP");

7.6 Global Style

Có rất nhiều lệnh cho phép thay đổi thuộc tính của THistogram hay TGraph, tất cả chúng đều bắt

nguồn từ TSyle*gStyle, chúng ta có thể thay đổi diện mạo của tất cả chỉ với

root [26] gROOT->SetStyle(“Plain”);

7.7 Hoàn thành

Đối với các lệnh hay các biến đã được định nghĩa săn, có thể sử dụng phím TAB để hoàn thành nó

giống như trong terminal shell

root[27] .x gr

hãy nhấn phím TAB để hoàn thành nốt lệnh này, nếu vẫn chưa xác định cụ thể thì ROOT sẽ liệt kê ra

một danh sách các khả năng có thể chọn để hoàn thành lệnh này

Chương 8: Xuất và chỉnh sửa Sourcefile

Trong chương này, chúng ta sẽ tìm hiểu các file

EPS, GIF hay PostScript, và cách thức sử dụng “macro”

8.1 Xuất file

Để xuất ra 1 hình được vẽ trong ROOT - TCanvas c1, cú pháp như sau

root[10] c1.Print(“filename.ps”);

như vậy là trong thư mục đang làm việc (trong trường hợp của tôi là home/thnam/root) 1 file có tên là

“filename.ps”

Tưng tự như thế, nếu muốn có 1 file định dạng gif hay eps để dùng cho các bản in, ví dụ như các hình

ảnh tôi dùng khi viết cái hướng dẫn này, hình ảnh được xuất ra dưới định dạng eps

8.2 Tạo Sourcefile

Như các bạn cũng nhận thấy từ đầu đến giờ, gõ các lệnh nhiều dòng ngay trên cửa sổ ROOT rất phiền

hả và khó sửa chữa khi đánh sai, có những thao tác xử lý thường dài đến cả trăm dòng, không thể nào gõ

hết từng đó dòng trực tiếp vào của sổ ROOT được, chúng ta sẽ gõ vào trong một file nguồn gọi là macro.

Chẳng hạn ở đây, tôi sẽ tạo ra 1 file có tên là graph.cc

#include <fstream.h>

void graph()

{

c1 = new TCanvas("c1", "Title", 0, 0, 700, 500);

c1->SetGridx();

c1->SetGridy();

c1->SetFillColor(0);

c1->Draw();

vlhn = new TH1F("vlhn", "Title", 2, 350, 550);

vlhn->SetMinimum(20.0);

vlhn->SetMaximum(110.0);

vlhn->SetDirectory(0);

vlhn->SetTitleOffset(1.2);

vlhn->SetXTitle("Wavelength");

vlhn->SetYTitle("Transparency");

vlhn->Draw("A");

ifstream data("2dhist.dat");

float x[500], y[500];

int event = 0;

while (data >> x[event] >> y[event])

event++;

g1 = new TGraph(event, x, y);

g1->Draw("LP");

c1->Update();

c1->Print();

}

để chạy nó, chúng ta lưu rồi chạy

root [0] .x graph.cc

trong đó, giả định là chúng ta đã có file dữ liệu “2dhist.dat” rồi

8.3 ~/.root_hist

Khi chúng ta thoát khỏi ROOT thì sẽ có một file .root_hist được tạo ra trong thư mục home, nó lưu lại

toàn bộ những thao tác của chúng ta trước khi thoát khỏi root, như vậy sẽ tiện lợi khi chúng ta quay trở lại

ROOT và biết được chúng ta đã làm những gì

Chương 9: Sử dụng C++ để phân tích Tree

Chương này trình bày về các sử dụng 1

class library trong ROOT, g++ của cxx chẳng hạn

Ở đây, chúng ta không nhất thiết phải là 1 chuyên gia về c++, chúng ta chỉ cần 1 phần rất nhỏ để có thể

thực hiện các bước phân tích dữ liệu.

Chúng ta sẽ bắt đầu lại từ đâu, thoát khỏi ROOT và chạy nó lại. Mở 1 file root lên

root [0] Tfile myFile(“experiment.root”)

file này các bạn có thể download về ở đây

http://www.nevis.columbia.edu/~seligman/root-class/files/

bây giờ tạo ra 1 file macro bằng lệnh MakeClass

root [1] tree1->MakeClass(“Analyze”)

ngay lập tức, chúng ta sẽ có 2 file

Analyze.h và Analyze.c

công việc của chúng ta là sẽ thao tác với 2 file này, cấu trúc của nó cũng giống như các sourcefile khác,

có 3 phần

phần khai báo (phần mở đầu)

phần thao tác (phần thân)

phần xuất kết quả (phần cuối)

bây giờ, mở file Analyze.c lên ta sẽ thấy như sau

#define Analyze_cxx

#include "Analyze.h"

#include <TH2.h>

#include <TStyle.h>

#include <TCanvas.h>

void Analyze::Loop()

{

// In a ROOT session, you can do:

// Root > .L Analyze.C

// Root > Analyze t

// Root > t.GetEntry(12); // Fill t data members with entry number 12

// Root > t.Show(); // Show values of entry 12

// Root > t.Show(16); // Read and show values of entry 16

// Root > t.Loop(); // Loop on all entries

//

// This is the loop skeleton where:

// jentry is the global entry number in the chain

// ientry is the entry number in the current Tree

// Note that the argument to GetEntry must be:

// jentry for TChain::GetEntry

// ientry for TTree::GetEntry and TBranch::GetEntry

//

// To read only selected branches, Insert statements like:

// METHOD1:

// fChain->SetBranchStatus("*",0); // disable all branches

// fChain->SetBranchStatus("branchname",1); // activate branchname

// METHOD2: replace line

// fChain->GetEntry(jentry); //read all branches

//by b_branchname->GetEntry(ientry); //read only this branch

if (fChain == 0) return;

// Thêm các khai báo vào đây Long64_t nentries = fChain->GetEntriesFast();

Long64_t nbytes = 0, nb = 0;

for (Long64_t jentry=0; jentry<nentries;jentry++) {

Long64_t ientry = LoadTree(jentry);

if (ientry < 0) break;

nb = fChain->GetEntry(jentry); nbytes += nb;

// if (Cut(ientry) < 0) continue;

// Thêm các lệnh thực thi tại đây }

// Xuất kết quả tại đây }

Nếu để nguyên như thế thì file macro này vẫn chưa làm gì cả, nhưng nếu chúng ta thêm vào các lệnh c++

thì nó sẽ thực hiện các lệnh đó, đây chính là cách xử lý dữ liệu,