Note on de novo drug design in PDF format

Reading File
Reading File
Finding Sources
Finding Sources
Searching the Web

de novo drug design methods AI computational approaches 2024 2025

Finding Sources
Reading Web Page

https://www.frontiersin.org/journals/hematology/articles/10.…

Reading File
Searching PubMed

"de novo drug design" generative AI deep learning

Reading File
Reading File
Running Command

mkdir -p /home/daytona/workspace/de-novo-drug-design && ls /home/daytona/workspace/de-novo-drug-design/

Writing File

~/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()
Running Command

cd /home/daytona/workspace/de-novo-drug-design && python generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/de-novo-drug-design/De_Novo_Drug_Design_Notes.pdf

Your PDF is ready for download:

De Novo Drug Design Notes

PDF Document · PDF


Here is what the note covers across 13 structured sections:
Section overview:
#Section
1Introduction & Historical Background (1990s - 2026)
2Where De Novo Design Fits in the Discovery Pipeline
3Core Approaches - Ligand-Based & Structure-Based (SBDD)
4AI / Deep Learning Methods table (RNN, VAE, GAN, GNN, Diffusion, LLM, RL, Active Learning)
5Molecular Representations (SMILES, SELFIES, graphs, fingerprints, descriptors)
6Drug-Likeness & Multi-Property Optimisation (Lipinski Ro5, QED, ADMET, TPSA)
7Notable Tools & Platforms (REINVENT, DRAGONFLY, DiffSBDD, AlphaFold3, RDKit)
8Evaluation Metrics (validity, novelty, diversity, FCD, docking score, hit rate)
9Experimentally Validated Examples (DSP-1181, ISM001, DRAGONFLY DprE1)
10Challenges & Limitations
11Future Directions (self-driving labs, digital twins, quantum computing)
12Side-by-side comparison: Traditional HTS vs AI De Novo Design
13Quick Revision Summary (11 numbered points)
Sources include Goodman & Gilman's Pharmacological Basis of Therapeutics, PubMed reviews (PMIDs 38485516, 38663579, 40632942, 41778634, 38925473), and the 2024 DRAGONFLY Nature Communications paper.
This is a shared conversation. Sign in to Orris to start your own chat.