digichem-core 6.10.1__tar.gz → 6.10.3__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.
Files changed (125) hide show
  1. {digichem_core-6.10.1 → digichem_core-6.10.3}/.github/workflows/python-main-pull.yml +9 -1
  2. {digichem_core-6.10.1 → digichem_core-6.10.3}/.github/workflows/python-main-push.yml +2 -1
  3. {digichem_core-6.10.1 → digichem_core-6.10.3}/PKG-INFO +1 -1
  4. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/__init__.py +2 -2
  5. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/config/base.py +1 -1
  6. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/render.py +6 -4
  7. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/misc/io.py +11 -0
  8. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/cclib.py +47 -11
  9. digichem_core-6.10.3/digichem/parse/pyscf.py +35 -0
  10. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/metadata.py +45 -10
  11. digichem_core-6.10.3/digichem/test/conftest.py +9 -0
  12. digichem_core-6.10.3/digichem/test/mock/cubegen +87172 -0
  13. digichem_core-6.10.3/digichem/test/mock/formchk +9456 -0
  14. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_image.py +54 -42
  15. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/util.py +2 -0
  16. digichem_core-6.10.1/digichem/parse/pyscf.py +0 -25
  17. digichem_core-6.10.1/digichem/test/conftest.py +0 -4
  18. {digichem_core-6.10.1 → digichem_core-6.10.3}/.github/workflows/python-pypi-publish.yml +0 -0
  19. {digichem_core-6.10.1 → digichem_core-6.10.3}/.github/workflows/release-on-tag.yml +0 -0
  20. {digichem_core-6.10.1 → digichem_core-6.10.3}/.gitignore +0 -0
  21. {digichem_core-6.10.1 → digichem_core-6.10.3}/.gitmodules +0 -0
  22. {digichem_core-6.10.1 → digichem_core-6.10.3}/Banner.png +0 -0
  23. {digichem_core-6.10.1 → digichem_core-6.10.3}/COPYING.md +0 -0
  24. {digichem_core-6.10.1 → digichem_core-6.10.3}/LICENSE +0 -0
  25. {digichem_core-6.10.1 → digichem_core-6.10.3}/README.md +0 -0
  26. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/basis.py +0 -0
  27. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/config/README +0 -0
  28. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/config/__init__.py +0 -0
  29. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/config/locations.py +0 -0
  30. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/config/parse.py +0 -0
  31. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/config/util.py +0 -0
  32. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/README +0 -0
  33. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/batoms/COPYING +0 -0
  34. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/batoms/LICENSE +0 -0
  35. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/batoms/README +0 -0
  36. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/batoms/__init__.py +0 -0
  37. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/batoms/batoms-renderer.py +0 -0
  38. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/batoms/batoms_renderer.py +0 -0
  39. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/config/digichem.yaml +0 -0
  40. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/functionals.csv +0 -0
  41. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/solvents.csv +0 -0
  42. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/tachyon/COPYING.md +0 -0
  43. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/tachyon/LICENSE +0 -0
  44. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/tachyon/tachyon_LINUXAMD64 +0 -0
  45. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/vmd/common.tcl +0 -0
  46. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/vmd/generate_combined_orbital_images.tcl +0 -0
  47. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/vmd/generate_density_images.tcl +0 -0
  48. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/vmd/generate_dipole_images.tcl +0 -0
  49. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/vmd/generate_orbital_images.tcl +0 -0
  50. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/vmd/generate_spin_images.tcl +0 -0
  51. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/data/vmd/generate_structure_images.tcl +0 -0
  52. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/datas.py +0 -0
  53. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/exception/__init__.py +0 -0
  54. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/exception/base.py +0 -0
  55. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/exception/uncatchable.py +0 -0
  56. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/file/__init__.py +0 -0
  57. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/file/base.py +0 -0
  58. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/file/cube.py +0 -0
  59. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/file/fchk.py +0 -0
  60. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/file/prattle.py +0 -0
  61. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/file/types.py +0 -0
  62. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/__init__.py +0 -0
  63. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/base.py +0 -0
  64. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/excited_states.py +0 -0
  65. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/graph.py +0 -0
  66. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/orbitals.py +0 -0
  67. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/spectroscopy.py +0 -0
  68. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/structure.py +0 -0
  69. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/image/vmd.py +0 -0
  70. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/input/__init__.py +0 -0
  71. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/input/base.py +0 -0
  72. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/input/digichem_input.py +0 -0
  73. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/input/gaussian.py +0 -0
  74. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/log.py +0 -0
  75. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/memory.py +0 -0
  76. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/misc/__init__.py +0 -0
  77. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/misc/argparse.py +0 -0
  78. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/misc/base.py +0 -0
  79. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/misc/layered_dict.py +0 -0
  80. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/misc/text.py +0 -0
  81. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/misc/time.py +0 -0
  82. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/__init__.py +0 -0
  83. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/base.py +0 -0
  84. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/dump.py +0 -0
  85. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/gaussian.py +0 -0
  86. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/orca.py +0 -0
  87. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/turbomole.py +0 -0
  88. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/parse/util.py +0 -0
  89. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/__init__.py +0 -0
  90. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/alignment/AA.py +0 -0
  91. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/alignment/AAA.py +0 -0
  92. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/alignment/FAP.py +0 -0
  93. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/alignment/__init__.py +0 -0
  94. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/alignment/base.py +0 -0
  95. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/angle.py +0 -0
  96. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/atom.py +0 -0
  97. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/base.py +0 -0
  98. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/dipole_moment.py +0 -0
  99. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/emission.py +0 -0
  100. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/energy.py +0 -0
  101. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/excited_state.py +0 -0
  102. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/ground_state.py +0 -0
  103. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/multi.py +0 -0
  104. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/nmr.py +0 -0
  105. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/orbital.py +0 -0
  106. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/result.py +0 -0
  107. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/soc.py +0 -0
  108. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/spectroscopy.py +0 -0
  109. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/tdm.py +0 -0
  110. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/result/vibration.py +0 -0
  111. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/__init__.py +0 -0
  112. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_basis.py +0 -0
  113. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_calculate.py +0 -0
  114. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_config.py +0 -0
  115. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_cube.py +0 -0
  116. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_exception.py +0 -0
  117. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_file.py +0 -0
  118. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_input.py +0 -0
  119. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_memory.py +0 -0
  120. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_parsing.py +0 -0
  121. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_prattle.py +0 -0
  122. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_result.py +0 -0
  123. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/test/test_translate.py +0 -0
  124. {digichem_core-6.10.1 → digichem_core-6.10.3}/digichem/translate.py +0 -0
  125. {digichem_core-6.10.1 → digichem_core-6.10.3}/pyproject.toml +0 -0
@@ -11,7 +11,7 @@ permissions:
11
11
  contents: read
12
12
 
13
13
  jobs:
14
- build:
14
+ Test:
15
15
 
16
16
  defaults:
17
17
  run:
@@ -53,6 +53,14 @@ jobs:
53
53
  flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
54
54
  # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
55
55
  flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
56
+ - name: Download blender
57
+ run: |
58
+ cd ~/
59
+ wget https://github.com/Digichem-Project/build-boy/releases/download/6.8.2-CentOS-Stream-8/blender.4.4.batoms.CentOS-Stream-8.tar.gz -O blender.tar.gz --quiet
60
+ tar -xzf blender.tar.gz
61
+ cd blender
62
+ ln -s blender batoms-blender
63
+ echo "$HOME/blender" >> $GITHUB_PATH
56
64
  - name: Test with pytest
57
65
  run: |
58
66
  export PYTHONPATH="./:$PYTHONPATH"
@@ -11,7 +11,7 @@ permissions:
11
11
  contents: write
12
12
 
13
13
  jobs:
14
- build:
14
+ Test:
15
15
 
16
16
  defaults:
17
17
  run:
@@ -62,6 +62,7 @@ jobs:
62
62
  export PYTHONPATH="./:$PYTHONPATH"
63
63
  pytest
64
64
  - name: Commit changes
65
+ continue-on-error: true
65
66
  run: |
66
67
  git config --global user.email "osl@st-andrews.ac.uk"
67
68
  git config --global user.name "Oliver Lee"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digichem-core
3
- Version: 6.10.1
3
+ Version: 6.10.3
4
4
  Summary: Open-source library for Digichem core components
5
5
  Project-URL: Homepage, https://github.com/Digichem-Project/digichem-core
6
6
  Project-URL: Documentation, https://doc.digi-chem.co.uk
@@ -20,7 +20,7 @@ from digichem.datas import get_resource
20
20
  # development = prerelease is not None
21
21
  # # The full version number of this package.
22
22
  # __version__ = "{}.{}.{}{}".format(major_version, minor_version, revision, "-pre.{}".format(prerelease) if development else "")
23
- __version__ = "6.10.1"
23
+ __version__ = "6.10.3"
24
24
  _v_parts = __version__.split("-")[0].split(".")
25
25
  major_version = int(_v_parts[0])
26
26
  minor_version = int(_v_parts[1])
@@ -39,7 +39,7 @@ __author__ = [
39
39
  ]
