You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

问题原因及解决步骤

  1. 分支未启用
    你调用了Tout->SetBranchStatus("*", false)关闭了所有分支,但注释了启用目标分支的代码,导致GetEntry无法读取对应分支的数据。取消注释并确保分支名与Tree中完全一致(注意大小写):

    Tout->SetBranchStatus("ntrack", true);
    Tout->SetBranchStatus("PID", true);
    Tout->SetBranchStatus("pT", true);
    

    如果启用分支时报错,先通过Tout->Print()输出的分支列表核对名称是否正确。

  2. 变量类型不匹配
    从场景看,pT应该是与ntrack对应的数组(每个事件的每个粒子对应一个pT值),但你定义的是单个Double_t pT,这会导致内存读取错误。将其改为数组:

    Double_t pT[N_PID];
    
  3. 数组地址传递错误
    数组类型的分支设置地址时,直接传递数组名即可(数组名本身就是指针),不需要加&:

    Tout->SetBranchAddress("pT", pT);
    Tout->SetBranchAddress("PID", PID);
    
  4. 增加安全检查
    补充文件和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:08:19