合并.root文件导致合并文件的副本

时间:2018-08-27 22:15:37

标签: macros root-framework

我写了一个宏来遍历并合并每小时收集的几个.root文件数据,以尝试获取几个每小时的文件并将其转换为每日文件。由于某种原因,它正在创建它的多个副本以及其中的所有信息。例如,当我尝试查看包含所有树中数据的树时,它显示为“ clusters_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 :(得分:0)

您确实应该使用hadd。默认的ROOT版本应该已经有二进制文件。

也就是说,我看到您实质上是在填充一棵新树。方法是创建一个TChain,然后合并以写回(由hadd完成)。您看到的clusters_Tree; 61并非完全是副本。这些被称为循环,并且更像是版本。我猜您有61个文件(也许60个)?它们可能是因为您使用TTree::CloneTree(0)而不是TChain::Merge(..)