Preparing SMILES Strings For Downstream Applications

by Corin Wagen · Oct 3, 2025

The SMILES format is one of the most common ways to represent molecules in large chemical libraries. One challenge associated with storing molecules in SMILES format is that different tautomers and protonation states all have different SMILES representations, although these strings all represent the same fundamental chemical species. For modeling solution-phase properties like solubility, toxicity, or binding affinity, scientists typically prefer to use the SMILES that best represents the actual protonation state and tautomer of the compound in solution.

Unfortunately, identifying the precise protonation state of a molecule can be challenging to accomplish at scale. While SMILES strings can easily be converted into the "canonical" SMILES form in the RDKit, the canonical SMILES doesn't necessarily represent what will actually be in solution. For instance, the canonical SMILES for trimethylamine is CN(C)C, while the species which will predominate at pH 7.4 is the protonated microstate C[NH+](C)C. Correctly identifying this SMILES string in a black-box fashion requires determining the relative acidity and basicity of various sites, a complex and non-trivial challenge which cheminformatics packages like the RDKit don't attempt to solve.

Rowan's macroscopic pKa workflow provides a simple and robust way to automatically convert molecules to the protonation state and tautomer predicted to predominate at a given pH. Here's a simple Python script that uses Rowan's API to convert a SMILES string into the preferred protonation state:

import rowan

# Set ROWAN_API_KEY environment variable to your API key or set rowan.api_key directly
# rowan.api_key = "rowan-sk..."

def get_best_microstate(smiles: str, target_ph: float=7.4) -> str:
    """
    Converts a given input SMILES string to the most populated microstate at a given pH.

    :param smiles: the input SMILES string
    :param target_ph: the pH at which to assess microstate distribution
    :returns: the SMILES of the microstate
    """

    result = rowan.submit_macropka_workflow(
        initial_smiles=smiles,
        name="example macropka",
    )

    result.wait_for_result().fetch_latest(in_place=True)

    for ph, microstate_weights in result.data["microstate_weights_by_pH"]:
        if abs(target_ph - ph) < 0.01:
            ms = result.data["microstates"][microstate_weights.index(max(microstate_weights))]
            return ms["smiles"]


print(f"best microstate is {get_best_microstate('CN(C)C')}")

As expected, running the above Python script quickly returns:

best microstate is C[NH+](C)C

For small to medium-sized molecules, each macro-pKa calculation takes approximately 20 seconds (or 0.3 credits on Rowan). This is fast enough that this workflow can be run on thousands or tens of thousands of molecules, letting scientists quickly run these calculations before initializing a docking screen or training an ML model.

Rowan's macroscopic pKa workflow is available to all subscribers. If your work requires studying large numbers of molecules under physiological conditions, consider subscribing to Rowan or reaching out about a plan for your organization! We'd love to partner with you and support your science.

Banner background image

Subscribe to Rowan

To run this workflow and other advanced workflows on your own molecules, subscribe to Rowan today.

Start computing →

What to read next

Modeling Carbonyl–Olefin Metathesis with Neural Network Potentials

Modeling Carbonyl–Olefin Metathesis with Neural Network Potentials

Reproducing a tricky mechanistic result from grad school with LLMs and NNPs.
Nov 2, 2026 · Corin Wagen
Do Co-folding Models Notice When You Change the Pocket?

Do Co-folding Models Notice When You Change the Pocket?

Running published pocket-mutation tests on six co-folding models in Rowan.
Nov 2, 2026 · Spencer Schneider
Modeling Selectivity with Low-Cost Binding-Affinity Methods

Modeling Selectivity with Low-Cost Binding-Affinity Methods

Exploring whether Vina, Gnina, Boltz, Nesso, or UMA can capture trends in JAK1/JAK2 selectivity.
Oct 28, 2026 · Ari Wagen
Making FEP Better

Making FEP Better

RESP charges, per-ligand custom forcefields, & cofactors in FEP; natural transition orbitals and transition densities; probing LLM capabilities in folding proteins; design for nighthawks
Oct 20, 2026 · Corin Wagen, Eli Mann, Jonathon Vandezande, Ari Wagen, and Ishaan Ganti
Persistent Hydration Sites and Water Exchange in Daraxonrasib Simulations

Persistent Hydration Sites and Water Exchange in Daraxonrasib Simulations

A site can stay occupied even as individual water molecules come and go.
Oct 19, 2026 · Ishaan Ganti
Testing Binding-Affinity Prediction in Rowan

Testing Binding-Affinity Prediction in Rowan

Benchmarking single-point interaction energies and ML affinity models in Rowan's binding-affinity workflow on the JACS set, and how much pose optimization and pocket selection matter.
Oct 13, 2026 · Zachary Fried
Guided Inverse Folding with LLMs

Guided Inverse Folding with LLMs

Testing frontier LLMs on guided protein inverse folding, sequence diversity, and ligand-selective design.
Oct 7, 2026 · Ishaan Ganti
Organizations for Everyone

Organizations for Everyone

how organizations work; collaborating across teams; API keys; pricing
Oct 5, 2026 · Spencer Schneider and Ari Wagen
Binding Affinity Beyond Boltz-2

Binding Affinity Beyond Boltz-2

affinity vincit omnia; Rowan's new unified binding-affinity workflow; GNINA, AEV-PLIG, and Nesso-1; single-point interaction energies
Sep 25, 2026 · Zachary Fried and Corin Wagen
High-Throughput Virtual Screening

High-Throughput Virtual Screening

a new area for Rowan; expanding into HTVS through a new partnership with onepot; why we're excited, and how to get started
Sep 22, 2026 · Corin Wagen and Ari Wagen