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