Demo: ECAS/Ophidia simple commands examples

First of all import PyOphidia modules and connect to server (connection details are inferred from the ECAS environment)

[ ]:
from PyOphidia import cube, client
cube.Cube.setclient(read_env=True)

Create a datacube from the NetCDF file: - The file is /public/data/ecas_training/tos_O1_2001-2002.nc - The variable to be imported is tos - Data should be arranged in order to operate on time series (time dimension)

Note: We are not directly reading the file from the Notebook

[ ]:
mycube = cube.Cube.importnc(
                src_path='/public/data/ecas_training/tos_O1_2001-2002.nc',
                measure='tos',
                imp_dim='time',
                ioserver='ophidiaio_memory',
                ncores=2,
                description="Imported cube"
        )

Check the datacubes available in the virtual file system

[ ]:
cube.Cube.list(level=2)

To get the list of arguments and default values we can use the python help() command can be used

[ ]:
help(cube.Cube.list)

Inspect the cube and its dimensions structure

[ ]:
mycube.info()

Subset the datacube over space (lat and lon) and time

Note: each instance method produces a new datacube object

[ ]:
mycube2 = mycube.subset(
                subset_dims="lat|lon|time",
                subset_filter="-80:30|30:120|151:240",
                subset_type="coord",
                ncores=2,
                description="Subsetted cube"
        )

Inspect the new cube; dimensions have been changed

[ ]:
mycube2.info()

But what does the datacube actually contain at this point? We can use the explore method to check the content.

[ ]:
mycube2.explore(limit_filter=1)

We can then compute the maximum value over the time series for each point in the spatial domain

[ ]:
mycube3 = mycube2.reduce(
                    operation='max',
                    ncores=2,
                    description="Reduced cube"
                )

In the new cube the time dimension is be “collapesed”

[ ]:
mycube3.info()

We can now reorganize the data structure by making the longitude dimension an array-oriented dimension

[ ]:
mycube4 = mycube3.rollup(
                    ncores=2,
                    description="Rollup cube"
                )

The new cube will now have lon has an array-dimension

[ ]:
mycube4.info()

Each operation executed creates a new datacube on the framework (datacubes are not overwritten)

[ ]:
cube.Cube.list(level=2)

Let’s export the data into a Python-friendly structure.

Note: this is the first time we move data from the server-side to the Notebook

The structure looks something like this

[ ]:
data = mycube4.export_array()

from IPython.lib.pretty import pprint
pprint(data)

The data exported in the Python structure can be used to create a map (note the definition of a Python function)

[ ]:
%matplotlib inline

def plotData(data):
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap, cm
    import numpy as np

    lat = data['dimension'][0]['values'][:]
    lon = data['dimension'][1]['values'][:]
    var = data['measure'][0]['values'][:]

    fig = plt.figure(figsize=(15, 15), dpi=100)
    ax  = fig.add_axes([0.1,0.1,0.8,0.8])

    map = Basemap(projection='cyl',llcrnrlat= -90,urcrnrlat= 90, llcrnrlon=0,urcrnrlon=360, resolution='c')

    map.drawcoastlines()
    map.drawparallels(np.arange( -90, 90,30),labels=[1,0,0,0])
    map.drawmeridians(np.arange(-180,180,30),labels=[0,0,0,1])

    x, y = map(*np.meshgrid(lon,lat))

    cnplot = map.contourf(x,y,var,np.arange(270,305,0.5),cmap=plt.cm.jet)
    cbar = map.colorbar(cnplot,location='right',format='%.2f')

    plt.title('Sea Surface Temperature (deg K)')
    plt.show()

plotData(data)

What If we want to consider the whole spatial domain and specify a subset only on the time range?

We can perform the new set of operations on mycube object, without the need to re-import the dataset from the file. Note that we are providing the time range in human-readable form

[ ]:
newMycube2 = mycube.subset(
                subset_dims="time",
                subset_filter="2001-01-01_2001-12-31",
                subset_type="coord",
                time_filter="yes",
                ncores=2,
                description="New subsetted cube"
        )

newMycube2.info()

We can the rerun the same operations on the new cube …

[ ]:
newMycube3 = newMycube2.reduce(
                    operation='max',
                    ncores=2,
                    description="New reduced cube"
                )

newMycube4 = newMycube3.rollup(
                    ncores=2,
                    description="New rollup cube"
                )

… and plot the new datacube values on a map using the function plotData

[ ]:
data = newMycube4.export_array()
plotData(data)

What if we want to get the minimum instead of the maximum value?

Again we can perform the new set of operations on newMycube2 object, without the need to re-import or subset the dataset again

[ ]:
newNewMycube3 = newMycube2.reduce(
                    operation='min',
                    ncores=2,
                    description="New reduced cube2"
                )

newNewMycube4 = newNewMycube3.rollup(
                    ncores=2,
                    description="New rollup cube2"
                )

… and plot the new datacube values on a map using the function plotData

[ ]:
data = newNewMycube4.export_array()
plotData(data)

Our workspace now contains several datacubes from the experiments just run. Once done, we can clear the space before moving to other notebooks.

Note: the *client.submit* is exploiting the underlying *PyOphidia client class* to submit commands in terminal-like syntax.

[ ]:
cube.Cube.deletecontainer(container='tos_O1_2001-2002.nc',force='yes')

The virtual file system should now be “clean”

[ ]:
cube.Cube.list(level=2)