You are on page 1of 17

GEANT4

(GEometry ANd Tracking )


Geant4 is a toolkit for the simulation of the passage of particles
through matter. )

LECTURE 2
1. Lập trình C++
2. Các bài tập về Monte-Carlo

1
1. Lập trình C++
http://www.cplusplus.com/doc/tutorial/
Viết chương trình và biên dịch trong hệ điều hành Ubuntu
Viết chương trình: chao.cc //baitap0.cc

// my first program in C++ Biên dịch chương trình


# include <iostream> // Khai bao thu vien >make chao
using namespace std; Chạy chương trình
int main () >./ chao
{
cout << "Hello World!";
return 0;
}

Kết quả xuất ra màn hình:


Hello World!
Trang web học c++
https://www.cplusplus.com/doc/tutorial/
Function trong c++
Viết hàm tổng a + b
// function example
#include <iostream>
using namespace std;

int addition (int a, int b)


int main () {
int z;
z = addition (5,3);
cout << "The result is " << z;
return 0;
}

int addition (int a, int b) {


int r;
r=a+b;
return r;
}
4
TÍNH DIỆN TÍCH HÌNH CHỮ NHẬT
Tính diện tích hình chữ nhật. Viết chương trình c++, theo phương pháp lớp (class).
area = x.y

// example: one class


