我写了一个宏来遍历并合并每小时收集的几个.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();
}
答案 0 :(得分:0)
您确实应该使用hadd
。默认的ROOT版本应该已经有二进制文件。
也就是说,我看到您实质上是在填充一棵新树。方法是创建一个TChain
,然后合并以写回(由hadd
完成)。您看到的clusters_Tree; 61
并非完全是副本。这些被称为循环,并且更像是版本。我猜您有61个文件(也许60个)?它们可能是因为您使用TTree::CloneTree(0)
而不是TChain::Merge(..)
。