Create a 2.5 days study plan for me everyday has 3 slots morning, afternoon and evening Basic Biochemistry Carbohydrates (Basic Chemistry of Biomolecules) Lipids Proteins and Amino Acids Nucleic Acids (imp) Vitamins (imp) Hormones (imp) Enzymes (Michael Menten Equation) (imp) Metabolic Fate of Carbohydrates (imp) Metabolic Fate of Lipids (imp) Metabolic Fate of Proteins and Amino Acids (imp) Bioenergetics (imp) Gene Expression Introduction to Clinical Chemistry At the end Create image

Generating Image

A clean, colorful 2.5-day biochemistry study plan timetable poster. Title at top: "Biochemistry Study Plan - 2.5 Days". Table with 3 columns: Day 1, Day 2, Day 3 (half day). Each day has 3 rows: Morning, Afternoon, Evening (Day 3 only has Morning). Each slot shows subject name and an icon. Color coding: yellow for morning, light blue for afternoon, purple for evening. Important topics marked with a red star. Topics distributed as follows - Day 1 Morning: Basic Biochemistry + Carbohydrates, Day 1 Afternoon: Lipids + Proteins and Amino Acids, Day 1 Evening: Enzymes (Michaelis-Menten Equation) starred; Day 2 Morning: Nucleic Acids starred + Vitamins starred, Day 2 Afternoon: Hormones starred + Bioenergetics starred, Day 2 Evening: Metabolic Fate of Carbohydrates starred + Metabolic Fate of Lipids starred; Day 3 Morning: Metabolic Fate of Proteins starred + Gene Expression + Introduction to Clinical Chemistry. Footer note: "imp = important topics marked with star". Modern flat design, readable fonts, white background, pastel colors.

Here is your complete 2.5-Day Biochemistry Study Plan:

πŸ“… Day 1 - Wednesday (May 27)

SlotTopicsNotes
πŸŒ… MorningBasic Biochemistry + Carbohydrates (Basic Chemistry of Biomolecules)Foundations first - get comfortable with terminology and structures
β˜€οΈ AfternoonLipids + Proteins and Amino AcidsStructure-function focus; link amino acid properties to protein behavior
πŸŒ™ Evening⭐ Enzymes (Michaelis-Menten Equation)High-yield - graph interpretation, Km, Vmax, inhibition types

πŸ“… Day 2 - Thursday (May 28)

SlotTopicsNotes
πŸŒ… Morning⭐ Nucleic Acids + ⭐ VitaminsDNA/RNA structure + fat/water-soluble vitamin deficiencies (classic MCQ territory)
β˜€οΈ Afternoon⭐ Hormones + ⭐ BioenergeticsSignal transduction mechanisms + ATP yield calculations (glycolysis, TCA, ETC)
πŸŒ™ Evening⭐ Metabolic Fate of Carbohydrates + ⭐ Metabolic Fate of LipidsGlycolysis, gluconeogenesis, glycogen metabolism; fatty acid oxidation, ketogenesis

πŸ“… Day 3 - Friday (May 29) - Half Day

SlotTopicsNotes
πŸŒ… Morning⭐ Metabolic Fate of Proteins & Amino Acids + Gene Expression + Introduction to Clinical ChemistryUrea cycle, transamination; transcription/translation overview; lab reference ranges

Strategy Tips

  • ⭐ = Important (imp) topics - these are your exam priorities; review these again on Day 3 afternoon if time permits
  • Metabolic topics (Day 2 Evening + Day 3 Morning) are interconnected - draw pathway maps as you go
  • Michaelis-Menten (Day 1 Evening) is a standalone mathematical topic - practice graph-based MCQs
  • Vitamins & Hormones are pure memory - use mnemonics and tables
  • After each slot, do a 10-minute review of what you just studied before the next session

Biochemistry Study Plan

Generate a downloadable PDF study guide for Day 1 topics

Reading File
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Running Command

mkdir -p /home/daytona/workspace/biochem-study-guide && ls /home/daytona/workspa…

Writing File

~/biochem-study-guide/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
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 ListFlowable, ListItem
from reportlab.lib.colors import HexColor

OUTPUT = "/home/daytona/workspace/biochem-study-guide/Day1_Biochemistry_Study_Guide.pdf"

# ── Colour palette ──────────────────────────────────────────────────────────
C_DARK_BLUE   = HexColor("#1A237E")
C_BLUE        = HexColor("#1565C0")
C_LIGHT_BLUE  = HexColor("#E3F2FD")
C_ACCENT      = HexColor("#FF8F00")
C_GREEN       = HexColor("#2E7D32")
C_GREEN_LIGHT = HexColor("#E8F5E9")
C_RED         = HexColor("#C62828")
C_RED_LIGHT   = HexColor("#FFEBEE")
C_ORANGE_LIGHT= HexColor("#FFF3E0")
C_PURPLE      = HexColor("#6A1B9A")
C_PURPLE_LIGHT= HexColor("#F3E5F5")
C_YELLOW_LIGHT= HexColor("#FFFDE7")
C_GREY        = HexColor("#546E7A")
C_GREY_LIGHT  = HexColor("#ECEFF1")
WHITE         = colors.white
BLACK         = colors.black

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=2*cm, rightMargin=2*cm,
    topMargin=2.5*cm, bottomMargin=2.5*cm,
    title="Day 1 Biochemistry Study Guide",
    author="Orris Study Planner"
)

styles = getSampleStyleSheet()

def S(name, **kw):
    """Create a named ParagraphStyle that extends 'Normal'."""
    return ParagraphStyle(name, parent=styles["Normal"], **kw)

# Custom styles
Title       = S("DocTitle",  fontSize=26, textColor=WHITE, alignment=TA_CENTER,
                spaceAfter=4, fontName="Helvetica-Bold", leading=32)
Subtitle    = S("Subtitle",  fontSize=12, textColor=HexColor("#BBDEFB"),
                alignment=TA_CENTER, spaceAfter=6, fontName="Helvetica")
SectionHead = S("SectionH",  fontSize=15, textColor=WHITE, fontName="Helvetica-Bold",
                spaceAfter=3, spaceBefore=6, leading=20)
SubHead     = S("SubHead",   fontSize=11, textColor=C_DARK_BLUE, fontName="Helvetica-Bold",
                spaceAfter=2, spaceBefore=6, leading=14)
Body        = S("Body",      fontSize=9.5, leading=14, spaceAfter=4,
                fontName="Helvetica", alignment=TA_JUSTIFY)
Bullet      = S("Bullet",    fontSize=9.5, leading=13, leftIndent=12,
                fontName="Helvetica", spaceAfter=2)
SmallBold   = S("SmallBold", fontSize=9, fontName="Helvetica-Bold", textColor=C_DARK_BLUE,
                spaceAfter=2)
KeyPoint    = S("KeyPoint",  fontSize=9.5, fontName="Helvetica-BoldOblique",
                textColor=C_RED, leading=13, spaceAfter=2)
MCQ_Q       = S("MCQQ",      fontSize=9.5, fontName="Helvetica-Bold", leading=13, spaceAfter=1)
MCQ_A       = S("MCQA",      fontSize=9.5, fontName="Helvetica", leading=12,
                textColor=C_GREEN, leftIndent=8, spaceAfter=4)
TableHead   = S("TableH",    fontSize=9, fontName="Helvetica-Bold", textColor=WHITE,
                alignment=TA_CENTER, leading=12)
