Skip to content

Commit

Permalink
Merge pull request #205 from materialsproject/release-emmet-builders
Browse files Browse the repository at this point in the history
Release Emmet Builders
  • Loading branch information
Shyam Dwaraknath authored Jun 16, 2021
2 parents 16cc016 + 01e2a8d commit ae3c8c8
Show file tree
Hide file tree
Showing 8 changed files with 185 additions and 272 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
strategy:
max-parallel: 6
matrix:
package: ["emmet-core"]
package: ["emmet-core","emmet-builders"]

steps:
- uses: actions/[email protected]
Expand Down
26 changes: 14 additions & 12 deletions .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,20 @@ jobs:
strategy:
max-parallel: 6
matrix:
package: ["emmet-core"]
package: ["emmet-core", "emmet-builders"]

steps:
- uses: actions/[email protected]

- name: Set up Python 3.7
- name: Set up Python 3.8
uses: actions/[email protected]
with:
python-version: 3.7
python-version: 3.8

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r ${{ matrix.package }}/requirements.txt
pip install -r requirements.txt
pip install -r requirements-testing.txt
- name: Lint with flake8
Expand All @@ -43,26 +43,27 @@ jobs:
strategy:
max-parallel: 6
matrix:
package: ["emmet-core"]
package: ["emmet-core", "emmet-builders"]
python_version: [3.7, 3.8]

steps:
- uses: actions/[email protected]

- name: Set up Python 3.7
- name: Set up Python ${{ matrix.python_version }}
uses: actions/[email protected]
with:
python-version: 3.7
python-version: ${{ matrix.python_version }}

- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements-testing.txt
pip install -r ${{ matrix.package }}/requirements.txt
pip install -r requirements.txt
- name: Install Packages
run: |
pip install -e ${{ matrix.package }}/
pip install -e emmet-core
pip install -e emmet-builders
- name: Lint with mypy
run: mypy --namespace-package ${{ matrix.package }}/emmet
Expand All @@ -89,9 +90,10 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements-docs.txt
pip install -r emmet-core/requirements.txt
pip install -r requirements.txt
pip install -e emmet-core/
pip install -e emmet-builders/
pip install -r requirements-docs.txt
- name: Build
run: mkdocs build
Expand Down
4 changes: 2 additions & 2 deletions emmet-builders/emmet/builders/feff/xas.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ class XASBuilder(GroupBuilder):
# TODO: Generate MPID from materials collection rather than from task metadata
"""

def __init__(self, tasks: Store, xas: Store, num_samples: int = 200.0, **kwargs):
def __init__(self, tasks: Store, xas: Store, num_samples: int = 200, **kwargs):
self.tasks = tasks
self.xas = xas
self.num_samples = 200
self.num_samples = num_samples
self.kwargs = kwargs

super().__init__(source=tasks, target=xas, grouping_keys=["mp_id"])
Expand Down
258 changes: 17 additions & 241 deletions emmet-builders/emmet/builders/materials/search.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from collections import defaultdict
from math import ceil

from maggma.builders import Builder
Expand Down Expand Up @@ -86,17 +85,15 @@ def get_items(self):

search_set = set(mat_ids) - set(search_ids)

search_list = [key for key in search_set]

self.total = len(search_list)
self.total = len(search_set)

self.logger.debug("Processing {} materials.".format(self.total))

for entry in search_list:
for entry in search_set:

data = {
"materials": list(self.materials.query({self.materials.key: entry})),
"thermo": list(self.thermo.query({self.thermo.key: entry})),
"materials": self.materials.query_one({self.materials.key: entry}),
"thermo": self.thermo.query_one({self.thermo.key: entry}),
"xas": list(self.xas.query({self.xas.key: entry})),
"grain_boundaries": list(
self.grain_boundaries.query({self.grain_boundaries.key: entry})
Expand All @@ -106,23 +103,23 @@ def get_items(self):
{self.electronic_structure.key: entry}
)
),
"magnetism": list(self.magnetism.query({self.magnetism.key: entry})),
"elasticity": list(self.elasticity.query({self.elasticity.key: entry})),
"dielectric": list(self.dielectric.query({self.dielectric.key: entry})),
"phonon": list(
self.phonon.query({self.phonon.key: entry}, [self.phonon.key])
"magnetism": self.magnetism.query_one({self.magnetism.key: entry}),
"elasticity": self.elasticity.query_one({self.elasticity.key: entry}),
"dielectric": self.dielectric.query_one({self.dielectric.key: entry}),
"phonon": self.phonon.query_one(
{self.phonon.key: entry}, [self.phonon.key]
),
"insertion_electrodes": list(
self.insertion_electrodes.query(
{self.insertion_electrodes.key: entry},
[self.insertion_electrodes.key],
)
),
"surface_properties": list(
self.surfaces.query({self.surfaces.key: entry})
"surface_properties": self.surfaces.query_one(
{self.surfaces.key: entry}
),
"substrates": list(self.surfaces.query({self.substrates.key: entry})),
"eos": list(self.eos.query({self.eos.key: entry}, [self.eos.key])),
"eos": self.eos.query_one({self.eos.key: entry}, [self.eos.key]),
}

yield data
Expand All @@ -141,228 +138,9 @@ def prechunk(self, number_splits: int):

def process_item(self, item):

d = defaultdict(dict)

# Materials

materials_fields = [
"nsites",
"elements",
"nelements",
"composition",
"composition_reduced",
"formula_pretty",
"formula_anonymous",
"chemsys",
"volume",
"density",
"density_atomic",
"symmetry",
"structure",
"deprecated",
]

ids = []

for doc in item["materials"]:

ids.append(doc[self.materials.key])
d[ids[-1]] = defaultdict(dict)
d[ids[-1]]["material_id"] = MPID(doc["material_id"])

for field in materials_fields:
d[ids[-1]][field] = doc[field]

for id in ids:

d[id]["has_props"] = set()

# Thermo

thermo_fields = [
"uncorrected_energy_per_atom",
"energy_per_atom",
"formation_energy_per_atom",
"energy_above_hull",
"is_stable",
"equillibrium_reaction_energy_per_atom",
"decomposes_to",
]

for doc in item["thermo"]:
if doc[self.thermo.key] == id:
for field in thermo_fields:
d[id][field] = doc[field]

# XAS

xas_fields = ["absorbing_element", "edge", "spectrum_type", "xas_id"]

for doc in item["xas"]:
if doc[self.xas.key] == id:

if d[id].get("xas", None) is None:
d[id]["xas"] = []

d[id]["has_props"].add("xas")

d[id]["xas"].append({field: doc[field] for field in xas_fields})

# GB

gb_fields = ["gb_energy", "sigma", "type", "rotation_angle", "w_sep"]

for doc in item["grain_boundaries"]:
if doc[self.grain_boundaries.key] == id:

if d[id].get("grain_boundaries", None) is None:
d[id]["grain_boundaries"] = []

d[id]["has_props"].add("grain_boundaries")

d[id]["grain_boundaries"].append(
{field: doc[field] for field in gb_fields}
)

# Electronic Structure + Bandstructure + DOS

es_fields = [
"band_gap",
"efermi",
"cbm",
"vbm",
"is_gap_direct",
"is_metal",
]

for doc in item["electronic_structure"]:
if doc[self.electronic_structure.key] == id:
for field in es_fields:
d[id][field] = doc[field]

d[id]["es_source_calc_id"] = doc["calc_id"]

if doc["bandstructure"] is not None:
if any(doc["bandstructure"].values()):
d[id]["has_props"].add("bandstructure")
d[id]["bandstructure"] = doc["bandstructure"]

if doc["dos"] is not None:
d[id]["has_props"].add("dos")
d[id]["dos"] = doc["dos"]

# Magnetism

magnetism_fields = [
"ordering",
"total_magnetization",
"total_magnetization_normalized_vol",
"total_magnetization_normalized_formula_units",
]

d[id]["spin_polarized"] = False

for doc in item["magnetism"]:
if doc[self.magnetism.key] == id:
d[id]["has_props"].add("magnetism")

d[id]["spin_polarized"] = True

for field in magnetism_fields:
d[id][field] = doc["magnetism"][field]

# Elasticity

elasticity_fields = [
"k_voigt",
"k_reuss",
"k_vrh",
"g_voigt",
"g_reuss",
"g_vrh",
"universal_anisotropy",
"homogeneous_poisson",
]

for doc in item["elasticity"]:
if doc[self.elasticity.key] == id:
d[id]["has_props"].add("elasticity")

for field in elasticity_fields:
d[id][field] = doc["elasticity"][field]

# Dielectric and Piezo

dielectric_fields = ["e_total", "e_ionic", "e_static", "n"]

piezo_fields = ["e_ij_max"]

for doc in item["dielectric"]:
if doc[self.dielectric.key] == id:
check_dielectric = doc.get("dielectric", None)
check_piezo = doc.get("piezo", None)
if check_dielectric is not None and check_dielectric != {}:
d[id]["has_props"].add("dielectric")

for field in dielectric_fields:
d[id][field] = doc["dielectric"][field]

if check_piezo is not None and check_piezo != {}:
d[id]["has_props"].add("piezoelectric")

for field in piezo_fields:
d[id][field] = doc["piezo"][field]

# Surface properties

surface_fields = [
"weighted_surface_energy",
"weighted_surface_energy_EV_PER_ANG2",
"shape_factor",
"surface_anisotropy",
]

for doc in item["surface_properties"]:
if doc[self.surfaces.key] == id:
d[id]["has_props"].add("surface_properties")

for field in surface_fields:
d[id][field] = doc[field]

# EOS

for doc in item["eos"]:

if doc[self.eos.key] == id:
d[id]["has_props"].add("eos")

# Phonon

for doc in item["phonon"]:

if doc[self.phonon.key] == id:
d[id]["has_props"].add("phonon")

# Insertion Electrodes

for doc in item["insertion_electrodes"]:

if doc[self.phonon.key] == id:
d[id]["has_props"].add("insertion_electrode")

# Substrates

for doc in item["substrates"]:

if doc[self.substrates.key] == id:
d[id]["has_props"].add("substrates")

d[id]["has_props"] = list(d[id]["has_props"])

for mpid in d:
d[mpid] = SearchDoc(**d[mpid])

return d
material_id = MPID(item["materials"]["material_id"])
doc = SearchDoc.from_docs(material_id=material_id, **item)
return jsanitize(doc.dict(exclude_none=True), allow_bson=True)

def update_targets(self, items):
"""
Expand All @@ -373,10 +151,8 @@ def update_targets(self, items):
"""
items = list(filter(None, items))

docs = list([doc.dict(exclude_none=True) for doc in items[0].values()])

if len(items) > 0:
self.logger.info("Inserting {} search docs".format(len(docs)))
self.search.update(docs=jsanitize(docs, allow_bson=True))
self.logger.info("Inserting {} search docs".format(len(items)))
self.search.update(docs=items)
else:
self.logger.info("No search entries to update")
Loading

0 comments on commit ae3c8c8

Please sign in to comment.