Commit ae85fb8e authored by thopri's avatar thopri
Browse files

highlighting the importance of order in chk_list dicts

parent eca2acc6
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
Set of functions to download CMEMS files using FTP (for static mask data) and MOTU (for subsetted variable data). Set of functions to download CMEMS files using FTP (for static mask data) and MOTU (for subsetted variable data).
""" """
from netCDF4 import Dataset from netCDF4 import Dataset
import re import re
# list of datasets to check # list of datasets to check
...@@ -13,8 +14,9 @@ datasets = [ "http://opendap4gws.jasmin.ac.uk/thredds/noc_msm/dodsC/pynemo_data/ ...@@ -13,8 +14,9 @@ datasets = [ "http://opendap4gws.jasmin.ac.uk/thredds/noc_msm/dodsC/pynemo_data/
] ]
# list of strings to catagorise variable names... each entry can have multiple entries. # list of strings to catagorise variable names... each entry can have multiple entries.
# NOTE list in each dict entry is in priority order so most likely parameter should be first, e.g. latitude # NOTE list in each dict entry is in a specifc order where long names go first e.g. latitude is before lat. This is to
# DOUBLE NOTE order in dict is also important as it can result in false ID's e.g. ice data for some reason has long name # stop errors in selecting names. e.g. lat would also be valid for latitude and nav_lat so trying lat needs to be after those options
# DOUBLE NOTE order of dicts in check list is also important as it can result in false ID's e.g. ice data for some reason has long name
# sea surface height so if SSH is in dict before ice variables it will assign ice variable names to SSH. # sea surface height so if SSH is in dict before ice variables it will assign ice variable names to SSH.
chk_list = {'temperature': ['temp'], chk_list = {'temperature': ['temp'],
...@@ -25,11 +27,13 @@ chk_list = {'temperature': ['temp'], ...@@ -25,11 +27,13 @@ chk_list = {'temperature': ['temp'],
'SSH': ['surface', 'sea'], 'SSH': ['surface', 'sea'],
'depth': ['depth'], 'depth': ['depth'],
'time': ['time', 'counter'], 'time': ['time', 'counter'],
'latitude': ['latitude', 'y', 'nav_lat'], 'latitude': ['latitude', 'nav_lat','lat','y'],
'longitude': ['longitude', 'x', 'nav_lon'], 'longitude': ['longitude','nav_lon','lon','x'],
'depth': ['depth'], 'depth': ['depth'],
'U': ['zonal', 'current'], 'Ucomponent': ['zonal', 'current'],
'V': ['meridional', 'current'], 'Vcomponent': ['meridional', 'current'],
'windstress-i':['i-axis'],
'windstress-j':['j-axis'],
} }
# function to use regex to find if string is in variable name or if not check long name. Case of string is ignored # function to use regex to find if string is in variable name or if not check long name. Case of string is ignored
...@@ -54,25 +58,29 @@ for dat in datasets: ...@@ -54,25 +58,29 @@ for dat in datasets:
meta = F.variables meta = F.variables
dims = F.dimensions dims = F.dimensions
# create empty dict to save catagorised data # create empty dict to save catagorised data
meta_dataset['dataset'+str(i)] = {} meta_dataset['dataset'+str(i+1)] = {}
meta_dataset['dataset'+str(i)]['var_names'] = {} meta_dataset['dataset'+str(i+1)]['var_names'] = {}
meta_dataset['dataset'+str(i)]['dim_names'] = {} meta_dataset['dataset'+str(i+1)]['dim_names'] = {}
# for all variable names, compare strings on chk list and write key to meta dict on first match # for all variable names, compare strings on chk list and write key to meta dict on first match
for key in meta: for key in meta:
for chk_key,chk in chk_list.items(): for chk_key,chk in chk_list.items():
var_match = data_chk(meta,chk,key) var_match = data_chk(meta,chk,key)
if var_match is not None: if var_match is not None:
meta_dataset['dataset'+str(i)]['var_names'][chk_key] = key meta_dataset['dataset'+str(i+1)]['var_names'][chk_key] = key
break break
if len(meta_dataset['dataset'+str(i+1)]['var_names']) != len(meta):
print('not all variables matched for dataset '+str(i+1))
# for all dimension names, compare strings on chk list and write key to meta dict on first match # for all dimension names, compare strings on chk list and write key to meta dict on first match
for key in dims: for key in dims:
for chk_key,chk in chk_list.items(): for chk_key,chk in chk_list.items():
dim_match = data_chk(dims,chk,key) dim_match = data_chk(dims,chk,key)
if dim_match is not None: if dim_match is not None:
meta_dataset['dataset'+str(i)]['dim_names'][chk_key] = key meta_dataset['dataset'+str(i+1)]['dim_names'][chk_key] = key
break break
if len(meta_dataset['dataset'+str(i+1)]['dim_names']) != len(dims):
print('not all dimensions matched for dataset '+str(i+1))
i = i + 1 i = i + 1
# close netcdf file and print meta dict # close netcdf file and print meta dict
F.close() F.close()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment