Upload
tran-hai-nam
View
38
Download
4
Embed Size (px)
DESCRIPTION
root system
Citation preview
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
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);
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,