40
40
 
41
41
  # Program date (when we were last updated). This is changed automatically.
42
- _last_updated_string = "28/05/2025"
42
+ _last_updated_string = "09/06/2025"
43
43
  last_updated = datetime.strptime(_last_updated_string, "%d/%m/%Y")
44
44
 
45
45
  # The sys attribute 'frozen' is our flag, '_MEIPASS' is the dir location.
@@ -72,7 +72,7 @@ Possible options are:
72
72
  ),
73
73
  batoms = Options(help = "Beautiful Atoms/Blender specific options (only applies if engine == 'batoms'",
74
74
  blender = Option(help = "Path to the blender executable, in which beautiful atoms should be installed", default = "batoms-blender"),
75
- cpus = Option(help = "The number of CPUs/threads to use. This option is overridden if running in a calculation environemnt (where it uses the same number of CPUs as the calculation did)", type = int, default = 1),
75
+ cpus = Option(help = "The number of CPUs/threads to use. This option is overridden if running in a calculation environment (where it uses the same number of CPUs as the calculation did)", type = int, default = 1),
76
76
  render_samples = Option(help = "The number of render samples (or passes) to use. Higher values result in higher image quality and greater render times", type = int, default = 32),
77
77
  perspective = Option(help = "The perspective mode", choices = ["orthographic", "perspective"], default = "perspective"),
78
78
  stacking = Option(help = "The number of image copies to composite together to avoid transparency artifacts", type = int, default = 10)
@@ -247,7 +247,6 @@ class Batoms_renderer(Render_maker):
247
247
  # "--render-samples", f"{samples}",
248
248
  "--perspective", f"{self.perspective}",
249
249
  "--padding", f"{padding}",
250
- "--rotations",
251
250
  ]
252
251
  for orientation, resolution, samples, mini_file_name in targets:
253
252
  args.extend([
@@ -258,9 +257,12 @@ class Batoms_renderer(Render_maker):
258
257
  mini_file_name
259
258
  ])
260
259
 
261
- # Add rotations.
262
- for rotation in self.rotations:
263
- args.append(json.dumps(rotation))
260
+ if len(self.rotations) > 0:
261
+ args.append("--rotations")
262
+
263
+ # Add rotations.
264
+ for rotation in self.rotations:
265
+ args.append(json.dumps(rotation))
264
266
 
265
267
  return args
266
268
 
@@ -6,6 +6,7 @@ import os
6
6
  import shutil
7
7
  import sys
8
8
  import warnings
9
+ import itertools
9
10
  from uuid import uuid4
10
11
  import hashlib
11
12
 
