{ "cells": [ { "cell_type": "markdown", "id": "d32ef576-c89c-47f0-b089-33e82875e067", "metadata": {}, "source": [ "# Downloading and managing data with MADAS" ] }, { "cell_type": "markdown", "id": "e18424e3-bf74-4686-9ccc-fe8ef59a4c08", "metadata": {}, "source": [ "For our tutorial, we will use data from [NOMAD](https://nomad-lab.eu). NOMAD is a free and FAIR online database of materials-science data, including results from both theory and experiments. As such, it is a rich source of data for analytics and machine learning. \n", "\n", "NOMAD follows a user-centric approach to data management, allowing users to upload raw data, which is then transformed and archived on the NOMAD platform. As such, it supports many different ways of representing data, including user-defined schemas. This rich metadata is a valuable source for data analytics, as it allows to keep track of the whole provenance of the data, allowing to find and understand outliers and creating trustable results. However, the verbosity of the schemata leads to significant complexity, making it hard to find the relevant information for a given application. Furthermore, the flexible approach of the NOMAD data schema allows that the central database contains different versions of the same schema, based on when the data was processed. While in those cases the data provenance is preserved, bringing the data to an application may require processing of the data before it can be used.\n", "\n", "MADAS as a framework allows to connect to the NOMAD API, download data, store it in a local database, apply transformations to the data, and extract the transformed data for downstream applications." ] }, { "cell_type": "markdown", "id": "eca71d9a-8ff6-4dd0-8063-6c9a1b9bd131", "metadata": {}, "source": [ "In this tutorial you are going to learn how to:\n", "\n", "
\n", " \n", "**[Use an API to download data](#Use-an-API-to-download-data)** \n", "**[Store materials data in a local database](#Store-materials-data-in-a-local-database)** \n", "**[Derive properties in the database](#Derive-properties-in-the-database)** \n", "**[Retrieve properties](#Retrieve-properties)** \n", "\n", "
\n", "\n", "Let's get started!" ] }, { "cell_type": "markdown", "id": "3b26d170-b66a-4dbb-8332-288a80be610a", "metadata": {}, "source": [ "## Use an API to download data" ] }, { "cell_type": "markdown", "id": "8ba46ad1-5d9e-4eb9-9164-9478a3101da1", "metadata": {}, "source": [ "The first step of downloading data is to select a suitable dataset. Within MADAS, we can query the NOMAD database for suitable entries. This is achieved by connecting to the NOMAD API, and submitting queries and downloading data from there. \n", "If you want to learn more about how NOMAD makes this possible, you can find more information in the [NOMAD documentation](https://nomad-lab.eu/prod/v1/docs/howto/manage/program/api.html)." ] }, { "cell_type": "markdown", "id": "fe788ad3-6955-4287-8238-06afc547e24d", "metadata": {}, "source": [ "First we import the API interface for NOMAD:" ] }, { "cell_type": "code", "execution_count": 1, "id": "42b9fe50-0629-4c76-9e38-e39b72f9b6c5", "metadata": {}, "outputs": [], "source": [ "from madas.apis import NOMAD_API" ] }, { "cell_type": "markdown", "id": "4d1f3b4f-c62b-49c4-a6ee-2030b0626d39", "metadata": {}, "source": [ "You can find the full documentation of the NOMAD API class [here](https://madas.readthedocs.io/en/latest/APIs/nomad_archive_api.html).\n", "\n", "The most important functions are `get_calculations_by_search` and `get_calculation`. The former allows to query the NOMAD database and downloading all matching entries as `Material` objects ([see also the documentation here](https://madas.readthedocs.io/en/latest/modules/material.html)). Materials will be uniquely identified by their entry id. \n", "If you already know the entry ids of the NOMAD entries that you are interested in, `get_calculation` can be used to retrieve this entry.\n", "\n", "To demostrate how this works with MADAS, we have selected a high-throughput dataset [1] computed using the hybrid HSE06 exchange-correlation functional with density functional theory [from NOMAD](https://dx.doi.org/10.17172/NOMAD/2025.05.01-1). To limit the amount of retrieved data, we restrict our search to cubic structures. \n", "To simplify writing NOMAD queries, it is possible to create them via [the GUI](https://nomad-lab.eu/prod/v1/gui/search/entries) (see also [this section](https://nomad-lab.eu/prod/v1/docs/tutorial/explore.html) of the NOMAD documentation), and copying the query by clicking on the **<>** symbol below the search bar." ] }, { "cell_type": "code", "execution_count": 2, "id": "18370ccf-9446-43d9-b717-e67c6e441c86", "metadata": {}, "outputs": [], "source": [ "# Create an API object\n", "api = NOMAD_API()" ] }, { "cell_type": "code", "execution_count": 3, "id": "ab335a22-f00b-4b27-9824-d3ed5f87d85a", "metadata": {}, "outputs": [], "source": [ "# define the NOMAD query\n", "query = {\n", " \"results.material.symmetry.crystal_system:any\": [\n", " \"cubic\"\n", " ],\n", " \"results.method.simulation.dft.xc_functional_type:any\": [\n", " \"hybrid\"\n", " ],\n", " \"datasets.dataset_name:any\": [\n", " \"Materials Database from All-electron Hybrid Functional DFT Calculations\"\n", " ],\n", " \"results.properties.available_properties:all\": [\n", " \"dos_electronic\"\n", " ]\n", " }" ] }, { "cell_type": "markdown", "id": "7583d3ac-8653-486c-93b4-ed4f8ce0c8ed", "metadata": {}, "source": [ "We can test if our query worked by downloading only a single calculation at first:" ] }, { "cell_type": "code", "execution_count": 4, "id": "4ab8c81c-9608-4acf-a623-8dd6a422e2a9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 10 entries\n", "Possibly not all entries discovered due to max_entries limit\n", "Downloading 1 entries\n", "Finished download.\n" ] } ], "source": [ "materials = api.get_calculations_by_search(query, max_entries=1)" ] }, { "cell_type": "markdown", "id": "9dacff71-a97d-49a6-9fd1-111e6aac09c7", "metadata": {}, "source": [ "Let's investigate what we got back from the API:" ] }, { "cell_type": "code", "execution_count": 5, "id": "21c0d62e-6f44-4fb1-8fb0-7529767fb539", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Material(mid = 0LFocy2yAB3pqdEz41liXtLWNGvR, formula = Ca, data = {'archive'}, properties = set())\n" ] } ], "source": [ "example_material = materials[0]\n", "print(example_material)" ] }, { "cell_type": "markdown", "id": "f95d161c-96f9-46c7-9e8e-0854c79f71e9", "metadata": {}, "source": [ "Printing the `Material` reveals some of it's properties: \n", "- the `mid` is used to uniquely identify the material. It is obtained from the NOMAD _entry id_. \n", "- the `formula` is the reduced formula and can be used as a human readable identifier when working with the data. \n", "- the `data` attribute contains all data that was downloaded from NOMAD. \n", "- the `property` attribute is still empty, as it contains properties that are derived from the downloaded `data`. \n", "\n", "\n", "We can verify that we recieved the same data by creating a link to the NOMAD website with the entry id: " ] }, { "cell_type": "code", "execution_count": 6, "id": "9c331da1-a4ac-4402-a4fc-588d24b0de7d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://www.nomad-lab.eu/entry/id/0LFocy2yAB3pqdEz41liXtLWNGvR\n" ] } ], "source": [ "print(f\"https://www.nomad-lab.eu/entry/id/{example_material.mid}\")" ] }, { "cell_type": "markdown", "id": "4e25f84f-100f-4116-a3e9-7f2525cbc16f", "metadata": {}, "source": [ "We can visualize the unit cell of the material using some untility functions:" ] }, { "cell_type": "code", "execution_count": 7, "id": "e4b3b1e7-5a90-4946-8da0-c9a2b491c459", "metadata": {}, "outputs": [], "source": [ "from madas.plotting import plot_material" ] }, { "cell_type": "code", "execution_count": 8, "id": "43af659a-d44b-4bc3-8ab3-704f93aeb60d", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_material(example_material,\n", " repeat=[1,1,1], # repetitions of the unit cell \n", " show_unit_cell=2) # show the whole unit cell in the plot" ] }, { "cell_type": "markdown", "id": "31ce2823-1c23-4db5-92f5-ad0c117dd2cc", "metadata": {}, "source": [ "MADAS uses the [Atomic Simulation Environment (ASE)](https://ase-lib.org/) for representing atomic structures (and much more). The `ase.Atoms` object of each `Material` can be used to extract it directly and get access to many convenient functions of the `ase` famework." ] }, { "cell_type": "code", "execution_count": 9, "id": "0b626ffe-52cd-4225-98cb-41e919093ffd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(type(example_material.atoms))" ] }, { "cell_type": "markdown", "id": "cd9a4d70-2949-4119-b9d4-ac4663a23dbb", "metadata": {}, "source": [ "Let's inspect the `data` attibute. For the API, we have recieved the _archive_ as a Python dictinary:" ] }, { "cell_type": "code", "execution_count": 10, "id": "1679fca4-cd05-4c20-ab4e-5aeb35172962", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['archive'])\n" ] } ], "source": [ "print(example_material.data.keys())" ] }, { "cell_type": "markdown", "id": "1e43e5f0-7d1e-4d74-9684-2daf92191c66", "metadata": {}, "source": [ "Within the archive, we find the information NOMAD has stored about this entry:" ] }, { "cell_type": "code", "execution_count": 11, "id": "29b90bb3-f2fc-479f-85d3-6151a8c85062", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['processing_logs', 'run', 'workflow2', 'metadata', 'results', 'm_ref_archives'])\n" ] } ], "source": [ "print(example_material.data['archive'].keys())" ] }, { "cell_type": "markdown", "id": "90269f9f-8c61-407f-ba08-8328240f96a1", "metadata": {}, "source": [ "The material properties are currently emtpy:" ] }, { "cell_type": "code", "execution_count": 12, "id": "b00f4917-7054-40eb-8022-b594df39a6ea", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{}\n" ] } ], "source": [ "print(example_material.properties)" ] }, { "cell_type": "markdown", "id": "ab7c973f-ee90-4c18-80d1-8b8225468a16", "metadata": {}, "source": [ "MADAS provides a convenient way of accessing the information stored in the `data` and `properties` attributes of a `Material`. As an example, we can find the reduced formula in the NOMAD archive. \n", "This information can be extracted from the `Material` object by specifying the path as follows:" ] }, { "cell_type": "code", "execution_count": 13, "id": "2c0d71a8-e2fa-43c5-a241-5fb312ca16df", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Ca'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "example_material.get_data_by_path('archive/run/0/system/0/chemical_composition_reduced')" ] }, { "cell_type": "markdown", "id": "e39a9789-9e02-459c-816d-1c8390a9731b", "metadata": {}, "source": [ "You can use a different path to extract any information from the `data` of a `Material`. Similarly, for `properties`, `Material.get_property_by_path()` can be used." ] }, { "cell_type": "markdown", "id": "f6d8e311-13e7-4ebc-83e9-f3e869acdc05", "metadata": {}, "source": [ "More information on how to work with the NOMAD API most efficiently can be found in the tutorial about [using the NOMAD API](https://madas.readthedocs.io/en/latest/tutorials/4_NOMAD_API_usage.html)." ] }, { "cell_type": "markdown", "id": "e5890d03-d069-4d40-b626-e8968b84b0e7", "metadata": {}, "source": [ "Now, running `get_calculations_by_search` will return a `list` of `Material` objects. To store these on our machine, we will make use of a database." ] }, { "cell_type": "markdown", "id": "77a99e66-0282-4e3d-95bb-74aa373d081b", "metadata": {}, "source": [ "## Store materials data in a local database" ] }, { "cell_type": "markdown", "id": "e47958b2-20dc-4542-9cf3-8b0eb3aff135", "metadata": {}, "source": [ "First, import the `MaterialsDatabase` class:" ] }, { "cell_type": "code", "execution_count": 14, "id": "0490f0e0-b27e-43b6-932b-088e7f3f3dd2", "metadata": {}, "outputs": [], "source": [ "from madas import MaterialsDatabase" ] }, { "cell_type": "markdown", "id": "2753a74b-aec0-43bb-bb61-84efa5fbdff7", "metadata": {}, "source": [ "and create a `MaterialsDatabase` object. Here we specify the `filepath`, which tells the database where to store the information on our local machine. Furthermore, we pass it the the `NOMAD_API` object. Note that the default API of the `MaterialsDatabase` is also the NOMAD API." ] }, { "cell_type": "code", "execution_count": 15, "id": "779dd2a3-d86c-4d37-89e0-fb1f3d64c947", "metadata": {}, "outputs": [], "source": [ "db = MaterialsDatabase(filename='materials_database.db', api = api, log_mode='silent')" ] }, { "cell_type": "markdown", "id": "87710cec-e6b9-4554-b80f-b8c7d411c78a", "metadata": {}, "source": [ "Initially, the database is emtpy:" ] }, { "cell_type": "code", "execution_count": 16, "id": "37a27c3d-d862-4619-83c8-7f02c3842a07", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "print(len(db))" ] }, { "cell_type": "markdown", "id": "dac670c2-e48f-4413-90fa-76639875d38b", "metadata": {}, "source": [ "Using the function `fill_database` will call the `get_calculations_by_search` function of the `NOMAD_API`. We therefore pass it the `query`, and it will automatically download all entries it can find with this query and store them in a local file. \n", "This may take some minutes based on your internet connection." ] }, { "cell_type": "code", "execution_count": 17, "id": "2a18a24e-393b-4e2e-aae1-64e4033a39f5", "metadata": { "scrolled": true }, "outputs": [], "source": [ "db.fill_database(query)" ] }, { "cell_type": "markdown", "id": "3819e553-1d04-45ed-a606-5aa47e49a117", "metadata": {}, "source": [ "The actual file handling is done using a `Backend` class, which can be any type of storage. \n", "For more information, see also the [Backend documentation page](https://madas.readthedocs.io/en/latest/modules/backend.html), and in the [tutorial for creating a custom Backend](https://madas.readthedocs.io/en/latest/tutorials/5_custom_Backend.html)." ] }, { "cell_type": "markdown", "id": "f675603c-e949-4ebb-971f-3dc1f2212946", "metadata": {}, "source": [ "During the processing of the query, the `MaterialsDatabase` writes some log entries. These can be very useful for debugging and for finding failing entries when large or long queries are processed. \n", "You can set where these messages are written (to the terminal and/or) to file) by using the `log_mode` attribute when crating the `MaterialsDatabase` object.\n", "You can inspect the log file by using the `MaterialsDatabase.log_file_path` attribute. " ] }, { "cell_type": "code", "execution_count": 18, "id": "1ccc5ba9-e63c-43f5-af73-6e76bde9776e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2026-04-09 18:32:34,716 - materials_database_log - INFO - Retrieving data...\n", "2026-04-09 18:32:40,698 - materials_database_api - INFO - Found 191 entries\n", "2026-04-09 18:32:40,698 - materials_database_api - INFO - Download data for 191 entries\n", "2026-04-09 18:33:03,804 - materials_database_api - INFO - Finished download.\n", "2026-04-09 18:33:03,805 - materials_database_log - INFO - Got data for 191 entries.\n", "\n", "...\n", "2026-04-09 18:33:12,349 - materials_database_api - INFO - Wrote material with id qo3iMLZM-TX3FXLMTOJoW4HCJojV.\n", "2026-04-09 18:33:12,381 - materials_database_api - INFO - Wrote material with id xyQyh8qKd5KUJx75KYtLup9sAvP6.\n", "2026-04-09 18:33:12,414 - materials_database_api - INFO - Wrote material with id AL_NDle5ybphhGeeterPG9tKxshp.\n", "2026-04-09 18:33:12,454 - materials_database_api - INFO - Wrote material with id V4sjmkEC0kBNBsSTpFvzMCHuaMsS.\n", "2026-04-09 18:33:12,488 - materials_database_api - INFO - Wrote material with id UUO7gDxGEe2jLENT_yxR1Ygy8c7A.\n", "\n" ] } ], "source": [ "with open(db.log_file_path, 'r') as f_: # open the log file for reading\n", " logfile=f_.readlines() # read the log files line by line\n", "\n", "print(''.join(logfile[:5])) # print the last 5 log entries\n", "print('...')\n", "print(''.join(logfile[-5:])) # print the last 5 log entries" ] }, { "cell_type": "markdown", "id": "ccd4f23f-1cee-4b65-9b11-1432998724ee", "metadata": {}, "source": [ "After downloading, the database contains all entries that were found:" ] }, { "cell_type": "code", "execution_count": 19, "id": "30836b38-bc0e-46ea-8491-d3a10f423164", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "191" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(db)" ] }, { "cell_type": "markdown", "id": "51ea45fd-09f0-4f78-9464-2d78175f533a", "metadata": {}, "source": [ "We can get every entry of the database in the order they have been added by using the index:" ] }, { "cell_type": "code", "execution_count": 20, "id": "34f9571f-7343-4e4e-a945-d3b81cc065c4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Material(mid = lYczghNfQInQhaVu7F4TcyaBFPkg, formula = Cd2In4O8, data = {'archive'}, properties = set())" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "db[0]" ] }, { "cell_type": "markdown", "id": "f4256743-cba8-4b4e-b760-677716c0c3a7", "metadata": {}, "source": [ "Or by using the `mid` of the `Material` object we want to recover." ] }, { "cell_type": "code", "execution_count": 21, "id": "f96fd7fc-c32c-4471-a4aa-dc411185eedc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Material(mid = lYczghNfQInQhaVu7F4TcyaBFPkg, formula = Cd2In4O8, data = {'archive'}, properties = set())" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "db[db[0].mid]" ] }, { "cell_type": "markdown", "id": "4096fbab-e921-4728-aea4-49d6c8a4e9bf", "metadata": {}, "source": [ "When we inspect these material in our database, we see they contain the full archive. However, we want to make the data easier accessible. To do so, we will see next how to manipulate data in the database." ] }, { "cell_type": "markdown", "id": "cf2bec8b-e7a5-4211-88ba-26f7ec2f0a6d", "metadata": {}, "source": [ "## Derive properties in the database" ] }, { "cell_type": "markdown", "id": "b0db5258-a553-4d9c-9975-1754e38a7c89", "metadata": {}, "source": [ "To access properties in the database, we can just iterate over its elements. Because this can take some time, especially for larger databases, we will use [tqdm](https://tqdm.github.io/) for showing progress bar. MADAS provides a wrapper for tqdm that automatically selects the correct layout of the progress bar, both in a notebook and the command line." ] }, { "cell_type": "code", "execution_count": 22, "id": "19e53b91-b72b-4c70-a007-a6c041bfe365", "metadata": {}, "outputs": [], "source": [ "from madas.utils import tqdm" ] }, { "cell_type": "markdown", "id": "62a6cf9d-e9aa-4f8a-8f28-6921052b3c8e", "metadata": {}, "source": [ "Then, we can access the information in each `Material`. As an example, we will compute the volume of the unit cell using the `ase.Atoms` objects. Note that this information is also contained in the `data` property, as NOMAD also computes the unit cell volume." ] }, { "cell_type": "code", "execution_count": 23, "id": "f4cfac12-69f5-429b-a3ba-9e25b8426364", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7fba42907b9d42979f5ef2deaac08d79", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/191 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.figure(figsize=(7,4))\n", "plt.hist(volumes, bins=50)\n", "plt.xlabel('Volume [ų]')\n", "plt.ylabel('Count')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "440cdb72-31e8-4d49-96c7-09af772be4d1", "metadata": {}, "source": [ "We can see a distribution of volumes with a peak around 100 ų and few entries with higher volumes." ] }, { "cell_type": "markdown", "id": "6735e0de-8dce-4dcb-8b90-b75ea03a8036", "metadata": {}, "source": [ "Let's find some more useful information. For this, we will explore what is contained in the NOMAD archives that we have downloaded. \n", "To do so, MADAS provides some usefull utilities:" ] }, { "cell_type": "code", "execution_count": 25, "id": "dbf7fb71-7bff-495e-80e5-ce71df1c79f4", "metadata": {}, "outputs": [], "source": [ "from madas.utils import print_key_paths, resolve_nested_dict" ] }, { "cell_type": "markdown", "id": "6ed154e5-7ee3-45ea-a0c2-a91b98fd73cd", "metadata": {}, "source": [ "The first function, `print_key_paths`, can be used to print all paths that a key in a nested dictionary has. This can help discovering the location of a specific information in the data. \n", "We pick a specific example for illustration purposes:" ] }, { "cell_type": "code", "execution_count": 26, "id": "69f10c34-9217-48bf-ac88-566f1860544e", "metadata": {}, "outputs": [], "source": [ "example_material = db[\"2KE2kVq3XhM1eU67AsxN890ohcop\"]" ] }, { "cell_type": "markdown", "id": "9fcdb77e-3cf2-476d-97d3-aeabe95b236f", "metadata": {}, "source": [ "Then, we search for the band gap in the data of the example material:" ] }, { "cell_type": "code", "execution_count": 27, "id": "987fa5dd-45c6-40c1-8ffd-d643367ac152", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/archive/run/0/calculation/0/band_gap\n", "/archive/run/0/calculation/0/dos_electronic/0/band_gap\n", "/archive/run/0/calculation/0/band_structure_electronic/0/band_gap\n", "/archive/results/properties/electronic/band_gap\n", "/archive/results/properties/electronic/dos_electronic_new/0/data/0/band_gap\n", "/archive/results/properties/electronic/band_structure_electronic/0/band_gap\n" ] } ], "source": [ "print_key_paths('band_gap', example_material.data)" ] }, { "cell_type": "markdown", "id": "bc55790f-0a2e-41c5-a70a-256c8bc5bb83", "metadata": {}, "source": [ "We see several paths: \n", "- The first three paths point to the _run_ section of the archive, which is where data that the NOMAD parsers extract from calculations is stored. \n", "- The second three paths point to the _results_ section, which is used to aggregate information for the NOMAD GUI. \n", "\n", "We can use that aggregated data. To do so, we first inspect its contents with `resolve_nested_dict`, which follows the specified path and returns the data at the end:" ] }, { "cell_type": "code", "execution_count": 28, "id": "9b157523-9567-47c7-be0d-4ad68609864e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'index': 0,\n", " 'value': 2.307134352960001e-19,\n", " 'energy_highest_occupied': -1.07345834478e-18,\n", " 'energy_lowest_unoccupied': -8.427449094839999e-19,\n", " 'provenance': {'label': 'dos',\n", " 'dos': '#/run/0/calculation/0/dos_electronic/0/total/0'}},\n", " {'index': 0,\n", " 'value': 2.3181573282019203e-19,\n", " 'type': 'direct',\n", " 'energy_highest_occupied': -1.0737309038646226e-18,\n", " 'energy_lowest_unoccupied': -8.419151710444306e-19,\n", " 'provenance': {'label': 'band_structure',\n", " 'band_structure': '#/run/0/calculation/0/band_structure_electronic/0/segment/0'}}]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resolve_nested_dict(example_material.data, 'archive/results/properties/electronic/band_gap')" ] }, { "cell_type": "markdown", "id": "58314a3b-6b0f-454b-9a62-5423819ef6d2", "metadata": {}, "source": [ "We can see that NOMAD stores the band gap value, the highest occupied, and the lowest unoccupied electronic state. Furthermore, there are two possible values of the gap: one is extracted from the band structure, one from the DOS. We choose the value from the DOS, because we also use the DOS in later tutorials. Thereby, we keep the data consistent.\n", "Finally, we notice that this data is provided in Joules, and we can transform it to a more accessible unit. \n", "First, we extract the gap data, a dictionary, from the list:" ] }, { "cell_type": "code", "execution_count": 29, "id": "e00f10d6-af2d-4f0c-841c-48ee30cc2c55", "metadata": {}, "outputs": [], "source": [ "gap_data = resolve_nested_dict(example_material.data, 'archive/results/properties/electronic/band_gap')" ] }, { "cell_type": "markdown", "id": "ae9061b6-506c-4aa0-a5c5-80ce2314486f", "metadata": {}, "source": [ "Then we compute the gap and transform the unit to eV:" ] }, { "cell_type": "code", "execution_count": 30, "id": "55014c03-9822-41cb-9661-8775b1b50c4b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.4400000000000006\n" ] } ], "source": [ "from scipy.constants import electron_volt\n", "\n", "gap = None\n", "for gap_info in gap_data:\n", " if gap_info['provenance']['label']=='dos':\n", " gap = gap_info['value']/ electron_volt\n", "print(gap)" ] }, { "cell_type": "markdown", "id": "7d502809-e980-4002-b1ef-15011bf6a9fb", "metadata": {}, "source": [ "We can write a small function to apply the same transformation to all entries:" ] }, { "cell_type": "code", "execution_count": 31, "id": "3a670017-daeb-4218-a704-e351f668b984", "metadata": {}, "outputs": [], "source": [ "def get_gap(material) -> float:\n", " gap_data = resolve_nested_dict(material.data, 'archive/results/properties/electronic/band_gap')\n", " gap = None\n", " for gap_info in gap_data:\n", " if gap_info['provenance']['label']=='dos':\n", " gap = gap_info['value']/ electron_volt\n", " if gap is None:\n", " raise ValueError('Could not find gap from DOS')\n", " return gap" ] }, { "cell_type": "markdown", "id": "cf50c929-b7f1-426d-a984-80f75d415a4f", "metadata": {}, "source": [ "And extract these values:" ] }, { "cell_type": "code", "execution_count": 32, "id": "98bb90d4-02f2-4dfd-916e-65ec3e9d2aa2", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4b7b88ffdb2b45fc929415c62e302c46", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/191 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7,4))\n", "plt.hist(band_gaps, bins=50)\n", "plt.xlabel('Band gap [eV]')\n", "plt.ylabel('Count')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "eb6fe75e-6f96-48e2-aa22-ae42c0925172", "metadata": {}, "source": [ "Here we see a large peak for small or no band gap, and a long flat distribution of band gaps up until 10 eV." ] }, { "cell_type": "markdown", "id": "d4fb2499-ad2f-4965-8299-eca8fd3ebfae", "metadata": {}, "source": [ "Now that we have extacted both volumes and band gaps, we can plot them together:" ] }, { "cell_type": "code", "execution_count": 34, "id": "e05f614a-4098-4a2f-9502-96e59f971594", "metadata": {}, "outputs": [ { "data": { "image/png": "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I1Lxdtcrn3EAiSqsOWGjRo2K6KAul0svvfSSjj322E41Cv8Rr/N7YK14qi7PZxxAogorhG3evFlz5sxR7969O9zXMAwtWbJEDQ0NXW4c4nN+D+whXu565TMOIFGFfXfk7bffruzs7LD2/dWvftXpBiEYVe3RFfFw1yufcQCJKqw5YZWVlTrmmGPCPmhFRYUGDRrU6UbhP+Jtfg8QKT7jABJVWCFs0KBB+uijj8I+aG5urpKTkzvdKASjqj2cjs84gETkMgwjrPu+k5KSNGbMGH33u9/VpEmTlJ6ebnbboqK2tlZut1ter1cZGRlWN6dLqCYOp+MzDiDeRZI7wg5hb731lpYtW6a//OUv8vl8+uY3v6nvfve7GjduXFQabRYnhTAAAGBvkeSOsOuEjRs3To8//riqqqr00EMPafv27TrvvPN04okn6t5771V1dXWXGw44QaPPUMm2fXpx826VbNtHkVEAQEhh94SFsnXrVi1btkxPPPGEqqurVVRUpJdeeima7esyesIQS6x/CACJzZThyLYcPHhQTz75pObNm6f9+/ersbGxK4eLOkIYYsW//mHLHyj/jCYmmAOA85kyHNnSm2++qRtvvFEej0e33367rrnmGr399tudPRwQ11j/EAAQqbCLtUrS559/ruXLl2v58uXaunWrzjrrLP3mN7/Rtddeq169epnVRsD2Iln/0O7FUwEAsRF2CLvkkkv0j3/8Q/369dO3v/1tfec739FJJ51kZtuAuMH6hwCASIUdwrp3766//OUvuvzyyynECrTA+ocAgEiFHcJa3vW4detWbdu2Teeee67S0tJkGIZcLooqIjGx/iEAIFIRT8zft2+fLrroIp144om69NJLVVVVJUmaPn265syZE/UGAvGA9Q8BAJGKOITNnj1b3bt3186dO9WzZ8/A9uuuu06rVq2KauOAeML6hwCASER0d6Qkvfbaa/r73/+ugQMHBm0fOnSoduzYEbWGAfGoqCBHE/I9rH8IAOhQxCHs4MGDQT1gfjU1NUpJSYlKo4B4lpzkogwFAKBDEQ9Hjhs3Tn/6058C37tcLvl8Pt1333264IILoto4AAAAp4q4J+y+++7TRRddpI0bN+rw4cO644479NFHH6mmpoaK+QDQgUafwXA1AEmdCGEFBQX65JNP9PDDDys9PV0HDhzQNddco5kzZyonh4nHANAWFngH0FyXF/C2OxbwBmAHLPAOJIaoL+D9wQcfyOfzhd2Ajz76SEePHg17fwBwMhZ4BxBKWCFs5MiR2rdvX9gHLSws1M6dOzvdKKdo9Bkq2bZPL27erZJt+/gFCySoSBZ4B5A4wpoTZhiG5s+fH7I0RSiHDx/uUqOcgLkfAPxY4B1AKGGFsHPPPVdbtmwJ+6CFhYVKS0vrdKPiXVtzP6q99bqluEyzxw/V4H69uDMKSBAs8A4glLBC2D//+U+Tm+Ec4cz9+PU/Pg1so3cMcD4WeAcQSsTFWtG+juZ+tFTtrdeM4jKtKq8ysVUArMQC7wBCIYRFWaRzOrgzCkgMLPAOoKWIi7WifZ2Z09H8zijWHASciwXeATRHCIuyjuZ+tIc7owDnY4F3AH4MR0ZZe3M/OmLGnVHUKgMAwJ461RO2ZcsWPfTQQ/rXv/4lSTrllFP0gx/8QCeddFJUGxev/HM/WtYJa4tZd0ZRqwwAAPuKuCfsueeeU0FBgTZt2qQRI0ZoxIgRKisrU0FBgZ577jkz2hiXigpytG7uhXr65jP1P5NO0+zxJ8ql2N0Z5a9V1jIEcjcmAAD2EPEC3kOGDNGUKVP085//PGj7ggULVFxcrG3btkW1gV1lpwW8Y9Uz1egzdM69a9vshfP3vK2beyETggEAiKJIckfEIaxnz5764IMPdMIJJwRt//TTTzVixAgdOnQo8habyE4hTGoKSGbfGVWybZ8mP7a+w/2evvlMJggDABBFkeSOiOeEnX/++XrrrbdahbB169Zp3LhxkR4u4cTizijWqQMAwP4iDmFXXHGF5s6dq02bNunMM8+UJK1fv17PPvusFi5cqJdeeiloX8Qe69QBAGB/EQ9HJiWFN5ff5XKpsbGxU42KJrsNR8aCf05YR+vUMScMAIDoiiR3RHx3pM/nC+vLDgEsUbFOHQAA9kexVodinToAAOytU8VaDx48qDfeeEM7d+7U4cOHgx774Q9/GJWGoetYpw4AAPuKOIS99957uvTSS3Xo0CEdPHhQmZmZ+vLLL9WzZ09lZ2cTwmyGdeoAALCniIcjZ8+erYkTJ+qrr75SWlqa1q9frx07dmj06NH65S9/aUYbAQAAHCfiELZ582bNmTNHSUlJSk5OVkNDg3Jzc3Xffffppz/9qRltBAAAcJyIQ1j37t0DZSqys7O1c+dOSZLb7dauXbui2zoAAACHinhO2MiRI7VhwwYNHTpU5513nu688059+eWXeuKJJ1RQUGBGGwEAABwn4p6we+65Rzk5TeUN7r77bvXt21czZszQF198od///vdRbyAAAIATRVwxP94kYsV8AABgDVMX8AbiSaPPoE4aAMCWOjUnzOVq/Z+Yy+VSamqqTjjhBN1444264IILotJAoLNWlVdp4coKVXnrA9ty3KlaMDGfFQMAAJaLeE5YUVGRPvvsM/Xq1UsXXHCBLrjgAvXu3Vvbtm3TmDFjVFVVpfHjx+vFF180o71AWFaVV2lGcVlQAJOkam+9ZhSXaVV5lUUtAwCgScQ9YV9++aXmzJmj+fPnB23/xS9+oR07dui1117TggULtGjRIl155ZVRaygQrkafoYUrKxRqsqOhpkXMF66s0IR8D0OTAADLRNwT9swzz2jy5Mmttk+aNEnPPPOMJGny5MnasmVL11sHdEJpZU2rHrDmDElV3nqVVtbErlEAALQQcQhLTU3VO++802r7O++8o9TUVEmSz+cL/BuItb11bQewzuwHAIAZIh6O/MEPfqBbbrlFmzZt0pgxYyRJGzZs0B/+8IfAskV///vfddppp0W1oUC4stPD+wMg3P0AADBDp+qEPfnkk3r44YcDQ44nnXSSfvCDH+j666+XJH399deBuyWtRp2wxNPoM3TOvWtV7a0POS/MJcnjTtW6uRcyJwwAEFWR5A6KtcKR/HdHSgoKYv7ItXTqKMpUAACiLpLcEfGcMCAeFBXkaOnUUfK4g3tjPe5UAhgAwBaomA/HKirI0YR8DxXzAQC2RAiDoyUnuVQ4JMvqZgAA0ArDkQAAABYghAEAAFggrOHI2267LewDPvDAA51uDAAAQKIIK4S99957Qd+XlZXp6NGjOumkkyRJn3zyiZKTkzV69OjotxAAAMCBwgphr7/+euDfDzzwgNLT0/XHP/5Rffv2lSR99dVXuummmzRu3DhzWgkAAOAwERdrPfbYY/Xaa69p2LBhQdvLy8v1jW98Q59//nlUG9hVFGsFAACxYmqx1traWn3xxRettn/xxReqq6uL9HAAAAAJKeIQdvXVV+umm27SX//6V/373//Wv//9bz333HOaPn26rrnmGjPaCAAA4DgRF2t95JFH9OMf/1jXX3+9jhw50nSQbt00ffp03X///VFvIAAAgBN1egHv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lqbx48fr008/DTpGTU2NpkyZooyMDPXp00fTp0/XgQMHYn0qMdfY2Kj58+crLy9PaWlpGjJkiBYtWhS09h3XL9ibb76piRMnasCAAXK5XHrhhReCHo/W9frggw80btw4paamKjc3V/fdd5/ZpxYT7V2/I0eOaO7cuRo+fLh69eqlAQMG6Nvf/rY+//zzoGM44voZiMiKFSuMHj16GI8//rjx0UcfGTfffLPRp08fY8+ePVY3zVIXX3yxsWzZMqO8vNzYvHmzcemllxrHHXecceDAgcA+t9xyi5Gbm2usWbPG2Lhxo3HmmWcaZ511VuDxo0ePGgUFBcb48eON9957z3jllVeMfv36GfPmzbPilCxTWlpqDB482Dj11FONH/3oR4HtXL+21dTUGIMGDTJuvPFG49133zU+++wz4+9//7uxdevWwD5Lliwx3G638cILLxjvv/++ccUVVxh5eXnG119/HdinqKjIGDFihLF+/XrjrbfeMk444QRj8uTJVpxSTN19991GVlaW8be//c2orKw0nn32WaN3797G//zP/wT24foFe+WVV4yf/exnxl//+ldDkvH8888HPR6N6+X1eo3+/fsbU6ZMMcrLy42nn37aSEtLMx599NFYnaZp2rt++/fvN8aPH2/8+c9/Nj7++GOjpKTEGDt2rDF69OigYzjh+hHCIjR27Fhj5syZge8bGxuNAQMGGIsXL7awVfazd+9eQ5LxxhtvGIbR9EPVvXt349lnnw3s869//cuQZJSUlBiG0fRDmZSUZFRXVwf2Wbp0qZGRkWE0NDTE9gQsUldXZwwdOtRYvXq1cd555wVCGNevfXPnzjXOOeecNh/3+XyGx+Mx7r///sC2/fv3GykpKcbTTz9tGIZhVFRUGJKMDRs2BPZ59dVXDZfLZezevdu8xtvAZZddZnznO98J2nbNNdcYU6ZMMQyD69eRliEiWtfrd7/7ndG3b9+gn9+5c+caJ510kslnFFuhQmxLpaWlhiRjx44dhmE45/oxHBmBw4cPa9OmTRo/fnxgW1JSksaPH6+SkhILW2Y/Xq9XkpSZmSlJ2rRpk44cORJ07U4++WQdd9xxgWtXUlKi4cOHq3///oF9Lr74YtXW1uqjjz6KYeutM3PmTF122WVB10ni+nXkpZde0umnn65vfetbys7O1siRI/XYY48FHq+srFR1dXXQ9XO73TrjjDOCrl+fPn10+umnB/YZP368kpKS9O6778buZCxw1llnac2aNfrkk08kSe+//77WrVunSy65RBLXL1LRul4lJSU699xz1aNHj8A+F198sbZs2aKvvvoqRmdjD16vVy6XS3369JHknOvn+AW8o+nLL79UY2Nj0H9yktS/f399/PHHFrXKfnw+n2bNmqWzzz5bBQUFkqTq6mr16NEj8APk179/f1VXVwf2CXVt/Y853YoVK1RWVqYNGza0eozr177PPvtMS5cu1W233aaf/vSn2rBhg374wx+qR48emjZtWuD8Q12f5tcvOzs76PFu3bopMzPT8dfvJz/5iWpra3XyyScrOTlZjY2NuvvuuzVlyhRJ4vpFKFrXq7q6Wnl5ea2O4X+sb9++prTfburr6zV37lxNnjw5sGC3U64fIQxRN3PmTJWXl2vdunVWNyVu7Nq1Sz/60Y+0evVqpaamWt2cuOPz+XT66afrnnvukSSNHDlS5eXleuSRRzRt2jSLW2d/zzzzjJ588kk99dRTGjZsmDZv3qxZs2ZpwIABXD9Y6siRI7r22mtlGIaWLl1qdXOijuHICPTr10/Jycmt7kjbs2ePPB6PRa2yl1tvvVV/+9vf9Prrr2vgwIGB7R6PR4cPH9b+/fuD9m9+7TweT8hr63/MyTZt2qS9e/dq1KhR6tatm7p166Y33nhDv/nNb9StWzf179+f69eOnJwc5efnB2075ZRTtHPnTkn/Of/2fnY9Ho/27t0b9PjRo0dVU1Pj+Ot3++236yc/+YkmTZqk4cOH64YbbtDs2bO1ePFiSVy/SEXreiXyz7T0nwC2Y8cOrV69OtALJjnn+hHCItCjRw+NHj1aa9asCWzz+Xxas2aNCgsLLWyZ9QzD0K233qrnn39ea9eubdUFPHr0aHXv3j3o2m3ZskU7d+4MXLvCwkJ9+OGHQT9Y/h+8lv/BOs1FF12kDz/8UJs3bw58nX766ZoyZUrg31y/tp199tmtSqJ88sknGjRokCQpLy9PHo8n6PrV1tbq3XffDbp++/fv16ZNmwL7rF27Vj6fT2eccUYMzsI6hw4dUlJS8H8HycnJ8vl8krh+kYrW9SosLNSbb76pI0eOBPZZvXq1TjrpJFsMpZnJH8A+/fRT/eMf/1BWVlbQ4465flbfGRBvVqxYYaSkpBjLly83KioqjO9973tGnz59gu5IS0QzZsww3G638c9//tOoqqoKfB06dCiwzy233GIcd9xxxtq1a42NGzcahYWFRmFhYeBxf4mFb3zjG8bmzZuNVatWGcccc0xClFgIpfndkYbB9WtPaWmp0a1bN+Puu+82Pv30U+PJJ580evbsaRQXFwf2WbJkidGnTx/jxRdfND744APjyiuvDFkyYOTIkca7775rrFu3zhg6dKhjSyw0N23aNOPYY48NlKj461//avTr18+44447Avtw/YLV1dUZ7733nvHee+8ZkowHHnjAeO+99wJ370Xjeu3fv9/o37+/ccMNNxjl5eXGihUrjJ49e9qqxEJntXf9Dh8+bFxxxRXGwIEDjc2bNwf9n9L8TkcnXD9CWCc89NBDxnHHHWf06NHDGDt2rLF+/Xqrm2Q5SSG/li1bFtjn66+/Nv77v//b6Nu3r9GzZ0/j6quvNqqqqoKOs337duOSSy4x0tLSjH79+hlz5swxjhw5EuOzsYeWIYzr176VK1caBQUFRkpKinHyyScbv//974Me9/l8xvz5843+/fsbKSkpxkUXXWRs2bIlaJ99+/YZkydPNnr37m1kZGQYN910k1FXVxfL07BEbW2t8aMf/cg47rjjjNTUVOP44483fvaznwX9h8f1C/b666+H/J03bdo0wzCid73ef/9945xzzjFSUlKMY4891liyZEmsTtFU7V2/ysrKNv9Pef311wPHcML1cxlGs5LIAAAAiAnmhAEAAFiAEAYAAGABQhgAAIAFCGEAAAAWIIQBAABYgBAGAABgAUIYAFhgy5YtGjNmjPLy8vTiiy9a3RwAFqBOGABY4LrrrtPYsWN16qmnavr06YF1LgEkDnrCAMS1wYMH68EHH7S6GSENHjxYLpdLLper1eLrbrdbgwYN0gknnKDs7Oywjrd9+/bA8U477bToNxhATBHCAFhi4sSJKioqCvnYW2+9JZfLpQ8++CDGrYq+n//856qqqpLb7W61/brrrtMJJ5ygefPmBT22a9cuTZ48WUVFRZowYYLeeustSVJubq6qqqo0Z86cmLUfgHkIYQAsMX36dK1evVr//ve/Wz22bNkynX766Tr11FMtaFl0paeny+PxyOVyBW1/9913NXDgQE2aNEnvvPNO0GO5ubmaPXu2vv76a5WUlOi1116TJCUnJ8vj8ah3794xaz8A8xDCAFji8ssv1zHHHKPly5cHbT9w4ICeffZZTZ8+XZL03HPPadiwYUpJSdHgwYP1q1/9qs1j+ofrNm/eHNi2f/9+uVwu/fOf/5Qk/fOf/5TL5dLf//53jRw5Umlpabrwwgu1d+9evfrqqzrllFOUkZGh66+/XocOHQocx+fzafHixcrLy1NaWppGjBihv/zlL50+/2XLlun666/XDTfcoOLiYh09ejTo8bFjx+qNN97Q7373O11xxRWdfh0A9kUIA2CJbt266dvf/raWL1+u5vcHPfvss2psbNTkyZO1adMmXXvttZo0aZI+/PBD3XXXXZo/f36r4NYZd911lx5++GG988472rVrl6699lo9+OCDeuqpp/Tyyy/rtdde00MPPRTYf/HixfrTn/6kRx55RB999JFmz56tqVOn6o033oj4tffu3atXXnlFU6dO1YQJE+RyufTyyy8HHq+vrw/699133921kwVgS92sbgCAxPWd73xH999/v9544w2df/75kpp6iL75zW/K7XbrgQce0EUXXaT58+dLkk488URVVFTo/vvv14033til1/7FL36hs88+W1LT0Oi8efO0bds2HX/88ZKk//qv/9Lrr7+uuXPnqqGhQffcc4/+8Y9/qLCwUJJ0/PHHa926dXr00Ud13nnnRfTaxcXFGjZsmIYNGyZJmjRpkpYvX64rr7xSkrRq1Srdd999SkpK0oEDB2x74wGAriGEAbDMySefrLPOOkuPP/64zj//fG3dulVvvfWWfv7zn0uS/vWvfwWCid/ZZ5+tBx98UI2NjUpOTu70azefb9a/f3/17NkzEMD820pLSyVJW7du1aFDhzRhwoSgYxw+fFgjR46M+LWXLVsWFCKnTp2qs846S1988YWOOeYYXXXVVbrqqqsiPi6A+MJwJABLTZ8+Xc8995zq6uq0bNkyDRkyJOKeJb+kpKZfac2HN48cORJy3+7duwf+7XK5gr73b/P5fJKa5qlJ0ssvv6zNmzcHvioqKiKeF7Zx40aVl5frjjvuULdu3dStWzedeeaZOnLkiIqLiyM6FoD4RggDYKlrr71WSUlJeuqpp/SnP/1J3/nOdwJ3Ep5yyil6++23g/Z/++23deKJJ4bsBTvmmGMkSVVVVYFtzSfpd1Z+fr5SUlK0c+dOnXDCCUFfubm5ER1r2bJlOvfcc/X+++8HBbo77rgjKnPdAMQPhiMBWKp379667rrrNG/ePNXW1gYN082ZM0djxozRokWLdN1116mkpEQPP/ywfve734U8Vlpams4880wtWbJEeXl52rt3r/7f//t/XW5jenq6fvzjH2v27Nny+Xw655xz5PV69fbbbysjI0PTpk0L6zgNDQ16+umndc8996igoCDose9+97u67777VFZWplGjRnW5zQDsj54wAJabPn26vvrqK1188cUaMGBAYPuoUaP0zDPPaMWKFSooKNCdd96pn//85+1Oyn/88cd19OhRjR49WrNmzdIvfvGLqLRx0aJFmj9/vhYvXqxTTjlFRUVFevnll5WXlxf2MV544QV5vV5dffXVrR4bOnSohg8frmXLlkWlvQDsj7UjAcAkgwcP1qxZszRr1qyoHveuu+7SCy+8EJWhVgDWIYQBgEkGDx6sqqoqde/eXbt37261dFGkdu7cqfz8fB0+fFj5+fmEMCDOEcIAwCQ7duwI3J15/PHHB+7e7KyjR49q+/btkqSUlJSIbwoAYC+EMAAAAAswMR8AAMAChDAAAAALEMIAAAAsQAgDAACwACEMAADAAoQwAAAACxDCAAAALEAIAwAAsAAhDAAAwAL/H8tvbvPoJrpUAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7,7))\n", "plt.scatter(volumes, band_gaps)\n", "plt.xlabel('Volume [ų]')\n", "plt.ylabel('Band gap [eV]')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "a12faf25-b995-466c-8750-1f47e3b8f326", "metadata": {}, "source": [ "There seems to be not very much correlation between those quantities." ] }, { "cell_type": "markdown", "id": "657a8a85-fcc0-47e0-9fec-5c72dc197270", "metadata": {}, "source": [ "We can derive many useful qantities from the data in our database. But, in some cases, the generation of these quantites may take long, or we want to first create the quantity and then process it further later on, without having to bring the necessary code. For these cases, it is possible to update the data in the database using functions. Here, we will add these two quantites to our database. At the moment, the entries only contain the data we downloaded:" ] }, { "cell_type": "code", "execution_count": 35, "id": "5a68121b-4fb5-49a2-a10e-e29237ca6096", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Material(mid = lYczghNfQInQhaVu7F4TcyaBFPkg, formula = Cd2In4O8, data = {'archive'}, properties = set())\n" ] } ], "source": [ "print(db[0])" ] }, { "cell_type": "markdown", "id": "78298e24-1baf-4481-8c0f-c21f3f1d8b7f", "metadata": {}, "source": [ "We can use the function `update_derived_properties` of the database to update our entries. It takes a list of property names and a list of functions that are used to derive these properties as inputs." ] }, { "cell_type": "code", "execution_count": 36, "id": "eaaa561c-84fa-45b4-b9b0-d70830cef7f9", "metadata": {}, "outputs": [], "source": [ "db.update_derived_properties(\n", " [\n", " 'band_gap', \n", " 'volume'\n", " ],\n", " [\n", " get_gap, # we defined this function above\n", " lambda entry: entry.atoms.get_volume() # this is a lambda expression\n", " ]\n", ")" ] }, { "cell_type": "markdown", "id": "58130c36-a4de-453c-a915-30844163b244", "metadata": {}, "source": [ "For the band gaps, we use the existing function, for the volume (because it requires very little instructions), we can use a Python lambda expression, i.e., an unnamed function that is defined only where it is executed.\n", "\n", "Now, the `properties` of our entries have been updated:" ] }, { "cell_type": "code", "execution_count": 37, "id": "18e9dded-020a-4c30-90ea-d1a3ffbb6096", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Material(mid = lYczghNfQInQhaVu7F4TcyaBFPkg, formula = Cd2In4O8, data = {'archive'}, properties = {'volume', 'band_gap'})" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "db[0]" ] }, { "cell_type": "markdown", "id": "1b73e939-ee58-441f-9103-4e0c900adb33", "metadata": {}, "source": [ "For many applications, the data should be available as lists, arrays, or [Pandas](https://pandas.pydata.org/) dataframes. We can extract these from a MADAS `MaterialsDatabase`." ] }, { "cell_type": "markdown", "id": "b3ec8c5e-13b5-456a-b9e3-c42378371f06", "metadata": {}, "source": [ "## Retrieve properties" ] }, { "cell_type": "markdown", "id": "a3e6e6c5-3ec0-441e-ad95-338732bd84ad", "metadata": {}, "source": [ "Properties can be retrieved by name:" ] }, { "cell_type": "code", "execution_count": 38, "id": "8f1b52d4-000b-4ca0-adf3-f0356ba920df", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4b524b52f025404e879000d14e7d1ca4", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/191 [00:00\n" ] } ], "source": [ "print(type(df))" ] }, { "cell_type": "code", "execution_count": 41, "id": "dee6a456-8e04-4df1-812d-74eeea4a79fe", "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", "
volumeband_gap
count191.000000191.000000
mean217.4148111.255602
std246.4288082.051329
min7.7099440.000000
25%64.0017450.000000
50%114.7833900.000000
75%269.2206322.195000
max1240.4772689.540000
\n", "
" ], "text/plain": [ " volume band_gap\n", "count 191.000000 191.000000\n", "mean 217.414811 1.255602\n", "std 246.428808 2.051329\n", "min 7.709944 0.000000\n", "25% 64.001745 0.000000\n", "50% 114.783390 0.000000\n", "75% 269.220632 2.195000\n", "max 1240.477268 9.540000" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "markdown", "id": "b21fc7b4-3a21-4506-bc23-2215ed7c30fb", "metadata": {}, "source": [ "We can also pass a property or data path to the function to obtain the property directly:" ] }, { "cell_type": "code", "execution_count": 42, "id": "9439e728-c099-4035-b43c-243e95a77b97", "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", "
volumeband_gaparchive/results/material/chemical_formula_reduced
lYczghNfQInQhaVu7F4TcyaBFPkg195.5324562.41CdIn2O4
rZF4gjJ48EGz2BBJuuCLJFzkPWVD53.7893431.62Cu3N
Og3YctYdzQznelLm078NKakyvkNO44.0700030.0CeS
luGPZXx92gJIG_ZdF-kw7bY00knV178.9107461.61Cs3Sb
J5MoOxPpWnOl42x2aQJ2Qn_TBVeX92.1216420.0Ca2H6Ir
............
qo3iMLZM-TX3FXLMTOJoW4HCJojV95.3219926.86BaCl2
xyQyh8qKd5KUJx75KYtLup9sAvP6263.5347440.0Be13Ca
AL_NDle5ybphhGeeterPG9tKxshp29.8000450.0CeO
V4sjmkEC0kBNBsSTpFvzMCHuaMsS87.9855490.0Cd3In
UUO7gDxGEe2jLENT_yxR1Ygy8c7A77.8883960.0Ca2Ir
\n", "

191 rows × 3 columns

\n", "
" ], "text/plain": [ " volume band_gap \\\n", "lYczghNfQInQhaVu7F4TcyaBFPkg 195.532456 2.41 \n", "rZF4gjJ48EGz2BBJuuCLJFzkPWVD 53.789343 1.62 \n", "Og3YctYdzQznelLm078NKakyvkNO 44.070003 0.0 \n", "luGPZXx92gJIG_ZdF-kw7bY00knV 178.910746 1.61 \n", "J5MoOxPpWnOl42x2aQJ2Qn_TBVeX 92.121642 0.0 \n", "... ... ... \n", "qo3iMLZM-TX3FXLMTOJoW4HCJojV 95.321992 6.86 \n", "xyQyh8qKd5KUJx75KYtLup9sAvP6 263.534744 0.0 \n", "AL_NDle5ybphhGeeterPG9tKxshp 29.800045 0.0 \n", "V4sjmkEC0kBNBsSTpFvzMCHuaMsS 87.985549 0.0 \n", "UUO7gDxGEe2jLENT_yxR1Ygy8c7A 77.888396 0.0 \n", "\n", " archive/results/material/chemical_formula_reduced \n", "lYczghNfQInQhaVu7F4TcyaBFPkg CdIn2O4 \n", "rZF4gjJ48EGz2BBJuuCLJFzkPWVD Cu3N \n", "Og3YctYdzQznelLm078NKakyvkNO CeS \n", "luGPZXx92gJIG_ZdF-kw7bY00knV Cs3Sb \n", "J5MoOxPpWnOl42x2aQJ2Qn_TBVeX Ca2H6Ir \n", "... ... \n", "qo3iMLZM-TX3FXLMTOJoW4HCJojV BaCl2 \n", "xyQyh8qKd5KUJx75KYtLup9sAvP6 Be13Ca \n", "AL_NDle5ybphhGeeterPG9tKxshp CeO \n", "V4sjmkEC0kBNBsSTpFvzMCHuaMsS Cd3In \n", "UUO7gDxGEe2jLENT_yxR1Ygy8c7A Ca2Ir \n", "\n", "[191 rows x 3 columns]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "db.get_property_dataframe(['volume', 'band_gap', 'archive/results/material/chemical_formula_reduced'])" ] }, { "cell_type": "markdown", "id": "f670b4cf-2118-4dc2-838a-a1b30790151f", "metadata": {}, "source": [ "## References\n", "\n", "**[1]** Akhil S. Nair, Lucas Foppa, and Matthias Scheffler \n", "_Materials Database from All-electron Hybrid Functional DFT Calculations_. \n", "_Sci Data_ *12*, 1518 (2025). https://doi.org/10.1038/s41597-025-05867-z" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.8" } }, "nbformat": 4, "nbformat_minor": 5 }