%jsroot on
//%jsroot on//本代码用于读取粒子(12C)在介质(水)中能损与能量的关系
ifstream in("12C-H2O-energyloss.txt");//读的方式打开文件
string ss;//string字符串ss;
double a, b, e, dedx;
auto * g_12C = new TGraph;//创建名为g_12C的Graph;
TCanvas c;//创建画布;
if(!in.is_open())//文件对象与文件绑定,!in.is_open-非空,"!"为非,此处可理解为未打开文件;
{
cout<<"Data File dose not exist!"<<endl;
return 0;
}
getline(in,ss);//读取in文件的一行到ss;
int i = 0;
while(!in.eof())//in.eof():读到文件结束符时返回true。!in.eof()--文件未读到结尾;
{
in>>a>>b>>e>>dedx>>a>>b>>a>>b>>a>>b>>a>>b;//in文件逐行读入a、b、e、dedx
g_12C->SetPoint(i,e*12,dedx*1000);//在图g_12C中添加数据点
i++;
}
g_12C->SetTitle("dE/dx (MeV/mm) vs. MeV for 12C in water");
g_12C->SetLineColor(kGreen);
g_12C->Draw();
gPad->SetLogy();
gPad->SetLogx();
c.Draw();
in.close();
cout<<"0.15 MeV的12C在水中的de/dx:"<<g_12C->Eval(0.15)<<"MeV/mm;"<<endl;
//%jsroot on;//本行代码用于计算12C-Bragg curve:需要利用上述代码,采用方法1计算(delta_E=delta_E/delta_x(E)*delta_
Double_t e_r_12C1 = 3022.;//MeV:12C总能量(剩余能量);
Double_t dx_12C1 = 0.001;//mm:穿透每个切片的厚度;
Double_t x_12C1=0.0;//mm:穿透总厚度
auto * Bragg_12C1 = new TGraph;
TCanvas c1;
Int_t j_12C1 =0;
//cout<<g_12C->Eval(e_r_12C1)<<endl;//测试上部分代码是否可以继承,测试结果可以继承;
while(e_r_12C1>0)
{
Bragg_12C1->SetPoint(j_12C1,x_12C1,g_12C->Eval(e_r_12C1));//写入穿透该切片前位置与dedx
j_12C1++;//下一切片;
x_12C1=j_12C1*dx_12C1;//穿透该切片后位置;
e_r_12C1=e_r_12C1-dx_12C1*g_12C->Eval(e_r_12C1);//穿透切片后剩余能量;
}
Bragg_12C1->SetPoint(j_12C1,x_12C1,0);//写入12C能量全部沉积后的位置与dedx;
Bragg_12C1->SetTitle("dE/dx (MeV/mm) vs. mm for 12C in water with method1");
Bragg_12C1->SetLineColor(kGreen);
Bragg_12C1->Draw();
gPad->SetLogy();
c1.Draw();
cout<<"方法1:能量为"<<e_r_12C1<<" MeV的12C在水中的穿透深度为"<<x_12C1<<" mm;"<<endl;
//%jsroot on;//本行代码用于计算12C-Bragg curve:需要利用上述代码,采用方法2计算(*delta_x=delta_E/(delta_E/delta_x(E))
Double_t e_r_12C2 = 3022.;//MeV
Double_t de_12C2 = 0.1;//MeV
Double_t dx_12C2=0;//mm
Double_t x_12C2=0;//mm
auto * Bragg_12C2 = new TGraph;
TCanvas c2;
Int_t j_12C2 =0;
while(e_r_12C2>0)
{
Bragg_12C2->SetPoint(j_12C2,x_12C2,g_12C->Eval(e_r_12C2));
j_12C2++;
dx_12C2=de_12C2/g_12C->Eval(e_r_12C2);
x_12C2=x_12C2+dx_12C2;
e_r_12C2=e_r_12C2-de_12C2;
}
Bragg_12C2->SetPoint(j_12C2,x_12C2,0);
Bragg_12C2->SetTitle("dE/dx (MeV/mm) vs. mm for 12C in water with method2");
Bragg_12C2->SetLineColor(kBlue);
Bragg_12C2->Draw();
gPad->SetLogy();
c2.Draw();
cout<<x_12C2<<endl;
cout<<"方法2:能量为"<<e_r_12C2<<" MeV的12C在水中的穿透深度为"<<x_12C2<<" mm;"<<endl;
//%jsroot on//本代码用于读取粒子(p)在介质(水)中能损与能量的关系
ifstream in_p("p-H2O-energyloss.txt");
string ss_p;
double a_p, b_p, e_p, dedx_p;
auto * g_p = new TGraph;
TCanvas c0;
if(!in_p.is_open())
{
cout<<"Data File dose not exist!"<<endl;
return 0;
}
getline(in_p,ss_p);
int i_p = 0;
while(!in_p.eof())
{
in_p>>a_p>>b_p>>e_p>>dedx_p>>a_p>>b_p>>a_p>>b_p>>a_p>>b_p>>a_p>>b_p;
g_p->SetPoint(i_p,e_p*12,dedx_p*1000);
i_p++;
}
g_p->SetTitle("dE/dx (MeV/mm) vs. MeV for p in water");
g_p->SetLineColor(kGreen);
g_p->Draw();
gPad->SetLogy();
gPad->SetLogx();
c0.Draw();
in_p.close();
cout<<"0.15 MeV的质子在水中的de/dx:"<<g_p->Eval(0.15)<<"MeV/mm;"<<endl;
//%jsroot on;//本行代码用于计算p-Bragg curve:需要利用上述代码,采用方法1计算(delta_E=delta_E/delta_x(E)*delta_x
Double_t e_r_p1 = 400.;//MeV:p总能量(剩余能量);
Double_t dx_p1 = 0.001;//mm:穿透每个切片的厚度;
Double_t x_p1 = 0.0;//mm:穿透总厚度
auto * Bragg_p1 = new TGraph;
TCanvas c3;
Int_t j_p1 =0;
while(e_r_p1>0)
{
Bragg_p1->SetPoint(j_p1,x_p1,g_p->Eval(e_r_p1));//写入穿透该切片前位置与dedx
j_p1++;//下一切片;
x_p1=j_p1*dx_p1;//穿透该切片后位置;
e_r_p1=e_r_p1-dx_p1*g_p->Eval(e_r_p1);//穿透切片后剩余能量;
}
Bragg_p1->SetPoint(j_p1,x_p1,0);//写入12C能量全部沉积后的位置与dedx;
Bragg_p1->SetTitle("dE/dx (MeV/mm) vs. mm for p in water with method1");
Bragg_p1->SetLineColor(kRed);
Bragg_p1->GetYaxis()->SetRangeUser(0.1,1000);
Bragg_p1->Draw();
gPad->SetLogy();
c3.Draw();
cout<<"方法1:能量为"<<e_r_p1<<" MeV的12C在水中的穿透深度为"<<x_p1<<" mm;"<<endl;
//%jsroot on;//本行代码用于计算12C-Bragg curve:需要利用上述代码,采用方法2计算(*delta_x=delta_E/(delta_E/delta_x(E))
Double_t e_r_p2 = 399.3;//MeV
Double_t de_p2 =0.1;//MeV
Double_t dx_p2=0;//mm
Double_t x_p2=0;//mm
auto * Bragg_p2 = new TGraph;
TCanvas c4;
Int_t j_p2 =0;
while(e_r_p2>0)
{
Bragg_p2->SetPoint(j_p2,x_p2,g_p->Eval(e_r_p2));
j_p2++;
dx_p2=de_p2/g_p->Eval(e_r_p2);
x_p2=x_p2+dx_p2;
e_r_p2=e_r_p2-de_p2;
}
Bragg_p2->SetPoint(j_p2,x_p2,0);
Bragg_p2->SetTitle("dE/dx (MeV/mm) vs. mm for p in water with method2");
Bragg_p2->SetLineColor(kYellow);
Bragg_p2->GetYaxis()->SetRangeUser(0.1,1000);
Bragg_p2->Draw();
gPad->SetLogy();
c4.Draw();
cout<<"方法1:能量为"<<e_r_p2<<" MeV的12C在水中的穿透深度为"<<x_p2<<" mm;"<<endl;
//%jsroot on
TCanvas c5;
Bragg_12C1->Draw();
Bragg_12C1->GetYaxis()->SetRangeUser(0.1,1000);
Bragg_12C1->SetTitle("dE/dx (MeV/mm) vs. mm for p(red) and 12C (Green)in water with method1");
Bragg_p1->Draw("same");
gPad->SetLogy();
c5.Draw();
//%jsroot on
TCanvas c6;
Bragg_12C2->Draw();
Bragg_12C2->GetYaxis()->SetRangeUser(0.1,1000);
Bragg_12C2->SetTitle("dE/dx (MeV/mm) vs. mm for p(Yellow) and 12C (blue)in water with method2");
Bragg_p2->Draw("same");
gPad->SetLogy();
c6.Draw();
!jupyter nbconvert BraggCurve.ipynb --to html