初学者求助:如何逐个读取多个ROOT树文件并计算统计参数
批量处理ROOT树文件的解决方案
1. 封装单文件处理逻辑
先把你原来的单文件统计代码封装成可复用的函数,传入文件名即可处理单个文件,同时增加错误检查避免程序崩溃:
void ProcessSingleFile(const char* filename) { // 打开文件 TFile *f = new TFile(filename); if (!f || f->IsZombie()) { cout << "无法打开文件: " << filename << endl; delete f; return; } // 获取树结构 TTree *T1 = (TTree*)f->Get("T1"); if (!T1) { cout << "文件 " << filename << " 中未找到树T1" << endl; f->Close(); delete f; return; } // 绑定分支变量 int Tcharged ; int Neg_charged ; int Posi_charged ; int delta_charge; T1->SetBranchAddress("Totalcharge",&Tcharged); T1->SetBranchAddress("negativecharge",&Neg_charged); T1->SetBranchAddress("positivecharge",&Posi_charged); T1->SetBranchAddress("deltacharge",&delta_charge); int nentries = T1->GetEntries(); cout<< "\n=== 文件 " << filename << " 统计结果 ===" << endl; cout<< "条目数 : "<<nentries<<endl; // 计算总和与均值 double sumT=0.0, sumN=0.0, sumP=0.0, sumD=0.0; double meanT=0.0, meanN=0.0, meanP=0.0, meanD=0.0; for (int i=0; i<nentries; i++) { T1->GetEntry(i); sumT += Tcharged; sumN += Neg_charged; sumP += Posi_charged; sumD += delta_charge; } // 循环外计算均值,减少重复运算 meanT = sumT / nentries; meanN = sumN / nentries; meanP = sumP / nentries; meanD = sumD / nentries; // 输出结果 cout << "总电荷均值 : "<< meanT << endl; cout << "负电荷均值 : "<< meanN << endl; cout << "正电荷均值 : "<< meanP << endl; cout << "电荷差均值 : "<< meanD << endl; // 释放资源 f->Close(); delete f; }
2. 批量调用处理多个文件
因为你的文件是pp1.root到pp10.root,可以用循环自动生成文件名并调用上面的函数:
void pbtrue_batch() { // 循环处理pp1到pp10共10个文件 for (int i=1; i<=10; i++) { char filename[20]; sprintf(filename, "pp%d.root", i); ProcessSingleFile(filename); } }
额外说明
- 增加了文件和树的存在性检查,避免因文件损坏或路径错误导致程序崩溃
- 将均值计算移到循环外部,提升运行效率
- 每个文件的统计结果添加了分隔标题,更易阅读
- 处理完文件后及时关闭并释放内存,避免资源泄漏
内容的提问来源于stack exchange,提问作者Ab_Ad
相关产品推荐
相关产品推荐

