Loading...
Loading...
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.
npx skill4agent add k-dense-ai/claude-scientific-skills rowanuv pip install rowan-pythonimport rowan
rowan.api_key = "your_api_key_here"export ROWAN_API_KEY="your_api_key_here"ROWAN_API_KEYimport rowan
# Check authentication
user = rowan.whoami()
print(f"Logged in as: {user.username}")
print(f"Credits available: {user.credits}")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.17import 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")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")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}")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']}")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}")run_pkabatch_pkarun_tautomersbatch_tautomersrun_conformersbatch_conformersrun_energybatch_energyrun_optimizationbatch_optimizationreferences/rdkit_native.md# 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")# 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])# 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)references/api_reference.mdreferences/workflow_types.mdreferences/rdkit_native.mdreferences/molecule_handling.mdreferences/proteins_and_organization.mdreferences/results_interpretation.mdimport 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']}")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]}"
)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")rowan.whoami().creditsimport 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")