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

时间:2018-08-24 16:11:38

标签: 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);
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

就像@pseyfert所建议的那样,使用hadd:

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

您可以使用hadd做一些不错的事情:

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

默认情况下,这些树不会被解压缩并再次压缩-这使得hadd相当快,通常受I / O限制。 -j对于压缩级别/算法的改变最有意义(-f201将使用LZMA级别1)。