Skip to content

Instantly share code, notes, and snippets.

@hevgyrt
Last active August 24, 2022 12:26
Show Gist options
  • Save hevgyrt/eca2a89e76223df3a0d183a4c6ba3bbe to your computer and use it in GitHub Desktop.
Save hevgyrt/eca2a89e76223df3a0d183a4c6ba3bbe to your computer and use it in GitHub Desktop.
Tutorial for how to create CF and ACDD compliant NetCDF files in the context of the Nansen Legacy project
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tutorial for creating NetCDF files relevant for the Nansen Legacy project\n",
"_By [Trygve Halsne](https://www.met.no/en/search-result?q=trygve+halsne)_\n",
"\n",
"## Table of contents:\n",
"1. Introduction\n",
"2. NetCDF and metadata\n",
"3. Wave buoy example (creating a file)\n",
"4. Dataset granularity\n",
"5. Wrap-up\n",
"\n",
"# 1. Introduction\n",
"This tutoral will focus on creating NetCDF files compliant with the [Climate and Forecast](http://cfconventions.org/) (CF) convention and the [Attribute Convention for Data Discovery](http://wiki.esipfed.org/index.php/Attribute_Convention_for_Data_Discovery_1-3) (ACDD). In particular, the focus will be on relevant datasets for the Nansen Legacy project. We will also briefly touch upon the discussion on how to structure a dataset in terms of granulatiry.\n",
"\n",
"## 1.1 Requirements to run the following jupyter-notebook\n",
"In this tutorial, we will basically do two things: <br>\n",
"1. Stepwise, create a CF and ACDD compliant NetCDF file using data from an already existing wave buoy dataset <br>\n",
"2. Modify an existing NetCDF file to make it comliant with the standards. \n",
" \n",
"The data for the first step is fetched by means of OPeNDAP (ie. streaming of data) and hence __no download prior to doing the excersize is needed__. OPeNDAP is one of the benefits when distributing CF compliant datasets.\n",
"\n",
"Before running this tutorial, you might also need some python packages. To create a conda environment with all the necessary packages, use the following command:\n",
"\n",
"*conda create -n nc_cf_acdd python=3.7 netCDF4=1.4.0 numpy -c anaconda xarray*\n",
"\n",
"In your terminal, activate the environment and run jupyter-notebook like:\n",
"\n",
"__conda activate nc_cf_acdd__ <br>\n",
"__jupyter-notebook__\n",
"\n",
"\n",
"# 2 NetCDF and metadata\n",
"[NetCDF](https://www.unidata.ucar.edu/software/netcdf/) is a very convenient and powerful file format in terms of data storage and data dissemination. However, describing the actual content of the file is crucial in order to be used correctly by others. Moreover, the dataset could also be made self-describing and machine readable and thus compliant with widely used international standards. The latter is important in order to make your data visible and accessible for a wide(r) range of users. You will also contribute to make your data [FAIR](https://www.nature.com/articles/sdata201618) (i.e. Findable, Accessible, Interoperable, Reuseable), which are the guiding principles for scientific data management and stewardship. \n",
"\n",
"In order to be precise when talking about metadata, we split types of metadata into two categories: discovery metadata and use metadata:\n",
"\n",
"- __Discovery metadata__ describes e.g. the who, what, where and when about the products as well as the interfaces and access points to the data. Examples of discovery metadata standards are the GCMD DIF and ISO19115. If a NetCDF file follows ACDD, the file is compliant to the above mentioned standards which thus can be extracted from the file.\n",
"- __Use metadata__ provides a definitive description of what each variable in the dataset represents. Use metadata serves the purpose of describing the actual content of the data themselves allowing users to understand and correctly use the datasets. Examples of use metadata are units, missing values and spatio-temporal properties of the data. If a NetCDF file follows the CF convention, enough information is in place to make the file self-describing.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. Wave buoy dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.1 Create NetCDF file with minimal metadata\n",
"We use data from an already existing wave buoy dataset available from thredds.met.no, for which we create our own subset of the dataset."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# importing packages\n",
"import netCDF4\n",
"from netCDF4 import Dataset\n",
"import numpy as np\n",
"import datetime\n",
"import xarray as xa\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# OPeNDAP URL to wave buoy data operated by the Norwegian Costal Administration\n",
"url = \"https://thredds.met.no/thredds/dodsC/obs/kystverketbuoy/2019/01/201901_Kystverket-Smartbuoy-Fauskane_AanderaaMotusSensor.nc\"\n",
"\n",
"# Specifying time subset\n",
"t0,tn = 0,300\n",
"\n",
"# Reading the data reading a subset of the variables\n",
"ncin = Dataset(url, 'r')\n",
"time = ncin['time'][t0:tn]\n",
"longitude = ncin['longitude'][t0:tn]\n",
"latitude = ncin['latitude'][t0:tn]\n",
"hm0 = ncin['Significant_Wave_Height_Hm0'][t0:tn]\n",
"ncin.close()\n",
"\n",
"# Creating output\n",
"test_fname = 'subset_bouy_data.nc'\n",
"\n",
"with (netCDF4.Dataset(test_fname, 'w', format='NETCDF4')) as ncout:\n",
" dim_time = ncout.createDimension('time',None) # None denotes unlimited time. Makes it possible to add data later.\n",
"\n",
" nctime = ncout.createVariable('time','f4',('time',))\n",
" nctime[:] = time[:]\n",
" \n",
" nclat = ncout.createVariable('latitude','f4',('time',))\n",
" nclon = ncout.createVariable('longitude','f4',('time',))\n",
" nclat[:]=latitude\n",
" nclon[:]=longitude\n",
"\n",
" # add variable\n",
" varout = ncout.createVariable('Hm0',np.float32, ('time',))\n",
" varout[:] = hm0\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the current state, it is evident that the file is not well described. We lack data describing the content like reference time and units. (You can check this by means of using software like ncdump). "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.2 CF convention\n",
"Let's start with the [CF convention](http://cfconventions.org/). CF is designed to *promote the processing and sharing of files created with the NetCDF API*. It is very useful to read through the [documentation](http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html). This can, however, become a bit cumbersome so we will try to cover the most important bits for our particular dataset which is:\n",
"\n",
"- use metadata for the variables,\n",
"- description of feature type,\n",
"- global attributes.\n",
"\n",
"We will go through these stepwise in the following sections."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.3 Use metadata for variables\n",
"Use metadata can involve a number of things like flags, units, valid range of data, and scale factors depening on you product. We will, however, restric this to a minimum according to product we are dealing with which will be units, standard_name and long_name. \n",
"\n",
"To add standard_name, we should use the [*CF standard name table*](http://cfconventions.org/Data/cf-standard-names/69/build/cf-standard-name-table.html). For some specific variables, you may not find an entry in this table. Then you could contact the CF community for advice and fill the other attributes as best as you can.\n",
"\n",
"In order to add these attributes in the various variables, we do the following:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Re-opening the dataset\n",
"ncout = Dataset(test_fname, mode='r+') # r+ for append mode\n",
"\n",
"nctime = ncout.variables['time']\n",
"nctime.long_name = 'Time of measurements'\n",
"nctime.standard_name = 'time'\n",
"nctime.units = 'seconds since 1970-01-01 00:00:00 UTC'\n",
"nctime.calendar = 'standard' #standard = gregorian\n",
"\n",
"\n",
"nclat = ncout.variables['latitude']\n",
"nclat.standard_name = 'latitude'\n",
"nclat.units = 'degrees_north'\n",
"nclat.long_name = 'latitude'\n",
"nclat.valid_min =\"-90\"\n",
"nclat.valid_max =\"90\"\n",
"\n",
"nclon = ncout.variables['longitude']\n",
"nclon.long_name = 'longitude'\n",
"nclon.units = 'degrees_east'\n",
"nclon.standard_name = 'longitude'\n",
"nclon.valid_min =\"-180\"\n",
"nclon.valid_max =\"180\"\n",
"\n",
"hm0 = ncout.variables['Hm0']\n",
"hm0.units = \"m\"\n",
"hm0.standard_name = \"sea_surface_wave_significant_height\"\n",
"hm0.long_name = \"Significant Wave Height Hm0 estimate from spectrum\"\n",
"\n",
"# in order to explain the variable a bit more, we add the following\n",
"hm0.valid_range = np.array([0.0,30.0],dtype=np.float32)\n",
"\n",
"#ncout.variables\n",
"ncout.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Investigating the output file, it is obvious that the what and where of the data is much more clear. In order to be more precise, we should add more variables describing e.g. measurement interval etc. Have a look at the original file to see examples of this."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.4 Feature type\n",
"In general, raster data must be georeferenced in some kind of coordinate system. You can read more about that [here](http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html#coordinate-system) in the CF convention document. For point measurements, we already know from the lat/lon values where we are located. However, in order to be more precise on what kind of dataset we have, the CF convention has established [feature types](http://cfconventions.org/Data/cf-conventions/cf-conventions-1.8/cf-conventions.html#_features_and_feature_types) for discrete sampling geometries. We can thus specify the discrete sampling geometry of our data."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ncout = Dataset(test_fname, mode='r+') # r+ for append mode\n",
"\n",
"globalAttribs = {}\n",
"globalAttribs['featureType'] = \"timeSeries\"\n",
"\n",
"\n",
"ncout.setncatts(globalAttribs)\n",
"ncout.sync()\n",
"\n",
"ncout.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are also other feature types supporting other measurements like profiles (for e.g. weather baloons and CTDs) and time series profiles (for e.g.ADCP)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.5 Global attributes\n",
"The CF convention requires some global attributes describing the product. You can read more about this [here](http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html#_attributes) in the CF convention document. In the following code, we will add attributes in a new way compared with above:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nowstr = datetime.datetime.utcnow().isoformat()\n",
"\n",
"ncout = Dataset(test_fname, mode='r+') # r+ for append mode\n",
"\n",
"globalAttribs = {}\n",
"globalAttribs['title'] = \"Wave buoy measurments from ...\"\n",
"globalAttribs['Conventions'] = \"CF-1.8\"\n",
"globalAttribs['institution'] = \"Norwegian Coastal Administration\"\n",
"globalAttribs['source'] = \"surface observation\"\n",
"globalAttribs['history'] = \"Subset of wave buoy data created {}.\".format(nowstr)\n",
"globalAttribs['references'] = \"http://www.datawell.nl/Portals/0/Documents/Brochures/datawell_brochure_dwr-mk3_b-09-09.pdf\"\n",
"globalAttribs['comment'] = \"Test creating NetCDF/CF data\"\n",
"\n",
"ncout.setncatts(globalAttribs)\n",
"ncout.sync()\n",
"\n",
"ncout.close()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.6 ACDD and discovery metadata\n",
"Now, the file should be CF compliant and hence be both machine readable and self-describing. However, in order to make you data discoverable (i.e. to describe the who, what, where and when for the data), the data should follow the [ACDD](http://wiki.esipfed.org/index.php/Attribute_Convention_for_Data_Discovery_1-3). ACDD defines a number of global attributes grouped as __highly recommended__, __recommended__ and __suggested__. It also suggests some highly recommended variable attributes. We will encourage you to at least follow the higly recommended global attributes, but also the attributes listed [here](https://adc.met.no/node/4). Below, we show how to include some of the attributes: "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ncout = Dataset(test_fname, mode='r+') # r+ for append mode\n",
"dt = float(ncout['time'][0].data)\n",
"\n",
"globalAttribs['id'] = 'preferably a UUID' #URLs, URNs, DOIs,\n",
"globalAttribs['date_created'] = datetime.datetime.utcnow().isoformat()\n",
"globalAttribs['geospatial_lat_min'] = ncout['latitude'][:].min()\n",
"globalAttribs['geospatial_lat_max'] = ncout['latitude'][:].max()\n",
"globalAttribs['geospatial_lon_min'] = ncout['longitude'][:].min()\n",
"globalAttribs['geospatial_lon_max'] = ncout['longitude'][:].max()\n",
"globalAttribs['time_coverage_start'] = (datetime.datetime(1970,1,1, 0,0,0) + datetime.timedelta(0, dt)).isoformat()\n",
"globalAttribs['Conventions'] = \"CF-1.8, ACDD-1.3\"\n",
"globalAttribs['keywords'] = ['Earth Science > Oceans > Ocean Waves']\n",
"globalAttribs['keywords_vocabulary'] = \"GCMD Science Keywords\"\n",
"\n",
"globalAttribs['license'] = \"Freely Distributed\"\n",
"globalAttribs['standard_name_vocabulary'] = 'CF Standard Name Table v70'\n",
"\n",
"ncout.setncatts(globalAttribs)\n",
"ncout.sync()\n",
"\n",
"hm0 = ncout.variables['Hm0']\n",
"hm0.coverage_content_type = \"physicalMeasurement\"\n",
"ncout.close()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f5b070bd7b8>]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# NOW, LET'S PLOT THE DATA:\n",
"\n",
"dataset = xa.open_dataset('subset_bouy_data.nc')\n",
"dataset.Hm0.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.7 Edit existing files using NCO\n",
"Instead of creating a NetCDF file from scratch, somtimes we want to edit an existing file in order to make it compliant with the above mentioned standards. A very convenient tool for this is [NCO](http://nco.sourceforge.net/) (easy to install on at least Ubuntu OS). To give an example on __profile__ data, we use an already existing dataset from the [Ice-Tethered Profiler](http://www.whoi.edu/itp/). We have datasets from this instrument on [thredds.met.no](https://thredds.met.no/thredds/dodsC/data/met.no/itp06/itp06_itp6grd1261.nc.html). In this particular case, we would like to edit the NetCDF file adding e.g. global and variable attributes. \n",
"\n",
"We use the __nco__ attribute editor tool [ncatted](http://nco.sourceforge.net/nco.html#ncatted-netCDF-Attribute-Editor) (in a terminal/bash)."
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"ncatted -a featureType,global,a,c,profile -a positive,pres,a,c,down -a axis,o2,o,c,n_levels -a coordinates,,a,c,pres itp06_itp6grd1317.nc output.nc"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here, we added: \n",
"1. featureType *profile* to the global attributes\n",
"2. postitive direction of *pressure*\n",
"3. *pressure* as coordinate variable for the other variables\n",
"\n",
"Let's have a look at the plot:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f5b032af198>]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEVCAYAAAD6u3K7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XecVOX1+PHP2d57YVl6BxEBsRsENfafGHtJNNF8iYnfRJOYRNOL+caUb4zGREWNJV8TNWrU2BFFbKigFCnSpKwLu8tWtrfz++M+C7MwuzMLOzNbzvv1mtfM3Ln3zplhuWfufZ7nPKKqGGOMMfuLinQAxhhj+iZLEMYYY/yyBGGMMcYvSxDGGGP8sgRhjDHGL0sQxhhj/LIEYYwxxi9LEMYYY/yyBGGMMcavmEgHcChycnJ01KhRkQ7DGGP6leXLl+9W1dxA6/XrBDFq1CiWLVsW6TCMMaZfEZFtwaxnl5iMMcb4ZQnCGGOMX5YgjDHG+GUJwhhjjF+WIIwxxvhlCcIYY4xfliCMMRFR3dBC6Z7GSIdhumEJwhgTEV/4y9v8/Nk1kQ7DdMMShDEmIgoyEiiusjOIvswShDEmIoamJ1JUWY+qRjoU04WQJQgRmSgiK3xuNSJyg4hkichCEdno7jPd+iIid4jIJhFZJSIzQxWbMSbyjhmTze7aZv7x/vZIh2K6ELIEoaqfqOp0VZ0OHAnUA/8GbgIWqep4YJF7DnAmMN7d5gN3hSo2Y0zknT+jkNkTcvnFs2tZXVQd6XCMH+G6xHQKsFlVtwHzgIfc8oeA89zjecDD6lkKZIhIQZjiM8aEWVSUcNvFR9Dc1s6THxZFOhzjR7gSxKXAP93jfFXdCeDu89zyQmCHzzZFblknIjJfRJaJyLKysrIQhmyMCbXslHgm5qfywuqd7KxuiHQ4Zj8hTxAiEgecC/wr0Kp+lh3QeqWqC1R1lqrOys0NWM7cGNPH3X7ZdOqb27j6wWXUNbVGOhzjIxxnEGcCH6pqiXte0nHpyN2XuuVFwHCf7YYBxWGIzxgTQZOGpHHn5TNYt7OGO17bGOlwjI9wJIjL2Hd5CeBZ4Cr3+CrgGZ/lV7reTMcC1R2XoowxA9uciXlcPGsYC5Zs4bEPrFdTXxHSGeVEJAn4PPA1n8W3Ao+LyDXAduAit/wF4CxgE16Pp6+EMjZjTN/yy3lTKalp4gdPrqalTfnisSMjHdKgJ/15kMqsWbPUphw1ZuBoam1j/sPLWbqlnKU3n0JmclykQxqQRGS5qs4KtJ6NpDbG9BnxMdHceNpEmlrbufuNzZEOZ9CzBGGM6VMOH5bOZUePYMGbW9hQsifS4QxqliCMMX3O90+fSGJsND98ajU1jS2RDmfQsgRhjOlzMpPj+O0F01ixo4ov3f8+Ta1tkQ5pULIEYYzpk/7fEUO58/IZrNxRxV9e2xTpcAYlSxDGmD7rjKkFzJs+lLvf2MKmUmuPCDdLEMaYPu1HZ08mOT6arz60jIq65kiHM6hYgjDG9Gl5qQncd9UsdlY38tWHPqCxxdojwsUShDGmzztyZBZ/umQ6H+2o4oZHV9De3n8H+PYnliCMMf3CmYcX8KOzJvPSml3c9uqGSIczKIS0FpMxxvSma04czSe79vDn1zZR3dDCT8+ZQky0/c4NFUsQxph+Q0S49YJpZCbHsWDJFj7dXcedl88kPTE20qENSJZ6jTH9SnSU8MOzJvPbCw7n3c3lXPm392lubY90WAOSJQhjTL90yVEjuOMybyDd/W99GulwBiRLEMaYfuuswws4dXI+ty/awKe76yIdzoBjCcIY06/dct5U4qKj+O7j1v21t1mCMMb0a0PSE/jJOVP4cHsVf3p1A/15ErS+xnoxGWP6vfNnDuPdzeXc8dom2hVuPH1ipEMaECxBGGP6vego4X8vPoLG1jbufH0TIvCtU8YTa2MkDoklCGPMgCAi/PaCaSTFxfDn1zZRWd/MLecdHumw+jVLr8aYASM1IZY/XHQElx09nMc/KGJXdWOkQ+rXQpogRCRDRJ4QkfUisk5EjhORLBFZKCIb3X2mW1dE5A4R2SQiq0RkZihjM8YMXN+YMw5F+fHTH1uj9SEI9RnE7cBLqjoJOAJYB9wELFLV8cAi9xzgTGC8u80H7gpxbMaYAWp4VhI3nzmZV9eV8NLHuyIdTr/VbRuEiJwfxD4aVfUFP9umAbOBLwOoajPQLCLzgDlutYeAxcAPgHnAw+ql+6Xu7KNAVXcG91GMMWafq44fxT1LNvOnVzcybXgGhRmJkQ6p3wl0BnEvcA7w/7q5/bmLbccAZcADIvKRiNwnIslAfsdB393nufULgR0+2xe5ZZ2IyHwRWSYiy8rKyoL4iMaYwSg6yivsV1zVwDl3vMm2chtp3VOBejG9qKpXd7eCiPxfN/ueCXxTVd8TkdvZdznJ7678LDvg4qGqLgAWAMyaNcsuLhpjujR3Yh7/vu4ETrvtDR79YAc/OGNSpEPqV7o9g1DVL4pIlIgc3906XbxUBBSp6nvu+RN4CaNERAoA3H2pz/rDfbYfBhQH/gjGGNO1MTnJJMZG09BsU5X2VMBGalVtB/63pztW1V3ADhHpGNJ4CrAWeBa4yi27CnjGPX4WuNL1ZjoWqLb2B2PMoVq7s4a65jYOG5oW6VD6nWAHyr0iIhcAT2nP+ox9E3hEROKALcBX8JLS4yJyDbAduMit+wJwFrAJqHfrGmPMIUlPjEUEFq0r5YKZw4iK8nc12/gjwRzvRWQPkAy0Ao147QWqqhFNybNmzdJly5ZFMgRjTD9w35tbuOX5dXxt9hhuPmtypMOJOBFZrqqzAq0X1BmEqqYeekjGGBMZ15w4mq3lddyzZAvThmVw9rSCSIfULwQ9UE5EMkXkaBGZ3XELZWDGGNNbRISfnnMYAC+stqbNYAV1BiEiXwWux+tZtAI4FngXODl0oRljTO+Jdm0Po3OSIxxJ/xHsGcT1wFHANlWdC8zAGwRnjDH9wqvrSgAYZQkiaMEmiEZVbQQQkXhVXQ/YjBzGmH4jLzUegKc+LKKkxqq8BiPYBFEkIhnA08BCEXkGG8RmjOlHZozI5HcXTuPD7ZWcdtsS/rPSDmGBBNXNtdMGIicB6XhVWptDElWQrJurMaanNpfV8p3HV7JyRxXnHjGUWy84nKS4wTV3WrDdXHvSi2mmiHwLmIZXQiOiycEYYw7G2NwUnrz2OL7z+Qk8t6qYL973HlX1djjzJ6gEISI/xSvNnQ3k4FVo/XEoAzPGmFCJiY7iW6eM5y+Xz+Tjz2q4dMFSq9XkR7BnEJcBR6nqz1T1Z3jdXK8IXVjGGBN6Zx5ewD1fOpL1u/Zwx2sbIx1OnxNsgtgKJPg8jwc293o0xhgTZnMn5XHRkcO4d8kWPtm1J9Lh9CndJggR+bOI3AE0AWtE5EEReQD4GKgNR4DGGBNq35g7jtZ25eU1Nj2pr0BN9x1dhJYD//ZZvjgk0RhjTAS8t6UcgHprh+ik2wShqg+FKxBjjImU4VlJACTFRUc4kr6l2wQhIqvxM+1nB1Wd1usRGWNMGLW3Kzc8toKU+BiuOm5UpMPpUwJdYjrH3V/n7v/u7q/Am9THGGP6tS27aynb08TRo7JIT4qNdDh9SqBLTNsAROQEVT3B56WbRORt4JehDM4YY0KprV25+J6lJMVFM2/G0EiH0+cE2801WURO7HgiIsfjzTBnjDH9VmV9MxV1zXz/9IlccczISIfT5wSbIK4B/iIiW0XkU+CvwNWhC8sYY0Kvpa0dgGXbKmlssR5M+wt2ytHlwBEikoZX4K86tGEZY0zoDUlL4PJjRvCP97azbmcNt14wjaNGZUU6rD4j0EC5c3yfq2rN/slh/3X2e22riKwWkRUisswtyxKRhSKy0d1nuuUiIneIyCYRWSUiMw/+YxljTGAiwv984XAeuvpoGlvauejud/nx06vtbMLptty3iKwDLgekm3082FV3VxHZCsxS1d0+y34HVKjqrSJyE5Cpqj8QkbOAbwJnAccAt6vqMd0Fb+W+jTG9pa6plf99ZQMPvPMpE/NT+ePF05kyNC3SYYVEsOW+AyWIxXQzDsKpUNULuth+KwcmiE+AOaq6U0QKgMWqOlFE7nGP/7n/el29sSUIY0xve319Kd97YhVV9c0suPJITp6UH+mQel2wCSJQN9c5hxiHAq+IiAL3qOoCIL/joO+SRJ5btxDY4bNtkVvWKUGIyHxgPsCIESMOMTxjjOls7qQ8Fn57NrN+/SpLNuwekAkiWKGeRukEVS12SWChiKzvZl1/l7EOOHtxSWYBeGcQvROmMcbsk5EUy/i8FB79YDsp8TF8fc5YkuMH16xz0IMZ5Q6Gqha7+1K8Yn9HAyXu0hLuvtStXgQM99l8GDbvtTEmAkSEh68+mlMn53Pn65s49Y9v8MLqnfR0iub+LmQJQkSSRSS14zFwGl6Z8GeBq9xqVwHPuMfPAle63kzHAtXdtT8YY0wo5aUlcOflM3ny68eRnhjLNx75kCv/9j6f7q6LdGhhE+yUo0ki8hMRudc9H99d91YnH3hLRFYC7wPPq+pLwK3A50VkI/B59xzgBWALsAm4F/hGjz+NMcb0siNHZvHcN0/kp+dM4aPtVZx+2xL++Mong6IrbLe9mPauJPIY3pwQV6rqVBFJBN5V1emhDrA71ovJGBNOpTWN/PqFdTyzopjhWYn84tzD+mUjdrC9mIK9xDRWVX8HtACoagPdj40wxpgBJy8tgdsvncE/vnoMcdFRXP3gMr7xyHJqm1ojHVpIBJsgmt1ZgwKIyFi8aUiNMWbQOX5cDi9eP5vvnT6Rl9eUcOFd77CpdODNZx1sgvgZ8BIwXEQeARYB3w9ZVMYY08fFxURx3dxxPPDlo9hZ3ciZt7/J715aP6DaJgK2QYiI4HU5rQeOxbu0tNR3dHSkWBuEMaYvKK9t4jcvrueJ5UVMGpLKbZdMZ3JB3y3T0WttEOplkKdVtVxVn1fV5/pCcjDGmL4iOyWeP1x0BA985Sh21zZzzp/f4g8vfxLpsA5ZsJeYlorIUSGNxBhj+rm5E/N45duzmT0+hztf38R9b26hvb3/Dq4LNkHMBd4Vkc2uFPdqEVkVysCMMaY/ykqO4/bLZnDKpDxueX4d//XwMvY0tkQ6rIMS7DgIv3PxdcxZHSnWBmGM6atUlYfe2cqvnl/HsMxEbr90BtOHZ0Q6LKD3x0FoFzdjjDF+iAhfPmE0j84/ltY25cK73uEvr2+irR9dcgo2QTwPPOfuF+GVxHgxVEEZY8xAcdSoLF64/nOcMXUIv3/5Ey6/dynFVQ2RDisoQSUIVT1cVae5+/F4VVnfCm1oxhgzMKQnxvLny2bwh4uOYPVn1Zx5+5u8uLrv1yI9qGquqvohYL2ajDEmSCLChUcO44VvfY5R2Ul8/ZEPufmpVdQ3990yHUHNgCEi3/F5GgUcCZSFJCJjjBnARuUk88TXj+e2hRu4643NvPdpBb+aN5Xjx2bjjUvuO4I9g0j1ucXjtUfMC1VQxhgzkMVGR/H9MybxyFePoaG5jSvue4+z73iLj7ZXRjq0ToLq5tppA5EoIEVVa0ITUvCsm6sxpr9rbGnj2ZXF3LZwA7tqGrluzji+e9qEkJ5N9Go3VxH5h4ikuZnh1gKfiMj3DjVIY4wZ7BJio7l41nBe+fZsVOHO1zexYkdVpMMCgr/ENMWdMZyHN/PbCOBLIYvKGGMGmVVF1Xsf95VCf0E1UgOxIhKLlyDuVNUWEek/oz2MMaYPqqpv5uF3t/HsymI2ldbuXb69op4J+akRjMwTbIK4B9gKrASWuNIbEW+DMMaY/ux7T6xi4doSjh+bzVlThzBlaBpTC9MZlpkU6dCAIBOEqt4B3OGzaJuIzA1NSMYYM7C1tSu/f/kTXl1XwnnTh/KnS2dEOiS/gm2kvt41UouI3C8iHwInB7lttIh8JCLPueejReQ9EdkoIo+JSJxbHu+eb3KvjzrIz2SMMX3ay2t2cfcbmzlxXA6//sLhkQ6nS8E2Ul/tGqlPA3KBrwC3Brnt9cA6n+e/BW5zJTsqgWvc8muASlUdB9zm1jPGmAFndE4ycdFRbCmr4/FlOyipaYx0SH4FmyA6OuSeBTygqit9lnW9kcgw4GzgPvdc8M48nnCrPITX8A3ewLuH3OMngFOkrw0rNMaYXjC5II1Hv3YsqQkx/OI/aznuN4v4r4eXsbmsNvDGYRRsglguIq/gJYiXRSQVaA9iuz8B3/dZNxuoUtWO4iNFQKF7XAjsAHCvV7v1OxGR+SKyTESWlZVZtQ9jTP80c0QmL90wm1e/cxLXnjSWD7ZWcNHd7/L+pxV9Zha6YBPENcBNwFGqWg/E4V1m6pKInAOUqupy38V+VtUgXtu3QHWBqs5S1Vm5ublBBW+MMX3VuLwUvn/GJJ649jiaWtq4+J53mXnLQq5/9CMWf1JKa1swv8VDI9hurgpMAc4BfgkkAwkBtjkBOFdEznLrpuGdUWSISIw7SxgGFLv1i4DhQJGIxADpQEUPPosxxvRb4/JSWfy9uby1qYy3N5WzcG0Jz6woJiclngtmFnL1iaPJTwt02O1dwU45ehfeZaKTVXWyiGQCr6hqUCW/RWQOcKOqniMi/wKeVNVHReRuYJWq/lVErgMOV9VrReRS4HxVvbi7/VotJmPMQNXU2sbr68t46sMiFq0vJSEmihevn82I7EMfI9HbU44eo6rXAY0AqlqJd5npYPwA+I6IbMJrY7jfLb8fyHbLv4N3ScsYYwal+Jhozpg6hAVXzuLxrx1HXXMbb2woDWsMwV5iahGRaFybgIjkElwjNQCquhhY7B5vwZuRbv91GoGLgt2nMcYMFnHR3m/5nJT4sL5vsGcQdwD/BvJE5Nd4043+T8iiMsYYs1dNYwsA2WFOEMGW2nhERJYDp+D1NjpPVdcF2MwYY0wvqG3yRgYkxUWH9X0DJgg3QdAqVZ0KrA99SMYYY3zVuQSRHB9sq0DvCHiJSVXbgZUiMiIM8RhjjNlPiksM1Q0tYX3fYNNRAbBGRN4H6joWquq5IYnKGGPMXh1zQ6wprmb68IywvW+wCeIXIY3CGGNMl0ZmJzEuL4W7Fm9m7sQ8hmYkhuV9A15iEpHzgKOABFV9w/cW+vCMMcaICH+46Aiq61u44K532FS6Jyzv222CEJG/At/GG9D2KxH5SViiMsYY08n04Rk8+rVjaWlTLrlnKaVhKBEe6AxiNl55jZuBOewrzW2MMSbM8tMSOGdaAeV1zbyzuTzk7xeoDaJZVdsAVLXe5mcwxpjwaW1r561Nu3lu1U6WbimnqLIBgGnD0pk7MS/k7x8oQUwSkVXusQBj3XMBVFWnhTQ6Y4wZhIoq63n8gx08tmwHJTVNpCbEMHt8LlcdN4ppw9I5cmQmMdHBFsI4eIESxOSQR2CMMWavtzbu5sq/vYcCJ03I5RfnDmfOxDwSYsM7ihoCJAhV3RauQIwxxsDiT0ppV3jz+3MZnnXopb0PRejPUYwxxgStoq6ZYZmJEU8OEPxAOWOMMb1IValuaKGkpomSmkZKahrZXFbHovWljMpJjnR4QHDF+qKBh1T1i2GIxxhjBpzGljaWba1kZVEVa4trWLezhqKqBppbO0+rIwJzJuTy3yePj1CknQVMEKraJiK5IhKnqs3hCMoYYwaKm59azTMrPqO+uQ2AEVlJTClI4/OH5ZOfmkBeWjz5aQl7H0eiMborwV5i2gq8LSLP0rlY3x9DEZQxxgwEbe3KP9/fzjGjs/jaSWOYNSqLtITYSIcVtGATRLG7RQGpoQvHGGMGjvLaJgDmTsrj5En5EY6m54KdUe4XACKSrKp1gdY3xpjBqLq+hSUby1j9WTWriqpYtrUS2DendH8TVIIQkeOA+4EUYISIHAF8TVW/0c02CcASIN69zxOq+jMRGQ08CmQBHwJfUtVmEYkHHgaOBMqBS1R160F/MmOMCbObnlrFix/vAuCI4RlcfeJoPj8lnyNHZEY4soMTbFr7E3A63oEbVV2JV8ivO014hf6OAKYDZ4jIscBvgdtUdTxQCVzj1r8GqFTVccBtbj1jjOk3TjvMu4x0xmFDeOa6E/jhWZM5alQWUVH9s4xd0Oc9qrpjv0VtAdZXVa11T2PdTYGTgSfc8ofYVyF2nnuOe/0UKw5ojOlPDi/0ZnvLSY2LcCS9I9gEsUNEjgdUROJE5EZgXaCNRCRaRFYApcBCYDNQpaqtbpUioNA9LgR2ALjXq/Hmodh/n/NFZJmILCsrKwsyfGOMCb2/vf0pyXHRXH/KhEiH0iuC7cV0LXA73kG8CHgF6LL9oYMrFT5dRDKAf+O/+J+6e39nC3rAAtUFwAKAWbNmHfC6McaEmqpSUtPE2p3VbuDbHtburGFreR0zhmeQmxof6RB7RbAJYqKqXuG7QEROAN4OZmNVrRKRxcCxQIaIxLizhGF43WfBSzzDgSIRiQHSgYog4zPGmLD5wl/fYcWOqr3PR2Z7g9/On1HI6VOHRDCy3hVsgvgzMDOIZXuJSC7Q4pJDInAqXsPz68CFeD2ZrgKecZs8656/615/TVXtDMEY06eoKquKqjh1ch5fO2ksk4akktqPBr/1RLcJwnVvPR7IFZHv+LyUBgQaD14APORqOUUBj6vqcyKyFnhURG4BPsLrPou7/7uIbMI7c7i0x5/GGGMOUXu7UlnfTGV9C1XuvrK+mar6ZirqWti6u452hePH5nDUqKxIhxtSgc4g4vDGPsTQeQR1Dd6v/C6p6ipghp/lW4Cj/SxvBC4KEI8xxoRE2Z4mXlqzi7++vomd1Y1+14mNFrKS4/ja7DFcdvSIMEcYfoEmDHoDeENEHrTJg4wxA0VTaxuf7NrD6s+q+fizalYVVbN2Zw2q3gC3+bPHkJUcR0ZSHFlJcWQkxZKZHEdyXDSDqfd9sG0Q9SLye+AwIKFjoaqeHJKojDHmINU3t1Jc1UhFXTMVdU3srm12j5spr2tmS1ktG0r20NLmNXGmJ8ZyeGE63z51AqdMzmNKQdqgSgLdCTZBPAI8BpyD1+X1KsAGIRhjwkpVqW9uo6Kumd21TZS7g//uuia27a5nZVEVG0r20O6ne0tqQgzZyXEMy0zimhPHMG1YOocXpjMsM9ESQheCTRDZqnq/iFzvc9npjVAGZowZvBqa2/hoRyXrd+5he0U928rr2FZRT3FVA40t7X63yUyKZdqwDE47bAhjcpLJTokjKzmO7OR4MpNjiY/pO/Ms9BfBJogWd79TRM7GG7swLDQhGWMGMlVlY2ktu6ob9172qXT3FXVN7KppYm1x9d5LQMlx0YzITmZCXionT8wjJzWe7OQ4clLivQSQ4iWBxDhLAL0t2ARxi4ikA9/FG/+QBnw7ZFEZYwasF1bv4rp/fNhpWZRAVvK+X/xXnzCaY8ZkcXhhBjkpcXYJKEICjYPIVNVKVX3OLaoG5oY+LGPMQPXBVq9AwmPzjyUnNZ6spDjSE2P7bcXTgSzQGcQnIlIGvINXVuMdVd0Q+rCMMQNVU2sbeanxHDPmgFqcpo8JNA4iT0Qm4I2mPh640ZXQWAq8raq/C0OMxph+wLeHUWX9vraFjucVdS1sK69j6ZZyxuamRDpcE4SAbRDujGED8KCIjAXOAq4HTgMsQRgziBRXNfDMimJ2Vjd0OvBX1jVTUd9Mc6v/HkbRUUJmUiw5KfFcN3ccF88aHubIzcEI1AbRceZwHF6l1S14Zw9fxJsu1BgzSCxcW8K1/7ectnYlPTGWrOQ4MpNiKcxIYOrQtL2NzJnJ3ujjTPc8KymO1IQYa2PohwKdQbyFlwj+CDytqvWhD8kYE2ktbe1sK69jR0UDRZX1FFU2cM+SLQC8+f25DM9KinCEJhwCJYih7Gt/uNbN0/AhXknud13hPWNMP9LY0tap9ER5bdPex59VNrChZA+by2r3jkMAiIuJYmR2Ep8bn2PJYRAJ1Ei9C3jK3RCRJOBq4BfAaAKX/DbGREhjSxulNU2U7GmkpKaRjz+r4ZW1u9hSVud3/ZgoIT8tgUlDUpk7KY8J+SmMyEpmeGYiOSnxdoloEArUBpGO1/7QcRYxA9gE/IcgZ5MzxvSulrZ2yvY0UVLTSElNE6UuAZTUdCzzHlc3tHTaLiZKOG5sNufPKOw0Cjkr2XuclhBjA9JMJ4EuMW3Ca5R+B/gV8L6qNoQ8KmMGuer6FjaU7mFDyR42ltSyvaJ+74G/vK6J/edajI4S8lLjyUtLYFR2MseOySY/LYG81Hjy0xLIT0ugMDORlPhgiycYE/gSU264AjFmsFFVKutb2FXd6F0Gqm7k0/I63tq4mzXFNXvXS4qLZlR2MkPSE5g2LJ281AR30N938M9KjiPaLgGZXmY/J4wJoer6FhZvKPWSgM8loF01jZTWNNHc1nncQEyUMHNkJt/9/ASmDktnfF4KQ9MT7fq/iQhLEMb0kobmNjaX1fJZVQPFVQ18VtnAox/soLapFfDOBIa4X/yzRmaSn56w93l+WgJD0hPITYknLiYqwp/EGI8lCGOC0N6u1DS2sLvW6xZa7tNFtKiygY8/qz5gopqE2CiGZiRywbhCbjx9IqkJsZH7AMYchKAShIgkANdw4JSjV4coLmPCrr65lQ0l3nSURRX1FLmzgM+qGthV3Uirv2nKgJyUeKYWpnHalHwmFaQxLDORwoxEspKtTLXp34I9g/g7sB44HfglcAWwrrsNRGQ48DAwBGgHFqjq7SKShTd96ShgK3CxqlaK9z/pdrxaT/XAl1XVynmYXtXa1k5RZQNby+vYVl7Pp7vr2FZex5bddWyvqN/bOyhK8Hr+ZCQyc0QmQzMSyU2NJ8dNTpOVHEdOildOIjbaLgmZgSnYBDFOVS8SkXmq+pCI/AN4OcA2rcB3VfVDEUkFlovIQuDLwCJVvVVEbgJuAn4AnAmMd7djgLvcvTFBaWtXdtc2UerGBpTu2fe4qLKBbeV1FFU2dDoTSIqLZmR2MlOHpnP+jGFMHJLKxCGpDMtMtAO/GfR6OuVolYhMBXbhnQF0SVV3Ajvd4z0isg4oBOYBc9xqDwGL8RLEPOBhVVVgqYhkiEiB248Z5NrblaqGFiqxPCxUAAAZkklEQVTqmthdu69MxM6qBraU1bFldy1by+v9VhPNSo6jID2BwwrTOXtaASOzkxmdk8zI7CRyU+LtMpAxXQg2QSwQkUzgJ8CzQArw02DfRERG4Y3Cfg/I7zjoq+pOEclzqxUCO3w2K3LLOiUIEZkPzAcYMWJEsCGYPqqtXamqb6ayvsWbQ8A1+n7mc/2/pMabu9hfE0B0lDAyK4kxuSnMnZjHsKwk8t2AsbzUeHKsV5AxBy2oBKGq97mHbwBjevIGIpICPAncoKo13fxa8/fCAYcEVV0ALACYNWuW/1ZD0yeoKrVNreyoaGCjGxW8qbSWsj1NexNCdUPLAaOCwbv0U5iRyNCMRA4vTD9ggnprAzAm9ILtxZQP/A8wVFXPFJEpwHGqen+A7WLxksMjqvqUW1zScelIRAqAUre8CG/OiQ7DgOIefBYTRvXNrZ0GfpV2PHY1gjpqBdU3t+3dJjpKGJWdREG6d+D35hPw5hTYO3dAchyFGYmkJ8bapR9jIizYS0wPAg8AP3LPN+D1ROoyQbheSfcD61T1jz4vPQtcBdzq7p/xWf7fIvIoXuN0tbU/hJeqUlbbxJayOraX11Ne10xFXZM3Y9h+U0h2DP7ylRAbxZC0BPJSEzhsaBonT8ojPy2egvRExuenMDonmfgYKwBsTH8RbILIUdXHReRmAFVtFZG2ANucAHwJWC0iK9yyH+IlhsdF5BpgO3CRe+0FvC6um/C6uX4l+I9hekJV2VXT6PX53+Vd+tlQWsuW0lr27Hfgj4+JIjs5jqwU79f+6OwkMpPjXD2g+L01gfLSEkiNt2qgxgwkwSaIOhHJxrUJiMixQHV3G6jqW/hvVwA4xc/6ClwXZDwmgObWdkpqvO6dxa70Q1FlA5vKvIFgexr3JYKclHgm5Kdw3oxCxuYmMyY3hVHZyeSkxpEUZ4PtjRmsgv3f/x28S0BjReRtIBe4MGRRmW6pKjUNrRRV1VNc1bgvAVTtSwalew4sCZ2TEs+Y3GTOm17IhPwUxuenMiE/lazkuMh8EGNMnxZsL6YPReQkYCLeWcEnqtoSYDMThNa2dmoaW6mqb6aqoYXq+haqG1r2Pq9yz/cuq2+hpKaRuubOV/jiYqJcr58ETpqQy1DXA6ijJ1BBegIJsXb93xgTvEAzyh0F7FDVXa7d4UjgAmCbiPxcVSvCEmU/0NLWTkVdM5XuIF5V30JNQwtVDe65O8hX1+9bVl3fcsA1//2lJsSQkRRLRmIc6YmxFGQkMmdiHkMzEvYe/AszE8m2uj/GmF4W6AziHuBUABGZjdfA/E1gOt5YhAF9mamjH3/ZniZK9zTtd+915ey4VdQ3++3PD16N//TEWNKTYslIjCUvNYEJeamkJ8WSnugty0iK2/t6RpKXDNISYoixPv7GmAgJlCCifc4SLsEruPck8KRPz6QBo71dWVNcw5KNZby1cTcri6o69ePvEBcd5RVuS41nWGYSM0dmkpsST26qN4ArPdEd+JO8g31yXLT9ujfG9DsBE4SIxKhqK17Po/k92LbPU1U2l9Xy7uZylm6p4J3Nu6ms95pWJg1J5eJZwxma4fXrz031EkBearwN4jLGDAqBDvL/BN4Qkd1AA/AmgIiMI0A3176sdE8jv35+He9sLqdsTxMABekJzJ2Ux+zxuZwwLofc1PgIR2mMMZHVbYJQ1V+LyCKgAHjFjVUAiMJri+iX3tywm2dWeFU88tPiueSoERw5MpOclDhyUuLJSLKZv4wxJuBlIlVd6mfZhtCEEx4nT8pj/uwxvLu5nDXF1dyxaOMB62QkxTIuN4XbL5tBYUZiBKI0xpjIEu2q600/MGvWLF22bNkh7aOj6Fx5bRO7a5vcnMPN7Kpp4MnlnxEVBVccM5IbTh1vcwobYwYEEVmuqrMCrdfvG5oPVVJcDKNzYhidk3zAa9ecOIa739jM/W99yn9WFvPSDbNt1LExZtCwTvbdGJeXwk/OmQJA6Z4mNpfVRjgiY4wJH0sQASz+xJuuYmJ+KkeNyopwNMYYEz6WIAKYOCQV8M4m+nN7jTHG9JQliABqGlqJi47i+dU7ufze99i6uy7SIRljTFhYggjg6NFZvP+jU/jJOVNYU1zNhXe/S3FVQ6TDMsaYkLMEEYSMpDiuOXE0T379eOqaWjn/r+9w35tb+MwShTFmALME0QPj81N5dP6x5KfFc8vz6zjxt68x/+FlbCjZE+nQjDGm11mC6KEjhmfwzH+fyOs3zuHUyfm8sraE025bwqqiqkiHZowxvWrQD5QLVlu7sn5XDZtKa9lcVseGXXtYtK4E8JLGkLSECEdojDG9K2QJQkT+BpwDlKrqVLcsC3gMGAVsBS5W1UrxamffDpwF1ANfVtUPQxVbTzS3tvObF9fxn5U72V3rVX6NEhielcQVx4zku6dNICPJRlcbYwaeUJ5BPAjcCTzss+wmYJGq3ioiN7nnPwDOBMa72zHAXe4+rKrqm9lcVsenu+v4dHctW8rqeHPjbmqbWinMSORPl0xnckEaI7OTbH5nY8yAF7IEoapLRGTUfovnAXPc44eAxXgJYh7wsCsnvlREMkSkQFV3hio+gM1ltSxcW8KSDWWs21mzd7Ig8KYJHZGdxLFjshiXl8q1J42xMwVjzKAS7jaI/I6DvqruFJE8t7wQ2OGzXpFbdkCCEJH5uJntRowYcVBBVDe08K1/fsQbG8oAb/a4M6YWMCYnmTG5yYzOSWZ4VhKxNh+0MWYQ6yuN1P7m7/Rb10JVFwALwCv3fTBv9sqaXXuTw4njcjj9sHwOH5bBpCGpdunIGGOccCeIko5LRyJSAJS65UXAcJ/1hgHFoQri1Mn53HDqeFbuqGJVUTVvbdoNQGy0MDonmRFZSQzPSmKEz21YZhKJcZY8jDGDR7gTxLPAVcCt7v4Zn+X/LSKP4jVOV4ey/SEzOY4bTp0AgKpSXN3I6qIqVhZVs6m0lh0V9byzuZz65rZO2+WlxjM8K4lxuSlMLkhlckEakwrSSE+0iYSMMQNPyGaUE5F/4jVI5wAlwM+Ap4HHgRHAduAiVa1w3VzvBM7A6+b6FVUNOFVcb8wo1xVVpbyume0V9eyoqGd7eT07KuvZWl7PxpI9nRq0CzMSmVyQxoT8FAoyEhmansCQ9ASGpieSkRSL9/GMMaZvCHZGuUE/5ejBUFVKappYt7OGtTtrWL9rD+t21vDp7jra2jt/nwmxUQzNSKQwI5Gh6YkUZiYyNCORoRkJDMtIYkh6AnEx1hhujAkfm3I0hESEIe4sYe6kvL3L29qV3bVNFFc1sKu6keLqRnZWNVBc3cBnVY2s31VK2Z6m/fblLl1lJjFxiHfZamphOtMK04mKsjMPY0zkWILoRdFRQn5aAvndlN1obGnzkkdVA5+5W3FVA1vL63l2ZTGPvLcdgIL0BK45cTRf/dyYcIVvjDGdWIIIs4TYaEblJDMqJ/mA11SVz6oaWL6tkusfXcEtz6/jc+Nz985qZ4wx4WQJog+oa2plR2U9m0prWVVUzUfbKwGYOzGXUTlJEY7OGDNYWYIIg/Z2pWRPI9vK6/f1iqrY93h3bfPedeOio5gyNI3vfn4CX58zlhgbzW2MiRBLEL2k4yxgW3nnBLC9op6iigaa29r3rhslMDQjkRFZSZw6OZ8R2d5gvFHZyUzIT7VeTcaYPsESRC+4+sEPeG19aadlqfExjMhOYmJ+Kp/3SQIjspIYmpFodZ6MMX2eJYhD1N6unXot/b8jhvKreYeRnmgD5Iwx/ZsliB5qb1c2ltby7ubdLN1SwXuflncaVT1nQq6VBTfGDAiWIIKkqixaV8pvXlzH5rI6AIZlJnLK5HyOG5PNsWOzKcxIjHCUxhjTeyxBBEkVbnt1A6pw6/mHc8K4HIZnWRdUY8zAZQkiSFFRwoIrZ5GXGm8NzMaYQcESRA/YJSRjzGBiP4WNMcb4ZQnCGGOMX5YgjDHG+GUJwhhjjF+WIIwxxvhlCcIYY4xfliCMMcb4Jaoa6RgOmoiUAdu6eDkH2B3GcPoy+y489j3sY9+FZ7B+DyNVNTfQSv06QXRHRJap6qxIx9EX2Hfhse9hH/suPPY9dM8uMRljjPHLEoQxxhi/BnKCWBDpAPoQ+y489j3sY9+Fx76HbgzYNghjjDGHZiCfQRhjjDkEliCMMcb4NWAShIhcJCJrRKRdRLrstiYiW0VktYisEJFl4YwxXHrwXZwhIp+IyCYRuSmcMYaDiGSJyEIR2ejuM7tYr839PawQkWfDHWeoBPr3FZF4EXnMvf6eiIwKf5ThEcR38WURKfP5O/hqJOLsawZMggA+Bs4HlgSx7lxVnT6A+z8H/C5EJBr4C3AmMAW4TESmhCe8sLkJWKSq44FF7rk/De7vYbqqnhu+8EInyH/fa4BKVR0H3Ab8NrxRhkcP/tYf8/k7uC+sQfZRAyZBqOo6Vf0k0nH0BUF+F0cDm1R1i6o2A48C80IfXVjNAx5yjx8CzotgLOEWzL+v7/fzBHCKiEgYYwyXwfC3HhIDJkH0gAKviMhyEZkf6WAiqBDY4fO8yC0bSPJVdSeAu8/rYr0EEVkmIktFZKAkkWD+ffeuo6qtQDWQHZbowivYv/ULRGSViDwhIsPDE1rf1q/mpBaRV4Ehfl76kao+E+RuTlDVYhHJAxaKyHpVDeayVJ/SC9+Fv1+K/a7Pc3ffQw92M8L9TYwBXhOR1aq6uXcijJhg/n0HxN9AEIL5nP8B/qmqTSJyLd6Z1ckhj6yP61cJQlVP7YV9FLv7UhH5N97pZ79LEL3wXRQBvr+ShgHFh7jPsOvuexCREhEpUNWdIlIAlHaxj46/iS0ishiYAfT3BBHMv2/HOkUiEgOkAxXhCS+sAn4Xqlru8/ReBmh7TE8NqktMIpIsIqkdj4HT8Bp0B6MPgPEiMlpE4oBLgQHTg8d5FrjKPb4KOODMSkQyRSTePc4BTgDWhi3C0Anm39f3+7kQeE0H5sjZgN+F+wHR4VxgXRjj67tUdUDcgC/g/VJoAkqAl93yocAL7vEYYKW7rcG7HBPx2CPxXbjnZwEb8H4tD7jvAu96+iJgo7vPcstnAfe5x8cDq93fxGrgmkjH3Yuf/4B/X+CXwLnucQLwL2AT8D4wJtIxR/C7+I07JqwEXgcmRTrmvnCzUhvGGGP8GlSXmIwxxgTPEoQxxhi/LEEYY4zxyxKEMcYYvyxBGGOM8csShOmSiAwTkWdcNdTNInK760ce7jgyROQb4X7fgyEiN4hIUgj3XyAiz7nHc0TkORH5ik8V0mafasW3iki+W2eliKwVkRe62O9IEVnkSk0sFpFhPq9d5f4GNorIVf62329fczpiNP2bJQjjlyva9hTwtHrVUCcAKcCvIxBOBtAnEoR4uvt/cwPQowThRjEH6zt4I333UtUH1FUhxRsh3FGt+Ca8vv4LVfUIVZ1C1xVt/wA8rKrT3Da/cbFlAT8DjsGrOvCzrsqmm4HHEoTpyslAo6o+AKCqbcC3gatFJElEokXkD+7X6ioR+SaAiBwpIm+4Yogvd4xQFZH/EpEP3C/ZJzt+ZYvIgyJyh4i8IyJbRORCP7HcCox1v4p/77b7ntvfKhH5hVs2SkTWi8h9IvKxiDwiIqeKyNvu1+/Rbr2fi8jfReQ1t/y/Ot6om/2uE5G/Ah8Cw0XkLvEK/K3xWe9beIMRXxeR192yWp99XygiD/p87j+69X7rRvn/zb33RyLSVbXRC4CXevDvWIA3aBL377iqi/Wm4A0mBG+gWMf7n46XYCpUtRJYCJyx/8bizbewXkTewis137Hc7+dyf0OPu+/5MfHmoxio5ff7r0iP1LNb37wB3wJu87P8I2Aa8HXgSSDGLc8CYoF3gFy37BLgb+5xts8+bgG+6R4/iDeaNwrvILXJz3uOAj72eX4a3mTz4rZ7Dpjt1msFDnfLlwN/c+vNwzsbAvg53ojZRCAHr9Ln0AD7bQeO9YmhY1R2NLAYmOaebwVyfNar9Xl8IfCgz+d+Doh2z/8H+KJ7nIE36jd5v+9hNLDc5/kc4Ln91tn//U8HqvAO+j8Chnbx7/0P4Hr3+Hy8YnbZwI3Aj33W+wlw437bJrjvcLz77h7viKurz+X2e49bPtX9u82K9N+93Trf+lWxPhNWgv/Knh3LTwXuVq9MNKpaISJT8f6zL/SuUBEN7HTbTRWRW/AOEinAyz77fFpV24G1IpIfRGynudtH7nkK3sFpO/Cpqq4GEJE1eBMGqYisxjvQd3hGVRuABvcr/mjgxG72u01Vl/psf7F45eJj8H6lTwG6+nXelX+pd2bW8ZnOFZEb3fMEYASdawIVAGU9eQNVfVm8KrVn4E2Y85GITFXV/fdzI3CniHwZr3jlZ3gH7WAqoU7C+943AojI/wEdpfS7+lwnAre7GD8WkZ5+dyYMLEGYrqzBu5yxl4ik4VXF3Iz/BCLAGlU9zs/+HgTOU9WV7iA0x+e1pv32EYgAv1HVe/aLb9R++2r3ed5O57/3/WPXAPut83k+Gu+AepSqVrrLRgldxOr7PvuvU+fzWIALtPuJnhq6eZ8uqWoF3hnCP1zj8WwRmQmc7V6frl5F2/MBRCTFxVItIkV0/rcahnfGdMDbdPH2fj+Xa+MyfZy1QZiuLAKSRORK2Dtt4//iXSKpB14Bru1oYHWNmZ8AuSJynFsWKyKHuf2lAjtFJBa4ooex7HHbd3gZry0kxb1PoXjze/TEPBFJEJFsvAPgBz3Ybxrewb3anfGc2U2sJSIyWbyG7S90E8/LwDc7DpwiMsPPOhvofBYUkIic7NPekwqMBbar6o90X8M2IpIj+xrfb8a7NNcR12niVb3NxDsjeLnzu7AeGC0iY93zy4L4XG8BF7tlU/AuC5o+xhKE8UtVFe+AdpGIbMQ7ODUCP3Sr3Id36WWViKwELldvOscL8RpdVwIr8Kqlgnft+j28Rs71PYylHHjbNTz/XlVfwftF/K67dPQEnQ/KwXgfeB5YCvxKVYuD3a+qrsS7DLUG70D6ts/LC4AXOxqp8XoNPQe8xr7Lbf78Cq8NZ5WIfOye7/++dcBmERnXg895JLDMXcJ5F6+K7Qd+1psDfCIiG4B8XG81d/bxK7wE+gHwS7fMN65GvEtKz7tG6m1BfK6/4v2YWAX8AO/yXDWA62RgDdZ9gFVzNYOOiPwcr/H4D5GOpadE5AvAkar640jHcijcGWmsqja6M49FwAT3I8P0EdYGYUw/oqr/dpfF+rskvO7AsXjtFF+35ND32BmEMcYYv6wNwhhjjF+WIEyfIyJDRORR8eo/rRWRF0RkgojkiojfUcTi1f+plq5rDT0o/kdp9xkicqVriF/jPveNAdb/eXfriMi5ItJVaY1AsbwuIrXWWDy4WYIwfYrrDvlvYLGqjlWvftAPgXw3uGuniJzQxeZvqupZIY4vJO12InImXh2n01T1MGAmrlfPwVLVZ1X11oPcdi6w7FDe3/R/liBMXzMXaFHVuzsWqOoKVX3TPX2aIMZRiOdO90v8eSDP57Wu6kUdJV5toHdF5PeuWyYi8mUR+ZeI/Adv/Iffmk1u+RdF5H3x6kbdI17Nqmh3BvOxeLWrvu0n5JvxSlgUu8/cqKr3un2OFZGXXLxvisgkP5/3W+6zrhKRR33ivtM97nQGJa5GlHjVYZe4eD8Wkc8F+m7N4GG9mExfMxWvhlJXluHVcgrkC8BEvAFY+cBa4G+u18yfgXmqWiYil+D1+b8aeACYr6rviMj+v7yPw6u3VCEip+GV4DgarwfOsyIyG68MxiXACaraIl5xvyvwxksUqupU8MqX9/BzLwCuVdWNInIM3hiCk/db5yZgtKo2dbH/rlwOvKyqv3ZdT0NWqtz0P5YgTH9TildYL5DZwD9draNiEXnNLZ+In3pR7qCaqqrvuPX+AZzjs7+FPgPEuqoFNQ1vYNoHbt+JLt7/AGNE5M94g/NeCfbDijeq+3jgX7KvOkW8n1VXAY+IyNN4Z1nB+oB9ifNpVV3Rg23NAGcJwvQ1a/BGY3clAa8mUTC6KjZ4QL0oCTzHwf51k/zVbPom8JCq3nzAm4ocgVdZ9Tq8EhNX77fKGrzk8tp+y6OAqo6SGN04Gy8pngv8RPaVOOnQ6vbV0c4TB6CqS9zZz9nA38Ubqf5wgPcyg4S1QZi+5jUgXjrP0XCUiJzknk4APg5iP0uAS931/wK8tg3ool6UenMd7BGRY916l3az765qNi0CLnSPEZEs8WZqywGiVPVJvJIjM/3s8zfA70RkiNs2XkS+pao1wKcicpFbLi7Z7CVeDaXhqvo68H32Vcz1tRUvAYFX+jzWbTsSKHXtHfd3EZsZpOwMwvQprjT3F4A/uS6ajXgHtxvcKnPxLtME8m+86/Sr8epIveH23+waa+8QkXS8/wN/wvsFfw1wr4jU4VUs9duLSFVfEZHJeDWbAGrx5jxYKyI/Bl5xB+0WvDOGBuAB6VwMb/99viBe4b9X3S98ZV/BvCuAu9y+Y4FH8eaz6BAN/J/7PII3j0eVdC6Yei/wjIi8j5fIOs6I5gDfE5EW9zmu7OL7NIOQjaQ2/YqILMFrYK7cb/kcvF5A5/jdMLh9p6hqR++em4ACVb3+UOLtz0RkMd53at1dBym7xGT6DRHJBf64f3JwmvEmJfI7UC5IZ3d09wQ+R3C9pQYk8arRjsE7CzKDlJ1BGGOM8cvOIIwxxvhlCcIYY4xfliCMMcb4ZQnCGGOMX5YgjDHG+PX/Ab5BzvwF2RamAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"itp_ds = xa.open_dataset('output.nc')\n",
"itp_ds.temp.plot(y='pres')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Please note that the NCO has loads of capabilities like e.g. [reversing dimensions](http://nco.sourceforge.net/nco.html#ncpdq-netCDF-Permute-Dimensions-Quickly) and [changing variable types](http://nco.sourceforge.net/nco.html#ncap2-netCDF-Arithmetic-Processor)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.8. Check CF and/or ACDD compliance\n",
"You can now check your dataset in online compliance checkers like [this one](https://pumatest.nerc.ac.uk/cgi-bin/cf-checker.pl). "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4. Dataset granularity\n",
"How should I structure my datasets? Or, what is actually sa dataset? There are several ways to answer these questions depending on e.g. scientific branch, but also a lot of opinions. From a data management perspective, it is important to structure the data in a way that the users can easily find and use their data of interest. Basically, we want the granularity of the data to fit with *a decent amount of use cases*. In that contetxt, it means that __it should not__ be necessary for the user to download all the data from a particluar instrument (all the years of recordings, locations, etc) before filtering out the data of interest. This should be organized by the data provider. Here we show a couple of examples:\n",
"\n",
"### Parent - child relationship examples:\n",
"\n",
"__Ex1:__<br>\n",
"Parent (Level-1): Radiosonde measurements from instrument XXXXXX<br>\n",
"Child (Level-2): Globally scattered TimeSeriesProfile datasets from intstrument XXXXXX.\n",
"\n",
"__Ex2:__<br>\n",
"Parent (Level-1): Copernicus Sentinel-1A SAR EW GRDM NTC products<br>\n",
"Child (Level-2): Single Sentinel-1A SAR EW GRDM NTC products acquired all over the world\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 5. Wrap-up\n",
"Well-documented data contributes to a higher degree of unambiguous interpretation and thus enhance usability for a wider range of users. Moreover, it makes the data more findable, accessible and reusable. Thank you for contributing to FAIR data!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment