stjames 0.0.58__tar.gz → 0.0.61__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 stjames might be problematic. Click here for more details.

Files changed (75) hide show
  1. {stjames-0.0.58/stjames.egg-info → stjames-0.0.61}/PKG-INFO +1 -1
  2. {stjames-0.0.58 → stjames-0.0.61}/pyproject.toml +1 -1
  3. {stjames-0.0.58 → stjames-0.0.61}/stjames/atomium_stjames/mmcif.py +10 -0
  4. {stjames-0.0.58 → stjames-0.0.61}/stjames/atomium_stjames/pdb.py +4 -0
  5. {stjames-0.0.58 → stjames-0.0.61}/stjames/pdb.py +9 -4
  6. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/docking.py +23 -8
  7. {stjames-0.0.58 → stjames-0.0.61/stjames.egg-info}/PKG-INFO +1 -1
  8. {stjames-0.0.58 → stjames-0.0.61}/LICENSE +0 -0
  9. {stjames-0.0.58 → stjames-0.0.61}/README.md +0 -0
  10. {stjames-0.0.58 → stjames-0.0.61}/setup.cfg +0 -0
  11. {stjames-0.0.58 → stjames-0.0.61}/stjames/__init__.py +0 -0
  12. {stjames-0.0.58 → stjames-0.0.61}/stjames/_deprecated_solvent_settings.py +0 -0
  13. {stjames-0.0.58 → stjames-0.0.61}/stjames/atom.py +0 -0
  14. {stjames-0.0.58 → stjames-0.0.61}/stjames/atomium_stjames/__init__.py +0 -0
  15. {stjames-0.0.58 → stjames-0.0.61}/stjames/atomium_stjames/data.py +0 -0
  16. {stjames-0.0.58 → stjames-0.0.61}/stjames/atomium_stjames/utilities.py +0 -0
  17. {stjames-0.0.58 → stjames-0.0.61}/stjames/base.py +0 -0
  18. {stjames-0.0.58 → stjames-0.0.61}/stjames/basis_set.py +0 -0
  19. {stjames-0.0.58 → stjames-0.0.61}/stjames/calculation.py +0 -0
  20. {stjames-0.0.58 → stjames-0.0.61}/stjames/compute_settings.py +0 -0
  21. {stjames-0.0.58 → stjames-0.0.61}/stjames/constraint.py +0 -0
  22. {stjames-0.0.58 → stjames-0.0.61}/stjames/correction.py +0 -0
  23. {stjames-0.0.58 → stjames-0.0.61}/stjames/data/__init__.py +0 -0
  24. {stjames-0.0.58 → stjames-0.0.61}/stjames/data/bragg_radii.json +0 -0
  25. {stjames-0.0.58 → stjames-0.0.61}/stjames/data/elements.py +0 -0
  26. {stjames-0.0.58 → stjames-0.0.61}/stjames/data/isotopes.json +0 -0
  27. {stjames-0.0.58 → stjames-0.0.61}/stjames/data/nist_isotopes.json +0 -0
  28. {stjames-0.0.58 → stjames-0.0.61}/stjames/data/read_nist_isotopes.py +0 -0
  29. {stjames-0.0.58 → stjames-0.0.61}/stjames/data/symbol_element.json +0 -0
  30. {stjames-0.0.58 → stjames-0.0.61}/stjames/diis_settings.py +0 -0
  31. {stjames-0.0.58 → stjames-0.0.61}/stjames/grid_settings.py +0 -0
  32. {stjames-0.0.58 → stjames-0.0.61}/stjames/int_settings.py +0 -0
  33. {stjames-0.0.58 → stjames-0.0.61}/stjames/message.py +0 -0
  34. {stjames-0.0.58 → stjames-0.0.61}/stjames/method.py +0 -0
  35. {stjames-0.0.58 → stjames-0.0.61}/stjames/mode.py +0 -0
  36. {stjames-0.0.58 → stjames-0.0.61}/stjames/molecule.py +0 -0
  37. {stjames-0.0.58 → stjames-0.0.61}/stjames/opt_settings.py +0 -0
  38. {stjames-0.0.58 → stjames-0.0.61}/stjames/periodic_cell.py +0 -0
  39. {stjames-0.0.58 → stjames-0.0.61}/stjames/py.typed +0 -0
  40. {stjames-0.0.58 → stjames-0.0.61}/stjames/scf_settings.py +0 -0
  41. {stjames-0.0.58 → stjames-0.0.61}/stjames/settings.py +0 -0
  42. {stjames-0.0.58 → stjames-0.0.61}/stjames/solvent.py +0 -0
  43. {stjames-0.0.58 → stjames-0.0.61}/stjames/status.py +0 -0
  44. {stjames-0.0.58 → stjames-0.0.61}/stjames/task.py +0 -0
  45. {stjames-0.0.58 → stjames-0.0.61}/stjames/thermochem_settings.py +0 -0
  46. {stjames-0.0.58 → stjames-0.0.61}/stjames/types.py +0 -0
  47. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/__init__.py +0 -0
  48. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/admet.py +0 -0
  49. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/basic_calculation.py +0 -0
  50. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/bde.py +0 -0
  51. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/conformer.py +0 -0
  52. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/conformer_search.py +0 -0
  53. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/descriptors.py +0 -0
  54. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/electronic_properties.py +0 -0
  55. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/fukui.py +0 -0
  56. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/hydrogen_bond_basicity.py +0 -0
  57. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/irc.py +0 -0
  58. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/molecular_dynamics.py +0 -0
  59. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/multistage_opt.py +0 -0
  60. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/pka.py +0 -0
  61. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/redox_potential.py +0 -0
  62. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/scan.py +0 -0
  63. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/spin_states.py +0 -0
  64. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/tautomer.py +0 -0
  65. {stjames-0.0.58 → stjames-0.0.61}/stjames/workflows/workflow.py +0 -0
  66. {stjames-0.0.58 → stjames-0.0.61}/stjames.egg-info/SOURCES.txt +0 -0
  67. {stjames-0.0.58 → stjames-0.0.61}/stjames.egg-info/dependency_links.txt +0 -0
  68. {stjames-0.0.58 → stjames-0.0.61}/stjames.egg-info/requires.txt +0 -0
  69. {stjames-0.0.58 → stjames-0.0.61}/stjames.egg-info/top_level.txt +0 -0
  70. {stjames-0.0.58 → stjames-0.0.61}/tests/test_constraints.py +0 -0
  71. {stjames-0.0.58 → stjames-0.0.61}/tests/test_from_extxyz.py +0 -0
  72. {stjames-0.0.58 → stjames-0.0.61}/tests/test_molecule.py +0 -0
  73. {stjames-0.0.58 → stjames-0.0.61}/tests/test_pdb.py +0 -0
  74. {stjames-0.0.58 → stjames-0.0.61}/tests/test_rounding.py +0 -0
  75. {stjames-0.0.58 → stjames-0.0.61}/tests/test_settings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: stjames
