rowan-python 3.1.8__tar.gz → 3.1.10__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 (195) hide show
  1. {rowan_python-3.1.8 → rowan_python-3.1.10}/PKG-INFO +2 -2
  2. {rowan_python-3.1.8 → rowan_python-3.1.10}/docs/index.md +11 -0
  3. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/covalent_inhibitor_scan.py +3 -0
  4. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/docking.py +1 -1
  5. rowan_python-3.1.10/examples/logp.py +19 -0
  6. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/protein_md.py +1 -1
  7. {rowan_python-3.1.8 → rowan_python-3.1.10}/pixi.lock +46 -46
  8. {rowan_python-3.1.8 → rowan_python-3.1.10}/pyproject.toml +3 -2
  9. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/__init__.py +2 -0
  10. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/protein.py +62 -20
  11. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/__init__.py +1 -0
  12. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/analogue_docking.py +1 -1
  13. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/base.py +2 -2
  14. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/docking.py +1 -1
  15. rowan_python-3.1.10/rowan/workflows/logp.py +80 -0
  16. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/nmr.py +40 -2
  17. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/pose_analysis_md.py +4 -2
  18. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/protein_cofolding.py +6 -2
  19. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/protein_md.py +30 -4
  20. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/relative_binding_free_energy_perturbation.py +3 -1
  21. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/SKILL.md +2 -1
  22. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/admet.md +1 -1
  23. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/analogue_docking.md +2 -2
  24. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/basic_calculation.md +2 -2
  25. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/batch_docking.md +3 -3
  26. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/bde.md +3 -3
  27. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/conformer_search.md +3 -3
  28. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/covalent_inhibitor_scan.md +2 -0
  29. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/descriptors.md +3 -3
  30. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/docking.md +2 -2
  31. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/double_ended_ts_search.md +5 -3
  32. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/electronic_properties.md +1 -1
  33. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/folders_and_projects.md +15 -15
  34. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/fukui.md +1 -1
  35. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/hydrogen_bond_donor_acceptor_strength.md +1 -1
  36. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/interaction_energy_decomposition.md +3 -1
  37. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/ion_mobility.md +2 -2
  38. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/irc.md +2 -2
  39. rowan_python-3.1.10/skills/computational-chemistry-and-biology/reference/logp.md +37 -0
  40. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/macropka.md +1 -1
  41. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/mcp_execution.md +3 -3
  42. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/membrane_permeability.md +2 -2
  43. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/msa.md +2 -2
  44. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/multistage_optimization.md +1 -1
  45. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/nmr.md +3 -5
  46. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/pka.md +2 -2
  47. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/pocket_detection.md +3 -3
  48. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/pose_analysis_md.md +3 -3
  49. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/protein_binder_design.md +6 -3
  50. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/protein_cofolding.md +9 -7
  51. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/protein_md.md +12 -8
  52. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/protein_prep.md +16 -12
  53. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/python_sdk.md +4 -0
  54. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/rbfe_graph.md +2 -2
  55. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/redox_potential.md +1 -1
  56. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/relative_binding_free_energy_perturbation.md +2 -2
  57. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/scan.md +6 -4
  58. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/solubility.md +4 -2
  59. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/solvent_dependent_conformers.md +1 -1
  60. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/spin_states.md +2 -2
  61. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/strain.md +4 -2
  62. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/tautomer_search.md +1 -1
  63. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/webhooks.md +7 -7
  64. {rowan_python-3.1.8 → rowan_python-3.1.10}/.agents/plugins/marketplace.json +0 -0
  65. {rowan_python-3.1.8 → rowan_python-3.1.10}/.claude-plugin/marketplace.json +0 -0
  66. {rowan_python-3.1.8 → rowan_python-3.1.10}/.codex-plugin/plugin.json +0 -0
  67. {rowan_python-3.1.8 → rowan_python-3.1.10}/.envrc +0 -0
  68. {rowan_python-3.1.8 → rowan_python-3.1.10}/.github/workflows/build-and-deploy-docs.yml +0 -0
  69. {rowan_python-3.1.8 → rowan_python-3.1.10}/.github/workflows/publish-skill.yml +0 -0
  70. {rowan_python-3.1.8 → rowan_python-3.1.10}/.github/workflows/python-publish.yml +0 -0
  71. {rowan_python-3.1.8 → rowan_python-3.1.10}/.github/workflows/test.yml +0 -0
  72. {rowan_python-3.1.8 → rowan_python-3.1.10}/.gitignore +0 -0
  73. {rowan_python-3.1.8 → rowan_python-3.1.10}/.pre-commit-config.yaml +0 -0
  74. {rowan_python-3.1.8 → rowan_python-3.1.10}/AGENTS.md +0 -0
  75. {rowan_python-3.1.8 → rowan_python-3.1.10}/CLAUDE.md +0 -0
  76. {rowan_python-3.1.8 → rowan_python-3.1.10}/GEMINI.md +0 -0
  77. {rowan_python-3.1.8 → rowan_python-3.1.10}/LICENSE +0 -0
  78. {rowan_python-3.1.8 → rowan_python-3.1.10}/README.md +0 -0
  79. {rowan_python-3.1.8 → rowan_python-3.1.10}/docs/images/deciduous-tree-favicon.png +0 -0
  80. {rowan_python-3.1.8 → rowan_python-3.1.10}/docs/stylesheets/colors.css +0 -0
  81. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/PROTAC_solubility.py +0 -0
  82. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/admet.py +0 -0
  83. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/analogue_docking.py +0 -0
  84. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/aqueous_solubility.py +0 -0
  85. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/basic_calculation.py +0 -0
  86. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/basic_calculation_from_json.py +0 -0
  87. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/basic_calculation_with_constraint.py +0 -0
  88. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/basic_calculation_with_solvent.py +0 -0
  89. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/batch_docking.py +0 -0
  90. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/bde.py +0 -0
  91. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/binding_affinity.py +0 -0
  92. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/boltz_paired_msa.py +0 -0
  93. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/boltz_single_msa.py +0 -0
  94. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/chai_paired_msa.py +0 -0
  95. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/chai_single_msa.py +0 -0
  96. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/cofolding_screen.py +0 -0
  97. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/colabfold_paired_msa.py +0 -0
  98. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/colabfold_single_msa.py +0 -0
  99. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/conformer_dependent_redox.py +0 -0
  100. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/conformers.py +0 -0
  101. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/conformers_screen.py +0 -0
  102. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/covalent_docking.py +0 -0
  103. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/data/1iep_receptorH.pdb +0 -0
  104. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/data/Al_FCC.xyz +0 -0
  105. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/data/citalopram_1iep.xyz +0 -0
  106. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/data/ibuprofen_conformers.sdf +0 -0
  107. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/data/tyk2_ligands.sdf +0 -0
  108. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/data/tyk2_structure.pdb +0 -0
  109. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/data/workflow_example.json +0 -0
  110. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/dcd_download.py +0 -0
  111. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/descriptors.py +0 -0
  112. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/docking_screen.py +0 -0
  113. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/double_ended_ts_search.py +0 -0
  114. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/electronic_properties.py +0 -0
  115. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/estimate_workflow.py +0 -0
  116. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/fukui_index.py +0 -0
  117. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/hydrogen_bond_basicity.py +0 -0
  118. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/interaction_energy_decomposition.py +0 -0
  119. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/ion_mobility.py +0 -0
  120. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/irc.py +0 -0
  121. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/macropka.py +0 -0
  122. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/membrane_permeability.py +0 -0
  123. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/multistage_optimization.py +0 -0
  124. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/nmr.py +0 -0
  125. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/optimization.py +0 -0
  126. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/pdb_download.py +0 -0
  127. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/periodic_dft.py +0 -0
  128. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/phenol_pka.py +0 -0
  129. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/pka.py +0 -0
  130. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/pocket_detection.py +0 -0
  131. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/pose_analysis_md.py +0 -0
  132. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/project_scoped_api_key.py +0 -0
  133. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/protein_binder_design.py +0 -0
  134. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/protein_cofolding.py +0 -0
  135. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/protein_cofolding_with_constraints.py +0 -0
  136. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/protein_cofolding_with_templates.py +0 -0
  137. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/rbfe_graph.py +0 -0
  138. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/rbfe_resubmit.py +0 -0
  139. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/redox_potential.py +0 -0
  140. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/relative_binding_free_energy_perturbation.py +0 -0
  141. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/resubmit_with_perturbations.py +0 -0
  142. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/retrieve_workflow.py +0 -0
  143. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/scan.py +0 -0
  144. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/solvent_dependent_conformers.py +0 -0
  145. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/spin_states.py +0 -0
  146. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/strain.py +0 -0
  147. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/tautomer.py +0 -0
  148. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/template.py +0 -0
  149. {rowan_python-3.1.8 → rowan_python-3.1.10}/examples/webhook.py +0 -0
  150. {rowan_python-3.1.8 → rowan_python-3.1.10}/mkdocs.yml +0 -0
  151. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/api_keys.py +0 -0
  152. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/calculation.py +0 -0
  153. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/config.py +0 -0
  154. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/constants.py +0 -0
  155. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/folder.py +0 -0
  156. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/molecule.py +0 -0
  157. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/project.py +0 -0
  158. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/py.typed +0 -0
  159. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/test_utils.py +0 -0
  160. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/types.py +0 -0
  161. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/user.py +0 -0
  162. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/utils.py +0 -0
  163. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/admet.py +0 -0
  164. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/basic_calculation.py +0 -0
  165. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/batch_docking.py +0 -0
  166. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/bde.py +0 -0
  167. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/binding_affinity.py +0 -0
  168. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/conformer_search.py +0 -0
  169. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/constants.py +0 -0
  170. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/covalent_inhibitor_scan.py +0 -0
  171. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/descriptors.py +0 -0
  172. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/double_ended_ts_search.py +0 -0
  173. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/electronic_properties.py +0 -0
  174. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/fukui.py +0 -0
  175. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
  176. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/interaction_energy_decomposition.py +0 -0
  177. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/ion_mobility.py +0 -0
  178. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/irc.py +0 -0
  179. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/macropka.py +0 -0
  180. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/membrane_permeability.py +0 -0
  181. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/msa.py +0 -0
  182. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/multistage_optimization.py +0 -0
  183. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/pka.py +0 -0
  184. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/pocket_detection.py +0 -0
  185. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/protein_binder_design.py +0 -0
  186. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/rbfe_graph.py +0 -0
  187. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/redox_potential.py +0 -0
  188. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/scan.py +0 -0
  189. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/solubility.py +0 -0
  190. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/solvent_dependent_conformers.py +0 -0
  191. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/spin_states.py +0 -0
  192. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/strain.py +0 -0
  193. {rowan_python-3.1.8 → rowan_python-3.1.10}/rowan/workflows/tautomer_search.py +0 -0
  194. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/reference/binding_affinity.md +0 -0
  195. {rowan_python-3.1.8 → rowan_python-3.1.10}/skills/computational-chemistry-and-biology/scripts/check_env.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rowan-python
