Read n-tuples in distinct workers, fill histograms, merge them and fit.
Knowing that other facilities like TProcessExecutor might be more adequate for this operation, this tutorial complements mc101, reading and merging. We convey another message with this tutorial: the synergy of ROOT and STL algorithms is possible.
Int_t mt102_readNtuplesFillHistosAndFit()
{
TChain inputChain(
"multiCore");
inputChain.Add("mt101_multiCore_*.root");
TH1F outHisto(
"outHisto",
"Random Numbers", 128, -4, 4);
inputChain.Draw("r >> outHisto");
outHisto.Fit("gaus");
const auto nFiles = inputChain.GetListOfFiles()->GetEntries();
std::vector<TH1F> histograms;
histograms.reserve(nFiles);
for (auto workerID : workerIDs) {
histograms.emplace_back(
TH1F(
Form(
"outHisto_%u", workerID),
"Random Numbers", 128, -4, 4));
}
auto workItem = [&histograms](
UInt_t workerID) {
TFile f(
Form(
"mt101_multiCore_%u.root", workerID));
auto ntuple =
f.Get<
TNtuple>(
"multiCore");
auto &histo = histograms.at(workerID);
for (
auto index :
ROOT::TSeqL(ntuple->GetEntriesFast())) {
histo.
Fill(ntuple->GetArgs()[0]);
}
};
TH1F sumHistogram(
"SumHisto",
"Random Numbers", 128, -4, 4);
std::vector<std::thread> workers;
for (auto workerID : workerIDs) {
workers.emplace_back(workItem, workerID);
}
for (auto &&worker : workers)
worker.join();
std::for_each(std::begin(histograms), std::end(histograms),
[&sumHistogram](
const TH1F &
h) { sumHistogram.Add(&
h); });
sumHistogram.Fit("gaus", 0);
return 0;
}
char * Form(const char *fmt,...)
A pseudo container class which is a generator of indices.
A chain is a collection of files containing TTree objects.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
1-D histogram with a float per channel (see TH1 documentation)}
A simple TTree restricted to a list of float variables only.
virtual Int_t Fill()
Fill a Ntuple with current values in fArgs.
virtual Int_t GetEntry(Long64_t entry=0, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
void EnableThreadSafety()
Enables the global mutex to make ROOT thread safe/aware.
- Date
- January 2016
- Author
- Danilo Piparo
Definition in file mt102_readNtuplesFillHistosAndFit.C.