Python

Tema 7 · Regla de Lipinski

Introducció

La regla dels 5 de Lipinski (o regla de Lipinski) és un conjunt de criteris empírics per avaluar si un compost químic té propietats favorables per ser administrat per via oral. Un compost té més probabilitats de ser "drug-like" si compleix almenys 3 dels 4 criteris següents:

  • Pes molecular (MW) ≤ 500 Da
  • Coeficient de partició (LogP) ≤ 5
  • Donors d'enllaços d'hidrogen (HBD) ≤ 5
  • Acceptors d'enllaços d'hidrogen (HBA) ≤ 10

Objectius

  • Comprendre els quatre criteris de Lipinski i la seva justificació
  • Aplicar la regla a un DataFrame de Pandas amb descriptors calculats
  • Crear un filtre automatitzat que seleccioni compostos "drug-like"
  • Visualitzar els resultats amb Matplotlib

Implementació de la regla de Lipinski

Funció per comprovar els criteris d'una molècula:

def lipinski_pass(mw, logp, hbd, hba):
    """Retorna True si compleix almenys 3 dels 4 criteris."""
    violations = 0
    if mw > 500: violations += 1
    if logp > 5: violations += 1
    if hbd > 5: violations += 1
    if hba > 10: violations += 1
    return violations <= 1  # màxim 1 violació permesa

# Exemple
print(lipinski_pass(350, 4.5, 2, 5))   # True
print(lipinski_pass(600, 6.0, 6, 12))  # False (4 violacions)

Aplicació a un dataset amb Pandas

Carregar un CSV, aplicar el filtre i obtenir compostos "drug-like":

import pandas as pd

df = pd.read_csv("molecules.csv")

# Apliquem la funció a cada fila
df['lipinski_ok'] = df.apply(
    lambda row: lipinski_pass(row['MW'], row['LogP'], row['HBD'], row['HBA']),
    axis=1
)

# Filtrar els que passen
df_pass = df[df['lipinski_ok']]
df_fail = df[~df['lipinski_ok']]

print(f"Total: {len(df)} molècules")
print(f"Lipinski OK: {len(df_pass)} ({100*len(df_pass)/len(df):.1f}%)")
print(f"Violen Lipinski: {len(df_fail)}")

# Guardar els compostos filtrats
df_pass.to_csv("compostos_lipinski.csv", index=False)

Visualització del filtratge

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# Gràfic de sectors (passa / no passa)
labels = ['Lipinski OK', 'Violen Lipinski']
sizes = [len(df_pass), len(df_fail)]
colors = ['#2ecc71', '#e74c3c']
ax1.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
ax1.set_title('Cribratge Lipinski')

# Scatter MW vs LogP amb colors
ax2.scatter(df_fail['MW'], df_fail['LogP'], c='red', alpha=0.5, label='No passa')
ax2.scatter(df_pass['MW'], df_pass['LogP'], c='green', alpha=0.5, label='Passa')
ax2.axvline(500, color='gray', linestyle='--', alpha=0.5, label='MW=500')
ax2.axhline(5, color='gray', linestyle='--', alpha=0.5, label='LogP=5')
ax2.set_xlabel('MW (Da)')
ax2.set_ylabel('LogP')
ax2.set_title('MW vs LogP')
ax2.legend()
plt.tight_layout()
plt.savefig('lipinski_results.png', dpi=150)
plt.show()

Exercicis

  1. Donada una llista de diccionaris amb MW, LogP, HBD, HBA, aplica la regla de Lipinski i imprimeix quins compostos la compleixen.
  2. A partir d'un dataset de molècules, calcula el percentatge de compostos que passen cada criteri per separat i mostra un gràfic de barres.
  3. Fes una funció que, a més dels 4 criteris, tingui en compte una cinquena regla: TPSA < 140 Ų, i aplica-la al teu dataset.

Mini Projecte – Filtre Lipinski sobre biblioteca molecular

Implementa un pipeline complet de filtrat:

  • Parteix d'un fitxer CSV amb SMILES i descriptors precalculats (o calcula'ls tu).
  • Aplica la regla de Lipinski estricta (màxim 1 violació) i obté la llista de compostos que la compleixen.
  • Genera un fitxer CSV amb aquests compostos (drug_like.csv).
  • Crea una figura amb dos subplots: un pastís amb el percentatge de compostos que passen/no passen, i un scatter MW vs LogP amb colors segons el resultat.
  • Inclou línies verticals i horitzontals als límits de Lipinski.