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

ROOT多文件仅处理最后一个+TBrowser无法访问直方图问题求助

问题解决思路

一、多ROOT文件仅最后一个被处理的问题

原因

代码在循环处理文件时,每次通过f->GetObject("analysis", tree)将tree变量重新指向当前文件的树,没有把多个树串联成链式结构,最终Init函数只初始化了最后一个文件的树,导致仅处理最后一个文件。ROOT中处理多个同结构的树需要用TChain来串联,而非逐个替换树对象。

解决方法

  1. 将类中的TTree *fChain;改为TChain *fChain;(TChain是TTree的子类,兼容原有接口)。
  2. 在构造函数中初始化TChain,循环将每个文件的树添加到链中,而非逐个替换tree。

修改后的构造函数代码示例:

inclphoton::inclphoton(TTree *tree) : fChain(0)
{
    TH1::AddDirectory(kFALSE);
    files.push_back("/userdata/incPhoton/data15/user.data15periodd.n181.periodD.DAOD_STDM2.grp23_v01_p3984_ANALYSIS_ntuples/user.26552633._000001.ANALYSIS.root");
    files.push_back("/userdata/incPhoton/data15/user..data15periodd.n181.periodD.DAOD_STDM2.grp23_v01_p3984_ANALYSIS_ntuples/user.26552633._000002.ANALYSIS.root");
    //files.push_back("/userdata/incPhoton/data15/user..data15periodd.n181.periodD.DAOD_STDM2.grp23_v01_p3984_ANALYSIS_ntuples/user.26552633._000003.ANALYSIS.root");
    if (!tree) {
        // 初始化TChain,指定树的名称
        fChain = new TChain("analysis");
        for (const auto& fileName : files) {
            std::cout << "Adding file to chain: " << fileName << std::endl;
            // 将文件中的"analysis"树添加到链中
            Int_t ret = fChain->Add(fileName.c_str());
            if (ret == 0) {
                std::cerr << "Error: Tree 'analysis' not found in file: " << fileName << std::endl;
                continue;
            }
            std::cout<< "////////////////////////////////////////////"<<std::endl;
            std::cout << "Total entries in chain so far: " << fChain->GetEntries() << std::endl;
        }
        // 直接用fChain初始化,不需要tree变量
        Init(fChain);
    } else {
        Init(tree);
    }
}

同时修改析构函数,TChain的清理无需手动删除单个文件,直接删除链即可:

inclphoton::~inclphoton()
{
    delete fChain;
}

二、TBrowser无法访问生成的直方图的问题

原因

代码开头设置了TH1::AddDirectory(kFALSE);,该设置会禁止ROOT自动将生成的直方图添加到当前目录(gDirectory),而TBrowser默认只显示目录中的对象,因此无法看到生成的直方图。

解决方法

有两种可选方案:

  • 移除自动目录禁止设置:删除TH1::AddDirectory(kFALSE);这一行,生成的直方图会自动加入当前目录,TBrowser即可看到。
  • 手动将直方图添加到目录:保留该设置,但在生成直方图后,手动将其添加到指定目录,示例代码:
    // 假设生成了hist直方图
    TH1F* hist = new TH1F("hist", "Photon Pt", 100, 0, 100);
    // 手动添加到当前目录
    hist->SetDirectory(gDirectory);
    

内容的提问来源于stack exchange,提问作者Sandra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:12:16