Hi everyone! I’ve been trying to run a macro over multiple root files. I used MakeClass on one of these trees to generate a template and then tried to change it to read in a Chain. When I try to run the macro though, it says there are zero events and produces empty histograms. I can’t find where I’ve gone wrong though, I’d really appreciate any help! This is my code:
#define MakeHistograms_cxx
#include "MakeHistograms.h"
#include <TH2.h>
#include <TStyle.h>
#include <TCanvas.h>
#include <iostream>
#include "TFileCollection.h"
#include "THashList.h"
#include "TList.h"
void MakeHistograms::Loop()
{
//Stop ROOT opening every canvas as it's created
gROOT->SetBatch(kTRUE);
//Auto-generated stuff
//Long64_t nentries = fChain->GetEntriesFast();
Long64_t nbytes = 0, nb = 0;
Long64_t N = fChain->GetEntries();
//Print the number of events
std::cout << "Number of entries is " << N << std::endl;
// Create write histogram before creating histograms
TFile hfile("hfile.root","RECREATE");
//Make useful histograms, jet pt and NTrack
TH1F *h = new TH1F("h", "Jet pT", 100, 50, 2500.);
TH1F *g = new TH1F("g", "NTrack", 100, 0, 120);
//Number of pT slices
const Int_t nHists = 9;
std::cout << "STAGE 2 Number of entries is " << N << std::endl;
Double_t edges[nHists+1] = {400,500,650,800,1000,1200,1500,2000,3000,6000};
//Array of histograms
TH1F *m[nHists];
//Use these to give the histograms unique names
char name[20];
char title[100];
char buffer[50];
for (Int_t i=0;i<nHists;i++) {
sprintf(name,"m%d",i);
sprintf(title,"m%d pT between %5.0f and %5.0f GeV",i,edges[i],edges[i+1]);
m[i] = new TH1F(name,title,120,-0.5,119.5);
m[i]->Print();
}
std::cout << "STAGE 2 Number of entries is " << N << std::endl;
//Fill useful histograms
for (Long64_t i = 0; i < N; i++) {
//cout << i << endl;
fChain->GetEntry(i);
for (unsigned long j = 0; j <jet_pt->size(); j++){
h->Fill(jet_pt->at(j),1.);
g->Fill(jet_NumTrkPt1000PV->at(j),1.);
for(int k=0; k<nHists;k++){
double minPt = edges[k];
double maxPt = edges[k+1];
if (jet_pt->at(j)<maxPt){
m[k]->Fill(jet_NumTrkPt1000PV->at(j),1.);
break;
}
}
}
}
//Print other useful info
Double_t Min = h->GetMinimum();
Double_t Max = h->GetMaximum();
std::cout << "Maximum value is " << Max << std::endl;
std::cout << "Minimum value is " << Min << std::endl;
hfile.Write();
hfile.Close();
}
/* To run use root -l, .L MakeHistograms.C, run() */
int run(){
/*TTree *tree;
TFile *f = (TFile*)gROOT->GetListOfFiles()->FindObject("T.root");
if (!f || !f->IsOpen()) {
f = new TFile("T.root");
}
f->GetObject("outTree",tree);
*/
// name of tree is the argument
TChain *tree = new TChain("outTree");
// New is a place holder....
TFileCollection fc("New");
// add the names of the trees to files_signal.txt
fc.AddFromFile("files_signal.txt");
fc.Print();
fc.GetList()->Print();
tree->AddFileInfoList(fc.GetList(),TChain::kBigNumber);
MakeHistograms m(tree);
m.Loop();
return 0;
}
And I have three files in files_signal.txt containing only the three lines:
user.krybacki.18636682._000001.tree.root
user.krybacki.18636682._000002.tree.root
user.krybacki.18636682._000003.tree.root
Removing everything but the last three lines in run() gives a macro that works fine on a single file. Thanks again for any help!