Python

Tema 9 · Docking molecular

Introducció

El docking molecular simula la interacció entre una proteïna (diana) i un lligand (fàrmac). Programes com AutoDock Vina prediuen la millor orientació del lligand al lloc d'unió i estimen l'energia d'afinitat (score). Amb Python, podem analitzar i visualitzar els resultats de docking.

Objectius

  • Entendre el procés de docking molecular i els fitxers implicats (PDB, PDBQT)
  • Llegir i analitzar fitxers de sortida d'AutoDock Vina
  • Extreure les millors poses i els scores d'afinitat
  • Visualitzar les energies de docking amb gràfics

Anàlisi de resultats d'AutoDock Vina

Parsejar fitxers de sortida de Vina i extreure les energies:

import re
import pandas as pd

def parse_vina_output(filepath):
    """Extreu les millors energies de cada lligand."""
    with open(filepath, 'r') as f:
        text = f.read()
    
    # Buscar blocs de resultats
    pattern = r'(\d+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)'
    matches = re.findall(pattern, text)
    
    data = []
    for m in matches:
        mode, affinity, dist_rmsd, best_rmsd = m
        data.append({
            'mode': int(mode),
            'affinity': float(affinity),
            'rmsd_lb': float(dist_rmsd),
            'rmsd_ub': float(best_rmsd)
        })
    return pd.DataFrame(data)

df = parse_vina_output("results_vina.txt")
if not df.empty:
    millor = df.loc[df['affinity'].idxmin()]
    print(f"Millor score: {millor['affinity']:.2f} kcal/mol (mode {millor['mode']})")

Comparació de scores de docking

Carregar un CSV amb molècules i els seus scores de docking per comparar-los:

# Suposem df_molecules amb columna 'score_docking'
df_mol = pd.read_csv("docking_scores.csv")
df_mol = df_mol.sort_values('score_docking')  # més negatiu = millor

# Top 10 millors candidats
print("Top 10 candidats:")
print(df_mol[['nom', 'score_docking']].head(10))

# Guardar
df_mol.to_csv("candidats_ordenats.csv", index=False)

Visualització de resultats de docking

import matplotlib.pyplot as plt

plt.figure(figsize=(8,5))
plt.barh(df_mol['nom'].head(10), df_mol['score_docking'].head(10), color='teal')
plt.xlabel('Score de docking (kcal/mol)')
plt.title('Top 10 candidats per score')
plt.gca().invert_yaxis()
plt.tight_layout()
plt.savefig('top_docking.png', dpi=150)
plt.show()

# Histograma de scores
plt.figure(figsize=(8,5))
plt.hist(df_mol['score_docking'], bins=20, color='steelblue', edgecolor='black')
plt.axvline(df_mol['score_docking'].median(), color='red', linestyle='--', label='Mediana')
plt.xlabel('Score (kcal/mol)')
plt.ylabel('Freqüència')
plt.legend()
plt.savefig('dist_docking.png', dpi=150)
plt.show()

Exercicis

  1. Escriu una funció per parsejar un fitxer de sortida d'AutoDock Vina i retornar les 3 millors energies per a cada lligand.
  2. Donats diversos fitxers de docking (un per lligand), carrega tots els resultats en un únic DataFrame i ordena'ls per afinitat.
  3. Genera un gràfic de barres comparant els scores dels teus compostos amb un fàrmac de referència (control positiu).

Mini Projecte – Anàlisi de resultats de cribratge virtual

Implementa un script que:

  • Llegeixi diversos fitxers de sortida d'AutoDock Vina (un per molècula).
  • Extregui la millor energia de cada lligand i les consolidi en un DataFrame.
  • Fusioni aquests resultats amb un fitxer CSV que contingui els descriptors moleculars.
  • Ordeni els compostos per score de docking i mostri els 10 millors.
  • Generi un gràfic de dispersió (scatter) amb el score de docking a l'eix Y i el pes molecular a l'eix X, destacant els millors candidats.
  • Exporti un fitxer CSV amb tots els resultats consolidats.

Nota: si no tens accés a AutoDock Vina, pots simular els scores amb valors aleatoris raonables (-5 a -12 kcal/mol).