TableCell   = S("TableC",    fontSize=8.5, fontName="Helvetica", leading=11,
                alignment=TA_LEFT)
FooterStyle = S("Footer",    fontSize=8, textColor=C_GREY, alignment=TA_CENTER)

# ── Helper flowables ─────────────────────────────────────────────────────────
def colored_box(para_text, bg=C_LIGHT_BLUE, border=C_BLUE, radius=4):
    tbl = Table([[Paragraph(para_text, Body)]], colWidths=[16.5*cm])
    tbl.setStyle(TableStyle([
        ("BACKGROUND",  (0,0), (-1,-1), bg),
        ("BOX",         (0,0), (-1,-1), 0.8, border),
        ("ROUNDEDCORNERS", [radius]),
        ("TOPPADDING",  (0,0), (-1,-1), 6),
        ("BOTTOMPADDING",(0,0),(-1,-1), 6),
        ("LEFTPADDING", (0,0), (-1,-1), 10),
        ("RIGHTPADDING",(0,0), (-1,-1), 10),
    ]))
    return tbl

def section_header_table(emoji, title, bg=C_BLUE):
    tbl = Table([[Paragraph(f"{emoji}  {title}", SectionHead)]], colWidths=[16.5*cm])
    tbl.setStyle(TableStyle([
        ("BACKGROUND",   (0,0), (-1,-1), bg),
        ("ROUNDEDCORNERS", [6]),
        ("TOPPADDING",   (0,0), (-1,-1), 8),
        ("BOTTOMPADDING",(0,0), (-1,-1), 8),
        ("LEFTPADDING",  (0,0), (-1,-1), 12),
    ]))
    return tbl

def bullet_list(items, indent=12):
    rows = []
    for item in items:
        rows.append(Paragraph(f"β€’ {item}", Bullet))
    return rows

def mcq_block(questions):
    """questions = list of (question, answer) tuples"""
    items = []
    for i, (q, a) in enumerate(questions, 1):
        items.append(Paragraph(f"Q{i}. {q}", MCQ_Q))
        items.append(Paragraph(f"βœ“ {a}", MCQ_A))
    tbl = Table([[item] for item in items], colWidths=[16.5*cm])
    tbl.setStyle(TableStyle([
        ("BACKGROUND",  (0,0), (-1,-1), C_YELLOW_LIGHT),
        ("BOX",         (0,0), (-1,-1), 0.5, C_ACCENT),
        ("TOPPADDING",  (0,0), (-1,-1), 4),
        ("BOTTOMPADDING",(0,0),(-1,-1), 4),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
    ]))
    return tbl

def key_point(text):
    return colored_box(f"<b>β˜… Key Point:</b> {text}", bg=C_RED_LIGHT, border=C_RED)

def hr():
    return HRFlowable(width="100%", thickness=0.5, color=C_GREY_LIGHT, spaceAfter=4)


# ══════════════════════════════════════════════════════════════════════════════
#  BUILD STORY
# ══════════════════════════════════════════════════════════════════════════════
story = []

# ── COVER PAGE ────────────────────────────────────────────────────────────────
cover_data = [[
    Paragraph("BIOCHEMISTRY", Title),
    Paragraph("Day 1 Study Guide", Subtitle),
    Paragraph("Morning Β· Afternoon Β· Evening", Subtitle),
    Paragraph("Basic Biochemistry  |  Carbohydrates  |  Lipids  |  Proteins &amp; Amino Acids  |  Enzymes (Michaelis-Menten)", Subtitle),
    Spacer(1, 0.3*cm),
    Paragraph("Source: Basic Medical Biochemistry - A Clinical Approach 6e &amp; Harper's Illustrated Biochemistry 32e", FooterStyle),
]]
cover_tbl = Table(cover_data, colWidths=[16.5*cm])
cover_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0), (-1,-1), C_DARK_BLUE),
    ("ROUNDEDCORNERS", [10]),
    ("TOPPADDING",   (0,0), (-1,-1), 30),
    ("BOTTOMPADDING",(0,0), (-1,-1), 30),
    ("LEFTPADDING",  (0,0), (-1,-1), 20),
    ("RIGHTPADDING", (0,0), (-1,-1), 20),
    ("ALIGN",        (0,0), (-1,-1), "CENTER"),
    ("VALIGN",       (0,0), (-1,-1), "MIDDLE"),
]))
story.append(Spacer(1, 1*cm))
story.append(cover_tbl)
story.append(Spacer(1, 0.5*cm))

# Schedule summary box
sched_data = [
    [Paragraph("<b>Slot</b>", TableHead), Paragraph("<b>Topics</b>", TableHead), Paragraph("<b>Focus</b>", TableHead)],
    [Paragraph("πŸŒ… Morning", TableCell),
     Paragraph("Basic Biochemistry + Carbohydrates", TableCell),
     Paragraph("Foundations, structures, classification", TableCell)],
    [Paragraph("β˜€οΈ Afternoon", TableCell),
     Paragraph("Lipids + Proteins &amp; Amino Acids", TableCell),
     Paragraph("Structure-function, classification", TableCell)],
    [Paragraph("πŸŒ™ Evening ⭐", TableCell),
     Paragraph("Enzymes (Michaelis-Menten) - HIGH YIELD", TableCell),
     Paragraph("Kinetics, graphs, inhibition types", TableCell)],
]
sched_tbl = Table(sched_data, colWidths=[3.5*cm, 7*cm, 6*cm])
sched_tbl.setStyle(TableStyle([
    ("BACKGROUND",  (0,0), (-1,0), C_DARK_BLUE),
    ("BACKGROUND",  (0,1), (-1,1), C_LIGHT_BLUE),
    ("BACKGROUND",  (0,2), (-1,2), C_ORANGE_LIGHT),
    ("BACKGROUND",  (0,3), (-1,3), C_PURPLE_LIGHT),
    ("BOX",         (0,0), (-1,-1), 1,   C_DARK_BLUE),
    ("INNERGRID",   (0,0), (-1,-1), 0.4, C_GREY),
    ("TOPPADDING",  (0,0), (-1,-1), 5),
    ("BOTTOMPADDING",(0,0),(-1,-1), 5),
    ("LEFTPADDING", (0,0), (-1,-1), 8),
    ("ALIGN",       (0,0), (-1,0), "CENTER"),
    ("VALIGN",      (0,0), (-1,-1), "MIDDLE"),
]))
story.append(sched_tbl)
story.append(PageBreak())


# ══════════════════════════════════════════════════════════════════════════════
#  SECTION 1 – BASIC BIOCHEMISTRY
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header_table("πŸŒ…", "SLOT 1 β€” MORNING", bg=HexColor("#1565C0")))
story.append(Spacer(1, 0.2*cm))
story.append(section_header_table("πŸ“˜", "Topic 1: Basic Biochemistry", bg=HexColor("#37474F")))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Overview", SubHead))
story.append(Paragraph(
    "Biochemistry is the study of the chemical processes that occur within living organisms. "
    "It bridges chemistry and biology, explaining how molecules interact to sustain life. "
    "The major biomolecules are carbohydrates, lipids, proteins, and nucleic acids β€” each composed "
    "of smaller repeating units (monomers) joined to form polymers.",
    Body))

