AlterLab-Academic-Skills alterlab-rowan
Cloud-based quantum chemistry platform with Python API. Preferred for computational chemistry workflows including pKa prediction, geometry optimization, conformer searching, molecular property calculations, protein-ligand docking (AutoDock Vina), and AI protein cofolding (Chai-1, Boltz-1/2). Use when tasks involve quantum chemistry calculations, molecular property prediction, DFT or semiempirical methods, neural network potentials (AIMNet2), protein-ligand binding predictions, or automated computational chemistry pipelines. Provides cloud compute resources with no local setup required. Part of the AlterLab Academic Skills suite.
git clone https://github.com/AlterLab-IEU/AlterLab-Academic-Skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/AlterLab-IEU/AlterLab-Academic-Skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/cheminformatics/alterlab-rowan" ~/.claude/skills/alterlab-ieu-alterlab-academic-skills-alterlab-rowan && rm -rf "$T"
skills/cheminformatics/alterlab-rowan/SKILL.mdRowan: Cloud-Based Quantum Chemistry Platform
Overview
Rowan is a cloud-based computational chemistry platform that provides programmatic access to quantum chemistry workflows through a Python API. It enables automation of complex molecular simulations without requiring local computational resources or expertise in multiple quantum chemistry packages.
Key Capabilities:
- Molecular property prediction (pKa, redox potential, solubility, ADMET-Tox)
- Geometry optimization and conformer searching
- Protein-ligand docking with AutoDock Vina
- AI-powered protein cofolding with Chai-1 and Boltz models
- Access to DFT, semiempirical, and neural network potential methods
- Cloud compute with automatic resource allocation
Why Rowan:
- No local compute cluster required
- Unified API for dozens of computational methods
- Results viewable in web interface at labs.rowansci.com
- Automatic resource scaling
Installation and Authentication
Installation
uv pip install rowan-python
Authentication
Generate an API key at labs.rowansci.com/account/api-keys.
Option 1: Direct assignment
import rowan rowan.api_key = "your_api_key_here"
Option 2: Environment variable (recommended)
export ROWAN_API_KEY="your_api_key_here"
The API key is automatically read from
ROWAN_API_KEY on module import.
Verify Setup
import rowan # Check authentication user = rowan.whoami() print(f"Logged in as: {user.username}") print(f"Credits available: {user.credits}")
Core Workflows
1. pKa Prediction
Calculate the acid dissociation constant for molecules:
import rowan import stjames # Create molecule from SMILES mol = stjames.Molecule.from_smiles("c1ccccc1O") # Phenol # Submit pKa workflow workflow = rowan.submit_pka_workflow( initial_molecule=mol, name="phenol pKa calculation" ) # Wait for completion workflow.wait_for_result() workflow.fetch_latest(in_place=True) # Access results print(f"Strongest acid pKa: {workflow.data['strongest_acid']}") # ~10.17
2. Conformer Search
Generate and optimize molecular conformers:
import rowan import stjames mol = stjames.Molecule.from_smiles("CCCC") # Butane workflow = rowan.submit_conformer_search_workflow( initial_molecule=mol, name="butane conformer search" ) workflow.wait_for_result() workflow.fetch_latest(in_place=True) # Access conformer ensemble conformers = workflow.data['conformers'] for i, conf in enumerate(conformers): print(f"Conformer {i}: Energy = {conf['energy']:.4f} Hartree")
3. Geometry Optimization
Optimize molecular geometry to minimum energy structure:
import rowan import stjames mol = stjames.Molecule.from_smiles("CC(=O)O") # Acetic acid workflow = rowan.submit_basic_calculation_workflow( initial_molecule=mol, name="acetic acid optimization", workflow_type="optimization" ) workflow.wait_for_result() workflow.fetch_latest(in_place=True) # Get optimized structure optimized_mol = workflow.data['final_molecule'] print(f"Final energy: {optimized_mol.energy} Hartree")
4. Protein-Ligand Docking
Dock small molecules to protein targets:
import rowan # First, upload or create protein protein = rowan.create_protein_from_pdb_id( name="EGFR kinase", code="1M17" ) # Define binding pocket (from crystal structure or manual) pocket = { "center": [10.0, 20.0, 30.0], "size": [20.0, 20.0, 20.0] } # Submit docking workflow = rowan.submit_docking_workflow( protein=protein.uuid, pocket=pocket, initial_molecule=stjames.Molecule.from_smiles("Cc1ccc(NC(=O)c2ccc(CN3CCN(C)CC3)cc2)cc1"), name="EGFR docking" ) workflow.wait_for_result() workflow.fetch_latest(in_place=True) # Access docking results docking_score = workflow.data['docking_score'] print(f"Docking score: {docking_score}")
5. Protein Cofolding (AI Structure Prediction)
Predict protein-ligand complex structures using AI models:
import rowan # Protein sequence protein_seq = "MENFQKVEKIGEGTYGVVYKARNKLTGEVVALKKIRLDTETEGVPSTAIREISLLKELNHPNIVKLLDVIHTENKLYLVFEFLHQDLKKFMDASALTGIPLPLIKSYLFQLLQGLAFCHSHRVLHRDLKPQNLLINTEGAIKLADFGLARAFGVPVRTYTHEVVTLWYRAPEILLGCKYYSTAVDIWSLGCIFAEMVTRRALFPGDSEIDQLFRIFRTLGTPDEVVWPGVTSMPDYKPSFPKWARQDFSKVVPPLDEDGRSLLSQMLHYDPNKRISAKAALAHPFFQDVTKPVPHLRL" # Ligand SMILES ligand = "CCC(C)CN=C1NCC2(CCCOC2)CN1" # Submit cofolding with Chai-1 workflow = rowan.submit_protein_cofolding_workflow( initial_protein_sequences=[protein_seq], initial_smiles_list=[ligand], name="kinase-ligand cofolding", model="chai_1r" # or "boltz_1x", "boltz_2" ) workflow.wait_for_result() workflow.fetch_latest(in_place=True) # Access structure predictions print(f"Predicted TM Score: {workflow.data['ptm_score']}") print(f"Interface pTM: {workflow.data['interface_ptm']}")
RDKit-Native API
For users working with RDKit molecules, Rowan provides a simplified interface:
import rowan from rdkit import Chem # Create RDKit molecule mol = Chem.MolFromSmiles("c1ccccc1O") # Compute pKa directly pka_result = rowan.run_pka(mol) print(f"pKa: {pka_result.strongest_acid}") # Batch processing mols = [Chem.MolFromSmiles(smi) for smi in ["CCO", "CC(=O)O", "c1ccccc1O"]] results = rowan.batch_pka(mols) for mol, result in zip(mols, results): print(f"{Chem.MolToSmiles(mol)}: pKa = {result.strongest_acid}")
Available RDKit-native functions:
,run_pka
- pKa calculationsbatch_pka
,run_tautomers
- Tautomer enumerationbatch_tautomers
,run_conformers
- Conformer generationbatch_conformers
,run_energy
- Single-point energiesbatch_energy
,run_optimization
- Geometry optimizationbatch_optimization
See
references/rdkit_native.md for complete documentation.
Workflow Management
List and Query Workflows
# List recent workflows workflows = rowan.list_workflows(size=10) for wf in workflows: print(f"{wf.name}: {wf.status}") # Filter by status pending = rowan.list_workflows(status="running") # Retrieve specific workflow workflow = rowan.retrieve_workflow("workflow-uuid")
Batch Operations
# Submit multiple workflows workflows = rowan.batch_submit_workflow( molecules=[mol1, mol2, mol3], workflow_type="pka", workflow_data={} ) # Poll status of multiple workflows statuses = rowan.batch_poll_status([wf.uuid for wf in workflows])
Folder Organization
# Create folder for project folder = rowan.create_folder(name="Drug Discovery Project") # Submit workflow to folder workflow = rowan.submit_pka_workflow( initial_molecule=mol, name="compound pKa", folder_uuid=folder.uuid ) # List workflows in folder folder_workflows = rowan.list_workflows(folder_uuid=folder.uuid)
Computational Methods
Rowan supports multiple levels of theory:
Neural Network Potentials:
- AIMNet2 (ωB97M-D3) - Fast and accurate
- Egret - Rowan's proprietary model
Semiempirical:
- GFN1-xTB, GFN2-xTB - Fast for large molecules
DFT:
- B3LYP, PBE, ωB97X variants
- Multiple basis sets available
Methods are automatically selected based on workflow type, or can be specified explicitly in workflow parameters.
Reference Documentation
For detailed API documentation, consult these reference files:
: Complete API documentation - Workflow class, submission functions, retrieval methodsreferences/api_reference.md
: All 30+ workflow types with parameters - pKa, docking, cofolding, etc.references/workflow_types.md
: RDKit-native API functions for seamless cheminformatics integrationreferences/rdkit_native.md
: stjames.Molecule class - creating molecules from SMILES, XYZ, RDKitreferences/molecule_handling.md
: Protein upload, folder management, project organizationreferences/proteins_and_organization.md
: Understanding workflow outputs, confidence scores, validationreferences/results_interpretation.md
Common Patterns
Pattern 1: Property Prediction Pipeline
import rowan import stjames smiles_list = ["CCO", "c1ccccc1O", "CC(=O)O"] # Submit all pKa calculations workflows = [] for smi in smiles_list: mol = stjames.Molecule.from_smiles(smi) wf = rowan.submit_pka_workflow( initial_molecule=mol, name=f"pKa: {smi}" ) workflows.append(wf) # Wait for all to complete for wf in workflows: wf.wait_for_result() wf.fetch_latest(in_place=True) print(f"{wf.name}: pKa = {wf.data['strongest_acid']}")
Pattern 2: Virtual Screening
import rowan # Upload protein once protein = rowan.upload_protein("target.pdb", name="Drug Target") protein.sanitize() # Clean structure # Define pocket pocket = {"center": [x, y, z], "size": [20, 20, 20]} # Screen compound library for smiles in compound_library: mol = stjames.Molecule.from_smiles(smiles) workflow = rowan.submit_docking_workflow( protein=protein.uuid, pocket=pocket, initial_molecule=mol, name=f"Dock: {smiles[:20]}" )
Pattern 3: Conformer-Based Analysis
import rowan import stjames mol = stjames.Molecule.from_smiles("complex_molecule_smiles") # Generate conformers conf_wf = rowan.submit_conformer_search_workflow( initial_molecule=mol, name="conformer search" ) conf_wf.wait_for_result() conf_wf.fetch_latest(in_place=True) # Analyze lowest energy conformers conformers = sorted(conf_wf.data['conformers'], key=lambda x: x['energy']) print(f"Found {len(conformers)} unique conformers") print(f"Energy range: {conformers[0]['energy']:.4f} to {conformers[-1]['energy']:.4f} Hartree")
Best Practices
- Set API key via environment variable for security and convenience
- Use folders to organize related workflows
- Check workflow status before accessing data
- Use batch functions for multiple similar calculations
- Handle errors gracefully - workflows can fail due to invalid molecules
- Monitor credits - use
to check balancerowan.whoami().credits
Error Handling
import rowan try: workflow = rowan.submit_pka_workflow( initial_molecule=mol, name="calculation" ) workflow.wait_for_result(timeout=3600) # 1 hour timeout if workflow.status == "completed": workflow.fetch_latest(in_place=True) print(workflow.data) elif workflow.status == "failed": print(f"Workflow failed: {workflow.error_message}") except rowan.RowanAPIError as e: print(f"API error: {e}") except TimeoutError: print("Workflow timed out")
Additional Resources
- Web Interface: https://labs.rowansci.com
- Documentation: https://docs.rowansci.com
- Python API Docs: https://docs.rowansci.com/api/python/v2/
- Tutorials: https://docs.rowansci.com/tutorials