From cf52e3cd998abad12cf30ccabe41ea992871cfb5 Mon Sep 17 00:00:00 2001
From: Adam Fekete <adam@fekete.co.uk>
Date: Tue, 31 Oct 2023 17:57:02 +0100
Subject: [PATCH] backup

---
 properties.ipynb                              |  2 +-
 .../datasets/fhi_aims/__init__.py             |  2 +-
 .../properties/__init__.py                    | 28 +++++++++++++++++++
 .../properties/categories.py                  |  0
 .../properties/properties.py                  | 28 -------------------
 .../properties/tags.py                        |  0
 6 files changed, 30 insertions(+), 30 deletions(-)
 create mode 100644 src/atomic_features_package/properties/__init__.py
 create mode 100644 src/atomic_features_package/properties/categories.py
 create mode 100644 src/atomic_features_package/properties/tags.py

diff --git a/properties.ipynb b/properties.ipynb
index f97c9fc..9ef588e 100644
--- a/properties.ipynb
+++ b/properties.ipynb
@@ -1 +1 @@
-{"cells":[{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from atomic_features_package import datasets\n","\n","\n","db = datasets.load(name='qm9')\n","\n","db.describe()\n","\n","db['C'].atomic_size # return value\n","\n","elements = ['C', 'O', 'N', 'F', 'H']\n","table = db.get_table(elements, ['atomic_size'])\n","\n","for element in elements:\n","    ...\n","\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from atomic_features_package.category import root\n","\n","root.find_property('atomic_size') # search for slug/property name or description\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from atomic_features_package.property.atomic_properties.physical_poperties import atomic_size\n","\n","print(atomic_size.describe())\n","dbs = atomic_size.list_dataset()\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# dataset needs to be registered dataset object\n","# a dataset's metadata needs to be registered into the poperty\n","# property needs to be registered into category and tags\n","\n","# only properties of already imported datasets can be seen (plugin mechanism?)\n","# lazy load: loading the dataset's metadata not the dataset itself"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["package\n","- multiple datasets (separate metadata)\n","p"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"code","execution_count":22,"metadata":{},"outputs":[],"source":["from typing import Dict, Generic, TypeVar\n","\n","T = TypeVar(\"T\")"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["a=123 sibling=None\n"]}],"source":["from __future__ import annotations\n","\n","from pydantic import BaseModel\n","\n","\n","class Foo(BaseModel):\n","    a: int = 123\n","    #: The sibling of `Foo` is referenced directly by type\n","    sibling: Foo = None\n","\n","\n","print(Foo())"]},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[],"source":["x = Foo()\n","x.a = 1.654654\n"]},{"cell_type":"code","execution_count":4,"metadata":{},"outputs":[{"data":{"text/plain":["Foo(a=1.654654, sibling=None)"]},"execution_count":4,"metadata":{},"output_type":"execute_result"}],"source":["x"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"markdown","metadata":{},"source":["## Properties\n","\n","\n","## Taxonomies:\n","\n","Fetures:\n","- name\n","- slug\n","- descrition\n","\n","- hierarchical: category\n","- not hierachical: tags\n","\n","behind the schene\n","register a new taxonomy\n","crete relationship database\n","\n"]},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[{"data":{"text/plain":["{'1', '2'}"]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["set(['1','2'])"]},{"cell_type":"code","execution_count":36,"metadata":{},"outputs":[],"source":["# ?? slug vs name of the object\n","# https://github.com/fekad/optimade-properties\n","# https://github.com/fekad/optimade-prototype\n","# https://github.com/fekad/optimade-notes\n","\n","# Metaclasses\n","class Taxonomy:\n","    pass\n","\n","class Term(BaseModel):\n","    name: str\n","    slug: str = None\n","    description: str = None\n","\n","\n","class HierarchicalTaxonomy(Taxonomy, Term):\n","    # childs: dict[str, HierarchicalTaxonomy] = None\n","    childs: list[HierarchicalTaxonomy] = None\n","    # childs: dict[slug, HierarchicalTaxonomy] = None\n","    # parent: HierarchicalTaxonomy = None\n","\n","    # def __getitem__(self, key: str) -> HierarchicalTaxonomy:\n","    #     return self.childs[key]\n","\n","\n","class NonHierarchicalTaxonomy(Taxonomy, Term):\n","    terms: set[Term] = None\n","\n","    def __getitem__(self, key: str) -> Term:\n","        if key not in self.terms:\n","            raise KeyError(f\"{key} not in {self.name}\")\n","        return key\n","\n","# TODO parametric type\n","class Category(HierarchicalTaxonomy):\n","    pass\n","\n","# TODO parametric type\n","class Tags(NonHierarchicalTaxonomy):\n","    pass\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["root = Category(\n","    name=\"Propeties\",\n","    description=\"Category description\",\n",")\n","\n","atomic_properties=Category(\n","    name=\"Atomic properties\",\n","    description=\"Atomic Properties\",\n","    slug=\"atomic_properties\",\n","    parent=root,\n",")\n","\n","abundances = Category(\n","    name=\"Abundances\",\n","    slug=\"abundances\",\n","    parent=atomic_properties\n",")\n","atom_sizes = Category(\n","    name=\"Atom sizes\",\n","    slug=\"atom_sizes\",\n","    parent=atomic_properties\n",")\n","crystal_structure = Category(\n","    name=\"Crystal structure\",\n","    slug=\"crystal_structure\",\n","    parent=atomic_properties\n",")\n","electronegativities = Category(\n","    name=\"Electronegativities\",\n","    slug=\"electronegativities\",\n","    parent=atomic_properties\n",")\n","heat_properties = Category(\n","    name=\"Heat properties\",\n","    slug=\"heat_properties\",\n","    parent=atomic_properties\n",")\n","isotopes_and_nmr = Category(\n","    name=\"Isotopes and NMR\",\n","    slug=\"isotopes_and_nmr\",\n","    parent=atomic_properties\n",")\n","orbital_properties = Category(\n","    name=\"Orbital properties\",\n","    slug=\"orbital_properties\",\n","    parent=atomic_properties\n",")\n","physical_properties = Category(\n","    name=\"Physical properties\",\n","    slug=\"physical_properties\",\n","    parent=atomic_properties\n",")\n","\n","\n","print(root.json(indent=2, exclude_none=True))\n","\n","\n","# usage:\n","# from atomic_features_package.categories import root\n","# print(root['atomic_properties']['atom_sizes'])\n","\n","# from atomic_features_package.categories import atom_sizes\n","# print(atom_sizes)\n","\n","# pros:\n","# - it can be more compact\n"]},{"cell_type":"code","execution_count":37,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n","  \"name\": \"Propeties\",\n","  \"description\": \"Category description\",\n","  \"childs\": [\n","    {\n","      \"name\": \"Atomic properties\",\n","      \"slug\": \"atomic_properties\",\n","      \"description\": \"Atomic Properties\",\n","      \"childs\": [\n","        {\n","          \"name\": \"Abundances\"\n","        },\n","        {\n","          \"name\": \"Atom sizes\"\n","        },\n","        {\n","          \"name\": \"Atom sizes\"\n","        },\n","        {\n","          \"name\": \"Crystal structure\"\n","        },\n","        {\n","          \"name\": \"Electronegativities\"\n","        },\n","        {\n","          \"name\": \"Heat properties\"\n","        },\n","        {\n","          \"name\": \"Isotopes and NMR\"\n","        },\n","        {\n","          \"name\": \"Orbital properties\"\n","        },\n","        {\n","          \"name\": \"Physical properties\"\n","        }\n","      ]\n","    }\n","  ]\n","}\n"]}],"source":["# Instnatiation\n","\n","root = Category(\n","    name=\"Propeties\",\n","    description=\"Category description\",\n","    childs=[\n","        Category(\n","            name=\"Atomic properties\",\n","            slug=\"atomic_properties\",\n","            description=\"Atomic Properties\",\n","            childs=[\n","                Category(name=\"Abundances\", slug=\"abundances\"),\n","                Category(name=\"Atom sizes\", slug=\"atom_sizes\"),\n","                Category(name=\"Crystal structure\", slug=\"crystal_structure\"),\n","                Category(name=\"Electronegativities\", slug=\"electronegativities\"),\n","                Category(name=\"Heat properties\", slug=\"heat_properties\"),\n","                Category(name=\"Isotopes and NMR\", slug=\"isotopes_and_nmr\"),\n","                Category(name=\"Orbital properties\", slug=\"orbital_properties\"),\n","                Category(name=\"Physical properties\", slug=\"physical_properties\"),\n","            ]\n","        ),\n","    ]\n",")\n","print(root.json(indent=2, exclude_none=True))\n","\n","\n","# usage:\n","# from atomic_features_package.categories import root\n","# print(root['atomic_properties']['atom_sizes'])\n","\n","# pros:\n","# - you can see the full hiearchy\n","# cons:\n","# - it could verbose"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"code","execution_count":38,"metadata":{},"outputs":[{"ename":"TypeError","evalue":"'Category' object is not subscriptable","output_type":"error","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)","\u001b[0;32m/var/folders/5q/g7by8qk10j1d8j0d31ljzm9c0000gn/T/ipykernel_59724/116230986.py\u001b[0m in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcategory\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'atomic_properties'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'physical_properties'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mTypeError\u001b[0m: 'Category' object is not subscriptable"]}],"source":["category['atomic_properties']['physical_properties']\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["\n","tags = Category(\n","    name=\"tags\",\n","    description=\"Tags\",\n",")\n","\n","calculated = Tag(name=\"calculated\", slug=\"calculated\", parent=tags)\n","estimated = Tag(name=\"estimated\", slug=\"estimated\", parent=tags)\n","measured = Tag(name=\"measured\", slug=\"measured\", parent=tags)\n","elementary = Tag(name=\"elementary\", slug=\"elementary\", parent=tags)\n","derived_value = Tag(name=\"derived value\", slug=\"derived value\", parent=tags)\n","electron = Tag(name=\"electron\", slug=\"electron\", parent=tags)\n","proton = Tag(name=\"proton\", slug=\"proton\", parent=tags)\n","\n","\n","print(tags.json(indent=2, exclude_none=True))"]},{"cell_type":"code","execution_count":27,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n","  \"name\": \"tags\",\n","  \"description\": \"Tags\",\n","  \"terms\": [\n","    \"measured\",\n","    \"estimated\",\n","    \"electron\",\n","    \"elementary\",\n","    \"calculated\",\n","    \"proton\",\n","    \"derived value\"\n","  ]\n","}\n"]}],"source":["tags = NonHierarchicalTaxonomy(\n","    name=\"tags\",\n","    description=\"Tags\",\n","    terms={\n","        \"calculated\",\n","        \"estimated\",\n","        \"measured\",\n","        \"elementary\",\n","        \"derived value\",\n","        \"electron\",\n","        \"proton\",\n","    }\n",")\n","\n","print(tags.json(indent=2, exclude_none=True))"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"code","execution_count":24,"metadata":{},"outputs":[],"source":["#     label: Optional[str] = Field(None, title=\"Latex label\", description='Latex symbol of the property')\n","#     synonyms: List[str] = Field(None, description='List of possible synonyms ()')\n","#     dtype: Optional[DType] = Field(DType.float, description='Type of the property')\n","#     shape: Optional[List[int]]\n","#     tensor_rank: Optional[int] = Field(0, description='The rank od the property (default: 0)', ge=0)\n","#     units: Optional[str] = Field(None, description='')\n","#     unit_system: Optional[str] = Field(None, description='')\n","#     dimension: Optional[str] = Field(None, description='')\n","#     class Config:\n","#         # TODO: temporary :)\n","#         extra = 'allow'\n","#\n","#     def as_unit(self, str):\n","#         # TODO: lazy unit conversation\n","#         pass\n","\n","class Property(BaseModel):\n","    name: str\n","    uri: str\n","    unit: str\n","    description: str = None\n","    category: Category = None  # category: Category = None\n","    tags: list[Tag] = None #"]},{"cell_type":"code","execution_count":30,"metadata":{},"outputs":[],"source":["# catorgory ref: category/atomic_properties/physical_properties\n","# tags ref: tags/estimated, tags/measured\n","# Note: tag and catogory are singleton objects (uniqueness)\n","# TODO: type and shape\n","# TODO: complex types > list, dict, list of dicts\n","# TODO: doi vs slugs: doi is unique identifier, the name of the object is the slug itself\n","\n","density_of_solid = Property(\n","    name=\"Density of solid\",\n","    uri=None,\n","    description=\"The density of a solid material is defined as its mass per unit volume.\",\n","    unit=\"g/cm3\",\n","    category=category['atomic_properties']['physical_properties'],\n","    tags=[tags['estimated'],tags['measured']]\n",")\n","\n","\n","density_of_solid = Property(\n","    name=\"Density of solid\",\n","    uri=None,\n","    description=\"The density of a solid material is defined as its mass per unit volume.\",\n","    unit=\"g/cm3\",\n","    category=category.atomic_properties.physical_properties,\n","    tags=[tags.estimated,tags.measured]\n",")\n","\n","\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# ionisation energies\n","# Ionisation energy number\tEnthalpy / kJ mol‑1\n","# 1st\t1086.45\n","# 2nd\t2352.62\n","# 3rd\t4620.47\n","# 4th\t6222.68\n","# 5th\t37831.0\n","# 6th\t47277.1\n","\n","# [1086.45, 2352.62, 4620.47, 6222.68, 37831.0, 47277.1]"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# Effective nuclear charges for carbon\n","# 1s\t5.6727\n","# 2s\t3.22\t2p\t3.14\n","# 3s\t(no data)\t3p\t(no data)\t3d\t(no data)\n","# 4s\t(no data)\t4p\t(no data)\t4d\t(no data)\t4f\t(no data)\n","# 5s\t(no data)\t5p\t(no data)\t5d\t(no data)\n","# 6s\t(no data)\t6p\t(no data)\n","# 7s\n","\n","# {'1s':5.6727, '2s':3.22, '2p':3.14}"]},{"cell_type":"code","execution_count":33,"metadata":{},"outputs":[{"data":{"text/plain":["[{'Isotope': '12C',\n","  'Mass / Da': 12.0,\n","  'Natural abundance (atom %)': 98.93,\n","  'Nuclear spin (I)': 0,\n","  'Magnetic moment (μ/μN)': 0},\n"," {'Isotope': '13C',\n","  'Mass / Da': 13.0033548378,\n","  'Natural abundance (atom %)': 1.07,\n","  'Nuclear spin (I)': 0.5,\n","  'Magnetic moment (μ/μN)': 0.702411}]"]},"execution_count":33,"metadata":{},"output_type":"execute_result"}],"source":["# Isotope\tMass / Da\tNatural abundance (atom %)\tNuclear spin (I)\tMagnetic moment (μ/μN)\n","[\n","    {\n","        'Isotope':'12C',\n","        'Mass / Da': 12.0000000,\n","        'Natural abundance (atom %)': 98.93,\n","        'Nuclear spin (I)': 0,\n","        'Magnetic moment (μ/μN)': 0\n","    },\n","    {\n","        'Isotope':'13C',\n","        'Mass / Da': 13.0033548378,\n","        'Natural abundance (atom %)': 1.07,\n","        'Nuclear spin (I)': 1/2,\n","        'Magnetic moment (μ/μN)': 0.702411\n","    }\n","]"]},{"cell_type":"code","execution_count":26,"metadata":{},"outputs":[{"data":{"text/plain":["HierarchicalTaxonomy(name='Atomic properties', description='Atomic Properties', childs={'abundances': HierarchicalTaxonomy(name='Abundances', description=None, childs=None), 'atom_sizes': HierarchicalTaxonomy(name='Atom sizes', description=None, childs=None), 'crystal_structure': HierarchicalTaxonomy(name='Crystal structure', description=None, childs=None), 'electronegativities': HierarchicalTaxonomy(name='Electronegativities', description=None, childs=None), 'heat_properties': HierarchicalTaxonomy(name='Heat properties', description=None, childs=None), 'isotopes_and_nmr': HierarchicalTaxonomy(name='Isotopes and NMR', description=None, childs=None), 'orbital_properties': HierarchicalTaxonomy(name='Orbital properties', description=None, childs=None), 'physical_properties': HierarchicalTaxonomy(name='Physical properties', description=None, childs=None)})"]},"execution_count":26,"metadata":{},"output_type":"execute_result"}],"source":["class Material(BaseModel):\n","    name: str\n","    slug: str\n","    description: str = None\n","\n","    density_of_solid: build_property(density_of_solid, unit=\"g/cm3\")\n","    density_of_solid: density_of_solid.definiton(unit=\"g/cm3\")\n"]},{"cell_type":"markdown","metadata":{},"source":["\n","refering to a property:\n","\n","- uri? vd code?\n","\n"]},{"cell_type":"markdown","metadata":{},"source":[]}],"metadata":{"kernelspec":{"display_name":".venv","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.16"},"orig_nbformat":4},"nbformat":4,"nbformat_minor":2}
+{"cells":[{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# structure maps\n","# tote"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["pip install atomic_feauter_my_data"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["WHAT? <=> MEAN?  HOW(WHICH)?"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from atomic_features_package import datasets\n","\n","db = datasets.load(name='my_data')\n","db.describe()\n","\n","db['C'].atomic_size # return value\n","db['C'].atomic_size # return value\n","\n","elements = ['C', 'O', 'N', 'F', 'H']\n","table = db.get_table(elements, ['atomic_size'])\n","\n","for element in elements:\n","    ...\n","\n","\n","# db.query('atomic_size > 1.0, n_neigh =3')\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from atomic_features_package.category import root\n","\n","root.find_property('atomic_size') # search for slug/property name or description\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from atomic_features_package.property.atomic_properties.physical_poperties import atomic_size\n","\n","print(atomic_size.describe())\n","dbs = atomic_size.list_dataset()\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# dataset needs to be registered dataset object\n","# a dataset's metadata needs to be registered into the poperty\n","# property needs to be registered into category and tags\n","\n","# only properties of already imported datasets can be seen (plugin mechanism?)\n","# lazy load: loading the dataset's metadata not the dataset itself"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["package\n","- multiple datasets (separate metadata)\n","p"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"code","execution_count":22,"metadata":{},"outputs":[],"source":["from typing import Dict, Generic, TypeVar\n","\n","T = TypeVar(\"T\")"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["a=123 sibling=None\n"]}],"source":["from __future__ import annotations\n","\n","from pydantic import BaseModel\n","\n","\n","class Foo(BaseModel):\n","    a: int = 123\n","    #: The sibling of `Foo` is referenced directly by type\n","    sibling: Foo = None\n","\n","\n","print(Foo())"]},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[],"source":["x = Foo()\n","x.a = 1.654654\n"]},{"cell_type":"code","execution_count":4,"metadata":{},"outputs":[{"data":{"text/plain":["Foo(a=1.654654, sibling=None)"]},"execution_count":4,"metadata":{},"output_type":"execute_result"}],"source":["x"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"markdown","metadata":{},"source":["## Properties\n","\n","\n","## Taxonomies:\n","\n","Fetures:\n","- name\n","- slug\n","- descrition\n","\n","- hierarchical: category\n","- not hierachical: tags\n","\n","behind the schene\n","register a new taxonomy\n","crete relationship database\n","\n"]},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[{"data":{"text/plain":["{'1', '2'}"]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["set(['1','2'])"]},{"cell_type":"code","execution_count":36,"metadata":{},"outputs":[],"source":["# ?? slug vs name of the object\n","# https://github.com/fekad/optimade-properties\n","# https://github.com/fekad/optimade-prototype\n","# https://github.com/fekad/optimade-notes\n","\n","# Metaclasses\n","class Taxonomy:\n","    pass\n","\n","class Term(BaseModel):\n","    name: str\n","    slug: str = None\n","    description: str = None\n","\n","\n","class HierarchicalTaxonomy(Taxonomy, Term):\n","    # childs: dict[str, HierarchicalTaxonomy] = None\n","    childs: list[HierarchicalTaxonomy] = None\n","    # childs: dict[slug, HierarchicalTaxonomy] = None\n","    # parent: HierarchicalTaxonomy = None\n","\n","    # def __getitem__(self, key: str) -> HierarchicalTaxonomy:\n","    #     return self.childs[key]\n","\n","\n","class NonHierarchicalTaxonomy(Taxonomy, Term):\n","    terms: set[Term] = None\n","\n","    def __getitem__(self, key: str) -> Term:\n","        if key not in self.terms:\n","            raise KeyError(f\"{key} not in {self.name}\")\n","        return key\n","\n","# TODO parametric type\n","class Category(HierarchicalTaxonomy):\n","    pass\n","\n","# TODO parametric type\n","class Tags(NonHierarchicalTaxonomy):\n","    pass\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# TODO: singular names for categories\n","\n","root = Category(\n","    name=\"Property\",\n","    description=\"Category description\",\n",")\n","\n","atomic_properties=Category(\n","    name=\"Atomic properties\",\n","    description=\"Atomic Properties\",\n","    slug=\"atomic_properties\",\n","    parent=root,\n",")\n","\n","abundances = Category(\n","    name=\"Abundances\",\n","    slug=\"abundances\",\n","    parent=atomic_properties\n",")\n","atom_sizes = Category(\n","    name=\"Atom sizes\",\n","    slug=\"atom_sizes\",\n","    parent=atomic_properties\n",")\n","crystal_structure = Category(\n","    name=\"Crystal structure\",\n","    slug=\"crystal_structure\",\n","    parent=atomic_properties\n",")\n","electronegativities = Category(\n","    name=\"Electronegativities\",\n","    slug=\"electronegativities\",\n","    parent=atomic_properties\n",")\n","heat_properties = Category(\n","    name=\"Heat properties\",\n","    slug=\"heat_properties\",\n","    parent=atomic_properties\n",")\n","isotopes_and_nmr = Category(\n","    name=\"Isotopes and NMR\",\n","    slug=\"isotopes_and_nmr\",\n","    parent=atomic_properties\n",")\n","orbital_properties = Category(\n","    name=\"Orbital property\",\n","    slug=\"orbital_propert\",\n","    parent=atomic_properties\n",")\n","physical_properties = Category(\n","    name=\"Physical properties\",\n","    slug=\"physical_properties\",\n","    parent=atomic_properties\n",")\n","\n","\n","print(root.json(indent=2, exclude_none=True))\n","\n","\n","# usage:\n","# from atomic_features_package.categories import root\n","# print(root['atomic_properties']['atom_sizes'])\n","\n","# from atomic_features_package.categories import atom_sizes\n","# print(atom_sizes)\n","\n","# pros:\n","# - it can be more compact\n"]},{"cell_type":"code","execution_count":37,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n","  \"name\": \"Propeties\",\n","  \"description\": \"Category description\",\n","  \"childs\": [\n","    {\n","      \"name\": \"Atomic properties\",\n","      \"slug\": \"atomic_properties\",\n","      \"description\": \"Atomic Properties\",\n","      \"childs\": [\n","        {\n","          \"name\": \"Abundances\"\n","        },\n","        {\n","          \"name\": \"Atom sizes\"\n","        },\n","        {\n","          \"name\": \"Atom sizes\"\n","        },\n","        {\n","          \"name\": \"Crystal structure\"\n","        },\n","        {\n","          \"name\": \"Electronegativities\"\n","        },\n","        {\n","          \"name\": \"Heat properties\"\n","        },\n","        {\n","          \"name\": \"Isotopes and NMR\"\n","        },\n","        {\n","          \"name\": \"Orbital properties\"\n","        },\n","        {\n","          \"name\": \"Physical properties\"\n","        }\n","      ]\n","    }\n","  ]\n","}\n"]}],"source":["# Instnatiation\n","\n","root = Category(\n","    name=\"Propeties\",\n","    description=\"Category description\",\n","    childs=[\n","        Category(\n","            name=\"Atomic properties\",\n","            slug=\"atomic_properties\",\n","            description=\"Atomic Properties\",\n","            childs=[\n","                Category(name=\"Abundances\", slug=\"abundances\"),\n","                Category(name=\"Atom sizes\", slug=\"atom_sizes\"),\n","                Category(name=\"Crystal structure\", slug=\"crystal_structure\"),\n","                Category(name=\"Electronegativities\", slug=\"electronegativities\"),\n","                Category(name=\"Heat properties\", slug=\"heat_properties\"),\n","                Category(name=\"Isotopes and NMR\", slug=\"isotopes_and_nmr\"),\n","                Category(name=\"Orbital properties\", slug=\"orbital_properties\"),\n","                Category(name=\"Physical properties\", slug=\"physical_properties\"),\n","            ]\n","        ),\n","    ]\n",")\n","print(root.json(indent=2, exclude_none=True))\n","\n","\n","# usage:\n","# from atomic_features_package.categories import root\n","# print(root['atomic_properties']['atom_sizes'])\n","\n","# pros:\n","# - you can see the full hiearchy\n","# cons:\n","# - it could verbose"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"code","execution_count":38,"metadata":{},"outputs":[{"ename":"TypeError","evalue":"'Category' object is not subscriptable","output_type":"error","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)","\u001b[0;32m/var/folders/5q/g7by8qk10j1d8j0d31ljzm9c0000gn/T/ipykernel_59724/116230986.py\u001b[0m in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcategory\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'atomic_properties'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'physical_properties'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mTypeError\u001b[0m: 'Category' object is not subscriptable"]}],"source":["category['atomic_properties']['physical_properties']\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["\n","tags = Category(\n","    name=\"tags\",\n","    description=\"Tags\",\n",")\n","\n","calculated = Tag(name=\"calculated\", slug=\"calculated\", parent=tags)\n","estimated = Tag(name=\"estimated\", slug=\"estimated\", parent=tags)\n","measured = Tag(name=\"measured\", slug=\"measured\", parent=tags)\n","elementary = Tag(name=\"elementary\", slug=\"elementary\", parent=tags)\n","derived_value = Tag(name=\"derived value\", slug=\"derived value\", parent=tags)\n","electron = Tag(name=\"electron\", slug=\"electron\", parent=tags)\n","proton = Tag(name=\"proton\", slug=\"proton\", parent=tags)\n","\n","\n","print(tags.json(indent=2, exclude_none=True))"]},{"cell_type":"code","execution_count":27,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n","  \"name\": \"tags\",\n","  \"description\": \"Tags\",\n","  \"terms\": [\n","    \"measured\",\n","    \"estimated\",\n","    \"electron\",\n","    \"elementary\",\n","    \"calculated\",\n","    \"proton\",\n","    \"derived value\"\n","  ]\n","}\n"]}],"source":["tags = NonHierarchicalTaxonomy(\n","    name=\"tags\",\n","    description=\"Tags\",\n","    terms={\n","        \"calculated\",\n","        \"estimated\",\n","        \"measured\",\n","        \"elementary\",\n","        \"derived value\",\n","        \"electron\",\n","        \"proton\",\n","    }\n",")\n","\n","print(tags.json(indent=2, exclude_none=True))"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":[]},{"cell_type":"code","execution_count":24,"metadata":{},"outputs":[],"source":["#     label: Optional[str] = Field(None, title=\"Latex label\", description='Latex symbol of the property')\n","#     synonyms: List[str] = Field(None, description='List of possible synonyms ()')\n","#     dtype: Optional[DType] = Field(DType.float, description='Type of the property')\n","#     shape: Optional[List[int]]\n","#     tensor_rank: Optional[int] = Field(0, description='The rank od the property (default: 0)', ge=0)\n","#     units: Optional[str] = Field(None, description='')\n","#     unit_system: Optional[str] = Field(None, description='')\n","#     dimension: Optional[str] = Field(None, description='')\n","#     class Config:\n","#         # TODO: temporary :)\n","#         extra = 'allow'\n","#\n","#     def as_unit(self, str):\n","#         # TODO: lazy unit conversation\n","#         pass\n","\n","class Property(BaseModel):\n","    name: str\n","    uri: str\n","    unit: str\n","    description: str = None\n","    category: Category = None  # category: Category = None\n","    tags: list[Tag] = None #"]},{"cell_type":"code","execution_count":30,"metadata":{},"outputs":[],"source":["# catorgory ref: category/atomic_properties/physical_properties\n","# tags ref: tags/estimated, tags/measured\n","# Note: tag and catogory are singleton objects (uniqueness)\n","# TODO: type and shape\n","# TODO: complex types > list, dict, list of dicts\n","# TODO: doi vs slugs: doi is unique identifier, the name of the object is the slug itself\n","\n","density_of_solid = Property(\n","    name=\"Density of solid\",\n","    uri=None,\n","    description=\"The density of a solid material is defined as its mass per unit volume.\",\n","    unit=\"g/cm3\",\n","    category=category['atomic_properties']['physical_properties'],\n","    tags=[tags['estimated'],tags['measured']]\n",")\n","\n","\n","density_of_solid = Property(\n","    name=\"Density of solid\",\n","    uri=None,\n","    description=\"The density of a solid material is defined as its mass per unit volume.\",\n","    unit=\"g/cm3\",\n","    category=category.atomic_properties.physical_properties,\n","    tags=[tags.estimated,tags.measured]\n",")\n","\n","\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# ionisation energies\n","# Ionisation energy number\tEnthalpy / kJ mol‑1\n","# 1st\t1086.45\n","# 2nd\t2352.62\n","# 3rd\t4620.47\n","# 4th\t6222.68\n","# 5th\t37831.0\n","# 6th\t47277.1\n","\n","# [1086.45, 2352.62, 4620.47, 6222.68, 37831.0, 47277.1]"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["# Effective nuclear charges for carbon\n","# 1s\t5.6727\n","# 2s\t3.22\t2p\t3.14\n","# 3s\t(no data)\t3p\t(no data)\t3d\t(no data)\n","# 4s\t(no data)\t4p\t(no data)\t4d\t(no data)\t4f\t(no data)\n","# 5s\t(no data)\t5p\t(no data)\t5d\t(no data)\n","# 6s\t(no data)\t6p\t(no data)\n","# 7s\n","\n","# {'1s':5.6727, '2s':3.22, '2p':3.14}"]},{"cell_type":"code","execution_count":33,"metadata":{},"outputs":[{"data":{"text/plain":["[{'Isotope': '12C',\n","  'Mass / Da': 12.0,\n","  'Natural abundance (atom %)': 98.93,\n","  'Nuclear spin (I)': 0,\n","  'Magnetic moment (μ/μN)': 0},\n"," {'Isotope': '13C',\n","  'Mass / Da': 13.0033548378,\n","  'Natural abundance (atom %)': 1.07,\n","  'Nuclear spin (I)': 0.5,\n","  'Magnetic moment (μ/μN)': 0.702411}]"]},"execution_count":33,"metadata":{},"output_type":"execute_result"}],"source":["# Isotope\tMass / Da\tNatural abundance (atom %)\tNuclear spin (I)\tMagnetic moment (μ/μN)\n","[\n","    {\n","        'Isotope':'12C',\n","        'Mass / Da': 12.0000000,\n","        'Natural abundance (atom %)': 98.93,\n","        'Nuclear spin (I)': 0,\n","        'Magnetic moment (μ/μN)': 0\n","    },\n","    {\n","        'Isotope':'13C',\n","        'Mass / Da': 13.0033548378,\n","        'Natural abundance (atom %)': 1.07,\n","        'Nuclear spin (I)': 1/2,\n","        'Magnetic moment (μ/μN)': 0.702411\n","    }\n","]"]},{"cell_type":"code","execution_count":26,"metadata":{},"outputs":[{"data":{"text/plain":["HierarchicalTaxonomy(name='Atomic properties', description='Atomic Properties', childs={'abundances': HierarchicalTaxonomy(name='Abundances', description=None, childs=None), 'atom_sizes': HierarchicalTaxonomy(name='Atom sizes', description=None, childs=None), 'crystal_structure': HierarchicalTaxonomy(name='Crystal structure', description=None, childs=None), 'electronegativities': HierarchicalTaxonomy(name='Electronegativities', description=None, childs=None), 'heat_properties': HierarchicalTaxonomy(name='Heat properties', description=None, childs=None), 'isotopes_and_nmr': HierarchicalTaxonomy(name='Isotopes and NMR', description=None, childs=None), 'orbital_properties': HierarchicalTaxonomy(name='Orbital properties', description=None, childs=None), 'physical_properties': HierarchicalTaxonomy(name='Physical properties', description=None, childs=None)})"]},"execution_count":26,"metadata":{},"output_type":"execute_result"}],"source":["class Material(BaseModel):\n","    name: str\n","    slug: str\n","    description: str = None\n","\n","    density_of_solid: build_property(density_of_solid, unit=\"g/cm3\")\n","    density_of_solid: density_of_solid.definiton(unit=\"g/cm3\")\n"]},{"cell_type":"markdown","metadata":{},"source":["\n","refering to a property:\n","\n","- uri? vd code?\n","\n"]},{"cell_type":"markdown","metadata":{},"source":[]}],"metadata":{"kernelspec":{"display_name":".venv","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.16"},"orig_nbformat":4},"nbformat":4,"nbformat_minor":2}
diff --git a/src/atomic_features_package/datasets/fhi_aims/__init__.py b/src/atomic_features_package/datasets/fhi_aims/__init__.py
index 762b7f2..cb02ff5 100644
--- a/src/atomic_features_package/datasets/fhi_aims/__init__.py
+++ b/src/atomic_features_package/datasets/fhi_aims/__init__.py
@@ -53,7 +53,7 @@ class FhiAimsSpin(BaseModel):
     atomic_element_symbol: str = Field(description="""Provides the symbol of element as per periodic table""")
     atomic_r_s: Optional[list[float]] = Field(description="""Provides the s orbital atomic radii [angstrom]""")
     atomic_r_p: Optional[list[float]] = Field(description="""Provides the p orbital atomic radii [angstrom]""")
-    atomic_r_d: Optional[list[float]] = eField(description="""Provides the d orbital atomic radii [angstrom]""")
+    atomic_r_d: Optional[list[float]] = Field(description="""Provides the d orbital atomic radii [angstrom]""")
     atomic_r_val: list[float] = Field(description="""Provides the atomic radii of element [angstrom]""")
     atomic_ea: float = Field(description="""Provides the atomic electron affinity calculated from energy difference [joule]""")
     atomic_ip: float = Field(description="""Provides the atomic ionization potential calculated  from energy difference [joule]""")
diff --git a/src/atomic_features_package/properties/__init__.py b/src/atomic_features_package/properties/__init__.py
new file mode 100644
index 0000000..da5dc41
--- /dev/null
+++ b/src/atomic_features_package/properties/__init__.py
@@ -0,0 +1,28 @@
+
+#%%
+from pydantic import BaseModel, Field
+
+class Property(BaseModel):
+    name: str
+    descrtption: str
+    type: type
+    unit: str
+
+# %%
+
+class Category(BaseModel):
+    name: str
+    description: str
+    properties: dict[str, Property]
+
+
+
+# %%
+class Model(BaseModel):
+    prop:float = Field(..., description='hello', unit='eV')
+
+# %%
+
+
+
+class PymatgenData(BaseModel)
\ No newline at end of file
diff --git a/src/atomic_features_package/properties/categories.py b/src/atomic_features_package/properties/categories.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/atomic_features_package/properties/properties.py b/src/atomic_features_package/properties/properties.py
index da5dc41..e69de29 100644
--- a/src/atomic_features_package/properties/properties.py
+++ b/src/atomic_features_package/properties/properties.py
@@ -1,28 +0,0 @@
-
-#%%
-from pydantic import BaseModel, Field
-
-class Property(BaseModel):
-    name: str
-    descrtption: str
-    type: type
-    unit: str
-
-# %%
-
-class Category(BaseModel):
-    name: str
-    description: str
-    properties: dict[str, Property]
-
-
-
-# %%
-class Model(BaseModel):
-    prop:float = Field(..., description='hello', unit='eV')
-
-# %%
-
-
-
-class PymatgenData(BaseModel)
\ No newline at end of file
diff --git a/src/atomic_features_package/properties/tags.py b/src/atomic_features_package/properties/tags.py
new file mode 100644
index 0000000..e69de29
-- 
GitLab