如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
How to loop through several hourly ROOT (.root) files and combine them into bigger .root files of daily data?
我在实验室通过终端使用 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(。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 在没有root权限的情况下安装NTL,并在生成文件中修改其构建路径
- 编译几个源文件(主文件和头文件)并在ROOT CINT中链接它们
- 如何在 root 用户拥有的文件夹中以编程方式创建文件
- 从文本文件创建并填充ROOT文件
- 链接到xCode中的ROOT文件
- 如何在ROOT下编译多个文件
- 在ROOT中绘制ASCII文件
- 尝试执行"cc1"时 gcc 错误:execvp:使用非 root 用户运行时没有这样的文件或目录