diff --git a/CHANGELOG.md b/CHANGELOG.md index 45a3542c..0ee212df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Log of changes in the versions +## v1.7.2 + +- remove `skipND` from being deprecated +- separation of "linked data" code into a separate repo +- update documentation + ## v1.7.1 - fix documentation at readthedocs diff --git a/CITATION.cff b/CITATION.cff index d8368115..69aa9fed 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -11,7 +11,7 @@ authors: given-names: "Lucas" orcid: "https://orcid.org/0000-0002-4116-0065" title: "h5rdmtoolbox - HDF5 Research Data Management Toolbox" -version: 1.7.1 -doi: 10.5281/zenodo.14910043 -date-released: 2024-02-22 +version: 1.7.2 +doi: 10.5281/zenodo.14938907 +date-released: 2024-02-27 url: "/~https://github.com/matthiasprobst/h5rdmtoolbox" \ No newline at end of file diff --git a/PLANNED_CHANGES.md b/PLANNED_CHANGES.md new file mode 100644 index 00000000..68c04588 --- /dev/null +++ b/PLANNED_CHANGES.md @@ -0,0 +1,11 @@ +# Planned changes + +## v1.8.0 + +- remove `skipND` and replace with `serialize_0d_datasets`, which only supports serialization of 0D datasets +- remove `resolve_keys` from `dump_jsonld()` and `serialize()` +- remove `semantic` from `dump_jsonld()` and `serialize()` + +## v2.0.0 + +- remove `dump_jsonld()` and only use `serialize()` \ No newline at end of file diff --git a/README.md b/README.md index 056f829f..4018d28b 100644 --- a/README.md +++ b/README.md @@ -54,9 +54,10 @@ For everybody, who ... ## Package Architecture/structure -The toolbox implements five modules, which are shown below. The numbers reference to their main usage in the stages in -the data lifecycle above. Except the wrapper module, which uses the convention module, all other modules are independent -of each other. +The toolbox implements six modules, which are shown below. The numbers reference to their main usage in the stages in +the data lifecycle above. The wrapper module implements the main interface between the user and the HDF5 file. It +extends the features of the underlying `h5py` library. Some of the features are implemented in other modules, hence the +wrapper module depends on the convention, database and linked data (ld) module. H5TBX modules diff --git a/codemeta.json b/codemeta.json index e2e5c853..432c797b 100644 --- a/codemeta.json +++ b/codemeta.json @@ -4,7 +4,7 @@ "license": "https://spdx.org/licenses/MIT", "codeRepository": "git+/~https://github.com/matthiasprobst/h5RDMtoolbox.git", "name": "h5RDMtoolbox", - "version": "1.7.1", + "version": "1.7.2", "description": "Supporting a FAIR Research Data lifecycle using Python and HDF5.", "applicationCategory": "Engineering", "programmingLanguage": [ diff --git a/docs/_static/h5tbx_modules.svg b/docs/_static/h5tbx_modules.svg index 76bca308..c25ab767 100644 --- a/docs/_static/h5tbx_modules.svg +++ b/docs/_static/h5tbx_modules.svg @@ -2,13 +2,13 @@ + visible="true" /> + id="path5-6" /> + + + repository h5rdmtoolbox wrapper convention database layout - + uses + id="tspan7" + style="stroke-width:0.5;stroke-dasharray:none" + x="78.439598" + y="26.241766">ld 1 + transform="translate(17.991667,-1.7037926)"> + transform="translate(15.369083,-1.5875)"> + transform="translate(6.3500004)"> + transform="translate(5.6464864)"> + transform="translate(14.193405,-1.5875)"> + transform="translate(17.991667)"> + transform="translate(11.16422,2.6458332)"> 5 + transform="translate(6.3500004)"> + transform="translate(42.53938,-1.5875)"> + transform="translate(-12.700001)"> + transform="translate(44.471865,2.6458332)"> 2 + + + + diff --git a/docs/colab/quickstart.ipynb b/docs/colab/quickstart.ipynb index c67e35ab..5cfb9b1f 100644 --- a/docs/colab/quickstart.ipynb +++ b/docs/colab/quickstart.ipynb @@ -8,7 +8,7 @@ }, "outputs": [], "source": [ - "# !pip install h5rdmtoolbox==1.7.1" + "# !pip install h5rdmtoolbox==1.7.2" ] }, { @@ -19,7 +19,7 @@ { "data": { "text/plain": [ - "'1.6.1'" + "'1.7.2'" ] }, "execution_count": 2, @@ -53,13 +53,17 @@ "source": [ "import h5rdmtoolbox as h5tbx\n", "from h5rdmtoolbox.repository import zenodo\n", - "from h5rdmtoolbox.tutorial import TutorialConventionZenodoRecordID\n", + "from h5rdmtoolbox.tutorial import TutorialConventionZenodoRecordID, get_convention_yaml_filename\n", "\n", "import os\n", "os.environ['ZENODO_API_TOKEN'] = 'changeme'\n", "\n", "zenodo_repo = zenodo.ZenodoRecord(TutorialConventionZenodoRecordID)\n", - "cv = h5tbx.convention.from_repo(zenodo_repo, 'tutorial_convention.yaml')" + "\n", + "if os.environ['ZENODO_API_TOKEN'] == \"changeme\": # you might not have the zenodo token, so we take the tutorial file for now:\n", + " cv = h5tbx.convention.from_yaml(get_convention_yaml_filename())\n", + "else:\n", + " cv = h5tbx.convention.from_repo(zenodo_repo, 'tutorial_convention.yaml')" ] }, { @@ -71,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -110,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -119,7 +123,7 @@ "using(\"h5rdmtoolbox-tutorial-convention\")" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -131,15 +135,47 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\matth\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\utils.py:69: UserWarning: No hash given! This is recommended when downloading files from the web.\n", - " warnings.warn('No hash given! This is recommended when downloading files from the web.', UserWarning)\n" + "2025-02-27_16:35:31,120 CRITICAL [core.py:613] You don't have the permission to request https://zenodo.org/api/deposit/depositions/10428795. You may need to check your access token.\n" + ] + }, + { + "ename": "HTTPError", + "evalue": "403 Client Error: FORBIDDEN for url: https://zenodo.org/api/deposit/depositions/10428795?access_token=changeme", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\convention\\standard_attributes.py:201\u001b[0m, in \u001b[0;36mStandardAttribute.set\u001b[1;34m(self, parent, value, attrs)\u001b[0m\n\u001b[0;32m 200\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 201\u001b[0m model_fields \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel_fields\u001b[49m\u001b[38;5;241m.\u001b[39mkeys())\n\u001b[0;32m 202\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n", + "File \u001b[1;32m~\\anaconda3\\envs\\h5tbx310\\lib\\typing.py:1656\u001b[0m, in \u001b[0;36m_AnnotatedAlias.__getattr__\u001b[1;34m(self, attr)\u001b[0m\n\u001b[0;32m 1655\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAnnotated\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m-> 1656\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getattr__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mattr\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\anaconda3\\envs\\h5tbx310\\lib\\typing.py:983\u001b[0m, in \u001b[0;36m_BaseGenericAlias.__getattr__\u001b[1;34m(self, attr)\u001b[0m\n\u001b[0;32m 982\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m__origin__\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__dict__\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m _is_dunder(attr):\n\u001b[1;32m--> 983\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__origin__\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mattr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 984\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(attr)\n", + "File \u001b[1;32m~\\anaconda3\\envs\\h5tbx310\\lib\\typing.py:983\u001b[0m, in \u001b[0;36m_BaseGenericAlias.__getattr__\u001b[1;34m(self, attr)\u001b[0m\n\u001b[0;32m 982\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m__origin__\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__dict__\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m _is_dunder(attr):\n\u001b[1;32m--> 983\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__origin__\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mattr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 984\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(attr)\n", + "File \u001b[1;32m~\\anaconda3\\envs\\h5tbx310\\lib\\typing.py:375\u001b[0m, in \u001b[0;36m_SpecialForm.__getattr__\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 373\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_name\n\u001b[1;32m--> 375\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(item)\n", + "\u001b[1;31mAttributeError\u001b[0m: model_fields", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[1;31mHTTPError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[6], line 5\u001b[0m\n\u001b[0;32m 1\u001b[0m filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmy_file.hdf\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m----> 5\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mh5tbx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mFile\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mw\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mdata_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mexperimental\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mcontact\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mhttps://orcid.org/0000-0001-8729-0482\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m h5:\n\u001b[0;32m 9\u001b[0m \u001b[38;5;66;03m# create a dataset\u001b[39;00m\n\u001b[0;32m 10\u001b[0m h5\u001b[38;5;241m.\u001b[39mcreate_dataset(name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m, data\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39mlinspace(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1000\u001b[39m),\n\u001b[0;32m 11\u001b[0m standard_name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m, units\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mms\u001b[39m\u001b[38;5;124m'\u001b[39m, make_scale\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m 12\u001b[0m h5\u001b[38;5;241m.\u001b[39mcreate_dataset(name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mu\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 13\u001b[0m data\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39mrandom\u001b[38;5;241m.\u001b[39mnormal(\u001b[38;5;241m10\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m1000\u001b[39m),\n\u001b[0;32m 14\u001b[0m standard_name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx_velocity\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 15\u001b[0m units\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mm/s\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 16\u001b[0m attach_scale\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[1;32m~\\anaconda3\\envs\\h5tbx310\\lib\\site-packages\\forge\\_revision.py:328\u001b[0m, in \u001b[0;36mRevision.__call__..inner\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 324\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(\u001b[38;5;28mcallable\u001b[39m) \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[0;32m 325\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minner\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m 326\u001b[0m \u001b[38;5;66;03m# pylint: disable=E1102, not-callable\u001b[39;00m\n\u001b[0;32m 327\u001b[0m mapped \u001b[38;5;241m=\u001b[39m inner\u001b[38;5;241m.\u001b[39m__mapper__(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m--> 328\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(\u001b[38;5;241m*\u001b[39mmapped\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mmapped\u001b[38;5;241m.\u001b[39mkwargs)\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\wrapper\\core.py:2278\u001b[0m, in \u001b[0;36mFile.__init__\u001b[1;34m(self, name, mode, attrs, **kwargs)\u001b[0m\n\u001b[0;32m 2273\u001b[0m \u001b[38;5;66;03m# logger.debug('Creating group \"h5rdmtoolbox\" with attribute \"__h5rdmtoolbox_version__\" in file')\u001b[39;00m\n\u001b[0;32m 2274\u001b[0m \u001b[38;5;66;03m# _tbx_grp = self.create_group('h5rdmtoolbox')\u001b[39;00m\n\u001b[0;32m 2275\u001b[0m \u001b[38;5;66;03m# _tbx_grp.rdf.subject = 'https://schema.org/SoftwareSourceCode'\u001b[39;00m\n\u001b[0;32m 2276\u001b[0m \u001b[38;5;66;03m# _tbx_grp.attrs['__h5rdmtoolbox_version__', 'https://schema.org/softwareVersion'] = __version__\u001b[39;00m\n\u001b[0;32m 2277\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m attrs\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m-> 2278\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattrs\u001b[49m\u001b[43m[\u001b[49m\u001b[43mk\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m v\n", + "File \u001b[1;32mh5py\\\\_objects.pyx:54\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32mh5py\\\\_objects.pyx:55\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\wrapper\\h5attr.py:345\u001b[0m, in \u001b[0;36mWrapperAttributeManager.__setitem__\u001b[1;34m(self, name, value, attrs)\u001b[0m\n\u001b[0;32m 343\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(value, consts\u001b[38;5;241m.\u001b[39mDefaultValue):\n\u001b[0;32m 344\u001b[0m value \u001b[38;5;241m=\u001b[39m value\u001b[38;5;241m.\u001b[39mvalue\n\u001b[1;32m--> 345\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msattr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 346\u001b[0m \u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparent\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 347\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 348\u001b[0m \u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattrs\u001b[49m\n\u001b[0;32m 349\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 351\u001b[0m utils\u001b[38;5;241m.\u001b[39mcreate_special_attribute(\u001b[38;5;28mself\u001b[39m, name, value)\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\convention\\standard_attributes.py:205\u001b[0m, in \u001b[0;36mStandardAttribute.set\u001b[1;34m(self, parent, value, attrs)\u001b[0m\n\u001b[0;32m 203\u001b[0m tmp_model \u001b[38;5;241m=\u001b[39m pydantic\u001b[38;5;241m.\u001b[39mcreate_model(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname, value\u001b[38;5;241m=\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalidator, \u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m))\n\u001b[0;32m 204\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 205\u001b[0m _validated_value \u001b[38;5;241m=\u001b[39m \u001b[43mtmp_model\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel_validate\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvalue\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 206\u001b[0m \u001b[43m \u001b[49m\u001b[43mcontext\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mparent\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mattrs\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m pydantic\u001b[38;5;241m.\u001b[39mValidationError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m 208\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m errors\u001b[38;5;241m.\u001b[39mStandardAttributeError(\n\u001b[0;32m 209\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mValidation of \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m for standard attribute \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m failed.\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 210\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mPydantic error: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00merr\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n", + " \u001b[1;31m[... skipping hidden 1 frame]\u001b[0m\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\convention\\toolbox_validators.py:47\u001b[0m, in \u001b[0;36m__validate_standard_name_table\u001b[1;34m(value, handler, info)\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__validate_standard_name_table\u001b[39m(value, handler, info) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStandardNameTable\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 46\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mh5rdmtoolbox\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mconvention\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m standard_names\n\u001b[1;32m---> 47\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mstandard_names\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_snt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\convention\\standard_names\\__init__.py:23\u001b[0m, in \u001b[0;36mparse_snt\u001b[1;34m(snt)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m StandardNameTable\u001b[38;5;241m.\u001b[39mfrom_dict(json\u001b[38;5;241m.\u001b[39mloads(snt))\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mzenodo.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m snt:\n\u001b[1;32m---> 23\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mStandardNameTable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_zenodo\u001b[49m\u001b[43m(\u001b[49m\u001b[43msource\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msnt\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 25\u001b[0m fname \u001b[38;5;241m=\u001b[39m pathlib\u001b[38;5;241m.\u001b[39mPath(snt)\n\u001b[0;32m 26\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mReading standard name table from file \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msnt\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\convention\\standard_names\\table.py:730\u001b[0m, in \u001b[0;36mStandardNameTable.from_zenodo\u001b[1;34m(source, doi_or_recid)\u001b[0m\n\u001b[0;32m 728\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrepository\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mzenodo\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ZenodoRecord\n\u001b[0;32m 729\u001b[0m z \u001b[38;5;241m=\u001b[39m ZenodoRecord(recid)\n\u001b[1;32m--> 730\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _fname, file \u001b[38;5;129;01min\u001b[39;00m \u001b[43mz\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfiles\u001b[49m\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m 731\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _fname \u001b[38;5;241m==\u001b[39m filename:\n\u001b[0;32m 732\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m StandardNameTable\u001b[38;5;241m.\u001b[39mfrom_yaml(file\u001b[38;5;241m.\u001b[39mdownload())\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\repository\\zenodo\\core.py:645\u001b[0m, in \u001b[0;36mZenodoRecord.files\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 638\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[0;32m 639\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfiles\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dict[\u001b[38;5;28mstr\u001b[39m, RepositoryFile]:\n\u001b[0;32m 640\u001b[0m \u001b[38;5;66;03m# def _parse_download_url(filename):\u001b[39;00m\n\u001b[0;32m 641\u001b[0m \u001b[38;5;66;03m# if filename is None:\u001b[39;00m\n\u001b[0;32m 642\u001b[0m \u001b[38;5;66;03m# return filename\u001b[39;00m\n\u001b[0;32m 643\u001b[0m \u001b[38;5;66;03m# return f\"{self.rec_url}/{self.rec_id}/files/{filename}\"\u001b[39;00m\n\u001b[1;32m--> 645\u001b[0m is_submitted \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubmitted\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 647\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_parse_download_url\u001b[39m(url, filename):\n\u001b[0;32m 648\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m url \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\repository\\zenodo\\core.py:601\u001b[0m, in \u001b[0;36mZenodoRecord.is_published\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 599\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mis_published\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mbool\u001b[39m:\n\u001b[0;32m 600\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Check if the deposit is published.\"\"\"\u001b[39;00m\n\u001b[1;32m--> 601\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjson\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msubmitted\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", + "File \u001b[1;32m~\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\repository\\zenodo\\core.py:615\u001b[0m, in \u001b[0;36mZenodoRecord.json\u001b[1;34m(self, raise_for_status)\u001b[0m\n\u001b[0;32m 612\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m r\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m403\u001b[39m:\n\u001b[0;32m 613\u001b[0m logger\u001b[38;5;241m.\u001b[39mcritical(\n\u001b[0;32m 614\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt have the permission to request \u001b[39m\u001b[38;5;132;01m{\u001b[39;00murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. You may need to check your access token.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m--> 615\u001b[0m \u001b[43mr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_for_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 617\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m r\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m429\u001b[39m:\n\u001b[0;32m 618\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mToo many requests message: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mr\u001b[38;5;241m.\u001b[39mjson()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. Sleep for 60 seconds and try again.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[1;32m~\\anaconda3\\envs\\h5tbx310\\lib\\site-packages\\requests\\models.py:1024\u001b[0m, in \u001b[0;36mResponse.raise_for_status\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1019\u001b[0m http_error_msg \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 1020\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstatus_code\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m Server Error: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mreason\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m for url: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1021\u001b[0m )\n\u001b[0;32m 1023\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m http_error_msg:\n\u001b[1;32m-> 1024\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m HTTPError(http_error_msg, response\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m)\n", + "\u001b[1;31mHTTPError\u001b[0m: 403 Client Error: FORBIDDEN for url: https://zenodo.org/api/deposit/depositions/10428795?access_token=changeme" ] } ], @@ -174,266 +210,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "\n", - " \n", - "
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from ontolutils import M4I, QUDT_UNIT\n", "from rdflib import DCAT\n", @@ -471,266 +250,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "\n", - " \n", - "
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "with h5tbx.File(filename, mode='r') as h5:\n", " # inspect the file layout and content:\n", @@ -746,45 +268,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"@context\": {\n", - " \"m4i\": \"http://w3id.org/nfdi4ing/metadata4ing#\",\n", - " \"qudt\": \"http://qudt.org/schema/qudt/\",\n", - " \"ssno\": \"https://matthiasprobst.github.io/ssno#\"\n", - " },\n", - " \"@graph\": [\n", - " {\n", - " \"@id\": \"_:N7\",\n", - " \"qudt:Unit\": {\n", - " \"@id\": \"http://qudt.org/vocab/unit/M-PER-SEC\"\n", - " }\n", - " },\n", - " {\n", - " \"@id\": \"_:N0\",\n", - " \"m4i:orcidId\": {\n", - " \"@type\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\n", - " \"@value\": \"https://orcid.org/0000-0001-8729-0482\"\n", - " },\n", - " \"ssno:standardNameTable\": {\n", - " \"@id\": \"ssno:StandardNameTable\"\n", - " }\n", - " },\n", - " {\n", - " \"@id\": \"_:N2\",\n", - " \"http://www.w3.org/2004/02/skos/core#definition\": \"The source type of the data\"\n", - " }\n", - " ]\n", - "}\n" - ] - } - ], + "outputs": [], "source": [ "from h5rdmtoolbox import dump_jsonld\n", "print(dump_jsonld(filename,\n", @@ -805,452 +291,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'u' (time: 1000)> Size: 8kB\n",
-       "6.5 10.69 12.31 9.495 11.96 11.03 10.44 ... 11.36 8.524 12.65 11.85 10.43 12.66\n",
-       "Coordinates:\n",
-       "  * time     (time) float64 8kB 0.0 0.001001 0.002002 ... 0.998 0.999 1.0\n",
-       "Attributes:\n",
-       "    RDF_OBJECT:     {'units': 'http://qudt.org/vocab/unit/M-PER-SEC'}\n",
-       "    RDF_PREDICATE:  {'units': 'http://qudt.org/schema/qudt/Unit'}\n",
-       "    standard_name:  x_velocity\n",
-       "    units:          m/s
" - ], - "text/plain": [ - " Size: 8kB\n", - "6.5 10.69 12.31 9.495 11.96 11.03 10.44 ... 11.36 8.524 12.65 11.85 10.43 12.66\n", - "Coordinates:\n", - " * time (time) float64 8kB 0.0 0.001001 0.002002 ... 0.998 0.999 1.0\n", - "Attributes:\n", - " RDF_OBJECT: {'units': 'http://qudt.org/vocab/unit/M-PER-SEC'}\n", - " RDF_PREDICATE: {'units': 'http://qudt.org/schema/qudt/Unit'}\n", - " standard_name: x_velocity\n", - " units: m/s" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "with h5tbx.File(filename, mode='r') as h5:\n", " u = h5.u[:]\n", @@ -1266,20 +309,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -1299,28 +331,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\matth\\Documents\\GitHub\\h5RDMtoolbox\\h5rdmtoolbox\\utils.py:69: UserWarning: No hash given! This is recommended when downloading files from the web.\n", - " warnings.warn('No hash given! This is recommended when downloading files from the web.', UserWarning)\n" - ] - }, - { - "data": { - "image/png": "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wF/+8he7xcPD46qx+vTpg0uXLiEzM1Np++2335CXl4dbbrkFwB9ntw19cfpnrq6utV7/fuihh1BQUIDExER89913mDp16jWPeb22bduGiIgIuzadTodJkybhjTfewAcffIAPP/wQpaWlzVYTNT0GN6nmX//6FywWCxITEzF//nz07NkTjzzyyDVvP2HCBJw/fx6PP/44RowYYfek+ZiYGJSWlmLy5MnIysrCmTNnsGvXLkyfPr3WMO3RowciIiIwc+ZMfPnllzh27Bgeeugh3HTTTUrQxcXFISsrC0888QS+/vprnDhxAklJSXXeqRIQEID09HT89NNPdn06deqECRMm4Omnn8bo0aPRtWvXa97n61FSUoLDhw/j3nvvVdpefvllvPfeezhx4gROnjyJLVu2wGg0wsvLq1lqoubB4CZV7Nu3DwkJCXjnnXeg0+ng5OSEd955B1988QWSkpKuaQxPT0+Eh4fj2LFjdpdJAMBkMuHAgQOoqanB6NGj0a9fP8yZMwdeXl5wcqr9Y7x+/XoMGjQI9957L4KDgyGEwCeffKJcfujZsyc+++wzHDt2DEOHDkVwcDC2bdsGZ+faf73hueeew9mzZ9G9e3d07tzZbt2MGTNw8eJFh/6hul4ff/wxhg4dihtvvFFp8/T0xMqVKzF48GAMGTIEZ8+exSeffFLnz4jkxEeXEangnXfewdy5c1FUVARXV9d6+w4fPhy33377df8W5n333Ydhw4bhmWeecWi7ffv2YcSIETh37hzPxCXFf4aJrsOFCxdw5swZLF++HI899liDoX3Zq6++io4dO+Kbb75p9HsPGzYMkydPdmibvn37IiwsrNHvSa0Dz7ipWfTt2xcFBQW1rnvttdeuujQiiyVLluCFF17A3XffjW3btqFjx44NbvPTTz/h999/BwD4+/tfc9iroaCgQPkFpJtvvpmXUCTF4KZm8efAuJLBYGjUbxkStVcMbiIiyfD/SUREkmFwExFJhsFNRCQZBjcRkWQY3EREkmFwExFJhsFNRCQZBjcRkWT+Hx0UZiyJappaAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "with h5tbx.File(filename, mode='r') as h5:\n", " plt.figure(figsize=(4, 3))\n", @@ -1342,20 +355,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "res = lay.validate(filename)\n", "res.is_valid()" @@ -1378,18 +380,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "my_file.hdf\n", - "my_file.jsonld\n" - ] - } - ], + "outputs": [], "source": [ "from h5rdmtoolbox.repository import zenodo\n", "from h5rdmtoolbox.wrapper.jsonld import hdf2jsonld\n", @@ -1422,20 +415,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "fdb = h5tbx.database.FileDB(filename)\n", "fdb" @@ -1450,20 +432,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "result = fdb.find_one({'standard_name': {'$eq': 'x_velocity'}})\n", "result" @@ -1478,30 +449,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGwCAYAAABcnuQpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACs8UlEQVR4nO2dd5wURdrHf72ZhWXJYck5RwUEVEBRQcV8hlPP9J564nli9swRRc8zHIqnZzpPOe9OMKCAKIgCgggoSs4ZJO3CAhtm+v1jd2aru6u6qzrM9Ow+388HnZ3prnq6urrq6ed56ilN13UdBEEQBEEQKUpasgUgCIIgCILwAikzBEEQBEGkNKTMEARBEASR0pAyQxAEQRBESkPKDEEQBEEQKQ0pMwRBEARBpDSkzBAEQRAEkdJkJFuAoIlGo9ixYwfy8vKgaVqyxSEIgiAIQgJd13Ho0CEUFBQgLc3e9lLtlZkdO3agVatWyRaDIAiCIAgXbN26FS1btrQ9ptorM3l5eQAqGqNu3bpJloYgCIIgCBmKiorQqlWr+DxuR7VXZmKupbp165IyQxAEQRAphkyICAUAEwRBEASR0pAyQxAEQRBESkPKDEEQBEEQKQ0pMwRBEARBpDRJVWbmzp2LMWPGoKCgAJqmYerUqYbfDx8+jJtvvhktW7ZErVq10L17d0yaNCk5whIEQRAEEUqSqswUFxejT58+mDhxIvf32267DdOnT8e7776LlStX4tZbb8XNN9+Mjz/+OMGSEgRBEAQRVpK6NHv06NEYPXq08Pf58+fjqquuwvDhwwEA119/PV599VUsWrQI55xzDveckpISlJSUxP8uKiryVWaCIAiCIMJFqGNmhgwZgo8//hjbt2+HruuYPXs21qxZg9NPP114zvjx45Gfnx//R9l/CYIgCKJ6E2pl5qWXXkL37t3RsmVLZGVlYdSoUZg4cSJOPvlk4Tn33nsvCgsL4/+2bt2aQIkJgiAIgkg0oc4A/NJLL+G7777Dxx9/jDZt2mDu3LkYO3YsCgoKMHLkSO452dnZyM7OTrCkBEEQBEEki9AqM0ePHsWf//xnTJkyBWeddRYAoHfv3li2bBmeffZZoTJDEARBEETNIrRuprKyMpSVlVm2/U5PT0c0Gk2SVARBEARBhI2kWmYOHz6MdevWxf/euHEjli1bhgYNGqB169YYNmwY7rzzTtSqVQtt2rTB119/jXfeeQfPPfdcEqUmCCKMRKI6yiJR5GSmJ1sUgiASjKbrup6syufMmYMRI0ZYvr/qqqvw1ltvYdeuXbj33nsxc+ZM7N+/H23atMH111+PcePGSe2iCVQszc7Pz0dhYSHtmk0Q1ZgxL32L1bsOYcmDp6FOdmg96ARBSKIyfyf1iR8+fDjsdKlmzZrhzTffTKBEBEGkKsu3FwIAFm3ch1O6Nk2yNARBJJLQxswQBEG4IUIhdQRR4yBlhiCIakU0eZ5zgiCSBCkzBEFUK6JRUmYIoqZBygxBENUK0mUIouZBygxBENWKCLmZCKLGQcoMQRDViiRmmyAIIkmQMkMQRLUiQn4mgqhxkDJDEES1gpQZgqh5kDJDEES1gpZmE0TNg5QZgiCqFWSYIYiaBykzBEFUK8jNRBA1D1JmCIKoVtBqJoKoeZAyQxBEtYIsMwRR8yBlhiCIagXpMgRR8yBlhiCIagWtZiKImgcpMwRBVCvIzUQQNQ9SZohqQeHRMny0bDuOlJYnWxQiyZAuQxA1D1JmiGrBjf/8AX+avAx//nB5skUhkgy5mQii5kHKDFEtWLBhHwBg6rIdSZaESDbkZiKImgcpMwRBVCtImSGImgcpMwRBVCsoaR5B1DxImSEIoloRIWWGIGocpMwQREDouo6t+4+QpSDBkJeJIGoepMwQREA8M2M1TpowG//4dmOyRalRREmbIYgaBykzBBEQL89ZDwB4fNrKJEtSs6Cl2QRR8yBlhiACpnZWerJFqFFEosmWgCCIREPKDEEETJ2cjGSLUKMgywxB1DxImSGIgMnLyUy2CDUKUmYIouZBygxBBEztbLLMJBJKmkcQNQ9SZggiYPJImUkoZJkhiJoHKTMEETC1sykAOJGQZYYgah6kzBBEAJQzS2pqZ5FlJpGQLkMQNQ9SZggiANgJVdO05AlSA6GkeQRR8yBlhiACRgdNrkHDbhlBMTMEUfMgZYYgAsCgwNDcmlAi1N4EUeMgZYYgAkAnXSahsO1NlhmCqHkkVZmZO3cuxowZg4KCAmiahqlTp1qOWblyJc455xzk5+ejdu3aGDBgALZs2ZJ4YQmCSAkoZoYgah5JVWaKi4vRp08fTJw4kfv7+vXrceKJJ6Jr166YM2cOfvrpJzzwwAPIyclJsKQE4R6dLAWBQy1MEDWbpK4ZHT16NEaPHi38/b777sOZZ56JCRMmxL/r0KFDIkQjCE+Qmyl5kO5IEDWP0MbMRKNRTJs2DZ07d8YZZ5yBJk2aYNCgQVxXFEtJSQmKiooM/wgi0dAKpsRC1i+CqNmEVpnZs2cPDh8+jKeeegqjRo3CzJkzcf755+OCCy7A119/LTxv/PjxyM/Pj/9r1apVAqUmiAoMlhmaZxMKKZIEUfMIrTITjVZkUD333HMxbtw49O3bF/fccw/OPvtsTJo0SXjevffei8LCwvi/rVu3JkpkguBCU2vwsG1MyiNB1DxCm2e9UaNGyMjIQPfu3Q3fd+vWDd9++63wvOzsbGRnZwctHkHYQvNp8qC2J4iaR2gtM1lZWRgwYABWr15t+H7NmjVo06ZNkqQiCDnYGA6K50gs1NwEUfNIqmXm8OHDWLduXfzvjRs3YtmyZWjQoAFat26NO++8E5dccglOPvlkjBgxAtOnT8cnn3yCOXPmJE9ogpCA5tPEQgoMkUwe+eQXZGek457RXZXOK49Ecc1b36N3y3zceYbauYSRpFpmFi9ejH79+qFfv34AgNtuuw39+vXDgw8+CAA4//zzMWnSJEyYMAG9evXC66+/jv/973848cQTkyk2QThCS7OTCbU4kTj2FB3Dm/M2YdLX63G0NKJ07pzVv+KbtXsxcfb6gKSrOSTVMjN8+HBHE/y1116La6+9NkESEUQA0NwaOOwKJrLSEImkNBKNf1ZdSceeS3gjtDEzBJHS0ISaNKjpiUTCKs8aNKVz1Y4m7CBlhiACwGApoOk1cMgaQ4QBTVE7UT2eEEPKDEEEACXNSx60eoxIHUib8QtSZggiYJI9t+47XIJjZWqBiakMqTJEslB91sky4x+kzBBEAPg1oZZ5DBDcc+gYjnt8FgY9+aVPEoWfZCuPRM3CS38jXcY/SJkhCEUOHSvDewu3YN/hEuExfrg6Hv74F3R7YDo2/HrYdRnfbzwAACg8WuZZnjBDCgwRBlTj4zQyzfgGKTMEocg9Hy7Hn6csxzVvfS88xrBXkEs7zVvzN6E8quPlOe5zUNTEsZL0GiJZqCrVaTXw+QwKUmYIQpHPl+8EAPy0rVDq+KjH2TXdg0ZSUywWxjwzNeSiiVDgZbViTXzZCApSZghCkXSJ1yk/VzOlp9OIR/jH/HV78f6iLckWo1qi+qizeWlICfdGaHfNJoiwUuHnth94dJOjyQteLDM1BZoH5Pnt6wsBAN2a10XfVvWSK0w1wPjiorqcqepjVAfovcU9ZJkhCEWklAtmTPPsZvLgWK+JehApNnJsP3A02SJUC7x0N/bxjFLH9QQpMwShiKpu4dV87EWZqYlQxuVwsePgUUS8avQpgrKbiXnbIGXGG6TMEIQiaTIxM8xnr+N4BikzjhicejQnSJEIpW/mL7sw5Kmv8Id3fwi8rjDgwctE/dYjpMwQRCWl5VFM+2kn9heX2h6XJuG7MfjRPcpFlhk1aFIID3+fuwEAMHPF7iRLEhxeLK/sUKJivSqLRHH569/h2RmrXddd3SBlhiAqeX7WGox9bwl+M2m+7XEyuoWfS4W9WGZqihpEK0HCSY2L2VK2zLhzM325cjfmrduHv81ep1ZhNYaUGYKo5LPK/DHrfy22PU7GMsPidZ6VcWsRVVDMTHioaRlu1TMAV31WcUeXlHvb5qQ6QsoMQSgiFTNjcDMlzzJTU6CYmXBS03qut5gZ6rheIGWGIBSRczNVEfX4EuXFMlPDXowB0HYGsiRi7lS1YqYinprRpWWGsELKDEEoIpNnhn3LIstM8NBLbTipAbqMb8H+tDTbG6TMEIQiqpYSz9sZpNFjqgTNCaGhJlhmWJRdRYbkmtRxvUCjJEEoorw028UYFWVszmSZkcBljNJb8zbimjcX4VhZJAChvDNx9jpMXbo92WK4pmboMu6VELfuaNJ7rNDeTARRiezKC9W8L27cTBFmtKLVTGqoDPQPf7ICAPDB4q343eC2wQjkkhU7ivBMZR6R8/q1SLI0hAgvbiadLDO+QZYZglBEamsmj3szlUfIMqOC17ik4pLwWWYOHLFP3uiVREydNcHN5GUlHdtvVZSZGtCsypAyQxCKqO5i7WbJZTljc6Zds9VwM0lTEwdDTWhXLwYVt+5oMuJYIWWGICqRVTqkYmbYDMAuZGFTm9N2Bs4YJwX1Fq+JLZyIa64Zlhn3KxeNe7iRhuIFUmYIX/jkxx044ckvsWzrwWSL4ornvliDTfuOSB2bEDeTb8pM9Z9MzFTHKSFVE6q57X1frtyNJz9bmbDdto+VRfDP7zZj+8Gjyucabo2qm0ln3UwK51XLXu4NUmYIX/jj+0uxq+gYrn9ncbJFccWLX66VPlbOMsP+4SIAmDJouSZF531bUrU7uN3O4Lq3F+PvczdgSoJWcv1l5mo8MPVnjHp+rvK5ngKAmc/0zHuDlBnCV8prwAOpainxapmhtzBnqnsLBTHRJSYA2Nv5O11YStzwzdq9AIBDx8qVz/XyfBqSa6oEANdAi6sTpMwQhCJS2xl4zAAciQQweVVHkwWH6hgAnKrxFGFvVz/wklPKrTuaXnCskDJDEIpIbTTJfnZlmalazeRlHmMnkxSdD6XQvcwoKUCquiC8BgAn6qp9W5GkGgBMeWZ8g5QZglBENQOwm3koVd0KYcCVZcaF2b64pBxTlm5D4ZEyFzWqkaoTnVfLTCpctic3E/M5Ve9xWCBlhiAUSUSemTLGzeTXGFdd3Ux7Dh3DsXJvliw3k+6fpyzHuH//iOv/GXzQu9ed15OF19iORLlTvMW98D/Lnev/c15Toe0MCEIRuYnP2yDll2WGFbU6jpXbDx7F0Ke+MmRJTtQE+NGyHQCAhRv3B15XJFVnupoQMyP4rHquimUmVbtDkJBlhiAUkVnN5MWPDphiZpTPZuvmy1RdmLvmVwCm1V/V5DrZ6wjE7ZiAhvIcM5Oge+ktZsYfq04kquMf327ESwppIogqyDJDEIpIKTPsZxdjXRD+8+q4AoJ3J1I0VtYCa41J1XgKr0uzU+Gqjc+6e9tMWUTHY59WbHx64XEtUVCvlnfhahBkmSFco+s6vt+0P5AAyE9/2oGVO4t8L9cPVBOBuZmIvKbndyqzusC7FdUlNijKaGV+WWYS3TaevUwJkteT9dOnpdnsPT5SGr6NT8MOWWYILrquO07a05bvxM3vLUULn98g5q/fi5vfWwoA2PTUWb6W7QfphuXO/HbykhXU7Tk8qnvIQionDztcUo6r3liEUT2a4fcnt7f8HglEmfGlGGlqwt5MXp5Wb1YdgiWplpm5c+dizJgxKCgogKZpmDp1qvDYG2+8EZqm4fnnn0+YfKnA6l2H8G1l9kq/eOPbjRj45JdY/+th2+M+W74TAFztZ2LHih3htMjEYAdo0RyjewwA9qoM1Ri4lhkXxSRh0n17/ib8sPkAnvhsJff36uBmShVd04si4UXPNFhmKADYE0lVZoqLi9GnTx9MnDjR9rgpU6bgu+++Q0FBQYIkSx3OeH4urvjHQqzbY694qPDopyvw66ESPPTRL8rn1oS3C3biKxesmfXqJooGoM1Ux1vDj5lRv9BkzLklZfauhEDcTL6UIk+qJM3zgic3E0T3OBWuPFwk1c00evRojB492vaY7du3449//CNmzJiBs85ydjmUlJSgpKQk/ndRUbjf8v1iw6+H0bFJHV/LDOptUNd1LNt6EB2b1EFeTmbC6vULNqhRNMl4djMF0ATVMgCY5+JLghxBwHYtv56JVIuZSdhqJi/nSm5dsm7PIfzj200YO6IDWtbPrTy36vewj3thJ9QBwNFoFFdeeSXuvPNO9OjRQ+qc8ePHIz8/P/6vVatWAUtJqDJt+U6c//J8nPO3edzfw74aRXWLAFcBwJAbIJ1gJ/uaMlZWF+ug0c3kT5mJbhnPGYBTQDWVlfD8l+fj/UVbcMM/f4h/x44NkRRNjBgWQq3MPP3008jIyMAtt9wifc69996LwsLC+L+tW7cGKCEhQ2m58Sn9uDLZ2Ma9xdzjwz4XsUGnIkXFa8xMEGN4yJvVFby5srpcZzCrmdydt2D9Prwwa62yHCkTAOxT3Itd+8Z25P5FEBMYSdU0zyEhtKuZfvjhB7zwwgtYsmSJUnBednY2srOzA5QsnIR1AN/w62Gc8pevcdnA1hh/QS8Azm9rqWRuFUnqdd/DqMfzeVQXiwULf2m2P+UEjkOlQaxmcstlr30HACiol4PfHC9v7a5pezMpZ5kxLM3mf+/Ej1sPYux7S3Dfmd0wuldzRQmqD6G1zHzzzTfYs2cPWrdujYyMDGRkZGDz5s24/fbb0bZt22SLR0gy6ev1AID3F22RPifsk67BzSTxMuXmeoIwr4e7Vd3hV56ZMNoPgljN5NViuHnfEaXj2RfRqAuFLFF91lM9Xqw6bACwy3v8+3cWY9uBo/jDv5a4F8SB3UXHAivbL0JrmbnyyisxcuRIw3dnnHEGrrzySlxzzTVJkorwA6fcIKkUMyMzyXgNAPbSHIa9mULerm7g9aXqcplhcjO5hb07UV1HmqLamAp91kuuGEMAsMI9Zo886rAqzisTZ6/DMzNW465RXXDT8I6B1uWFpCozhw8fxrp16+J/b9y4EcuWLUODBg3QunVrNGzY0HB8ZmYmmjVrhi5duiRa1JTl9W824KNlO/DudYOQn2tdORRGwj6AScXMeFylEEgThLxd/SJReWY0zVtfdaoxjHlmdOg4UlqOi19dgJM7NcZdo7raHs/GzER0PbRvz37tr+TFzcTe43Dc7QqembEaADBh+upQKzNJdTMtXrwY/fr1Q79+/QAAt912G/r164cHH3wwmWKlJKKB8fFpK7F8eyFenbs+ofJ4Iew7BLOmYZmkebuLSrB1v5p53jCweTJj82WqLnDdTCG8Tt5k6Rw7VvXZr5Uudn1p3+ES8Y/M+f/7YRt+3l6El+c4jymqK/8s9YXwXprxIiN7ZqQabpaaSJKqzAwfPhy6rlv+vfXWW9zjN23ahFtvvTWhMlYXXp6zXtlUHdQD5TSIhz1mRiYhnvnrkybMVqxEUSiZIsPdrK7gWVQStShE1pZTHoni7Je+xdj31GIagnAziXj3u8047vFZeH7WGsdjSyPyshgsM26uIQXyzHgJ1mfHD9f3uBo+124IbQAw4T+zVu72tTy3++I4KzOuik0YRtNwQHX4lWfGUGb1I4yBu2Z+2HwAv+wowrSfdiqdx05ugQQAM5/vn/ozAOD5WWsdzld72WCf9bBbXN1ibA/FF0bmc3Vtn0RBykwN4nBlngNZkpUiouiY/7tw+4nRzSSwzHisIwjrQtgtXm7wbTVTgH3dbatH/XhrN8uS8ABgJmmjiz6dsNVMfrlylYNmqj6yljinF5jq+Cx7hZQZQog7H7czdhad17/ZgHcWbFavOIHIBPx5HWw8DZASZVZneNep67qtkuxGl/G6OaWTZdOQZ8Y3y4wPZSgUUhMsM74tzQ77Ms6QQ8pMNUFKiUgBm/zj0/g7CIcJtq1Fyym9Dkv05uUenrXs7v/9hN4Pz8TCDfuSIJEcuq4bgnDZyd+v/sCW48ZNrOvu3Z6uVvUl6DnwFsTrfhUSe3nlpMx4gpSZGoTquJAKyk8yMGwsF1jMDP+zp3Kq4VjJG/951/nB4m0AgJe+Wmf9EQi0s4va3VzlI5+swHGPz8LHP+6wnBeWfXt06Er9yG0eFd75YcXbrtlVhGX5vRORqI6lWw5YtqlJNqTMEELcPltTlm7D09NXid+qUlxJkskh43VcCuJNPBWWuarCa6dEXaXf3fit+ZsAAE9/vgpAMNsZGJVkd35klbNk0hg4VJcQPMXMeDiXHT/KmFViSgqj++pd8cKXa3H+y/Nx2wfLElyzPaTMEL4z7t8/4pU567FgPd+kn+K6jOTblEjJ0bHnkHNqcOMCCQqaEcFrf9nmSrYrzzFpXhCrmXwoxq1lprrGzHhREA1uJoUl78lsydgWNZ8qrs4LGlJmahCqD4BXy/uBI4lZlbTh18MJqScGOwkKk+YJvn96+moMfOJL/Pt7+72q/Bqs/HJXhRX+qi/xlYqSuIVRwQ5iNZMfncB1zEyI3UzeLDPu3c7s4eyu2WoKo/PBuq5j1a4ilIXFXxkApMwQQvwYSHhBhl5XgZj5/TuLfS3PCaPRRK2RYm81j36ywr4OiRVTMnjx56cCPIuF7JzptTncdGOV/sKzzJSWR1HuYULy6mrU4X6idbetR/g7rSc9k3UzKSzNVuWdBZsx6vlvcMv7S30tN0yQMhMgx8oiePSTFZi3bm+yRUkavIfS77fgDXuLfS7RHqml2Q5lZGXYP3r+BQMGM0DuO1yCl75cix0Hj/pWpht4zSSrMBhW9iTINCMz8cXkipgsM2WRKAY9OQvDnpmTNBeZ8kaKzGc31qXUUMD9scywSqrfMTOxl6jPf94lX3CKQcpMgPxn8Va8MW8jLn99YbJFAeA8EEWiOkrK/duBNVFvVYke8GRiZpxkyky3f/QCCZnxsZ1umbwUf/liDa5Ict/mxsxInpuMeVJFgTJvZ7Dj4FEcOFKG7QePotSldcafmBmF2A5DsLz3usOI8eXGQ8yMaW+mI6XleHnOOqznudEVLa6pslLKC6TMBEiRYsZdVfx+Oxv1/Fz0feQLX8v0yq7CY3hi2gps2ae2UaMKym+brOlcMKc4lemozAQQ8Olnb5m3riK4O9FWMTO8a5JtOnaAd5NzxVWeFoVjowZFwHim2+4RhJJsX5//QcxB4GnXbEM57utlA4B16Hh2xhpMmL4ap/7la4f6nSv1VZEM6W0kZSZACurlxD8fCiBFv99jw9o9h3G0zD/LjAgVk/6N7/6A177ZiN+8Oj8webwurdy8rxi/fe07zF3zq/R52w8ele4T/g20IR2FPMCPmZF1M/ktjTMGBUrwIMSOMC7Ndr8XmqFsjxet6+5XM4VZmfGCp+Bh5nO5KQB4yZYD4hMVdyOvjs++GVJmAqRWZkb88/aAYwuqa19dtvUgAGB3UYn9gS6IRfarNp05qPbWfy/D/PX78Ls3FlV9L1HOiU/PFv4WxFJcr0WGLUkWIHjjlLjOo6WRhGVc1V3GVLB9wL+NJp359Kcdtue7tS65i5lJ1D3ycq6Hlw3WzRQx3u/0NBvlVaLKXYXHquKv/OzrYVz6B1JmAqaqAxUd9d/llKr6SxiehWVbD6LTfZ/jhVlrHSeKRz9Zgbv++2P8b7Pp/NdDVkVLZgwuPCq2zATlHnLLB4u3ovP9nyvv/Bw0bpLmHS2NoPtD03HS01/Fv3MVABxwR2b7pfma/FBuREXc/sGP/B8czjNTeKQM7y+qSkHgZvPUMPR9J7y8MIgCpHUA6ZKdklfl2/M34YTxX+KZGasBkJuJ8Iixk/vfA8JoOjSLlIil2W546ONfAAB/nbXGdgAqj0TxxryN+GDxNmzdXxG3I2M697wEVuL0LfuO4OU562w3UHRrFYhRHoni05924K7//gQAGPveEvVCAoSXu8TpuVi1qwi6nrg8SCwqSkjUNH6wj43byUlGSbZ7PHVdvm9Pmrve8HeY3Ux+uYrU6606u8wUAJwmOztzBHj4k4rx7eU5FffAbdvHLOOpQIbzIYQfyHYlXdfx8pz16NkiH8M6N5YuU0Y/SMZQEtY8EWxz2T3o7C8xt5TdG7NfyAQVnvXiNzhUUo51ew7juYv78ssxTF7q0r41f1OoN//kTep2E72maVxlOlHqtdscLebz3L7IGJVbfhl2sTkqezMdLTXG37nJABxi/SeOmy1D/jJzNb5ZuxcjuzWJf2dMmqcjTfKljzd+ZaalGVa8uUlYCABj/2V9eQnrmE7KTICwt1xWM561ck/cNLjpqbPsyw+4T3k1oPghn6YFf51nvviN8Dfem6yUxc2jzDL95VBJhety4Yb9wmO8Nt1Xq/Z4LCFY+Euz7a86CMWl8EgZ8nMzHY97Z8Fm/P6kdshwWM0GGN0y5ut07TbwaJmxO8+x6hBrJn7FvcheYmzD0yLG1WzYmwmwjZlxkjcjXQOrS7rdSqLcjW8wSZCbKUAM/UeyL20/IL8EOWgN2RdlhOdmUjo/GNgBe8Ov4uXFTnlMhNsZuJSLV4Bfd9mP+5lhF5SYBHjX5HSdvMnajeLOnnL3/36SOufp6avwXmUciWOeGRvLjNtOoQv/qMKxKSQ7kvn63KTGCasVgMWLjCVMUL05aZ6sZYZXu/k5dav8+rGCLlFIWWaKioqUC65bt67yOdUNg0k3iPJVCw3/uGAhTdOS6mvnvnWxMTOCUcKryH4N4kYTuHdsV1gkATdJ84IYoOeulV+Wv2zrQfxusPNxURuF1pcAYKZU1gJqF9NWETMjh7mdXW1nkKBH31PMjE8vHsakeQ6rmQz1W2s1W/7CbBXzCyllpl69ekpBm5qmYc2aNWjfvr1rwaoDNSHHgisU5hK22x0pLcfTn6/C2X0KMKBtg4SIwFMqjKuZPIkhxBz86Qd+lJORpnnaG8hv3CzNDiL+XKnImNLgcJYxZsbsZnIZMyNwibCfna7F7GYVzQ3mr93GbYQdLws9REnzogqWGR5my4zbpdkhWKshjXTMzH//+180aOA8gei6jjPPPNOTUNUFcxDnvHV70aB2Fro1F1utVJRGP/WjRGruKm/GFe1RIdv4z1bhn99txtsLNjvGE/kFbwyQGbwSsZpJuUwfyigujaD7QzN8KInP0dIIamWlSx/vJWkei6sMwBY3SsV2ILlZ3kIRY+Kbxw/DMW7LlrEW265m0i3KfLrgePPXrgKAlc9wh5t6DpeU48GpPxtcRV6M5cal2TpkjaC8Os0ZxqupHmlA6qlr06YNTj75ZDRs2FCq0Pbt2yMz0zkYrrrDTnSb9hXjwY8qlsv5NRH76U8Oq+GIfZ7nr/dvw05ZpdE4MerMf2O/88/jtaeKRcM/NxP/sxeCSp73wNSf8c/vNuPTP56Ini3yXZdjd5kaBG+bHt9ANU3D+S/Pw0/bCrH4/pFoVCfbUSClmBnTKiK/LTMGN5NSGbrwDItlxoXIqpdZeLQMf/tqLc7t28JTH2LZuv8IPvlpB644oQ3q5lTNaxNnr8OHS7d7Kpu9j2VssK3uEADs8FxniDTMaoxUAPDGjRulFRkA+Pnnn9GqVSvXQlVH1u3hbBbGwfWSS88xGolDxXTJmlp3HDzmnwySx/EDTMWTTNX3VlQ2B/RLCTEqReHUWD/4fite/2YD/vndZgDA87PWSJ/rJs9MEDEzGoCfthUC8G8FmHFvJpNVxeWtNPYGfiEq1mGnZfCGY12ZB9TOeWLaCrz2zUac/dK3arXYVHP2S99iwvTVeKjyZTTG7kLreKR6X9jjLW4mD/FpbgP1n52xGre8vzT+DPFKYWWe8csutL1nGvo/9gUe+uhnV3X6hS9Lsw8ePIh69er5UVS1gr3pTj7L4pJyTF22Hb8elk/bn0g3U9GxMqzdfRj9W8vHT/k9dSZi3ygzThlmVcZnlfT5gWw0GU5dBndJrgTiwXUDOpzjVxyAQSliy3RwCXHDfBzcZbru/710U4YOc/8XF2Ju5kTEDf6yQ32xihOxTN3fbdgncbRizAzzudzkZrLLAOzUh502shXxt9kVS8avHtoW/VvXdxzrb/jnDwCA/cWl2Ftc6qpOv1C+4qeffhr//ve/439ffPHFaNiwIVq0aIEff7RPg12TYbVuHg989DPum/IzJs5eb3sci7p/VnyGU1nnvPQtLnxlPqYtD1c6e7c4DQaxzJdRzgQiY+7nTk4qyozhs0+KjS+lqFNaHhVe+ytz5Ps7D+5qJocLDToA2JoTxrnleYq6YXd2XfdlryaZ1W2OGYBlq+bEFKmSOAXcuaIgHDdGy4xxabasm4mHVzfTgvX78Ocpy223XDEju/1CUCgrM5MmTYq7kL744gt88cUX+PzzzzF69GjceeedvguYyrCTkNNb+Re/7Bb+dkxgkUhk0O6mfRX5bz5aJt6EThalPDNJej7OmzgPkahumlAq/m9QNIQBwFZUBnPDIBfVsWTLgXgGYhWCtsw43Z9jZREc9/gXQrP/09NXeapf2P62FgOO0C7ahr12p+XMfDmq6P6gNajanK/MD4ehMQRM4GZyKgNySpV1abaTdN6x6+M/bN6P699ZHN+WRER5JIrN+8S5p+LwupGym4k/R+jwuprJWwq5Z2asxnsLt+BwifyegsnO2qB8xbt27YorM59++ikuvvhinH766bjrrrvw/fff+y5gKqMSsCf69R/fbkTXB6bjc45FxM+xQfYhdDOhmuEt2Zy8aAvW7D5kPdZzbQIZJEqueBuu+js+iLMKjqg5OO2pMpizg9yE6atxwcvz8cBUdZ90EBYeFqcBd/n2Qhw6Vo4VO/03/wNqAdgx/HMzCeo2/W1+9mWrN7qZTAHAPmgGYsuMfApglXb2kmdm+bZCvPr1ek9pAS58ZQFmrtiNez60d2v+/p3FGPbMHEz/2d4KzRtD1K3lVWzcW6VAVeyaLXcej0wHy8yc1Xsw/rOVvqZZ8KJ8+VK/6gn169fH1q1bAQDTp0/HyJEjAVQ8bJFI4mMawoxKzIzoTfKxT1cAAG799zLb8lXlsfwm+Rg6KTNurEUf/7gD93y4HKf/da7lNz83pfz1UAlem7sB+yTjknTd9BZaeekyMQO89nS7yWCMyd9vlT4/Locp7sJvnEzLbu5eVK+YvGQUZ3H7q8nkVdFjm8FpGXXsb+fVTObP3u+ljJXITizd1FIqMTOu3EyVtY3527cY//kq/GvhFocznOHtcs8ye3VFAsS35m8yfG8ei/wYmuy2Q/GSoNLJMnP1m9/j1bkb8J8ftsW/k1WQXSvBAaMcAHzBBRfgt7/9LTp16oR9+/Zh9OjRAIClS5eiY8eOvguYyrA3nfcg7y46how0DQ3ZZZwSZdl/yfysMOJJW2bKvc+I5jea2CqQoPm/dxbjx60H8cXK3VKzrGg5rDF2Qb5+0cD/wfdbUScnA2f2as7U7T/JcDPxfi+PRHHVm4vQrRk/39JXq/bgq1V7cG7fArxwaT/b8kXtH9V1pHN3bOfL5LVtbJvBteJhVF64VkKGA8WlmDBjNS46riWOa1Nfonz+984xM85xN7xyZJV5OwV81S57C59MDezyalE9gLsgWuUXTOH38htN8mBjZuyUyO0HjsY/ew3QTjk301//+lfcfPPN6N69O7744gvUqVMHALBz507cdNNNvguYyhj9oca3zOKScgx68ksc9/gsOaWDc4jT22QQk5fK8mJZ7J5ZP5+PHyuDehdt3C9VbsUEYh1YrXk2+Oea4QWB7yw8irv+9xNuMu1Oq6KI2k4+hs8Vfy3behC3f/Aj9hR5X+ru/PZo/X326l8xb90+vP7tRtszZeKzVNrfTiZZftlRiEc++QUHiksNb6LsZ/NzKZokRK7O2Pn2eWas5z366Qq8v2gLLnxlvlB+mV2znTD0f5vhwI/tDHileqVuLbkcaN+s3WvrhuEvW1a7RpE1JBr1Zplhz7WzcC7evB8XT1qAn7cXeo5pSrabSdoy8+CDD+Lcc8/FcccdhzvuuMPy+7hx43wVLBU4UlqOD77fitN6NEOLerUsv9tZZnYWVmnEFe4Me7hp9R1OUhk8/IqZMQzqkoUm4xFYuFG803QM88qNWHsaBnObc83w3pAOFFetFrBLDe8aTnzDeRPnAQD2FZfgrWsG2p7uJI6jm4nz8+ES+RUSTqi4+WJwLTOS9Z31YkUg837TMlTDymyzm8mtZYb5bM0zYy107R5rzJmlTIm+a+6DZkuMtJvJEhvnKJ5Fxv/8sM0UaO10rnNj182xTnuis95fJHZr+eNmEnwPo3KgOjbIBv5/t6FiHLzyHwux4N5Tpcvn4SUvjh9IW2a2bduG0aNHo2XLlvjDH/6A6dOno7Q0uevKk834z1bh4U9W4OwXv+EfwHQi82omP+NdLJUJv7E7W+5oP2JmjPEFDsf78HyUlkexi5Pgygkd/OWwMoM571teOndRIjS/cnLY3Ve73cLj5zuI4TSAGSf5isJKyvyz7gknA5ELBaI3arV61+w2JsG0m2fc3kt2yHjxy7X4bv0+7m/x7zjN+suOQkz7qSqQ1WCps2kjFjvlzNbNZPpbdjsD81EfLK6K63A7X7LjjKxlBgBWcxYl2NajdLTdy5Bxo0nVeCOeRdaOA0fKXLkBWZLtZpK2zLzxxhuIRqOYN28ePvnkE/zpT3/Czp07cdppp+Hcc8/F2WefLbV3U3Xi6zUVgWIHjvDfNNlOZNh3Q7fmZXUz3jmdEkSSqjKHfDnKD7Ou/oaj+tBc/OqCeN4YFaJCy4xuOEYW3oAkmhh4ty7ZgwUPJ1M4+zYZ28dHlGrADW5M47w3XNUA4Mx0oxNl7+GqFztzSZa/XU4aD3+ywrYM3vMesyQ1rTsYx7dtIB3vYpDDIJOxrWzHGBsLj219tkHF7h6CI6VVfY4fMyNw9zBfy4xT6i+p4pch9tkqj+rIkN+yzFXgv9vNKGMk282kFDOTlpaGk046CRMmTMDq1auxcOFCDBo0CK+++ioKCgpw8skn49lnn8X27d72q0gVVAZANl7C7L5w77tmz+MM0OY3Ktuy5Oo07MvDXxYSZ9LXG7hlGCwzUI+CVz3ejSIDwLIc9sJXFmD8Zystx4jONeOUODHqMNFkZdg/rlv3H8EzM1Zhz6EqK5SsuVmEU1M7KVjs77HrO+Zyb6dX5qzHP0xxNqLJ1G6S9Wv3cJsKpOpT2ZvJUoVztQbWcrZTkZXLsmN31DiWibCuZhIfK4vb+ZLNl5KTKT/tqSpWqkqxnWWGVQ4iUR0/by/E699sQHkk6vgsy1rPWLzHzHg73yuetjPo1q0bunXrhrvuugt79uzBJ598go8//hgAuHE11Q2VDhWxmah0OD8E3MHL4QiVMVv2UEc3E/N55c4iNK3LW6nFvq2rP0GJemZ0WOV7de4GdGmaF/9bxc3klK3Wyc3ktLriN5MWYFfRMSzdchDv/f4EixzmPubHm6bT25jGudduLDPbDx6NJ9i7anAbZFS2hWiyKYvo+Od3mzG4fUN0bFLHsXzVbpihsNLFre5kF2Oiult4LLZJRhT7ZHc6orpcXJxlV3GXbiajbO5gLTMqddrdAz8MEeIM4jDkmSmP6vHEk9kZaUh3WHptzlEkJYtHbSbZS7O9pQlkaNKkCa677jp89NFH0orM3LlzMWbMGBQUFEDTNEydOjX+W1lZGe6++2706tULtWvXRkFBAX73u99hxw7vGWj9wlGZYT6zHSWqG7M1yPQ17h5BDm/dagHAcseqxswcdRhEorpuO0DxfkvUM6NHBQoIa2YXNAevOXlZoEUme9752Q6WmV2Vq5MWbzogLZNXRMqMrusoLinn5l855iJmZhcTMM9OiqLx9+35m/DA1J8x8rmvrbLx5FWUJ8tGmTGX5XaOsLcuqR0fuw8yljr2nh06VmbYakHX5dofsCpF8m4mmzIdHn7RucWMZUblOWCv1Vw1VxRlN5PgexiD61kX0Mpd/gR6m/G+NDtFVjPFOHbsGF566SXMnj0be/bsQdQ0mi9ZskRwppXi4mL06dMH1157LS644ALDb0eOHMGSJUvwwAMPoE+fPjhw4AD+9Kc/4ZxzzsHixYtVxQ4Eu4dzxY4iPPJJ1S6r5TamWRnTJHvEjoNHMf3nXRjRtQn3d7vvZMq3I4iYGTtthufHDWLXYx7mBGHx7x0sKCKcYmacsJtAWdjsn3aDmh+tWB6N4oZ/LsaILk0wuENDTPp6A64/uT0e/vgXfL3mV0y6on/8WC+Wmf3Mqq+BT3yJC/u3xINjugvbX25TQPdkpGvCBnR6vmN/uZ2YAZGSLaYq/oK1EAvcTJX/P1YWQa+HZ3Lkci4D4FhmpJOyyZcpi0Eh49UpqNL++ea5mdQQWoRMwYRsag+ZJnB6MeLh1XKWcm6m6667DjNnzsRFF12EgQMHejItjR49Op50z0x+fj6++OILw3d/+9vfMHDgQGzZsgWtW7d2Xa9f2N36M00rnCJmy4x5wHOy8jC/nztxHn49VIJ56/banm9+EO3qkI6ZUXR884q1y5Zqpphj2VFaDeWBigBg+0nD5t3Z8g1vMN/DZCN1Mg1nCiwz5keQPc5rXhGnx3vv4VLM+GU3ZvyyG60b5GLL/iP4evUe7KhcPfZfNsNoZfUlLmJm9hdXtVPh0TK8MW9jpTLDP75UUIemafw+p9g2KnvfuHYzKVpm7OqJvTWLLDOapsW/KC6N4L4py9GlWR54GMcycZ3mrmN37MMf/4IfNh/Af/8w2CEOx0EBFDyRrJtJ5X6wFvVAXqJElhkdBkHZNpexgOjCP2zO8TiUesmL4wfKysynn36Kzz77DEOHDg1CHlsKCwuhaRrq1asnPKakpAQlJVUDX1FRMHvCAMabf6wsgpxMcbi52T1jHlRU+lEsHfc3rDLDi5nxGHDHK9PZzaReh+ogoaIMecEcAMx+z/tsPMb6nTlxIlCxDwzvHN7AL7LMbN1/FKNf+IZ7nBtzM4tK+26p3MBvB7MM3riaqaKwEo+WGaN8fAFV9xBjS9l7uATPfbEGvx3YGj1b5HOPt9v7xhIw67KT+ulm4i2hFx1deLRMuG2Arpt3kpe3orCKwYodRXh82grceUYX9GtdP751wMxfduO07k2ly5TlaCnjZuLGF/Kvw1ZZ4+UrcjH+8b833h928YCmOVvzZa1nLF5XM6VczEyLFi2Ql8fX2IPk2LFjuPvuu3HZZZehbl1+GnQAGD9+PPLz8+P/YptiBgE7eNz5X/vNyyyWGVdTi5FswaQV/06lDp+0d5k62S7vammtRACxHxYbHXz52K+EGx1W/r9ni6q+6jRYOJmG7VYzrWQ2chQFCpvLTMTgw86hMeXajWXmwBF+TivR/S+1dYfyJrOqz3f99ye8t3CLcKdvoKKNRa3ntefFZLHrLs7B5Loh4RsvANjNI6JDl1/NZOpfR0ojuPjVBZg4ex2u+MdCzF+/D+e/bMxW7CSS2x5bXFKlQD8/ay2GPzMbBwV9ikVVEVUd18UbpRpfpCIGC5GEHAILnL0s3npust1MysrMX/7yF9x9993YvHlzEPJwKSsrw8UXXwxd1/HKK6/YHnvvvfeisLAw/i+2KWYQsLf+kx/tA5N3F/GXy/L+lsXoTrCitEszp4TN+47gitcXYsF6+fgDy7Uwf9/y/lJUZLJkZVS/eONyX+vvP28vxPGPz8Jkm+ydMlTsmm0/aTjJn27wezu8TRk+c9xMkjEzWcJ+4b+byYk0jmXGTcyMyG0kalKRZUZ0OdOYXel/lFjKn2FrmTH+rT4hGv9vd4yontmr9+DeD5fH/449M0ZLnXp/qLDMyCkzZv79/RYs2rgfz8xYbcmgzMpp6y5zmDFF5x4x9blN+44YlvmLqjS64oy/+TF321l2eQk7K+RwrtkpzQP3HI+W/JQLAD7++ONx7NgxtG/fHrm5ucjMNCYg2r/fOU28CjFFZvPmzfjqq69srTIAkJ2djexs540b/UDlQS46VmXmNMfM6FD0M1VidCdYC7DEzNhFeHB+2ll4DDsLj+Fbxp3lhF3w48c/7sBVQ9pYjldPmscEuHKuady/l2FfcSnu+XA5Lh3oIbZKF8UmsIOM4NTK7w1uFsed0/mfY9i5Nliy0tMwcfY6LFi/zxgkbrbMSJTl1cDFU1z93N9LaJkRKD86+Ne0aON+rNtzGB2b1JFStjJtYmYs+rzN27cddr87KdlrTRmKY0qAeRVlSXlEOrA8Bmv0UtnO4BCzokhEuqZJBQDPW7cXTetmo2MTOS8B62aKIeNWUc68q/i8CJUo6MJ0HlIpFQwyVf1lpwvKZwDmf59sy4yyMnPZZZdh+/btePLJJ9G0adNATdUxRWbt2rWYPXs2GjZsGFhd7nA30vMGOzdvSTy3w0fLtuP7TfvxyDk9lSxA3p0ysXLsSyotN8bI6Lr90mwuDjEzXn2/MaK6YNJgP4verCqPMmfxtMMpFkc2wC4zQ8MzM1YDAA4eFWemTQRGl2DF/52SB/IQTuyCr0XKjM0p2Fl4FB2b1JFyg2Wka8Kxzxoz41gcF9XEf+zx5r7CCwDeX1yKHg/OwMmdG7uWy1aZMT3ZMs+l4y7s0LBm9yFc/vpCAMCmp84y/C6qgXUzcY8VnGiwiEjIqnqrRc337Iw12H6Q3b+PlUMQxM5g3GG9CjvriexqJhHJjplRVmbmz5+PBQsWoE+fPp4rP3z4MNatWxf/e+PGjVi2bBkaNGiA5s2b46KLLsKSJUvw6aefIhKJYNeuXQCABg0aICsry3P9XnE7SFmtF+7gLcH90+RlAIA+LethmGmQsjVb+xRJ61SMeT52FzPDnm+vbHjBvFNx/Hv2zVRwAbFjDC4xFcsM53fZFTTsmzab08XNLfY6PvFWU7lRNkVniCZTVTdTxW8VvzopnYC9y6+kPIqySDR+jNtny87s7xQAbJaPJ+7HP+5AeVTHV6v22Gc0ZusFEGGzmdsca+47MkqscLUZU+ZqiTwrZo5yrG0yt0Ulj05Fmf6MPqwiU1Fu1WeZWyXazsDOTedV9mSvZlKOmenatSuOHj3qfKAEixcvRr9+/dCvXz8AwG233YZ+/frhwQcfxPbt2/Hxxx9j27Zt6Nu3L5o3bx7/N3++eIv7ROJlGwI/+nwWs1mH2SKycW8xxwJk86bnXRx+uaaCzQ+TOYZGBvN+P9Y6/bPMcFc+QG4wB4wDntMk6RSLwA4WOw6Kn0FxALAbi4jyKUJil1/mwjkvcveJ2tTWMiO4Jqd+OH99lbvVbvJ/ZsZqDJswW1hf7G/nt2s7N5P9d6KJRRRUKouuG92E9un+jfBW85lJ0zR7BQnuxqojHDeTzHM8a+VusSwJnLvNe0Q5tYExZqbqs13iTa/e35RzMz311FO4/fbb8cQTT6BXr16WmBmnmBaW4cOH20+wfo6kAeBWOrNbya1ykyVIjgYAB49ad0FNRHM6VZFmWlYY1dXzNzjlmfHNMqPrAmWp6rPTaiZWVqfJQzd8th7LTqBXv7lIWI4hANj2NddWHN+J9Ud3lhnrOaf85Ws0rsOPjyvxMS4nxu/+UdXmGelptpMZuzxdvPxW3lJnxilmxqxsxfQIts5yl23EKopOVhSDDKJnxRTTYddnnYJMRec6bWcgQ+wl6sUv16I8ynePBzXEWgKAHQZzw61lDrVTZryuZko5N9OoUaMAAKeeeqrh+4o3bA2RiH874oYd3r0vOlaGD763X0F1uKQcb83bVFWOy/ozbZZmFx4pswwe9oqjSyEs5dgXlGYyI7tRWNMcLTPKRXLRdWDi7HXc76s+i9xMFd+zsqpYZniHsmPFmt3WjQNjGALDWZlsa+fj5/gUuz6nLNI8eM28cW8xNu4t5h4vdDNJ5Ohg2bS3GG0b1QZgvH9ZEsHYsTFRHABsf7560ryqL82Wmaod36u+YxclqMAqM6puGB5sGY6WGcX++Na8jZi6bAd/ElcchzRUBEw/98UaAMBJnRrZluknrHgy1inRIgW7YO9U3zVbWZmZPXu280E1BN5g8/inK/DB4m2co6t46au1+HBp1c7iFZYadcRLcCsCP1UCEf3Ie8OTw9xG5sFKh/oAxR7Ot8z4dC068MUKsZkZiK1Ms3mTZMYOx43cDIMrry7702PI5plJNLH6I27cTC7rUoHXDS/5+wIs/PPIeKLKGE4b/cVk0DTrfYvoOo6VRZRcBdayrb/Zxcz4FBMPHbrB6qWymkmEIYeKYwCwmrv84U9WSB8rA9t1l28vdFGCO6JmbUbh+JLyKgNDtk1iV6/jQ8q5mYYNGxaEHKkJ5+YvkNgTZsmWg47lCKsUDFjmB/xAcZlaoLFiRy4tj2LaTzst35vrNA+iZsuM00aTPIzLfa2/+2aZEbkHHCwoLGoxM/Z1y5qBRdseiK6nPBLFRZMWoHPTOphwUR+pOtwQk18mwNaMn4qYsCxOR9xdVKHEDHhilrEMOPfbqK4jDdalxtN+2okvVuzGjcM62Mpnd828n+xiZnxz2evybiZZ2H5tHh8sKLz5OLnRYm1y8Egpd9sU7jlMyx88Ys1K7deLlKVcs/XKoRpWQWQXAdhaZjzezGRbZqQCgH/66SfLhpJ2/PLLLygvd2fCTCV4tz4vO5PzrZHWDXJN5di/3bOwy0ZZy8wvO4zbNhwq4SgzPgUAFx6p2BtHhmWmBGSapqYM8DEu7Tbj17gtko2NhzArGGt2HxLK4GSRMAyEHpQ0gwfExs8UO2zhxv1YtvWgo0XRDbz4IjdLs4OLRnCHzL2IHcLrR6XlUSzfdlDqfB78mJmq7ywxMw4Kkuw8FNV1w5u+vWVGrlB24k1Ps49uVXn733HwmPNBAEY+N1e6TEfjalBuJqZRnOKKzHKweZPskj16zgCcCquZ+vXrh3375LPADh48GFu2eMu+mgrwOlRejrOxq0W9Wq7rNCgzjJb91vxNhm3uy8qt2Wtt3/QU+nGfR2fiqc9XyZ/AwI2ZUdTonTIA+4WMgmk+5DeTFlR8Xzn4aFqVvM7bGbCf3Vtm2EnERpfB+l+Lsb+41PMgJounAOBEWGZUylCpRxRX5XC+6momQwCwxc2kV9YpsjY6CBM7DvYrxYxlyhXKWgScYpoc43CYU3cfsldmYtXuPVxiexxTedIWpRhWM8E+rggwtqlhx3CbEx3d4A6khJtJ13U88MADyM3NdT4YQGmp854X1QHevc/LcbbMWE3A8nWySwzN5RQerTJ7lkWiahmAE/Tmm5ZmrEvX1RfVOK5m8mnAkSnFPADE7oHBxV25+kAtaR7vdwmBIG5P3vnPzFiNs3s3lyvYI7HrU90EsuJcf2SYtXIPfFnGVRnca0fs+RPddqe5w0vMjNUyU6nMeGzHqG4OALaTUa5MNm+Nk6tC5b1HZfWgDBqSZ5mJmhU+hb7DWmaiuo6dhfy0Dl5fDJPtZpJSZk4++WSsXr1autDBgwejVi331odUgacA1JWwzFiVDPkH6wCze7D5nP8wboLS8ignz4xkJQHCi5lRhZdVlsWvy5SyzDj8rmlV0jpdq8Fixa3LmzbDO//gkdJAV2jz4pvcWGa8WI/++d1mw9+i3CFTlmxH31b1pMpUkcZpxZsIO6/k1W9+j3tGdzXE3cg0q+gQFTeTMc+MXV0uLDMOZTr9brBEBqF4OJXpokipag2WGWfYvsPGzKzadQiDx3/FPcf7aiZPp3tGSpmZM2dOwGKkJryHQcbNZO40ojwzvMGO3T3YPMD/ddaa+OfSSFRtNVOCFB1dtw446knzmPM5w4dvsY4S5Yh37a76HJPX2TJjX66bjeBkrD1B5ofgXZMby4yXcfaBqT9LHfefH7ZxgyB55neVviG2zMhb6ng89fkqkzLD3GuYn337sqSXy+tASZm/lhlz+9qdptJVndpv497DuH/qcttjzMgq1QeKS/HJTzswpncB6tf2nq1eNw0oTlKILDPSdbgg5fLMEFXwbn3tbHeWGW75nB9YZcau81W4mUzl2bqZEoN5i4CK1UyKSfOYz3zLjD9XIzOBOibNQ8ySpBvM6fyy7BUPr7EtImtPkGMQK/IH32/Dg2O6u1zNlJge+tGyHZbveBtjyqxmioms8nyzqDaTMRbNVFYsaZ7HdjRbZuzTPchh3lDRNquwQmd1qn/26l+ly4rV7VRmTPax7y3B/PX7MP3nXfjD8A7o0lRuQ0wRxlw8zvfRuJpJTplJ9dVMpMx4gNehZO6neTWHqA/xvj5QzFhmbF5wo7q1XPsA4MRMFhWWmaq6XO3N5LATtV+XMuoF51UOTi4ErUKbASBhmXGqy1GaWN2i7/ltlWZqz6BWJbwxb6OyMrO/uBQ3vvsDFm3cH4hMZnimdt7GkzIWxVhJoj7ipJyqKq/mWDReWV4fjbKIbmoj75YZtjync5wChJ0skV5xtKZV/n/++n3x/89fv096x3sR7y2scpXKvPyxt0hWmfEaM6O4+brvJLn61MZtkKZZA5bJZxJjPxMzozoYJiIDsBO6RclyszeTQx2qQonKUXAliGB0GYnVTOxAzFM85K7MMKAz34tyIBlXh/nbEcz3KhLVldLoPz9rTcIUGRElvE0KJc5zCrp1DgCWqERwvPnUuJXI4+1ll2Wb6zQjYyHVNONLme5wlnkit0834f+g5jYOx03Wa5apjMVQZrxkn+OjZXLPm9fVTMl2M5Ey4wHerZdyTUh2Gt5RxcxqJtXI+jAEAAPGAahibyY1NIfJN5HX6eRmAqrkZVebcc9hTnLaSFBWJrbMV7/egK/XWE3r7CDk1dTsxL7iEqVJusihzRKByDLjRJWbScH0yvwgo7yyCrJxOwzjuVV/e7u/5rd8e2uvc3lpmmbscxyLMot5vrSMcYr1q+J0T75d96vtJrB+kKa4mkl2Kb3nPDOp5mYqLi5G7dq1g5Al5XBKXCXCoqQL3QKcOg0mWUXLjM2xCbPMmIb2IFYzJS4CyEb+yq8rVjNVyGteVSM8CfwJUNYyY9em89btNfytw7zUXaoKaczl7SmSzOlRSbLf9gCrNQKI3R85E6GbAOBv1+7FvmLnFBdHyyKoUxmnZxsz49N9PWZ6y/c+AZrcTLC3qJgn8liWZR5+jwIyeyK9+90WvPtdsDnWKmJ37CVh21Rmt3LzOW5I9momZctM06ZNce211+Lbb78NQp6UgutmkjhPNnqfO6Gx5TiuhjDVGwLTjNnN5EYkJ7dIQi9T59+/eNI8yD/kIosK73c72DdDKVM/89nrgObEzkK5rKwxkq/KWCdwAFixowhOT7uTm8nu7Cv+sVBKtqOVafitcRF8y4zXZ+NomdnNZOPmkahM0zRr4LudZcbUI6yb6crJ5oaKfbaSP4YCau4uXgA7j1TPM6OszLz77rvYv38/TjnlFHTu3BlPPfUUduywrgCoqci4kFQy89qd67xvoXw9iUqaV1FXFW4Gh037juD37yzGql1FrhVKv3CMmdHkrQsmazvnd7krs+z95VCncRfyYFtP2W0UAm2G52b6Zu1e7D1sbzmJtaSoTf1o65gyY44r4r3I/O2rtZjxyy5P9R0277Tt2c1ktsw4P0/G6m0HNd8Jgy4jozQYLDOS8To3vvuDa5kA9RQbfqOszJx33nmYOnUqtm/fjhtvvBHvvfce2rRpg7PPPhsffvhhjdiTSUQ0qktpt5Y8M4KnboVpvyXAecJjMefzCIWbSTfFzETdPQRfrNiNS179zlOgrB9MWbqda21wI4JjALB6kRLophikQCqJc0RyZUWY4AUAy6Cyf45bjpRVjLeswlUnO8PSVxas34dnZ67Ba99s9FTf4RLj+O51aXaapllWMzmdJ2vZDeIFLQyWGc1++yoAxmtXCbj3QrKbxnUAcOPGjXHbbbfhp59+wnPPPYdZs2bhoosuQkFBAR588EEcOXLETzlTglLOFgI8ZC0zV7xuNTXrDhMeS4nJPO7XRpNeYcWI6M5p4UUUHi3jB2e6FcwForfzKhk0ywQgwmmQXr/nMF7/ZoP0UktZzEuzg+SY5O7EMZJtugb4lhkZYk0palM/lO4jle1p3Hna2n92Fam590SY+7KdwiAzFlqUGTgFANtvBWO3PN0Pkj1hA85ZkAGjklkW9BtKJYm07vNwnWdm9+7dePvtt/HWW29h8+bNuOiii3Dddddh27ZtePrpp/Hdd99h5syZfsoaemQHPatlhg9vW3oVF82xcpWVB4nr8H6+NTw/a63lu6AnZBlizakyFzslzSsujeDxaSsdV0Xx5JD9Peg3T1VFLPmqDD8AWIZYPxe1qB/dNOZmMivCKi5mL3jNKq5ppqR5uv3i7Irf2frtjnWuXwUNWjiUGalds6t+L3OpjKuS7LZRVmY+/PBDvPnmm5gxYwa6d++Om266CVdccQXq1asXP2bIkCHo1q2bn3KmBEdLI8J9X1i8pBwwxMw49FFz4GIoMgDrxk7vJhssi0x7JxO3k7Hdvfph8wH5cpyUGdPfQS/NNivYToTAMOPaMhNryue+WMP93Q/FMeZKNqY7sG6PEtRd9WrtTdM04wpNxfrtrNx+X7NTwr5EUWGtlHdheh1jZUn2O6SyMnPNNdfg0ksvxbx58zBgwADuMQUFBbjvvvs8C5dqvDFvI7YdcM4xYFnNpDCoqUTrm9+CQ7E3k6mu0vIonpkhv4mpbB3Jxs2gJxvcbd4t3Qvmvhf7c9PeYny4ZBsOHvGW58XcDryVQXaobnURBGZ3rSy6bm+J8mPlGC+zb5QXdxLQA25brNRqJlM76Gqi2h0ahJUx2RM2ULk029HNxFhmEhYzk2Jupp07dyI3N9f2mFq1auGhhx5yLVSq8tGy7VLHWTealK+DPdTpPItlJgQPotmMzFtd0TgvG78eUstHYqzE/al+4cbNFDvn399vwX9/2CY8LsPnhA6GGKbKvjnmpW9xSDLWRwXz0l4nwmGZ8eZmEiFSZlSe09hKFXPCPJVNZr1g6+aROT+qm/Zmsm818wIC3WaeDiZmJvmDi9Su2axlxmP2YVmS3TLKAcB5eXnYs2eP5ft9+/YhPT3dF6FSFemYGQ8PBPswsdmAeViyddoPE65lUsFsmdnPSQx2xaA2nupwWhWUCGK1qlgWorqOY2UR3P0/+518M3zcBEWHsV/E2i4IRQZwETMTAmVG1ZoUg7c/GosfLj1e/hizKxcIzj1iH4fnfH4kqhu3M9Dtn1mn3cCNf1ZXy4xDG5l+k02a55lUczOJGrGkpARZWd63Ok9lpHcn9WKZYY79hbN02yCPUgCwvAxeYavipdr2anhgA6eT9iJVWbHKZDxv3V7UrZXpeJyKZUZmebDBdRnwuKe+Eiv52ozbmANd120tF34Eqsc8CAYFnmPfCOq+2ltmnK8vopssMw4KoEosUDDPfvK1Gdnd2mOUJsgyk+xl69LKzIsvvgigwl/3+uuvo06dOvHfIpEI5s6di65du/ovYQoha5mxbjMg3wlUOkwYl2ab37x42Sn93LU5+UOPPM/OXMNdnWXGy6Z1367da/nOGG8RbIspx8wkX5dx3SY6L3aFwY/ATJ51h2cRCuquelUmKiwzrCLmXJ9sf/X7miuyFftcqEs57NrW3CYJyzOTkFrESCszf/3rXwFUTESTJk0yuJSysrLQtm1bTJo0yX8JUwjZMc/LG5nKuGpWrszn/rj1IJ6ftQb3ndUtgRYM40oLtytFZEnW20LczaQ4GctMcCoruMylrdhZZPt74KuZUnBpttuYAyeXiTBmRqGOSKXJxRozY5YlKDdTRbmb9xWjbk4m6teuss7HamxRrxa2CzZfjER1wwIAOUui1S0qOtZvQhAy45g0z/xbwmJmUsXNtHHjRgDAiBEj8OGHH6J+/fqBCVXdMU8YKp1ARQ+yxswYOXfiPADAxr3FmHTlcfIFe+DCVxYgN6tKEea7mfxcreNbUa7qDcNqHDt0U7Co35OeubhUjJmJuPTRbD1wBPm5+Tbl8ttaRQGPu5nMcSfSJXgjqgM7C49i2DNzAACbnjrLIAcANK2bLVRmorpRwdZh/8zqppchuwsNZjVTCLQZ2LeRWcayBMXMJLttlCMJZ8+eTYqMR8xWP5UuoOKSMls9RJ1tx8FjCZ30jzAxLbxlg34u1klWXgi9SptJKjL3lT0kaIt0Ki7Ndmutuvz1hbYPt1CZUXhjiR1rPsOa/kG6SCV0HfhpWyH/t0qpVALW7/jPjw5J84wvdNaNJuVdVqrIZN5NBE4ymH9P2NLshNQiRsoyc9ttt+Gxxx5D7dq1cdttt9ke+9xzz/kiWHXGbZ4ZnWM+tsO8p4zo3Mz05E0Y1dUyEyP5U7EzhgBgvy0zpr9T0TLjJbbFbmIWlavkZqq8X+b7ZlbAgnprrnBpWW9SeSQavxCV8eXQsXJs3FvsWCf7uSwSRSZHYQrCtZZs6wMAiSzJxr8T5WZK9mArpcwsXboUZWVl8c8i3O6xU9NYvfuQ4W/ZLjDgiVmOO/WyyMajZGakJa0f8gKA/exGQV1XRppmO8klf8hToUraSFSX3ktKqmSvbibfJHFPxMNkYKcHifdski8/3gdN58humeKV6T/vwpg+zQ3fTftpJ26ZvBTN6uYAADLS1BwAdpOv2S165T8WYl9xKb69+xTuBpvVESdXnMXNRJaZKmbPns39TPiD7OClosgAvAzA/Ioy09OS5o7hWWb8VIqDepNKS9NsZ6q4lynJCr7TfTUvhdV14M7//Ohb/eb2V0+al3x1xq+8ULLlqvTZmEJkPuf+qT+7LlOFact3omEdY0qOse8tAYB4nIyq5dcpqJd97Nb/WmHFmbvmV5zZq7nlWL8Jh2XGXnGwrGZK1EaTSW4a5ZiZwsJC7N+/3/L9/v37UVRkn/eEEBFML3BazRQjMy15G6gFHzMTDHYyRqI65q79FUDyLQu7i5wzKb88Z338c1TX8fnP1qzMbjEPrG4T0CUTL9sO2J0qmmRUJsxPftwBQGJJc4DP9/Lt/JiZGE6WmawM4+92ourgtw8v95LfL2gaZzfyZKADtoKYf0mUm2l4l8YJqUeEsjJz6aWXYvLkyZbvP/jgA1x66aW+CEX4gzkNu+jhzszwL6OsKjxXmL8xM8E8yOk2Mt7wzx8wZ3WlMpNsbcaBvYdL8NWqqozefi/NNs/XqbidgZc326VbDgh/82M7g8WbD2D5tkJHBShIV4NT86Q7WGbMstlnt+XXl6ZpuO3fy7Cz8FiVXD5fsqaFwzLjhHmLB54r329m3XYy2jSsHXg9dijPYgsXLsSIESMs3w8fPhwLFy70RaiaRlDPh/ktWDToZKUnL2YmaMtMUBZWu8R+Yd/Jm8W8ZNb/pdnhH/yd8BIzc/0/fxCX64MyAwAb9h52PMePTS1FON3jTIcH2poTx+ZYWPedAoAvV+3Bh0u3m471nzD05ooAYDHJSJrXtDI+KpkoKzMlJSUoL7cGCJaVleHoUecdowkrQT0gljwzTEULN+yLf+atBEgUQcfMBNW4stajEBgWbDl0zPgs+z3uedVl/Ej575WgEwmaUXWPVGSEdbLMBHcNTtYK1b3EbN1MOr8+3kuR34q0Bud2ThT2Cp8RVTdT07rZ3O8z08XXH4bYNuVZbODAgfj73/9u+X7SpEk47rjEJF6rbgT1fFhdOFUV/WnysvjnfcUlln2cEoXIZOxf+QG5mSTNR2F4yFXwu728WgQSrUhwZUiwQqV6yRqcdXa3if9kcCpa9WXJ7vp3Fh7Fuj2HLd/XyrRuchyIZSb53bEyAFgsiNekefmC/eHq5WYJrz8Mo5zyRpOPP/44Ro4ciR9//BGnnnoqAODLL7/E999/j5kzZ/ouYE0gqJVEB48YVz+xfZqdjHcXleA3kxYEIoMb/Jz/zaZnv6gulhkzfltCvCpHITDMJGw1SAw3beZ034K8Bid5/VzN9MHibdzv//ndZst3d/33J6V6ZQhDf3SaL6xLs9WEThcEbNttnBqGdzZly8zQoUOxYMECtGzZEh988AE++eQTdOzYET/99BNOOumkIGSs9gSl7ReZXAjsQ1Av13l35mThZ8zMY5+u8K8wBj9lDBN+D9ZeiwuDmynRMqjW5rRXDxDsipZVuw7Z/i5rxYyR/DvOp2I1UziksxXD9JuqZVF0t0TB1xXnJH9AdBUs0bdvX7z33nv45ZdfsHjxYrzxxhvo1KmTcjlz587FmDFjUFBQAE3TMHXqVMPvuq7jwQcfRPPmzVGrVi2MHDkSa9c67ypM8Ik9AEXHyrDnkPOS3WSRCq4Z6QHadFjL+rX8F8ZH/HbreB38E+3i4VGeoL1tYqi7mZx3c05mO6q6mT77aWdAkngnBN1RIs+Mt/JFw68OsVUoDEO2K2UmEongf//7Hx5//HE8/vjjmDJlCiIR9ZiL4uJi9OnTBxMnTuT+PmHCBLz44ouYNGkSFi5ciNq1a+OMM87AsWPHuMenKolS9mOdfPgzc/BriJUZP2NmgkLezWQ8riA/3MrM699s8LU8rwNrTYyZUUXGYpCozQZ58HLA2DH9F//yHLlBJG5FbFLy+4IO5xVfXhAqMzbb6YRhyFaOmVm3bh3OOussbNu2DV26dAEAjB8/Hq1atcK0adPQoUMH6bJGjx6N0aNHc3/TdR3PP/887r//fpx77rkAgHfeeQdNmzbF1KlThTltSkpKUFJSNVGnQiK/VbsSI+P/lmzDZQNbYX+xWibhRJMKLhz5AGDj34qZ3RPON2v3+lqe15iZEOgyoVdmAPXNBxOJ6mqmMFMSgqSPTvfSs2VG4DLSIX6eU9LNdMstt6B9+/bYunUrlixZgiVLlmDLli1o164dbrnlFt8E27hxI3bt2oWRI0fGv8vPz8egQYOwYIE4WHX8+PHIz8+P/2vVqpVvMgXFQx//krC6fv/O4oTV5ZYwaPlOqMYBxEgFq5OfxAZWt5edLEWiY5M6GNiuAYDEBwCrEnXYeDDRmO+1XYLJVOOat75PtggVuXbsVjN57K+ioc02ZiYEt1hZmfn6668xYcIENGjQIP5dw4YN8dRTT+Hrr7/2TbBduypMjU2bNjV837Rp0/hvPO69914UFhbG/23dutU3mQIjgeOQOSg4jKTChC8rovkwt0pQqhJzf7jNZZQsN9OJHRvhrMq9fsJumSmP6KGI5Yhhfn41Td3VlEyEMXshGZf0iuCVwBjWmb8tgXmTT5YwtIzyCJOdnY1Dh6zR64cPH0ZWVhbnjMSSnZ2NunXrGv4RVYhyCISJVAgAlo6Z0cx/h//a/CRmls5yqcwkazVTepoWf0MNu2WmLBINhTsOqJjwzHqLhtRS4lNBVJUMwKpkZ6bj3tFduXWKHoUwvIAqjzBnn302rr/+eixcuDCuqX333Xe48cYbcc455/gmWLNmzQAAu3cbU8Pv3r07/lt1IZHjEC+5VNhI9GDSpmEu/nhKR6VzZE3n5kFcMeVGyhOLO1XNNRI/P0mzdHqaFt+yIgzLw+2IRMX5PxKNrlsV9pSzzPhoZzi/XwvfypLFj+7KHd50caB5CHQZdWXmxRdfRIcOHTB48GDk5OQgJycHQ4cORceOHfHCCy/4Jli7du3QrFkzfPnll/HvioqKsHDhQgwePNi3emoazfKTv4eGE4nW8jUAdXPULFZ2ezOxmHcMTqU3VD+IW2ZcbmaagG1luKRpWlxhDb1lJkTy6bAq+pqmVYt+7+YK2gaw+aKduyf2exBEdbE7MwwWZ+XVTPXq1cNHH32EtWvXYtWqVQCAbt26oWNHtTdboMI1tW7duvjfGzduxLJly9CgQQO0bt0at956Kx5//HF06tQJ7dq1wwMPPICCggKcd955ynXVNNLTNK6v/2hpcrYtUCHR454b5UnWa5KRbh3YaxKxcdVtzEzyLDNVCmvYY2YikWhorEc8NxNQ85T4GDLd/snze+HPU5ZLl6nr9iuagswzExYLIA9lZSZGp06dXCXKY1m8eLFhB+7bbrsNAHDVVVfhrbfewl133YXi4mJcf/31OHjwIE488URMnz4dOTnhsC5U5HfwXk4QmnSGQJkpLg1/AHDCw8k0dTOprJvJPImz57VukIst+4+oVZxieI2ZSZYika5pcSU37MrMw5+swLiRnbm/ndSpkS/L7TPSNPz5zG541CGj9v4jpdwAYFGK/FDiY/yvzMvLqd2aAFPky3SK//U6nwiXZjsoUclGSpmJKRkyPPfcc9LHDh8+3LbhNU3Do48+ikcffVS6TKKCzPQ0zkaTQHEJWWbMuKlO3s1kiplh/r50YCtMmL7aRe2pQ0yZSTXLTFqaFn+rDrsyA0CoFNfOykC93EwcPFLmqXxNA2plVcXbpWl8C8DAJ760fJemaSkWM8PHTVeUsfqqtoxjTiHF8mTr0GHv3ko2UsrM0qVLpQqraSZ0vwiie5jdGzGKS8JvmUl4zIyL+mRltCQMY07Lzgh/MLZX4m6mjGADgBvVycLew/4lg0xjLDOrd9vvPRQGsgTtq0P3Jc+LBs3wkpGRloZSyYCmVFvNZJcBVxUpHd5F09i7mYLKAByO7RxESCkzs2fPDlqOlCTESqol8DRGSXkKWGYSbJEudxFlKjs2Z5oOZGMb3AbFihjcviEWbNjna5le8WqZkbWK1M7O8FWZ0RCO5aZ+IGtFdIJV+tPSAEgOJZomfrkKI3YZcFWRs8yotY1z0jyl4jjyiOoNd8yM69F03bp1mDFjBo4ePQogPLuJEhVkCQaPVLhLibbwHS2LKCumshNduuk+sJNzts9p3i8/obWv5flB7GrTNc1VzEGythTSER5rQtuGuY7HiJQ+XfcpA69m7PMqip5vMiQIO8uEKlLKjGLTOMWuBJYN2mGDy2SjPJru27cPp556Kjp37owzzzwTO3dW7HB63XXX4fbbb/ddwLDip/IWhB4o2g8lFXTORA97R0sjym8cshNdpsnMxM45fltmwjhhxCZZTXNnnUnWm2BU10NjmZlz5whc4aCoipaP+6mUscWolBjRdUcZ3AaIJxI3fTEIfdhJCq+PjKbx69Chh2bVHA/lHjRu3DhkZmZiy5YtyM2temO45JJLMH36dF+FCzNhVwpSKeDOTKInkWPlUeU3DtkJwmxeZwdEFdN7n5b5jsf45U7wk9jlatAsLjcZYtsZXNi/pe1xfl+5rocrE6yTK8JukvHDbWt2u6lYT3Xd+XlpnJftVjTfEUnqJhBc5plU7mYOk4/nmJkUXc2k3M1nzpyJp59+Gi1bGgeXTp06YfPmzb4JFnbYezqiC38vC/myAlianUI+ajOJVmZKy6PKA0COZCZls4WMHRBVrnPSlcehY5M6tseE0TITrdJmkOnCEhWbpM/sldis37qENSGROIkSEXRfv1w8mil9gUqRkajuOB65zRCdSNxZZmTcTOrXLvIMfLB4a2AKR7WLmSkuLjZYZGLs378f2dnh0a6Dhu1MvVo4vzUnGlEAcCqQjDlE9Rn97SC5+BSzhYwdDFSuMzczAyd2bGR7TBhv+c7CY/HPvD6Zk5lmyJFivsaY7uf0hut3nFVUD5ely+n67C0zfq1mchczE9V1xzwzbgPEg0DU1m48LEG8mNnlmbnrvz95Vjia1M3mjocVGYCrkTJz0kkn4Z133on/rWkaotEoJkyYYEiAV91hO7bXwSKYmJnwDMSqJGOJv0oM1Gndm6J2lly+SfOVxBTf9DRN7TolEvslOjGZiiuz6GgZ9+07TdNQt1ZVW5qfpZglK9HWuqjuz5LmRFEujJT2aWm2ZnYzyZ8bjeqOe5KFJT4JELt91u05rFyWzCPiJs9MUBmAc7PScXbvAmG9x8qSFJEvgXIG4AkTJuDUU0/F4sWLUVpairvuugu//PIL9u/fj3nz5gUhYyhhXUOyg8WoHs0w/Zdd1rKCUGZC9FapSjJEVx0AZGVM0zTUykzH0bKKdawN62Rj4Z9PRe3sDCxYL7+MWtOc4yYSPfnWykzHIcm8RUfLIlwFO03TDIqh+ZDYm2Ciry2qh2uCdZJFlF1AJl5FhoqYGXl5WKJ6+C3FOZlpVRO1j7ddKmZGdTWTcwiwWoEMD4/pYdtfDh71L/2B3yj3sJ49e2LNmjU48cQTce6556K4uBgXXHABli5dig4dOgQhYyjRXVhmRvdqhgv6J2YX1WQMHk5BmrIkwzKjaj6VllEDZo47Of6nrutoWjcHdbIzlMZMDc6Dnps568ObhqifVEm2wg7s6czGjSwagNxsNrOs8ZhVuyoS1iW6O+vQQ+W24937G4a1j3+O2Kxh90spY/u836uZAltOLEkuo1D7OfoEkmdGt2+vwx6yvDuJW+gxk3SQuNqbKT8/H/fdd5/fsqQssm8+aZrm6/bydphlat+4Njb8WhxonX+5uA/+t2Sb53ISbZm5dmg7F3lm5I7TAOTn8nfkVpksNc3ac7LS5bOwiujfur7Ucad0bYKvVu0xfJeTKX8B6WkawBFV02CwzIheDJwsM0GsZgqTm4knSW5mBurnZuLAkTJxADCMLufRPZvhm7V7cVgxE7imGTMAq7qZwu72zs1Kx/4AhscgxjKnvFgTpq9yXXZM+RIpSwePhleZUX736NixIx5++GGsXbs2CHlSBrYzyQ56FXESAQlkgh08Ojetg//cMDj+d9hXDshYPWopWAXsuHpIW9x/Vjfl90LZt102Lb4ZFQsUzzJjtqo0rBNcAP5xbaxKz8B2DaTPT0/TuIqKpmnIZfb8ET1LiQ7GjUb1kAUAW79L06r6kG0AMHNy12Z18eNDpys/PxrMMTOqAcAOlpkkx5WyfdBPy7DUi65idW/O22T70vjLjiK1AhlE8tbNqXjhKKxOyszYsWMxbdo0dOnSBQMGDMALL7yAXbuscSDVHVZzlR300jS+ph6EiZXtlJ2b5hlcAmFPUCXTnLWzXW/4bqBdo9pIS9OUkyDKKjMVsS6C3xTq0zTrINu5aR5O6lS1+qdLszzk+dQuZupwym1UJxvz7zlF6nxR3hZNM95LkbXKsb191jtSIWYmLa3KWmKXA4UdC9LTKv52M+aw90ZFz4sm0MrVs0VdV+cZ3EyKojaxyZEjoxi5aZqgAnFFstSvnQUAnjcsDRJXSfO+//57rFq1CmeeeSYmTpyIVq1a4fTTTzescqruRA2WGblztAS6mdiYGZ6LIszITCJ+62PqMTNyx9lZZlQnS/PRaRrQvcA4eF81pK1SmbLk5ViVGU0DGtbJki6DOyGbLTMCbSbROV9krAkA0KC2/PWLkLo0wTGxyVK8nYFxNZNrq4NJmVYZUaQsM+6ksuBWATVYZhTPPd8mDlJGiQvT2Cy6T/VyK/p5YXUKAI7RuXNnPPLII1izZg2++eYb/Prrr7jmmmv8lC3UsG/ysgNtuqZx3zyDXs1kdlGEJVOA6DlP0zTcOrITGtpMFH69Ncfuo8o9kAnGjR+r2V+nfJ1WE096mma5mbJFntGjKWbdNky6/rwca9yPBnnlXAd/e4A0zfhWLHoxSEb8isxj3bRuDq47sZ2nemTGD147pzFxLBFBB9Zhtqi4a0ezm0nJMpPAmBmesta+cW30bVUP5/cTKx25kqkWeNiNHSHyVEoRj5kxXVOdyiD9I6Xh3ajY0/vtokWLcOutt+L888/HmjVr8Jvf/MYvuUIPe6+l3UxpQKL0cHaDwzTNOBjGrBCPndfT93pVxkrRIKBpwK0jO2Px/SPF9SjKJZTB9H/Zc+TdTOI4KZWBjrc0W9M0i9yyRY7o0sQxozALz82UZqOo8eBP2pphohPHF9mX7fdTJbs3U+2sdNTO8ha/5dYVUeG2rvhBtDcTYGz32EuOu00TWXlULDPOz4uKm/eMHk2Fv/F0pvaNamPq2KE4pWsT4XleYmbsZJe7t1XHjO7pPdO1l7QcolNjlv6YBbBFvVq44/TO/IOThLIys2bNGjz00EPo3Lkzhg4dipUrV+Lpp5/G7t27MXny5CBkDCVuAoDZNymWILIqGiwzpgk1Nu4F8bbrh8UkVoTdQOB/xlf7e7DswdMMf8sHANuY5BUvga0ydnvdbniq2ny1OBN2moL7UtfFEzLbD0VX48bNdNtpnTFIIUjZXJ9Mnbk+xCjJXJoo3ijWD0UBwLpJkVBZgWasy+guVek/EZ837bQLdOfVE99Rw0aE2tnu3Ux2OapU4395L8ZdmuYpyeMlm7IopUdsPokFF6elJSeFhh3KV921a1dMnz4dY8eOxbZt2zBjxgz87ne/Q5068m951QIXeWbSBG/pQWxEyg7E5ipjE2AQccB+mFVlBj6/c4A46QQxn3G8flk3E/gKbEUZCm4mk5cpPolZTDOSFiPFIZt3NLuaxgkd/DY2xxSJlEonxYInxy2ndsK/mVV8MvRpmY92jWrjpuEdpZqylkvlgMVtLhL2PNlds2MLAVSHHLO7VM0CqzseryKP3QIGu7HYrs+ze62pztF2L0J+BAD//uT29geY8LJaVbR/WqwPbdxbsX5dNJclE+XXitWrV6NTp06Ox73//vs455xzULt2bVeChR12NQDPrNeiXi1sP3jU8J1dMKjfZLKzvWkgiu93E4AsFQ+vN+1MSpnxWXaRhaN9o9q49TSjOVWD/CTeuWkd4bGqMTPs4bHJyyy2dIl+NJ9PVji2q4rmhUQ9N38Y3hGjKk39+4udgx39kEtuM0LBuZVtZ7c0m7V8xSdtj/sMqSjDbnabtiPbRoF0+zJltGaoupnEv6mKwzveyWqcphlfaniWmWGdG+PrNb861i9ShMwxT2Fa6RdD+bVCRpEBgBtuuAG7d+9WFihVMKxm4jxBvxvcxvJdWlriItfZmBlzoGY8RXwA0Wn+WGacj/FL8tg4IRpv//uHITinj3WvEhkZuzbLQ6emeTaWGUkhwY+ZAazL+lVWWXlFg/x9ECmLmkkW0cCdjEBKmSbSNO8B9TKXxlOI2ZcjYQCwbsyXk+Ni5/KYjOx9Uhk7pJa5OzTiPaO7xj9nZ6Tj3tFdkV/LGpTOdTNV/t9OhKC2f5GxIDsphnaKKmDtGzxl5mrJVY7Zgv5hdj+FT5XxGABsh1tffqrAXh/7ADWqk4XsjDSc2s0abFZhmktMNzDGzJhWM8ViZgJ4gP2Iw5GRy3/LDP97US0yMp7cuXFFGS6DWs1y8I63WmZk3UzynNuXv/GciqlZBz+fkqYZY1P8jJlxIjcrHQPbGmNqDK4UiTL8SHogpTRxvmMDgO02QeRZZlTzzFgyACucG43aL81Wvf7sjDTcMKwDlj5wGhqZ4md49cTGartqMjz43HVdx6ge/MBdmf5hdN9ZjxcpqjHMl8xrT9nnVBRvY1b2RC9XySTc2dNCjGE1E9NT/n3DYPz08OnIr2VdVpxIPyP7UFcEodof4xd+KBn1mfiU60X+Yp9Ej91HkUVAdDkyGVSdRFTKACwItjW/NMgWqXKbfje4Lfd7lZgZEWlpxj4jegly6ldupbBYttjPctqM567odjNCu5VyLOxznuMyc7YG071WuOiornNXw8XISk9zVK3YqmPWA1FGaZkyzGSaXv5UiOrAC5f1xf/+MBhn9W5uqlStLG75TpYZUyVlnL0tZMflmDJjfg7Nc0W1cDMRFRg2mmTua0aahuyMdK7ZMj0tcdqsMc8M3yLkhxXljtM746rBbTDtlhMr6vLh8ljz8Z/P7MY9xsvDVJ+zV5LYDcKvh7e6x3Kug4xqMTPgNq7bpdlKViGBK0Up3b/Q8mV84xe9hAaVNM9i2TI0jISS4YMM7gOAZRNMsspMbLJSEBCxlVNs3fJXHtH5S/tjnNSpsXP9zPWLXCEVclm/q7pUscxGt7waUV1HdkY6jmvTwKAUuSmLh1PMkflWlHH2a1NVZszwlJmw6TOkzLgk9kanmd5OY51G9NaQKN8/azY1D0Qx/Nh7plGdbDxybk/0KMj3rUyZMtxWc9nA1vjuz6davhcNF5rgCZFJsuX0sKtcgnk1U4zjbdwk9nWrKVI8ZU9pRYvg+zTNOFCKY2YSP3LKxcz40N8liuAvzbaOJ+aVPrruj2UGMC3NVjgzquvcDNI3nNwet47shGcu6u0YlmC0zLDXYLIgKFhmLmAy92ampQmPc4KVwNwfVFcz8Y4WbSIaw/xslHOVGUcxAIhXilmvK3xxM8Fs5FITiOUugOmNpfIPnmWmwlQbvGjm+s0KVwxfVmKExPz4fye2w+5DJfjkxx22x9XOSjcMhrFBVOhmEpQjl7XVHrWl2fw3oTG9m0MD0Ltlfvw4ufKkq65IzsdTZhSGMzv3ESuzcDVTQK9ddpYtOYuJd9wu3+XFLWSkazAnaTXkmclwtzTbXI5K341GddThKDOtGuTiihOsCyWcyLKxzNi6mUx/X9i/JT5csh2AcbUOr193b14XK3byN3Bk+7b5TJlWcnqOnBQ981DEczPJjguxtrVaLN2Vl0gCs8y0adMGmZlWc351gV3ebIjyr/zMm+zsovp5rg8vGOvn1+lHBL8lMEzyPFFQqSzmAeD+s7vjsXN7OJ8nEFBkyfXy0DpaZhSL5g16mqZhTJ8CtGkYXAoEkZj1/OizpsJF98HJJermNum6fcyR1ETkw5gutXpP8DJi/to80evQDfmkqtxMapY28yIClet2ipmRgb1+ZTdTPGme1boQw2zJNnP/Wd3QrhH/GWOb0q4Otzi5mcxzSlnUapmRddOKlmabTw/jNg3Kyszs2bOFv7366qvxzz///DNatWrlTqoUgHUzGfY+qfwsjKoXDAi8vW9kuOi4ltzvzZYZc30VsnrvkebrlJ38x47oyP3+lcv7u5ZFNXU4izi/Ca8MSXkcpkPljSalJj3ZslSsQvzvRX1PBWsb6DituzVdfaI2mlSdsDXZA21wa83kxczkctxI7FyYbeNmspOiwgLNjinyMmdnpKOuy/GNrT9enk2eGe64yykDMF6POdbFVgATrFXXYsFQXs1k/d2x75t+5iendBQDgDhpnvk6qkXMzKhRo3DnnXeirKxqK/C9e/dizJgxuOeee3wVLszEtX1TDpe4ZUYQrMmz4gDurSSifWHY3YdjRZtr8CMA2DyYsm+B0289yeY863dn9mqG0b2aW3+QRMr1IzxELQBYBv8tMzLHyBWqlOOGU+bj5/VUSpsuzgBsOk4H/nSqNZeV0+QZRGC93ETk/wsBD57Co8G6ca1ZWdF1Y0Bo3DIjWYfhd2MeTkdOaN8AXZrm4Z7RXTG4Q0O0rF9L4iw+rGhZ6WKFjL+dQdWLp+hYg2WGV79NbxAtBuHVycPOht6joC4uHdha+nzhMbJuJmHMjPXvPi3rSZWZKFxZZqZMmYIBAwZgxYoVmDZtGnr27ImioiIsW7YsABHDSbz/asblnXYBwJGoLvTJu91VVtRJMzk+YPOxfrzt2i3Z69qsrs2ZvEFHvl7eZcsl2+MfxLHMCuuRldPP1UwiWdyiFADswToVQ5zHx1iQ2+0M3GKNmbFaNO3wQyqZFxnRPTD3IbObQNeBw8fK43/bbgVgc8E3DOtgjJmRmDkuH9QGM8adjIJ6tZCTmY45dwwXHuu4NJv5zFpmnGI77DCvQnU8VnCIIQDYdJAXRaN1g1xMu+UkRxednwsm4kuzTd+bT9c0DYPaN8TrvzseX90+TK7wgFFWZoYMGYJly5ahZ8+e6N+/P84//3yMGzcOc+bMQZs26sFcqYooEZNdxzLvxMsqMOk+Rzim89xMpmO87OERwzwAyu8mrV6X0zlu0sJXZQD2P8mjkzSq87Mf+7yoHic83ydLiOV+cL4DgtkUVYduVbJUq/FBLKk8M7zvTMHTAH9p7a+HSwznCOsQ/HT3qK64dmhbU9I89b7oJTEdK7edQman9NotwzcEAPOsYDbt1rRuVeI+yzDuoX/Idnk/t38RtZ/5+mOHjezeFO0bh2NfRle9a82aNVi8eDFatmyJjIwMrF69GkeOHPFbtlDD7sRq2EHbbmDSjR2UPdatm0nUR415ZvjHehlcYlhjZuTO4x3mVZ/w8iYtXjrMG9j8kSeIFQGyJarUrGmcNzVVy4zIjWcqKKrzJ0q/XXbCchTL9EOpk1HUeIdkpluXZpuVGR06fj1UAjOiTT959Cioa1GcvFhBq2Szl8dQFmtFMSgexuNUrJ1Gy4z9WKhp/GdmYNsGuGk4G/9ntsy4U1RVkFva760WL+2cKJRns6eeegqDBw/Gaaedhp9//hmLFi3C0qVL0bt3byxYsCAIGUNNmqYZ92myuclRY/yvQeFwa0YXPSzphrwJGvdYPywzZiVMtpPz91BxynSpXqbsMaoZgAHgoTHdbVehOQ1kyjEzMhNIAJYZrnIhfzqA2MohXtnm45LrZmLx0xJmh9uYmfQ0653h5ZnhKTP8Ovjfx55xgwzM505N+G/m/rpFq2AVNm9upqqDM20UpFj9vP7wl4v7oDbjBuLFljhhbFb1Rguinzptk1ItVjO98MILmDp1Kl566SXk5OSgZ8+eWLRoES644AIMHz48ABHDSZRxMxnyDNjc5DYNc02mzarmd6tYyFhmqg42/qkSwCnCmmdG7jx3bib+SS9e1g+A+zdcADYZasVcM7QdljxwmnpdlSjHzEi95flvmwnyJcz8Qqzr/PqCcDPxYPuYTI1+DOpuFbWMNM3ShzIzrGVdPKBiVSlvlRiLqD+mx5UZ9tiqz//6/SDueSpXJXqROaVrE0y5aYihU9hZsbmbseqxOoykC14mVWLEnMY/mTbwvCVIAh4Ni5IWQMC9V5Rns+XLl2P06NGG7zIzM/HMM89g5syZvgkWdkS5C3gD08huTfCfGwejVYNco7nUF8sMH9YUGxukzMf6ocyYJxnpmBkXAcDsGWy7n145SLtxM8UGUbeZZzVNw1mCFVhOt1Q9ZsafY1SOEx3rVwCwuX116PzgbsXGkpbPnGdGsQy7Qd0utoNFbhUezzKTZmk/s7tEB/DAWd0x6Yr+eP6Svg518L+PjSWiDMBN8nLQqI51Lzqvk3T93Ey8cfUA9GtdX2iZsdZp/U5mU03nsZB/p83fWQKAPbQBu5x90hXilBWy8Uuf/vFEXD7IfmWUCEsXDZ8uo67MNGrUSPjbsGHhiGpOBGzuAvZR4b1BtmtUGwMq086LAoBFD9OAtvXRUWDGBcQDEDcA2HSsH0nzzG/WspOOO8uM/fdSA4fQzaRWJ8vzl/YVnOugCCmOCH6OHypl8d1M/khjLiUa9afslyqtdV5wE+TKYpfcjUXOPWr9LiPNOWkeULGP2KiezQ3uEG4dgmc35rK2d4dw+ojTZTGKpFMMjyjW0HqOQ52C8tmxcIBpi5BY/VwlWxAYy56nyqQrjkP35nXxV0b5HNWzOW4W5OaSjV/q2SKfe20yWO63/+slPEPbGbgk7lrSTHkGuEuyqz6zv7JvUaIHtF/r+ji7d3NMXboDP+8oxKKN+w2/iyZMtmwt/n/TW5wPMTNWy4zcefw3KD6xVOJn9mqOj5ZZtytQmfxE8gn3ZpJxXUnXbs4Wav09I01DuUCzktPV5KRR20qB96X06QBsNvK0BADzLTMqrHpslNQeRLpuH9js1RKWnZkGmXAVucnISjrHzSRrDeLLwRekTna65XeZSdvr6MKOpewzbjdu2Y0FdjtBsy7/Ezs2wpg+BcjLzsBFkyriQEVtY20Hk2VGKA0fDcCons0wqmczy2+yQfT8Y5zr/uslfYR1iSzaYSL0G01GIhE88MADaNeuHWrVqoUOHTrgsccec9yvImiMWSXtZRFliGTfBkRWkrzsDPRuWQ8PjumOFvWsSae8WGb8iEh3uzU87wEU3dJ/XjcQEy7sjcfO68n93UsCOD+6kWgwcYyZ4Qh+eg9xXIOfKyPUAoDd18PCa2q/XvjYe+B+M0VjG8u1kfiuvChpHeLtpWOG11cy0qxJ8ywTvUKD8p6j/FqZ6Ngkr/J3tm2cJ20VF4tTQkV2DGU3hZRZZSeKmWHLNwcAj+jSBK0a5FZ9B4GF0tENbfuzEl72LZORo1eLejYFGP902GEhKYTeMvP000/jlVdewdtvv40ePXpg8eLFuOaaa5Cfn49bbrklaXLFOpaMWyUqMKeKAtBY2I3Y+JOKyDJjHXicDcPquN0SQeWshnWycfGAVoY9StjzvaTmj5V41xldsGD9Xuw9XKogmVUW4/f2cvGa7qkLe+Oz5bv45fk4MKrGzNjl6PAkh/kL3Z9+KYvdahivbqYhHcQueZaS8ojjMfyYGatlxhozozLrWOu4d3TX+Gdjnhkj/AzF3mDLZJ99W8uMjTJjdyxvabZmOpbvZjL/rTbKfjR2qMrhXGT6aUwuu/5gv+eV1YIaNkJvmZk/fz7OPfdcnHXWWWjbti0uuuginH766Vi0aFFS5WKT5jndV/bGsxot+1Dycr4c16Y+6teuCqzjJ3Pi12ncBVZwvg+zhp9Ls51eI8VKgzyiY1s1yMX3942ULMP0Vioo1KkpeINQ3ZxMjOphNTH7jVpciveJSnRnW9TPNR3n3c0kQtOAZnVzlI53PMaDPEBFfERJuSD9NAM3ZoYzqXuxWDtuAWRwMzk/A17vI1sH63q1C9a1u3zzb6KxOP5sSCi2ThtLOrVBn1b17A9gEOfCcj5X5lbYKTPm80Ooy4RfmRkyZAi+/PJLrFmzBgDw448/4ttvv7WsqIpRUlKCoqIiw78giLuZNM3x3YeNmWEVG/ZtgOdmsuxIzRswBHVmcPPMmM/1PmtYAuAke5TKGxTvHJXYht4t8+Of7SxJbq0NovPcrmYSK0fO8kmPMYqWGZnv7DDf23evG4SzejXHQ2O6G76vmGASY5vRYR8bICOF1wm7R0FdlEooM7xnlbeayfzGrDLp8KzDbPFpNs8c12rs0DZOorFjSZS1zDhkWbfWw68pIigz7paXcDlaLTPGv1W7h92Y7HbFJSDXT7MzqtyzTvl7kh3mwSP0ysw999yDSy+9FF27dkVmZib69euHW2+9FZdffjn3+PHjxyM/Pz/+L6idu5n4X0eTm25wM/EfIJ6Z0xqPYi1bJWYmiDnCdcyMx3rtV1ZU0bJ+Lbxx9QCPtRmRNd07J80TKUGCt0CpWuVQtcvk1zJ6pEVByrKc2KkRJl7eH43qZBu+110GALttm9E9TcvqJftV1eH8Y/o6vHH3KKiLvq3qoUW9Wnjh0n7IyUwTxoQB/Gc/XbNmADbfFpW7xOt3nZrm2f4eg2s1VrgrvMmRXVxQxmyeZreaidctq4o2/hhxsPZYrSw8Zc/8wmn/tyc8PXKVbiabMngr4WJYlWYvsgRD6JWZDz74AP/617/w3nvvYcmSJXj77bfx7LPP4u233+Yef++996KwsDD+b+vWrYHIFZvQZPoq+9AI3UycB9SyVYDCElmum8l8rg/Pma8BwC7OceLQsXKL79tQZ4APpWMAsOh3RYuNG9TijDR0bJJn2M1axjXCIqsABjlIahw5rj+5vVHxh/W5sS1Ts96XcSM749Urj7M97+ObT8SUm4YgLU3DwHYN8PPDZ+BKJj7OjCgDsJ+xDGxR/3diO7xyeX/0b12f+7tUNR77K9tHI0yQNPu9WQlSuX6DlZyzN5OM+E6rutg/bx3ZSXq5vhISgso87nbKjPl0t7GSQRJ6ZebOO++MW2d69eqFK6+8EuPGjcP48eO5x2dnZ6Nu3bqGf0FQ9Rxojg82q8xEBG6mdI7/24tfmr+ayawceccpz4IIrxOz7JhVeLTM37cj+OOeA8QKhaKO465uF8feOpJRZsqcg1ZZKrYzcL5puqJsMdze4sz0NGGMktuYmT+N7ISmDrE56WnGvY6c9knjyZKRbt1o0tzCKu4A9lnu0aIuRpuSQapuUqlyS5xWuslaAlV0OadtaGTGS8sYDfN4qNYx7Q4XXVp2RjouG9ga/VvXE5crUTc7Z1jqMgmW7UPCVb8Jn0Qmjhw5gjSTCyY9PR3RqNqbod/EVzNpwMB2FYmIRFu1GwOA+cu0MzlagNWEbO3Ook6aacgzo3HL82OS99PNpDLwKq3GsfktyHwJvPZll3uKFD+hm8lHpcxNnhm2fjvLTKM62RhtypMh28oVbqbkvfUZ3JdSq5kSI6vYMmP8zpyNWs3NZF+f3YsK/0XL+uX7vz+hSjYH4VgFIyLMveRsmYp9Y/7JUKZm/SiTS8fphdPcn7x0F2GuJgDjL+iFV64QWwNjcrKWNpZ+NopQrA4WOytOsgifRCbGjBmDJ554AtOmTcOmTZswZcoUPPfcczj//POTKld8byYNaFo3B4vuOxWL7juVeyybRkL0AKdLxMxwn2fB05Eoy4zr7Qw4x5nfBO2QrefcvgXKE5RfsDW9//sTcO/orjiDySOjmp/Gy0D48uXGdOh2Zf3yyBm4/6xuVcdy2szOMvPm1QNw++md1YVE5d5Mrs50Rqh4cCYy6x9iEhELyQusN2cAfu7iPhYlUqkOjR0znC0Vht8kV7wN7tDQlTwRQSObJ3hdhyWoXKTRdWpqv0GmTACw+fsgvS9OS8xltnlo26g2vhh3Mj68aYjh939cZR9XaNkDzIeEq34T+jwzL730Eh544AHcdNNN2LNnDwoKCnDDDTfgwQcfTLZoAKo6fJM8sVm5HxMMGBW8YfCWWVr84ZxzRV1KxgfsS8yMSW7ZMs0P/Xv/NwgntJcf6JwmkFO6NsFvB7bGkI4NDatFgnqRfu/3g/Db1xYavmOvcXCHhpaBXLxCQs39JIN5oLMrq3Z2BurlsikBrMfYWWY0DchKNyauk53w3WYA9nJf2VMNG01KlKlpFZl+g0YmZmZA2wZWt5OCosWe6rRPrdmiqbI4gQd3R3XmfJFlxkxE13HN0HZ45JMVjsfWzcnED/ePRHZmOo6WVinnvKXZIqwxMuLxkLcJqKU8m9+cWsBOwWDl6tQ0D1v2HTGWbdNRPv/TSfhixW7Dd2SZcUFeXh6ef/55bN68GUePHsX69evx+OOPIyvLurFZIqnaaFJ8zKzbhuGx83riysFVgX0GyyZzMi9C32qZ4SgzgvqNQY3OsrrFbJnJy5HTj80P/ZCOjXwNKsvJTMPI7k2Rm5Vha43x662ap8w6uSCUlRYPN9CiLHtsaqcAYOtgl/wAYMB0v+PPsHvlUYNmG7gbJBmmpdluN6uNYZdHRuVct2WYYa+nXJAlWSVGiPdLwzrZlvCAKks2uN+zOO7NBA23nNoJXZrmSfUT25gZB8uMbQCvw7WYLV9XDGqN7Iw0XNi/Jbo1r8txM7nPsh0UobfMhJX4aiabYzo2qWPZJNIQM8N8z42ZMX3He55FAwYvb4JZWl/yzJien4fP6YHtB4/h2qFt7U8M2EppuLYkWUSdxnL29j5yTg8M79K48kRBeR5kyUwzW2bsSzNaK6y/22Wt1TT3b266rltk+9f/DXI8z8tWD6Jrld3zJi8nEyO7NcWslbsdjweA//1hsNRxLCLLDPu1141jjTEz1t9ZhTg3y6QAcMpTkYYXu2bMACwXI8mb8GNl2724OAUwV7g/JRQ2TgzNbad1xm2nVbhdg1DWY3KZn3EVzM3bpG4Ofn7kjLhF13yZXvYACwpSZlyiO7zVic/jBwDzYmYa1jZan9TcTNYAYIuofriZTIW2rJ+Lz/90kuN5Xo0wjs1umJS4X/uM/L2JwQ6EA9s1QJuGtS3fi/jHVccrSWc2QTtV4TSpHytTtczIoetW2To0Fu8a7zea4DNLrcx0HK2MGXLTn45ro75zMa9PZJhWRPEsM27zzPDueXZGOl6+vD/KIlEsWL/P+KMLbcYp4J+9HOHmq6a//UizX2XJdr67zlmTjX/LJEgUId5oslIW24Sg9n/nZlstLaxr2twW5GaqRsS6laolVRBAz42ZiWnzMXh+Y1H9/IyWcueq4Na07XUViIIuY6rXU7VCGvNipnyujL37x7Wpr3SueemvSLI3KxMMihTAPwzvgLzsDEPOGTMaNMubm+wcw39DlzvXLUbFja2XX/HTF/XmHh8k3KR56ZopCae34dy4Kzb/ws7s1Rzn9m2Bcad1RrtGtXHfmRWB4nxdRr5x+DEzVeeLlBTzt3ZJ8+xWLvKsczLjpWUcM8np54IDoZtJ4lzrqquqv0/q1Ah1czJtzzdfZiD5cjxClhmXsKuZ3JxnxqwUdG9e1xCEKTpXpBTIxMz48ZglYqNJV+Vr1uv3r2zrd/m1MvHpH0/Er4dLcM2b30vVqxxTYHBR8s/lve2+dFk/jmXGen5uVjpGdG1iKZ899O5RXXH7aZ0d86KY65Nfms17i/TnDmqaIJ+JzfHc7w3HVPzVoUltzFrpRTp7eG2QkWbMccXLVaUSFMbqQk6PddO6OZh9x3Bb+bzeNoNlRmJncYDf/93aatyMl+bYE9U2cKX8SLpDjfVUMaxzY+fzTXLRaqZqRNV2Bmo3VRQAXFuQo8Z4rvxjyVpmoi5lVa1HhUS90VbUxSo2pknWx3W1PVvkY8fBo/G/nZQVtulYMURnsZJqCi9GY/oUYOVO4x5lKuZxc5s5KTIV57trZ95RUhvpyRwjaFmjrGoTQ+zjLad0Qlm5jjN7edsktHPTOliz+7Dle65lJk0T7i8Uw62bSTkAWPI7luxMZi8gB3lkVzPZHWYfM8NRxiSWZjvV7+cwZ5dnxgm7VVZu9nbKDmEAcPhsRSmDO8uMIWaG+d4cH8PrtipuJtYyExFYkfx443W7YsHrSgcn1KYnNewGRWPcgX05XtpA9VzVmBm3x9oho89EOUnzvK7SEcrDi3MSuJyEVB5TOzsDD47pjuPbqsfDsEwdOxSf/vFE1Mo0ThZ8y0ya4QWH104ndWokXbfqsnQWXn8UjS93ntEFg9s3xPn9WtiXya5mEmgpx5vij/yImYlhjTF0bhQ/6zcjKllKkbdYZtTutblrnajQrxIFKTMuYTeaVIFVSNhO1KC281Jz3vMsettkg7diKwEszybzuXl+Dloz2WllCWqiccThCRS6CEzf200+4y/opSqVwVTv1DIevEzKcSTWhFqct3iB1VD1DsdOHdqxKq+O9BDPSZrnW5ZdGbeR4bPAksNOBA6to3qfcrMy0LNFvlQ5aZpzSv4/niKObbKrw480/KIixo7oiPevPwE5meJdms3yDGrPf04nXNQbN4/oGP+bHzPj3Ps0m7/svzXXJXFQErDTy6QsM0wJd43qopQTLFGQMuOSqgBg924m9rNZmeE9gKI8M7xU1AbLTJQvq6YBT13QC83zc/DWNQMdN8fjwRtAZfA6PzkqCg51zb/nFMdEfZcNbK0sl4plxtNKOEUVwxIA7CSb8A953r2uakm1l6R5vIncV5+9pOLr5pjuBf7sDSeyfLB9why/1qlJHYPCoFKHH5ZTryWwY9ilA1rjr5f0wTd3jTAc06B2Fu44o0v8b7uYGVU9w00TiJKi+lGnlwBg80Hsn6pu3CEdwmeVAUiZcY1M0jz+eVU9svBoWfxzvVz7aHJAvDfTP64agCfP74VTK4M3AaOSITJ9atBw6cDWWHDvqejSLM/Vw+s+ADhgN5NNnAwAFNSrhSEd3T2Udu3ETgIqb2kt6tVyPMYQM6NqmbHswC6P6r0SpS2ozVn+aSbKyedhnljzsjOw8tFRJhnVZDOeyyqgahYpp2MmXXEczu/XAqd3b+pwpEM9gorskheqTqtOeWbs8B4AbJ9nJj1Nw/n9Whr2NuPBG+uOl1j5x7Us2cSZ9GqRj3P6FHDqd6zKNeKl2c4Nbc2HYyhASY4k2eIdIWXGJfHVTC7PA4ADR0rjn2WWVYpiZhrUzsJvB7U2ZN9NM1hm3MX3BEkivVOJvG6jEul8/Ld3j8CXtw9DvoQyy6IeM2O2zMi76fxoP13X8cxv+qBL0zy8eFk/8XEOk1oMmSBkM+ZS+IoN81lw4eyLh1PbtKyfi79e0pfrOrLDul0AvyL2hchShqLPQ6TUyZ0r/610mS46Hi+33m2nVVhulNvDpvqPbx7K7cdeY2bs6hSNJ26UbvZey4zFflvtgoCUGZe4TZrHdshjhv1AJM7lPKgyHUukzNgFhQWNpmmYfP0JaN+oNt6TyPBqPd/hd5dyeYVdZSSzI3fL+rmWpHC8nEOAt5gZc5m801l5jXEh3tFRkfxuxriTuW+0MaJR672VSZ/iZXWFML6K8917vx+E/FqMMiPZOl7b0I0yo1yHwtJsMyoxMzz+MLwi7mUM0zfcvPCYlYn6uZmoleXcN3gBsVYFgPksuDgnhal949qOsqjCitJfsPu1WV62beV2h+d/DhOkzLhEZjsDHuzDVsrkTpDpIKKdY2XrdExhn0hrCYAT2jfEV3cMd+XucRRVGAcR7EWylhm3L2mi3W+Nbiavlhn5c4NuM0t9pr9jE/kdlTtxj7/QGpj95AW90KpBLUy4sLflN5X6nAZtc7xAoppGNLHbWmaU62Devn0wnaqUcO3Qtpg57mT89eI+XHlk8TMA1+yqlnkOnKyx/7lhsMOiCfFv4piZqnPev/6E+GejwmI6R3HlmgevVMKgPDNucR0zU/W5LMLs5mzJf2I9VyVpHou8ZcaezHQNZZLJq5wI+oEQLT0M+jk0xMy4LEPG5eh1NZPKRJHIsSuqW5czxWS9+ZROuHpoO8vGgEDFPmjf3HWKbdkyK9xkXC1u+pPn/s6c36dVPdx4cnsADpYZxQ5odCWonetUnhOapqFz0zzT+ep1msdI6SbgWZbUq3d0MzWsk43RPZvh0592uijd2c/EZt5OT9MQjQjGfsWaWeWW3EzVjPhqJuVVJVXHs8qMuRiei0JlbybDeYL4HrsANx7sgzKsc2NMuqK/RO18vL7t929dn/v9VYPbIE0Dxo7oUFVXAqdjVg9xm5AvM8PZhK3afl6W0Psydjk0xR9PqXAzPHJOD04AcNVnniLjpyAy12oYzCUbx2t/Z+u85ZSOGN2rueM5Xlbv+GGN81qEm0nTTplQfRzdKADmIToRK7VF7i+7RRCqCnkqWGZImXGJ29VMd43qirYNc/Hg2d2VNx3j5pmRcU/FLTNOyovxi6UPnIavbh8W/5vdXOzaE9thVE/nATUoOjSpg89uOQmL7jvV8P0j5/bEqsdGoz0Th5LIh8/taiYWL7vfyqLkZvJBGXRqittP74KfHzkDp/ewZtD1083ltJpJhkRa+mKIlvzfUrlH1i2ndDSf4iLg1f3bt8xqIFnyKhXWU5jVmbLYXXHL+uIVg7x7au53nUyWI279Em3uVsERupkEzWxwM5mGFOV7kwIBwORmcknV3kxqN7ZFvVqYc+cIAMCjn66If6+ilLDI1B4zADk9aGYZ6tfOQn0m/02YdkrVIM7hYSdn0M+hUZlxaZkRxcxIFCdbpdJg5kObybRFzOoS1D2yuHJj36uO6wIXZpCIAjbHjeyEc/sWoH0j74GlbIy4cgAwp5O4bZsv7xiGH7cWGlJNyGK2XrPdzkt25ub5ObhndFdkpWs41yZzsey2CyLsVzOJU2zwMCjA1pPU5DKUq3ZuoiBlxiVVbiZ/UHEXGc6TCkqrOM+yCZqkDPm1MlF4tAwnd2qM//ywTULScKEJPrsuz6YQw35LLssXuZn8RC0AWK1smVVctvV5OttFfYpeI1GMjZ+YH3VNYA7SNM2yGi5ehmKdYVl+2yQvB6d15+xCL4GTLnHlCW3wz+82W74XuWq+un0YjpVF4y91j5zb01P95rr8QGyZ4buczOcou1ZDmmmGlBmX6HHLjD/lWTfmsx4jygDsROxtIWIK3rV2cH5hn9x8Ij77eSeuOKENjpRGsHr3IQxOcjrrZK7Gkd2wzm83k1clgYXXJKy8xmXa3lGRPNGrp9grlFqmynyWfUv1Hj/CfpYrTD1GxF+LUzL0IfMz4nUj2fYCRVG2flXsmsxLzI/si6tMWWSZqWa4NVGLMBfD67c8E6Zxrye+MBGPlpnWDXNx47CKgNqJl/eHztkMMMwkS1K3CbREqfq9Ljt997pBuOIfCwHwJ21R8X7caxXZg7pfmuZPQGYycm7YugwEqE6sWYxF0J/tDBL/5EXUwhDj+DWeeX1G7cQQP5/879mgf+tKVvcKfFjH/vAEQaQasQDgBD6wPBNmOWNtYZN5Gc6LWWZMD7rdUm27TRbD2pllSAXZRdltvU7EXZpVBTCqBQAnj0HtvO1CbQfPuirnZhKb74XneGxFNwqU7MR684iO6Na8rmEvMl+UmWRYZtwuzfYJ8wtMIppALmbGZIUX/iGogywz1ZfYW49fN9ZtAHA5892tIzthw95iXGAKUIsd42QpYDv88C6NnQVKIiqTg99v0rJluLXMZLlI1S+D2wHJjzZTsRLIKtWqiC7D+NbpvpwgsZuYRMh2vzvO6II7zuiCHzYfYOpTEo9LcpQZ+99FMvkVESIVM+OyYTytZrJ5cZVB1ZKTDEiZcUl8awGfnlhr0jxOnhnOd+WMuaVebhbeuXag9bzKJ6zcZJqxe6jCuvzODcmyxrg1OctsZ+AGm3czh/MS7WZSt3xIlSsoSzagN7ZKzk1sidfLSMSbsVHpT003k9e9kfyu309pvCy1tygzhjgxibIM5SqJkTDIzeQSP1czpWnWDjLhImtadl7SvDKJV4HYA+Z0aBD5M579TR8M9LAkUkhIHygW16uZhG4mr8s+3TVaEuNxfb/NXgJCYzmXjG/xsm4mb6QF8XCaYItN9N5MfmFRZmRTFfgkK2+MVsGNAih6ru32X1JVXA05iELqZyJlxiV+rmYyT17TbjkRx7WxKgDjK/edie1RA1itLTxiYTVKORB86q8XHdcSH9w4ODDXiSqJfAx935vJV8tMYlFbzcT/HBQyeWNO694ULevnWo5JTgCwrJvJfYfxJwA4cWRUTrCizOAxgpbJrEz5Oe6J7ua1Q9tyvxclWuT97YRfbrggITeTS/y0zGSlpxk6V7Yg6duwzo2x6rFRyMlMx7Mz1wAwxsyIqAoAlk+a57ebyc9lxZ5I4Oui22vOCijPjOOlK/rklXB5+/10VQhjZhSNHm5WFvm5NFs6AFixDk8ZgLnlKQrggZnjTsanP+3E1aaJ3dwGwhVBPiVCZIfYq4e0RVtOMsO7zuiCeev24qrBbZXK5imnM8edbNnTKoZdP1V1Mxl3VA+nOkPKjEuqtjPwfmO7NjdvsCYuMyfTuJ19mYRlprwywMdp123NxSCdLMIuH+AhZiag7QzcKgaq5/lpQQpy3OS9kKgHRkoep9qGlnrUFQ3lvCSG+tTO5ZaXwEmvfeM68a0dkgmrcDx8Tg/uMa0a5GLxfSOV3TW821lQz7pFQ25WOo6URjC8S2P8a+EWANZ7oW6Z8UfZCxJSZlzjfTXTJzefiDfnb8SdZ3QxfK+i+Zbb7GKdl5OBQ8fKMaxzRVpwFTdTkInmPv3jib6WHVbcmvkbMFtI+FFeHIVbylaV+NVMIR0tK5ENGA6sTmnLjAc3kw9xEWG4i7LPjG8xM5JNLmpf2zwznLJ5xSy491T8eqgE323YJzxO9XKT4VpVJRyBDClIrNN6Gcx6tczHcxf3RfP8WoZyzNYXO8qjYsvMF+OG4YVL++L/TmonVRb74AcZ49WzRb7nMmplybcRSyrEzPRskY8/DO9g+V5qbyabCcztIKR6WuuGue4qclmfSsG81jEqT2rBkGFOmqeK3yumwqiUBi3Rhf1bAgB6CPaN8wKv7/JefPNrZaJjkzoO2xm478PkZqpm6DwbtQeyMtJw16guOFYWRbN8+X1JymwsM83yc3BuX/GmaHaENZfAXaO6YMnmAxjF2V1ZBl/M57IBmB7quHtUV/x6qAT/9XEvLOeQGb7EspPSyG5N8Oi5PVE3x5q80a1il+hxM6g8M0mJmVF2M1UVnJ5iAcB+4uXSz+zVDNNuORHtG6ltgxCv2+Y3npXJTrGwU0hVXYqpEIJAyoxL2jWqjd+f1A6tG3h7C2W5aXhH5XNkVjO5wuce61f4r5s2ShZ+57zwWprbtzHZQxvWzub68AE12dljg3y7r4p7Y+qTOM/ujVfEsM6N8fi0lajt0qLopk4v/UW53TnHh/QFPlA0TUOPAu+WZ1nsFBY7RcfLvSHLTDWje0FddC/onmwxpPLMyMLOvX67mTzHe4QI2VgEr5dsSZkRcMiMaoZRt8ep4HeRZ/dujne/2+KpDDcpXzo1zcOcO4ajYR1+PFQQdXrZmNAXN1MI3uHtAqmN3zOfkyi3nRLp7CI1/yZXj+r1hlSXIWUm1THvhO0XYfR3+0EiB6qwqW+uY2YkT7QPXpRvjaAUXw3A/Wd1jyszMXlVMw67XfXDW6YrixvLjGoPNL7M+OBmCsEQ4qYrhSaNhBlGrCtPaIO8nAzDZpJmZO+huhEuBDeWAykzKU6uS7O1E+Hsrt5JaMyMx0nZPKh6HWTZwS3RhjK1pHlVcvpt0maD61XcTIb2cmEl8YqrXbMV73HUsACguo4AfMJgRXKCff4fO6+n4/F+3kJ2LAtr16DVTCnKcxf3Qb/W9XD36K6BlO9/0ryah98KQ/g9df70mTrZGTird3Oc0aMpmtbN9qVMO5SXqQa0d5RtnQYXUDB1GvQ1xZmBZyAIw6Tn5gUgrIrNH4ZVxAvGVkw5EVQ/CauiS5aZFOWC/i1xgWSnlsXv3CKismsK9XKtq3qUcLfNjJBkjkGq93/ib/v7LoNUvIREG7lZWeQVd3lm1NA9WGZ4R4fVHcEjFUTt1TIfvzxyhrQ1XjZXkOp9CunWTGSZIWoWTs/h5OtPQOsGuXibs/u4LH+9pA/O7t0cV5zQxnUZQRD0G2cqTAhOyLRRQiZpkybi5m1Y1c0ZNcTMqNXFk68adIfQUTs7Q7r/Bba7ekjvLCkzRJzQBr75iNM4cEL7hph71wgM69zYdR3n92uJv/22v1LyQyk8mrdU5kM3NYVziKuIL9A04G+/7cf9XW7JOhMz4KNssrhSZjycoWyZCambSZawiOpnm0kHACuWG9b7mhLKzPbt23HFFVegYcOGqFWrFnr16oXFixcnW6xqTVg7bE3GjYJxxQmt45+dVuFUV1X2yhPaYO3jo3FSJ76C6mUwD8p92rK+MV+Pm7dsVdm8uJl5b+theIN3dX+SKLafbRaYZSb5t5VL6GNmDhw4gKFDh2LEiBH4/PPP0bhxY6xduxb169dPtmjVjnq5VTkw/MgASnjDPA4Pbt8QL321Tvr8H+4fadjnKWj3SJi7TEa6zXubDxO337x21fF4YtpK3HxKRdCnm3vnzc2k3CgWwhBbIdsCqRTfI49/1+T3sv0gCL0y8/TTT6NVq1Z4880349+1a9dOeHxJSQlKSkrifxcVFQUqX3Uiv1YmPrhhMDLTNfvBP4UJw9uiLNed2A5Tlm7Hmb0qtm4Y0rER/vV/g9C+sThfCTvoNKxjXAnEXnntLOuj73UpeWY16DNS43QCulCHxnXwxtUD4n+nJcAa5CUAmKu4pM6jZiBFxbYgq0xWl72ZQj/6fPzxxzj++OPxm9/8Bk2aNEG/fv3w2muvCY8fP3488vPz4/9atWqVQGlTn4HtGqBf62ps9fLjOUzQs9yzRT6WP3y6YWXP0I6N0Dyfv2WAE2lpGiZc2BsPjemutP+XE/eM7opOTerg5hGps9UEi+pS62RYHFxZZhSP9zsAuLQ8oK1WVDA1gqgZwzk9e0M+Zsb7yrUwEHplZsOGDXjllVfQqVMnzJgxA3/4wx9wyy234O233+Yef++996KwsDD+b+vWrQmWmODx9IW9AAB3nN45yZKkFnk5mb6awC8e0ArXDBVbNt1w47AO+OK2YRZLUKqQChlQXSlQqjEzbJCzhwDga4e2w3l9C9BCsE8XIcbPriXaJ80Nxr7hW7G+Eno3UzQaxfHHH48nn3wSANCvXz/8/PPPmDRpEq666irL8dnZ2cjOTs1BtTpzyYDWGNWjOfK95l4JA9U0UrZDY3c7/aY6muCzzPGJ2nPMkL1Zdm8w1Uo8XAor34Njkr9nXYzGeca5wOv+Y6lE94K6ePrCXo5KTSoo8zKE3jLTvHlzdO9ufDi6deuGLVu8bRZHJJ4wKDLhfAyTy7RbTsSYPgV4/arjky1K0pEZp5MxlrtZQWW3a3uHyrir49pUuZR93LM26Uy+/gQMbNsA/7havU+HdbJ2wyUDWgtX8cWoLlcbesvM0KFDsXr1asN3a9asQZs24UpIRqQGvgxU1eXpr6RHQT5euoyfg8UrJ3ZshG/X7cW5fQsCKd8PZHZMNixbTkIHcJc0T/zbu/83CJMXbcXlzNJ9L3mmwqYAnNC+IT64cbDle2HMTMjkDxupkME99MrMuHHjMGTIEDz55JO4+OKLsWjRIvz973/H3//+92SLRhCEAy9f0R+zV+3Bad2bJlsUIcoBkEmY94xuJu80z6+FcacZ49e8TFhhWIZdHUhGM1YXPS70bqYBAwZgypQpeP/999GzZ0889thjeP7553H55ZcnWzSihtKsrn8rgfzGr1VKfsWC1M3JxLl9WyCXsxQ8LKjue5QcZabqs+y9UbW02LmlnKgm82ENxfnukWXGJ84++2ycffbZyRaDqAZ4GXTfvHoAPlq2HbeO7OSbPH5zdu8CrNhRhOPbNki2KCmJXACwv1YSGdwlzVM8XrmGKlLFTSO191YC5BDWncDKm9XNwa6iYxjYrnqMFSmhzBBEGBjRtQlGdG2SbDFsSU/TcO+Z3ZItRkqhCf8QHJ8a83aCVzO5P5dIDnPvGoGjZRHk10r+wgw/IGWGqFGkykREJBDVnCoBiSGLtM6hqJz0apkPwN0zkiqWmbCTyHbMykhDVkboI02kIWWGIIgajTHPjEwGYCZjcADyOCHrPlKNmWlUJxuL/nwqcrPVpwVSZfyhYw3N9eQHpMwQNQp6gSTMZDA+krAGALO0aZgbWNlNXAa3J7tN/CQZ1/LhTUPw/cb9uPC4lomvXIIUiP8lZYYgiJqNqqld83mZtCzz7jkFR0rK0Uhy24hErkAJ6+aDqUL/1vXRvzrviZcAqo/DjCBsyKs0nZ/QvmGSJSH84rzKRHwXH+/tbZbd7TvMU3KLerXQqWme43E3nNweAHD/WYkLBCddpnqTqG07vECWGaJGsPC+U3H4WLlrM3pNIyMt/O85T13YGxce19Lz0tJMxjJTHQJZ7xndFVcNaevrRoNOJCMrshuqwe0lBJAyQ9QIcrMyQp24LWyc1r0p+raqF2rTd05muuO+MzJkpTsH9Ib/vbQKTdMSqshU1JnQ6gIlVRQzwgiN7gRBWMjKSMPUsUOTLUZCYN1MIlLBzJ5MqoNFixCTCr0//LZkgiCIADHEzCjOyaTjVFCdVBnSy1ITUmYIgqjRZBrcTDSTuSFVMgCniJihIzsFkuuRm4kgiBqNwc1Es50rUmVpNhnS3DG6Z3O8125LqPdxImWGIIgaTXVK6Z40UkOXIVySlZGGf98wONli2EJPMUEQNRp2GXqKGBhCR6q45y7o3wIA0KOgrvCY1LgSwgxZZgiCqNFkZbjfa4ncFhWkSsxMj4J8LPrzqahfOyvZohA+Q5aZGkROJt1ugjBjXM2UIrNyyEilZmtSN0dqOT6RWtAdrUF8/qeTky0CQYQOipnxTqq4mYjqCz3FNYh2jWrjwv7h3JWVIJKFIWYmiXKkMimw+4U0TerKbeRJhAuKmSEIokaTJZE0j2JjnEh9NfDNqwdgd9ExdGzivJknET5ImalhpJJvmyASQSYTAFweVVNbaJuDClIlANiOEV2bJFsEwgPVyDhIyFANxhyC8JUGzMqWnIz0JEqSuqRK0jyi+kKWGYIgajTZGen47t5ToWkUDOwW0mWIZEPKDEEQNZ5m+TnJFiGlIV2GSDb0GlLDoDcogiD8hvLzEMmGlBmCIAjCE6TLEMmGlJkaBiW3Igh1aNGSPTSuEMmGlJkaBr1BEQThNzSuEMmGlBmCIAjCE9UhzwyR2pAyQxAEIWBUj2YAgOtPbs/9ndxPFVCeGSLZ0NLsGgaNOQQhz8uX98e+4lI0zqP9emyhcYVIMmSZqXHQqEMQsqSlaaTISECWGSLZkDJDEARBeIJUGSLZkDJTw6AXKIIg/IbGFSLZkDJDEAThEh0UAQyQm4lIPqTMEARBKHLlCW3QPD8HlwxonWxRQkFeDq0lIZIL9cAaBr0/EYR3HjuvJx49twftSVTJlSe0xbfr9uG0bk2SLQpRQ0kpy8xTTz0FTdNw6623JluUlIXGXoLwB1JkqqiVlY53rh2IKwe3TbYoRA0lZZSZ77//Hq+++ip69+6dbFEIgiAIgggRKaHMHD58GJdffjlee+011K9fP9nipDQt6uUmWwSCIAiC8JWUUGbGjh2Ls846CyNHjnQ8tqSkBEVFRYZ/RBXXDG2LK05ojTevGZBsUQiCIAjCF0IfADx58mQsWbIE33//vdTx48ePxyOPPBKwVKlLTmY6Hj+vV7LFIAiCIAjfCLVlZuvWrfjTn/6Ef/3rX8jJyZE6595770VhYWH839atWwOWkiAIgiCIZBJqy8wPP/yAPXv2oH///vHvIpEI5s6di7/97W8oKSlBenq64Zzs7GxkZ9NeKgRBEARRUwi1MnPqqadi+fLlhu+uueYadO3aFXfffbdFkSEIgiAIouYRamUmLy8PPXv2NHxXu3ZtNGzY0PI9QRAEQRA1k1DHzBAEQRAEQTgRassMjzlz5iRbBIIgCIIgQgRZZgiCIAiCSGlImSEIgiAIIqUhZYYgCIIgiJSGlBmCIGoU71w7EK0b5GLy9SckWxSCIHxC03VdT7YQQVJUVIT8/HwUFhaibt26yRaHIAiCIAgJVOZvsswQBEEQBJHSkDJDEARBEERKQ8oMQRAEQRApDSkzBEEQBEGkNKTMEARBEASR0pAyQxAEQRBESkPKDEEQBEEQKQ0pMwRBEARBpDSkzBAEQRAEkdKQMkMQBEEQREpDygxBEARBECkNKTMEQRAEQaQ0pMwQBEEQBJHSkDJDEARBEERKk5FsAYJG13UAFVuJEwRBEASRGsTm7dg8bke1V2YOHToEAGjVqlWSJSEIgiAIQpVDhw4hPz/f9hhNl1F5UphoNIodO3YgLy8Pmqb5WnZRURFatWqFrVu3om7dur6WTVRB7ZwYqJ0TA7VzYqB2ThxBtbWu6zh06BAKCgqQlmYfFVPtLTNpaWlo2bJloHXUrVuXHpYEQO2cGKidEwO1c2Kgdk4cQbS1k0UmBgUAEwRBEASR0pAyQxAEQRBESkPKjAeys7Px0EMPITs7O9miVGuonRMDtXNioHZODNTOiSMMbV3tA4AJgiAIgqjekGWGIAiCIIiUhpQZgiAIgiBSGlJmCIIgCIJIaUiZIQiCIAgipSFlxoGJEyeibdu2yMnJwaBBg7Bo0SLb4//zn/+ga9euyMnJQa9evfDZZ58lSNLURqWdX3vtNZx00kmoX78+6tevj5EjRzreF6IC1f4cY/LkydA0Deedd16wAlYTVNv54MGDGDt2LJo3b47s7Gx07tyZxg4JVNv5+eefR5cuXVCrVi20atUK48aNw7FjxxIkbWoyd+5cjBkzBgUFBdA0DVOnTnU8Z86cOejfvz+ys7PRsWNHvPXWW4HLCZ0QMnnyZD0rK0t/44039F9++UX//e9/r9erV0/fvXs39/h58+bp6enp+oQJE/QVK1bo999/v56ZmakvX748wZKnFqrt/Nvf/lafOHGivnTpUn3lypX61Vdfrefn5+vbtm1LsOSphWo7x9i4caPeokUL/aSTTtLPPffcxAibwqi2c0lJiX788cfrZ555pv7tt9/qGzdu1OfMmaMvW7YswZKnFqrt/K9//UvPzs7W//Wvf+kbN27UZ8yYoTdv3lwfN25cgiVPLT777DP9vvvu0z/88EMdgD5lyhTb4zds2KDn5ubqt912m75ixQr9pZde0tPT0/Xp06cHKicpMzYMHDhQHzt2bPzvSCSiFxQU6OPHj+cef/HFF+tnnXWW4btBgwbpN9xwQ6Bypjqq7WymvLxcz8vL099+++2gRKwWuGnn8vJyfciQIfrrr7+uX3XVVaTMSKDazq+88orevn17vbS0NFEiVgtU23ns2LH6KaecYvjutttu04cOHRqonNUJGWXmrrvu0nv06GH47pJLLtHPOOOMACXTdXIzCSgtLcUPP/yAkSNHxr9LS0vDyJEjsWDBAu45CxYsMBwPAGeccYbweMJdO5s5cuQIysrK0KBBg6DETHnctvOjjz6KJk2a4LrrrkuEmCmPm3b++OOPMXjwYIwdOxZNmzZFz5498eSTTyISiSRK7JTDTTsPGTIEP/zwQ9wVtWHDBnz22Wc488wzEyJzTSFZ82C132jSLXv37kUkEkHTpk0N3zdt2hSrVq3inrNr1y7u8bt27QpMzlTHTTubufvuu1FQUGB5gIgq3LTzt99+i3/84x9YtmxZAiSsHrhp5w0bNuCrr77C5Zdfjs8++wzr1q3DTTfdhLKyMjz00EOJEDvlcNPOv/3tb7F3716ceOKJ0HUd5eXluPHGG/HnP/85ESLXGETzYFFREY4ePYpatWoFUi9ZZoiU5qmnnsLkyZMxZcoU5OTkJFucasOhQ4dw5ZVX4rXXXkOjRo2SLU61JhqNokmTJvj73/+O4447Dpdccgnuu+8+TJo0KdmiVSvmzJmDJ598Ei+//DKWLFmCDz/8ENOmTcNjjz2WbNEIHyDLjIBGjRohPT0du3fvNny/e/duNGvWjHtOs2bNlI4n3LVzjGeffRZPPfUUZs2ahd69ewcpZsqj2s7r16/Hpk2bMGbMmPh30WgUAJCRkYHVq1ejQ4cOwQqdgrjpz82bN0dmZibS09Pj33Xr1g27du1CaWkpsrKyApU5FXHTzg888ACuvPJK/N///R8AoFevXiguLsb111+P++67D2lp9G7vB6J5sG7duoFZZQCyzAjJysrCcccdhy+//DL+XTQaxZdffonBgwdzzxk8eLDheAD44osvhMcT7toZACZMmIDHHnsM06dPx/HHH58IUVMa1Xbu2rUrli9fjmXLlsX/nXPOORgxYgSWLVuGVq1aJVL8lMFNfx46dCjWrVsXVxYBYM2aNWjevDkpMgLctPORI0csCktMgdRpi0LfSNo8GGh4cYozefJkPTs7W3/rrbf0FStW6Ndff71er149fdeuXbqu6/qVV16p33PPPfHj582bp2dkZOjPPvusvnLlSv2hhx6ipdkSqLbzU089pWdlZen//e9/9Z07d8b/HTp0KFmXkBKotrMZWs0kh2o7b9myRc/Ly9NvvvlmffXq1fqnn36qN2nSRH/88ceTdQkpgWo7P/TQQ3peXp7+/vvv6xs2bNBnzpypd+jQQb/44ouTdQkpwaFDh/SlS5fqS5cu1QHozz33nL506VJ98+bNuq7r+j333KNfeeWV8eNjS7PvvPNOfeXKlfrEiRNpaXYYeOmll/TWrVvrWVlZ+sCBA/Xvvvsu/tuwYcP0q666ynD8Bx98oHfu3FnPysrSe/TooU+bNi3BEqcmKu3cpk0bHYDl30MPPZR4wVMM1f7MQsqMPKrtPH/+fH3QoEF6dna23r59e/2JJ57Qy8vLEyx16qHSzmVlZfrDDz+sd+jQQc/JydFbtWql33TTTfqBAwcSL3gKMXv2bO54G2vbq666Sh82bJjlnL59++pZWVl6+/bt9TfffDNwOTVdJ/saQRAEQRCpC8XMEARBEASR0pAyQxAEQRBESkPKDEEQBEEQKQ0pMwRBEARBpDSkzBAEQRAEkdKQMkMQBEEQREpDygxBEARBECkNKTMEQRAEQaQ0pMwQBOErc+bMgaZpOHjwYMLr1jQNmqahXr16gdYzfPjweF3Lli0LtC6CIJwhZYYgCNcMHz4ct956q+G7IUOGYOfOncjPz0+KTG+++SbWrFkTaB0ffvghFi1aFGgdBEHIk5FsAQiCqF5kZWWhWbNmSau/Xr16aNKkSaB1NGjQAEVFRYHWQRCEPGSZIQjCFVdffTW+/vprvPDCC3GXy6ZNmyxuprfeegv16tXDp59+ii5duiA3NxcXXXQRjhw5grfffhtt27ZF/fr1ccsttyASicTLLykpwR133IEWLVqgdu3aGDRoEObMmaMs58MPP4y+ffvijTfeQOvWrVGnTh3cdNNNiEQimDBhApo1a4YmTZrgiSeeiJ+j6zoefvhhtG7dGtnZ2SgoKMAtt9zitckIgggIsswQBOGKF154AWvWrEHPnj3x6KOPAgAaN26MTZs2WY49cuQIXnzxRUyePBmHDh3CBRdcgPPPPx/16tXDZ599hg0bNuDCCy/E0KFDcckllwAAbr75ZqxYsQKTJ09GQUEBpkyZglGjRmH58uXo1KmTkqzr16/H559/junTp2P9+vW46KKLsGHDBnTu3Blff/015s+fj2uvvRYjR47EoEGD8L///Q9//etfMXnyZPTo0QO7du3Cjz/+6LnNCIIIBlJmCIJwRX5+PrKyspCbm+voViorK8Mrr7yCDh06AAAuuugi/POf/8Tu3btRp04ddO/eHSNGjMDs2bNxySWXYMuWLXjzzTexZcsWFBQUAADuuOMOTJ8+HW+++SaefPJJJVmj0SjeeOMN5OXlxetavXo1PvvsM6SlpaFLly54+umnMXv2bAwaNAhbtmxBs2bNMHLkSGRmZqJ169YYOHCgu4YiCCJwSJkhCCJwcnNz44oMADRt2hRt27ZFnTp1DN/t2bMHALB8+XJEIhF07tzZUE5JSQkaNmyoXH/btm2Rl5dnqCs9PR1paWmG72L1/+Y3v8Hzzz+P9u3bY9SoUTjzzDMxZswYZGTQkEkQYYSeTIIgAiczM9Pwt6Zp3O+i0SgA4PDhw0hPT8cPP/yA9PR0w3GsAhRU/a1atcLq1asxa9YsfPHFF7jpppvwzDPP4Ouvv7acRxBE8iFlhiAI12RlZRmCdv2iX79+iEQi2LNnD0466STfy5ehVq1aGDNmDMaMGYOxY8eia9euWL58Ofr3758UeQiCEEPKDEEQrmnbti0WLlyITZs2oU6dOmjQoIEv5Xbu3BmXX345fve73+Evf/kL+vXrh19//RVffvklevfujbPOOsuXekS89dZbiEQiGDRoEHJzc/Huu++iVq1aaNOmTaD1EgThDlqaTRCEa+644w6kp6eje/fuaNy4MbZs2eJb2W+++SZ+97vf4fbbb0eXLl1w3nnn4fvvv0fr1q19q0NEvXr18Nprr2Ho0KHo3bs3Zs2ahU8++cRVvA5BEMGj6bquJ1sIgiAIP9A0DVOmTMF5550XeF2bNm1Cu3btsHTpUvTt2zfw+giCEEOWGYIgqhWXXXYZWrZsGWgdo0ePRo8ePQKtgyAIecgyQxBEtWHdunUAgPT0dLRr1y6werZv346jR48CAFq3bo2srKzA6iIIwhlSZgiCIAiCSGnIzUQQBEEQREpDygxBEARBECkNKTMEQRAEQaQ0pMwQBEEQBJHSkDJDEARBEERKQ8oMQRAEQRApDSkzBEEQBEGkNKTMEARBEASR0vw/+Wxd515a1DIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "result[:].plot()" ] @@ -1523,7 +473,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/gettingstarted/index.rst b/docs/gettingstarted/index.rst index 1482949b..f3a6c72e 100644 --- a/docs/gettingstarted/index.rst +++ b/docs/gettingstarted/index.rst @@ -26,11 +26,11 @@ It specifically supports the five main steps of Overview -------- -The `h5rdmtoolbox` is organized in five sub-packages corresponding to main features, which are needed to achieve a -sustainable data lifecycle. The sub-packages are: - -Besides the wrapper, which uses the convention sub-package, all sub-packages are independent of each other and can be -developed and used separately. +The toolbox implements six modules corresponding to main features, which are needed to achieve a +sustainable data lifecycle. The module layout is shown below. The numbers reference to their main usage in the stages in +the data lifecycle above. The wrapper module implements the main interface between the user and the HDF5 file. It +extends the features of the underlying `h5py` library. Some of the features are implemented in other modules, hence the +wrapper module depends on the convention, database and linked data (ld) module. .. image:: ../_static/h5tbx_modules.svg diff --git a/docs/practical_examples/metadata4ing.ipynb b/docs/practical_examples/metadata4ing.ipynb index 58de96b0..f3e06421 100644 --- a/docs/practical_examples/metadata4ing.ipynb +++ b/docs/practical_examples/metadata4ing.ipynb @@ -66,8 +66,7 @@ "source": [ "with h5tbx.File() as h5:\n", " h5.create_group('metadata')\n", - " h5tbx.jsonld.to_hdf(h5.metadata, source='min_m4i_ex.jsonld')\n", - " # h5.dump(collapsed=False)" + " h5tbx.jsonld.to_hdf(h5.metadata, source='min_m4i_ex.jsonld')" ] }, { @@ -92,7 +91,6 @@ " h5.hdf_filename,\n", " format=\"ttl\",\n", " structural=False,\n", - " indent=2,\n", " context={\"@import\": \"https://w3id.org/nfdi4ing/metadata4ing/m4i_context.jsonld\"})\n", ")" ] diff --git a/docs/userguide/convention/examples/standard_name_convention.ipynb b/docs/userguide/convention/examples/standard_name_convention.ipynb index 4fdf9638..fb819794 100644 --- a/docs/userguide/convention/examples/standard_name_convention.ipynb +++ b/docs/userguide/convention/examples/standard_name_convention.ipynb @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "2ae9884b-2609-471a-ab4c-97e300ca804d", "metadata": {}, "outputs": [], @@ -74,24 +74,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "66808089-b59f-4dd2-86ab-a1c1904ebf44", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
  • StandardNameTable: (name: cf-standard-name-table.xml, version_number: 79, last_modified: 2022-03-19T15:25:54Z, institution: Centre for Environmental Data Analysis, contact: support@ceda.ac.uk, version: v79.0.0, url: https://cfconventions.org/Data/cf-standard-names/79/src/cf-standard-name-table.xml)
  • " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cf = StandardNameTable.from_web(\"https://cfconventions.org/Data/cf-standard-names/79/src/cf-standard-name-table.xml\",\n", " known_hash='4c29b5ad70f6416ad2c35981ca0f9cdebf8aab901de5b7e826a940cf06f9bae4')\n", @@ -108,80 +94,30 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "e5854f39-80ee-4992-9bd8-9c0324cec174", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
      \n", - "
    • \n", - " \n", - " \n", - "
        \n", - "
      • units : m/s
      • description : \"x\" indicates a vector component along the grid x-axis, positive with increasing x. Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name upward_air_velocity.).
      • \n", - "
      \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cf['x_wind']" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "ba9d882a-c00d-4ba4-a142-6542a57fdeff", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "m/s" - ], - "text/latex": [ - "$\\frac{\\mathrm{m}}{\\mathrm{s}}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cf['x_wind'].units" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "ddea8a72-2b32-430e-99e0-4afceaca8167", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\"x\" indicates a vector component along the grid x-axis, positive with increasing x. Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name upward_air_velocity.).'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cf['x_wind'].description" ] @@ -206,31 +142,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "920d862d-78c1-4399-b204-1f711a1e60da", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "A target folder was specified. Downloading file to this folder: C:\\Users\\matth\\AppData\\Local\\h5rdmtoolbox\\h5rdmtoolbox\\1.7.1\\standard_name_tables\n" - ] - }, - { - "data": { - "text/html": [ - "
  • StandardNameTable: (institution: Karlsruhe Institute of Technology, contact: https://orcid.org/0000-0001-8729-0482, valid_characters: ['^a-zA-Z0-9_'], pattern: ^[0-9 ].*, last_modified: 2023-07-18 09:05:38.112885+00:00, version: v4.1.0-alpha, zenodo_doi: 10428795)
  • " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt = StandardNameTable.from_zenodo(10428795)\n", "snt" @@ -246,73 +161,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "42ed6878-d4a1-450f-8ea5-e81311bd40c2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['absolute_pressure',\n", - " 'ambient_static_pressure',\n", - " 'ambient_temperature',\n", - " 'auxiliary_fan_rotational_speed',\n", - " 'blade_inlet_angle',\n", - " 'blade_inlet_diameter',\n", - " 'blade_number',\n", - " 'blade_outlet_angle',\n", - " 'blade_outlet_diameter',\n", - " 'coordinate',\n", - " 'density',\n", - " 'difference_of_total_pressure_to_static_pressure_between_across_fan',\n", - " 'difference_of_wall_static_pressure_across_fan',\n", - " 'difference_of_wall_static_pressure_across_orifice',\n", - " 'dynamic_pressure',\n", - " 'dynamic_viscosity',\n", - " 'fan_efficiency',\n", - " 'fan_flow_coefficient',\n", - " 'fan_inlet_area',\n", - " 'fan_outlet_area',\n", - " 'fan_power_coefficient',\n", - " 'fan_pressure_coefficient',\n", - " 'fan_rotational_speed',\n", - " 'fan_shaft_power',\n", - " 'fan_specific_speed',\n", - " 'fan_torque',\n", - " 'fan_volume_flow_rate',\n", - " 'impeller_diameter',\n", - " 'impeller_inlet_width',\n", - " 'impeller_outlet_width',\n", - " 'impeller_volume_flow_rate',\n", - " 'impeller_weight',\n", - " 'inner_diameter_of_orifice',\n", - " 'kinematic_viscosity',\n", - " 'mass_flow_rate',\n", - " 'outer_diameter_of_orifice',\n", - " 'pulse_delay',\n", - " 'relative_humidity',\n", - " 'static_pressure',\n", - " 'temperature',\n", - " 'time',\n", - " 'total_pressure',\n", - " 'turbulent_kinetic_energy',\n", - " 'velocity',\n", - " 'vorticity',\n", - " 'wall_static_pressure',\n", - " 'xx_reynolds_stress',\n", - " 'yx_reynolds_stress',\n", - " 'yy_reynolds_stress',\n", - " 'yz_reynolds_stress',\n", - " 'zx_reynolds_stress',\n", - " 'zy_reynolds_stress',\n", - " 'zz_reynolds_stress']" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt.names" ] @@ -327,406 +179,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "659bcfdd-7333-4f78-9ccc-c9d44b28d8b3", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    descriptionunitsvectoralias
    absolute_pressurePressure is force per unit area. Absolute air pressure is pressure deviation to a total vacuum.PaNaNNaN
    ambient_static_pressureStatic air pressure is the amount of pressure exerted by air that is not moving. Ambient static air pressure is the static air pressure of the surrounding air.PaNaNNaN
    ambient_temperatureAir temperature is the bulk temperature of the air, not the surface (skin) temperature. Ambient air temperature is the temperature of the surrounding air.KNaNNaN
    auxiliary_fan_rotational_speedNumber of revolutions of an auxiliary fan.1/sNaNNaN
    blade_inlet_angleAngle of blade at inlet.radNaNNaN
    blade_inlet_diameterThe inner diameter of the test fan (D1).mNaNNaN
    blade_numberThe blade number is the number of blades of the test fan.NaNNaN
    blade_outlet_angleAngle of blade at inlet.radNaNNaN
    blade_outlet_diameterThe outer diameter of the test fan (D2).mNaNNaN
    coordinateThe spatial coordinate.mTrueNaN
    densityAir density is defined as the mass of air divided by its volume.kg/m**3NaNNaN
    difference_of_total_pressure_to_static_pressure_between_across_fanThe difference of static pressure at fan outlet w.r.t. the total pressure upstream of the fan. The total pressure generally is not known at the fan inlet pipe but further upstream, e.g. in a settling chamber. The dataset must provide detailed information, e.g. referencing to the respective pressure measurement device containing the exact location in the setup.PaNaNdifference_of_total_pressure_to_static_pressure_between_fan_outlet_and_fan_inlet
    difference_of_wall_static_pressure_across_fanStatic air pressure is the amount of pressure exerted by air that is not moving. Difference of wall static air pressure across a fan is the difference between the static air pressure downstream (at fan_outlet) of the fan and the total air pressure upstream of the fan at the wall (at fan_inlet).PaNaNNaN
    difference_of_wall_static_pressure_across_orificeDiffernece of static air pressure across orifice to compute volume flow rate according to DIN EN ISO 5167.PaNaNNaN
    dynamic_pressureDynamic air pressure is a measure for kinetic energy per unit volume of moving air.PaNaNNaN
    dynamic_viscosityDynamic air viscosity indicates the resistance of air towards deformation under shear stress. (https://doi.org/10.1016/B978-0-08-096949-7.00020-0).Pa*sNaNNaN
    fan_efficiencyTotal fan efficiency as defined in (CAROLUS, Thomas. Ventilatoren-Aerodynamischer Entwurf, Schallvorhersage. Konstruktion, 2013, 2. Jg., p.5, eq.1.16).NaNNaN
    fan_flow_coefficientAir flow coefficient is a dimensionless number as defined in (CAROLUS, Thomas. Ventilatoren-Aerodynamischer Entwurf, Schallvorhersage. Konstruktion, 2013, 2. Jg., p.2, eq.1.3). The addition \"of_fan\" indicates that this coefficient applies to the deployed fan.NaNNaN
    fan_inlet_areaThe fan cross-sectional area at the location \"fan_inlet\" for fans with a casing. The position of the referred cross-sectional area is in the pipe upstream of the fan. The area is generally taken to compute the dynamic pressure at the inlet of the fan based on the volume flow rate.m**2NaNNaN
    fan_outlet_areaThe fan cross-sectional area at the location \"fan_outlet\" for fans with a casing. The position of the referred cross-sectional area is in the pipe downstream of the fan. The area is generally taken to compute the dynamic pressure at the outlet of the fan based on the volume flow rate.m**2NaNNaN
    fan_power_coefficientPower coefficient is a dimensionless number as defined in (CAROLUS, Thomas. Ventilatoren-Aerodynamischer Entwurf, Schallvorhersage. Konstruktion, 2013, 2. Jg., p.2, eq.1.5). The addition \"of_fan\" indicates that this coefficient applies for the deployed fan.NaNNaN
    fan_pressure_coefficientTotal pressure coefficient is a dimensionless number as defined in (CAROLUS, Thomas. Ventilatoren-Aerodynamischer Entwurf, Schallvorhersage. Konstruktion, 2013, 2. Jg., p.2, eq.1.4). The addition \"of_fan\" indicates that this coefficient applies for the deployed fan.NaNNaN
    fan_rotational_speedNumber of revolutions of the test fan.1/sNaNNaN
    fan_shaft_powerPower of fan drive shaft.WNaNNaN
    fan_specific_speedSpecific speed of the fan as defined in (CAROLUS, Thomas. Ventilatoren-Aerodynamischer Entwurf, Schallvorhersage. Konstruktion, 2013, 2. Jg., p.2, eq.1.6).NaNNaN
    fan_torqueThe torque acting on the impeller of the fan.NmNaNNaN
    fan_volume_flow_rateAir volume flow rate is the volume of air that passes a cross section per unit time. The volume flow rate of the fan is the volume flow entering and leaving the fan. Due to gaps between the impeller and the housing, the volume flow rate is lower than the volume flow rate through the impeller (see impeller_volume_flow_rate).m**3/sNaNNaN
    impeller_diameterThe diameter of the impeller of the test fan, also D3. For some fans D2 is equal to D3.mNaNNaN
    impeller_inlet_widthThe width of the impeller inlet.mNaNNaN
    impeller_outlet_widthThe width of the impeller outlet.mNaNNaN
    impeller_volume_flow_rateAir volume flow rate is the volume of air that passes a cross section per unit time. The volume flow rate of the impeller is the volume flow entering and leaving the impeller. Due to gaps between the impeller and the housing, this volume flow rate is higher than the volume flow rate through the fan (see fan_volume_flow_rate).m**3/sNaNNaN
    impeller_weightWeight of the impeller.kgNaNNaN
    inner_diameter_of_orificeInner diameter of an orifice.mNaNNaN
    kinematic_viscosityDynamic air viscosity indicates the resistance of air towards deformation under shear stress. Kinematic viscosity. Dynamic air viscosity divided by air denisity equals kinematic air viscosity. (https://doi.org/10.1016/B978-0-12-410461-7.00007-9).m**2/sNaNNaN
    mass_flow_rateAir mass flow rate is the mass of air that passes a certain cross sectiont per unit time.kg/sNaNNaN
    outer_diameter_of_orificeOuter diameter of an orifice.mNaNNaN
    pulse_delayTime between two laser pulses.sNaNNaN
    relative_humidityRelative humidity is a measure of the water vapor content of air.NaNNaN
    static_pressureStatic air pressure is the amount of pressure exerted by air that is not moving.PaNaNNaN
    temperatureAir temperature is the bulk temperature of the air, not the surface (skin) temperature. (CF Conventions).degCNaNNaN
    timeRecording time since start of experiment.sNaNNaN
    total_pressureThe sum of dynamic and static air pressure.PaNaNNaN
    turbulent_kinetic_energyThe kinetic energy per unit mass of a fluid.m**2/s**2NaNNaN
    velocityVelocity.m/sTrueNaN
    vorticityVorticity.1/sTrueNaN
    wall_static_pressureStatic air pressure is the amount of pressure exerted by air that is not moving. Wall static air pressure is the static air pressure at the wall.PaNaNNaN
    xx_reynolds_stressReynolds stress is a tensor quantity. \"xx\" indicates that the variations of x-velocity is used.m**2/s**2NaNNaN
    yx_reynolds_stressReynolds stress is a tensor quantity. \"yx\" indicates that the variations of x- and y-velocity are used.m**2/s**2NaNNaN
    yy_reynolds_stressReynolds stress is a tensor quantity. \"yy\" indicates that the variations of y-velocity is used.m**2/s**2NaNNaN
    yz_reynolds_stressReynolds stress is a tensor quantity. \"yz\" indicates that the variations of y- and z-velocity are used.m**2/s**2NaNNaN
    zx_reynolds_stressReynolds stress is a tensor quantity. \"zx\" indicates that the variations of z- and x-velocity are used.m**2/s**2NaNNaN
    zy_reynolds_stressReynolds stress is a tensor quantity. \"zy\" indicates that the variations of z- and y-velocity are used. in y-axis direction.m**2/s**2NaNNaN
    zz_reynolds_stressReynolds stress is a tensor quantity. \"zy\" indicates that the variations of z-velocity is used.m**2/s**2NaNNaN
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "snt.dump()" ] @@ -756,21 +212,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "05b349d9-a4ae-4ea0-bab6-84790489c0be", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "'x_velocity' in snt" ] @@ -785,21 +230,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "176f7fa3-342b-46eb-b1b1-495bcc862345", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt['velocity'].is_vector()" ] @@ -814,23 +248,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "aa4d2628-8004-4c4c-a995-4057108e0aa9", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'x': 'X indicates the x-axis component of the vector.',\n", - " 'y': 'Y indicates the y-axis component of the vector.',\n", - " 'z': 'Z indicates the z-axis component of the vector.'}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt.affixes['component'].values" ] @@ -845,32 +266,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "824bb0b3-bcb3-4261-904b-ca43ff12a097", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
      \n", - "
    • \n", - " \n", - " \n", - "
        \n", - "
      • units : m/s
      • description : Velocity. X indicates the x-axis component of the vector.
      • \n", - "
      \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt['x_velocity']" ] @@ -887,96 +286,30 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "8c04d645-d666-4c55-9247-bb2bdc80734a", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
      \n", - "
    • \n", - " \n", - " \n", - "
        \n", - "
      • units : 1/s
      • description : Derivative of x_velocity with respect to x_coordinate. Velocity. X indicates the x-axis component of the vector. The spatial coordinate. X indicates the x-axis component of the vector.
      • \n", - "
      \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt['derivative_of_x_velocity_wrt_x_coordinate']" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "1214cbb8-0ce9-4a06-bef3-c760f565fbba", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
      \n", - "
    • \n", - " \n", - " \n", - "
        \n", - "
      • units : Pa**2
      • description : Square of static_pressure. Static air pressure is the amount of pressure exerted by air that is not moving.
      • \n", - "
      \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt['square_of_static_pressure']" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "9e52b5c0-ef1b-45b0-a407-f21cf57725f7", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
      \n", - "
    • \n", - " \n", - " \n", - "
        \n", - "
      • units : Pa
      • description : Arithmetic mean of static_pressure. Static air pressure is the amount of pressure exerted by air that is not moving.
      • \n", - "
      \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt['arithmetic_mean_of_static_pressure']" ] @@ -993,21 +326,10 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "380c7cf8-5285-417f-9f98-5e3f13884e73", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Convention(\"standard name convention\")" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "zenodo_cv = h5tbx.convention.from_zenodo('https://zenodo.org/record/8357399')\n", "sn_cv = zenodo_cv.pop('contact', 'comment', 'references', 'data_type')\n", @@ -1028,18 +350,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "710cbde5-3c3f-4c68-8a7e-5492f2ee3e87", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The available (base) standard names are: ['coordinate', 'static_pressure', 'time', 'velocity']\n" - ] - } - ], + "outputs": [], "source": [ "with h5tbx.File() as h5:\n", " snt = h5.standard_name_table\n", @@ -1057,30 +371,10 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "9dc045e8-3c61-4cd8-ba4a-3e2d50df4558", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Available affixes: dict_keys(['device', 'location', 'reference_frame', 'component'])\n", - "\n", - "Values for the component prefix:\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "print('Available affixes: ', snt.affixes.keys())\n", "\n", @@ -1098,32 +392,10 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "f27c8aa3-c074-4b69-ae35-f29b43bde04b", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
      \n", - "
    • \n", - " \n", - " \n", - "
        \n", - "
      • units : m/s
      • description : Velocity refers to the change of position over time. Velocity is a vector quantity. X indicates the x-axis component of the vector.
      • \n", - "
      \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "snt['x_velocity']" ] @@ -1138,259 +410,10 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "9de466f1-a31c-4067-91a4-6562d1389ceb", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
    \n", - "\n", - "
      \n", - "
    • \n", - " \n", - " \n", - " \n", - "
      • standard_name_table: \"DOI\"
      • \n", - "
      \n", - "\n", - "
        \n", - " \n", - " \n", - " (3) [int32]\n", - "
        • standard_name: x_velocity
        • units: km/s
        • \n", - "
        \n", - "
      \n", - "
    • \n", - "
    \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "with h5tbx.File() as h5:\n", " h5.create_dataset('u', data=[1,2,3], standard_name='x_velocity', units='km/s')\n", @@ -1407,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "51075c5a-d8d0-41fa-9ab2-653e011dedd3", "metadata": {}, "outputs": [], @@ -1417,267 +440,10 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "3ee62f0a-aea6-429f-bcda-7329b2ef42c0", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
    \n", - "\n", - " \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "with h5tbx.File(mode='w') as h5:\n", " ds = h5.create_dataset('u', data=3)\n", @@ -1709,7 +475,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.15" } }, "nbformat": 4, diff --git a/docs/userguide/convention/ontologies.ipynb b/docs/userguide/convention/ontologies.ipynb index 30958c1f..22b52656 100644 --- a/docs/userguide/convention/ontologies.ipynb +++ b/docs/userguide/convention/ontologies.ipynb @@ -14,18 +14,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "5815196c-e3be-44d8-a1f8-07e563ce7dc2", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Failed to import module h5tbx\n" - ] - } - ], + "outputs": [], "source": [ "import h5rdmtoolbox as h5tbx" ] @@ -40,289 +32,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "01fcc4c6-c564-4094-a4d4-bf4a9985c477", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
    \n", - "\n", - " \n", - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "with h5tbx.File(mode='w') as h5:\n", " h5.create_dataset('test_dataset', shape=(3, ))\n", @@ -347,91 +60,16 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "0e2765c8-79ec-4116-96cb-55ffca7d8ddc", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"@context\": {\n", - " \"hdf5\": \"http://purl.allotrope.org/ontologies/hdf5/1.8#\",\n", - " \"m4i\": \"http://w3id.org/nfdi4ing/metadata4ing#\",\n", - " \"schema\": \"http://schema.org/\",\n", - " \"ssno\": \"https://matthiasprobst.github.io/ssno/#\"\n", - " },\n", - " \"@graph\": [\n", - " {\n", - " \"@id\": \"_:N1\",\n", - " \"@type\": \"hdf5:File\",\n", - " \"hdf5:rootGroup\": {\n", - " \"@id\": \"_:N0\",\n", - " \"@type\": \"hdf5:Group\",\n", - " \"hdf5:member\": [\n", - " {\n", - " \"@id\": \"_:N2\",\n", - " \"@type\": \"hdf5:Group\",\n", - " \"hdf5:member\": {\n", - " \"@id\": \"_:N3\",\n", - " \"@type\": \"hdf5:Group\",\n", - " \"hdf5:member\": {\n", - " \"@id\": \"_:N4\",\n", - " \"@type\": \"hdf5:Dataset\",\n", - " \"hdf5:attribute\": [\n", - " {\n", - " \"@id\": \"_:N5\",\n", - " \"@type\": \"hdf5:Attribute\",\n", - " \"hdf5:name\": \"standard_name\",\n", - " \"hdf5:value\": \"blade_diameter3\"\n", - " },\n", - " {\n", - " \"@id\": \"_:N6\",\n", - " \"@type\": \"hdf5:Attribute\",\n", - " \"hdf5:name\": \"units\",\n", - " \"hdf5:value\": \"mm\"\n", - " }\n", - " ],\n", - " \"hdf5:datatype\": \"H5T_INTEGER\",\n", - " \"hdf5:dimension\": 0,\n", - " \"hdf5:name\": \"/grp/Fan/D3\",\n", - " \"hdf5:size\": 1,\n", - " \"hdf5:value\": {\n", - " \"@id\": \"https://qudt.org/vocab/unit/MilliM\"\n", - " },\n", - " \"m4i:hasUnits\": {\n", - " \"@id\": \"https://qudt.org/vocab/unit/MilliM\"\n", - " },\n", - " \"ssno:standard_name\": \"blade_diameter3\"\n", - " },\n", - " \"hdf5:name\": \"/grp/Fan\"\n", - " },\n", - " \"hdf5:name\": \"/grp\"\n", - " },\n", - " {\n", - " \"@id\": \"_:N7\",\n", - " \"@type\": \"hdf5:Dataset\",\n", - " \"hdf5:datatype\": \"H5T_FLOAT\",\n", - " \"hdf5:dimension\": 1,\n", - " \"hdf5:name\": \"/test_dataset\",\n", - " \"hdf5:size\": 3\n", - " }\n", - " ],\n", - " \"hdf5:name\": \"/\"\n", - " }\n", - " }\n", - " ]\n", - "}\n" - ] - } - ], + "outputs": [], "source": [ - "print(h5tbx.jsonld.dumps(h5.hdf_filename,\n", - " indent=2,\n", - " context={'schema': 'http://schema.org/',\n", - " \"ssno\": \"https://matthiasprobst.github.io/ssno/#\",\n", - " \"m4i\": \"http://w3id.org/nfdi4ing/metadata4ing#\"}))" + "print(h5tbx.serialize(h5.hdf_filename,\n", + " indent=2,\n", + " context={'schema': 'http://schema.org/',\n", + " \"ssno\": \"https://matthiasprobst.github.io/ssno/#\",\n", + " \"m4i\": \"http://w3id.org/nfdi4ing/metadata4ing#\"}))" ] }, { @@ -446,18 +84,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "a36d5ec7-e7e5-4ead-9401-be05cf94552a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\"@context\": {\"hdf5\": \"http://purl.allotrope.org/ontologies/hdf5/1.8#\", \"units\": \"http://w3id.org/nfdi4ing/metadata4ing#hasUnits\"}, \"@graph\": [{\"@id\": \"_:N9\", \"@type\": \"hdf5:File\", \"hdf5:rootGroup\": {\"@id\": \"_:N8\", \"@type\": \"hdf5:Group\", \"hdf5:member\": [{\"@id\": \"_:N10\", \"@type\": \"hdf5:Group\", \"hdf5:member\": {\"@id\": \"_:N11\", \"@type\": \"hdf5:Group\", \"hdf5:member\": {\"@id\": \"_:N12\", \"@type\": \"hdf5:Dataset\", \"hdf5:attribute\": [{\"@id\": \"_:N13\", \"@type\": \"hdf5:Attribute\", \"hdf5:name\": \"standard_name\", \"hdf5:value\": \"blade_diameter3\"}, {\"@id\": \"_:N14\", \"@type\": \"hdf5:Attribute\", \"hdf5:name\": \"units\", \"hdf5:value\": \"mm\"}], \"hdf5:datatype\": \"H5T_INTEGER\", \"hdf5:dimension\": 0, \"hdf5:name\": \"/grp/Fan/D3\", \"hdf5:size\": 1, \"hdf5:value\": {\"@id\": \"https://qudt.org/vocab/unit/MilliM\"}, \"https://matthiasprobst.github.io/ssno/#standard_name\": \"blade_diameter3\", \"units\": {\"@id\": \"https://qudt.org/vocab/unit/MilliM\"}}, \"hdf5:name\": \"/grp/Fan\"}, \"hdf5:name\": \"/grp\"}, {\"@id\": \"_:N15\", \"@type\": \"hdf5:Dataset\", \"hdf5:datatype\": \"H5T_FLOAT\", \"hdf5:dimension\": 1, \"hdf5:name\": \"/test_dataset\", \"hdf5:size\": 3}], \"hdf5:name\": \"/\"}}]}\n" - ] - } - ], + "outputs": [], "source": [ "hdf_jsonld = h5tbx.dump_jsonld(h5.hdf_filename, skipND=None)\n", "print(hdf_jsonld)" @@ -475,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "254527e3-6229-4887-9666-9dc3921aab58", "metadata": {}, "outputs": [], @@ -494,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "177fe328-d61e-444c-9b2e-d4678142bff2", "metadata": {}, "outputs": [], @@ -507,19 +137,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "1a066906-ac07-4b45-b1aa-2babbf1a4522", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{rdflib.term.Variable('ds_name'): rdflib.term.Literal('/grp/Fan/D3'), rdflib.term.Variable('ds_size'): rdflib.term.Literal('1', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer'))}\n", - "{rdflib.term.Variable('ds_name'): rdflib.term.Literal('/test_dataset'), rdflib.term.Variable('ds_size'): rdflib.term.Literal('3', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer'))}\n" - ] - } - ], + "outputs": [], "source": [ "for b in results.bindings:\n", " print(b)" @@ -527,61 +148,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "16d0a2b3-74c6-4b52-9f59-014b8e2a3158", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    ds_nameds_size
    0/grp/Fan/D31
    1/test_dataset3
    \n", - "
    " - ], - "text/plain": [ - " ds_name ds_size\n", - "0 /grp/Fan/D3 1\n", - "1 /test_dataset 3" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# convert results to dataframe:\n", "import pandas as pd\n", @@ -614,7 +184,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.18" + "version": "3.10.15" } }, "nbformat": 4, diff --git a/docs/userguide/database/firstSteps.ipynb b/docs/userguide/database/firstSteps.ipynb index 85906d97..0f0eb436 100644 --- a/docs/userguide/database/firstSteps.ipynb +++ b/docs/userguide/database/firstSteps.ipynb @@ -46,13 +46,13 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "4d4c6cd6-6262-4abe-af1d-adec503a9b84", "metadata": {}, "outputs": [], "source": [ "from typing import List\n", - "from h5rdmtoolbox.wrapper.lazy import LHDFObject\n", + "from h5rdmtoolbox.database.lazy import LHDFObject\n", "\n", "class MyDBInterface(HDF5DBInterface):\n", "\n", @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "f52f38e7-2bb7-402c-bea0-627598671901", "metadata": {}, "outputs": [], @@ -124,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "b131f615-1ebb-43f8-9d4c-bf3c73591060", "metadata": {}, "outputs": [], @@ -149,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "74cc251f-23ca-4f86-b0f9-7f57f7dbd139", "metadata": {}, "outputs": [ @@ -186,13 +186,14 @@ " --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n", "}\n", "\n", - "html[theme=dark],\n", - "body[data-theme=dark],\n", + "html[theme=\"dark\"],\n", + "html[data-theme=\"dark\"],\n", + "body[data-theme=\"dark\"],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", " --xr-font-color3: rgba(255, 255, 255, 0.38);\n", - " --xr-border-color: #1F1F1F;\n", + " --xr-border-color: #1f1f1f;\n", " --xr-disabled-color: #515151;\n", " --xr-background-color: #111111;\n", " --xr-background-color-row-even: #111111;\n", @@ -237,7 +238,7 @@ ".xr-sections {\n", " padding-left: 0 !important;\n", " display: grid;\n", - " grid-template-columns: 150px auto auto 1fr 20px 20px;\n", + " grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n", "}\n", "\n", ".xr-section-item {\n", @@ -245,7 +246,9 @@ "}\n", "\n", ".xr-section-item input {\n", - " display: none;\n", + " display: inline-block;\n", + " opacity: 0;\n", + " height: 0;\n", "}\n", "\n", ".xr-section-item input + label {\n", @@ -257,6 +260,10 @@ " color: var(--xr-font-color2);\n", "}\n", "\n", + ".xr-section-item input:focus + label {\n", + " border: 2px solid var(--xr-font-color0);\n", + "}\n", + "\n", ".xr-section-item input:enabled + label:hover {\n", " color: var(--xr-font-color0);\n", "}\n", @@ -278,7 +285,7 @@ "\n", ".xr-section-summary-in + label:before {\n", " display: inline-block;\n", - " content: '►';\n", + " content: \"►\";\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", @@ -289,7 +296,7 @@ "}\n", "\n", ".xr-section-summary-in:checked + label:before {\n", - " content: '▼';\n", + " content: \"▼\";\n", "}\n", "\n", ".xr-section-summary-in:checked + label > span {\n", @@ -361,15 +368,15 @@ "}\n", "\n", ".xr-dim-list:before {\n", - " content: '(';\n", + " content: \"(\";\n", "}\n", "\n", ".xr-dim-list:after {\n", - " content: ')';\n", + " content: \")\";\n", "}\n", "\n", ".xr-dim-list li:not(:last-child):after {\n", - " content: ',';\n", + " content: \",\";\n", " padding-right: 5px;\n", "}\n", "\n", @@ -519,24 +526,24 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'my_dataset' (x: 4, y: 2)>\n",
    +       "
    <xarray.DataArray 'my_dataset' (x: 4, y: 2)> Size: 32B\n",
            "0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
            "Coordinates:\n",
    -       "  * x        (x) int32 1 2 3 4\n",
    -       "  * y        (y) int32 10 20
    • x
      (x)
      int32
      1 2 3 4
      array([1, 2, 3, 4])
    • y
      (y)
      int32
      10 20
      array([10, 20])
    • x
      PandasIndex
      PandasIndex(Index([1, 2, 3, 4], dtype='int32', name='x'))
    • y
      PandasIndex
      PandasIndex(Index([10, 20], dtype='int32', name='y'))
  • " ], "text/plain": [ - "\n", + " Size: 32B\n", "0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "Coordinates:\n", - " * x (x) int32 1 2 3 4\n", - " * y (y) int32 10 20" + " * x (x) int32 16B 1 2 3 4\n", + " * y (y) int32 8B 10 20" ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -564,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "3bfc43bf-f896-4a84-b3a2-ed7d7da6144c", "metadata": {}, "outputs": [ @@ -601,13 +608,14 @@ " --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n", "}\n", "\n", - "html[theme=dark],\n", - "body[data-theme=dark],\n", + "html[theme=\"dark\"],\n", + "html[data-theme=\"dark\"],\n", + "body[data-theme=\"dark\"],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", " --xr-font-color3: rgba(255, 255, 255, 0.38);\n", - " --xr-border-color: #1F1F1F;\n", + " --xr-border-color: #1f1f1f;\n", " --xr-disabled-color: #515151;\n", " --xr-background-color: #111111;\n", " --xr-background-color-row-even: #111111;\n", @@ -652,7 +660,7 @@ ".xr-sections {\n", " padding-left: 0 !important;\n", " display: grid;\n", - " grid-template-columns: 150px auto auto 1fr 20px 20px;\n", + " grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n", "}\n", "\n", ".xr-section-item {\n", @@ -660,7 +668,9 @@ "}\n", "\n", ".xr-section-item input {\n", - " display: none;\n", + " display: inline-block;\n", + " opacity: 0;\n", + " height: 0;\n", "}\n", "\n", ".xr-section-item input + label {\n", @@ -672,6 +682,10 @@ " color: var(--xr-font-color2);\n", "}\n", "\n", + ".xr-section-item input:focus + label {\n", + " border: 2px solid var(--xr-font-color0);\n", + "}\n", + "\n", ".xr-section-item input:enabled + label:hover {\n", " color: var(--xr-font-color0);\n", "}\n", @@ -693,7 +707,7 @@ "\n", ".xr-section-summary-in + label:before {\n", " display: inline-block;\n", - " content: '►';\n", + " content: \"►\";\n", " font-size: 11px;\n", " width: 15px;\n", " text-align: center;\n", @@ -704,7 +718,7 @@ "}\n", "\n", ".xr-section-summary-in:checked + label:before {\n", - " content: '▼';\n", + " content: \"▼\";\n", "}\n", "\n", ".xr-section-summary-in:checked + label > span {\n", @@ -776,15 +790,15 @@ "}\n", "\n", ".xr-dim-list:before {\n", - " content: '(';\n", + " content: \"(\";\n", "}\n", "\n", ".xr-dim-list:after {\n", - " content: ')';\n", + " content: \")\";\n", "}\n", "\n", ".xr-dim-list li:not(:last-child):after {\n", - " content: ',';\n", + " content: \",\";\n", " padding-right: 5px;\n", "}\n", "\n", @@ -934,21 +948,21 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'my_dataset' ()>\n",
    +       "
    <xarray.DataArray 'my_dataset' ()> Size: 4B\n",
            "0.0\n",
            "Coordinates:\n",
    -       "    x        int32 4\n",
    -       "    y        int32 20
    " + " x int32 4B 4\n", + " y int32 4B 20
    " ], "text/plain": [ - "\n", + " Size: 4B\n", "0.0\n", "Coordinates:\n", - " x int32 4\n", - " y int32 20" + " x int32 4B 4\n", + " y int32 4B 20" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -964,14 +978,6 @@ "source": [ "We can do the same thing with groups. It is just less useful because the datasets are usually of greater interest..." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3a15cd55-f6ef-4bb7-83f7-d45da38543d9", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -990,7 +996,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.19" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/userguide/database/hdfDB.ipynb b/docs/userguide/database/hdfDB.ipynb index 3c4eebfe..e869fa5a 100644 --- a/docs/userguide/database/hdfDB.ipynb +++ b/docs/userguide/database/hdfDB.ipynb @@ -886,7 +886,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.19" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/userguide/hdf_meta.jsonld b/docs/userguide/hdf_meta.jsonld new file mode 100644 index 00000000..8db00ac7 --- /dev/null +++ b/docs/userguide/hdf_meta.jsonld @@ -0,0 +1,148 @@ +{ + "@context": { + "foaf": "http://xmlns.com/foaf/0.1/", + "hdf5": "http://purl.allotrope.org/ontologies/hdf5/1.8#", + "m4i": "http://w3id.org/nfdi4ing/metadata4ing#", + "obo": "http://purl.obolibrary.org/obo/", + "schema": "https://schema.org/" + }, + "@graph": [ + { + "@id": "_:N986fc458487a43c682fddd5ccde742d4", + "@type": "hdf5:File", + "hdf5:rootGroup": { + "@id": "_:N858d8d94f6614db6ac2de18d3d2efc41", + "@type": "hdf5:Group", + "hdf5:member": [ + { + "@id": "https://orcid.org/0000-0001-8729-0482", + "@type": [ + "hdf5:Group", + "foaf:Person" + ], + "foaf:firstName": "Matthias", + "hdf5:attribute": [ + { + "@id": "_:N39f8cf4302734e1e8901ebe53e065201", + "@type": "hdf5:StringAttribute", + "hdf5:name": "first_name", + "hdf5:value": "Matthias" + }, + { + "@id": "_:Ne3daa513155d4a5ab63c0905e75b2651", + "@type": "hdf5:StringAttribute", + "hdf5:name": "orcid", + "hdf5:value": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://orcid.org/0000-0001-8729-0482" + } + } + ], + "hdf5:name": "/contact", + "m4i:orcidId": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://orcid.org/0000-0001-8729-0482" + } + }, + { + "@id": "_:Nc1a567f3a0ad492bbfa0c1452bf027d6", + "@type": "hdf5:Group", + "hdf5:member": { + "@id": "_:Nfeaf3dc5a5944ac7bdfc8984af65f67d", + "@type": "hdf5:Dataset", + "hdf5:attribute": [ + { + "@id": "_:N6c40e46a1f2348c692f25fb20b9e66ff", + "@type": "hdf5:StringAttribute", + "hdf5:name": "quantity_kind", + "hdf5:value": [ + "velocity", + { + "@id": "http://qudt.org/vocab/quantitykind/Velocity", + "http://www.w3.org/2004/02/skos/core#prefLabel": "velocity" + } + ] + }, + { + "@id": "_:N6c31876bd9e24fc58fc67772053eaa16", + "@type": "hdf5:StringAttribute", + "hdf5:name": "units", + "hdf5:value": [ + "m/s", + { + "@id": "http://qudt.org/vocab/unit/M-PER-SEC", + "http://www.w3.org/2004/02/skos/core#prefLabel": "m/s" + } + ] + } + ], + "hdf5:dataspace": { + "@id": "_:N3f09fbe2f62843e8b7b3865ecb01015b", + "@type": "hdf5:SimpleDataspace", + "hdf5:dimension": { + "@id": "_:N40a41446b172490096b659c69983c7c2", + "@type": "hdf5:DataspaceDimension", + "hdf5:dimensionIndex": 0, + "hdf5:size": 100 + } + }, + "hdf5:datatype": [ + { + "@id": "hdf5:H5T_IEEE_F64LE", + "@type": "hdf5:Datatype" + }, + "H5T_FLOAT" + ], + "hdf5:name": "/grp/random_velocity", + "hdf5:rank": 1, + "hdf5:size": 100, + "hdf5:value": "[0.060814996532972954, 0.9585238612187142, 0.8613509482569932, 0.8991982969136197, 0.5514935220415705, 0.584846600316924, 0.5797494757640376, 0.8830300774335306, 0.018818651570906564, 0.5950733660962788, 0.8089302325777902, 0.4804668343991355, 0.7533115662906964, 0.5499251031799645, 0.0003852870884195614, 0.6248465144362986, 0.846797278527271, 0.9030496758954888, 0.6898959990193593, 0.9169479931639165, 0.7873980115189645, 0.6028753833186401, 0.8994867614012113, 0.4974676676908024, 0.2074810727604155, 0.6174881086469756, 0.6243782300263855, 0.3300984169134369, 0.10660883592109993, 0.4164684674321274, 0.5126757191435488, 0.6766099502590829, 0.14402959565846685, 0.23912439607730163, 0.5755693339844662, 0.12587357258261533, 0.13290628468476684, 0.6213757147998229, 0.8454869682094377, 0.29029930788692393, 0.7946861048281364, 0.8424306457928226, 0.48031977249724433, 0.7726648892074323, 0.42201274503086406, 0.13260034136691767, 0.16692354725850145, 0.27328340132568374, 0.20146454886434695, 0.22171362247006365, 0.12499970479717071, 0.7728815745388377, 0.8859561980515973, 0.7597146458045355, 0.1307989139953799, 0.7106824547958263, 0.20257802231245947, 0.7176783508970496, 0.8626697776776682, 0.45049459927612423, 0.7750319539770164, 0.11663812399749662, 0.45771867950619116, 0.047122394731270556, 0.6917169737208596, 0.6612816253966625, 0.7229592990392741, 0.5810108398848042, 0.3652453368620441, 0.16307353345996645, 0.4210923678007663, 0.8756045829661702, 0.9935602594542187, 0.37911253341210727, 0.30571758377563263, 0.4762417611972507, 0.9492683273176848, 0.7974124372511895, 0.43028207662836704, 0.017391785822457373, 0.28686873550886804, 0.06962279089234913, 0.47550126868516984, 0.9789347473445891, 0.2521255875685061, 0.7472417291573814, 0.4007642649516756, 0.38449109047003716, 0.8673443441904756, 0.940024466645289, 0.42440106338275496, 0.44785335602162, 0.3771981696298232, 0.07119074950459969, 0.932308164635076, 0.9289377719249592, 0.37218111938818554, 0.8101930159792626, 0.29756968302240294, 0.15429778828962248]", + "m4i:hasKindOfQuantity": { + "@id": "http://qudt.org/vocab/quantitykind/Velocity" + }, + "m4i:hasUnit": { + "@id": "http://qudt.org/vocab/unit/M-PER-SEC" + } + }, + "hdf5:name": "/grp" + }, + { + "@id": "m4i:ProcessingStep", + "@type": "hdf5:Group", + "hdf5:attribute": [ + { + "@id": "_:N5e24f220216649e1917834e71cae93b6", + "@type": "hdf5:StringAttribute", + "hdf5:name": "end_time", + "hdf5:value": "2025-02-19T18:24:46.302767" + }, + { + "@id": "_:N45f14689eb6846fa89ff89d9aa1ee349", + "@type": "hdf5:StringAttribute", + "hdf5:name": "has_participants", + "hdf5:value": "/contact" + }, + { + "@id": "_:N4c0010d83ef7461eb98e13be4cdfeddd", + "@type": "hdf5:StringAttribute", + "hdf5:name": "output", + "hdf5:value": "/grp/random_velocity" + }, + { + "@id": "_:N43927f7490a440dba044ce510a289ecb", + "@type": "hdf5:StringAttribute", + "hdf5:name": "start_time", + "hdf5:value": "2025-02-19T18:24:46.302767" + } + ], + "hdf5:name": "/processing_info", + "obo:RO_0000057": "/contact", + "obo:RO_0002234": "/grp/random_velocity", + "schema:startTime": "2025-02-19T18:24:46.302767" + } + ], + "hdf5:name": "/" + } + } + ] +} \ No newline at end of file diff --git a/docs/userguide/wrapper/FAIRAttributes.ipynb b/docs/userguide/wrapper/FAIRAttributes.ipynb index 2bbbe980..4f4d5392 100644 --- a/docs/userguide/wrapper/FAIRAttributes.ipynb +++ b/docs/userguide/wrapper/FAIRAttributes.ipynb @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "23a5fa94-ace5-430d-ab79-185fa801f419", "metadata": {}, "outputs": [], @@ -58,12 +58,264 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "13fd9d3c-9597-4135-a55d-6b7262f8901a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
    \n", + "\n", + " \n", + "
    " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "with h5tbx.File(mode='w') as h5:\n", + "with h5tbx.File() as h5:\n", " grp = h5.create_group('contact', attrs=dict(orcid='https://orcid.org/0000-0001-8729-0482')) \n", " grp.rdf.predicate = 'https://schema.org/author'\n", " grp.rdf.type = 'http://xmlns.com/foaf/0.1/Person' # what the content of group is, namely a foaf:Person\n", @@ -102,10 +354,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "7e4fd3c0-110a-4e64-97ff-ad2832304493", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "@prefix dcterms: .\n", + "@prefix xsd: .\n", + "\n", + "[] dcterms:created \"20250225194958276047\"^^xsd:string .\n", + "\n", + "\n" + ] + } + ], "source": [ "from datetime import datetime\n", "\n", @@ -126,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "d6ae3bf0-24fe-4bb8-ab4e-1e9f3295248c", "metadata": {}, "outputs": [], @@ -145,10 +410,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "fd206fea-0b24-4c51-b22d-5ec8de9fc586", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "rdflib.term.URIRef('http://w3id.org/nfdi4ing/metadata4ing#orcidId')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "M4I.orcidId # equal to http://w3id.org/nfdi4ing/metadata4ing#orcidId" ] @@ -164,10 +440,281 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "43166d3f-b109-4f75-811f-f23bc5b01112", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
    \n", + "\n", + " \n", + "
    " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import numpy as np\n", "\n", @@ -195,7 +742,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "c17648b2-7a84-4486-8e73-613d05d03f97", "metadata": {}, "outputs": [], @@ -217,10 +764,292 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "c93e6b44-f6b7-4717-bbf2-e34143e9366a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
    \n", + "\n", + " \n", + "
    " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "h5tbx.dump(hdf_filename, collapsed=False)" ] @@ -230,18 +1059,18 @@ "id": "5086c824-8ace-4591-989b-153628752646", "metadata": {}, "source": [ - "### Example part 3: Assigning JSON-LD to describe data\n", + "### Example part 3: Associating an entity\n", "\n", "Until now, we used IRIs to assign meaning to HDF5 attributes, e.g. `proc.rdf.subject = M4I.ProcessingStep`.\n", "\n", - "Sometimes, data cannot be expressed by a single IRI, because there is no globally unique identifier. Let's examine this case by using the [SSNO](https://matthiasprobst.github.io/ssno/) Ontology.\n", + "Sometimes, data cannot be expressed by a single IRI, because there is no globally unique identifier. We might describe the object by an entity with its properties.\n", "\n", "In the example below, the attribute \"standard_name\" of the dataset \"u\" refers to \"x_velocity\" being the [Standard name](https://matthiasprobst.github.io/ssno#StandardName) of the HDF5 dataset \"u\". A Standard name has a name, description and SI unit and may be associated to a Standard Name Table in which it is listed. In our case, the Standard name \"x_velocity\" has no globally unique identifier, hence we need to describe it by a JOSN-LD string:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "0527f333-a685-44f4-bb2c-0a55e48b2b20", "metadata": {}, "outputs": [], @@ -257,12 +1086,277 @@ "}\"\"\"" ] }, + { + "cell_type": "markdown", + "id": "edc9565a-2848-4f66-ad4d-c1ef0e024406", + "metadata": {}, + "source": [ + "Let's assign this entity to the attribute \"standard_name\". Note, that when dumping the data, the \"LD\"-icon appears (linked data):" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "id": "5ca5e71e-e0f4-4142-990b-083ce09b4b16", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "with h5tbx.File() as h5:\n", " h5.create_dataset(\"u\", data=[1,2,3], attrs={\"standard_name\": \"x_velocity\"})\n", @@ -270,7 +1364,8 @@ " # h5.u.rdf[\"standard_name\"].object = sn_xvel\n", " h5.u.rdf[\"standard_name\"].object = sn_xvel\n", " h5.dump(False)\n", - " h5jld = h5.dump_jsonld(indent=2, structural=False)" + " \n", + " serialization = h5.serialize(fmt=\"ttl\", structural=False)" ] }, { @@ -283,12 +1378,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "id": "5d4e53c0-2348-403a-93e0-21e055463292", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "@prefix ssno: .\n", + "\n", + "[] a ssno:Person ;\n", + " ssno:hasStandardName [ a ssno:StandardName ;\n", + " ssno:description \"X-component of a velocity vector.\" ;\n", + " ssno:standardName \"x_velocity\" ;\n", + " ssno:unit \"http://qudt.org/vocab/unit/M-PER-SEC\" ] .\n", + "\n", + "\n" + ] + } + ], "source": [ - "print(h5jld)" + "print(serialization)" ] }, { @@ -316,10 +1427,292 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "18cb9b55-768b-4331-a42f-89bad556abed", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
    \n", + "\n", + " \n", + "
    " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "h5tbx.dump(hdf_filename, collapsed=False)" ] @@ -338,10 +1731,83 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "ec944a41-6988-4c1a-9caf-da12eb4856ad", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "@prefix foaf: .\n", + "@prefix hdf: .\n", + "@prefix m4i: .\n", + "@prefix ns1: .\n", + "@prefix schema: .\n", + "@prefix xsd: .\n", + "\n", + "m4i:ProcessingStep ns1:RO_0000057 \"/contact\"^^xsd:string ;\n", + " ns1:RO_0002234 \"/grp/random_velocity\"^^xsd:string ;\n", + " schema:startTime \"2025-02-25T19:49:58.574452\"^^xsd:string .\n", + "\n", + " a foaf:Person ;\n", + " m4i:orcidId \"https://orcid.org/0000-0001-8729-0482\"^^xsd:string ;\n", + " foaf:firstName \"Matthias\"^^xsd:string .\n", + "\n", + "hdf:H5T_IEEE_F64LE a hdf:Datatype .\n", + "\n", + "[] a hdf:File ;\n", + " hdf:rootGroup [ a hdf:Group ;\n", + " hdf:member [ a hdf:Group ;\n", + " hdf:attribute [ a hdf:StringAttribute ;\n", + " hdf:data \"/contact\"^^xsd:string ;\n", + " hdf:name \"has_participants\" ],\n", + " [ a hdf:StringAttribute ;\n", + " hdf:data \"2025-02-25T19:49:58.574452\"^^xsd:string ;\n", + " hdf:name \"end_time\" ],\n", + " [ a hdf:StringAttribute ;\n", + " hdf:data \"/grp/random_velocity\"^^xsd:string ;\n", + " hdf:name \"output\" ],\n", + " [ a hdf:StringAttribute ;\n", + " hdf:data \"2025-02-25T19:49:58.574452\"^^xsd:string ;\n", + " hdf:name \"start_time\" ] ;\n", + " hdf:name \"/processing_info\"^^xsd:string ],\n", + " [ a hdf:Group ;\n", + " hdf:member [ a hdf:Dataset ;\n", + " hdf:attribute [ a hdf:StringAttribute ;\n", + " hdf:data \"velocity\"^^xsd:string ;\n", + " hdf:name \"quantity_kind\" ],\n", + " [ a hdf:StringAttribute ;\n", + " hdf:data \"m/s\"^^xsd:string ;\n", + " hdf:name \"units\" ] ;\n", + " hdf:dataspace [ a hdf:SimpleDataspace ;\n", + " hdf:dimension [ a hdf:DataspaceDimension ;\n", + " hdf:dimensionIndex 0 ;\n", + " hdf:size 100 ] ] ;\n", + " hdf:datatype hdf:H5T_IEEE_F64LE,\n", + " \"H5T_FLOAT\" ;\n", + " hdf:layout hdf:H5D_CONTIGUOUS ;\n", + " hdf:maximumSize 100 ;\n", + " hdf:name \"/grp/random_velocity\" ;\n", + " hdf:rank 1 ;\n", + " hdf:size 100 ;\n", + " m4i:hasKindOfQuantity ;\n", + " m4i:hasUnit ] ;\n", + " hdf:name \"/grp\"^^xsd:string ],\n", + " [ a hdf:Group ;\n", + " hdf:attribute [ a hdf:StringAttribute ;\n", + " hdf:data \"Matthias\"^^xsd:string ;\n", + " hdf:name \"first_name\" ],\n", + " [ a hdf:StringAttribute ;\n", + " hdf:data \"https://orcid.org/0000-0001-8729-0482\"^^xsd:string ;\n", + " hdf:name \"orcid\" ] ;\n", + " hdf:name \"/contact\"^^xsd:string ] ;\n", + " hdf:name \"/\"^^xsd:string ] .\n", + "\n", + "\n" + ] + } + ], "source": [ "print(\n", " h5tbx.serialize(\n", @@ -367,7 +1833,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "77a35de3-b332-4e4f-b52d-324e9f02465c", "metadata": {}, "outputs": [], @@ -387,10 +1853,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "36af4e53-a34b-4140-9e26-7205183b776e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'https://orcid.org/0000-0001-8729-0482'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "person_iri" ] @@ -405,10 +1882,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "ac5daa0d-c51b-4331-b53b-db916005fc2a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'http://w3id.org/nfdi4ing/metadata4ing#orcidId'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "orcid_iri" ] @@ -423,10 +1911,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "59600274-baf3-42b8-8f82-da8fb705bd72", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + ")>" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import rdflib.graph as g\n", "\n", @@ -444,7 +1943,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "edd3ca6e-475c-4ef2-87f9-9794993dfe35", "metadata": {}, "outputs": [], @@ -463,7 +1962,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "091dcaf7-3c38-45d2-9bda-5e207f03bf17", "metadata": {}, "outputs": [], @@ -492,7 +1991,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "6bca4659-0d68-4965-9059-7ebafda010f3", "metadata": {}, "outputs": [], @@ -511,10 +2010,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "21788a70-ce78-4262-b7c4-553df8f85981", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-02-25_19:50:00,239 WARNING [utils.py:70] No hash given! This is recommended when downloading files from the web.\n" + ] + } + ], "source": [ "codemeta_url = 'https://raw.githubusercontent.com/matthiasprobst/h5RDMtoolbox/main/codemeta.json'\n", "dowloaded_filename = download_file(codemeta_url)" @@ -530,7 +2037,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "bb20c8fd-1075-4575-88da-c85e6af81a68", "metadata": {}, "outputs": [], @@ -540,10 +2047,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "654415a2-ea18-4d43-b692-f5db58f2a615", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'@context': {'applicationCategory': 'http://schema.org/applicationCategory',\n", + " 'author': 'http://schema.org/author',\n", + " 'codeRepository': 'http://schema.org/codeRepository',\n", + " 'description': 'http://schema.org/description',\n", + " 'license': 'http://schema.org/license',\n", + " 'name': 'http://schema.org/name',\n", + " 'operatingSystem': 'http://schema.org/operatingSystem',\n", + " 'programmingLanguage': 'http://schema.org/programmingLanguage',\n", + " 'version': 'http://schema.org/version'},\n", + " '@id': '_:Nce7ce9a44d3447e39263b2f9a511abd7',\n", + " '@type': 'http://schema.org/SoftwareSourceCode',\n", + " 'applicationCategory': 'file:///C:/Users/matth/AppData/Local/h5rdmtoolbox/h5rdmtoolbox/Cache/1.7.2/Engineering',\n", + " 'author': [{'@id': 'https://orcid.org/0000-0001-9560-500X',\n", + " '@type': 'http://schema.org/Person',\n", + " 'affiliation': {'@id': 'https://ror.org/04t3en479',\n", + " '@type': 'http://schema.org/Organization',\n", + " 'name': 'Karlsruhe Institute of Technology, '\n", + " 'Institute of Thermal Turbomachinery'},\n", + " 'familyName': 'Pritz',\n", + " 'givenName': 'Balazs'},\n", + " {'@id': 'https://orcid.org/0000-0002-4116-0065',\n", + " '@type': 'http://schema.org/Person',\n", + " 'affiliation': {'@id': 'https://ror.org/04t3en479',\n", + " '@type': 'http://schema.org/Organization',\n", + " 'name': 'Karlsruhe Institute of Technology, '\n", + " 'Institute of Thermal Turbomachinery'},\n", + " 'familyName': 'Büttner',\n", + " 'givenName': 'Lucas'},\n", + " {'@id': 'https://orcid.org/0000-0001-8729-0482',\n", + " '@type': 'http://schema.org/Person',\n", + " 'affiliation': {'@id': 'https://ror.org/04t3en479',\n", + " '@type': 'http://schema.org/Organization',\n", + " 'name': 'Karlsruhe Institute of Technology, '\n", + " 'Institute of Thermal Turbomachinery'},\n", + " 'email': 'matth.probst@gmail.com',\n", + " 'familyName': 'Probst',\n", + " 'givenName': 'Matthias'}],\n", + " 'codeRepository': 'git+/~https://github.com/matthiasprobst/h5RDMtoolbox.git',\n", + " 'description': 'Supporting a FAIR Research Data lifecycle using Python and '\n", + " 'HDF5.',\n", + " 'license': 'https://spdx.org/licenses/MIT',\n", + " 'name': 'h5RDMtoolbox',\n", + " 'operatingSystem': ['Linux', 'Windows', 'macOS'],\n", + " 'programmingLanguage': ['Python 3',\n", + " 'Python 3.8',\n", + " 'Python 3.9',\n", + " 'Python 3.10',\n", + " 'Python 3.11',\n", + " 'Python 3.12'],\n", + " 'version': '1.7.1'}\n" + ] + } + ], "source": [ "data = dquery(subject='schema:SoftwareSourceCode',\n", " source=dowloaded_filename,\n", @@ -561,7 +2125,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "7e43f95b-4afb-42cd-bf75-a7ee6536cdd3", "metadata": {}, "outputs": [], @@ -571,10 +2135,328 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "eed644e6-8ddd-4dc3-9eea-c83fa7825cf0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
    \n", + "\n", + " \n", + "
    " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "with h5tbx.File('test.hdf', 'w') as h5:\n", " jsonld.to_hdf(data=data[0],\n", @@ -584,7 +2466,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "cdcc299a-efb9-4d5a-be58-dcff2f34d064", "metadata": {}, "outputs": [], @@ -594,10 +2476,65 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "f99ff8c4-06b8-4a32-9875-52a982eef604", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "@prefix hdf: .\n", + "@prefix schema: .\n", + "@prefix xsd: .\n", + "\n", + "hdf:H5T_IEEE_F64LE a hdf:Datatype .\n", + "\n", + "hdf:H5T_INTEL_I32 a hdf:Datatype .\n", + "\n", + "hdf:scalarDataspace a hdf:scalarDataspace .\n", + "\n", + "[] a hdf:File ;\n", + " hdf:rootGroup [ a hdf:Group ;\n", + " hdf:attribute [ a hdf:StringAttribute ;\n", + " hdf:data \"test attr\"^^xsd:string ;\n", + " hdf:name \"name\" ] ;\n", + " hdf:member [ a hdf:Dataset ;\n", + " hdf:dataspace [ a hdf:SimpleDataspace ;\n", + " hdf:dimension [ a hdf:DataspaceDimension ;\n", + " hdf:dimensionIndex 1 ;\n", + " hdf:size 2 ],\n", + " [ a hdf:DataspaceDimension ;\n", + " hdf:dimensionIndex 0 ;\n", + " hdf:size 3 ] ] ;\n", + " hdf:datatype hdf:H5T_IEEE_F64LE,\n", + " \"H5T_FLOAT\" ;\n", + " hdf:layout hdf:H5D_CONTIGUOUS ;\n", + " hdf:maximumSize 6 ;\n", + " hdf:name \"/test_dataset\" ;\n", + " hdf:rank 2 ;\n", + " hdf:size 6 ],\n", + " [ a hdf:Group ;\n", + " hdf:member [ a hdf:Group ;\n", + " hdf:member [ a hdf:Dataset ;\n", + " hdf:dataspace hdf:scalarDataspace ;\n", + " hdf:datatype hdf:H5T_INTEL_I32,\n", + " \"H5T_INTEGER\" ;\n", + " hdf:layout hdf:H5D_CONTIGUOUS ;\n", + " hdf:maximumSize -1 ;\n", + " hdf:name \"/grp/subgrp/vel\" ;\n", + " hdf:rank 0 ;\n", + " hdf:size 1 ;\n", + " hdf:value \"4\" ] ;\n", + " hdf:name \"/grp/subgrp\"^^xsd:string ] ;\n", + " hdf:name \"/grp\"^^xsd:string ] ;\n", + " hdf:name \"/\"^^xsd:string ;\n", + " schema:name \"test attr\"^^xsd:string ] .\n", + "\n", + "\n" + ] + } + ], "source": [ "with h5tbx.File(mode='w') as h5:\n", " _ = h5.create_dataset('test_dataset', data=np.array([[1, 2], [3, 4], [5.4, 1.9]]))\n", @@ -620,10 +2557,262 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "648fb92a-7ba0-455a-9f92-8a6a959ec5b7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
    \n", + "\n", + "
      \n", + "
    • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      \n", + "\n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
        • fname
          \"D\"The first name of the contact
          : Matthias
        • type
          \"D\"The role of the Person
          : Contact
        • \n", + "
        \n", + "
      • \n", + "
      \n", + "
    • \n", + "
    \n", + "
    " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "with h5tbx.File() as h5:\n", " grp = h5.create_group('contact')\n", @@ -644,10 +2833,65 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "ee950caf-29cf-4c40-b12d-ef3ad109df45", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"@context\": {\n", + " \"hdf\": \"http://purl.allotrope.org/ontologies/hdf5/1.8#\",\n", + " \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n", + " },\n", + " \"@graph\": [\n", + " {\n", + " \"@id\": \"_:a53f285d89b495aea448056fccfccfb4\",\n", + " \"@type\": \"hdf:File\",\n", + " \"hdf:rootGroup\": {\n", + " \"@id\": \"_:eb2563610e01ff3f541ab79a199509f4\"\n", + " }\n", + " },\n", + " {\n", + " \"@id\": \"_:eb2563610e01ff3f541ab79a199509f4\",\n", + " \"@type\": \"hdf:Group\",\n", + " \"hdf:member\": {\n", + " \"@id\": \"_:c5adb24c3f6882922ba970da237cec8c\"\n", + " },\n", + " \"hdf:name\": \"/\"\n", + " },\n", + " {\n", + " \"@id\": \"_:c5adb24c3f6882922ba970da237cec8c\",\n", + " \"@type\": \"hdf:Group\",\n", + " \"hdf:attribute\": [\n", + " {\n", + " \"@id\": \"_:N320dfa044def4a3882f56f472fe4a285\"\n", + " },\n", + " {\n", + " \"@id\": \"_:Ne7d605222d97480fb2f04ed8f3bdf483\"\n", + " }\n", + " ],\n", + " \"hdf:name\": \"/contact\"\n", + " },\n", + " {\n", + " \"@id\": \"_:N320dfa044def4a3882f56f472fe4a285\",\n", + " \"@type\": \"hdf:StringAttribute\",\n", + " \"hdf:data\": \"Contact\",\n", + " \"hdf:name\": \"type\"\n", + " },\n", + " {\n", + " \"@id\": \"_:Ne7d605222d97480fb2f04ed8f3bdf483\",\n", + " \"@type\": \"hdf:StringAttribute\",\n", + " \"hdf:data\": \"Matthias\",\n", + " \"hdf:name\": \"fname\"\n", + " }\n", + " ]\n", + "}\n" + ] + } + ], "source": [ "print(jdict)" ] diff --git a/h5rdmtoolbox/__init__.py b/h5rdmtoolbox/__init__.py index 4a320ad6..0772e119 100644 --- a/h5rdmtoolbox/__init__.py +++ b/h5rdmtoolbox/__init__.py @@ -2,7 +2,6 @@ import logging import pathlib -import warnings from logging.handlers import RotatingFileHandler from typing import Optional, Dict @@ -49,9 +48,8 @@ from .wrapper.core import lower, Lower, File, Group, Dataset from . import errors from .wrapper import jsonld -from .wrapper.lazy import lazy +from .database.lazy import lazy from .wrapper.h5attr import Attribute -# from h5rdmtoolbox.wrapper.accessor import register_accessor import json from .wrapper.accessor import register_accessor @@ -126,52 +124,36 @@ def dumps(src: Union[str, File, pathlib.Path]): return h5.dumps() -from h5rdmtoolbox.wrapper.ld.hdf.file import get_ld as hdf_get_ld -from h5rdmtoolbox.wrapper.ld.user.file import get_ld as user_get_ld - - def get_ld( hdf_filename: Union[str, pathlib.Path], structural: bool = True, - semantic: bool = True, + contextual: bool = True, + skipND: int = 1, blank_node_iri_base: Optional[str] = None, **kwargs) -> rdflib.Graph: """Return the HDF file content as a rdflib.Graph object.""" - resolve_keys = kwargs.get("resolve_keys", None) - skipND = kwargs.get("skipND", None) - if resolve_keys is not None: - warnings.warn("resolve_keys is deprecated. Use context instead.", DeprecationWarning) - if skipND is not None: - warnings.warn("skipND is deprecated. Use context instead.", DeprecationWarning) - - graph = None - with File(hdf_filename) as h5: - if semantic and structural: - graph1 = user_get_ld(h5, blank_node_iri_base=blank_node_iri_base) - graph2 = hdf_get_ld(h5, blank_node_iri_base=blank_node_iri_base) - graph = graph1 + graph2 - else: - if structural: - graph = hdf_get_ld(hdf_filename, blank_node_iri_base=blank_node_iri_base) - - if semantic: - graph = user_get_ld(hdf_filename, blank_node_iri_base=blank_node_iri_base) - if graph is None: - raise ValueError("structural and semantic cannot be both False.") - return graph + from h5rdmtoolbox.ld import get_ld + return get_ld(hdf_filename, structural=structural, contextual=contextual, skipND=skipND, + blank_node_iri_base=blank_node_iri_base, **kwargs) def dump_jsonld( hdf_filename: Union[str, pathlib.Path], + skipND: int = 1, structural: bool = True, - semantic: bool = True, + contextual: bool = True, context: Optional[Dict] = None, blank_node_iri_base: Optional[str] = None, **kwargs): """Return the file content as a JSON-LD string.""" - from .wrapper.ld import optimize_context + from .ld import optimize_context context = context or {} - graph = get_ld(hdf_filename, structural, semantic, blank_node_iri_base, **kwargs) + graph = get_ld(hdf_filename, + structural=structural, + contextual=contextual, + blank_node_iri_base=blank_node_iri_base, + skipND=skipND, + **kwargs) context = optimize_context(graph, context) return graph.serialize(format="json-ld", indent=2, auto_compact=True, context=context) @@ -219,10 +201,10 @@ def dump_jsonld_depr(hdf_filename: Union[str, pathlib.Path], if not structural and not semantic: raise ValueError('At least one of structural or semantic must be True.') - from h5rdmtoolbox.wrapper.ld.hdf.file import get_serialized_ld + from h5rdmtoolbox.ld.hdf.file import get_serialized_ld if structural and not semantic: - return get_serialized_ld(hdf_filename, blank_node_iri_base, format="json-ld", context=context) - return get_serialized_ld(hdf_filename, blank_node_iri_base, format="json-ld", context=context) + return get_serialized_ld(hdf_filename, blank_node_iri_base, format="json-ld", context=context, skipND=skipND) + return get_serialized_ld(hdf_filename, blank_node_iri_base, format="json-ld", context=context, skipND=skipND) # with File(hdf_filename) as h5: # return jsonld.dumps( # h5, diff --git a/h5rdmtoolbox/_repr.py b/h5rdmtoolbox/_repr.py index 28822435..c32921ea 100644 --- a/h5rdmtoolbox/_repr.py +++ b/h5rdmtoolbox/_repr.py @@ -14,9 +14,9 @@ from numpy import ndarray from ontolutils import M4I -from h5rdmtoolbox.wrapper.rdf import (RDF_PREDICATE_ATTR_NAME, - RDF_OBJECT_ATTR_NAME, - RDF_TYPE_ATTR_NAME) +from h5rdmtoolbox.ld.rdf import (RDF_PREDICATE_ATTR_NAME, + RDF_OBJECT_ATTR_NAME, + RDF_TYPE_ATTR_NAME) from . import get_config, identifiers, protected_attributes H5PY_SPECIAL_ATTRIBUTES = ('DIMENSION_LIST', 'REFERENCE_LIST', 'NAME', 'CLASS', protected_attributes.COORDINATES) @@ -34,7 +34,7 @@ # else: DEF_ICON = "/~https://github.com/matthiasprobst/h5RDMtoolbox/blob/dev/h5rdmtoolbox/data/def_icon.png?raw=true" IRI_ICON = "/~https://github.com/matthiasprobst/h5RDMtoolbox/blob/dev/h5rdmtoolbox/data/iri_icon.png?raw=true" -JLD_ICON = "/~https://github.com/matthiasprobst/h5RDMtoolbox/blob/dev/h5rdmtoolbox/data/jld_icon.png?raw=true" +LD_ICON = "/~https://github.com/matthiasprobst/h5RDMtoolbox/blob/dev/h5rdmtoolbox/data/ld_icon.png?raw=true" ID_ICON = "/~https://github.com/matthiasprobst/h5RDMtoolbox/blob/dev/h5rdmtoolbox/data/id_icon.png?raw=true" TYPE_ICON = "/~https://github.com/matthiasprobst/h5RDMtoolbox/blob/dev/h5rdmtoolbox/data/type_icon.png?raw=true" @@ -183,7 +183,7 @@ def get_iri_icon_href(iri: str, # f'{thing_str}' if isinstance(iri, dict): return f' ' \ - f'JLD_ICON' \ + f'LD_ICON' \ f'

    {json.dumps(iri, indent=2)}

    ' return f' ' \ f'IRI_ICON' \ diff --git a/h5rdmtoolbox/cli.py b/h5rdmtoolbox/cli.py index e2e71c3e..37d7a9e4 100644 --- a/h5rdmtoolbox/cli.py +++ b/h5rdmtoolbox/cli.py @@ -1,5 +1,4 @@ import pathlib -from email.policy import default import click @@ -23,8 +22,9 @@ def h5tbx(fairify): ) @click.option("--format", type=str, help="The output format, e.g. jsonld.", default="ttl") -@click.option("--graph", is_flag=True, help="Generates a graph and stores it in OUTPUT-graph.html. Uses pyvis and kglab. " - "Please Make sure it is installed") +@click.option("--graph", is_flag=True, + help="Generates a graph and stores it in OUTPUT-graph.html. Uses pyvis and kglab. " + "Please Make sure it is installed") def ld(filename, output, format, graph): """Linked-Data command""" @@ -56,6 +56,5 @@ def _serialize(filename): build_pyvis_graph(filename, output_filename=filename.with_suffix("-graph.html")) - if __name__ == '__main__': h5tbx(obj={}) diff --git a/h5rdmtoolbox/convention/standard_names/h5interface.py b/h5rdmtoolbox/convention/standard_names/h5interface.py index e2b4b329..7258a706 100644 --- a/h5rdmtoolbox/convention/standard_names/h5interface.py +++ b/h5rdmtoolbox/convention/standard_names/h5interface.py @@ -134,7 +134,7 @@ def __init__(self, standard_dict): @classmethod def from_hdf(cls, hdf_filename, group='/', recursive: bool = False): """search withing a group. Note, that duplicate standard names are not considered""" - from ...wrapper.lazy import lazy + from ...database.lazy import lazy hdf_filename = pathlib.Path(hdf_filename) standard_datasets = {} with h5tbx.File(hdf_filename) as h5: diff --git a/h5rdmtoolbox/data/jld_icon.png b/h5rdmtoolbox/data/jld_icon.png deleted file mode 100644 index 03bcc1d0..00000000 Binary files a/h5rdmtoolbox/data/jld_icon.png and /dev/null differ diff --git a/h5rdmtoolbox/data/ld_icon.png b/h5rdmtoolbox/data/ld_icon.png new file mode 100644 index 00000000..46f9962b Binary files /dev/null and b/h5rdmtoolbox/data/ld_icon.png differ diff --git a/h5rdmtoolbox/data/jld_icon.svg b/h5rdmtoolbox/data/ld_icon.svg similarity index 92% rename from h5rdmtoolbox/data/jld_icon.svg rename to h5rdmtoolbox/data/ld_icon.svg index e8034f20..c3663f74 100644 --- a/h5rdmtoolbox/data/jld_icon.svg +++ b/h5rdmtoolbox/data/ld_icon.svg @@ -8,8 +8,8 @@ version="1.1" id="svg1" inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)" - sodipodi:docname="jld_icon.svg" - inkscape:export-filename="jld_icon.png" + sodipodi:docname="ld_icon.svg" + inkscape:export-filename="ld_icon.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" @@ -31,7 +31,7 @@ inkscape:cx="9.1793208" inkscape:cy="1.4511426" inkscape:window-width="1920" - inkscape:window-height="1009" + inkscape:window-height="1129" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" @@ -70,13 +70,13 @@ JLD + x="38.410328" + y="77.257126">LD diff --git a/h5rdmtoolbox/database/__init__.py b/h5rdmtoolbox/database/__init__.py index 231236d4..7e66b758 100644 --- a/h5rdmtoolbox/database/__init__.py +++ b/h5rdmtoolbox/database/__init__.py @@ -5,7 +5,6 @@ from .hdfdb import FileDB from .hdfdb import FilesDB, ObjDB from .interface import HDF5DBInterface -from ..wrapper import lazy def find(source, *args, **kwargs): @@ -71,20 +70,6 @@ def rdf_find(source, *, rdf_predicate=rdf_predicate, rdf_object=rdf_object, recursive=recursive) - # from .. import File - # from .lazy import lazy - # if isinstance(source, (str, pathlib.Path)): - # with File(source) as h5: - # return rdf_find(h5, rdf_subject=rdf_subject, - # rdf_type=rdf_type, - # rdf_predicate=rdf_predicate, - # rdf_object=rdf_object, - # recursive=recursive) - # return lazy(source.rdf.find(rdf_subject=rdf_subject, - # rdf_type=rdf_type, - # rdf_predicate=rdf_predicate, - # rdf_object=rdf_object, - # recursive=recursive)) -__all__ = ['lazy', 'FileDB', 'FilesDB', 'ObjDB', 'HDF5DBInterface'] +__all__ = ['FileDB', 'FilesDB', 'ObjDB', 'HDF5DBInterface'] diff --git a/h5rdmtoolbox/database/hdfdb/filedb.py b/h5rdmtoolbox/database/hdfdb/filedb.py index be7230c5..2f00599a 100644 --- a/h5rdmtoolbox/database/hdfdb/filedb.py +++ b/h5rdmtoolbox/database/hdfdb/filedb.py @@ -5,7 +5,7 @@ from .objdb import ObjDB from ..interface import HDF5DBInterface -from ...wrapper import lazy +from .. import lazy class FileDB(HDF5DBInterface): diff --git a/h5rdmtoolbox/database/hdfdb/objdb.py b/h5rdmtoolbox/database/hdfdb/objdb.py index e64b13b0..4fc44039 100644 --- a/h5rdmtoolbox/database/hdfdb/objdb.py +++ b/h5rdmtoolbox/database/hdfdb/objdb.py @@ -7,7 +7,7 @@ from . import query, utils from ..interface import HDF5DBInterface from ...protocols import LazyDataset, LazyGroup, LazyObject -from ...wrapper import lazy +from .. import lazy def basename(name: str) -> str: diff --git a/h5rdmtoolbox/database/interface.py b/h5rdmtoolbox/database/interface.py index cee7bd13..e2dbd089 100644 --- a/h5rdmtoolbox/database/interface.py +++ b/h5rdmtoolbox/database/interface.py @@ -3,7 +3,7 @@ import h5py -from ..wrapper.lazy import LHDFObject +from .lazy import LHDFObject class HDF5DBInterface(abc.ABC): diff --git a/h5rdmtoolbox/wrapper/lazy.py b/h5rdmtoolbox/database/lazy.py similarity index 100% rename from h5rdmtoolbox/wrapper/lazy.py rename to h5rdmtoolbox/database/lazy.py diff --git a/h5rdmtoolbox/database/mongo.py b/h5rdmtoolbox/database/mongo.py index b1762a70..a9cbe89d 100644 --- a/h5rdmtoolbox/database/mongo.py +++ b/h5rdmtoolbox/database/mongo.py @@ -11,7 +11,7 @@ from .interface import ExtHDF5DBInterface from .. import protected_attributes -from ..wrapper import lazy +from ..database import lazy def get_file_creation_time(filename: Union[str, pathlib.Path], tz=None) -> datetime: diff --git a/h5rdmtoolbox/dev.py b/h5rdmtoolbox/dev.py deleted file mode 100644 index e69de29b..00000000 diff --git a/h5rdmtoolbox/layout/core.py b/h5rdmtoolbox/layout/core.py index 9918e3ad..02764330 100644 --- a/h5rdmtoolbox/layout/core.py +++ b/h5rdmtoolbox/layout/core.py @@ -221,7 +221,7 @@ def __repr__(self): return f'{self.__class__.__name__}(kwargs={_kwargs})' def __call__(self, target: Union[h5py.Group, h5py.Dataset]): - if isinstance(target, h5tbx.wrapper.lazy.LHDFObject): + if isinstance(target, h5tbx.database.lazy.LHDFObject): with target as _target: return self.__call__(_target) diff --git a/h5rdmtoolbox/ld/__init__.py b/h5rdmtoolbox/ld/__init__.py new file mode 100644 index 00000000..4edad7a5 --- /dev/null +++ b/h5rdmtoolbox/ld/__init__.py @@ -0,0 +1,91 @@ +import pathlib +import warnings +from typing import Union, Optional + +import h5py +import rdflib + +from .hdf.file import get_ld as get_hdf_ld +from .user.file import get_ld as get_contextual_ld +from .utils import optimize_context + + +def get_ld( + hdf_filename: Union[str, pathlib.Path], + structural: bool = True, + contextual: bool = True, + blank_node_iri_base: Optional[str] = None, + **kwargs) -> rdflib.Graph: + """Return the HDF file content as a rdflib.Graph object.""" + resolve_keys = kwargs.get("resolve_keys", None) + semantic = kwargs.get("semantic", None) + skipND = kwargs.get("skipND", None) + if skipND is not None: + warnings.warn( + "skipND is deprecated and will be removed in v1.8.0. Instead 'serialize_0d_datasets' is introduced, which enables the serialization of numerical or string 0D datasets.", + DeprecationWarning) + serialize_0d_datasets: Optional[bool] = kwargs.get("serialize_0d_datasets", None) + if serialize_0d_datasets: + skipND = 1 + if resolve_keys is not None: + warnings.warn("resolve_keys has no effect anymore and is deprecated and will be removed in v1.8.0.", + DeprecationWarning) + if semantic is not None: + warnings.warn("semantic is deprecated and will be removed in v1.8.0. Use 'contextual' instead.", + DeprecationWarning) + contextual = semantic + + graph = None + with h5py.File(hdf_filename) as h5: + if contextual and structural: + graph1 = get_hdf_ld(h5, blank_node_iri_base=blank_node_iri_base, skipND=skipND) + graph2 = get_contextual_ld(h5, blank_node_iri_base=blank_node_iri_base) + graph = graph1 + graph2 + else: + if structural: + graph = get_hdf_ld(hdf_filename, blank_node_iri_base=blank_node_iri_base, skipND=skipND) + + if contextual: + graph = get_contextual_ld(hdf_filename, blank_node_iri_base=blank_node_iri_base) + if graph is None: + raise ValueError("structural and semantic cannot be both False.") + return graph + + +def hdf2jsonld( + filename: Union[str, pathlib.Path], + metadata_filename: Optional[Union[str, pathlib.Path]] = None, + fmt='json-ld', + **kwargs +): + if metadata_filename is None: + metadata_filename = pathlib.Path(filename).with_suffix('.jsonld') # recommended suffix for JSON-LD is .jsonld! + else: + metadata_filename = pathlib.Path(metadata_filename) + + context = kwargs.pop("context", None) + indent = kwargs.pop("indent", 2) + structural = kwargs.pop("structural", True) + contextual = kwargs.pop("contextual", True) + blank_node_iri_base = kwargs.pop("blank_node_iri_base", None) + + fmt = kwargs.pop("format", fmt) + graph = get_ld( + hdf_filename=filename, + structural=structural, + contextual=contextual, + blank_node_iri_base=blank_node_iri_base, + **kwargs + ) + context = context or {} + context = optimize_context(graph, context) + + with open(metadata_filename, 'w', encoding='utf-8') as f: + f.write( + graph.serialize(format=fmt, + indent=indent, + auto_compact=True, + context=context) + ) + + return metadata_filename diff --git a/h5rdmtoolbox/wrapper/ld/hdf/__init__.py b/h5rdmtoolbox/ld/hdf/__init__.py similarity index 100% rename from h5rdmtoolbox/wrapper/ld/hdf/__init__.py rename to h5rdmtoolbox/ld/hdf/__init__.py diff --git a/h5rdmtoolbox/wrapper/ld/hdf/attributes.py b/h5rdmtoolbox/ld/hdf/attributes.py similarity index 92% rename from h5rdmtoolbox/wrapper/ld/hdf/attributes.py rename to h5rdmtoolbox/ld/hdf/attributes.py index bd72d25d..74f21b9f 100644 --- a/h5rdmtoolbox/wrapper/ld/hdf/attributes.py +++ b/h5rdmtoolbox/ld/hdf/attributes.py @@ -3,8 +3,6 @@ from rdflib import Namespace, Literal from rdflib import XSD, RDF -from h5rdmtoolbox.wrapper.ld.utils import ExtractionOptions -from typing import Optional HDF = Namespace(str(HDF5)) diff --git a/h5rdmtoolbox/wrapper/ld/hdf/datasets.py b/h5rdmtoolbox/ld/hdf/datasets.py similarity index 82% rename from h5rdmtoolbox/wrapper/ld/hdf/datasets.py rename to h5rdmtoolbox/ld/hdf/datasets.py index aabdad32..b7eac741 100644 --- a/h5rdmtoolbox/wrapper/ld/hdf/datasets.py +++ b/h5rdmtoolbox/ld/hdf/datasets.py @@ -1,3 +1,5 @@ +from typing import Optional + import h5py import numpy as np import rdflib @@ -5,10 +7,9 @@ from rdflib import Namespace from rdflib import RDFS from rdflib import XSD, RDF -from typing import Optional + from h5rdmtoolbox.convention.ontology.hdf_datatypes import get_datatype -from h5rdmtoolbox.wrapper.ld.hdf.attributes import process_attribute -from h5rdmtoolbox.wrapper.ld.utils import ExtractionOptions +from h5rdmtoolbox.ld.hdf.attributes import process_attribute HDF = Namespace(str(HDF5)) HDF5_FILTER_ONTOLOGY = { @@ -42,7 +43,14 @@ def add_filter(dataset: h5py.Dataset, dataset_uri, graph) -> rdflib.Graph: return graph -def process_dataset(dataset, graph, parent_uri, dataset_uri, blank_node_iri_base: Optional[str]=None): +def process_dataset( + dataset, + graph, + parent_uri, + dataset_uri, + blank_node_iri_base: Optional[str] = None, + skipND: int = 1 +): """Process an HDF5 dataset, adding it to the RDF graph.""" graph.add((dataset_uri, RDF.type, HDF.Dataset)) @@ -56,7 +64,8 @@ def process_dataset(dataset, graph, parent_uri, dataset_uri, blank_node_iri_base if dataset.maxshape: if all(dataset.maxshape): - graph.add((dataset_uri, HDF5.maximumSize, rdflib.Literal(int(np.prod(dataset.maxshape)), datatype=XSD.integer))) + graph.add( + (dataset_uri, HDF5.maximumSize, rdflib.Literal(int(np.prod(dataset.maxshape)), datatype=XSD.integer))) else: graph.add((dataset_uri, HDF5.maximumSize, rdflib.Literal(-1, datatype=XSD.integer))) else: @@ -68,7 +77,9 @@ def process_dataset(dataset, graph, parent_uri, dataset_uri, blank_node_iri_base graph.add((datatype, RDF.type, HDF5.Datatype)) graph.add((dataset_uri, HDF5.datatype, datatype)) + is_string_dataset = False if dataset.dtype.kind == 'S': + is_string_dataset = True graph.add((dataset_uri, HDF5.datatype, rdflib.Literal('H5T_STRING'))) elif dataset.dtype.kind in ('i', 'u'): graph.add((dataset_uri, HDF5.datatype, rdflib.Literal('H5T_INTEGER'))) @@ -106,9 +117,24 @@ def process_dataset(dataset, graph, parent_uri, dataset_uri, blank_node_iri_base graph.add((dataspace_uri, HDF5.dimension, dataspace_dimension_node)) graph.add((dataspace_dimension_node, HDF5.size, rdflib.Literal(dim, datatype=XSD.integer))) graph.add((dataspace_dimension_node, HDF5.dimensionIndex, rdflib.Literal(idim, datatype=XSD.integer))) + + if skipND and dataset.ndim < skipND: + data = dataset[()].tolist() + if is_string_dataset: + graph.add((dataset_uri, HDF5.value, rdflib.Literal([s.decode() for s in data]))) + else: + graph.add((dataset_uri, HDF5.value, rdflib.Literal(data))) else: dataspace_uri = HDF5.scalarDataspace graph.add((dataspace_uri, RDF.type, HDF5.scalarDataspace)) + + if skipND and dataset.ndim < skipND: + data = dataset[()] + if is_string_dataset: + graph.add((dataset_uri, HDF5.value, rdflib.Literal(data.decode()))) + else: + graph.add((dataset_uri, HDF5.value, rdflib.Literal(data))) + graph.add((dataset_uri, HDF5.dataspace, dataspace_uri)) # Process attributes of the dataset diff --git a/h5rdmtoolbox/ld/hdf/file.py b/h5rdmtoolbox/ld/hdf/file.py new file mode 100644 index 00000000..ebcf8a89 --- /dev/null +++ b/h5rdmtoolbox/ld/hdf/file.py @@ -0,0 +1,47 @@ +from typing import Optional +from typing import Union + +import h5py +import rdflib +from ontolutils.namespacelib.hdf5 import HDF5 +from rdflib import Graph, RDF +from rdflib import Namespace + +from .groups import process_group +from ..utils import optimize_context, get_obj_bnode, get_file_bnode + +HDF = Namespace(str(HDF5)) + + +def get_ld(source: Union[str, h5py.File], blank_node_iri_base: Optional[str] = None, + skipND: int = 1) -> rdflib.Graph: + """Convert an HDF5 file into an RDF graph.""" + + if not isinstance(source, h5py.File): + with h5py.File(source) as h5f: + return get_ld(h5f, blank_node_iri_base=blank_node_iri_base, skipND=skipND) + + graph = Graph() + graph.bind("hdf", HDF) + + file_uri = get_file_bnode(source, blank_node_iri_base=blank_node_iri_base) + graph.add((file_uri, RDF.type, HDF.File)) + + root_group_uri = get_obj_bnode(source["/"], blank_node_iri_base=blank_node_iri_base) + graph.add((file_uri, HDF5.rootGroup, root_group_uri)) + + process_group(source["/"], graph, file_uri, blank_node_iri_base=blank_node_iri_base, skipND=skipND) + + return graph + + +def get_serialized_ld( + source, + blank_node_iri_base, + format, + context=None, + skipND: int = 1 +) -> str: + graph = get_ld(source, blank_node_iri_base, skipND=skipND) + context = optimize_context(graph, context) + return graph.serialize(format=format, indent=2, auto_compact=True, context=context) diff --git a/h5rdmtoolbox/wrapper/ld/hdf/groups.py b/h5rdmtoolbox/ld/hdf/groups.py similarity index 81% rename from h5rdmtoolbox/wrapper/ld/hdf/groups.py rename to h5rdmtoolbox/ld/hdf/groups.py index d8d42734..fdaba7a8 100644 --- a/h5rdmtoolbox/wrapper/ld/hdf/groups.py +++ b/h5rdmtoolbox/ld/hdf/groups.py @@ -6,14 +6,14 @@ from rdflib import Namespace from rdflib import RDF -from h5rdmtoolbox.wrapper.ld.hdf.attributes import process_attribute -from h5rdmtoolbox.wrapper.ld.hdf.datasets import process_dataset -from h5rdmtoolbox.wrapper.ld.utils import get_obj_bnode +from h5rdmtoolbox.ld.hdf.attributes import process_attribute +from h5rdmtoolbox.ld.hdf.datasets import process_dataset +from h5rdmtoolbox.ld.utils import get_obj_bnode HDF = Namespace(str(HDF5)) -def process_group(group, graph, parent_uri, blank_node_iri_base: Optional[str] = None): +def process_group(group, graph, parent_uri, blank_node_iri_base: Optional[str] = None, skipND: int = 1): """Recursively process HDF5 groups and datasets, adding them to the RDF graph.""" group_uri = get_obj_bnode(group, blank_node_iri_base=blank_node_iri_base) graph.add((group_uri, RDF.type, HDF.Group)) @@ -27,7 +27,7 @@ def process_group(group, graph, parent_uri, blank_node_iri_base: Optional[str] = if isinstance(item, h5py.Group): process_group(item, graph, group_uri, blank_node_iri_base=blank_node_iri_base) elif isinstance(item, h5py.Dataset): - process_dataset(item, graph, group_uri, item_uri, blank_node_iri_base=blank_node_iri_base) + process_dataset(item, graph, group_uri, item_uri, blank_node_iri_base=blank_node_iri_base, skipND=skipND) # Process attributes of the group for attr, value in group.attrs.items(): diff --git a/h5rdmtoolbox/wrapper/rdf.py b/h5rdmtoolbox/ld/rdf.py similarity index 98% rename from h5rdmtoolbox/wrapper/rdf.py rename to h5rdmtoolbox/ld/rdf.py index fe1087ae..97f45954 100644 --- a/h5rdmtoolbox/wrapper/rdf.py +++ b/h5rdmtoolbox/ld/rdf.py @@ -7,11 +7,10 @@ import h5py import pydantic from ontolutils import Thing -from ontolutils.namespacelib.hdf5 import HDF5 from pydantic import HttpUrl -from . import lazy -from ..protocols import H5TbxAttributeManager +from h5rdmtoolbox.protocols import H5TbxAttributeManager +from h5rdmtoolbox.database import lazy RDF_OBJECT_ATTR_NAME = 'RDF_OBJECT' RDF_FILE_OBJECT_ATTR_NAME = 'RDF_FILE_OBJECT' @@ -252,7 +251,10 @@ def get(self, item, default=None): return default if item is None: return attrs.get('SELF', default) - return attrs.get(item, default) + if isinstance(attrs, dict): + return attrs.get(item, default) + assert isinstance(attrs, str) + return json.loads(attrs).get(item, default) def __getitem__(self, item) -> Union[str, None]: return self.get(item, default=None) @@ -312,7 +314,7 @@ def __setiri__(self, key, value): class RDFManager: """IRI attribute manager""" - def __init__(self, attr: H5TbxAttributeManager = None): + def __init__(self, attr: h5py.AttributeManager = None): self._attr = attr def __str__(self) -> str: diff --git a/h5rdmtoolbox/wrapper/ld/user/__init__.py b/h5rdmtoolbox/ld/user/__init__.py similarity index 100% rename from h5rdmtoolbox/wrapper/ld/user/__init__.py rename to h5rdmtoolbox/ld/user/__init__.py diff --git a/h5rdmtoolbox/wrapper/ld/user/attributes.py b/h5rdmtoolbox/ld/user/attributes.py similarity index 81% rename from h5rdmtoolbox/wrapper/ld/user/attributes.py rename to h5rdmtoolbox/ld/user/attributes.py index 61669b29..1b283164 100644 --- a/h5rdmtoolbox/wrapper/ld/user/attributes.py +++ b/h5rdmtoolbox/ld/user/attributes.py @@ -2,20 +2,23 @@ import warnings import rdflib -from rdflib import RDF - -from h5rdmtoolbox.wrapper.ld.utils import get_attr_dtype_as_XSD, get_obj_bnode +from rdflib import RDF, DCTERMS +from h5rdmtoolbox.ld.utils import get_attr_dtype_as_XSD, get_obj_bnode +from ..rdf import FileRDFManager, RDFManager def process_file_attribute(parent_obj, name, data, graph, blank_node_iri_base): parent_uri = get_obj_bnode(parent_obj, blank_node_iri_base) - rdf_user_type = parent_obj.frdf.type + rdf_user_type = FileRDFManager(parent_obj.attrs).type if rdf_user_type: graph.add((parent_uri, RDF.type, rdflib.URIRef(rdf_user_type))) - rdf_user_predicate = parent_obj.frdf.predicate[name] + rdf_user_predicate = FileRDFManager(parent_obj.attrs).predicate[name] + + rdf_user_object = FileRDFManager(parent_obj.attrs).object[name] + if rdf_user_object and not rdf_user_predicate: + rdf_user_predicate = DCTERMS.relation if rdf_user_predicate: - rdf_user_object = parent_obj.frdf.object[name] if rdf_user_object: if isinstance(rdf_user_object, str) and rdf_user_object.startswith('http'): graph.add((parent_uri, rdflib.URIRef(rdf_user_predicate), rdflib.URIRef(rdf_user_object))) @@ -43,18 +46,23 @@ def process_file_attribute(parent_obj, name, data, graph, blank_node_iri_base): def process_attribute(parent_obj, name, data, graph, blank_node_iri_base): - parent_uri = parent_obj.rdf.subject + + rdf_manager = RDFManager(parent_obj.attrs) + + parent_uri = rdf_manager.subject if parent_uri: parent_uri = rdflib.URIRef(parent_uri) else: parent_uri = get_obj_bnode(parent_obj, blank_node_iri_base) - rdf_user_type = parent_obj.rdf.type + rdf_user_type = rdf_manager.type if rdf_user_type: graph.add((parent_uri, RDF.type, rdflib.URIRef(rdf_user_type))) - rdf_user_predicate = parent_obj.rdf.predicate[name] + rdf_user_predicate = rdf_manager.predicate[name] + rdf_user_object = rdf_manager.object[name] + if rdf_user_object and not rdf_user_predicate: + rdf_user_predicate = DCTERMS.relation if rdf_user_predicate: - rdf_user_object = parent_obj.rdf.object[name] if rdf_user_object: if isinstance(rdf_user_object, str) and rdf_user_object.startswith('http'): graph.add((parent_uri, rdflib.URIRef(rdf_user_predicate), rdflib.URIRef(rdf_user_object))) diff --git a/h5rdmtoolbox/wrapper/ld/user/datasets.py b/h5rdmtoolbox/ld/user/datasets.py similarity index 64% rename from h5rdmtoolbox/wrapper/ld/user/datasets.py rename to h5rdmtoolbox/ld/user/datasets.py index 5d11c838..326a11bc 100644 --- a/h5rdmtoolbox/wrapper/ld/user/datasets.py +++ b/h5rdmtoolbox/ld/user/datasets.py @@ -1,9 +1,9 @@ import rdflib -from h5rdmtoolbox.wrapper.ld.user.attributes import process_attribute -from h5rdmtoolbox.wrapper.ld.utils import get_obj_bnode -from h5rdmtoolbox.wrapper.rdf import PROTECTED_ATTRIBUTE_NAMES - +from h5rdmtoolbox.ld.user.attributes import process_attribute +from h5rdmtoolbox.ld.utils import get_obj_bnode +from h5rdmtoolbox.ld.rdf import PROTECTED_ATTRIBUTE_NAMES +from ..rdf import RDFManager def process_dataset(dataset, graph, blank_node_iri_base=None): dataset_uri = get_obj_bnode(dataset, blank_node_iri_base=blank_node_iri_base) @@ -11,6 +11,6 @@ def process_dataset(dataset, graph, blank_node_iri_base=None): if ak not in PROTECTED_ATTRIBUTE_NAMES: process_attribute(dataset, ak, av, graph, blank_node_iri_base=blank_node_iri_base) - rdf_type = dataset.rdf.type + rdf_type = RDFManager(dataset.attrs).type if rdf_type: graph.add((dataset_uri, rdflib.RDF.type, rdflib.URIRef(rdf_type))) diff --git a/h5rdmtoolbox/ld/user/file.py b/h5rdmtoolbox/ld/user/file.py new file mode 100644 index 00000000..f085c5fb --- /dev/null +++ b/h5rdmtoolbox/ld/user/file.py @@ -0,0 +1,49 @@ +from typing import Optional +from typing import Union + +import h5py +import rdflib +from ontolutils.namespacelib.hdf5 import HDF5 +from rdflib import Graph +from rdflib import Namespace + +from h5rdmtoolbox.ld.user.attributes import process_file_attribute +from h5rdmtoolbox.ld.user.groups import process_group +from h5rdmtoolbox.ld.utils import get_file_bnode +from ..rdf import FileRDFManager + +HDF = Namespace(str(HDF5)) + + +def get_ld(source: Union[str, h5py.File], blank_node_iri_base: Optional[str] = None) -> rdflib.Graph: + """Convert an HDF5 file into an RDF graph.""" + + if not isinstance(source, h5py.File): + with h5py.File(source) as h5f: + return get_ld(h5f) + + graph = Graph() + graph.bind("m4i", rdflib.URIRef("http://w3id.org/nfdi4ing/metadata4ing#")) + graph.bind("ssno", rdflib.URIRef("https://matthiasprobst.github.io/ssno#")) + graph.bind("piv", rdflib.URIRef("https://matthiasprobst.github.io/pivmeta#")) + + file_uri = get_file_bnode(source, blank_node_iri_base=blank_node_iri_base) + if source.name == "/": + file_frdf_manager = FileRDFManager(source.attrs) + file_rdf = file_frdf_manager.type + else: + file_rdf = None + + if file_rdf: + if isinstance(file_rdf, list): + for rdf_type in file_rdf: + graph.add((file_uri, rdflib.RDF.type, rdflib.URIRef(rdf_type))) + else: + graph.add((file_uri, rdflib.RDF.type, rdflib.URIRef(file_rdf))) + + for ak, av in source.attrs.items(): + process_file_attribute(source, ak, av, graph, blank_node_iri_base) + + process_group(source, graph, blank_node_iri_base=blank_node_iri_base) + + return graph diff --git a/h5rdmtoolbox/wrapper/ld/user/groups.py b/h5rdmtoolbox/ld/user/groups.py similarity index 78% rename from h5rdmtoolbox/wrapper/ld/user/groups.py rename to h5rdmtoolbox/ld/user/groups.py index 7ec459ec..d3828457 100644 --- a/h5rdmtoolbox/wrapper/ld/user/groups.py +++ b/h5rdmtoolbox/ld/user/groups.py @@ -3,18 +3,18 @@ import h5py import rdflib -from h5rdmtoolbox.wrapper.ld.user.attributes import process_attribute -from h5rdmtoolbox.wrapper.ld.user.datasets import process_dataset -from h5rdmtoolbox.wrapper.ld.utils import get_obj_bnode - +from h5rdmtoolbox.ld.user.attributes import process_attribute +from h5rdmtoolbox.ld.user.datasets import process_dataset +from h5rdmtoolbox.ld.utils import get_obj_bnode +from ..rdf import RDFManager def process_group(group, graph, blank_node_iri_base: Optional[str] = None): for ak, av in group.attrs.items(): process_attribute(group, ak, av, graph, blank_node_iri_base) group_uri = get_obj_bnode(group, blank_node_iri_base) - rdf_type = group.rdf.type - rdf_subject = group.rdf.subject + rdf_type = RDFManager(group.attrs).type + rdf_subject = RDFManager(group.attrs).subject if rdf_type: if rdf_subject: graph.add((rdflib.URIRef(rdf_subject), rdflib.RDF.type, rdflib.URIRef(rdf_type))) diff --git a/h5rdmtoolbox/wrapper/ld/utils.py b/h5rdmtoolbox/ld/utils.py similarity index 96% rename from h5rdmtoolbox/wrapper/ld/utils.py rename to h5rdmtoolbox/ld/utils.py index ae78a507..05777b34 100644 --- a/h5rdmtoolbox/wrapper/ld/utils.py +++ b/h5rdmtoolbox/ld/utils.py @@ -20,6 +20,7 @@ def get_attr_dtype_as_XSD(data): def optimize_context(graph, context=None): bound_namespaces = {k: str(v) for k, v in graph.namespaces()} + bound_namespaces["m4i"] = "http://w3id.org/nfdi4ing/metadata4ing#" # Collect actually used namespaces selected_namespaces = dict() diff --git a/h5rdmtoolbox/repository/interface.py b/h5rdmtoolbox/repository/interface.py index 79751348..a503acd9 100644 --- a/h5rdmtoolbox/repository/interface.py +++ b/h5rdmtoolbox/repository/interface.py @@ -32,7 +32,7 @@ def _HDF2JSON(filename: Union[str, pathlib.Path], **kwargs) -> pathlib.Path: if pathlib.Path(filename).suffix not in ('.hdf', '.hdf5', '.h5'): raise ValueError('The (default) HDF2JSON metamapper function can only be used with HDF5 files.') - from ..wrapper.jsonld import hdf2jsonld + from h5rdmtoolbox.ld import hdf2jsonld return hdf2jsonld(filename=filename, skipND=1) diff --git a/h5rdmtoolbox/utils.py b/h5rdmtoolbox/utils.py index 0a3539f2..b5c7f55d 100644 --- a/h5rdmtoolbox/utils.py +++ b/h5rdmtoolbox/utils.py @@ -25,7 +25,7 @@ from . import user from ._version import __version__ from .user import USER_CACHE_DIR, USER_DATA_DIR -from .wrapper import rdf +from .ld import rdf logger = logging.getLogger('h5rdmtoolbox') DEFAULT_LOGGING_LEVEL = logging.INFO @@ -293,7 +293,7 @@ def create_special_attribute(h5obj: h5py.AttributeManager, fragment = name.fragment if not fragment: raise ValueError(f'Name {name} has no fragment') - from h5rdmtoolbox.wrapper.rdf import set_predicate + from h5rdmtoolbox.ld.rdf import set_predicate set_predicate(h5obj, fragment, name) name = fragment diff --git a/h5rdmtoolbox/wrapper/__init__.py b/h5rdmtoolbox/wrapper/__init__.py index 6ec6216c..2b6ee7b5 100644 --- a/h5rdmtoolbox/wrapper/__init__.py +++ b/h5rdmtoolbox/wrapper/__init__.py @@ -4,7 +4,5 @@ """ from . import core -from . import lazy -from .jsonld import hdf2jsonld -__all__ = ['core', 'lazy', 'hdf2jsonld'] +__all__ = ['core'] diff --git a/h5rdmtoolbox/wrapper/core.py b/h5rdmtoolbox/wrapper/core.py index 12d7a4cb..3baea81b 100644 --- a/h5rdmtoolbox/wrapper/core.py +++ b/h5rdmtoolbox/wrapper/core.py @@ -22,7 +22,7 @@ from h5py._objects import ObjectID # noinspection PyUnresolvedReferences -from . import xr2hdf, rdf +from . import xr2hdf from .ds_decoder import dataset_value_decoder from .h5attr import H5_DIM_ATTRS, pop_hdf_attributes, WrapperAttributeManager from .h5utils import _is_not_valid_natural_name, get_rootparent @@ -31,6 +31,7 @@ from .. import protocols from .._repr import H5Repr, H5PY_SPECIAL_ATTRIBUTES from ..convention.consts import DefaultValue +from ..ld import rdf logger = logging.getLogger('h5rdmtoolbox') @@ -448,6 +449,8 @@ def create_group(self, name: str, overwrite: bool = None, attrs: Dict = None, + rdf_type: Optional[Union[str, rdflib.URIRef]] = None, + rdf_subject: Optional[Union[str, rdflib.URIRef]] = None, update_attrs: Optional[bool] = False, track_order=None, **kwargs) -> "Group": @@ -510,6 +513,10 @@ def create_group(self, except convention.standard_attributes.errors.StandardAttributeError as e: del self[name] # undo group creation raise e + if rdf_type: + h5tbxgrp.rdf.type = rdf_type + if rdf_subject: + h5tbxgrp.rdf.subject = rdf_subject return h5tbxgrp def create_time_dataset(self, @@ -574,6 +581,7 @@ def create_string_dataset(self, data: Union[str, List[str]], overwrite=False, attrs=None, + rdf_type: Optional[Union[str, rdflib.URIRef]] = None, **kwargs): """Create a string dataset. In this version only one string is allowed. In future version a list of strings may be allowed, too. @@ -614,6 +622,8 @@ def create_string_dataset(self, for ak, av in attrs.items(): ds.attrs[ak] = av + if rdf_type: + ds.rdf.type = rdf_type return self._h5ds(ds.id) def create_dataset(self, @@ -628,6 +638,7 @@ def create_dataset(self, attach_data_offset=None, attach_scales=None, ancillary_datasets=None, + rdf_type: Optional[Union[str, rdflib.URIRef]] = None, attrs=None, **kwargs # standard attributes and other keyword arguments ) -> protocols.H5TbxDataset: @@ -699,6 +710,7 @@ def create_dataset(self, data=data, overwrite=overwrite, attrs=attrs, + rdf_type=rdf_type, **kwargs) if attrs is None: attrs = {} @@ -828,6 +840,9 @@ def create_dataset(self, ds = Dataset(_ds.id) + if rdf_type: + ds.rdf.type = rdf_type + if attach_data_scale is not None or attach_data_offset is not None: units = attrs.get('units', None) if units: @@ -2410,7 +2425,7 @@ def dump_jsonld(self, blank_node_iri_base: Optional[str] = None, **kwargs) -> str: """Dump the file content as JSON-LD string""" - return self.serialize(fmt="jsonld", + return self.serialize(fmt="json-ld", skipND=skipND, structural=structural, semantic=semantic, @@ -2421,25 +2436,29 @@ def dump_jsonld(self, def serialize(self, fmt: str, skipND: int = 1, structural: bool = True, - semantic: bool = True, - resolve_keys: bool = True, + contextual: bool = True, blank_node_iri_base: Optional[str] = None, + context: Optional[Dict] = None, + indent: int = 2, **kwargs ): """Serialize the file content to a specific format""" - if not fmt in ("jsonld", "json-ld", "ttl", "turtle"): - raise NotImplementedError('Only JSON-LD or TTL serialization is supported at the moment') - from .. import dump_jsonld - jsonldstr = dump_jsonld(self.hdf_filename, - skipND=skipND, - structural=structural, - semantic=semantic, - resolve_keys=resolve_keys, - blank_node_iri_base=blank_node_iri_base, - **kwargs) - if fmt.lower() in ("jsonld", "json-ld"): - return jsonldstr - return rdflib.Graph().parse(data=jsonldstr, format='json-ld').serialize(format="turtle") + from h5rdmtoolbox.ld.utils import optimize_context + from h5rdmtoolbox.ld import get_ld + fmt = kwargs.pop("format", fmt) + + graph = get_ld(self.hdf_filename, + structural=structural, + contextual=contextual, + blank_node_iri_base=blank_node_iri_base, + skipND=skipND, + **kwargs) + context = context or {} + context = optimize_context(graph, context) + return graph.serialize(format=fmt, + indent=indent, + auto_compact=True, + context=context) Dataset._h5grp = Group diff --git a/h5rdmtoolbox/wrapper/jsonld.py b/h5rdmtoolbox/wrapper/jsonld.py index 912e9d62..be3588fa 100644 --- a/h5rdmtoolbox/wrapper/jsonld.py +++ b/h5rdmtoolbox/wrapper/jsonld.py @@ -18,7 +18,7 @@ from h5rdmtoolbox.convention import ontology as hdf_ontology from h5rdmtoolbox.convention.ontology.hdf_datatypes import get_datatype from .core import Dataset, File -from .rdf import RDF_TYPE_ATTR_NAME +from h5rdmtoolbox.ld.rdf import RDF_TYPE_ATTR_NAME # from ..convention.ontology.h5ontocls import Datatype from ..protocols import H5TbxGroup @@ -1152,37 +1152,9 @@ def _build_onto_classes(name, node): return file.model_dump_jsonld() -def hdf2jsonld(filename: Union[str, pathlib.Path], - skipND: int, - metadata_filename: Optional[Union[str, pathlib.Path]] = None) -> pathlib.Path: - """Dumps the metadata (not only attributes but also structure and possible RDF tripels...) to - a target filename. - - Parameter - --------- - filename: Union[str, pathlib.Path] - The HDF5 file to read from. - skipND: int - The number of dimensions to skip when reading a dataset. - metadata_filename: Optional[Union[str, pathlib.Path]] - The target filename to write to. If None, the target filename will be the filename with - the suffix ".jsonld" (using this suffix over '.json' due to recommendation: - https://www.w3.org/TR/json-ld/#iana-considerations). - - Returns - ------- - metadata_filename: pathlib.Path - The metadata filename - """ - if metadata_filename is None: - metadata_filename = pathlib.Path(filename).with_suffix('.jsonld') # recommended suffix for JSON-LD is .jsonld! - else: - metadata_filename = pathlib.Path(metadata_filename) - - with open(metadata_filename, 'w', encoding='utf-8') as f: - f.write(dump_file(filename, skipND)) - - return metadata_filename +def hdf2jsonld(*arge, **kwargs): + from h5rdmtoolbox.ld import hdf2jsonld + return hdf2jsonld(*arge, **kwargs) def make_graph_compact(graph: List[Dict]) -> List[Dict]: diff --git a/h5rdmtoolbox/wrapper/ld/__init__.py b/h5rdmtoolbox/wrapper/ld/__init__.py deleted file mode 100644 index 5b111788..00000000 --- a/h5rdmtoolbox/wrapper/ld/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from h5rdmtoolbox.wrapper.ld.hdf.file import get_ld as hdf_get_ld -from h5rdmtoolbox.wrapper.ld.user.attributes import process_attribute -from h5rdmtoolbox.wrapper.ld.user.file import get_ld as user_get_ld -from h5rdmtoolbox.wrapper.ld.user.groups import process_group -from h5rdmtoolbox.wrapper.ld.utils import optimize_context diff --git a/h5rdmtoolbox/wrapper/ld/hdf/file.py b/h5rdmtoolbox/wrapper/ld/hdf/file.py deleted file mode 100644 index 96adee3f..00000000 --- a/h5rdmtoolbox/wrapper/ld/hdf/file.py +++ /dev/null @@ -1,61 +0,0 @@ -from typing import Optional -from typing import Union - -import rdflib -from ontolutils.namespacelib import M4I -from ontolutils.namespacelib import SCHEMA -from ontolutils.namespacelib.hdf5 import HDF5 -from rdflib import Graph, RDF -from rdflib import Namespace - -import h5rdmtoolbox as h5tbx -from h5rdmtoolbox.wrapper.ld.hdf.groups import process_group -from h5rdmtoolbox.wrapper.ld.utils import optimize_context, get_obj_bnode, get_file_bnode - -HDF = Namespace(str(HDF5)) - - -def get_ld(source: Union[str, h5tbx.File], blank_node_iri_base:Optional[str]=None) -> rdflib.Graph: - """Convert an HDF5 file into an RDF graph.""" - - if not isinstance(source, h5tbx.File): - with h5tbx.File(source) as h5f: - return get_ld(h5f, blank_node_iri_base=blank_node_iri_base) - - graph = Graph() - graph.bind("hdf", HDF) - - file_uri = get_file_bnode(source, blank_node_iri_base=blank_node_iri_base) - graph.add((file_uri, RDF.type, HDF.File)) - - root_group_uri = get_obj_bnode(source["/"], blank_node_iri_base=blank_node_iri_base) - graph.add((file_uri, HDF5.rootGroup, root_group_uri)) - - process_group(source["/"], graph, file_uri, blank_node_iri_base=blank_node_iri_base) - - return graph - - -def get_serialized_ld( - source, - blank_node_iri_base, - format, - context=None -) -> str: - graph = get_ld(source, blank_node_iri_base) - context = optimize_context(graph, context) - return graph.serialize(format=format, indent=2, auto_compact=True, context=context) - - -if __name__ == "__main__": - import h5rdmtoolbox as h5tbx - - with h5tbx.File() as h5: - h5.attrs["version", SCHEMA.version] = "1.2.3" - - ds = h5.create_dataset("a/b/ds", data=[[1, 2], [3, 4]], chunks=(1, 2), compression="gzip", compression_opts=2) - ds2 = h5.create_dataset("nochunk", data=[[1, 2], [3, 4]], chunks=None) - ds.rdf.type = M4I.NumericalVariable - - graph = get_ld(str(h5.hdf_filename), structural=True, semantic=False) - print(graph.serialize(format="turtle")) diff --git a/h5rdmtoolbox/wrapper/ld/hdf_ontology.ttl b/h5rdmtoolbox/wrapper/ld/hdf_ontology.ttl deleted file mode 100644 index 5c3a28c7..00000000 --- a/h5rdmtoolbox/wrapper/ld/hdf_ontology.ttl +++ /dev/null @@ -1,4393 +0,0 @@ -@prefix : . -@prefix dc: . -@prefix dct: . -@prefix hdf: . -@prefix owl: . -@prefix rdf: . -@prefix xml: . -@prefix xsd: . -@prefix prov: . -@prefix rdfs: . -@prefix skos: . -@base . - - rdf:type owl:Ontology ; - owl:versionIRI ; - dc:title "The HDF5 data description ontology. (REC/2024/12)" ; - dct:contributor ; - dct:description """This ontology is based on the HDF5 specification. -Sources are the DDL file and the HDF5 User's and Reference Guide.""" ; - dct:issued "2024-12-18T12:00:00Z"^^xsd:dateTime ; - dct:license , - ; - dct:modified "2024-12-08T12:00:00Z"^^xsd:dateTime ; - dct:publisher ; - dct:rights , - , - ; - dct:source , - , - ; - owl:priorVersion ; - owl:versionInfo "REC/2024/12" ; - prov:wasDerivedFrom , - , - . - -################################################################# -# Annotation properties -################################################################# - -### http://purl.org/dc/elements/1.1/title -dc:title rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/contributor -dct:contributor rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/description -dct:description rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/issued -dct:issued rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/license -dct:license rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/modified -dct:modified rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/publisher -dct:publisher rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/rights -dct:rights rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/rightsHolder -dct:rightsHolder rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/source -dct:source rdf:type owl:AnnotationProperty . - - -### http://purl.org/dc/terms/title -dct:title rdf:type owl:AnnotationProperty . - - -### http://www.w3.org/2001/XMLSchema#maxInclusive -xsd:maxInclusive rdf:type owl:AnnotationProperty . - - -### http://www.w3.org/2001/XMLSchema#minInclusive -xsd:minInclusive rdf:type owl:AnnotationProperty . - - -### http://www.w3.org/2004/02/skos/core#altLabel -skos:altLabel rdf:type owl:AnnotationProperty . - - -### http://www.w3.org/2004/02/skos/core#definition -skos:definition rdf:type owl:AnnotationProperty . - - -### http://www.w3.org/2004/02/skos/core#note -skos:note rdf:type owl:AnnotationProperty . - - -### http://www.w3.org/2004/02/skos/core#prefLabel -skos:prefLabel rdf:type owl:AnnotationProperty . - - -### http://www.w3.org/ns/prov#wasDerivedFrom -prov:wasDerivedFrom rdf:type owl:AnnotationProperty . - - -################################################################# -# Datatypes -################################################################# - -### http://purl.allotrope.org/ontologies/hdf5/1.8#DimensionIndexType -hdf:DimensionIndexType rdf:type rdfs:Datatype ; - rdfs:comment "xsd:int based datatype restricted to the range of 0 to 31. Used for indexing dimensions. [Allotrope]" ; - rdfs:label "dimension index type" ; - skos:definition "xsd:int based datatype restricted to the range of 0 to 31. Used for indexing dimensions. [Allotrope]" ; - skos:prefLabel "dimension index type" ; - owl:equivalentClass [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:int ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:int - ] - [ xsd:maxInclusive "31"^^xsd:int - ] - ) - ] . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#IndexType -hdf:IndexType rdf:type rdfs:Datatype ; - rdfs:comment "Non-negative xsd:long datatype. Used to address a point per dimension. [Allotrope]" ; - rdfs:label "index type" ; - skos:definition "Non-negative xsd:long datatype. Used to address a point per dimension. [Allotrope]" ; - skos:prefLabel "index type" ; - owl:equivalentClass [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:long ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:long - ] - ) - ] . - - -### http://www.w3.org/1999/02/22-rdf-syntax-ns#Literal -rdf:Literal rdf:type rdfs:Datatype . - - -################################################################# -# Object Properties -################################################################# - -### http://purl.allotrope.org/ontologies/hdf5/1.8#allocationTime -hdf:allocationTime rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:StorageAllocation ; - rdfs:label "allocation time" ; - skos:prefLabel "allocation time" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#and -hdf:and rdf:type owl:ObjectProperty ; - rdfs:label "and" ; - skos:prefLabel "and" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#attribute -hdf:attribute rdf:type owl:ObjectProperty ; - rdfs:domain hdf:NamedObject ; - rdfs:range hdf:Attribute ; - rdfs:comment "Relation between an HDF object and its attributes. [Allotrope]" ; - rdfs:label "attribute" ; - skos:definition "Relation between an HDF object and its attributes. [Allotrope]" ; - skos:prefLabel "attribute" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#characterSet -hdf:characterSet rdf:type owl:ObjectProperty ; - rdfs:domain [ rdf:type owl:Class ; - owl:unionOf ( hdf:Link - hdf:StringDatatype - ) - ] ; - rdfs:range hdf:CharacterSet ; - rdfs:comment "Relation between link or string datatype and character set used. [Allotrope]" ; - rdfs:label "character set" ; - skos:definition "Relation between link or string datatype and character set used. [Allotrope]" ; - skos:prefLabel "character set" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#chunk -hdf:chunk rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:Chunk ; - rdfs:comment "Relation between dataset and chunk. [Allotrope]" ; - rdfs:label "chunk" ; - skos:definition "Relation between dataset and chunk. [Allotrope]" ; - skos:prefLabel "chunk" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#chunkMode -hdf:chunkMode rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:ChunkMode ; - rdfs:comment """Specifies whether I/O is to be performed as linked-chunk I/O or as multi-chunk I/O. -When an application uses collective I/O with chunked storage, the HDF5 Library normally uses an internal algorithm to determine whether that I/O activity should be conducted as one linked-chunk I/O or as multi-chunk I/O. ChunkMode is provided so that an application can override the library's algorithm in circumstances where the library might lack the information needed to make an optimal decision. [HDF]""" ; - rdfs:label "chunk mode" ; - skos:definition """Specifies whether I/O is to be performed as linked-chunk I/O or as multi-chunk I/O. -When an application uses collective I/O with chunked storage, the HDF5 Library normally uses an internal algorithm to determine whether that I/O activity should be conducted as one linked-chunk I/O or as multi-chunk I/O. ChunkMode is provided so that an application can override the library's algorithm in circumstances where the library might lack the information needed to make an optimal decision. [HDF]""" ; - skos:prefLabel "chunk mode" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#compositeFillValue -hdf:compositeFillValue rdf:type owl:ObjectProperty ; - rdfs:subPropertyOf hdf:compositeValue ; - rdf:type owl:FunctionalProperty ; - rdfs:domain hdf:Dataset ; - rdfs:comment "User defined fill value for a composite datatype (array, compound or variable length). [HDF]" ; - rdfs:label "composite fill value" ; - skos:definition "User defined fill value for a composite datatype (array, compound or variable length). [HDF]" ; - skos:prefLabel "composite fill value" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#compositeValue -hdf:compositeValue rdf:type owl:ObjectProperty ; - rdfs:range hdf:CompositeValue ; - rdfs:label "composite value" ; - skos:prefLabel "composite value" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#coordinate -hdf:coordinate rdf:type owl:ObjectProperty ; - rdfs:range hdf:Coordinate ; - rdfs:label "coordinate" ; - skos:prefLabel "coordinate" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#dataSource -hdf:dataSource rdf:type owl:ObjectProperty ; - rdfs:label "data source" ; - skos:prefLabel "data source" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#dataTarget -hdf:dataTarget rdf:type owl:ObjectProperty ; - rdfs:label "data target" ; - skos:prefLabel "data target" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#dataspace -hdf:dataspace rdf:type owl:ObjectProperty ; - rdfs:domain [ rdf:type owl:Class ; - owl:unionOf ( hdf:Attribute - hdf:Dataset - ) - ] ; - rdfs:range hdf:Dataspace ; - rdfs:label "dataspace" ; - skos:definition "Relation between an attribute or dataset with its used dataspace. [Allotrope]" ; - skos:prefLabel "dataspace" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#datatype -hdf:datatype rdf:type owl:ObjectProperty ; - rdfs:domain [ rdf:type owl:Class ; - owl:unionOf ( hdf:ArrayDatatype - hdf:Attribute - hdf:CompoundDatatypeMember - hdf:Dataset - hdf:VariableLengthDatatype - ) - ] ; - rdfs:range hdf:Datatype ; - rdfs:comment "Relation between an array datatype, a compound datatype member, a variable length datatype, an attribute or a dataset and its datatype. [Allotrope]" ; - rdfs:label "datatype" ; - skos:definition "Relation between an array datatype, a compound datatype member, a variable length datatype, an attribute or a dataset and its datatype. [Allotrope]" ; - skos:prefLabel "datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#dimension -hdf:dimension rdf:type owl:ObjectProperty ; - rdfs:domain [ rdf:type owl:Class ; - owl:unionOf ( hdf:ArrayDatatype - hdf:Chunk - hdf:Dataspace - ) - ] ; - rdfs:range hdf:Dimension ; - rdfs:comment "Relation between an array datatype, chunk or dataspace with a dimension. [Allotrope]" ; - rdfs:label "dimension" ; - skos:definition "Relation between an array datatype, chunk or dataspace with a dimension. [Allotrope]" ; - skos:prefLabel "dimension" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#dimensionSelection -hdf:dimensionSelection rdf:type owl:ObjectProperty ; - rdfs:domain hdf:HyperSlab ; - rdfs:range hdf:DimensionSelection ; - rdfs:comment "Relation between a hyper slab and its dimension selection. [Allotrope]" ; - rdfs:label "dimension selection" ; - skos:definition "Relation between a hyper slab and its dimension selection. [Allotrope]" ; - skos:prefLabel "dimension selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#errorDetectionCheck -hdf:errorDetectionCheck rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:ErrorDetectionCheck ; - rdfs:comment "Error detection check property of a dataset. [Allotrope]" ; - rdfs:label "error detection check" ; - skos:definition "Error detection check property of a dataset. [Allotrope]" ; - skos:prefLabel "error detection check" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#exponentField -hdf:exponentField rdf:type owl:ObjectProperty ; - rdfs:subPropertyOf hdf:field ; - rdf:type owl:FunctionalProperty ; - rdfs:range hdf:ExponentField ; - rdfs:comment "Exponent field property of a field. [Allotrope]" ; - rdfs:label "exponent field" ; - skos:definition "Exponent field property of a field. [Allotrope]" ; - skos:prefLabel "exponent field" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#externalLinkAccess -hdf:externalLinkAccess rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Link ; - rdfs:range hdf:FileAccessMode ; - rdfs:label "external link access" ; - skos:definition "File access mode property of a link. [Allotrope]" ; - skos:prefLabel "external link access" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#field -hdf:field rdf:type owl:ObjectProperty ; - rdfs:domain hdf:FloatDatatype ; - rdfs:range hdf:FieldSpecification ; - rdfs:comment "Defines the location (bit position of least significant bit of the filed) and size (in bits) of the field. [Allotrope]" ; - rdfs:label "field" ; - skos:definition "Defines the location (bit position of least significant bit of the filed) and size (in bits) of the field. [Allotrope]" ; - skos:prefLabel "field" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#fillTime -hdf:fillTime rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:FillTime ; - rdfs:comment "Fill time property of a dataset. [Allotrope]" ; - rdfs:label "fill time" ; - skos:definition "Fill time property of a dataset. [Allotrope]" ; - skos:prefLabel "fill time" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#fillValueStatus -hdf:fillValueStatus rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:FillValueStatus ; - rdfs:comment "Fill value status property of a dataset. [Allotrope]" ; - rdfs:label "fill value status" ; - skos:definition "Fill value status property of a dataset. [Allotrope]" ; - skos:prefLabel "fill value status" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#filter -hdf:filter rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:Filter ; - rdfs:comment "Filter property of a dataset. [Allotrope]" ; - rdfs:label "filter" ; - skos:definition "Filter property of a dataset. [Allotrope]" ; - skos:prefLabel "filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#internalPadding -hdf:internalPadding rdf:type owl:ObjectProperty ; - rdfs:domain hdf:FloatDatatype ; - rdfs:range hdf:Padding ; - rdfs:comment "If any internal bits (that is, bits between the sign bit, the mantissa field, and the exponent field but within the precision field) are unused, they will be filled according to this property. [Allotrope]" ; - rdfs:label "internal padding" ; - skos:definition "If any internal bits (that is, bits between the sign bit, the mantissa field, and the exponent field but within the precision field) are unused, they will be filled according to this property. [Allotrope]" ; - skos:prefLabel "internal padding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#layout -hdf:layout rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:StorageLayout ; - rdfs:comment "Relation between a dataset and its storage layout. [Allotrope]" ; - rdfs:label "layout" ; - skos:definition "Relation between a dataset and its storage layout. [Allotrope]" ; - skos:prefLabel "layout" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#link -hdf:link rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Group ; - rdfs:range hdf:Link ; - rdfs:comment "Relation between a group and link. [Allotrope]" ; - rdfs:label "link" ; - skos:definition "Relation between a group and link. [Allotrope]" ; - skos:prefLabel "link" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#linkedTo -hdf:linkedTo rdf:type owl:ObjectProperty ; - rdfs:subPropertyOf owl:topObjectProperty ; - rdfs:domain hdf:Link ; - rdfs:range hdf:NamedObject ; - rdfs:comment "Relation between a link and its target named object. [Allotrope]" ; - rdfs:label "linked to" ; - skos:definition "Relation between a link and its target named object. [Allotrope]" ; - skos:prefLabel "linked to" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#lsbPadding -hdf:lsbPadding rdf:type owl:ObjectProperty ; - rdfs:domain hdf:AtomicDatatype ; - rdfs:range hdf:Padding ; - rdfs:comment "Least significant bit padding property of an atomic datatype. [Allotrope]" ; - rdfs:label "least significant bit padding" ; - skos:definition "Least significant bit padding property of an atomic datatype. [Allotrope]" ; - skos:prefLabel "least significant bit padding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#mantissaField -hdf:mantissaField rdf:type owl:ObjectProperty ; - rdfs:subPropertyOf hdf:field ; - rdf:type owl:FunctionalProperty ; - rdfs:range hdf:MantissaField ; - rdfs:comment "Mantissa field property of a field. [Allotrope]" ; - rdfs:label "mantissa field" ; - skos:definition "Mantissa field property of a field. [Allotrope]" ; - skos:prefLabel "mantissa field" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#member -hdf:member rdf:type owl:ObjectProperty ; - rdfs:comment "Relation between collection and the members of it. [Allotrope]" ; - rdfs:label "member" ; - skos:definition "Relation between collection and the members of it. [Allotrope]" ; - skos:prefLabel "member" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#msbPadding -hdf:msbPadding rdf:type owl:ObjectProperty ; - rdfs:domain hdf:AtomicDatatype ; - rdfs:range hdf:Padding ; - rdfs:label "most significant bit padding" ; - skos:definition "Most significant bit padding property of an atomic datatype. [Allotrope]" ; - skos:prefLabel "most significant bit padding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#multiDimensionalIndex -hdf:multiDimensionalIndex rdf:type owl:ObjectProperty ; - rdfs:label "multi index" ; - skos:prefLabel "multi index" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#normalization -hdf:normalization rdf:type owl:ObjectProperty ; - rdfs:domain hdf:FloatDatatype ; - rdfs:range hdf:FloatingPointNormalization ; - rdfs:label "normalization" ; - skos:definition "Normalization property of a float datatype. [Allotrope]" ; - skos:prefLabel "normalization" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#notA -hdf:notA rdf:type owl:ObjectProperty ; - rdfs:label "not A" ; - skos:prefLabel "not A" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#notB -hdf:notB rdf:type owl:ObjectProperty ; - rdfs:label "not B" ; - skos:prefLabel "not B" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#or -hdf:or rdf:type owl:ObjectProperty ; - rdfs:label "or" ; - skos:prefLabel "or" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#order -hdf:order rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Datatype ; - rdfs:range hdf:Order ; - rdfs:label "order" ; - skos:definition "Order property of a datatype. [Allotrope]" ; - skos:prefLabel "order" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#point -hdf:point rdf:type owl:ObjectProperty ; - rdfs:range hdf:Point ; - rdfs:label "point" ; - skos:prefLabel "point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#previous -hdf:previous rdf:type owl:ObjectProperty ; - rdfs:comment "In a combined selection the predicate points to the existing selection that the combination operator is applied on. [Allotrope]" ; - rdfs:label "previous" ; - skos:definition "In a combined selection the predicate points to the existing selection that the combination operator is applied on. [Allotrope]" ; - skos:prefLabel "previous" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#rootGroup -hdf:rootGroup rdf:type owl:ObjectProperty ; - rdfs:domain hdf:File ; - rdfs:range hdf:Group ; - rdfs:label "root group" ; - skos:definition "Relation between the HDF file and its root group. [Allotrope]" ; - skos:prefLabel "root group" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#scaleType -hdf:scaleType rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:ScaleType ; - rdfs:label "scale type" ; - skos:definition "Scale type property of a dataset. [Allotrope]" ; - skos:prefLabel "scale type" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#selectionOn -hdf:selectionOn rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Selection ; - rdfs:range [ rdf:type owl:Class ; - owl:unionOf ( hdf:Dataspace - hdf:Selection - ) - ] ; - rdfs:label "selection on" ; - skos:definition "Relation between a selection and its target, either a dataspace or another selection. [Allotrope]" ; - skos:prefLabel "selection on" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#sign -hdf:sign rdf:type owl:ObjectProperty ; - rdfs:domain hdf:IntegerDatatype ; - rdfs:range hdf:Sign ; - rdfs:label "sign" ; - skos:definition "Sign property of an integer datatype. [Allotrope]" ; - skos:prefLabel "sign" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#signField -hdf:signField rdf:type owl:ObjectProperty ; - rdfs:subPropertyOf hdf:field ; - rdf:type owl:FunctionalProperty ; - rdfs:range hdf:SignField ; - rdfs:label "sign field" ; - skos:definition "Sign field property of a field. [Allotrope]" ; - skos:prefLabel "sign field" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#stringPadding -hdf:stringPadding rdf:type owl:ObjectProperty ; - rdfs:domain hdf:StringDatatype ; - rdfs:range hdf:StringPadding ; - rdfs:label "string padding" ; - skos:definition "String padding property of a string datatype. [Allotrope]" ; - skos:prefLabel "string padding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#szipEncoding -hdf:szipEncoding rdf:type owl:ObjectProperty ; - rdfs:domain hdf:FilterSZip ; - rdfs:range hdf:SZipCoding ; - rdfs:label "SZip encoding" ; - skos:definition "SZip encoding property of a SZip filter. [Allotrope]" ; - skos:prefLabel "SZip encoding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#transferMode -hdf:transferMode rdf:type owl:ObjectProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range hdf:TransferMode ; - rdfs:label "transfer mode" ; - skos:definition "Transfer mode property of a dataset. [Allotrope]" ; - skos:prefLabel "transfer mode" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#typeClass -hdf:typeClass rdf:type owl:ObjectProperty ; - rdfs:range hdf:TypeClass ; - rdfs:label "type class" ; - skos:prefLabel "type class" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#writtenRegion -hdf:writtenRegion rdf:type owl:ObjectProperty ; - rdfs:comment "The region of a dataset that has ever been written to. This typically only encompasses the maximum index in the dimensions, exact tracking is impossible in current HDF because empty positions are indistinguishable from positions with the fill value. [Allotrope]" ; - rdfs:label "written region" ; - skos:definition "The region of a dataset that has ever been written to. This typically only encompasses the maximum index in the dimensions, exact tracking is impossible in current HDF because empty positions are indistinguishable from positions with the fill value. [Allotrope]" ; - skos:prefLabel "written region" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#xor -hdf:xor rdf:type owl:ObjectProperty ; - rdfs:label "xor" ; - skos:altLabel "exclusive or" ; - skos:prefLabel "xor" . - - -################################################################# -# Data properties -################################################################# - -### http://purl.allotrope.org/ontologies/hdf5/1.8#atomicFillValue -hdf:atomicFillValue rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:value ; - rdf:type owl:FunctionalProperty ; - rdfs:domain hdf:Dataset ; - rdfs:comment "User defined fill value for an atomic datatype. [Allotrope]" ; - rdfs:label "atomic fill value" ; - skos:definition "User defined fill value for an atomic datatype. [Allotrope]" ; - skos:prefLabel "atomic fill value" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#block -hdf:block rdf:type owl:DatatypeProperty ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:comment "The block is a count on the number of repetitions of the hyperslab. [Allotrope]" ; - rdfs:label "block" ; - skos:definition "The block is a count on the number of repetitions of the hyperslab. [Allotrope]" ; - skos:prefLabel "block" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#btreeIStoreSize -hdf:btreeIStoreSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:unsignedInt ; - rdfs:label "btree istore size" ; - skos:prefLabel "btree istore size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#btreeLeaf -hdf:btreeLeaf rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "btree leaf" ; - skos:prefLabel "btree leaf" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#btreeRank -hdf:btreeRank rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "btree rank" ; - skos:prefLabel "btree rank" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#btreeRatioLeft -hdf:btreeRatioLeft rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:double ; - rdfs:label "btree left ratio" ; - skos:prefLabel "btree left ratio" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#btreeRatioMiddle -hdf:btreeRatioMiddle rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:double ; - rdfs:label "btree middle ratio" ; - skos:prefLabel "btree middle ratio" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#btreeRatioRight -hdf:btreeRatioRight rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:double ; - rdfs:label "btree right ratio" ; - skos:prefLabel "btree right ratio" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#bufferSize -hdf:bufferSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range xsd:long ; - rdfs:label "buffer size" ; - skos:definition "Size, in bytes, of the type conversion and background buffers. [HDF]" ; - skos:prefLabel "buffer size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#chunkCachePreemptionPolicy -hdf:chunkCachePreemptionPolicy rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:double ; - owl:withRestrictions ( [ xsd:minInclusive "0.0"^^xsd:double - ] - [ xsd:maxInclusive "1.0"^^xsd:double - ] - ) - ] ; - rdfs:comment "The chunk preemption policy for all datasets. This must be between 0 and 1 inclusive and indicates the weighting according to which chunks which have been fully read or written are penalized when determining which chunks to flush from cache. A value of 0 means fully read or written chunks are treated no differently than other chunks (the preemption is strictly LRU) while a value of 1 means fully read or written chunks are always preempted before other chunks. If your application only reads or writes data once, this can be safely set to 1. Otherwise, this should be set lower depending on how often you re-read or re-write the same data. [HDF]" ; - rdfs:label "chunk cache preemption policy" ; - skos:definition "The chunk preemption policy for all datasets. This must be between 0 and 1 inclusive and indicates the weighting according to which chunks which have been fully read or written are penalized when determining which chunks to flush from cache. A value of 0 means fully read or written chunks are treated no differently than other chunks (the preemption is strictly LRU) while a value of 1 means fully read or written chunks are always preempted before other chunks. If your application only reads or writes data once, this can be safely set to 1. Otherwise, this should be set lower depending on how often you re-read or re-write the same data. [HDF]" ; - skos:prefLabel "chunk cache preemption policy" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#chunkCacheSize -hdf:chunkCacheSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range xsd:long ; - rdfs:comment "The number of chunk slots in the raw data chunk cache hash table , the maximum possible number of bytes in the raw data chunk cache, and the preemption policy value. [HDF]" ; - rdfs:label "chunk cache size" ; - skos:definition "The number of chunk slots in the raw data chunk cache hash table , the maximum possible number of bytes in the raw data chunk cache, and the preemption policy value. [HDF]" ; - skos:prefLabel "chunk cache size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#chunkCacheSlots -hdf:chunkCacheSlots rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range xsd:long ; - rdfs:label "chunk cache slots" ; - skos:prefLabel "chunk cache slots" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#collectiveIOThreshold -hdf:collectiveIOThreshold rdf:type owl:DatatypeProperty ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:int ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - [ xsd:maxInclusive "100"^^xsd:int - ] - ) - ] ; - rdfs:label "collective I/O threshold" ; - skos:prefLabel "collective I/O threshold" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#compressionLevel -hdf:compressionLevel rdf:type owl:DatatypeProperty ; - rdfs:range xsd:int ; - rdfs:label "compression level" ; - skos:prefLabel "compression level" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#coordinateIndex -hdf:coordinateIndex rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "index in dimension. [Allotrope]" ; - skos:definition "index in dimension. [Allotrope]" ; - skos:prefLabel "coordinate index" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#count -hdf:count rdf:type owl:DatatypeProperty ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - ) - ] ; - rdfs:comment "The count is the number of elements in the hyperslab selection. When the stride is 1, the selection is a hyper rectangle with a corner at the offset and size count[0] by count[1] by.... When stride is greater than one, the hyperslab bounded by the offset and the corners defined by stride[n] * count[n]. [Allotrope]" ; - rdfs:label "count" ; - skos:definition "The count is the number of elements in the hyperslab selection. When the stride is 1, the selection is a hyper rectangle with a corner at the offset and size count[0] by count[1] by.... When stride is greater than one, the hyperslab bounded by the offset and the corners defined by stride[n] * count[n]. [Allotrope]" ; - skos:prefLabel "count" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#createIntermediateGroups -hdf:createIntermediateGroups rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Link ; - rdfs:range xsd:boolean ; - rdfs:label "create intermediate groups" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#currentSize -hdf:currentSize rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:size ; - rdfs:label "current size" ; - skos:prefLabel "current size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#data -hdf:data rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Attribute ; - rdfs:label "data" ; - skos:prefLabel "data" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#deflateLevel -hdf:deflateLevel rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:int ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:int - ] - [ xsd:maxInclusive "9"^^xsd:int - ] - ) - ] ; - rdfs:label "deflate level" ; - skos:prefLabel "deflate level" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#dimensionIndex -hdf:dimensionIndex rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:range hdf:DimensionIndexType ; - rdfs:comment "index of the dimension. [Allotrope]" ; - rdfs:label "dimension index" ; - skos:definition "index of the dimension. [Allotrope]" ; - skos:prefLabel "dimension index" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ebias -hdf:ebias rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:FloatDatatype ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "ebias" ; - skos:prefLabel "ebias" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#externalLinkCacheSize -hdf:externalLinkCacheSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Link ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "external link cache size" ; - skos:prefLabel "external link cache size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#externalLinkPrefix -hdf:externalLinkPrefix rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Link ; - rdfs:range xsd:string ; - rdfs:label "external link prefix" ; - skos:prefLabel "external link prefix" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#globalFreelistVersion -hdf:globalFreelistVersion rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:int ; - rdfs:label "global freelist version" ; - skos:prefLabel "global freelist version" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#hyperVectorSize -hdf:hyperVectorSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - ) - ] ; - rdfs:label "hyper vector size" ; - skos:prefLabel "hyper vector size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#iStoreK -hdf:iStoreK rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:Dataset ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "iStoreK" ; - skos:prefLabel "iStoreK" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index -hdf:index rdf:type owl:DatatypeProperty ; - rdfs:range hdf:IndexType ; - rdfs:label "index" ; - skos:prefLabel "index" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_0 -hdf:index_0 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 0. [Allotrope]" ; - rdfs:label "index 0" ; - skos:definition "Index in dimension 0. [Allotrope]" ; - skos:prefLabel "index 0" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_1 -hdf:index_1 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 1. [Allotrope]" ; - rdfs:label "index 1" ; - skos:definition "Index in dimension 1. [Allotrope]" ; - skos:prefLabel "index 1" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_10 -hdf:index_10 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 10. [Allotrope]" ; - rdfs:label "index 10" ; - skos:definition "Index in dimension 10. [Allotrope]" ; - skos:prefLabel "index 10" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_11 -hdf:index_11 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 11. [Allotrope]" ; - rdfs:label "index 11" ; - skos:definition "Index in dimension 11. [Allotrope]" ; - skos:prefLabel "index 11" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_12 -hdf:index_12 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 12. [Allotrope]" ; - rdfs:label "index 12" ; - skos:definition "Index in dimension 12. [Allotrope]" ; - skos:prefLabel "index 12" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_13 -hdf:index_13 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 13. [Allotrope]" ; - rdfs:label "index 13" ; - skos:definition "Index in dimension 13. [Allotrope]" ; - skos:prefLabel "index 13" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_14 -hdf:index_14 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 14. [Allotrope]" ; - rdfs:label "index 14" ; - skos:definition "Index in dimension 14. [Allotrope]" ; - skos:prefLabel "index 14" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_15 -hdf:index_15 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 15. [Allotrope]" ; - rdfs:label "index 15" ; - skos:definition "Index in dimension 15. [Allotrope]" ; - skos:prefLabel "index 15" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_16 -hdf:index_16 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 16. [Allotrope]" ; - rdfs:label "index 16" ; - skos:definition "Index in dimension 16. [Allotrope]" ; - skos:prefLabel "index 16" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_17 -hdf:index_17 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 17. [Allotrope]" ; - rdfs:label "index 17" ; - skos:definition "Index in dimension 17. [Allotrope]" ; - skos:prefLabel "index 17" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_18 -hdf:index_18 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 18. [Allotrope]" ; - rdfs:label "index 18" ; - skos:definition "Index in dimension 18. [Allotrope]" ; - skos:prefLabel "index 18" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_19 -hdf:index_19 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 19. [Allotrope]" ; - rdfs:label "index 19" ; - skos:definition "Index in dimension 19. [Allotrope]" ; - skos:prefLabel "index 19" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_2 -hdf:index_2 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 2. [Allotrope]" ; - rdfs:label "index 2" ; - skos:definition "Index in dimension 2. [Allotrope]" ; - skos:prefLabel "index 2" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_20 -hdf:index_20 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 20. [Allotrope]" ; - rdfs:label "index 20" ; - skos:definition "Index in dimension 20. [Allotrope]" ; - skos:prefLabel "index 20" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_21 -hdf:index_21 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 21. [Allotrope]" ; - rdfs:label "index 21" ; - skos:definition "Index in dimension 21. [Allotrope]" ; - skos:prefLabel "index 21" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_22 -hdf:index_22 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 22. [Allotrope]" ; - rdfs:label "index 22" ; - skos:definition "Index in dimension 22. [Allotrope]" ; - skos:prefLabel "index 22" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_23 -hdf:index_23 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 23. [Allotrope]" ; - rdfs:label "index 23" ; - skos:definition "Index in dimension 23. [Allotrope]" ; - skos:prefLabel "index 23" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_24 -hdf:index_24 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 24. [Allotrope]" ; - rdfs:label "index 24" ; - skos:definition "Index in dimension 24. [Allotrope]" ; - skos:prefLabel "index 24" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_25 -hdf:index_25 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 25. [Allotrope]" ; - rdfs:label "index 25" ; - skos:definition "Index in dimension 25. [Allotrope]" ; - skos:prefLabel "index 25" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_26 -hdf:index_26 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 26. [Allotrope]" ; - rdfs:label "index 26" ; - skos:definition "Index in dimension 26. [Allotrope]" ; - skos:prefLabel "index 26" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_27 -hdf:index_27 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "index in dimension 27. [Allotrope]" ; - rdfs:label "index 27" ; - skos:definition "Index in dimension 27. [Allotrope]" ; - skos:prefLabel "index 27" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_28 -hdf:index_28 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "index in dimension 28. [Allotrope]" ; - rdfs:label "index 28" ; - skos:definition "Index in dimension 28. [Allotrope]" ; - skos:prefLabel "index 28" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_29 -hdf:index_29 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "index in dimension 29. [Allotrope]" ; - rdfs:label "index 29" ; - skos:definition "Index in dimension 29. [Allotrope]" ; - skos:prefLabel "index 29" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_3 -hdf:index_3 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 3. [Allotrope]" ; - rdfs:label "index 3" ; - skos:definition "Index in dimension 3. [Allotrope]" ; - skos:prefLabel "index 3" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_30 -hdf:index_30 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 30. [Allotrope]" ; - rdfs:label "index 30" ; - skos:definition "Index in dimension 30. [Allotrope]" ; - skos:prefLabel "index 30" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_31 -hdf:index_31 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 31. [Allotrope]" ; - rdfs:label "index 31" ; - skos:definition "Index in dimension 31. [Allotrope]" ; - skos:prefLabel "index 31" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_4 -hdf:index_4 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 4. [Allotrope]" ; - rdfs:label "index 4" ; - skos:definition "Index in dimension 4. [Allotrope]" ; - skos:prefLabel "index 4" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_5 -hdf:index_5 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 5. [Allotrope]" ; - rdfs:label "index 5" ; - skos:definition "Index in dimension 5. [Allotrope]" ; - skos:prefLabel "index 5" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_6 -hdf:index_6 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 6. [Allotrope]" ; - rdfs:label "index 6" ; - skos:definition "Index in dimension 6. [Allotrope]" ; - skos:prefLabel "index 6" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_7 -hdf:index_7 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 7. [Allotrope]" ; - rdfs:label "index 7" ; - skos:definition "Index in dimension 7. [Allotrope]" ; - skos:prefLabel "index 7" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_8 -hdf:index_8 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 8. [Allotrope]" ; - rdfs:label "index 8" ; - skos:definition "Index in dimension 8. [Allotrope]" ; - skos:prefLabel "index 8" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#index_9 -hdf:index_9 rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "Index in dimension 9. [Allotrope]" ; - rdfs:label "index 9" ; - skos:definition "Index in dimension 9. [Allotrope]" ; - skos:prefLabel "index 9" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#initialSize -hdf:initialSize rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:size ; - rdfs:label "initial size" ; - skos:prefLabel "initial size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#isVariableLength -hdf:isVariableLength rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:StringDatatype ; - rdfs:range xsd:boolean ; - rdfs:comment "flag indicating that a string type is of variable length. [Allotrope]" ; - rdfs:label "is variable length" ; - skos:definition "flag indicating that a string type is of variable length. [Allotrope]" ; - skos:prefLabel "is variable length" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#linkedChunkThreshold -hdf:linkedChunkThreshold rdf:type owl:DatatypeProperty ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:int ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:int - ] - ) - ] ; - rdfs:label "linked chunk threshold" ; - skos:prefLabel "linked chunk threshold" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#maximumLinkTraversals -hdf:maximumLinkTraversals rdf:type owl:DatatypeProperty ; - rdfs:range xsd:int ; - rdfs:label "maximum link traversals" ; - skos:prefLabel "maximum link traversals" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#maximumSize -hdf:maximumSize rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:size ; - rdfs:label "maximum size" ; - skos:prefLabel "maximum size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#metaBlockSize -hdf:metaBlockSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:long ; - rdfs:label "meta block size" ; - skos:prefLabel "meta block size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#minimumSize -hdf:minimumSize rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:size ; - rdfs:label "minimum size" ; - skos:prefLabel "minimum size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#name -hdf:name rdf:type owl:DatatypeProperty ; - rdfs:range xsd:string ; - rdfs:label "name" ; - skos:prefLabel "name" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#offset -hdf:offset rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:AtomicDatatype ; - rdfs:range xsd:int ; - rdfs:comment "The bit offset of the first significant bit. The significant bits of an atomic datum can be offset from the beginning of the memory for that datum by an amount of padding. [Allotrope]" ; - rdfs:label "offset size" ; - skos:definition "The bit offset of the first significant bit. The significant bits of an atomic datum can be offset from the beginning of the memory for that datum by an amount of padding. [Allotrope]" ; - skos:prefLabel "offset size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#pixelsPerBlock -hdf:pixelsPerBlock rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:FilterSZip ; - rdfs:range xsd:int ; - rdfs:label "pixels per block" ; - skos:prefLabel "pixels per block" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#position -hdf:position rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:FieldSpecification ; - rdfs:range xsd:nonNegativeInteger ; - rdfs:label "position" ; - skos:prefLabel "position" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#precision -hdf:precision rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:AtomicDatatype ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:long ; - owl:withRestrictions ( [ xsd:minExclusive "0"^^xsd:long - ] - ) - ] ; - rdfs:comment "The precision is the number of significant bits which, unless padding is present, is 8 times larger than the value returned by size. [Allotrope]" , - "precision must be a multiple of 8" ; - rdfs:label "precision" ; - skos:definition "The precision is the number of significant bits which, unless padding is present, is 8 times larger than the value returned by size. [Allotrope]" ; - skos:note "Precision must be a multiple of 8. [Allotrope]" ; - skos:prefLabel "precision" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#preserve -hdf:preserve rdf:type owl:DatatypeProperty ; - rdfs:range xsd:boolean ; - rdfs:label "preserve" ; - skos:prefLabel "preserve" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#rank -hdf:rank rdf:type owl:DatatypeProperty ; - rdfs:domain [ rdf:type owl:Class ; - owl:unionOf ( hdf:ArrayDatatype - hdf:Dataset - hdf:Dataspace - ) - ] ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:int ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:int - ] - [ xsd:maxInclusive "32"^^xsd:int - ] - ) - ] ; - rdfs:label "rank" ; - skos:prefLabel "rank" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#scaleFactor -hdf:scaleFactor rdf:type owl:DatatypeProperty ; - rdfs:range xsd:int ; - rdfs:label "scale factor" ; - skos:prefLabel "scale factor" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#sharedObjectHeaderVersion -hdf:sharedObjectHeaderVersion rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:int ; - rdfs:label "shared object header version" ; - skos:prefLabel "shared object header version" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#sieveBufferSize -hdf:sieveBufferSize rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf owl:topDataProperty ; - rdfs:range xsd:long ; - rdfs:label "sieve buffer size" ; - skos:prefLabel "sieve buffer size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#size -hdf:size rdf:type owl:DatatypeProperty ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:long ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:long - ] - ) - ] ; - rdfs:comment "Size of a dimension or size a datatype in bytes. For variable length strings or variable length datatypes the size is the size of the structure holding the pointer to the variable length data, not the size of the data. [HDF]" ; - rdfs:label "size" ; - skos:altLabel "size of datatype" , - "size of dimension" ; - skos:definition "Size of a dimension or size a datatype in bytes. For variable length strings or variable length datatypes the size is the size of the structure holding the pointer to the variable length data, not the size of the data. [HDF]" ; - skos:prefLabel "size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#sizeOfAddress -hdf:sizeOfAddress rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:unsignedInt ; - rdfs:label "size of address" ; - skos:prefLabel "size of address" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#sizeOfSize -hdf:sizeOfSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:unsignedInt ; - rdfs:label "size of size" ; - skos:prefLabel "size of size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#smallDataBlockSize -hdf:smallDataBlockSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:long , - xsd:nonNegativeInteger ; - rdfs:comment """smallDataBlockSize reserves blocks of size bytes for the contiguous storage of the raw data portion of small datasets. The HDF5 library then writes the raw data from small datasets to this reserved space, thus reducing unnecessary discontinuities within blocks of meta data and improving I/O performance. - - A small data block is actually allocated the first time a qualifying small dataset is written to the file. Space for the raw data portion of this small dataset is suballocated within the small data block. The raw data from each subsequent small dataset is also written to the small data block until it is filled; additional small data blocks are allocated as required. - - The HDF5 library employs an algorithm that determines whether I/O performance is likely to benefit from the use of this mechanism with each dataset as storage space is allocated in the file. A larger size will result in this mechanism being employed with larger datasets. - - Setting size to zero (0) disables the small data block mechanism. [HDF]""" ; - rdfs:label "small datablock size" ; - skos:definition """smallDataBlockSize reserves blocks of size bytes for the contiguous storage of the raw data portion of small datasets. The HDF5 library then writes the raw data from small datasets to this reserved space, thus reducing unnecessary discontinuities within blocks of meta data and improving I/O performance. - - A small data block is actually allocated the first time a qualifying small dataset is written to the file. Space for the raw data portion of this small dataset is suballocated within the small data block. The raw data from each subsequent small dataset is also written to the small data block until it is filled; additional small data blocks are allocated as required. - - The HDF5 library employs an algorithm that determines whether I/O performance is likely to benefit from the use of this mechanism with each dataset as storage space is allocated in the file. A larger size will result in this mechanism being employed with larger datasets. - - Setting size to zero (0) disables the small data block mechanism. [HDF]""" ; - skos:prefLabel "small datablock size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#start -hdf:start rdf:type owl:DatatypeProperty ; - rdfs:subPropertyOf hdf:index ; - rdfs:comment "The start offset defines the origin of the hyperslab in the original dataspace. [Allotrope]" ; - rdfs:label "start" ; - skos:definition "The start offset defines the origin of the hyperslab in the original dataspace. [Allotrope]" ; - skos:prefLabel "start" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#stride -hdf:stride rdf:type owl:DatatypeProperty ; - rdfs:range [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - ) - ] ; - rdfs:comment "The stride is the number of elements to increment between selected elements. A stride of ‘1’ is every element, a stride of ‘2’ is every second element, etc. [Allotrope]" ; - rdfs:label "stride" ; - skos:definition "The stride is the number of elements to increment between selected elements. A stride of ‘1’ is every element, a stride of ‘2’ is every second element, etc. [Allotrope]" ; - skos:prefLabel "stride" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#superBlockVersion -hdf:superBlockVersion rdf:type owl:DatatypeProperty ; - rdfs:label "super block version" ; - skos:prefLabel "super block version" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#symbolTableNodeSize -hdf:symbolTableNodeSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:unsignedInt ; - rdfs:label "symbol table node size" ; - skos:prefLabel "symbol table node size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#symbolTableTreeRank -hdf:symbolTableTreeRank rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:unsignedInt ; - rdfs:label "symbol table tree rank" ; - skos:prefLabel "symbol table tree rank" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#symbolTableVersion -hdf:symbolTableVersion rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:int ; - rdfs:label "symbol table version" ; - skos:prefLabel "symbol table version" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#trackTimes -hdf:trackTimes rdf:type owl:DatatypeProperty ; - rdfs:range xsd:boolean ; - rdfs:label "track times" ; - skos:prefLabel "track times" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#userBlockSize -hdf:userBlockSize rdf:type owl:DatatypeProperty ; - rdfs:domain hdf:File ; - rdfs:range xsd:long ; - rdfs:label "user block size" ; - skos:prefLabel "user block size" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#value -hdf:value rdf:type owl:DatatypeProperty ; - rdfs:label "value" ; - skos:prefLabel "value" . - - -################################################################# -# Classes -################################################################# - -### http://purl.allotrope.org/ontologies/hdf5/1.8#AllSelection -hdf:AllSelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection ; - rdfs:comment "A selection of all the datapoints in the dataspace. [Allotrope]" ; - rdfs:label "all selection" ; - skos:definition "A selection of all the datapoints in the dataspace. [Allotrope]" ; - skos:prefLabel "all selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#AndSelection -hdf:AndSelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:and ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:previous ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] ; - rdfs:comment "A selection that retains only the overlapping portions of the new selection and the existing selection (Binary AND) With the HDF API this is done by calling H5Sselect_hyperslab and select operation H5S_SELECT_AND. [Allotrope]" ; - rdfs:label "and selection" ; - skos:definition "A selection that retains only the overlapping portions of the new selection and the existing selection (Binary AND) With the HDF API this is done by calling H5Sselect_hyperslab and select operation H5S_SELECT_AND. [Allotrope]" ; - skos:prefLabel "and selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ArrayDatatype -hdf:ArrayDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:CompositeDatatype , - [ owl:intersectionOf ( [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimension ; - owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:ArrayDimension - ] - [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimension ; - owl:maxQualifiedCardinality "32"^^xsd:nonNegativeInteger ; - owl:onClass hdf:ArrayDimension - ] - ) ; - rdf:type owl:Class - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_ARRAY - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:datatype ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Datatype - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:rank ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minExclusive 0 - ] - [ xsd:maxInclusive 32 - ] - ) - ] - ] ; - rdfs:label "array datatype" ; - skos:prefLabel "array datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ArrayDimension -hdf:ArrayDimension rdf:type owl:Class ; - rdfs:subClassOf hdf:Dimension , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:size ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minExclusive 0 - ] - ) - ] - ] ; - rdfs:label "array dimension" ; - skos:prefLabel "array dimension" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ArrayValue -hdf:ArrayValue rdf:type owl:Class ; - rdfs:subClassOf hdf:CompositeValue , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:member ; - owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:PointValuePair - ] ; - owl:disjointWith hdf:CompoundValue ; - rdfs:comment "Value representation for arrays or variable length types. [Allotrope]" ; - rdfs:label "array value" ; - skos:definition "Value representation for arrays or variable length types. [Allotrope]" ; - skos:prefLabel "array value" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#AtomicDatatype -hdf:AtomicDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:Datatype ; - owl:disjointWith hdf:CompositeDatatype ; - rdfs:comment "Atomic datatypes are those that are not decomposed at the datatype interface level, such as integers and floats. [Allotrope]" ; - rdfs:label "atomic datatype" ; - skos:definition "Atomic datatypes are those that are not decomposed at the datatype interface level, such as integers and floats. [Allotrope]" ; - skos:prefLabel "atomic datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Attribute -hdf:Attribute rdf:type owl:Class ; - rdfs:comment "Attributes are small named datasets that are attached to primary datasets, groups, or named datatypes. Attributes can be used to describe the nature and/or the intended usage of a dataset or group. An attribute has two parts: (1) a name and (2) a value. The value part contains one or more data entries of the same datatype. [Allotrope]" ; - rdfs:label "attribute" ; - skos:definition "Attributes are small named datasets that are attached to primary datasets, groups, or named datatypes. Attributes can be used to describe the nature and/or the intended usage of a dataset or group. An attribute has two parts: (1) a name and (2) a value. The value part contains one or more data entries of the same datatype. [Allotrope]" ; - skos:prefLabel "attribute" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#BitfieldDatatype -hdf:BitfieldDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:AtomicDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_BITFIELD - ] ; - rdfs:label "bitfield" ; - skos:prefLabel "bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#CharacterSet -hdf:CharacterSet rdf:type owl:Class ; - rdfs:label "character set" ; - skos:prefLabel "character set" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Chunk -hdf:Chunk rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimension ; - owl:someValuesFrom hdf:ChunkDimension - ] ; - rdfs:label "chunk" ; - skos:prefLabel "chunk" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ChunkDimension -hdf:ChunkDimension rdf:type owl:Class ; - rdfs:subClassOf hdf:Dimension ; - rdfs:label "chunk dimension" ; - skos:prefLabel "chunk dimension" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ChunkMode -hdf:ChunkMode rdf:type owl:Class ; - rdfs:comment """ChunkMode specifies whether I/O is to be performed as linked-chunk I/O or as multi-chunk I/O. This function overrides the HDF5 Library's internal algorithm for determining which mechanism to use. - -When an application uses collective I/O with chunked storage, the HDF5 Library normally uses an internal algorithm to determine whether that I/O activity should be conducted as one linked-chunk I/O or as multi-chunk I/O. ChunkMode is provided so that an application can override the library's algorithm in circumstances where the library might lack the information needed to make an optimal decision. [HDF]""" ; - rdfs:label "chunk mode" ; - skos:definition """ChunkMode specifies whether I/O is to be performed as linked-chunk I/O or as multi-chunk I/O. This function overrides the HDF5 Library's internal algorithm for determining which mechanism to use. - -When an application uses collective I/O with chunked storage, the HDF5 Library normally uses an internal algorithm to determine whether that I/O activity should be conducted as one linked-chunk I/O or as multi-chunk I/O. ChunkMode is provided so that an application can override the library's algorithm in circumstances where the library might lack the information needed to make an optimal decision. [HDF]""" ; - skos:prefLabel "chunk mode" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#CompositeDatatype -hdf:CompositeDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:Datatype ; - rdfs:label "composite datatype" ; - skos:prefLabel "composite datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#CompositeValue -hdf:CompositeValue rdf:type owl:Class ; - owl:equivalentClass [ rdf:type owl:Class ; - owl:unionOf ( hdf:ArrayValue - hdf:CompoundValue - ) - ] ; - rdfs:label "composite value" ; - skos:prefLabel "composite value" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#CompoundDatatype -hdf:CompoundDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:CompositeDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_COMPOUND - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:member ; - owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:CompoundDatatypeMember - ] ; - rdfs:comment "A collection of one or more atomic types or small arrays of such types. Similar to a struct in C or a common block in Fortran. [Allotrope]" ; - rdfs:label "compound datatype" ; - skos:definition "A collection of one or more atomic types or small arrays of such types. Similar to a struct in C or a common block in Fortran. [Allotrope]" ; - skos:prefLabel "compound datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#CompoundDatatypeMember -hdf:CompoundDatatypeMember rdf:type owl:Class ; - rdfs:subClassOf [ owl:intersectionOf ( [ rdf:type owl:Restriction ; - owl:onProperty hdf:datatype ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Datatype - ] - [ rdf:type owl:Restriction ; - owl:onProperty hdf:name ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange xsd:string - ] - ) ; - rdf:type owl:Class - ] ; - rdfs:label "compound type member" ; - skos:prefLabel "compound type member" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#CompoundValue -hdf:CompoundValue rdf:type owl:Class ; - rdfs:subClassOf hdf:CompositeValue , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:member ; - owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:NameValuePair - ] ; - rdfs:comment "Value representation for compound types. [Allotrope]" ; - rdfs:label "compound value" ; - skos:definition "Value representation for compound types. [Allotrope]" ; - skos:prefLabel "compound value" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Coordinate -hdf:Coordinate rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:coordinateIndex ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimensionIndex ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:DimensionIndexType - ] ; - rdfs:comment "Index coordinate of a point in multi-dimensional array. [Allotrope]" ; - rdfs:label "coordinate" ; - skos:definition "Index coordinate of a point in multi-dimensional array. [Allotrope]" ; - skos:prefLabel "coordinate" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#DataStream -hdf:DataStream rdf:type owl:Class ; - rdfs:comment "A data stream represents the bitstream of data flowing from source to target. The data stream may include data conversion if datatypes of source and target differ, and may include transformations like compression or encryption. Source and targets are hyperslabs on datasets. [Allotrope]" ; - rdfs:label "data stream" ; - skos:definition "A data stream represents the bitstream of data flowing from source to target. The data stream may include data conversion if datatypes of source and target differ, and may include transformations like compression or encryption. Source and targets are hyperslabs on datasets. [Allotrope]" ; - skos:prefLabel "data stream" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Dataset -hdf:Dataset rdf:type owl:Class ; - rdfs:subClassOf hdf:NamedObject , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:dataspace ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Dataspace - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:layout ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:StorageLayout - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:writtenRegion ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:rank ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - [ xsd:maxInclusive 32 - ] - ) - ] - ] ; - owl:disjointWith hdf:Group ; - rdfs:comment "A multi-dimensional array of data elements, together with supporting metadata. [Allotrope]" ; - rdfs:label "dataset" ; - skos:definition "A multi-dimensional array of data elements, together with supporting metadata. [Allotrope]" ; - skos:prefLabel "dataset" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Dataspace -hdf:Dataspace rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimension ; - owl:maxQualifiedCardinality "32"^^xsd:nonNegativeInteger ; - owl:onClass hdf:DataspaceDimension - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:rank ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:int ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:int - ] - [ xsd:maxInclusive "32"^^xsd:int - ] - ) - ] - ] ; - rdfs:comment "A dataset dataspace describes the dimensionality of the dataset. The dimensions of a dataset can be fixed (unchanging), or they may be unlimited, which means that they are extendible (i.e. they can grow larger). [Allotrope]" ; - rdfs:label "dataspace" ; - skos:definition "A dataset dataspace describes the dimensionality of the dataset. The dimensions of a dataset can be fixed (unchanging), or they may be unlimited, which means that they are extendible (i.e. they can grow larger). [Allotrope]" ; - skos:prefLabel "dataspace" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#DataspaceDimension -hdf:DataspaceDimension rdf:type owl:Class ; - rdfs:subClassOf hdf:Dimension , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:initialSize ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:int ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - ) - ] - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:currentSize ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive "0"^^xsd:int - ] - ) - ] - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:maximumSize ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive -1 - ] - ) - ] - ] ; - rdfs:label "dataspace dimension" ; - skos:prefLabel "dataspace dimension" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Datatype -hdf:Datatype rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:TypeClass - ] ; - rdfs:comment "An object that describes the storage format of the individual data points in a data set. There are two categories of datatypes: atomic and compound datatypes. An atomic type is a type which cannot be decomposed into smaller units at the API level. A compound datatype is a collection of one or more atomic types or small arrays of such types. [Allotrope]" ; - rdfs:label "datatype" ; - skos:definition "An object that describes the storage format of the individual data points in a data set. There are two categories of datatypes: atomic and compound datatypes. An atomic type is a type which cannot be decomposed into smaller units at the API level. A compound datatype is a collection of one or more atomic types or small arrays of such types. [Allotrope]" ; - skos:prefLabel "datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Dimension -hdf:Dimension rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:size ; - owl:someValuesFrom [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - ) - ] - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimensionIndex ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:DimensionIndexType - ] ; - rdfs:label "dimension" ; - skos:prefLabel "dimension" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#DimensionSelection -hdf:DimensionSelection rdf:type owl:Class ; - rdfs:label "dimension selection" ; - skos:prefLabel "dimension selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#EnumerationDatatype -hdf:EnumerationDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:CompositeDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_ENUM - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:member ; - owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:EnumerationDatatypeMember - ] ; - rdfs:comment "A one-to-one mapping between a set of symbols and a set of integer values, and an order is imposed on the symbols by their integer values. The symbols are passed between the application and library as character strings and all the values for a particular enumeration datatype are of the same integer type, which is not necessary a native type. [Allotrope]" ; - rdfs:label "enumeration datatype" ; - skos:definition "A one-to-one mapping between a set of symbols and a set of integer values, and an order is imposed on the symbols by their integer values. The symbols are passed between the application and library as character strings and all the values for a particular enumeration datatype are of the same integer type, which is not necessary a native type. [Allotrope]" ; - skos:prefLabel "enumeration datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#EnumerationDatatypeMember -hdf:EnumerationDatatypeMember rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:name ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange xsd:string - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:value ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange xsd:integer - ] ; - rdfs:label "enumeration type member" ; - skos:prefLabel "enumeration type member" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ErrorDetectionCheck -hdf:ErrorDetectionCheck rdf:type owl:Class ; - rdfs:label "error detection check" ; - skos:prefLabel "error detection check" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ExponentField -hdf:ExponentField rdf:type owl:Class ; - rdfs:subClassOf hdf:FieldSpecification ; - rdfs:label "exponent field" ; - skos:prefLabel "exponent field" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ExternalFile -hdf:ExternalFile rdf:type owl:Class ; - rdfs:label "external file" ; - skos:prefLabel "external file" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FieldSpecification -hdf:FieldSpecification rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:size ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:integer ; - owl:withRestrictions ( [ xsd:minInclusive 0 - ] - ) - ] - ] ; - rdfs:label "field specialization" ; - skos:prefLabel "field specialization" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#File -hdf:File rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:rootGroup ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Group - ] ; - rdfs:comment "A container for storing grouped collections of multi-dimensional arrays containing scientific data following the HDF 5 specification. [Allotrope]" ; - rdfs:label "file" ; - skos:altLabel "HDF 5 file" ; - skos:definition "A container for storing grouped collections of multi-dimensional arrays containing scientific data following the HDF 5 specification. [Allotrope]" ; - skos:prefLabel "file" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FileAccessMode -hdf:FileAccessMode rdf:type owl:Class ; - rdfs:comment "Determines whether an existing file will be overwritten, opened for read-only access, or opened for read/write access. All newly created files are opened for both reading and writing. [Allotrope]" ; - rdfs:label "file access mode" ; - skos:definition "Determines whether an existing file will be overwritten, opened for read-only access, or opened for read/write access. All newly created files are opened for both reading and writing. [Allotrope]" ; - skos:prefLabel "file access mode" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FillTime -hdf:FillTime rdf:type owl:Class ; - rdfs:label "fill time" ; - skos:prefLabel "fill time" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FillValueStatus -hdf:FillValueStatus rdf:type owl:Class ; - rdfs:label "fill value status" ; - skos:prefLabel "fill value status" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Filter -hdf:Filter rdf:type owl:Class ; - rdfs:label "filter" ; - skos:prefLabel "filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FilterDefault -hdf:FilterDefault rdf:type owl:Class ; - rdfs:subClassOf hdf:Filter ; - rdfs:label "default filter" ; - skos:prefLabel "default filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FilterDeflate -hdf:FilterDeflate rdf:type owl:Class ; - rdfs:subClassOf hdf:Filter ; - rdfs:label "deflate filter" ; - skos:prefLabel "deflate filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FilterFletcher -hdf:FilterFletcher rdf:type owl:Class ; - rdfs:subClassOf hdf:Filter ; - rdfs:label "Fletcher filter" ; - skos:prefLabel "Fletcher filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FilterNBit -hdf:FilterNBit rdf:type owl:Class ; - rdfs:subClassOf hdf:Filter ; - rdfs:label "NBit filter" ; - skos:prefLabel "NBit filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FilterSZip -hdf:FilterSZip rdf:type owl:Class ; - rdfs:subClassOf hdf:Filter ; - rdfs:label "SZip filter" ; - skos:prefLabel "SZip filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FilterScaleOffset -hdf:FilterScaleOffset rdf:type owl:Class ; - rdfs:subClassOf hdf:Filter ; - rdfs:label "scale offset filter" ; - skos:prefLabel "scale offset filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FilterShuffle -hdf:FilterShuffle rdf:type owl:Class ; - rdfs:subClassOf hdf:Filter ; - rdfs:label "shuffle filter" ; - skos:prefLabel "shuffle filter" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FloatAttribute -hdf:FloatAttribute rdf:type owl:Class ; - rdfs:subClassOf hdf:Attribute ; - rdfs:label "float attribute" ; - skos:prefLabel "float attribute" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FloatDatatype -hdf:FloatDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:AtomicDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_FLOAT - ] ; - rdfs:label "float" ; - skos:prefLabel "float" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#FloatingPointNormalization -hdf:FloatingPointNormalization rdf:type owl:Class ; - rdfs:label "floating-point normalization" ; - skos:prefLabel "floating-point normalization" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Group -hdf:Group rdf:type owl:Class ; - rdfs:subClassOf hdf:NamedObject ; - rdfs:comment "A grouping structure containing instances of zero or more groups or datasets, together with supporting metadata. [Allotrope]" ; - rdfs:label "group" ; - skos:definition "A grouping structure containing instances of zero or more groups or datasets, together with supporting metadata. [Allotrope]" ; - skos:prefLabel "group" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#HardLink -hdf:HardLink rdf:type owl:Class ; - rdfs:subClassOf hdf:Link , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:linkedTo ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:NamedObject - ] ; - rdfs:comment "A direct association between a name and the object where both exist in a single HDF5 address space. [Allotrope]" ; - rdfs:label "hard link" ; - skos:definition "A direct association between a name and the object where both exist in a single HDF5 address space. [Allotrope]" ; - skos:prefLabel "hard link" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#HyperSlab -hdf:HyperSlab rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection ; - rdfs:comment "A portion of a dataset. A hyperslab selection can be a logically contiguous collection of points in a dataspace or a regular pattern of points or blocks in a dataspace. [Allotrope]" ; - rdfs:label "hyperslab" ; - skos:definition "A portion of a dataset. A hyperslab selection can be a logically contiguous collection of points in a dataspace or a regular pattern of points or blocks in a dataspace. [Allotrope]" ; - skos:prefLabel "hyperslab" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#IntegerAttribute -hdf:IntegerAttribute rdf:type owl:Class ; - rdfs:subClassOf hdf:Attribute ; - rdfs:label "integer attribute" ; - skos:prefLabel "integer attribute" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#IntegerDatatype -hdf:IntegerDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:AtomicDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_INTEGER - ] ; - rdfs:label "integer" ; - skos:prefLabel "integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Link -hdf:Link rdf:type owl:Class ; - rdfs:comment "An association between a name and the object in an HDF5 file group. [Allotrope]" ; - rdfs:label "link" ; - skos:prefLabel "link" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#MantissaField -hdf:MantissaField rdf:type owl:Class ; - rdfs:subClassOf hdf:FieldSpecification ; - rdfs:label "mantissa field" ; - skos:prefLabel "mantissa field" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#MessageTypeFlag -hdf:MessageTypeFlag rdf:type owl:Class ; - rdfs:label "message time flag" ; - skos:prefLabel "message time flag" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#NameValuePair -hdf:NameValuePair rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Class ; - owl:unionOf ( [ owl:intersectionOf ( [ rdf:type owl:Restriction ; - owl:onProperty hdf:compositeValue ; - owl:maxQualifiedCardinality "0"^^xsd:nonNegativeInteger ; - owl:onClass hdf:CompositeValue - ] - [ rdf:type owl:Restriction ; - owl:onProperty hdf:value ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange rdf:Literal - ] - ) ; - rdf:type owl:Class - ] - [ owl:intersectionOf ( [ rdf:type owl:Restriction ; - owl:onProperty hdf:compositeValue ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:CompositeValue - ] - [ rdf:type owl:Restriction ; - owl:onProperty hdf:value ; - owl:maxQualifiedCardinality "0"^^xsd:nonNegativeInteger ; - owl:onDataRange rdf:Literal - ] - ) ; - rdf:type owl:Class - ] - ) - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:name ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange xsd:string - ] ; - rdfs:label "name-value pair" ; - skos:prefLabel "name-value pair" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#NamedDatatype -hdf:NamedDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:Datatype , - hdf:NamedObject ; - rdfs:comment "Named datatypes are either atomic or compound datatypes that have been specifically designated to be shared across datasets. [Allotrope]" ; - rdfs:label "named datatype" ; - skos:definition "Named datatypes are either atomic or compound datatypes that have been specifically designated to be shared across datasets. [Allotrope]" ; - skos:prefLabel "named datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#NamedObject -hdf:NamedObject rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:name ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange xsd:string - ] ; - rdfs:label "named object" ; - skos:prefLabel "named object" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#NoneSelection -hdf:NoneSelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection ; - rdfs:label "none selection" ; - skos:prefLabel "none selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#NotASelection -hdf:NotASelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:notA ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:previous ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] ; - rdfs:label "not A selection" ; - skos:prefLabel "not A selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#NotBSelection -hdf:NotBSelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:notB ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:previous ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] ; - rdfs:label "not B selection" ; - skos:prefLabel "not B selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#OpaqueAttribute -hdf:OpaqueAttribute rdf:type owl:Class ; - rdfs:subClassOf hdf:Attribute ; - rdfs:label "opaque attribute" ; - skos:prefLabel "opaque attribute" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#OpaqueDatatype -hdf:OpaqueDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:AtomicDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_OPAQUE - ] ; - rdfs:comment "A mechanism for describing data which cannot be otherwise described by HDF5. The only properties associated with opaque types are a size in bytes and an ASCII tag. [Allotrope]" ; - rdfs:label "opaque datatype" ; - skos:definition "A mechanism for describing data which cannot be otherwise described by HDF5. The only properties associated with opaque types are a size in bytes and an ASCII tag. [Allotrope]" ; - skos:prefLabel "opaque datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#OrSelection -hdf:OrSelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:or ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:previous ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] ; - rdfs:label "or selection" ; - skos:prefLabel "or selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Order -hdf:Order rdf:type owl:Class ; - rdfs:label "order" ; - skos:prefLabel "order" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Padding -hdf:Padding rdf:type owl:Class ; - rdfs:label "padding" ; - skos:prefLabel "padding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Point -hdf:Point rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:coordinate ; - owl:maxQualifiedCardinality "32"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Coordinate - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_0 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_1 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_10 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_11 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_12 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_13 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_14 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_15 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_16 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_17 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_18 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_19 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_2 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_20 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_21 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_22 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_23 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_24 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_25 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_26 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_27 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_28 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_29 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_3 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_30 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_31 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_4 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_5 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_6 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_7 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_8 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_9 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] ; - rdfs:comment "Addresses a point in the dataspace. [Allotrope]" ; - rdfs:label "point" ; - skos:definition "Addresses a point in the dataspace. [Allotrope]" ; - skos:prefLabel "point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#PointSelection -hdf:PointSelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:point ; - owl:someValuesFrom hdf:Point - ] ; - rdfs:comment "A selection of individual datapoints in the dataspace. [Allotrope]" ; - rdfs:label "point selection" ; - skos:definition "A selection of individual datapoints in the dataspace. [Allotrope]" ; - skos:prefLabel "point selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#PointValuePair -hdf:PointValuePair rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Class ; - owl:unionOf ( [ owl:intersectionOf ( [ rdf:type owl:Restriction ; - owl:onProperty hdf:compositeValue ; - owl:maxQualifiedCardinality "0"^^xsd:nonNegativeInteger ; - owl:onClass hdf:CompositeValue - ] - [ rdf:type owl:Restriction ; - owl:onProperty hdf:value ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange rdf:Literal - ] - ) ; - rdf:type owl:Class - ] - [ owl:intersectionOf ( [ rdf:type owl:Restriction ; - owl:onProperty hdf:compositeValue ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:CompositeValue - ] - [ rdf:type owl:Restriction ; - owl:onProperty hdf:value ; - owl:maxQualifiedCardinality "0"^^xsd:nonNegativeInteger ; - owl:onDataRange rdf:Literal - ] - ) ; - rdf:type owl:Class - ] - ) - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:coordinate ; - owl:maxQualifiedCardinality "32"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Coordinate - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_0 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_1 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_10 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_11 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_12 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_13 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_14 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_15 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_16 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_17 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_18 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_19 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_2 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_20 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_21 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_22 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_23 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_24 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_25 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_26 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_27 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_28 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_29 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_3 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_30 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_31 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_4 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_5 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_6 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_7 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_8 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:index_9 ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange hdf:IndexType - ] ; - rdfs:label "point-value pair" ; - skos:prefLabel "point-value pair" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ReferenceDatatype -hdf:ReferenceDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:AtomicDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_REFERENCE - ] ; - rdfs:label "reference" ; - skos:prefLabel "reference" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#SZipCoding -hdf:SZipCoding rdf:type owl:Class ; - rdfs:label "SZip encoding" ; - skos:prefLabel "SZip encoding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ScalarDataspace -hdf:ScalarDataspace rdf:type owl:Class ; - rdfs:subClassOf hdf:Dataspace , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimension ; - owl:qualifiedCardinality "0"^^xsd:nonNegativeInteger ; - owl:onClass hdf:DataspaceDimension - ] ; - rdfs:label "scalar dataspace" ; - skos:prefLabel "scalar dataspace" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#ScaleType -hdf:ScaleType rdf:type owl:Class ; - rdfs:label "scale type" ; - skos:prefLabel "scale type" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Selection -hdf:Selection rdf:type owl:Class ; - rdfs:subClassOf [ rdf:type owl:Restriction ; - owl:onProperty hdf:selectionOn ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Dataspace - ] ; - rdfs:comment """(1) A subset of a dataset or a dataspace, up to the entire dataset of dataspace. -(2) The elements of an array or dataset that are marked for I/O. [HDF]""" ; - rdfs:label "selection" ; - skos:definition """(1) A subset of a dataset or a dataspace, up to the entire dataset of dataspace. -(2) The elements of an array or dataset that are marked for I/O. [HDF]""" ; - skos:prefLabel "selection" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#Sign -hdf:Sign rdf:type owl:Class ; - rdfs:label "sign" ; - skos:prefLabel "sign" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#SignField -hdf:SignField rdf:type owl:Class ; - rdfs:subClassOf hdf:FieldSpecification ; - rdfs:label "sign field" ; - skos:prefLabel "sign field" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#SimpleDataspace -hdf:SimpleDataspace rdf:type owl:Class ; - rdfs:subClassOf hdf:Dataspace , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:dimension ; - owl:someValuesFrom hdf:DataspaceDimension - ] ; - rdfs:label "simple dataspace" ; - skos:prefLabel "simple dataspace" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#SoftLink -hdf:SoftLink rdf:type owl:Class ; - rdfs:subClassOf hdf:Link , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:linkedTo ; - owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:NamedObject - ] ; - rdfs:comment "An indirect association between a name and an object in an HDF5 file. [Allotrope]" ; - rdfs:label "soft link" ; - skos:definition "An indirect association between a name and an object in an HDF5 file. [Allotrope]" ; - skos:prefLabel "soft link" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#StorageAllocation -hdf:StorageAllocation rdf:type owl:Class ; - rdfs:label "storage allocation" ; - skos:prefLabel "storage allocation" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#StorageLayout -hdf:StorageLayout rdf:type owl:Class ; - rdfs:comment "The HDF5 format makes it possible to store data in a variety of ways. The default storage layout format is contiguous, meaning that data is stored in the same linear way that it is organized in memory. Two other storage layout formats are currently defined for HDF5: compact, and chunked. In the future, other storage layouts may be added. [Allotrope]" ; - rdfs:label "storage layout" ; - skos:definition "The HDF5 format makes it possible to store data in a variety of ways. The default storage layout format is contiguous, meaning that data is stored in the same linear way that it is organized in memory. Two other storage layout formats are currently defined for HDF5: compact, and chunked. In the future, other storage layouts may be added. [Allotrope]" ; - skos:prefLabel "storage layout" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#StringAttribute -hdf:StringAttribute rdf:type owl:Class ; - rdfs:subClassOf hdf:Attribute ; - rdfs:label "string attribute" ; - skos:prefLabel "string attribute" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#StringDatatype -hdf:StringDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:AtomicDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_STRING - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:size ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onDataRange [ rdf:type rdfs:Datatype ; - owl:onDatatype xsd:long ; - owl:withRestrictions ( [ xsd:minExclusive "-2"^^xsd:long - ] - ) - ] - ] ; - rdfs:label "string" ; - skos:prefLabel "string" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#StringPadding -hdf:StringPadding rdf:type owl:Class ; - rdfs:comment "The string datatype has a fixed length, but the string may be shorter than the length. The StringPadding defines the storage mechanism for the left over bytes. [Allotrope]" ; - rdfs:label "string padding" ; - skos:definition "The string datatype has a fixed length, but the string may be shorter than the length. The StringPadding defines the storage mechanism for the left over bytes. [Allotrope]" ; - skos:prefLabel "string padding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#TimeDatatype -hdf:TimeDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:AtomicDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_TIME - ] ; - rdfs:label "time" ; - skos:prefLabel "time" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#TransferMode -hdf:TransferMode rdf:type owl:Class ; - rdfs:label "transfer mode" ; - skos:prefLabel "transfer mode" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#TypeClass -hdf:TypeClass rdf:type owl:Class ; - rdfs:comment "HDF datatype class. [Allotrope]" ; - rdfs:label "type class" ; - skos:definition "HDF datatype class. [Allotrope]" ; - skos:prefLabel "type class" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#VariableLengthDatatype -hdf:VariableLengthDatatype rdf:type owl:Class ; - rdfs:subClassOf hdf:CompositeDatatype , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:typeClass ; - owl:hasValue hdf:H5T_VLEN - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:datatype ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Datatype - ] ; - rdfs:comment "A sequence of an existing datatype (atomic, variable-length (VL), or compound) which are not fixed in length form one dataset location to another. [Allotrope]" ; - rdfs:label "variable-length datatype" ; - skos:definition "A sequence of an existing datatype (atomic, variable-length (VL), or compound) which are not fixed in length form one dataset location to another. [Allotrope]" ; - skos:prefLabel "variable-length datatype" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#XOrSelection -hdf:XOrSelection rdf:type owl:Class ; - rdfs:subClassOf hdf:Selection , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:previous ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] , - [ rdf:type owl:Restriction ; - owl:onProperty hdf:xor ; - owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; - owl:onClass hdf:Selection - ] ; - rdfs:label "xor selection" ; - skos:altLabel "exclusive or selection" ; - skos:prefLabel "xor selection" . - - -### http://purl.org/dc/terms/LicenseDocument -dct:LicenseDocument rdf:type owl:Class . - - -### http://purl.org/dc/terms/RightsStatement -dct:RightsStatement rdf:type owl:Class . - - -################################################################# -# Individuals -################################################################# - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_ALLOC_TIME_DEFAULT -hdf:H5D_ALLOC_TIME_DEFAULT rdf:type owl:NamedIndividual , - hdf:StorageAllocation ; - rdfs:comment "Allocate dataset storage space at the default time. Defaults differ by storage method. [HDF]" ; - rdfs:label "default" ; - skos:definition "Allocate dataset storage space at the default time. Defaults differ by storage method. [HDF]" ; - skos:prefLabel "default" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_ALLOC_TIME_EARLY -hdf:H5D_ALLOC_TIME_EARLY rdf:type owl:NamedIndividual , - hdf:StorageAllocation ; - rdfs:comment "Allocate all space when the dataset is created. Default for compact datasets. [HDF]" ; - rdfs:label "early" ; - skos:definition "Allocate all space when the dataset is created. Default for compact datasets. [HDF]" ; - skos:prefLabel "early" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_ALLOC_TIME_INCR -hdf:H5D_ALLOC_TIME_INCR rdf:type owl:NamedIndividual , - hdf:StorageAllocation ; - rdfs:comment "Allocate space incrementally, as data is written to the dataset. Default for chunked storage datasets. [HDF]" ; - rdfs:label "incremental" ; - skos:definition "Allocate space incrementally, as data is written to the dataset. Default for chunked storage datasets. [HDF]" ; - skos:prefLabel "incremental" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_ALLOC_TIME_LATE -hdf:H5D_ALLOC_TIME_LATE rdf:type owl:NamedIndividual , - hdf:StorageAllocation ; - rdfs:comment "Allocate all space when data is first written to the dataset. Default for contiguous datasets. [HDF]" ; - rdfs:label "late" ; - skos:definition "Allocate all space when data is first written to the dataset. Default for contiguous datasets. [HDF]" ; - skos:prefLabel "late" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_CHUNKED -hdf:H5D_CHUNKED rdf:type owl:NamedIndividual , - hdf:StorageLayout ; - rdfs:comment "Chunked storage involves dividing the dataset into equal-sized \"chunks\" that are stored separately. [Allotrope]" ; - rdfs:label "chunked" ; - skos:definition "Chunked storage involves dividing the dataset into equal-sized \"chunks\" that are stored separately. [Allotrope]" ; - skos:prefLabel "chunked" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_COMPACT -hdf:H5D_COMPACT rdf:type owl:NamedIndividual , - hdf:StorageLayout ; - rdfs:comment "Compact storage is used when the amount of data is small and can be stored directly in the object header. [Allotrope]" ; - rdfs:label "compact" ; - skos:definition "Compact storage is used when the amount of data is small and can be stored directly in the object header. [Allotrope]" ; - skos:prefLabel "compact" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_CONTIGUOUS -hdf:H5D_CONTIGUOUS rdf:type owl:NamedIndividual , - hdf:StorageLayout ; - rdfs:label "contiguous" ; - skos:prefLabel "contiguous" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_FILL_TIME_ALLOC -hdf:H5D_FILL_TIME_ALLOC rdf:type owl:NamedIndividual , - hdf:FillTime ; - rdfs:comment "Fill values are written to the dataset when storage space is allocated. [Allotrope]" ; - rdfs:label "fill on allocation" ; - skos:definition "Fill values are written to the dataset when storage space is allocated. [Allotrope]" ; - skos:prefLabel "fill on allocation" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_FILL_TIME_IFSET -hdf:H5D_FILL_TIME_IFSET rdf:type owl:NamedIndividual , - hdf:FillTime ; - rdfs:comment "Fill values are written to the dataset when storage space is allocated only if there is a user-defined fill value, i.e., one set with H5Pset_fill_value. Default. [HDF]" ; - rdfs:label "fill if set" ; - skos:definition "Fill values are written to the dataset when storage space is allocated only if there is a user-defined fill value, i.e., one set with H5Pset_fill_value. Default. [HDF]" ; - skos:prefLabel "fill if set" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_FILL_TIME_NEVER -hdf:H5D_FILL_TIME_NEVER rdf:type owl:NamedIndividual , - hdf:FillTime ; - rdfs:comment "Fill values are never written to the dataset. [Allotrope]" ; - rdfs:label "fill never" ; - skos:definition "Fill values are never written to the dataset. [Allotrope]" ; - skos:prefLabel "fill never" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_FILL_VALUE_DEFAULT -hdf:H5D_FILL_VALUE_DEFAULT rdf:type owl:NamedIndividual , - hdf:FillValueStatus ; - rdfs:comment "Fill value is the library default. [Allotrope]" ; - rdfs:label "default" ; - skos:definition "Fill value is the library default. [Allotrope]" ; - skos:prefLabel "default" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_FILL_VALUE_UNDEFINED -hdf:H5D_FILL_VALUE_UNDEFINED rdf:type owl:NamedIndividual , - hdf:FillValueStatus ; - rdfs:comment "Fill value is undefined. [Allotrope]" ; - rdfs:label "undefined" ; - skos:definition "Fill value is undefined. [Allotrope]" ; - skos:prefLabel "undefined" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_FILL_VALUE_USER_DEFINED -hdf:H5D_FILL_VALUE_USER_DEFINED rdf:type owl:NamedIndividual , - hdf:FillValueStatus ; - rdfs:comment "Fill value is defined by the application. [Allotrope]" ; - rdfs:label "user defined" ; - skos:definition "Fill value is defined by the application. [Allotrope]" ; - skos:prefLabel "user defined" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5D_VIRTUAL -hdf:H5D_VIRTUAL rdf:type owl:NamedIndividual , - hdf:StorageLayout ; - rdfs:label "virtual" ; - skos:prefLabel "virtual" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5FD_MPIO_CHUNK_MULTI_IO -hdf:H5FD_MPIO_CHUNK_MULTI_IO rdf:type owl:NamedIndividual , - hdf:ChunkMode ; - rdfs:label "multi-chunked I/O" ; - skos:prefLabel "multi-chunked I/O" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5FD_MPIO_CHUNK_ONE_IO -hdf:H5FD_MPIO_CHUNK_ONE_IO rdf:type owl:NamedIndividual , - hdf:ChunkMode ; - rdfs:label "one link chunked I/O" ; - skos:prefLabel "one link chunked I/O" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5FD_MPIO_COLLECTIVE -hdf:H5FD_MPIO_COLLECTIVE rdf:type owl:NamedIndividual , - hdf:TransferMode ; - rdfs:comment "Use collective I/O access. [Allotrope]" ; - rdfs:label "collective" ; - skos:definition "Use collective I/O access. [Allotrope]" ; - skos:prefLabel "collective" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5FD_MPIO_INDEPENDENT -hdf:H5FD_MPIO_INDEPENDENT rdf:type owl:NamedIndividual , - hdf:TransferMode ; - rdfs:comment "Use independent I/O access. Default. [Allotrope]" ; - rdfs:label "independent" ; - skos:definition "Use independent I/O access Default. [Allotrope]" ; - skos:prefLabel "independent" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5F_ACC_DEFAULT -hdf:H5F_ACC_DEFAULT rdf:type owl:NamedIndividual , - hdf:FileAccessMode ; - rdfs:label "default" ; - skos:altLabel "default file access mode" ; - skos:prefLabel "default" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5F_ACC_RDONLY -hdf:H5F_ACC_RDONLY rdf:type owl:NamedIndividual , - hdf:FileAccessMode ; - rdfs:label "read only" ; - skos:altLabel "read only file access mode" ; - skos:prefLabel "read only" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5F_ACC_RDWR -hdf:H5F_ACC_RDWR rdf:type owl:NamedIndividual , - hdf:FileAccessMode ; - rdfs:label "read/write" ; - skos:altLabel "read/write file access mode" ; - skos:prefLabel "read/write" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5O_SHMESG_ALL_FLAG -hdf:H5O_SHMESG_ALL_FLAG rdf:type owl:NamedIndividual , - hdf:MessageTypeFlag ; - rdfs:label "all messages" ; - skos:prefLabel "all messages" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5O_SHMESG_ATTR_FLAG -hdf:H5O_SHMESG_ATTR_FLAG rdf:type owl:NamedIndividual , - hdf:MessageTypeFlag ; - rdfs:label "attribute message" ; - skos:prefLabel "attribute message" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5O_SHMESG_DTYPE_FLAG -hdf:H5O_SHMESG_DTYPE_FLAG rdf:type owl:NamedIndividual , - hdf:MessageTypeFlag ; - rdfs:label "datatype message" ; - skos:prefLabel "datatype message" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5O_SHMESG_FILL_FLAG -hdf:H5O_SHMESG_FILL_FLAG rdf:type owl:NamedIndividual , - hdf:MessageTypeFlag ; - rdfs:label "fill value message" ; - skos:prefLabel "fill value message" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5O_SHMESG_NONE_FLAG -hdf:H5O_SHMESG_NONE_FLAG rdf:type owl:NamedIndividual , - hdf:MessageTypeFlag ; - rdfs:label "no shared message" ; - skos:prefLabel "no shared message" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5O_SHMESG_PLINE_FLAG -hdf:H5O_SHMESG_PLINE_FLAG rdf:type owl:NamedIndividual , - hdf:MessageTypeFlag ; - rdfs:label "filter pipeline message" ; - skos:prefLabel "filter pipeline message" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5O_SHMESG_SDSPACE_FLAG -hdf:H5O_SHMESG_SDSPACE_FLAG rdf:type owl:NamedIndividual , - hdf:MessageTypeFlag ; - rdfs:label "simple dataspace message" ; - skos:prefLabel "simple dataspace message" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5P_DATASET_CREATE -hdf:H5P_DATASET_CREATE rdf:type owl:NamedIndividual . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5P_DATASET_XFER -hdf:H5P_DATASET_XFER rdf:type owl:NamedIndividual . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5P_FILE_ACCESS -hdf:H5P_FILE_ACCESS rdf:type owl:NamedIndividual . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5P_FILE_CREATE -hdf:H5P_FILE_CREATE rdf:type owl:NamedIndividual . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5P_FILE_MOUNT -hdf:H5P_FILE_MOUNT rdf:type owl:NamedIndividual . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_B16 -hdf:H5T_ALPHA_B16 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "DEC Alpha specific 16 bit bitfield" ; - skos:prefLabel "DEC Alpha specific 16 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_B32 -hdf:H5T_ALPHA_B32 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "DEC Alpha specific 32 bit bitfield" ; - skos:prefLabel "DEC Alpha specific 32 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_B64 -hdf:H5T_ALPHA_B64 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "DEC Alpha specific 64 bit bitfield" ; - skos:prefLabel "DEC Alpha specific 64 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_B8 -hdf:H5T_ALPHA_B8 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "DEC Alpha specific 8 bit bitfield" ; - skos:prefLabel "DEC Alpha specific 8 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_F32 -hdf:H5T_ALPHA_F32 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "DEC Alpha specific 32 bit floating point" ; - skos:prefLabel "DEC Alpha specific 32 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_F64 -hdf:H5T_ALPHA_F64 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "DEC Alpha specific 64 bit floating point" ; - skos:prefLabel "DEC Alpha specific 64 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_I16 -hdf:H5T_ALPHA_I16 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "DEC Alpha specific 8 bit signed integer" ; - skos:prefLabel "DEC Alpha specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_I32 -hdf:H5T_ALPHA_I32 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "DEC Alpha specific 8 bit signed integer" ; - skos:prefLabel "DEC Alpha specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_I64 -hdf:H5T_ALPHA_I64 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "DEC Alpha specific 8 bit signed integer" ; - skos:prefLabel "DEC Alpha specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_I8 -hdf:H5T_ALPHA_I8 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "DEC Alpha specific 8 bit signed integer" ; - skos:prefLabel "DEC Alpha specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_U16 -hdf:H5T_ALPHA_U16 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "DEC Alpha 16 bit unsigned integer" ; - skos:prefLabel "DEC Alpha 16 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_U32 -hdf:H5T_ALPHA_U32 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "DEC Alpha 32 bit unsigned integer" ; - skos:prefLabel "DEC Alpha 32 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_U64 -hdf:H5T_ALPHA_U64 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "DEC Alpha 64 bit unsigned integer" ; - skos:prefLabel "DEC Alpha 64 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ALPHA_U8 -hdf:H5T_ALPHA_U8 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "DEC Alpha 8 bit unsigned integer" ; - skos:prefLabel "DEC Alpha 8 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ARRAY -hdf:H5T_ARRAY rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "array" ; - skos:prefLabel "array" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_BITFIELD -hdf:H5T_BITFIELD rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "bitfield" ; - skos:prefLabel "bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_COMPOUND -hdf:H5T_COMPOUND rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "compound" ; - skos:prefLabel "compound" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_CSET_ASCII -hdf:H5T_CSET_ASCII rdf:type owl:NamedIndividual , - hdf:CharacterSet ; - rdfs:label "ASCII" ; - skos:prefLabel "ASCII" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_CSET_UTF8 -hdf:H5T_CSET_UTF8 rdf:type owl:NamedIndividual , - hdf:CharacterSet ; - rdfs:label "UTF-8" ; - skos:prefLabel "UTF-8" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ENUM -hdf:H5T_ENUM rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "enumeration" ; - skos:prefLabel "enumeration" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_FLOAT -hdf:H5T_FLOAT rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "floating point" ; - skos:prefLabel "floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_IEEE_F32BE -hdf:H5T_IEEE_F32BE rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "IEEE 32 bit floating point big endian" ; - skos:prefLabel "IEEE 32 bit floating point big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_IEEE_F32LE -hdf:H5T_IEEE_F32LE rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "IEEE 32 bit floating point little endian" ; - skos:prefLabel "IEEE 32 bit floating point little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_IEEE_F64BE -hdf:H5T_IEEE_F64BE rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "IEEE 64 bit floating point big endian" ; - skos:prefLabel "IEEE 64 bit floating point big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_IEEE_F64LE -hdf:H5T_IEEE_F64LE rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "IEEE 64 bit floating point little endian" ; - skos:prefLabel "IEEE 64 bit floating point little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEGER -hdf:H5T_INTEGER rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "integer" ; - skos:prefLabel "integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_B16 -hdf:H5T_INTEL_B16 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "Intel specific 16 bit bitfield" ; - skos:prefLabel "Intel specific 16 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_B32 -hdf:H5T_INTEL_B32 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "Intel specific 32 bit bitfield" ; - skos:prefLabel "Intel specific 32 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_B64 -hdf:H5T_INTEL_B64 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "Intel specific 64 bit bitfield" ; - skos:prefLabel "Intel specific 64 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_B8 -hdf:H5T_INTEL_B8 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "Intel specific 8 bit bitfield" ; - skos:prefLabel "Intel specific 8 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_F32 -hdf:H5T_INTEL_F32 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "Intel specific 32 bit floating point" ; - skos:prefLabel "Intel specific 32 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_F64 -hdf:H5T_INTEL_F64 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "Intel specific 64 bit floating point" ; - skos:prefLabel "Intel specific 64 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_I16 -hdf:H5T_INTEL_I16 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "Intel specific 8 bit signed integer" ; - skos:prefLabel "Intel specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_I32 -hdf:H5T_INTEL_I32 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "Intel specific 8 bit signed integer" ; - skos:prefLabel "Intel specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_I64 -hdf:H5T_INTEL_I64 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "Intel specific 8 bit signed integer" ; - skos:prefLabel "Intel specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_I8 -hdf:H5T_INTEL_I8 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "Intel specific 8 bit signed integer" ; - skos:prefLabel "Intel specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_U16 -hdf:H5T_INTEL_U16 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "Intel 16 bit unsigned integer" ; - skos:prefLabel "Intel 16 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_U32 -hdf:H5T_INTEL_U32 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "Intel 32 bit unsigned integer" ; - skos:prefLabel "Intel 32 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_U64 -hdf:H5T_INTEL_U64 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "Intel 64 bit unsigned integer" ; - skos:prefLabel "Intel 64 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_INTEL_U8 -hdf:H5T_INTEL_U8 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "Intel 8 bit unsigned integer" ; - skos:prefLabel "Intel 8 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_B16 -hdf:H5T_MIPS_B16 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "MIPS specific 16 bit bitfield" ; - skos:prefLabel "MIPS specific 16 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_B32 -hdf:H5T_MIPS_B32 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "MIPS specific 32 bit bitfield" ; - skos:prefLabel "MIPS specific 32 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_B64 -hdf:H5T_MIPS_B64 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "MIPS specific 64 bit bitfield" ; - skos:prefLabel "MIPS specific 64 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_B8 -hdf:H5T_MIPS_B8 rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "MIPS specific 8 bit bitfield" ; - skos:prefLabel "MIPS specific 8 bit bitfield" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_F32 -hdf:H5T_MIPS_F32 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "MIPS specific 32 bit floating point" ; - skos:prefLabel "MIPS specific 32 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_F64 -hdf:H5T_MIPS_F64 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "MIPS specific 64 bit floating point" ; - skos:prefLabel "MIPS specific 64 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_I16 -hdf:H5T_MIPS_I16 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "MIPS specific 8 bit signed integer" ; - skos:prefLabel "MIPS specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_I32 -hdf:H5T_MIPS_I32 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "MIPS specific 8 bit signed integer" ; - skos:prefLabel "MIPS specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_I64 -hdf:H5T_MIPS_I64 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "MIPS specific 8 bit signed integer" ; - skos:prefLabel "MIPS specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_I8 -hdf:H5T_MIPS_I8 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "MIPS specific 8 bit signed integer" ; - skos:prefLabel "MIPS specific 8 bit signed integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_U16 -hdf:H5T_MIPS_U16 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "MIPS 16 bit unsigned integer" ; - skos:prefLabel "MIPS 16 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_U32 -hdf:H5T_MIPS_U32 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "MIPS 32 bit unsigned integer" ; - skos:prefLabel "MIPS 32 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_U64 -hdf:H5T_MIPS_U64 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "MIPS 64 bit unsigned integer" ; - skos:prefLabel "MIPS 64 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_MIPS_U8 -hdf:H5T_MIPS_U8 rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "MIPS 8 bit unsigned integer" ; - skos:prefLabel "MIPS 8 bit unsigned integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_CHAR -hdf:H5T_NATIVE_CHAR rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native signed char" ; - skos:prefLabel "native signed char" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_DOUBLE -hdf:H5T_NATIVE_DOUBLE rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - rdfs:label "native double" ; - skos:prefLabel "native double" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_FLOAT -hdf:H5T_NATIVE_FLOAT rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - rdfs:label "native float" ; - skos:prefLabel "native float" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_INT -hdf:H5T_NATIVE_INT rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native signed int" ; - skos:prefLabel "native signed int" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_LDOUBLE -hdf:H5T_NATIVE_LDOUBLE rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - rdfs:label "native long double" ; - skos:prefLabel "native long double" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_LLONG -hdf:H5T_NATIVE_LLONG rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native signed long long" ; - skos:prefLabel "native signed long long" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_LONG -hdf:H5T_NATIVE_LONG rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native signed long" ; - skos:prefLabel "native signed long" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_SHORT -hdf:H5T_NATIVE_SHORT rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native signed short" ; - skos:prefLabel "native signed short" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_UCHAR -hdf:H5T_NATIVE_UCHAR rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native unsigned char" ; - skos:prefLabel "native unsigned char" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_UINT -hdf:H5T_NATIVE_UINT rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native unsigned int" ; - skos:prefLabel "native unsigned int" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_ULLONG -hdf:H5T_NATIVE_ULLONG rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native unsigned long long" ; - skos:prefLabel "native unsigned long long" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_ULONG -hdf:H5T_NATIVE_ULONG rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native unsigned long" ; - skos:prefLabel "native unsigned long" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NATIVE_USHORT -hdf:H5T_NATIVE_USHORT rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - rdfs:label "native unsigned short" ; - skos:prefLabel "native unsigned short" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NORM_IMPLIED -hdf:H5T_NORM_IMPLIED rdf:type owl:NamedIndividual , - hdf:FloatingPointNormalization ; - rdfs:comment "MSB of mantissa isn't stored, always 1. [Allotrope]" ; - rdfs:label "implied" ; - skos:definition "MSB of mantissa isn't stored, always 1. [Allotrope]" ; - skos:prefLabel "implied" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NORM_MSBSET -hdf:H5T_NORM_MSBSET rdf:type owl:NamedIndividual , - hdf:FloatingPointNormalization ; - rdfs:comment "MSB of mantissa is always 1. [Allotrope]" ; - rdfs:label "msb set" ; - skos:definition "MSB of mantissa is always 1. [Allotrope]" ; - skos:prefLabel "msb set" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_NORM_NONE -hdf:H5T_NORM_NONE rdf:type owl:NamedIndividual , - hdf:FloatingPointNormalization ; - rdfs:comment "Not normalized. [Allotrope]" ; - rdfs:label "none" ; - skos:definition "Not normalized. [Allotrope]" ; - skos:prefLabel "none" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_OPAQUE -hdf:H5T_OPAQUE rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "opaque" ; - skos:prefLabel "opaque" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ORDER_BE -hdf:H5T_ORDER_BE rdf:type owl:NamedIndividual , - hdf:Order ; - rdfs:label "big endian" ; - skos:prefLabel "big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ORDER_LE -hdf:H5T_ORDER_LE rdf:type owl:NamedIndividual , - hdf:Order ; - rdfs:label "little endian" ; - skos:prefLabel "little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ORDER_MIXED -hdf:H5T_ORDER_MIXED rdf:type owl:NamedIndividual , - hdf:Order ; - rdfs:label "mixed member order" ; - skos:prefLabel "mixed member order" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_ORDER_VAX -hdf:H5T_ORDER_VAX rdf:type owl:NamedIndividual , - hdf:Order ; - rdfs:label "VAX mixed endian" ; - skos:prefLabel "VAX mixed endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_PAD_BACKGROUND -hdf:H5T_PAD_BACKGROUND rdf:type owl:NamedIndividual , - hdf:Padding ; - rdfs:label "background value" ; - skos:prefLabel "background value" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_PAD_ONE -hdf:H5T_PAD_ONE rdf:type owl:NamedIndividual , - hdf:Padding ; - rdfs:label "pad one" ; - skos:prefLabel "pad one" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_PAD_ZERO -hdf:H5T_PAD_ZERO rdf:type owl:NamedIndividual , - hdf:Padding ; - rdfs:label "pad zero" ; - skos:prefLabel "pad zero" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_REFERENCE -hdf:H5T_REFERENCE rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "reference" ; - skos:prefLabel "reference" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_SGN_2 -hdf:H5T_SGN_2 rdf:type owl:NamedIndividual , - hdf:Sign ; - rdfs:label "two's complement" ; - skos:prefLabel "two's complement" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_SGN_NONE -hdf:H5T_SGN_NONE rdf:type owl:NamedIndividual , - hdf:Sign ; - rdfs:label "unsigned" ; - skos:prefLabel "unsigned" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B16BE -hdf:H5T_STD_B16BE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "standard 16 bit bitfield big endian" ; - skos:prefLabel "standard 16 bit bitfield big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B16LE -hdf:H5T_STD_B16LE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "standard 16 bit bitfield little endian" ; - skos:prefLabel "standard 16 bit bitfield little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B32BE -hdf:H5T_STD_B32BE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "standard 32 bit bitfield big endian" ; - skos:prefLabel "standard 32 bit bitfield big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B32LE -hdf:H5T_STD_B32LE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "standard 32 bit bitfield little endian" ; - skos:prefLabel "standard 32 bit bitfield little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B64BE -hdf:H5T_STD_B64BE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "standard 64 bit bitfield big endian" ; - skos:prefLabel "standard 64 bit bitfield big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B64LE -hdf:H5T_STD_B64LE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "standard 64 bit bitfield little endian" ; - skos:prefLabel "standard 64 bit bitfield little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B8BE -hdf:H5T_STD_B8BE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - rdfs:label "standard 8 bit bitfield big endian" ; - skos:prefLabel "standard 8 bit bitfield big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_B8LE -hdf:H5T_STD_B8LE rdf:type owl:NamedIndividual , - hdf:BitfieldDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - rdfs:label "standard 8 bit bitfield little endian" ; - skos:prefLabel "standard 8 bit bitfield little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I16BE -hdf:H5T_STD_I16BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 16 bit signed integer big endian" ; - skos:prefLabel "standard 16 bit signed integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I16LE -hdf:H5T_STD_I16LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 16 bit signed integer little endian" ; - skos:prefLabel "standard 16 bit signed integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I32BE -hdf:H5T_STD_I32BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 32 bit signed integer big endian" ; - skos:prefLabel "standard 32 bit signed integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I32LE -hdf:H5T_STD_I32LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 32 bit signed integer little endian" ; - skos:prefLabel "standard 32 bit signed integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I64BE -hdf:H5T_STD_I64BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 64 bit signed integer big endian" ; - skos:prefLabel "standard 64 bit signed integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I64LE -hdf:H5T_STD_I64LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 64 bit signed integer little endian" ; - skos:prefLabel "standard 64 bit signed integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I8BE -hdf:H5T_STD_I8BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 8 bit signed integer big endian" ; - skos:prefLabel "standard 8 bit signed integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_I8LE -hdf:H5T_STD_I8LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_2 ; - rdfs:label "standard 8 bit signed integer little endian" ; - skos:prefLabel "standard 8 bit signed integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U16BE -hdf:H5T_STD_U16BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 16 bit unsigned integer big endian" ; - skos:prefLabel "standard 16 bit unsigned integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U16LE -hdf:H5T_STD_U16LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 16 bit unsigned integer little endian" ; - skos:prefLabel "standard 16 bit unsigned integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U32BE -hdf:H5T_STD_U32BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 32 bit unsigned integer big endian" ; - skos:prefLabel "standard 32 bit unsigned integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U32LE -hdf:H5T_STD_U32LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 32 bit unsigned integer little endian" ; - skos:prefLabel "standard 32 bit unsigned integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U64BE -hdf:H5T_STD_U64BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 64 bit unsigned integer big endian" ; - skos:prefLabel "standard 64 bit unsigned integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U64LE -hdf:H5T_STD_U64LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 64 bit unsigned integer little endian" ; - skos:prefLabel "standard 64 bit unsigned integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U8BE -hdf:H5T_STD_U8BE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_BE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 8 bit unsigned integer big endian" ; - skos:prefLabel "standard 8 bit unsigned integer big endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STD_U8LE -hdf:H5T_STD_U8LE rdf:type owl:NamedIndividual , - hdf:IntegerDatatype ; - hdf:order hdf:H5T_ORDER_LE ; - hdf:sign hdf:H5T_SGN_NONE ; - rdfs:label "standard 8 bit unsigned integer little endian" ; - skos:prefLabel "standard 8 bit unsigned integer little endian" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STRING -hdf:H5T_STRING rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "string" ; - skos:prefLabel "string" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STR_NULLPAD -hdf:H5T_STR_NULLPAD rdf:type owl:NamedIndividual , - hdf:StringPadding ; - rdfs:label "pad with zeros" ; - skos:prefLabel "pad with zeros" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STR_NULLTERM -hdf:H5T_STR_NULLTERM rdf:type owl:NamedIndividual , - hdf:StringPadding ; - rdfs:comment "Null terminate as C does. [Allotrope]" ; - rdfs:label "null terminate" ; - skos:definition "Null terminate as C does. [Allotrope]" ; - skos:prefLabel "null terminate" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_STR_SPACEPAD -hdf:H5T_STR_SPACEPAD rdf:type owl:NamedIndividual , - hdf:StringPadding ; - rdfs:comment "Pad with spaces as FORTRAN does. [Allotrope]" ; - rdfs:label "pad with spaces" ; - skos:definition "Pad with spaces as FORTRAN does. [Allotrope]" ; - skos:prefLabel "pad with spaces" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_TIME -hdf:H5T_TIME rdf:type owl:NamedIndividual , - hdf:TimeDatatype , - hdf:TypeClass ; - rdfs:comment "Not yet implemented. [Allotrope]" ; - rdfs:label "time" ; - skos:note "Not yet implemented. [Allotrope]" ; - skos:prefLabel "time" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_VAX_F32 -hdf:H5T_VAX_F32 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_VAX ; - rdfs:label "OpenVMS specific 64 bit floating point" ; - skos:prefLabel "OpenVMS specific 64 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_VAX_F64 -hdf:H5T_VAX_F64 rdf:type owl:NamedIndividual , - hdf:FloatDatatype ; - hdf:order hdf:H5T_ORDER_VAX ; - rdfs:label "OpenVMS specific 64 bit floating point" ; - skos:prefLabel "OpenVMS specific 64 bit floating point" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5T_VLEN -hdf:H5T_VLEN rdf:type owl:NamedIndividual , - hdf:TypeClass ; - rdfs:label "variable length" ; - skos:prefLabel "variable length" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5Z_DISABLE_EDC -hdf:H5Z_DISABLE_EDC rdf:type owl:NamedIndividual , - hdf:ErrorDetectionCheck ; - rdfs:label "disable error detection check" ; - skos:prefLabel "disable error detection check" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5Z_ENABLE_EDC -hdf:H5Z_ENABLE_EDC rdf:type owl:NamedIndividual , - hdf:ErrorDetectionCheck ; - rdfs:label "enable error detection check" ; - skos:prefLabel "enable error detection check" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5Z_SO_FLOAT_DSCALE -hdf:H5Z_SO_FLOAT_DSCALE rdf:type owl:NamedIndividual , - hdf:ScaleType ; - rdfs:comment "Floating-point type, using variable MinBits method. The scaleFactor denotes the decimal scale factor for D-scaling and can be positive, negative or zero. This is the current implementation of the library. [HDF]" ; - rdfs:label "floating-point dscale" ; - skos:definition "Floating-point type, using variable MinBits method. The scaleFactor denotes the decimal scale factor for D-scaling and can be positive, negative or zero. This is the current implementation of the library. [HDF]" ; - skos:prefLabel "floating-point dscale" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5Z_SO_FLOAT_ESCALE -hdf:H5Z_SO_FLOAT_ESCALE rdf:type owl:NamedIndividual , - hdf:ScaleType ; - rdfs:comment "Floating-point type, using fixed MinBits method. The scaleFactor denotes MinBits for E-scaling and must be a positive integer. This is not currently implemented by the library. [HDF]" ; - rdfs:label "floating-point escale" ; - skos:definition "Floating-point type, using fixed MinBits method. The scaleFactor denotes MinBits for E-scaling and must be a positive integer. This is not currently implemented by the library. [HDF]" ; - skos:prefLabel "floating-point escale" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5Z_SO_INT -hdf:H5Z_SO_INT rdf:type owl:NamedIndividual , - hdf:ScaleType ; - rdfs:comment "Integer type. The scaleFactor denotes MinBits and it should be a positive integer or H5Z_SO_INT_MINBITS_DEFAULT. If it is less than 0, the library will reset it to 0 since it is not implemented. [HDF]" ; - rdfs:label "integer" ; - skos:definition "Integer type. The scaleFactor denotes MinBits and it should be a positive integer or H5Z_SO_INT_MINBITS_DEFAULT. If it is less than 0, the library will reset it to 0 since it is not implemented. [HDF]" ; - skos:prefLabel "integer" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5_SZIP_EC_OPTION_MASK -hdf:H5_SZIP_EC_OPTION_MASK rdf:type owl:NamedIndividual , - hdf:SZipCoding ; - rdfs:label "szip entropy coding" ; - skos:prefLabel "szip entropy coding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#H5_SZIP_NN_OPTION_MASK -hdf:H5_SZIP_NN_OPTION_MASK rdf:type owl:NamedIndividual , - hdf:SZipCoding ; - rdfs:label "szip nearest neighbor coding" ; - skos:prefLabel "szip nearest neighbor coding" . - - -### http://purl.allotrope.org/ontologies/hdf5/1.8#scalarDataspace -hdf:scalarDataspace rdf:type owl:NamedIndividual , - hdf:ScalarDataspace ; - rdfs:label "scalar dataspace" ; - skos:prefLabel "scalar dataspace" . - - -### http://purl.allotrope.org/voc/attribution - rdf:type owl:NamedIndividual ; - dct:description """ -These taxonomies contain material or may constitute derivative works of material which may be subject to copyright by one of the following organizations. By using these taxonomies, you agree to the following terms and conditions applicable to its contents: -****************************************************************************** -Attribution Notice for National Center for Biomedical Ontology materials. - -This work contains material from the Cell Ontology and Clinical Measurement Ontology, available here: http://bioportal.bioontology.org/. -****************************************************************************** -Attribution Notice for ChEBI -This work contains material from the European Bioinformatics Institute’s ChEBI database. -****************************************************************************** -Attribution Notice for Quantities Units Dimensions Data Types (http://www.qudt.org/) -This work contains content from www.qudt.org and is used pursuant to a Creative Commons License available here: http://creativecommons.org/licenses/by-sa/3.0/us/legalcode. The original work may have been modified. -****************************************************************************** -Copyright and Attribution Notice for Dublin Core Metadata Initiative Document -This work contains material from the following DCMI document used pursuant to a creative commons license available here: https://creativecommons.org/licenses/by/4.0/legalcode. This material may have been modified or changed. -Timestamped URL: http://dublincore.org/documents/2012/06/14/dcmi-terms/ -Date Issued: 2012-06-14 -Document Status: This is a DCMI Recommendation. -Copyright © 1995-2015 DCMI. All Rights Reserved. DCMI liability, trademark/service mark, document use and software licensing rules apply. -****************************************************************************** - -""" ; - dct:title "Derivative works attribution" . - - -### http://purl.allotrope.org/voc/copyright - rdf:type owl:NamedIndividual ; - dct:description "Copyright © 2015-2024 Allotrope Foundation" ; - dct:rightsHolder ; - dct:title "Copyright © 2015-2024 Allotrope Foundation" . - - -### http://purl.allotrope.org/voc/creative-commons-attribution-license - rdf:type owl:NamedIndividual ; - dct:description """This work is licensed under a Creative Commons Attribution 4.0 International License http://creativecommons.org/licenses/by/4.0/. - -THESE MATERIALS ARE PROVIDED \"AS IS\" AND ALLOTROPE EXPRESSLY DISCLAIMS ALL WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES OF NON-INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -Copyright © 2015-2024 Allotrope Foundation -""" ; - dct:rightsHolder ; - dct:title "Creative Commons Attribution 4.0 International Public License" . - - -### http://purl.allotrope.org/voc/hdf-copyright - rdf:type owl:NamedIndividual , - dct:RightsStatement ; - dct:description """ -HDF5 (Hierarchical Data Format 5) Software Library and Utilities -Copyright © 2006-2018, The HDF Group. - -NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities -Copyright © 1998-2006, The Board of Trustees of the University of Illinois. - -All rights reserved. -""" . - - -### http://purl.allotrope.org/voc/hdf-license - rdf:type owl:NamedIndividual , - dct:LicenseDocument ; - dct:description """ -Copyright Notice and License Terms for HDF5 (Hierarchical Data Format 5) Software Library and Utilities -HDF5 (Hierarchical Data Format 5) Software Library and Utilities Copyright © 2006-2018, The HDF Group. - -NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities Copyright © 1998-2006, The Board of Trustees of the University of Illinois. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted for any purpose (including commercial purposes) provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or materials provided with the distribution. - 3. Neither the name of The HDF Group, the name of the University, nor the name of any Contributor may be used to endorse or promote products derived from this software without specific prior written permission from The HDF Group, the University, or the Contributor, respectively. - -DISCLAIMER: THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS \"AS IS\" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. IN NO EVENT SHALL THE HDF GROUP OR THE CONTRIBUTORS BE LIABLE FOR ANY DAMAGES SUFFERED BY THE USERS ARISING OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the features, functionality or performance of the source code (\"Enhancements\") to anyone; however, if you choose to make your Enhancements available either publicly, or directly to The HDF Group, without imposing a separate written license agreement for such Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free perpetual license to install, use, modify, prepare derivative works, incorporate into other computer software, distribute, and sublicense such enhancements or derivative works thereof, in binary and source code form.""" . - - -################################################################# -# General axioms -################################################################# - -[ rdf:type owl:AllDisjointClasses ; - owl:members ( hdf:BitfieldDatatype - hdf:FloatDatatype - hdf:IntegerDatatype - hdf:OpaqueDatatype - hdf:ReferenceDatatype - hdf:StringDatatype - hdf:TimeDatatype - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5D_ALLOC_TIME_DEFAULT - hdf:H5D_ALLOC_TIME_EARLY - hdf:H5D_ALLOC_TIME_INCR - hdf:H5D_ALLOC_TIME_LATE - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5D_CHUNKED - hdf:H5D_COMPACT - hdf:H5D_CONTIGUOUS - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5D_FILL_TIME_ALLOC - hdf:H5D_FILL_TIME_IFSET - hdf:H5D_FILL_TIME_NEVER - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5D_FILL_VALUE_DEFAULT - hdf:H5D_FILL_VALUE_UNDEFINED - hdf:H5D_FILL_VALUE_USER_DEFINED - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5FD_MPIO_CHUNK_MULTI_IO - hdf:H5FD_MPIO_CHUNK_ONE_IO - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5FD_MPIO_COLLECTIVE - hdf:H5FD_MPIO_INDEPENDENT - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5F_ACC_DEFAULT - hdf:H5F_ACC_RDONLY - hdf:H5F_ACC_RDWR - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5O_SHMESG_ALL_FLAG - hdf:H5O_SHMESG_ATTR_FLAG - hdf:H5O_SHMESG_DTYPE_FLAG - hdf:H5O_SHMESG_FILL_FLAG - hdf:H5O_SHMESG_NONE_FLAG - hdf:H5O_SHMESG_PLINE_FLAG - hdf:H5O_SHMESG_SDSPACE_FLAG - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5T_ALPHA_B16 - hdf:H5T_ALPHA_B32 - hdf:H5T_ALPHA_B64 - hdf:H5T_ALPHA_B8 - hdf:H5T_ALPHA_F32 - hdf:H5T_ALPHA_F64 - hdf:H5T_ALPHA_I16 - hdf:H5T_ALPHA_I32 - hdf:H5T_ALPHA_I64 - hdf:H5T_ALPHA_I8 - hdf:H5T_ALPHA_U16 - hdf:H5T_ALPHA_U32 - hdf:H5T_ALPHA_U64 - hdf:H5T_ALPHA_U8 - hdf:H5T_IEEE_F32BE - hdf:H5T_IEEE_F32LE - hdf:H5T_IEEE_F64BE - hdf:H5T_IEEE_F64LE - hdf:H5T_INTEL_B16 - hdf:H5T_INTEL_B32 - hdf:H5T_INTEL_B64 - hdf:H5T_INTEL_B8 - hdf:H5T_INTEL_F32 - hdf:H5T_INTEL_F64 - hdf:H5T_INTEL_I16 - hdf:H5T_INTEL_I32 - hdf:H5T_INTEL_I64 - hdf:H5T_INTEL_I8 - hdf:H5T_INTEL_U16 - hdf:H5T_INTEL_U32 - hdf:H5T_INTEL_U64 - hdf:H5T_INTEL_U8 - hdf:H5T_MIPS_B16 - hdf:H5T_MIPS_B32 - hdf:H5T_MIPS_B64 - hdf:H5T_MIPS_B8 - hdf:H5T_MIPS_F32 - hdf:H5T_MIPS_F64 - hdf:H5T_MIPS_I16 - hdf:H5T_MIPS_I32 - hdf:H5T_MIPS_I64 - hdf:H5T_MIPS_I8 - hdf:H5T_MIPS_U16 - hdf:H5T_MIPS_U32 - hdf:H5T_MIPS_U64 - hdf:H5T_MIPS_U8 - hdf:H5T_NATIVE_CHAR - hdf:H5T_NATIVE_DOUBLE - hdf:H5T_NATIVE_FLOAT - hdf:H5T_NATIVE_INT - hdf:H5T_NATIVE_LDOUBLE - hdf:H5T_NATIVE_LLONG - hdf:H5T_NATIVE_LONG - hdf:H5T_NATIVE_SHORT - hdf:H5T_NATIVE_UCHAR - hdf:H5T_NATIVE_UINT - hdf:H5T_NATIVE_ULLONG - hdf:H5T_NATIVE_ULONG - hdf:H5T_NATIVE_USHORT - hdf:H5T_STD_B16BE - hdf:H5T_STD_B16LE - hdf:H5T_STD_B32BE - hdf:H5T_STD_B32LE - hdf:H5T_STD_B64BE - hdf:H5T_STD_B64LE - hdf:H5T_STD_B8BE - hdf:H5T_STD_B8LE - hdf:H5T_STD_I16BE - hdf:H5T_STD_I16LE - hdf:H5T_STD_I32BE - hdf:H5T_STD_I32LE - hdf:H5T_STD_I64BE - hdf:H5T_STD_I64LE - hdf:H5T_STD_I8BE - hdf:H5T_STD_I8LE - hdf:H5T_STD_U16BE - hdf:H5T_STD_U16LE - hdf:H5T_STD_U32BE - hdf:H5T_STD_U32LE - hdf:H5T_STD_U64BE - hdf:H5T_STD_U64LE - hdf:H5T_STD_U8BE - hdf:H5T_STD_U8LE - hdf:H5T_TIME - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5T_NORM_IMPLIED - hdf:H5T_NORM_MSBSET - hdf:H5T_NORM_NONE - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5T_ORDER_BE - hdf:H5T_ORDER_LE - hdf:H5T_ORDER_MIXED - hdf:H5T_ORDER_VAX - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5T_PAD_BACKGROUND - hdf:H5T_PAD_ONE - hdf:H5T_PAD_ZERO - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5T_SGN_2 - hdf:H5T_SGN_NONE - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5T_STR_NULLPAD - hdf:H5T_STR_NULLTERM - hdf:H5T_STR_SPACEPAD - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5Z_DISABLE_EDC - hdf:H5Z_ENABLE_EDC - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5Z_SO_FLOAT_DSCALE - hdf:H5Z_SO_FLOAT_ESCALE - hdf:H5Z_SO_INT - ) -] . - - -[ rdf:type owl:AllDifferent ; - owl:distinctMembers ( hdf:H5_SZIP_EC_OPTION_MASK - hdf:H5_SZIP_NN_OPTION_MASK - ) -] . - - -### Generated by the OWL API (version 5.1.19) /~https://github.com/owlcs/owlapi/ diff --git a/h5rdmtoolbox/wrapper/ld/user/file.py b/h5rdmtoolbox/wrapper/ld/user/file.py deleted file mode 100644 index 103bdd8a..00000000 --- a/h5rdmtoolbox/wrapper/ld/user/file.py +++ /dev/null @@ -1,57 +0,0 @@ -from typing import Optional -from typing import Union - -import rdflib -from ontolutils.namespacelib import M4I -from ontolutils.namespacelib import SCHEMA -from ontolutils.namespacelib.hdf5 import HDF5 -from rdflib import Graph -from rdflib import Namespace - -import h5rdmtoolbox as h5tbx -from h5rdmtoolbox.wrapper.ld.user.attributes import process_file_attribute -from h5rdmtoolbox.wrapper.ld.user.groups import process_group -from h5rdmtoolbox.wrapper.ld.utils import get_file_bnode - -HDF = Namespace(str(HDF5)) - - -def get_ld(source: Union[str, h5tbx.File], blank_node_iri_base: Optional[str] = None) -> rdflib.Graph: - """Convert an HDF5 file into an RDF graph.""" - - if not isinstance(source, h5tbx.File): - with h5tbx.File(source) as h5f: - return get_ld(h5f) - - graph = Graph() - - file_uri = get_file_bnode(source, blank_node_iri_base=blank_node_iri_base) - file_rdf = source.frdf.type - - if file_rdf: - if isinstance(file_rdf, list): - for rdf_type in file_rdf: - graph.add((file_uri, rdflib.RDF.type, rdflib.URIRef(rdf_type))) - else: - graph.add((file_uri, rdflib.RDF.type, rdflib.URIRef(file_rdf))) - - for ak, av in source.attrs.items(): - process_file_attribute(source, ak, av, graph, blank_node_iri_base) - - process_group(source, graph, blank_node_iri_base=blank_node_iri_base) - - return graph - - -if __name__ == "__main__": - import h5rdmtoolbox as h5tbx - - with h5tbx.File() as h5: - h5.attrs["version", SCHEMA.version] = "1.2.3" - - ds = h5.create_dataset("a/b/ds", data=[[1, 2], [3, 4]], chunks=(1, 2), compression="gzip", compression_opts=2) - ds2 = h5.create_dataset("nochunk", data=[[1, 2], [3, 4]], chunks=None) - ds.rdf.type = M4I.NumericalVariable - - graph = get_ld(str(h5.hdf_filename)) - print(graph.serialize(format="turtle")) diff --git a/setup.cfg b/setup.cfg index f458ac7c..22dd245b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = h5rdmtoolbox -version = 1.7.1 +version = 1.7.2 author = Matthias Probst author_email = matth.probst@gmail.com description = Supporting a FAIR Research Data lifecycle using Python and HDF5. @@ -65,6 +65,7 @@ test = mongomock==4.1.2 xmltodict<=0.13.0 scipy>=1.10.1 # provides netcdf4 + scikit-image>=0.21.0 %(csv)s %(snt)s %(database)s diff --git a/tests/conventions/standard_attributes/standard_names/test_interface.py b/tests/conventions/standard_attributes/standard_names/test_interface.py index e4184512..f57a0104 100644 --- a/tests/conventions/standard_attributes/standard_names/test_interface.py +++ b/tests/conventions/standard_attributes/standard_names/test_interface.py @@ -87,7 +87,7 @@ def test_StandardCoordinate(self): attach_scales=('y', 'x')) h5sni = HDF5StandardNameInterface.from_hdf(h5.hdf_filename) for c in h5sni.coordinate: - self.assertIsInstance(c, h5tbx.wrapper.lazy.LDataset) + self.assertIsInstance(c, h5tbx.database.lazy.LDataset) self.assertEqual(h5sni.coordinate.x, h5sni.coordinate[0]) self.assertEqual(h5sni.coordinate.y, h5sni.coordinate[1]) self.assertDictEqual({'x': 5, 'y': 3}, h5sni.coordinate.shape) diff --git a/tests/database/test_mongo.py b/tests/database/test_mongo.py index 9b9280a8..8e4c1f74 100644 --- a/tests/database/test_mongo.py +++ b/tests/database/test_mongo.py @@ -16,7 +16,7 @@ from h5rdmtoolbox import use from h5rdmtoolbox.database.mongo import MongoDB from h5rdmtoolbox.database.mongo import make_dict_mongo_compatible -from h5rdmtoolbox.wrapper.lazy import LDataset +from h5rdmtoolbox.database.lazy import LDataset try: client = pymongo.MongoClient(serverSelectionTimeoutMS=1.) diff --git a/tests/wrapper/ld/__init__.py b/tests/ld/__init__.py similarity index 100% rename from tests/wrapper/ld/__init__.py rename to tests/ld/__init__.py diff --git a/tests/wrapper/test_ld.py b/tests/ld/test_ld.py similarity index 83% rename from tests/wrapper/test_ld.py rename to tests/ld/test_ld.py index f8232331..70dd968b 100644 --- a/tests/wrapper/test_ld.py +++ b/tests/ld/test_ld.py @@ -7,13 +7,14 @@ import rdflib import ssnolib from ontolutils import namespaces, urirefs, Thing -from ontolutils.namespacelib import M4I, HDF5 +from ontolutils.namespacelib import M4I import h5rdmtoolbox as h5tbx from h5rdmtoolbox import __version__ -from h5rdmtoolbox.wrapper import jsonld, rdf -from h5rdmtoolbox.wrapper.jsonld import build_node_list -from h5rdmtoolbox.wrapper.rdf import RDFError, RDF_FILE_PREDICATE_ATTR_NAME, RDF_TYPE_ATTR_NAME +from h5rdmtoolbox.wrapper import jsonld +from h5rdmtoolbox.ld import rdf +from h5rdmtoolbox.ld import hdf2jsonld +from h5rdmtoolbox.ld.rdf import RDFError, RDF_FILE_PREDICATE_ATTR_NAME, RDF_TYPE_ATTR_NAME logger = h5tbx.logger @@ -37,6 +38,82 @@ def test_dump_type(self): grp.rdf.type = 'https://example.org/MyGroup' print(h5.dump_jsonld(indent=2)) + def test_dump_dataset_data_using_serialize_0D_datasets(self): + with h5tbx.File() as h5: + h5.create_dataset('ds0', data=5.4) + h5.create_dataset('ds_str0', data="Hello") + h5.create_string_dataset('ds_str1', data=["Hello", "World"]) + h5.create_dataset('ds1', data=[1, 2, 3]) + h5.create_dataset('ds2', data=[[1, 2], [3, 4]]) + ttl = h5.serialize(fmt="ttl", serialize_0d_datasets=True) + + g = rdflib.Graph().parse(data=ttl, format="ttl") + sparql_str = """PREFIX rdf: +PREFIX hdf: + +SELECT ?values +WHERE { + ?id a hdf:Dataset . + ?id hdf:name "/ds1" . + ?id hdf:value ?values . +} +""" + res = g.query(sparql_str) + bindings = res.bindings + self.assertEqual(0, len(bindings)) + + def test_dump_dataset_data(self): + with h5tbx.File() as h5: + h5.create_dataset('ds0', data=5.4) + h5.create_dataset('ds_str0', data="Hello") + h5.create_string_dataset('ds_str1', data=["Hello", "World"]) + h5.create_dataset('ds1', data=[1, 2, 3]) + h5.create_dataset('ds2', data=[[1, 2], [3, 4]]) + ttl = h5.serialize(fmt="ttl", skipND=2) + + g = rdflib.Graph().parse(data=ttl, format="ttl") + sparql_str = """PREFIX rdf: +PREFIX hdf: + +SELECT ?values +WHERE { + ?id a hdf:Dataset . + ?id hdf:name "/ds1" . + ?id hdf:value ?values . +} +""" + res = g.query(sparql_str) + bindings = res.bindings + self.assertEqual('[1, 2, 3]', bindings[0][rdflib.Variable('values')].value) + + sparql_str = """PREFIX rdf: +PREFIX hdf: + +SELECT ?values +WHERE { + ?id a hdf:Dataset . + ?id hdf:name "/ds_str0" . + ?id hdf:value ?values . +} +""" + res = g.query(sparql_str) + bindings = res.bindings + self.assertEqual('Hello', bindings[0][rdflib.Variable('values')].value) + + sparql_str = """PREFIX rdf: +PREFIX hdf: + +SELECT ?values +WHERE { + ?id a hdf:Dataset . + ?id hdf:name "/ds_str1" . + ?id hdf:value ?values . +} +""" + res = g.query(sparql_str) + bindings = res.bindings + self.assertEqual("['Hello', 'World']", bindings[0][rdflib.Variable('values')].value) + def test_dump_with_blank_node_iri_base(self): with h5tbx.File() as h5: h5.attrs["__version__"] = __version__ @@ -53,50 +130,50 @@ def test_dump_with_blank_node_iri_base(self): break self.assertTrue(found_local) - def test_build_node_list(self): - - g = rdflib.Graph() - base_node = rdflib.BNode() - g.add((base_node, rdflib.RDF.type, HDF5.Attribute)) - list_node_int = build_node_list(g, [1, 2, 3], use_simple_bnode_value=True, blank_node_iri_base=None) - g.add((base_node, HDF5.value, list_node_int)) - - with self.assertRaises(TypeError): - build_node_list(g, [1, dict(a='1'), 3], use_simple_bnode_value=True, blank_node_iri_base=None) - - print(g.serialize(format='json-ld', indent=2)) - sparql_str = """PREFIX rdf: -PREFIX hdf: - -SELECT ?item -WHERE { - ?id a hdf:Attribute . - ?id hdf:value ?list . - ?list rdf:rest*/rdf:first ?item -}""" - qres = g.query(sparql_str) - list_values = [int(row[0]) for row in qres] - self.assertEqual(list_values, [1, 2, 3]) - - g = rdflib.Graph() - base_node = rdflib.BNode() - g.add((base_node, rdflib.RDF.type, HDF5.Attribute)) - list_node = build_node_list(g, [1, 'str', 3.4, True], use_simple_bnode_value=True, blank_node_iri_base=None) - g.add((base_node, HDF5.value, list_node)) - - print(g.serialize(format='json-ld', indent=2)) - sparql_str = """PREFIX rdf: -PREFIX hdf: - -SELECT ?item -WHERE { - ?id a hdf:Attribute . - ?id hdf:value ?list . - ?list rdf:rest*/rdf:first ?item -}""" - qres = g.query(sparql_str) - list_values = [row[0].value for row in qres] - self.assertEqual(list_values, [1, 'str', 3.4, True]) + # def test_build_node_list(self): + # + # g = rdflib.Graph() + # base_node = rdflib.BNode() + # g.add((base_node, rdflib.RDF.type, HDF5.Attribute)) + # list_node_int = build_node_list(g, [1, 2, 3], use_simple_bnode_value=True, blank_node_iri_base=None) + # g.add((base_node, HDF5.value, list_node_int)) + # + # with self.assertRaises(TypeError): + # build_node_list(g, [1, dict(a='1'), 3], use_simple_bnode_value=True, blank_node_iri_base=None) + # + # print(g.serialize(format='json-ld', indent=2)) + # sparql_str = """PREFIX rdf: + # PREFIX hdf: + # + # SELECT ?item + # WHERE { + # ?id a hdf:Attribute . + # ?id hdf:value ?list . + # ?list rdf:rest*/rdf:first ?item + # }""" + # qres = g.query(sparql_str) + # list_values = [int(row[0]) for row in qres] + # self.assertEqual(list_values, [1, 2, 3]) + # + # g = rdflib.Graph() + # base_node = rdflib.BNode() + # g.add((base_node, rdflib.RDF.type, HDF5.Attribute)) + # list_node = build_node_list(g, [1, 'str', 3.4, True], use_simple_bnode_value=True, blank_node_iri_base=None) + # g.add((base_node, HDF5.value, list_node)) + # + # print(g.serialize(format='json-ld', indent=2)) + # sparql_str = """PREFIX rdf: + # PREFIX hdf: + # + # SELECT ?item + # WHERE { + # ?id a hdf:Attribute . + # ?id hdf:value ?list . + # ?list rdf:rest*/rdf:first ?item + # }""" + # qres = g.query(sparql_str) + # list_values = [row[0].value for row in qres] + # self.assertEqual(list_values, [1, 'str', 3.4, True]) def test_serialize(self): with h5tbx.File() as h5: @@ -524,7 +601,7 @@ def test_codemeta_to_hdf(self): self.assertIsInstance(data[0]['author'], list) with h5tbx.File('test.hdf', 'w') as h5: jsonld.to_hdf(grp=h5.create_group('person'), data=data[0], - context={'@import': "https://doi.org/10.5063/schema/codemeta-2.0"}) + context={'@import': "https://doi.org/10.5063/schema/codemeta-2.0"}) self.assertEqual(h5['person']['author1'].attrs[rdf.RDF_PREDICATE_ATTR_NAME]['SELF'], 'http://schema.org/author') @@ -572,7 +649,7 @@ def test_hdf2jsonld(self): with h5tbx.File('test.hdf', 'w') as h5: jsonld.to_hdf(grp=h5.create_group('person'), source='test.json') - jsonld_filename = jsonld.hdf2jsonld('test.hdf', skipND=1) + jsonld_filename = hdf2jsonld('test.hdf', skipND=1) self.assertTrue(jsonld_filename.exists()) self.assertTrue(jsonld_filename.suffix == '.jsonld') jsonld_filename.unlink() @@ -583,11 +660,11 @@ def test_hdf2jsonld_with_standard_name_table(self): h5.frdf["snt_file"].predicate = ssnolib.namespace.SSNO.usesStandardNameTable h5["/"].attrs["snt_rootgroup"] = "https://sandbox.zenodo.org/uploads/12554567" h5["/"].rdf["snt_rootgroup"].predicate = ssnolib.namespace.SSNO.usesStandardNameTable - print(h5tbx.dump_jsonld(h5.hdf_filename, indent=2, semantic=True, structural=True, + print(h5tbx.dump_jsonld(h5.hdf_filename, indent=2, contextual=True, structural=True, resolve_keys=True, context={"ssno": "https://matthiasprobst.github.io/ssno#"})) jdict = json.loads( - h5tbx.dump_jsonld(h5.hdf_filename, indent=2, semantic=True, structural=True, + h5tbx.dump_jsonld(h5.hdf_filename, indent=2, contextual=True, structural=True, resolve_keys=True, context={"ssno": "https://matthiasprobst.github.io/ssno#"})) jdict["ssno:usesStandardNameTable"] = "https://sandbox.zenodo.org/uploads/125545" @@ -601,7 +678,7 @@ def test_hdf2jsonld_with_standard_name_table(self): self.assertEqual(h5["/"].attrs[RDF_FILE_PREDICATE_ATTR_NAME]["snt_file"], str(ssnolib.namespace.SSNO.usesStandardNameTable)) - print(h5tbx.dump_jsonld(h5.hdf_filename, indent=2, semantic=True, structural=True, + print(h5tbx.dump_jsonld(h5.hdf_filename, indent=2, contextual=True, structural=True, resolve_keys=True, context={"ssno": "https://matthiasprobst.github.io/ssno#"})) diff --git a/tests/wrapper/test_rdf.py b/tests/ld/test_rdf.py similarity index 99% rename from tests/wrapper/test_rdf.py rename to tests/ld/test_rdf.py index 27a98065..ecb6f53e 100644 --- a/tests/wrapper/test_rdf.py +++ b/tests/ld/test_rdf.py @@ -10,8 +10,8 @@ from h5rdmtoolbox import jsonld from h5rdmtoolbox import use from h5rdmtoolbox.wrapper.h5attr import AttrDescriptionError -from h5rdmtoolbox.wrapper.rdf import RDFError -from h5rdmtoolbox.wrapper.rdf import RDF_PREDICATE_ATTR_NAME +from h5rdmtoolbox.ld.rdf import RDFError +from h5rdmtoolbox.ld.rdf import RDF_PREDICATE_ATTR_NAME class TestRDF(unittest.TestCase): diff --git a/tests/wrapper/ld/test_user_graph.py b/tests/ld/test_user_graph.py similarity index 97% rename from tests/wrapper/ld/test_user_graph.py rename to tests/ld/test_user_graph.py index 71890bb6..6701d150 100644 --- a/tests/wrapper/ld/test_user_graph.py +++ b/tests/ld/test_user_graph.py @@ -8,7 +8,7 @@ from ssnolib.namespace import SSNO import h5rdmtoolbox as h5tbx -from h5rdmtoolbox.wrapper.ld.user.attributes import process_attribute, process_file_attribute +from h5rdmtoolbox.ld.user.attributes import process_attribute, process_file_attribute logger = h5tbx.set_loglevel('ERROR') diff --git a/tests/repository/test_zenodo.py b/tests/repository/test_zenodo.py index d39234f8..3a3b24f1 100644 --- a/tests/repository/test_zenodo.py +++ b/tests/repository/test_zenodo.py @@ -9,6 +9,7 @@ import pydantic import requests +import rdflib import h5rdmtoolbox as h5tbx from h5rdmtoolbox import UserDir from h5rdmtoolbox.repository import upload_file @@ -318,11 +319,24 @@ def test_upload_hdf(self): self.assertEqual(z.files.get(json_name).suffix, '.jsonld') json_filename = z.files.get(json_name).download() self.assertTrue(json_filename.exists()) - with open(json_filename) as f: - json_dict = json.loads(f.read()) - self.assertTrue('@context' in json_dict) - self.assertEqual(json_dict['@type'], 'hdf5:File') + graph = rdflib.Graph().parse(source=json_filename, format='json-ld') + query = """ + PREFIX schema: + PREFIX rdf: + PREFIX hdf: + + SELECT ?name + WHERE { + ?s rdf:type hdf:Group . + ?s hdf:name ?name . +}""" + res = graph.query(query) + group_names = [str(row[rdflib.Variable("name")]) for row in res.bindings] + self.assertEqual( + sorted(["/", "/grp1"]), + sorted(group_names) + ) def test_upload_hdf_new_implementation(self): z = zenodo.ZenodoRecord(None, sandbox=True) @@ -364,7 +378,24 @@ def test_upload_hdf_new_implementation(self): json_dict = json.loads(f.read()) self.assertTrue('@context' in json_dict) - self.assertEqual(json_dict['@type'], 'hdf5:File') + + graph = rdflib.Graph().parse(source=json_filename, format='json-ld') + query = """ + PREFIX schema: + PREFIX rdf: + PREFIX hdf: + + SELECT ?name + WHERE { + ?s rdf:type hdf:Group . + ?s hdf:name ?name . +}""" + res = graph.query(query) + group_names = [str(row[rdflib.Variable("name")]) for row in res.bindings] + self.assertEqual( + sorted(["/", "/grp1"]), + sorted(group_names) + ) def test_ZenodoSandboxDeposit(self): z = zenodo.ZenodoSandboxDeposit(None) diff --git a/tests/test_cli.py b/tests/test_cli.py index 2130d312..5d6abb1f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -48,10 +48,11 @@ def test_ld_dump(self): result = runner.invoke(h5tbx, ["ld", f"{h5.hdf_filename}"]) self.assertIsNone(result.exception) expected = """@prefix hdf: . +@prefix xsd: . [] a hdf:File ; hdf:rootGroup [ a hdf:Group ; - hdf:name "/" ] . + hdf:name "/"^^xsd:string ] . """ diff --git a/tests/wrapper/test_lazy.py b/tests/wrapper/test_lazy.py index 5296b56d..6816f5ec 100644 --- a/tests/wrapper/test_lazy.py +++ b/tests/wrapper/test_lazy.py @@ -36,9 +36,9 @@ def test_lazyObject(self): self.assertTrue(lroot_grp < l_dataset) - self.assertIsInstance(lroot_grp, h5tbx.wrapper.lazy.LGroup) + self.assertIsInstance(lroot_grp, h5tbx.database.lazy.LGroup) - self.assertIsInstance(l_dataset, h5tbx.wrapper.lazy.LDataset) + self.assertIsInstance(l_dataset, h5tbx.database.lazy.LDataset) self.assertEqual(l_dataset.name, '/grp/test') self.assertEqual(l_dataset.filename, h5.hdf_filename) self.assertEqual(l_dataset.basename, 'test') @@ -47,10 +47,10 @@ def test_lazyObject(self): self.assertListEqual(list(lroot_grp.keys()), ['grp', 'x']) - self.assertIsInstance(lroot_grp['grp'], h5tbx.wrapper.lazy.LGroup) + self.assertIsInstance(lroot_grp['grp'], h5tbx.database.lazy.LGroup) self.assertEqual(lroot_grp['grp'].name, '/grp') - self.assertIsInstance(lroot_grp['grp']['test'], h5tbx.wrapper.lazy.LDataset) + self.assertIsInstance(lroot_grp['grp']['test'], h5tbx.database.lazy.LDataset) self.assertEqual(lroot_grp['grp']['test'].name, '/grp/test') self.assertEqual(l_dataset.isel(x=0), 1)