@@ -320,3 +321,13 @@ class Safe_path():
320
321
  """
321
322
  # Close our file.
322
323
  self.close()
324
+
325
+ def dir_size(target):
326
+ """
327
+ Calculate the total used file space of a directory and all contents.
328
+ """
329
+ bytes = 0
330
+ for path in itertools.chain(Path(target).rglob("*"), [Path(target)]):
331
+ bytes += path.stat().st_size
332
+
333
+ return bytes
@@ -156,15 +156,49 @@ class Cclib_parser(File_parser_abc):
156
156
  headers = next(reader)
157
157
 
158
158
  # Check headers match.
159
- if (headers[0] != "Duration / s" or
160
- headers[1] != "Memory Used (Real) / bytes" or
161
- headers[2] != "Memory Used (Real) / %" or
162
- headers[3] != "Memory Available (Real) / bytes" or
163
- headers[4] != "Memory Available (Real) / %" or
164
- headers[9] != "CPU Usage / %" or
165
- headers[15] != "Output Directory Available / bytes" or
166
- headers[17] != "Scratch Directory Available / bytes"
159
+ if (headers[0] == "Duration / s" and
160
+ headers[1] == "Memory Used (Real) / bytes" and
161
+ headers[2] == "Memory Used (Real) / %" and
162
+ headers[3] == "Memory Available (Real) / bytes" and
163
+ headers[4] == "Memory Available (Real) / %" and
164
+ headers[9] == "CPU Usage / %" and
165
+ headers[15] == "Output Directory Available / bytes" and
166
+ headers[17] == "Scratch Directory Used / bytes" and
167
+ headers[18] == "Scratch Directory Available / bytes"
167
168
  ):
169
+ column_map = {
170
+ "duration": 0,
171
+ "memory_used": 1,
172
+ "memory_used_percent": 2,
173
+ "memory_available": 3,
174
+ "memory_available_percent": 4,
175
+ "cpu_used": 9,
176
+ "output_available": 15,
177
+ "scratch_used": 17,
178
+ "scratch_available": 18
179
+ }
180
+
181
+ elif (headers[0] == "Duration / s" and
182
+ headers[1] == "Memory Used (Real) / bytes" and
183
+ headers[2] == "Memory Used (Real) / %" and
184
+ headers[3] == "Memory Available (Real) / bytes" and
185
+ headers[4] == "Memory Available (Real) / %" and
186
+ headers[9] == "CPU Usage / %" and
187
+ headers[15] == "Output Directory Available / bytes" and
188
+ headers[17] == "Scratch Directory Available / bytes"
189
+ ):
190
+ column_map = {
191
+ "duration": 0,
192
+ "memory_used": 1,
193
+ "memory_used_percent": 2,
194
+ "memory_available": 3,
195
+ "memory_available_percent": 4,
196
+ "cpu_used": 9,
197
+ "output_available": 15,
198
+ "scratch_available": 17
199
+ }
200
+
201
+ else:
168
202
  raise Digichem_exception("wrong headers found in profile.csv file")
169
203
 
170
204
  # Then the body.
@@ -185,17 +219,19 @@ class Cclib_parser(File_parser_abc):
185
219
  # - cpu used
186
220
  # - output space
187
221
  # - scratch space
188
- new_data = numpy.zeros((math.ceil(lines / factor), 8))
222
+ new_data = numpy.zeros((math.ceil(lines / factor), len(column_map)))
189
223
 
190
224
  # Now decimate.
191
- for i, k in enumerate([0,1,2,3,4,9,15,17]):
225
+ for i, k in enumerate(column_map.values()):
192
226
  if factor > 1:
193
227
  new_data[:, i] = signal.decimate(data[:, k], factor)
194
228
  else:
195
229
  new_data[:, i] = data[:, k]
196
230
 
197
231
 
198
- self.data.metadata['performance'] = new_data
232
+ self.data.metadata['performance'] = {
233
+ key: new_data[:, index] for index, key in enumerate(column_map)
234
+ }
199
235
 
200
236
 
201
237
  def parse_output_line(self, log_file, line):
@@ -0,0 +1,35 @@
1
+ import hashlib
2
+ import json
3
+ from uuid import uuid4
4
+
5
+ from cclib.bridge.cclib2pyscf import cclibfrommethods
6
+
7
+ from digichem.parse.base import Parser_abc
8
+ import digichem.log
9
+
10
+ class Pyscf_parser(Parser_abc):
11
+ """
12
+ Top level class for parsing output from pyscf data.
13
+ """
14
+
15
+ def __init__(self, mol_name, methods, **kwargs):
16
+ self.methods = methods
17
+ self.mol_name = mol_name
18
+ super().__init__(**kwargs)
19
+
20
+ def _parse(self):
21
+ self.data = cclibfrommethods(**self.methods)
22
+
23
+ try:
24
+ # Try to generate a checksum from metadata.
25
+ self.data._id = hashlib.sha1(json.dumps(self.data.metadata, sort_keys = True).encode('utf-8')).hexdigest()
26
+
27
+ except Exception:
28
+ # No luck, something in metadata must be unhashable.
29
+ digichem.log.get_logger().error("Unable to generate hash ID from calculation metadata, using random ID instead", exc_info = True)
30
+ # TODO: Think of a better way to do this.
31
+ self.data._id = hashlib.sha1(uuid4().hex.encode('utf-8')).hexdigest()
32
+
33
+ self.data.metadata['name'] = self.mol_name
34
+ self.data._aux = {'methods': self.methods}
35
+
@@ -679,8 +679,9 @@ class Performance(Result_object):
679
679
  memory_available = [],
680
680
  memory_available_percent = [],
681
681
  cpu_used = [],
682
- output_space = [],
683
- scratch_space = [],
682
+ output_available = [],
683
+ scratch_used = [],
684
+ scratch_available = [],
684
685
  memory_allocated = None,
685
686
  cpu_allocated = None,
686
687
  ):
@@ -690,11 +691,22 @@ class Performance(Result_object):
690
691
  self.memory_available = memory_available
691
692
  self.memory_available_percent = memory_available_percent
692
693
  self.cpu_used = cpu_used
693
- self.output_space = output_space
694
- self.scratch_space = scratch_space
694
+ self.output_available = output_available
695
+ self.scratch_used = scratch_used
696
+ self.scratch_available = scratch_available
695
697
 
696
698
  self.memory_allocated = memory_allocated if memory_allocated is not None else self.max_mem
697
699
  self.cpu_allocated = cpu_allocated if cpu_allocated is not None else math.ceil(max(cpu_used) / 100)
700
+
701
+ @property
702
+ def output_space(self):
703
+ warnings.warn("output_space is deprecated, use output_available instead", DeprecationWarning)
704
+ return self.output_available
705
+
706
+ @property
707
+ def scratch_space(self):
708
+ warnings.warn("scratch_space is deprecated, use scratch_available instead", DeprecationWarning)
709
+ return self.scratch_available
698
710
 
699
711
 
700
712
  @classmethod
@@ -705,6 +717,21 @@ class Performance(Result_object):
705
717
  :param parser: Output data parser.
706
718
  :return: A populated Performance object.
707
719
  """
