Logo ROOT  
Reference Guide
mtbb101_fillNtuples.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_multicore
3 /// \notebook
4 /// Fill n-tuples in distinct workers.
5 /// This tutorial illustrates the basics of how it's possible with ROOT to
6 /// offload heavy operations on multiple processes and how it's possible to write
7 /// simultaneously multiple files. The operation performed in this case is the
8 /// creation of random gaussian numbers.
9 ///
10 /// \macro_code
11 ///
12 /// \date January 2016
13 /// \author Danilo Piparo
14 
15 // Some useful constants and functions
16 
17 // Total amount of numbers
18 const UInt_t nNumbers = 20000000U;
19 
20 // The number of workers
21 const UInt_t nThreads = 4U;
22 
23 // We split the work in equal parts
24 const auto workSize = nNumbers / nThreads;
25 
26 // A simple function to fill ntuples randomly
27 void fillRandom(TNtuple &ntuple, TRandom3 &rndm, UInt_t n)
28 {
29  for (auto i : ROOT::TSeqI(n))
30  ntuple.Fill(rndm.Gaus());
31 }
32 
33 Int_t mtbb101_fillNtuples()
34 {
35  // No nuisance for batch execution
36  gROOT->SetBatch();
37 
38  // Perform the operation sequentially ---------------------------------------
39 
40  // Create a random generator and and Ntuple to hold the numbers
41  TRandom3 rndm(1);
42  TFile ofile("mtbb101_singleCore.root", "RECREATE");
43  TNtuple randomNumbers("singleCore", "Random Numbers", "r");
44  fillRandom(randomNumbers, rndm, nNumbers);
45  randomNumbers.Write();
46  ofile.Close();
47 
48  // We now go MP! ------------------------------------------------------------
49 
50  // We define our work item
51  auto workItem = [](UInt_t workerID) {
52  // One generator, file and ntuple per worker
53  TRandom3 workerRndm(workerID); // Change the seed
54  TFile ofile(Form("mtbb101_multiCore_%u.root", workerID), "RECREATE");
55  TNtuple workerRandomNumbers("multiCore", "Random Numbers", "r");
56  fillRandom(workerRandomNumbers, workerRndm, workSize);
57  workerRandomNumbers.Write();
58  return 0;
59  };
60 
61  // Create the pool of workers
62  ROOT::TThreadExecutor pool(nThreads);
63 
64  // Fill the pool with work
65  pool.Map(workItem, ROOT::TSeqI(nThreads));
66 
67  return 0;
68 }
n
const Int_t n
Definition: legend1.C:16
TRandom::Gaus
virtual Double_t Gaus(Double_t mean=0, Double_t sigma=1)
Samples a random number from the standard Normal (Gaussian) Distribution with the given mean and sigm...
Definition: TRandom.cxx:274
TNtuple
A simple TTree restricted to a list of float variables only.
Definition: TNtuple.h:28
Form
char * Form(const char *fmt,...)
ROOT::TThreadExecutor
This class provides a simple interface to execute the same task multiple times in parallel threads,...
Definition: TThreadExecutor.hxx:40
Int_t
int Int_t
Definition: RtypesCore.h:45
TRandom3
Random number generator class based on M.
Definition: TRandom3.h:27
UInt_t
unsigned int UInt_t
Definition: RtypesCore.h:46
TFile
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Definition: TFile.h:54
ROOT::TSeq
A pseudo container class which is a generator of indices.
Definition: TSeq.hxx:66
TNtuple::Fill
virtual Int_t Fill()
Fill a Ntuple with current values in fArgs.
Definition: TNtuple.cxx:169
gROOT
#define gROOT
Definition: TROOT.h:406