Compare creation of a ROOT dataset with RDataFrame and TTree.
This tutorial illustrates how much simpler it can be to use a RDataFrame to create a dataset with respect to the usage of the TTree interfaces.
Author: Danilo Piparo (CERN)
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Wednesday, April 17, 2024 at 11:07 AM.
The steps are:
%%cpp -d
void classicWay()
{
TFile f("df009_FromScratchVSTTree_classic.root", "RECREATE");
TTree t("treeName", "treeName");
double b1;
int b2;
t.Branch("b1", &b1);
t.Branch("b2", &b2);
for (int i = 0; i < 10; ++i) {
b1 = i;
b2 = i * i;
t.Fill();
}
t.Write();
f.Close();
}
Few lines are needed to achieve the same result. Parallel creation of the TTree is not supported in the classic method. In this case the steps are:
Parallelism is not the only advantage. Starting from an existing dataset, filtering it, enriching it with new columns, leaving aside some other columns, and writing a new dataset become very easy to do.
%%cpp -d
void RDFWay()
{
ROOT::RDataFrame df(10);
auto b = 0.;
df.Define("b1", [&b]() { return b++; })
.Define("b2", "(int) b1 * b1") This can even be a string
.Snapshot("treeName", "df009_FromScratchVSTTree_df.root");
}
input_line_44:6:36: error: expected ';' after expression .Define("b2", "(int) b1 * b1") This can even be a string ^ ; input_line_44:6:38: error: unknown type name 'This' .Define("b2", "(int) b1 * b1") This can even be a string ^ input_line_44:6:46: error: expected ';' at end of declaration .Define("b2", "(int) b1 * b1") This can even be a string ^ ;
classicWay();
RDFWay();
In module 'ROOTDataFrame': /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: error: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::RDefine' is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /usr/include/c++/9/ext/new_allocator.h:146:23: note: used here { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } ^ In module 'ROOTDataFrame': /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:109:4: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::~RDefine' has internal linkage but is not defined [-Wundefined-internal] ~RDefine() { fLoopManager->Deregister(this); } ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:111:9: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::InitSlot' has internal linkage but is not defined [-Wundefined-internal] void InitSlot(TTreeReader *r, unsigned int slot) final ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:119:10: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::GetValuePtr' has internal linkage but is not defined [-Wundefined-internal] void *GetValuePtr(unsigned int slot) final ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:136:26: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::GetTypeId' has internal linkage but is not defined [-Wundefined-internal] const std::type_info &GetTypeId() const final { return typeid(ret_type); } ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:125:9: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::Update' has internal linkage but is not defined [-Wundefined-internal] void Update(unsigned int slot, Long64_t entry) final ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:134:9: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::Update' has internal linkage but is not defined [-Wundefined-internal] void Update(unsigned int /*slot*/, const ROOT::RDF::RSampleInfo &/*id*/) final {} ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:139:9: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::FinalizeSlot' has internal linkage but is not defined [-Wundefined-internal] void FinalizeSlot(unsigned int slot) final ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:148:9: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::MakeVariations' has internal linkage but is not defined [-Wundefined-internal] void MakeVariations(const std::vector<std::string> &variations) final ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:168:17: warning: function 'ROOT::Detail::RDF::RDefine<(lambda), ROOT::Detail::RDF::ExtraArgsForDefine::None>::GetVariedDefine' has internal linkage but is not defined [-Wundefined-internal] RDefineBase &GetVariedDefine(const std::string &variationName) final ^ /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master.build/include/ROOT/RDF/RDefine.hxx:98:4: note: used here RDefine(std::string_view name, std::string_view type, F expression, const ROOT::RDF::ColumnNames_t &columns, ^