Chapter 5: Virtual Screening Techniques: Drug-Likeness Filters, PAINS & Hit Selection Criteria
Chapter 5: Virtual Screening Techniques: Drug-Likeness Filters, PAINS & Hit Selection Criteria
Structure-Based Virtual Screening (SBVS) vs Ligand-Based Virtual Screening (LBVS); physicochemical property filters: Lipinski's Rule of 5, Veber's rule; PAINS (Pan-Assay Interference Compounds) elimination; binding affinity thresholds; and ligand efficiency metrics.
1. Physicochemical Drug-Likeness Filters
High-throughput screening against millions of compounds without pre-filtering wastes computational cycles on intractable chemical space. Pre-docking filtering applies established medicinal chemistry rules:
- Lipinski's Rule of 5 (Oral Bioavailability):
- Molecular Weight ($\text{MW}$) $\le 500\text{ Da}$
- Octanol-water partition coefficient ($\log P$) $\le 5$
- Hydrogen Bond Donors ($\text{HBD}$) $\le 5$ ($\text{O-H}$ and $\text{N-H}$ groups)
- Hydrogen Bond Acceptors ($\text{HBA}$) $\le 10$ ($\text{O}$ and $\text{N}$ atoms)
- Veber's Rules (Membrane Permeability): Rotatable bonds ($N_{\text{rot}}$) $\le 10$, and Topological Polar Surface Area ($\text{TPSA}$) $\le 140\text{ \AA}^2$.
- PAINS (Pan-Assay Interference Compounds): Highly reactive substructures (e.g., rhodanines, quinones, curcumin-like enones) that produce false positives in biochemical assays via covalent reactivity, fluorescence quenching, or colloidal aggregation.
from rdkit import Chem
from rdkit.Chem import Descriptors, Lipinski
from rdkit.Chem.FilterCatalog import FilterCatalog, FilterCatalogParams
def filter_drug_likeness(mol):
mw = Descriptors.MolWt(mol)
logp = Descriptors.MolLogP(mol)
hbd = Lipinski.NumHDonors(mol)
hba = Lipinski.NumHAcceptors(mol)
rotb = Lipinski.NumRotatableBonds(mol)
tpsa = Descriptors.TPSA(mol)
# Check Lipinski & Veber
if mw <= 500 and logp <= 5.0 and hbd <= 5 and hba <= 10 and rotb <= 10 and tpsa <= 140.0:
return True
return False
# Setup PAINS filter
params = FilterCatalogParams()
params.AddCatalog(FilterCatalogParams.FilterCatalogs.PAINS)
pains_catalog = FilterCatalog(params)
def is_pains_free(mol):
return not pains_catalog.HasMatch(mol)2. Hit Selection Metrics: Beyond Raw Binding Affinity
Relying solely on AutoDock Vina binding energy ($\Delta G$) introduces a bias toward large, high-molecular-weight molecules that accumulate non-specific dispersion forces. Rigorous hit selection requires:
Ligand Efficiency (LE)
LE = -ΔGbind / Nheavy_atoms [kcal / mol · heavy atom]
A drug-like hit should have $LE \ge 0.30\text{ kcal/mol per non-hydrogen atom}$. A $-9.0\text{ kcal/mol}$ hit with 20 heavy atoms ($LE = 0.45$) is significantly more promising for medicinal chemistry optimization than a $-10.5\text{ kcal/mol}$ hit with 45 heavy atoms ($LE = 0.23$).
- RMSD Clustering: Multiple docking runs yielding poses clustered within $<2.0\text{ \AA}$ RMSD signify a robust, energetically stable free energy well.
- Key Catalytic Interactions: A candidate hit must form verifiable hydrogen bonds or salt bridges with essential catalytic residues (e.g., Cys145/His41 in SARS-CoV-2 Mpro). Poses with favorable energy that bind outside the active site should be rejected or classified as putative allosteric hits.
Common Pitfalls & Troubleshooting Checklist
- Java Heap Exhaustion (GATK / Picard): If processes terminate with
java.lang.OutOfMemoryError, set your environment variable explicitly:export _JAVA_OPTIONS="-Xmx16g -Djava.io.tmpdir=/tmp". - Index Timestamp Mismatch: If tools complain that a BAM index is missing or out of date, regenerate with
samtools index -@ 4 sample.bam. - Conda Channel Conflicts: Avoid ABI incompatibilities between bioconda and conda-forge by setting strict priority:
conda config --set channel_priority strict. - Chromosome Naming Contamination: Always verify whether reference FASTA headers use
chr1or1; divergent naming causes silent alignment drops.