Defination of docking Principal of docking Importance of it and brief types of docking in detail in principal of drug discovery MPL203T subject in PDF format
molecular docking definition principles types drug discovery MPL203T
https://microbenotes.com/molecular-docking
mkdir -p /home/daytona/workspace/docking-pdf && ls /home/daytona/workspace/docki…
~/docking-pdf/generate_docking_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch, cm
from reportlab.lib.colors import HexColor, white, black
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.lib import colors
OUTPUT = "/home/daytona/workspace/docking-pdf/Molecular_Docking_MPL203T.pdf"
# ---- Colors ----
DARK_BLUE = HexColor("#1A3A5C")
MID_BLUE = HexColor("#2E6DA4")
LIGHT_BLUE = HexColor("#D6E8F7")
ACCENT = HexColor("#F0A500")
LIGHT_GREY = HexColor("#F5F5F5")
TEXT_COLOR = HexColor("#222222")
WHITE = white
# ---- Doc ----
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.5*cm, bottomMargin=2.5*cm,
title="Molecular Docking – MPL203T",
author="MPL203T: Principles of Drug Discovery"
)
W, H = A4
styles = getSampleStyleSheet()
# ---- Custom Styles ----
def make_style(name, parent='Normal', **kw):
s = ParagraphStyle(name, parent=styles[parent], **kw)
return s
cover_title_style = make_style('CoverTitle',
fontSize=28, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_CENTER,
leading=34, spaceAfter=8)
cover_sub_style = make_style('CoverSub',
fontSize=14, fontName='Helvetica',
textColor=LIGHT_BLUE, alignment=TA_CENTER,
leading=18, spaceAfter=4)
cover_code_style = make_style('CoverCode',
fontSize=11, fontName='Helvetica-Oblique',
textColor=ACCENT, alignment=TA_CENTER, leading=16)
h1_style = make_style('H1Custom',
fontSize=18, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_LEFT,
leading=22, spaceBefore=14, spaceAfter=6,
leftIndent=0, backColor=DARK_BLUE,
borderPadding=(6, 10, 6, 10))
h2_style = make_style('H2Custom',
fontSize=13, fontName='Helvetica-Bold',
textColor=DARK_BLUE, alignment=TA_LEFT,
leading=17, spaceBefore=12, spaceAfter=4,
borderPadding=(0, 0, 2, 0))
h3_style = make_style('H3Custom',
fontSize=11, fontName='Helvetica-Bold',
textColor=MID_BLUE, alignment=TA_LEFT,
leading=15, spaceBefore=8, spaceAfter=2)
body_style = make_style('BodyCustom',
fontSize=10, fontName='Helvetica',
textColor=TEXT_COLOR, alignment=TA_JUSTIFY,
leading=15, spaceBefore=3, spaceAfter=3,
leftIndent=0)
bullet_style = make_style('BulletCustom',
fontSize=10, fontName='Helvetica',
textColor=TEXT_COLOR, alignment=TA_LEFT,
leading=14, spaceBefore=2, spaceAfter=2,
leftIndent=16, bulletIndent=4)
highlight_style = make_style('Highlight',
fontSize=10, fontName='Helvetica',
textColor=DARK_BLUE, alignment=TA_JUSTIFY,
leading=14, spaceBefore=4, spaceAfter=4,
leftIndent=8, rightIndent=8,
backColor=LIGHT_BLUE,
borderPadding=(6, 8, 6, 8))
caption_style = make_style('Caption',
fontSize=8, fontName='Helvetica-Oblique',
textColor=HexColor("#666666"), alignment=TA_CENTER,
leading=11, spaceBefore=2, spaceAfter=6)
footer_style = make_style('Footer',
fontSize=8, fontName='Helvetica',
textColor=HexColor("#888888"), alignment=TA_CENTER, leading=10)
# ---- Helper functions ----
def section_header(text):
"""Returns a styled section header paragraph."""
data = [[Paragraph(text, h1_style)]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), DARK_BLUE),
('ROWBACKGROUNDS', (0,0), (-1,-1), [DARK_BLUE]),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
('LEFTPADDING', (0,0), (-1,-1), 12),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('BOX', (0,0), (-1,-1), 0, DARK_BLUE),
]))
return t
def info_box(text):
"""Returns a highlighted info box."""
data = [[Paragraph(text, highlight_style)]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), LIGHT_BLUE),
('BOX', (0,0), (-1,-1), 1, MID_BLUE),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
]))
return t
def bullet(text):
return Paragraph(f"<bullet>•</bullet> {text}", bullet_style)
# ---- Content ----
story = []
# ======== COVER PAGE ========
def draw_cover(canvas, doc):
canvas.saveState()
# Background gradient blocks
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, H*0.42, W, H*0.58, fill=1, stroke=0)
canvas.setFillColor(MID_BLUE)
canvas.rect(0, H*0.38, W, H*0.06, fill=1, stroke=0)
canvas.setFillColor(LIGHT_GREY)
canvas.rect(0, 0, W, H*0.38, fill=1, stroke=0)
# Accent bar
canvas.setFillColor(ACCENT)
canvas.rect(0, H*0.38, W, 0.18*cm, fill=1, stroke=0)
# Bottom bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, 0, W, 0.8*cm, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica", 8)
canvas.drawCentredString(W/2, 0.28*cm, "MPL203T: Principles of Drug Discovery | Molecular Docking")
canvas.restoreState()
# Add cover spacer and text (drawn via table over background)
cover_data = [
[Paragraph("MOLECULAR DOCKING", cover_title_style)],
[Paragraph("In Silico Drug Discovery", cover_sub_style)],
[Spacer(1, 0.3*cm)],
[Paragraph("MPL203T: Principles of Drug Discovery", cover_code_style)],
[Spacer(1, 0.15*cm)],
[Paragraph("Definition • Principles • Importance • Types", cover_code_style)],
]
# Use a frame approach: first add a tall spacer to push into blue zone
story.append(Spacer(1, 5.5*cm))
for row in cover_data:
story.append(row[0])
story.append(Spacer(1, 1.5*cm))
# Lower section of cover (on light grey)
cover_info_data = [
["Subject", "MPL203T: Principles of Drug Discovery"],
["Topic", "Molecular Docking"],
["Subtopics", "Definition, Principles, Importance, Types"],
["Date", "July 2026"],
]
cover_table = Table(cover_info_data, colWidths=[4*cm, 11*cm])
cover_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), MID_BLUE),
('BACKGROUND', (1,0), (1,-1), LIGHT_GREY),
('TEXTCOLOR', (0,0), (0,-1), WHITE),
('TEXTCOLOR', (1,0), (1,-1), DARK_BLUE),
('FONTNAME', (0,0), (-1,-1), 'Helvetica'),
('FONTNAME', (0,0), (0,-1), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,-1), 10),
('ALIGN', (0,0), (-1,-1), 'LEFT'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
('LEFTPADDING', (0,0), (-1,-1), 12),
('BOX', (0,0), (-1,-1), 1, MID_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.5, MID_BLUE),
]))
story.append(cover_table)
story.append(PageBreak())
# ======== PAGE 2: TABLE OF CONTENTS ========
story.append(section_header("TABLE OF CONTENTS"))
story.append(Spacer(1, 0.4*cm))
toc_data = [
["Section", "Topic", "Page"],
["1", "Definition of Molecular Docking", "3"],
["2", "Principles of Molecular Docking", "4"],
["3", "Importance of Molecular Docking", "6"],
["4", "Types of Molecular Docking", "8"],
["5", "Scoring Functions", "11"],
["6", "Docking Software & Tools", "12"],
["7", "Steps of Molecular Docking", "13"],
["8", "Applications in Drug Discovery", "14"],
["9", "Limitations", "15"],
["10", "Summary", "16"],
]
toc_table = Table(toc_data, colWidths=[2*cm, 12.5*cm, 2*cm])
toc_table.setStyle(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), 10),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('ALIGN', (0,0), (0,-1), 'CENTER'),
('ALIGN', (2,0), (2,-1), 'CENTER'),
('ALIGN', (1,0), (1,-1), 'LEFT'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
('LEFTPADDING', (0,0), (-1,-1), 10),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
]))
story.append(toc_table)
story.append(PageBreak())
# ======== SECTION 1: DEFINITION ========
story.append(section_header("1. DEFINITION OF MOLECULAR DOCKING"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("1.1 Basic Definition", h2_style))
story.append(Paragraph(
"Molecular docking is a <b>computational modelling technique</b> that predicts the preferred "
"orientation (pose) of a small molecule (ligand) when it binds to a macromolecular target "
"(receptor), and estimates the binding affinity of that interaction. It simulates the "
"molecular recognition process that occurs in biological systems between drug molecules and "
"their protein targets.",
body_style))
story.append(info_box(
"<b>Key Definition (Goodman & Gilman):</b> In docking, most or all of the protein is held rigid, "
"and the software tries a vast number of different locations and conformations — 'poses' — of a "
"small molecule in the target's binding site, searching for the one that is lowest in energy and "
"hence most stable."
))
story.append(Paragraph("1.2 Expanded Definition", h2_style))
story.append(Paragraph(
"The term 'docking' originates from the analogy of a ship fitting into a dock — the ligand "
"(drug molecule) 'docks' into the binding site of the receptor (protein target) in a "
"geometrically and energetically complementary manner. The process involves:",
body_style))
story.append(bullet("Predicting the three-dimensional binding pose of a ligand within the active site of a receptor"))
story.append(bullet("Evaluating the interaction energy (binding free energy) between the ligand and receptor"))
story.append(bullet("Ranking multiple ligand candidates based on their predicted binding affinities"))
story.append(bullet("Generating a 'docking score' that reflects the likelihood and strength of binding"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("1.3 Historical Context", h2_style))
story.append(Paragraph(
"Molecular docking emerged in the 1980s from the field of structural molecular biology and "
"structure-based drug discovery (rational drug discovery). The landmark DOCK program was "
"developed by Kuntz et al. at UCSF in 1982 to computationally fit small molecules into "
"protein active sites. Over the subsequent four decades, the technique has matured into a "
"cornerstone of modern computational drug discovery.",
body_style))
story.append(Paragraph("1.4 The Lock-and-Key Analogy", h2_style))
story.append(Paragraph(
"The conceptual basis of docking derives from Emil Fischer's Lock-and-Key hypothesis (1894). "
"The receptor (protein) acts as the 'lock' and the ligand (drug molecule) acts as the 'key'. "
"A drug molecule must fit precisely into the three-dimensional binding cavity of its target "
"receptor — both in terms of <b>shape complementarity</b> (geometric fit) and "
"<b>energy complementarity</b> (favorable non-covalent interactions).",
body_style))
story.append(PageBreak())
# ======== SECTION 2: PRINCIPLES ========
story.append(section_header("2. PRINCIPLES OF MOLECULAR DOCKING"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("2.1 Fundamental Physicochemical Principles", h2_style))
story.append(Paragraph(
"Molecular docking rests upon well-established physicochemical and thermodynamic principles "
"governing molecular recognition between biological macromolecules and small molecule ligands:",
body_style))
story.append(Paragraph("(A) Thermodynamic Principle — Free Energy Minimization", h3_style))
story.append(Paragraph(
"The central thermodynamic principle is that molecular binding proceeds toward "
"<b>minimization of the total free energy (Gibbs free energy, ΔG)</b> of the system. "
"A ligand binds in the pose that results in the most negative ΔG (i.e., the most favorable "
"binding). The binding free energy equation is:",
body_style))
story.append(info_box(
"<b>ΔG<sub>binding</sub> = ΔH<sub>binding</sub> - T·ΔS<sub>binding</sub></b><br/>"
"Where: ΔH = enthalpy change (non-covalent interactions), T = temperature, "
"ΔS = entropy change (conformational and solvation effects)"
))
story.append(Paragraph("(B) Complementarity Principle", h3_style))
story.append(Paragraph(
"Effective binding requires two-fold complementarity between the ligand and receptor:",
body_style))
story.append(bullet("<b>Geometric/Steric Complementarity:</b> The shape of the ligand must match the shape of the binding cavity (pocket) of the receptor. Steric clashes are energetically unfavorable and prevent binding."))
story.append(bullet("<b>Electrostatic/Chemical Complementarity:</b> The electrostatic surface of the ligand must be complementary to the electrostatic surface of the binding site (e.g., a positively charged group on the ligand aligns with a negatively charged residue on the protein)."))
story.append(Paragraph("(C) Non-Covalent Interaction Principles", h3_style))
story.append(Paragraph(
"Docking relies on modeling the following key non-covalent interactions that stabilize "
"ligand-receptor complexes:",
body_style))
interaction_data = [
["Interaction Type", "Description", "Typical Energy"],
["Hydrogen Bonds", "Electrostatic interaction between H-bond donor (N-H, O-H) and acceptor (N, O, F)", "2-10 kcal/mol"],
["Hydrophobic Interactions", "Non-polar regions of ligand pack against hydrophobic residues of receptor", "0.5-2 kcal/mol"],
["Van der Waals Forces", "Short-range attractive/repulsive forces between all atoms", "0.1-1 kcal/mol"],
["Ionic/Electrostatic", "Attraction between oppositely charged groups", "5-10 kcal/mol"],
["Pi-Pi Stacking", "Interaction between aromatic ring systems", "1-5 kcal/mol"],
["Cation-Pi Interactions", "Interaction between cation and pi electron cloud of aromatic ring", "1-5 kcal/mol"],
["Halogen Bonds", "Interaction between halogen atoms and electron donors", "1-5 kcal/mol"],
]
inter_table = Table(interaction_data, colWidths=[4.5*cm, 9*cm, 3*cm])
inter_table.setStyle(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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('ALIGN', (2,0), (2,-1), 'CENTER'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 7),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
]))
story.append(inter_table)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("(D) Conformational Search Principle", h3_style))
story.append(Paragraph(
"Since both the ligand and receptor can adopt multiple conformations, docking algorithms "
"must explore <b>conformational space</b> to find the optimal binding pose. This involves:",
body_style))
story.append(bullet("<b>Ligand conformational flexibility:</b> Rotation around single bonds, ring flipping, tautomer states"))
story.append(bullet("<b>Receptor flexibility:</b> Side-chain rotation, backbone movement, induced-fit effects"))
story.append(bullet("<b>Solvation effects:</b> Displacement of water molecules from binding site upon ligand binding"))
story.append(Paragraph("(E) Scoring Function Principle", h3_style))
story.append(Paragraph(
"After a pose is generated, a <b>scoring function</b> evaluates its quality by estimating "
"the binding affinity. The scoring function must balance accuracy with computational speed. "
"The four main types are:",
body_style))
story.append(bullet("<b>Force field-based:</b> Uses molecular mechanics force fields (AMBER, CHARMM) to calculate interaction energies"))
story.append(bullet("<b>Empirical:</b> Parameterized against experimental binding data using regression methods"))
story.append(bullet("<b>Knowledge-based:</b> Derived from statistical analysis of known protein-ligand crystal structures (PDB)"))
story.append(bullet("<b>Consensus scoring:</b> Combines multiple scoring functions to improve prediction accuracy"))
story.append(PageBreak())
# ======== SECTION 3: IMPORTANCE ========
story.append(section_header("3. IMPORTANCE OF MOLECULAR DOCKING"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("3.1 Role in Drug Discovery Pipeline", h2_style))
story.append(Paragraph(
"Molecular docking occupies a central position in the modern drug discovery pipeline. "
"It bridges the gap between the identification of a biological target and the development "
"of a clinical drug candidate. The traditional drug discovery process takes 12-15 years "
"and costs over $2.6 billion. Molecular docking dramatically reduces both.",
body_style))
importance_data = [
["Area of Importance", "Details"],
["Virtual Screening", "Screens millions of compounds computationally to identify hits; reduces time from years to days"],
["Cost Reduction", "Eliminates need to synthesize and test every compound experimentally; saves 40-60% of lead discovery costs"],
["Lead Optimization", "Guides structural modification of lead compounds to improve binding affinity, selectivity, and pharmacokinetics"],
["Target Validation", "Confirms that a target protein has a druggable binding site capable of accommodating a small molecule"],
["ADMET Prediction", "Helps predict absorption, distribution, metabolism, excretion, and toxicity properties"],
["Mechanistic Understanding", "Reveals the molecular basis of drug action and resistance mechanisms"],
["De Novo Design", "Enables design of novel drug molecules from scratch based on the receptor structure"],
["Repurposing", "Identifies new therapeutic applications for existing drugs by docking against new targets"],
["Reduced Animal Testing", "In silico screening reduces the number of animal experiments needed"],
]
imp_table = Table(importance_data, colWidths=[5.5*cm, 11*cm])
imp_table.setStyle(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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 8),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), DARK_BLUE),
]))
story.append(imp_table)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("3.2 Importance in Structure-Based Drug Design (SBDD)", h2_style))
story.append(Paragraph(
"Structure-based drug design (SBDD) relies heavily on molecular docking. When the 3D "
"crystal structure or NMR structure of a target protein is available (e.g., from the "
"Protein Data Bank, PDB), docking allows researchers to:",
body_style))
story.append(bullet("Visualize how a potential drug fits into the active site"))
story.append(bullet("Identify key protein residues involved in binding (pharmacophore features)"))
story.append(bullet("Predict the effect of mutations on drug binding (resistance prediction)"))
story.append(bullet("Guide medicinal chemistry decisions on which groups to add, remove, or modify on a lead compound"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("3.3 Importance in Ligand-Based Drug Design (LBDD)", h2_style))
story.append(Paragraph(
"Even when the receptor structure is not available, docking principles inform ligand-based "
"approaches: pharmacophore modeling, QSAR (quantitative structure-activity relationships), "
"and shape-based screening all draw on the steric and electrostatic complementarity "
"principles central to docking.",
body_style))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("3.4 COVID-19 and Emergency Drug Discovery", h2_style))
story.append(Paragraph(
"The importance of molecular docking was dramatically demonstrated during the COVID-19 "
"pandemic. Within weeks of the SARS-CoV-2 protease structure being published, researchers "
"worldwide performed large-scale virtual screening via docking to identify potential "
"inhibitors. This led to rapid identification of candidates including Nirmatrelvir "
"(Paxlovid). Docking remains a first-line tool in pandemic preparedness.",
body_style))
story.append(PageBreak())
# ======== SECTION 4: TYPES OF DOCKING ========
story.append(section_header("4. TYPES OF MOLECULAR DOCKING"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"Molecular docking can be classified based on: (i) the flexibility accorded to the "
"interacting molecules, (ii) the nature of the search algorithm, and (iii) the type "
"of molecular interactions studied. The major classifications are presented below.",
body_style))
story.append(Spacer(1, 0.2*cm))
# --- Type 1 ---
story.append(Paragraph("TYPE 1: Based on Molecular Flexibility", h2_style))
story.append(HRFlowable(width="100%", thickness=1, color=ACCENT))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("4.1.1 Rigid Body Docking (Lock-and-Key Docking)", h3_style))
story.append(info_box(
"<b>Definition:</b> Both the ligand and the receptor are treated as completely rigid (inflexible) "
"structures. Their atomic coordinates are fixed, and only the translational and rotational "
"degrees of freedom are explored."
))
story.append(Paragraph("<b>Principle:</b>", body_style))
story.append(Paragraph(
"Based on the classical Lock-and-Key model (Fischer, 1894). The ligand must fit into the "
"preformed rigid active site of the receptor without any conformational change in either "
"molecule. The docking is purely a problem of finding the best translational (x, y, z) "
"and rotational (alpha, beta, gamma) orientation in 6-dimensional space.",
body_style))
story.append(Paragraph("<b>Characteristics:</b>", body_style))
story.append(bullet("Both ligand and receptor: RIGID"))
story.append(bullet("Degrees of freedom: 6 (3 translational + 3 rotational)"))
story.append(bullet("Computationally: FASTEST and least demanding"))
story.append(bullet("Accuracy: LOWEST — ignores conformational changes upon binding"))
story.append(bullet("Best used for: Preliminary screening of large compound libraries when speed is paramount"))
story.append(Paragraph("<b>Example Software:</b> DOCK (original rigid-body mode), GRAMM", body_style))
story.append(Paragraph("<b>Limitations:</b> Does not reflect biological reality as most proteins undergo conformational changes upon ligand binding (induced-fit effect). May miss important binding poses.", body_style))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("4.1.2 Flexible Ligand Docking (Semi-Flexible Docking)", h3_style))
story.append(info_box(
"<b>Definition:</b> The ligand is treated as flexible (allowed to adopt multiple conformations) "
"while the receptor protein is kept rigid. This is the most widely used docking approach in "
"drug discovery."
))
story.append(Paragraph("<b>Principle:</b>", body_style))
story.append(Paragraph(
"The ligand can rotate freely around its rotatable bonds, allowing it to adopt multiple "
"conformations as it searches for the optimal binding pose. The conformational space of "
"the ligand is explored systematically or stochastically. The receptor active site, "
"however, remains fixed in its original crystal structure conformation.",
body_style))
story.append(Paragraph("<b>Characteristics:</b>", body_style))
story.append(bullet("Ligand: FLEXIBLE (rotatable bonds explored)"))
story.append(bullet("Receptor: RIGID (backbone and side chains fixed)"))
story.append(bullet("Degrees of freedom: 6 (rigid body) + N rotatable bonds of the ligand"))
story.append(bullet("Computationally: MODERATE — increases with number of rotatable bonds in ligand"))
story.append(bullet("Accuracy: MODERATE — captures ligand flexibility but misses receptor-induced changes"))
story.append(bullet("Most commonly used in: Virtual screening campaigns, lead identification"))
story.append(Paragraph("<b>Example Software:</b> AutoDock (Lamarckian Genetic Algorithm), GOLD, Glide (Standard Precision), FlexX", body_style))
story.append(Paragraph("<b>Algorithms used:</b> Genetic algorithms (AutoDock), Monte Carlo sampling (DOCK), Incremental construction (FlexX)", body_style))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("4.1.3 Flexible Docking (Fully Flexible / Induced-Fit Docking)", h3_style))
story.append(info_box(
"<b>Definition:</b> Both the ligand and the receptor (including protein side chains and sometimes "
"the backbone) are treated as flexible. This most accurately models the biological reality of "
"protein-ligand binding."
))
story.append(Paragraph("<b>Principle:</b>", body_style))
story.append(Paragraph(
"Based on the <b>Induced-Fit Model</b> (Koshland, 1958), which proposes that the receptor "
"changes its conformation upon ligand binding to achieve optimal complementarity — like a "
"hand fitting into a glove. Both the ligand's rotatable bonds AND the receptor's side chains "
"(and sometimes backbone) are allowed to move during docking. This requires extensive "
"conformational sampling of both molecules.",
body_style))
story.append(Paragraph("<b>Characteristics:</b>", body_style))
story.append(bullet("Ligand: FLEXIBLE"))
story.append(bullet("Receptor: FLEXIBLE (side chains, and optionally backbone)"))
story.append(bullet("Degrees of freedom: Very high — exponential increase in conformational space"))
story.append(bullet("Computationally: MOST DEMANDING and time-consuming"))
story.append(bullet("Accuracy: HIGHEST — best reflects the true binding mechanism"))
story.append(bullet("Best used for: Lead optimization, when receptor flexibility is known to be important"))
story.append(Paragraph("<b>Example Software:</b> Glide IFD (Induced-Fit Docking), AutoDock Vina (partial), GOLD (flexible side chains), MOE", body_style))
story.append(PageBreak())
# --- Type 2 ---
story.append(Paragraph("TYPE 2: Based on Binding Site Knowledge", h2_style))
story.append(HRFlowable(width="100%", thickness=1, color=ACCENT))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("4.2.1 Binding-Site (Local) Docking", h3_style))
story.append(info_box(
"<b>Definition:</b> Docking is restricted to a defined region of the receptor — typically the "
"known or predicted active site or binding pocket."
))
story.append(Paragraph(
"When the binding site is known (e.g., from X-ray crystallography of a co-crystal with a "
"known ligand), docking is focused on that specific region. A search box or grid is defined "
"around the active site residues. This greatly reduces computational time and improves "
"accuracy by eliminating irrelevant surface regions.",
body_style))
story.append(bullet("Search space: Limited to a defined binding pocket"))
story.append(bullet("Requires: Prior knowledge of the binding site location"))
story.append(bullet("Speed: Faster than blind docking"))
story.append(bullet("Applications: Standard virtual screening, SAR studies"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("4.2.2 Blind Docking", h3_style))
story.append(info_box(
"<b>Definition:</b> The ligand is allowed to sample the entire protein surface without "
"any prior assumption about the binding site location."
))
story.append(Paragraph(
"Blind docking is used when the binding site is unknown. The entire protein surface is "
"used as the search space. The software identifies all possible binding sites by "
"systematically sampling the whole protein and then ranks them by binding energy. This "
"approach is used to discover <b>novel binding sites</b>, <b>allosteric sites</b>, and "
"for proteins of unknown function.",
body_style))
story.append(bullet("Search space: Entire protein surface"))
story.append(bullet("Computationally: Very demanding"))
story.append(bullet("Use case: When binding site is unknown, cryptic site discovery, allosteric site identification"))
story.append(bullet("Tools: AutoDock (whole-protein grid), ClusPro (protein-protein)"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("TYPE 3: Based on Molecular Targets", h2_style))
story.append(HRFlowable(width="100%", thickness=1, color=ACCENT))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("4.3.1 Protein-Ligand Docking", h3_style))
story.append(Paragraph(
"The most common type. A small molecule (drug candidate) is docked into the binding site "
"of a target protein (enzyme, receptor, ion channel, transporter). This is the primary "
"approach in small-molecule drug discovery. Examples include docking inhibitors into "
"enzyme active sites (e.g., HIV protease, kinases, COX enzymes) or agonists/antagonists "
"into GPCRs.",
body_style))
story.append(Paragraph("4.3.2 Protein-Protein Docking", h3_style))
story.append(Paragraph(
"Predicts how two proteins interact and form a complex. Used to study protein-protein "
"interactions (PPIs) which are important therapeutic targets (e.g., p53-MDM2, BCL-2 family "
"interactions). More complex than small molecule docking due to larger, more flexible "
"interfaces. Tools include ClusPro, ZDOCK, and HADDOCK.",
body_style))
story.append(Paragraph("4.3.3 Protein-DNA/RNA Docking", h3_style))
story.append(Paragraph(
"Models interactions between proteins and nucleic acids. Important for studying transcription "
"factor binding, nuclease activity, and designing nucleic-acid-targeting drugs. Requires "
"special treatment of the nucleic acid backbone flexibility and electrostatics.",
body_style))
story.append(Paragraph("4.3.4 Covalent Docking", h3_style))
story.append(Paragraph(
"Models ligands that form a covalent bond with a specific residue in the receptor (e.g., "
"cysteine protease inhibitors, irreversible kinase inhibitors like afatinib). The docking "
"algorithm must account for bond formation geometry in addition to non-covalent interactions. "
"Used for designing covalent drugs and warhead optimization.",
body_style))
story.append(Paragraph("4.3.5 Fragment-Based Docking", h3_style))
story.append(Paragraph(
"Small molecular fragments (MW < 300 Da) are docked into different sub-pockets of a "
"binding site. High-binding fragments are then linked or grown to produce a full drug "
"molecule. Used in fragment-based drug discovery (FBDD), which has produced drugs like "
"Venetoclax (BCL-2 inhibitor).",
body_style))
story.append(PageBreak())
# ======== TYPE COMPARISON TABLE ========
story.append(Paragraph("4.4 Comparison of Major Docking Types", h2_style))
story.append(Spacer(1, 0.2*cm))
compare_data = [
["Parameter", "Rigid Body\nDocking", "Flexible Ligand\nDocking", "Fully Flexible\nDocking"],
["Ligand Flexibility", "Rigid", "Flexible", "Flexible"],
["Receptor Flexibility", "Rigid", "Rigid", "Flexible"],
["Degrees of Freedom", "6 DOF", "6 + N(bonds)", "Very High"],
["Computational Cost", "Low", "Moderate", "High"],
["Accuracy", "Low", "Moderate", "High"],
["Best For", "Large-scale\nscreening", "Virtual\nscreening", "Lead\noptimization"],
["Basis Model", "Lock-and-Key", "Modified\nLock-and-Key", "Induced Fit\nModel"],
["Example Software", "DOCK\n(original)", "AutoDock,\nGlide SP", "Glide IFD,\nGOLD"],
]
comp_table = Table(compare_data, colWidths=[4*cm, 3.5*cm, 3.5*cm, 4*cm])
comp_table.setStyle(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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('ALIGN', (1,0), (-1,-1), 'CENTER'),
('ALIGN', (0,0), (0,-1), 'LEFT'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 6),
('BOX', (0,0), (-1,-1), 1.5, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.5, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), DARK_BLUE),
('BACKGROUND', (1,1), (1,-1), HexColor("#EEF5FB")),
('BACKGROUND', (2,1), (2,-1), HexColor("#D6E8F7")),
('BACKGROUND', (3,1), (3,-1), HexColor("#C0DBF0")),
]))
story.append(comp_table)
story.append(PageBreak())
# ======== SECTION 5: SCORING FUNCTIONS ========
story.append(section_header("5. SCORING FUNCTIONS"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"After generating docked poses, a scoring function estimates the binding affinity. "
"The scoring function is critical — it determines which poses are ranked as best. "
"Four main categories exist:",
body_style))
score_data = [
["Scoring Type", "Basis", "Advantages", "Disadvantages"],
["Force Field-Based\n(e.g., AutoDock, DOCK)", "Molecular mechanics\nenergy (van der Waals,\nelectrostatics)", "Physically rigorous;\nwell-parameterized", "Computationally slow;\nneglects entropy"],
["Empirical\n(e.g., ChemScore, GlideScore)", "Regression against\nexperimental Ki/Kd data;\nweighted interaction terms", "Fast; good correlation\nwith experiment", "Limited transferability;\ntrained on limited data"],
["Knowledge-Based\n(e.g., PMF, DrugScore)", "Statistical potentials\nderived from PDB\ncrystal structures", "No parameterization\nneeded; captures\nstatistical preferences", "Depends on quality\nand coverage of PDB"],
["Consensus Scoring\n(e.g., X-Score)", "Combines 2+ scoring\nfunctions; averages or\nensemble approaches", "Most robust;\nreduces individual\nfunction biases", "Computationally\nmost expensive"],
]
score_table = Table(score_data, colWidths=[4.5*cm, 4.5*cm, 3.5*cm, 4*cm])
score_table.setStyle(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_BLUE]),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 6),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), DARK_BLUE),
]))
story.append(score_table)
story.append(PageBreak())
# ======== SECTION 6: SOFTWARE & TOOLS ========
story.append(section_header("6. DOCKING SOFTWARE AND TOOLS"))
story.append(Spacer(1, 0.3*cm))
software_data = [
["Software", "Developer", "Algorithm", "Key Features"],
["AutoDock 4/Vina", "Scripps Research\n(Free)", "Lamarckian Genetic\nAlgorithm / Monte\nCarlo", "Most widely used;\nfree; flexible ligand;\nopen source"],
["Glide\n(Schrodinger)", "Schrodinger Inc.\n(Commercial)", "Systematic search +\nMonte Carlo minimization", "SP, XP, IFD modes;\nhigh accuracy;\nindustry standard"],
["GOLD", "CCDC\n(Commercial)", "Genetic Algorithm", "Flexible receptor\nside chains; good\nfor lead optimization"],
["DOCK 6", "UCSF\n(Free)", "Anchor-and-grow\n(incremental)", "Original docking\nprogram; good for\nfragment docking"],
["FlexX", "BioSolveIT\n(Commercial)", "Incremental\nconstruction", "Fast; good for\nhigh-throughput\nscreening"],
["MOE", "Chemical Computing\nGroup (Commercial)", "Alpha-sphere\ntriangle matching", "Comprehensive\ndrug design suite;\nprotein prep tools"],
["rDock/rDock2", "Vernalis (Free)", "Monte Carlo\n+ genetic algorithm", "High-throughput;\nRNA docking;\nfully open-source"],
]
sw_table = Table(software_data, colWidths=[3.5*cm, 3.5*cm, 4*cm, 5.5*cm])
sw_table.setStyle(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_BLUE]),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), DARK_BLUE),
]))
story.append(sw_table)
story.append(PageBreak())
# ======== SECTION 7: STEPS OF MOLECULAR DOCKING ========
story.append(section_header("7. STEPS OF MOLECULAR DOCKING"))
story.append(Spacer(1, 0.3*cm))
steps_data = [
["Step", "Name", "Description"],
["1", "Target Selection &\nPreparation", "Select the protein target (PDB structure). Remove water molecules, add hydrogen atoms, assign charges, optimize protonation states."],
["2", "Binding Site\nIdentification", "Define the active site using known co-crystal ligand positions, site-finder algorithms, or evolutionary conservation analysis."],
["3", "Ligand Preparation", "Generate 3D ligand structure, enumerate stereoisomers, tautomers, and protonation states. Minimize energy. Assign partial charges (Gasteiger, AM1-BCC)."],
["4", "Grid Generation", "Create an interaction grid (energy grid) over the binding site that pre-calculates van der Waals and electrostatic potentials for fast scoring."],
["5", "Docking Run", "Run the docking algorithm: search algorithm explores poses (translational + rotational + conformational space); scoring function evaluates each pose."],
["6", "Post-Docking\nAnalysis", "Cluster the poses by RMSD. Select top-ranked poses. Visualize protein-ligand interactions (H-bonds, hydrophobic contacts, pi stacking)."],
["7", "Validation", "Validate results by re-docking known co-crystallized ligand and checking RMSD < 2 Å from crystal pose. Enrichment factor analysis for virtual screening."],
["8", "Hit Selection", "Select top-scoring compounds as 'hits' for experimental validation (biochemical assays, SPR, ITC for binding affinity measurement)."],
]
steps_table = Table(steps_data, colWidths=[1.2*cm, 3.8*cm, 11.5*cm])
steps_table.setStyle(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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('ALIGN', (0,0), (0,-1), 'CENTER'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 6),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), WHITE),
('BACKGROUND', (0,1), (0,-1), MID_BLUE),
('FONTNAME', (1,1), (1,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (1,1), (1,-1), DARK_BLUE),
]))
story.append(steps_table)
story.append(PageBreak())
# ======== SECTION 8: APPLICATIONS ========
story.append(section_header("8. APPLICATIONS IN DRUG DISCOVERY"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"Molecular docking has found diverse applications throughout the drug discovery and "
"development pipeline:",
body_style))
app_data = [
["Application", "Description", "Example"],
["Virtual Screening", "Screen millions of compounds against a target to identify hits", "Screening ChEMBL database against SARS-CoV-2 Mpro"],
["Lead Optimization", "Improve affinity and selectivity of a lead compound", "Modifying kinase inhibitor scaffold based on binding interactions"],
["ADMET Profiling", "Predict metabolic liability by docking to CYP450 enzymes", "CYP3A4 docking to predict drug metabolism"],
["Drug Repurposing", "Identify new targets for existing drugs", "Baricitinib identified for COVID-19 via AI-assisted docking"],
["Resistance Mechanism Study", "Model effect of mutations on drug binding", "HIV protease mutations reducing lopinavir binding"],
["De Novo Drug Design", "Design new molecules that fit a binding site", "Fragment growing into HIV integrase active site"],
["Toxicity Prediction", "Predict off-target binding (hERG, CYP, etc.)", "hERG channel docking for cardiotoxicity risk assessment"],
["Allosteric Site Discovery", "Identify novel druggable pockets", "Allosteric BCR-ABL inhibitors from blind docking"],
["Natural Product Studies", "Screen plant-derived compounds for bioactivity", "Curcumin docking against NF-kB, COX-2 targets"],
]
app_table = Table(app_data, colWidths=[4*cm, 6*cm, 6.5*cm])
app_table.setStyle(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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), DARK_BLUE),
]))
story.append(app_table)
story.append(PageBreak())
# ======== SECTION 9: LIMITATIONS ========
story.append(section_header("9. LIMITATIONS OF MOLECULAR DOCKING"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"Despite its power and utility, molecular docking has important limitations that must "
"be understood for proper interpretation of results:",
body_style))
lim_data = [
["Limitation", "Details"],
["Inaccurate Scoring Functions", "Current scoring functions cannot reliably rank-order compounds for absolute binding affinity; empirical approximations lead to false positives/negatives"],
["Protein Flexibility", "Fully flexible receptor docking is computationally expensive; rigid-receptor approximations miss induced-fit effects and cryptic binding sites"],
["Solvation Treatment", "Explicit water molecules in the binding site are usually omitted; implicit solvation models are approximations"],
["Entropic Contributions", "Conformational entropy changes upon binding are poorly estimated; can lead to overestimation of binding affinity"],
["Protonation States", "The ionization state of titratable residues and the ligand at physiological pH can significantly affect docking results"],
["Co-factor and Metal Ions", "Treatment of metal coordination in metalloprotein active sites requires specialized force field parameters"],
["Allosteric Sites", "Standard site-focused docking misses allosteric binding pockets; requires blind docking or separate pocket prediction"],
["False Positives", "Compounds that score well in docking may not bind experimentally; enrichment factors often < 50%"],
["Cannot Replace Experiment", "Docking results must always be validated with biochemical and biophysical experiments (SPR, ITC, X-ray crystallography)"],
]
lim_table = Table(lim_data, colWidths=[5*cm, 11.5*cm])
lim_table.setStyle(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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 7),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.3, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), DARK_BLUE),
]))
story.append(lim_table)
story.append(PageBreak())
# ======== SECTION 10: SUMMARY ========
story.append(section_header("10. SUMMARY"))
story.append(Spacer(1, 0.3*cm))
story.append(info_box(
"<b>Molecular Docking in a Nutshell:</b><br/>"
"Molecular docking is the computational prediction of how a drug (ligand) binds to its "
"biological target (receptor). It is guided by the principles of free energy minimization, "
"geometric and electrostatic complementarity, and non-covalent interaction forces. "
"It is indispensable for virtual screening, lead optimization, and structure-based drug design."
))
summary_data = [
["Concept", "Key Point"],
["Definition", "Computational method to predict ligand-receptor binding pose and affinity"],
["Core Principle", "Minimize Gibbs free energy (ΔG); maximize geometric and electrostatic complementarity"],
["Non-covalent Forces", "H-bonds, hydrophobic contacts, van der Waals, pi-pi stacking, electrostatic interactions"],
["Key Models", "Lock-and-Key (rigid), Induced-Fit (flexible), Conformational Selection (ensemble)"],
["Type 1 (by flexibility)", "Rigid body | Flexible ligand (semi-flexible) | Fully flexible (induced-fit)"],
["Type 2 (by search space)", "Binding-site (local) docking | Blind docking"],
["Type 3 (by target)", "Protein-ligand | Protein-protein | Protein-DNA | Covalent | Fragment-based"],
["Scoring Functions", "Force field | Empirical | Knowledge-based | Consensus"],
["Major Software", "AutoDock/Vina, Glide (Schrodinger), GOLD (CCDC), DOCK 6 (UCSF)"],
["Importance", "Accelerates drug discovery, reduces cost, enables virtual screening of millions of compounds"],
["Limitation", "Approximate scoring; must validate experimentally"],
]
sum_table = Table(summary_data, colWidths=[5*cm, 11.5*cm])
sum_table.setStyle(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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 8),
('BOX', (0,0), (-1,-1), 1.5, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.5, MID_BLUE),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
('TEXTCOLOR', (0,1), (0,-1), DARK_BLUE),
('BACKGROUND', (0,4), (-1,4), HexColor("#D0E8D0")),
('BACKGROUND', (0,5), (-1,5), HexColor("#D0E0F0")),
('BACKGROUND', (0,6), (-1,6), HexColor("#F0E0D0")),
]))
story.append(sum_table)
story.append(Spacer(1, 0.5*cm))
story.append(HRFlowable(width="100%", thickness=1.5, color=ACCENT))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"References: Goodman & Gilman's Pharmacological Basis of Therapeutics (2023); "
"Guedes et al., Biophys Rev (2014); Meng et al., Curr Comput Aided Drug Des (2011); "
"Agu et al., Scientific Reports (2023); IJPS Journal Review on Molecular Docking (2024).",
caption_style))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"MPL203T: Principles of Drug Discovery | Molecular Docking Notes | July 2026",
footer_style))
# ---- Page decoration function ----
def add_page_decorations(canvas, doc):
canvas.saveState()
# Header bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, H - 1.2*cm, W, 1.2*cm, fill=1, stroke=0)
canvas.setFillColor(ACCENT)
canvas.rect(0, H - 1.2*cm - 0.15*cm, W, 0.15*cm, fill=1, stroke=0)
# Header text
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica-Bold", 9)
canvas.drawString(2*cm, H - 0.8*cm, "MPL203T: Principles of Drug Discovery")
canvas.setFont("Helvetica", 9)
canvas.drawRightString(W - 2*cm, H - 0.8*cm, "Molecular Docking")
# Footer bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, 0, W, 1*cm, fill=1, stroke=0)
# Page number
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica", 8)
page_num = canvas.getPageNumber()
canvas.drawCentredString(W/2, 0.35*cm, f"Page {page_num}")
canvas.restoreState()
# ---- First page (cover) uses different decoration ----
def cover_page_decoration(canvas, doc):
draw_cover(canvas, doc)
# ---- Build document ----
doc.build(
story,
onFirstPage=cover_page_decoration,
onLaterPages=add_page_decorations
)
print(f"PDF successfully created: {OUTPUT}")
cd /home/daytona/workspace/docking-pdf && python generate_docking_pdf.py
ls -lh /home/daytona/workspace/docking-pdf/Molecular_Docking_MPL203T.pdf
Molecular Docking MPL203T
PDF Document · PDF
| Principle | Core Idea |
|---|---|
| Free Energy Minimization | ΔG = ΔH - TΔS; the system finds the lowest energy binding pose |
| Geometric Complementarity | Shape of ligand must match the receptor cavity |
| Electrostatic Complementarity | Charge distributions must be complementary |
| Non-covalent Interactions | H-bonds, hydrophobic contacts, van der Waals, pi-pi stacking |
| Conformational Search | Exploration of all rotatable bonds and receptor flexibility |
| Scoring Function | Mathematical estimation of binding affinity from pose |