story.append(Paragraph("Levels of Biological Organisation", SubHead))
story.extend(bullet_list([
    "<b>Atoms</b> β†’ Molecules β†’ Macromolecules β†’ Organelles β†’ Cells β†’ Tissues β†’ Organs β†’ Organism",
    "Carbon (C), Hydrogen (H), Oxygen (O), Nitrogen (N), Phosphorus (P), Sulfur (S) are the key elements of life",
    "Water (~70% body weight) β€” universal solvent; polar molecule enabling hydrogen bonding",
]))

story.append(Paragraph("pH and Buffers", SubHead))
story.extend(bullet_list([
    "pH = -log[H⁺]; physiologic blood pH = 7.35–7.45",
    "<b>Henderson-Hasselbalch equation:</b> pH = pKa + log([A⁻]/[HA])",
    "Bicarbonate buffer (Hβ‚‚CO₃/HCO₃⁻) is the primary blood buffer",
    "Phosphate buffer (Hβ‚‚PO₄⁻/HPO₄²⁻) important intracellularly",
    "Proteins act as buffers via histidine residues (pKa ~6)",
]))
story.append(key_point("Blood pH below 7.35 = acidosis; above 7.45 = alkalosis. Both are life-threatening."))

story.append(Paragraph("Key Chemical Bonds in Biomolecules", SubHead))
bond_data = [
    [Paragraph("<b>Bond Type</b>", TableHead), Paragraph("<b>Description</b>", TableHead), Paragraph("<b>Example</b>", TableHead)],
    [Paragraph("Covalent", TableCell), Paragraph("Shared electrons; very strong", TableCell), Paragraph("C-C, C-H, peptide bond", TableCell)],
    [Paragraph("Hydrogen", TableCell), Paragraph("H between electronegative atoms; weak individually, strong collectively", TableCell), Paragraph("DNA base pairs, protein secondary structure", TableCell)],
    [Paragraph("Ionic", TableCell), Paragraph("Attraction between + and - charges", TableCell), Paragraph("Salt bridges in proteins", TableCell)],
    [Paragraph("Van der Waals", TableCell), Paragraph("Weak transient dipole-dipole", TableCell), Paragraph("Hydrophobic cores", TableCell)],
    [Paragraph("Disulfide (-S-S-)", TableCell), Paragraph("Covalent bond between two Cys residues", TableCell), Paragraph("Protein 3D structure stability", TableCell)],
]
bond_tbl = Table(bond_data, colWidths=[3.5*cm, 8*cm, 5*cm])
bond_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_DARK_BLUE),
    ("BACKGROUND",   (0,1),(-1,-1), C_GREY_LIGHT),
    ("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, C_GREY_LIGHT]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_DARK_BLUE),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(bond_tbl)

story.append(Spacer(1, 0.3*cm))
story.append(mcq_block([
    ("Which bond is responsible for maintaining the primary structure of proteins?",
     "Peptide bond (covalent amide bond between Ξ±-carboxyl and Ξ±-amino groups of adjacent amino acids)"),
    ("At physiologic pH 7.4, which buffer system is most important in blood?",
     "Bicarbonate buffer system (Hβ‚‚CO₃ β‡Œ H⁺ + HCO₃⁻)"),
]))
story.append(Spacer(1, 0.5*cm))
story.append(hr())


# ══════════════════════════════════════════════════════════════════════════════
#  SECTION 2 – CARBOHYDRATES
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header_table("🍬", "Topic 2: Carbohydrates", bg=HexColor("#37474F")))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Definition & General Formula", SubHead))
story.append(Paragraph(
    "Carbohydrates (saccharides) are polyhydroxy aldehydes or ketones with the general formula (CHβ‚‚O)n. "
    "They are the primary energy source (4 kcal/g) and serve structural roles (cellulose, glycosaminoglycans).",
    Body))

story.append(Paragraph("Classification", SubHead))
carb_data = [
    [Paragraph("<b>Class</b>", TableHead), Paragraph("<b>Units</b>", TableHead), Paragraph("<b>Key Examples</b>", TableHead), Paragraph("<b>Notes</b>", TableHead)],
    [Paragraph("Monosaccharides", TableCell), Paragraph("1", TableCell),
     Paragraph("Glucose, Fructose, Galactose, Ribose, Deoxyribose", TableCell),
     Paragraph("Cannot be hydrolysed further; aldoses vs ketoses", TableCell)],
    [Paragraph("Disaccharides", TableCell), Paragraph("2", TableCell),
     Paragraph("Sucrose (Glc+Fru), Lactose (Gal+Glc), Maltose (Glc+Glc)", TableCell),
     Paragraph("Joined by glycosidic bonds", TableCell)],
    [Paragraph("Oligosaccharides", TableCell), Paragraph("3-10", TableCell),
     Paragraph("Raffinose, Stachyose", TableCell),
     Paragraph("Found on cell surfaces", TableCell)],
    [Paragraph("Polysaccharides", TableCell), Paragraph(">10", TableCell),
     Paragraph("Glycogen, Starch, Cellulose", TableCell),
     Paragraph("Storage (glycogen/starch) or structural (cellulose)", TableCell)],
]
carb_tbl = Table(carb_data, colWidths=[3.5*cm, 1.5*cm, 6*cm, 5.5*cm])
carb_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_DARK_BLUE),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_LIGHT_BLUE]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_DARK_BLUE),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(carb_tbl)

story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Glucose Isomers β€” High Yield!", SubHead))
story.extend(bullet_list([
    "<b>Epimers:</b> Differ at ONE carbon β€” C4 epimer of glucose = galactose; C2 epimer = mannose",
    "<b>Anomers (Ξ± vs Ξ²):</b> Differ at C1 (anomeric carbon) β€” Ξ±-glucose vs Ξ²-glucose",
    "<b>Enantiomers:</b> Mirror images β€” D-glucose (body uses D-form) vs L-glucose",
    "<b>Reducing sugars:</b> Have free anomeric OH β€” glucose, galactose, maltose, lactose (NOT sucrose)",
    "Fructose is a ketohexose (ketone at C2); all others above are aldohexoses",
]))

story.append(Paragraph("Important Polysaccharides", SubHead))
poly_data = [
    [Paragraph("<b>Polysaccharide</b>", TableHead), Paragraph("<b>Linkage</b>", TableHead), Paragraph("<b>Function/Location</b>", TableHead)],
    [Paragraph("Glycogen", TableCell), Paragraph("Ξ±-1,4 (chain); Ξ±-1,6 (branch)", TableCell),
     Paragraph("Energy storage in liver & muscle", TableCell)],
    [Paragraph("Starch (Amylose)", TableCell), Paragraph("Ξ±-1,4 only (unbranched)", TableCell),
     Paragraph("Plant energy storage", TableCell)],
    [Paragraph("Starch (Amylopectin)", TableCell), Paragraph("Ξ±-1,4 + Ξ±-1,6 (branched)", TableCell),
     Paragraph("Plant energy storage", TableCell)],
    [Paragraph("Cellulose", TableCell), Paragraph("Ξ²-1,4 (humans cannot digest)", TableCell),
     Paragraph("Plant structural; dietary fiber", TableCell)],
    [Paragraph("Hyaluronic acid", TableCell), Paragraph("Ξ²-1,3 (GlcUA-GlcNAc repeats)", TableCell),
     Paragraph("Connective tissue, synovial fluid", TableCell)],
]
poly_tbl = Table(poly_data, colWidths=[4*cm, 5*cm, 7.5*cm])
poly_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_GREEN),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_GREEN_LIGHT]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_GREEN),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(poly_tbl)

