stjames 0.0.105__py3-none-any.whl → 0.0.108__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.

Potentially problematic release.


This version of stjames might be problematic. Click here for more details.

stjames/method.py CHANGED
@@ -135,3 +135,6 @@ PREPACKAGED_METHODS = [*XTB_METHODS, *COMPOSITE_METHODS, *PREPACKAGED_NNP_METHOD
135
135
 
136
136
  MethodWithCorrection = Literal[Method.WB97XD3, Method.WB97XV, Method.WB97MV, Method.WB97MD3BJ, Method.DSDBLYPD3BJ]
137
137
  METHODS_WITH_CORRECTION = [Method.WB97XD3, Method.WB97XV, Method.WB97MV, Method.WB97MD3BJ, Method.DSDBLYPD3BJ, Method.B97D3BJ]
138
+
139
+ MGGAFunctionals = Literal[Method.R2SCAN, Method.R2SCAN3C, Method.TPSS, Method.TPSSH, Method.M06L, Method.M06, Method.M062X, Method.WB97MD3BJ, Method.WB97MV]
140
+ MGGA_FUNCTIONALS = [Method.R2SCAN, Method.R2SCAN3C, Method.TPSS, Method.TPSSH, Method.M06L, Method.M06, Method.M062X, Method.WB97MD3BJ, Method.WB97MV]
stjames/solvent.py CHANGED
@@ -28,6 +28,8 @@ class Solvent(LowercaseStrEnum):
28
28
  ISOPROPANOL = "isopropanol"
29
29
  DIMETHYLACETAMIDE = "dimethylacetamide"
30
30
  DIMETHYLFORMAMIDE = "dimethylformamide"
31
+ N_METHYLPYRROLIDONE = "n_methylpyrrolidone"
32
+ ETHYLENE_GLYCOL = "ethylene_glycol"
31
33
 
32
34
 
33
35
  class SolventModel(LowercaseStrEnum):
@@ -26,6 +26,7 @@ from .redox_potential import *
26
26
  from .scan import *
27
27
  from .solubility import *
28
28
  from .spin_states import *
29
+ from .strain import *
29
30
  from .tautomer import *
30
31
  from .workflow import *
31
32
 
@@ -54,6 +55,7 @@ WORKFLOW_NAME = Literal[
54
55
  "scan",
55
56
  "solubility",
56
57
  "spin_states",
58
+ "strain",
57
59
  "tautomers",
58
60
  ]
59
61
 
@@ -82,5 +84,6 @@ WORKFLOW_MAPPING: dict[WORKFLOW_NAME, Workflow] = {
82
84
  "scan": ScanWorkflow, # type: ignore [dict-item]
83
85
  "solubility": SolubilityWorkflow, # type: ignore [dict-item]
84
86
  "spin_states": SpinStatesWorkflow, # type: ignore [dict-item]
87
+ "strain": StrainWorkflow, # type: ignore [dict-item]
85
88
  "tautomers": TautomerWorkflow, # type: ignore [dict-item]
86
89
  }
@@ -255,7 +255,41 @@ class iMTDsMTDSettings(iMTDSettings):
255
255
  run_type: str = "imtd-smtd"
256
256
 
257
257
 
258
- ConformerGenSettingsUnion = Annotated[ETKDGSettings | iMTDSettings, Field(discriminator="settings_type")]
258
+ class LyrebirdSettings(ConformerGenSettings):
259
+ """
260
+ Settings for Lyrebird-based conformer generation.
261
+
262
+ Inherited:
263
+ :param mode: Mode for calculations
264
+ :param conf_opt_method: method for the optimization
265
+ :param screening: post-generation screening settings
266
+ :param constraints: constraints for conformer generation
267
+ :param nci: add a constraining potential for non-covalent interactions (not supported in ETKDG)
268
+ :param max_confs: maximum number of conformers to keep
269
+
270
+ New:
271
+ :param num_initial_confs: number of initial conformers to generate
272
+ """
273
+
274
+ num_initial_confs: int = 300
275
+ settings_type: Literal["lyrebird"] = "lyrebird"
276
+
277
+ @field_validator("constraints")
278
+ def check_constraints(cls, constraints: Sequence[Constraint]) -> Sequence[Constraint]:
279
+ if constraints:
280
+ raise ValueError("Lyrebird does not support constraints")
281
+
282
+ return tuple(constraints)
283
+
284
+ @field_validator("nci")
285
+ def check_nci(cls, nci: bool) -> bool:
286
+ if nci:
287
+ raise ValueError("Lyrebird does not support NCI")
288
+
289
+ return nci
290
+
291
+
292
+ ConformerGenSettingsUnion = Annotated[ETKDGSettings | iMTDSettings | LyrebirdSettings, Field(discriminator="settings_type")]
259
293
 
260
294
 
261
295
  class ConformerGenMixin(BaseModel):
@@ -1,6 +1,6 @@
1
1
  """Docking workflow."""
2
2
 
3
- from typing import Annotated, Self
3
+ from typing import Annotated, Self, TypeAlias
4
4
 
5
5
  from pydantic import AfterValidator, ConfigDict, field_validator, model_validator
6
6
 
@@ -10,18 +10,26 @@ from ..types import UUID, Vector3D
10
10
  from .conformer_search import ConformerGenSettingsUnion, ETKDGSettings
11
11
  from .workflow import MoleculeWorkflow
12
12
 
13
+ ProteinUUID: TypeAlias = UUID
14
+ CalculationUUID: TypeAlias = UUID
15
+
13
16
 
14
17
  class Score(Base):
15
18
  """
16
19
  Pose with its score.
17
20
 
18
- :param pose: conformation of the ligand when docked
21
+ :param pose: conformation of the ligand when docked (calculation UUID)
22
+ :param complex_pdb: the UUID of the protein–ligand complex (protein UUID)
19
23
  :param score: score of the pose, in kcal/mol
24
+ :param posebusters_valid: whether or not the ligand pose passes the PoseBusters tests
25
+ :param strain: strain in kcal/mol
20
26
  """
21
27
 
22
- pose: UUID | None # for calculation
28
+ pose: CalculationUUID | None
29
+ complex_pdb: ProteinUUID | None
23
30
  score: Annotated[float, AfterValidator(round_float(3))]
24
31
  posebusters_valid: bool
32
+ strain: float | None
25
33
 
26
34
 
27
35
  class DockingSettings(Base):
@@ -78,17 +86,14 @@ class DockingWorkflow(MoleculeWorkflow):
78
86
  target_uuid: UUID | None = None
79
87
  pocket: tuple[Vector3D, Vector3D]
80
88
 
89
+ docking_settings: VinaSettings = VinaSettings()
90
+
81
91
  do_csearch: bool = True
82
92
  conformer_gen_settings: ConformerGenSettingsUnion = ETKDGSettings(mode="reckless")
83
-
84
93
  do_optimization: bool = True
85
- # optimization_settings - here in future once we have a cleaner mode sol'n, ccw 7.9.25
86
-
87
- docking_settings: VinaSettings = VinaSettings()
88
-
89
94
  do_pose_refinement: bool = True
90
95
 
91
- conformers: list[UUID] = []
96
+ conformers: list[CalculationUUID] = []
92
97
  scores: list[Score] = []
93
98
 
94
99
  def __str__(self) -> str:
stjames/workflows/pka.py CHANGED
@@ -1,12 +1,29 @@
1
1
  """pKa workflow."""
2
2
 
3
- from typing import Annotated
3
+ from typing import Annotated, Self
4
4
 
5
- from pydantic import AfterValidator
5
+ from pydantic import AfterValidator, model_validator
6
6
 
7
- from ..base import Base, round_float, round_optional_float
7
+ from ..base import Base, LowercaseStrEnum, round_float, round_optional_float
8
8
  from ..mode import Mode
9
- from .workflow import DBCalculation, MoleculeWorkflow
9
+ from ..solvent import Solvent
10
+ from .workflow import DBCalculation, MoleculeWorkflow, SMILESWorkflow
11
+
12
+ CHEMPROP_NEVOLIANUS2025_ALLOWED_SOLVENTS = {
13
+ Solvent.WATER,
14
+ Solvent.DIMETHYLSULFOXIDE,
15
+ Solvent.DIMETHYLFORMAMIDE,
16
+ Solvent.ACETONITRILE,
17
+ Solvent.METHANOL,
18
+ Solvent.ETHANOL,
19
+ Solvent.ETHYLENE_GLYCOL,
20
+ Solvent.N_METHYLPYRROLIDONE,
21
+ }
22
+
23
+
24
+ class MicroscopicpKaMethod(LowercaseStrEnum):
25
+ AIMNET2_WAGEN2024 = "aimnet2_wagen2024"
26
+ CHEMPROP_NEVOLIANUS2025 = "chemprop_nevolianus2025"
10
27
 
11
28
 
12
29
  class pKaMicrostate(Base):
@@ -14,26 +31,33 @@ class pKaMicrostate(Base):
14
31
  A microstate for pKa calculations.
15
32
 
16
33
  :param atom_index: index of the atom
34
+ :param smiles: SMILES of the microstate
17
35
  :param structures: DBCalculation for the microstate
18
- :param deltaG: relative free energy
19
- :param pka: pKa
36
+ :param deltaG: relative free energy (where applicable)
37
+ :param pka: pKa value associated with this microstate
38
+ :uncertainty: uncertainty in the pKa prediction
20
39
  """
21
40
 
22
41
  atom_index: int
42
+ smiles: str | None = None
23
43
  structures: list[DBCalculation] = []
24
- deltaG: Annotated[float, AfterValidator(round_float(3))]
44
+ deltaG: Annotated[float | None, AfterValidator(round_optional_float(3))] = None
25
45
  pka: Annotated[float, AfterValidator(round_float(3))]
46
+ uncertainty: Annotated[float | None, AfterValidator(round_optional_float(3))] = None
26
47
 
27
48
 
28
- class pKaWorkflow(MoleculeWorkflow):
49
+ class pKaWorkflow(SMILESWorkflow, MoleculeWorkflow):
29
50
  """
30
51
  Workflow for calculating pKa.
31
52
 
32
53
  Inherited:
33
54
  :param initial_molecule: Molecule of interest
34
55
  :param mode: Mode for workflow
56
+ :param initial_smiles: SMILES of the molecule of interest
35
57
 
36
58
  New:
59
+ :param microscopic_pka_method: method used for pka prediciton
60
+ :param solvent: solvent for the pka prediction
37
61
  :param pka_range: range of pKa values to consider
38
62
  :param deprotonate_elements: elements to deprotonate
39
63
  :param deprotonate_atoms: atoms to deprotonate
@@ -51,6 +75,8 @@ class pKaWorkflow(MoleculeWorkflow):
51
75
 
52
76
  mode: Mode = Mode.CAREFUL
53
77
 
78
+ microscopic_pka_method: MicroscopicpKaMethod = MicroscopicpKaMethod.CHEMPROP_NEVOLIANUS2025
79
+ solvent: Solvent = Solvent.WATER
54
80
  pka_range: tuple[float, float] = (2, 12)
55
81
  deprotonate_elements: list[int] = [7, 8, 16]
56
82
  deprotonate_atoms: list[int] = []
@@ -64,3 +90,26 @@ class pKaWorkflow(MoleculeWorkflow):
64
90
  conjugate_bases: list[pKaMicrostate] = []
65
91
  strongest_acid: Annotated[float | None, AfterValidator(round_optional_float(3))] = None
66
92
  strongest_base: Annotated[float | None, AfterValidator(round_optional_float(3))] = None
93
+
94
+ @model_validator(mode="after")
95
+ def check_method_settings(self) -> Self:
96
+ """Check that models with limited domain of applicability are predicting within correct domain."""
97
+ match self.microscopic_pka_method:
98
+ case MicroscopicpKaMethod.AIMNET2_WAGEN2024:
99
+ if self.solvent is not Solvent.WATER:
100
+ raise ValueError(f"{self.microscopic_pka_method} only supports water")
101
+ case MicroscopicpKaMethod.CHEMPROP_NEVOLIANUS2025:
102
+ if self.solvent not in CHEMPROP_NEVOLIANUS2025_ALLOWED_SOLVENTS:
103
+ raise ValueError(f"Solvent `{self.solvent}` is not supported by method `{self.microscopic_pka_method}`.")
104
+ if len(self.protonate_atoms) or len(self.deprotonate_atoms):
105
+ raise ValueError(f"Method `{self.microscopic_pka_method}` does not support selecting atoms by number.")
106
+ return self
107
+
108
+ @model_validator(mode="after")
109
+ def validate_mol_input(self) -> Self:
110
+ """Ensure that only one of initial_molecule or initial_smiles is set."""
111
+
112
+ if not (bool(self.initial_smiles) ^ bool(self.initial_molecule)):
113
+ raise ValueError("Can only set one of initial_molecule should and initial_smiles")
114
+
115
+ return self
@@ -1,13 +1,16 @@
1
- """Protein Cofolding Workflow."""
1
+ """Protein cofolding Workflow."""
2
2
 
3
- from typing import Annotated, Literal
3
+ from typing import Annotated, Literal, TypeAlias
4
4
 
5
5
  from pydantic import AfterValidator, BaseModel, ConfigDict
6
6
 
7
- from ..base import LowercaseStrEnum, round_float
7
+ from ..base import LowercaseStrEnum, round_float, round_optional_float
8
8
  from ..types import UUID, round_list
9
9
  from .workflow import FASTAWorkflow
10
10
 
11
+ ProteinUUID: TypeAlias = UUID
12
+ CalculationUUID: TypeAlias = UUID
13
+
11
14
 
12
15
  class CofoldingModel(LowercaseStrEnum):
13
16
  """Cofolding model to be used for prediction."""
@@ -45,6 +48,8 @@ class PocketConstraint(BaseModel):
45
48
 
46
49
 
47
50
  class CofoldingScores(BaseModel):
51
+ """The output scores from co-folding scores."""
52
+
48
53
  confidence_score: Annotated[float, AfterValidator(round_float(3))]
49
54
  ptm: Annotated[float, AfterValidator(round_float(3))] # predicted template modeling score
50
55
  iptm: Annotated[float, AfterValidator(round_float(3))] # interface predicted template modeling score
@@ -71,7 +76,17 @@ class ProteinCofoldingWorkflow(FASTAWorkflow):
71
76
  New:
72
77
  :param use_msa_server: whether to use the MSA server
73
78
  :param use_templates_server: whether to use the templates server
79
+ :param use_potentials: whether to use the potentials (inference-time steering) with Boltz
80
+ :param contact_constraints: Boltz contact constraints
81
+ :param pocket_constraints: Boltz pocket constraints
82
+ :param do_pose_refinement: whether to optimize non-rotatable bonds in output poses
83
+ :param compute_strain: whether to compute the strain of the pose (if `pose_refinement` is enabled)
84
+ :param model: which cofolding model to use
85
+ :param affinity_score: the affinity score
86
+ :param lddt: the local distance different test result
74
87
  :param predicted_structure_uuid: UUID of the predicted structure
88
+ :param scores: the output cofolding scores
89
+ :param pose: the UUID of the calculation pose
75
90
  """
76
91
 
77
92
  model_config = ConfigDict(validate_assignment=True)
@@ -81,9 +96,15 @@ class ProteinCofoldingWorkflow(FASTAWorkflow):
81
96
  use_potentials: bool = False
82
97
  contact_constraints: list[ContactConstraint] = []
83
98
  pocket_constraints: list[PocketConstraint] = []
99
+ do_pose_refinement: bool = False
100
+ compute_strain: bool = False
84
101
 
85
- predicted_structure_uuid: UUID | None = None
86
- scores: CofoldingScores | None = None
87
102
  model: CofoldingModel = CofoldingModel.BOLTZ_2
88
103
  affinity_score: AffinityScore | None = None
89
104
  lddt: Annotated[list[float] | None, AfterValidator(round_list(3))] = None
105
+
106
+ predicted_structure_uuid: ProteinUUID | None = None
107
+ scores: CofoldingScores | None = None
108
+ pose: CalculationUUID | None = None
109
+ posebusters_valid: bool | None = None
110
+ strain: Annotated[float | None, AfterValidator(round_optional_float(3))] = None
@@ -0,0 +1,46 @@
1
+ from typing import Annotated
2
+
3
+ from pydantic import AfterValidator
4
+
5
+ from ..base import round_float, round_optional_float
6
+ from ..mode import Mode
7
+ from ..settings import Settings
8
+ from ..types import UUID
9
+ from .conformer_search import ConformerGenSettingsUnion, ETKDGSettings
10
+ from .multistage_opt import MultiStageOptSettings
11
+ from .workflow import MoleculeWorkflow
12
+
13
+
14
+ class StrainWorkflow(MoleculeWorkflow):
15
+ """
16
+ Workflow for calculating the strain of a given molecular geometry.
17
+
18
+ Inherited:
19
+ :param initial_molecule: Molecule of interest
20
+ :param mode: Mode for workflow (currently unused)
21
+
22
+ New:
23
+ :param conf_gen_settings : the conformer-search settings.
24
+ :param multistage_opt_settings: the optimization settings.
25
+ :param harmonic_constraint_spring_constant: the spring constant for the constraints in kcal/mol/Å
26
+ :param constrain_hydrogens: whether or not to constrain hydrogens
27
+
28
+ Results:
29
+ :param conformers: list of conformer UUIDs
30
+ :param constrained_optimization: the UUID of the optimized strained structure
31
+ :param strain: the actual strain in kcal/mol
32
+ """
33
+
34
+ conf_gen_settings: ConformerGenSettingsUnion = ETKDGSettings(mode="rapid")
35
+ multistage_opt_settings: MultiStageOptSettings = MultiStageOptSettings(
36
+ mode=Mode.MANUAL,
37
+ optimization_settings=[Settings(method="aimnet2_wb97md3", tasks=["optimize"])],
38
+ singlepoint_settings=Settings(method="aimnet2_wb97md3", tasks=["energy"], solvent_settings={"solvent": "water", "model": "cpcmx"}),
39
+ )
40
+
41
+ harmonic_constraint_spring_constant: Annotated[float, AfterValidator(round_float(3))] = 5.0
42
+ constrain_hydrogens: bool = False
43
+
44
+ constrained_optimization: UUID | None = None
45
+ conformers: list[UUID | None] = []
46
+ strain: Annotated[float | None, AfterValidator(round_optional_float(3))] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stjames
3
- Version: 0.0.105
3
+ Version: 0.0.108
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
@@ -9,7 +9,7 @@ stjames/constraint.py,sha256=B6oV0rYjmAWr8gpi5f03gRy_uuqjUURVDVwoez5Cfbg,2442
9
9
  stjames/correction.py,sha256=ZVErCcj4TPyZeKrdvXVjHa0tFynsCaoy96QZUVxWFM8,413
10
10
  stjames/engine.py,sha256=jaOHi3nhKZG85HAvKu-HuDl1Hh9nnJfhmOez2ghZXWA,293
11
11
  stjames/message.py,sha256=Rq6QqmHZKecWxYH8fVyXmuoCCPZv8YinvgykSeorXSU,216
12
- stjames/method.py,sha256=tMdngVD7kU5ob285YD2-2UVq1gwf0T7dkGF0qYSNoWQ,4453
12
+ stjames/method.py,sha256=3HJ-dSK75HG-YPzgDVT8lQ0Ttld-TF984qDDTTAJk9A,4762
13
13
  stjames/mode.py,sha256=xw46Cc7f3eTS8i35qECi-8DocAlANhayK3w4akD4HBU,496
14
14
  stjames/molecule.py,sha256=4Tsa_gRC4C-qGPop24jRIs2q07r0LGbSRb-ApOaZa5c,20839
15
15
  stjames/opt_settings.py,sha256=LEwGXUEKq5TfU5rr60Z4QQBhCqiw1Ch5w0M_lXawWo8,642
@@ -18,7 +18,7 @@ stjames/periodic_cell.py,sha256=eV_mArsY_MPEFSrFEsTC-CyCc6V8ITAXdk7yhjjNI7M,1080
18
18
  stjames/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  stjames/scf_settings.py,sha256=ecEVP3aKArNorpbP0mapnbc-EMjjzx4jeVW6q9tvqsw,436
20
20
  stjames/settings.py,sha256=qZ3yhuMIQNiLs8Z-uEyVReSg2IQAjnDzQ6euHHqE6xI,6128
21
- stjames/solvent.py,sha256=u037tmu-9oa21s-WEDZ7VC7nuNVjkqR2ML4JWjWSME4,1158
21
+ stjames/solvent.py,sha256=flrGlwD4QavmXlIxeqlsiQv1F_PWyqBTKTDH9HjHdRg,1246
22
22
  stjames/status.py,sha256=KQHDqWSd4kBLow23YLcfOkFdtqN61RFZI-jf2zANWRY,501
23
23
  stjames/task.py,sha256=OLINRqe66o7t8arffilwmggrF_7TH0L79u6DhGruxV8,329
24
24
  stjames/thermochem_settings.py,sha256=ZTLz31v8Ltutde5Nfm0vH5YahWjcfFWfr_R856KffxE,517
@@ -37,14 +37,14 @@ stjames/data/read_nist_isotopes.py,sha256=y10FNjW43QpC45qib7VHsIghEwT7GG5rsNwHdc
37
37
  stjames/data/symbol_element.json,sha256=vl_buFusTqBd-muYQtMLtTDLy2OtBI6KkBeqkaWRQrg,1186
38
38
  stjames/optimization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  stjames/optimization/freezing_string_method.py,sha256=eEQBqbYHgJH9gVRLDIFtGuPcsHHMLAAt1hF3jtq70lo,2285
40
- stjames/workflows/__init__.py,sha256=-HhT_DJeYCzTO-FeM-wabFyxwLreTE8bXHuaSx3Ylzg,3071
40
+ stjames/workflows/__init__.py,sha256=I-s6f6uz7PXpeKsvQlL04wswId2mW2u7thk309TC7ng,3165
41
41
  stjames/workflows/admet.py,sha256=h8ph6oeRCxU3-_jqRRWPg3RZcheu9JzCHiWqSC9VYKY,1296
42
42
  stjames/workflows/basic_calculation.py,sha256=sAgHBcNHE72ZbZPB9vyZShALRC4zOVw6It6cpJlbX2A,911
43
43
  stjames/workflows/bde.py,sha256=g_In-caftXiimrhfdptHjpfrYQUs3vF58qYmRnaTN8g,10825
44
44
  stjames/workflows/conformer.py,sha256=18aO6ngMBeGAmQkBdLGCCHr398RIYr1v2hD2IT1u4cc,3005
45
- stjames/workflows/conformer_search.py,sha256=clWFstrz-y1N1x8KtbY7kYUdLrWFSlTLKr-9KnJxt8M,13625
45
+ stjames/workflows/conformer_search.py,sha256=sQayHL5aGY8WssQOGW4lPh1aXLfcPJewG9WUiC8il6A,14744
46
46
  stjames/workflows/descriptors.py,sha256=T4tc7xdtBdxESGO86KR323jPQ2pgwxBqgV0khA6MEgQ,584
47
- stjames/workflows/docking.py,sha256=JG-c6um2tVNeu5H1uzpdQEM5RGMXKgcGNKptTstqj9o,3864
47
+ stjames/workflows/docking.py,sha256=sJFSGyIve-q55UEir2rV9Pk7L09_pPuSy2K00JLvA68,4138
48
48
  stjames/workflows/double_ended_ts_search.py,sha256=ovJgEVFc6c3mijCE3TKAY70YvqNmAZ5Y4XgV4-tIxBI,3127
49
49
  stjames/workflows/electronic_properties.py,sha256=GT3-NC7w-dbcOJ-3AzJ7LgzH6frTbiH2Iyb9BCa-SvY,4112
50
50
  stjames/workflows/fukui.py,sha256=095GDGSSEc5PDD1aoKM8J7icgR5tfwS5Bs9XxFQHge4,2387
@@ -55,17 +55,18 @@ stjames/workflows/macropka.py,sha256=Krj0xXuB-u57Kqlf4bbRiHDUWCpliFr6YPiYqPmYaWk
55
55
  stjames/workflows/molecular_dynamics.py,sha256=HqWNxxPSAphfI0DdbTERFkq8UeBjEvhnA_ETv0xw_RY,3522
56
56
  stjames/workflows/multistage_opt.py,sha256=UN-4WLsT2WEjO5KqDPrcCkb708Co-ZScHx3g2bto768,16597
57
57
  stjames/workflows/nmr.py,sha256=1QEF4SB6dWIr-jzLEZ7V972UnRUOTufOJSHwIGyV3dM,2681
58
- stjames/workflows/pka.py,sha256=j3vBh2YM3nJzJ1XJKPsmYahRCeaU9n3P-G-u9_moaFw,2065
58
+ stjames/workflows/pka.py,sha256=lchAaQIIqpekabODGkiFAbIR4y_-cLur00eTFQBZeZ8,4457
59
59
  stjames/workflows/pose_analysis_md.py,sha256=ES0XlzaLpTjhLrNvcB0zFZa1b1ZHXekN72EbLsx0Skw,4723
60
- stjames/workflows/protein_cofolding.py,sha256=ZjHER5DsO2vgCpgqttcNIU8xISN5B4DdqdrTxLKFsKY,2998
60
+ stjames/workflows/protein_cofolding.py,sha256=mRdQoBWGYBqT8eEGfQ8yFLAcLJToYT_kIfvOQD68QVc,4039
61
61
  stjames/workflows/redox_potential.py,sha256=7S18t9Y3eynSnA3lZbRlvLfdbgeBopdiigLzt1zxg5c,3871
62
62
  stjames/workflows/scan.py,sha256=DXQBpa2t2PowAtOwmdgpxaSLq--fEShljzAGSb8Nf5U,2993
63
63
  stjames/workflows/solubility.py,sha256=lfCVvJjqEaddLUpK6WBxjB7u12Sci-K95A5_qIMkIRM,3028
64
64
  stjames/workflows/spin_states.py,sha256=0degmE-frovgoXweshZyjfjqL7nkbaFoO9YoJhvQnaI,4748
65
+ stjames/workflows/strain.py,sha256=paYxDDQTB1eYP_c2kLVz1-QX7Vpw0LLb3ujnFin_SOM,1834
65
66
  stjames/workflows/tautomer.py,sha256=7eYKziGPg8Km6lfowTzSkgJfJ4SHUPrAmnTf8Bi-SB0,1164
66
67
  stjames/workflows/workflow.py,sha256=OE05pt2ZOd8TzTOlBngXCVg9wv_553ZR60VNRPlq0f8,1953
67
- stjames-0.0.105.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
68
- stjames-0.0.105.dist-info/METADATA,sha256=H8v2QtQVxJf93AM44xzVNicBeQUgxtKRtIT9T2Llb38,1725
69
- stjames-0.0.105.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
- stjames-0.0.105.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
71
- stjames-0.0.105.dist-info/RECORD,,
68
+ stjames-0.0.108.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
69
+ stjames-0.0.108.dist-info/METADATA,sha256=2El3nqGMGXf2ZFnMF2t4VSF0tUTfbk_j1T8pauwpS88,1725
70
+ stjames-0.0.108.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
71
+ stjames-0.0.108.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
72
+ stjames-0.0.108.dist-info/RECORD,,