Skip to content

Commit 25818e0

Browse files
Merge branch 'main' of github.com:JuliaGeo/CommonDataModel.jl
2 parents 6386194 + ad294d7 commit 25818e0

File tree

8 files changed

+90
-79
lines changed

8 files changed

+90
-79
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ This package contains abstracts type definition for loading and manipulating GRI
1414
| GRIB | [`GRIBDatasets`](https://github.com/JuliaGeo/GRIBDatasets.jl) || - |
1515
| geoTIFF | [`TIFFDatasets`](https://github.com/Alexander-Barth/TIFFDatasets.jl) || - |
1616
| Zarr | [`ZarrDatasets`](https://github.com/JuliaGeo/ZarrDatasets.jl) |||
17+
| | [`MetopDatasets`](https://github.com/eumetsat/MetopDatasets.jl) || - |
1718

1819

1920
Features include:

src/cfvariable.jl

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@ Return a tuple of integers with the size of the variable `var`.
1111
Note that the size of a variable can change, i.e. for a variable with an
1212
unlimited dimension.
1313
"""
14-
Base.size(v::CFVariable) = size(v.var)
14+
Base.size(v::CFVariable) = size(parent(v))
15+
Base.parent(v::CFVariable) = v.var
1516

16-
name(v::CFVariable) = name(v.var)
17-
dataset(v::CFVariable) = dataset(v.var)
17+
name(v::CFVariable) = name(parent(v))
18+
dataset(v::CFVariable) = dataset(parent(v))
1819

1920

20-
# be aware that for GRIBDatasets v.attrib is different from v.var.attrib
21+
# be aware that for GRIBDatasets v.attrib is different from parent(v).attrib
2122
attribnames(v::CFVariable) = keys(v.attrib)
2223
attrib(v::CFVariable,name::SymbolOrString) = v.attrib[name]
2324
defAttrib(v::CFVariable,name,value) = v.attrib[name] = value
2425
delAttrib(v::CFVariable,name) = delete!(v,name)
2526

26-
dimnames(v::CFVariable) = dimnames(v.var)
27-
dim(v::CFVariable,name::SymbolOrString) = dim(v.var,name)
27+
dimnames(v::CFVariable) = dimnames(parent(v))
28+
dim(v::CFVariable,name::SymbolOrString) = dim(parent(v),name)
2829

2930
# necessary for IJulia if showing a variable from a closed file
3031
Base.show(io::IO,::MIME"text/plain",v::AbstractVariable) = show(io,v)
@@ -215,7 +216,7 @@ missing_values(v::CFVariable) = v._storage_attrib.missing_values
215216

216217
# collect all possible fill values
217218
function fill_and_missing_values(v::CFVariable)
218-
T = eltype(v.var)
219+
T = eltype(parent(v))
219220
fv = ()
220221
if !isnothing(fillvalue(v))
221222
fv = (fillvalue(v),)
@@ -448,29 +449,29 @@ end
448449
#@inline CFinvtransformdata(data::Char,fv,scale_factor,add_offset,time_origin,time_factor,DT) = CFtransform_replace_missing(data,fv)
449450

450451
function Base.getindex(v::CFVariable, indexes::TIndices...)
451-
data = v.var[indexes...]
452+
data = parent(v)[indexes...]
452453
return CFtransformdata(data,fill_and_missing_values(v),scale_factor(v),add_offset(v),
453454
time_origin(v),time_factor(v),maskingvalue(v),eltype(v))
454455
end
455456

456457
function Base.setindex!(v::CFVariable,data::Array{Missing,N},indexes::TIndices...) where N
457-
v.var[indexes...] = fill(fillvalue(v),size(data))
458+
parent(v)[indexes...] = fill(fillvalue(v),size(data))
458459
end
459460

460461
function Base.setindex!(v::CFVariable,data::Missing,indexes::TIndices...)
461-
v.var[indexes...] = fillvalue(v)
462+
parent(v)[indexes...] = fillvalue(v)
462463
end
463464

464465
function Base.setindex!(v::CFVariable,data::Union{T,Array{T}},indexes::TIndices...) where T <: Union{AbstractCFDateTime,DateTime,Missing}
465466

466467
if calendar(v) !== nothing
467468
# can throw an convertion error if calendar attribute already exists and
468469
# is incompatible with the provided data
469-
v.var[indexes...] = CFinvtransformdata(
470+
parent(v)[indexes...] = CFinvtransformdata(
470471
data,fill_and_missing_values(v),scale_factor(v),add_offset(v),
471472
time_origin(v),time_factor(v),
472473
maskingvalue(v),
473-
eltype(v.var))
474+
eltype(parent(v)))
474475
return data
475476
end
476477

@@ -479,12 +480,12 @@ end
479480

480481

481482
function Base.setindex!(v::CFVariable,data,indexes::TIndices...)
482-
v.var[indexes...] = CFinvtransformdata(
483+
parent(v)[indexes...] = CFinvtransformdata(
483484
data,fill_and_missing_values(v),
484485
scale_factor(v),add_offset(v),
485486
time_origin(v),time_factor(v),
486487
maskingvalue(v),
487-
eltype(v.var))
488+
eltype(parent(v)))
488489

489490
return data
490491
end
@@ -551,20 +552,20 @@ end
551552
552553
Return a tuple of strings with the dimension names of the variable `v`.
553554
"""
554-
dimnames(v::Union{CFVariable,MFCFVariable}) = dimnames(v.var)
555+
dimnames(v::Union{CFVariable,MFCFVariable}) = dimnames(parent(v))
555556

556-
name(v::Union{CFVariable,MFCFVariable}) = name(v.var)
557-
chunking(v::CFVariable,storage,chunksize) = chunking(v.var,storage,chunksize)
558-
chunking(v::CFVariable) = chunking(v.var)
557+
name(v::Union{CFVariable,MFCFVariable}) = name(parent(v))
558+
chunking(v::CFVariable,storage,chunksize) = chunking(parent(v),storage,chunksize)
559+
chunking(v::CFVariable) = chunking(parent(v))
559560

560-
deflate(v::CFVariable,shuffle,dodeflate,deflate_level) = deflate(v.var,shuffle,dodeflate,deflate_level)
561-
deflate(v::CFVariable) = deflate(v.var)
561+
deflate(v::CFVariable,shuffle,dodeflate,deflate_level) = deflate(parent(v),shuffle,dodeflate,deflate_level)
562+
deflate(v::CFVariable) = deflate(parent(v))
562563

563-
checksum(v::CFVariable,checksummethod) = checksum(v.var,checksummethod)
564-
checksum(v::CFVariable) = checksum(v.var)
564+
checksum(v::CFVariable,checksummethod) = checksum(parent(v),checksummethod)
565+
checksum(v::CFVariable) = checksum(parent(v))
565566

566567

567-
fillmode(v::CFVariable) = fillmode(v.var)
568+
fillmode(v::CFVariable) = fillmode(parent(v))
568569

569570

570571
############################################################
@@ -585,7 +586,7 @@ end
585586
586587
Loads a NetCDF (or other format) variables `ncvar` in-place and puts the result in `data` (an
587588
array of `eltype(ncvar)`) along the specified `indices`. `buffer` is a temporary
588-
array of the same size as data but the type should be `eltype(ncv.var)`, i.e.
589+
array of the same size as data but the type should be `eltype(parent(ncv))`, i.e.
589590
the corresponding type in the files (before applying `scale_factor`,
590591
`add_offset` and masking fill values). Scaling and masking will be applied to
591592
the array `data`.
@@ -608,17 +609,17 @@ ds = Dataset("file.nc")
608609
ncv = ds["vgos"];
609610
# data and buffer must have the right shape and type
610611
data = zeros(eltype(ncv),size(ncv)); # here Vector{Float64}
611-
buffer = zeros(eltype(ncv.var),size(ncv)); # here Vector{Int16}
612+
buffer = zeros(eltype(parent(ncv)),size(ncv)); # here Vector{Int16}
612613
NCDatasets.load!(ncv,data,buffer,:,:,:)
613614
close(ds)
614615
```
615616
"""
616617
@inline function load!(v::Union{CFVariable{T,N},MFCFVariable{T,N},SubVariable{T,N}}, data, buffer, indices::TIndices...) where {T,N}
617618

618-
if v.var == nothing
619+
if parent(v) == nothing
619620
return load!(v,indices...)
620621
else
621-
load!(v.var,buffer,indices...)
622+
load!(parent(v),buffer,indices...)
622623
fmv = fill_and_missing_values(v)
623624
return CFtransformdata!(data,buffer,fmv,scale_factor(v),add_offset(v),
624625
time_origin(v),time_factor(v),

src/defer.jl

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,16 @@ function DeferDataset(TDS,r::Resource,groupname::String,data::OrderedDict)
6161
return dds
6262
end
6363

64-
function DeferDataset(TDS,filename::AbstractString,mode::AbstractString,info::OrderedDict)
65-
r = Resource(filename,mode,info)
64+
function DeferDataset(TDS,filename::AbstractString,mode::AbstractString,info::OrderedDict; kwargs...)
65+
r = Resource(filename,mode,Dict(kwargs),info)
6666
groupname = "/"
6767
return DeferDataset(TDS,r,groupname,info)
6868
end
6969

70-
function DeferDataset(TDS,filename::AbstractString,mode = "r")
70+
function DeferDataset(TDS,filename::AbstractString,mode = "r"; kwargs...)
7171
TDS(filename,mode) do ds
7272
info = metadata(ds)
73-
r = Resource(filename,mode,info)
73+
r = Resource(filename,mode,Dict(kwargs),info)
7474
groupname = "/"
7575
return DeferDataset(TDS,r,groupname,info)
7676
end
@@ -83,8 +83,14 @@ groupname(dds::DeferDataset) = dds.groupname
8383
path(dds::DeferDataset) = dds.r.filename
8484
varnames(dds::DeferDataset) = collect(keys(dds.data[:var]))
8585

86+
function maskingvalue(dds::DeferDataset{TDS}) where TDS
87+
TDS(dds.r.filename,dds.r.mode; dds.r.args...) do ds
88+
maskingvalue(ds)
89+
end
90+
end
91+
8692
function Variable(f::Function, dv::DeferVariable{T,N,TDS}) where {T,N,TDS}
87-
TDS(dv.r.filename,dv.r.mode) do ds
93+
TDS(dv.r.filename,dv.r.mode; dv.r.args...) do ds
8894
f(variable(ds,dv.varname))
8995
end
9096
end
@@ -103,7 +109,7 @@ end
103109
variable(dds::DeferDataset,varname::Symbol) = variable(dds,string(varname))
104110

105111
dataset(dv::DeferVariable{T,N,TDS}) where {T,N,TDS} =
106-
DeferDataset(TDS,dv.r.filename,dv.r.mode)
112+
DeferDataset(TDS,dv.r.filename,dv.r.mode; dv.r.args...)
107113

108114
function Base.getindex(dv::DeferVariable,indexes::Union{Int,Colon,AbstractRange{<:Integer}}...)
109115
Variable(dv) do v

src/memory_dataset.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ function grow_unlimited_dimension(ds,dname,len)
6868
end
6969
end
7070

71-
Base.getindex(v::MemoryVariable,ij::TIndices...) = v.data[ij...]
72-
CDM.load!(v::MemoryVariable,buffer,ij...) = buffer .= view(v.data,ij...)
73-
71+
Base.parent(v::MemoryVariable) = v.data
72+
Base.size(v::MemoryVariable) = size(parent(v))
73+
Base.getindex(v::MemoryVariable,ij::TIndices...) = parent(v)[ij...]
7474
function Base.setindex!(v::MemoryVariable,data,ij...)
75-
sz = size(v.data)
76-
v.data[ij...] = data
75+
sz = size(v)
76+
parent(v)[ij...] = data
7777

7878
root = _root(v)
7979
for idim = findall(size(v) .> sz)
@@ -82,7 +82,8 @@ function Base.setindex!(v::MemoryVariable,data,ij...)
8282
end
8383
return data
8484
end
85-
Base.size(v::MemoryVariable) = size(v.data)
85+
86+
CDM.load!(v::MemoryVariable,buffer,ij...) = buffer .= view(parent(v),ij...)
8687
CDM.name(v::Union{MemoryVariable,MemoryDataset}) = v.name
8788
CDM.dimnames(v::MemoryVariable) = v.dimnames
8889
CDM.dataset(v::MemoryVariable) = v.parent_dataset

src/multifile.jl

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ function parentdataset(mfds::MFDataset)
7272
end
7373
end
7474

75-
Base.Array(v::MFVariable) = Array(v.var)
76-
7775
iswritable(mfds::MFDataset) = iswritable(mfds.ds[1])
7876

7977
function MFDataset(ds,aggdim,isnewdim,constvars)
@@ -94,6 +92,7 @@ function MFDataset(TDS,fnames::AbstractArray{<:AbstractString,N},mode = "r";
9492
_aggdimconstant = false,
9593
isnewdim = false,
9694
constvars = Union{Symbol,String}[],
95+
kwargs...
9796
) where N
9897
if !(mode == "r" || mode == "a")
9998
throw(ArgumentError("""Unsupported mode for multi-file dataset (mode = $(mode)). Mode must be "r" or "a"."""))
@@ -105,20 +104,20 @@ function MFDataset(TDS,fnames::AbstractArray{<:AbstractString,N},mode = "r";
105104
if _aggdimconstant
106105
# load only metadata from master
107106
master_index = 1
108-
ds_master = TDS(fnames[master_index],mode);
107+
ds_master = TDS(fnames[master_index],mode; kwargs...);
109108
data_master = metadata(ds_master)
110109
ds = Vector{Union{TDS,DeferDataset}}(undef,length(fnames))
111110
#ds[master_index] = ds_master
112111
for (i,fname) in enumerate(fnames)
113112
#if i !== master_index
114-
ds[i] = DeferDataset(TDS,fname,mode,data_master)
113+
ds[i] = DeferDataset(TDS,fname,mode,data_master; kwargs...)
115114
#end
116115
end
117116
else
118-
ds = DeferDataset.(TDS,fnames,mode)
117+
ds = DeferDataset.(TDS,fnames,mode; kwargs...)
119118
end
120119
else
121-
ds = TDS.(fnames,mode);
120+
ds = TDS.(fnames,mode,kwargs...);
122121
end
123122

124123
if (aggdim == nothing) && !isnewdim
@@ -135,7 +134,7 @@ function MFDataset(ds::AbstractVector{<:AbstractDataset};
135134
deferopen = true,
136135
_aggdimconstant = false,
137136
isnewdim = false,
138-
constvars = Union{Symbol,String}[],
137+
constvars = Union{Symbol,String}[]
139138
)
140139

141140
MFDataset(ds,aggdim,isnewdim,Symbol.(constvars))
@@ -176,18 +175,26 @@ function varnames(mfds::MFDataset)
176175
end
177176
end
178177

179-
Base.getindex(v::MFVariable,indexes::TIndices...) = getindex(v.var,indexes...)
180-
Base.setindex!(v::MFVariable,data,indexes::TIndices...) = setindex!(v.var,data,indexes...)
178+
maskingvalue(mfds::MFDataset) = maskingvalue(mfds.ds[1])
181179

182180

183-
load!(v::MFVariable,buffer,indexes...) = CatArrays.load!(v.var,buffer,indexes...)
181+
Base.parent(v::MFVariable) = v.var
182+
Base.parent(v::MFCFVariable) = v.var
183+
Base.Array(v::MFVariable) = Array(parent(v))
184+
Base.getindex(v::MFVariable,indexes::TIndices...) = getindex(parent(v),indexes...)
185+
Base.setindex!(v::MFVariable,data,indexes::TIndices...) = setindex!(parent(v),data,indexes...)
186+
Base.size(v::MFVariable) = size(parent(v))
187+
Base.size(v::MFCFVariable) = size(parent(v))
188+
Base.getindex(v::MFCFVariable,ind::TIndices...) = v.cfvar[ind...]
189+
Base.setindex!(v::MFCFVariable,data,ind::TIndices...) = v.cfvar[ind...] = data
190+
function Base.cat(vs::AbstractVariable...; dims::Integer)
191+
CatArrays.CatArray(dims,vs...)
192+
end
184193

185-
Base.size(v::MFVariable) = size(v.var)
186-
Base.size(v::MFCFVariable) = size(v.var)
194+
load!(v::MFVariable,buffer,indexes...) = CatArrays.load!(parent(v),buffer,indexes...)
187195
dimnames(v::MFVariable) = v.dimnames
188196
name(v::MFVariable) = v.varname
189197

190-
191198
function variable(mfds::MFDataset,varname::SymbolOrString)
192199
if mfds.isnewdim
193200
if Symbol(varname) in mfds.constvars
@@ -268,15 +275,6 @@ end
268275

269276
dataset(v::Union{MFVariable,MFCFVariable}) = v.ds
270277

271-
272-
Base.getindex(v::MFCFVariable,ind::TIndices...) = v.cfvar[ind...]
273-
Base.setindex!(v::MFCFVariable,data,ind::TIndices...) = v.cfvar[ind...] = data
274-
275-
276-
function Base.cat(vs::AbstractVariable...; dims::Integer)
277-
CatArrays.CatArray(dims,vs...)
278-
end
279-
280278
"""
281279
storage,chunksizes = chunking(v::MFVariable)
282280
storage,chunksizes = chunking(v::MFCFVariable)
@@ -299,6 +297,6 @@ end
299297
deflate(v::MFVariable) = deflate(v.ds.ds[1][name(v)])
300298
checksum(v::MFVariable) = checksum(v.ds.ds[1][name(v)])
301299

302-
chunking(v::MFCFVariable) = chunking(v.var)
303-
deflate(v::MFCFVariable) = deflate(v.var)
304-
checksum(v::MFCFVariable) = checksum(v.var)
300+
chunking(v::MFCFVariable) = chunking(parent(v))
301+
deflate(v::MFCFVariable) = deflate(parent(v))
302+
checksum(v::MFCFVariable) = checksum(parent(v))

0 commit comments

Comments
 (0)