{ "cells": [ { "cell_type": "markdown", "id": "91c4ae4d-2b0e-4de5-b759-4c9fc9d072b1", "metadata": {}, "source": [ "# Extensions\n", "\n", "The wrapper class functionalities can be extended using composition or inheritance.\n", "\n", "The concept of composition adds a component to a composite class. The relationship is such, that the composite class does not know the component class but wise versa. This allows to add additional functionality without changing the original code. Adding components to an existing wrapper class will be called \"registering\" here.\n", "\n", "Concretely, four different so-called accessory classes are implemented:\n", "- `Vector`\n", "- `Magnitude`\n", "- `normalize`\n", "- `to_units`\n", "\n", "These accessories interfaces must be activated by an import call. They generally are designed such, that they are called on a dataset or group with respective arguments, which prepares a the action being performed when data is selected. Best is, to learn by example:" ] }, { "cell_type": "code", "execution_count": 1, "id": "a1cbc998-a747-4370-b362-d04c4d6508be", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "using(\"h5py\")" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import h5rdmtoolbox as h5tbx\n", "h5tbx.use(None)" ] }, { "cell_type": "markdown", "id": "a3edcad1-6c32-4d07-a581-1aa57f917259", "metadata": {}, "source": [ "## 1. Vector\n", "The `Vector` extension returns a `xr.Dataset`. First specify which of the datasets from the HDF5 should be contained in the resulting `xr.Dataset`. Then, index the data array using numpy notation or `sel()` or `isel()`. Only then, the data is loaded from the file:" ] }, { "cell_type": "code", "execution_count": 2, "id": "7eecb901-7e7c-473d-848c-409e1f0a0e8c", "metadata": { "tags": [] }, "outputs": [], "source": [ "from h5rdmtoolbox.extensions import vector # make `Vector` appear as a property of groups" ] }, { "cell_type": "code", "execution_count": 3, "id": "aa41f9f9-64d2-4d3d-8cd3-4cbcca88ae88", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:  (y: 2, x: 3)\n",
       "Coordinates:\n",
       "  * y        (y) int32 2 3\n",
       "  * x        (x) int32 1 2 3\n",
       "Data variables:\n",
       "    xvel     (y, x) float64 0.842 0.7745 0.5654 0.3707 0.5854 0.5751\n",
       "    yvel     (y, x) float64 0.904 0.9084 0.4555 0.5522 0.2687 0.0386\n",
       "Attributes:\n",
       "    long_name:  x vel\n",
       "    units:      m/s
" ], "text/plain": [ "\n", "Dimensions: (y: 2, x: 3)\n", "Coordinates:\n", " * y (y) int32 2 3\n", " * x (x) int32 1 2 3\n", "Data variables:\n", " xvel (y, x) float64 0.842 0.7745 0.5654 0.3707 0.5854 0.5751\n", " yvel (y, x) float64 0.904 0.9084 0.4555 0.5522 0.2687 0.0386\n", "Attributes:\n", " long_name: x vel\n", " units: m/s" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "with h5tbx.File() as h5:\n", " \n", " h5.create_dataset('x', data=[1, 2, 3], make_scale=True, attrs={'units': 'm'})\n", " h5.create_dataset('y', data=[1, 2, 3, 4], make_scale=True, attrs={'units': 'm'})\n", " h5.create_dataset('u', data=np.random.random((4, 3)), attach_scales=('y', 'x'),\n", " attrs=dict(units='m/s', long_name='x vel'))\n", " h5.create_dataset('v', data=np.random.random((4, 3)), attach_scales=('y', 'x'),\n", " attrs=dict(units='m/s'))\n", " \n", " vec = h5.Vector(xvel='u', yvel='v')[1:3]\n", "vec" ] }, { "cell_type": "markdown", "id": "d3cddc5a-d646-4d20-a2ce-b024fa10e9c2", "metadata": {}, "source": [ "## 2. Magnitude\n", "Similar to `Vector`, the `Magnitude` accessory takes two or more datasets and calculates the magnitude from them. Again, data is only loaded after the involved dtasets are specified. If unit attributes are given, the calculation will check for mismatching units." ] }, { "cell_type": "code", "execution_count": 4, "id": "42047c6b-7d4d-4b3b-88af-697df2444672", "metadata": { "tags": [] }, "outputs": [], "source": [ "from h5rdmtoolbox.extensions import magnitude" ] }, { "cell_type": "code", "execution_count": 5, "id": "0700f532-2443-4ed0-8f78-697c5e42385a", "metadata": {}, "outputs": [], "source": [ "with h5tbx.File(h5.hdf_filename) as h5:\n", " mag = h5.Magnitude('u', 'v', name='mag')[1:3, 0:2]" ] }, { "cell_type": "code", "execution_count": 6, "id": "0f017c63-70c1-4007-9a55-6d5de6e3997b", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mag.plot()" ] }, { "cell_type": "markdown", "id": "fb9894f1-3e62-4199-9e20-0209ce1f5975", "metadata": {}, "source": [ "## 3 Normalization\n", "\n", "Data is generally stored in one form (and physical unit) in the HDF5 file. However, in some scientific cases, data may be required in a normalized value.\n", "\n", "Consider the following example of a velocity dataset. The accessory `normalize` allows to normalize the data values or the coordinates.\n", "\n", "We will show two scenarios: Either the data values are normalized or the attached coordinates, too (or both)." ] }, { "cell_type": "code", "execution_count": 7, "id": "8d4ed2f8-3e47-4534-aa11-8e51a09703c1", "metadata": {}, "outputs": [], "source": [ "from h5rdmtoolbox.extensions import normalize" ] }, { "cell_type": "markdown", "id": "008c140e-2127-47de-81fe-c1559484fa47", "metadata": {}, "source": [ "Normalize the data by various reference values, here `x_ref` and `phi`. Note, that a unit may be provided:" ] }, { "cell_type": "code", "execution_count": 8, "id": "144da84f-5bd6-44d1-a24e-e55ebc4ecbae", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'x/x_ref/phi' ()>\n",
       "0.3333\n",
       "Attributes:\n",
       "    units:    
" ], "text/plain": [ "\n", "0.3333\n", "Attributes:\n", " units: " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with h5tbx.File() as h5:\n", " h5.create_dataset('x', data=[1, 2, 3], make_scale=True, attrs={'units': 'm'})\n", " h5.create_dataset('y', data=[1, 2, 3, 4], make_scale=True, attrs={'units': 'm'})\n", " h5.create_dataset('u', data=np.random.random((4, 3)), attach_scales=('y', 'x'))\n", " h5.create_dataset('v', data=np.random.random((4, 3)), attach_scales=('y', 'x'))\n", "\n", " x_norm = h5.x.normalize(x_ref='2 m', phi=3)[1]\n", "\n", "x_norm" ] }, { "cell_type": "markdown", "id": "fc22af39-e75b-4c05-b991-20af9a4616c0", "metadata": {}, "source": [ "Now, let's normalize the velocity \"u\" **and its coordinate** x:" ] }, { "cell_type": "code", "execution_count": 9, "id": "a6b8c83e-9c97-475a-903d-3478ffd92eee", "metadata": {}, "outputs": [], "source": [ "with h5tbx.File(h5.hdf_filename) as h5:\n", " u_norm = h5.u.normalize(u_ref='2 m/s', name='uu').x(x_ref='2 m', phi=3, name='epsilon').isel(y=0)" ] }, { "cell_type": "code", "execution_count": 10, "id": "99ac8eff-1069-45c2-b943-e2efd3cec0f5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'uu' (epsilon: 3)>\n",
       "0.4961 0.08902 0.3291\n",
       "Coordinates:\n",
       "    y        int32 1\n",
       "  * epsilon  (epsilon) float64 0.1667 0.3333 0.5\n",
       "Attributes:\n",
       "    units:    s/m
" ], "text/plain": [ "\n", "0.4961 0.08902 0.3291\n", "Coordinates:\n", " y int32 1\n", " * epsilon (epsilon) float64 0.1667 0.3333 0.5\n", "Attributes:\n", " units: s/m" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u_norm" ] }, { "cell_type": "code", "execution_count": 11, "id": "b3f9c0dc-e6e1-46ad-980f-dd120302b53b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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jIiISJ9YABmoWWEd4OVojdyiCizad1bsOERERE0KCyADZSmXYflof0gkwPYT1xCXlit2JCIioiaDBZABC/Johpf61LTConamorCsUuRERERETQMLIAM345kO8HayRl5xBRZ8z1YYERGRPrAAMnAW5jIsHx0AqQTYdfI69p/JETsSERGR0WMBZAS6tnbAlMfaAADe2nUat0vZCiMiInoULICMxPTQdmjXwgYFJRWYv/eM2HGIiIiMGgsgI/FXK0wmlWDvqRv4KTVb7EhERERGiwWQEQlwt8cr/bwBAO/sPo2bJRUiJyIiIjJOLICMzL+faocOzra4WVqJeWyFERERPRQWQEZGYSbDh2NqWmE/pGRjX8oNsSMREREZHRZARqhzSyVefbzmqrC5u08jv5itMCIiovpgAWSk/u/JdvBxscXtsirM3X0agiCIHYmIiMhosAAyUnIzKT4cEwAzqQSxZ3LwfQqvCiMiIqorFkBGrJObEq892Q4AMG/PaeQVl4uciIiIyDiwADJy055og05udigsq8Lbu9gKIyIiqgsWQEbOXCbF8tEBMJdJ8MvZXOxOvi52JCIiIoNnEAXQypUr4enpCQsLCwQHByMxMbFO623ZsgUSiQTDhg3TmT9x4kRIJBKdqX///g2Q3DB0dLXD60/VtMLe3XsWuUVshREREd2P6AXQ1q1bERkZifnz5yMpKQkBAQEICwtDXl7efde7cuUKZs6cib59+97z9f79+yM7O1s7bd68uSHiG4xX+rWBX0slVHeq8NbOVLbCiIiI7kP0Auijjz7C5MmTERERAV9fX6xevRpWVlZYu3Ztreuo1Wq88MILWLBgAby9ve+5jEKhgIuLi3ZycHBoqE0wCGaymqvC5DIp4s7lYUcSW2FERES1EbUAqqysxIkTJxAaGqqdJ5VKERoaioSEhFrXW7hwIVq0aIFJkybVukx8fDxatGiBDh06YOrUqbh582aty1ZUVKCoqEhnMkbtnW0x/emaVtiC788gW3VH5ERERESGSdQCqKCgAGq1Gs7OzjrznZ2dkZOTc891Dh06hK+++goxMTG1jtu/f398/fXXiIuLw9KlS3Hw4EEMGDAAarX6nstHR0dDqVRqJ3d394ffKJFN6euNAHd7FJdXY84OtsKIiIjuRfQWWH0UFxfjxRdfRExMDBwdHWtdbty4cRgyZAj8/Pww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/LX+7du3BUEQhHXr1glKpVL7eq9evYTJkyfrrDN69Ghh4MCB2p8BCO+8847255KSEgGA8NNPP9W6bR4eHsLHH39c6+v3err5XyZPnizMnDlTZ6zx48drf87OzhYACHPnztXOS0hIEAAI2dnZdX4fInp4/AaIiB7apUuXUFZWhqeffho2Njba6euvv0Z6errOsiEhIdp/N2vWDB06dEBaWhoA4N///jcWL16M3r17Y/78+UhJSalzhrS0NPTu3VtnXu/evbVj/8Xf31/7b2tra9jZ2SEvL6/O71NXgiDg+++/v+v8n/99f2dnZwCAn5/fXfMaIhMR3c1M7ABEZLxKSkoAAD/88ANatmyp85pCoajzOC+99BLCwsLwww8/YP/+/YiOjsaHH36I1157TW9Zzc3NdX6WSCTQaDR6G/8viYmJqK6uRq9evWp9/79Oqr7XvIbIRER34zdARPTQfH19oVAokJmZibZt2+pM7u7uOssePXpU++/bt2/jwoUL6Nixo3aeu7s7XnnlFezcuRMzZsxATExMnTJ07NgRhw8f1pl3+PBh+Pr6PsKWPbw9e/Zg0KBBkMlkorw/EdUNvwEioodma2uLmTNn4o033oBGo0GfPn2gUqlw+PBh2NnZYcKECdplFy5ciObNm8PZ2Rlvv/02HB0dtffRmT59OgYMGID27dvj9u3bOHDggE5xdD+zZs3CmDFj0KVLF4SGhuL777/Hzp078euvvzbEJuPs2bOorKzErVu3UFxcjOTkZABAYGAgAGDv3r1YuHBhg7w3EekPCyAieiSLFi2Ck5MToqOjcfnyZdjb26Nr16546623dJZbsmQJXn/9dVy8eBGBgYH4/vvvIZfLAdTcX+fVV1/FtWvXYGdnh/79++Pjjz+u0/sPGzYM//nPf7B8+XK8/vrr8PLywrp16/D444/re1MBAAMHDsTVq1e1P3fp0gVAzbk/6enpuHTpEsLCwhrkvYlIfySCwGsuiajhxMfH44knnsDt27cb5REW+uLp6Ynp06dj+vTpdV7no48+wq+//qq9h5E+TJw4EYWFhdi9e7fexiQingNERFSrN998EzY2NlCpVHVavlWrVoiKitLLe//++++wsbHBpk2b9DIeEeliC4yI6B4OHjyovVGjra1tndbR53O7unXrpj2/qK43hSSiumMLjIiIiEwOW2BERERkclgAERERkclhAUREREQmhwUQERERmRwWQERERGRyWAARERGRyWEBRERERCaHBRARERGZHBZAREREZHL+H9DKJpPLdkatAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "u_norm.plot()" ] }, { "cell_type": "markdown", "id": "7fc1218a-d6fa-43cb-b579-7f2eae77350d", "metadata": {}, "source": [ "## 4. Converting units\n", "\n", "The accessory \"to_units\" will convert the selected data to the desired units. This assumes, that the unit attribute is called \"units\". It is also possible to change the units of \n", "attached dimensions. In the following examples this is done.\n", "\n", "Note, that not the dataset values itself changes in the file, but whatever data is accessed by the following slice operation." ] }, { "cell_type": "code", "execution_count": 12, "id": "e614bf4a-556b-44c0-ac00-11a5113e5cb1", "metadata": {}, "outputs": [], "source": [ "from h5rdmtoolbox.extensions import units" ] }, { "cell_type": "code", "execution_count": 13, "id": "76cf75b0-3935-42ec-a3b6-0165db7d8264", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'u' (x: 1)>\n",
       "-4.5e+03\n",
       "Coordinates:\n",
       "  * x        (x) float64 -4.5e+03\n",
       "Attributes:\n",
       "    units:    mm/s
" ], "text/plain": [ "\n", "-4.5e+03\n", "Coordinates:\n", " * x (x) float64 -4.5e+03\n", "Attributes:\n", " units: mm/s" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with h5tbx.File(mode='w') as h5:\n", " h5.create_dataset('x', data=[1, -4.5, 5.71], attrs={'units': 'm'},\n", " make_scale=True)\n", " ds = h5.create_dataset('u', data=[1, -4.5, 5.71], attrs={'units': 'm/s'},\n", " attach_scale='x')\n", " u_mm = h5.u.to_units('mm/s', x='mm')[1:2]\n", "u_mm" ] }, { "cell_type": "markdown", "id": "17ff27c3-3ffd-48fb-90f8-4df6ad49231b", "metadata": {}, "source": [ "## 5. Ontology accessory (under development)\n", "\n", "The idea of the `onto` accessory is to quickly enrich a group with FAIR metadata, e.g. by adding a person to an HDF5 file:" ] }, { "cell_type": "code", "execution_count": 14, "id": "ba32eeff-b2bf-4ace-9246-4de59268624d", "metadata": {}, "outputs": [], "source": [ "from h5rdmtoolbox.extensions import onto" ] }, { "cell_type": "code", "execution_count": 15, "id": "59f87182-795d-4a50-a308-2aa736d2e571", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "with h5tbx.File() as h5:\n", " g = h5.onto.create_person(orcid_id='https://orcid.org/0000-0000-0000-0000',\n", " first_name='John',\n", " last_name='Doe')\n", " h5.dump()" ] }, { "cell_type": "markdown", "id": "b7730172-11e8-47f0-93b1-9bc47aa0e1dd", "metadata": {}, "source": [ "## Custom accessory\n", "\n", "Besides the already implemented ones, users can register custom accessories, too. In the following example, we add \"device\" as a \"property with methods\". So \"device\" appears as a property which has a method \"add\". Such an implementation facilitates the interaction with HDF data, too. Note, that this \"property-like\" accessory is available for all `Dataset` objects from now on in this session:" ] }, { "cell_type": "code", "execution_count": 16, "id": "41f5c2c1-7de5-4e1c-b44e-4d350328f7ef", "metadata": {}, "outputs": [], "source": [ "from h5rdmtoolbox import register_accessor\n", "\n", "@register_accessor('device', h5tbx.Dataset, overwrite=True)\n", "class DeviceProperty:\n", " \"\"\"Device Accessor class\"\"\"\n", "\n", " def __init__(self, ds):\n", " self._ds = ds\n", " self._device_name = 'NoDeviceName'\n", " \n", " def add(self, new_device_name):\n", " \"\"\"adds the attribute device_name to the dataset\"\"\"\n", " self._ds.attrs['device_name'] = new_device_name\n", " \n", " @property\n", " def name(self):\n", " return self._ds.attrs['device_name']" ] }, { "cell_type": "code", "execution_count": 17, "id": "2af29af0-aa80-4887-bd6f-8c93d719f2e8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "my device\n" ] } ], "source": [ "with h5tbx.File() as h5:\n", " ds = h5.create_dataset('test', shape=(2,))\n", " print(type(ds))\n", " ds.device.add('my device')\n", " print(ds.device.name)" ] }, { "cell_type": "code", "execution_count": null, "id": "c569c3ff-aa88-4bf9-968f-5a3c210ac6b2", "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.18" } }, "nbformat": 4, "nbformat_minor": 5 }