story.append(Spacer(1, 0.2*cm))
story.append(key_point(
    "Glycogen is MORE branched than amylopectin. Branching allows RAPID mobilisation of glucose "
    "(many free ends = simultaneous phosphorylase action). Liver glycogen maintains blood glucose; "
    "muscle glycogen fuels only local muscle."))

story.append(Spacer(1, 0.2*cm))
story.append(mcq_block([
    ("Which disaccharide is NOT a reducing sugar?",
     "Sucrose β€” the glycosidic bond involves both anomeric carbons (C1 of glucose + C2 of fructose), "
     "leaving no free anomeric OH."),
    ("What type of glycosidic linkage in cellulose makes it indigestible in humans?",
     "Ξ²-1,4 glycosidic linkage β€” humans lack Ξ²-glucosidase (cellulase)."),
    ("Galactosemia results from deficiency of which enzyme?",
     "Galactose-1-phosphate uridylyltransferase (GALT) β€” causes accumulation of galactose-1-phosphate, toxic to liver, brain, and eyes."),
]))
story.append(Spacer(1, 0.5*cm))
story.append(PageBreak())


# ══════════════════════════════════════════════════════════════════════════════
#  SECTION 3 – LIPIDS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header_table("β˜€οΈ", "SLOT 2 β€” AFTERNOON", bg=HexColor("#E65100")))
story.append(Spacer(1, 0.2*cm))
story.append(section_header_table("🧈", "Topic 3: Lipids", bg=HexColor("#37474F")))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Definition", SubHead))
story.append(Paragraph(
    "Lipids are hydrophobic or amphipathic biomolecules soluble in organic solvents (ether, chloroform) "
    "but poorly soluble in water. They include fats, oils, waxes, sterols, and fat-soluble vitamins. "
    "Energy yield: 9 kcal/g (more than double that of carbohydrates/proteins).",
    Body))

story.append(Paragraph("Classification of Lipids", SubHead))
story.extend(bullet_list([
    "<b>Simple lipids:</b> Esters of fatty acids with glycerol β€” triglycerides (triacylglycerols), waxes",
    "<b>Complex lipids:</b> Contain additional groups β€” phospholipids (phosphate), glycolipids (sugar), sphingolipids",
    "<b>Derived lipids:</b> Steroids (cholesterol, bile acids, steroid hormones), eicosanoids (prostaglandins)",
    "<b>Amphipathic lipids:</b> Have both hydrophilic head and hydrophobic tail (phospholipids, sphingomyelin)",
]))

story.append(Paragraph("Fatty Acids β€” Key Facts", SubHead))
story.extend(bullet_list([
    "<b>Structure:</b> Straight aliphatic chain with COOH at one end (C1) and CH₃ at the other (Ο‰-carbon)",
    "<b>Notation:</b> C:D (e.g. 18:1, Δ⁹) β€” carbons : double bonds, position of double bond",
    "<b>Saturated:</b> No double bonds β€” palmitic (16:0), stearic (18:0) β€” solid at room temp",
    "<b>Monounsaturated:</b> One double bond β€” oleic acid (18:1, Ο‰-9)",
    "<b>Polyunsaturated:</b> β‰₯2 double bonds β€” linoleic (18:2, Ο‰-6), Ξ±-linolenic (18:3, Ο‰-3) β€” essential fatty acids",
    "<b>Trans fatty acids:</b> Artificially hydrogenated β€” raise LDL, lower HDL β€” atherogenic",
    "<b>Essential Fatty Acids (EFA):</b> Linoleic (Ο‰-6) and Ξ±-linolenic (Ο‰-3) β€” must come from diet",
    "Arachidonic acid (20:4, Ο‰-6): precursor to prostaglandins, thromboxanes, leukotrienes",
]))
story.append(key_point(
    "All double bonds in naturally occurring fatty acids are CIS configuration (bent chain). "
    "Trans fats (margarine) are artificially produced and cardiovascular risk factors."))

story.append(Paragraph("Phospholipids", SubHead))
story.extend(bullet_list([
    "Major components of cell membranes (lipid bilayer)",
    "Structure: glycerol backbone + 2 fatty acids + phosphate + head group",
    "<b>Phosphatidylcholine (lecithin):</b> Most abundant β€” lung surfactant",
    "<b>Phosphatidylserine:</b> Inner leaflet of plasma membrane; apoptosis signal when flipped outward",
    "<b>Phosphatidylinositol:</b> Second messenger precursor (IP₃ + DAG via PLC)",
    "<b>Cardiolipin:</b> Unique to inner mitochondrial membrane; required for oxidative phosphorylation",
    "<b>Sphingomyelin:</b> Contains ceramide + phosphocholine; myelin sheath component",
]))

story.append(Paragraph("Cholesterol", SubHead))
story.extend(bullet_list([
    "Sterol with 4-ring steroid nucleus; precursor to bile acids, steroid hormones, vitamin D",
    "Component of cell membranes β€” modulates fluidity (prevents both crystallisation and excess fluidity)",
    "Transported in blood as lipoproteins (LDL, HDL, VLDL, IDL)",
    "Plasma total cholesterol: <200 mg/dL (desirable); LDL <100 mg/dL (optimal)",
]))

story.append(Paragraph("Lipoproteins Summary", SubHead))
lipo_data = [
    [Paragraph("<b>Lipoprotein</b>", TableHead), Paragraph("<b>Density</b>", TableHead),
     Paragraph("<b>% Triglyceride</b>", TableHead), Paragraph("<b>Function</b>", TableHead)],
    [Paragraph("Chylomicron", TableCell), Paragraph("Lowest", TableCell),
     Paragraph("85-88%", TableCell), Paragraph("Dietary fat from gut β†’ peripheral tissues", TableCell)],
    [Paragraph("VLDL", TableCell), Paragraph("Very Low", TableCell),
     Paragraph("50-55%", TableCell), Paragraph("Endogenous TG from liver β†’ tissues", TableCell)],
    [Paragraph("IDL", TableCell), Paragraph("Intermediate", TableCell),
     Paragraph("30%", TableCell), Paragraph("VLDL remnant; β†’ LDL", TableCell)],
    [Paragraph("LDL", TableCell), Paragraph("Low", TableCell),
     Paragraph("10%", TableCell), Paragraph('"Bad cholesterol" β€” delivers cholesterol to cells', TableCell)],
    [Paragraph("HDL", TableCell), Paragraph("High", TableCell),
     Paragraph("5%", TableCell), Paragraph('"Good cholesterol" β€” reverse cholesterol transport', TableCell)],
]
lipo_tbl = Table(lipo_data, colWidths=[3*cm, 2.5*cm, 3.5*cm, 7.5*cm])
lipo_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_PURPLE),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_PURPLE_LIGHT]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_PURPLE),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(lipo_tbl)

story.append(Spacer(1, 0.2*cm))
story.append(mcq_block([
    ("Which fatty acids are essential (cannot be synthesised by humans)?",
     "Linoleic acid (18:2, Ο‰-6) and Ξ±-linolenic acid (18:3, Ο‰-3). Arachidonic acid is conditionally essential."),
    ("Which lipoprotein is responsible for reverse cholesterol transport?",
     "HDL (High-Density Lipoprotein) β€” transports cholesterol from peripheral tissues back to the liver."),
    ("A deficiency in which lipid component causes respiratory distress syndrome in premature neonates?",
     "Phosphatidylcholine (dipalmitoyl lecithin) β€” the major lung surfactant that reduces alveolar surface tension."),
]))
story.append(Spacer(1, 0.5*cm))
story.append(PageBreak())


