home / skills / gptomics / bioskills / molecular-io

molecular-io skill

/chemoinformatics/molecular-io

This skill loads, standardizes, and converts molecular file formats using RDKit and Open Babel to prepare compounds for analysis.

npx playbooks add skill gptomics/bioskills --skill molecular-io

Review the files below or copy the command above to add this skill to your agents.

Files (3)
SKILL.md
5.7 KB
---
name: bio-molecular-io
description: Reads, writes, and converts molecular file formats (SMILES, SDF, MOL2, PDB) using RDKit and Open Babel. Handles structure parsing, canonicalization, and full standardization pipeline including sanitization, normalization, and tautomer canonicalization. Use when loading chemical libraries, converting formats, or preparing molecules for analysis.
tool_type: python
primary_tool: RDKit
---

## Version Compatibility

Reference examples tested with: RDKit 2024.03+

Before using code patterns, verify installed versions match. If versions differ:
- Python: `pip show <package>` then `help(module.function)` to check signatures

If code throws ImportError, AttributeError, or TypeError, introspect the installed
package and adapt the example to match the actual API rather than retrying.

# Molecular I/O

**"Load my chemical library into Python"** → Parse molecular file formats (SMILES, SDF, MOL2, PDB) into RDKit molecule objects for programmatic access, standardization, and format conversion.
- Python: `Chem.MolFromSmiles()`, `Chem.SDMolSupplier()` (RDKit)

Read, write, and convert molecular file formats with structure standardization.

## Supported Formats

| Format | Extension | Use Case |
|--------|-----------|----------|
| SMILES | .smi | Text representation, databases |
| SDF/MOL | .sdf, .mol | 3D structures, compound libraries |
| MOL2 | .mol2 | Docking, force field atoms |
| PDB | .pdb | Protein-ligand complexes |

## Reading Molecules

**Goal:** Load molecules from SMILES strings, SDF files, or SMILES files into RDKit molecule objects.

**Approach:** Use Chem.MolFromSmiles for individual SMILES, SDMolSupplier for multi-molecule SDF files, and file iteration for SMILES files, filtering out parse failures.

```python
from rdkit import Chem
from rdkit.Chem import AllChem

# From SMILES
mol = Chem.MolFromSmiles('CCO')

# From SDF file (single molecule)
mol = Chem.MolFromMolFile('molecule.mol')

# From SDF file (multiple molecules)
supplier = Chem.SDMolSupplier('library.sdf')
molecules = [mol for mol in supplier if mol is not None]
print(f'Loaded {len(molecules)} molecules')

# From SMILES file
with open('compounds.smi') as f:
    molecules = []
    for line in f:
        parts = line.strip().split()
        if parts:
            mol = Chem.MolFromSmiles(parts[0])
            if mol:
                mol.SetProp('_Name', parts[1] if len(parts) > 1 else '')
                molecules.append(mol)
```

## Writing Molecules

```python
from rdkit import Chem

# To SMILES
smiles = Chem.MolToSmiles(mol)  # Canonical SMILES
smiles_iso = Chem.MolToSmiles(mol, isomericSmiles=True)  # With stereochemistry

# To SDF file
writer = Chem.SDWriter('output.sdf')
for mol in molecules:
    writer.write(mol)
writer.close()

# To MOL block (string)
mol_block = Chem.MolToMolBlock(mol)
```

## Structure Standardization

**Goal:** Normalize molecular representations to a canonical form for consistent comparison and analysis.

**Approach:** Apply a multi-step pipeline: sanitize valences, normalize functional groups, neutralize charges, canonicalize tautomers, and strip salts using rdMolStandardize.

Use rdMolStandardize module (Python MolStandardize was removed Q1 2024).

```python
from rdkit import Chem
from rdkit.Chem.MolStandardize import rdMolStandardize

def standardize_molecule(mol):
    '''
    Full standardization pipeline.
    Order: Sanitize -> Normalize -> Neutralize -> Canonicalize tautomer -> Strip salts
    '''
    if mol is None:
        return None

    # Sanitize (assign valences, kekulize)
    try:
        Chem.SanitizeMol(mol)
    except Exception:
        return None

    # Normalize (standardize functional groups)
    normalizer = rdMolStandardize.Normalizer()
    mol = normalizer.normalize(mol)

    # Neutralize charges where possible
    uncharger = rdMolStandardize.Uncharger()
    mol = uncharger.uncharge(mol)

    # Canonicalize tautomers
    enumerator = rdMolStandardize.TautomerEnumerator()
    mol = enumerator.Canonicalize(mol)

    # Remove salts/fragments (keep largest)
    remover = rdMolStandardize.FragmentRemover()
    mol = remover.remove(mol)

    return mol

# Standardize a library
standardized = [standardize_molecule(m) for m in molecules]
standardized = [m for m in standardized if m is not None]
```

