From 0625953503d485cee6520488f9718e570f68687e Mon Sep 17 00:00:00 2001 From: Nick Amin Date: Mon, 27 Sep 2021 22:53:40 -0700 Subject: [PATCH 1/3] add some functions --- Project.toml | 1 + src/UnROOT.jl | 1 + src/iteration.jl | 25 +++++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/Project.toml b/Project.toml index cd813eba..94a94ccd 100644 --- a/Project.toml +++ b/Project.toml @@ -10,6 +10,7 @@ CodecLz4 = "5ba52731-8f18-5e0d-9241-30f10d1ec561" CodecXz = "ba30903b-d9e8-5048-a5ec-d1f5b0d4b47b" CodecZlib = "944b1d66-785c-5afd-91f1-9de20f533193" CodecZstd = "6b39b394-51ab-5f42-8807-6242bab2b4c2" +IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e" LRUCache = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" LorentzVectors = "3f54b04b-17fc-5cd4-9758-90c048d965e3" Memoization = "6fafb56a-5788-4b4e-91ca-c0cea6611c73" diff --git a/src/UnROOT.jl b/src/UnROOT.jl index 2e58975c..9c08e5cb 100644 --- a/src/UnROOT.jl +++ b/src/UnROOT.jl @@ -10,6 +10,7 @@ import AbstractTrees: children, printnode, print_tree using CodecZlib, CodecLz4, CodecXz, CodecZstd, StaticArrays, LorentzVectors, ArraysOfArrays using Mixers, Parameters, Memoization, LRUCache +import IterTools: groupby import Tables, TypedTables, PrettyTables diff --git a/src/iteration.jl b/src/iteration.jl index 0ff09b13..6d7c4d7a 100644 --- a/src/iteration.jl +++ b/src/iteration.jl @@ -307,3 +307,28 @@ end function Base.getindex(ba::LazyBranch{T,J,B}, rang::UnitRange) where {T,J,B} return [ba[i] for i in rang] end + +clusterranges(t::LazyTree) = clusterranges([getproperty(t,p) for p in propertynames(t)]) +function clusterranges(lbs::Vector{LazyBranch}) + basketentries = [lb.b.fBasketEntry[1:numbaskets(lb.b)+1] for lb in lbs] + common = mapreduce(Set, ∩, basketentries) |> collect |> sort + clusterranges = [common[i]+1:common[i+1] for i in 1:length(common)-1] + return clusterranges +end +clusterbytes(t::LazyTree; kw...) = clusterbytes([getproperty(t,p) for p in propertynames(t)]; kw...) +function clusterbytes(lbs::Vector{LazyBranch}; compressed=false) + basketentries = [lb.b.fBasketEntry[1:numbaskets(lb.b)+1] for lb in lbs] + common = mapreduce(Set, ∩, basketentries) |> collect |> sort + bytes = zeros(Float64, length(common)-1) + for lb in lbs + b = lb.b + finflate = compressed ? 1.0 : b.fTotBytes/b.fZipBytes + entries = b.fBasketEntry[1:numbaskets(b)+1] + basketbytes = b.fBasketBytes[1:numbaskets(b)+1] * finflate + iclusters = searchsortedlast.(Ref(common), entries[1:end-1]) + pairs = zip(iclusters, basketbytes) + sumbytes = [sum(last.(g)) for g in groupby(first, pairs)] + bytes .+= sumbytes + end + return bytes +end From 54bcee12c1a5372992f37a4975321d54102b14a1 Mon Sep 17 00:00:00 2001 From: Nick Amin Date: Mon, 27 Sep 2021 23:30:30 -0700 Subject: [PATCH 2/3] add tests --- src/iteration.jl | 13 +++++++------ test/runtests.jl | 12 ++++++++++++ test/samples/tree_with_clusters.py | 19 +++++++++++++++++++ test/samples/tree_with_clusters.root | Bin 0 -> 64439 bytes 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 test/samples/tree_with_clusters.py create mode 100644 test/samples/tree_with_clusters.root diff --git a/src/iteration.jl b/src/iteration.jl index 6d7c4d7a..67766c78 100644 --- a/src/iteration.jl +++ b/src/iteration.jl @@ -308,15 +308,14 @@ function Base.getindex(ba::LazyBranch{T,J,B}, rang::UnitRange) where {T,J,B} return [ba[i] for i in rang] end -clusterranges(t::LazyTree) = clusterranges([getproperty(t,p) for p in propertynames(t)]) -function clusterranges(lbs::Vector{LazyBranch}) +_clusterranges(t::LazyTree) = _clusterranges([getproperty(t,p) for p in propertynames(t)]) +function _clusterranges(lbs::AbstractVector{<:LazyBranch}) basketentries = [lb.b.fBasketEntry[1:numbaskets(lb.b)+1] for lb in lbs] common = mapreduce(Set, ∩, basketentries) |> collect |> sort - clusterranges = [common[i]+1:common[i+1] for i in 1:length(common)-1] - return clusterranges + return [common[i]+1:common[i+1] for i in 1:length(common)-1] end -clusterbytes(t::LazyTree; kw...) = clusterbytes([getproperty(t,p) for p in propertynames(t)]; kw...) -function clusterbytes(lbs::Vector{LazyBranch}; compressed=false) +_clusterbytes(t::LazyTree; kw...) = _clusterbytes([getproperty(t,p) for p in propertynames(t)]; kw...) +function _clusterbytes(lbs::AbstractVector{<:LazyBranch}; compressed=false) basketentries = [lb.b.fBasketEntry[1:numbaskets(lb.b)+1] for lb in lbs] common = mapreduce(Set, ∩, basketentries) |> collect |> sort bytes = zeros(Float64, length(common)-1) @@ -332,3 +331,5 @@ function clusterbytes(lbs::Vector{LazyBranch}; compressed=false) end return bytes end + +Tables.partitions(t::LazyTree) = (t[r] for r in _clusterranges(t)) diff --git a/test/runtests.jl b/test/runtests.jl index 6038efa1..e166c49a 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -690,3 +690,15 @@ end @test (UnROOT.basketarray_iter(t.b1) .|> length) == [1228, 1228, 44] @test length(UnROOT.basketarray(t.b1, 1)) == 1228 end + +@testset "Cluster ranges" begin + t = LazyTree(UnROOT.samplefile("blah.root"),"t1"); + @test all(UnROOT._clusterbytes(t; compressed=true) .< 10000) + @test all(UnROOT._clusterbytes(t; compressed=false) .< 10000) + @test UnROOT._clusterbytes([t.b1,t.b2]) == UnROOT._clusterbytes(t) + @test length(UnROOT._clusterranges([t.b1])) == 157 + @test length(UnROOT._clusterranges([t.b2])) == 70 + @test length(UnROOT._clusterranges(t)) == 18 # same as uproot4 + @test sum(UnROOT._clusterbytes([t.b1]; compressed=true)) == 33493.0 # same as uproot4 + @test sum(UnROOT._clusterbytes([t.b2]; compressed=true)) == 23710.0 # same as uproot4 +end diff --git a/test/samples/tree_with_clusters.py b/test/samples/tree_with_clusters.py new file mode 100644 index 00000000..8b83fd2c --- /dev/null +++ b/test/samples/tree_with_clusters.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +import ROOT as r + +f = r.TFile("tree_with_clusters.root", "recreate") +t = r.TTree("t1","t1") +v1 = r.vector("int")() +v2 = r.vector("int")() +t.Branch("b1", v1, 500) # default bufsize is 32000, but making sure +t.Branch("b2", v2, 1000) # default bufsize is 32000, but making sure +t.SetAutoFlush(10000) +for irow in range(2500): + v1.clear() + v2.clear() + for e in [irow+q for q in range(2)]: + v1.push_back(e) + v2.push_back(e+1) + t.Fill() +t.Write() +f.Close() diff --git a/test/samples/tree_with_clusters.root b/test/samples/tree_with_clusters.root new file mode 100644 index 0000000000000000000000000000000000000000..7748315056f3a97e48fac813ec55d30eb621b4b6 GIT binary patch literal 64439 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 literal 0 HcmV?d00001 From 987d7e2e8ea1b614b12c68d41e658946975ad5f9 Mon Sep 17 00:00:00 2001 From: Nick Amin Date: Mon, 27 Sep 2021 23:34:11 -0700 Subject: [PATCH 3/3] fix --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index e166c49a..d7d54ac9 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -692,7 +692,7 @@ end end @testset "Cluster ranges" begin - t = LazyTree(UnROOT.samplefile("blah.root"),"t1"); + t = LazyTree(UnROOT.samplefile("tree_with_clusters.root"),"t1"); @test all(UnROOT._clusterbytes(t; compressed=true) .< 10000) @test all(UnROOT._clusterbytes(t; compressed=false) .< 10000) @test UnROOT._clusterbytes([t.b1,t.b2]) == UnROOT._clusterbytes(t)