├── .build.sh ├── .docker_build.sh ├── .github └── CODEOWNERS ├── .gitignore ├── LICENSE ├── README.md ├── notebooks ├── demonstration-pymatgen-for-optimade-queries.ipynb ├── exercise7-oqmd-optimade-tutorial.ipynb ├── exercise8-optimade-python-tools.ipynb ├── exercises.ipynb └── oqmd_exercise_data │ ├── features_processed_final.csv │ ├── raw_dataset_saved.json │ └── target_properties.csv └── requirements.txt /.build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | pandoc notebooks/exercises.ipynb -t gfm -o README.md 3 | -------------------------------------------------------------------------------- /.docker_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # The README can be synced with the notebooks with the following docker invocation 4 | docker run --rm --volume "`pwd`:/data" --entrypoint "/data/.build.sh" pandoc/core 5 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @ml-evs 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Open Databases Integration for Materials Design 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # OPTIMADE Tutorial Exercises 4 | 5 | [![Open In 6 | Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercises.ipynb) 7 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fexercises.ipynb) 8 | [![GitHub 9 | license](https://img.shields.io/github/license/Materials-Consortia/optimade-tutorial-exercises?logo=GitHub)](https://github.com/Materials-Consortia/optimade-tutorial-exercises) 10 | 11 |
12 | 13 |
14 | 15 | ## Preface 16 | 17 | This repository hosts general tutorials on the OPTIMADE specification 18 | and particular database implementations of the API. These open-ended 19 | exercises were initially provided to accompany the following workshops: 20 | 21 | - NOMAD CoE [Tutorial 6: 22 | OPTIMADE](https://th.fhi-berlin.mpg.de/meetings/nomad-tutorials/index.php?n=Meeting.Tutorial6), 23 | 7-8 September 2021 24 | - ICTP-EAIFR [Training School: Working with Materials Databases and 25 | OPTIMADE](https://eaifr.ictp.it/about/news/ml-for-es-and-md/), 26 | November-December 2021. 27 | - CECAM Flagship Workshop [Open Databases Integration for Materials 28 | Design](https://www.cecam.org/workshop-details/1120), May 30, 2022 - 29 | June 3, 2022. 30 | - [Actively Learning Materials 31 | Science](https://sites.utu.fi/al4ms2023/), Aalto University, February 32 | 27, 2023 - March 3, 2023. 33 | 34 | This document is hosted on 35 | [GitHub](https://github.com/Materials-Consortia/optimade-tutorial-exercises), 36 | and all feedback or suggestions for new exercises can be provided as an 37 | issue or pull request in that repository. 38 | 39 | If you would like to get involved with the OPTIMADE consortium, you can 40 | find some more details on the [OPTIMADE home 41 | page](https://optimade.org/#get-involved). 42 | 43 | ### Contributors 44 | 45 | - [Matthew Evans](https://ml-evs.science), *UCLouvain* (repository and 46 | general exercises) 47 | - [Matthew Horton](https://github.com/mkhorton), *LBNL* (`pymatgen` 48 | exercise) 49 | - [Evgeny Blokhin](https://tilde.pro), *Tilde Materials Informatics* 50 | (typos and bug fixes) 51 | - [Cormac Toher](https://github.com/ctoher), *Duke University* (AFLOW 52 | exercise) 53 | - [Abhijith Gopakumar](https://github.com/tachyontraveler), 54 | *Northwestern U.* (OQMD exercise) 55 | - [Johan Bergsma](https://github.com/JPBergsma), *CECAM* (typos, testing 56 | and feedback) 57 | 58 |
59 | 60 |
61 | 62 | ## Introduction 63 | 64 |
65 | 66 |
67 | 68 | The OPTIMADE specification defines a web-based JSON API that is 69 | implemented by many [different materials 70 | databases](https://www.optimade.org/providers-dashboard) to allow users 71 | to query the underlying data with the same syntax and response format. 72 | There are several tools that can access these APIs, for example, any web 73 | browser, any programming language that can make HTTP requests, or common 74 | command-line tools such as `curl` or `wget`. 75 | 76 | There are also specialist tools, developed by members of the OPTIMADE 77 | community. You may have heard about three such tools in other tutorials 78 | and talks: 79 | 80 | 1. [The Materials Cloud web-based OPTIMADE 81 | client](https://materialscloud.org/optimadeclient/). 82 | 2. [The optimade.science web-based 83 | aggregator](https://optimade.science). 84 | 3. [`pymatgen`'s built-in OPTIMADE 85 | client](https://pymatgen.org/pymatgen.ext.html#pymatgenextoptimade-module). 86 | 4. [`optimade-python-tools`'s 87 | `OptimadeClient`](https://www.optimade.org/optimade-python-tools/latest/getting_started/client/) 88 | 89 | Some of these clients can send requests to multiple OPTIMADE providers 90 | *simultaneously*, based on programmatic [providers 91 | list](https://providers.optimade.org/). You can explore this list at the 92 | human-readable [providers 93 | dashboard](https://www.optimade.org/providers-dashboard/), where you can 94 | see the current OPTIMADE structure count exceeds 26 million! 95 | 96 | You may wish to familiarise yourselves with the OPTIMADE API by writing 97 | your own queries, scripts or code. Some possible options: 98 | 99 | - Craft (or copy) your own URL queries to a particular OPTIMADE 100 | implementation. Some web browsers (e.g., Firefox) will automatically 101 | format the JSON response for you (see Exercise 1). 102 | - Use command-line tools such as [`curl`](https://curl.se/) or 103 | [`wget`](https://www.gnu.org/software/wget/) to receive data in your 104 | terminal, or pipe it to a file. You could use the tool 105 | [`jq`](https://stedolan.github.io/jq/) to format the JSON response. 106 | - Make an appropriate HTTP request from your programming language of 107 | choice. For Python, you could use the standard library 108 | [urllib.request](https://docs.python.org/3/library/urllib.request.html) 109 | or the more ergonomic external libraries 110 | [requests](https://docs.python-requests.org/en/latest/index.html) and 111 | [httpx](https://www.python-httpx.org). Some example code for Python is 112 | provided below the exercises. In Javascript, you can just use 113 | `fetch(...)` or a more advanced OPTIMADE client such as that provided 114 | by Tilde Informatics' 115 | [optimade-client](https://github.com/tilde-lab/optimade-client). 116 | 117 | If you are following these tutorials as part of a school or workshop, 118 | please do not hesitate to ask about how to get started with any of the 119 | above tools! 120 | 121 |
122 | 123 |
124 | 125 | ## Exercise 1 126 | 127 |
128 | 129 |
130 | 131 | This aim of this exercise is to familiarise yourself with the OPTIMADE 132 | JSON API. In the recent OPTIMADE paper \[[1](#ref1)\], we provided the 133 | number of results to a set of queries across all OPTIMADE 134 | implementations, obtained by applying the same filter to the structures 135 | endpoint of each database. The filters are: 136 | 137 | - Query for structures containing a group IV element: 138 | `elements HAS ANY "C", "Si", "Ge", "Sn", "Pb"`. 139 | 140 | - As above, but return only binary phases: 141 | `elements HAS ANY "C", "Si", "Ge", "Sn", "Pb" AND nelements=2`. 142 | 143 | - This time, exclude lead and return ternary phases: 144 | `elements HAS ANY "C", "Si", "Ge", "Sn" AND NOT elements HAS "Pb" AND elements LENGTH 3`. 145 | 146 | - In your browser, try visiting the links in Table 1 of the OPTIMADE 147 | paper \[[1](#ref1)\] (clickable links in arXiv version 148 | \[[2](#ref2)\]), which is reproduced below. 149 | 150 | - Familiarise yourself with the standard JSON:API output fields 151 | (`data`, `meta` and `links`). 152 | - You will find the crystal structures returned for the query as a 153 | list under the `data` key, with the OPTIMADE-defined fields listed 154 | under the `attributes` of each list entry. 155 | - The `meta` field provides useful information about your query, e.g. 156 | `data_returned` shows how many results there are in total, not just 157 | in the current page of the response (you can check if the table 158 | still contains the correct number of entries, or if it is now out of 159 | date). 160 | - The `links` field provides links to the next or previous pages of 161 | your response, in case you requested more structures than the 162 | `page_limit` for that implementation. 163 | 164 | - Choose one particular entry to focus on: replace the `filter` URL 165 | parameter with `/` for the `id` of one particular 166 | structure (e.g. 167 | `https://example.org/optimade/v1/structures/`). 168 | 169 | - Explore other endpoints provided by each of these providers. If they 170 | serve "extra" fields (i.e. those containing the provider prefix), try 171 | to find out what these fields mean by querying the `/info/structures` 172 | endpoint. 173 | 174 | - Try performing the same queries with some of the tools listed above, 175 | or in scripts of your own design. 176 | 177 |
178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 |
ProviderN1N2N3
AFLOW 700,192 62,293382,554
Crystallography Open Database (COD)416,314 3,896 32,420
Theoretical Crystallography Open Database (TCOD) 2,631 296 660
Materials Cloud 886,518 801,382 103,075
Materials Project 27,309 3,545 10,501
Novel Materials Discovery Laboratory (NOMAD) 3,359,594 532,123 1,611,302
Open Database of Xtals (odbx) 55 54 0
Open Materials Database (omdb) 58,718 690 7,428
Open Quantum Materials Database (OQMD) 153,113 11,011 70,252
240 |
241 | 242 | \[1\] Andersen *et al.*, "OPTIMADE, an API for 243 | exchanging materials data", *Sci Data* **8**, 217 (2021) 244 | [10.1038/s41597-021-00974-z](https://doi.org/10.1038/s41597-021-00974-z). 245 | 246 | \[2\] Andersen *et al.*, "OPTIMADE, an API for 247 | exchanging materials data" (2021) 248 | [arXiv:2103.02068](https://arxiv.org/abs/2103.02068). 249 | 250 |
251 | 252 |
253 | 254 | ## Exercise 2 255 | 256 |
257 | 258 |
259 | 260 | The filters from Exercise 1 screened for group IV containing compounds, 261 | further refining the query to exclude lead, and finally to include only 262 | ternary phases. 263 | 264 | - Choose a suitable database and modfiy the filters from Exercise 1 to 265 | search for binary \[III\]-\[V\] semiconductors. 266 | - A "suitable" database here is one that you think will have good 267 | coverage across this chemical space. 268 | - Using the `chemical_formula_anonymous` field, investigate the most 269 | common stoichiometric ratios between the constituent elements, e.g. 270 | 1:1, 2:1, etc. 271 | - You may need to follow pagination links (`links->next` in the 272 | response) to access all available data for your query, or you can 273 | try adding the `page_limit=100` URL parameter to request more 274 | structures per response. 275 | - Apply the same filter to another database and assess the similarity 276 | between the results, thinking carefully about how the different 277 | focuses of each database and different methods in their 278 | construction/curation could lead to biases in this outcome. 279 | - For example, an experimental database may have one crystal structure 280 | entry per experimental sample studied, in which case the most useful 281 | (or "fashionable") compositions will return many more entries, 282 | especially when compared to a database that curates crystal 283 | structures such that each ideal crystal has one canonical entry 284 | (e.g., a database of minerals). 285 | - Try to use the query you have constructed in the multi-provider 286 | clients (linked above), to query all OPTIMADE providers 287 | simultaneously. 288 | 289 |
290 | 291 |
292 | 293 | ## Exercise 3 (pymatgen) 294 | 295 |
296 | 297 |
298 | 299 | This interactive exercise will explore the use of the OPTIMADE client 300 | implemented in the `pymatgen` Python library. This exercise can be found 301 | in this repository under `./notebooks/demonstration-pymatgen.ipynb` or 302 | accessed online in [Google 303 | Colab](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/demonstration-pymatgen-for-optimade-queries.ipynb) 304 | (or equivalent notebook runners, such as 305 | [Binder](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fdemonstration-pymatgen-for-optimade-queries.ipynb)). 306 | 307 | [![Open In 308 | Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/demonstration-pymatgen-for-optimade-queries.ipynb) 309 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fdemonstration-pymatgen-for-optimade-queries.ipynb) 310 | 311 |
312 | 313 |
314 | 315 | ## Exercise 4 316 | 317 |
318 | 319 |
320 | 321 | There are many useful properties that the OPTIMADE specification has not 322 | standardized. This is typically because the use of the property requires 323 | additional context, e.g., reporting a "band gap" without describing how 324 | it was calculated or measured, or properties that are only meaningful in 325 | the context of a database, e.g., relative energies that depend on other 326 | reference calculations. For this reason, the OPTIMADE specification 327 | allows implementations to serve their own fields with an appropriate 328 | "provider prefix" to the field name, and a description at the 329 | `/info/structures` endpoint. 330 | 331 | One computed property that is key to many high-throughput studies is the 332 | *chemical stability* ($\delta$) of a crystal structure, i.e. whether the 333 | structure is predicted to spontaneously decompose into a different phase 334 | (or phases). This is typically computed as the distance from the convex 335 | hull in composition-energy space, with a value of 0 (or \<0, if the 336 | target structure was not used to compute the hull itself) indicating a 337 | stable structure. 338 | 339 | - Interrogate the `/info/structures` endpoints of the OPTIMADE 340 | implementations that serve DFT data (e.g., Materials Project, AFLOW, 341 | OQMD, etc.) and identify those that serve a field that could 342 | correspond to hull distance, or other stability metrics. 343 | - Construct a filter that allows you to screen a database for metastable 344 | materials (i.e., $0 < \delta < 25\text{ meV/atom}$) according to this 345 | metric. 346 | - Try to create a filter that can be applied to multiple databases 347 | simultaneously (e.g., apply 348 | `?filter=_databaseA_hull_distance < 25 OR _databaseB_stability < 25`). 349 | What happens when you run this filter against a database that does not 350 | contain the field? 351 | 352 |
353 | 354 |
355 | 356 | ## Exercise 5 357 | 358 |
359 | 360 |
361 | 362 | As a final general exercise, consider your own research problems and how 363 | you might use OPTIMADE. If you have any suggestions or feedback about 364 | how OPTIMADE can be made more useful for you, please start a discussion 365 | on the [OPTIMADE MatSci forum](https://matsci.org/c/optimade/29) or 366 | raise an issue at the appropriate [Materials-Consortia 367 | GitHub](https://github.com/Materials-Consortia/) repository. 368 | 369 | Some potential prompts: 370 | 371 | - What additional fields or entry types should OPTIMADE standardize to 372 | be most useful to you? 373 | - How could the existing tools be improved, or what new tools could be 374 | created to make OPTIMADE easier to use? 375 | - What features from other APIs/databases that you use could be adopted 376 | within OPTIMADE? 377 | 378 |
379 | 380 |
381 | 382 | ## Exercise 6 (AFLOW) 383 | 384 |
385 | 386 |
387 | 388 | The AFLOW database is primarily built by decorating crystallographic 389 | prototypes, and a list of the most common prototypes can be found in the 390 | [Library of Crystallographic 391 | Prototypes](https://aflow.org/prototype-encyclopedia/). The prototype 392 | labels can also be used to search the database for entries with relaxed 393 | structures matching a particular prototype, using the AFLOW keyword 394 | `aflow_prototype_label_relax`; a full list of AFLOW keywords can be 395 | found at AFLOW's `/info/structures` endpoint 396 | (). Searches can be 397 | performed for prototype labels using OPTIMADE by appending the `_aflow_` 398 | prefix to the keyword: `_aflow_aflow_prototype_label_relax`. 399 | 400 | - Use OPTIMADE to search AFLOW for NaCl in the rock salt structure 401 | (prototype label `AB_cF8_225_a_b`) 402 | - Use OPTIMADE to search AFLOW for lead-free halide cubic perovskites 403 | with a band gap greater than 3 eV: (cubic perovskite prototype label 404 | is `AB3C_cP5_221_a_c_b`) 405 | 406 |
407 | 408 |
409 | 410 | ## Exercise 7 (OQMD) 411 | 412 |
413 | 414 |
415 | 416 | This interactive exercise explores the OQMD's OPTIMADE API, and 417 | demonstrates how you can train machine learning models on OPTIMADE data. 418 | The notebook is available at 419 | `./notebooks/exercise7-oqmd-optimade-tutorial` and can also be accessed 420 | online with 421 | [Colab](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise7-oqmd-optimade-tutorial.ipynb) 422 | or 423 | [Binder](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks/exercise7-oqmd-optimade-tutorial.ipynb) 424 | (buttons below). 425 | 426 | [![Open In 427 | Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise7-oqmd-optimade-tutorial.ipynb) 428 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks/exercise7-oqmd-optimade-tutorial.ipynb) 429 | 430 |
431 | 432 |
433 | 434 | ## Exercise 8 (optimade-python-tools) 435 | 436 | This example explores the use of optimade-python-tools for querying and 437 | serving OPTIMADE data. The notebook is available at 438 | `./notebooks/exercise8-optimade-python-tools` and can be accessed online 439 | with Colab or Biner (buttons below). 440 | 441 | [![Open In 442 | Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise8-optimade-python-tools.ipynb) 443 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks/exercise8-optimade-python-tools.ipynb) 444 | 445 |
446 | 447 |
448 | 449 | # Appendix 450 | 451 | ## Example Python code 452 | 453 | You may find the following Python code snippets useful in the above 454 | exercises. This document can be opened as a Jupyter notebook using the 455 | Colab or Binder buttons above, or by downloading the notebook from the 456 | GitHub repository. 457 | 458 |
459 | 460 |
461 | 462 | ``` python 463 | # Construct a query URL. 464 | # 465 | # You should be able to use any valid OPTIMADE implementation's 466 | # database URL with any valid query 467 | # 468 | # Lets choose a random provider for now: 469 | import random 470 | some_optimade_base_urls = [ 471 | "https://optimade.materialsproject.org", 472 | "http://crystallography.net/cod/optimade", 473 | "https://nomad-lab.eu/prod/rae/optimade/" 474 | ] 475 | database_url = random.choice(some_optimade_base_urls) 476 | 477 | query = 'elements HAS ANY "C", "Si", "Ge", "Sn", "Pb"' 478 | params = { 479 | "filter": query, 480 | "page_limit": 3 481 | } 482 | 483 | query_url = f"{database_url}/v1/structures" 484 | ``` 485 | 486 |
487 | 488 |
489 | 490 | ``` python 491 | # Using the third-party requests library: 492 | !pip install requests 493 | ``` 494 | 495 |
496 | 497 |
498 | 499 | ``` python 500 | # Import the requests library and make the query 501 | import requests 502 | response = requests.get(query_url, params=params) 503 | print(response) 504 | json_response = response.json() 505 | ``` 506 | 507 |
508 | 509 |
510 | 511 | ``` python 512 | # Explore the first page of results 513 | import pprint 514 | print(json_response.keys()) 515 | structures = json_response["data"] 516 | meta = json_response["meta"] 517 | 518 | print(f"Query {query_url} returned {meta['data_returned']} structures") 519 | 520 | print("First structure:") 521 | pprint.pprint(structures[0]) 522 | ``` 523 | 524 |
525 | 526 |
527 | 528 | ``` python 529 | # Using pagination to loop multiple requests 530 | # We want to add additional page_limit and page_offset parameters to the query 531 | offset = 0 532 | page_limit = 10 533 | while True: 534 | params = { 535 | "filter": query, 536 | "page_limit": page_limit, 537 | "page_offset": offset 538 | } 539 | 540 | response = requests.get(query_url, params=params).json() 541 | 542 | # Print the IDs in the response 543 | for result in response["data"]: 544 | print(result["id"]) 545 | 546 | offset += page_limit 547 | if response["meta"]["data_returned"] < offset: 548 | break 549 | 550 | if offset > 100: 551 | break 552 | ``` 553 | 554 |
555 | -------------------------------------------------------------------------------- /notebooks/demonstration-pymatgen-for-optimade-queries.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "vWwD6ckZ5WDo" 7 | }, 8 | "source": [ 9 | "# OPTIMADE and *pymatgen*" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": { 15 | "id": "JsRM6Vck5dJQ" 16 | }, 17 | "source": [ 18 | "# What is *pymatgen*?\n", 19 | "\n", 20 | "[*pymatgen*](https://pymatgen.org) is a materials science analysis code written in the Python programming language. It helps power the [Materials Project](https://materialsproject.org)'s high-throughput DFT workflows. It supports integration with a wide variety of simulation codes and can perform many analysis tasks such as the generation of phase diagrams or diffraction patterns.\n", 21 | "\n", 22 | "# The motivation behind this tutorial\n", 23 | "\n", 24 | "**This tutorial is aimed either at:**\n", 25 | "\n", 26 | "* People who are already familiar with using *pymatgen* or the Materials Project\n", 27 | " * In particular, anyone already using the Materials Project API through the `MPRester`, and who would like to start using the OPTIMADE API in a similar way\n", 28 | "\n", 29 | "* People who like using Python and think they might appreciate an interface like the one provided by *pymatgen*.\n", 30 | " * *pymatgen* provides a lot of input/output routines (such as conversion to CIF, POSCAR, etc.) and analysis tools (such as determination of symmetry, analysis of possible bonds, etc.) that can be performed directly on structures retrieved from OPTIMADE providers.\n", 31 | "\n", 32 | "**What this tutorial is not:**\n", 33 | "\n", 34 | "* This is not necessarily the way everyone should be accessing OPTIMADE providers!\n", 35 | " * This tool may be useful to you, or it may not be. There are a lot of good tools available in our community. You are encouraged to try out different tools and find the one that's most useful for your own work.\n", 36 | "\n", 37 | "* It is not currently the best way to access OPTIMADE APIs for advanced users.\n", 38 | " * It is still under development.\n", 39 | " * It is unit tested against several OPTIMADE providers but **some do not work yet**.\n", 40 | " * It only currently supports information retrieval from `/v1/structures/` routes.\n", 41 | "\n", 42 | "# Pre-requisites\n", 43 | "\n", 44 | "This tutorial is aimed at people who already have a basic understanding of Python, including how to import modules, the use of basic data structures like dictionaries and lists, and how to intantiate and use objects.\n", 45 | "\n", 46 | "If you do not have this understanding of Python, this tutorial may help you become familiar, but you are highly encouraged to follow a dedicated Python course such as those provided by [Software Carpentry](https://software-carpentry.org)." 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": { 52 | "id": "9F5vb55q6SR-" 53 | }, 54 | "source": [ 55 | "# Install pymatgen" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": { 61 | "id": "8B2b286R69TC" 62 | }, 63 | "source": [ 64 | "This tutorial uses the Python programming language. It can be run on any computer with Python installed. For convenience, here we are running in Google's \"Colaboratory\" notebook environment.\n", 65 | "\n", 66 | "Before we begin, we must install the `pymatgen` package:" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": null, 72 | "metadata": { 73 | "colab": { 74 | "base_uri": "https://localhost:8080/" 75 | }, 76 | "id": "qU7Uolip7N-g", 77 | "outputId": "b756287e-3d19-444d-f91c-c4aea6c440a6" 78 | }, 79 | "outputs": [], 80 | "source": [ 81 | "!pip install 'pymatgen>=2023.2.22' pybtex" 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": { 87 | "id": "f2gK8ZkZ6hMX" 88 | }, 89 | "source": [ 90 | "Next, let us **verify the correct version of *pymatgen* is installed**. This is good practice to do before starting out! For this tutorial we need version 2023.2.22 or above. We also need the `pybtex` package installed." 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": null, 96 | "metadata": { 97 | "id": "-Briwygk6goF" 98 | }, 99 | "outputs": [], 100 | "source": [ 101 | "try:\n", 102 | " from importlib_metadata import version\n", 103 | "except ImportError:\n", 104 | " from importlib.metadata import version" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": null, 110 | "metadata": { 111 | "colab": { 112 | "base_uri": "https://localhost:8080/", 113 | "height": 35 114 | }, 115 | "id": "zK-818jN7BOo", 116 | "outputId": "15f22406-261f-4a61-fd25-2c21ca204803" 117 | }, 118 | "outputs": [], 119 | "source": [ 120 | "version(\"pymatgen\")" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": { 126 | "id": "sSDGnxPo7SH8" 127 | }, 128 | "source": [ 129 | "# Import and learn about the `OptimadeRester`" 130 | ] 131 | }, 132 | { 133 | "cell_type": "markdown", 134 | "metadata": { 135 | "id": "Rlk4_GaU7WEr" 136 | }, 137 | "source": [ 138 | "The `OptimadeRester` is a class that is designed to retrieve data from an OPTIMADE provider and automatically convert the data into *pymatgen* `Structure` objects. These `Structure` objects are designed as a good intermediate format for crystallographic structure analysis, transformation and input/output.\n", 139 | "\n", 140 | "You can read documentation on the `OptimadeRester` here: https://pymatgen.org/pymatgen.ext.optimade.html" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": null, 146 | "metadata": { 147 | "id": "7l9gvSYz7Evd" 148 | }, 149 | "outputs": [], 150 | "source": [ 151 | "from pymatgen.ext.optimade import OptimadeRester" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": { 157 | "id": "KwSlb2-c90rf" 158 | }, 159 | "source": [ 160 | "The first step is to inspect the **documentation** for the `OptimadeRester`. We can run:" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": null, 166 | "metadata": { 167 | "id": "M-UkaQxa82ET" 168 | }, 169 | "outputs": [], 170 | "source": [ 171 | "OptimadeRester?" 172 | ] 173 | }, 174 | { 175 | "cell_type": "markdown", 176 | "metadata": { 177 | "id": "JD7m54BO_ZzQ" 178 | }, 179 | "source": [ 180 | "# Understanding \"aliases\" as shortcuts for accessing given providers" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": null, 186 | "metadata": { 187 | "colab": { 188 | "base_uri": "https://localhost:8080/" 189 | }, 190 | "id": "7hDTvvXz_ZFk", 191 | "outputId": "19562289-6c19-488a-8276-965e99152eee" 192 | }, 193 | "outputs": [], 194 | "source": [ 195 | "OptimadeRester.aliases" 196 | ] 197 | }, 198 | { 199 | "cell_type": "markdown", 200 | "metadata": { 201 | "id": "WjIcFt4t_ka4" 202 | }, 203 | "source": [ 204 | "These aliases are useful since they can provide a quick shorthand for a given database without having to remember a full URL.\n", 205 | "\n", 206 | "This list of aliases is updated periodically. However, new OPTIMADE providers can be made available and will be listed at https://providers.optimade.org. The `OptimadeRester` can query the OPTIMADE providers list to refresh the available aliases.\n", 207 | "\n", 208 | "You can do this as follows, but be aware this might take a few moments:" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": null, 214 | "metadata": { 215 | "colab": { 216 | "base_uri": "https://localhost:8080/" 217 | }, 218 | "id": "tDbwPyUU_isv", 219 | "outputId": "68ae47fa-3b3c-4ff7-9edc-e14153997cea" 220 | }, 221 | "outputs": [], 222 | "source": [ 223 | "opt = OptimadeRester()\n", 224 | "opt.refresh_aliases()" 225 | ] 226 | }, 227 | { 228 | "cell_type": "markdown", 229 | "metadata": { 230 | "id": "OxH1lIdHA1Yi" 231 | }, 232 | "source": [ 233 | "# Connecting to one or more OPTIMADE providers\n", 234 | "\n", 235 | "Let's begin by connecting to the Materials Project (`mp`) and 2DMatPedia (`twodmatpedia`) databases.\n", 236 | "By default pymatgen expects a server to reply within 5 seconds, some servers however require up to several minutes to process a querry.\n", 237 | "You can therefore set the timeout to a different value (in seconds) if you get a \"Read timed out\" error." 238 | ] 239 | }, 240 | { 241 | "cell_type": "code", 242 | "execution_count": null, 243 | "metadata": { 244 | "id": "RmOlXNC2A0wF" 245 | }, 246 | "outputs": [], 247 | "source": [ 248 | "opt = OptimadeRester([\"mp\", \"twodmatpedia\"], timeout=10)" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": { 254 | "id": "j9Psdj2eBGXA" 255 | }, 256 | "source": [ 257 | "We can find more information about the OPTIMADE providers we are connected to using the `describe()` method." 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": null, 263 | "metadata": { 264 | "colab": { 265 | "base_uri": "https://localhost:8080/" 266 | }, 267 | "id": "wrmCKA5SBFoQ", 268 | "outputId": "90ad4dcd-bfe7-4f9c-8892-d586e5a46e4b" 269 | }, 270 | "outputs": [], 271 | "source": [ 272 | "print(opt.describe())" 273 | ] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "metadata": { 278 | "id": "YzaXCWkuBa98" 279 | }, 280 | "source": [ 281 | "# Query for materials: binary nitrides case study\n", 282 | "\n", 283 | "`OptimadeRester` provides an `get_structures` method. **It does not support all features of OPTIMADE filters** but is a good place to get started.\n", 284 | "\n", 285 | "For this case study, we will search for materials containing nitrogen and that have two elements." 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": null, 291 | "metadata": { 292 | "colab": { 293 | "base_uri": "https://localhost:8080/" 294 | }, 295 | "id": "Nq3vHIg-BQpC", 296 | "outputId": "845250c5-de2f-4f41-d3e7-97e23fee60b6" 297 | }, 298 | "outputs": [], 299 | "source": [ 300 | "results = opt.get_structures(elements=[\"N\"], nelements=2)" 301 | ] 302 | }, 303 | { 304 | "cell_type": "markdown", 305 | "metadata": { 306 | "id": "ReyWVPsWB3Kr" 307 | }, 308 | "source": [ 309 | "We see that the `OptimadeRester` does some of the hard work for us: it automatically retrieves multiple pages of results when many results are available, and also gives us a progress bar.\n", 310 | "\n", 311 | "Let us inspect the `results`:" 312 | ] 313 | }, 314 | { 315 | "cell_type": "code", 316 | "execution_count": null, 317 | "metadata": { 318 | "colab": { 319 | "base_uri": "https://localhost:8080/" 320 | }, 321 | "id": "pgt2xFziCKmQ", 322 | "outputId": "18cf5db3-e6a4-47fb-fea0-e8be1b31cebc" 323 | }, 324 | "outputs": [], 325 | "source": [ 326 | "type(results) # this method returns a dictionary, so let's examine the keys of this dictionary..." 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": null, 332 | "metadata": { 333 | "colab": { 334 | "base_uri": "https://localhost:8080/" 335 | }, 336 | "id": "TWpcjldECY3V", 337 | "outputId": "884967ed-4463-46f4-c762-da898631ae85" 338 | }, 339 | "outputs": [], 340 | "source": [ 341 | "results.keys() # we see that the results dictionary is keyed by provider/alias" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": null, 347 | "metadata": { 348 | "colab": { 349 | "base_uri": "https://localhost:8080/" 350 | }, 351 | "id": "p-gIUNm4Cdho", 352 | "outputId": "d08bf60a-811f-434a-cee6-1161d4d36982" 353 | }, 354 | "outputs": [], 355 | "source": [ 356 | "results['mp'].keys() # and these are then keyed by that database's unique identifier" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": { 362 | "id": "-C0T49T0Cnwe" 363 | }, 364 | "source": [ 365 | "So let us inspect one structure as an example:" 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": null, 371 | "metadata": { 372 | "colab": { 373 | "base_uri": "https://localhost:8080/" 374 | }, 375 | "id": "WRxgOpFMCm9t", 376 | "outputId": "c1dee368-e7be-48c9-a711-7300bb3bf856" 377 | }, 378 | "outputs": [], 379 | "source": [ 380 | "example_structure = results['mp']['mp-804']\n", 381 | "print(example_structure)" 382 | ] 383 | }, 384 | { 385 | "cell_type": "markdown", 386 | "metadata": { 387 | "id": "vd9QJinuDEi7" 388 | }, 389 | "source": [ 390 | "We can then use *pymatgen* to further manipulate these `Structure` objects, for example to calculate the spacegroup or to convert to a CIF:" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": null, 396 | "metadata": { 397 | "colab": { 398 | "base_uri": "https://localhost:8080/" 399 | }, 400 | "id": "cQnh2J6PClsU", 401 | "outputId": "c8cdc6f9-00a4-4e5d-f73f-4dd86e72fbee" 402 | }, 403 | "outputs": [], 404 | "source": [ 405 | "example_structure.get_space_group_info()" 406 | ] 407 | }, 408 | { 409 | "cell_type": "code", 410 | "execution_count": null, 411 | "metadata": { 412 | "colab": { 413 | "base_uri": "https://localhost:8080/" 414 | }, 415 | "id": "DdkFGoLu78yn", 416 | "outputId": "1e750eba-f180-40ba-d022-ff37429109e3" 417 | }, 418 | "outputs": [], 419 | "source": [ 420 | "print(example_structure.to(fmt=\"cif\", symprec=0.01))" 421 | ] 422 | }, 423 | { 424 | "cell_type": "markdown", 425 | "metadata": { 426 | "id": "Pfy4pz7KDYRT" 427 | }, 428 | "source": [ 429 | "# Data analysis" 430 | ] 431 | }, 432 | { 433 | "cell_type": "markdown", 434 | "metadata": { 435 | "id": "kK-3QNMIE7h7" 436 | }, 437 | "source": [ 438 | "This section I will use some code I prepared earlier to summarize the `results` into a tabular format (`DataFrame`)." 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": null, 444 | "metadata": { 445 | "id": "1ox0FPvvE-Id" 446 | }, 447 | "outputs": [], 448 | "source": [ 449 | "import pandas as pd" 450 | ] 451 | }, 452 | { 453 | "cell_type": "code", 454 | "execution_count": null, 455 | "metadata": { 456 | "id": "QIzNLNQVFGA4" 457 | }, 458 | "outputs": [], 459 | "source": [ 460 | "records = []\n", 461 | "for provider, structures in results.items():\n", 462 | " for identifier, structure in structures.items():\n", 463 | " records.append({\n", 464 | " \"provider\": provider,\n", 465 | " \"identifier\": identifier,\n", 466 | " \"formula\": structure.composition.reduced_formula,\n", 467 | " \"spacegroup\": structure.get_space_group_info()[0],\n", 468 | " \"a_lattice_param\": structure.lattice.a,\n", 469 | " \"volume\": structure.volume,\n", 470 | " })\n", 471 | "df = pd.DataFrame(records)" 472 | ] 473 | }, 474 | { 475 | "cell_type": "code", 476 | "execution_count": null, 477 | "metadata": { 478 | "colab": { 479 | "base_uri": "https://localhost:8080/", 480 | "height": 419 481 | }, 482 | "id": "OZIeQr6xFi8D", 483 | "outputId": "d5f7010d-0970-4507-df37-c2f6645ac9e0" 484 | }, 485 | "outputs": [], 486 | "source": [ 487 | "df" 488 | ] 489 | }, 490 | { 491 | "cell_type": "markdown", 492 | "metadata": { 493 | "id": "A-ue234PHJxs" 494 | }, 495 | "source": [ 496 | "To pick one specific formula as an example, we can use tools from `pandas` to show the spacegroups present for that formula:" 497 | ] 498 | }, 499 | { 500 | "cell_type": "code", 501 | "execution_count": null, 502 | "metadata": { 503 | "colab": { 504 | "base_uri": "https://localhost:8080/" 505 | }, 506 | "id": "p5cge1ulFkqX", 507 | "outputId": "e503d0e9-dc48-48e1-f630-1777940b19f3" 508 | }, 509 | "outputs": [], 510 | "source": [ 511 | "df[df[\"formula\"] == \"GaN\"].spacegroup" 512 | ] 513 | }, 514 | { 515 | "cell_type": "markdown", 516 | "metadata": { 517 | "id": "Vd_P1qlNHWfx" 518 | }, 519 | "source": [ 520 | "Here, we see that there are a few common high-symmetry spacegroups (such as $P6_3mc$) there are also many low-symmetry structures ($P1$).\n", 521 | "\n", 522 | "I know that in this instance, this is because the $P1$ structures are actually amorphous and not crystalline. This highlights the importance of doing appropraiate **data cleaning** on retrieved data." 523 | ] 524 | }, 525 | { 526 | "cell_type": "markdown", 527 | "metadata": { 528 | "id": "e2LAxE7kJvXJ" 529 | }, 530 | "source": [ 531 | "### Plotting data\n", 532 | "\n", 533 | "As a quick example, we can also plot information in our table:" 534 | ] 535 | }, 536 | { 537 | "cell_type": "code", 538 | "execution_count": null, 539 | "metadata": { 540 | "id": "6oeo_5YEI4qg" 541 | }, 542 | "outputs": [], 543 | "source": [ 544 | "import plotly.express as px" 545 | ] 546 | }, 547 | { 548 | "cell_type": "code", 549 | "execution_count": null, 550 | "metadata": { 551 | "colab": { 552 | "base_uri": "https://localhost:8080/", 553 | "height": 542 554 | }, 555 | "id": "Gddx0gRdI6bd", 556 | "outputId": "676da693-e222-413d-804f-7731d40e35f7" 557 | }, 558 | "outputs": [], 559 | "source": [ 560 | "px.bar(df, x=\"spacegroup\", facet_row=\"provider\")" 561 | ] 562 | }, 563 | { 564 | "cell_type": "markdown", 565 | "metadata": { 566 | "id": "Rqj5hwDeJ8hT" 567 | }, 568 | "source": [ 569 | "**Remember, there is no single \"best database\" to use. Every database might be constructed for a specific purpose, subject to different biases, with different data qualities and sources.**\n", 570 | "\n", 571 | "The ideal database for one scientist with one application in mind may be different to the ideal database for another scientist with a different application.\n", 572 | "\n", 573 | "**The power of OPTIMADE is that you can query across multiple databases!**" 574 | ] 575 | }, 576 | { 577 | "cell_type": "markdown", 578 | "metadata": { 579 | "id": "bgVYGrKgH8hD" 580 | }, 581 | "source": [ 582 | "# Advanced usage: querying using the OPTIMADE filter grammar" 583 | ] 584 | }, 585 | { 586 | "cell_type": "markdown", 587 | "metadata": { 588 | "id": "7DleRA6lIBjQ" 589 | }, 590 | "source": [ 591 | "You can also query using an OPTIMADE filter as defined in the OPTIMADE specification and publication.\n", 592 | "\n", 593 | "**This is recommended** for advanced queries to use the full power of OPTIMADE.\n", 594 | "\n", 595 | "For example, the above query could have equally been performed as:" 596 | ] 597 | }, 598 | { 599 | "cell_type": "code", 600 | "execution_count": null, 601 | "metadata": { 602 | "colab": { 603 | "base_uri": "https://localhost:8080/" 604 | }, 605 | "id": "tPYRnwpiHqwc", 606 | "outputId": "c306708c-8c78-474a-af4d-ccea2e6b4b63" 607 | }, 608 | "outputs": [], 609 | "source": [ 610 | "results = opt.get_structures_with_filter('(elements HAS ALL \"N\") AND (nelements=2)')" 611 | ] 612 | }, 613 | { 614 | "cell_type": "markdown", 615 | "metadata": { 616 | "id": "aIweKxr2ItcS" 617 | }, 618 | "source": [ 619 | "# Advanced usage: retrieving provider-specific property information\n", 620 | "\n", 621 | "The OPTIMADE specification allows for providers to include database-specific information in the returned data, prefixed by namespace.\n", 622 | "\n", 623 | "To access this information with *pymatgen* we have to request \"snls\" (`StructureNL`) instead of \"structures\". A `StructureNL` is a `Structure` with additional metadata included, such as the URL it was downloaded from and any of this additional database-specific information." 624 | ] 625 | }, 626 | { 627 | "cell_type": "code", 628 | "execution_count": null, 629 | "metadata": { 630 | "colab": { 631 | "base_uri": "https://localhost:8080/" 632 | }, 633 | "id": "XqvfXpXgIafz", 634 | "outputId": "f5619590-1051-40f6-d7b3-11725144792a" 635 | }, 636 | "outputs": [], 637 | "source": [ 638 | "results_snls = OptimadeRester(\"odbx\").get_snls(nelements=2, additional_response_fields=[\"_odbx_thermodynamics\"])" 639 | ] 640 | }, 641 | { 642 | "cell_type": "code", 643 | "execution_count": null, 644 | "metadata": { 645 | "id": "M2T0dGN0Khsm" 646 | }, 647 | "outputs": [], 648 | "source": [ 649 | "example_snl = results_snls['odbx']['odbx/2']" 650 | ] 651 | }, 652 | { 653 | "cell_type": "code", 654 | "execution_count": null, 655 | "metadata": { 656 | "colab": { 657 | "base_uri": "https://localhost:8080/" 658 | }, 659 | "id": "qV--VAdvNrKn", 660 | "outputId": "56d0e3b0-56c8-4664-8dbb-11c9c5f1758d" 661 | }, 662 | "outputs": [], 663 | "source": [ 664 | "example_snl.data['_optimade']['_odbx_thermodynamics']" 665 | ] 666 | }, 667 | { 668 | "cell_type": "markdown", 669 | "metadata": { 670 | "id": "NMppI0eiN4jF" 671 | }, 672 | "source": [ 673 | "This extra data provided differs from every database, and sometimes from material to material, so some exploration is required!" 674 | ] 675 | }, 676 | { 677 | "cell_type": "markdown", 678 | "metadata": { 679 | "id": "JNWBkj91LWWO" 680 | }, 681 | "source": [ 682 | "# When Things Go Wrong and How to Get Help\n", 683 | "\n", 684 | "Bugs may be present! The `OptimadeRester` is still fairly new.\n", 685 | "\n", 686 | "If it does not work it is likely because of either:\n", 687 | "\n", 688 | "* A bug in the *pymatgen* code. This may be reported directly to Matthew Horton at mkhorton@lbl.gov or an issue can be opened in the *pymatgen* code repository. Matt apologises in advance if this is the case! \n", 689 | "\n", 690 | "* An issue with a provider. This may be because the provider does not yet fully follow the OPTIMADE specification, because the provider is suffering an outage, or because the filters are not yet optimized with that provider.\n", 691 | "\n", 692 | " * If this happens, you may try to first increase the `timeout` value to something larger. The default is too low for some providers.\n", 693 | "\n", 694 | " * Otherwise, you may want to contact the provider directly, or create a post at the OPTIMADE discussion forum: https://matsci.org/optimade\n", 695 | "\n", 696 | "# How to Get Involved\n", 697 | "\n", 698 | "New developers are very welcome to add code to *pymatgen*! If you want to get involved, help fix bugs or add new features, your help would be very much appreciated. *pymatgen* can only exist and be what it is today thanks to the many efforts of its [development team](https://pymatgen.org/team.html)." 699 | ] 700 | }, 701 | { 702 | "cell_type": "code", 703 | "execution_count": null, 704 | "metadata": {}, 705 | "outputs": [], 706 | "source": [] 707 | } 708 | ], 709 | "metadata": { 710 | "colab": { 711 | "collapsed_sections": [], 712 | "name": "OPTIMADE tutorial with pymatgen.ipynb", 713 | "provenance": [] 714 | }, 715 | "kernelspec": { 716 | "display_name": "Python [conda env:optimade_pymatgen_exercise]", 717 | "language": "python", 718 | "name": "conda-env-optimade_pymatgen_exercise-py" 719 | }, 720 | "language_info": { 721 | "codemirror_mode": { 722 | "name": "ipython", 723 | "version": 3 724 | }, 725 | "file_extension": ".py", 726 | "mimetype": "text/x-python", 727 | "name": "python", 728 | "nbconvert_exporter": "python", 729 | "pygments_lexer": "ipython3", 730 | "version": "3.9.16" 731 | } 732 | }, 733 | "nbformat": 4, 734 | "nbformat_minor": 1 735 | } 736 | -------------------------------------------------------------------------------- /notebooks/exercise7-oqmd-optimade-tutorial.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Tutorial on OQMD \n", 8 | "\n", 9 | "Abhijith Gopakumar, *Northwestern University*\n", 10 | "\n", 11 | "\n", 12 | "## Part 1: Querying OQMD and Retrieving data using OPTIMADE" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": null, 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "# Install dependencies: these can also be found in the `requirements.txt` file in this folder\n", 22 | "%pip install numpy scikit-learn requests matplotlib" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "metadata": {}, 29 | "outputs": [], 30 | "source": [ 31 | "# Import libraries\n", 32 | "\n", 33 | "import requests\n", 34 | "from copy import deepcopy\n", 35 | "import os\n", 36 | "import shutil\n", 37 | "import json\n", 38 | "from pathlib import Path" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "# Set the base URL for OPTIMADE REST queries\n", 48 | "\n", 49 | "rest_base = \"http://oqmd.org/optimade/structures?\"" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": null, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "# Create the query URL with filter, response_fields and paging requirements\n", 59 | "\n", 60 | "# The following query filters for data of ternary non-metallic oxides\n", 61 | "# Crystal structure parameters and Band gap values are returned in response_fields\n", 62 | "# Crystal structures will be used to generate representational vectors (input features) for ML\n", 63 | "# Bandgap values will be used as targets for ML\n", 64 | "\n", 65 | "\n", 66 | "filter_ = '_oqmd_stability<=0 AND elements HAS \"O\" AND nelements=3 AND _oqmd_band_gap>0'\n", 67 | "\n", 68 | "response_ = 'id,_oqmd_entry_id,lattice_vectors,cartesian_site_positions,species_at_sites,_oqmd_band_gap'\n", 69 | "\n", 70 | "page_ = [\"page_offset=0\", \"page_limit=200\"]\n", 71 | "\n", 72 | "filter_ = 'filter=' + filter_\n", 73 | "response_ = 'response_fields=' + response_\n", 74 | "\n", 75 | "oqmd_optimade_query = rest_base + \"&\".join([filter_, response_]+page_)\n", 76 | "print(\"Created Query: \\n\\n{}\".format(oqmd_optimade_query))" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": null, 82 | "metadata": {}, 83 | "outputs": [], 84 | "source": [ 85 | "# Now do a test query on URL using requests.get() This can take a few minutes.\n", 86 | "\n", 87 | "response = requests.get(oqmd_optimade_query)\n", 88 | "if response.status_code == 200:\n", 89 | " print(\"Success!\")\n", 90 | " #print(response.json())\n", 91 | "else:\n", 92 | " print(\"Query failed. Status: {}\".format(response.status_code))\n", 93 | " print(\"Error Message: {}\".format(response.text))" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": null, 99 | "metadata": { 100 | "scrolled": false 101 | }, 102 | "outputs": [], 103 | "source": [ 104 | "# We need more than 200 datapoints for machine learning - if more data is available\n", 105 | "\n", 106 | "# As the first step, here's the same script from the cell above, but kept inside a function \n", 107 | "\n", 108 | "def query_oqmd_optimade(query):\n", 109 | " print(\"\\nQuerying: {}\".format(query))\n", 110 | " response = requests.get(query)\n", 111 | " if response.status_code == 200:\n", 112 | " print(\"Success!\")\n", 113 | " return response.json()\n", 114 | " else:\n", 115 | " print(\"Query failed. Status: {}\".format(response.status_code))\n", 116 | " print(\"Error Message: {}\".format(response.text))\n", 117 | " return \n", 118 | "\n", 119 | " \n", 120 | " \n", 121 | "\n", 122 | "# Next, we query for 1000 materials in total using 5 sequential API queries - each paginated to\n", 123 | "# retrieve 200 materials\n", 124 | "\n", 125 | "\n", 126 | "load_data_from_saved = True \n", 127 | "# This is to avoid querying OQMD repeatedly for the same data, if .\n", 128 | "# Because the data I downloaded is already available as a JSON file in this Git repo.\n", 129 | "\n", 130 | "# But if you'd like to try out querying OQMD, set \"load_data_from_saved\" as \"False\"\n", 131 | "# Querying OQMD for this particular data would take about 5-10 minutes to complete\n", 132 | "\n", 133 | "\n", 134 | "dataset_filename = Path(os.path.realpath(\".\")).joinpath(\"./oqmd_exercise_data/raw_dataset_saved.json\")\n", 135 | "\n", 136 | "# Check if the file exists:\n", 137 | "\n", 138 | "if load_data_from_saved:\n", 139 | " if os.path.isfile(dataset_filename):\n", 140 | " with open(dataset_filename, 'r') as fin:\n", 141 | " dataset = json.load(fin)\n", 142 | " else: # If the file does not exist try to load the file from github\n", 143 | " response = requests.get('https://raw.githubusercontent.com/Materials-Consortia/optimade-tutorial-exercises/main/notebooks/oqmd_exercise_data/raw_dataset_saved.json')\n", 144 | " if response.status_code == 200:\n", 145 | " dataset = json.loads(deepcopy(response.content))\n", 146 | " else:\n", 147 | " load_data_from_saved = False\n", 148 | "\n", 149 | "if not load_data_from_saved:\n", 150 | " dataset = []\n", 151 | " query = oqmd_optimade_query\n", 152 | " for i in range(5):\n", 153 | " jsondata = query_oqmd_optimade(query)\n", 154 | " if jsondata is None:\n", 155 | " break\n", 156 | " else:\n", 157 | " # Get the link to the next page and query it in next loop iteration\n", 158 | " query = deepcopy(jsondata['links']['next'])\n", 159 | " dataset.append(deepcopy(jsondata))\n", 160 | " with open(dataset_filename, 'w') as fout:\n", 161 | " json.dump(dataset, fout)\n" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [ 170 | "# Confirm the paginated response - checking reliability of server-side and client side scripts\n", 171 | "\n", 172 | "for i in range(len(dataset)):\n", 173 | " query = dataset[i]['meta']['query']['representation']\n", 174 | " page_params = [param for param in query.split(\"&\") if param.startswith(\"page\")]\n", 175 | " print(\"{}:{}\".format(i,\", \".join(page_params)))\n", 176 | " #print(dataset[i]['meta']['query']['_oqmd_final_query'])" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": null, 182 | "metadata": {}, 183 | "outputs": [], 184 | "source": [ 185 | "# Inspect the response data keys and confirm all the necessary information is available\n", 186 | "\n", 187 | "print(dataset[0]['data'][0].keys())\n", 188 | "print(dataset[0]['data'][0]['attributes'].keys())\n", 189 | "print(dataset[0]['meta'].keys())" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": null, 195 | "metadata": {}, 196 | "outputs": [], 197 | "source": [ 198 | "# As you can see, the type of the returned data is OPTIMADE's \"structures\"\n", 199 | "print(dataset[0]['data'][1]['type'])" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": null, 205 | "metadata": {}, 206 | "outputs": [], 207 | "source": [ 208 | "# Here's a function to convert OPTIMADE's structure data to POSCAR. \n", 209 | "\n", 210 | "# Make sure that 'lattice_vectors', 'species_at_sites', and 'cartesian_site_positions' are\n", 211 | "# included in the response_fields of query URL\n", 212 | "\n", 213 | "def get_poscar_from_optimade_structure(structure):\n", 214 | " if '_oqmd_entry_id' in structure['attributes'].keys():\n", 215 | " poscar = [\"REST API StructureID {}, OQMD Entry ID {}\".format(\n", 216 | " structure['id'], structure['attributes']['_oqmd_entry_id']\n", 217 | " )]\n", 218 | " filename = \"ID-{}_OQMD-EnID-{}.poscar\".format(structure['id'],structure['attributes']['_oqmd_entry_id'])\n", 219 | " else:\n", 220 | " poscar = [\"REST API StructureID {}\".format(structure['id'])]\n", 221 | " filename = \"ID-{}.poscar\".format(structure['id'])\n", 222 | " \n", 223 | " poscar.append(\"1.0\")\n", 224 | " \n", 225 | " poscar += [\" \".join([str(jtem) for jtem in item]) \n", 226 | " for item in structure['attributes']['lattice_vectors']\n", 227 | " ]\n", 228 | " \n", 229 | " elems = []\n", 230 | " counts = []\n", 231 | " for item in structure['attributes']['species_at_sites']:\n", 232 | " if item in elems:\n", 233 | " assert elems.index(item) == len(elems)-1\n", 234 | " counts[-1] += 1\n", 235 | " else:\n", 236 | " elems.append(deepcopy(item))\n", 237 | " counts.append(1)\n", 238 | " poscar.append(\" \".join(elems))\n", 239 | " poscar.append(\" \".join([str(item) for item in counts]))\n", 240 | " \n", 241 | " poscar.append(\"Cartesian\")\n", 242 | " \n", 243 | " poscar += [\" \".join([str(jtem) for jtem in item]) \n", 244 | " for item in structure['attributes']['cartesian_site_positions']\n", 245 | " ]\n", 246 | " poscar = \"\\n\".join(poscar)\n", 247 | " return (poscar, filename)" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": null, 253 | "metadata": {}, 254 | "outputs": [], 255 | "source": [ 256 | "# Call the OPTIMADE structure -> POSCAR conversion function \n", 257 | "# and save all structures in directory \"./input_poscars\"\n", 258 | "\n", 259 | "# Also save the bandgap values in a file \"target_properties.csv\"\n", 260 | "\n", 261 | "poscar_dir = \"./input_poscars\"\n", 262 | "if os.path.exists(poscar_dir):\n", 263 | " shutil.rmtree(poscar_dir)\n", 264 | "os.mkdir(poscar_dir)\n", 265 | "\n", 266 | "properties = []\n", 267 | "\n", 268 | "for dt in dataset:\n", 269 | " for st in dt['data']:\n", 270 | " poscar, filename = get_poscar_from_optimade_structure(deepcopy(st))\n", 271 | " target_value = deepcopy(st['attributes']['_oqmd_band_gap'])\n", 272 | " properties.append(\",\".join([filename,str(target_value)]))\n", 273 | " with open(os.path.join(poscar_dir,filename),\"w\") as fout:\n", 274 | " fout.write(poscar)\n", 275 | "with open(\"target_properties.csv\",\"w\") as fout:\n", 276 | " fout.write(\"filename, _oqmd_band_gap \\n\")\n", 277 | " fout.write(\"\\n\".join(properties))" 278 | ] 279 | }, 280 | { 281 | "cell_type": "markdown", 282 | "metadata": {}, 283 | "source": [ 284 | "## Part 2: Feature Generation" 285 | ] 286 | }, 287 | { 288 | "cell_type": "markdown", 289 | "metadata": {}, 290 | "source": [ 291 | "### We need to generate a set of material representation vectors (input features) from the POSCAR data for Machine Learning\n", 292 | "\n", 293 | "#### The set of features generated for this tutorial is given in the file \"features_processed_final.csv\" in the Github repo\n", 294 | "\n", 295 | "\n", 296 | "### Optional\n", 297 | "#### An example set of steps to generate Magpie material features is shown below. The following commands are to be executed on a bash shell from the same directory where this jupyter notebook resides. \n", 298 | "\n", 299 | "```\n", 300 | "git clone git@github.com:tachyontraveler/magpie_workflow.git\n", 301 | "\n", 302 | "> Cloning into 'magpie_workflow'...\n", 303 | ">\n", 304 | "> remote: Enumerating objects: 115, done.\n", 305 | ">\n", 306 | "> remote: Counting objects: 100% (6/6), done.\n", 307 | ">\n", 308 | "> remote: Compressing objects: 100% (6/6), done.\n", 309 | ">\n", 310 | "> remote: Total 115 (delta 2), reused 0 (delta 0), pack-reused 109\n", 311 | ">\n", 312 | "> Receiving objects: 100% (115/115), 16.03 MiB | 3.25 MiB/s, done.\n", 313 | ">\n", 314 | "> Resolving deltas: 100% (31/31), done.\n", 315 | "\n", 316 | "$ cp -r ./input_poscars magpie_workflow/\n", 317 | "\n", 318 | "$ cd magpie_workflow\n", 319 | "\n", 320 | "$ python3 workflow.py \n", 321 | "\n", 322 | ">Initializing the workflow class\n", 323 | ">\n", 324 | "> 2021-11-22 19:51:45.614116 :: Generating property.txt file\n", 325 | ">\n", 326 | "> 2021-11-22 19:51:45.616918 :: Generating Magpie input commands file \n", 327 | ">\n", 328 | "> 2021-11-22 19:51:45.617025 :: Magpie input file created as ./OUTDIR/generate-attributes.in\n", 329 | ">\n", 330 | "> 2021-11-22 19:51:45.617060 :: Calling Magpie with the input script.. \n", 331 | ">\n", 332 | ">2021-11-22 19:51:45.617102 :: May check out.workflow.txt for Magpie messages\n", 333 | ">\n", 334 | ">2021-11-22 19:52:36.347243 :: Finished Magpie generation. Now post-processing\n", 335 | ">\n", 336 | ">2021-11-22 19:52:36.399678 :: Done\n", 337 | "\n", 338 | "$ cd ../\n", 339 | "\n", 340 | "$ cp magpie_workflow/OUTDIR/features_processed_final.csv ./\n", 341 | "```" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": null, 347 | "metadata": {}, 348 | "outputs": [], 349 | "source": [] 350 | }, 351 | { 352 | "cell_type": "markdown", 353 | "metadata": {}, 354 | "source": [ 355 | "## Part 3: Machine Learning\n", 356 | "\n", 357 | "#### Now we can proceed to build a small ML model using Scikit Learn library modules and fit it on the data obtained above" 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "execution_count": null, 363 | "metadata": {}, 364 | "outputs": [], 365 | "source": [ 366 | "# Import the required libraries\n", 367 | "\n", 368 | "import numpy as np\n", 369 | "from sklearn.model_selection import train_test_split\n", 370 | "from sklearn.pipeline import Pipeline \n", 371 | "from sklearn.preprocessing import StandardScaler\n", 372 | "from sklearn.decomposition import PCA\n", 373 | "from sklearn.ensemble import RandomForestRegressor as RFR\n", 374 | "from sklearn.svm import SVR\n", 375 | "from sklearn.model_selection import GridSearchCV\n", 376 | "import matplotlib.pyplot as plt " 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": null, 382 | "metadata": {}, 383 | "outputs": [], 384 | "source": [ 385 | "# Load the data generated in previous sections\n", 386 | "\n", 387 | "# Input feature data - generated using Magpie on POSCAR files\n", 388 | "if not os.path.isfile(\"features_processed_final.csv\"):\n", 389 | " response = requests.get('https://raw.githubusercontent.com/Materials-Consortia/optimade-tutorial-exercises/main/notebooks/oqmd_exercise_data/features_processed_final.csv')\n", 390 | " if response.status_code == 200:\n", 391 | " with open(\"features_processed_final.csv\",\"wb\") as fout:\n", 392 | " fout.write((response.content))\n", 393 | " else:\n", 394 | " raise RuntimeError(\"Please complete the optional step above, or copy the example data from `oqmd_exercise_data` into this directory.\")\n", 395 | "\n", 396 | "features = open(\"./features_processed_final.csv\",\"r\").read().strip().split(\"\\n\")\n", 397 | "feats_title = features[0].strip().split(\",\")\n", 398 | "\n", 399 | "features = np.array([item.strip().split(\",\") for item in features[1:]])\n", 400 | "features = features[~np.isnan(features[:,1:].astype(float)).any(axis=1)]\n", 401 | "I = features[:,0]\n", 402 | "X = features[:,1:].astype(float)\n", 403 | "\n", 404 | "\n", 405 | "# Target data (bandgap values)\n", 406 | "targets = open(\"./target_properties.csv\").read().strip().split(\"\\n\")\n", 407 | "targets_title = targets[0].strip().split(\",\")\n", 408 | "\n", 409 | "targets = np.array([item.strip().split(\",\") for item in targets[1:]])\n", 410 | "targets = dict(zip(targets[:,0],targets[:,1].astype(float)))\n", 411 | "\n", 412 | "Y = [targets[item] for item in I]\n", 413 | "\n", 414 | "# The feats_title and targets_title are not used anywhere else in this tutorial. \n", 415 | "# But I'd recommend keeping them for tracking features and targets in an actual ML study\n", 416 | "# For example, they can be be useful in feature importance analysis or in multi-target modelling" 417 | ] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "execution_count": null, 422 | "metadata": {}, 423 | "outputs": [], 424 | "source": [ 425 | "# Split the data to train and test sets\n", 426 | "\n", 427 | "xtrain, xtest, ytrain, ytest = train_test_split(X, Y, \n", 428 | " test_size=0.2,\n", 429 | " random_state=0)" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": null, 435 | "metadata": {}, 436 | "outputs": [], 437 | "source": [ 438 | "# Create a Scikit Learn pipeline with feature scaling, dimension reduction, and fianlly, a regressor\n", 439 | "\n", 440 | "pipeline = Pipeline([\n", 441 | " ('scaler', StandardScaler()),\n", 442 | " ('pca', PCA()),\n", 443 | " ('svr', SVR())\n", 444 | "])\n", 445 | "\n", 446 | "# Parameters to search in finding the best model\n", 447 | "# The following sets of parameters are just for a shallow search for optimization\n", 448 | "# A finer search for parameters will be required on an actual ML study\n", 449 | "\n", 450 | "params = {\n", 451 | " 'pca__n_components': [200,250,xtrain.shape[-1]],\n", 452 | " 'svr__C':[0.1,1,10,20],\n", 453 | " 'svr__kernel':['rbf'],\n", 454 | " 'svr__epsilon':[0.1],\n", 455 | " 'svr__gamma':['scale']\n", 456 | "}\n", 457 | "\n", 458 | "gridsearch = GridSearchCV(pipeline, params, cv=3)" 459 | ] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": null, 464 | "metadata": { 465 | "scrolled": true 466 | }, 467 | "outputs": [], 468 | "source": [ 469 | "# Do the grid search and get scores\n", 470 | "\n", 471 | "gridsearch.fit(xtrain, ytrain)\n", 472 | "\n", 473 | "print('Traindata score: {}'.format(gridsearch.score(xtrain, ytrain)))\n", 474 | "print('Testdata score: {}'.format(gridsearch.score(xtest, ytest)))" 475 | ] 476 | }, 477 | { 478 | "cell_type": "markdown", 479 | "metadata": {}, 480 | "source": [ 481 | "#### (I'm aware that the test data score is much lower that of traindata - implying a possible overfit. But this would work just fine as a representational ML modeling workflow for this tutorial session.)" 482 | ] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "execution_count": null, 487 | "metadata": {}, 488 | "outputs": [], 489 | "source": [ 490 | "# See which set of paramters had the best fit as of now\n", 491 | "print(gridsearch.best_estimator_)\n", 492 | "\n", 493 | "# Further, a finer search for most optimum set of paramters is required to get a better model.\n", 494 | "# But for the sake of this tutorial, I'm gonna continue to plot the testdata predictions" 495 | ] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "execution_count": null, 500 | "metadata": {}, 501 | "outputs": [], 502 | "source": [ 503 | "# Get predictions on test data\n", 504 | "\n", 505 | "ytest_pred = gridsearch.predict(xtest)" 506 | ] 507 | }, 508 | { 509 | "cell_type": "code", 510 | "execution_count": null, 511 | "metadata": {}, 512 | "outputs": [], 513 | "source": [ 514 | "# Plot the predictions\n", 515 | "\n", 516 | "plt.rcParams['font.size'] = 16\n", 517 | "plt.rcParams[\"font.family\"] = \"serif\"\n", 518 | "\n", 519 | "plt.scatter(ytest, ytest_pred, \n", 520 | " color='teal', \n", 521 | " alpha=0.7)\n", 522 | "plt.xlabel(\"DFT Band gap (eV)\")\n", 523 | "plt.ylabel(\"ML-Predicted Band gap (eV)\")\n", 524 | "xmax = max([max(ytest),max(ytest_pred)])\n", 525 | "plt.plot([0,xmax],[0,xmax],color='red')\n", 526 | "\n", 527 | "plt.show()" 528 | ] 529 | }, 530 | { 531 | "cell_type": "code", 532 | "execution_count": null, 533 | "metadata": {}, 534 | "outputs": [], 535 | "source": [ 536 | "# Close the plots\n", 537 | "plt.close()" 538 | ] 539 | }, 540 | { 541 | "cell_type": "markdown", 542 | "metadata": {}, 543 | "source": [ 544 | "### That's it for now, folks!\n", 545 | "I hope this notebook helped to get started on retrieving OQMD data via OPTIMADE API and using it to build a quick ML model.\n", 546 | "\n", 547 | "I will try to add more descriptive information and enhancements to this tutorial in the future.\n", 548 | "\n", 549 | "Let me know if you have any questions!\n", 550 | "\n" 551 | ] 552 | } 553 | ], 554 | "metadata": { 555 | "kernelspec": { 556 | "display_name": "Python [conda env:optimade_oqmd_exercise]", 557 | "language": "python", 558 | "name": "conda-env-optimade_oqmd_exercise-py" 559 | }, 560 | "language_info": { 561 | "codemirror_mode": { 562 | "name": "ipython", 563 | "version": 3 564 | }, 565 | "file_extension": ".py", 566 | "mimetype": "text/x-python", 567 | "name": "python", 568 | "nbconvert_exporter": "python", 569 | "pygments_lexer": "ipython3", 570 | "version": "3.9.16" 571 | } 572 | }, 573 | "nbformat": 4, 574 | "nbformat_minor": 2 575 | } 576 | -------------------------------------------------------------------------------- /notebooks/exercises.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# OPTIMADE Tutorial Exercises\n", 8 | "\n", 9 | "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercises.ipynb)\n", 10 | "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fexercises.ipynb)\n", 11 | "[![GitHub license](https://img.shields.io/github/license/Materials-Consortia/optimade-tutorial-exercises?logo=GitHub)](https://github.com/Materials-Consortia/optimade-tutorial-exercises)" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "## Preface\n", 19 | "\n", 20 | "This repository hosts general tutorials on the OPTIMADE specification and particular database implementations of the API. \n", 21 | "These open-ended exercises were initially provided to accompany the following workshops:\n", 22 | "- NOMAD CoE [Tutorial 6: OPTIMADE](https://th.fhi-berlin.mpg.de/meetings/nomad-tutorials/index.php?n=Meeting.Tutorial6), 7-8 September 2021\n", 23 | "- ICTP-EAIFR [Training School: Working with Materials Databases and OPTIMADE](https://eaifr.ictp.it/about/news/ml-for-es-and-md/), November-December 2021.\n", 24 | "- CECAM Flagship Workshop [Open Databases Integration for Materials Design](https://www.cecam.org/workshop-details/1120), May 30, 2022 - June 3, 2022.\n", 25 | "- [Actively Learning Materials Science](https://sites.utu.fi/al4ms2023/), Aalto University, February 27, 2023 - March 3, 2023.\n", 26 | "\n", 27 | "This document is hosted on [GitHub](https://github.com/Materials-Consortia/optimade-tutorial-exercises), and all feedback or suggestions for new exercises can be provided as an issue or pull request in that repository.\n", 28 | "\n", 29 | "If you would like to get involved with the OPTIMADE consortium, you can find some more details on the [OPTIMADE home page](https://optimade.org/#get-involved).\n", 30 | "\n", 31 | "### Contributors\n", 32 | "\n", 33 | "- [Matthew Evans](https://ml-evs.science), *UCLouvain* (repository and general exercises)\n", 34 | "- [Matthew Horton](https://github.com/mkhorton), *LBNL* (`pymatgen` exercise)\n", 35 | "- [Evgeny Blokhin](https://tilde.pro), *Tilde Materials Informatics* (typos and bug fixes)\n", 36 | "- [Cormac Toher](https://github.com/ctoher), *Duke University* (AFLOW exercise)\n", 37 | "- [Abhijith Gopakumar](https://github.com/tachyontraveler), *Northwestern U.* (OQMD exercise)\n", 38 | "- [Johan Bergsma](https://github.com/JPBergsma), *CECAM* (typos, testing and feedback)\n" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "## Introduction" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "The OPTIMADE specification defines a web-based JSON API that is implemented by many [different materials databases](https://www.optimade.org/providers-dashboard) to allow users to query the underlying data with the same syntax and response format.\n", 53 | "There are several tools that can access these APIs, for example, any web browser, any programming language that can make HTTP requests, or common command-line tools such as `curl` or `wget`.\n", 54 | "\n", 55 | "There are also specialist tools, developed by members of the OPTIMADE community.\n", 56 | "You may have heard about three such tools in other tutorials and talks:\n", 57 | "1. [The Materials Cloud web-based OPTIMADE client](https://materialscloud.org/optimadeclient/).\n", 58 | "2. [The optimade.science web-based aggregator](https://optimade.science).\n", 59 | "3. [`pymatgen`'s built-in OPTIMADE client](https://pymatgen.org/pymatgen.ext.optimade.html?highlight=optimade#module-pymatgen.ext.optimade).\n", 60 | "4. [`optimade-python-tools`'s `OptimadeClient`](https://www.optimade.org/optimade-python-tools/latest/getting_started/client/)\n", 61 | "\n", 62 | "Some of these clients can send requests to multiple OPTIMADE providers *simultaneously*, based on programmatic [providers list](https://providers.optimade.org/). \n", 63 | "You can explore this list at the human-readable [providers dashboard](https://www.optimade.org/providers-dashboard/), where you can see the current OPTIMADE structure count exceeds 26 million!\n", 64 | "\n", 65 | "You may wish to familiarise yourselves with the OPTIMADE API by writing your own queries, scripts or code. Some possible options:\n", 66 | "- Craft (or copy) your own URL queries to a particular OPTIMADE implementation. Some web browsers (e.g., Firefox) will automatically format the JSON response for you (see Exercise 1).\n", 67 | "- Use command-line tools such as [`curl`](https://curl.se/) or [`wget`](https://www.gnu.org/software/wget/) to receive data in your terminal, or pipe it to a file. You could use the tool [`jq`](https://stedolan.github.io/jq/) to format the JSON response.\n", 68 | "- Make an appropriate HTTP request from your programming language of choice. For Python, you could use the standard library [urllib.request](https://docs.python.org/3/library/urllib.request.html) or the more ergonomic external libraries [requests](https://docs.python-requests.org/en/latest/index.html) and [httpx](https://www.python-httpx.org). Some example code for Python is provided below the exercises. In Javascript, you can just use `fetch(...)` or a more advanced OPTIMADE client such as that provided by Tilde Informatics' [optimade-client](https://github.com/tilde-lab/optimade-client).\n", 69 | "\n", 70 | "If you are following these tutorials as part of a school or workshop, please do not hesitate to ask about how to get started with any of the above tools!" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "## Exercise 1" 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "This aim of this exercise is to familiarise yourself with the OPTIMADE JSON API.\n", 85 | "In the recent OPTIMADE paper [[1](#ref1)], we provided the number of results to a set of queries across all OPTIMADE implementations, obtained by applying the same filter to the structures endpoint of each database.\n", 86 | "The filters are:\n", 87 | "- Query for structures containing a group IV element: `elements HAS ANY \"C\", \"Si\", \"Ge\", \"Sn\", \"Pb\"`.\n", 88 | "- As above, but return only binary phases: `elements HAS ANY \"C\", \"Si\", \"Ge\", \"Sn\", \"Pb\" AND nelements=2`.\n", 89 | "- This time, exclude lead and return ternary phases: `elements HAS ANY \"C\", \"Si\", \"Ge\", \"Sn\" AND NOT elements HAS \"Pb\" AND elements LENGTH 3`.\n", 90 | "\n", 91 | "- In your browser, try visiting the links in Table 1 of the OPTIMADE paper [[1](#ref1)] (clickable links in arXiv version [[2](#ref2)]), which is reproduced below.\n", 92 | " - Familiarise yourself with the standard JSON:API output fields (`data`, `meta` and `links`).\n", 93 | " - You will find the crystal structures returned for the query as a list under the `data` key, with the OPTIMADE-defined fields listed under the `attributes` of each list entry.\n", 94 | " - The `meta` field provides useful information about your query, e.g. `data_returned` shows how many results there are in total, not just in the current page of the response (you can check if the table still contains the correct number of entries, or if it is now out of date).\n", 95 | " - The `links` field provides links to the next or previous pages of your response, in case you requested more structures than the `page_limit` for that implementation.\n", 96 | "- Choose one particular entry to focus on: replace the `filter` URL parameter with `/` for the `id` of one particular structure (e.g. `https://example.org/optimade/v1/structures/`).\n", 97 | "- Explore other endpoints provided by each of these providers. If they serve \"extra\" fields (i.e. those containing the provider prefix), try to find out what these fields mean by querying the `/info/structures` endpoint.\n", 98 | "- Try performing the same queries with some of the tools listed above, or in scripts of your own design.\n", 99 | "\n", 100 | "
\n", 101 | "\n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | "
ProviderN1N2N3
AFLOW 700,192 62,293382,554
Crystallography Open Database (COD)416,314 3,896 32,420
Theoretical Crystallography Open Database (TCOD) 2,631 296 660
Materials Cloud 886,518 801,382 103,075
Materials Project 27,309 3,545 10,501
Novel Materials Discovery Laboratory (NOMAD) 3,359,594 532,123 1,611,302
Open Database of Xtals (odbx) 55 54 0
Open Materials Database (omdb) 58,718 690 7,428
Open Quantum Materials Database (OQMD) 153,113 11,011 70,252
\n", 163 | "
\n", 164 | "\n", 165 | "\n", 166 | "[1] Andersen *et al.*, \"OPTIMADE, an API for exchanging materials data\", *Sci Data* **8**, 217 (2021) [10.1038/s41597-021-00974-z](https://doi.org/10.1038/s41597-021-00974-z).\n", 167 | "\n", 168 | "[2] Andersen *et al.*, \"OPTIMADE, an API for exchanging materials data\" (2021) [arXiv:2103.02068](https://arxiv.org/abs/2103.02068)." 169 | ] 170 | }, 171 | { 172 | "cell_type": "markdown", 173 | "metadata": {}, 174 | "source": [ 175 | "## Exercise 2" 176 | ] 177 | }, 178 | { 179 | "cell_type": "markdown", 180 | "metadata": {}, 181 | "source": [ 182 | "\n", 183 | "The filters from Exercise 1 screened for group IV containing compounds, further refining the query to exclude lead, and finally to include only ternary phases.\n", 184 | "\n", 185 | "- Choose a suitable database and modfiy the filters from Exercise 1 to search for binary [III]-[V] semiconductors.\n", 186 | " - A \"suitable\" database here is one that you think will have good coverage across this chemical space.\n", 187 | "- Using the `chemical_formula_anonymous` field, investigate the most common stoichiometric ratios between the constituent elements, e.g. 1:1, 2:1, etc.\n", 188 | " - You may need to follow pagination links (`links->next` in the response) to access all available data for your query, or you can try adding the `page_limit=100` URL parameter to request more structures per response.\n", 189 | "- Apply the same filter to another database and assess the similarity between the results, thinking carefully about how the different focuses of each database and different methods in their construction/curation could lead to biases in this outcome.\n", 190 | " - For example, an experimental database may have one crystal structure entry per experimental sample studied, in which case the most useful (or \"fashionable\") compositions will return many more entries, especially when compared to a database that curates crystal structures such that each ideal crystal has one canonical entry (e.g., a database of minerals).\n", 191 | "- Try to use the query you have constructed in the multi-provider clients (linked above), to query all OPTIMADE providers simultaneously." 192 | ] 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "metadata": {}, 197 | "source": [ 198 | "## Exercise 3 (pymatgen)" 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "metadata": {}, 204 | "source": [ 205 | "This interactive exercise will explore the use of the OPTIMADE client implemented in the `pymatgen` Python library. This exercise can be found in this repository under `./notebooks/demonstration-pymatgen.ipynb` or accessed online in [Google Colab](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/demonstration-pymatgen-for-optimade-queries.ipynb) (or equivalent notebook runners, such as [Binder](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fdemonstration-pymatgen-for-optimade-queries.ipynb)).\n", 206 | "\n", 207 | "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/demonstration-pymatgen-for-optimade-queries.ipynb)\n", 208 | "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fdemonstration-pymatgen-for-optimade-queries.ipynb)" 209 | ] 210 | }, 211 | { 212 | "cell_type": "markdown", 213 | "metadata": {}, 214 | "source": [ 215 | "## Exercise 4" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "\n", 223 | "There are many useful properties that the OPTIMADE specification has not standardized.\n", 224 | "This is typically because the use of the property requires additional context, e.g., reporting a \"band gap\" without describing how it was calculated or measured, or properties that are only meaningful in the context of a database, e.g., relative energies that depend on other reference calculations.\n", 225 | "For this reason, the OPTIMADE specification allows implementations to serve their own fields with an appropriate \"provider prefix\" to the field name, and a description at the `/info/structures` endpoint. \n", 226 | "\n", 227 | "One computed property that is key to many high-throughput studies is the *chemical stability* ($\\delta$) of a crystal structure, i.e. whether the structure is predicted to spontaneously decompose into a different phase (or phases).\n", 228 | "This is typically computed as the distance from the convex hull in composition-energy space, with a value of 0 (or <0, if the target structure was not used to compute the hull itself) indicating a stable structure.\n", 229 | "\n", 230 | "- Interrogate the `/info/structures` endpoints of the OPTIMADE implementations that serve DFT data (e.g., Materials Project, AFLOW, OQMD, etc.) and identify those that serve a field that could correspond to hull distance, or other stability metrics.\n", 231 | "- Construct a filter that allows you to screen a database for metastable materials (i.e., $0 < \\delta < 25\\text{ meV/atom}$) according to this metric.\n", 232 | "- Try to create a filter that can be applied to multiple databases simultaneously (e.g., apply `?filter=_databaseA_hull_distance < 25 OR _databaseB_stability < 25`). What happens when you run this filter against a database that does not contain the field?" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "## Exercise 5" 240 | ] 241 | }, 242 | { 243 | "cell_type": "markdown", 244 | "metadata": {}, 245 | "source": [ 246 | "As a final general exercise, consider your own research problems and how you might use OPTIMADE.\n", 247 | "If you have any suggestions or feedback about how OPTIMADE can be made more useful for you, please start a discussion on the [OPTIMADE MatSci forum](https://matsci.org/c/optimade/29) or raise an issue at the appropriate [Materials-Consortia GitHub](https://github.com/Materials-Consortia/) repository.\n", 248 | "\n", 249 | "Some potential prompts:\n", 250 | "\n", 251 | "- What additional fields or entry types should OPTIMADE standardize to be most useful to you?\n", 252 | "- How could the existing tools be improved, or what new tools could be created to make OPTIMADE easier to use?\n", 253 | "- What features from other APIs/databases that you use could be adopted within OPTIMADE? " 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "## Exercise 6 (AFLOW)" 261 | ] 262 | }, 263 | { 264 | "cell_type": "markdown", 265 | "metadata": {}, 266 | "source": [ 267 | "The AFLOW database is primarily built by decorating crystallographic prototypes, and a list of the most common prototypes can be found in the [Library of Crystallographic Prototypes](https://aflow.org/prototype-encyclopedia/).\n", 268 | "The prototype labels can also be used to search the database for entries \n", 269 | "with relaxed structures matching a particular prototype, using the AFLOW\n", 270 | "keyword `aflow_prototype_label_relax`; a full list of AFLOW keywords can be\n", 271 | "found at AFLOW's `/info/structures` endpoint (http://aflow.org/API/optimade/v1.0/info/structures). \n", 272 | "Searches can be performed for prototype labels using OPTIMADE by appending the `_aflow_` prefix to the keyword: `_aflow_aflow_prototype_label_relax`.\n", 273 | "\n", 274 | "- Use OPTIMADE to search AFLOW for NaCl in the rock salt structure (prototype label `AB_cF8_225_a_b`)\n", 275 | "- Use OPTIMADE to search AFLOW for lead-free halide cubic perovskites with a band gap greater than 3 eV: (cubic perovskite prototype label is `AB3C_cP5_221_a_c_b`)" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "metadata": {}, 281 | "source": [ 282 | "## Exercise 7 (OQMD)" 283 | ] 284 | }, 285 | { 286 | "cell_type": "markdown", 287 | "metadata": {}, 288 | "source": [ 289 | "This interactive exercise explores the OQMD's OPTIMADE API, and demonstrates how you can train \n", 290 | "machine learning models on OPTIMADE data. The notebook is available at `./notebooks/exercise7-oqmd-optimade-tutorial` and can also be accessed online with [Colab](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise7-oqmd-optimade-tutorial.ipynb) or [Binder](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks/exercise7-oqmd-optimade-tutorial.ipynb) (buttons below).\n", 291 | "\n", 292 | "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise7-oqmd-optimade-tutorial.ipynb)\n", 293 | "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks/exercise7-oqmd-optimade-tutorial.ipynb)\n" 294 | ] 295 | }, 296 | { 297 | "cell_type": "markdown", 298 | "metadata": {}, 299 | "source": [ 300 | "## Exercise 8 (optimade-python-tools)\n", 301 | "\n", 302 | "This example explores the use of optimade-python-tools for querying and serving OPTIMADE data. The notebook is available at `./notebooks/exercise8-optimade-python-tools` and can be accessed online with Colab or Biner (buttons below).\n", 303 | "\n", 304 | "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise8-optimade-python-tools.ipynb)\n", 305 | "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks/exercise8-optimade-python-tools.ipynb)" 306 | ] 307 | }, 308 | { 309 | "cell_type": "markdown", 310 | "metadata": {}, 311 | "source": [ 312 | "# Appendix\n", 313 | "\n", 314 | "## Example Python code\n", 315 | "\n", 316 | "You may find the following Python code snippets useful in the above exercises. This document can be opened as a Jupyter notebook using the Colab or Binder buttons above, or by downloading the notebook from the GitHub repository." 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": 1, 322 | "metadata": {}, 323 | "outputs": [], 324 | "source": [ 325 | "# Construct a query URL.\n", 326 | "#\n", 327 | "# You should be able to use any valid OPTIMADE implementation's\n", 328 | "# database URL with any valid query\n", 329 | "#\n", 330 | "# Lets choose a random provider for now:\n", 331 | "import random\n", 332 | "some_optimade_base_urls = [\n", 333 | " \"https://optimade.materialsproject.org\", \n", 334 | " \"http://crystallography.net/cod/optimade\", \n", 335 | " \"https://nomad-lab.eu/prod/rae/optimade/\"\n", 336 | "]\n", 337 | "database_url = random.choice(some_optimade_base_urls)\n", 338 | "\n", 339 | "query = 'elements HAS ANY \"C\", \"Si\", \"Ge\", \"Sn\", \"Pb\"'\n", 340 | "params = {\n", 341 | " \"filter\": query,\n", 342 | " \"page_limit\": 3\n", 343 | "}\n", 344 | "\n", 345 | "query_url = f\"{database_url}/v1/structures\"" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": null, 351 | "metadata": {}, 352 | "outputs": [], 353 | "source": [ 354 | "# Using the third-party requests library:\n", 355 | "!pip install requests" 356 | ] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "execution_count": null, 361 | "metadata": {}, 362 | "outputs": [], 363 | "source": [ 364 | "# Import the requests library and make the query\n", 365 | "import requests\n", 366 | "response = requests.get(query_url, params=params)\n", 367 | "print(response)\n", 368 | "json_response = response.json()" 369 | ] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "execution_count": null, 374 | "metadata": {}, 375 | "outputs": [], 376 | "source": [ 377 | "# Explore the first page of results\n", 378 | "import pprint\n", 379 | "print(json_response.keys())\n", 380 | "structures = json_response[\"data\"]\n", 381 | "meta = json_response[\"meta\"]\n", 382 | "\n", 383 | "print(f\"Query {query_url} returned {meta['data_returned']} structures\")\n", 384 | "\n", 385 | "print(\"First structure:\")\n", 386 | "pprint.pprint(structures[0])" 387 | ] 388 | }, 389 | { 390 | "cell_type": "code", 391 | "execution_count": null, 392 | "metadata": {}, 393 | "outputs": [], 394 | "source": [ 395 | "# Using pagination to loop multiple requests\n", 396 | "# We want to add additional page_limit and page_offset parameters to the query\n", 397 | "offset = 0\n", 398 | "page_limit = 10\n", 399 | "while True:\n", 400 | " params = {\n", 401 | " \"filter\": query,\n", 402 | " \"page_limit\": page_limit,\n", 403 | " \"page_offset\": offset\n", 404 | " }\n", 405 | "\n", 406 | " response = requests.get(query_url, params=params).json()\n", 407 | "\n", 408 | " # Print the IDs in the response\n", 409 | " for result in response[\"data\"]:\n", 410 | " print(result[\"id\"])\n", 411 | " \n", 412 | " offset += page_limit\n", 413 | " if response[\"meta\"][\"data_returned\"] < offset:\n", 414 | " break\n", 415 | " \n", 416 | " if offset > 100:\n", 417 | " break" 418 | ] 419 | } 420 | ], 421 | "metadata": { 422 | "kernelspec": { 423 | "display_name": "Python 3 (ipykernel)", 424 | "language": "python", 425 | "name": "python3" 426 | }, 427 | "language_info": { 428 | "codemirror_mode": { 429 | "name": "ipython", 430 | "version": 3 431 | }, 432 | "file_extension": ".py", 433 | "mimetype": "text/x-python", 434 | "name": "python", 435 | "nbconvert_exporter": "python", 436 | "pygments_lexer": "ipython3", 437 | "version": "3.9.16" 438 | }, 439 | "vscode": { 440 | "interpreter": { 441 | "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 442 | } 443 | } 444 | }, 445 | "nbformat": 4, 446 | "nbformat_minor": 4 447 | } 448 | -------------------------------------------------------------------------------- /notebooks/oqmd_exercise_data/target_properties.csv: -------------------------------------------------------------------------------- 1 | filename, _oqmd_band_gap 2 | ID-4066011_OQMD-EnID-4794.poscar,2.332 3 | ID-4066101_OQMD-EnID-5060.poscar,0.43 4 | ID-4066203_OQMD-EnID-3022.poscar,3.737 5 | ID-4066218_OQMD-EnID-3023.poscar,3.704 6 | ID-4066422_OQMD-EnID-5305.poscar,3.691 7 | ID-4066446_OQMD-EnID-5088.poscar,1.787 8 | ID-4066752_OQMD-EnID-16688.poscar,2.983 9 | ID-4066863_OQMD-EnID-5833.poscar,0.376 10 | ID-4066872_OQMD-EnID-3025.poscar,3.856 11 | ID-4066878_OQMD-EnID-3026.poscar,3.737 12 | ID-4066884_OQMD-EnID-3028.poscar,3.746 13 | ID-4066995_OQMD-EnID-13306.poscar,2.457 14 | ID-4067067_OQMD-EnID-22805.poscar,1.92 15 | ID-4067268_OQMD-EnID-23340.poscar,2.42 16 | ID-4068234_OQMD-EnID-13429.poscar,0.667 17 | ID-4068411_OQMD-EnID-5699.poscar,1.547 18 | ID-4068549_OQMD-EnID-4772.poscar,0.846 19 | ID-4068765_OQMD-EnID-4619.poscar,0.974 20 | ID-4068864_OQMD-EnID-6278.poscar,1.151 21 | ID-4069083_OQMD-EnID-20905.poscar,2.394 22 | ID-4069152_OQMD-EnID-12126.poscar,1.286 23 | ID-4069428_OQMD-EnID-6277.poscar,1.249 24 | ID-4069536_OQMD-EnID-13475.poscar,0.632 25 | ID-4069587_OQMD-EnID-6441.poscar,4.612 26 | ID-4069851_OQMD-EnID-12776.poscar,4.067 27 | ID-4069947_OQMD-EnID-4364.poscar,1.806 28 | ID-4070010_OQMD-EnID-11567.poscar,2.587 29 | ID-4070403_OQMD-EnID-5331.poscar,2.267 30 | ID-4070436_OQMD-EnID-13400.poscar,3.761 31 | ID-4070556_OQMD-EnID-13401.poscar,4.077 32 | ID-4070622_OQMD-EnID-3756.poscar,1.239 33 | ID-4070811_OQMD-EnID-5204.poscar,4.274 34 | ID-4071063_OQMD-EnID-14248.poscar,0.658 35 | ID-4071168_OQMD-EnID-30894.poscar,3.34 36 | ID-4071558_OQMD-EnID-3696.poscar,3.16 37 | ID-4071615_OQMD-EnID-5203.poscar,3.962 38 | ID-4071837_OQMD-EnID-3699.poscar,3.123 39 | ID-4071885_OQMD-EnID-4050.poscar,2.939 40 | ID-4071915_OQMD-EnID-3698.poscar,3.097 41 | ID-4071996_OQMD-EnID-3697.poscar,3.158 42 | ID-4072059_OQMD-EnID-3112.poscar,4.402 43 | ID-4072173_OQMD-EnID-12124.poscar,2.823 44 | ID-4072587_OQMD-EnID-4773.poscar,2.297 45 | ID-4072626_OQMD-EnID-6314.poscar,3.518 46 | ID-4072677_OQMD-EnID-5206.poscar,2.221 47 | ID-4072707_OQMD-EnID-21705.poscar,3.516 48 | ID-4072812_OQMD-EnID-6074.poscar,4.281 49 | ID-4072830_OQMD-EnID-6075.poscar,1.944 50 | ID-4072842_OQMD-EnID-22741.poscar,4.637 51 | ID-4072848_OQMD-EnID-6076.poscar,2.13 52 | ID-4072953_OQMD-EnID-3292.poscar,1.552 53 | ID-4072977_OQMD-EnID-2027.poscar,1.471 54 | ID-4073124_OQMD-EnID-3597.poscar,7.339 55 | ID-4073220_OQMD-EnID-5357.poscar,4.575 56 | ID-4073385_OQMD-EnID-6839.poscar,1.558 57 | ID-4073703_OQMD-EnID-7412.poscar,4.477 58 | ID-4074156_OQMD-EnID-7411.poscar,3.785 59 | ID-4074240_OQMD-EnID-22549.poscar,3.693 60 | ID-4074654_OQMD-EnID-5164.poscar,4.566 61 | ID-4074723_OQMD-EnID-16449.poscar,4.78 62 | ID-4074882_OQMD-EnID-7233.poscar,4.177 63 | ID-4074897_OQMD-EnID-5397.poscar,5.932 64 | ID-4074957_OQMD-EnID-4670.poscar,2.323 65 | ID-4075050_OQMD-EnID-16987.poscar,2.857 66 | ID-4075071_OQMD-EnID-2635.poscar,0.385000000000001 67 | ID-4075182_OQMD-EnID-12899.poscar,4.686 68 | ID-4075395_OQMD-EnID-5209.poscar,1.351 69 | ID-4075740_OQMD-EnID-22563.poscar,1.479 70 | ID-4075812_OQMD-EnID-11397.poscar,3.881 71 | ID-4075932_OQMD-EnID-4484.poscar,4.565 72 | ID-4076181_OQMD-EnID-4515.poscar,2.149 73 | ID-4076199_OQMD-EnID-6294.poscar,0.322000000000001 74 | ID-4076289_OQMD-EnID-4514.poscar,2.496 75 | ID-4076616_OQMD-EnID-5692.poscar,2.664 76 | ID-4076742_OQMD-EnID-14766.poscar,4.743 77 | ID-4076823_OQMD-EnID-24065.poscar,4.493 78 | ID-4077147_OQMD-EnID-12493.poscar,1.196 79 | ID-4077345_OQMD-EnID-12442.poscar,1.391 80 | ID-4077360_OQMD-EnID-11332.poscar,4.476 81 | ID-4077375_OQMD-EnID-24767.poscar,1.041 82 | ID-4078179_OQMD-EnID-12441.poscar,1.393 83 | ID-4078251_OQMD-EnID-12238.poscar,2.442 84 | ID-4078338_OQMD-EnID-6057.poscar,4.974 85 | ID-4078362_OQMD-EnID-3812.poscar,3.149 86 | ID-4078395_OQMD-EnID-26187.poscar,0.993 87 | ID-4078509_OQMD-EnID-7156.poscar,3.04 88 | ID-4078560_OQMD-EnID-3454.poscar,1.118 89 | ID-4078584_OQMD-EnID-5243.poscar,1.602 90 | ID-4078683_OQMD-EnID-5620.poscar,5.186 91 | ID-4078908_OQMD-EnID-11524.poscar,4.174 92 | ID-4079061_OQMD-EnID-2513.poscar,0.463 93 | ID-4079289_OQMD-EnID-5504.poscar,4.637 94 | ID-4079343_OQMD-EnID-1747.poscar,4.312 95 | ID-4079427_OQMD-EnID-11523.poscar,3.595 96 | ID-4079739_OQMD-EnID-16451.poscar,1.325 97 | ID-4079865_OQMD-EnID-1883.poscar,3.752 98 | ID-4080000_OQMD-EnID-22025.poscar,1.155 99 | ID-4080156_OQMD-EnID-12160.poscar,1.056 100 | ID-4080183_OQMD-EnID-7323.poscar,2.184 101 | ID-4080306_OQMD-EnID-2982.poscar,1.347 102 | ID-4080354_OQMD-EnID-16458.poscar,2.55 103 | ID-4080468_OQMD-EnID-4064.poscar,4.132 104 | ID-4080552_OQMD-EnID-2983.poscar,1.354 105 | ID-4080606_OQMD-EnID-6005.poscar,3.724 106 | ID-4080645_OQMD-EnID-11096.poscar,2.54 107 | ID-4080660_OQMD-EnID-16454.poscar,2.302 108 | ID-4080690_OQMD-EnID-2364.poscar,1.45 109 | ID-4080696_OQMD-EnID-2365.poscar,1.836 110 | ID-4081050_OQMD-EnID-11367.poscar,2.921 111 | ID-4081137_OQMD-EnID-19007.poscar,3.208 112 | ID-4081161_OQMD-EnID-25355.poscar,2.081 113 | ID-4081227_OQMD-EnID-6614.poscar,3.121 114 | ID-4081263_OQMD-EnID-16456.poscar,0.432 115 | ID-4081545_OQMD-EnID-2332.poscar,4.409 116 | ID-4081569_OQMD-EnID-1866.poscar,0.875 117 | ID-4081638_OQMD-EnID-3941.poscar,2.967 118 | ID-4081734_OQMD-EnID-2998.poscar,1.568 119 | ID-4081821_OQMD-EnID-24854.poscar,2.426 120 | ID-4081830_OQMD-EnID-3940.poscar,2.931 121 | ID-4081902_OQMD-EnID-24867.poscar,2.208 122 | ID-4081929_OQMD-EnID-25035.poscar,1.157 123 | ID-4081935_OQMD-EnID-5311.poscar,3.015 124 | ID-4082199_OQMD-EnID-15535.poscar,4.163 125 | ID-4082397_OQMD-EnID-3289.poscar,4.048 126 | ID-4082658_OQMD-EnID-4361.poscar,1.183 127 | ID-4082742_OQMD-EnID-5205.poscar,5.233 128 | ID-4082769_OQMD-EnID-5414.poscar,1.027 129 | ID-4082790_OQMD-EnID-5461.poscar,2.36 130 | ID-4082793_OQMD-EnID-5468.poscar,2.461 131 | ID-4082898_OQMD-EnID-6345.poscar,0.637 132 | ID-4082901_OQMD-EnID-6422.poscar,1.101 133 | ID-4083456_OQMD-EnID-14507.poscar,2.715 134 | ID-4083477_OQMD-EnID-13345.poscar,3.094 135 | ID-4083552_OQMD-EnID-25362.poscar,1.164 136 | ID-4083558_OQMD-EnID-24195.poscar,2.343 137 | ID-4084116_OQMD-EnID-14604.poscar,2.314 138 | ID-4084143_OQMD-EnID-14509.poscar,1.918 139 | ID-4084206_OQMD-EnID-13346.poscar,3.248 140 | ID-4084302_OQMD-EnID-7158.poscar,3.912 141 | ID-4084644_OQMD-EnID-12381.poscar,0.484 142 | ID-4084944_OQMD-EnID-12711.poscar,1.758 143 | ID-4085190_OQMD-EnID-6053.poscar,1.543 144 | ID-4086018_OQMD-EnID-12313.poscar,1.052 145 | ID-4086246_OQMD-EnID-12912.poscar,0.318 146 | ID-4086255_OQMD-EnID-13123.poscar,1.125 147 | ID-4086258_OQMD-EnID-13132.poscar,2.078 148 | ID-4086564_OQMD-EnID-14269.poscar,3.557 149 | ID-4086567_OQMD-EnID-14289.poscar,3.294 150 | ID-4086615_OQMD-EnID-14508.poscar,2.359 151 | ID-4086690_OQMD-EnID-14899.poscar,2.246 152 | ID-4086888_OQMD-EnID-15706.poscar,1.375 153 | ID-4086951_OQMD-EnID-16055.poscar,1.015 154 | ID-4087026_OQMD-EnID-16333.poscar,1.775 155 | ID-4087449_OQMD-EnID-20005.poscar,3.48 156 | ID-4087545_OQMD-EnID-20536.poscar,5.996 157 | ID-4088400_OQMD-EnID-22675.poscar,2.051 158 | ID-4088574_OQMD-EnID-25470.poscar,3.503 159 | ID-4088640_OQMD-EnID-6448.poscar,4.306 160 | ID-4088724_OQMD-EnID-26111.poscar,0.201 161 | ID-4089132_OQMD-EnID-3282.poscar,2.69 162 | ID-4089219_OQMD-EnID-5542.poscar,3.624 163 | ID-4089243_OQMD-EnID-5535.poscar,3.271 164 | ID-4089264_OQMD-EnID-6121.poscar,1.586 165 | ID-4089387_OQMD-EnID-6713.poscar,0.872 166 | ID-4089540_OQMD-EnID-6312.poscar,3.222 167 | ID-4089546_OQMD-EnID-26295.poscar,1.041 168 | ID-4089612_OQMD-EnID-8395.poscar,2.199 169 | ID-4089729_OQMD-EnID-6073.poscar,4.59 170 | ID-4089738_OQMD-EnID-6079.poscar,4.89 171 | ID-4089777_OQMD-EnID-6681.poscar,3.123 172 | ID-4089852_OQMD-EnID-11402.poscar,2.777 173 | ID-4089981_OQMD-EnID-3913.poscar,3.42 174 | ID-4089987_OQMD-EnID-11742.poscar,3.916 175 | ID-4089993_OQMD-EnID-13541.poscar,3.162 176 | ID-4090032_OQMD-EnID-13476.poscar,2.916 177 | ID-4090083_OQMD-EnID-11410.poscar,3.575 178 | ID-4090206_OQMD-EnID-5489.poscar,3.459 179 | ID-4090290_OQMD-EnID-14112.poscar,1.497 180 | ID-4090359_OQMD-EnID-4125.poscar,3.327 181 | ID-4090416_OQMD-EnID-13943.poscar,2.398 182 | ID-4090647_OQMD-EnID-19530.poscar,0.37 183 | ID-4090860_OQMD-EnID-14798.poscar,1.787 184 | ID-4091004_OQMD-EnID-25361.poscar,1.492 185 | ID-4091262_OQMD-EnID-24368.poscar,2.074 186 | ID-4091295_OQMD-EnID-24596.poscar,3.103 187 | ID-4091370_OQMD-EnID-25133.poscar,3.477 188 | ID-4091385_OQMD-EnID-26843.poscar,0.609 189 | ID-4091607_OQMD-EnID-25412.poscar,1.828 190 | ID-4091631_OQMD-EnID-24769.poscar,0.557 191 | ID-4091634_OQMD-EnID-1837.poscar,2.086 192 | ID-4091883_OQMD-EnID-26494.poscar,1.016 193 | ID-4092261_OQMD-EnID-2318.poscar,3.119 194 | ID-4092375_OQMD-EnID-26178.poscar,3.08 195 | ID-4092450_OQMD-EnID-7052.poscar,1.133 196 | ID-4092483_OQMD-EnID-3790.poscar,2.318 197 | ID-4092849_OQMD-EnID-5700.poscar,0.956 198 | ID-4093047_OQMD-EnID-6078.poscar,4.718 199 | ID-4093095_OQMD-EnID-1723.poscar,1.845 200 | ID-4093113_OQMD-EnID-4462.poscar,4.55 201 | ID-4093278_OQMD-EnID-3862.poscar,3.488 202 | ID-4093293_OQMD-EnID-13446.poscar,3.07 203 | ID-4093416_OQMD-EnID-4598.poscar,1.304 204 | ID-4093776_OQMD-EnID-24868.poscar,1.879 205 | ID-4093785_OQMD-EnID-2984.poscar,1.24 206 | ID-4093848_OQMD-EnID-22871.poscar,3.378 207 | ID-4093899_OQMD-EnID-22872.poscar,1.763 208 | ID-4094010_OQMD-EnID-25354.poscar,2.766 209 | ID-4094226_OQMD-EnID-1957.poscar,1.324 210 | ID-4094292_OQMD-EnID-5756.poscar,2.692 211 | ID-4094439_OQMD-EnID-6254.poscar,4.123 212 | ID-4094583_OQMD-EnID-1770.poscar,5.474 213 | ID-4094601_OQMD-EnID-2019.poscar,6.327 214 | ID-4094607_OQMD-EnID-1715.poscar,1.77 215 | ID-4094634_OQMD-EnID-1815.poscar,1.798 216 | ID-4094661_OQMD-EnID-2504.poscar,3.233 217 | ID-4094664_OQMD-EnID-2505.poscar,3.167 218 | ID-4094667_OQMD-EnID-1896.poscar,1.681 219 | ID-4094670_OQMD-EnID-2506.poscar,3.196 220 | ID-4094688_OQMD-EnID-2210.poscar,3.883 221 | ID-4094697_OQMD-EnID-2225.poscar,2.173 222 | ID-4094742_OQMD-EnID-2530.poscar,0.814 223 | ID-4094766_OQMD-EnID-3158.poscar,3.091 224 | ID-4094772_OQMD-EnID-2989.poscar,1.429 225 | ID-4094775_OQMD-EnID-3164.poscar,3.236 226 | ID-4094814_OQMD-EnID-3117.poscar,2.91 227 | ID-4094817_OQMD-EnID-3159.poscar,3.111 228 | ID-4094823_OQMD-EnID-3466.poscar,3.934 229 | ID-4094841_OQMD-EnID-3537.poscar,3.501 230 | ID-4094844_OQMD-EnID-3503.poscar,1.047 231 | ID-4094859_OQMD-EnID-3160.poscar,3.164 232 | ID-4094868_OQMD-EnID-3163.poscar,3.194 233 | ID-4094886_OQMD-EnID-3707.poscar,1.996 234 | ID-4094892_OQMD-EnID-3405.poscar,4.013 235 | ID-4094895_OQMD-EnID-3630.poscar,1.299 236 | ID-4094904_OQMD-EnID-3165.poscar,3.387 237 | ID-4094907_OQMD-EnID-3175.poscar,6.248 238 | ID-4094913_OQMD-EnID-3176.poscar,3.164 239 | ID-4094922_OQMD-EnID-3708.poscar,2.531 240 | ID-4094925_OQMD-EnID-3709.poscar,2.286 241 | ID-4094928_OQMD-EnID-3907.poscar,3.549 242 | ID-4094949_OQMD-EnID-3514.poscar,4.987 243 | ID-4094964_OQMD-EnID-3860.poscar,1.841 244 | ID-4094973_OQMD-EnID-3549.poscar,5.172 245 | ID-4095021_OQMD-EnID-3905.poscar,3.582 246 | ID-4095024_OQMD-EnID-3927.poscar,2.925 247 | ID-4095111_OQMD-EnID-4439.poscar,3.84 248 | ID-4095120_OQMD-EnID-4529.poscar,4.743 249 | ID-4095165_OQMD-EnID-4654.poscar,6.228 250 | ID-4095168_OQMD-EnID-4653.poscar,4.258 251 | ID-4095222_OQMD-EnID-5191.poscar,2.473 252 | ID-4095225_OQMD-EnID-5192.poscar,0.223 253 | ID-4095243_OQMD-EnID-5510.poscar,1.715 254 | ID-4095258_OQMD-EnID-5000.poscar,6.165 255 | ID-4095357_OQMD-EnID-5349.poscar,1.728 256 | ID-4095387_OQMD-EnID-5797.poscar,2.378 257 | ID-4095390_OQMD-EnID-6370.poscar,4.163 258 | ID-4095414_OQMD-EnID-5091.poscar,5.908 259 | ID-4095417_OQMD-EnID-5125.poscar,2.501 260 | ID-4095465_OQMD-EnID-6670.poscar,6.31 261 | ID-4095477_OQMD-EnID-7006.poscar,2.484 262 | ID-4095480_OQMD-EnID-5991.poscar,5.601 263 | ID-4095513_OQMD-EnID-6519.poscar,5.303 264 | ID-4095516_OQMD-EnID-6522.poscar,1.375 265 | ID-4095522_OQMD-EnID-6597.poscar,2.977 266 | ID-4095534_OQMD-EnID-7202.poscar,2.021 267 | ID-4095537_OQMD-EnID-6898.poscar,1.73 268 | ID-4095582_OQMD-EnID-6776.poscar,1.796 269 | ID-4095585_OQMD-EnID-6856.poscar,4.117 270 | ID-4095591_OQMD-EnID-7200.poscar,1.59 271 | ID-4095678_OQMD-EnID-6635.poscar,6.23 272 | ID-4095681_OQMD-EnID-6636.poscar,6.341 273 | ID-4095759_OQMD-EnID-7007.poscar,2.365 274 | ID-4095837_OQMD-EnID-7963.poscar,1.436 275 | ID-4095993_OQMD-EnID-11050.poscar,3.561 276 | ID-4096074_OQMD-EnID-2789.poscar,0.847 277 | ID-4096173_OQMD-EnID-11912.poscar,4.085 278 | ID-4096191_OQMD-EnID-11330.poscar,3.353 279 | ID-4096215_OQMD-EnID-11579.poscar,1.569 280 | ID-4096248_OQMD-EnID-11616.poscar,4.167 281 | ID-4096281_OQMD-EnID-675524.poscar,5.708 282 | ID-4096341_OQMD-EnID-31814.poscar,2.865 283 | ID-4097217_OQMD-EnID-17002.poscar,3.815 284 | ID-4097283_OQMD-EnID-19687.poscar,1.48 285 | ID-4097298_OQMD-EnID-4965.poscar,3.527 286 | ID-4097316_OQMD-EnID-3753.poscar,4.299 287 | ID-4097439_OQMD-EnID-2692.poscar,6.331 288 | ID-4097442_OQMD-EnID-3724.poscar,3.53 289 | ID-4097616_OQMD-EnID-13622.poscar,4.454 290 | ID-4097628_OQMD-EnID-3483.poscar,5.986 291 | ID-4097634_OQMD-EnID-4027.poscar,4.828 292 | ID-4097694_OQMD-EnID-13523.poscar,4.552 293 | ID-4097703_OQMD-EnID-16772.poscar,5.195 294 | ID-4097724_OQMD-EnID-2168.poscar,3.006 295 | ID-4097730_OQMD-EnID-11577.poscar,3.976 296 | ID-4097742_OQMD-EnID-1917.poscar,1.727 297 | ID-4100070_OQMD-EnID-14894.poscar,3.596 298 | ID-4100073_OQMD-EnID-5388.poscar,4.902 299 | ID-4100133_OQMD-EnID-3636.poscar,4.531 300 | ID-4100136_OQMD-EnID-3088.poscar,5.638 301 | ID-4100298_OQMD-EnID-7226.poscar,2.634 302 | ID-4100337_OQMD-EnID-4513.poscar,2.52 303 | ID-4100595_OQMD-EnID-4033.poscar,2.065 304 | ID-4100601_OQMD-EnID-1733.poscar,3.592 305 | ID-4100625_OQMD-EnID-3535.poscar,1.978 306 | ID-4100742_OQMD-EnID-15840.poscar,1.497 307 | ID-4100826_OQMD-EnID-2467.poscar,5.621 308 | ID-4100829_OQMD-EnID-2996.poscar,1.921 309 | ID-4100832_OQMD-EnID-11919.poscar,4.719 310 | ID-4100841_OQMD-EnID-1936.poscar,2.71 311 | ID-4100886_OQMD-EnID-5785.poscar,4.018 312 | ID-4100910_OQMD-EnID-19006.poscar,1.595 313 | ID-4100913_OQMD-EnID-2214.poscar,6.548 314 | ID-4102290_OQMD-EnID-22580.poscar,3.154 315 | ID-4102467_OQMD-EnID-16346.poscar,4.249 316 | ID-4102569_OQMD-EnID-3080.poscar,5.207 317 | ID-4102641_OQMD-EnID-5003.poscar,3.223 318 | ID-4102668_OQMD-EnID-14809.poscar,0.775 319 | ID-4102773_OQMD-EnID-4376.poscar,2.582 320 | ID-4102785_OQMD-EnID-6328.poscar,3.003 321 | ID-4103307_OQMD-EnID-7172.poscar,6.036 322 | ID-4103415_OQMD-EnID-3352.poscar,1.947 323 | ID-4103436_OQMD-EnID-6846.poscar,4.089 324 | ID-4103442_OQMD-EnID-5901.poscar,2.996 325 | ID-4103445_OQMD-EnID-3633.poscar,4.112 326 | ID-4103460_OQMD-EnID-7220.poscar,2.32 327 | ID-4103493_OQMD-EnID-12010.poscar,3.726 328 | ID-4103544_OQMD-EnID-12492.poscar,1.696 329 | ID-4103622_OQMD-EnID-24100.poscar,5.578 330 | ID-4103718_OQMD-EnID-12993.poscar,3.845 331 | ID-4103958_OQMD-EnID-14086.poscar,3.151 332 | ID-4104009_OQMD-EnID-14343.poscar,0.987 333 | ID-4104045_OQMD-EnID-14396.poscar,6.327 334 | ID-4104240_OQMD-EnID-14874.poscar,1.77 335 | ID-4104294_OQMD-EnID-14875.poscar,1.765 336 | ID-4104300_OQMD-EnID-15116.poscar,0.798 337 | ID-4104348_OQMD-EnID-17021.poscar,3.432 338 | ID-4104396_OQMD-EnID-16979.poscar,3.543 339 | ID-4104507_OQMD-EnID-17027.poscar,2.72 340 | ID-4104588_OQMD-EnID-16262.poscar,0.244 341 | ID-4104714_OQMD-EnID-19057.poscar,3.519 342 | ID-4104717_OQMD-EnID-19059.poscar,3.555 343 | ID-4104723_OQMD-EnID-19069.poscar,4.373 344 | ID-4104795_OQMD-EnID-19060.poscar,3.689 345 | ID-4104810_OQMD-EnID-19066.poscar,4.289 346 | ID-4104912_OQMD-EnID-19977.poscar,4.044 347 | ID-4104915_OQMD-EnID-19978.poscar,3.821 348 | ID-4104981_OQMD-EnID-19714.poscar,4.135 349 | ID-4105170_OQMD-EnID-22749.poscar,4.35 350 | ID-4105173_OQMD-EnID-22751.poscar,4.364 351 | ID-4105350_OQMD-EnID-24276.poscar,0.707 352 | ID-4105377_OQMD-EnID-22680.poscar,2.817 353 | ID-4105509_OQMD-EnID-23453.poscar,0.399 354 | ID-4105611_OQMD-EnID-24135.poscar,2.087 355 | ID-4105620_OQMD-EnID-24318.poscar,1.502 356 | ID-4105896_OQMD-EnID-25037.poscar,1.576 357 | ID-4105917_OQMD-EnID-25308.poscar,3.347 358 | ID-4105968_OQMD-EnID-26190.poscar,1.432 359 | ID-4106145_OQMD-EnID-26083.poscar,4.126 360 | ID-4106241_OQMD-EnID-26095.poscar,4.13 361 | ID-4106253_OQMD-EnID-26686.poscar,2.06 362 | ID-4106259_OQMD-EnID-27167.poscar,3.49 363 | ID-4107060_OQMD-EnID-23744.poscar,2.693 364 | ID-4107588_OQMD-EnID-25417.poscar,1.902 365 | ID-4118301_OQMD-EnID-3703.poscar,5.455 366 | ID-4118322_OQMD-EnID-1793.poscar,0.462 367 | ID-4145193_OQMD-EnID-3641.poscar,1.266 368 | ID-4145205_OQMD-EnID-13148.poscar,3.818 369 | ID-4145220_OQMD-EnID-13016.poscar,2.559 370 | ID-4163055_OQMD-EnID-22738.poscar,2.498 371 | ID-4163142_OQMD-EnID-16400.poscar,4.821 372 | ID-4163193_OQMD-EnID-11967.poscar,1.086 373 | ID-4163262_OQMD-EnID-23645.poscar,3.694 374 | ID-4163286_OQMD-EnID-26543.poscar,3.943 375 | ID-4163361_OQMD-EnID-22104.poscar,1.527 376 | ID-4163388_OQMD-EnID-22105.poscar,1.803 377 | ID-4163484_OQMD-EnID-24794.poscar,4.291 378 | ID-4163490_OQMD-EnID-26853.poscar,4.17 379 | ID-4163664_OQMD-EnID-6853.poscar,1.324 380 | ID-4163712_OQMD-EnID-7017.poscar,6.664 381 | ID-4176453_OQMD-EnID-1618.poscar,4.014 382 | ID-4185960_OQMD-EnID-1832.poscar,3.395 383 | ID-4187376_OQMD-EnID-20111.poscar,3.478 384 | ID-4191834_OQMD-EnID-4688.poscar,2.456 385 | ID-4193625_OQMD-EnID-2146.poscar,2.028 386 | ID-4195290_OQMD-EnID-22568.poscar,0.298999999999999 387 | ID-4196511_OQMD-EnID-6886.poscar,2.677 388 | ID-4196544_OQMD-EnID-4510.poscar,5.69 389 | ID-4198758_OQMD-EnID-23964.poscar,5.689 390 | ID-4199439_OQMD-EnID-2464.poscar,3.286 391 | ID-4200000_OQMD-EnID-5251.poscar,6.113 392 | ID-4200882_OQMD-EnID-6605.poscar,2.874 393 | ID-4201059_OQMD-EnID-18993.poscar,3.398 394 | ID-4207329_OQMD-EnID-2545.poscar,5.096 395 | ID-4208478_OQMD-EnID-4055.poscar,3.465 396 | ID-4212393_OQMD-EnID-8482.poscar,1.878 397 | ID-4218177_OQMD-EnID-24765.poscar,3.144 398 | ID-4219320_OQMD-EnID-2360.poscar,2.448 399 | ID-4219629_OQMD-EnID-11959.poscar,4.331 400 | ID-4225941_OQMD-EnID-16003.poscar,3.591 401 | ID-4246764_OQMD-EnID-15190.poscar,3.596 402 | ID-4274436_OQMD-EnID-350231.poscar,4.307 403 | ID-4279620_OQMD-EnID-350930.poscar,3.687 404 | ID-4283481_OQMD-EnID-351202.poscar,3.399 405 | ID-4283508_OQMD-EnID-4715.poscar,1.217 406 | ID-4284459_OQMD-EnID-351222.poscar,4.236 407 | ID-4292454_OQMD-EnID-352223.poscar,2.695 408 | ID-4293675_OQMD-EnID-352504.poscar,0.883 409 | ID-4377186_OQMD-EnID-2043.poscar,3.18 410 | ID-4378200_OQMD-EnID-1868.poscar,3.917 411 | ID-4378248_OQMD-EnID-18989.poscar,1.613 412 | ID-4378356_OQMD-EnID-3568.poscar,6.211 413 | ID-4387002_OQMD-EnID-3919.poscar,3.369 414 | ID-4388988_OQMD-EnID-11753.poscar,4.554 415 | ID-4403304_OQMD-EnID-2918.poscar,3.419 416 | ID-4413210_OQMD-EnID-3030.poscar,4.36 417 | ID-4434387_OQMD-EnID-2304.poscar,2.63 418 | ID-4444479_OQMD-EnID-5048.poscar,5.038 419 | ID-4444659_OQMD-EnID-3471.poscar,0.291 420 | ID-4444746_OQMD-EnID-13756.poscar,4.851 421 | ID-4463169_OQMD-EnID-6140.poscar,3.907 422 | ID-4464102_OQMD-EnID-4621.poscar,7.288 423 | ID-4465521_OQMD-EnID-27112.poscar,4.833 424 | ID-4466892_OQMD-EnID-16060.poscar,2.736 425 | ID-4467123_OQMD-EnID-18927.poscar,3.682 426 | ID-4467231_OQMD-EnID-21027.poscar,6.172 427 | ID-4467258_OQMD-EnID-7462.poscar,4.229 428 | ID-4467300_OQMD-EnID-12484.poscar,3.431 429 | ID-4467573_OQMD-EnID-17019.poscar,3.812 430 | ID-4467768_OQMD-EnID-23524.poscar,1.037 431 | ID-4467810_OQMD-EnID-6534.poscar,3.384 432 | ID-4467873_OQMD-EnID-25413.poscar,1.828 433 | ID-4468131_OQMD-EnID-4551.poscar,2.564 434 | ID-4468161_OQMD-EnID-6194.poscar,3.614 435 | ID-4468254_OQMD-EnID-2450.poscar,0.556 436 | ID-4468257_OQMD-EnID-2363.poscar,1.31 437 | ID-4468266_OQMD-EnID-1755.poscar,4.078 438 | ID-4468272_OQMD-EnID-1962.poscar,5.548 439 | ID-4468281_OQMD-EnID-2973.poscar,4.072 440 | ID-4468284_OQMD-EnID-2746.poscar,3.157 441 | ID-4468287_OQMD-EnID-2219.poscar,1.833 442 | ID-4468317_OQMD-EnID-3208.poscar,4.815 443 | ID-4468320_OQMD-EnID-3242.poscar,2.74 444 | ID-4468341_OQMD-EnID-4169.poscar,2.97 445 | ID-4468350_OQMD-EnID-3240.poscar,2.076 446 | ID-4468371_OQMD-EnID-3162.poscar,3.245 447 | ID-4468374_OQMD-EnID-4396.poscar,4.81 448 | ID-4468398_OQMD-EnID-5704.poscar,3.95 449 | ID-4468401_OQMD-EnID-5488.poscar,3.095 450 | ID-4468488_OQMD-EnID-19935.poscar,4.532 451 | ID-4468500_OQMD-EnID-7861.poscar,5.148 452 | ID-4497213_OQMD-EnID-15280.poscar,6.128 453 | ID-4500600_OQMD-EnID-1918.poscar,1.741 454 | ID-4500639_OQMD-EnID-2122.poscar,2.996 455 | ID-4500645_OQMD-EnID-3233.poscar,3.661 456 | ID-4500648_OQMD-EnID-2123.poscar,2.762 457 | ID-4500666_OQMD-EnID-3063.poscar,0.916 458 | ID-4500669_OQMD-EnID-2412.poscar,1.78 459 | ID-4500804_OQMD-EnID-2459.poscar,3.03 460 | ID-4500864_OQMD-EnID-3331.poscar,4.263 461 | ID-4500936_OQMD-EnID-3587.poscar,1.654 462 | ID-4500948_OQMD-EnID-5372.poscar,1.458 463 | ID-4500978_OQMD-EnID-2948.poscar,2.051 464 | ID-4501065_OQMD-EnID-5531.poscar,1.324 465 | ID-4501074_OQMD-EnID-4726.poscar,4.99 466 | ID-4501083_OQMD-EnID-3356.poscar,0.939 467 | ID-4501104_OQMD-EnID-5648.poscar,0.824 468 | ID-4501167_OQMD-EnID-5621.poscar,2.138 469 | ID-4501281_OQMD-EnID-2075.poscar,5.291 470 | ID-4502469_OQMD-EnID-6806.poscar,1.574 471 | ID-4502493_OQMD-EnID-7277.poscar,1.34 472 | ID-4502625_OQMD-EnID-7274.poscar,1.853 473 | ID-4502757_OQMD-EnID-8437.poscar,4.308 474 | ID-4502868_OQMD-EnID-9948.poscar,0.542 475 | ID-4504122_OQMD-EnID-4725.poscar,4.359 476 | ID-4504197_OQMD-EnID-6270.poscar,4.028 477 | ID-4504215_OQMD-EnID-12590.poscar,0.701 478 | ID-4504224_OQMD-EnID-11405.poscar,0.69 479 | ID-4504236_OQMD-EnID-7424.poscar,2.343 480 | ID-4504248_OQMD-EnID-12613.poscar,2.675 481 | ID-4504293_OQMD-EnID-13471.poscar,2.989 482 | ID-4504389_OQMD-EnID-13601.poscar,2.029 483 | ID-4504410_OQMD-EnID-13012.poscar,2.36 484 | ID-4504521_OQMD-EnID-4912.poscar,4.853 485 | ID-4504527_OQMD-EnID-4977.poscar,0.864 486 | ID-4504542_OQMD-EnID-5371.poscar,5.431 487 | ID-4504569_OQMD-EnID-13231.poscar,1.616 488 | ID-4504830_OQMD-EnID-15981.poscar,0.721 489 | ID-4504842_OQMD-EnID-14468.poscar,3.486 490 | ID-4504851_OQMD-EnID-14504.poscar,1.595 491 | ID-4504860_OQMD-EnID-14963.poscar,0.25 492 | ID-4504917_OQMD-EnID-14505.poscar,1.648 493 | ID-4504929_OQMD-EnID-14313.poscar,2.943 494 | ID-4504950_OQMD-EnID-14961.poscar,0.907 495 | ID-4504953_OQMD-EnID-14964.poscar,0.255 496 | ID-4504971_OQMD-EnID-15854.poscar,1.952 497 | ID-4505055_OQMD-EnID-14962.poscar,0.226 498 | ID-4505070_OQMD-EnID-14959.poscar,0.267 499 | ID-4505088_OQMD-EnID-14965.poscar,0.376 500 | ID-4505130_OQMD-EnID-14400.poscar,1.667 501 | ID-4505241_OQMD-EnID-14571.poscar,2.664 502 | ID-4505313_OQMD-EnID-19123.poscar,1.082 503 | ID-4505334_OQMD-EnID-17029.poscar,1.796 504 | ID-4505412_OQMD-EnID-19124.poscar,1.088 505 | ID-4505415_OQMD-EnID-20256.poscar,1.803 506 | ID-4505460_OQMD-EnID-21181.poscar,3.273 507 | ID-4505604_OQMD-EnID-22457.poscar,1.233 508 | ID-4505658_OQMD-EnID-22703.poscar,3.035 509 | ID-4505946_OQMD-EnID-24392.poscar,1.357 510 | ID-4505982_OQMD-EnID-25377.poscar,0.809 511 | ID-4506003_OQMD-EnID-24509.poscar,0.784 512 | ID-4506057_OQMD-EnID-25744.poscar,0.329 513 | ID-4506306_OQMD-EnID-28992.poscar,1.506 514 | ID-4506381_OQMD-EnID-26155.poscar,2.153 515 | ID-4507137_OQMD-EnID-2096.poscar,1.441 516 | ID-4507890_OQMD-EnID-14790.poscar,3.319 517 | ID-4508667_OQMD-EnID-6878.poscar,0.267 518 | ID-4508781_OQMD-EnID-12581.poscar,1.326 519 | ID-4508994_OQMD-EnID-12874.poscar,1.505 520 | ID-4509018_OQMD-EnID-7311.poscar,1.447 521 | ID-4725306_OQMD-EnID-2124.poscar,1.12 522 | ID-4725348_OQMD-EnID-2707.poscar,2.391 523 | ID-4725387_OQMD-EnID-2706.poscar,1.337 524 | ID-4781469_OQMD-EnID-1916.poscar,1.435 525 | ID-4781577_OQMD-EnID-4532.poscar,1.489 526 | ID-4781607_OQMD-EnID-4911.poscar,4.495 527 | ID-4781616_OQMD-EnID-2893.poscar,3.265 528 | ID-4781697_OQMD-EnID-1623.poscar,1.181 529 | ID-4781868_OQMD-EnID-5706.poscar,1.664 530 | ID-4781955_OQMD-EnID-6349.poscar,3.572 531 | ID-4782021_OQMD-EnID-11743.poscar,3.643 532 | ID-4782039_OQMD-EnID-6885.poscar,1.163 533 | ID-4782066_OQMD-EnID-5707.poscar,2.751 534 | ID-4782120_OQMD-EnID-7008.poscar,3.637 535 | ID-4782366_OQMD-EnID-13537.poscar,3.261 536 | ID-4782378_OQMD-EnID-16662.poscar,4.443 537 | ID-4782444_OQMD-EnID-14308.poscar,4.129 538 | ID-4782450_OQMD-EnID-14373.poscar,0.236 539 | ID-4782510_OQMD-EnID-14834.poscar,0.49 540 | ID-4782990_OQMD-EnID-25161.poscar,2.705 541 | ID-4783128_OQMD-EnID-24889.poscar,2.466 542 | ID-4783140_OQMD-EnID-25748.poscar,3.865 543 | ID-4783188_OQMD-EnID-26468.poscar,0.845 544 | ID-4783203_OQMD-EnID-26709.poscar,4.342 545 | ID-4783212_OQMD-EnID-21346.poscar,2.215 546 | ID-4783215_OQMD-EnID-25873.poscar,2.582 547 | ID-4783290_OQMD-EnID-25593.poscar,1.483 548 | ID-4783293_OQMD-EnID-26404.poscar,1.018 549 | ID-4784190_OQMD-EnID-15357.poscar,2.418 550 | ID-4784301_OQMD-EnID-6249.poscar,0.934 551 | ID-4784352_OQMD-EnID-15654.poscar,4.15 552 | ID-4784466_OQMD-EnID-6186.poscar,7.826 553 | ID-4784760_OQMD-EnID-23985.poscar,2.195 554 | ID-4784796_OQMD-EnID-25002.poscar,1.823 555 | ID-4784808_OQMD-EnID-25747.poscar,3.836 556 | ID-4784832_OQMD-EnID-24229.poscar,2.908 557 | ID-4785210_OQMD-EnID-2788.poscar,3.416 558 | ID-4785285_OQMD-EnID-19526.poscar,4.221 559 | ID-4785603_OQMD-EnID-4689.poscar,6.485 560 | ID-4785627_OQMD-EnID-2320.poscar,3.767 561 | ID-4785867_OQMD-EnID-25396.poscar,5.161 562 | ID-4786041_OQMD-EnID-25749.poscar,3.143 563 | ID-4786365_OQMD-EnID-2240.poscar,0.921 564 | ID-4786380_OQMD-EnID-3740.poscar,4.096 565 | ID-4786383_OQMD-EnID-4701.poscar,1.469 566 | ID-4786395_OQMD-EnID-4702.poscar,1.225 567 | ID-4786413_OQMD-EnID-5843.poscar,1.004 568 | ID-4786446_OQMD-EnID-6240.poscar,4.037 569 | ID-4786473_OQMD-EnID-1642.poscar,2.673 570 | ID-4786494_OQMD-EnID-5211.poscar,3.236 571 | ID-4786530_OQMD-EnID-7229.poscar,5.403 572 | ID-4786536_OQMD-EnID-7242.poscar,2.219 573 | ID-4786560_OQMD-EnID-7230.poscar,4.671 574 | ID-4786683_OQMD-EnID-22609.poscar,1.806 575 | ID-4786698_OQMD-EnID-20735.poscar,1.668 576 | ID-4786764_OQMD-EnID-22842.poscar,2.24 577 | ID-4786782_OQMD-EnID-22567.poscar,2.461 578 | ID-4786818_OQMD-EnID-24325.poscar,2.798 579 | ID-4786824_OQMD-EnID-23691.poscar,3.748 580 | ID-4786842_OQMD-EnID-6759.poscar,2.178 581 | ID-4786866_OQMD-EnID-13284.poscar,1.11 582 | ID-4786956_OQMD-EnID-24160.poscar,2.441 583 | ID-4787076_OQMD-EnID-25735.poscar,2.79 584 | ID-4787103_OQMD-EnID-16985.poscar,2.398 585 | ID-4787109_OQMD-EnID-26855.poscar,3.747 586 | ID-4787484_OQMD-EnID-7337.poscar,1.78 587 | ID-4787499_OQMD-EnID-11051.poscar,0.646 588 | ID-4787523_OQMD-EnID-11440.poscar,3.138 589 | ID-4787556_OQMD-EnID-11431.poscar,5.496 590 | ID-4787583_OQMD-EnID-11503.poscar,3.081 591 | ID-4787601_OQMD-EnID-11891.poscar,1.18 592 | ID-4787613_OQMD-EnID-6893.poscar,1.993 593 | ID-4787634_OQMD-EnID-11183.poscar,0.728 594 | ID-4787637_OQMD-EnID-14110.poscar,1.206 595 | ID-4787643_OQMD-EnID-11580.poscar,1.791 596 | ID-4787646_OQMD-EnID-12630.poscar,3.589 597 | ID-4787676_OQMD-EnID-12110.poscar,4.095 598 | ID-4787739_OQMD-EnID-11704.poscar,2.019 599 | ID-4787967_OQMD-EnID-12201.poscar,4.839 600 | ID-4787988_OQMD-EnID-15864.poscar,0.308 601 | ID-4788123_OQMD-EnID-4258.poscar,3.485 602 | ID-4788420_OQMD-EnID-16484.poscar,3.58 603 | ID-4788552_OQMD-EnID-16023.poscar,3.126 604 | ID-4788561_OQMD-EnID-15709.poscar,0.265 605 | ID-4788582_OQMD-EnID-16024.poscar,3.039 606 | ID-4788657_OQMD-EnID-4489.poscar,2.925 607 | ID-4788912_OQMD-EnID-11432.poscar,4.235 608 | ID-4789179_OQMD-EnID-22817.poscar,3.379 609 | ID-4789215_OQMD-EnID-26796.poscar,0.336 610 | ID-4790718_OQMD-EnID-31849.poscar,1.633 611 | ID-4801359_OQMD-EnID-646111.poscar,1.329 612 | ID-4801362_OQMD-EnID-646113.poscar,1.681 613 | ID-4801365_OQMD-EnID-646114.poscar,1.551 614 | ID-4801695_OQMD-EnID-646250.poscar,2.097 615 | ID-4801713_OQMD-EnID-646261.poscar,5.012 616 | ID-4801716_OQMD-EnID-646262.poscar,5.054 617 | ID-4801752_OQMD-EnID-646283.poscar,0.409 618 | ID-4801800_OQMD-EnID-646305.poscar,2.481 619 | ID-4801815_OQMD-EnID-646331.poscar,3.346 620 | ID-4801833_OQMD-EnID-646358.poscar,1.248 621 | ID-4801878_OQMD-EnID-646376.poscar,2.003 622 | ID-4801893_OQMD-EnID-646381.poscar,4.07 623 | ID-4801962_OQMD-EnID-646416.poscar,1.575 624 | ID-4801977_OQMD-EnID-646426.poscar,4.067 625 | ID-4801992_OQMD-EnID-646433.poscar,0.249000000000001 626 | ID-4802139_OQMD-EnID-646517.poscar,3.374 627 | ID-4802259_OQMD-EnID-646606.poscar,4.049 628 | ID-4802295_OQMD-EnID-646635.poscar,2.825 629 | ID-4802298_OQMD-EnID-646637.poscar,3.837 630 | ID-4802301_OQMD-EnID-646638.poscar,3.972 631 | ID-4802334_OQMD-EnID-646675.poscar,1.014 632 | ID-4802340_OQMD-EnID-646683.poscar,1.539 633 | ID-4802784_OQMD-EnID-646890.poscar,3.5 634 | ID-4802787_OQMD-EnID-646891.poscar,4.158 635 | ID-4803822_OQMD-EnID-647366.poscar,3.999 636 | ID-4803825_OQMD-EnID-647370.poscar,3.955 637 | ID-4810677_OQMD-EnID-643778.poscar,2.451 638 | ID-4810989_OQMD-EnID-642485.poscar,1.466 639 | ID-4811007_OQMD-EnID-645080.poscar,1.529 640 | ID-4811043_OQMD-EnID-644572.poscar,5.086 641 | ID-4811061_OQMD-EnID-37462.poscar,3.714 642 | ID-4811166_OQMD-EnID-645651.poscar,1.012 643 | ID-4812819_OQMD-EnID-83535.poscar,0.686 644 | ID-4812894_OQMD-EnID-1784.poscar,2.137 645 | ID-4812936_OQMD-EnID-39365.poscar,2.892 646 | ID-4813101_OQMD-EnID-644611.poscar,4.335 647 | ID-4813212_OQMD-EnID-643735.poscar,2.33 648 | ID-4813305_OQMD-EnID-38262.poscar,2.643 649 | ID-4813629_OQMD-EnID-3547.poscar,5.166 650 | ID-4814169_OQMD-EnID-673107.poscar,3.168 651 | ID-4814373_OQMD-EnID-36607.poscar,1.891 652 | ID-4814607_OQMD-EnID-651339.poscar,3.984 653 | ID-4814712_OQMD-EnID-119438.poscar,2.163 654 | ID-4815366_OQMD-EnID-1617.poscar,3.15 655 | ID-4815513_OQMD-EnID-97444.poscar,1.867 656 | ID-4815669_OQMD-EnID-7014.poscar,3.247 657 | ID-4817094_OQMD-EnID-36927.poscar,2.426 658 | ID-4817814_OQMD-EnID-647555.poscar,2.624 659 | ID-4817817_OQMD-EnID-42823.poscar,4.457 660 | ID-4817892_OQMD-EnID-25897.poscar,0.954 661 | ID-4818018_OQMD-EnID-4488.poscar,3.447 662 | ID-4818060_OQMD-EnID-112209.poscar,1.977 663 | ID-4818135_OQMD-EnID-23562.poscar,2.223 664 | ID-4818249_OQMD-EnID-1841.poscar,5.712 665 | ID-4818267_OQMD-EnID-1889.poscar,4.519 666 | ID-4818306_OQMD-EnID-1737.poscar,3.103 667 | ID-4818348_OQMD-EnID-1937.poscar,3.13 668 | ID-4818357_OQMD-EnID-3038.poscar,4.498 669 | ID-4818363_OQMD-EnID-2470.poscar,4.53 670 | ID-4818372_OQMD-EnID-1664.poscar,3.685 671 | ID-4818408_OQMD-EnID-2229.poscar,2.863 672 | ID-4818426_OQMD-EnID-2740.poscar,2.818 673 | ID-4818474_OQMD-EnID-1965.poscar,3.691 674 | ID-4818480_OQMD-EnID-3882.poscar,5.043 675 | ID-4818483_OQMD-EnID-3417.poscar,3.687 676 | ID-4818489_OQMD-EnID-1939.poscar,3.203 677 | ID-4818495_OQMD-EnID-4375.poscar,3.224 678 | ID-4818528_OQMD-EnID-3795.poscar,5.879 679 | ID-4818540_OQMD-EnID-4324.poscar,4.717 680 | ID-4818546_OQMD-EnID-4736.poscar,1.599 681 | ID-4818558_OQMD-EnID-4127.poscar,3.18 682 | ID-4818564_OQMD-EnID-3826.poscar,2.548 683 | ID-4818651_OQMD-EnID-4709.poscar,2.465 684 | ID-4818675_OQMD-EnID-3425.poscar,3.549 685 | ID-4818693_OQMD-EnID-6498.poscar,0.885 686 | ID-4818720_OQMD-EnID-3011.poscar,3.202 687 | ID-4818744_OQMD-EnID-2120.poscar,2.088 688 | ID-4818786_OQMD-EnID-6606.poscar,4.727 689 | ID-4818810_OQMD-EnID-2121.poscar,1.973 690 | ID-4818834_OQMD-EnID-6869.poscar,3.286 691 | ID-4818873_OQMD-EnID-6590.poscar,3.442 692 | ID-4818960_OQMD-EnID-11237.poscar,5.767 693 | ID-4819032_OQMD-EnID-11558.poscar,1.583 694 | ID-4819086_OQMD-EnID-11923.poscar,0.517 695 | ID-4819164_OQMD-EnID-11893.poscar,2.126 696 | ID-4819212_OQMD-EnID-12984.poscar,3.64 697 | ID-4819221_OQMD-EnID-12297.poscar,2.868 698 | ID-4819296_OQMD-EnID-12473.poscar,3.114 699 | ID-4819314_OQMD-EnID-2119.poscar,2.016 700 | ID-4819341_OQMD-EnID-11699.poscar,0.308 701 | ID-4819377_OQMD-EnID-646540.poscar,0.473 702 | ID-4819467_OQMD-EnID-13267.poscar,1.834 703 | ID-4819524_OQMD-EnID-13438.poscar,4.536 704 | ID-4819557_OQMD-EnID-14203.poscar,1.182 705 | ID-4819722_OQMD-EnID-15208.poscar,0.599 706 | ID-4819725_OQMD-EnID-15653.poscar,1.438 707 | ID-4819740_OQMD-EnID-14776.poscar,1.481 708 | ID-4819755_OQMD-EnID-15199.poscar,3.674 709 | ID-4819803_OQMD-EnID-15980.poscar,0.962 710 | ID-4819812_OQMD-EnID-16497.poscar,5.846 711 | ID-4819893_OQMD-EnID-16881.poscar,3.736 712 | ID-4819923_OQMD-EnID-16693.poscar,0.918 713 | ID-4819995_OQMD-EnID-16920.poscar,4.957 714 | ID-4820142_OQMD-EnID-16165.poscar,1.589 715 | ID-4820178_OQMD-EnID-20265.poscar,4.389 716 | ID-4820187_OQMD-EnID-20128.poscar,1.239 717 | ID-4820193_OQMD-EnID-20834.poscar,4.457 718 | ID-4820268_OQMD-EnID-20380.poscar,3.914 719 | ID-4820430_OQMD-EnID-21885.poscar,0.912 720 | ID-4820526_OQMD-EnID-23047.poscar,1.034 721 | ID-4820577_OQMD-EnID-22779.poscar,2.259 722 | ID-4820586_OQMD-EnID-22627.poscar,5.47 723 | ID-4820619_OQMD-EnID-24169.poscar,0.595 724 | ID-4820628_OQMD-EnID-22435.poscar,3.793 725 | ID-4820691_OQMD-EnID-24813.poscar,1.694 726 | ID-4820727_OQMD-EnID-24667.poscar,1.82 727 | ID-4820814_OQMD-EnID-25351.poscar,2.553 728 | ID-4820970_OQMD-EnID-24112.poscar,0.591 729 | ID-4821006_OQMD-EnID-25828.poscar,3.186 730 | ID-4821009_OQMD-EnID-26930.poscar,3.836 731 | ID-4821015_OQMD-EnID-26931.poscar,3.778 732 | ID-4821021_OQMD-EnID-27047.poscar,4.989 733 | ID-4821027_OQMD-EnID-26933.poscar,3.79 734 | ID-4821030_OQMD-EnID-27012.poscar,2.785 735 | ID-4821093_OQMD-EnID-26244.poscar,0.361 736 | ID-4821096_OQMD-EnID-26303.poscar,3.473 737 | ID-4821126_OQMD-EnID-27010.poscar,2.984 738 | ID-4821138_OQMD-EnID-27009.poscar,2.967 739 | ID-4821141_OQMD-EnID-27008.poscar,2.76 740 | ID-4821327_OQMD-EnID-25794.poscar,0.424 741 | ID-4821510_OQMD-EnID-1769.poscar,1.448 742 | ID-4821774_OQMD-EnID-32716.poscar,3.254 743 | ID-4821825_OQMD-EnID-646253.poscar,1.555 744 | ID-4821891_OQMD-EnID-101066.poscar,4.53 745 | ID-4821954_OQMD-EnID-650297.poscar,2.294 746 | ID-4822089_OQMD-EnID-18999.poscar,4.501 747 | ID-4822251_OQMD-EnID-24179.poscar,4.475 748 | ID-4822311_OQMD-EnID-23527.poscar,2.407 749 | ID-4822335_OQMD-EnID-24894.poscar,2.316 750 | ID-4822368_OQMD-EnID-24155.poscar,3.63 751 | ID-4822431_OQMD-EnID-11741.poscar,6.167 752 | ID-4822488_OQMD-EnID-123203.poscar,3.434 753 | ID-4822812_OQMD-EnID-2826.poscar,3.375 754 | ID-4822818_OQMD-EnID-4841.poscar,2.864 755 | ID-4822905_OQMD-EnID-22173.poscar,3.504 756 | ID-4822911_OQMD-EnID-23974.poscar,0.438 757 | ID-4822968_OQMD-EnID-21689.poscar,2.594 758 | ID-4822974_OQMD-EnID-4455.poscar,2.743 759 | ID-4823190_OQMD-EnID-38967.poscar,2.869 760 | ID-4823256_OQMD-EnID-431936.poscar,1.344 761 | ID-4823277_OQMD-EnID-431928.poscar,0.920999999999999 762 | ID-4823436_OQMD-EnID-432457.poscar,0.241 763 | ID-4823973_OQMD-EnID-434065.poscar,0.721 764 | ID-4824387_OQMD-EnID-431900.poscar,3.575 765 | ID-4824390_OQMD-EnID-431926.poscar,3.48 766 | ID-4824426_OQMD-EnID-431944.poscar,3.549 767 | ID-4824450_OQMD-EnID-431918.poscar,3.817 768 | ID-4824678_OQMD-EnID-432107.poscar,2.313 769 | ID-4825290_OQMD-EnID-432196.poscar,3.167 770 | ID-4825638_OQMD-EnID-432932.poscar,0.421 771 | ID-4826853_OQMD-EnID-433948.poscar,0.883 772 | ID-4827795_OQMD-EnID-109011.poscar,3.903 773 | ID-4828557_OQMD-EnID-431934.poscar,3.531 774 | ID-4828569_OQMD-EnID-431933.poscar,3.603 775 | ID-4829031_OQMD-EnID-2039.poscar,3.24 776 | ID-4829052_OQMD-EnID-2648.poscar,4.06 777 | ID-4829103_OQMD-EnID-2068.poscar,1.816 778 | ID-4829169_OQMD-EnID-3029.poscar,3.991 779 | ID-4829184_OQMD-EnID-2323.poscar,2.635 780 | ID-4829211_OQMD-EnID-3810.poscar,3.504 781 | ID-4829220_OQMD-EnID-1741.poscar,3.182 782 | ID-4829241_OQMD-EnID-2104.poscar,2.699 783 | ID-4829268_OQMD-EnID-1651.poscar,2.744 784 | ID-4829277_OQMD-EnID-2647.poscar,2.869 785 | ID-4829295_OQMD-EnID-2023.poscar,3.155 786 | ID-4829376_OQMD-EnID-4842.poscar,2.362 787 | ID-4829379_OQMD-EnID-4508.poscar,2.397 788 | ID-4829409_OQMD-EnID-5023.poscar,2.26 789 | ID-4829439_OQMD-EnID-4667.poscar,0.292 790 | ID-4829538_OQMD-EnID-4518.poscar,2.383 791 | ID-4829589_OQMD-EnID-432145.poscar,1.028 792 | ID-4829622_OQMD-EnID-10001.poscar,3.613 793 | ID-4829661_OQMD-EnID-10003.poscar,3.633 794 | ID-4829676_OQMD-EnID-11087.poscar,1.76 795 | ID-4829706_OQMD-EnID-11557.poscar,1.881 796 | ID-4829748_OQMD-EnID-11209.poscar,0.433 797 | ID-4829799_OQMD-EnID-11767.poscar,0.528 798 | ID-4829802_OQMD-EnID-5964.poscar,1.866 799 | ID-4829805_OQMD-EnID-12022.poscar,1.861 800 | ID-4829868_OQMD-EnID-11917.poscar,4.812 801 | ID-4829961_OQMD-EnID-13303.poscar,2.135 802 | ID-4829988_OQMD-EnID-12916.poscar,2.869 803 | ID-4830057_OQMD-EnID-12750.poscar,2.37 804 | ID-4830111_OQMD-EnID-12121.poscar,1.773 805 | ID-4830150_OQMD-EnID-14312.poscar,4.647 806 | ID-4830258_OQMD-EnID-11719.poscar,3.406 807 | ID-4830324_OQMD-EnID-14077.poscar,2.957 808 | ID-4830420_OQMD-EnID-14929.poscar,1.52 809 | ID-4830492_OQMD-EnID-15606.poscar,1.63 810 | ID-4830528_OQMD-EnID-14076.poscar,3.545 811 | ID-4830603_OQMD-EnID-16002.poscar,0.396000000000001 812 | ID-4830729_OQMD-EnID-16145.poscar,3.528 813 | ID-4830870_OQMD-EnID-19251.poscar,3.618 814 | ID-4830939_OQMD-EnID-19252.poscar,3.197 815 | ID-4830996_OQMD-EnID-16212.poscar,4.732 816 | ID-4831002_OQMD-EnID-19749.poscar,4.542 817 | ID-4831065_OQMD-EnID-16237.poscar,0.375 818 | ID-4831074_OQMD-EnID-20931.poscar,0.782999999999999 819 | ID-4831113_OQMD-EnID-19875.poscar,3.8 820 | ID-4831149_OQMD-EnID-20401.poscar,0.757000000000001 821 | ID-4831161_OQMD-EnID-19822.poscar,2.049 822 | ID-4831266_OQMD-EnID-16725.poscar,3.183 823 | ID-4831287_OQMD-EnID-16933.poscar,0.369 824 | ID-4831359_OQMD-EnID-20793.poscar,1.247 825 | ID-4831374_OQMD-EnID-22063.poscar,3.536 826 | ID-4831395_OQMD-EnID-22064.poscar,3.542 827 | ID-4831431_OQMD-EnID-22065.poscar,3.13 828 | ID-4831503_OQMD-EnID-18991.poscar,3.515 829 | ID-4831506_OQMD-EnID-4712.poscar,2.815 830 | ID-4831524_OQMD-EnID-23322.poscar,2.92 831 | ID-4831533_OQMD-EnID-23321.poscar,3.035 832 | ID-4832235_OQMD-EnID-679867.poscar,1.687 833 | ID-4832295_OQMD-EnID-680158.poscar,1.714 834 | ID-4832376_OQMD-EnID-680270.poscar,1.68 835 | ID-4835073_OQMD-EnID-19808.poscar,1.629 836 | ID-4835103_OQMD-EnID-24740.poscar,1.07 837 | ID-4835124_OQMD-EnID-23475.poscar,1.949 838 | ID-4835184_OQMD-EnID-11765.poscar,2.346 839 | ID-4835214_OQMD-EnID-22870.poscar,2.854 840 | ID-4835217_OQMD-EnID-24624.poscar,3.211 841 | ID-4835232_OQMD-EnID-24442.poscar,2.676 842 | ID-4835382_OQMD-EnID-26538.poscar,4.39 843 | ID-4839717_OQMD-EnID-26944.poscar,2.386 844 | ID-4839747_OQMD-EnID-32510.poscar,0.738 845 | ID-4839756_OQMD-EnID-21803.poscar,2.872 846 | ID-4839837_OQMD-EnID-87391.poscar,4.075 847 | ID-4839843_OQMD-EnID-43370.poscar,5.697 848 | ID-4839897_OQMD-EnID-25505.poscar,1.683 849 | ID-4839927_OQMD-EnID-36537.poscar,2.863 850 | ID-4839936_OQMD-EnID-60632.poscar,2.513 851 | ID-4839948_OQMD-EnID-25736.poscar,5.603 852 | ID-4840053_OQMD-EnID-646778.poscar,2.384 853 | ID-4840314_OQMD-EnID-11916.poscar,5.327 854 | ID-4840341_OQMD-EnID-646493.poscar,2.863 855 | ID-4840614_OQMD-EnID-678086.poscar,4.009 856 | ID-4840857_OQMD-EnID-15424.poscar,5.42 857 | ID-4841190_OQMD-EnID-22759.poscar,5.284 858 | ID-4841256_OQMD-EnID-678505.poscar,3.425 859 | ID-4841283_OQMD-EnID-678277.poscar,2.934 860 | ID-4841334_OQMD-EnID-24597.poscar,4.308 861 | ID-4841469_OQMD-EnID-678398.poscar,2.991 862 | ID-4841478_OQMD-EnID-21714.poscar,3.267 863 | ID-4841775_OQMD-EnID-678582.poscar,1.474 864 | ID-4841820_OQMD-EnID-678635.poscar,2.976 865 | ID-4841982_OQMD-EnID-24198.poscar,4.052 866 | ID-4842519_OQMD-EnID-678860.poscar,2.936 867 | ID-4842678_OQMD-EnID-678714.poscar,1.926 868 | ID-4843137_OQMD-EnID-678942.poscar,2.833 869 | ID-4843440_OQMD-EnID-22821.poscar,3.983 870 | ID-4843542_OQMD-EnID-3225.poscar,3.766 871 | ID-4844007_OQMD-EnID-21231.poscar,4.05 872 | ID-4844025_OQMD-EnID-679059.poscar,3.164 873 | ID-4844712_OQMD-EnID-679309.poscar,1.359 874 | ID-4844910_OQMD-EnID-679401.poscar,1.491 875 | ID-4846953_OQMD-EnID-679697.poscar,1.376 876 | ID-4848840_OQMD-EnID-681387.poscar,0.671 877 | ID-4848843_OQMD-EnID-681403.poscar,1.257 878 | ID-4848864_OQMD-EnID-681431.poscar,2.97 879 | ID-4848879_OQMD-EnID-681476.poscar,2.406 880 | ID-4848909_OQMD-EnID-681504.poscar,2.29 881 | ID-4848963_OQMD-EnID-681590.poscar,2.375 882 | ID-4848993_OQMD-EnID-681507.poscar,0.744999999999999 883 | ID-4849002_OQMD-EnID-681583.poscar,4.657 884 | ID-4849020_OQMD-EnID-681610.poscar,1.214 885 | ID-4849113_OQMD-EnID-681760.poscar,1.081 886 | ID-4849143_OQMD-EnID-681802.poscar,1.333 887 | ID-4849164_OQMD-EnID-681794.poscar,1.151 888 | ID-4849269_OQMD-EnID-682003.poscar,0.674 889 | ID-4849299_OQMD-EnID-682008.poscar,1.048 890 | ID-4849407_OQMD-EnID-682158.poscar,1.109 891 | ID-4849416_OQMD-EnID-682156.poscar,2.237 892 | ID-4849443_OQMD-EnID-682227.poscar,1.119 893 | ID-4849452_OQMD-EnID-682197.poscar,2.196 894 | ID-4849458_OQMD-EnID-682189.poscar,1.248 895 | ID-4849461_OQMD-EnID-682235.poscar,2.475 896 | ID-4849467_OQMD-EnID-682233.poscar,2.441 897 | ID-4849491_OQMD-EnID-682260.poscar,4.349 898 | ID-4849548_OQMD-EnID-682294.poscar,1.196 899 | ID-4849599_OQMD-EnID-682411.poscar,1.144 900 | ID-4849614_OQMD-EnID-682453.poscar,0.729 901 | ID-4849779_OQMD-EnID-682729.poscar,0.945 902 | ID-4849884_OQMD-EnID-682842.poscar,0.708 903 | ID-4849896_OQMD-EnID-2303.poscar,4.052 904 | ID-4849899_OQMD-EnID-1688.poscar,3.439 905 | ID-4849914_OQMD-EnID-2277.poscar,4.052 906 | ID-4850994_OQMD-EnID-688027.poscar,2.079 907 | ID-4851216_OQMD-EnID-681360.poscar,4.487 908 | ID-4851228_OQMD-EnID-681426.poscar,0.454 909 | ID-4851240_OQMD-EnID-682967.poscar,3.199 910 | ID-4851372_OQMD-EnID-45987.poscar,1.876 911 | ID-4851408_OQMD-EnID-681376.poscar,1.949 912 | ID-4851456_OQMD-EnID-681457.poscar,0.774999999999999 913 | ID-4851459_OQMD-EnID-681396.poscar,3.774 914 | ID-4851519_OQMD-EnID-681468.poscar,4.363 915 | ID-4851537_OQMD-EnID-681540.poscar,4.473 916 | ID-4851582_OQMD-EnID-681448.poscar,3.938 917 | ID-4851627_OQMD-EnID-681559.poscar,4.716 918 | ID-4851870_OQMD-EnID-686380.poscar,0.636 919 | ID-4851912_OQMD-EnID-681491.poscar,3.798 920 | ID-4851933_OQMD-EnID-681696.poscar,2.578 921 | ID-4851939_OQMD-EnID-681716.poscar,2.851 922 | ID-4852041_OQMD-EnID-681428.poscar,1.203 923 | ID-4852212_OQMD-EnID-681800.poscar,4.544 924 | ID-4852380_OQMD-EnID-681868.poscar,4.871 925 | ID-4852437_OQMD-EnID-681900.poscar,4.217 926 | ID-4852548_OQMD-EnID-681862.poscar,2.645 927 | ID-4852554_OQMD-EnID-681928.poscar,2.627 928 | ID-4852665_OQMD-EnID-682013.poscar,4.42 929 | ID-4852668_OQMD-EnID-682074.poscar,6.198 930 | ID-4852671_OQMD-EnID-681970.poscar,4.521 931 | ID-4852695_OQMD-EnID-681998.poscar,0.906 932 | ID-4852761_OQMD-EnID-681881.poscar,2.645 933 | ID-4852791_OQMD-EnID-682040.poscar,0.623 934 | ID-4852926_OQMD-EnID-682090.poscar,0.604 935 | ID-4852929_OQMD-EnID-681978.poscar,2.529 936 | ID-4852932_OQMD-EnID-682089.poscar,3.706 937 | ID-4852986_OQMD-EnID-681780.poscar,0.435 938 | ID-4853052_OQMD-EnID-681384.poscar,4.701 939 | ID-4853064_OQMD-EnID-682134.poscar,4.565 940 | ID-4853121_OQMD-EnID-682160.poscar,2.116 941 | ID-4853157_OQMD-EnID-682037.poscar,1.897 942 | ID-4853172_OQMD-EnID-689740.poscar,0.23 943 | ID-4853247_OQMD-EnID-681658.poscar,4.083 944 | ID-4853322_OQMD-EnID-689741.poscar,0.248 945 | ID-4853325_OQMD-EnID-683781.poscar,2.207 946 | ID-4853382_OQMD-EnID-681987.poscar,2.583 947 | ID-4853949_OQMD-EnID-2704.poscar,2.749 948 | ID-4853976_OQMD-EnID-2451.poscar,3.244 949 | ID-4854108_OQMD-EnID-2083.poscar,1.275 950 | ID-4854129_OQMD-EnID-685804.poscar,3.593 951 | ID-4854162_OQMD-EnID-3560.poscar,4.388 952 | ID-4854171_OQMD-EnID-2720.poscar,1.476 953 | ID-4854255_OQMD-EnID-2937.poscar,7.545 954 | ID-4854300_OQMD-EnID-2432.poscar,1.161 955 | ID-4854369_OQMD-EnID-3629.poscar,6.392 956 | ID-4854381_OQMD-EnID-2224.poscar,1.35 957 | ID-4854414_OQMD-EnID-3628.poscar,4.306 958 | ID-4854435_OQMD-EnID-3268.poscar,1.503 959 | ID-4854486_OQMD-EnID-3879.poscar,2.477 960 | ID-4854576_OQMD-EnID-3190.poscar,2.245 961 | ID-4854594_OQMD-EnID-4740.poscar,1.633 962 | ID-4854597_OQMD-EnID-3787.poscar,3.672 963 | ID-4854603_OQMD-EnID-682625.poscar,3.98 964 | ID-4854624_OQMD-EnID-682721.poscar,4.491 965 | ID-4854642_OQMD-EnID-5275.poscar,3.415 966 | ID-4854648_OQMD-EnID-2722.poscar,2.584 967 | ID-4854684_OQMD-EnID-3166.poscar,2.242 968 | ID-4854732_OQMD-EnID-6130.poscar,4.74 969 | ID-4854753_OQMD-EnID-6459.poscar,4.573 970 | ID-4854804_OQMD-EnID-5862.poscar,7.533 971 | ID-4854825_OQMD-EnID-6351.poscar,3.543 972 | ID-4854888_OQMD-EnID-2409.poscar,3.884 973 | ID-4854936_OQMD-EnID-682614.poscar,3.197 974 | ID-4855005_OQMD-EnID-682712.poscar,0.618 975 | ID-4855062_OQMD-EnID-7384.poscar,3.714 976 | ID-4855092_OQMD-EnID-3124.poscar,1.866 977 | ID-4855095_OQMD-EnID-4233.poscar,3.248 978 | ID-4855131_OQMD-EnID-682518.poscar,1.002 979 | ID-4855164_OQMD-EnID-11223.poscar,4.237 980 | ID-4855212_OQMD-EnID-7382.poscar,3.327 981 | ID-4855269_OQMD-EnID-6147.poscar,2.602 982 | ID-4855293_OQMD-EnID-11561.poscar,2.029 983 | ID-4855338_OQMD-EnID-11586.poscar,6.08 984 | ID-4855374_OQMD-EnID-5112.poscar,3.769 985 | ID-4855389_OQMD-EnID-83379.poscar,0.251 986 | ID-4855413_OQMD-EnID-4494.poscar,2.273 987 | ID-4855467_OQMD-EnID-4493.poscar,2.349 988 | ID-4855485_OQMD-EnID-11674.poscar,3.022 989 | ID-4855506_OQMD-EnID-13136.poscar,1.797 990 | ID-4855518_OQMD-EnID-682934.poscar,2.745 991 | ID-4855536_OQMD-EnID-682921.poscar,4.732 992 | ID-4855581_OQMD-EnID-3965.poscar,1.745 993 | ID-4855590_OQMD-EnID-682933.poscar,6.026 994 | ID-4855662_OQMD-EnID-682924.poscar,1.428 995 | ID-4855698_OQMD-EnID-11408.poscar,1.628 996 | ID-4855752_OQMD-EnID-11477.poscar,2.507 997 | ID-4855815_OQMD-EnID-11323.poscar,2.498 998 | ID-4855863_OQMD-EnID-11975.poscar,1.934 999 | ID-4855890_OQMD-EnID-14115.poscar,1.893 1000 | ID-4855926_OQMD-EnID-6983.poscar,1.965 1001 | ID-4855935_OQMD-EnID-13443.poscar,4.122 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | scikit-learn 3 | matplotlib 4 | requests 5 | jupyter 6 | --------------------------------------------------------------------------------