ROOT宏读取Tree分支获取错误值的问题求助
ROOT宏读取Tree分支值错误的解决方法
我编写ROOT宏读取名为h76的Tree,仅关注ntrack、pT、PID三个分支,但宏读取打印的值与命令行执行h76->Show(1)得到的正确值不匹配。
我的代码如下:
#define N_PID 10000 void pTdist() { Double_t pT; int i; Int_t PID[N_PID]; Int_t ntrack; //Number of particles in one event TFile *file = new TFile("PROVA0.root","read"); file->ls(); TTree * Tout= (TTree*)file->Get("h76"); Tout->Print(); Int_t nentries=Tout->GetEntries(); Tout->SetBranchStatus("*", false); //Tout->SetBranchStatus("ntrack", true); //In the ROOT tutorial it says that this operation is necessary but if I do it gives me error //Tout->SetBranchStatus("PID", true); //Tout->SetBranchStatus("pT", true); cout << " nentries = " << nentries << endl; //Here prints the correct number of entries Tout->SetBranchAddress("ntrack",&ntrack); Tout->SetBranchAddress("pT",&pT); Tout->SetBranchAddress("PID",&PID); //Fino a qui funziona tutto in teoria for( i=0;i< 10;i++) { //cout << i << endl; Tout->GetEntry(i); // printf("%d %d\n",ntrack,i); } }
问题原因及解决步骤
分支未启用
你调用了Tout->SetBranchStatus("*", false)关闭了所有分支,但注释了启用目标分支的代码,导致GetEntry无法读取对应分支的数据。取消注释并确保分支名与Tree中完全一致(注意大小写):Tout->SetBranchStatus("ntrack", true); Tout->SetBranchStatus("PID", true); Tout->SetBranchStatus("pT", true);如果启用分支时报错,先通过
Tout->Print()输出的分支列表核对名称是否正确。变量类型不匹配
从场景看,pT应该是与ntrack对应的数组(每个事件的每个粒子对应一个pT值),但你定义的是单个Double_t pT,这会导致内存读取错误。将其改为数组:Double_t pT[N_PID];数组地址传递错误
数组类型的分支设置地址时,直接传递数组名即可(数组名本身就是指针),不需要加&:Tout->SetBranchAddress("pT", pT); Tout->SetBranchAddress("PID", PID);增加安全检查
补充文件和Tree的空指针检查,避免程序崩溃:if (!file || file->IsZombie()) { cerr << "无法打开文件PROVA0.root" << endl; return; } if (!Tout) { cerr << "找不到Tree h76" << endl; file->Close(); return; }
修改后的完整代码
#define N_PID 10000 void pTdist() { Double_t pT[N_PID]; int i, j; Int_t PID[N_PID]; Int_t ntrack; TFile *file = new TFile("PROVA0.root","read"); if (!file || file->IsZombie()) { cerr << "无法打开文件PROVA0.root" << endl; return; } file->ls(); TTree *Tout = (TTree*)file->Get("h76"); if (!Tout) { cerr << "找不到Tree h76" << endl; file->Close(); return; } Tout->Print(); Int_t nentries = Tout->GetEntries(); Tout->SetBranchStatus("*", false); Tout->SetBranchStatus("ntrack", true); Tout->SetBranchStatus("PID", true); Tout->SetBranchStatus("pT", true); cout << " nentries = " << nentries << endl; Tout->SetBranchAddress("ntrack", &ntrack); Tout->SetBranchAddress("pT", pT); Tout->SetBranchAddress("PID", PID); for (i=0; i<10; i++) { Tout->GetEntry(i); printf("条目%d: ntrack = %d\n", i, ntrack); // 打印每个粒子的PID和pT for (j=0; j<ntrack; j++) { printf(" 粒子%d: PID=%d, pT=%.4lf\n", j, PID[j], pT[j]); } } file->Close(); }
内容的提问来源于stack exchange,提问作者NPucc
相关产品推荐
相关产品推荐