#include <iostream>
using namespace std; / / Chuong trinh con
void CRectangle::set_values (int a, int b)
class CRectangle { {
int x, y, result; x = a;
public: y = b;
void set_values (int,int); }
int area();
}; int CRectangle::area ()
{
// Chuong trinh trinh result=x*y;
int main () { return result;
// CRectangle la type; rect la bien (variable) }
CRectangle rect;
rect.set_values (3,4);
cout << "rect area: " << rect.area() << endl;

return 0;
}
2. Các bài tập về Monte-Carlo

6
Bài tập 1: Xây dựng phương trình y(x) = x2 trong khoảng x=[-2;2]
bằng phương pháp Monte-Carlo.
- Viết chương trình c++ và vẽ phổ.
- Kiểm tra kết quả bằng cách fit hàm bậc 2 và đánh giá.

Bài tập 2:
Xây dựng phân bố gaussian chuẩn (standard Gaussian distribution)
sử dụng phương pháp Monte Carlo.
- Viết chương trình C++ và vẽ phổ.
- Kiểm tra kết quả bằng cách fit hàm Gaussian và đánh giá.

Bài tập 3: Tạo phổ gamma dựa vào phổ thực nghiệm bằng Monte-
Carlo. Hệ đo gamma 1024 kênh (MCA-10 bits).
- Viết chương trình C++ và vẽ phổ.
- Khảo sát dạng phổ ở những số đếm khác nhau.
7
Bài tập 1: Xây dựng phương trình y(x) = x2 trong khoảng
x=[-2;2].

- Viết chương trình c++ và vẽ phổ.

- Kiểm tra kết quả bằng cách fit hàm bậc 2 và đánh giá.

8
Phương pháp:
Chọn
đúng x, Y được
Gieo số ngẫu chọn
Tính y(x)=x2 So sánh
nhiên uniform
Y<y?
(x,y)
sai
x=[-2;2] Loại
Y=[0;4]
Loại
Lặp lại

Max Y(x) = 4

Loại

-2 Chọn 2 9
x
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
using namespace std;

#define Nevent 100000

int main ()
{
float ran1,ran2;
float x,Y,y;
int i;
ofstream luufile;
luufile.open ("C:/Users/Administrator/Desktop/data.txt");

/* initialize random seed: */


srand (time(NULL));

i=0;
while (i<Nevent)
{
//Gieo so ngau nhien 0 -> 1
ran1=(float)rand()/RAND_MAX; //random 0 -> 1
ran2=(float)rand()/RAND_MAX; //random 0 -> 1
// Gieo x va Y
x=ran1*4-2; //random -2 -> 2
Y=ran2*4; //random 0 -> 4
//tinh y(x) theo x
y=x*x;
if (Y < y ) {
cout<<x<<"\t"<<Y<<"\t"<<y<<endl; // Xuat ra man hinh
luufile<<x<<endl; //Luu vao file data

i=i+1;
}

}
luufile.close();
return 0; 10
}
Bài tập 2:
Xây dựng phân bố gaussian chuẩn (standard Gaussian
distribution) sử dụng phương pháp Monte Carlo.

- Viết chương trình C++ và vẽ phổ.


- Kiểm tra kết quả bằng cách fit hàm Gaussian và đánh
giá.

11
Phương pháp:
Ly thuyet:
Normal (or Gaussian) distribution:
Phuong phap: Monte Carlo

r1, r2 la random ngau nhien trong


khoang (0,1)
Standard Normal distribution ( = 0;  = 1) x1 = sqrt(-2.0*ln(r1))
x2 =sin (2.0*Pi*r2)
gauss = x1* x2

Tính
Gieo số ngẫu nhiên Tính
x1 = sqrt(-2.0*ln(r1))
uniform (r1, r2) gauss = x1* x2
x2 =sin (2.0*Pi*r2)

r1=[0;1]
r2=[0;1]

Lặp lại

12
gauss.cc
#include <iostream>
#include <cmath>
#include <cstdlib> Du lieu xuat ra
#include <ctime>
#include <fstream>
using namespace std;
float r1,r2,x1,x2,gauss;
float Pi=3.141592;

int main ()
{
Vẽ phổ
ofstream luufile;
luufile.open ("data.txt");

/* initialize random seed: */

counts
srand (time(NULL));

for (int n=0;n<2;n++)


{
/* Xay dung standard Gauss simulation*/

r1=(float)rand()/RAND_MAX; //random 0 -> 1


r2=(float)rand()/RAND_MAX; //random 0 -> 1
x1=sqrt(-2.*log(r1));
x2=sin(2.*Pi*r2);
gauss=x1*x2;
// Xuat so lieu ra man hinh
cout<<r1<<"\n"<<r2<<endl;
cout<< x1<<"\n"<<x2<<endl;
cout<<gauss<<endl;
// luu so lieu vao file data.txt
luufile<<gauss<<"\n";

r1=0.;r2=0.;x1=0.;x2=0.;gauss=0.; gauss
}

luufile.close();
return 0;
}
13
Bài tập 3: Tạo phổ gamma dựa vào phổ thực nghiệm bằng Monte-Carlo.
Hệ đo gamma 1024 kênh (MCA-10 bits).

- Viết chương trình C++ và vẽ phổ.

- Khảo sát dạng phổ ở những số đếm khác nhau.

14000
(400;13305) Thời gian đo: 10 phút
12000 Tổng số đếm: 843906
y (Số đếm/kênh)

10000

8000

6000

4000

2000

0
0 200 400 600 800 1000
x (Số kênh)
14
Phương pháp:

- Xác định số đếm có giá trị lớn nhất và vị trí kênh (x, Max_y) – (400;13305).
- Chuẩn giá trị ymax về 1. Các y(x) chuẩn theo ymax (chuẩn về 1). Cụ thể: y(x)/13305.

Chọn
đúng x, Y được
Gieo số ngẫu chọn
So sánh
nhiên uniform
Y<y?
(x,y)
Loại
x=[0;1024] Loại
Y=[0;1]

Lặp lại

15
// Xay dung pho thuc nghiem gamma su dung phuong phap Monte - Carlo /* initialize random seed: */
// Lecturer: V.H.Hai srand (time(NULL));
#include <iostream> ////////////////////////////
#include <cmath>
#include <cstdlib> i=0;
#include <ctime> while (i<Nevent)
#include <fstream> {
using namespace std; //Gieo so ngau nhien 0 -> 1
#define Nevent 843906 ran1=(float)rand()/RAND_MAX; //random
#define y_max 13305 0 -> 1
int main () ran2=(float)rand()/RAND_MAX; //random
{ 0 -> 1
float ran1,ran2, Y; // Gieo x va Y
int x; x=int(ran1*1023); //random 0 ->1024
float y[1024];
int i; Y=ran2; //random 0 -> 1

ofstream luufile; //So sanh Y va y[x]


luufile.open ("C:/Users/Administrator/Desktop/data.txt"); // luu file if (Y<y[x])
ifstream mofile("D:/radiation_detector_lession/data_RI/cs137.txt"); // Mo file {
cout << x << endl;
// Mo file pho////////////////////
for (int i=0;i<1024;i++) luufile << x << endl;
{ i=i+1;
if (mofile.is_open()) }
{ }
mofile>>y[i];
y[i]=y[i]/y_max; // chuan y_max ve 1; cac y[i] chuan theo y_max luufile.close();
}
else cout<<"Unable to open file";
} return 0;
//////////////////////////////// }

16
y (Số đếm/kênh)

y (Số đếm/kênh)
Monte-Carlo
Kết quả mô phỏng
Monte-Carlo
Số đếm: 84396
Thời gian: 1 phút
y (Số đếm/kênh)

x (Số kênh) x (Số kênh)


14000
12000
10000
8000
Phổ thực nghiệm
6000
4000
2000
x (Số kênh)
0 17
0 200 400 600 800 1000

You might also like