Как просмотреть несколько почасовых файлов ROOT (.root) и объединить их в более крупные файлы .root с ежедневными данными?

Я работаю с ROOT через терминал в своей лаборатории, мы часто собираем данные и имеем почасовые папки с крошечными .root файлами в них.

Я пытаюсь создать ежедневный файл .root со всеми данными, полученными за определенный день, на данный момент у меня много крошечных файлов .root внутри почасовых папок.

Я очень новичок в ROOT и не знаю, как мне это сделать, может ли кто-нибудь мне помочь?


Другими словами: мне нужно прокручивать существующие папки и создавать ежедневные «короткие» файлы (т. е. один файл ROOT, представляющий собой комбинацию всех файлов ROOT) и помещать их в новую папку. .

Это грубый набросок того, что я думаю, но это скорее мои мысли вслух...
Основано на моем файле makeShort.C.


EDIT: когда я использовал «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);
        }
      }
    }
  }
}

person Tefers    schedule 24.08.2018    source источник
comment
звучит как задание bash/perl, а не c++   -  person pm100    schedule 24.08.2018
comment
Объединение нескольких файлов в один похоже на то, для чего предназначен инструмент командной строки hadd от root. Вы учитывали это перед написанием собственного макроса/приложения?   -  person pseyfert    schedule 25.08.2018


Ответы (1)


Как предлагает @pseyfert, используйте хадд следующим образом:

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

Вы можете сделать несколько приятных вещей с помощью hadd:

  • -O для повторной оптимизации макета TTree с учетом данных файлов
  • -j 4 слияние с 4 параллельными процессами.

По умолчанию эти деревья не распаковываются и не сжимаются снова, что делает хадд довольно быстрым, обычно ограниченным вводом-выводом. -j имеет смысл изменить уровень/алгоритм сжатия (-f201 будет использовать уровень 1 LZMA).

person Axel Naumann    schedule 26.08.2018