# ══════════════════════════════════════════════════════════════════════════════
#  SECTION 4 – PROTEINS AND AMINO ACIDS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header_table("🧬", "Topic 4: Proteins and Amino Acids", bg=HexColor("#37474F")))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Amino Acid Structure", SubHead))
story.append(Paragraph(
    "All 20 standard amino acids have the same core structure: a central Ξ±-carbon bonded to "
    "an amino group (-NHβ‚‚), a carboxyl group (-COOH), a hydrogen atom, and a unique side chain (R group). "
    "At physiologic pH, they exist as zwitterions (both -NH₃⁺ and -COO⁻ ionised).",
    Body))
story.append(colored_box(
    "<b>General amino acid structure:</b>  Hβ‚‚N-CHR-COOH (free form) | ⁺H₃N-CHR-COO⁻ (zwitterion at pH 7)",
    bg=C_LIGHT_BLUE, border=C_BLUE))

story.append(Paragraph("Classification of 20 Standard Amino Acids", SubHead))
aa_data = [
    [Paragraph("<b>Group</b>", TableHead), Paragraph("<b>Amino Acids</b>", TableHead), Paragraph("<b>Key Features</b>", TableHead)],
    [Paragraph("Non-polar, aliphatic", TableCell),
     Paragraph("Gly, Ala, Val, Leu, Ile, Pro, Met", TableCell),
     Paragraph("Hydrophobic; form protein core", TableCell)],
    [Paragraph("Aromatic", TableCell),
     Paragraph("Phe, Tyr, Trp", TableCell),
     Paragraph("Absorb UV at 280 nm (used to measure protein conc.)", TableCell)],
    [Paragraph("Polar, uncharged", TableCell),
     Paragraph("Ser, Thr, Cys, Asn, Gln", TableCell),
     Paragraph("H-bond donors/acceptors; Ser/Thr phosphorylated in signalling", TableCell)],
    [Paragraph("Positively charged (+ve)", TableCell),
     Paragraph("Lys, Arg, His", TableCell),
     Paragraph("Basic; His pKa ~6 β€” important buffer; Lys acetylated in histones", TableCell)],
    [Paragraph("Negatively charged (-ve)", TableCell),
     Paragraph("Asp, Glu", TableCell),
     Paragraph("Acidic; form salt bridges; neurotransmitter (Glu)", TableCell)],
    [Paragraph("Special", TableCell),
     Paragraph("Pro (cyclic), Cys (disulfide), Gly (smallest)", TableCell),
     Paragraph("Pro = helix breaker; Cys-Cys = disulfide bonds (3Β° structure)", TableCell)],
]
aa_tbl = Table(aa_data, colWidths=[4*cm, 5.5*cm, 7*cm])
aa_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_DARK_BLUE),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_LIGHT_BLUE]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_DARK_BLUE),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(aa_tbl)

story.append(Paragraph("Essential Amino Acids β€” Mnemonic", SubHead))
story.append(colored_box(
    '<b>"PVT TIM HaLL"</b> β€” Phenylalanine, Valine, Tryptophan, Threonine, Isoleucine, Methionine, '
    'Histidine (conditionally essential in adults), Leucine, Lysine<br/>'
    '<i>Arginine is also conditionally essential (required during growth/illness)</i>',
    bg=C_YELLOW_LIGHT, border=C_ACCENT))

story.append(Paragraph("Levels of Protein Structure", SubHead))
struct_data = [
    [Paragraph("<b>Level</b>", TableHead), Paragraph("<b>Definition</b>", TableHead), Paragraph("<b>Stabilised By</b>", TableHead)],
    [Paragraph("1Β° Primary", TableCell),
     Paragraph("Linear sequence of amino acids in polypeptide chain", TableCell),
     Paragraph("Covalent peptide bonds", TableCell)],
    [Paragraph("2Β° Secondary", TableCell),
     Paragraph("Local folding: Ξ±-helix, Ξ²-pleated sheet, Ξ²-turn, random coil", TableCell),
     Paragraph("Hydrogen bonds between backbone C=O and N-H", TableCell)],
    [Paragraph("3Β° Tertiary", TableCell),
     Paragraph("Overall 3D folding of single polypeptide", TableCell),
     Paragraph("H-bonds, ionic bonds, Van der Waals, disulfide bonds (-S-S-), hydrophobic interactions", TableCell)],
    [Paragraph("4Β° Quaternary", TableCell),
     Paragraph("Assembly of multiple polypeptide subunits (only oligomeric proteins)", TableCell),
     Paragraph("Same as 3Β° between subunits (no covalent bonds except disulfide)", TableCell)],
]
struct_tbl = Table(struct_data, colWidths=[3*cm, 7*cm, 6.5*cm])
struct_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_GREEN),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_GREEN_LIGHT]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_GREEN),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(struct_tbl)
story.append(Spacer(1, 0.2*cm))
story.append(key_point(
    "Hemoglobin has QUATERNARY structure (2Ξ± + 2Ξ² subunits). Myoglobin has only TERTIARY structure. "
    "Sickle cell anemia: Glu→Val substitution at position 6 of β-chain (primary structure change)."))

story.append(Paragraph("Protein Denaturation", SubHead))
story.extend(bullet_list([
    "Disruption of 2Β°, 3Β°, 4Β° structure (NOT peptide bonds) β€” loss of function",
    "Causes: heat, extremes of pH, organic solvents, detergents, urea/guanidine",
    "May be reversible (chaperone-assisted refolding) or irreversible (boiling an egg)",
    "Prion diseases (Creutzfeldt-Jakob) β€” misfolded proteins that induce misfolding of normal proteins",
]))

story.append(Spacer(1, 0.2*cm))
story.append(mcq_block([
    ("Which amino acid is unique in that its side chain forms a ring with its backbone nitrogen (imino acid)?",
     "Proline β€” its cyclic structure disrupts Ξ±-helices and Ξ²-sheets. It is the 'helix breaker'."),
    ("Disulfide bonds stabilise which level of protein structure?",
     "Tertiary (and quaternary) structure β€” formed between two cysteine residues (Cys-S-S-Cys)."),
    ("Which amino acid absorbs maximally at 280 nm and is also the precursor to serotonin?",
     "Tryptophan (Trp, W) β€” aromatic ring absorbs UV 280 nm; converted to serotonin by tryptophan hydroxylase."),
]))
story.append(Spacer(1, 0.5*cm))
story.append(PageBreak())


# ══════════════════════════════════════════════════════════════════════════════
#  SECTION 5 – ENZYMES (MICHAELIS-MENTEN)  ⭐ HIGH YIELD
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header_table("πŸŒ™", "SLOT 3 β€” EVENING  ⭐ HIGH YIELD", bg=HexColor("#4A148C")))
story.append(Spacer(1, 0.2*cm))
story.append(section_header_table("βš—οΈ", "Topic 5: Enzymes β€” Michaelis-Menten Kinetics", bg=HexColor("#37474F")))
story.append(Spacer(1, 0.3*cm))