3
- Version: 0.0.58
3
+ Version: 0.0.61
4
4
  Summary: standardized JSON atom/molecule encoding scheme
5
5
  Author-email: Corin Wagen <corin@rowansci.com>
6
6
  Project-URL: Homepage, https://github.com/rowansci/stjames
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "stjames"
3
- version = "0.0.58"
3
+ version = "0.0.61"
4
4
  description = "standardized JSON atom/molecule encoding scheme"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -606,6 +606,16 @@ def atom_dict_to_atom_dict(d: dict[str, Any], aniso_dict: dict[int, Any]) -> dic
606
606
  for key in ["x", "y", "z", "charge", "bvalue", "occupancy"]:
607
607
  if atom[key] is not None:
608
608
  atom[key] = float(atom[key])
609
+ if atom["charge"] == 0:
610
+ atom["charge"] = None
611
+ if not atom["is_hetatm"]:
612
+ atom["is_hetatm"] = None
613
+ if not atom["alt_loc"]:
614
+ atom["alt_loc"] = None
615
+ if atom["occupancy"] == 1:
616
+ atom["occupancy"] = None
617
+ if atom["name"] == atom["element"]:
618
+ atom["name"] = None
609
619
  return atom
610
620
 
611
621
 
@@ -557,6 +557,10 @@ def atom_line_to_dict(line: str, aniso_dict: dict[Any, Any]) -> dict[str, Any]:
557
557
  a["is_hetatm"] = None
558
558
  if not a["alt_loc"]:
559
559
  a["alt_loc"] = None
560
+ if a["occupancy"] == 1:
561
+ a["occupancy"] = None
562
+ if a["name"] == a["element"]:
563
+ a["name"] = None
560
564
  return a
561
565
 
562
566
 
@@ -22,7 +22,7 @@ class PDBAtom(BaseModel):
22
22
  y: float
23
23
  z: float
24
24
  element: str
25
- name: str
25
+ name: str | None = None
26
26
  charge: float | None = None
27
27
  occupancy: float | None = None
28
28
  alt_loc: str | None = None
