1- struct HAPIVariable{T,N,A <: AbstractArray{T,N} ,Tt <: AbstractVector } <: AbstractDataVariable{T,N}
1+ struct HAPIVariable{T, N, A <: AbstractArray{T, N} , Tt <: AbstractVector } <: AbstractDataVariable{T, N}
22 data:: A
33 time:: Tt
44 meta:: Dict
55end
66
7- function HAPIVariables (data, meta)
8- params = meta[" parameters" ]
7+ """
8+ A thin wrapper over NamedTuple for HAPI variables that shares the same time axis.
9+ """
10+ struct HAPIVariables{NT <: NamedTuple , D <: Dict }
11+ nt:: NT
12+ meta:: D
13+ end
14+
15+ @inline Base. parent (x:: HAPIVariables ) = getfield (x, :nt )
16+ times (x:: HAPIVariables ) = times (first (parent (x)))
17+ Base. propertynames (x:: HAPIVariables ) = propertynames (parent (x))
18+ Base. getproperty (x:: HAPIVariables , s:: Symbol ) = getproperty (parent (x), s)
19+ Base. length (x:: HAPIVariables ) = length (parent (x))
20+ Base. iterate (x:: HAPIVariables , args... ) = iterate (parent (x), args... )
21+ Base. getindex (x:: HAPIVariables , i) = getindex (parent (x), i)
22+
23+ function HAPIVariables (data, params, meta)
924 n = length (params) - 1
10- vars = [HAPIVariable (data, meta, i) for i in 1 : n]
11- return n == 1 ? first (vars) : vars
25+ names = Tuple (Symbol (params[i + 1 ][" name" ]) for i in 1 : n)
26+ values = (HAPIVariable (data, params, i) for i in 1 : n)
27+ return HAPIVariables (NamedTuple {names} (values), meta)
1228end
1329
1430colsize (param) = prod (get (param, " size" , 1 ))
1531
1632"""
17- HAPIVariable(data, meta , i)
33+ HAPIVariable(data, params , i)
1834
19- Construct a `HAPIVariable` object from CSV.File `data` and `meta ` at index `i`.
35+ Construct a `HAPIVariable` object from CSV.File `data` and `params ` at index `i`.
2036"""
21- function HAPIVariable (data:: CSV.File , meta , i:: Integer ; merge_metadata = true , stackcolumns = true )
37+ function HAPIVariable (data:: CSV.File , params , i:: Integer )
2238 time = Tables. getcolumn (data, 1 )
23- params = meta[" parameters" ]
24- param = params[i+ 1 ]
39+ param = params[i + 1 ]
2540 size = colsize (param)
2641 coloffset = mapreduce (colsize, + , @view (params[1 : i])) + 1
2742
2843 values = if size == 1
2944 Tables. getcolumn (data, coloffset)
30- elseif stackcolumns
31- stack (coloffset: coloffset+ size- 1 ) do i
45+ else
46+ stack (coloffset: ( coloffset + size - 1 ) ) do i
3247 Tables. getcolumn (data, i)
3348 end
34- else
35- cols = coloffset: (coloffset+ size- 1 )
36- map (row -> getindex .(Ref (row), cols), data)
3749 end
38- final_meta = merge_metadata ? delete! (merge (meta, param), " parameters" ) : param
39- HAPIVariable (values, time, final_meta)
50+ return HAPIVariable (values, time, param)
4051end
4152
4253"""
43- HAPIVariable(data, meta , i)
54+ HAPIVariable(data, params , i)
4455
45- Construct a `HAPIVariable` object from a JSON-parsed `data` and `meta ` at index `i`.
56+ Construct a `HAPIVariable` object from a JSON-parsed `data` and `params ` at index `i`.
4657"""
47- function HAPIVariable (data, meta , i:: Integer ; merge_metadata = true )
58+ function HAPIVariable (data, params , i:: Integer )
4859 time = @. DateTime (getindex (data, 1 ), DEFAULT_DATE_FORMAT)
49- param = meta[ " parameters " ][i + 1 ]
60+ param = params[i + 1 ]
5061 values = getindex .(data, i + 1 )
51- final_meta = merge_metadata ? delete! (merge (meta, param), " parameters" ) : param
52- HAPIVariable (values, time, final_meta)
62+ return HAPIVariable (values, time, param)
5363end
5464
5565"""
@@ -59,10 +69,10 @@ Construct a `HAPIVariable` object from a JSON-parsed Dict `d` (containing parame
5969"""
6070function HAPIVariable (d:: Dict , i:: Integer )
6171 data = d[" data" ]
62- param = d[" parameters" ][i+ 1 ]
72+ param = d[" parameters" ][i + 1 ]
6373 time = @. DateTime (getindex (data, 1 ), DEFAULT_DATE_FORMAT)
6474 values = getindex .(data, i + 1 )
65- HAPIVariable (values, time, param)
75+ return HAPIVariable (values, time, param)
6676end
6777
6878HAPIVariable (d:: Dict , meta, i:: Integer ) = HAPIVariable (d, i)
@@ -75,8 +85,8 @@ function hapi_uparse(u)
7585 isnothing (u) && return 1
7686 u == " UTC" && return 1
7787 u == " degrees" && return u " °"
78- uparse (u)
88+ return uparse (u)
7989end
8090hapi_uparse (units:: AbstractArray ) = hapi_uparse .(units)
8191
82- Unitful. unit (var:: HAPIVariable ) = hapi_uparse .(units (var))
92+ Unitful. unit (var:: HAPIVariable ) = hapi_uparse .(units (var))
0 commit comments