emmet-builders 0.48.2__tar.gz → 0.48.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of emmet-builders might be problematic. Click here for more details.
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/PKG-INFO +1 -1
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/abinit/phonon.py +2 -1
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/abinit/sound_velocity.py +10 -10
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/atomic.py +32 -13
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/bonds.py +17 -6
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/orbitals.py +17 -6
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/redox.py +46 -23
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/summary.py +6 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/thermo.py +24 -11
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/vibration.py +17 -6
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/qchem/molecules.py +193 -64
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/PKG-INFO +1 -1
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/deployment.txt +7 -7
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.10.txt +5 -5
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.10_extras.txt +10 -12
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.11.txt +5 -5
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.11_extras.txt +10 -12
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.8.txt +6 -6
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.8_extras.txt +11 -13
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.9.txt +6 -6
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.9_extras.txt +11 -13
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.10.txt +5 -5
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.10_extras.txt +10 -12
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.11.txt +5 -5
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.11_extras.txt +10 -12
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.8.txt +6 -6
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.8_extras.txt +11 -13
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.9.txt +6 -6
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.9_extras.txt +11 -13
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_atomic.py +5 -5
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_bonds.py +3 -3
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_orbitals.py +3 -3
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_redox.py +2 -2
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_summary.py +2 -2
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_thermo.py +2 -2
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_vibration.py +2 -2
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_qchem.py +4 -4
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/abinit/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/feff/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/feff/xas.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/absorption_spectrum.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/alloys.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/basic_descriptors.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/bonds.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/chemenv.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/corrected_entries.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/dielectric.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/elasticity.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/electrodes.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/electronic_structure.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/magnetism.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/optimade.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/oxidation_states.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/piezoelectric.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/provenance.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/robocrys.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/similarity.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/substrates.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/summary.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/thermo.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/mobility/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/mobility/migration_graph.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/qchem/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/settings.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/utils.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/vasp/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/vasp/materials.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/vasp/task_validator.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/SOURCES.txt +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/dependency_links.txt +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/not-zip-safe +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/requires.txt +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/top_level.txt +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/setup.cfg +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/setup.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/conftest.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/__init__.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_absorption.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_basic_descriptors.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_chemenv.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_corrected_entries_thermo.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_dielectric.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_elasticity.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_electronic_structure.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_magnetism.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_materials.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_mobility.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_oxidation.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_piezoelectric.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_similarity.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_summary.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_utils.py +0 -0
- {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_vasp.py +0 -0
|
@@ -56,7 +56,8 @@ class PhononBuilder(Builder):
|
|
|
56
56
|
standard MongoDB document.
|
|
57
57
|
|
|
58
58
|
Args:
|
|
59
|
-
|
|
59
|
+
phonon_materials (Store): source Store of phonon materials documents
|
|
60
|
+
containing abinit_input and abinit_output.
|
|
60
61
|
ddb_source (Store): source Store of ddb files. Matching the data in the materials Store.
|
|
61
62
|
phonon (Store): target Store of the phonon properties
|
|
62
63
|
phonon_bs (Store): target Store for the phonon band structure. The document may
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import tempfile
|
|
2
|
-
import gridfs
|
|
3
2
|
import traceback
|
|
4
3
|
from typing import Optional, Dict, List, Iterator
|
|
5
4
|
|
|
@@ -16,7 +15,8 @@ from emmet.core.utils import jsanitize
|
|
|
16
15
|
class SoundVelocityBuilder(Builder):
|
|
17
16
|
def __init__(
|
|
18
17
|
self,
|
|
19
|
-
|
|
18
|
+
phonon_materials: Store,
|
|
19
|
+
ddb_source: Store,
|
|
20
20
|
sound_vel: Store,
|
|
21
21
|
query: Optional[dict] = None,
|
|
22
22
|
manager: Optional[TaskManager] = None,
|
|
@@ -27,14 +27,17 @@ class SoundVelocityBuilder(Builder):
|
|
|
27
27
|
the phonon calculations.
|
|
28
28
|
|
|
29
29
|
Args:
|
|
30
|
-
|
|
30
|
+
phonon_materials (Store): source Store of phonon materials documents
|
|
31
|
+
containing abinit_input and abinit_output.
|
|
32
|
+
ddb_source (Store): source Store of ddb files. Matching the data in the materials Store.
|
|
31
33
|
sound_vel (Store): target Store of the sound velocity
|
|
32
34
|
query (dict): dictionary to limit materials to be analyzed
|
|
33
35
|
manager (TaskManager): an instance of the abipy TaskManager. If None it will be
|
|
34
36
|
generated from user configuration.
|
|
35
37
|
"""
|
|
36
38
|
|
|
37
|
-
self.
|
|
39
|
+
self.phonon_materials = phonon_materials
|
|
40
|
+
self.ddb_source = ddb_source
|
|
38
41
|
self.sound_vel = sound_vel
|
|
39
42
|
self.query = query or {}
|
|
40
43
|
|
|
@@ -43,7 +46,7 @@ class SoundVelocityBuilder(Builder):
|
|
|
43
46
|
else:
|
|
44
47
|
self.manager = manager
|
|
45
48
|
|
|
46
|
-
super().__init__(sources=[
|
|
49
|
+
super().__init__(sources=[phonon_materials], targets=[sound_vel], **kwargs)
|
|
47
50
|
|
|
48
51
|
def get_items(self) -> Iterator[Dict]:
|
|
49
52
|
"""
|
|
@@ -71,15 +74,12 @@ class SoundVelocityBuilder(Builder):
|
|
|
71
74
|
# file ids to be fetched
|
|
72
75
|
projection["abinit_output.ddb_id"] = 1
|
|
73
76
|
|
|
74
|
-
# initialize the gridfs
|
|
75
|
-
ddbfs = gridfs.GridFS(self.materials.collection.database, "ddb_fs")
|
|
76
|
-
|
|
77
77
|
for m in mats:
|
|
78
|
-
item = self.
|
|
78
|
+
item = self.phonon_materials.query_one(properties=projection, criteria={self.phonon_materials.key: m})
|
|
79
79
|
|
|
80
80
|
# Read the DDB file and pass as an object. Do not write here since in case of parallel
|
|
81
81
|
# execution each worker will write its own file.
|
|
82
|
-
item["ddb_str"] =
|
|
82
|
+
item["ddb_str"] = self.ddb_source.get(item["abinit_output"]["ddb_id"]).read().decode("utf-8")
|
|
83
83
|
|
|
84
84
|
yield item
|
|
85
85
|
|
|
@@ -229,11 +229,22 @@ class PartialChargesBuilder(Builder):
|
|
|
229
229
|
best_entry = relevant_entries[0]
|
|
230
230
|
task = best_entry["task_id"]
|
|
231
231
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
232
|
+
tdoc = self.tasks.query_one({"task_id": task,
|
|
233
|
+
"formula_alphabetical": formula,
|
|
234
|
+
"orig": {"$exists": True}})
|
|
235
|
+
|
|
236
|
+
if tdoc is None:
|
|
237
|
+
try:
|
|
238
|
+
tdoc = self.tasks.query_one({"task_id": int(task),
|
|
239
|
+
"formula_alphabetical": formula,
|
|
240
|
+
"orig": {"$exists": True}})
|
|
241
|
+
except ValueError:
|
|
242
|
+
tdoc = None
|
|
243
|
+
|
|
244
|
+
if tdoc is None:
|
|
245
|
+
continue
|
|
246
|
+
|
|
247
|
+
task_doc = TaskDocument(**tdoc)
|
|
237
248
|
|
|
238
249
|
if task_doc is None:
|
|
239
250
|
continue
|
|
@@ -277,7 +288,7 @@ class PartialChargesBuilder(Builder):
|
|
|
277
288
|
# Neither molecule_id nor method need to be unique, but the combination must be
|
|
278
289
|
self.charges.update(
|
|
279
290
|
docs=docs,
|
|
280
|
-
key=["molecule_id", "method"],
|
|
291
|
+
key=["molecule_id", "method", "solvent"],
|
|
281
292
|
)
|
|
282
293
|
else:
|
|
283
294
|
self.logger.info("No items to update")
|
|
@@ -488,15 +499,23 @@ class PartialSpinsBuilder(Builder):
|
|
|
488
499
|
best_entry = relevant_entries[0]
|
|
489
500
|
task = best_entry["task_id"]
|
|
490
501
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
"orig": {"$exists": True}})
|
|
495
|
-
)
|
|
502
|
+
tdoc = self.tasks.query_one({"task_id": task,
|
|
503
|
+
"formula_alphabetical": formula,
|
|
504
|
+
"orig": {"$exists": True}})
|
|
496
505
|
|
|
497
|
-
if
|
|
506
|
+
if tdoc is None:
|
|
507
|
+
try:
|
|
508
|
+
tdoc = self.tasks.query_one({"task_id": int(task),
|
|
509
|
+
"formula_alphabetical": formula,
|
|
510
|
+
"orig": {"$exists": True}})
|
|
511
|
+
except ValueError:
|
|
512
|
+
tdoc = None
|
|
513
|
+
|
|
514
|
+
if tdoc is None:
|
|
498
515
|
continue
|
|
499
516
|
|
|
517
|
+
task_doc = TaskDocument(**tdoc)
|
|
518
|
+
|
|
500
519
|
doc = PartialSpinsDoc.from_task(
|
|
501
520
|
task_doc,
|
|
502
521
|
molecule_id=mol.molecule_id,
|
|
@@ -538,7 +557,7 @@ class PartialSpinsBuilder(Builder):
|
|
|
538
557
|
# Neither molecule_id nor method need to be unique, but the combination must be
|
|
539
558
|
self.spins.update(
|
|
540
559
|
docs=docs,
|
|
541
|
-
key=["molecule_id", "method"],
|
|
560
|
+
key=["molecule_id", "method", "solvent"],
|
|
542
561
|
)
|
|
543
562
|
else:
|
|
544
563
|
self.logger.info("No items to update")
|
|
@@ -247,11 +247,22 @@ class BondingBuilder(Builder):
|
|
|
247
247
|
best_entry = relevant_entries[0]
|
|
248
248
|
task = best_entry["task_id"]
|
|
249
249
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
250
|
+
tdoc = self.tasks.query_one({"task_id": task,
|
|
251
|
+
"formula_alphabetical": formula,
|
|
252
|
+
"orig": {"$exists": True}})
|
|
253
|
+
|
|
254
|
+
if tdoc is None:
|
|
255
|
+
try:
|
|
256
|
+
tdoc = self.tasks.query_one({"task_id": int(task),
|
|
257
|
+
"formula_alphabetical": formula,
|
|
258
|
+
"orig": {"$exists": True}})
|
|
259
|
+
except ValueError:
|
|
260
|
+
tdoc = None
|
|
261
|
+
|
|
262
|
+
if tdoc is None:
|
|
263
|
+
continue
|
|
264
|
+
|
|
265
|
+
task_doc = TaskDocument(**tdoc)
|
|
255
266
|
|
|
256
267
|
if task_doc is None:
|
|
257
268
|
continue
|
|
@@ -294,7 +305,7 @@ class BondingBuilder(Builder):
|
|
|
294
305
|
# Neither molecule_id nor method need to be unique, but the combination must be
|
|
295
306
|
self.bonds.update(
|
|
296
307
|
docs=docs,
|
|
297
|
-
key=["molecule_id", "method"],
|
|
308
|
+
key=["molecule_id", "method", "solvent"],
|
|
298
309
|
)
|
|
299
310
|
else:
|
|
300
311
|
self.logger.info("No items to update")
|
|
@@ -213,11 +213,22 @@ class OrbitalBuilder(Builder):
|
|
|
213
213
|
for best in sorted_entries:
|
|
214
214
|
task = best["task_id"]
|
|
215
215
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
216
|
+
tdoc = self.tasks.query_one({"task_id": task,
|
|
217
|
+
"formula_alphabetical": formula,
|
|
218
|
+
"orig": {"$exists": True}})
|
|
219
|
+
|
|
220
|
+
if tdoc is None:
|
|
221
|
+
try:
|
|
222
|
+
tdoc = self.tasks.query_one({"task_id": int(task),
|
|
223
|
+
"formula_alphabetical": formula,
|
|
224
|
+
"orig": {"$exists": True}})
|
|
225
|
+
except ValueError:
|
|
226
|
+
tdoc = None
|
|
227
|
+
|
|
228
|
+
if tdoc is None:
|
|
229
|
+
continue
|
|
230
|
+
|
|
231
|
+
task_doc = TaskDocument(**tdoc)
|
|
221
232
|
|
|
222
233
|
if task_doc is None:
|
|
223
234
|
continue
|
|
@@ -258,7 +269,7 @@ class OrbitalBuilder(Builder):
|
|
|
258
269
|
self.orbitals.remove_docs({self.orbitals.key: {"$in": molecule_ids}})
|
|
259
270
|
self.orbitals.update(
|
|
260
271
|
docs=docs,
|
|
261
|
-
key=["molecule_id"],
|
|
272
|
+
key=["molecule_id", "solvent"],
|
|
262
273
|
)
|
|
263
274
|
else:
|
|
264
275
|
self.logger.info("No items to update")
|
|
@@ -5,9 +5,6 @@ from itertools import chain, groupby
|
|
|
5
5
|
from math import ceil
|
|
6
6
|
from typing import Any, Dict, Iterable, Iterator, List, Optional, Union
|
|
7
7
|
|
|
8
|
-
from pymatgen.analysis.graphs import MoleculeGraph
|
|
9
|
-
from pymatgen.analysis.local_env import OpenBabelNN
|
|
10
|
-
|
|
11
8
|
from maggma.builders import Builder
|
|
12
9
|
from maggma.core import Store
|
|
13
10
|
from maggma.utils import grouper
|
|
@@ -17,7 +14,7 @@ from emmet.core.qchem.molecule import MoleculeDoc
|
|
|
17
14
|
from emmet.core.molecules.bonds import metals
|
|
18
15
|
from emmet.core.molecules.thermo import ThermoDoc
|
|
19
16
|
from emmet.core.molecules.redox import RedoxDoc
|
|
20
|
-
from emmet.core.utils import confirm_molecule, jsanitize
|
|
17
|
+
from emmet.core.utils import confirm_molecule, get_graph_hash, jsanitize
|
|
21
18
|
from emmet.builders.settings import EmmetBuildSettings
|
|
22
19
|
|
|
23
20
|
|
|
@@ -213,26 +210,54 @@ class RedoxBuilder(Builder):
|
|
|
213
210
|
continue
|
|
214
211
|
|
|
215
212
|
ie_sp_task_ids = [
|
|
216
|
-
|
|
213
|
+
e["task_id"] for e in gg.entries
|
|
217
214
|
if e["charge"] == gg.charge + 1
|
|
218
215
|
and e["task_type"] == "Single Point"
|
|
219
216
|
and e["output"].get("final_energy")
|
|
220
217
|
]
|
|
221
|
-
ie_tasks =
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
218
|
+
ie_tasks = list()
|
|
219
|
+
for i in ie_sp_task_ids:
|
|
220
|
+
tdoc = self.tasks.query_one({"task_id": i,
|
|
221
|
+
"formula_alphabetical": formula,
|
|
222
|
+
"orig": {"$exists": True}})
|
|
223
|
+
|
|
224
|
+
if tdoc is None:
|
|
225
|
+
try:
|
|
226
|
+
tdoc = self.tasks.query_one({"task_id": int(i),
|
|
227
|
+
"formula_alphabetical": formula,
|
|
228
|
+
"orig": {"$exists": True}})
|
|
229
|
+
except ValueError:
|
|
230
|
+
tdoc = None
|
|
231
|
+
|
|
232
|
+
if tdoc is None:
|
|
233
|
+
continue
|
|
234
|
+
|
|
235
|
+
ie_tasks.append(TaskDocument(**tdoc))
|
|
225
236
|
|
|
226
237
|
ea_sp_task_ids = [
|
|
227
|
-
|
|
238
|
+
e["task_id"] for e in gg.entries
|
|
228
239
|
if e["charge"] == gg.charge - 1
|
|
229
240
|
and e["task_type"] == "Single Point"
|
|
230
241
|
and e["output"].get("final_energy")
|
|
231
242
|
]
|
|
232
|
-
ea_tasks =
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
243
|
+
ea_tasks = list()
|
|
244
|
+
for i in ea_sp_task_ids:
|
|
245
|
+
tdoc = self.tasks.query_one({"task_id": i,
|
|
246
|
+
"formula_alphabetical": formula,
|
|
247
|
+
"orig": {"$exists": True}})
|
|
248
|
+
|
|
249
|
+
if tdoc is None:
|
|
250
|
+
try:
|
|
251
|
+
tdoc = self.tasks.query_one({"task_id": int(i),
|
|
252
|
+
"formula_alphabetical": formula,
|
|
253
|
+
"orig": {"$exists": True}})
|
|
254
|
+
except ValueError:
|
|
255
|
+
tdoc = None
|
|
256
|
+
|
|
257
|
+
if tdoc is None:
|
|
258
|
+
continue
|
|
259
|
+
|
|
260
|
+
ea_tasks.append(TaskDocument(**tdoc))
|
|
236
261
|
|
|
237
262
|
grouped_docs = self._collect_by_lot_solvent(thermo_docs, ie_tasks, ea_tasks)
|
|
238
263
|
if gg.charge in charges:
|
|
@@ -325,7 +350,7 @@ class RedoxBuilder(Builder):
|
|
|
325
350
|
self.redox.remove_docs({self.redox.key: {"$in": molecule_ids}})
|
|
326
351
|
self.redox.update(
|
|
327
352
|
docs=docs,
|
|
328
|
-
key=["molecule_id"],
|
|
353
|
+
key=["molecule_id", "solvent"],
|
|
329
354
|
)
|
|
330
355
|
else:
|
|
331
356
|
self.logger.info("No items to update")
|
|
@@ -339,7 +364,7 @@ class RedoxBuilder(Builder):
|
|
|
339
364
|
:return: Grouped molecule entries
|
|
340
365
|
"""
|
|
341
366
|
|
|
342
|
-
|
|
367
|
+
graph_hashes_nometal: List[str] = list()
|
|
343
368
|
results = defaultdict(list)
|
|
344
369
|
|
|
345
370
|
# Within each group, group by the covalent molecular graph
|
|
@@ -352,19 +377,17 @@ class RedoxBuilder(Builder):
|
|
|
352
377
|
mol_nometal.remove_species(metals)
|
|
353
378
|
|
|
354
379
|
mol_nometal.set_charge_and_spin(0)
|
|
355
|
-
|
|
356
|
-
mol_nometal, OpenBabelNN()
|
|
357
|
-
)
|
|
380
|
+
gh_nometal = get_graph_hash(mol_nometal, node_attr="specie")
|
|
358
381
|
|
|
359
382
|
match = None
|
|
360
|
-
for i,
|
|
361
|
-
if
|
|
383
|
+
for i, gh in enumerate(graph_hashes_nometal):
|
|
384
|
+
if gh_nometal == gh:
|
|
362
385
|
match = i
|
|
363
386
|
break
|
|
364
387
|
|
|
365
388
|
if match is None:
|
|
366
|
-
results[len(
|
|
367
|
-
|
|
389
|
+
results[len(graph_hashes_nometal)].append(t)
|
|
390
|
+
graph_hashes_nometal.append(gh_nometal)
|
|
368
391
|
else:
|
|
369
392
|
results[match].append(t)
|
|
370
393
|
|
|
@@ -3,6 +3,8 @@ from itertools import chain
|
|
|
3
3
|
from math import ceil
|
|
4
4
|
from typing import Any, Optional, Iterable, Iterator, List, Dict
|
|
5
5
|
|
|
6
|
+
# from monty.serialization import loadfn, dumpfn
|
|
7
|
+
|
|
6
8
|
from maggma.builders import Builder
|
|
7
9
|
from maggma.core import Store
|
|
8
10
|
from maggma.utils import grouper
|
|
@@ -284,6 +286,10 @@ class SummaryBuilder(Builder):
|
|
|
284
286
|
for td in to_delete:
|
|
285
287
|
del d[td]
|
|
286
288
|
|
|
289
|
+
# For debugging; keep because it might be needed again
|
|
290
|
+
# dumpfn(d, f"{mol_id}.json.gz")
|
|
291
|
+
# break
|
|
292
|
+
|
|
287
293
|
summary_doc = SummaryDoc.from_docs(molecule_id=mol_id, docs=d)
|
|
288
294
|
summary_docs.append(summary_doc)
|
|
289
295
|
|
|
@@ -255,7 +255,7 @@ class ThermoBuilder(Builder):
|
|
|
255
255
|
|
|
256
256
|
thermo_docs = list()
|
|
257
257
|
|
|
258
|
-
mm = MoleculeMatcher()
|
|
258
|
+
mm = MoleculeMatcher(tolerance=0.000001)
|
|
259
259
|
|
|
260
260
|
for mol in mols:
|
|
261
261
|
this_thermo_docs = list()
|
|
@@ -277,7 +277,7 @@ class ThermoBuilder(Builder):
|
|
|
277
277
|
task_type = entry["task_type"]
|
|
278
278
|
|
|
279
279
|
if (
|
|
280
|
-
task_type
|
|
280
|
+
task_type in ["Single Point", "Force"]
|
|
281
281
|
and entry["charge"] == mol.charge
|
|
282
282
|
and entry["spin_multiplicity"] == mol.spin_multiplicity
|
|
283
283
|
):
|
|
@@ -307,11 +307,22 @@ class ThermoBuilder(Builder):
|
|
|
307
307
|
)[0]
|
|
308
308
|
task = best["task_id"]
|
|
309
309
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
310
|
+
tdoc = self.tasks.query_one({"task_id": task,
|
|
311
|
+
"formula_alphabetical": formula,
|
|
312
|
+
"orig": {"$exists": True}})
|
|
313
|
+
|
|
314
|
+
if tdoc is None:
|
|
315
|
+
try:
|
|
316
|
+
tdoc = self.tasks.query_one({"task_id": int(task),
|
|
317
|
+
"formula_alphabetical": formula,
|
|
318
|
+
"orig": {"$exists": True}})
|
|
319
|
+
except ValueError:
|
|
320
|
+
tdoc = None
|
|
321
|
+
|
|
322
|
+
if tdoc is None:
|
|
323
|
+
continue
|
|
324
|
+
|
|
325
|
+
task_doc = TaskDocument(**tdoc)
|
|
315
326
|
|
|
316
327
|
if task_doc is None:
|
|
317
328
|
continue
|
|
@@ -337,9 +348,11 @@ class ThermoBuilder(Builder):
|
|
|
337
348
|
|
|
338
349
|
matching_structures = list()
|
|
339
350
|
for entry in thermo_entries:
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
351
|
+
mol1 = Molecule.from_dict(entry["molecule"])
|
|
352
|
+
mol2 = Molecule.from_dict(best_spec["molecule"])
|
|
353
|
+
if ((mm.fit(mol1, mol2) or mol1 == mol2)
|
|
354
|
+
and (sum(evaluate_lot(best_spec["level_of_theory"])) <
|
|
355
|
+
sum(evaluate_lot(entry["level_of_theory"])))):
|
|
343
356
|
matching_structures.append(entry)
|
|
344
357
|
|
|
345
358
|
if len(matching_structures) == 0:
|
|
@@ -416,7 +429,7 @@ class ThermoBuilder(Builder):
|
|
|
416
429
|
self.thermo.remove_docs({self.thermo.key: {"$in": molecule_ids}})
|
|
417
430
|
self.thermo.update(
|
|
418
431
|
docs=docs,
|
|
419
|
-
key=["molecule_id"],
|
|
432
|
+
key=["molecule_id", "solvent"],
|
|
420
433
|
)
|
|
421
434
|
else:
|
|
422
435
|
self.logger.info("No items to update")
|
|
@@ -206,11 +206,22 @@ class VibrationBuilder(Builder):
|
|
|
206
206
|
)[0]
|
|
207
207
|
task = best["task_id"]
|
|
208
208
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
209
|
+
tdoc = self.tasks.query_one({"task_id": task,
|
|
210
|
+
"formula_alphabetical": formula,
|
|
211
|
+
"orig": {"$exists": True}})
|
|
212
|
+
|
|
213
|
+
if tdoc is None:
|
|
214
|
+
try:
|
|
215
|
+
tdoc = self.tasks.query_one({"task_id": int(task),
|
|
216
|
+
"formula_alphabetical": formula,
|
|
217
|
+
"orig": {"$exists": True}})
|
|
218
|
+
except ValueError:
|
|
219
|
+
tdoc = None
|
|
220
|
+
|
|
221
|
+
if tdoc is None:
|
|
222
|
+
continue
|
|
223
|
+
|
|
224
|
+
task_doc = TaskDocument(**tdoc)
|
|
214
225
|
|
|
215
226
|
if task_doc is None:
|
|
216
227
|
continue
|
|
@@ -249,7 +260,7 @@ class VibrationBuilder(Builder):
|
|
|
249
260
|
self.vibes.remove_docs({self.vibes.key: {"$in": molecule_ids}})
|
|
250
261
|
self.vibes.update(
|
|
251
262
|
docs=docs,
|
|
252
|
-
key=["molecule_id"],
|
|
263
|
+
key=["molecule_id", "solvent"],
|
|
253
264
|
)
|
|
254
265
|
else:
|
|
255
266
|
self.logger.info("No items to update")
|