@@ -413,12 +413,15 @@ def _format_atom_line(
413
413
  else:
414
414
  chg = " "
415
415
 
416
+ atom_name = atom.name if atom.name else atom.element
417
+ occupancy = atom.occupancy if atom.occupancy else 1.0
418
+
416
419
  # Construct the line.
417
420
  # Use exact spacing & field widths to match PDB guidelines.
418
421
  line = (
419
422
  f"{record_type}"
420
423
  f"{serial:5d} " # atom serial number (columns 7-11)
421
- f"{atom.name:<4}" # atom name (columns 13-16, left-justified in this snippet)
424
+ f"{atom_name:<4}" # atom name (columns 13-16, left-justified in this snippet)
422
425
  f"{alt_loc_char}" # altLoc (column 17)
423
426
  f"{residue_name:>3}" # residue name (columns 18-20)
424
427
  f" {chain_char}" # chain ID (column 22)
@@ -427,7 +430,7 @@ def _format_atom_line(
427
430
  f"{atom.x:8.3f}" # x (columns 31-38)
428
431
  f"{atom.y:8.3f}" # y (columns 39-46)
429
432
  f"{atom.z:8.3f}" # z (columns 47-54)
430
- f"{atom.occupancy:6.2f}" # occupancy (columns 55-60)
433
+ f"{occupancy:6.2f}" # occupancy (columns 55-60)
431
434
  f"{atom.bvalue:6.2f}" # temp factor (columns 61-66)
432
435
  f" " # columns 67-76 (padding)
433
436
  f"{atom.element:>2}" # element (columns 77-78)
@@ -468,6 +471,8 @@ def _format_anisou_line(
468
471
  else:
469
472
  chg = " "
470
473
 
474
+ atom_name = atom.name if atom.name else atom.element
475
+
471
476
  if atom.anisotropy:
472
477
  aniso_lines = (
473
478
  f"{_float_to_pdb_string(atom.anisotropy[0]):>7}" # x (columns 29-35)
@@ -493,7 +498,7 @@ def _format_anisou_line(
493
498
  line = (
494
499
  f"{record_type}"
495
500
  f"{serial:5d} " # atom serial number (columns 7-11)
496
- f"{atom.name:<4}" # atom name (columns 13-16, left-justified in this snippet)
501
+ f"{atom_name:<4}" # atom name (columns 13-16, left-justified in this snippet)
497
502
  f"{alt_loc_char}" # altLoc (column 17)
498
503
  f"{residue_name:>3}" # residue name (columns 18-20)
499
504
  f" {chain_char}" # chain ID (column 22)
@@ -1,8 +1,8 @@
1
1
  """Docking workflow."""
2
2
 
3
- from typing import Annotated
3
+ from typing import Annotated, Self
4
4
 
5
- from pydantic import AfterValidator, ConfigDict, field_validator
5
+ from pydantic import AfterValidator, ConfigDict, field_validator, model_validator
6
6
 
7
7
  from ..base import Base, round_float
8
8
  from ..pdb import PDB
@@ -26,6 +26,10 @@ class DockingWorkflow(Workflow):
26
26
  """
27
27
  Docking workflow.
28
28
 
29
+ Note that the protein can be supplied either by UUID or raw PDB object.
30
+ We anticipate that the former will dominate deployed usage, but the latter is handy for isolated testing.
31
+ If, for whatever reason, the workflow is initialized with both a `target_uuid` and a `target`, the UUID will be ignored.
32
+
29
33
  Inherited:
30
34
  :param initial_molecule: Molecule of interest
31
35
  :param mode: Mode for workflow (currently unused)
@@ -36,7 +40,8 @@ class DockingWorkflow(Workflow):
36
40
  :param do_csearch: whether to csearch starting structures
37
41
  :param do_optimization: whether to optimize starting structures
38
42
  :param conformers: UUIDs of optimized conformers
39
- :param target: PDB of the protein
43
+ :param target: PDB of the protein.
44
+ :param target_uuid: UUID of the protein.
40
45
  :param pocket: center (x, y, z) and size (x, y, z) of the pocket
41
46
 
42
47
  Results:
@@ -49,7 +54,8 @@ class DockingWorkflow(Workflow):
49
54
  do_optimization: bool = True
50
55
  conformers: list[UUID] = []
51
56
 
52
- target: PDB
57
+ target: PDB | None = None
58
+ target_uuid: UUID | None = None
53
59
  pocket: tuple[Vector3D, Vector3D]
54
60
 
55
61
  do_pose_hydrogen_refinement: bool = True
@@ -60,16 +66,25 @@ class DockingWorkflow(Workflow):
60
66
 
61
67
  def __repr__(self) -> str:
62
68
  """Return a string representation of the Docking workflow."""
63
- desc = self.target.description
64
- target = desc.code or desc.title
65
- ligand = "".join(atom.atomic_symbol for atom in self.initial_molecule.atoms)
69
+ if self.target is not None:
70
+ desc = self.target.description
71
+ target = desc.code or desc.title
72
+ else:
73
+ target = ""
66
74
 
75
+ ligand = "".join(atom.atomic_symbol for atom in self.initial_molecule.atoms)
67
76
  return f"<{type(self).__name__} {target} {ligand}>"
68
77
 
78
+ @model_validator(mode="after")
79
+ def check_protein(self) -> Self:
80
+ """Check if protein is provided."""
81
+ if not self.target and not self.target_uuid:
82
+ raise ValueError("Must provide either molecules or smiles")
83
+ return self
84
+
69
85
  @field_validator("pocket", mode="after")
70
86
  def validate_pocket(cls, pocket: tuple[Vector3D, Vector3D]) -> tuple[Vector3D, Vector3D]:
71
87
  center, size = pocket
72
88
  if any(q <= 0 for q in size):
73
89
  raise ValueError(f"Pocket size must be positive, got: {size}")
74
-
75
90
  return pocket
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: stjames
3
- Version: 0.0.58
3
+ Version: 0.0.61
4
4
  Summary: standardized JSON atom/molecule encoding scheme
5
5
  Author-email: Corin Wagen <corin@rowansci.com>
6
6
  Project-URL: Homepage, https://github.com/rowansci/stjames
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes