我在我的实验室中通过终端使用 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)。
关于c++ - 如何遍历几个每小时的 ROOT (.root) 文件并将它们组合成更大的每日数据 .root 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008224/