modelcraft 5.0.3__py3-none-any.whl → 6.0.0__py3-none-any.whl

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 (90) hide show
  1. modelcraft/__init__.py +16 -31
  2. modelcraft/__main__.py +0 -1
  3. modelcraft/arguments.py +35 -7
  4. modelcraft/combine.py +22 -41
  5. modelcraft/contents.py +188 -164
  6. modelcraft/environ.py +0 -7
  7. modelcraft/geometry.py +39 -27
  8. modelcraft/job.py +6 -5
  9. modelcraft/jobs/acedrg.py +2 -0
  10. modelcraft/jobs/buccaneer.py +22 -4
  11. modelcraft/jobs/comit.py +2 -0
  12. modelcraft/jobs/ctruncate.py +3 -1
  13. modelcraft/jobs/emda.py +2 -0
  14. modelcraft/jobs/findwaters.py +2 -0
  15. modelcraft/jobs/freerflag.py +2 -0
  16. modelcraft/jobs/libg.py +2 -0
  17. modelcraft/jobs/molrep.py +2 -0
  18. modelcraft/jobs/nautilus.py +28 -14
  19. modelcraft/jobs/nucleofind.py +88 -0
  20. modelcraft/jobs/parrot.py +13 -2
  21. modelcraft/jobs/phasematch.py +2 -1
  22. modelcraft/jobs/refmac.py +3 -1
  23. modelcraft/jobs/servalcat.py +36 -2
  24. modelcraft/jobs/sheetbend.py +2 -0
  25. modelcraft/modelcraftem.py +49 -6
  26. modelcraft/modelcraftxray.py +90 -42
  27. modelcraft/monlib.py +55 -52
  28. modelcraft/pdbe.py +54 -0
  29. modelcraft/pipeline.py +1 -1
  30. modelcraft/prune.py +69 -0
  31. modelcraft/reflections.py +11 -1
  32. modelcraft/scripts/contents.py +5 -215
  33. modelcraft/scripts/copies.py +26 -17
  34. modelcraft/scripts/modelcraft.py +1 -0
  35. modelcraft/scripts/sidechains.py +141 -0
  36. modelcraft/scripts/validate.py +81 -0
  37. modelcraft/sequence.py +106 -0
  38. modelcraft/solvent.py +42 -113
  39. modelcraft/structure.py +64 -41
  40. modelcraft/tests/ccp4/__init__.py +7 -11
  41. modelcraft/tests/ccp4/test_acedrg.py +2 -0
  42. modelcraft/tests/ccp4/test_arguments.py +3 -0
  43. modelcraft/tests/ccp4/test_buccaneer.py +3 -2
  44. modelcraft/tests/ccp4/test_cell.py +4 -1
  45. modelcraft/tests/ccp4/test_comit.py +2 -0
  46. modelcraft/tests/ccp4/test_contents.py +99 -17
  47. modelcraft/tests/ccp4/test_copies.py +1 -0
  48. modelcraft/tests/ccp4/test_ctruncate.py +2 -0
  49. modelcraft/tests/ccp4/test_findwaters.py +2 -0
  50. modelcraft/tests/ccp4/test_freerflag.py +2 -0
  51. modelcraft/tests/ccp4/test_libg.py +1 -0
  52. modelcraft/tests/ccp4/test_molrep.py +3 -0
  53. modelcraft/tests/ccp4/test_monlib.py +75 -45
  54. modelcraft/tests/ccp4/test_nautilus.py +5 -3
  55. modelcraft/tests/ccp4/test_nucleofind.py +62 -0
  56. modelcraft/tests/ccp4/test_parrot.py +3 -1
  57. modelcraft/tests/ccp4/test_phasematch.py +2 -0
  58. modelcraft/tests/ccp4/test_prune.py +17 -0
  59. modelcraft/tests/ccp4/test_reflections.py +110 -1
  60. modelcraft/tests/ccp4/test_refmac.py +3 -0
  61. modelcraft/tests/{unittests/test_contents.py → ccp4/test_sequence.py} +5 -12
  62. modelcraft/tests/ccp4/test_servalcat.py +52 -0
  63. modelcraft/tests/ccp4/test_sheetbend.py +4 -3
  64. modelcraft/tests/ccp4/test_sidechains.py +25 -0
  65. modelcraft/tests/ccp4/test_solvent.py +12 -26
  66. modelcraft/tests/ccp4/test_structure.py +1 -0
  67. modelcraft/tests/ccp4/test_validation.py +19 -0
  68. modelcraft/tests/ccp4/test_xray.py +12 -6
  69. modelcraft/tests/ccpem/test_em.py +3 -0
  70. modelcraft/tests/ccpem/test_emda.py +2 -0
  71. modelcraft/tests/ccpem/test_refmac.py +1 -0
  72. modelcraft/tests/ccpem/test_servalcat.py +4 -3
  73. modelcraft/utils.py +16 -4
  74. modelcraft/validation.py +101 -0
  75. modelcraft-6.0.0.dist-info/METADATA +76 -0
  76. modelcraft-6.0.0.dist-info/RECORD +85 -0
  77. {modelcraft-5.0.3.dist-info → modelcraft-6.0.0.dist-info}/WHEEL +1 -1
  78. {modelcraft-5.0.3.dist-info → modelcraft-6.0.0.dist-info}/entry_points.txt +2 -0
  79. modelcraft/coot/prune.py +0 -1085
  80. modelcraft/coot/sidechains.py +0 -68
  81. modelcraft/jobs/acorn.py +0 -114
  82. modelcraft/jobs/coot.py +0 -104
  83. modelcraft/tests/ccp4/test_coot.py +0 -29
  84. modelcraft/tests/ccp4/test_geometry.py +0 -20
  85. modelcraft/tests/unittests/__init__.py +0 -0
  86. modelcraft/tests/unittests/test_reflections.py +0 -101
  87. modelcraft-5.0.3.dist-info/METADATA +0 -49
  88. modelcraft-5.0.3.dist-info/RECORD +0 -82
  89. modelcraft-5.0.3.dist-info/licenses/LICENSE +0 -504
  90. {modelcraft-5.0.3.dist-info → modelcraft-6.0.0.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,19 @@
1
1
  import json
2
2
  import os
3
+
3
4
  import gemmi
4
5
  import pytest
5
- from modelcraft.scripts.modelcraft import main
6
+
6
7
  from modelcraft.reflections import write_mtz
8
+ from modelcraft.scripts.modelcraft import main
7
9
  from modelcraft.structure import contains_residue, read_structure
10
+
8
11
  from . import (
9
12
  ccp4_path,
10
13
  in_temp_directory,
11
14
  insulin_contents,
12
- insulin_fsigf,
13
15
  insulin_freer,
16
+ insulin_fsigf,
14
17
  insulin_refmac,
15
18
  pdb1rxf_contents,
16
19
  )
@@ -33,14 +36,15 @@ def test_insulin_from_phases():
33
36
  args += ["--overwrite-directory"]
34
37
  with pytest.raises(SystemExit):
35
38
  main(args)
36
- with open(os.path.join("my_modelcraft_dir", "modelcraft.json")) as report_file:
39
+ report_path = os.path.join("my_modelcraft_dir", "modelcraft.json")
40
+ with open(report_path, encoding="utf-8") as report_file:
37
41
  report = json.load(report_file)
38
42
  assert report["seconds"]["total"] > 0
39
43
  assert report["termination_reason"] == "Normal"
40
44
  mtz_path = os.path.join("my_modelcraft_dir", "modelcraft.mtz")
41
45
  mtz = gemmi.read_mtz_file(mtz_path)
42
46
  columns = set(mtz.column_labels())
43
- expected = {"FWT", "DELFWT", "FC_ALL_LS", "FOM", "HLACOMB"}
47
+ expected = {"FWT", "DELFWT", "FC_ALL", "FOM", "HLACOMB"}
44
48
  assert expected.issubset(columns)
45
49
 
46
50
 
@@ -59,7 +63,8 @@ def test_1rxf_from_model():
59
63
  args += ["--cycles", "2"]
60
64
  with pytest.raises(SystemExit):
61
65
  main(args)
62
- with open(os.path.join("modelcraft", "modelcraft.json")) as report_file:
66
+ report_path = os.path.join("modelcraft", "modelcraft.json")
67
+ with open(report_path, encoding="utf-8") as report_file:
63
68
  report = json.load(report_file)
64
69
  assert report["seconds"]["total"] > 0
65
70
  assert report["termination_reason"] == "Normal"
@@ -80,7 +85,8 @@ def test_toxd():
80
85
  args += ["--cycles", "1"]
81
86
  with pytest.raises(SystemExit):
82
87
  main(args)
83
- with open(os.path.join("modelcraft", "modelcraft.json")) as report_file:
88
+ report_path = os.path.join("modelcraft", "modelcraft.json")
89
+ with open(report_path, encoding="utf-8") as report_file:
84
90
  report = json.load(report_file)
85
91
  assert report["seconds"]["total"] > 0
86
92
  assert report["termination_reason"] == "Normal"
@@ -1,7 +1,10 @@
1
1
  import json
2
2
  import os
3
+
3
4
  import pytest
5
+
4
6
  from modelcraft.scripts.modelcraft import main
7
+
5
8
  from ..ccp4 import in_temp_directory
6
9
  from . import (
7
10
  density_path,
@@ -1,6 +1,8 @@
1
1
  from os import environ
2
2
  from pathlib import Path
3
+
3
4
  import gemmi
5
+
4
6
  from modelcraft.jobs.emda import EmdaMapMask
5
7
  from modelcraft.maps import read_map
6
8
 
@@ -1,5 +1,6 @@
1
1
  from modelcraft.jobs.refmac import RefmacMapToMtz
2
2
  from modelcraft.maps import read_map
3
+
3
4
  from . import density_path
4
5
 
5
6
 
@@ -1,12 +1,13 @@
1
1
  from modelcraft.jobs.servalcat import (
2
+ ServalcatFsc,
2
3
  ServalcatNemap,
3
- ServalcatTrim,
4
4
  ServalcatRefine,
5
- ServalcatFsc,
5
+ ServalcatTrim,
6
6
  )
7
7
  from modelcraft.maps import read_map
8
8
  from modelcraft.structure import read_structure
9
- from . import halfmap1_path, halfmap2_path, density_path, mask_path, structure_path
9
+
10
+ from . import density_path, halfmap1_path, halfmap2_path, mask_path, structure_path
10
11
 
11
12
 
12
13
  def test_servalcat_nemap():
modelcraft/utils.py CHANGED
@@ -1,6 +1,18 @@
1
- import random
1
+ from random import choice
2
+ from string import ascii_letters, digits
2
3
 
4
+ import numpy as np
3
5
 
4
- def random_id(length: int = 10) -> str:
5
- chars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
6
- return "".join(random.choice(chars) for _ in range(length))
6
+
7
+ def modified_zscore(a) -> np.ndarray:
8
+ "Z-score using median and median absolute deviation"
9
+ median = np.median(a)
10
+ deviations = a - median
11
+ mad = np.median(np.abs(deviations))
12
+ return np.zeros_like(a) if mad == 0 else 0.67449 * deviations / mad
13
+
14
+
15
+ def puid(length: int = 10) -> str:
16
+ "Probably unique identifier"
17
+ chars = ascii_letters + digits
18
+ return "".join(choice(chars) for _ in range(length))
@@ -0,0 +1,101 @@
1
+ from collections import defaultdict
2
+
3
+ import gemmi
4
+ import numpy as np
5
+ import pandas as pd
6
+
7
+ from .geometry import per_residue_geometry_rmsz
8
+ from .jobs.refmac import RefmacResult
9
+ from .monlib import MonLib
10
+ from .reflections import DataItem
11
+ from .utils import modified_zscore
12
+
13
+
14
+ def validate(
15
+ structure: gemmi.Structure,
16
+ fphi_best: DataItem,
17
+ fphi_diff: DataItem,
18
+ fphi_calc: DataItem,
19
+ monlib: MonLib,
20
+ model_index: int = 0,
21
+ ) -> pd.DataFrame:
22
+ best_map = fphi_best.map(spacing=1.0)
23
+ diff_map = fphi_diff.map(size=best_map.shape)
24
+ calc_map = fphi_calc.map(size=best_map.shape)
25
+
26
+ bfac = _bfac(structure[model_index])
27
+ rscc, diff = _rscc_diff(structure, best_map, diff_map, calc_map, model_index)
28
+ geom = per_residue_geometry_rmsz(structure, monlib, model_index)
29
+
30
+ data = {
31
+ "Chain": [],
32
+ "SeqId": [],
33
+ "Name": [],
34
+ "BFac": [],
35
+ "RSCC": [],
36
+ "Diff": [],
37
+ "Geom": [],
38
+ }
39
+ for chain in structure[model_index]:
40
+ for residue in chain:
41
+ if monlib.is_protein(residue.name):
42
+ key = (chain.name, str(residue.seqid))
43
+ data["Chain"].append(chain.name)
44
+ data["SeqId"].append(str(residue.seqid))
45
+ data["Name"].append(residue.name)
46
+ data["BFac"].append(bfac[key])
47
+ data["RSCC"].append(rscc[key])
48
+ data["Diff"].append(diff[key])
49
+ data["Geom"].append(geom[key])
50
+
51
+ df = pd.DataFrame(data)
52
+ df["BFac"] = -modified_zscore(df["BFac"])
53
+ df["RSCC"] = modified_zscore(df["RSCC"])
54
+ df["Diff"] = -modified_zscore(df["Diff"])
55
+ df["Geom"] = -modified_zscore(df["Geom"])
56
+ density_score = (df["BFac"] + df["RSCC"] + df["Diff"]) / 3
57
+ df["Score"] = modified_zscore((density_score + df["Geom"]) / 2)
58
+ return df
59
+
60
+
61
+ def validate_refmac(result: RefmacResult, monlib: MonLib) -> pd.DataFrame:
62
+ return validate(
63
+ result.structure, result.fphi_best, result.fphi_diff, result.fphi_calc, monlib
64
+ )
65
+
66
+
67
+ def _bfac(model: gemmi.Model) -> dict:
68
+ return {
69
+ (chain.name, str(residue.seqid)): np.mean([a.b_iso for a in residue])
70
+ for chain in model
71
+ for residue in chain
72
+ }
73
+
74
+
75
+ def _rscc_diff(
76
+ structure: gemmi.Structure,
77
+ best_map: gemmi.FloatGrid,
78
+ diff_map: gemmi.FloatGrid,
79
+ calc_map: gemmi.FloatGrid,
80
+ model_index: int,
81
+ ) -> dict:
82
+ search = gemmi.NeighborSearch(structure, max_radius=3, model_index=model_index)
83
+ search.populate(include_h=False)
84
+ best_values = defaultdict(list)
85
+ diff_values = defaultdict(list)
86
+ calc_values = defaultdict(list)
87
+ for point in best_map.masked_asu():
88
+ position = best_map.point_to_position(point)
89
+ mark = search.find_nearest_atom(position, radius=3)
90
+ if mark is not None:
91
+ cra = mark.to_cra(structure[model_index])
92
+ key = (cra.chain.name, str(cra.residue.seqid))
93
+ best_values[key].append(point.value)
94
+ diff_values[key].append(diff_map.get_value(point.u, point.v, point.w))
95
+ calc_values[key].append(calc_map.get_value(point.u, point.v, point.w))
96
+ rscc = {}
97
+ diff = {}
98
+ for key, best_value in best_values.items():
99
+ rscc[key] = np.corrcoef(best_value, calc_values[key])[0, 1]
100
+ diff[key] = np.sqrt(np.mean(np.square(diff_values[key])))
101
+ return rscc, diff
@@ -0,0 +1,76 @@
1
+ Metadata-Version: 2.4
2
+ Name: modelcraft
3
+ Version: 6.0.0
4
+ Summary: Automated model-building pipeline for X-ray crystallography and cryo-EM
5
+ Author-email: Paul Bond <paul.bond@york.ac.uk>
6
+ Maintainer-email: Paul Bond <paul.bond@york.ac.uk>
7
+ Project-URL: Source, https://github.com/paulsbond/modelcraft
8
+ Project-URL: Issues, https://github.com/paulsbond/modelcraft/issues
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: >=3.9
14
+ Description-Content-Type: text/markdown
15
+ Requires-Dist: gemmi>=0.5.5
16
+ Requires-Dist: numpy
17
+ Requires-Dist: pandas
18
+ Requires-Dist: requests
19
+ Requires-Dist: scipy
20
+ Requires-Dist: tabulate
21
+
22
+ ![](https://github.com/paulsbond/modelcraft/blob/691b8a0d72dbf48b8d8a431bdb193298a397e1bb/modelcraft.png)
23
+
24
+ # ModelCraft
25
+
26
+ ModelCraft is an automated model-building pipeline
27
+ that builds proteins and nucleic acids
28
+ into X-ray crystallography and cryo-EM maps.
29
+ It combines the previous Buccaneer and Nautilus pipelines and adds new steps
30
+ for density modification, refinement, validation and pruning.
31
+
32
+ ## Installation
33
+
34
+ ModelCraft is distributed with CCP4.
35
+ Please obtain the latest version from the
36
+ [CCP4 download page](https://www.ccp4.ac.uk/download).
37
+
38
+ ## Graphical interfaces
39
+
40
+ For X-ray crystallography, ModelCraft can be used through
41
+ [CCP4i2](https://ccp4i2.gitlab.io/rstdocs/tasks/modelcraft/index.html) or
42
+ [CCP4 Cloud](https://cloud.ccp4.ac.uk/manuals/html-taskref/doc.task.ModelCraft.html).
43
+ For cryo-EM, it is available in
44
+ [CCP-EM Doppio](https://www.ccpem.ac.uk/docs/doppio/user_guide.html).
45
+
46
+ ## Command-line interface
47
+
48
+ The first argument must be either
49
+ `xray` for X-ray crystallography or `em` for cryo-EM SPA.
50
+ The command line documentation has detailed information on individual arguments.
51
+
52
+ ```bash
53
+ modelcraft xray --help
54
+ ```
55
+
56
+ ```bash
57
+ modelcraft em --help
58
+ ```
59
+
60
+ ## Links
61
+
62
+ - [Source (latest)](https://github.com/paulsbond/modelcraft)
63
+ - [Source (releases)](https://github.com/paulsbond/modelcraft/releases)
64
+ - [Issues (e.g. bugs and feature requests)](https://github.com/paulsbond/modelcraft/issues)
65
+ - [PyPI (Python Package Index)](https://pypi.org/project/modelcraft)
66
+
67
+ ## Citations
68
+
69
+ - [ModelCraft](https://doi.org/10.1107/S2059798322007732)
70
+ - [Buccaneer](https://doi.org/10.1107/S0907444906022116)
71
+ - [EMDA](https://doi.org/10.1016/j.jsb.2021.107826)
72
+ - [Nautilus](https://doi.org/10.1107/S2052252514019290)
73
+ - [Parrot](https://doi.org/10.1107/S090744490903947X)
74
+ - [Refmac](https://doi.org/10.1107/S2059798318000979)
75
+ - [Servalcat](https://doi.org/10.1107/S2059798321009475)
76
+ - [Sheetbend](https://doi.org/10.1107/S2059798320013170)
@@ -0,0 +1,85 @@
1
+ modelcraft/__init__.py,sha256=Gz98tuLl0rUZuHLo9yDTc7nNbg7sDfxaJdotFGScnCs,1637
2
+ modelcraft/__main__.py,sha256=Uq-mykPdxXcVx0DK9hVbIZZoICcKCyk01Vnp6T7sqE0,76
3
+ modelcraft/arguments.py,sha256=QSL2fYYSAk7oIlCka6VQqhVbGsnMNLkmtyfUw14MbW0,16395
4
+ modelcraft/cell.py,sha256=dReWECZKuyZGSfR-MmumoD7qkrBiWM6GlaGpguDgU14,2025
5
+ modelcraft/combine.py,sha256=cSixPr-JJBZb-F6OfMfvYDf5sddWeoTREH0IwNrO2UE,4302
6
+ modelcraft/contents.py,sha256=r65m9Zg7t-m4lCKrZv9qSADKu5C2uyAjP-7qgZPsgX0,13074
7
+ modelcraft/environ.py,sha256=ZYVfPUUIW-JH9pGcN9jyyHdyJU8Bf0dU586MULDhOT4,257
8
+ modelcraft/geometry.py,sha256=sdCqeoohGgE4sFBicLR2d77nchyJSSmVzOeqUt4Tr_4,1575
9
+ modelcraft/job.py,sha256=XnIQyHKEt17xSEf12tP4IxxbWEg42A93XG9yhsoBUTM,4149
10
+ modelcraft/maps.py,sha256=Lyv3YjKNdUgi6vaLmQ8CcZFKq39EPL4NDC5qO_kCd0A,354
11
+ modelcraft/modelcraftem.py,sha256=Ru4sjfERIdOENIQDYwzyh2dnL84rlo3oH5ZSq2-MfdE,7559
12
+ modelcraft/modelcraftxray.py,sha256=eKwRVBouQfVreHvXOgc2hW5wsBB2GvN2E9ST6LEZsK8,15061
13
+ modelcraft/monlib.py,sha256=jkfaYZl87HDaQyKUkw51LTAd5dSGQ2qRF1zox6dP5C8,1869
14
+ modelcraft/pdbe.py,sha256=mbTfM9a7txuvdfqoxOLrsIQuTmH03eid7Hw1sP_o8DE,1793
15
+ modelcraft/pipeline.py,sha256=7DbEFwxOsMTZH14O6YFG9S0wbBBiuVkwVXMfS7weyt8,2048
16
+ modelcraft/prune.py,sha256=2ap4Aw43R8r4s_5CP71g1kO93bI_3a0A-9bEZqnldPI,2351
17
+ modelcraft/reflections.py,sha256=041O_mKSZZ6Y-_ltsrPt7F3u7yLMV-gXLMZYmkffSMs,6694
18
+ modelcraft/sequence.py,sha256=xix6Q48_NG7CgA0HcogTk3eGnpteN_C4lzOGAZxgEVs,2333
19
+ modelcraft/solvent.py,sha256=3jUl7wU0N7glOHdBtFKufP9br1ceFE6Z4bka3OQT7v0,4052
20
+ modelcraft/structure.py,sha256=hrXF14yuNyGBEFCyGAPOHQ5PaAoovmfDfviMKaLWqqY,4760
21
+ modelcraft/utils.py,sha256=equdkNLiQnO6lubU32JGtU6qx1ykLcI590XfSIuTsEs,512
22
+ modelcraft/validation.py,sha256=b3yk8n_FSNXDQUZz9FPsEpeUlSAOa-Xti97sktBulTg,3364
23
+ modelcraft/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ modelcraft/jobs/acedrg.py,sha256=DQ7AMWhqVbSN9L5uqnaDAOoAFgRfN2KHQwJlKuXun20,986
25
+ modelcraft/jobs/buccaneer.py,sha256=4HGpwOgBgiJv5yNDeRTADznt_FcsnPL1zue_Qh0AoNQ,6040
26
+ modelcraft/jobs/comit.py,sha256=fODdC6_AHdL5WFj8YfnizMFJQ5OfVjxfh9weNBIlH5k,1049
27
+ modelcraft/jobs/ctruncate.py,sha256=tKjAKAcWyd0k8jno2-2wlZtuEfwFZYHgdIscNHjCLEk,1661
28
+ modelcraft/jobs/emda.py,sha256=kLUET18rDgHpBY_HHxJ9P5SD6W30_yMsEn3Nqv5FtYM,990
29
+ modelcraft/jobs/findwaters.py,sha256=4j3N1_0yeDhLHe8kdV9pkmVldgx7oxpWBVSHfiNdlAA,1702
30
+ modelcraft/jobs/freerflag.py,sha256=lWWvHznIJw90uhAxHY2Ge3x4Z96VzX2S9vB-VYX3kz0,848
31
+ modelcraft/jobs/libg.py,sha256=VwwvOn78cIE2KcbxWXHup_kzVUTW0IkMjPmUEmkFDjY,652
32
+ modelcraft/jobs/molrep.py,sha256=MInl8MwEzPJtFAY8CRlgy3CIPXnMbjVFpQG5ulihPXo,2729
33
+ modelcraft/jobs/nautilus.py,sha256=rC_kuyUpBbD6qA9wAFkj-FAks52vcFYWVp1RliDwFqw,3233
34
+ modelcraft/jobs/nucleofind.py,sha256=ovSY6Ya84h1Pa7eb-G5K2YWwouvlYNptfFDGbwK_a3k,3087
35
+ modelcraft/jobs/parrot.py,sha256=DMrH3yzNanQegJNcm-ZvtkZtt7VstfyXDm_oxBP1gJA,2465
36
+ modelcraft/jobs/phasematch.py,sha256=wClWw4U69xOovLju-giRoobUWqhk4bGWqmQVTddDhDg,1860
37
+ modelcraft/jobs/refmac.py,sha256=xvYwUXjLc01dFPsEnuIOEXTs3uvmYT3KLnHo_QLg084,5375
38
+ modelcraft/jobs/servalcat.py,sha256=NktaPoN8UO31LVaglfXCEv-SnRaB85ZCRK94hQn_cGE,7587
39
+ modelcraft/jobs/sheetbend.py,sha256=aXVNkLz45EdVgIuVBSxsgKOH8GNM5iQKVjAfrNVczMo,1571
40
+ modelcraft/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ modelcraft/scripts/contents.py,sha256=m9Pu1eo42-cA4r8Wa7ysNwHlyqxT2cFIA9stCpHYb0E,657
42
+ modelcraft/scripts/copies.py,sha256=Pr8slbgE5bXlUusjYx5c9M0xDN-t_MVH1TZNXDYuAJo,2564
43
+ modelcraft/scripts/modelcraft.py,sha256=2XFSgB1MNYqX6wGlpWa1g8e_IzfONGHbFrfVCY4cTd8,429
44
+ modelcraft/scripts/sidechains.py,sha256=gnhKsPTIftjIOBEbhndFN9f01otd0wh_n5P0HSn4q-0,4663
45
+ modelcraft/scripts/validate.py,sha256=N_1_gn7T4zyQjXy88luVT6CQWv1AzHtCGEci9Kkt_lU,2374
46
+ modelcraft/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ modelcraft/tests/ccp4/__init__.py,sha256=lABZI5ZSElSR7rDU3-pB7sYRqjkPsN0g4PA6exyNQSk,2721
48
+ modelcraft/tests/ccp4/test_acedrg.py,sha256=aFktI8vWrATE9IA56AYOvKv7u806hWCTlN_j055xrbI,629
49
+ modelcraft/tests/ccp4/test_arguments.py,sha256=O7P4O5SqK5cCyYjMX_LTD2sk7THl88Rxk29ByfbOu-I,1396
50
+ modelcraft/tests/ccp4/test_buccaneer.py,sha256=dzHQLzgcZGaNozlrdVlwvL33Y3jLs5aFYa4uO4cA7yE,2259
51
+ modelcraft/tests/ccp4/test_cell.py,sha256=oObQH7D18K67q0Ug80VEavLbIawlCxqwZq1bw9hfFi0,1032
52
+ modelcraft/tests/ccp4/test_comit.py,sha256=Si0c335Smo6e9DzD5InwOJYtbI9Vv8c_SL75lrr8m8s,535
53
+ modelcraft/tests/ccp4/test_contents.py,sha256=mV9YBMj8KTbzPCL_mhJmP0OsK-QQMrAkCk5Wu09z7sM,8855
54
+ modelcraft/tests/ccp4/test_copies.py,sha256=CuJYzuHzFVAtZOHen5Bg04wpjMbR2NCQrjW6j3jGm2w,316
55
+ modelcraft/tests/ccp4/test_ctruncate.py,sha256=JzMNy9HK3tf2HdORqAxPrcJ6U7G-AtR0rSapCei0j0Y,2279
56
+ modelcraft/tests/ccp4/test_findwaters.py,sha256=kH8Fv1NUAo5SUdvtNQn__v_DYb2KPrtL8F_O0v2Wqio,1585
57
+ modelcraft/tests/ccp4/test_freerflag.py,sha256=2n5urZDTu9g7jxQJVJ2pGam3EKAZ92iZdJ2GguEmHmo,274
58
+ modelcraft/tests/ccp4/test_libg.py,sha256=UscflEnCT1VUfwlQvtnWpMqCbhOhQEYrVG2Oheu5h_E,257
59
+ modelcraft/tests/ccp4/test_molrep.py,sha256=I70mu8RmuVv7jq_055RAZFLVNYwBbssEgDXLjNvQrbQ,1321
60
+ modelcraft/tests/ccp4/test_monlib.py,sha256=chZ3xxoQNaBpsdW4aeWgEDu40HTS5QkjpkjB0ANBEDE,2700
61
+ modelcraft/tests/ccp4/test_nautilus.py,sha256=naJQoyKg0oc9coFPUDxTr-pflPyBva_tuLkrJRbp8Z0,1950
62
+ modelcraft/tests/ccp4/test_nucleofind.py,sha256=Gua1xerZ2njNUqIQCSMqd1l6n_I4kTWjL7d9zwleuIc,2137
63
+ modelcraft/tests/ccp4/test_parrot.py,sha256=Oxzye0x2c1-cvl8PgI3_EpXW0Bon3ErhL_5U0iq-Ccw,794
64
+ modelcraft/tests/ccp4/test_phasematch.py,sha256=vsZeZ4eRvxZ76BKrc_Dts8u1wM8pdHvr73-0DNpvXLg,1145
65
+ modelcraft/tests/ccp4/test_prune.py,sha256=pWJhwTx9kdWXQmzHFR2k3u4TVr1pfpQzwbZPvUzvjds,479
66
+ modelcraft/tests/ccp4/test_reflections.py,sha256=oThOoSCS63t0pG5A0BZdzPl9v6vBTldjYbcw-AG1naY,5020
67
+ modelcraft/tests/ccp4/test_refmac.py,sha256=xh4shhULvIKNCtj22btRM-_GFkW3GJHMSk2GYd_feks,1092
68
+ modelcraft/tests/ccp4/test_sequence.py,sha256=gB86Kira535RIEVkHN5MVR6yuc0CP76aRl5z_SKZ6mc,2959
69
+ modelcraft/tests/ccp4/test_servalcat.py,sha256=Gq-NdjsBgyNsaWA6TiCBUFP4bh_g8A9wjm8oTRjBmnI,1576
70
+ modelcraft/tests/ccp4/test_sheetbend.py,sha256=VL1FaCaWo1pZBjG7PMdZVtEnZhbiwWk7Sa8WXdWwwVU,546
71
+ modelcraft/tests/ccp4/test_sidechains.py,sha256=dDPG1vy_SWgtQtNTHXchfm2ohKtyKswqOEHxsNhyXFs,880
72
+ modelcraft/tests/ccp4/test_solvent.py,sha256=IfZ12E5ISjS1cMQcDRZk96JGMer1eGr2cGvbZRCWLMk,556
73
+ modelcraft/tests/ccp4/test_structure.py,sha256=S05FUUnjpPPHbAw_RrVdwjo2EPm2wF2Faqp4dqSQv2E,337
74
+ modelcraft/tests/ccp4/test_validation.py,sha256=wFusZIdFbvHAf4D1lYuFpln2WTX2rh3uLzek5LTAk18,600
75
+ modelcraft/tests/ccp4/test_xray.py,sha256=LW0GL5UPclbBxmj02HB9CRHzwMiLW0i4Ex9fodz3u4c,3139
76
+ modelcraft/tests/ccpem/__init__.py,sha256=fY53G_EEc9LG4FmZ-IfQEhmEsNg5FZfxFwOCUQj019c,656
77
+ modelcraft/tests/ccpem/test_em.py,sha256=eS7qdlqCQlBizmaqnEHvTsUJ2-z2w1DRcUX-1acrExY,1532
78
+ modelcraft/tests/ccpem/test_emda.py,sha256=nNseLsi0C8vu4UjYIP6OtalwKHyeHxMUfu9BV2HOOO8,401
79
+ modelcraft/tests/ccpem/test_refmac.py,sha256=g3evpenT47aZuSkSwVVHLSfSJZe2QK_YYttDOnsYMnU,326
80
+ modelcraft/tests/ccpem/test_servalcat.py,sha256=jWrPCoq2TlAiHW6x5SPtkH8o-JcSdwRWvt2ZU1ZvSYA,1436
81
+ modelcraft-6.0.0.dist-info/METADATA,sha256=_4gQqy7CG6sz36YsXv_ZUH_BlpVWfZ2hys1Vsfs1s64,2741
82
+ modelcraft-6.0.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
83
+ modelcraft-6.0.0.dist-info/entry_points.txt,sha256=KTN5D1dIVxOdag4aue-o2vdEq3VSWHLp5o0Jcm98rv4,286
84
+ modelcraft-6.0.0.dist-info/top_level.txt,sha256=My5973x4fvPrlRfQOuuFxqultnVzrg_aamczcSijdlQ,11
85
+ modelcraft-6.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -2,3 +2,5 @@
2
2
  modelcraft = modelcraft.scripts.modelcraft:main
3
3
  modelcraft-contents = modelcraft.scripts.contents:main
4
4
  modelcraft-copies = modelcraft.scripts.copies:main
5
+ modelcraft-sidechains = modelcraft.scripts.sidechains:main
6
+ modelcraft-validate = modelcraft.scripts.validate:main