Rowan: Cloud-Native Molecular-Modeling and Drug-Design Workflows
Rowan is a cloud-native molecular modeling and medicinal-chemistry workflow platform with a Python API.
How to use it
- Hit Copy the whole skill.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit K-Dense-AI/scientific-agent-skills/skills/rowan#main ~/.claude/skills/rowanFor one project only, change the path to .claude/skills/rowan.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text399 lines
Rowan: Cloud-Native Molecular-Modeling and Drug-Design Workflows
Overview
Rowan is a cloud-native workflow platform for molecular simulation, medicinal chemistry, and structure-based design. Its Python API exposes a unified interface for small-molecule modeling, property prediction, docking, molecular dynamics, and AI structure workflows.
Use Rowan when you want to run medicinal-chemistry or molecular-design workflows programmatically without maintaining local HPC infrastructure, GPU provisioning, or a collection of separate modeling tools. Rowan handles all infrastructure, result management, and computation scaling.
When to use Rowan
Rowan is a good fit for:
- Quantum chemistry, semiempirical methods, or neural network potentials
- Batch property prediction (pKa, descriptors, permeability, solubility)
- Conformer and tautomer ensemble generation
- Docking workflows (single-ligand, analogue series, pose refinement)
- Protein-ligand cofolding and MSA generation
- Multi-step chemistry pipelines (e.g., tautomer search → docking → pose analysis)
- Batch medicinal-chemistry campaigns where you need consistent, scalable infrastructure
Rowan is not the right fit for:
- Simple molecular I/O (use RDKit directly)
- Post-HF ab initio quantum chemistry or relativistic calculations
Quick start
uv pip install rowan-python
import rowan
rowan.api_key = "your_api_key_here" # or set ROWAN_API_KEY env var
# Descriptors require a 3D Molecule, not a bare SMILES string.
mol = rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O")
wf = rowan.submit_descriptors_workflow(mol, name="aspirin")
result = wf.result()
print(result.descriptors["MW"]) # 180.042 — exact mass
print(result.descriptors["SLogP"]) # 1.31
print(result.descriptors["TopoPSA"]) # 63.6 — topological PSA
If that prints without error, you're set up correctly. These values and examples
were verified against rowan-python 3.1.13.
Installation
uv pip install rowan-python
# or: uv pip install rowan-python
User and webhook management
Authentication
Set an API key via environment variable (recommended):
export ROWAN_API_KEY="your_api_key_here"
Or set directly in Python:
import rowan
rowan.api_key = "your_api_key_here"
Verify authentication:
import rowan
user = rowan.whoami() # Returns user info if authenticated
print(f"User: {user.email}")
print(f"Credits available: {user.credits_available_string()}")
Molecule input formats
Rowan accepts molecules in the following formats:
- SMILES (preferred):
"CCO","c1ccccc1O" - SMARTS patterns (for some workflows): subset of SMARTS for substructure matching
- InChI (if supported in your API version):
"InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3"
The API validates molecule inputs and raises ValueError for an unparseable
SMILES or a workflow-incompatible input type. Always use canonicalized SMILES
for reproducibility.
SMILES strings versus molecule objects
Accepted input types vary by workflow in rowan-python 3.1.13. Only these
common workflows accept a bare string: pKa, conformer search, membrane
permeability, ADMET, LogP, macropKa, solubility, and pose-analysis MD. Most
others — including descriptors, tautomer search, docking, analogue docking,
BDE, NMR, and Fukui — require rowan.Molecule.from_smiles(smiles) or an RDKit
Mol/RWMol. A wrong type raises ValueError before submission.
Tip: Use RDKit to validate SMILES before submission:
from rdkit import Chem
smiles = "CCO"
mol = Chem.MolFromSmiles(smiles)
if mol is None:
raise ValueError(f"Invalid SMILES: {smiles}")
Core usage pattern
Most Rowan tasks follow the same three-step pattern:
- Submit a workflow
- Wait for completion (with optional streaming)
- Retrieve typed results with convenience properties
import rowan
# 1. Submit — use the specific workflow function (not the generic submit_workflow)
workflow = rowan.submit_descriptors_workflow(
rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O"),
name="aspirin descriptors",
)
# 2. & 3. Wait and retrieve
result = workflow.result() # Blocks until done (default: wait=True, poll_interval=5)
print(result.data) # Raw dict
print(result.descriptors["MW"]) # 180.042 exact mass; no result.molecular_weight property
For long-running workflows, use streaming:
for partial in workflow.stream_result(poll_interval=5):
print(f"Complete: {partial.complete}") # bool, not a percentage
print(partial.data)
result() vs. stream_result()
| Pattern | Use When | Duration |
|---|---|---|
result() |
You can wait for the full result | <5 min typical |
stream_result() |
You want progress feedback or need early partial results | >5 min, or interactive use |
Guideline: Use result() for descriptors, pKa. Use stream_result() for conformer search, docking, cofolding.
Working with results
Rowan's API includes typed workflow result objects with convenience properties.
Using typed properties and .data
Results have two access patterns:
- Convenience properties (recommended first):
result.descriptors,result.best_pose,result.scores. Result classes differ: conformer search usesget_energies()andget_conformers()methods. - Raw fallback:
result.data— raw dictionary from the API
Example:
result = rowan.submit_descriptors_workflow(
rowan.Molecule.from_smiles("CCO"),
name="ethanol",
).result()
# Convenience property (returns all descriptors):
print(result.descriptors["MW"]) # exact/monoisotopic mass
print(result.descriptors["SLogP"])
print(result.descriptors["TopoPSA"]) # usual topological PSA
# Raw data fallback:
print(result.data["descriptors"])
Note: DescriptorsResult does not have a molecular_weight property.
MW is exact/monoisotopic mass, not average molecular weight. TPSA is a 3D
charged-surface descriptor; use TopoPSA for the usual topological polar
surface area used in drug-likeness rules.
Cache invalidation
Some result properties are lazily loaded (e.g., conformer geometries, protein structures). To refresh:
result.clear_cache()
new_structures = result.get_conformers() # Refetched for ConformerSearchResult
Projects, folders, and organization
For nontrivial campaigns, use projects and folders to keep work organized.
Projects
import rowan
# Create a project
project = rowan.create_project(name="CDK2 lead optimization")
rowan.set_project("CDK2 lead optimization")
# All subsequent workflows go into this project
wf = rowan.submit_descriptors_workflow(
rowan.Molecule.from_smiles("CCO"), name="test compound"
)
# retrieve_project takes a UUID; list_workflows scopes with parent_uuid.
project = rowan.retrieve_project(project.uuid)
workflows = rowan.list_workflows(parent_uuid=project.uuid, size=50)
Folders
# Create a hierarchical folder structure
folder = rowan.create_folder(name="docking/batch_1/screening")
wf = rowan.submit_docking_workflow(
# ... docking params ...
folder=folder,
name="compound_001",
)
# List workflows in a folder
results = rowan.list_workflows(parent_uuid=folder.uuid)
Workflow decision trees
pKa vs. MacropKa
Use microscopic pKa when:
- You need the pKa of a single ionizable group
- You're interested in acid–base transitions and protonation thermodynamics
- The molecule has one or two ionizable sites
- Speed is critical (faster, fewer credits)
Use macropKa when:
- You need pH-dependent behavior across a physiologically relevant range (e.g., 0–14)
- You want aggregated charge and protonation-state populations across pH
- The molecule has multiple ionizable groups with coupled protonation
- You need downstream properties like aqueous solubility at different pH
Example decision:
Phenol (pKa ~10): Use microscopic pKa
Amine (pKa ~9–10): Use microscopic pKa
Multi-ionizable drug (N, O, acidic group): Use macropKa
ADME assessment across GI pH: Use macropKa
Conformer search vs. tautomer search
Use conformer search when:
- A single tautomeric form is known
- You need a diverse 3D ensemble for docking, MD, or SAR analysis
- Rotatable bonds dominate the chemical space
Use tautomer search when:
- Tautomeric equilibrium is uncertain (e.g., heterocycles, keto–enol systems)
- You need to model all relevant protonation isomers
- Downstream calculations (docking, pKa) depend on tautomeric form
Combined workflow:
# Step 1: Find best tautomer
taut_wf = rowan.submit_tautomer_search_workflow(
initial_molecule=rowan.Molecule.from_smiles("O=c1[nH]ccnc1"),
name="imidazole tautomers",
)
best_taut = taut_wf.result().best_tautomer
# Step 2: Generate conformers from best tautomer
conf_wf = rowan.submit_conformer_search_workflow(
initial_molecule=best_taut,
name="imidazole conformers",
)
Docking vs. analogue docking vs. cofolding
| Workflow | Use When | Input | Output |
|---|---|---|---|
| Docking | Single ligand, known pocket | Protein + SMILES + pocket coords | Pose, score, dG |
| Analogue docking | 5–100+ related compounds | Protein + SMILES list + reference ligand | All poses, reference-aligned |
| Protein-ligand cofolding | Sequence + ligand, no crystal structure | Protein sequence + SMILES | ML-predicted bound complex |
Protein utilities
Upload proteins
# From local PDB file
protein = rowan.upload_protein(
name="egfr_kinase_domain",
file_path="egfr_kinase.pdb",
)
# From PDB database
protein_from_pdb = rowan.create_protein_from_pdb_id(
name="CDK2 (1M17)",
code="1M17",
)
# Retrieve previously uploaded protein
protein = rowan.retrieve_protein("protein-uuid")
# List all proteins
my_proteins = rowan.list_proteins()
Protein preparation guidance
- File format: PDB, mmCIF (Rowan auto-detects)
- Water molecules: Rowan usually keeps relevant water; remove bulk water beforehand if desired
- Heteroatoms: Cofactors, ions, and bound ligands are usually preserved; remove unwanted heteroatoms before upload
- Multi-chain proteins: Fully supported
- Resolution: Works with NMR structures, homology models, and cryo-EM; quality matters for downstream predictions
- Validation: Rowan validates PDB syntax; severely malformed files may be rejected
Workflow catalog
Nine common workflow categories — descriptors, microscopic pKa, MacropKa, conformer search, tautomer search, docking, analogue docking, MSA generation, and protein-ligand cofolding — each with submission code and result shapes, plus the complete list of every supported workflow type (core modeling, structure-based design, advanced computational chemistry, reaction chemistry, advanced properties, binding free energy, and sequence and structural biology) are in references/workflow_catalog.md.
Batch submission, webhooks, and asynchronous work
Batch submit/poll/retrieve, the non-blocking fire-and-check pattern, webhook setup, secret creation and rotation, payload and signature verification (with a FastAPI handler), and webhook best practices are in references/batch_and_webhooks.md.
Access, pricing, and credits
Free-tier limits, credit consumption per workflow, and typical cost estimates are in references/access_and_pricing.md.
Worked example and troubleshooting
A full lead-optimization campaign — project setup, tautomers, pKa across an analogue series, result collection, and a docking follow-up — is in references/end_to_end_example.md.
Common errors with their fixes, and debugging tips, are in references/troubleshooting.md.
Recommended usage patterns
- Prefer Rowan-native workflows over low-level assembly when they exist
- Use projects and folders for any nontrivial campaign (>5 workflows)
- Use
result()to block until complete (default:wait=True, poll_interval=5) - Use typed result properties first, fall back to
.datafor unmapped fields - Use batch submission for compound libraries or analogue series
- Chain workflows for multi-step chemistry campaigns:
pKa → macropKa → permeability(ADME assessment)tautomer search → docking → pose-analysis MD(pose refinement)MSA generation → protein-ligand cofolding(AI structure prediction)
- Use webhooks for long-running campaigns (>50 workflows) or asynchronous pipelines
- Use streaming for interactive feedback on large conformer/docking searches
Summary
Use Rowan when your workflow requires cloud execution for molecular-design tasks, especially when you want one unified API and consistent result handling across small-molecule modeling, proteins, docking, ADME prediction, and ML structure generation.
Rowan is a molecular-design workflow platform, not just a remote chemistry engine. It handles infrastructure scaling, result persistence, and multi-step pipeline orchestration so you can focus on science.
| 1 | |
| 2 | name rowan |
| 3 | description Rowan is a cloud-native molecular modeling and medicinal-chemistry workflow platform with a Python API. Use for pKa and macropKa prediction, conformer and tautomer ensembles, docking and analogue docking, protein-ligand cofolding, MSA generation, molecular dynamics, permeability, descriptor workflows, and related small-molecule or protein modeling tasks. Ideal for programmatic batch screening, multi-step chemistry pipelines, and workflows that would otherwise require maintaining local HPC/GPU infrastructure. |
| 4 | license Proprietary (API key required) |
| 5 | compatibility Python 3.12+, API key required |
| 6 | metadata |
| 7 | version "1.5" |
| 8 | skill-author Rowan Science |
| 9 | trigger-keywords pKa prediction, molecular docking, conformer search, chemistry workflow, drug discovery, SMILES, protein structure, batch molecular modeling, cloud chemistry |
| 10 | openclaw |
| 11 | primaryEnv ROWAN_API_KEY |
| 12 | envVars |
| 13 | - name: ROWAN_API_KEY |
| 14 | required true |
| 15 | description Rowan computational chemistry API key. |
| 16 | |
| 17 | |
| 18 | # Rowan: Cloud-Native Molecular-Modeling and Drug-Design Workflows |
| 19 | |
| 20 | ## Overview |
| 21 | |
| 22 | Rowan is a cloud-native workflow platform for molecular simulation, medicinal chemistry, and structure-based design. Its Python API exposes a unified interface for small-molecule modeling, property prediction, docking, molecular dynamics, and AI structure workflows. |
| 23 | |
| 24 | Use Rowan when you want to run medicinal-chemistry or molecular-design workflows programmatically without maintaining local HPC infrastructure, GPU provisioning, or a collection of separate modeling tools. Rowan handles all infrastructure, result management, and computation scaling. |
| 25 | |
| 26 | ## When to use Rowan |
| 27 | |
| 28 | **Rowan is a good fit for:** |
| 29 | |
| 30 | Quantum chemistry, semiempirical methods, or neural network potentials |
| 31 | Batch property prediction (pKa, descriptors, permeability, solubility) |
| 32 | Conformer and tautomer ensemble generation |
| 33 | Docking workflows (single-ligand, analogue series, pose refinement) |
| 34 | Protein-ligand cofolding and MSA generation |
| 35 | Multi-step chemistry pipelines (e.g., tautomer search → docking → pose analysis) |
| 36 | Batch medicinal-chemistry campaigns where you need consistent, scalable infrastructure |
| 37 | |
| 38 | **Rowan is not the right fit for:** |
| 39 | Simple molecular I/O (use RDKit directly) |
| 40 | Post-HF *ab initio* quantum chemistry or relativistic calculations |
| 41 | |
| 42 | ## Quick start |
| 43 | |
| 44 | |
| 45 | uv pip install rowan-python |
| 46 | |
| 47 | |
| 48 | |
| 49 | import rowan |
| 50 | rowan.api_key = "your_api_key_here" # or set ROWAN_API_KEY env var |
| 51 | |
| 52 | # Descriptors require a 3D Molecule, not a bare SMILES string. |
| 53 | mol = rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O") |
| 54 | wf = rowan.submit_descriptors_workflow(mol, name="aspirin") |
| 55 | result = wf.result() |
| 56 | |
| 57 | print(result.descriptors["MW"]) # 180.042 — exact mass |
| 58 | print(result.descriptors["SLogP"]) # 1.31 |
| 59 | print(result.descriptors["TopoPSA"]) # 63.6 — topological PSA |
| 60 | |
| 61 | |
| 62 | If that prints without error, you're set up correctly. These values and examples |
| 63 | were verified against `rowan-python` 3.1.13. |
| 64 | |
| 65 | ## Installation |
| 66 | |
| 67 | |
| 68 | uv pip install rowan-python |
| 69 | # or: uv pip install rowan-python |
| 70 | |
| 71 | |
| 72 | ## User and webhook management |
| 73 | |
| 74 | ### Authentication |
| 75 | |
| 76 | Set an API key via environment variable (recommended): |
| 77 | |
| 78 | |
| 79 | export ROWAN_API_KEY="your_api_key_here" |
| 80 | |
| 81 | |
| 82 | Or set directly in Python: |
| 83 | |
| 84 | |
| 85 | import rowan |
| 86 | rowan.api_key = "your_api_key_here" |
| 87 | |
| 88 | |
| 89 | Verify authentication: |
| 90 | |
| 91 | |
| 92 | import rowan |
| 93 | user = rowan.whoami() # Returns user info if authenticated |
| 94 | print(f"User: {user.email}") |
| 95 | print(f"Credits available: {user.credits_available_string()}") |
| 96 | |
| 97 | |
| 98 | ## Molecule input formats |
| 99 | |
| 100 | Rowan accepts molecules in the following formats: |
| 101 | |
| 102 | **SMILES** (preferred): `"CCO"`, `"c1ccccc1O"` |
| 103 | **SMARTS patterns** (for some workflows): subset of SMARTS for substructure matching |
| 104 | **InChI** (if supported in your API version): `"InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3"` |
| 105 | |
| 106 | The API validates molecule inputs and raises `ValueError` for an unparseable |
| 107 | SMILES or a workflow-incompatible input type. Always use canonicalized SMILES |
| 108 | for reproducibility. |
| 109 | |
| 110 | ### SMILES strings versus molecule objects |
| 111 | |
| 112 | Accepted input types vary by workflow in `rowan-python` 3.1.13. Only these |
| 113 | common workflows accept a bare string: pKa, conformer search, membrane |
| 114 | permeability, ADMET, LogP, macropKa, solubility, and pose-analysis MD. Most |
| 115 | others — including descriptors, tautomer search, docking, analogue docking, |
| 116 | BDE, NMR, and Fukui — require `rowan.Molecule.from_smiles(smiles)` or an RDKit |
| 117 | `Mol`/`RWMol`. A wrong type raises `ValueError` before submission. |
| 118 | |
| 119 | **Tip:** Use RDKit to validate SMILES before submission: |
| 120 | |
| 121 | |
| 122 | from rdkit import Chem |
| 123 | smiles = "CCO" |
| 124 | mol = Chem.MolFromSmiles(smiles) |
| 125 | if mol is None: |
| 126 | raise ValueError(f"Invalid SMILES: {smiles}") |
| 127 | |
| 128 | |
| 129 | ## Core usage pattern |
| 130 | |
| 131 | Most Rowan tasks follow the same three-step pattern: |
| 132 | |
| 133 | **Submit** a workflow |
| 134 | **Wait** for completion (with optional streaming) |
| 135 | **Retrieve** typed results with convenience properties |
| 136 | |
| 137 | |
| 138 | import rowan |
| 139 | |
| 140 | # 1. Submit — use the specific workflow function (not the generic submit_workflow) |
| 141 | workflow = rowan.submit_descriptors_workflow( |
| 142 | rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O"), |
| 143 | name="aspirin descriptors", |
| 144 | ) |
| 145 | |
| 146 | # 2. & 3. Wait and retrieve |
| 147 | result = workflow.result() # Blocks until done (default: wait=True, poll_interval=5) |
| 148 | print(result.data) # Raw dict |
| 149 | print(result.descriptors["MW"]) # 180.042 exact mass; no result.molecular_weight property |
| 150 | |
| 151 | |
| 152 | For long-running workflows, use streaming: |
| 153 | |
| 154 | |
| 155 | for partial in workflow.stream_result(poll_interval=5): |
| 156 | print(f"Complete: {partial.complete}") # bool, not a percentage |
| 157 | print(partial.data) |
| 158 | |
| 159 | |
| 160 | ### result() vs. stream_result() |
| 161 | |
| 162 | | Pattern | Use When | Duration | |
| 163 | |---------|----------|----------| |
| 164 | | `result()` | You can wait for the full result | <5 min typical | |
| 165 | | `stream_result()` | You want progress feedback or need early partial results | >5 min, or interactive use | |
| 166 | |
| 167 | **Guideline:** Use `result()` for descriptors, pKa. Use `stream_result()` for conformer search, docking, cofolding. |
| 168 | |
| 169 | ## Working with results |
| 170 | |
| 171 | Rowan's API includes **typed workflow result objects** with convenience properties. |
| 172 | |
| 173 | ### Using typed properties and .data |
| 174 | |
| 175 | Results have two access patterns: |
| 176 | |
| 177 | **Convenience properties** (recommended first): `result.descriptors`, `result.best_pose`, `result.scores`. Result classes differ: conformer search uses `get_energies()` and `get_conformers()` methods. |
| 178 | **Raw fallback**: `result.data` — raw dictionary from the API |
| 179 | |
| 180 | Example: |
| 181 | |
| 182 | |
| 183 | result = rowan.submit_descriptors_workflow( |
| 184 | rowan.Molecule.from_smiles("CCO"), |
| 185 | name="ethanol", |
| 186 | ).result() |
| 187 | |
| 188 | # Convenience property (returns all descriptors): |
| 189 | print(result.descriptors["MW"]) # exact/monoisotopic mass |
| 190 | print(result.descriptors["SLogP"]) |
| 191 | print(result.descriptors["TopoPSA"]) # usual topological PSA |
| 192 | |
| 193 | # Raw data fallback: |
| 194 | print(result.data["descriptors"]) |
| 195 | |
| 196 | |
| 197 | **Note:** `DescriptorsResult` does **not** have a `molecular_weight` property. |
| 198 | `MW` is exact/monoisotopic mass, not average molecular weight. `TPSA` is a 3D |
| 199 | charged-surface descriptor; use `TopoPSA` for the usual topological polar |
| 200 | surface area used in drug-likeness rules. |
| 201 | |
| 202 | ### Cache invalidation |
| 203 | |
| 204 | Some result properties are lazily loaded (e.g., conformer geometries, protein structures). To refresh: |
| 205 | |
| 206 | |
| 207 | result.clear_cache() |
| 208 | new_structures = result.get_conformers() # Refetched for ConformerSearchResult |
| 209 | |
| 210 | |
| 211 | ## Projects, folders, and organization |
| 212 | |
| 213 | For nontrivial campaigns, use projects and folders to keep work organized. |
| 214 | |
| 215 | ### Projects |
| 216 | |
| 217 | |
| 218 | import rowan |
| 219 | |
| 220 | # Create a project |
| 221 | project = rowan.create_project(name="CDK2 lead optimization") |
| 222 | rowan.set_project("CDK2 lead optimization") |
| 223 | |
| 224 | # All subsequent workflows go into this project |
| 225 | wf = rowan.submit_descriptors_workflow( |
| 226 | rowan.Molecule.from_smiles("CCO"), name="test compound" |
| 227 | ) |
| 228 | |
| 229 | # retrieve_project takes a UUID; list_workflows scopes with parent_uuid. |
| 230 | project = rowan.retrieve_project(project.uuid) |
| 231 | workflows = rowan.list_workflows(parent_uuid=project.uuid, size=50) |
| 232 | |
| 233 | |
| 234 | ### Folders |
| 235 | |
| 236 | |
| 237 | # Create a hierarchical folder structure |
| 238 | folder = rowan.create_folder(name="docking/batch_1/screening") |
| 239 | |
| 240 | wf = rowan.submit_docking_workflow( |
| 241 | # ... docking params ... |
| 242 | folder=folder, |
| 243 | name="compound_001", |
| 244 | ) |
| 245 | |
| 246 | # List workflows in a folder |
| 247 | results = rowan.list_workflows(parent_uuid=folder.uuid) |
| 248 | |
| 249 | |
| 250 | ## Workflow decision trees |
| 251 | |
| 252 | ### pKa vs. MacropKa |
| 253 | |
| 254 | **Use microscopic pKa when:** |
| 255 | |
| 256 | You need the pKa of a single ionizable group |
| 257 | You're interested in acid–base transitions and protonation thermodynamics |
| 258 | The molecule has one or two ionizable sites |
| 259 | Speed is critical (faster, fewer credits) |
| 260 | |
| 261 | **Use macropKa when:** |
| 262 | |
| 263 | You need pH-dependent behavior across a physiologically relevant range (e.g., 0–14) |
| 264 | You want aggregated charge and protonation-state populations across pH |
| 265 | The molecule has multiple ionizable groups with coupled protonation |
| 266 | You need downstream properties like aqueous solubility at different pH |
| 267 | |
| 268 | **Example decision:** |
| 269 | |
| 270 | |
| 271 | Phenol (pKa ~10): Use microscopic pKa |
| 272 | Amine (pKa ~9–10): Use microscopic pKa |
| 273 | Multi-ionizable drug (N, O, acidic group): Use macropKa |
| 274 | ADME assessment across GI pH: Use macropKa |
| 275 | |
| 276 | |
| 277 | ### Conformer search vs. tautomer search |
| 278 | |
| 279 | **Use conformer search when:** |
| 280 | |
| 281 | A single tautomeric form is known |
| 282 | You need a diverse 3D ensemble for docking, MD, or SAR analysis |
| 283 | Rotatable bonds dominate the chemical space |
| 284 | |
| 285 | **Use tautomer search when:** |
| 286 | |
| 287 | Tautomeric equilibrium is uncertain (e.g., heterocycles, keto–enol systems) |
| 288 | You need to model all relevant protonation isomers |
| 289 | Downstream calculations (docking, pKa) depend on tautomeric form |
| 290 | |
| 291 | **Combined workflow:** |
| 292 | |
| 293 | |
| 294 | # Step 1: Find best tautomer |
| 295 | taut_wf = rowan.submit_tautomer_search_workflow( |
| 296 | initial_molecule=rowan.Molecule.from_smiles("O=c1[nH]ccnc1"), |
| 297 | name="imidazole tautomers", |
| 298 | ) |
| 299 | best_taut = taut_wf.result().best_tautomer |
| 300 | |
| 301 | # Step 2: Generate conformers from best tautomer |
| 302 | conf_wf = rowan.submit_conformer_search_workflow( |
| 303 | initial_molecule=best_taut, |
| 304 | name="imidazole conformers", |
| 305 | ) |
| 306 | |
| 307 | |
| 308 | ### Docking vs. analogue docking vs. cofolding |
| 309 | |
| 310 | | Workflow | Use When | Input | Output | |
| 311 | |----------|----------|-------|--------| |
| 312 | | Docking | Single ligand, known pocket | Protein + SMILES + pocket coords | Pose, score, dG | |
| 313 | | Analogue docking | 5–100+ related compounds | Protein + SMILES list + reference ligand | All poses, reference-aligned | |
| 314 | | Protein-ligand cofolding | Sequence + ligand, no crystal structure | Protein sequence + SMILES | ML-predicted bound complex | |
| 315 | |
| 316 | ## Protein utilities |
| 317 | |
| 318 | ### Upload proteins |
| 319 | |
| 320 | |
| 321 | # From local PDB file |
| 322 | protein = rowan.upload_protein( |
| 323 | name="egfr_kinase_domain", |
| 324 | file_path="egfr_kinase.pdb", |
| 325 | ) |
| 326 | |
| 327 | # From PDB database |
| 328 | protein_from_pdb = rowan.create_protein_from_pdb_id( |
| 329 | name="CDK2 (1M17)", |
| 330 | code="1M17", |
| 331 | ) |
| 332 | |
| 333 | # Retrieve previously uploaded protein |
| 334 | protein = rowan.retrieve_protein("protein-uuid") |
| 335 | |
| 336 | # List all proteins |
| 337 | my_proteins = rowan.list_proteins() |
| 338 | |
| 339 | |
| 340 | ### Protein preparation guidance |
| 341 | |
| 342 | **File format**: PDB, mmCIF (Rowan auto-detects) |
| 343 | **Water molecules**: Rowan usually keeps relevant water; remove bulk water beforehand if desired |
| 344 | **Heteroatoms**: Cofactors, ions, and bound ligands are usually preserved; remove unwanted heteroatoms before upload |
| 345 | **Multi-chain proteins**: Fully supported |
| 346 | **Resolution**: Works with NMR structures, homology models, and cryo-EM; quality matters for downstream predictions |
| 347 | **Validation**: Rowan validates PDB syntax; severely malformed files may be rejected |
| 348 | |
| 349 | ## Workflow catalog |
| 350 | |
| 351 | Nine common workflow categories — descriptors, microscopic pKa, MacropKa, conformer |
| 352 | search, tautomer search, docking, analogue docking, MSA generation, and protein-ligand |
| 353 | cofolding — each with submission code and result shapes, plus the complete list of every |
| 354 | supported workflow type (core modeling, structure-based design, advanced computational |
| 355 | chemistry, reaction chemistry, advanced properties, binding free energy, and sequence and |
| 356 | structural biology) are in |
| 357 | [references/workflow_catalog.md]. |
| 358 | |
| 359 | ## Batch submission, webhooks, and asynchronous work |
| 360 | |
| 361 | Batch submit/poll/retrieve, the non-blocking fire-and-check pattern, webhook setup, |
| 362 | secret creation and rotation, payload and signature verification (with a FastAPI |
| 363 | handler), and webhook best practices are in |
| 364 | [references/batch_and_webhooks.md]. |
| 365 | |
| 366 | ## Access, pricing, and credits |
| 367 | |
| 368 | Free-tier limits, credit consumption per workflow, and typical cost estimates are in |
| 369 | [references/access_and_pricing.md]. |
| 370 | |
| 371 | ## Worked example and troubleshooting |
| 372 | |
| 373 | A full lead-optimization campaign — project setup, tautomers, pKa across an analogue |
| 374 | series, result collection, and a docking follow-up — is in |
| 375 | [references/end_to_end_example.md]. |
| 376 | |
| 377 | Common errors with their fixes, and debugging tips, are in |
| 378 | [references/troubleshooting.md]. |
| 379 | |
| 380 | ## Recommended usage patterns |
| 381 | |
| 382 | **Prefer Rowan-native workflows** over low-level assembly when they exist |
| 383 | **Use projects and folders** for any nontrivial campaign (>5 workflows) |
| 384 | **Use `result()` to block until complete** (default: `wait=True, poll_interval=5`) |
| 385 | **Use typed result properties first**, fall back to `.data` for unmapped fields |
| 386 | **Use batch submission** for compound libraries or analogue series |
| 387 | **Chain workflows** for multi-step chemistry campaigns: |
| 388 | `pKa → macropKa → permeability` (ADME assessment) |
| 389 | `tautomer search → docking → pose-analysis MD` (pose refinement) |
| 390 | `MSA generation → protein-ligand cofolding` (AI structure prediction) |
| 391 | **Use webhooks** for long-running campaigns (>50 workflows) or asynchronous pipelines |
| 392 | **Use streaming** for interactive feedback on large conformer/docking searches |
| 393 | |
| 394 | ## Summary |
| 395 | |
| 396 | Use Rowan when your workflow requires cloud execution for molecular-design tasks, especially when you want one unified API and consistent result handling across small-molecule modeling, proteins, docking, ADME prediction, and ML structure generation. |
| 397 | |
| 398 | Rowan is a molecular-design workflow platform, not just a remote chemistry engine. It handles infrastructure scaling, result persistence, and multi-step pipeline orchestration so you can focus on science. |
| 399 |