A Practical Python API for Querying AFLOWLIB

A Practical Python API for Querying AFLOWLIB

Conrad W. Rosenbrock Department of Physics and Astronomy, Brigham Young University, Provo, Utah 84602, USA.
July 1, 2019

Large databases such as aflowlib.org provide valuable data sources for discovering material trends through machine learning. Although a REST API and query language are available, there is a learning curve associated with the AFLUX language that acts as a barrier for new users. Additionally, the data is stored using non-standard serialization formats. Here we present a high-level API that allows immediate access to the aflowlib data using standard python operators and language features. It provides an easy way to integrate aflowlib data with other python materials packages such as ase and quippy, and provides automatic deserialization into numpy arrays and python objects. This package is available via pip install aflow.

I Introduction

Recent advances in computation have enabled the creation of large, materials databases using Density Functional Theory PhysRev.140.A1133 (); PhysRev.136.B864 (). aflowlib Curtarolo2012218 (); Curtarolo2012227 () is one of the largest with more than 1.7M material compounds (as of September 2017, http://aflowlib.org/). Recently, the AFLUX search API ROSE2017362 () was introduced to provide improved access to the data in a uniform request format via REST TAYLOR2014178 (). Because the API is based on REST, it allows access to the data from a variety of programming languages through standard libraries.

Unfortunately, the data for material properties and calculation parameters are not stored in a standard format. While the custom serialization format is documented, each property must be parsed individually to access standard formats (such as numpy 5725236 () arrays for python). Thus, a researcher attempting to access aflowlib data for the first time must 1) read and understand the AFLUX request format; 2) lookup the documentation for the properties of interest and 3) deserialize them appropriately. aflowlib fields are stored as strings of values that may be comma-separated, colon-separated or have a more complex structure (such as for the kpoints property). Deserialization refers to the transformation of these strings into high-level objects such as dictionaries or arrays. Even though such tasks are well within the abilities of a computational scientist, they are not tasks that leverage scientific expertise.

Here, we introduce a high-level python API that abstracts the request and deserialization tasks so that there is virtually no access barrier for newcomers to the aflowlib database.

Ii Request Example

