From a706aa09a5a19f5b705ac027b4a9de755367c076 Mon Sep 17 00:00:00 2001 From: Florian Henkes Date: Tue, 10 Dec 2024 12:16:41 +0100 Subject: [PATCH] Parse units with unit_from_string to include other units --- src/lprops.jl | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/lprops.jl b/src/lprops.jl index 9bc1ab17..666117e7 100644 --- a/src/lprops.jl +++ b/src/lprops.jl @@ -1,12 +1,35 @@ # 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)) @@ -14,7 +37,7 @@ function _props2lprops(pd::PropDict) 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