ROOT多文件仅处理最后一个+TBrowser无法访问直方图问题求助
问题解决思路
一、多ROOT文件仅最后一个被处理的问题
原因
代码在循环处理文件时,每次通过f->GetObject("analysis", tree)将tree变量重新指向当前文件的树,没有把多个树串联成链式结构,最终Init函数只初始化了最后一个文件的树,导致仅处理最后一个文件。ROOT中处理多个同结构的树需要用TChain来串联,而非逐个替换树对象。
解决方法
- 将类中的
TTree *fChain;改为TChain *fChain;(TChain是TTree的子类,兼容原有接口)。 - 在构造函数中初始化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
相关产品推荐
相关产品推荐

