c++ - 如何遍历几个每小时的 ROOT (.root) 文件并将它们组合成更大的每日数据 .root 文件?

标签 c++ terminal root-framework

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

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

我是 ROOT 的新手,我不确定我该怎么做,有人可以帮助我吗?


换句话说:我需要遍历存在的文件夹并创建每日“短”文件(即一个 ROOT 文件,它是所有 ROOT 文件的组合)并将它们放入一个新文件夹。

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


编辑:当我使用“root”时,我的意思是它是数据分析的软件框架,所以语言是 .

{
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/

相关文章:

使用 C++ 枚举代替 const 值

java - 如何从命令行在 Windows 上运行 .class 文件?

c++ - 在 ROOT 中迭代绘制 TEllipse

c++ - sem_t union/struct C++ 继承

C++ timer_create() 不创建新线程

macos - 在 Mac OSX 上,如何将脚本文件与终端相关联,以便双击图标启动终端?

python - python 中 C++ vector 的实例(对于 pyROOT 中的 TTrees)

c++ - ROOT条件分支选择

c++ - 如何管理SVG文件中的超出范围的值?

c++ - Linux终端: carriage return stuck at line wrap