Work with befriended RNTuples. Adapted from tree3.C
Author: The ROOT Team
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Wednesday, April 17, 2024 at 11:24 AM.
%%cpp -d
#include <ROOT/RNTupleModel.hxx>
#include <ROOT/RNTupleReader.hxx>
#include <ROOT/RNTupleWriter.hxx>
#include <TCanvas.h>
#include <TH1F.h>
#include <TMath.h>
#include <TRandom.h>
#include <vector>
constexpr char const* kNTupleMainFileName = "ntpl006_data.root";
constexpr char const* kNTupleFriendFileName = "ntpl006_reco.root";
using RNTupleModel = ROOT::Experimental::RNTupleModel;
using RNTupleReader = ROOT::Experimental::RNTupleReader;
using RNTupleWriter = ROOT::Experimental::RNTupleWriter;
NOTE: The RNTuple classes are experimental at this point. Functionality, interface, and data format is still subject to changes. Do not use for real data!
%%cpp -d
void Generate()
{
constexpr int kMaxTrack = 500;
auto modelData = RNTupleModel::Create();
auto fldPx = modelData->MakeField<std::vector<float>>("px");
auto fldPy = modelData->MakeField<std::vector<float>>("py");
auto fldPz = modelData->MakeField<std::vector<float>>("pz");
auto modelFriend = RNTupleModel::Create();
auto fldPt = modelFriend->MakeField<std::vector<float>>("pt");
auto ntupleData = RNTupleWriter::Recreate(std::move(modelData), "data", kNTupleMainFileName);
auto ntupleReco = RNTupleWriter::Recreate(std::move(modelFriend), "reco", kNTupleFriendFileName);
for (int i=0; i < 1000; i++) {
int ntracks = gRandom->Rndm() * (kMaxTrack - 1);
for (int n = 0; n < ntracks; n++) {
fldPx->emplace_back(gRandom->Gaus( 0, 1));
fldPy->emplace_back(gRandom->Gaus( 0, 2));
fldPz->emplace_back(gRandom->Gaus(10, 5));
fldPt->emplace_back(TMath::Sqrt(fldPx->at(n) * fldPx->at(n) + fldPy->at(n) * fldPy->at(n)));
}
ntupleData->Fill();
ntupleReco->Fill();
fldPx->clear();
fldPy->clear();
fldPz->clear();
fldPt->clear();
}
}
Generate();
std::vector<RNTupleReader::ROpenSpec> friends{
{"data", kNTupleMainFileName},
{"reco", kNTupleFriendFileName} };
auto ntuple = RNTupleReader::OpenFriends(friends);
auto c = new TCanvas("c", "", 200, 10, 700, 500);
TH1F h("h", "pz {pt > 3.}", 100, -15, 35);
auto viewPz = ntuple->GetView<float>("data.pz._0");
auto viewPt = ntuple->GetView<float>("reco.pt._0");
for (auto i : viewPt.GetFieldRange()) {
if (viewPt(i) > 3.)
h.Fill(viewPz(i));
}
h.SetFillColor(48);
h.DrawCopy();
Warning in <[ROOT.NTuple] Warning /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master/tree/ntuple/v7/src/RPageStorageFile.cxx:56 in ROOT::Experimental::Internal::RPageSinkFile::RPageSinkFile(std::string_view, const ROOT::Experimental::RNTupleWriteOptions&)::<lambda()>>: The RNTuple file format will change. Do not store real data with this version of RNTuple! Warning in <[ROOT.NTuple] Warning /home/sftnight/build/workspace/root-makedoc-master/rootspi/rdoc/src/master/tree/ntuple/v7/src/RPageStorageFile.cxx:262 in ROOT::Experimental::Internal::RPageSourceFile::InitDescriptor(const ROOT::Experimental::RNTuple&)::<lambda()>>: Pre-release format version: RC 2
Draw all canvases
gROOT->GetListOfCanvases()->Draw()