From ac66158f38d8b0fecec06595473f9879b3f693d8 Mon Sep 17 00:00:00 2001 From: Nick Amin Date: Thu, 16 Sep 2021 18:34:01 -0700 Subject: [PATCH] add more basic types (#110) --- src/iteration.jl | 1 + src/root.jl | 14 +++++--- test/runtests.jl | 6 ++++ test/samples/tree_basictypes.py | 57 ++++++++++++++++++++++++++++++ test/samples/tree_basictypes.root | Bin 0 -> 9106 bytes 5 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 test/samples/tree_basictypes.py create mode 100644 test/samples/tree_basictypes.root diff --git a/src/iteration.jl b/src/iteration.jl index 1cfee31b..776c51a8 100644 --- a/src/iteration.jl +++ b/src/iteration.jl @@ -97,6 +97,7 @@ mutable struct LazyBranch{T,J,B} <: AbstractVector{T} function LazyBranch(f::ROOTFile, b::Union{TBranch,TBranchElement}) T, J = auto_T_JaggT(f, b; customstructs=f.customstructs) + T = (T === Vector{Bool} ? BitVector : T) _buffer = J === Nojagg ? T[] : VectorOfVectors(T(), Int32[1]) return new{T,J,typeof(_buffer)}(f, b, length(b), b.fBasketEntry, diff --git a/src/root.jl b/src/root.jl index d730c5b3..a49fc005 100644 --- a/src/root.jl +++ b/src/root.jl @@ -127,11 +127,11 @@ end function Base.getindex(f::ROOTFile, s::AbstractString) S = _getindex(f, s) if S isa Union{TBranch, TBranchElement} - try # if we can't construct LazyBranch, just give up (maybe due to custom class) + # try # if we can't construct LazyBranch, just give up (maybe due to custom class) return LazyBranch(f, S) - catch - @warn "Can't automatically create LazyBranch for branch $s. Returning a branch object" - end + # catch + # @warn "Can't automatically create LazyBranch for branch $s. Returning a branch object" + # end end S end @@ -364,9 +364,13 @@ function auto_T_JaggT(f::ROOTFile, branch; customstructs::Dict{String, Type}) elseif elname == "unsigned int" UInt32 elseif elname == "unsigned char" - Char + UInt8 elseif elname == "unsigned short" UInt16 + elseif elname == "unsigned long" + UInt64 + elseif elname == "long64" + Int64 elseif elname == "ulong64" UInt64 else diff --git a/test/runtests.jl b/test/runtests.jl index 357fcddc..4307bab6 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -676,3 +676,9 @@ end f = UnROOT.samplefile("issue11_tdirectory.root") @test sum(f["Data/mytree/Particle0_E"]) ≈ 1012.0 end + +@testset "Basic C++ types" begin + f = UnROOT.samplefile("tree_basictypes.root") + onesrow = LazyTree(f,"t")[2] |> values .|> first .|> Int + @test all(onesrow .== 1) +end diff --git a/test/samples/tree_basictypes.py b/test/samples/tree_basictypes.py new file mode 100644 index 00000000..5340be9b --- /dev/null +++ b/test/samples/tree_basictypes.py @@ -0,0 +1,57 @@ +import ROOT as r + +# from https://en.cppreference.com/w/cpp/language/types +typenames = [ + # char + "char", "unsigned char", + # bool + "bool", + # short + "short", "short int", "signed short", "signed short int", "unsigned short", "unsigned short int", + # int + "int", "signed", "signed int", "unsigned", "unsigned int", + # long + "long", "long int", "long int", "signed long", "signed long int", "unsigned long", "unsigned long int", + # long long + "long long", "long long int", "signed long long", "signed long long int", "unsigned long long", "unsigned long long int", + # float/double + "float", "double", + ] + +print(len(typenames), typenames) + +roottypestrs = set() +for typename in typenames: + obj = r.vector(typename) + # print(typename, obj, obj()) + roottypestr = str(obj).split("'")[1].split("<")[1].split(">")[0] + roottypestrs.add(roottypestr) + +# since many of the above map to the same "root type", `roottypestrs` ends up being + +# {'long', 'Long64_t', 'unsigned char', 'short', 'unsigned long', 'long double', +# 'char', 'unsigned short', 'ULong64_t', 'float', 'bool', 'double', +# 'int', 'unsigned int'} + +print(len(roottypestrs), roottypestrs) + +import ROOT as r +f = r.TFile("tree_basictypes.root", "recreate") +t = r.TTree("t", "") + +d_objs = dict() +for typename in roottypestrs: + nicename = typename.lower().replace("_t","").replace(" ","") + obj = r.vector(typename)() + t.Branch(nicename, obj) + d_objs[typename] = obj + +for ievt in range(3): + for typename, obj in d_objs.items(): + obj.clear() + for _ in range(ievt): + obj.push_back(1) + t.Fill() + +t.Write() +f.Close() diff --git a/test/samples/tree_basictypes.root b/test/samples/tree_basictypes.root new file mode 100644 index 0000000000000000000000000000000000000000..ba0da600c5be4461bc48a48dc0cbd21b30ea7ce8 GIT binary patch literal 9106 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