stjames 0.0.98__py3-none-any.whl → 0.0.101__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/engine.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from .base import LowercaseStrEnum
2
2
 
3
3
 
4
- class Mode(LowercaseStrEnum):
4
+ class Engine(LowercaseStrEnum):
5
5
  AIMNET2 = "aimnet2"
6
6
  MACE = "mace"
7
7
  OCP24 = "ocp24"
stjames/method.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from typing import Literal
2
2
 
3
3
  from .base import LowercaseStrEnum
4
+ from .engine import Engine
4
5
 
5
6
 
6
7
  class Method(LowercaseStrEnum):
@@ -55,48 +56,42 @@ class Method(LowercaseStrEnum):
55
56
  EGRET_1E = "egret_1e"
56
57
  EGRET_1T = "egret_1t"
57
58
 
58
- def default_engine(self, *, is_periodic: bool = False) -> str:
59
+ def default_engine(self, *, is_periodic: bool = False) -> Engine:
59
60
  """
60
- Return the canonical engine name for this quantum-chemistry method.
61
+ Return the canonical Engine for this quantum-chemistry method.
61
62
 
62
63
  :param bool is_periodic:
63
64
  If ``True`` **and** the method is in the XTB family, return
64
65
  ``"tblite"`` (periodic-capable backend) instead of ``"xtb"``.
65
- :returns: Lower-case engine identifier (e.g. ``"psi4"``, ``"mace"``).
66
-
67
- **Examples**
68
-
69
- .. code-block:: python
70
-
71
- Method.MACE_MP_0B2_L.default_engine()
72
- # 'mace'
73
-
74
- Method.GFN2_XTB.default_engine()
75
- # 'xtb'
76
-
77
- Method.GFN2_XTB.default_engine(is_periodic=True)
78
- # 'tblite'
66
+ :returns: lower-case engine identifier (e.g. ``"psi4"``, ``"mace"``).
67
+
68
+ >>> Method.MACE_MP_0B2_L.default_engine().value
69
+ 'mace'
70
+ >>> Method.GFN2_XTB.default_engine().value
71
+ 'xtb'
72
+ >>> Method.GFN2_XTB.default_engine(is_periodic=True).value
73
+ 'tblite'
79
74
  """
80
75
  match self:
81
76
  case Method.AIMNET2_WB97MD3:
82
- return "aimnet2"
77
+ return Engine.AIMNET2
83
78
  case Method.MACE_MP_0B2_L:
84
- return "mace"
79
+ return Engine.MACE
85
80
  case Method.OCP24_S | Method.OCP24_L:
86
- return "ocp24"
81
+ return Engine.OCP24
87
82
  case Method.OMOL25_CONSERVING_S | Method.UMA_M_OMOL | Method.UMA_S_OMOL:
88
- return "omol25"
83
+ return Engine.OMOL25
89
84
  case Method.ORB_V3_CONSERVATIVE_INF_OMAT:
90
- return "orb"
91
- case _ if self in XTB_METHODS:
92
- return "tblite" if is_periodic else "xtb"
85
+ return Engine.ORB
86
+ case method if method in XTB_METHODS:
87
+ return Engine.TBLITE if is_periodic else Engine.XTB
93
88
  case Method.OFF_SAGE_2_2_1:
94
- return "openff"
89
+ return Engine.OPENFF
95
90
  case Method.EGRET_1 | Method.EGRET_1E | Method.EGRET_1T:
96
- return "egret"
91
+ return Engine.EGRET
97
92
  case _:
98
93
  # All remaining methods (HF, DFT, composite, etc.) fall back to Psi4
99
- return "psi4"
94
+ return Engine.PSI4
100
95
 
101
96
 
102
97
  PrepackagedNNPMethod = Literal[
stjames/molecule.py CHANGED
@@ -157,12 +157,20 @@ class Molecule(Base):
157
157
  return None
158
158
  return self.energy + self.thermal_enthalpy_corr
159
159
 
160
+ @property
161
+ def enthalpy(self) -> Optional[float]:
162
+ return self.sum_energy_enthalpy
163
+
160
164
  @property
161
165
  def sum_energy_free_energy(self) -> Optional[float]:
162
166
  if (self.energy is None) or (self.thermal_free_energy_corr is None):
163
167
  return None
164
168
  return self.energy + self.thermal_free_energy_corr
165
169
 
170
+ @property
171
+ def gibbs_free_energy(self) -> Optional[float]:
172
+ return self.sum_energy_free_energy
173
+
166
174
  @pydantic.model_validator(mode="after")
167
175
  def check_electron_sanity(self) -> Self:
168
176
  num_electrons = sum(self.atomic_numbers) - self.charge
File without changes
@@ -0,0 +1,56 @@
1
+ """Settings for the Freezing String Method (FSM)."""
2
+
3
+ from typing import Annotated, Self
4
+
5
+ from pydantic import AfterValidator, BaseModel, PositiveFloat, PositiveInt, model_validator
6
+
7
+ from ..base import LowercaseStrEnum, round_float
8
+
9
+
10
+ class FSMOptimizationCoordinates(LowercaseStrEnum):
11
+ """Coordinate systems for FSM optimization step."""
12
+
13
+ CARTESIAN = "cartesian"
14
+ REDUNDANT_INTERNAL_COORDINATES = "redundant_internal_coordinates"
15
+
16
+
17
+ class FSMInterpolation(LowercaseStrEnum):
18
+ """Methods for FSM interpolation step."""
19
+
20
+ CARTESIAN = "cartesian"
21
+ LINEAR_SYNCHRONOUS_TRANSIT = "linear_synchronous_transit"
22
+ REDUNDANT_INTERNAL_COORDINATES = "redundant_internal_coordinates"
23
+
24
+
25
+ class FSMSettings(BaseModel):
26
+ """
27
+ Settings for the Freezing String Method (FSM) TS search.
28
+
29
+ :param opt_coords: coordinate system to use for optimization
30
+ :param interpolation_method: method to use for interpolation between nodes
31
+ :param min_num_nodes: minimum number of nodes to use in the string
32
+ :param num_interpolation_points: number of interpolation points to use between end nodes
33
+ :param max_optimizer_iterations: maximum number of optimizer iterations to perform (scipy.minimize maxiter)
34
+ :param max_line_search_steps: maximum number of line search steps to perform (scipy.minimize maxls)
35
+ :param max_displacement: maximum displacement for a single coordinate (Å for distances, internally converted for angles)
36
+ """
37
+
38
+ optimization_coordinates: FSMOptimizationCoordinates = FSMOptimizationCoordinates.CARTESIAN
39
+ interpolation_method: FSMInterpolation = FSMInterpolation.REDUNDANT_INTERNAL_COORDINATES
40
+
41
+ min_num_nodes: PositiveInt = 18
42
+ num_interpolation_points: PositiveInt = 100
43
+
44
+ max_optimizer_iterations: PositiveInt = 3
45
+ max_line_search_steps: PositiveInt = 2
46
+ max_displacement: Annotated[PositiveFloat, AfterValidator(round_float(3))] = 0.3
47
+
48
+ @model_validator(mode="after")
49
+ def sanity_check(self) -> Self:
50
+ """Sanity check for settings."""
51
+ if self.min_num_nodes < 5:
52
+ raise ValueError("Must have at least 5 nodes for the Freezing String Method.")
53
+ if self.max_displacement < 0.001:
54
+ raise ValueError("Maximum displacement must be at least 0.001 Å.")
55
+
56
+ return self
@@ -9,6 +9,7 @@ from .conformer import *
9
9
  from .conformer_search import *
10
10
  from .descriptors import *
11
11
  from .docking import *
12
+ from .double_ended_ts_search import DoubleEndedTSSearchWorkflow
12
13
  from .electronic_properties import *
13
14
  from .fukui import *
14
15
  from .hydrogen_bond_basicity import *
@@ -36,6 +37,7 @@ WORKFLOW_NAME = Literal[
36
37
  "conformer_search",
37
38
  "descriptors",
38
39
  "docking",
40
+ "double_ended_ts_search",
39
41
  "electronic_properties",
40
42
  "fukui",
41
43
  "hydrogen_bond_basicity",
@@ -63,6 +65,7 @@ WORKFLOW_MAPPING: dict[WORKFLOW_NAME, Workflow] = {
63
65
  "conformer_search": ConformerSearchWorkflow, # type: ignore [dict-item]
64
66
  "descriptors": DescriptorsWorkflow, # type: ignore [dict-item]
65
67
  "docking": DockingWorkflow, # type: ignore [dict-item]
68
+ "double_ended_ts_search": DoubleEndedTSSearchWorkflow, # type: ignore [dict-item]
66
69
  "electronic_properties": ElectronicPropertiesWorkflow, # type: ignore [dict-item]
67
70
  "fukui": FukuiIndexWorkflow, # type: ignore [dict-item]
68
71
  "hydrogen_bond_basicity": HydrogenBondBasicityWorkflow, # type: ignore [dict-item]
@@ -1,5 +1,10 @@
1
1
  """Basic calculation workflow."""
2
2
 
3
+ from typing import Self
4
+
5
+ from pydantic import model_validator
6
+
7
+ from ..engine import Engine
3
8
  from ..settings import Settings
4
9
  from ..types import UUID
5
10
  from .workflow import MoleculeWorkflow
@@ -20,5 +25,12 @@ class BasicCalculationWorkflow(MoleculeWorkflow):
20
25
  """
21
26
 
22
27
  settings: Settings
23
- engine: str
28
+ engine: Engine = None # type: ignore [assignment]
24
29
  calculation_uuid: UUID | None = None
30
+
31
+ @model_validator(mode="after")
32
+ def set_engine(self) -> Self:
33
+ """Set the calculation engine."""
34
+ self.engine = self.engine or self.settings.method.default_engine()
35
+
36
+ return self
@@ -58,11 +58,10 @@ class DockingWorkflow(MoleculeWorkflow):
58
58
  :param mode: Mode for workflow (currently unused)
59
59
 
60
60
  New:
61
- :param docking_engine: which docking method to use
62
61
  :param do_csearch: whether to csearch starting structures
63
- :param csearch_settings: settings for initial conformer search.
62
+ :param conformer_gen_settings: settings for initial conformer search.
64
63
  :param do_optimization: whether to optimize starting structures
65
- :param opt_settings: settings for conformer optimization.
64
+ :param optimization_settings: settings for conformer optimization.
66
65
  :param do_pose_refinement: whether to optimize non-rotatable bonds in output poses
67
66
  :param target: PDB of the protein.
68
67
  :param target_uuid: UUID of the protein.
@@ -0,0 +1,77 @@
1
+ """Double ended transition-state-search workflow."""
2
+
3
+ from typing import Annotated, Self
4
+
5
+ from pydantic import AfterValidator, PositiveFloat, model_validator
6
+
7
+ from ..molecule import Molecule
8
+ from ..optimization.freezing_string_method import FSMSettings
9
+ from ..settings import Settings
10
+ from ..types import UUID, round_list
11
+ from .workflow import Workflow
12
+
13
+
14
+ class DoubleEndedTSSearchWorkflow(Workflow):
15
+ """
16
+ Settings for running a double-ended-transition-state-search Workflow.
17
+
18
+ # Inputs
19
+ :param reactant: reactant Molecule
20
+ :param product: product Molecule
21
+ :param calculation_settings: Settings for the calculations
22
+ :param search_settings: Settings for the search
23
+ :param optimize_inputs: Whether to optimize the input reactant and product
24
+ :param optimize_ts: Whether to optimize the guess transition state
25
+
26
+ # Results
27
+ :param forward_string_distances: distances along the string
28
+ :param backward_string_distances: distances along the backward string (starting from the end of the forward string)
29
+ :param forward_calculation_uuids: UUIDs of the calculations for the forward string nodes
30
+ :param backward_calculation_uuids: UUIDs of the calculations for the backward string nodes
31
+ :param ts_guess_calculation_uuid: UUID of the calculation for the guess (or optimized) transition state
32
+ """
33
+
34
+ reactant: Molecule
35
+ product: Molecule
36
+
37
+ calculation_settings: Settings
38
+ search_settings: FSMSettings
39
+ optimize_inputs: bool = False
40
+ optimize_ts: bool = True
41
+
42
+ # Results
43
+ forward_string_distances: Annotated[list[PositiveFloat], AfterValidator(round_list(5))] = []
44
+ backward_string_distances: Annotated[list[PositiveFloat], AfterValidator(round_list(5))] = []
45
+
46
+ forward_calculation_uuids: list[UUID | None] = []
47
+ backward_calculation_uuids: list[UUID | None] = []
48
+
49
+ ts_guess_calculation_uuid: UUID | None = None
50
+
51
+ @model_validator(mode="after")
52
+ def validate_input_molecules(self) -> Self:
53
+ """Validate that reactant and product are compatible."""
54
+
55
+ if self.reactant.charge != self.product.charge:
56
+ raise ValueError("Reactant and product must have the same charge.")
57
+ if self.reactant.multiplicity != self.product.multiplicity:
58
+ raise ValueError("Reactant and product must have the same multiplicity.")
59
+
60
+ if len(self.reactant) != len(self.product):
61
+ raise ValueError("Reactant and product must have the same number of atoms.")
62
+
63
+ for r_atom, p_atom in zip(self.reactant.atoms, self.product.atoms, strict=True):
64
+ if r_atom.atomic_number != p_atom.atomic_number:
65
+ raise ValueError("Reactant and product must have the same atom ordering.")
66
+
67
+ return self
68
+
69
+ @property
70
+ def path_uuids(self) -> list[UUID | None]:
71
+ """Return the path from reactant to product."""
72
+ return self.forward_calculation_uuids + self.backward_calculation_uuids
73
+
74
+ @property
75
+ def distances(self) -> list[float]:
76
+ """Return the path from reactant to product."""
77
+ return self.forward_string_distances + self.backward_string_distances[::-1]
@@ -1,10 +1,13 @@
1
1
  """Fukui index 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
+
7
+ from stjames.method import Method
6
8
 
7
9
  from ..base import round_optional_float
10
+ from ..engine import Engine
8
11
  from ..settings import Settings
9
12
  from ..types import UUID, FloatPerAtom, round_optional_float_per_atom
10
13
  from .workflow import MoleculeWorkflow
@@ -20,9 +23,9 @@ class FukuiIndexWorkflow(MoleculeWorkflow):
20
23
 
21
24
  Settings:
22
25
  :param opt_settings: if given, the settings for optimization. if none, no optimization will be conducted.
23
- :param opt_engine: the engine for optimization
26
+ :param opt_engine: the engine for optimization [uses opt_settings.method.default_engine if not set]
24
27
  :param fukui_settings: the settings for Fukui index calculations.
25
- :param fukui_engine: the engine for Fukui index calculations
28
+ :param fukui_engine: the engine for Fukui index calculations [uses fukui_settings.method.default_engine if not set]
26
29
 
27
30
  Results:
28
31
  :param optimization: UUID of optimization
@@ -33,10 +36,10 @@ class FukuiIndexWorkflow(MoleculeWorkflow):
33
36
  """
34
37
 
35
38
  opt_settings: Settings | None = None
36
- opt_engine: str | None = None
39
+ opt_engine: Engine | None = None
37
40
 
38
- fukui_settings: Settings = Settings(method="gfn1_xtb")
39
- fukui_engine: str | None = None
41
+ fukui_settings: Settings = Settings(method=Method.GFN1_XTB)
42
+ fukui_engine: Engine = None # type: ignore [assignment]
40
43
 
41
44
  optimization: UUID | None = None
42
45
 
@@ -44,3 +47,12 @@ class FukuiIndexWorkflow(MoleculeWorkflow):
44
47
  fukui_positive: Annotated[FloatPerAtom | None, AfterValidator(round_optional_float_per_atom(6))] = None
45
48
  fukui_negative: Annotated[FloatPerAtom | None, AfterValidator(round_optional_float_per_atom(6))] = None
46
49
  fukui_zero: Annotated[FloatPerAtom | None, AfterValidator(round_optional_float_per_atom(6))] = None
50
+
51
+ @model_validator(mode="after")
52
+ def set_engines(self) -> Self:
53
+ """Set the engines for optimization and Fukui index calculations."""
54
+ if self.opt_settings is not None and self.opt_engine is None:
55
+ self.opt_engine = self.opt_settings.method.default_engine()
56
+ self.fukui_engine = self.fukui_engine or self.fukui_settings.method.default_engine()
57
+
58
+ return self
@@ -6,6 +6,7 @@ from pydantic import PositiveFloat, PositiveInt, computed_field, model_validator
6
6
 
7
7
  from ..base import Base, LowercaseStrEnum
8
8
  from ..constraint import PairwiseHarmonicConstraint, SphericalHarmonicConstraint
9
+ from ..engine import Engine
9
10
  from ..settings import Settings
10
11
  from ..types import UUID
11
12
  from .workflow import MoleculeWorkflow
@@ -87,7 +88,7 @@ class MolecularDynamicsWorkflow(MoleculeWorkflow):
87
88
  New:
88
89
  :param settings: settings for the molecular dynamics simulation
89
90
  :param calc_settings: settings for the gradient calculation
90
- :param calc_engine: engine to use for the gradient calculation
91
+ :param calc_engine: engine to use for the gradient calculation [uses calc_settings.method.default_engine() if not set]
91
92
 
92
93
  Results:
93
94
  :param frames: Frames from the MD
@@ -95,6 +96,13 @@ class MolecularDynamicsWorkflow(MoleculeWorkflow):
95
96
 
96
97
  settings: MolecularDynamicsSettings
97
98
  calc_settings: Settings
98
- calc_engine: str | None = None
99
+ calc_engine: Engine = None # type: ignore[assignment]
99
100
 
100
101
  frames: list[Frame] = []
102
+
103
+ @model_validator(mode="after")
104
+ def validate_calc_engine(self) -> Self:
105
+ """Ensure that the calc_engine is set."""
106
+ self.calc_engine = self.calc_engine or self.calc_settings.method.default_engine()
107
+
108
+ return self
stjames/workflows/nmr.py CHANGED
@@ -29,7 +29,7 @@ class NMRPeak(Base):
29
29
 
30
30
  nucleus: int
31
31
  shift: Annotated[float, AfterValidator(round_float(3))]
32
- atom_indices: set[int]
32
+ atom_indices: list[int]
33
33
 
34
34
 
35
35
  class NMRSpectroscopyWorkflow(MoleculeWorkflow):
@@ -68,6 +68,6 @@ class NMRSpectroscopyWorkflow(MoleculeWorkflow):
68
68
  boltzmann_weights: Annotated[list[float], AfterValidator(round_list(3))] = []
69
69
  per_conformer_chemical_shifts: list[Annotated[list[float | None], AfterValidator(round_optional_list(3))]] = []
70
70
  chemical_shifts: Annotated[list[float | None], AfterValidator(round_optional_list(3))] = []
71
- symmetry_equivalent_nuclei: list[set[int]] = []
71
+ symmetry_equivalent_nuclei: list[list[int]] = []
72
72
 
73
73
  predicted_peaks: dict[int, list[NMRPeak]] = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stjames
3
- Version: 0.0.98
3
+ Version: 0.0.101
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
@@ -7,11 +7,11 @@ stjames/calculation.py,sha256=O2LwwQ_cOLmDOGXTHA9J71YbUZXigUSbvbLA-fSVm3w,915
7
7
  stjames/compute_settings.py,sha256=wuYE6W4WqP3oFHwAeEp7XQ0oMz_MNLucWgrsuJ4kEFQ,268
8
8
  stjames/constraint.py,sha256=B6oV0rYjmAWr8gpi5f03gRy_uuqjUURVDVwoez5Cfbg,2442
9
9
  stjames/correction.py,sha256=ZVErCcj4TPyZeKrdvXVjHa0tFynsCaoy96QZUVxWFM8,413
10
- stjames/engine.py,sha256=wVItZQSIeR3ap6EZG3kOw0xCZztZm-6KKFrX84ZyFsE,313
10
+ stjames/engine.py,sha256=4Vt1uF1jNGPj-06F2I73oU5RoH1MlNOlDRSNkWN91NE,315
11
11
  stjames/message.py,sha256=Rq6QqmHZKecWxYH8fVyXmuoCCPZv8YinvgykSeorXSU,216
12
- stjames/method.py,sha256=8Cj0JYGMEaS_Cetfz8Wcu6-BZAv1SejRSagMgkKaXs0,4469
12
+ stjames/method.py,sha256=gZbrHAivm2OXCbF3_6swei1LG6YQ7Uo1EY7aN0x3XHs,4501
13
13
  stjames/mode.py,sha256=xw46Cc7f3eTS8i35qECi-8DocAlANhayK3w4akD4HBU,496
14
- stjames/molecule.py,sha256=l4S6prH1xflnZtbwidSF2THsiHaSJtRiy1rmUbH366Q,20631
14
+ stjames/molecule.py,sha256=4Tsa_gRC4C-qGPop24jRIs2q07r0LGbSRb-ApOaZa5c,20839
15
15
  stjames/opt_settings.py,sha256=LEwGXUEKq5TfU5rr60Z4QQBhCqiw1Ch5w0M_lXawWo8,642
16
16
  stjames/pdb.py,sha256=6ayVUUdTufkXs_nfpRQuT1yGvymuyICB4L5Wh55OsaA,26507
17
17
  stjames/periodic_cell.py,sha256=eV_mArsY_MPEFSrFEsTC-CyCc6V8ITAXdk7yhjjNI7M,1080
@@ -35,23 +35,26 @@ stjames/data/isotopes.json,sha256=5ba8QnLrHD_Ypv2xekv2cIRwYrX3MQ19-1FOFtt0RuU,83
35
35
  stjames/data/nist_isotopes.json,sha256=d5DNk1dX0iB1waEYIRR6JMHuA7AuYwSBEgBvb4EKyhM,14300
36
36
  stjames/data/read_nist_isotopes.py,sha256=y10FNjW43QpC45qib7VHsIghEwT7GG5rsNwHdc9osRI,3309
37
37
  stjames/data/symbol_element.json,sha256=vl_buFusTqBd-muYQtMLtTDLy2OtBI6KkBeqkaWRQrg,1186
38
- stjames/workflows/__init__.py,sha256=wGTCSEvGmLVG-dnkylVsKq7_27n8gQlFfsJiX9RN33w,2890
38
+ stjames/optimization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ stjames/optimization/freezing_string_method.py,sha256=eEQBqbYHgJH9gVRLDIFtGuPcsHHMLAAt1hF3jtq70lo,2285
40
+ stjames/workflows/__init__.py,sha256=-HhT_DJeYCzTO-FeM-wabFyxwLreTE8bXHuaSx3Ylzg,3071
39
41
  stjames/workflows/admet.py,sha256=h8ph6oeRCxU3-_jqRRWPg3RZcheu9JzCHiWqSC9VYKY,1296
40
- stjames/workflows/basic_calculation.py,sha256=ZX3KwhfyyCTjc2ougQIL4If7gtwZP9WjqpL45mBquW0,573
42
+ stjames/workflows/basic_calculation.py,sha256=sAgHBcNHE72ZbZPB9vyZShALRC4zOVw6It6cpJlbX2A,911
41
43
  stjames/workflows/bde.py,sha256=g_In-caftXiimrhfdptHjpfrYQUs3vF58qYmRnaTN8g,10825
42
44
  stjames/workflows/conformer.py,sha256=18aO6ngMBeGAmQkBdLGCCHr398RIYr1v2hD2IT1u4cc,3005
43
45
  stjames/workflows/conformer_search.py,sha256=4yPEKIIedeaVvaAwgjwC1FxiHqM6n2zOF6c9Yk_q1oA,13513
44
46
  stjames/workflows/descriptors.py,sha256=T4tc7xdtBdxESGO86KR323jPQ2pgwxBqgV0khA6MEgQ,584
45
- stjames/workflows/docking.py,sha256=CgpLjMfpPka1fcg0VJPeyJCOnZjnJTrgfNeMAKiX4zM,3897
47
+ stjames/workflows/docking.py,sha256=Lc3xB2H_hu0bxlGQBurDtytZfVwSFCgcTyJFWjMDhKI,3857
48
+ stjames/workflows/double_ended_ts_search.py,sha256=ovJgEVFc6c3mijCE3TKAY70YvqNmAZ5Y4XgV4-tIxBI,3127
46
49
  stjames/workflows/electronic_properties.py,sha256=GT3-NC7w-dbcOJ-3AzJ7LgzH6frTbiH2Iyb9BCa-SvY,4112
47
- stjames/workflows/fukui.py,sha256=T6TDg-lcE-sfTDVpa3KFBenLe7PGUO2QrQ2jNuw_iiU,1756
50
+ stjames/workflows/fukui.py,sha256=095GDGSSEc5PDD1aoKM8J7icgR5tfwS5Bs9XxFQHge4,2387
48
51
  stjames/workflows/hydrogen_bond_basicity.py,sha256=q9eXty68ZyCmrB6G_8bfeOT8Ui_IQquRPu6z-3rNreQ,1589
49
52
  stjames/workflows/ion_mobility.py,sha256=rvvAt4ZD-Npl0tHL7TEuaS3XKjHiMkSZVzyJoivdyps,1665
50
53
  stjames/workflows/irc.py,sha256=ZP7icylW8rgo_Uh7h3bmyumn0ru1IyF-61nP5Jnmq3M,3402
51
54
  stjames/workflows/macropka.py,sha256=KRIyk4gsSYL3eqyzCDndStGLwjWSo60cgCAzvAoD1Nk,3754
52
- stjames/workflows/molecular_dynamics.py,sha256=kxugE73Ntzpj-xpJSoQ1EwGzXXdvi_NTyeP4913EVwE,3173
55
+ stjames/workflows/molecular_dynamics.py,sha256=HqWNxxPSAphfI0DdbTERFkq8UeBjEvhnA_ETv0xw_RY,3522
53
56
  stjames/workflows/multistage_opt.py,sha256=SpbA8hNvktnlLS7C-9mBNGluBSrdVS8ygHl1C4TzWcI,16499
54
- stjames/workflows/nmr.py,sha256=LKIOJHenzPTALv2ov5cImMknZ4JiYjxnpVSctbIRKvA,2708
57
+ stjames/workflows/nmr.py,sha256=Fw7k_ZvIaxpAxkdgW2xMORhaI5s5BY_v7_VEPG1Ylgc,2710
55
58
  stjames/workflows/pka.py,sha256=j3vBh2YM3nJzJ1XJKPsmYahRCeaU9n3P-G-u9_moaFw,2065
56
59
  stjames/workflows/pose_analysis_md.py,sha256=ES0XlzaLpTjhLrNvcB0zFZa1b1ZHXekN72EbLsx0Skw,4723
57
60
  stjames/workflows/protein_cofolding.py,sha256=6WWbVOGzFjIRgQLMmMVODfIxo1jYFmRS1xnJmN0kOBw,3016
@@ -61,8 +64,8 @@ stjames/workflows/solubility.py,sha256=kGfVyPPGDLRpf2j6dSY7woCkfsoXSbUzdSImA4mcM
61
64
  stjames/workflows/spin_states.py,sha256=0degmE-frovgoXweshZyjfjqL7nkbaFoO9YoJhvQnaI,4748
62
65
  stjames/workflows/tautomer.py,sha256=7eYKziGPg8Km6lfowTzSkgJfJ4SHUPrAmnTf8Bi-SB0,1164
63
66
  stjames/workflows/workflow.py,sha256=OE05pt2ZOd8TzTOlBngXCVg9wv_553ZR60VNRPlq0f8,1953
64
- stjames-0.0.98.dist-info/licenses/LICENSE,sha256=i7ehYBS-6gGmbTcgU4mgk28pyOx2kScJ0kcx8n7bWLM,1084
65
- stjames-0.0.98.dist-info/METADATA,sha256=Nc6lMpSB2hbXb3cTv79Z1WDDGfQpUe3O3JLjjFi6UMs,1724
66
- stjames-0.0.98.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
67
- stjames-0.0.98.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
68
- stjames-0.0.98.dist-info/RECORD,,
67
+ stjames-0.0.101.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
68
+ stjames-0.0.101.dist-info/METADATA,sha256=TNvGMRniR9D4VJTlQygqa0ZuEtgVLsqeN9jfkNRLdxQ,1725
69
+ stjames-0.0.101.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
+ stjames-0.0.101.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
71
+ stjames-0.0.101.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) Rowan (https://rowansci.com)
3
+ Copyright (c) Rowan Scientific Corporation
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal