vectors of tracks.
This tutorial shows the possibility to use data models which are more complex than flat ntuples with RDataFrame.
using FourVectorVec = std::vector<FourVector>;
void fill_tree(
const char *
filename,
const char *treeName)
{
const double M = 0.13957;
auto genTracks = [&](){
const auto nPart =
R.Poisson(15);
for (int j = 0; j < nPart; ++j) {
const auto px =
R.Gaus(0, 10);
const auto py =
R.Gaus(0, 10);
const auto pt = sqrt(px * px + py * py);
const auto eta =
R.Uniform(-3, 3);
CylFourVector vcyl(
pt, eta, phi);
auto E = sqrt(vcyl.R() * vcyl.R() + M * M);
tracks.emplace_back(vcyl.X(), vcyl.Y(), vcyl.Z(), E);
}
};
d.Define(
"tracks", genTracks).Snapshot<FourVectorVec>(treeName,
filename, {
"tracks"});
}
{
auto fileName = "df002_dataModel.root";
auto treeName = "myTree";
fill_tree(fileName, treeName);
auto n_cut = [](
const FourVectorRVec &
tracks) {
return tracks.size() > 8; };
auto nentries =
d.Filter(n_cut, {
"tracks"}).Count();
std::cout << *
nentries <<
" passed all filters" << std::endl;
auto getPt = [](
const FourVectorRVec &
tracks) {
};
auto getPtWeights = [](
const FourVectorRVec &
tracks) {
};
auto augmented_d =
d.Define(
"tracks_n", [](
const FourVectorRVec &
tracks) {
return (
int)
tracks.size(); })
.
Filter([](
int tracks_n) {
return tracks_n > 2; }, {
"tracks_n"})
.Define("tracks_pts", getPt)
.Define("tracks_pts_weights", getPtWeights);
auto trN = augmented_d.Histo1D({"", "", 40, -.5, 39.5}, "tracks_n");
auto trPts = augmented_d.Histo1D("tracks_pts");
auto trWPts = augmented_d.Histo1D("tracks_pts", "tracks_pts_weights");
trN->DrawCopy();
trPts->DrawCopy();
trWPts->DrawCopy();
return 0;
}
#define R(a, b, c, d, e, f, g, h, i)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...
A "std::vector"-like collection of values implementing handy operation to analyse them.
Random number generator class based on M.
auto Map(Args &&... args)
Create new collection applying a callable to the elements of the input collection.
RVec< T > Filter(const RVec< T > &v, F &&f)
Create a new collection with the elements passing the filter expressed by the predicate.
DisplacementVector3D< CylindricalEta3D< double >, DefaultCoordinateSystemTag > RhoEtaPhiVector
3D Vector based on the eta based cylindrical coordinates rho, eta, phi in double precision.
LorentzVector< PxPyPzE4D< double > > XYZTVector
LorentzVector based on x,y,x,t (or px,py,pz,E) coordinates in double precision with metric (-,...