We begin with the example from the AFLUX paper ROSE2017362 (), translated into python using the new package (aflow, https://pypi.python.org/pypi/aflow):


[H] {minted}[mathescape, linenos, numbersep=5pt, frame=lines, framesep=2mm]python from aflow import *

# Iterate over the results in batches of 20; sort by thermal # conductivity descending. result = search(batch_size=20 ).select(K.agl_thermal_conductivity_300K ).filter(K.Egap > 6 ).orderby(K.agl_thermal_conductivity_300K, True)

# Now, you can just iterate over the results. for entry in result: print(entry.Egap, entry.agl_thermal_conductivity_300K) Example of searching the aflowlib database for materials with large band gaps and large thermal conductivity. This is the same example given in the AFLUX paper ROSE2017362 ().

The search function returns an object that can be chained continually to apply multiple filters (filter), select additional properties (select), apply exclusions (exclude) or order the results (orderby). aflowlib provides more than 110 keywords for various material properties, calculation parameters, etc. Somebody new to aflowlib may not initially know what is available and would have to pull up the documentation online. For ease-of-use, the API provides all keywords supported by aflowlib as attributes of aflow.K. For IDEs that support auto-complete, this means that researchers can dynamically see what properties are available and view descriptions of them by typing K.<tab> and using tab completion.

Iii API Features

The search function described above produces an object that supports iteration over the database entries returned from aflowlib. Normally, AFLUX requires desired properties to be specified as part of the request URL. Our python API provides “lazy evaluation” functionality so that database entries from an existing result can be queried for additional properties using attributes on the python database entry objects. All requests happen transparently in the background and are cached to optimize performance.

iii.1 Slicing, Indexing and Deserialization


[H] {minted}[mathescape, linenos, numbersep=5pt, frame=lines, framesep=2mm]python # The API also allows for slicing of result sets part = result[21:25]

# If a page of results isn’t available in an existing batch, the next # one is automatically retrieved from the server. Since our batch size # is 20, asking for result 55 triggers another paging request against # the aflowlib API. result[55] # <aflow.entries.Entry at 0x1104f9890>

# Our original query didn’t ask for the atomic positions, but we can # request them now anyway because of the lazy request evaluation. result[55].positions_cartesian #array([[ 0. , 0. , -0. ], # [ 1.5691, 1.5691, 1.5691], # [ 4.7073, 4.7073, 4.7073]]) The python API supports arbitrary slicing in the result set and lazy evaluation of properties. This means that properties can be fetched from the aflowlib database even if they weren’t part of the original request URL.

Notice that the Cartesian positions are returned as a numpy array automatically because the API handles deserialization.

iii.2 Operators

The filter method of the search object filters results in aflowlib using standard operators. We overloaded these operators in python to provide an intuitive interface. These are briefly described here:

  1. > and < behave as expected. However, these are overloaded for string comparisons in the spirit of the AFLUX endpoint. For example author < "curtarolo" will match “*curtarolo” and author > "curtarolo" will match “curtarolo*”.

  2. == behaves as expected for all keywords.

  3. % allows for string searches. author % "curtarolo" matches “*curtarolo*”.

  4. ~  inverts the filter (equivalent to a boolean “not”).

  5. & is the logical “and” between two conditions.

  6. | is the logical “or” between two conditions.

Using these operators, it is possible to form complex queries using intuitive notation:


[H] {minted}[mathescape, linenos, numbersep=5pt, frame=lines, framesep=2mm]python # Find entries with a band gap between 0 and 2 or 5 and 7. filter((K.Egap > 0) & (K.Egap < 2)) | ((K.Egap > 5) & (K.Egap < 7)) Example of chaining complex filters using the overloaded operators in the API. Because we overload the bit-wise & and |, extra parentheses are required around the numeric operator expressions.

iii.3 Templated Generation

The supported keywords and corresponding properties on the database entry objects are generated via requests to the aflowlib schema, which includes documentation. This allows any additions or modifications at aflowlib to be captured automatically by regenerating the python API from template.

iii.4 Integration with ASE and quippy

The Atomic Simulation Environment (ASE) ase-paper (); ISI:000175131400009 () provides a high-level API for working with materials, calculating their properties and performing other high-level transformations. quippy (quippy (), http://www.libatoms.org) extends the functionality of ase with additional routines that make it easier to work with collections of material configurations and perform additional tasks (such as crack propagation simulations, calculating descriptors, etc.).

Each database entry object in the aflow API also provides an atoms method that constructs an atoms object for ase or quippy. This makes it seamless to integrate the aflowlib data into existing workflows.

Iv Installation and API Documentation

The package is available on the python package index and can be installed with:

pip install aflow

API Documentation auto-generated by sphinx is available at:

The source code has full test coverage and continuous integration, and is hosted at

aflow works in both python 2 and python 3.


  • (1) S. R. Bahn and K. W. Jacobsen. An object-oriented scripting interface to a legacy electronic structure code. Comput. Sci. Eng., 4(3):56–66, MAY-JUN 2002.
  • (2) S. Curtarolo, W. Setyawan, G. L. Hart, M. Jahnatek, R. V. Chepulskii, R. H. Taylor, S. Wang, J. Xue, K. Yang, O. Levy, M. J. Mehl, H. T. Stokes, D. O. Demchenko, and D. Morgan. Aflow: An automatic framework for high-throughput materials discovery. Computational Materials Science, 58:218 – 226, 2012.
  • (3) S. Curtarolo, W. Setyawan, S. Wang, J. Xue, K. Yang, R. H. Taylor, L. J. Nelson, G. L. Hart, S. Sanvito, M. Buongiorno-Nardelli, N. Mingo, and O. Levy. Aflowlib.org: A distributed materials properties repository from high-throughput ab initio calculations. Computational Materials Science, 58:227 – 235, 2012.
  • (4) P. Hohenberg and W. Kohn. Inhomogeneous electron gas. Phys. Rev., 136:B864–B871, Nov 1964.
  • (5) W. Kohn and L. J. Sham. Self-consistent equations including exchange and correlation effects. Phys. Rev., 140:A1133–A1138, Nov 1965.
  • (6) A. H. Larsen, J. J. Mortensen, J. Blomqvist, I. E. Castelli, R. Christensen, M. Dułak, J. Friis, M. N. Groves, B. Hammer, C. Hargus, E. D. Hermes, P. C. Jennings, P. B. Jensen, J. Kermode, J. R. Kitchin, E. L. Kolsbjerg, J. Kubal, K. Kaasbjerg, S. Lysgaard, J. B. Maronsson, T. Maxson, T. Olsen, L. Pastewka, A. Peterson, C. Rostgaard, J. Schiøtz, O. Schütt, M. Strange, K. S. Thygesen, T. Vegge, L. Vilhelmsen, M. Walter, Z. Zeng, and K. W. Jacobsen. The atomic simulation environment-a python library for working with atoms. Journal of Physics: Condensed Matter, 29(27):273002, 2017.
  • (7) F. Rose, C. Toher, E. Gossett, C. Oses, M. B. Nardelli, M. Fornari, and S. Curtarolo. AFLUX: The LUX materials search API for the AFLOW data repositories. Computational Materials Science, 137 (Supplement C):362 – 370, 2017.
  • (8) R. H. Taylor, F. Rose, C. Toher, O. Levy, K. Yang, M. B. Nardelli, and S. Curtarolo. A RESTful API for exchanging materials data in the AFLOWLIB.org consortium. Computational Materials Science, 93 (Supplement C):178 – 192, 2014.
  • (9) S. van der Walt, S. C. Colbert, and G. Varoquaux. The numpy array: A structure for efficient numerical computation. Computing in Science Engineering, 13(2):22–30, March 2011.
  • (10) Csányi, Gábor, Steven Winfield, J. Kermode, A. Comisso, A. De Vita, Noam Bernstein, and Mike C. Payne Expressive programming for computational physics in Fortran 95+. IoP Comput. Phys. Newsletter, Spring (2007).
Comments 0
Request Comment
You are adding the first comment!
How to quickly get a good reply:
  • Give credit where it’s due by listing out the positive aspects of a paper before getting into which changes should be made.
  • Be specific in your critique, and provide supporting evidence with appropriate references to substantiate general statements.
  • Your comment should inspire ideas to flow and help the author improves the paper.

The better we are at sharing our knowledge with each other, the faster we move forward.
The feedback must be of minimum 40 characters and the title a minimum of 5 characters
Add comment
Loading ...
This is a comment super asjknd jkasnjk adsnkj
The feedback must be of minumum 40 characters
The feedback must be of minumum 40 characters

You are asking your first question!
How to quickly get a good answer:
  • Keep your question short and to the point
  • Check for grammar or spelling errors.
  • Phrase it like a question
Test description