rowan-python 3.2.0__tar.gz → 3.2.1__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 (272) hide show
  1. {rowan_python-3.2.0 → rowan_python-3.2.1}/.envrc +1 -1
  2. {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/build-and-deploy-docs.yml +9 -5
  3. {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/publish-skill.yml +1 -1
  4. {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/python-publish.yml +5 -2
  5. {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/test.yml +7 -10
  6. rowan_python-3.2.1/.gitignore +66 -0
  7. {rowan_python-3.2.0 → rowan_python-3.2.1}/.rumdl.toml +2 -2
  8. {rowan_python-3.2.0 → rowan_python-3.2.1}/PKG-INFO +4 -7
  9. {rowan_python-3.2.0 → rowan_python-3.2.1}/README.md +2 -5
  10. {rowan_python-3.2.0 → rowan_python-3.2.1}/prek.toml +16 -7
  11. {rowan_python-3.2.0 → rowan_python-3.2.1}/pyproject.toml +6 -3
  12. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/folder.py +1 -4
  13. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/protein.py +0 -116
  14. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/binding_affinity.py +7 -4
  15. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_md.py +4 -0
  16. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_preparation.py +1 -1
  17. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/relative_binding_free_energy_perturbation.py +17 -5
  18. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/SKILL.md +1 -1
  19. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/binding_affinity.md +8 -3
  20. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_md.md +1 -0
  21. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_preparation.md +0 -11
  22. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_binding_affinity.py +3 -2
  23. rowan_python-3.2.1/tests/test_rbfe_trajectory_download.py +53 -0
  24. {rowan_python-3.2.0 → rowan_python-3.2.1}/uv.lock +8 -8
  25. rowan_python-3.2.0/.gitignore +0 -214
  26. rowan_python-3.2.0/GEMINI.md +0 -3
  27. {rowan_python-3.2.0 → rowan_python-3.2.1}/.claude-plugin/marketplace.json +0 -0
  28. {rowan_python-3.2.0 → rowan_python-3.2.1}/.codex-plugin/plugin.json +0 -0
  29. {rowan_python-3.2.0 → rowan_python-3.2.1}/.editorconfig +0 -0
  30. {rowan_python-3.2.0 → rowan_python-3.2.1}/.python-version +0 -0
  31. {rowan_python-3.2.0 → rowan_python-3.2.1}/LICENSE +0 -0
  32. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/api-keys.md +0 -0
  33. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/calculation.md +0 -0
  34. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/folder.md +0 -0
  35. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/molecule.md +0 -0
  36. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/project.md +0 -0
  37. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/protein.md +0 -0
  38. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/user.md +0 -0
  39. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/webhooks.md +0 -0
  40. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/workflow.md +0 -0
  41. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/images/RowanLogoLarge.png +0 -0
  42. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/images/RowanSquareLogo.png +0 -0
  43. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/images/favicon.svg +0 -0
  44. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/index.md +0 -0
  45. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/stylesheets/colors.css +0 -0
  46. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/admet.md +0 -0
  47. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/analogue-docking.md +0 -0
  48. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/basic-calculation.md +0 -0
  49. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/batch-docking.md +0 -0
  50. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/binding-affinity.md +0 -0
  51. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/bond-dissociation-energy.md +0 -0
  52. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/conformer-search-settings.md +0 -0
  53. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/conformer-search.md +0 -0
  54. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/covalent-inhibitor-scan.md +0 -0
  55. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/descriptors.md +0 -0
  56. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/docking.md +0 -0
  57. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/double-ended-ts-search.md +0 -0
  58. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/electronic-properties.md +0 -0
  59. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/fukui.md +0 -0
  60. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/hydrogen-bond-donor-acceptor-strength.md +0 -0
  61. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/interaction-energy-decomposition.md +0 -0
  62. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/ion-mobility.md +0 -0
  63. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/irc.md +0 -0
  64. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/logp.md +0 -0
  65. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/macropka.md +0 -0
  66. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/membrane-permeability.md +0 -0
  67. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/msa.md +0 -0
  68. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/multistage-optimization.md +0 -0
  69. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/nmr.md +0 -0
  70. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/pka.md +0 -0
  71. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/pocket-detection.md +0 -0
  72. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/pose-analysis-md.md +0 -0
  73. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-binder-design.md +0 -0
  74. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-cofolding.md +0 -0
  75. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-md.md +0 -0
  76. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-preparation.md +0 -0
  77. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/rbfe-graph.md +0 -0
  78. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/redox-potential.md +0 -0
  79. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/relative-binding-free-energy-perturbation.md +0 -0
  80. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/scan.md +0 -0
  81. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/settings.md +0 -0
  82. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/solubility.md +0 -0
  83. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/solvent-dependent-conformers.md +0 -0
  84. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/spin-states.md +0 -0
  85. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/strain.md +0 -0
  86. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/tautomer-search.md +0 -0
  87. {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/types.md +0 -0
  88. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/PROTAC_solubility.py +0 -0
  89. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/admet.py +0 -0
  90. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/analogue_docking.py +0 -0
  91. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/aqueous_solubility.py +0 -0
  92. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation.py +0 -0
  93. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation_from_json.py +0 -0
  94. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation_with_constraint.py +0 -0
  95. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation_with_solvent.py +0 -0
  96. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/batch_docking.py +0 -0
  97. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/batch_solubility.py +0 -0
  98. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/bde.py +0 -0
  99. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/binding_affinity.py +0 -0
  100. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/boltz_paired_msa.py +0 -0
  101. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/boltz_single_msa.py +0 -0
  102. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/chai_paired_msa.py +0 -0
  103. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/chai_single_msa.py +0 -0
  104. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/cofolding_screen.py +0 -0
  105. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/colabfold_paired_msa.py +0 -0
  106. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/colabfold_single_msa.py +0 -0
  107. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/conformer_dependent_redox.py +0 -0
  108. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/conformers.py +0 -0
  109. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/conformers_screen.py +0 -0
  110. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/covalent_docking.py +0 -0
  111. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/covalent_inhibitor_scan.py +0 -0
  112. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/1iep_receptorH.pdb +0 -0
  113. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/Al_FCC.xyz +0 -0
  114. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/citalopram_1iep.xyz +0 -0
  115. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/ibuprofen_conformers.sdf +0 -0
  116. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/tyk2_ligands.sdf +0 -0
  117. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/tyk2_structure.pdb +0 -0
  118. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/workflow_example.json +0 -0
  119. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/dcd_download.py +0 -0
  120. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/descriptors.py +0 -0
  121. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/docking.py +0 -0
  122. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/docking_screen.py +0 -0
  123. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/double_ended_ts_search.py +0 -0
  124. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/electronic_properties.py +0 -0
  125. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/estimate_workflow.py +0 -0
  126. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/fukui_index.py +0 -0
  127. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/hydrogen_bond_basicity.py +0 -0
  128. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/induced_fit_docking.py +0 -0
  129. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/interaction_energy_decomposition.py +0 -0
  130. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/ion_mobility.py +0 -0
  131. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/irc.py +0 -0
  132. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/logp.py +0 -0
  133. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/macropka.py +0 -0
  134. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/membrane_permeability.py +0 -0
  135. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/multistage_optimization.py +0 -0
  136. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/nmr.py +0 -0
  137. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/optimization.py +0 -0
  138. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/periodic_dft.py +0 -0
  139. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/phenol_pka.py +0 -0
  140. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/pka.py +0 -0
  141. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/pocket_detection.py +0 -0
  142. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/pose_analysis_md.py +0 -0
  143. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/project_scoped_api_key.py +0 -0
  144. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_binder_design.py +0 -0
  145. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding.py +0 -0
  146. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding_modified_inputs.py +0 -0
  147. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding_with_constraints.py +0 -0
  148. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding_with_templates.py +0 -0
  149. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_file_download.py +0 -0
  150. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_md.py +0 -0
  151. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_preparation.py +0 -0
  152. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/rbfe_graph.py +0 -0
  153. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/rbfe_resubmit.py +0 -0
  154. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/redox_potential.py +0 -0
  155. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/relative_binding_free_energy_perturbation.py +0 -0
  156. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/resubmit_with_perturbations.py +0 -0
  157. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/retrieve_workflow.py +0 -0
  158. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/scan.py +0 -0
  159. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/solvent_dependent_conformers.py +0 -0
  160. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/spin_states.py +0 -0
  161. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/strain.py +0 -0
  162. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/tautomer.py +0 -0
  163. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/template.py +0 -0
  164. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/temporary_workflow_sharing.py +0 -0
  165. {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/webhook.py +0 -0
  166. {rowan_python-3.2.0 → rowan_python-3.2.1}/mkdocs.yml +0 -0
  167. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/__init__.py +0 -0
  168. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/api_keys.py +0 -0
  169. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/calculation.py +0 -0
  170. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/config.py +0 -0
  171. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/constants.py +0 -0
  172. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/molecule.py +0 -0
  173. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/project.py +0 -0
  174. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/py.typed +0 -0
  175. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/types.py +0 -0
  176. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/user.py +0 -0
  177. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/utils.py +0 -0
  178. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/__init__.py +0 -0
  179. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/_molecular_dynamics.py +0 -0
  180. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/admet.py +0 -0
  181. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/analogue_docking.py +0 -0
  182. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/base.py +0 -0
  183. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/basic_calculation.py +0 -0
  184. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/batch_docking.py +0 -0
  185. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/bde.py +0 -0
  186. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/conformer_search.py +0 -0
  187. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/constants.py +0 -0
  188. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/covalent_inhibitor_scan.py +0 -0
  189. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/descriptors.py +0 -0
  190. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/docking.py +0 -0
  191. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/double_ended_ts_search.py +0 -0
  192. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/electronic_properties.py +0 -0
  193. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/fukui.py +0 -0
  194. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
  195. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/interaction_energy_decomposition.py +0 -0
  196. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/ion_mobility.py +0 -0
  197. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/irc.py +0 -0
  198. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/logp.py +0 -0
  199. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/macropka.py +0 -0
  200. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/membrane_permeability.py +0 -0
  201. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/msa.py +0 -0
  202. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/multistage_optimization.py +0 -0
  203. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/nmr.py +0 -0
  204. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/pka.py +0 -0
  205. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/pocket_detection.py +0 -0
  206. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/pose_analysis_md.py +0 -0
  207. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_binder_design.py +0 -0
  208. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_cofolding.py +0 -0
  209. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/rbfe_graph.py +0 -0
  210. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/redox_potential.py +0 -0
  211. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/scan.py +0 -0
  212. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/solubility.py +0 -0
  213. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/solvent_dependent_conformers.py +0 -0
  214. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/spin_states.py +0 -0
  215. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/strain.py +0 -0
  216. {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/tautomer_search.py +0 -0
  217. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/.claude-plugin/plugin.json +0 -0
  218. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/admet.md +0 -0
  219. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/analogue_docking.md +0 -0
  220. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/basic_calculation.md +0 -0
  221. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/batch_docking.md +0 -0
  222. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/bde.md +0 -0
  223. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/conformer_search.md +0 -0
  224. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/covalent_inhibitor_scan.md +0 -0
  225. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/descriptors.md +0 -0
  226. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/docking.md +0 -0
  227. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/double_ended_ts_search.md +0 -0
  228. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/electronic_properties.md +0 -0
  229. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/folders_and_projects.md +0 -0
  230. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/fukui.md +0 -0
  231. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/hydrogen_bond_donor_acceptor_strength.md +0 -0
  232. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/interaction_energy_decomposition.md +0 -0
  233. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/ion_mobility.md +0 -0
  234. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/irc.md +0 -0
  235. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/logp.md +0 -0
  236. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/macropka.md +0 -0
  237. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/mcp_execution.md +0 -0
  238. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/membrane_permeability.md +0 -0
  239. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/msa.md +0 -0
  240. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/multistage_optimization.md +0 -0
  241. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/nmr.md +0 -0
  242. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/pka.md +0 -0
  243. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/pocket_detection.md +0 -0
  244. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/pose_analysis_md.md +0 -0
  245. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_binder_design.md +0 -0
  246. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_cofolding.md +0 -0
  247. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/python_sdk.md +0 -0
  248. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/rbfe_graph.md +0 -0
  249. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/redox_potential.md +0 -0
  250. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/relative_binding_free_energy_perturbation.md +0 -0
  251. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/scan.md +0 -0
  252. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/solubility.md +0 -0
  253. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/solvent_dependent_conformers.md +0 -0
  254. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/spin_states.md +0 -0
  255. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/strain.md +0 -0
  256. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/tautomer_search.md +0 -0
  257. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/webhooks.md +0 -0
  258. {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/scripts/check_env.py +0 -0
  259. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_cofolding_workflow_updates.py +0 -0
  260. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_conformer_search.py +0 -0
  261. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_docking_workflow.py +0 -0
  262. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_docking_workflow_updates.py +0 -0
  263. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_macropka_nmr.py +0 -0
  264. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_mango_forcefields.py +0 -0
  265. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_md_workflow_updates.py +0 -0
  266. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_plugin.py +0 -0
  267. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_protein.py +0 -0
  268. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_solvent_dependent_conformers.py +0 -0
  269. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_tautomer_search.py +0 -0
  270. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_utils.py +0 -0
  271. {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_workflow_results.py +0 -0
  272. {rowan_python-3.2.0 → rowan_python-3.2.1}/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.1
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.275
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.1"
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.275",
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
  ]
@@ -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(
@@ -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
@@ -142,6 +142,7 @@ 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,
@@ -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
@@ -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
@@ -140,6 +140,8 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
140
140
  lambda_vals: list[float] | None = None,
141
141
  path: Path | str | None = None,
142
142
  name: str | None = None,
143
+ *,
144
+ leg: Literal["complex", "solvent"] = "complex",
143
145
  ) -> Path:
144
146
  """Download DCD trajectory files for a specific perturbation edge.
145
147
 
@@ -148,6 +150,7 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
148
150
  lambda_vals: lambda values to download. Defaults to all windows
149
151
  path: directory to save the file to. Defaults to current directory
150
152
  name: custom name for the tar.gz file (without extension)
153
+ leg: thermodynamic leg whose trajectories should be downloaded
151
154
 
152
155
  Returns:
153
156
  path to the downloaded tar.gz file
@@ -163,27 +166,34 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
163
166
  path = Path(path) if path is not None else Path.cwd()
164
167
  path.mkdir(parents=True, exist_ok=True)
165
168
 
166
- params: dict = {"edge_index": edge_index}
167
- if lambda_vals is not None:
168
- params["lambda_vals"] = lambda_vals
169
+ params: dict = {"edge_index": edge_index, "leg": leg}
169
170
 
170
- file_name = f"{name or f'edge_{edge_index}_trajectories'}.tar.gz"
171
+ default_name = (
172
+ f"edge_{edge_index}_trajectories"
173
+ if leg == "complex"
174
+ else f"edge_{edge_index}_{leg}_trajectories"
175
+ )
176
+ file_name = f"{name or default_name}.tar.gz"
171
177
  file_path = path / file_name
172
178
  return download_file(
173
179
  file_path,
174
180
  "POST",
175
181
  f"/trajectory/{self.workflow_uuid}/rbfe_trajectory_dcds",
176
182
  params=params,
183
+ json=lambda_vals,
177
184
  )
178
185
 
179
186
  def download_all_trajectories(
180
187
  self,
181
188
  path: Path | str | None = None,
189
+ *,
190
+ leg: Literal["complex", "solvent"] = "complex",
182
191
  ) -> list[Path]:
183
192
  """Download DCD trajectory files for all perturbation edges.
184
193
 
185
194
  Args:
186
195
  path: directory to save the files to. Defaults to current directory
196
+ leg: thermodynamic leg whose trajectories should be downloaded
187
197
 
188
198
  Returns:
189
199
  list of paths to the downloaded tar.gz files, one per edge
@@ -191,7 +201,9 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
191
201
  Raises:
192
202
  httpx.HTTPStatusError: any API request fails
193
203
  """
194
- return [self.download_edge_trajectories(i, path=path) for i in range(len(self.edges))]
204
+ return [
205
+ self.download_edge_trajectories(i, path=path, leg=leg) for i in range(len(self.edges))
206
+ ]
195
207
 
196
208
  @property
197
209
  def ligand_dg_results(self) -> dict[str, RelativeBindingFreeEnergyResult] | None: