Skip to content

groot: add write support for Branch+buffer of leaves #879

Open
@sbinet

Description

@sbinet

use case "discovered" in:

the following PyROOT script:

import numpy as np

dt = np.dtype([
    ('x', "f4"), ('y', "f4"), ("z", "f4"), 
    ("px", "f4"), ("py", "f4"), 
    ("Ekin", "f4"), ("wepl", "f4"), 
    ("pdgID", "<i4"), 
    ("flag", "<u2"), 
    ("tof", "f4"),
    ("runID","<i4"),
    ("evtID","<i4"),
    ("trkID","<i4"),
    ("parID","<i4")])

evts = np.fromfile("./PhaseSpace.phsp", dtype=dt)
evts = np.sort(evts, order="evtID")

import ROOT
f = ROOT.TFile.Open("out.root", "RECREATE")
t = ROOT.TTree("PhaseSpaceTree", "PhaseSpaceTree")

dt = np.dtype([
    ('x', "f4"), ('y', "f4"), ("z", "f4"), 
    ("px", "f4"), ("py", "f4"), ("pz", "f4"),
    ("Ekin", "f4"), ("wepl", "f4"), 
    ("pdgID", "<i4"), 
    ("event", "<i4"),
    ("trackID","<i4"),
    ("PB_ID","<i4")])

buf = np.array([
    0,0,0,
    0,0,0,
    0,0,
    0,0,0
    ], dtype=dt)

t.Branch("PhaseSpaceBranch", buf, "x/F:y/F:z/F:px/F:py/F:pz/F:Ekin/F:wepl/F:pdgID/I:event/I:trackID/I:PB_ID/I")
for v in evts:
    buf["x"] = v["x"]
    buf["y"] = v["y"]
    buf["z"] = v["z"]
    buf["px"] = v["px"]
    buf["py"] = v["py"]
    buf["pz"] = 1 - buf["px"]**2 - buf["py"]**2
    buf["Ekin"] = v["Ekin"]
    buf["wepl"] = v["wepl"]
    buf["pdgID"] = v["pdgID"]
    buf["event"] = v["evtID"]
    buf["trackID"] = v["trkID"]
    buf["PB_ID"] = v["parID"]
    t.Fill()
t.Write()
f.Close()

will create a ROOT file+tree with the following structure:

$> root-ls -t ./out.root 
=== [./out.root] ===
version: 62406
  TTree              PhaseSpaceTree                                       PhaseSpaceTree (entries=4122)
    PhaseSpaceBranch "x/F:y/F:z/F:px/F:py/F:pz/F:Ekin/F:wepl/F:pdgI[...]" TBranch

$> root-dump ./out.root | head -n 20
>>> file[./out.root]
key[000]: PhaseSpaceTree;1 "PhaseSpaceTree" (TTree)
[000][PhaseSpaceBranch.x]: -1.95
[000][PhaseSpaceBranch.y]: 0.18836617
[000][PhaseSpaceBranch.z]: -0.23779297
[000][PhaseSpaceBranch.px]: 0.99966717
[000][PhaseSpaceBranch.py]: -0.019618336
[000][PhaseSpaceBranch.pz]: 0.00028066634
[000][PhaseSpaceBranch.Ekin]: 86.00329
[000][PhaseSpaceBranch.wepl]: 1
[000][PhaseSpaceBranch.pdgID]: 2212
[000][PhaseSpaceBranch.event]: 0
[000][PhaseSpaceBranch.trackID]: 1
[000][PhaseSpaceBranch.PB_ID]: 999
[001][PhaseSpaceBranch.x]: -1.95
[001][PhaseSpaceBranch.y]: -0.44054914
[001][PhaseSpaceBranch.z]: 0.03474723
[001][PhaseSpaceBranch.px]: 0.9999974
[001][PhaseSpaceBranch.py]: 0.0012126022
[001][PhaseSpaceBranch.pz]: 3.7748046e-06

right now (v0.29), groot/rtree doesn't provide the ability to fill a Tree from a contiguous buffer of bytes, with some metadata to instruct on how to interpret that buffer.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions