rowan-python 3.2.0__tar.gz → 3.2.2__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 (273) hide show
  1. {rowan_python-3.2.0 → rowan_python-3.2.2}/.envrc +1 -1
  2. {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/build-and-deploy-docs.yml +9 -5
  3. {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/publish-skill.yml +1 -1
  4. {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/python-publish.yml +5 -2
  5. {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/test.yml +7 -10
  6. rowan_python-3.2.2/.gitignore +66 -0
  7. {rowan_python-3.2.0 → rowan_python-3.2.2}/.rumdl.toml +2 -2
  8. {rowan_python-3.2.0 → rowan_python-3.2.2}/PKG-INFO +4 -7
  9. {rowan_python-3.2.0 → rowan_python-3.2.2}/README.md +2 -5
  10. {rowan_python-3.2.0 → rowan_python-3.2.2}/prek.toml +16 -7
  11. {rowan_python-3.2.0 → rowan_python-3.2.2}/pyproject.toml +6 -3
  12. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/__init__.py +1 -0
  13. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/folder.py +1 -4
  14. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/project.py +8 -1
  15. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/protein.py +0 -116
  16. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/binding_affinity.py +14 -5
  17. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_md.py +7 -3
  18. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_preparation.py +1 -1
  19. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/relative_binding_free_energy_perturbation.py +17 -5
  20. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/SKILL.md +1 -1
  21. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/binding_affinity.md +19 -4
  22. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_md.md +2 -1
  23. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_preparation.md +0 -11
  24. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_binding_affinity.py +36 -2
  25. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_md_workflow_updates.py +1 -0
  26. rowan_python-3.2.2/tests/test_project.py +35 -0
  27. rowan_python-3.2.2/tests/test_rbfe_trajectory_download.py +53 -0
  28. {rowan_python-3.2.0 → rowan_python-3.2.2}/uv.lock +8 -8
  29. rowan_python-3.2.0/.gitignore +0 -214
  30. rowan_python-3.2.0/GEMINI.md +0 -3
  31. {rowan_python-3.2.0 → rowan_python-3.2.2}/.claude-plugin/marketplace.json +0 -0
  32. {rowan_python-3.2.0 → rowan_python-3.2.2}/.codex-plugin/plugin.json +0 -0
  33. {rowan_python-3.2.0 → rowan_python-3.2.2}/.editorconfig +0 -0
  34. {rowan_python-3.2.0 → rowan_python-3.2.2}/.python-version +0 -0
  35. {rowan_python-3.2.0 → rowan_python-3.2.2}/LICENSE +0 -0
  36. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/api-keys.md +0 -0
  37. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/calculation.md +0 -0
  38. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/folder.md +0 -0
  39. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/molecule.md +0 -0
  40. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/project.md +0 -0
  41. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/protein.md +0 -0
  42. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/user.md +0 -0
  43. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/webhooks.md +0 -0
  44. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/workflow.md +0 -0
  45. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/images/RowanLogoLarge.png +0 -0
  46. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/images/RowanSquareLogo.png +0 -0
  47. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/images/favicon.svg +0 -0
  48. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/index.md +0 -0
  49. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/stylesheets/colors.css +0 -0
  50. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/admet.md +0 -0
  51. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/analogue-docking.md +0 -0
  52. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/basic-calculation.md +0 -0
  53. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/batch-docking.md +0 -0
  54. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/binding-affinity.md +0 -0
  55. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/bond-dissociation-energy.md +0 -0
  56. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/conformer-search-settings.md +0 -0
  57. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/conformer-search.md +0 -0
  58. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/covalent-inhibitor-scan.md +0 -0
  59. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/descriptors.md +0 -0
  60. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/docking.md +0 -0
  61. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/double-ended-ts-search.md +0 -0
  62. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/electronic-properties.md +0 -0
  63. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/fukui.md +0 -0
  64. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/hydrogen-bond-donor-acceptor-strength.md +0 -0
  65. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/interaction-energy-decomposition.md +0 -0
  66. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/ion-mobility.md +0 -0
  67. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/irc.md +0 -0
  68. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/logp.md +0 -0
  69. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/macropka.md +0 -0
  70. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/membrane-permeability.md +0 -0
  71. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/msa.md +0 -0
  72. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/multistage-optimization.md +0 -0
  73. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/nmr.md +0 -0
  74. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/pka.md +0 -0
  75. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/pocket-detection.md +0 -0
  76. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/pose-analysis-md.md +0 -0
  77. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-binder-design.md +0 -0
  78. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-cofolding.md +0 -0
  79. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-md.md +0 -0
  80. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-preparation.md +0 -0
  81. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/rbfe-graph.md +0 -0
  82. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/redox-potential.md +0 -0
  83. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/relative-binding-free-energy-perturbation.md +0 -0
  84. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/scan.md +0 -0
  85. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/settings.md +0 -0
  86. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/solubility.md +0 -0
  87. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/solvent-dependent-conformers.md +0 -0
  88. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/spin-states.md +0 -0
  89. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/strain.md +0 -0
  90. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/tautomer-search.md +0 -0
  91. {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/types.md +0 -0
  92. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/PROTAC_solubility.py +0 -0
  93. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/admet.py +0 -0
  94. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/analogue_docking.py +0 -0
  95. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/aqueous_solubility.py +0 -0
  96. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation.py +0 -0
  97. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation_from_json.py +0 -0
  98. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation_with_constraint.py +0 -0
  99. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation_with_solvent.py +0 -0
  100. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/batch_docking.py +0 -0
  101. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/batch_solubility.py +0 -0
  102. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/bde.py +0 -0
  103. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/binding_affinity.py +0 -0
  104. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/boltz_paired_msa.py +0 -0
  105. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/boltz_single_msa.py +0 -0
  106. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/chai_paired_msa.py +0 -0
  107. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/chai_single_msa.py +0 -0
  108. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/cofolding_screen.py +0 -0
  109. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/colabfold_paired_msa.py +0 -0
  110. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/colabfold_single_msa.py +0 -0
  111. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/conformer_dependent_redox.py +0 -0
  112. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/conformers.py +0 -0
  113. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/conformers_screen.py +0 -0
  114. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/covalent_docking.py +0 -0
  115. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/covalent_inhibitor_scan.py +0 -0
  116. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/1iep_receptorH.pdb +0 -0
  117. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/Al_FCC.xyz +0 -0
  118. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/citalopram_1iep.xyz +0 -0
  119. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/ibuprofen_conformers.sdf +0 -0
  120. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/tyk2_ligands.sdf +0 -0
  121. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/tyk2_structure.pdb +0 -0
  122. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/workflow_example.json +0 -0
  123. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/dcd_download.py +0 -0
  124. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/descriptors.py +0 -0
  125. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/docking.py +0 -0
  126. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/docking_screen.py +0 -0
  127. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/double_ended_ts_search.py +0 -0
  128. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/electronic_properties.py +0 -0
  129. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/estimate_workflow.py +0 -0
  130. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/fukui_index.py +0 -0
  131. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/hydrogen_bond_basicity.py +0 -0
  132. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/induced_fit_docking.py +0 -0
  133. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/interaction_energy_decomposition.py +0 -0
  134. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/ion_mobility.py +0 -0
  135. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/irc.py +0 -0
  136. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/logp.py +0 -0
  137. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/macropka.py +0 -0
  138. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/membrane_permeability.py +0 -0
  139. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/multistage_optimization.py +0 -0
  140. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/nmr.py +0 -0
  141. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/optimization.py +0 -0
  142. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/periodic_dft.py +0 -0
  143. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/phenol_pka.py +0 -0
  144. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/pka.py +0 -0
  145. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/pocket_detection.py +0 -0
  146. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/pose_analysis_md.py +0 -0
  147. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/project_scoped_api_key.py +0 -0
  148. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_binder_design.py +0 -0
  149. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding.py +0 -0
  150. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding_modified_inputs.py +0 -0
  151. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding_with_constraints.py +0 -0
  152. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding_with_templates.py +0 -0
  153. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_file_download.py +0 -0
  154. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_md.py +0 -0
  155. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_preparation.py +0 -0
  156. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/rbfe_graph.py +0 -0
  157. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/rbfe_resubmit.py +0 -0
  158. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/redox_potential.py +0 -0
  159. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/relative_binding_free_energy_perturbation.py +0 -0
  160. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/resubmit_with_perturbations.py +0 -0
  161. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/retrieve_workflow.py +0 -0
  162. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/scan.py +0 -0
  163. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/solvent_dependent_conformers.py +0 -0
  164. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/spin_states.py +0 -0
  165. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/strain.py +0 -0
  166. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/tautomer.py +0 -0
  167. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/template.py +0 -0
  168. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/temporary_workflow_sharing.py +0 -0
  169. {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/webhook.py +0 -0
  170. {rowan_python-3.2.0 → rowan_python-3.2.2}/mkdocs.yml +0 -0
  171. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/api_keys.py +0 -0
  172. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/calculation.py +0 -0
  173. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/config.py +0 -0
  174. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/constants.py +0 -0
  175. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/molecule.py +0 -0
  176. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/py.typed +0 -0
  177. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/types.py +0 -0
  178. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/user.py +0 -0
  179. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/utils.py +0 -0
  180. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/__init__.py +0 -0
  181. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/_molecular_dynamics.py +0 -0
  182. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/admet.py +0 -0
  183. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/analogue_docking.py +0 -0
  184. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/base.py +0 -0
  185. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/basic_calculation.py +0 -0
  186. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/batch_docking.py +0 -0
  187. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/bde.py +0 -0
  188. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/conformer_search.py +0 -0
  189. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/constants.py +0 -0
  190. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/covalent_inhibitor_scan.py +0 -0
  191. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/descriptors.py +0 -0
  192. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/docking.py +0 -0
  193. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/double_ended_ts_search.py +0 -0
  194. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/electronic_properties.py +0 -0
  195. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/fukui.py +0 -0
  196. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
  197. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/interaction_energy_decomposition.py +0 -0
  198. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/ion_mobility.py +0 -0
  199. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/irc.py +0 -0
  200. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/logp.py +0 -0
  201. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/macropka.py +0 -0
  202. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/membrane_permeability.py +0 -0
  203. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/msa.py +0 -0
  204. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/multistage_optimization.py +0 -0
  205. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/nmr.py +0 -0
  206. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/pka.py +0 -0
  207. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/pocket_detection.py +0 -0
  208. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/pose_analysis_md.py +0 -0
  209. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_binder_design.py +0 -0
  210. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_cofolding.py +0 -0
  211. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/rbfe_graph.py +0 -0
  212. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/redox_potential.py +0 -0
  213. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/scan.py +0 -0
  214. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/solubility.py +0 -0
  215. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/solvent_dependent_conformers.py +0 -0
  216. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/spin_states.py +0 -0
  217. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/strain.py +0 -0
  218. {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/tautomer_search.py +0 -0
  219. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/.claude-plugin/plugin.json +0 -0
  220. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/admet.md +0 -0
  221. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/analogue_docking.md +0 -0
  222. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/basic_calculation.md +0 -0
  223. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/batch_docking.md +0 -0
  224. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/bde.md +0 -0
  225. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/conformer_search.md +0 -0
  226. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/covalent_inhibitor_scan.md +0 -0
  227. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/descriptors.md +0 -0
  228. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/docking.md +0 -0
  229. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/double_ended_ts_search.md +0 -0
  230. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/electronic_properties.md +0 -0
  231. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/folders_and_projects.md +0 -0
  232. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/fukui.md +0 -0
  233. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/hydrogen_bond_donor_acceptor_strength.md +0 -0
  234. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/interaction_energy_decomposition.md +0 -0
  235. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/ion_mobility.md +0 -0
  236. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/irc.md +0 -0
  237. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/logp.md +0 -0
  238. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/macropka.md +0 -0
  239. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/mcp_execution.md +0 -0
  240. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/membrane_permeability.md +0 -0
  241. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/msa.md +0 -0
  242. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/multistage_optimization.md +0 -0
  243. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/nmr.md +0 -0
  244. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/pka.md +0 -0
  245. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/pocket_detection.md +0 -0
  246. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/pose_analysis_md.md +0 -0
  247. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_binder_design.md +0 -0
  248. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_cofolding.md +0 -0
  249. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/python_sdk.md +0 -0
  250. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/rbfe_graph.md +0 -0
  251. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/redox_potential.md +0 -0
  252. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/relative_binding_free_energy_perturbation.md +0 -0
  253. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/scan.md +0 -0
  254. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/solubility.md +0 -0
  255. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/solvent_dependent_conformers.md +0 -0
  256. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/spin_states.md +0 -0
  257. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/strain.md +0 -0
  258. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/tautomer_search.md +0 -0
  259. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/webhooks.md +0 -0
  260. {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/scripts/check_env.py +0 -0
  261. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_cofolding_workflow_updates.py +0 -0
  262. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_conformer_search.py +0 -0
  263. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_docking_workflow.py +0 -0
  264. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_docking_workflow_updates.py +0 -0
  265. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_macropka_nmr.py +0 -0
  266. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_mango_forcefields.py +0 -0
  267. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_plugin.py +0 -0
  268. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_protein.py +0 -0
  269. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_solvent_dependent_conformers.py +0 -0
  270. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_tautomer_search.py +0 -0
  271. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_utils.py +0 -0
  272. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_workflow_results.py +0 -0
  273. {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_workflow_submission.py +0 -0
@@ -2,5 +2,5 @@ watch_file pyproject.toml
2
2
  watch_file uv.lock
3
3
  dotenv_if_exists .env
4
4
 
5
- uv sync --locked
5
+ uv sync --frozen
6
6
  source .venv/bin/activate
@@ -1,8 +1,8 @@
1
1
  name: Build & Deploy Rowan Python Docs
2
2
 
3
3
  on:
4
- release:
5
- types: [published]
4
+ push:
5
+ branches: [master]
6
6
  workflow_dispatch:
7
7
 
8
8
  permissions:
@@ -10,17 +10,18 @@ permissions:
10
10
 
11
11
  jobs:
12
12
  build-and-deploy-docs:
13
+ if: github.repository == 'rowansci/rowan-python' && github.ref == 'refs/heads/master'
13
14
  runs-on: ubuntu-latest
14
15
 
15
16
  steps:
16
17
  - name: Checkout repository
17
- uses: actions/checkout@v6
18
+ uses: actions/checkout@v7.0.1
18
19
  with:
19
20
  fetch-depth: 0
20
21
  ref: master
21
22
 
22
23
  - name: Install uv
23
- uses: astral-sh/setup-uv@v10.1.0
24
+ uses: astral-sh/setup-uv@v10.2.0
24
25
  with:
25
26
  enable-cache: true
26
27
 
@@ -42,4 +43,7 @@ jobs:
42
43
  - name: Deploy with rsync
43
44
  run: |
44
45
  rsync -avz --delete site/ \
45
- ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_IP }}:${{ secrets.DOCS_TARGET_DIR }}
46
+ ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_IP }}:${{ secrets.DOCS_TARGET_DIR }}/site/
47
+
48
+ - name: Verify deployed docs
49
+ run: curl --fail --silent --show-error --location --retry 5 --retry-delay 5 --retry-all-errors https://docs.rowansci.com/api/python/v3/ -o /dev/null
@@ -16,7 +16,7 @@ jobs:
16
16
  if: github.repository == 'rowansci/rowan-python'
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@v4
19
+ - uses: actions/checkout@v7.0.1
20
20
  - name: Zip skill
21
21
  run: cd skills && zip -r ../computational-chemistry-and-biology-skill.zip computational-chemistry-and-biology
22
22
  - name: Publish/refresh release
@@ -18,16 +18,19 @@ jobs:
18
18
  # Enable after configuring the repository environment.
19
19
  # environment:
20
20
  # name: pypi
21
+ # permissions:
22
+ # id-token: write
23
+ # contents: read
21
24
  steps:
22
25
  - name: Skip if running with act
23
26
  if: ${{ env.ACT == 'true' }}
24
27
  run: exit 1
25
28
 
26
29
  - name: Checkout
27
- uses: actions/checkout@v6
30
+ uses: actions/checkout@v7.0.1
28
31
 
29
32
  - name: Install uv
30
- uses: astral-sh/setup-uv@v10.1.0
33
+ uses: astral-sh/setup-uv@v10.2.0
31
34
 
32
35
  - name: Install Python
33
36
  run: uv python install
@@ -23,10 +23,10 @@ jobs:
23
23
  runs-on: ${{ matrix.os }}
24
24
 
25
25
  steps:
26
- - uses: actions/checkout@v6
26
+ - uses: actions/checkout@v7.0.1
27
27
 
28
28
  - name: Install the latest version of uv
29
- uses: astral-sh/setup-uv@v7.6
29
+ uses: astral-sh/setup-uv@v10.2.0
30
30
  with:
31
31
  enable-cache: true
32
32
 
@@ -38,8 +38,11 @@ jobs:
38
38
 
39
39
  - name: Check TOML/YAML/whitespace
40
40
  run: |
41
- uv run prek run --all-files --show-diff-on-failure --color=always \
42
- check-toml check-yaml trailing-whitespace end-of-file-fixer
41
+ uv run -- prek run --all-files --show-diff-on-failure --color=always \
42
+ check-toml \
43
+ check-yaml \
44
+ trailing-whitespace \
45
+ end-of-file-fixer
43
46
 
44
47
  - run: uv run rumdl fmt --check --diff .
45
48
  - run: uv run rumdl check .
@@ -50,9 +53,3 @@ jobs:
50
53
  - run: uv run ty check
51
54
 
52
55
  - run: uv run pytest --cov --cov-report=xml
53
-
54
- # Enable after configuring Codecov and its repository token.
55
- # - name: Upload coverage to Codecov
56
- # uses: codecov/codecov-action@v5
57
- # with:
58
- # token: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,66 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+
7
+ # Packaging
8
+ build/
9
+ dist/
10
+ *.egg-info/
11
+
12
+ # Testing and coverage
13
+ .pytest_cache/
14
+ .ruff_cache/
15
+ .mypy_cache/
16
+ .coverage
17
+ .coverage.*
18
+ coverage.xml
19
+ htmlcov/
20
+
21
+ # uv
22
+ .venv/
23
+
24
+ # rumdl
25
+ .rumdl_cache/
26
+
27
+ # direnv
28
+ .direnv/
29
+
30
+ # Editors
31
+ .idea/
32
+ .vscode/
33
+ *.swp
34
+ *.swo
35
+ *~
36
+
37
+ # OS
38
+ .DS_Store
39
+ Thumbs.db
40
+
41
+ # Environment
42
+ .env
43
+ .env.*
44
+ .app.json
45
+
46
+ # Documentation and notebooks
47
+ /site/
48
+ .ipynb_checkpoints/
49
+
50
+ # Legacy environments
51
+ .pixi/
52
+
53
+ # Scientific application output
54
+ timer.dat
55
+ psi*.clean
56
+ *.CP
57
+ *.CPC
58
+ *.lprof
59
+ pyscf.chk
60
+ local/
61
+ cyp/
62
+ msa_directory/
63
+
64
+ # Local notes and machine-specific agent settings
65
+ notes.md
66
+ /.claude/settings.local.json
@@ -7,6 +7,7 @@ disable = [
7
7
 
8
8
  exclude = [
9
9
  ".git",
10
+ ".venv",
10
11
  "node_modules",
11
12
  "vendor",
12
13
  "dist",
@@ -17,5 +18,4 @@ respect-gitignore = true
17
18
 
18
19
  [per-file-ignores]
19
20
  # Skill files start with frontmatter, not headings
20
- ".claude/**/*.md" = ["MD041"]
21
- ".agents/**/*.md" = ["MD041"]
21
+ "**/skills/**/*.md" = ["MD041"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rowan-python
3
- Version: 3.2.0
3
+ Version: 3.2.2
4
4
  Summary: Rowan Python Library
5
5
  Project-URL: Homepage, https://github.com/rowansci/rowan-client
6
6
  Project-URL: Bug Tracker, https://github.com/rowansci/rowan-client/issues
@@ -12,22 +12,19 @@ Requires-Dist: httpx
12
12
  Requires-Dist: nest-asyncio
13
13
  Requires-Dist: rdkit
14
14
  Requires-Dist: setuptools
15
- Requires-Dist: stjames>=0.0.261
15
+ Requires-Dist: stjames>=0.0.281
16
16
  Description-Content-Type: text/markdown
17
17
 
18
18
  # Rowan Python Library
19
19
 
20
20
  [![pypi](https://img.shields.io/pypi/v/rowan-python.svg)](https://pypi.python.org/pypi/rowan-python)
21
21
  [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://docs.astral.sh/uv/)
22
- [![ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v1.json)](https://github.com/charliermarsh/ruff)
22
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
23
23
  [![Downloads](https://img.shields.io/pypi/dm/rowan-python.svg)](https://pypi.python.org/pypi/rowan-python/)
24
24
  [![License](https://img.shields.io/github/license/rowansci/rowan-python)](LICENSE)
25
25
  [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/rowansci/rowan-python/test.yml?branch=master&logo=github-actions)](https://github.com/rowansci/rowan-python/actions)
26
- [![Typing: ty](https://img.shields.io/badge/typing-ty-EFC621.svg)](https://github.com/astral-sh/ty)
27
- <!-- Enable these badges with the corresponding tooling/services.
26
+ [![ty](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ty/main/assets/badge/v0.json)](https://github.com/astral-sh/ty)
28
27
  [![Markdown style: rumdl](https://img.shields.io/badge/md%20style-rumdl-000000.svg)](https://rumdl.dev)
29
- [![Codecov](https://img.shields.io/codecov/c/github/rowansci/rowan-python)](https://codecov.io/gh/rowansci/rowan-python)
30
- -->
31
28
 
32
29
  The Rowan Python library is the Python SDK for running Rowan computational chemistry workflows
33
30
  programmatically. Use it from scripts and applications to submit calculations, monitor workflow
@@ -2,15 +2,12 @@
2
2
 
3
3
  [![pypi](https://img.shields.io/pypi/v/rowan-python.svg)](https://pypi.python.org/pypi/rowan-python)
4
4
  [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://docs.astral.sh/uv/)
5
- [![ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v1.json)](https://github.com/charliermarsh/ruff)
5
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
6
6
  [![Downloads](https://img.shields.io/pypi/dm/rowan-python.svg)](https://pypi.python.org/pypi/rowan-python/)
7
7
  [![License](https://img.shields.io/github/license/rowansci/rowan-python)](LICENSE)
8
8
  [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/rowansci/rowan-python/test.yml?branch=master&logo=github-actions)](https://github.com/rowansci/rowan-python/actions)
9
- [![Typing: ty](https://img.shields.io/badge/typing-ty-EFC621.svg)](https://github.com/astral-sh/ty)
10
- <!-- Enable these badges with the corresponding tooling/services.
9
+ [![ty](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ty/main/assets/badge/v0.json)](https://github.com/astral-sh/ty)
11
10
  [![Markdown style: rumdl](https://img.shields.io/badge/md%20style-rumdl-000000.svg)](https://rumdl.dev)
12
- [![Codecov](https://img.shields.io/codecov/c/github/rowansci/rowan-python)](https://codecov.io/gh/rowansci/rowan-python)
13
- -->
14
11
 
15
12
  The Rowan Python library is the Python SDK for running Rowan computational chemistry workflows
16
13
  programmatically. Use it from scripts and applications to submit calculations, monitor workflow
@@ -1,4 +1,6 @@
1
+ # schema https://www.schemastore.org/prek.json
1
2
  exclude = '(^\.venv/|^\.pixi/|\.dat$|\.patch$)'
3
+ default_install_hook_types = ["pre-commit", "pre-push"]
2
4
  default_stages = ["pre-commit", "pre-push"]
3
5
 
4
6
  [[repos]]
@@ -6,6 +8,7 @@ repo = "builtin"
6
8
  hooks = [
7
9
  { id = "check-toml" },
8
10
  { id = "check-yaml", args = ["--unsafe"] },
11
+ { id = "check-merge-conflict" },
9
12
  { id = "end-of-file-fixer" },
10
13
  { id = "trailing-whitespace" },
11
14
  ]
@@ -13,6 +16,14 @@ hooks = [
13
16
  [[repos]]
14
17
  repo = "local"
15
18
 
19
+ [[repos.hooks]]
20
+ id = "uv-lock-check"
21
+ name = "uv lock --check"
22
+ language = "system"
23
+ entry = "uv lock --check"
24
+ files = '^(pyproject\.toml|uv\.lock)$'
25
+ pass_filenames = false
26
+
16
27
  [[repos.hooks]]
17
28
  id = "rumdl-fmt"
18
29
  name = "rumdl-fmt"
@@ -29,13 +40,12 @@ entry = "uv run rumdl check . --fix"
29
40
  types = ["markdown"]
30
41
  pass_filenames = false
31
42
 
32
-
33
43
  [[repos.hooks]]
34
44
  id = "ruff-format"
35
45
  name = "ruff-format"
36
46
  language = "system"
37
47
  entry = "uv run ruff format ."
38
- types = ["python"]
48
+ types_or = ["python", "pyi"]
39
49
  pass_filenames = false
40
50
 
41
51
  [[repos.hooks]]
@@ -43,7 +53,7 @@ id = "ruff-check"
43
53
  name = "ruff-check"
44
54
  language = "system"
45
55
  entry = "uv run ruff check . --fix"
46
- types = ["python"]
56
+ types_or = ["python", "pyi"]
47
57
  pass_filenames = false
48
58
 
49
59
  [[repos.hooks]]
@@ -51,15 +61,14 @@ id = "ty"
51
61
  name = "ty"
52
62
  language = "system"
53
63
  entry = "uv run ty check"
54
- types = ["python"]
64
+ types_or = ["python", "pyi"]
55
65
  pass_filenames = false
56
- stages = ["pre-commit"]
57
66
 
58
67
  [[repos.hooks]]
59
68
  id = "pytest"
60
- stages = ["pre-push"]
61
69
  name = "pytest"
62
70
  language = "system"
63
71
  entry = "uv run pytest"
64
- types = ["python"]
72
+ always_run = true
65
73
  pass_filenames = false
74
+ stages = ["pre-push"]
@@ -1,9 +1,10 @@
1
1
  [project]
2
2
  name = "rowan-python"
3
- version = "3.2.0"
3
+ version = "3.2.2"
4
4
  description = "Rowan Python Library"
5
5
  readme = "README.md"
6
6
  license = "MIT"
7
+ license-files = ["LICENSE"]
7
8
  requires-python = ">=3.12"
8
9
  authors = [
9
10
  { name = "Corin Wagen", email = "corin@rowansci.com" },
@@ -11,7 +12,7 @@ authors = [
11
12
  ]
12
13
  dependencies = [
13
14
  "httpx",
14
- "stjames>=0.0.261",
15
+ "stjames>=0.0.281",
15
16
  "setuptools",
16
17
  "rdkit",
17
18
  "nest-asyncio",
@@ -104,6 +105,9 @@ ignore = [
104
105
  [tool.ruff.lint.per-file-ignores]
105
106
  "__init__.py" = ["F401", "F403"]
106
107
 
108
+ [tool.ruff.lint.flake8-type-checking]
109
+ runtime-evaluated-base-classes = ["pydantic.BaseModel"]
110
+
107
111
  [tool.ruff.lint.pydocstyle]
108
112
  convention = "google"
109
113
 
@@ -139,7 +143,6 @@ packages = ["rowan"]
139
143
  [tool.hatch.build.targets.sdist]
140
144
  exclude = [
141
145
  "/AGENTS.md",
142
- "/CLAUDE.md",
143
146
  "/.agents",
144
147
  "/.claude",
145
148
  ]
@@ -67,6 +67,7 @@ from stjames.engine_compatibility import (
67
67
  METHOD_ENGINES,
68
68
  get_supported_corrections,
69
69
  )
70
+ from stjames.pdb import ResidueRef
70
71
  from stjames.optimization.band_method import NEBSettings
71
72
  from stjames.optimization.interpolation import Interpolation
72
73
  from stjames.optimization.string_method import FSMSettings, StringMethodSettings
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from datetime import datetime
3
4
  from typing import TYPE_CHECKING, Any, Self
4
5
 
5
6
  from pydantic import BaseModel
@@ -8,8 +9,6 @@ from .project import default_project, retrieve_project
8
9
  from .utils import api_client, get_project_uuid
9
10
 
10
11
  if TYPE_CHECKING:
11
- from datetime import datetime
12
-
13
12
  from .workflows.base import Workflow
14
13
 
15
14
 
@@ -65,8 +64,6 @@ class Folder(BaseModel):
65
64
  for field_name in self.__class__.model_fields:
66
65
  setattr(self, field_name, getattr(updated_folder, field_name))
67
66
 
68
- self.model_rebuild()
69
-
70
67
  return self
71
68
 
72
69
  def update(
@@ -197,8 +197,15 @@ def default_project() -> Project:
197
197
 
198
198
  Raises:
199
199
  httpx.HTTPStatusError: API request fails
200
+ ValueError: user has no default project in the API key's organization
200
201
  """
201
202
  with api_client() as client:
202
203
  response = client.get("/user/me/default_project")
203
204
  response.raise_for_status()
204
- return Project(**response.json())
205
+ project = response.json()
206
+ if project is None:
207
+ raise ValueError(
208
+ "You have no default project in this organization. "
209
+ "Set a default project, or pass a folder or project."
210
+ )
211
+ return Project(**project)
@@ -1,4 +1,3 @@
1
- import time
2
1
  import warnings
3
2
  from datetime import datetime
4
3
  from pathlib import Path
@@ -22,7 +21,6 @@ class Protein(BaseModel):
22
21
  created_at: creation date of the protein
23
22
  used_in_workflow: whether the protein is used in a workflow
24
23
  ancestor_uuid: UUID of the ancestor protein
25
- sanitized: whether the protein is sanitized
26
24
  name: name of the protein
27
25
  data: data of the protein
28
26
  public: whether the protein is public
@@ -32,7 +30,6 @@ class Protein(BaseModel):
32
30
  created_at: datetime | None = None
33
31
  used_in_workflow: bool | None = None
34
32
  ancestor_uuid: str | None = None
35
- sanitized: int | None = None
36
33
  name: str | None = None
37
34
  data: dict | None = None
38
35
  public: bool | None = None
@@ -188,7 +185,6 @@ class Protein(BaseModel):
188
185
  self.data = protein_data.get("data")
189
186
  self.public = protein_data.get("public")
190
187
  self.pocket = protein_data.get("pocket")
191
- self.sanitized = protein_data.get("sanitized")
192
188
  self.used_in_workflow = protein_data.get("used_in_workflow")
193
189
  self._workflow_uuid = workflow_uuid
194
190
  return self
@@ -241,118 +237,6 @@ class Protein(BaseModel):
241
237
  response = client.delete(f"/protein/{self.uuid}")
242
238
  response.raise_for_status()
243
239
 
244
- def sanitize(self, poll_interval: float = 10.0, timeout: float = 300.0) -> None:
245
- """Sanitizes a protein and waits for the process to complete.
246
-
247
- Protein sanitization runs asynchronously on the server. This method
248
- submits the request then polls until sanitization succeeds, fails, or
249
- times out.
250
-
251
- Args:
252
- poll_interval: seconds between status checks (default 10)
253
- timeout: maximum seconds to wait before raising (default 300)
254
-
255
- Raises:
256
- RuntimeError: sanitization fails, is stopped, or times out
257
- httpx.HTTPStatusError: any API request fails
258
- """
259
- with api_client() as client:
260
- response = client.post(f"/protein/sanitize/{self.uuid}")
261
- response.raise_for_status()
262
-
263
- deadline = time.monotonic() + timeout
264
- while time.monotonic() < deadline:
265
- time.sleep(poll_interval)
266
- self.refresh()
267
- match self.sanitized:
268
- case 2: # success
269
- return
270
- case 3: # failed
271
- raise RuntimeError(
272
- f"Protein sanitization failed for {self.uuid}. "
273
- "Check the protein in the Rowan UI for details."
274
- )
275
- case 4: # stopped
276
- raise RuntimeError(f"Protein sanitization was stopped for {self.uuid}.")
277
- case _: # 1 (in progress) or None: keep polling
278
- pass
279
-
280
- raise RuntimeError(f"Protein sanitization timed out after {timeout:.0f}s for {self.uuid}.")
281
-
282
- def prepare(
283
- self,
284
- find_missing_residues: bool = True,
285
- add_missing_atoms: bool = True,
286
- remove_heterogens: bool = True,
287
- keep_waters: bool = False,
288
- remove_hydrogens: bool = False,
289
- remove_invalid_hydrogens: bool = False,
290
- add_hydrogens: bool = True,
291
- add_hydrogen_ph: float = 7.0,
292
- optimize_hydrogens: bool = True,
293
- poll_interval: float = 10.0,
294
- timeout: float = 300.0,
295
- ) -> None:
296
- """Quickly prepare a protein in place using PDBFixer and OpenMM.
297
-
298
- Runs PDBFixer to fix nonstandard residues, add missing atoms/hydrogens,
299
- and optionally optimizes hydrogen positions with OpenMM. This is the fast
300
- preparation option and typically finishes in about a minute or less. Use
301
- `submit_protein_preparation_workflow` for the full protein preparation workflow,
302
- which can take around ten minutes but includes Boltz-2 missing-structure modeling,
303
- terminal capping, selectable protonation methods, and retained non-polymers.
304
-
305
- Args:
306
- find_missing_residues: identify and model missing residues
307
- add_missing_atoms: add missing heavy atoms to residues
308
- remove_heterogens: remove ligands, salts, and other heterogens
309
- keep_waters: preserve water molecules when removing heterogens
310
- remove_hydrogens: remove all existing hydrogens before adding new ones
311
- remove_invalid_hydrogens: remove hydrogens not matching the forcefield template
312
- add_hydrogens: add missing hydrogen atoms
313
- add_hydrogen_ph: pH used to determine protonation states when adding hydrogens
314
- optimize_hydrogens: optimize hydrogen positions with OpenMM energy minimization
315
- poll_interval: seconds between status checks (default 10)
316
- timeout: maximum seconds to wait before raising (default 300)
317
-
318
- Raises:
319
- RuntimeError: preparation fails, is stopped, or times out
320
- httpx.HTTPStatusError: any API request fails
321
- """
322
- params = {
323
- "find_missing_residues": find_missing_residues,
324
- "add_missing_atoms": add_missing_atoms,
325
- "remove_heterogens": remove_heterogens,
326
- "keep_waters": keep_waters,
327
- "remove_hydrogens": remove_hydrogens,
328
- "remove_invalid_hydrogens": remove_invalid_hydrogens,
329
- "add_hydrogens": add_hydrogens,
330
- "add_hydrogen_ph": add_hydrogen_ph,
331
- "optimize_hydrogens": optimize_hydrogens,
332
- }
333
- with api_client() as client:
334
- response = client.post(f"/protein/prepare/{self.uuid}", params=params)
335
- response.raise_for_status()
336
-
337
- deadline = time.monotonic() + timeout
338
- while time.monotonic() < deadline:
339
- time.sleep(poll_interval)
340
- self.refresh()
341
- match self.sanitized:
342
- case 2:
343
- return
344
- case 3:
345
- raise RuntimeError(
346
- f"Protein preparation failed for {self.uuid}. "
347
- "Check the protein in the Rowan UI for details."
348
- )
349
- case 4:
350
- raise RuntimeError(f"Protein preparation was stopped for {self.uuid}.")
351
- case _:
352
- pass
353
-
354
- raise RuntimeError(f"Protein preparation timed out after {timeout:.0f}s for {self.uuid}.")
355
-
356
240
  def validate_protein_forcefield(self, exclude_residues: list[str | int] | None = None) -> None:
357
241
  """Validate that this protein can be parameterized with the MD forcefield.
358
242
 
@@ -82,7 +82,8 @@ def submit_binding_affinity_workflow(
82
82
  input modes are supported:
83
83
 
84
84
  **Mode 1 – holo protein:** protein already contains the bound ligand. Pass
85
- `ligand_residue_name` to identify which residue is the ligand vs. the receptor.
85
+ `ligand_residue_name` to identify which residue is the ligand vs. the receptor,
86
+ and exactly one entry in `ligand_smiles` describing that bound ligand.
86
87
  Do not pass `ligand_structures`.
87
88
 
88
89
  **Mode 2 – apo protein + external poses:** protein has no bound ligand. Pass
@@ -101,13 +102,15 @@ def submit_binding_affinity_workflow(
101
102
  protein: protein structure. Can be input as a UUID or a Protein object. Required
102
103
  unless `protein_sequences` is set (mode 3)
103
104
  ligand_residue_name: residue name identifying the ligand in a holo protein PDB
104
- (mode 1 only)
105
+ (mode 1 only); requires exactly one matching `ligand_smiles` entry
105
106
  ligand_structures: external ligand poses to score, already in the protein's
106
107
  coordinate frame. Must have 3D coordinates (mode 2 only)
107
108
  protein_sequences: protein sequences to score against, in place of `protein`
108
109
  (mode 3, NESSO only)
109
- ligand_smiles: ligand SMILES to score, in place of `ligand_residue_name`/
110
- `ligand_structures` (mode 3, NESSO only)
110
+ ligand_smiles: exactly one SMILES describing the bound ligand with
111
+ `ligand_residue_name` (mode 1, all methods), or ligand SMILES to score without
112
+ structural ligand inputs (mode 3, NESSO only). Not accepted with
113
+ `ligand_structures`
111
114
  binding_affinity_settings: settings controlling how binding affinity is
112
115
  computed: `SinglePointEnergySettings` (SQM), `GninaAffinitySettings`,
113
116
  `AEVPLIGAffinitySettings`, or `NessoAffinitySettings`. Defaults to
@@ -150,9 +153,15 @@ def submit_binding_affinity_workflow(
150
153
  binding_affinity_settings=binding_affinity_settings or SinglePointEnergySettings(),
151
154
  )
152
155
 
156
+ workflow_data = workflow.model_dump(serialize_as_any=True, mode="json")
157
+ if isinstance(workflow.binding_affinity_settings, SinglePointEnergySettings):
158
+ workflow_data["binding_affinity_settings"]["truncation_radius"] = (
159
+ workflow.binding_affinity_settings.truncation_radius
160
+ )
161
+
153
162
  data = {
154
163
  "workflow_type": "binding_affinity",
155
- "workflow_data": workflow.model_dump(serialize_as_any=True, mode="json"),
164
+ "workflow_data": workflow_data,
156
165
  "name": name,
157
166
  "folder_uuid": folder_uuid,
158
167
  "max_credits": max_credits,
@@ -142,13 +142,14 @@ def submit_protein_md_workflow(
142
142
  nonbonded_cutoff: float = 8.0,
143
143
  ionic_strength_M: float = 0.0,
144
144
  water_buffer: float = 8.0,
145
+ frame_save_interval_ps: float = 10.0,
145
146
  save_solvent: bool = False,
146
147
  num_solvent_to_save: int | None = None,
147
148
  small_molecules: dict[str | int, str | None] | None = None,
148
149
  binder: Binder | None = None,
149
150
  protein_restraint_cutoff: float | None = None,
150
151
  protein_restraint_constant: float = 100,
151
- analysis_interval_ps: float | None = None,
152
+ analysis_interval_ps: float | None = 100,
152
153
  clustering: KMeansClusteringSettings | GreedyClusteringSettings | None = None,
153
154
  validate_forcefield: bool = True,
154
155
  name: str = "Protein MD Workflow",
@@ -178,6 +179,8 @@ def submit_protein_md_workflow(
178
179
  nonbonded_cutoff: nonbonded cutoff for particle-mesh Ewald, in A
179
180
  ionic_strength_M: ionic strength of the solution, in M (molar)
180
181
  water_buffer: amount of water to add around the protein, in A
182
+ frame_save_interval_ps: how often to save a frame to the trajectory, in ps; must be
183
+ an integer multiple of timestep_fs
181
184
  save_solvent: whether solvent should be saved
182
185
  num_solvent_to_save: keep this many solvent molecules nearest the binder, or all if None;
183
186
  only meaningful when save_solvent is True and a binder is present
@@ -191,8 +194,8 @@ def submit_protein_md_workflow(
191
194
  protein_restraint_cutoff: cutoff distance from the binder past which Cα atoms are
192
195
  harmonically restrained, in Å; None disables restraints
193
196
  protein_restraint_constant: force constant for Cα backbone restraints, in kcal/mol/Ų
194
- analysis_interval_ps: interval at which to compute per-frame SASA and polar SASA, in ps.
195
- None disables those analyses
197
+ analysis_interval_ps: interval at which to compute per-frame SASA and polar SASA
198
+ (default 100), in ps. None disables those analyses
196
199
  clustering: how to cluster trajectory frames. None disables clustering; pass a
197
200
  KMeansClusteringSettings (num_clusters) or GreedyClusteringSettings (cutoff_angstrom)
198
201
  validate_forcefield: validate the protein forcefield
@@ -246,6 +249,7 @@ def submit_protein_md_workflow(
246
249
  nonbonded_cutoff=nonbonded_cutoff,
247
250
  ionic_strength_M=ionic_strength_M,
248
251
  water_buffer=water_buffer,
252
+ frame_save_interval_ps=frame_save_interval_ps,
249
253
  save_solvent=save_solvent,
250
254
  num_solvent_to_save=num_solvent_to_save,
251
255
  small_molecules=small_molecules,
@@ -75,7 +75,7 @@ def submit_protein_preparation_workflow(
75
75
  """Submit a protein-preparation workflow to the API.
76
76
 
77
77
  Full protein preparation can take around ten minutes, depending on the structure and
78
- settings. For a faster PDBFixer/OpenMM-only path, use `Protein.prepare()`.
78
+ settings.
79
79
 
80
80
  Args:
81
81
  protein: protein to prepare, as a UUID or Protein object