ROOT学习遇代码问题:TF1标记不显示及宏执行报错求助
ROOT代码问题解决方案
问题1:TF1标记样式不显示
- 问题原因:
TF1::Draw()默认仅绘制函数曲线(线条模式),不会渲染标记样式,和ROOT库缺失无关。要显示标记,需在Draw()中指定绘制选项,比如"PL"(同时绘制线条和标记)或"P"(仅绘制标记)。 - 修改后的完整代码:
{ c1 = new TCanvas("c1", "My Root Plots",600, 400); c1->Divide(2,2); c1->cd(1); f=new TF1("f","[0]*exp(-0.5*((x-[1])/[2])**2)/(sqrt(2.0*TMath::Pi())*[2])",-100,100); f->SetTitle("Gaus;X axis ;Y axis"); f->SetParameter(0,0.5*sqrt(2*TMath::Pi())); f->SetParameter(1,8); f->SetParameter(2,5); f->SetLineColor(3); f->SetMarkerColor(1); f->SetMarkerStyle(kOpenStar); f->SetMarkerSize(5); f->Draw("PL"); // 添加"PL"选项同时绘制线条和标记 c1->cd(2); f1 = new TF1("f1", "[0]*x+[1]", 0,50); f1->SetParameters(10,4); f1->SetLineColor(5); f1->SetTitle("ax+b;x;y"); f1->Draw(); }
问题2:宏运行报错无法执行
- 问题原因:
- 宏文件名与函数名不匹配:你的函数是
testRandom,但文件名是main.cpp,ROOT默认会寻找与文件名同名的函数或main(),因此找不到执行入口。 - 默认循环次数
500000000(5亿)过大,会导致程序卡死或运行极慢。
- 宏文件名与函数名不匹配:你的函数是
- 解决步骤:
- 将宏文件重命名为
testRandom.cpp(与函数名一致)。 - 降低默认循环次数,比如改为
500000(50万),避免资源占用过高。 - 运行方式:
- 在ROOT终端输入
.x testRandom.cpp,直接使用默认参数执行函数; - 或先输入
.L testRandom.cpp加载宏,再手动调用testRandom(100000)指定自定义参数运行。
- 在ROOT终端输入
- 将宏文件重命名为
- 修改后的代码开头:
void testRandom(Int_t nrEvents=500000) { // 降低默认循环次数 TRandom *r1=new TRandom(); TRandom2 *r2=new TRandom2(); TRandom3 *r3=new TRandom3(); TCanvas* c1=new TCanvas("c1","TRandom Number Generators", 800,600); c1->Divide(3,1); TH1D *h1=new TH1D("h1","TRandom",500,0,1); TH1D *h2=new TH1D("h2","TRandom2",500,0,1); TH1D *h3=new TH1D("h3","TRandom3",500,0,1); TStopwatch *st=new TStopwatch(); st->Start(); for (Int_t i=0; i<nrEvents; i++) { h1->Fill(r1->Uniform(0,1)); } st->Stop(); cout << "Random: " << st->CpuTime() << endl; st->Start(); c1->cd(1); h1->SetFillColor(kRed+1); h1->SetMinimum(0); h1->Draw(); // 后续代码保持不变 }
内容的提问来源于stack exchange,提问作者user20233932
相关产品推荐
相关产品推荐