3
- Version: 3.1.8
3
+ Version: 3.1.10
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
@@ -11,7 +11,7 @@ Requires-Dist: httpx
11
11
  Requires-Dist: nest-asyncio
12
12
  Requires-Dist: rdkit
13
13
  Requires-Dist: setuptools
14
- Requires-Dist: stjames>=0.0.228
14
+ Requires-Dist: stjames<0.0.238,>=0.0.237
15
15
  Description-Content-Type: text/markdown
16
16
 
17
17
  # Rowan Python Library
@@ -209,6 +209,17 @@
209
209
  group_by_category: true
210
210
  filters: ["!^__"]
211
211
 
212
+ ## LogP
213
+ ::: rowan.workflows.logp
214
+ handler: python
215
+ options:
216
+ show_source: false
217
+ show_root_heading: false
218
+ show_root_toc_entry: false
219
+ members_order: source
220
+ group_by_category: true
221
+ filters: ["!^__"]
222
+
212
223
  ## MacropKa
213
224
  ::: rowan.workflows.macropka
214
225
  handler: python
@@ -15,10 +15,13 @@ protein.prepare(remove_heterogens=False)
15
15
  protein_reactive_atom_index = 1571
16
16
  ligand_reactive_atom_index = 4492
17
17
 
18
+ ligand_smiles = "CC(C)(C)C[C@@H](C#N)C(=O)N1CCC[C@H](C1)n2nc(c3ccc(Oc4ccccc4)cc3)c5c(N)ncnc25"
19
+
18
20
  workflow = rowan.submit_covalent_inhibitor_scan_workflow(
19
21
  protein=protein,
20
22
  protein_reactive_atom_index=protein_reactive_atom_index,
21
23
  ligand_reactive_atom_index=ligand_reactive_atom_index,
24
+ ligand_smiles=ligand_smiles,
22
25
  settings=rowan.CovalentInhibitorScanSettings(scan_num=4),
23
26
  name="BTK covalent inhibitor scan (Cys481, 4YHF)",
24
27
  folder=folder,
@@ -35,5 +35,5 @@ for i, score in enumerate(result.scores):
35
35
 
36
36
  # Download the top-scoring protein–ligand complex as a PDB
37
37
  complex_protein = result.get_complex(0)
38
- complex_protein.download_pdb_file("dasatinib_2GQG_complex.pdb")
38
+ complex_protein.download_pdb_file(name="dasatinib_2GQG_complex")
39
39
  print("Saved dasatinib_2GQG_complex.pdb")
@@ -0,0 +1,19 @@
1
+ import rowan
2
+
3
+ # Set your API key or use the ROWAN_API_KEY environment variable
4
+ # rowan.api_key = "rowan-sk..."
5
+ folder = rowan.get_folder("examples")
6
+
7
+ oseltamivir_SMILES = "C1CCOC(=O)C1=C[C@@H](OC(CC)CC)[C@H](NC(C)=O)[C@@H]([NH3+])C1CCC1"
8
+
9
+ workflow = rowan.submit_logp_workflow(
10
+ initial_smiles=oseltamivir_SMILES,
11
+ method="chemprop_sangster2026",
12
+ name="Oseltamivir logP",
13
+ folder=folder,
14
+ )
15
+
16
+ print(f"View workflow privately at: https://labs.rowansci.com/logp/{workflow.uuid}")
17
+ result = workflow.result()
18
+ print(result)
19
+ # e.g. <LogPResult logp=2.541>
@@ -5,7 +5,7 @@ import rowan
5
5
  folder = rowan.get_folder("examples")
6
6
 
7
7
  protein = rowan.create_protein_from_pdb_id(
8
- "crambin", "1CRN", project_uuid=rowan.default_project().uuid
8
+ "1CRN", name="crambin", project_uuid=rowan.default_project().uuid
9
9
  )
10
10
 
11
11
  protein.prepare()
@@ -37,11 +37,12 @@ environments:
37
37
  - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
38
38
  - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda
39
39
  - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
40
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
40
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
41
41
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
42
42
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
43
43
  - pypi: ./
44
44
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
45
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
45
46
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
46
47
  - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl
47
48
  - pypi: https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
@@ -56,14 +57,13 @@ environments:
56
57
  - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl
57
58
  - pypi: https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl
58
59
  - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl
60
+ - pypi: https://files.pythonhosted.org/packages/df/95/bdd01bbd523a63b113407c34c99af8495daa4651757cc28f3fabc393d131/stjames-0.0.237-py3-none-any.whl
59
61
  - pypi: https://files.pythonhosted.org/packages/e1/11/1a9a693e424b2a75755d56ecb67ccc6f77e6e5bb7417dec5e73d9c410314/rdkit-2026.3.4-cp314-cp314-manylinux_2_28_x86_64.whl
60
62
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
61
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
62
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
63
63
  - pypi: https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
64
64
  - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl
65
65
  osx-arm64:
66
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
66
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
67
67
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
68
68
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
69
69
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
@@ -81,6 +81,7 @@ environments:
81
81
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
82
82
  - pypi: ./
83
83
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
84
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
84
85
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
85
86
  - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl
86
87
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
@@ -97,9 +98,8 @@ environments:
97
98
  - pypi: https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl
98
99
  - pypi: https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl
99
100
  - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl
101
+ - pypi: https://files.pythonhosted.org/packages/df/95/bdd01bbd523a63b113407c34c99af8495daa4651757cc28f3fabc393d131/stjames-0.0.237-py3-none-any.whl
100
102
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
101
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
102
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
103
103
  - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl
104
104
  dev:
105
105
  channels:
@@ -126,7 +126,7 @@ environments:
126
126
  - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
127
127
  - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda
128
128
  - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
129
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
129
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
130
130
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
131
131
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
132
132
  - pypi: ./
@@ -135,6 +135,7 @@ environments:
135
135
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
136
136
  - pypi: https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl
137
137
  - pypi: https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl
138
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
138
139
  - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl
139
140
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
140
141
  - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl
@@ -171,6 +172,7 @@ environments:
171
172
  - pypi: https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
172
173
  - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl
173
174
  - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl
175
+ - pypi: https://files.pythonhosted.org/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
174
176
  - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl
175
177
  - pypi: https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl
176
178
  - pypi: https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl
@@ -199,24 +201,22 @@ environments:
199
201
  - pypi: https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl
200
202
  - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl
201
203
  - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl
204
+ - pypi: https://files.pythonhosted.org/packages/df/95/bdd01bbd523a63b113407c34c99af8495daa4651757cc28f3fabc393d131/stjames-0.0.237-py3-none-any.whl
202
205
  - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl
203
206
  - pypi: https://files.pythonhosted.org/packages/e1/11/1a9a693e424b2a75755d56ecb67ccc6f77e6e5bb7417dec5e73d9c410314/rdkit-2026.3.4-cp314-cp314-manylinux_2_28_x86_64.whl
204
207
  - pypi: https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl
205
208
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
206
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
207
209
  - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
208
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
209
210
  - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
210
211
  - pypi: https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl
211
212
  - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl
212
213
  - pypi: https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
213
- - pypi: https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
214
214
  - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
215
215
  - pypi: https://files.pythonhosted.org/packages/fb/49/bc925106abcdac498074f2cbe6137e94e09f418dd2b7775df5b577dc0313/pre_commit-4.6.1-py2.py3-none-any.whl
216
216
  - pypi: https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl
217
217
  - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl
218
218
  osx-arm64:
219
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
219
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
220
220
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
221
221
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
222
222
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
@@ -238,6 +238,7 @@ environments:
238
238
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
239
239
  - pypi: https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl
240
240
  - pypi: https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl
241
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
241
242
  - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl
242
243
  - pypi: https://files.pythonhosted.org/packages/15/14/2ba1d61452d7c2a7fe12741e8d374e52b183476b07aa7f9e2a0d02b0720a/mypy-2.3.0-cp314-cp314-macosx_11_0_arm64.whl
243
244
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
@@ -252,6 +253,7 @@ environments:
252
253
  - pypi: https://files.pythonhosted.org/packages/3e/5c/fb93d3092640a24dfb7bd7727a24016d7c01774ca013e60efd3f683c8002/backrefs-7.0-py314-none-any.whl
253
254
  - pypi: https://files.pythonhosted.org/packages/40/3a/948263ca3b9d65bb2b1b0c521b3a49fad5d59ada58724bd87d2bd5ff3f36/ipython-9.15.0-py3-none-any.whl
254
255
  - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl
256
+ - pypi: https://files.pythonhosted.org/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl
255
257
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
256
258
  - pypi: https://files.pythonhosted.org/packages/52/22/0ba7be75e0d99335008532312abc0a1ce50f8895739941bca887cf75d157/rdkit-2026.3.4-cp314-cp314-macosx_11_0_arm64.whl
257
259
  - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
@@ -293,7 +295,6 @@ environments:
293
295
  - pypi: https://files.pythonhosted.org/packages/c1/f6/ec7ec652c51db77c2f61d8573338e13e4704303265ccc658cb4031d9f354/ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl
294
296
  - pypi: https://files.pythonhosted.org/packages/c7/7b/14882602ddee241d7984a742fcb423cb4a30fb0d6efc546ac3129fba475a/python_discovery-1.5.0-py3-none-any.whl
295
297
  - pypi: https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl
296
- - pypi: https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl
297
298
  - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
298
299
  - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl
299
300
  - pypi: https://files.pythonhosted.org/packages/d1/fc/10ab7e80650a9c9e8f4f1105f8c8e73567f88ed0c06ada589ab81d38687c/mkdocstrings_python-2.0.5-py3-none-any.whl
@@ -305,12 +306,11 @@ environments:
305
306
  - pypi: https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz
306
307
  - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl
307
308
  - pypi: https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl
309
+ - pypi: https://files.pythonhosted.org/packages/df/95/bdd01bbd523a63b113407c34c99af8495daa4651757cc28f3fabc393d131/stjames-0.0.237-py3-none-any.whl
308
310
  - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl
309
311
  - pypi: https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl
310
312
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
311
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
312
313
  - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
313
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
314
314
  - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
315
315
  - pypi: https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl
316
316
  - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl
@@ -597,16 +597,16 @@ packages:
597
597
  - zstd >=1.5.7,<1.6.0a0
598
598
  size: 601375
599
599
  timestamp: 1764777111296
600
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
601
- sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf
602
- md5: a9965dd99f683c5f444428f896635716
600
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
601
+ sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6
602
+ md5: 0f51e2391ade309db462a55611263e9c
603
603
  depends:
604
604
  - __unix
605
605
  license: ISC
606
606
  purls: []
607
607
  run_exports: {}
608
- size: 128866
609
- timestamp: 1781708962055
608
+ size: 131780
609
+ timestamp: 1784754889428
610
610
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
611
611
  build_number: 8
612
612
  sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5
@@ -820,7 +820,7 @@ packages:
820
820
  name: rowan-python
821
821
  requires_dist:
822
822
  - httpx
823
- - stjames>=0.0.228
823
+ - stjames>=0.0.237,<0.0.238
824
824
  - setuptools
825
825
  - rdkit
826
826
  - nest-asyncio
@@ -851,6 +851,11 @@ packages:
851
851
  version: 3.32.0
852
852
  sha256: d396bea984af47333ef05e50eae7eff88c84256de6112aea0ec48a233c064fe3
853
853
  requires_python: '>=3.10'
854
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
855
+ name: certifi
856
+ version: 2026.7.22
857
+ sha256: 62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775
858
+ requires_python: '>=3.7'
854
859
  - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl
855
860
  name: python-dotenv
856
861
  version: 1.2.2
@@ -1072,6 +1077,11 @@ packages:
1072
1077
  version: 2.5.1
1073
1078
  sha256: 54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21
1074
1079
  requires_python: '>=3.12'
1080
+ - pypi: https://files.pythonhosted.org/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl
1081
+ name: ruff
1082
+ version: 0.16.0
1083
+ sha256: e01c21d10eb1b29f47b7454e1f4056db9a3f0260c646aa88457c610291db9f81
1084
+ requires_python: '>=3.7'
1075
1085
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
1076
1086
  name: typing-extensions
1077
1087
  version: 4.16.0
@@ -1376,6 +1386,11 @@ packages:
1376
1386
  - pytest ; extra == 'dev'
1377
1387
  - tox ; extra == 'dev'
1378
1388
  - black ; extra == 'lint'
1389
+ - pypi: https://files.pythonhosted.org/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1390
+ name: ruff
1391
+ version: 0.16.0
1392
+ sha256: 4f11a8d11010301d0a398a2fdef67691feca7294da6aef55e2150e8fa2cd520b
1393
+ requires_python: '>=3.7'
1379
1394
  - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl
1380
1395
  name: identify
1381
1396
  version: 2.6.19
@@ -1681,11 +1696,6 @@ packages:
1681
1696
  - trove-classifiers>=2024.10.12 ; extra == 'tests'
1682
1697
  - defusedxml ; extra == 'xmp'
1683
1698
  requires_python: '>=3.10'
1684
- - pypi: https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl
1685
- name: ruff
1686
- version: 0.15.22
1687
- sha256: 11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f
1688
- requires_python: '>=3.7'
1689
1699
  - pypi: https://files.pythonhosted.org/packages/ca/87/b4d6c38e0ccd5e85dc54cecdf933a152c60b28fe5d993a6d8a72fa6d5896/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1690
1700
  name: ast-serialize
1691
1701
  version: 0.6.0
@@ -1782,6 +1792,17 @@ packages:
1782
1792
  - mkdocs-section-index ; extra == 'docs'
1783
1793
  - mkdocs-literate-nav ; extra == 'docs'
1784
1794
  requires_python: '>=3.10'
1795
+ - pypi: https://files.pythonhosted.org/packages/df/95/bdd01bbd523a63b113407c34c99af8495daa4651757cc28f3fabc393d131/stjames-0.0.237-py3-none-any.whl
1796
+ name: stjames
1797
+ version: 0.0.237
1798
+ sha256: 790c32bdc829efe52b7ccc442083d0d95fc01587d4063a08ea73cd9f686f6d21
1799
+ requires_dist:
1800
+ - pydantic>=2.4
1801
+ - numpy
1802
+ - requests
1803
+ - more-itertools
1804
+ - rdkit ; extra == 'rdkit'
1805
+ requires_python: '>=3.11'
1785
1806
  - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl
1786
1807
  name: packaging
1787
1808
  version: '26.2'
@@ -1808,17 +1829,6 @@ packages:
1808
1829
  version: 11.1.0
1809
1830
  sha256: 4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192
1810
1831
  requires_python: '>=3.10'
1811
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
1812
- name: stjames
1813
- version: 0.0.233
1814
- sha256: bd3bdf9c701b7649187c25c6d73e7bee46b5ac32cddad43c47979243a28d1023
1815
- requires_dist:
1816
- - pydantic>=2.4
1817
- - numpy
1818
- - requests
1819
- - more-itertools
1820
- - rdkit ; extra == 'rdkit'
1821
- requires_python: '>=3.11'
1822
1832
  - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
1823
1833
  name: python-dateutil
1824
1834
  version: 2.9.0.post0
@@ -1826,11 +1836,6 @@ packages:
1826
1836
  requires_dist:
1827
1837
  - six>=1.5
1828
1838
  requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*'
1829
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
1830
- name: certifi
1831
- version: 2026.6.17
1832
- sha256: 2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db
1833
- requires_python: '>=3.7'
1834
1839
  - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
1835
1840
  name: stack-data
1836
1841
  version: 0.6.3
@@ -1865,11 +1870,6 @@ packages:
1865
1870
  version: 3.4.9
1866
1871
  sha256: c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046
1867
1872
  requires_python: '>=3.7'
1868
- - pypi: https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1869
- name: ruff
1870
- version: 0.15.22
1871
- sha256: 365523eb91d9224e1bcb03b022fbf0facb8f9e23792a2c53d9d4b3924bdbdebb
1872
- requires_python: '>=3.7'
1873
1873
  - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
1874
1874
  name: ghp-import
1875
1875
  version: 2.1.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rowan-python"
3
- version = "3.1.8"
3
+ version = "3.1.10"
4
4
  description = "Rowan Python Library"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -9,7 +9,7 @@ authors = [
9
9
  ]
10
10
  dependencies = [
11
11
  "httpx",
12
- "stjames>=0.0.228",
12
+ "stjames>=0.0.237,<0.0.238",
13
13
  "setuptools",
14
14
  "rdkit",
15
15
  "nest-asyncio",
@@ -83,6 +83,7 @@ ignore = [
83
83
  "PLR0911", # Too many returns
84
84
  "PLR0912", # Too many branches
85
85
  "PLR0913", # Too many arguments to function call
86
+ "PLR0917", # Too many positional arguments
86
87
  "PLR0914", # Too many locals
87
88
  "PLR0915", # Too many statements
88
89
  "PLR1702", # Too many nested-blocks
@@ -3,6 +3,7 @@ from . import constants
3
3
  from stjames import (
4
4
  Atom,
5
5
  BandStructure,
6
+ Binder,
6
7
  BindingPoseContact,
7
8
  HydrationBridgeResidue,
8
9
  HydrationSite,
@@ -24,6 +25,7 @@ from stjames import (
24
25
  Mode,
25
26
  MSAFormat,
26
27
  MultiStageOptSettings,
28
+ NMR_SUPPORTED_SOLVENTS,
27
29
  OpenConfSettings,
28
30
  OptimizationSettings,
29
31
  PBCDFTSettings,
@@ -4,7 +4,8 @@ from datetime import datetime
4
4
  from pathlib import Path
5
5
  from typing import Any, Self
6
6
 
7
- from pydantic import BaseModel
7
+ from pydantic import BaseModel, PrivateAttr
8
+ from stjames.pdb import PDB, pdb_object_to_pdb_filestring
8
9
 
9
10
  from .project import Project
10
11
  from .utils import api_client
@@ -37,6 +38,8 @@ class Protein(BaseModel):
37
38
  public: bool | None = None
38
39
  pocket: list[list[float]] | None = None
39
40
 
41
+ _workflow_uuid: str | None = PrivateAttr(default=None)
42
+
40
43
  def __repr__(self) -> str:
41
44
  return f"<Protein name='{self.name}' created_at='{self.created_at}' uuid='{self.uuid}'>"
42
45
 
@@ -119,18 +122,24 @@ class Protein(BaseModel):
119
122
  response.raise_for_status()
120
123
  return Protein(**response.json())
121
124
 
122
- def refresh(self, in_place: bool = True) -> Self:
125
+ def refresh(self, in_place: bool = True, workflow_uuid: str | None = None) -> Self:
123
126
  """
124
127
  Loads protein data
125
128
 
129
+ :param workflow_uuid: UUID of a workflow referencing this protein, for proteins reachable
130
+ only through a workflow you can read. Not needed for proteins from a workflow result.
126
131
  :returns: protein with loaded data
127
132
  """
133
+ workflow_uuid = workflow_uuid or self._workflow_uuid
134
+ params = {"workflow_uuid": workflow_uuid} if workflow_uuid else None
128
135
  with api_client() as client:
129
- response = client.get(f"/protein/{self.uuid}")
136
+ response = client.get(f"/protein/{self.uuid}", params=params)
130
137
  response.raise_for_status()
131
138
  protein_data = response.json()
132
139
  if not in_place:
133
- return self.__class__.model_validate(protein_data)
140
+ refreshed = self.__class__.model_validate(protein_data)
141
+ refreshed._workflow_uuid = workflow_uuid
142
+ return refreshed
134
143
 
135
144
  self.name = protein_data.get("name")
136
145
  self.data = protein_data.get("data")
@@ -138,6 +147,7 @@ class Protein(BaseModel):
138
147
  self.pocket = protein_data.get("pocket")
139
148
  self.sanitized = protein_data.get("sanitized")
140
149
  self.used_in_workflow = protein_data.get("used_in_workflow")
150
+ self._workflow_uuid = workflow_uuid
141
151
  return self
142
152
 
143
153
  def update(
@@ -291,7 +301,7 @@ class Protein(BaseModel):
291
301
 
292
302
  raise RuntimeError(f"Protein preparation timed out after {timeout:.0f}s for {self.uuid}.")
293
303
 
294
- def validate_protein_forcefield(self, exclude_residue_names: list[str] | None = None) -> None:
304
+ def validate_protein_forcefield(self, exclude_residues: list[str | int] | None = None) -> None:
295
305
  """
296
306
  Validate that this protein can be parameterized with the MD forcefield.
297
307
 
@@ -299,16 +309,24 @@ class Protein(BaseModel):
299
309
  recognized by OpenMM and that there are no clashing atoms. Call this
300
310
  before submitting any MD workflow to catch preparation issues early.
301
311
 
302
- Ligand residues (``LIG``) are always excluded — they are parameterized
303
- separately by the MD workflow from the provided SMILES.
312
+ Ligand residues (`LIG`) are always excluded — they are parameterized
313
+ separately by the MD workflow from the provided SMILES. Pass the keys of a
314
+ binder's `small_molecules` to exclude those as well.
315
+
316
+ A name is matched case-insensitively and excludes only the first residue
317
+ with that name, so further copies are still validated. Integer entries are
318
+ 0-based indices into the protein's sorted non-polymer records, and reference
319
+ a record without naming it.
304
320
 
305
321
  If validation fails, try re-preparing with ``remove_invalid_hydrogens=True``:
306
322
  ``protein.prepare(remove_invalid_hydrogens=True)``
307
323
 
308
- :param exclude_residue_names: Additional residue names to skip during validation.
324
+ :param exclude_residues: additional residue names and/or 0-based non-polymer indices to skip
309
325
  :raises requests.HTTPError: if validation fails or the API request fails.
310
326
  """
311
- excluded = list({"LIG"} | {name.upper() for name in (exclude_residue_names or [])})
327
+ entries: list[str | int] = ["LIG"]
328
+ entries += [r.upper() if isinstance(r, str) else r for r in exclude_residues or []]
329
+ excluded = list(dict.fromkeys(entries))
312
330
  with api_client() as client:
313
331
  response = client.post(
314
332
  f"/protein/{self.uuid}/validate_forcefield",
@@ -316,42 +334,66 @@ class Protein(BaseModel):
316
334
  )
317
335
  response.raise_for_status()
318
336
 
319
- def download_pdb_file(self, path: Path | str | None = None, name: str | None = None) -> None:
337
+ def download_pdb_file(
338
+ self,
339
+ path: Path | str | None = None,
340
+ name: str | None = None,
341
+ workflow_uuid: str | None = None,
342
+ ) -> None:
320
343
  """
321
- Downloads the PDB file for a protein
344
+ Downloads the PDB file for a protein.
345
+
346
+ Builds the file locally from this protein's data, calling `refresh()` if needed, so it
347
+ works anywhere `refresh()` does — including proteins reachable only through a workflow.
322
348
 
323
349
  :param path: Directory to save the file to (defaults to current directory)
324
350
  :param name: Optional custom name for the file (defaults to protein name)
351
+ :param workflow_uuid: UUID of a workflow referencing this protein, for proteins reachable
352
+ only through a workflow you can read. Not needed for proteins from a workflow result.
325
353
  :raises requests.HTTPError: if the request to the API fails
326
354
  """
327
355
  path = Path(path) if path is not None else Path.cwd()
328
356
 
329
357
  path.mkdir(parents=True, exist_ok=True)
330
358
 
331
- with api_client() as client:
332
- response = client.get(f"/protein/{self.uuid}/get_pdb_file")
333
- response.raise_for_status()
359
+ if self.data is None:
360
+ self.refresh(workflow_uuid=workflow_uuid)
361
+
362
+ pdb_object = PDB.model_validate(self.data)
363
+ pdb_string = pdb_object_to_pdb_filestring(
364
+ pdb=pdb_object,
365
+ header=True,
366
+ source=True,
367
+ keyword=True,
368
+ crystallography=True,
369
+ remark=False,
370
+ )
334
371
 
335
- file_path = path / f"{name or self.name}.pdb"
336
- with open(file_path, "wb") as f:
337
- f.write(response.content)
372
+ file_path = path / f"{name or self.name or self.uuid}.pdb"
373
+ with open(file_path, "w") as f:
374
+ f.write(pdb_string)
338
375
 
339
376
 
340
- def retrieve_protein(uuid: str) -> Protein:
377
+ def retrieve_protein(uuid: str, workflow_uuid: str | None = None) -> Protein:
341
378
  """
342
379
  Retrieves a protein from the API using its UUID.
343
380
 
344
381
  :param uuid: UUID of the protein to retrieve.
382
+ :param workflow_uuid: UUID of a workflow referencing this protein, for proteins reachable
383
+ only through a workflow you can read. Not needed for proteins from a workflow result.
345
384
  :returns: Protein object representing the retrieved protein.
346
385
  :raises requests.HTTPError: if the request to the API fails.
347
386
  """
387
+ params = {"workflow_uuid": workflow_uuid} if workflow_uuid else None
348
388
 
349
389
  with api_client() as client:
350
- response = client.get(f"/protein/{uuid}")
390
+ response = client.get(f"/protein/{uuid}", params=params)
351
391
  response.raise_for_status()
352
392
  protein_data = response.json()
353
393
 
354
- return Protein(**protein_data)
394
+ protein = Protein(**protein_data)
395
+ protein._workflow_uuid = workflow_uuid
396
+ return protein
355
397
 
356
398
 
357
399
  def list_proteins(
@@ -83,6 +83,7 @@ from .interaction_energy_decomposition import (
83
83
  )
84
84
  from .ion_mobility import IonMobilityResult, submit_ion_mobility_workflow
85
85
  from .irc import IRCResult, submit_irc_workflow
86
+ from .logp import LogPResult, submit_logp_workflow
86
87
  from .macropka import (
87
88
  MacropKaMicrostate,
88
89
  MacropKaResult,
@@ -160,7 +160,7 @@ class AnalogueDockingResult(WorkflowResult):
160
160
 
161
161
  cache_key = f"complex_{smiles}_{index}"
162
162
  if cache_key not in self._cache:
163
- self._cache[cache_key] = retrieve_protein(uuid)
163
+ self._cache[cache_key] = retrieve_protein(uuid, workflow_uuid=self.workflow_uuid)
164
164
  return self._cache[cache_key]
165
165
 
166
166
  def get_complexes(self, smiles: str) -> list[Protein]:
@@ -144,10 +144,10 @@ the server (a field is missing, extra, or the wrong type). Underlying validation
144
144
  RESULT_REGISTRY: dict[str, type[WorkflowResult]] = {}
145
145
 
146
146
 
147
- def register_result(workflow_type: str) -> Callable[[type[WorkflowResult]], type[WorkflowResult]]:
147
+ def register_result[R: WorkflowResult](workflow_type: str) -> Callable[[type[R]], type[R]]:
148
148
  """Decorator to register a result class for a workflow type."""
149
149
 
150
- def decorator(cls: type[WorkflowResult]) -> type[WorkflowResult]:
150
+ def decorator(cls: type[R]) -> type[R]:
151
151
  RESULT_REGISTRY[workflow_type] = cls
152
152
  return cls
153
153
 
@@ -133,7 +133,7 @@ class DockingResult(WorkflowResult):
133
133
 
134
134
  cache_key = f"complex_{index}"
135
135
  if cache_key not in self._cache:
136
- self._cache[cache_key] = retrieve_protein(uuid)
136
+ self._cache[cache_key] = retrieve_protein(uuid, workflow_uuid=self.workflow_uuid)
137
137
  return self._cache[cache_key]
138
138
 
139
139
  def get_complexes(self) -> list[Protein]: