Объединение файлов .root, вызывающих копии объединенного файла - PullRequest
0 голосов
/ 28 августа 2018

Я написал макрос для циклического прохождения и объединения нескольких .root-файлов данных, собираемых ежечасно, в попытке взять несколько почасовых файлов и превратить их в ежедневные файлы. По какой-то причине он создает несколько его копий и всю информацию в нем. Например, когда я пытаюсь заглянуть в дерево, содержащее данные всех деревьев, оно говорит: cluster_Tree; 61.

Я прикрепляю свой макрос, есть идеи, как мне это исправить?

#include "TChain.h"
#include "TTree.h"
#include "TParameter.h"
#include "TFile.h"
#include <iostream>

Double_t elow = 0.13;
Double_t ehigh = 100.;

void makeShort(TString year, TString month, TString day){

    TChain* c = new TChain("clusters_tree");
    TChain* d = new TChain("finfo");

    int nFiles = 0;
    double efact = 6.04E-3;

    TString infolder = "/data/directory1/";
    TString contains = year + month + day;

    TString outfolder = "/data/directory1/";
    TFile* fout = new 
TFile(outfolder+"/short_test"+contains+".root","RECREATE");

    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(contains)) {
                nFiles += c->Add(infolder+fname+"/*.root");
                          d->Add(infolder+fname+"/*.root");
            }
        }
        cout << "Found " << nFiles << " files" << endl;
    }

    TTree* details = new TTree("details","details");
    details->Branch("nFiles",&nFiles);
    details->Branch("conversion",&efact);

    TTree* t = c->CloneTree(0);
    TParameter<double>* q = NULL;
    c->SetBranchAddress("charge_total",&q);

    Int_t nentries = c->GetEntries();

    for(Int_t i=0; i<nentries; i++){

        if(i%100000==0)
            std::cout << "Processing cluster " << i << " of " << nentries << std::endl;

        c->GetEntry(i);
        Double_t e = q->GetVal()*efact;

        if(e>elow && e<ehigh)
            t->Fill();
}

    TTree* f = d->CloneTree();

    t->Write();
    f->Write();
    details->Write();

    fout->Close();

}

1 Ответ

0 голосов
/ 09 ноября 2018

Вы действительно должны использовать hadd. Стандартная сборка ROOT уже должна иметь двоичный файл.

Тем не менее, я вижу, что вы, по сути, заполняете новое дерево. Способ сделать это - создать TChain и объединить для обратной записи (как это было сделано hadd). clusters_Tree; 61, которые вы видите, не являются точными копиями. Они известны как циклы и больше похожи на версии. Я предполагаю, что у вас есть 61 файл (может быть, 60)? Они, вероятно, потому что вы используете TTree::CloneTree(0) вместо TChain::Merge(..).

...