如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?

How to loop through several hourly ROOT (.root) files and combine them into bigger .root files of daily data?

本文关键字:root 文件 日数据 每日 组合 遍历 何遍历 几个 一次 每小时      更新时间:2023-10-16

我在实验室通过终端使用 ROOT,我们经常收集数据,并且每小时都有文件夹,其中包含微小的.root文件。

我正在尝试创建一个每日.root文件,其中包含某一天获取的所有数据,目前我在每小时的文件夹中有许多小.root文件。

我对 ROOT 很陌生,不确定我该怎么做,有人可以帮助我吗?


换句话说:我需要遍历现有的文件夹并创建每日"短"文件(即单个 ROOT 文件是所有 ROOT 文件的组合(并将它们放入新文件夹中。

这是我正在思考的粗略草稿,但更多的是我只是大声思考......
基于我的makeShort.C文件。


编辑:当我使用"root"时,我的意思是它是数据分析的软件框架,所以语言将是c ++。

{
void makeShort();
TDatime currtime;
int curryear = currtime.GetYear();
int currmonth = currtime.GetMonth();
int currdate = currtime.GetDay();
if (curryear != 2018) {
cout << "It is not 2018 anymore. Don't blindly run this macro." << endl;
return 0;
}
TChain* c = new TChain("clusters_tree");
TChain* d = new TChain("finfo");
for (int i=7; i<=currmonth; i++){
for (int j = 1;

TString year, month, day;
int yr, mth, dy;
int nFolders = 0;
TString infolder = "/data/....../....../....../ROOT";
TSystemDirectory dir(infolder, infolder);
TList *files = dir.GetListOfFiles();
if (files) {
TSystemFile *file;
TString fname;
TIter next(files);
while ((file=(TSystemFile*)next())) {
fname = file->GetName();
if (file->IsDirectory() && fname.Contains("root_")) {
nFolders+=1;
year = fname(5,4);  yr = year.Atoi();
month = fname(9,2); mth = month.Atoi();
day = fname(11,2);  dy = day.Atoi();
TDatime fdate(yr,mth,dy,0,0,0);
}
}
}
}
}

正如@pseyfert建议的那样,像这样使用hadd:

hadd combined.root /data/....../....../....../ROOT/root_*.root

你可以用 hadd 做一些好事:

  • -O根据文件数据重新优化TTree布局
  • -j 4与 4 个并行进程合并。

默认情况下,这些树不会再次解压缩和压缩 - 这使得 hadd 相当快,通常 I/O 受限。-j在更改压缩级别/算法时最有意义(-f201将使用 LZMA 级别 1(。