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.

Files changed (97) hide show
  1. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/PKG-INFO +1 -1
  2. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/abinit/phonon.py +2 -1
  3. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/abinit/sound_velocity.py +10 -10
  4. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/atomic.py +32 -13
  5. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/bonds.py +17 -6
  6. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/orbitals.py +17 -6
  7. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/redox.py +46 -23
  8. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/summary.py +6 -0
  9. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/thermo.py +24 -11
  10. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/vibration.py +17 -6
  11. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/qchem/molecules.py +193 -64
  12. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/PKG-INFO +1 -1
  13. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/deployment.txt +7 -7
  14. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.10.txt +5 -5
  15. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.10_extras.txt +10 -12
  16. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.11.txt +5 -5
  17. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.11_extras.txt +10 -12
  18. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.8.txt +6 -6
  19. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.8_extras.txt +11 -13
  20. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.9.txt +6 -6
  21. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/macos-latest_py3.9_extras.txt +11 -13
  22. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.10.txt +5 -5
  23. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.10_extras.txt +10 -12
  24. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.11.txt +5 -5
  25. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.11_extras.txt +10 -12
  26. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.8.txt +6 -6
  27. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.8_extras.txt +11 -13
  28. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.9.txt +6 -6
  29. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/requirements/ubuntu-latest_py3.9_extras.txt +11 -13
  30. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_atomic.py +5 -5
  31. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_bonds.py +3 -3
  32. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_orbitals.py +3 -3
  33. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_redox.py +2 -2
  34. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_summary.py +2 -2
  35. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_thermo.py +2 -2
  36. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/test_vibration.py +2 -2
  37. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_qchem.py +4 -4
  38. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/__init__.py +0 -0
  39. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/abinit/__init__.py +0 -0
  40. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/feff/__init__.py +0 -0
  41. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/feff/xas.py +0 -0
  42. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/__init__.py +0 -0
  43. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/absorption_spectrum.py +0 -0
  44. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/alloys.py +0 -0
  45. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/basic_descriptors.py +0 -0
  46. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/bonds.py +0 -0
  47. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/chemenv.py +0 -0
  48. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/corrected_entries.py +0 -0
  49. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/dielectric.py +0 -0
  50. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/elasticity.py +0 -0
  51. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/electrodes.py +0 -0
  52. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/electronic_structure.py +0 -0
  53. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/magnetism.py +0 -0
  54. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/optimade.py +0 -0
  55. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/oxidation_states.py +0 -0
  56. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/piezoelectric.py +0 -0
  57. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/provenance.py +0 -0
  58. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/robocrys.py +0 -0
  59. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/similarity.py +0 -0
  60. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/substrates.py +0 -0
  61. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/summary.py +0 -0
  62. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/materials/thermo.py +0 -0
  63. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/mobility/__init__.py +0 -0
  64. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/mobility/migration_graph.py +0 -0
  65. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/molecules/__init__.py +0 -0
  66. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/qchem/__init__.py +0 -0
  67. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/settings.py +0 -0
  68. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/utils.py +0 -0
  69. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/vasp/__init__.py +0 -0
  70. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/vasp/materials.py +0 -0
  71. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet/builders/vasp/task_validator.py +0 -0
  72. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/SOURCES.txt +0 -0
  73. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/dependency_links.txt +0 -0
  74. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/not-zip-safe +0 -0
  75. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/requires.txt +0 -0
  76. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/emmet_builders.egg-info/top_level.txt +0 -0
  77. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/setup.cfg +0 -0
  78. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/setup.py +0 -0
  79. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/__init__.py +0 -0
  80. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/conftest.py +0 -0
  81. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/molecules/__init__.py +0 -0
  82. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_absorption.py +0 -0
  83. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_basic_descriptors.py +0 -0
  84. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_chemenv.py +0 -0
  85. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_corrected_entries_thermo.py +0 -0
  86. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_dielectric.py +0 -0
  87. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_elasticity.py +0 -0
  88. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_electronic_structure.py +0 -0
  89. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_magnetism.py +0 -0
  90. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_materials.py +0 -0
  91. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_mobility.py +0 -0
  92. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_oxidation.py +0 -0
  93. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_piezoelectric.py +0 -0
  94. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_similarity.py +0 -0
  95. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_summary.py +0 -0
  96. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_utils.py +0 -0
  97. {emmet-builders-0.48.2 → emmet-builders-0.48.4}/tests/test_vasp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: emmet-builders
3
- Version: 0.48.2
3
+ Version: 0.48.4
4
4
  Summary: Builders for the Emmet Library
5
5
  Home-page: https://github.com/materialsproject/emmet
6
6
  Author: The Materials Project
@@ -56,7 +56,8 @@ class PhononBuilder(Builder):
56
56
  standard MongoDB document.
57
57
 
58
58
  Args:
59
- materials (Store): source Store of materials documents.
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
- materials: Store,
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
- materials (Store): source Store of materials documents
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.materials = materials
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=[materials], targets=[sound_vel], **kwargs)
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.materials.query_one(properties=projection, criteria={self.materials.key: m})
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"] = ddbfs.get(item["abinit_output"]["ddb_id"]).read().decode("utf-8")
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
- task_doc = TaskDocument(
233
- **self.tasks.query_one({"task_id": int(task),
234
- "formula_alphabetical": formula,
235
- "orig": {"$exists": True}})
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
- task_doc = TaskDocument(
492
- **self.tasks.query_one({"task_id": int(task),
493
- "formula_alphabetical": formula,
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 task_doc is None:
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
- task_doc = TaskDocument(
251
- **self.tasks.query_one({"task_id": int(task),
252
- "formula_alphabetical": formula,
253
- "orig": {"$exists": True}})
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
- task_doc = TaskDocument(
217
- **self.tasks.query_one({"task_id": int(task),
218
- "formula_alphabetical": formula,
219
- "orig": {"$exists": True}})
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
- int(e["task_id"]) for e in gg.entries
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 = [TaskDocument(**e) for e in self.tasks.query({"task_id": {"$in": ie_sp_task_ids},
222
- "formula_alphabetical": formula,
223
- "orig": {"$exists": True}
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
- int(e["task_id"]) for e in gg.entries
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 = [TaskDocument(**e) for e in self.tasks.query({"task_id": {"$in": ea_sp_task_ids},
233
- "formula_alphabetical": formula,
234
- "orig": {"$exists": True}
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
- mol_graphs_nometal: List[MoleculeGraph] = list()
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
- mg_nometal = MoleculeGraph.with_local_env_strategy(
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, mg in enumerate(mol_graphs_nometal):
361
- if mg_nometal.isomorphic_to(mg):
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(mol_graphs_nometal)].append(t)
367
- mol_graphs_nometal.append(mg_nometal)
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 == "Single Point"
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
- task_doc = TaskDocument(
311
- **self.tasks.query_one({"task_id": int(task),
312
- "formula_alphabetical": formula,
313
- "orig": {"$exists": True}})
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
- if (mm.fit(Molecule.from_dict(entry["molecule"]), Molecule.from_dict(best_spec["molecule"]))
341
- and (sum(evaluate_lot(entry["level_of_theory"])) <
342
- sum(evaluate_lot(best_spec["level_of_theory"])))):
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
- task_doc = TaskDocument(
210
- **self.tasks.query_one({"task_id": int(task),
211
- "formula_alphabetical": formula,
212
- "orig": {"$exists": True}})
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")