Note on de novo drug design in PDF format
de novo drug design methods AI computational approaches 2024 2025
https://www.frontiersin.org/journals/hematology/articles/10.…
"de novo drug design" generative AI deep learning
mkdir -p /home/daytona/workspace/de-novo-drug-design && ls /home/daytona/workspace/de-novo-drug-design/
~/de-novo-drug-design/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib.colors import HexColor, white, black
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/de-novo-drug-design/De_Novo_Drug_Design_Notes.pdf"
# ── colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = HexColor("#1A3A5C")
MID_BLUE = HexColor("#2E6DA4")
LIGHT_BLUE = HexColor("#D6E8F7")
ACCENT_TEAL = HexColor("#1E8C8C")
ACCENT_GOLD = HexColor("#D4820A")
LIGHT_GREY = HexColor("#F4F6F9")
MID_GREY = HexColor("#BFC9D4")
DARK_GREY = HexColor("#3D4A56")
RED_BOX = HexColor("#FFF0F0")
RED_BORDER = HexColor("#C0392B")
GREEN_BOX = HexColor("#F0FFF4")
GREEN_BORDER= HexColor("#27AE60")
def build_pdf():
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2.2*cm,
title="De Novo Drug Design – Study Notes",
author="Orris Medical AI"
)
styles = getSampleStyleSheet()
# ── custom styles ────────────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("DocTitle",
fontName="Helvetica-Bold", fontSize=24, leading=30,
textColor=white, alignment=TA_CENTER, spaceAfter=4)
subtitle_style = S("DocSubtitle",
fontName="Helvetica", fontSize=12, leading=16,
textColor=HexColor("#B8D4F0"), alignment=TA_CENTER, spaceAfter=2)
date_style = S("DocDate",
fontName="Helvetica-Oblique", fontSize=9,
textColor=HexColor("#90B8D8"), alignment=TA_CENTER)
h1_style = S("H1",
fontName="Helvetica-Bold", fontSize=15, leading=19,
textColor=white, spaceBefore=14, spaceAfter=6,
backColor=DARK_BLUE, leftIndent=-6, rightIndent=-6,
borderPad=6)
h2_style = S("H2",
fontName="Helvetica-Bold", fontSize=12, leading=15,
textColor=DARK_BLUE, spaceBefore=10, spaceAfter=4,
borderPadding=(0,0,2,0))
h3_style = S("H3",
fontName="Helvetica-BoldOblique", fontSize=10.5, leading=13,
textColor=ACCENT_TEAL, spaceBefore=8, spaceAfter=3)
body_style = S("Body",
fontName="Helvetica", fontSize=9.5, leading=14,
textColor=DARK_GREY, spaceAfter=5, alignment=TA_JUSTIFY)
bullet_style = S("Bullet",
fontName="Helvetica", fontSize=9.5, leading=14,
textColor=DARK_GREY, spaceAfter=3,
leftIndent=14, bulletIndent=0,
bulletFontName="Helvetica", bulletFontSize=9.5)
sub_bullet_style = S("SubBullet",
fontName="Helvetica", fontSize=9, leading=13,
textColor=DARK_GREY, spaceAfter=2,
leftIndent=28, bulletIndent=14)
caption_style = S("Caption",
fontName="Helvetica-Oblique", fontSize=8, leading=11,
textColor=HexColor("#607080"), alignment=TA_CENTER, spaceAfter=4)
ref_style = S("Ref",
fontName="Helvetica-Oblique", fontSize=8, leading=11,
textColor=HexColor("#607080"), spaceAfter=2, leftIndent=10)
label_style = S("Label",
fontName="Helvetica-Bold", fontSize=8.5,
textColor=ACCENT_GOLD)
# ── helper: section header with coloured bar ─────────────────────────────
def section_header(text, level=1):
if level == 1:
return [
Spacer(1, 0.15*cm),
Table([[Paragraph(text, h1_style)]],
colWidths=[17*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("ROUNDEDCORNERS", [4]),
])),
Spacer(1, 0.2*cm),
]
elif level == 2:
return [
Spacer(1, 0.1*cm),
HRFlowable(width="100%", thickness=2, color=MID_BLUE, spaceAfter=3),
Paragraph(text, h2_style),
]
else:
return [Paragraph(text, h3_style)]
def bullet(text, sub=False):
st = sub_bullet_style if sub else bullet_style
symbol = "◦" if sub else "•"
return Paragraph(f"{symbol} {text}", st)
def coloured_box(text, bg=LIGHT_BLUE, border=MID_BLUE, label=""):
content = f"<b>{label}</b> {text}" if label else text
return Table(
[[Paragraph(content, body_style)]],
colWidths=[17*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.5, border),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
])
)
def two_col_table(rows, headers=None):
col_w = [5.5*cm, 11*cm]
data = []
if headers:
data.append([
Paragraph(f"<b>{headers[0]}</b>", body_style),
Paragraph(f"<b>{headers[1]}</b>", body_style)
])
for r in rows:
data.append([
Paragraph(r[0], body_style),
Paragraph(r[1], body_style)
])
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE if headers else LIGHT_BLUE),
("TEXTCOLOR", (0,0), (-1,0), white if headers else DARK_GREY),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS", (0,1), (-1,-1), [white, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.5, MID_GREY),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
])
return Table(data, colWidths=col_w, style=ts, hAlign="LEFT")
def three_col_table(rows, headers=None):
col_w = [4*cm, 6*cm, 6.5*cm]
data = []
if headers:
data.append([Paragraph(f"<b>{h}</b>", body_style) for h in headers])
for r in rows:
data.append([Paragraph(cell, body_style) for cell in r])
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [white, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.5, MID_GREY),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
])
return Table(data, colWidths=col_w, style=ts, hAlign="LEFT")
# ════════════════════════════════════════════════════════════════════════
# CONTENT BUILD
# ════════════════════════════════════════════════════════════════════════
story = []
# ── TITLE CARD ───────────────────────────────────────────────────────────
title_table = Table(
[[Paragraph("De Novo Drug Design", title_style)],
[Paragraph("Comprehensive Study Notes", subtitle_style)],
[Paragraph("Pharmacology & Medicinal Chemistry | July 2026", date_style)]],
colWidths=[17*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [6]),
])
)
story.append(title_table)
story.append(Spacer(1, 0.5*cm))
# ── quick-definition box ─────────────────────────────────────────────────
story.append(coloured_box(
"De novo drug design is a computational approach to generating entirely new chemical "
"structures optimised for a biological target — without requiring a previously known "
"active compound as a starting point. The term <i>de novo</i> (Latin: 'from the new') "
"distinguishes this from ligand-based optimisation of existing hits.",
bg=LIGHT_BLUE, border=MID_BLUE, label="Definition"
))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 1. INTRODUCTION & BACKGROUND
# ══════════════════════════════════════════════════════════════════════
story += section_header("1. Introduction & Historical Background")
story.append(Paragraph(
"Traditional drug discovery relied almost entirely on experimental high-throughput screening "
"(HTS) of compound libraries or empirical chemical modification of natural products. "
"Although powerful, HTS is resource-intensive and limited by the chemical diversity of "
"existing libraries. Computational de novo design emerged in the early 1990s as a way to "
"explore the vastly larger <i>virtual</i> chemical space — estimated at 10<super>60</super> "
"drug-like molecules — far beyond what any physical collection could cover.", body_style))
story += section_header("Key milestones", level=2)
milestones = [
("1990s", "First rule-based fragment-assembly programs (LUDI, LEGEND, SPROUT)"),
("2000s", "QSAR models and pharmacophore-guided design become routine"),
("2010s", "Machine learning (ML) begins replacing hand-coded scoring functions"),
("2017–2020", "Deep generative models (VAEs, GANs, RNNs on SMILES) transform the field"),
("2020–present", "Graph neural networks, diffusion models, and large language models (LLMs) "
"enable 3-D structure-aware, multi-property optimisation; >3,000 AI-assisted "
"drugs in development pipelines as of early 2025"),
]
story.append(two_col_table(milestones, headers=["Era", "Development"]))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 2. DRUG DISCOVERY PIPELINE CONTEXT
# ══════════════════════════════════════════════════════════════════════
story += section_header("2. Where De Novo Design Fits in the Discovery Pipeline")
pipeline_steps = [
("Target Identification", "Identify disease-relevant protein/RNA target (genomics, proteomics, CRISPR screens)"),
("Target Validation", "Confirm target's role; obtain 3-D crystal/cryo-EM structure or AlphaFold model"),
("Hit Discovery", "<b>De novo design generates novel hit scaffolds here</b> (also: HTS, fragment-based, virtual screening)"),
("Hit-to-Lead", "Iterative computational + synthetic optimisation of potency, selectivity, ADMET"),
("Lead Optimisation", "Fine-tune PK, safety, formulation; de novo methods assist scaffold hopping"),
("Preclinical / Clinical", "In vitro, animal, then human studies — de novo design less central beyond this point"),
]
story.append(two_col_table(pipeline_steps, headers=["Stage", "Role of De Novo Design"]))
story.append(Spacer(1, 0.3*cm))
story.append(coloured_box(
"<b>Key distinction:</b> De novo design targets the hit-discovery and lead-optimisation stages. "
"It is complementary — not a replacement — for HTS, fragment-based methods, and experimental assays.",
bg=GREEN_BOX, border=GREEN_BORDER
))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 3. CORE APPROACHES
# ══════════════════════════════════════════════════════════════════════
story += section_header("3. Core Computational Approaches")
# 3A
story += section_header("3A. Ligand-Based De Novo Design", level=2)
story.append(Paragraph(
"Used when 3-D target structure is unavailable but multiple active ligands exist. "
"The method extracts pharmacophoric features — hydrogen-bond donors/acceptors, hydrophobic "
"patches, charged groups, aromatic rings — from known actives and generates new molecules "
"that satisfy those features.", body_style))
story.append(bullet("<b>Molecular fingerprints:</b> encode substructure presence/absence as bit-vectors; "
"similarity metrics (Tanimoto coefficient) guide analogue generation."))
story.append(bullet("<b>Shape/electrostatic similarity:</b> compares 3-D molecular envelopes and "
"charge distributions irrespective of bond topology."))
story.append(bullet("<b>Pharmacophore models:</b> abstract spatial arrangements of key interaction "
"groups; used to filter or seed generative models."))
story.append(bullet("<b>QSAR/QSPR:</b> quantitative structure–activity/property relationships "
"predict biological activity or ADMET from chemical descriptors; trained models "
"guide inverse design."))
story += section_header("3B. Structure-Based De Novo Design (SBDD)", level=2)
story.append(Paragraph(
"Requires a 3-D structure of the target binding site (X-ray, cryo-EM, or AlphaFold2/3 model). "
"New molecules are grown or placed inside the pocket to maximise favourable interactions "
"while minimising clashes.", body_style))
story += section_header("Fragment Assembly / Growing", level=3)
story.append(bullet("Fragments (small, simple scaffolds) are docked into the active site."))
story.append(bullet("Linkers connect fragments, or chemical groups are iteratively appended to "
"explore available pocket space."))
story.append(bullet("Classic tools: LUDI (1992), GLIDE fragment-linking, FBDD pipelines."))
story += section_header("Molecular Docking + Scoring", level=3)
story.append(bullet("Generated molecules are docked: software samples thousands of "
"poses (positions + conformations) in the rigid or flexible receptor."))
story.append(bullet("Scoring functions estimate binding free energy (force-field, empirical, or ML-based)."))
story.append(bullet("GPU-accelerated molecular dynamics (MD) refines binding poses and "
"captures receptor flexibility — including cryptic allosteric pockets."))
story += section_header("Virtual Screening", level=3)
story.append(bullet("De novo generated libraries are screened computationally before any synthesis."))
story.append(bullet("Structure-based VS uses docking; ligand-based VS uses fingerprint/pharmacophore matching."))
story.append(bullet("AlphaFold-derived structures have expanded SBDD to previously 'undruggable' proteins."))
story.append(Spacer(1, 0.2*cm))
# ══════════════════════════════════════════════════════════════════════
# 4. AI / MACHINE LEARNING METHODS
# ══════════════════════════════════════════════════════════════════════
story += section_header("4. AI & Deep Learning Methods for De Novo Design")
story.append(Paragraph(
"The fusion of deep learning with computational chemistry has revolutionised de novo design. "
"Rather than relying on hand-coded rules, these models learn molecular grammars and "
"property–structure relationships directly from data.", body_style))
ai_methods = [
("Recurrent Neural\nNetworks (RNNs)\non SMILES",
"Sequential character generation of SMILES strings. Pretrained on large chemical databases "
"(ChEMBL, ZINC) then fine-tuned on actives via transfer learning.",
"Early practical generative models; fast; limited 3-D awareness"),
("Variational\nAutoencoders\n(VAEs)",
"Encode molecules into a continuous latent space; decode points in that space to new molecules. "
"Enables smooth interpolation and property-guided gradient descent.",
"Generates drug-like molecules; latent-space traversal intuitive for chemists"),
("Generative\nAdversarial\nNetworks (GANs)",
"Generator creates molecules; discriminator judges drug-likeness. Adversarial training improves "
"chemical realism over successive iterations.",
"High-quality outputs but training instability (mode collapse)"),
("Graph Neural\nNetworks (GNNs)",
"Represent molecules as graphs (nodes = atoms, edges = bonds). Atom-by-atom or bond-by-bond "
"generation preserves chemical validity explicitly.",
"Strong 3-D and property modelling; used in DRAGONFLY, REINVENT"),
("Diffusion Models",
"Iteratively denoise random 3-D point clouds into coherent molecular structures. "
"Models like DiffSBDD, TargetDiff, GenMol (2025) generate ligands conditioned on "
"protein pocket geometry.",
"State-of-the-art for structure-based generation; captures complex distributions"),
("Transformer /\nLarge Language\nModels (LLMs)",
"Treat SMILES or SELFIES as token sequences; attention mechanism captures long-range "
"dependencies. Multi-modal models combine sequence + structural data.",
"Strong zero-shot and few-shot generalisation; emerging in 2024–2026"),
("Reinforcement\nLearning (RL)",
"Policy network generates molecules; reward function encodes desired properties "
"(docking score, QED, synthetic accessibility, ADMET). REINVENT framework is widely used.",
"Flexible multi-objective optimisation; risk of reward hacking"),
("Active Learning\n(AL)",
"Iterative strategy: model identifies uncertain/novel molecules, selects them for "
"experimental testing, updates training set. Uses Bayesian or ensemble uncertainty estimates.",
"Efficient exploration with fewer experiments; replaces evolutionary algorithms"),
]
ai_table_data = [[
Paragraph("<b>Method</b>", body_style),
Paragraph("<b>Mechanism</b>", body_style),
Paragraph("<b>Notes / Strengths</b>", body_style)
]]
for row in ai_methods:
ai_table_data.append([Paragraph(cell, body_style) for cell in row])
ai_table = Table(ai_table_data,
colWidths=[3.8*cm, 7.2*cm, 5.5*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [white, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.5, MID_GREY),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]),
hAlign="LEFT")
story.append(ai_table)
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 5. MOLECULAR REPRESENTATIONS
# ══════════════════════════════════════════════════════════════════════
story += section_header("5. Molecular Representations")
rep_data = [
("SMILES", "Simplified Molecular Input Line Entry System — linear text encoding of molecular "
"structure (e.g. CCO = ethanol). Most widely used; simple but doesn't encode 3-D geometry."),
("SELFIES", "Self-referencing embedded strings — 100% syntactically valid alternative to SMILES; "
"every string decodes to a valid molecule. Preferred for generative models."),
("Molecular Graphs", "Atoms as nodes, bonds as edges with attributes. Processed by GNNs; "
"preserves chemical topology naturally."),
("3-D Point Clouds", "Atomic coordinates in 3-D space. Input for diffusion and equivariant "
"neural networks (e.g. SE(3)-transformers). Captures conformation."),
("Fingerprints", "ECFP (Morgan fingerprint), MACCS keys — fixed-length binary or count vectors "
"encoding substructural features. Used in similarity searches and QSAR."),
("Descriptors", "Physicochemical properties (MW, logP, TPSA, HBD, HBA, rotatable bonds) "
"computed from structure. Lipinski Ro5 uses these for drug-likeness filters."),
]
story.append(two_col_table(rep_data, headers=["Representation", "Description"]))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 6. DRUG-LIKENESS & OPTIMISATION CRITERIA
# ══════════════════════════════════════════════════════════════════════
story += section_header("6. Drug-Likeness & Multi-Property Optimisation")
story.append(Paragraph(
"Generated molecules must satisfy multiple overlapping criteria simultaneously — "
"a major challenge distinct from simply optimising a single docking score.", body_style))
story += section_header("Lipinski Rule of Five (Ro5)", level=2)
story.append(Paragraph("Empirical guidelines for oral bioavailability (Lipinski et al., 2001):", body_style))
ro5 = [
"Molecular weight ≤ 500 Da",
"LogP (lipophilicity) ≤ 5",
"H-bond donors ≤ 5",
"H-bond acceptors ≤ 10",
"Note: many exceptions exist (e.g. macrocycles, natural products, beyond-Ro5 space)",
]
for item in ro5:
story.append(bullet(item))
story += section_header("Key Optimisation Targets", level=2)
opt_data = [
("Potency (IC50/Ki)", "Target binding affinity — usually the primary docking/scoring objective"),
("Selectivity", "Avoid off-target binding; crucial for safety (e.g. hERG channel avoidance)"),
("ADMET", "Absorption, Distribution, Metabolism, Excretion, Toxicity — predicted by QSAR/ML models"),
("Synthetic Accessibility (SA)", "SA score, SYBA, FSscore — penalise synthetically inaccessible structures"),
("Novelty & Diversity", "Metrics ensure generated compounds differ sufficiently from known actives"),
("QED Score", "Quantitative Estimate of Drug-likeness — single 0–1 score combining multiple Ro5-related properties"),
("TPSA", "Topological Polar Surface Area — correlates with membrane permeability and CNS penetration"),
("Metabolic Stability", "Predicted microsomal clearance; bioisostere swaps improve stability"),
]
story.append(two_col_table(opt_data, headers=["Property", "Relevance"]))
story.append(Spacer(1, 0.3*cm))
story.append(coloured_box(
"<b>Multi-objective optimisation:</b> In practice, RL reward functions combine weighted sums "
"of docking score + QED + SA score + ADMET predictions. Pareto-front methods identify "
"compound sets where no single property can improve without degrading another.",
bg=LIGHT_BLUE, border=MID_BLUE
))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 7. NOTABLE TOOLS & PLATFORMS
# ══════════════════════════════════════════════════════════════════════
story += section_header("7. Notable Tools, Frameworks & Platforms")
tools_data = [
("REINVENT 4", "AstraZeneca (open-source)", "RL + transfer learning; widely used SMILES-based generative framework"),
("DRAGONFLY", "Interactome deep learning", "GNN + language model; zero-shot structure-based design (Nature Comms 2024)"),
("DiffSBDD / TargetDiff", "Academic", "Diffusion-based pocket-conditioned 3-D ligand generation"),
("GenMol", "NVIDIA + collaborators", "Discrete diffusion generalist model; drug discovery (arXiv 2025)"),
("Glide / Schrödinger", "Schrödinger Inc.", "Industry-standard docking; integrated ML scoring (FEP+)"),
("AutoDock Vina", "Open-source", "Fast, widely used free docking engine for virtual screening"),
("AlphaFold3", "Google DeepMind", "Predicts protein + ligand complex structures; expands SBDD targets"),
("ChEMBL / ZINC", "EMBL-EBI / UCSF", "Public databases of bioactive molecules; primary training data sources"),
("RDKit", "Open-source (Python)", "Core cheminformatics library: descriptor calculation, fingerprints, filtering"),
]
story.append(three_col_table(tools_data, headers=["Tool", "Source", "Role in De Novo Design"]))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 8. EVALUATION METRICS
# ══════════════════════════════════════════════════════════════════════
story += section_header("8. Evaluating Generative Models")
story.append(Paragraph(
"Evaluating de novo design models requires metrics beyond simple accuracy because the goal "
"is novel, valid, diverse, and drug-like molecules — not just reproducing training data.", body_style))
metrics_data = [
("Validity", "Fraction of generated SMILES that are chemically valid (parseable by RDKit). "
"Modern models achieve >95% with SELFIES or constrained decoding."),
("Uniqueness", "Fraction of valid generated molecules that are non-duplicate. High uniqueness "
"indicates diverse output."),
("Novelty", "Fraction of unique molecules not present in training set. High novelty = genuine "
"exploration beyond known chemical space."),
("Drug-likeness (QED)", "Average QED score of generated molecules. QED ~0.67 is typical of "
"marketed oral drugs."),
("Diversity", "Mean pairwise Tanimoto dissimilarity of generated molecules. Low diversity "
"indicates mode collapse."),
("FCD (Fréchet\nChemNet Distance)", "Measures statistical distance between distributions of "
"generated and reference molecules in a learned latent space. "
"Lower = more similar to real drug space."),
("Docking Score", "Mean or top-percentile docking score of generated molecules against the "
"target. Primary metric for SBDD models."),
("Hit Rate", "Fraction of generated molecules passing all multi-property thresholds "
"(activity, ADMET, SA). Ultimate practical metric."),
]
story.append(two_col_table(metrics_data, headers=["Metric", "Meaning"]))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 9. VALIDATED EXAMPLES
# ══════════════════════════════════════════════════════════════════════
story += section_header("9. Experimentally Validated Examples")
story.append(Paragraph(
"Several AI-designed compounds have progressed into preclinical or clinical development:", body_style))
validated = [
("DSP-1181\n(OCD)", "Exscientia × Sumitomo Dainippon", "First AI-designed drug to enter Phase I clinical trial (2020). "
"RNN-generated 5-HT1A partial agonist. Designed in ~12 months vs typical 4–5 years."),
("CDK inhibitors\n(Cancer)", "Insilico Medicine", "Generative chemistry + RL used to design novel CDK6 inhibitors; "
"ISM001 for IPF entered Phase II trials (2022)."),
("PCSK9 inhibitors", "Academic + Pharma collaborations",
"De novo generated macrocyclic peptides inhibiting PCSK9 for hypercholesterolaemia; "
"validated by SPR and cellular assays."),
("JAK inhibitors", "Various AI-first biotechs",
"GNN-generated JAK1/2 selective inhibitors with improved ADMET profiles vs marketed drugs."),
("Anti-tuberculosis\n(DprE1)", "DRAGONFLY study\n(Nature Comms 2024)",
"Zero-shot deep interactome learning generated novel DprE1 inhibitor scaffolds; "
"confirmed by crystallography. Demonstrated no prior ligand data needed."),
]
validated_table_data = [[
Paragraph("<b>Compound / Target</b>", body_style),
Paragraph("<b>Team</b>", body_style),
Paragraph("<b>Outcome</b>", body_style)
]]
for row in validated:
validated_table_data.append([Paragraph(cell, body_style) for cell in row])
validated_table = Table(validated_table_data,
colWidths=[3.5*cm, 4.5*cm, 8.5*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), ACCENT_TEAL),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [white, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.5, MID_GREY),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]), hAlign="LEFT")
story.append(validated_table)
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 10. CHALLENGES & LIMITATIONS
# ══════════════════════════════════════════════════════════════════════
story += section_header("10. Challenges & Limitations")
story.append(coloured_box(
"Despite rapid progress, de novo AI drug design remains a field with substantial unresolved challenges. "
"Most successes have been in scaffold optimisation rather than truly breakthrough de novo discovery.",
bg=RED_BOX, border=RED_BORDER
))
story.append(Spacer(1, 0.15*cm))
challenges = [
("<b>Synthetic accessibility:</b> Generative models readily produce exotic structures that are "
"practically impossible to synthesise. SA filtering and retrosynthesis predictors (SYNTHIA, "
"ASKCOS) are now integrated into pipelines.", False),
("<b>Data scarcity:</b> High-quality experimental bioactivity data for many novel targets is "
"limited; models trained on public databases (ChEMBL) may not generalise.", False),
("<b>Reward hacking:</b> RL models can exploit weaknesses in surrogate scoring functions, "
"producing molecules that score well computationally but are inactive in vitro.", False),
("<b>3-D accuracy:</b> Even AlphaFold3 structures may contain binding-site errors; docking "
"scores derived from inaccurate pockets are unreliable.", False),
("<b>ADMET prediction gaps:</b> In vitro–in vivo discordance means computational ADMET "
"predictions frequently fail in animal studies.", False),
("<b>Interpretability:</b> Deep generative models are largely black boxes; chemists cannot "
"always rationalise why a specific structural motif was proposed.", False),
("<b>Benchmarking:</b> No standardised, universally agreed benchmarks exist for comparing "
"de novo design methods head-to-head against traditional approaches.", False),
("<b>Regulatory acceptance:</b> Regulatory frameworks (FDA, EMA) for AI-generated drug "
"candidates remain nascent; documentation and validation requirements are evolving.", False),
]
for text, sub in challenges:
story.append(bullet(text, sub))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 11. FUTURE DIRECTIONS
# ══════════════════════════════════════════════════════════════════════
story += section_header("11. Future Directions (2025–2030 Outlook)")
future = [
"<b>Hybrid quantum-classical computing:</b> Quantum algorithms for molecular simulation may "
"dramatically accelerate exact free-energy calculations for binding affinity.",
"<b>Digital twins:</b> Patient-specific in silico models combined with generative AI will "
"enable personalised drug design matched to individual genomic profiles.",
"<b>Multi-modal foundation models:</b> LLMs trained simultaneously on sequences, structures, "
"bioassay data, and clinical outcomes will enable 'zero-shot' design for any target.",
"<b>Automated synthesis planning:</b> Deep integration of retrosynthetic AI (AiZynthFinder, "
"ASKCOS) with generative design will close the loop from idea to synthesisable molecule "
"in a single pipeline.",
"<b>Closed-loop robotic laboratories:</b> AI design → automated synthesis → high-throughput "
"assay → model update cycles running without human intervention (self-driving labs).",
"<b>Larger clinical trial datasets:</b> As more AI-designed drugs advance to Phase II/III, "
"outcome data will enable training of 'clinical success'-optimising models.",
]
for item in future:
story.append(bullet(item))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 12. COMPARISON: TRADITIONAL vs AI DE NOVO
# ══════════════════════════════════════════════════════════════════════
story += section_header("12. Traditional vs. AI-Assisted De Novo Design")
compare_data = [
("Chemical space explored", "~10⁶–10⁷ (HTS library)", "~10¹⁰–10²⁰ (virtual / latent space)"),
("Hit identification time", "Months–years", "Days–weeks"),
("Structural novelty", "Constrained to library scaffolds", "Truly novel scaffolds accessible"),
("Multi-property optim.", "Sequential, iterative", "Simultaneous, reward-guided"),
("Synthetic accessibility", "Guaranteed (purchasable)", "Requires explicit SA constraint"),
("Interpretability", "High (chemist-driven)", "Low (black-box models)"),
("Data dependence", "Minimal (phenotypic OK)", "High-quality SAR data needed"),
("Cost (computational)", "Low (screening only)", "High GPU/cloud compute for training"),
("Cost (experimental)", "High (large compound libraries)", "Lower (fewer compounds tested)"),
]
compare_table_data = [[
Paragraph("<b>Criterion</b>", body_style),
Paragraph("<b>Traditional / HTS</b>", body_style),
Paragraph("<b>AI De Novo Design</b>", body_style)
]]
for row in compare_data:
compare_table_data.append([Paragraph(cell, body_style) for cell in row])
compare_table = Table(compare_table_data,
colWidths=[5*cm, 5.5*cm, 6*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [white, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.5, MID_GREY),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]), hAlign="LEFT")
story.append(compare_table)
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# 13. QUICK REVISION SUMMARY
# ══════════════════════════════════════════════════════════════════════
story += section_header("13. Quick Revision Summary")
summary_points = [
"De novo drug design creates novel chemical structures from scratch, targeting a specific molecular objective.",
"Two main paradigms: <b>ligand-based</b> (pharmacophore, QSAR, fingerprints) and <b>structure-based</b> (docking, MD, fragment assembly).",
"AI methods — RNNs, VAEs, GANs, GNNs, diffusion models, LLMs — learn generative models of chemical space.",
"Reinforcement learning combines generation + property optimisation into a single training loop.",
"Key representations: SMILES, SELFIES, molecular graphs, 3-D point clouds, fingerprints, descriptors.",
"Multi-property optimisation balances potency, selectivity, ADMET, QED, and synthetic accessibility simultaneously.",
"Evaluation: validity, uniqueness, novelty, diversity, FCD, docking score, hit rate.",
"AlphaFold3 structures + diffusion models = current frontier of structure-based de novo design.",
"Major challenges: SA, data scarcity, reward hacking, ADMET gaps, interpretability, benchmarking.",
"Validated examples: DSP-1181 (OCD, Phase I), ISM001 (IPF, Phase II), DRAGONFLY DprE1 inhibitors.",
"Future: self-driving labs, digital twins, quantum computing integration, multi-modal foundation models.",
]
for i, pt in enumerate(summary_points, 1):
story.append(Paragraph(f"<b>{i}.</b> {pt}", bullet_style))
story.append(Spacer(1, 0.3*cm))
# ══════════════════════════════════════════════════════════════════════
# REFERENCES
# ══════════════════════════════════════════════════════════════════════
story += section_header("References")
refs = [
"Goodman & Gilman's The Pharmacological Basis of Therapeutics (14th ed., 2023). "
"Chapter 1: Drug Discovery — Computer-Aided Drug Discovery, pp. 312–430.",
"Schneider G & Fechner U. Computer-based de novo design of drug-like molecules. "
"Nat Rev Drug Discov. 2005;4:649–663.",
"Tang Y, Moretti R, Meiler J. Recent Advances in Automated Structure-Based De Novo Drug Design. "
"J Chem Inf Model. 2024;64(6):1936–1955. PMID: 38485516.",
"Gangwal A, Lavecchia A. Unleashing the power of generative AI in drug discovery. "
"Drug Discov Today. 2024;29(6). PMID: 38663579.",
"Özelik R et al. Generative Deep Learning for de Novo Drug Design — A Chemical Space Odyssey. "
"J Chem Inf Model. 2025. PMID: 40632942.",
"Ozdemir ES et al. Deep generative molecular design and its value in modern drug discovery. "
"Expert Opin Drug Discov. 2026. PMID: 41778634.",
"Lavecchia A. Advancing drug discovery with deep attention neural networks. "
"Drug Discov Today. 2024;29(8). PMID: 38925473.",
"Stokes JM et al. A deep learning approach to antibiotic discovery (halicin). Cell. 2020;181(2):475–483.",
"Luo S et al. Prospective de novo drug design with deep interactome learning. "
"Nat Commun. 2024;15:3408. [DRAGONFLY]",
"Frontiers in Hematology. De novo drug design through artificial intelligence: an introduction. "
"Front Hematol. 2024;3:1305741.",
"Lipinski CA et al. Experimental and computational approaches to estimate solubility and "
"permeability in drug discovery. Adv Drug Deliv Rev. 2001;46:3–26.",
]
for ref in refs:
story.append(Paragraph(f"• {ref}", ref_style))
story.append(Spacer(1, 0.4*cm))
story.append(HRFlowable(width="100%", thickness=1, color=MID_GREY))
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph(
"Generated by Orris Medical AI | July 14, 2026 | For educational use only — not a clinical guideline.",
caption_style))
# ── BUILD ────────────────────────────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# header stripe
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, A4[1]-1*cm, A4[0], 1*cm, fill=1, stroke=0)
canvas.setFillColor(white)
canvas.setFont("Helvetica-Bold", 8)
canvas.drawString(2*cm, A4[1]-0.65*cm, "De Novo Drug Design — Study Notes")
canvas.setFont("Helvetica", 8)
canvas.drawRightString(A4[0]-2*cm, A4[1]-0.65*cm, "Orris Medical AI | July 2026")
# footer
canvas.setFillColor(LIGHT_GREY)
canvas.rect(0, 0, A4[0], 0.9*cm, fill=1, stroke=0)
canvas.setFillColor(DARK_GREY)
canvas.setFont("Helvetica", 7.5)
canvas.drawCentredString(A4[0]/2, 0.35*cm, f"Page {doc.page}")
canvas.restoreState()
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUTPUT}")
build_pdf()
cd /home/daytona/workspace/de-novo-drug-design && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/de-novo-drug-design/De_Novo_Drug_Design_Notes.pdf
De Novo Drug Design Notes
PDF Document · PDF
| # | Section |
|---|---|
| 1 | Introduction & Historical Background (1990s - 2026) |
| 2 | Where De Novo Design Fits in the Discovery Pipeline |
| 3 | Core Approaches - Ligand-Based & Structure-Based (SBDD) |
| 4 | AI / Deep Learning Methods table (RNN, VAE, GAN, GNN, Diffusion, LLM, RL, Active Learning) |
| 5 | Molecular Representations (SMILES, SELFIES, graphs, fingerprints, descriptors) |
| 6 | Drug-Likeness & Multi-Property Optimisation (Lipinski Ro5, QED, ADMET, TPSA) |
| 7 | Notable Tools & Platforms (REINVENT, DRAGONFLY, DiffSBDD, AlphaFold3, RDKit) |
| 8 | Evaluation Metrics (validity, novelty, diversity, FCD, docking score, hit rate) |
| 9 | Experimentally Validated Examples (DSP-1181, ISM001, DRAGONFLY DprE1) |
| 10 | Challenges & Limitations |
| 11 | Future Directions (self-driving labs, digital twins, quantum computing) |
| 12 | Side-by-side comparison: Traditional HTS vs AI De Novo Design |
| 13 | Quick Revision Summary (11 numbered points) |