Identificación de farmacóforos

Author

Garcia Justo y Valle Abril

Published

September 24, 2024

Identificando farmacóforos

Este script utiliza RDKit para generar imágenes de una molécula, resaltando diferentes familias de características químicas. Las imágenes se muestran en una cuadrícula, y cada imagen resalta los átomos correspondientes a una familia específica.

Pasos del script:

  1. Cargar la definición de características químicas.
  2. Crear una molécula a partir de una cadena SMILES.
  3. Obtener las características de la molécula.
  4. Crear imágenes por cada familia de características.
  5. Mostrar las imágenes en una cuadrícula con un subtítulo.
from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem import ChemicalFeatures
from rdkit import RDConfig
import os
import numpy as np
import matplotlib.pyplot as plt

# Cargar la definición de características
fdefName = os.path.join(RDConfig.RDDataDir, 'BaseFeatures.fdef')
factory = ChemicalFeatures.BuildFeatureFactory(fdefName)

def plot_features(smile, name):
    m = Chem.MolFromSmiles(smile)

    feats = factory.GetFeaturesForMol(m)

    feature_colors = {}
    legend = {}

    for feat in feats:
        family = feat.GetFamily()
        if family not in feature_colors:
            color = tuple(np.random.rand(3,))
            feature_colors[family] = color
            legend[family] = color

    images = []
    titles = []
    for family, color in feature_colors.items():
        atom_colors = {}
        for feat in feats:
            if feat.GetFamily() == family:
                atom_ids = feat.GetAtomIds()
                for atom_id in atom_ids:
                    atom_colors[atom_id] = color

        img = Draw.MolToImage(m, size=(600, 600), kekulize=True, highlightAtoms=list(atom_colors.keys()), highlightAtomColors={k: tuple(v) for k, v in atom_colors.items()})
        images.append(img)
        titles.append(family)

    num_images = len(images)
    cols = 3 
    rows = (num_images + cols - 1) // cols 

    fig, axes = plt.subplots(rows, cols, figsize=(12, 3 * rows))
    fig.suptitle(name, fontsize=16)
    axes = axes.flatten()

    for i, (img, title) in enumerate(zip(images, titles)):
        axes[i].imshow(img)
        axes[i].set_title(f'Familia: {title}')
        axes[i].axis('off')

    for i in range(num_images, len(axes)):
        axes[i].axis('off')

    plt.tight_layout()
    plt.show()
/home/justo/.local/lib/python3.10/site-packages/matplotlib/projections/__init__.py:63: UserWarning: Unable to import Axes3D. This may be due to multiple versions of Matplotlib being installed (e.g. as a system package and as a pip package). As a result, the 3D projection is not available.
  warnings.warn("Unable to import Axes3D. This may be due to multiple versions of "
ligandos = {
    "ZINC03813083" : "C[N+]1(CCC[C@H](C1)OC(=O)C(c2ccccc2)(c3ccccc3)O)C",
    "ZINC03872566": "CC(C)(c1ccc(cc1)[C@@H](CCC[NH+]2CCC(CC2)C(c3ccccc3)(c4ccccc4)O)O)C(=O)[O-]",
    "ZINC01996117":  "c1ccc(cc1)[C@H]2c3ccccc3CCN2C(=O)O[C@H]4C[NH+]5CCC4CC5",
    "ZINC03936683":  "c1ccc(cc1)C(c2ccccc2)([C@@H]3CC[NH+](C3)CCc4ccc5c(c4)CCO5)C(=O)N"
}

for ligando, smile in ligandos.items():
    plot_features(smile, ligando)