story.append(Paragraph("Enzyme Fundamentals", SubHead))
story.extend(bullet_list([
    "Enzymes are biological catalysts (mostly proteins; some RNA = ribozymes)",
    "They lower the <b>activation energy (Ea)</b> of a reaction β€” do NOT change Ξ”G or equilibrium",
    "<b>Active site:</b> Specific region that binds substrate (S) to form Enzyme-Substrate (ES) complex",
    "<b>Cofactors:</b> Non-protein helpers β€” metal ions (Mg²⁺, Zn²⁺, Fe²⁺)",
    "<b>Coenzymes:</b> Organic cofactors (mostly vitamins) β€” NAD⁺, FAD, CoA, TPP, PLP",
    "<b>Apoenzyme</b> (protein alone) + cofactor = <b>Holoenzyme</b> (active form)",
    "<b>Specificity:</b> Lock-and-key (rigid) or Induced-fit model (conformational change on substrate binding β€” more accurate)",
]))

story.append(Paragraph("Michaelis-Menten Equation", SubHead))
story.append(colored_box(
    '<b>v = Vmax Γ— [S] / (Km + [S])</b><br/><br/>'
    'v = reaction velocity at substrate concentration [S]<br/>'
    'Vmax = maximum reaction velocity (all active sites saturated)<br/>'
    'Km = Michaelis constant = [S] at which v = Vmax/2<br/>'
    '<br/><b>Km is a measure of enzyme-substrate AFFINITY:</b><br/>'
    'β€’ LOW Km β†’ HIGH affinity (enzyme binds substrate tightly, needs little [S])<br/>'
    'β€’ HIGH Km β†’ LOW affinity (needs high [S] to reach half-maximal velocity)',
    bg=C_RED_LIGHT, border=C_RED))

story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Key Kinetic Parameters", SubHead))
kin_data = [
    [Paragraph("<b>Parameter</b>", TableHead), Paragraph("<b>Definition</b>", TableHead), Paragraph("<b>Clinical Relevance</b>", TableHead)],
    [Paragraph("Vmax", TableCell),
     Paragraph("Maximum velocity; all enzyme active sites occupied by substrate", TableCell),
     Paragraph("Proportional to total enzyme concentration [E]total", TableCell)],
    [Paragraph("Km", TableCell),
     Paragraph("[S] at which v = Vmax/2; reflects affinity", TableCell),
     Paragraph("Competitive inhibitor ↑Km; Non-competitive ↓Vmax", TableCell)],
    [Paragraph("kcat (turnover number)", TableCell),
     Paragraph("Reactions catalysed per enzyme per second at full saturation", TableCell),
     Paragraph("Catalase: 40,000,000/s; very fast", TableCell)],
    [Paragraph("kcat/Km (catalytic efficiency)", TableCell),
     Paragraph("Best measure of enzyme efficiency", TableCell),
     Paragraph("Upper limit ~10⁸–10⁹ M⁻¹s⁻¹ (diffusion-limited)", TableCell)],
]
kin_tbl = Table(kin_data, colWidths=[4*cm, 6.5*cm, 6*cm])
kin_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_PURPLE),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_PURPLE_LIGHT]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_PURPLE),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(kin_tbl)

story.append(Paragraph("Types of Enzyme Inhibition β€” EXAM CRITICAL", SubHead))
inh_data = [
    [Paragraph("<b>Type</b>", TableHead), Paragraph("<b>Mechanism</b>", TableHead),
     Paragraph("<b>Effect on Km</b>", TableHead), Paragraph("<b>Effect on Vmax</b>", TableHead), Paragraph("<b>Example</b>", TableHead)],
    [Paragraph("Competitive", TableCell),
     Paragraph("Inhibitor resembles substrate; binds active site; overcome by ↑[S]", TableCell),
     Paragraph("↑ Km (apparent)", TableCell), Paragraph("Unchanged", TableCell),
     Paragraph("Methotrexate (DHFR); Statins (HMG-CoA reductase)", TableCell)],
    [Paragraph("Non-competitive (Pure)", TableCell),
     Paragraph("Binds allosteric site; ES complex still forms; cannot overcome with ↑[S]", TableCell),
     Paragraph("Unchanged", TableCell), Paragraph("↓ Vmax", TableCell),
     Paragraph("Cyanide (cytochrome c oxidase)", TableCell)],
    [Paragraph("Uncompetitive", TableCell),
     Paragraph("Binds only ES complex (not free enzyme); both Km and Vmax decrease equally", TableCell),
     Paragraph("↓ Km (apparent)", TableCell), Paragraph("↓ Vmax", TableCell),
     Paragraph("Lithium (rare, clinical)", TableCell)],
    [Paragraph("Mixed", TableCell),
     Paragraph("Binds both E and ES; usually non-competitive component dominates", TableCell),
     Paragraph("↑ or ↓ Km", TableCell), Paragraph("↓ Vmax", TableCell),
     Paragraph("Many allosteric inhibitors", TableCell)],
    [Paragraph("Irreversible", TableCell),
     Paragraph("Covalent binding to active site β€” permanent inactivation", TableCell),
     Paragraph("N/A", TableCell), Paragraph("↓↓ Vmax", TableCell),
     Paragraph("Aspirin (COX-1/2); Organophosphates (AChE)", TableCell)],
]
inh_tbl = Table(inh_data, colWidths=[3*cm, 5.5*cm, 2.3*cm, 2.3*cm, 3.4*cm])
inh_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_RED),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_RED_LIGHT]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_RED),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 3),
    ("BOTTOMPADDING",(0,0),(-1,-1), 3),
    ("LEFTPADDING",  (0,0),(-1,-1), 5),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
    ("FONTSIZE",     (0,0),(-1,-1), 8),
]))
story.append(inh_tbl)

story.append(Spacer(1, 0.2*cm))
story.append(key_point(
    "Lineweaver-Burk (double-reciprocal) plot: x-axis = 1/[S], y-axis = 1/v. "
    "x-intercept = -1/Km; y-intercept = 1/Vmax; slope = Km/Vmax. "
    "Competitive inhibitor: SAME y-intercept (same Vmax), different x-intercept (different Km). "
    "Non-competitive: SAME x-intercept (same Km), different y-intercept (different Vmax)."))

story.append(Paragraph("Enzyme Regulation", SubHead))
story.extend(bullet_list([
    "<b>Allosteric regulation:</b> Binding of activator/inhibitor at allosteric site β†’ conformational change β†’ sigmoidal kinetics (NOT Michaelis-Menten); Hill equation applies",
    "<b>Covalent modification:</b> Phosphorylation/dephosphorylation by kinases/phosphatases (e.g., glycogen phosphorylase: active when phosphorylated)",
    "<b>Proteolytic cleavage:</b> Zymogens activated by cleavage — pepsinogen→pepsin, trypsinogen→trypsin, prothrombin→thrombin",
    "<b>Feedback inhibition:</b> End product inhibits early enzyme in pathway (e.g., ATP inhibits phosphofructokinase-1)",
    "<b>Isoenzymes:</b> Multiple forms of same enzyme β€” different Km/Vmax β€” LDH isoenzymes (LDH1 in heart, LDH5 in liver)",
]))

