Skip to content

Commit

Permalink
Merge pull request #85 from legend-exp/patch_unitful
Browse files Browse the repository at this point in the history
Bug fix `lprops`
  • Loading branch information
fhagemann authored Dec 10, 2024
2 parents 250b02a + f67289d commit 0d3faa7
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 3 deletions.
2 changes: 2 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9"
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
UnitfulAtomic = "a7773ee8-282e-5fa2-be4e-bd808c38a91a"

[weakdeps]
LegendDataTypes = "99e09c13-5545-5ee2-bfa2-77f358fb75d8"
Expand Down Expand Up @@ -73,4 +74,5 @@ Tables = "1.1"
TypedTables = "1.4"
UUIDs = "<0.0.1, 1"
Unitful = "1.11"
UnitfulAtomic = "1"
julia = "1.10"
1 change: 1 addition & 0 deletions src/LegendDataManagement.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ using PropDicts
using PropertyDicts
using StructArrays
using Unitful
using UnitfulAtomic
using Measurements
using Measurements: ±, value, uncertainty

Expand Down
29 changes: 26 additions & 3 deletions src/lprops.jl
Original file line number Diff line number Diff line change
@@ -1,20 +1,43 @@
# This file is a part of LegendDataManagement.jl, licensed under the MIT License (MIT).

const _pseudo_unit_expr = r"(^|[^A-Za-z])(ADC|adc|sample)([^A-Za-z]|$)"

function units_from_string(s::AbstractString)
if isempty(s) || s == "none"
NoUnits
elseif !isnothing(match(_pseudo_unit_expr, s))
NoUnits
else
try
uparse(s, unit_context=[Unitful, UnitfulAtomic])
catch e
s == "e" && return u"e_au" # parse "e" as u"e_au" from UnitfulAtomic
if e isa ErrorException
rethrow(ArgumentError("Unknown physical unit \"$s\""))
else
rethrow(e)
end
end
end
end

units_to_string(u::Unitful.Unitlike) = string(u)

function _props2lprops(pd::PropDict)
if haskey(pd, :val) && length(keys(pd)) <= 3 && (haskey(pd, :unit) || haskey(pd, :err))
if haskey(pd, :unit)
if haskey(pd, :err)
Unitful.Quantity.(measurement.(pd.val, ifelse(isnothing(pd.err), NaN, pd.err)), Unitful.uparse(pd.unit))
Unitful.Quantity.(measurement.(pd.val, ifelse(isnothing(pd.err), NaN, pd.err)), units_from_string(pd.unit))
else
Unitful.Quantity.(pd.val, Unitful.uparse(pd.unit))
Unitful.Quantity.(pd.val, units_from_string(pd.unit))
end
elseif haskey(pd, :err)
measurement.(pd.val, ifelse(isnothing(pd.err), NaN, pd.err))
else
throw(ArgumentError("_props2lprops can't handle PropDict $pd"))
end
elseif haskey(pd, :unit) && length(keys(pd)) == 1
Unitful.Quantity(NaN, Unitful.uparse(pd.unit))
Unitful.Quantity(NaN, units_from_string(pd.unit))
else
PropDict(Dict([key => _props2lprops(val) for (key, val) in pd]))
end
Expand Down

0 comments on commit 0d3faa7

Please sign in to comment.