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
- Escriu una funció per parsejar un fitxer de sortida d'AutoDock Vina i retornar les 3 millors energies per a cada lligand.
- Donats diversos fitxers de docking (un per lligand), carrega tots els resultats en un únic DataFrame i ordena'ls per afinitat.
- 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).