story.append(Paragraph("Clinically Important Enzyme Inhibitors (Drug Mechanisms)", SubHead))
drug_data = [
    [Paragraph("<b>Drug</b>", TableHead), Paragraph("<b>Enzyme Inhibited</b>", TableHead), Paragraph("<b>Use</b>", TableHead), Paragraph("<b>Type</b>", TableHead)],
    [Paragraph("Aspirin", TableCell), Paragraph("COX-1 and COX-2", TableCell),
     Paragraph("Anti-platelet, anti-inflammatory", TableCell), Paragraph("Irreversible", TableCell)],
    [Paragraph("Statins", TableCell), Paragraph("HMG-CoA reductase", TableCell),
     Paragraph("Hypercholesterolaemia", TableCell), Paragraph("Competitive", TableCell)],
    [Paragraph("Methotrexate", TableCell), Paragraph("Dihydrofolate reductase", TableCell),
     Paragraph("Cancer, rheumatoid arthritis", TableCell), Paragraph("Competitive", TableCell)],
    [Paragraph("Allopurinol", TableCell), Paragraph("Xanthine oxidase", TableCell),
     Paragraph("Gout (↓ uric acid)", TableCell), Paragraph("Competitive then irreversible", TableCell)],
    [Paragraph("ACE inhibitors", TableCell), Paragraph("Angiotensin-converting enzyme", TableCell),
     Paragraph("Hypertension, heart failure", TableCell), Paragraph("Competitive", TableCell)],
    [Paragraph("Organophosphates", TableCell), Paragraph("Acetylcholinesterase (AChE)", TableCell),
     Paragraph("Insecticides / nerve agents", TableCell), Paragraph("Irreversible", TableCell)],
]
drug_tbl = Table(drug_data, colWidths=[3.5*cm, 5*cm, 5*cm, 3*cm])
drug_tbl.setStyle(TableStyle([
    ("BACKGROUND",   (0,0),(-1,0), C_DARK_BLUE),
    ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, C_LIGHT_BLUE]),
    ("BOX",          (0,0),(-1,-1), 0.8, C_DARK_BLUE),
    ("INNERGRID",    (0,0),(-1,-1), 0.3, C_GREY),
    ("TOPPADDING",   (0,0),(-1,-1), 4),
    ("BOTTOMPADDING",(0,0),(-1,-1), 4),
    ("LEFTPADDING",  (0,0),(-1,-1), 6),
    ("VALIGN",       (0,0),(-1,-1), "MIDDLE"),
]))
story.append(drug_tbl)

story.append(Spacer(1, 0.3*cm))
story.append(mcq_block([
    ("A new drug binds the active site of an enzyme. At high [S], reaction velocity equals that of the uninhibited enzyme. What type of inhibition is this?",
     "Competitive inhibition β€” increasing [S] can overcome competitive inhibitors. Vmax is unchanged; only apparent Km increases."),
    ("On a Lineweaver-Burk plot, two lines (with and without inhibitor) have the SAME x-intercept but different y-intercepts. What type of inhibition?",
     "Non-competitive (pure) inhibition β€” same Km (same x-intercept = -1/Km), but decreased Vmax (higher y-intercept = 1/Vmax)."),
    ("Aspirin irreversibly inhibits COX-1 in platelets. New platelets must be synthesised to restore function. How long does this take?",
     "7-10 days β€” the platelet lifespan. Platelets are anucleate (cannot synthesise new protein), so full recovery requires new platelet generation."),
    ("What does a LOW Km value indicate about enzyme-substrate affinity?",
     "HIGH affinity β€” the enzyme reaches half-maximal velocity at a low substrate concentration, meaning it binds substrate tightly."),
]))
story.append(Spacer(1, 0.5*cm))


# ══════════════════════════════════════════════════════════════════════════════
#  REVISION CHECKLIST
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header_table("βœ…", "Day 1 β€” End-of-Day Revision Checklist", bg=HexColor("#2E7D32")))
story.append(Spacer(1, 0.3*cm))

checklist_items = [
    ("Basic Biochemistry", [
        "Define pH; explain Henderson-Hasselbalch equation",
        "List and distinguish the 4 types of chemical bonds in biomolecules",
        "State the physiologic blood pH range",
    ]),
    ("Carbohydrates", [
        "Classify carbohydrates (mono/di/oligo/polysaccharides) with examples",
        "Distinguish D- vs L-, Ξ±- vs Ξ²-, epimers vs anomers",
        "List reducing vs non-reducing sugars",
        "Compare glycogen, starch, cellulose by linkage type and function",
        "Explain galactosemia and lactase deficiency",
    ]),
    ("Lipids", [
        "Classify lipids; define simple, complex, derived",
        "Describe fatty acid notation (e.g. 18:2, Δ⁹'ΒΉΒ²)",
        "Name two essential fatty acids and their Ο‰ classification",
        "Explain phospholipid structure and membrane role",
        "Order lipoproteins by density; state function of each",
        "Describe cholesterol functions",
    ]),
    ("Proteins & Amino Acids", [
        "Draw general amino acid structure; define zwitterion",
        "Classify 20 amino acids; list essential amino acids (PVT TIM HaLL)",
        "Describe 4 levels of protein structure with stabilising forces",
        "Explain protein denaturation",
        "Give clinical examples: sickle cell, prion disease",
    ]),
    ("Enzymes β€” Michaelis-Menten", [
        "Write and interpret the Michaelis-Menten equation",
        "Define Km, Vmax, kcat and explain their significance",
        "Distinguish 4 types of inhibition by their effect on Km and Vmax",
        "Draw and interpret Lineweaver-Burk plots for each inhibitor type",
        "List 5 drugs with their enzyme targets and inhibition type",
        "Explain zymogen activation and allosteric regulation",
    ]),
]

for topic, items in checklist_items:
    story.append(Paragraph(f"<b>{topic}</b>", SubHead))
    for item in items:
        story.append(Paragraph(f"☐  {item}", Bullet))
    story.append(Spacer(1, 0.15*cm))

story.append(Spacer(1, 0.3*cm))
story.append(colored_box(
    '<b>Study Tips for Day 1:</b><br/>'
    '1. Spend 10 min at end of each slot drawing concept maps linking key terms.<br/>'
    '2. For Carbohydrates: make a table of monosaccharides and their isomeric relationships.<br/>'
    '3. For Enzymes: sketch Lineweaver-Burk plots for ALL 3 inhibition types from memory.<br/>'
    '4. Use the checklist above before sleep β€” if you cannot recall an item, flag it for tomorrow morning review.',
    bg=C_GREEN_LIGHT, border=C_GREEN))

story.append(Spacer(1, 0.5*cm))
story.append(Paragraph(
    "Study Guide prepared by Orris  |  Source: Basic Medical Biochemistry 6e (Lippincott) &amp; Harper's Illustrated Biochemistry 32e  |  Day 1 of 2.5",
    FooterStyle))

# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/biochem-study-guide && python generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/biochem-study-guide/Day1_Biochemistry_Study_Guide…

Your PDF is ready! Here's what's inside:

πŸ“„ Download Your Study Guide

Day1 Biochemistry Study Guide

PDF Document Β· PDF


What's Covered in the PDF (5 Topics, 4 Pages)

πŸŒ… Morning Slot

Topic 1 β€” Basic Biochemistry
  • pH, Henderson-Hasselbalch equation, physiologic buffers
  • Complete table of all 4 chemical bond types with examples
Topic 2 β€” Carbohydrates
  • Full classification table (mono β†’ polysaccharides)
  • Isomers: epimers, anomers, D/L, reducing sugars
  • Polysaccharide comparison table (glycogen vs starch vs cellulose)
  • Clinical MCQs: galactosemia, sucrose as non-reducing sugar