## Open Babel Conversion

For format conversions not supported by RDKit.

```python
# Open Babel 3.x import (not 'import pybel')
from openbabel import pybel

# Read MOL2 (better supported in Open Babel)
mols = list(pybel.readfile('mol2', 'ligands.mol2'))

# Convert to SDF
output = pybel.Outputfile('sdf', 'output.sdf', overwrite=True)
for mol in mols:
    output.write(mol)
output.close()

# Format conversion
for mol in pybel.readfile('pdb', 'complex.pdb'):
    mol.write('mol2', 'ligand.mol2', overwrite=True)
```

## Molecular Drawing

Use rdMolDraw2D (legacy Draw.MolToImage deprecated).

```python
from rdkit import Chem
from rdkit.Chem.Draw import rdMolDraw2D

def draw_molecule(mol, filename, size=(400, 300)):
    '''Draw molecule to PNG file.'''
    drawer = rdMolDraw2D.MolDraw2DCairo(size[0], size[1])
    drawer.DrawMolecule(mol)
    drawer.FinishDrawing()
    with open(filename, 'wb') as f:
        f.write(drawer.GetDrawingText())

# Draw with highlighting
def draw_with_substructure(mol, pattern, filename):
    '''Highlight substructure match.'''
    match = mol.GetSubstructMatch(Chem.MolFromSmarts(pattern))
    drawer = rdMolDraw2D.MolDraw2DCairo(400, 300)
    drawer.DrawMolecule(mol, highlightAtoms=match)
    drawer.FinishDrawing()
    with open(filename, 'wb') as f:
        f.write(drawer.GetDrawingText())
```

## Related Skills

- molecular-descriptors - Calculate properties after loading
- similarity-searching - Compare loaded molecules
- virtual-screening - Prepare ligands for docking

Overview

This skill reads, writes, and converts common molecular file formats (SMILES, SDF/MOL, MOL2, PDB) and applies a full structure standardization pipeline using RDKit and Open Babel where appropriate. It focuses on reliable parsing, canonicalization, sanitization, tautomer handling, and format conversion so molecules are ready for analysis or downstream workflows. The skill provides utilities for library loading, file conversion, and PNG drawing of molecules.

How this skill works

Molecules are parsed into RDKit Mol objects using Chem.MolFromSmiles, SDMolSupplier, and file iteration for SMILES. A standardization pipeline uses rdMolStandardize (sanitization, normalization, uncharging, tautomer canonicalization, fragment removal) to produce canonicalized molecules. Open Babel (pybel) is used for conversions and formats better supported outside RDKit (e.g., MOL2). Utilities export SMILES, SDF, MOL blocks, and render PNG images via rdMolDraw2D.

When to use it

  • Loading a compound library from SDF or SMILES for cheminformatics analysis
  • Converting between file formats (PDB↔MOL2↔SDF) for docking or MD workflows
  • Preparing molecules with consistent canonical representations for de-duplication or database indexing
  • Sanitizing and normalizing structures before descriptor calculation or similarity searches
  • Rendering 2D images of molecules for reports or interactive displays

Best practices

  • Verify installed RDKit/Open Babel versions before running examples and adapt API calls to the installed release
  • Filter out parse failures and None objects after reading suppliers to avoid downstream errors
  • Run the full standardization pipeline (sanitize → normalize → uncharge → tautomer canonicalize → remove fragments) before comparisons or clustering
  • Prefer RDKit for SMILES/SDF/MOL handling and use Open Babel for MOL2 or edge-case conversions
  • Keep provenance metadata (original SMILES/filename) as molecule properties when converting or standardizing

Example use cases

  • Load a large SDF library, standardize every molecule, and write a cleaned SDF for descriptor calculation
  • Convert a PDB ligand to MOL2 using Open Babel so it can be used with a docking tool
  • Canonicalize tautomers across a dataset to avoid counting tautomeric forms as distinct entries
  • Read a SMILES file with names, sanitize and canonicalize molecules, then export canonical isomeric SMILES for a database
  • Render PNG thumbnails of library hits with highlighted substructures for a review report

FAQ

What if RDKit or Open Babel APIs differ from examples?

Inspect the installed package versions (pip show) and check function signatures with Python help() or module docs. Adapt calls to match the local API rather than retrying unchanged examples.

How do I handle parse failures when reading large files?

Iterate suppliers and collect only non-None molecules. Log or save failed records (original SMILES or index) for manual inspection and possible correction.