TTree::SetBranchAddress未知分支报错及ROOT树数据读取异常求助
解决ROOT中TTree读取分支时的“unknown branch”错误及数据打印异常问题
我尝试从ROOT文件的TofHitsTree树中读取并打印x、y、z坐标,以及plane、bar、signalPosition、signalTime等数据,但打印结果不正确,同时程序抛出Error in TTree::SetBranchAddress: unknown branch错误,相关运行输出和堆栈信息见附图。
我的代码如下:
#include <TFile.h> #include <TTree.h> #include <fstream> #include <iostream> void readOutputTree() { TFile* file = TFile::Open("/home/lecamvi/Documents/TOF_thesis/output/run16480_outputTree.root", "READ"); if (!file || file->IsZombie()) { std::cerr << "Error opening file" << std::endl; return; } TTree* tree = (TTree*)file->Get("TofHitsTree"); if (!tree) { std::cerr << "Error getting tree" << std::endl; file->Close(); return; } int plane, bar; double x, y, z, signalTime, signalPosition; tree->SetBranchAddress("plane", &plane); tree->SetBranchAddress("bar", &bar); tree->SetBranchAddress("x", &x); tree->SetBranchAddress("y", &y); tree->SetBranchAddress("z", &z); tree->SetBranchAddress("signalTime", &signalTime); tree->SetBranchAddress("signalPosition", &signalPosition); std::ofstream outFile("output.txt"); if (!outFile) { std::cerr << "Error creating output file" << std::endl; file->Close(); return; } Long64_t entries = tree->GetEntries(); for (Long64_t i = 0; i < entries; i++) { tree->GetEntry(i); outFile << "Entry " << i << ": " << "plane = " << plane << ", " << "bar = " << bar << ", " << "x = " << x << ", " << "y = " << y << ", " << "z = " << z << ", " << "signalTime = " << signalTime << ", " << "signalPosition = " << signalPosition << std::endl; } outFile.close(); file->Close(); }
解决方案
确认分支真实名称
错误核心是代码中指定的分支名与树中实际分支名不匹配(区分大小写、拼写错误、存在前缀/命名空间等)。可通过两种方式查看分支信息:- 在ROOT命令行执行:
该命令会列出所有分支的名称、数据类型等详细内容。root -l /home/lecamvi/Documents/TOF_thesis/output/run16480_outputTree.root TofHitsTree->Print() - 使用ROOT可视化工具:启动ROOT后输入
new TBrowser(),找到目标文件和树,展开即可查看所有分支。
- 在ROOT命令行执行:
修正分支名与数据类型匹配
根据上述步骤获取的真实分支名,修改SetBranchAddress的参数。同时确保代码中变量的数据类型与分支类型完全一致(例如分支是float则不能用double接收)。添加分支绑定错误检查
为每个SetBranchAddress调用添加返回值检查,快速定位出错分支:if (tree->SetBranchAddress("plane", &plane) != 0) { std::cerr << "Failed to bind branch 'plane'" << std::endl; }验证读取结果
先打印少量条目(如前10条)验证数据合理性,避免因分支不匹配导致的垃圾值输出。
内容的提问来源于stack exchange,提问作者user25274389
相关产品推荐
相关产品推荐