β˜€οΈ Afternoon Slot

Topic 3 β€” Lipids
  • Fatty acid notation, essential fatty acids, cis vs trans
  • Phospholipid types and clinical roles (surfactant, signalling)
  • Lipoprotein density table (Chylomicron β†’ HDL)
Topic 4 β€” Proteins & Amino Acids
  • 20 amino acid classification table with clinical notes
  • Essential amino acids mnemonic (PVT TIM HaLL)
  • 4 levels of protein structure with stabilising forces
  • Clinical links: sickle cell anaemia, prion disease

πŸŒ™ Evening Slot ⭐

Topic 5 β€” Enzymes (Michaelis-Menten)
  • Michaelis-Menten equation clearly explained
  • Full inhibition comparison table (Competitive / Non-competitive / Uncompetitive / Irreversible)
  • Lineweaver-Burk plot interpretation rules
  • Drug-enzyme inhibitor table (Aspirin, Statins, Methotrexate, ACE inhibitors...)
  • End-of-day revision checklist for all 5 topics

Create a 3 days study plan for me everyday has 3 study slots Morning afternoon and evening. Organic Chemistry (Book) Here a chapter of organic chemistry Basic Chemistry (imp) Stereochemistry (imp) General preparation (Alkane,Alkene, Alkyne) (Past papers) Nucleophilic & electrophilic (Past papers) Orientation benzene Heterocyclic (imp) Reaction Mechanism (Most imp & Difficult) Intermediate & Free Radicals Rearrangement (most imp & difficult) MCQs daily basis

Generating Image

A clean, professional 3-day organic chemistry study plan timetable poster. Title at top: "Organic Chemistry - 3 Day Study Plan". Large table with 4 columns: Time Slot, Day 1 (Thursday), Day 2 (Friday), Day 3 (Saturday). Three rows per day: Morning (yellow background), Afternoon (light blue background), Evening (purple background). Content in each cell: Day 1 Morning - Basic Chemistry (imp) with atom icon; Day 1 Afternoon - Stereochemistry (imp) with 3D molecule icon; Day 1 Evening - MCQs + Review with quiz icon. Day 2 Morning - Alkane/Alkene/Alkyne General Preparation (Past papers) with test tube icon; Day 2 Afternoon - Nucleophilic and Electrophilic Reactions (Past papers) with arrow icon; Day 2 Evening - Orientation of Benzene + MCQs with benzene ring icon. Day 3 Morning - Reaction Mechanism (MOST IMP) red star with gear icon; Day 3 Afternoon - Intermediates and Free Radicals + Rearrangement (MOST IMP) red star; Day 3 Evening - Heterocyclic Compounds + Full MCQ Revision red star. Important topics marked with red stars. Color coding: morning=warm yellow, afternoon=sky blue, evening=soft purple. Modern flat design, white background, clean readable fonts, pastel colors, professional layout.

Here is your complete 3-Day Organic Chemistry Study Plan:

πŸ“… Day 1 β€” Thursday (May 28) Β· Foundations

SlotTopicsPriorityStrategy
πŸŒ… Morning⭐ Basic ChemistryimpAtomic structure, hybridisation (sp, spΒ², spΒ³), orbital theory, bond types, electronegativity, inductive & resonance effects, acidity/basicity of organic compounds
β˜€οΈ Afternoon⭐ StereochemistryimpChirality, enantiomers, diastereomers, R/S configuration (CIP rules), Fischer projections, meso compounds, optical activity, E/Z isomerism
πŸŒ™ EveningπŸ“ MCQs β€” Day 1 Topicsdaily20-30 MCQs on Basic Chemistry + Stereochemistry. Note every wrong answer and revisit before sleep
Day 1 Focus: These two topics are the foundation of all of Organic Chemistry. Stereochemistry errors cascade into wrong answers on mechanism questions. Get these solid first.

πŸ“… Day 2 β€” Friday (May 29) Β· Core Reactions & Aromatic Chemistry

SlotTopicsPriorityStrategy
πŸŒ… MorningπŸ“‹ General Preparation β€” Alkanes, Alkenes, AlkynesPast papersSynthesis routes: Wurtz, Corey-House, halogenation, hydrogenation, dehydration, dehydrohalogenation. Focus on past paper patterns
β˜€οΈ AfternoonπŸ“‹ Nucleophilic & Electrophilic ReactionsPast papersSN1 vs SN2 (conditions, stereochemistry, rate), E1 vs E2, electrophilic aromatic substitution (EAS), addition to alkenes. Draw arrow mechanisms
πŸŒ™ EveningOrientation of Benzene + πŸ“ MCQs-Ortho/para directors vs meta directors, activating vs deactivating groups, electrophilic aromatic substitution order. 20-30 MCQs on all Day 2 topics
Day 2 Focus: Past paper topics need pattern recognition. After each reaction, write out the mechanism with curved arrows β€” don't just memorise products.

πŸ“… Day 3 β€” Saturday (May 30) Β· Advanced Mechanisms & Full Revision

SlotTopicsPriorityStrategy
πŸŒ… MorningπŸ”΄ Reaction MechanismsMOST IMP & DIFFICULTCarbocation mechanisms, carbanion, radical chain reactions, pericyclic reactions, cycloadditions. Practice drawing every step with full arrow-pushing notation
β˜€οΈ AfternoonπŸ”΄ Intermediates & Free Radicals + πŸ”΄ RearrangementsMOST IMP & DIFFICULTCarbocations (1Β°, 2Β°, 3Β°), carbanions, free radicals, nitrenes, carbenes. Wagner-Meerwein shifts, 1,2-hydride/alkyl shifts, Pinacol rearrangement, Beckmann rearrangement
πŸŒ™ Evening⭐ Heterocyclic Compounds + πŸ”΄ Full MCQ RevisionimpPyridine, pyrimidine, pyrrole, furan, thiophene β€” aromaticity, basicity trends, reactions. Then 40-50 MCQs covering all 3 days
Day 3 Focus: Mechanism and rearrangement questions are multi-step β€” never skip a step when drawing. Each arrow = one electron pair movement. Practise until the logic feels automatic.

πŸ—ΊοΈ Topic Priority Map

PriorityTopics
πŸ”΄ Most Important + DifficultReaction Mechanisms, Rearrangements, Intermediates & Free Radicals
⭐ ImportantBasic Chemistry, Stereochemistry, Heterocyclic Compounds
πŸ“‹ Past Paper High-YieldAlkane/Alkene/Alkyne Preparation, Nucleophilic & Electrophilic
πŸ“ Daily (Every Evening)MCQs

⚑ Study Tips

  1. Reaction Mechanisms (Day 3 Morning) - Use coloured pens: one colour for electron pairs moving, another for new bonds forming
  2. Rearrangements - Always ask: "Is there a more stable carbocation possible?" - that drives every 1,2-shift
  3. MCQs every evening - Don't skip this. Past papers repeat patterns. Flag wrong answers and review the next morning
  4. Benzene orientation - Memorise the rule: any group that donates electrons = ortho/para director; withdraws = meta director
  5. Stereochemistry - Draw every chiral molecule in 3D before assigning R/S - don't try to do it mentally

Organic Chemistry 3-Day Study Plan
This is a shared conversation. Sign in to Orris to start your own chat.