#root #tree-root #reading #physics #particle #binary #branch

oxyroot

尝试制作库以读取和写入在粒子物理学中常用的.root二进制文件。

22个版本

0.1.24 2024年4月24日
0.1.23 2024年4月21日
0.1.12 2024年3月30日
0.1.6 2022年7月29日

#57 in 压缩

Download history 209/week @ 2024-04-29 117/week @ 2024-05-06 505/week @ 2024-05-13 358/week @ 2024-05-20 47/week @ 2024-05-27 164/week @ 2024-06-03 113/week @ 2024-06-10 662/week @ 2024-06-17 98/week @ 2024-06-24 3/week @ 2024-07-01 10/week @ 2024-07-08 170/week @ 2024-07-15 180/week @ 2024-07-22 315/week @ 2024-07-29 15/week @ 2024-08-05 77/week @ 2024-08-12

每月592次下载
6 个crate中(直接使用 3 个)使用

MIT/Apache

545KB
13K SLoC

oxyroot

Crates.io Documentation

尝试制作库以读取和写入在粒子物理学中常用的.root二进制文件。

命令行工具

灵感来源

为了制作这个库

  • groot中获得了大量灵感,用于读取root文件,甚至包括代码组织
  • uproot中获得了灵感,以提供分支接口(用于读取篮子缓冲区)

局限性

目前

  • 只能写入未压缩文件

另请参阅

另一个root读取器的Rust实现是 root-io

入门指南

示例:遍历包含 i32 值的分支树

use oxyroot::RootFile;
let s = "examples/from_uproot/data/HZZ.root";
let tree = RootFile::open(s).unwrap().get_tree("events").unwrap();
let NJet = tree.branch("NJet").unwrap().as_iter::<i32>();
NJet.for_each( | v| trace!("v = {v}"));

示例:在分支中写入i32值

use oxyroot::{RootFile, WriterTree};
let s = "/tmp/simple.root";
let mut file = RootFile::create(s).expect("Can not create file");
let mut tree = WriterTree::new("mytree");
let it = (0..15);
tree.new_branch("it", it);
tree.write( & mut file).expect("Can not write tree");
file.close().expect("Can not close file");

示例:遍历包含 Vec<i32>(即 std::vector<int32_t>)值的分支树

use oxyroot::RootFile;
let s = "tests/stl_containers/stl_containers.root";
let tree = RootFile::open(s).unwrap().get_tree("tree").unwrap();
let vector_int32 = tree.branch("vector_int32")
.unwrap().as_iter::<Vec<i32> > ()
.collect::<Vec<_ > > ();
assert_eq!(
    vector_int32,
    [
        vec![1],
        vec![1, 2],
        vec![1, 2, 3],
        vec![1, 2, 3, 4],
        vec![1, 2, 3, 4, 5]
    ]
);

示例:使用 ReadFromTree 遍历多个分支。

如果您有一个包含多个分支的root文件,您可以使用 ReadFromTree 一次读取它们所有。要从分支 xy 读取 Point

use oxyroot::ReadFromTree;

#[derive(ReadFromTree)]
struct Point {
    // will read from branch "x"  
    x: f64,
    // will read from branch "y"
    y: f64,
}

let s = "tests/point/point.root";
let tree = RootFile::open(s).unwrap().get_tree("tree").unwrap();
let points = Point::from_tree(tree).unwrap();

for point in points {
println!("x = {}, y = {}", point.x, point.y);
}

示例:使用 WriteToTree 将数据写入多个分支。

use oxyroot::ReadFromTree;

#[derive(WriteToTree)]
struct Point {
    // will write to branch "x"  
    x: f64,
    // will write to branch "y"
    y: f64,
}

let s = "tests/point/point.root";
let mut f = RootFile::create(s).unwrap();
let mut tree = WriterTree::new("tree");

let points = vec![Point { x: 1.0, y: 2.0 }, Point { x: 3.0, y: 4.0 }];

Test::to_tree(points.into_iter(), & mut tree).unwrap();

tree.write( & mut f).unwrap();
f.close().unwrap();

功能

oxyroot 使用 flate2 解压缩 zlib 压缩数据。默认后端是 miniz_oxide,纯 Rust 包。
如果您想获得最佳性能,可以使用 zlib-ng C 库

[dependencies]
oxyroot = { version = "0.1", features = ["zlib-ng"] }

依赖项

~7–9.5MB
~169K SLoC