720
+ return self(
721
+ duration = parser.data.metadata['performance']['duration'].tolist(),
722
+ memory_used = parser.data.metadata['performance']['memory_used'].tolist(),
723
+ memory_allocated = Memory(parser.data.metadata['memory_available']) if "memory_available" in parser.data.metadata else None,
724
+ memory_used_percent = parser.data.metadata['performance']['memory_used_percent'].tolist(),
725
+ memory_available = parser.data.metadata['performance']['memory_available'].tolist(),
726
+ memory_available_percent = parser.data.metadata['performance']['memory_available_percent'].tolist(),
727
+ cpu_used = parser.data.metadata['performance']['cpu_used'].tolist(),
728
+ cpu_allocated = parser.data.metadata.get('num_cpu', None),
729
+ output_available = parser.data.metadata['performance']['output_available'].tolist(),
730
+ scratch_used = parser.data.metadata['performance']['scratch_used'].tolist() if 'scratch_used' in parser.data.metadata['performance'] else [0] * len(parser.data.metadata['performance']['duration']),
731
+ scratch_available = parser.data.metadata['performance']['scratch_available'].tolist()
732
+ )
733
+
734
+
708
735
  return self(
709
736
  duration = parser.data.metadata['performance'][:, 0].tolist(),
710
737
  memory_used = parser.data.metadata['performance'][:, 1].tolist(),
@@ -788,8 +815,9 @@ class Performance(Result_object):
788
815
  memory_available_percent = [0.0] * len(data['values'])
789
816
  cpu_used = [0.0] * len(data['values'])
790
817
  cpu_allocated = data['cpu_allocated']
791
- output_space = [0.0] * len(data['values'])
792
- scratch_space = [0.0] * len(data['values'])
818
+ output_available = [0.0] * len(data['values'])
819
+ scratch_used = [0.0] * len(data['values'])
820
+ scratch_available = [0.0] * len(data['values'])
793
821
 
794
822
  for i, value in enumerate(data['values']):
795
823
  duration[i] = value['duration']['value']
@@ -798,8 +826,10 @@ class Performance(Result_object):
798
826
  memory_available[i] = value['memory_available']['value']
799
827
  memory_available_percent[i] = value['memory_available_percent']['value']
800
828
  cpu_used[i] = value['cpu_used']['value']
801
- output_space[i] = value['output_space']['value']
802
- scratch_space[i] = value['scratch_space']['value']
829
+ output_available[i] = value['output_space']['value']
830
+ if 'scratch_used' in value:
831
+ scratch_used[i] = value['scratch_used']['value']
832
+ scratch_available[i] = value['scratch_space']['value']
803
833
 
804
834
  return self(
805
835
  duration = duration,
@@ -810,8 +840,9 @@ class Performance(Result_object):
810
840
  memory_available_percent = memory_available_percent,
811
841
  cpu_used = cpu_used,
812
842
  cpu_allocated = cpu_allocated,
813
- output_space = output_space,
814
- scratch_space = scratch_space
843
+ output_available = output_available,
844
+ scratch_used = scratch_used,
845
+ scratch_available = scratch_available
815
846
  )
816
847
 
817
848
 
@@ -871,6 +902,10 @@ class Performance(Result_object):
871
902
  "units": "bytes",
872
903
  "value": self.output_space[i]
873
904
  },
905
+ 'scratch_used': {
906
+ "units": "bytes",
907
+ "value": self.scratch_used[i]
908
+ },
874
909
  'scratch_space': {
875
910
  "units": "bytes",
876
911
  "value": self.scratch_space[i]
@@ -0,0 +1,9 @@
1
+ import numpy
2
+ import os
3
+ from pathlib import Path
4
+
5
+ # Set numpy errors (not sure why this isn't the default...)
6
+ numpy.seterr(invalid = 'raise', divide = 'raise')
7
+
8
+ # Expand path to include mocks.
9
+ os.environ["PATH"] = str(Path(__file__).parent / "mock") + os.pathsep + os.environ["PATH"]