Как перебрать несколько почасовых ROOT (.root) файлов и объединить их в большие .root файлы ежедневных данных? - PullRequest
0 голосов
/ 24 августа 2018

Я работаю с 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 голосов
/ 26 августа 2018

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

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

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

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

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

...