├── .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 | [](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercises.ipynb)
7 | [](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fexercises.ipynb)
8 | [](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 | Provider |
181 | N1 |
182 | N2 |
183 | N3 |
184 |
185 |
186 | AFLOW |
187 | 700,192 |
188 | 62,293 |
189 | 382,554 |
190 |
191 |
192 | Crystallography Open Database (COD) |
193 | 416,314 |
194 | 3,896 |
195 | 32,420 |
196 |
197 |
198 | Theoretical Crystallography Open Database (TCOD) |
199 | 2,631 |
200 | 296 |
201 | 660 |
202 |
203 |
204 | Materials Cloud |
205 | 886,518 |
206 | 801,382 |
207 | 103,075 |
208 |
209 |
210 | Materials Project |
211 | 27,309 |
212 | 3,545 |
213 | 10,501 |
214 |
215 |
216 | Novel Materials Discovery Laboratory (NOMAD) |
217 | 3,359,594 |
218 | 532,123 |
219 | 1,611,302 |
220 |
221 |
222 | Open Database of Xtals (odbx) |
223 | 55 |
224 | 54 |
225 | 0 |
226 |
227 |
228 | Open Materials Database (omdb) |
229 | 58,718 |
230 | 690 |
231 | 7,428 |
232 |
233 |
234 | Open Quantum Materials Database (OQMD) |
235 | 153,113 |
236 | 11,011 |
237 | 70,252 |
238 |
239 |
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 | [](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/demonstration-pymatgen-for-optimade-queries.ipynb)
309 | [](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 | [](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise7-oqmd-optimade-tutorial.ipynb)
428 | [](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 | [](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise8-optimade-python-tools.ipynb)
443 | [](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 | "[](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercises.ipynb)\n",
10 | "[](https://mybinder.org/v2/gh/Materials-Consortia/optimade-tutorial-exercises/HEAD?filepath=notebooks%2Fexercises.ipynb)\n",
11 | "[](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 | " Provider | \n",
104 | " N1 | \n",
105 | " N2 | \n",
106 | " N3 | \n",
107 | "
\n",
108 | " \n",
109 | " AFLOW | \n",
110 | " 700,192 | \n",
111 | " 62,293 | \n",
112 | " 382,554 | \n",
113 | "
\n",
114 | " \n",
115 | " Crystallography Open Database (COD) | \n",
116 | " 416,314 | \n",
117 | " 3,896 | \n",
118 | " 32,420 | \n",
119 | "
\n",
120 | " \n",
121 | " Theoretical Crystallography Open Database (TCOD) | \n",
122 | " 2,631 | \n",
123 | " 296 | \n",
124 | " 660 | \n",
125 | "
\n",
126 | " \n",
127 | " Materials Cloud | \n",
128 | " 886,518 | \n",
129 | " 801,382 | \n",
130 | " 103,075 | \n",
131 | "
\n",
132 | " \n",
133 | " Materials Project | \n",
134 | " 27,309 | \n",
135 | " 3,545 | \n",
136 | " 10,501 | \n",
137 | "
\n",
138 | " \n",
139 | " Novel Materials Discovery Laboratory (NOMAD) | \n",
140 | " 3,359,594 | \n",
141 | " 532,123 | \n",
142 | " 1,611,302 | \n",
143 | "
\n",
144 | " \n",
145 | " Open Database of Xtals (odbx) | \n",
146 | " 55 | \n",
147 | " 54 | \n",
148 | " 0 | \n",
149 | "
\n",
150 | " \n",
151 | " Open Materials Database (omdb) | \n",
152 | " 58,718 | \n",
153 | " 690 | \n",
154 | " 7,428 | \n",
155 | "
\n",
156 | " \n",
157 | " Open Quantum Materials Database (OQMD) | \n",
158 | " 153,113 | \n",
159 | " 11,011 | \n",
160 | " 70,252 | \n",
161 | "
\n",
162 | "
\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 | "[](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/demonstration-pymatgen-for-optimade-queries.ipynb)\n",
208 | "[](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 | "[](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise7-oqmd-optimade-tutorial.ipynb)\n",
293 | "[](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 | "[](https://colab.research.google.com/github/Materials-Consortia/optimade-tutorial-exercises/blob/main/notebooks/exercise8-optimade-python-tools.ipynb)\n",
305 | "[](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 |
--------------------------------------------------------------------------------