{ "cells": [ { "cell_type": "markdown", "id": "7ddcf4ed-d376-4212-82b6-e073a52c6b2a", "metadata": {}, "source": [ "# Provenance\n", "\n", "One aspect of data provenance is keeping track of the processing steps applied to data.\n", "\n", "Next, we will learn how this can be done working with `xarray` objects.\n", "\n", "**Note: This is work in progress! Adding provenance information can clutter the attributes of a xarray quite a bit**" ] }, { "cell_type": "code", "execution_count": 1, "id": "1d0538f0-8d79-4daf-9ea6-5a355562e12e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import h5rdmtoolbox as h5tbx\n", "import numpy as np\n", "\n", "h5tbx.set_config(add_provenance=True)" ] }, { "cell_type": "markdown", "id": "53509d04-c859-4e4d-befb-1befe3a7b3ed", "metadata": {}, "source": [ "For the example, let's assume a 3D-velocity field with time, y- and x-dimension:" ] }, { "cell_type": "code", "execution_count": 2, "id": "bfae2053-e432-409e-b2d9-ae73e918efd6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "using(\"h5rdmtoolbox-tutorial-convention\")" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cv = h5tbx.convention.from_zenodo('https://zenodo.org/records/10428822')\n", "\n", "h5tbx.use(cv)" ] }, { "cell_type": "code", "execution_count": 3, "id": "d061c61d-4433-4973-9c80-d459dff67624", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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GGdmZoYzZ86gWbNmOgVHRERUV6kEBRTcx0U0rbtEjhw5goYNGz71OUEQEBAQoFNQRERERFXRKnF59tln0aJFCzg7O2vVaI8ePWBra6tLXERERHWaIOi4qshElxVplbikp6eLanTXrl2SgiEiIjIVdXWOS0lJieg6jo6OWj/L2bNERESkN87OzlAotE+qFAqFqHmxohMXQRCwYcMGpKen4+rVq1CpVBr3N23aJLZJIiIik1NXe1wAYMOGDahfv/5TnxMEAf369RPVtujEZcyYMVi0aBF69eoFd3d3UVkVERERPVRXVxV5e3ujR48ecHV11er5Zs2awdLSUuv2RScuK1euxKZNm0RnSERERFT35eXliXr+1KlTop4XveW/k5MT92chIiLS0aNVRbpcxujWrVs61ReduEyaNAmTJ0/G3bt3dXoxERGRKXuYfCh0uOT+Bk83c+ZMrF27Vv150KBBcHV1RePGjfHLL79IalN04jJo0CD89ddfcHNzQ7t27dC5c2eNi4iIiAgAUlJS4OXlBQDYu3cv9u7dix9//BERERH46KOPJLUpeo5LdHQ0srKyMGTIEE7OJSIikqguryp6pLCwUJ247NixA4MGDULfvn3h4+OD4OBgSW2KTlx27tyJ3bt3o3v37pJeSERERIDw30uX+rWdi4sLCgoK4OXlhdTUVEybNg3Aw2XQSqVSUpuiExcvLy9RO9wRERFRZabQ4/Lyyy/jjTfegJ+fH27cuIGIiAgAwIkTJ9CiRQtJbYqe4/Lll1/i448/xoULFyS9kIiIiEzD3LlzERcXB39/f+zduxf29vYAgCtXruC9996T1KboxGXIkCFIT09H8+bN4eDggPr162tcREREpAVBD5cECxYsgI+PD2xsbBAcHIyjR48+8flbt24hNjYWHh4esLa2RsuWLZ96JuHEiRORlZUFS0tLfPjhh5g3bx46deqkvj927Fi8/fbbkuIXPVSUnJws6UVERET0GB2HiiCh7tq1a5GQkICUlBQEBwcjOTkZ4eHhyM3NhZubW6XnKyoq0KdPH7i5uWHDhg1o3LgxLl68CGdn5ye+588//0RERASsrKwQGRmJAQMG4LnnnoOVlZXomP9O0qoiIiIiMj5z5szBiBEjEBMTA+DhcuWdO3di6dKlGDduXKXnly5dips3b+LQoUPqbfl9fHye+p6lS5dCpVLh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4LnnnsPGjRtRv3599T0rKyt4e3vD09PTIEESERERASISl0drsfPy8uDl5aX1MiciIiKqTCE8vHSpb4pET8719vYGANy5cwf5+fmVZgO3b99eP5ERERHVZXV0jouhiU5crl27hpiYGPz4449V3pdy7gARERHVPWVlZahXr55e2xQ93jNmzBjcunULR44cga2tLVJTU7FixQr4+flh27Zteg2OiIiozqqjG9A9zt3dHW+99RYOHDigtzZFJy7//ve/MWfOHAQFBcHMzAze3t4YMmQIZs2ahaSkJL0FRkREVKcJerhque+//x43b97Ec889h5YtW2LGjBm4fPmyTm2KTlzKysrU+7W4uLjg2rVrAIB27dohOztbp2CIiIio7hg4cCC2bNmCS5cuYdSoUVi9ejW8vb3xwgsvYNOmTXjw4IHoNkUnLq1atVLviNehQwcsWrQIly5dQkpKCjw8PEQHQEREZJJMoMflkYYNGyIhIQG//vor5syZg3379uGVV16Bp6cnJk6ciDt37mjdlujJuaNHj8aVK1cAAImJiXj++eexatUqWFlZYfny5WKbIyIiMk0mtKqoqKgIK1aswPLly3Hx4kW88sorGD58OP7880/MnDkThw8fxp49e7RqS3TiMmTIEPWvAwMDcfHiRZw+fRpNmzZFgwYNxDZHREREddSmTZuwbNky7N69G/7+/njvvfcwZMgQODs7q5/p1q0b2rRpo3WbohOXv7Ozs0Pnzp11bYaIiMi0mMCW/zExMXjttddw8OBBdOnSpcpnPD098dlnn2ndpujERalUYvny5UhLS8PVq1ehUqk07v/73/8W2yQREZHJMYWdc69cuQI7O7snPmNra4vExESt25Q0x2X58uXo378/AgICoFDU/oyPiIio1jGBOS4ODg64cuWKejXyIzdu3ICbm5ukTWtFJy5r1qzBunXr0K9fP9EvIyIiItMhCFVnV+Xl5bCyspLUpujExcrKCi1atJD0MiIiIqr75s+fDwBQKBT45ptvYG9vr76nVCrx008/oXXr1pLaFp24fPDBB5g3bx6+/vprDhMRERFJpICOc1z0Fon+zZ07F8DDHpeUlBSYm5ur71lZWcHHxwcpKSmS2haduBw4cADp6en48ccf0bZtW1haWmrc37Rpk6RAiIiIqG7Iy8sDAPTq1QubNm2Ci4uL3toWnbg4Ozvj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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "with h5tbx.File(data_type='experimental', contact=h5tbx.__author_orcid__) as h5:\n", " h5.create_dataset('time', data=np.linspace(0, 5, 5), standard_name='time', units='s', make_scale=True)\n", " h5.create_dataset('y', data=np.linspace(0, 10, 10), standard_name='y_coordinate', units='m', make_scale=True)\n", " h5.create_dataset('x', data=np.linspace(0, 7, 7), standard_name='x_coordinate', units='m', make_scale=True)\n", " h5.create_dataset('u', data=np.random.rand(5, 10, 7), standard_name='x_velocity', units='m/s', attach_scale=('time', 'y', 'x'))\n", " u = h5.u[:]\n", "\n", "# plot t=2.5 s:\n", "u.sel(time=2.5).plot()" ] }, { "cell_type": "code", "execution_count": 4, "id": "767ee0e9-9f72-4fad-895a-3b088208cca7", "metadata": {}, "outputs": [], "source": [ "from h5rdmtoolbox.convention.standard_names import accessor" ] }, { "cell_type": "code", "execution_count": 5, "id": "db5c4e32-82a1-4e3c-af14-e87025ef5c9c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 applied __getitem__ on array with shape {'time': 5, 'y': 10, 'x': 7}\n", " -> __getitem__\n", "1 applied arithmetic_mean_of on array with shape {'time': 2, 'y': 10, 'x': 7}\n", " -> arithmetic_mean_of\n", "Current shape {'y': 10, 'x': 7}\n" ] } ], "source": [ "u_processed = u.snt[0:2,...].snt.arithmetic_mean_of(dim='time')\n", "\n", "def get_dim_shape(da):\n", " return {d: len(da[d]) for d in da.dims}\n", "\n", "def explain_history(da):\n", " for i, item in enumerate(da.attrs['PROVENANCE']['processing_history']):\n", " print(i, 'applied ', item['name'], ' on array with shape', item['parent']['dims_shape'])\n", " print(' -> ', item['name'])\n", " print('Current shape ', get_dim_shape(da))\n", "\n", "explain_history(u_processed)" ] }, { "cell_type": "code", "execution_count": 6, "id": "ec424aa7-28ba-4d28-9901-113b5507c939", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h5tbx.set_config(add_provenance=False)" ] }, { "cell_type": "code", "execution_count": null, "id": "8d53f586-ade0-4751-a11d-fe3c1d6a48f3", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.19" } }, "nbformat": 4, "nbformat_minor": 5 }