rowan-python 3.2.0__tar.gz → 3.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.envrc +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/build-and-deploy-docs.yml +9 -5
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/publish-skill.yml +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/python-publish.yml +5 -2
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.github/workflows/test.yml +7 -10
- rowan_python-3.2.2/.gitignore +66 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.rumdl.toml +2 -2
- {rowan_python-3.2.0 → rowan_python-3.2.2}/PKG-INFO +4 -7
- {rowan_python-3.2.0 → rowan_python-3.2.2}/README.md +2 -5
- {rowan_python-3.2.0 → rowan_python-3.2.2}/prek.toml +16 -7
- {rowan_python-3.2.0 → rowan_python-3.2.2}/pyproject.toml +6 -3
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/__init__.py +1 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/folder.py +1 -4
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/project.py +8 -1
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/protein.py +0 -116
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/binding_affinity.py +14 -5
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_md.py +7 -3
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_preparation.py +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/relative_binding_free_energy_perturbation.py +17 -5
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/SKILL.md +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/binding_affinity.md +19 -4
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_md.md +2 -1
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_preparation.md +0 -11
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_binding_affinity.py +36 -2
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_md_workflow_updates.py +1 -0
- rowan_python-3.2.2/tests/test_project.py +35 -0
- rowan_python-3.2.2/tests/test_rbfe_trajectory_download.py +53 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/uv.lock +8 -8
- rowan_python-3.2.0/.gitignore +0 -214
- rowan_python-3.2.0/GEMINI.md +0 -3
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.claude-plugin/marketplace.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.codex-plugin/plugin.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.editorconfig +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/.python-version +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/LICENSE +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/api-keys.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/calculation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/folder.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/molecule.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/project.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/protein.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/user.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/webhooks.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/api/workflow.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/images/RowanLogoLarge.png +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/images/RowanSquareLogo.png +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/images/favicon.svg +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/index.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/stylesheets/colors.css +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/admet.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/analogue-docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/basic-calculation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/batch-docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/binding-affinity.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/bond-dissociation-energy.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/conformer-search-settings.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/conformer-search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/covalent-inhibitor-scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/descriptors.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/double-ended-ts-search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/electronic-properties.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/fukui.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/hydrogen-bond-donor-acceptor-strength.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/interaction-energy-decomposition.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/ion-mobility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/irc.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/logp.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/macropka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/membrane-permeability.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/msa.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/multistage-optimization.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/nmr.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/pka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/pocket-detection.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/pose-analysis-md.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-binder-design.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-cofolding.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-md.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/protein-preparation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/rbfe-graph.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/redox-potential.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/relative-binding-free-energy-perturbation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/settings.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/solubility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/solvent-dependent-conformers.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/spin-states.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/strain.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/tautomer-search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/docs/workflows/types.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/PROTAC_solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/admet.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/analogue_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/aqueous_solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation_from_json.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation_with_constraint.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/basic_calculation_with_solvent.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/batch_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/batch_solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/bde.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/binding_affinity.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/boltz_paired_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/boltz_single_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/chai_paired_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/chai_single_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/cofolding_screen.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/colabfold_paired_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/colabfold_single_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/conformer_dependent_redox.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/conformers_screen.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/covalent_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/covalent_inhibitor_scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/1iep_receptorH.pdb +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/Al_FCC.xyz +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/citalopram_1iep.xyz +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/ibuprofen_conformers.sdf +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/tyk2_ligands.sdf +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/tyk2_structure.pdb +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/data/workflow_example.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/dcd_download.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/descriptors.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/docking_screen.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/double_ended_ts_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/electronic_properties.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/estimate_workflow.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/fukui_index.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/hydrogen_bond_basicity.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/induced_fit_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/interaction_energy_decomposition.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/ion_mobility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/irc.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/logp.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/macropka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/membrane_permeability.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/multistage_optimization.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/nmr.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/optimization.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/periodic_dft.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/phenol_pka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/pka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/pocket_detection.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/pose_analysis_md.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/project_scoped_api_key.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_binder_design.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding_modified_inputs.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding_with_constraints.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_cofolding_with_templates.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_file_download.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_md.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/protein_preparation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/rbfe_graph.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/rbfe_resubmit.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/redox_potential.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/relative_binding_free_energy_perturbation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/resubmit_with_perturbations.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/retrieve_workflow.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/solvent_dependent_conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/spin_states.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/strain.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/tautomer.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/template.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/temporary_workflow_sharing.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/examples/webhook.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/mkdocs.yml +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/api_keys.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/calculation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/config.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/constants.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/molecule.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/py.typed +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/types.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/user.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/utils.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/__init__.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/_molecular_dynamics.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/admet.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/analogue_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/base.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/basic_calculation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/batch_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/bde.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/conformer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/constants.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/covalent_inhibitor_scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/descriptors.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/double_ended_ts_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/electronic_properties.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/fukui.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/interaction_energy_decomposition.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/ion_mobility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/irc.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/logp.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/macropka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/membrane_permeability.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/multistage_optimization.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/nmr.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/pka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/pocket_detection.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/pose_analysis_md.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_binder_design.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/protein_cofolding.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/rbfe_graph.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/redox_potential.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/solvent_dependent_conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/spin_states.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/strain.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/rowan/workflows/tautomer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/.claude-plugin/plugin.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/admet.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/analogue_docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/basic_calculation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/batch_docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/bde.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/conformer_search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/covalent_inhibitor_scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/descriptors.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/double_ended_ts_search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/electronic_properties.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/folders_and_projects.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/fukui.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/hydrogen_bond_donor_acceptor_strength.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/interaction_energy_decomposition.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/ion_mobility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/irc.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/logp.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/macropka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/mcp_execution.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/membrane_permeability.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/msa.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/multistage_optimization.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/nmr.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/pka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/pocket_detection.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/pose_analysis_md.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_binder_design.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/protein_cofolding.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/python_sdk.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/rbfe_graph.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/redox_potential.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/relative_binding_free_energy_perturbation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/solubility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/solvent_dependent_conformers.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/spin_states.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/strain.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/tautomer_search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/reference/webhooks.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/skills/computational-chemistry-and-biology/scripts/check_env.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_cofolding_workflow_updates.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_conformer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_docking_workflow.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_docking_workflow_updates.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_macropka_nmr.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_mango_forcefields.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_plugin.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_protein.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_solvent_dependent_conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_tautomer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_utils.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_workflow_results.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.2}/tests/test_workflow_submission.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
name: Build & Deploy Rowan Python Docs
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
|
-
|
|
5
|
-
|
|
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@
|
|
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.
|
|
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@
|
|
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@
|
|
30
|
+
uses: actions/checkout@v7.0.1
|
|
28
31
|
|
|
29
32
|
- name: Install uv
|
|
30
|
-
uses: astral-sh/setup-uv@v10.
|
|
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@
|
|
26
|
+
- uses: actions/checkout@v7.0.1
|
|
27
27
|
|
|
28
28
|
- name: Install the latest version of uv
|
|
29
|
-
uses: astral-sh/setup-uv@
|
|
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
|
|
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
|
-
"
|
|
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.
|
|
3
|
+
Version: 3.2.2
|
|
4
4
|
Summary: Rowan Python Library
|
|
5
5
|
Project-URL: Homepage, https://github.com/rowansci/rowan-client
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/rowansci/rowan-client/issues
|
|
@@ -12,22 +12,19 @@ Requires-Dist: httpx
|
|
|
12
12
|
Requires-Dist: nest-asyncio
|
|
13
13
|
Requires-Dist: rdkit
|
|
14
14
|
Requires-Dist: setuptools
|
|
15
|
-
Requires-Dist: stjames>=0.0.
|
|
15
|
+
Requires-Dist: stjames>=0.0.281
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
17
|
|
|
18
18
|
# Rowan Python Library
|
|
19
19
|
|
|
20
20
|
[](https://pypi.python.org/pypi/rowan-python)
|
|
21
21
|
[](https://docs.astral.sh/uv/)
|
|
22
|
-
[](https://github.com/astral-sh/ruff)
|
|
23
23
|
[](https://pypi.python.org/pypi/rowan-python/)
|
|
24
24
|
[](LICENSE)
|
|
25
25
|
[](https://github.com/rowansci/rowan-python/actions)
|
|
26
|
-
[](https://github.com/astral-sh/ty)
|
|
28
27
|
[](https://rumdl.dev)
|
|
29
|
-
[](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
|
[](https://pypi.python.org/pypi/rowan-python)
|
|
4
4
|
[](https://docs.astral.sh/uv/)
|
|
5
|
-
[](https://github.com/astral-sh/ruff)
|
|
6
6
|
[](https://pypi.python.org/pypi/rowan-python/)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://github.com/rowansci/rowan-python/actions)
|
|
9
|
-
[](https://github.com/astral-sh/ty)
|
|
11
10
|
[](https://rumdl.dev)
|
|
12
|
-
[](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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
3
|
+
version = "3.2.2"
|
|
4
4
|
description = "Rowan Python Library"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
7
8
|
requires-python = ">=3.12"
|
|
8
9
|
authors = [
|
|
9
10
|
{ name = "Corin Wagen", email = "corin@rowansci.com" },
|
|
@@ -11,7 +12,7 @@ authors = [
|
|
|
11
12
|
]
|
|
12
13
|
dependencies = [
|
|
13
14
|
"httpx",
|
|
14
|
-
"stjames>=0.0.
|
|
15
|
+
"stjames>=0.0.281",
|
|
15
16
|
"setuptools",
|
|
16
17
|
"rdkit",
|
|
17
18
|
"nest-asyncio",
|
|
@@ -104,6 +105,9 @@ ignore = [
|
|
|
104
105
|
[tool.ruff.lint.per-file-ignores]
|
|
105
106
|
"__init__.py" = ["F401", "F403"]
|
|
106
107
|
|
|
108
|
+
[tool.ruff.lint.flake8-type-checking]
|
|
109
|
+
runtime-evaluated-base-classes = ["pydantic.BaseModel"]
|
|
110
|
+
|
|
107
111
|
[tool.ruff.lint.pydocstyle]
|
|
108
112
|
convention = "google"
|
|
109
113
|
|
|
@@ -139,7 +143,6 @@ packages = ["rowan"]
|
|
|
139
143
|
[tool.hatch.build.targets.sdist]
|
|
140
144
|
exclude = [
|
|
141
145
|
"/AGENTS.md",
|
|
142
|
-
"/CLAUDE.md",
|
|
143
146
|
"/.agents",
|
|
144
147
|
"/.claude",
|
|
145
148
|
]
|
|
@@ -67,6 +67,7 @@ from stjames.engine_compatibility import (
|
|
|
67
67
|
METHOD_ENGINES,
|
|
68
68
|
get_supported_corrections,
|
|
69
69
|
)
|
|
70
|
+
from stjames.pdb import ResidueRef
|
|
70
71
|
from stjames.optimization.band_method import NEBSettings
|
|
71
72
|
from stjames.optimization.interpolation import Interpolation
|
|
72
73
|
from stjames.optimization.string_method import FSMSettings, StringMethodSettings
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from datetime import datetime
|
|
3
4
|
from typing import TYPE_CHECKING, Any, Self
|
|
4
5
|
|
|
5
6
|
from pydantic import BaseModel
|
|
@@ -8,8 +9,6 @@ from .project import default_project, retrieve_project
|
|
|
8
9
|
from .utils import api_client, get_project_uuid
|
|
9
10
|
|
|
10
11
|
if TYPE_CHECKING:
|
|
11
|
-
from datetime import datetime
|
|
12
|
-
|
|
13
12
|
from .workflows.base import Workflow
|
|
14
13
|
|
|
15
14
|
|
|
@@ -65,8 +64,6 @@ class Folder(BaseModel):
|
|
|
65
64
|
for field_name in self.__class__.model_fields:
|
|
66
65
|
setattr(self, field_name, getattr(updated_folder, field_name))
|
|
67
66
|
|
|
68
|
-
self.model_rebuild()
|
|
69
|
-
|
|
70
67
|
return self
|
|
71
68
|
|
|
72
69
|
def update(
|
|
@@ -197,8 +197,15 @@ def default_project() -> Project:
|
|
|
197
197
|
|
|
198
198
|
Raises:
|
|
199
199
|
httpx.HTTPStatusError: API request fails
|
|
200
|
+
ValueError: user has no default project in the API key's organization
|
|
200
201
|
"""
|
|
201
202
|
with api_client() as client:
|
|
202
203
|
response = client.get("/user/me/default_project")
|
|
203
204
|
response.raise_for_status()
|
|
204
|
-
|
|
205
|
+
project = response.json()
|
|
206
|
+
if project is None:
|
|
207
|
+
raise ValueError(
|
|
208
|
+
"You have no default project in this organization. "
|
|
209
|
+
"Set a default project, or pass a folder or project."
|
|
210
|
+
)
|
|
211
|
+
return Project(**project)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import time
|
|
2
1
|
import warnings
|
|
3
2
|
from datetime import datetime
|
|
4
3
|
from pathlib import Path
|
|
@@ -22,7 +21,6 @@ class Protein(BaseModel):
|
|
|
22
21
|
created_at: creation date of the protein
|
|
23
22
|
used_in_workflow: whether the protein is used in a workflow
|
|
24
23
|
ancestor_uuid: UUID of the ancestor protein
|
|
25
|
-
sanitized: whether the protein is sanitized
|
|
26
24
|
name: name of the protein
|
|
27
25
|
data: data of the protein
|
|
28
26
|
public: whether the protein is public
|
|
@@ -32,7 +30,6 @@ class Protein(BaseModel):
|
|
|
32
30
|
created_at: datetime | None = None
|
|
33
31
|
used_in_workflow: bool | None = None
|
|
34
32
|
ancestor_uuid: str | None = None
|
|
35
|
-
sanitized: int | None = None
|
|
36
33
|
name: str | None = None
|
|
37
34
|
data: dict | None = None
|
|
38
35
|
public: bool | None = None
|
|
@@ -188,7 +185,6 @@ class Protein(BaseModel):
|
|
|
188
185
|
self.data = protein_data.get("data")
|
|
189
186
|
self.public = protein_data.get("public")
|
|
190
187
|
self.pocket = protein_data.get("pocket")
|
|
191
|
-
self.sanitized = protein_data.get("sanitized")
|
|
192
188
|
self.used_in_workflow = protein_data.get("used_in_workflow")
|
|
193
189
|
self._workflow_uuid = workflow_uuid
|
|
194
190
|
return self
|
|
@@ -241,118 +237,6 @@ class Protein(BaseModel):
|
|
|
241
237
|
response = client.delete(f"/protein/{self.uuid}")
|
|
242
238
|
response.raise_for_status()
|
|
243
239
|
|
|
244
|
-
def sanitize(self, poll_interval: float = 10.0, timeout: float = 300.0) -> None:
|
|
245
|
-
"""Sanitizes a protein and waits for the process to complete.
|
|
246
|
-
|
|
247
|
-
Protein sanitization runs asynchronously on the server. This method
|
|
248
|
-
submits the request then polls until sanitization succeeds, fails, or
|
|
249
|
-
times out.
|
|
250
|
-
|
|
251
|
-
Args:
|
|
252
|
-
poll_interval: seconds between status checks (default 10)
|
|
253
|
-
timeout: maximum seconds to wait before raising (default 300)
|
|
254
|
-
|
|
255
|
-
Raises:
|
|
256
|
-
RuntimeError: sanitization fails, is stopped, or times out
|
|
257
|
-
httpx.HTTPStatusError: any API request fails
|
|
258
|
-
"""
|
|
259
|
-
with api_client() as client:
|
|
260
|
-
response = client.post(f"/protein/sanitize/{self.uuid}")
|
|
261
|
-
response.raise_for_status()
|
|
262
|
-
|
|
263
|
-
deadline = time.monotonic() + timeout
|
|
264
|
-
while time.monotonic() < deadline:
|
|
265
|
-
time.sleep(poll_interval)
|
|
266
|
-
self.refresh()
|
|
267
|
-
match self.sanitized:
|
|
268
|
-
case 2: # success
|
|
269
|
-
return
|
|
270
|
-
case 3: # failed
|
|
271
|
-
raise RuntimeError(
|
|
272
|
-
f"Protein sanitization failed for {self.uuid}. "
|
|
273
|
-
"Check the protein in the Rowan UI for details."
|
|
274
|
-
)
|
|
275
|
-
case 4: # stopped
|
|
276
|
-
raise RuntimeError(f"Protein sanitization was stopped for {self.uuid}.")
|
|
277
|
-
case _: # 1 (in progress) or None: keep polling
|
|
278
|
-
pass
|
|
279
|
-
|
|
280
|
-
raise RuntimeError(f"Protein sanitization timed out after {timeout:.0f}s for {self.uuid}.")
|
|
281
|
-
|
|
282
|
-
def prepare(
|
|
283
|
-
self,
|
|
284
|
-
find_missing_residues: bool = True,
|
|
285
|
-
add_missing_atoms: bool = True,
|
|
286
|
-
remove_heterogens: bool = True,
|
|
287
|
-
keep_waters: bool = False,
|
|
288
|
-
remove_hydrogens: bool = False,
|
|
289
|
-
remove_invalid_hydrogens: bool = False,
|
|
290
|
-
add_hydrogens: bool = True,
|
|
291
|
-
add_hydrogen_ph: float = 7.0,
|
|
292
|
-
optimize_hydrogens: bool = True,
|
|
293
|
-
poll_interval: float = 10.0,
|
|
294
|
-
timeout: float = 300.0,
|
|
295
|
-
) -> None:
|
|
296
|
-
"""Quickly prepare a protein in place using PDBFixer and OpenMM.
|
|
297
|
-
|
|
298
|
-
Runs PDBFixer to fix nonstandard residues, add missing atoms/hydrogens,
|
|
299
|
-
and optionally optimizes hydrogen positions with OpenMM. This is the fast
|
|
300
|
-
preparation option and typically finishes in about a minute or less. Use
|
|
301
|
-
`submit_protein_preparation_workflow` for the full protein preparation workflow,
|
|
302
|
-
which can take around ten minutes but includes Boltz-2 missing-structure modeling,
|
|
303
|
-
terminal capping, selectable protonation methods, and retained non-polymers.
|
|
304
|
-
|
|
305
|
-
Args:
|
|
306
|
-
find_missing_residues: identify and model missing residues
|
|
307
|
-
add_missing_atoms: add missing heavy atoms to residues
|
|
308
|
-
remove_heterogens: remove ligands, salts, and other heterogens
|
|
309
|
-
keep_waters: preserve water molecules when removing heterogens
|
|
310
|
-
remove_hydrogens: remove all existing hydrogens before adding new ones
|
|
311
|
-
remove_invalid_hydrogens: remove hydrogens not matching the forcefield template
|
|
312
|
-
add_hydrogens: add missing hydrogen atoms
|
|
313
|
-
add_hydrogen_ph: pH used to determine protonation states when adding hydrogens
|
|
314
|
-
optimize_hydrogens: optimize hydrogen positions with OpenMM energy minimization
|
|
315
|
-
poll_interval: seconds between status checks (default 10)
|
|
316
|
-
timeout: maximum seconds to wait before raising (default 300)
|
|
317
|
-
|
|
318
|
-
Raises:
|
|
319
|
-
RuntimeError: preparation fails, is stopped, or times out
|
|
320
|
-
httpx.HTTPStatusError: any API request fails
|
|
321
|
-
"""
|
|
322
|
-
params = {
|
|
323
|
-
"find_missing_residues": find_missing_residues,
|
|
324
|
-
"add_missing_atoms": add_missing_atoms,
|
|
325
|
-
"remove_heterogens": remove_heterogens,
|
|
326
|
-
"keep_waters": keep_waters,
|
|
327
|
-
"remove_hydrogens": remove_hydrogens,
|
|
328
|
-
"remove_invalid_hydrogens": remove_invalid_hydrogens,
|
|
329
|
-
"add_hydrogens": add_hydrogens,
|
|
330
|
-
"add_hydrogen_ph": add_hydrogen_ph,
|
|
331
|
-
"optimize_hydrogens": optimize_hydrogens,
|
|
332
|
-
}
|
|
333
|
-
with api_client() as client:
|
|
334
|
-
response = client.post(f"/protein/prepare/{self.uuid}", params=params)
|
|
335
|
-
response.raise_for_status()
|
|
336
|
-
|
|
337
|
-
deadline = time.monotonic() + timeout
|
|
338
|
-
while time.monotonic() < deadline:
|
|
339
|
-
time.sleep(poll_interval)
|
|
340
|
-
self.refresh()
|
|
341
|
-
match self.sanitized:
|
|
342
|
-
case 2:
|
|
343
|
-
return
|
|
344
|
-
case 3:
|
|
345
|
-
raise RuntimeError(
|
|
346
|
-
f"Protein preparation failed for {self.uuid}. "
|
|
347
|
-
"Check the protein in the Rowan UI for details."
|
|
348
|
-
)
|
|
349
|
-
case 4:
|
|
350
|
-
raise RuntimeError(f"Protein preparation was stopped for {self.uuid}.")
|
|
351
|
-
case _:
|
|
352
|
-
pass
|
|
353
|
-
|
|
354
|
-
raise RuntimeError(f"Protein preparation timed out after {timeout:.0f}s for {self.uuid}.")
|
|
355
|
-
|
|
356
240
|
def validate_protein_forcefield(self, exclude_residues: list[str | int] | None = None) -> None:
|
|
357
241
|
"""Validate that this protein can be parameterized with the MD forcefield.
|
|
358
242
|
|
|
@@ -82,7 +82,8 @@ def submit_binding_affinity_workflow(
|
|
|
82
82
|
input modes are supported:
|
|
83
83
|
|
|
84
84
|
**Mode 1 – holo protein:** protein already contains the bound ligand. Pass
|
|
85
|
-
`ligand_residue_name` to identify which residue is the ligand vs. the receptor
|
|
85
|
+
`ligand_residue_name` to identify which residue is the ligand vs. the receptor,
|
|
86
|
+
and exactly one entry in `ligand_smiles` describing that bound ligand.
|
|
86
87
|
Do not pass `ligand_structures`.
|
|
87
88
|
|
|
88
89
|
**Mode 2 – apo protein + external poses:** protein has no bound ligand. Pass
|
|
@@ -101,13 +102,15 @@ def submit_binding_affinity_workflow(
|
|
|
101
102
|
protein: protein structure. Can be input as a UUID or a Protein object. Required
|
|
102
103
|
unless `protein_sequences` is set (mode 3)
|
|
103
104
|
ligand_residue_name: residue name identifying the ligand in a holo protein PDB
|
|
104
|
-
(mode 1 only)
|
|
105
|
+
(mode 1 only); requires exactly one matching `ligand_smiles` entry
|
|
105
106
|
ligand_structures: external ligand poses to score, already in the protein's
|
|
106
107
|
coordinate frame. Must have 3D coordinates (mode 2 only)
|
|
107
108
|
protein_sequences: protein sequences to score against, in place of `protein`
|
|
108
109
|
(mode 3, NESSO only)
|
|
109
|
-
ligand_smiles:
|
|
110
|
-
`
|
|
110
|
+
ligand_smiles: exactly one SMILES describing the bound ligand with
|
|
111
|
+
`ligand_residue_name` (mode 1, all methods), or ligand SMILES to score without
|
|
112
|
+
structural ligand inputs (mode 3, NESSO only). Not accepted with
|
|
113
|
+
`ligand_structures`
|
|
111
114
|
binding_affinity_settings: settings controlling how binding affinity is
|
|
112
115
|
computed: `SinglePointEnergySettings` (SQM), `GninaAffinitySettings`,
|
|
113
116
|
`AEVPLIGAffinitySettings`, or `NessoAffinitySettings`. Defaults to
|
|
@@ -150,9 +153,15 @@ def submit_binding_affinity_workflow(
|
|
|
150
153
|
binding_affinity_settings=binding_affinity_settings or SinglePointEnergySettings(),
|
|
151
154
|
)
|
|
152
155
|
|
|
156
|
+
workflow_data = workflow.model_dump(serialize_as_any=True, mode="json")
|
|
157
|
+
if isinstance(workflow.binding_affinity_settings, SinglePointEnergySettings):
|
|
158
|
+
workflow_data["binding_affinity_settings"]["truncation_radius"] = (
|
|
159
|
+
workflow.binding_affinity_settings.truncation_radius
|
|
160
|
+
)
|
|
161
|
+
|
|
153
162
|
data = {
|
|
154
163
|
"workflow_type": "binding_affinity",
|
|
155
|
-
"workflow_data":
|
|
164
|
+
"workflow_data": workflow_data,
|
|
156
165
|
"name": name,
|
|
157
166
|
"folder_uuid": folder_uuid,
|
|
158
167
|
"max_credits": max_credits,
|
|
@@ -142,13 +142,14 @@ def submit_protein_md_workflow(
|
|
|
142
142
|
nonbonded_cutoff: float = 8.0,
|
|
143
143
|
ionic_strength_M: float = 0.0,
|
|
144
144
|
water_buffer: float = 8.0,
|
|
145
|
+
frame_save_interval_ps: float = 10.0,
|
|
145
146
|
save_solvent: bool = False,
|
|
146
147
|
num_solvent_to_save: int | None = None,
|
|
147
148
|
small_molecules: dict[str | int, str | None] | None = None,
|
|
148
149
|
binder: Binder | None = None,
|
|
149
150
|
protein_restraint_cutoff: float | None = None,
|
|
150
151
|
protein_restraint_constant: float = 100,
|
|
151
|
-
analysis_interval_ps: float | None =
|
|
152
|
+
analysis_interval_ps: float | None = 100,
|
|
152
153
|
clustering: KMeansClusteringSettings | GreedyClusteringSettings | None = None,
|
|
153
154
|
validate_forcefield: bool = True,
|
|
154
155
|
name: str = "Protein MD Workflow",
|
|
@@ -178,6 +179,8 @@ def submit_protein_md_workflow(
|
|
|
178
179
|
nonbonded_cutoff: nonbonded cutoff for particle-mesh Ewald, in A
|
|
179
180
|
ionic_strength_M: ionic strength of the solution, in M (molar)
|
|
180
181
|
water_buffer: amount of water to add around the protein, in A
|
|
182
|
+
frame_save_interval_ps: how often to save a frame to the trajectory, in ps; must be
|
|
183
|
+
an integer multiple of timestep_fs
|
|
181
184
|
save_solvent: whether solvent should be saved
|
|
182
185
|
num_solvent_to_save: keep this many solvent molecules nearest the binder, or all if None;
|
|
183
186
|
only meaningful when save_solvent is True and a binder is present
|
|
@@ -191,8 +194,8 @@ def submit_protein_md_workflow(
|
|
|
191
194
|
protein_restraint_cutoff: cutoff distance from the binder past which Cα atoms are
|
|
192
195
|
harmonically restrained, in Å; None disables restraints
|
|
193
196
|
protein_restraint_constant: force constant for Cα backbone restraints, in kcal/mol/Ų
|
|
194
|
-
analysis_interval_ps: interval at which to compute per-frame SASA and polar SASA
|
|
195
|
-
None disables those analyses
|
|
197
|
+
analysis_interval_ps: interval at which to compute per-frame SASA and polar SASA
|
|
198
|
+
(default 100), in ps. None disables those analyses
|
|
196
199
|
clustering: how to cluster trajectory frames. None disables clustering; pass a
|
|
197
200
|
KMeansClusteringSettings (num_clusters) or GreedyClusteringSettings (cutoff_angstrom)
|
|
198
201
|
validate_forcefield: validate the protein forcefield
|
|
@@ -246,6 +249,7 @@ def submit_protein_md_workflow(
|
|
|
246
249
|
nonbonded_cutoff=nonbonded_cutoff,
|
|
247
250
|
ionic_strength_M=ionic_strength_M,
|
|
248
251
|
water_buffer=water_buffer,
|
|
252
|
+
frame_save_interval_ps=frame_save_interval_ps,
|
|
249
253
|
save_solvent=save_solvent,
|
|
250
254
|
num_solvent_to_save=num_solvent_to_save,
|
|
251
255
|
small_molecules=small_molecules,
|
|
@@ -75,7 +75,7 @@ def submit_protein_preparation_workflow(
|
|
|
75
75
|
"""Submit a protein-preparation workflow to the API.
|
|
76
76
|
|
|
77
77
|
Full protein preparation can take around ten minutes, depending on the structure and
|
|
78
|
-
settings.
|
|
78
|
+
settings.
|
|
79
79
|
|
|
80
80
|
Args:
|
|
81
81
|
protein: protein to prepare, as a UUID or Protein object
|