11. Define Carbohydrates and classify them. 12. Write the structure of glucose, maltose, galactose and glycogen. 13. Discuss the general properties of amino acids. 14. Write a note on fatty acids. 15. Define allosteric enzymes and feedback inhibition2 marks
Harper's Illustrated Biochemistry, 32nd Ed
| Sugar | Type | Carbons | Significance |
|---|---|---|---|
| Glucose | Aldohexose | 6 | Most important; primary energy source |
| Fructose | Ketohexose | 6 | Fruit sugar |
| Galactose | Aldohexose | 6 | Component of lactose |
| Ribose | Aldopentose | 5 | Component of RNA |
| Deoxyribose | Aldopentose | 5 | Component of DNA |

Harper's Illustrated Biochemistry, 32nd Ed
| Class | Examples | Property |
|---|---|---|
| Non-polar aliphatic | Glycine, Alanine, Valine, Leucine, Isoleucine | Hydrophobic; found in protein interior |
| Aromatic | Phenylalanine, Tyrosine, Tryptophan | Hydrophobic; absorb UV light |
| Polar uncharged | Serine, Threonine, Asparagine, Glutamine | Hydrophilic |
| Positively charged (basic) | Lysine, Arginine, Histidine | +ve charge at pH 7 |
| Negatively charged (acidic) | Aspartate, Glutamate | -ve charge at pH 7 |
| Sulfur-containing | Cysteine, Methionine | Cysteine forms disulfide bonds |
Tietz Textbook of Laboratory Medicine, 7th Ed
| Group | Carbon Atoms | Example |
|---|---|---|
| Short-chain fatty acids (SCFA) | 2-4 C | Acetic acid (C2), Butyric acid (C4) |
| Medium-chain fatty acids (MCFA) | 6-12 C | Capric acid (C10) |
| Long-chain fatty acids (LCFA) | 14-26 C | Palmitic (C16), Stearic (C18), Oleic (C18:1) |
| Very long-chain fatty acids (VLCFA) | >26 C | Cerotic acid (C26) |
Lippincott's Illustrated Reviews: Biochemistry, 8th Ed; Harper's Illustrated Biochemistry, 32nd Ed
A → B → C → D → E → F → G
↑_______________|
(G inhibits enzyme at D→E)

Create a study guide PDF with structures and key points for exam prep
mkdir -p /home/daytona/workspace/biochem-study-guide && ls /home/daytona/workspace/biochem-study-guide
~/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.flowables import BalancedColumns
import urllib.request
import os
# ─── Output path ──────────────────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/biochem-study-guide/Biochemistry_Study_Guide.pdf"
# ─── Color palette ────────────────────────────────────────────────────────────
DEEP_BLUE = colors.HexColor("#1a3a5c")
MID_BLUE = colors.HexColor("#2e6da4")
ACCENT = colors.HexColor("#e8732a")
LIGHT_BG = colors.HexColor("#eef4fb")
TABLE_HDR = colors.HexColor("#2e6da4")
TABLE_ALT = colors.HexColor("#f0f6ff")
GREEN_BOX = colors.HexColor("#e6f4ea")
GREEN_BDR = colors.HexColor("#34a853")
YELLOW_BOX = colors.HexColor("#fffbe6")
YELLOW_BDR = colors.HexColor("#f9ab00")
WHITE = colors.white
BLACK = colors.black
# ─── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
cover_title = S("cover_title",
fontSize=28, textColor=WHITE, alignment=TA_CENTER,
spaceAfter=8, fontName="Helvetica-Bold", leading=34)
cover_sub = S("cover_sub",
fontSize=14, textColor=colors.HexColor("#c9dff5"), alignment=TA_CENTER,
spaceAfter=6, fontName="Helvetica", leading=18)
cover_note = S("cover_note",
fontSize=10, textColor=colors.HexColor("#a0c4e8"), alignment=TA_CENTER,
fontName="Helvetica-Oblique")
h1 = S("h1",
fontSize=18, textColor=WHITE, fontName="Helvetica-Bold",
leading=22, spaceAfter=2, spaceBefore=0, backColor=DEEP_BLUE,
leftIndent=-12, rightIndent=-12)
h2 = S("h2",
fontSize=13, textColor=DEEP_BLUE, fontName="Helvetica-Bold",
leading=17, spaceBefore=10, spaceAfter=4,
borderPadding=(0,0,2,0))
h3 = S("h3",
fontSize=11, textColor=MID_BLUE, fontName="Helvetica-Bold",
leading=14, spaceBefore=6, spaceAfter=2)
body = S("body",
fontSize=10, textColor=colors.HexColor("#1e1e2e"), fontName="Helvetica",
leading=15, spaceAfter=4, alignment=TA_JUSTIFY)
bullet = S("bullet",
fontSize=10, textColor=colors.HexColor("#1e1e2e"), fontName="Helvetica",
leading=14, spaceAfter=3, leftIndent=14, bulletIndent=4,
bulletFontName="Helvetica", bulletFontSize=10, bulletText="\u2022")
sub_bullet = S("sub_bullet",
fontSize=9.5, textColor=colors.HexColor("#333"), fontName="Helvetica",
leading=13, spaceAfter=2, leftIndent=26, bulletIndent=16,
bulletFontName="Helvetica", bulletFontSize=9, bulletText="\u25e6")
code = S("code",
fontSize=9, fontName="Courier", textColor=colors.HexColor("#1e2a1e"),
backColor=colors.HexColor("#f4fdf4"), leading=13,
leftIndent=10, spaceAfter=4, spaceBefore=2)
caption = S("caption",
fontSize=8.5, textColor=colors.HexColor("#555"), fontName="Helvetica-Oblique",
alignment=TA_CENTER, leading=12, spaceAfter=6)
tip_style = S("tip",
fontSize=9.5, textColor=colors.HexColor("#1a3a1a"), fontName="Helvetica",
leading=14, leftIndent=8, rightIndent=8, spaceAfter=4)
warn_style = S("warn",
fontSize=9.5, textColor=colors.HexColor("#5a3200"), fontName="Helvetica",
leading=14, leftIndent=8, rightIndent=8, spaceAfter=4)
mnemonic = S("mnemonic",
fontSize=11, textColor=colors.HexColor("#1a4a1a"), fontName="Helvetica-BoldOblique",
alignment=TA_CENTER, leading=16, spaceAfter=4)
page_w, page_h = A4
MARGIN = 2*cm
# ─── Helper flowables ─────────────────────────────────────────────────────────
def section_header(num, title, subtitle=""):
data = [[
Paragraph(f"<b>{num}</b>", S("sn", fontSize=22, textColor=ACCENT,
fontName="Helvetica-Bold", leading=26, alignment=TA_CENTER)),
Paragraph(f"<b>{title}</b>" + (f"<br/><font size=10 color='#c9dff5'>{subtitle}</font>" if subtitle else ""),
S("sh", fontSize=16, textColor=WHITE, fontName="Helvetica-Bold",
leading=20, alignment=TA_LEFT, leftIndent=4))
]]
t = Table(data, colWidths=[1.4*cm, None])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DEEP_BLUE),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("LEFTPADDING", (0,0),(0,0), 8),
("RIGHTPADDING",(0,0),(-1,-1), 10),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING",(0,0),(-1,-1), 8),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return t
def tip_box(text, color=GREEN_BOX, border=GREEN_BDR, label="KEY POINT"):
inner = Paragraph(f"<b><font color='#{border.hexval()[2:]}'>▶ {label}:</font></b> {text}", tip_style)
t = Table([[inner]], colWidths=[page_w - 2*MARGIN])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), color),
("BOX", (0,0),(-1,-1), 1.2, border),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return t
def mnemonic_box(text, title="MNEMONIC"):
inner = [
Paragraph(f"<b>{title}</b>", S("mt", fontSize=9, textColor=colors.HexColor("#5a3200"),
fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph(text, mnemonic)
]
t = Table([inner], colWidths=[page_w - 2*MARGIN])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), YELLOW_BOX),
("BOX", (0,0),(-1,-1), 1.5, YELLOW_BDR),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return t
def styled_table(headers, rows, col_widths=None):
data = [[Paragraph(f"<b>{h}</b>", S("th", fontSize=9.5, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)) for h in headers]]
for i, row in enumerate(rows):
data.append([Paragraph(str(c), S("td", fontSize=9.5,
textColor=BLACK, fontName="Helvetica",
leading=13, alignment=TA_LEFT)) for c in row])
avail = page_w - 2*MARGIN
if col_widths is None:
col_widths = [avail / len(headers)] * len(headers)
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0),(-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("ALIGN", (0,0),(-1,0), "CENTER"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, TABLE_ALT]),
("GRID", (0,0),(-1,-1), 0.4, colors.HexColor("#c0d0e8")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 6),
("RIGHTPADDING", (0,0),(-1,-1), 6),
]
t.setStyle(TableStyle(style))
return t
def divider():
return HRFlowable(width="100%", thickness=0.5,
color=colors.HexColor("#c0d0e8"), spaceAfter=6, spaceBefore=2)
def sp(n=6):
return Spacer(1, n)
# ─── Download structural images ───────────────────────────────────────────────
IMG_DIR = "/home/daytona/workspace/biochem-study-guide/img"
os.makedirs(IMG_DIR, exist_ok=True)
IMAGES = {
"glucose": "https://cdn.orris.care/cdss_images/de892984738f32daa09bd2a953cfdcff258049e7921e4ff406ab9aab06611cc6.png",
"epimers": "https://cdn.orris.care/cdss_images/eb8b120a8cc9ffa7beace8f583d9e7a97aaa402b69ca2dba76e8819d8f3d52f9.png",
"disacc": "https://cdn.orris.care/cdss_images/18f38a58116d58f6676fdae674b635af7cd21a2588109112de5e5be5a48f86a1.png",
"feedback": "https://cdn.orris.care/cdss_images/cb502295cc8ba6cf5745deaa9d789705c0ef503227d0376ec0bbaae611015665.png",
"zwitterion":"https://cdn.orris.care/cdss_images/f978843e8ecc8bd64dbd1cefa0d23b79b28ea7d4d3b6d23aba9ac2167f51b2f1.png",
}
def download_images():
paths = {}
headers = {"User-Agent": "Mozilla/5.0"}
for key, url in IMAGES.items():
dest = os.path.join(IMG_DIR, f"{key}.png")
if not os.path.exists(dest):
try:
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req, timeout=15) as r, open(dest, "wb") as f:
f.write(r.read())
print(f" Downloaded {key}")
except Exception as e:
print(f" WARN: could not download {key}: {e}")
dest = None
paths[key] = dest if os.path.exists(dest or "") else None
return paths
# ─── Page template callbacks ──────────────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# Footer bar
canvas.setFillColor(DEEP_BLUE)
canvas.rect(0, 0, page_w, 1.1*cm, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica", 8)
canvas.drawString(MARGIN, 0.4*cm, "Biochemistry Study Guide | Questions 11-15")
canvas.drawRightString(page_w - MARGIN, 0.4*cm, f"Page {doc.page}")
# Top accent line
canvas.setFillColor(ACCENT)
canvas.rect(0, page_h - 3*mm, page_w, 3*mm, fill=1, stroke=0)
canvas.restoreState()
# ─── COVER PAGE ───────────────────────────────────────────────────────────────
def cover_page():
story = []
# Blue background via table
cover_data = [[
Paragraph("BIOCHEMISTRY", S("ct1", fontSize=11, textColor=colors.HexColor("#a0c4e8"),
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14, spaceAfter=4)),
],[
Paragraph("STUDY GUIDE", S("ct2", fontSize=34, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=40, spaceAfter=8)),
],[
Paragraph("Questions 11-15: Biomolecules & Enzymes", S("ct3", fontSize=14,
textColor=colors.HexColor("#c9dff5"), fontName="Helvetica",
alignment=TA_CENTER, leading=18, spaceAfter=6)),
],[
Paragraph("Carbohydrates • Amino Acids • Fatty Acids • Allosteric Enzymes",
S("ct4", fontSize=10, textColor=colors.HexColor("#8ab8db"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=14)),
],[
Spacer(1, 0.5*cm),
],[
Paragraph("Sources: Harper's Illustrated Biochemistry 32e | Lippincott's Biochemistry 8e | Tietz Lab Medicine 7e",
S("ct5", fontSize=8, textColor=colors.HexColor("#6090b0"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=12)),
]]
tbl = Table(cover_data, colWidths=[page_w - 2*MARGIN])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DEEP_BLUE),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING",(0,0),(-1,-1), 10),
("LEFTPADDING", (0,0),(-1,-1), 20),
("RIGHTPADDING", (0,0),(-1,-1), 20),
("ROUNDEDCORNERS", [8,8,8,8]),
]))
story.append(sp(1.5*cm))
story.append(tbl)
story.append(sp(0.8*cm))
# Topics index
topics = [
("Q.11", "Carbohydrates: Definition & Classification"),
("Q.12", "Structures of Glucose, Maltose, Galactose & Glycogen"),
("Q.13", "General Properties of Amino Acids"),
("Q.14", "Fatty Acids: Classification & Properties"),
("Q.15", "Allosteric Enzymes & Feedback Inhibition (2 marks)"),
]
idx_data = [[
Paragraph(f"<b><font color='#e8732a'>{q}</font></b>", S("iq",
fontSize=10, fontName="Helvetica-Bold", leading=14)),
Paragraph(t, S("it", fontSize=10, fontName="Helvetica", leading=14))
] for q, t in topics]
idx_tbl = Table(idx_data, colWidths=[1.5*cm, page_w - 2*MARGIN - 1.8*cm])
idx_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, LIGHT_BG]),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#d0dff0")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
story.append(Paragraph("<b>Contents</b>", S("idx_hdr", fontSize=12, textColor=DEEP_BLUE,
fontName="Helvetica-Bold", spaceAfter=4)))
story.append(idx_tbl)
story.append(PageBreak())
return story
# ─── BUILD FULL STORY ─────────────────────────────────────────────────────────
def build_story(img_paths):
from reportlab.platypus import Image as RLImage
def img(key, w=None, h=None, caption_text=""):
path = img_paths.get(key)
if not path:
return []
ri = RLImage(path)
aspect = ri.imageWidth / ri.imageHeight
if w and not h:
h = w / aspect
elif h and not w:
w = h * aspect
else:
w = 9*cm
h = w / aspect
ri._restrictSize(w, h)
items = [ri]
if caption_text:
items.append(Paragraph(caption_text, caption))
return items
story = []
story += cover_page()
# ══════════════════════════════════════════════
# Q11: CARBOHYDRATES
# ══════════════════════════════════════════════
story.append(section_header("11", "Carbohydrates", "Definition & Classification"))
story.append(sp(6))
story.append(Paragraph("<b>Definition</b>", h2))
story.append(Paragraph(
"Carbohydrates (saccharides) are extremely polar biomolecules composed of carbon, "
"hydrogen, and oxygen. The general formula is <b>(CH\u2082O)\u2099</b>, though not all carbohydrates "
"fit this formula. They serve as the primary energy source, structural components, and "
"play key roles in cell signaling and recognition.",
body))
story.append(tip_box(
"The word carbohydrate means 'carbon hydrate'. Saccharide is the preferred biochemical term. "
"Glucose is the MOST important carbohydrate - all dietary polysaccharides are ultimately "
"absorbed as monosaccharides.", label="DEFINITION TIP"))
story.append(sp(4))
story.append(Paragraph("<b>Classification</b>", h2))
story.append(Paragraph("<b>1. Monosaccharides</b> (Simple sugars)", h3))
story.append(Paragraph("Cannot be hydrolyzed further. Classified by:", body))
story.append(Paragraph("Number of carbons: triose (3C), tetrose (4C), pentose (5C), hexose (6C)", bullet))
story.append(Paragraph("Functional group: aldoses (CHO group) vs ketoses (C=O group)", bullet))
story.append(sp(4))
story.append(styled_table(
["Sugar", "Type", "Carbons", "Significance"],
[
["Glucose", "Aldohexose", "6", "Primary energy source; most important monosaccharide"],
["Galactose", "Aldohexose", "6", "Component of lactose; brain glycolipids"],
["Fructose", "Ketohexose", "6", "Fruit sugar; component of sucrose"],
["Ribose", "Aldopentose","5", "Component of RNA, ATP, coenzymes"],
["Deoxyribose","Aldopentose","5", "Component of DNA"],
],
col_widths=[3.2*cm, 3*cm, 2.2*cm, None]
))
story.append(sp(6))
story.append(Paragraph("<b>2. Disaccharides</b>", h3))
story.append(Paragraph("Two monosaccharide units joined by a <b>glycosidic bond</b>.", body))
story.append(styled_table(
["Disaccharide", "Components", "Bond", "Source"],
[
["Maltose", "Glc + Glc", "α(1→4)", "Starch hydrolysis, malt"],
["Lactose", "Gal + Glc", "β(1→4)", "Milk; deficiency → lactose intolerance"],
["Sucrose", "Glc + Fru", "α(1→2)β", "Table sugar; non-reducing sugar"],
["Trehalose","Glc + Glc", "α(1→1)α", "Insect hemolymph, fungi"],
],
col_widths=[2.8*cm, 2.8*cm, 2.2*cm, None]
))
story.append(sp(6))
story.append(Paragraph("<b>3. Oligosaccharides</b>", h3))
story.append(Paragraph(
"3-10 monosaccharide units. Often linked to proteins (glycoproteins) or lipids (glycolipids). "
"Important in cell recognition, immune function, and blood group antigens.", body))
story.append(Paragraph("<b>4. Polysaccharides</b>", h3))
story.append(styled_table(
["Polysaccharide", "Monomer", "Linkage", "Function / Location"],
[
["Starch (amylose)", "Glucose", "α(1→4)", "Plant energy storage; non-branching helix"],
["Starch (amylopectin)","Glucose", "α(1→4) + α(1→6)", "Plant storage; branched every 24-30 residues"],
["Glycogen", "Glucose", "α(1→4) + α(1→6)", "Animal storage (liver, muscle); branch every 8-12"],
["Cellulose", "Glucose", "β(1→4)", "Plant structural; indigestible dietary fiber"],
["Chitin", "GlcNAc", "β(1→4)", "Insect exoskeleton, fungal cell wall"],
["Hyaluronic acid", "GlcUA + GlcNAc", "β(1→3)/(1→4)", "Connective tissue, synovial fluid"],
],
col_widths=[3.8*cm, 2.5*cm, 3.5*cm, None]
))
story.append(sp(4))
story.append(tip_box(
"Homopolysaccharides contain ONE type of monosaccharide (e.g., glycogen = glucose only). "
"Heteropolysaccharides contain MORE than one type (e.g., hyaluronic acid = glucuronic acid + GlcNAc). "
"Starch + Glycogen = hexosans (hexose polymers). Inulin = fructosan (pentosan).", label="EXAM KEY"))
story.append(PageBreak())
# ══════════════════════════════════════════════
# Q12: STRUCTURES
# ══════════════════════════════════════════════
story.append(section_header("12", "Structures", "Glucose, Maltose, Galactose & Glycogen"))
story.append(sp(6))
story.append(Paragraph("<b>Glucose</b>", h2))
story.append(Paragraph(
"Glucose (C\u2086H\u2081\u2082O\u2086) is an <b>aldohexose</b>. It has 4 asymmetric carbon atoms "
"and can be represented in three forms:", body))
story.append(Paragraph("<b>A. Open-chain (Fischer)</b>: Aldehyde at C1, hydroxyl groups at C2-C5, CH\u2082OH at C6.", bullet))
story.append(Paragraph("<b>B. Haworth projection</b>: Cyclic hemiacetal (pyranose ring); -OH at C1 is \u03b1 (below) or \u03b2 (above).", bullet))
story.append(Paragraph("<b>C. Chair form</b>: Most stable 3D representation; \u03b2-D-glucopyranose predominates (~64%) at equilibrium.", bullet))
story.append(sp(4))
glucose_imgs = img("glucose", w=10*cm, caption_text="Figure: D-Glucose structural representations (A) Fischer/open-chain, (B) Haworth projection, (C) Chair form. Source: Harper's Illustrated Biochemistry 32e")
if glucose_imgs:
story += glucose_imgs
story.append(sp(4))
story.append(styled_table(
["Feature", "Detail"],
[
["Molecular formula", "C\u2086H\u2081\u2082O\u2086 (MW = 180 g/mol)"],
["Class", "Aldohexose"],
["Anomers", "\u03b1-D-glucose (36%) and \u03b2-D-glucose (64%) at equilibrium (mutarotation)"],
["Ring type", "Pyranose (6-membered ring involving C1 and C5-oxygen)"],
["Configuration", "D-series (OH at C5 is on the RIGHT in Fischer projection)"],
],
col_widths=[4.5*cm, None]
))
story.append(sp(8))
story.append(Paragraph("<b>Galactose</b>", h2))
story.append(Paragraph(
"Galactose is an <b>aldohexose</b> and the <b>C4 epimer of glucose</b> - identical to glucose "
"except the -OH at C4 is oriented upward (above the ring) in the Haworth projection instead of downward.", body))
story.append(Paragraph(
"It forms a pyranose ring and exists as \u03b1 and \u03b2 anomers. At physiologic pH, "
"galactose participates in galactose metabolism via the Leloir pathway (galactose \u2192 "
"glucose-1-phosphate via galactokinase, GALT, phosphoglucomutase).", body))
epimer_imgs = img("epimers", w=10*cm, caption_text="Figure: Epimers of glucose - note C4-OH orientation differs in galactose. Source: Harper's Illustrated Biochemistry 32e")
if epimer_imgs:
story += epimer_imgs
story.append(tip_box(
"EPIMER = differs at only ONE carbon. Galactose is C4 epimer of glucose. "
"Mannose is C2 epimer of glucose. Galactosemia results from deficiency of GALT enzyme.", label="EXAM KEY"))
story.append(sp(6))
story.append(Paragraph("<b>Maltose</b>", h2))
story.append(Paragraph(
"Maltose is a <b>disaccharide</b> made of <b>two \u03b1-D-glucose units</b> linked by an "
"<b>\u03b1(1\u21924) glycosidic bond</b>:", body))
story.append(Paragraph("Full name: O-\u03b1-D-glucopyranosyl-(1\u21924)-\u03b1-D-glucopyranose", bullet))
story.append(Paragraph("C1 of the first glucose (non-reducing end) is linked to C4 of the second glucose (reducing end)", bullet))
story.append(Paragraph("The reducing end (C1 of the second glucose) is free and can mutarotate - so maltose IS a reducing sugar", bullet))
story.append(Paragraph("Produced by amylase hydrolysis of starch; found in germinating cereals and malt", bullet))
disacc_imgs = img("disacc", w=9*cm, caption_text="Figure: Maltose (glucosyl-glucose) with \u03b1(1\u21924) linkage. Source: Harper's Illustrated Biochemistry 32e")
if disacc_imgs:
story += disacc_imgs
story.append(sp(6))
story.append(Paragraph("<b>Glycogen</b>", h2))
story.append(Paragraph(
"Glycogen is the <b>storage polysaccharide of animals</b> - a highly branched homopolymer "
"of \u03b1-D-glucose:", body))
story.append(styled_table(
["Feature", "Glycogen", "Starch (Amylopectin)"],
[
["Backbone linkage", "\u03b1(1\u21924)", "\u03b1(1\u21924)"],
["Branch linkage", "\u03b1(1\u21926)", "\u03b1(1\u21926)"],
["Branch frequency", "Every 8-12 glucose residues", "Every 24-30 glucose residues"],
["Degree of branching","Very high (more non-reducing ends)", "Moderate"],
["Location", "Liver (~100g) + Muscle (~400g)", "Plants"],
["Synthesis enzyme", "Glycogen synthase", "Starch synthase"],
["Degradation enzyme", "Glycogen phosphorylase", "Amylase"],
],
col_widths=[4.5*cm, 5*cm, None]
))
story.append(sp(4))
story.append(tip_box(
"Glycogen has MORE branch points than starch. This provides MORE non-reducing ends, "
"allowing RAPID glucose mobilization (many phosphorylase molecules act simultaneously). "
"Glycogen is built on a protein core called GLYCOGENIN.", label="WHY IT'S BRANCHED"))
story.append(PageBreak())
# ══════════════════════════════════════════════
# Q13: AMINO ACIDS
# ══════════════════════════════════════════════
story.append(section_header("13", "Amino Acids", "General Properties"))
story.append(sp(6))
story.append(Paragraph(
"Amino acids are the <b>building blocks of proteins</b>. All 20 standard amino acids used "
"in protein synthesis are <b>L-\u03b1-amino acids</b>: each has an \u03b1-carbon bearing an "
"<b>amino group (-NH\u2082)</b>, a <b>carboxyl group (-COOH)</b>, a <b>hydrogen atom</b>, "
"and a distinctive <b>R group (side chain)</b>.", body))
story.append(sp(4))
story.append(Paragraph("<b>1. Zwitterionic Nature</b>", h3))
story.append(Paragraph(
"In aqueous solution at physiologic pH (7.4), amino acids exist as <b>zwitterions</b>: "
"the \u03b1-COOH loses a proton (\u2192 COO\u207b) and the \u03b1-NH\u2082 gains a proton (\u2192 NH\u2083\u207a). "
"The molecule has BOTH positive and negative charges but is electrically NEUTRAL overall.",
body))
zwit_imgs = img("zwitterion", w=8*cm, caption_text="Figure: Zwitterion form of an amino acid (A) vs uncharged form (B). Source: Harper's Illustrated Biochemistry 32e")
if zwit_imgs:
story += zwit_imgs
story.append(Paragraph("<b>2. Amphoteric Nature</b>", h3))
story.append(Paragraph(
"Amino acids can act as both <b>acids</b> (proton donors) and <b>bases</b> (proton acceptors). "
"This is because they possess a weakly acidic -COOH (pKa ~2.0) AND a weakly basic -NH\u2083\u207a (pKa ~9-10).",
body))
story.append(Paragraph("<b>3. Isoelectric Point (pI)</b>", h3))
story.append(Paragraph(
"The pH at which an amino acid carries <b>no net charge</b> (exists as zwitterion). "
"At pI, the amino acid has minimum solubility and does not migrate in an electric field.", body))
story.append(Paragraph("For simple amino acids: pI = (pKa\u2081 + pKa\u2082) / 2", code))
story.append(Paragraph("Acidic amino acids have low pI (~3); basic amino acids have high pI (~10); neutral amino acids pI ~6", bullet))
story.append(sp(4))
story.append(Paragraph("<b>4. Optical Activity</b>", h3))
story.append(Paragraph(
"All amino acids except <b>glycine</b> are optically active (have a chiral \u03b1-carbon). "
"They exist as L and D stereoisomers. Only <b>L-amino acids</b> are found in proteins. "
"L-form = amino group on the LEFT in Fischer projection.", body))
story.append(Paragraph("<b>5. Classification by R Group</b>", h3))
story.append(styled_table(
["Class", "Examples", "Properties"],
[
["Non-polar aliphatic", "Gly, Ala, Val, Leu, Ile, Pro, Met", "Hydrophobic; protein interior"],
["Aromatic", "Phe, Tyr, Trp", "Hydrophobic; absorb UV at 280 nm"],
["Polar uncharged", "Ser, Thr, Cys, Asn, Gln", "Hydrophilic; H-bond formation"],
["Positively charged", "Lys, Arg, His", "+ve at pH 7; basic side chains"],
["Negatively charged", "Asp, Glu", "\u2212ve at pH 7; acidic side chains"],
],
col_widths=[4*cm, 5.5*cm, None]
))
story.append(sp(6))
story.append(Paragraph("<b>6. Reactions of Functional Groups</b>", h3))
story.append(styled_table(
["Group", "Location", "Key Reactions / Role"],
[
["-COOH (carboxyl)", "\u03b1-carbon", "Ester, amide, anhydride formation; peptide bond"],
["-NH\u2082 (amino)", "\u03b1-carbon", "Acylation, amidation; peptide bond"],
["-SH (thiol)", "Cysteine", "Nucleophile; disulfide bonds (-S-S-); pKa 8.3"],
["-OH (hydroxyl)", "Ser, Thr, Tyr", "Phosphorylation sites; nucleophile in serine proteases"],
["Imidazole", "Histidine", "Acid/base catalyst at neutral pH; pKa ~6"],
["Guanidino", "Arginine", "Strongly basic; stabilizes protein conformation"],
],
col_widths=[3.5*cm, 3*cm, None]
))
story.append(sp(6))
story.append(Paragraph("<b>7. Ninhydrin Reaction</b>", h3))
story.append(Paragraph(
"Most amino acids react with <b>ninhydrin</b> to produce a <b>purple color</b> (Ruhemann's purple). "
"Used for detection and quantification. Exception: proline and hydroxyproline (imino acids) give a "
"<b>yellow color</b>.", body))
story.append(Paragraph("<b>8. Essential vs. Non-essential Amino Acids</b>", h3))
story.append(styled_table(
["Type", "Definition", "Examples"],
[
["Essential (Indispensable)", "Cannot be synthesized by the body; must come from diet", "Lys, Thr, Met, Val, Leu, Ile, Phe, Trp (+ His for infants)"],
["Non-essential (Dispensable)", "Synthesized in adequate amounts by the body", "Gly, Ala, Ser, Asp, Glu, Asn, Gln"],
["Conditionally essential", "Non-essential normally but become essential in certain states", "Arg (growth), Cys (premature infants), Tyr (PKU)"],
],
col_widths=[3.5*cm, 5.5*cm, None]
))
story.append(sp(4))
story.append(mnemonic_box(
'"PVT TIM HaLL" = Phe, Val, Thr, Trp, Ile, Met, His, Arg(cond.), Leu, Lys',
title="MNEMONIC: 8 Essential Amino Acids"
))
story.append(PageBreak())
# ══════════════════════════════════════════════
# Q14: FATTY ACIDS
# ══════════════════════════════════════════════
story.append(section_header("14", "Fatty Acids", "Classification & Properties"))
story.append(sp(6))
story.append(Paragraph("<b>Definition</b>", h2))
story.append(Paragraph(
"Fatty acids are the simplest lipid-type molecules. General formula: <b>R-COOH</b>, "
"where R is a long alkyl (hydrocarbon) chain. They are carboxylic acids and are "
"the building blocks of triglycerides, phospholipids, sphingolipids, and waxes. "
"Most biologically important fatty acids contain an <b>even number of carbon atoms</b> "
"(built by 2-carbon additions from acetyl-CoA).", body))
story.append(sp(4))
story.append(Paragraph("<b>Classification by Chain Length</b>", h2))
story.append(styled_table(
["Class", "Carbon Atoms", "Example", "Notes"],
[
["Short-chain (SCFA)", "2-4 C", "Acetic (C2), Butyric (C4)", "Produced by gut bacteria; energy for colonocytes"],
["Medium-chain (MCFA)", "6-12 C", "Capric (C10), Lauric (C12)", "Absorbed directly into portal blood"],
["Long-chain (LCFA)", "14-26 C","Palmitic (C16), Stearic (C18), Oleic (C18:1)", "Most important in human metabolism"],
["Very long-chain (VLCFA)",">26 C","Cerotic acid (C26)", "Found in brain; involved in adrenoleukodystrophy"],
],
col_widths=[3.5*cm, 2.5*cm, 4.5*cm, None]
))
story.append(sp(6))
story.append(Paragraph("<b>Classification by Degree of Saturation</b>", h2))
story.append(Paragraph("<b>1. Saturated Fatty Acids (SFA)</b>", h3))
story.append(Paragraph("No double bonds. Fully saturated carbons. Linear, packed chains.", bullet))
story.append(Paragraph("High melting point \u2192 solid at room temperature (e.g., lard, butter)", bullet))
story.append(Paragraph("Examples: Palmitic acid (16:0), Stearic acid (18:0)", bullet))
story.append(Paragraph("<b>2. Monounsaturated Fatty Acids (MUFA)</b>", h3))
story.append(Paragraph("One double bond. Slight bend in chain. Lower melting point.", bullet))
story.append(Paragraph("Example: Oleic acid (18:1 \u039412 or 18:1 \u03c9-9) - main FA in olive oil", bullet))
story.append(Paragraph("<b>3. Polyunsaturated Fatty Acids (PUFA)</b>", h3))
story.append(Paragraph("More than one double bond. Double bonds usually 3 carbons apart.", bullet))
story.append(Paragraph("Prone to oxidation at sites of unsaturation (lipid peroxidation)", bullet))
story.append(Paragraph("Deep-sea fish (salmon) have up to 6 double bonds, >20 carbons", bullet))
story.append(Paragraph("Examples: Linoleic (18:2, \u03c9-6), \u03b1-Linolenic (18:3, \u03c9-3), Arachidonic (20:4), EPA (20:5), DHA (22:6)", bullet))
story.append(sp(4))
story.append(Paragraph("<b>Cis vs. Trans Configuration</b>", h2))
story.append(styled_table(
["Property", "Cis Fatty Acids", "Trans Fatty Acids"],
[
["H position at double bond", "Same side (cis)", "Opposite sides (trans)"],
["Chain shape", "30\u00b0 fixed bend at each double bond", "More linear, resembles saturated FA"],
["Melting point", "Lower", "Higher (like saturated)"],
["Physical state", "Liquid at room temp (e.g., olive oil)", "Solid at room temp (e.g., margarine)"],
["Occurrence", "All natural mammalian unsaturated FAs", "Artificial (catalytic hydrogenation) or small amount in ruminants"],
["Health effect", "Protective (especially \u03c9-3)", "Increases LDL, decreases HDL; atherogenic"],
],
col_widths=[4*cm, None, None]
))
story.append(sp(6))
story.append(Paragraph("<b>Essential Fatty Acids (EFA)</b>", h2))
story.append(Paragraph(
"Humans lack \u03949 desaturase (cannot form double bonds beyond C9). Therefore these "
"CANNOT be synthesized and MUST come from the diet:", body))
story.append(styled_table(
["EFA", "Symbol", "Family", "Precursor to"],
[
["Linoleic acid", "18:2 \u039412,15 or 18:2n-6", "\u03c9-6 (n-6)", "Arachidonic acid (20:4) \u2192 PGs, TXs, LTs"],
["α-Linolenic acid", "18:3 \u039412,15,18 or 18:3n-3", "\u03c9-3 (n-3)", "EPA (20:5) and DHA (22:6) \u2192 anti-inflammatory eicosanoids"],
],
col_widths=[3.5*cm, 3.5*cm, 2*cm, None]
))
story.append(sp(4))
story.append(tip_box(
"EFA DEFICIENCY: dermatitis (scaly skin), poor wound healing, growth retardation, "
"increased susceptibility to infection. Linoleic acid is most commonly deficient.", label="CLINICAL NOTE"))
story.append(Paragraph("<b>Fatty Acid Nomenclature</b>", h2))
story.append(Paragraph("Format: <b>C:D \u03944,7</b> where C = carbons, D = double bonds, numbers = position from carboxyl end (\u0394) or from methyl end (\u03c9/n)", body))
story.append(styled_table(
["Common Name", "Systematic Name", "Symbol", "Source"],
[
["Palmitic", "n-Hexadecanoic", "16:0", "Most abundant SFA; palm oil"],
["Stearic", "n-Octadecanoic", "18:0", "Animal fat, cocoa butter"],
["Oleic", "cis-\u039449-Octadecenoic", "18:1 \u03c9-9", "Olive oil; most abundant MUFA"],
["Linoleic", "cis,cis-\u03949,12-Octadecadienoic", "18:2 \u03c9-6", "Vegetable oils; essential"],
["Arachidonic","5,8,11,14-Eicosatetraenoic", "20:4 \u03c9-6", "Cell membranes; prostaglandin precursor"],
["EPA", "5,8,11,14,17-Eicosapentaenoic", "20:5 \u03c9-3", "Fish oil; anti-inflammatory"],
["DHA", "Docosahexaenoic", "22:6 \u03c9-3", "Brain, retina; fish oil"],
],
col_widths=[2.5*cm, 5*cm, 2.2*cm, None]
))
story.append(PageBreak())
# ══════════════════════════════════════════════
# Q15: ALLOSTERIC ENZYMES & FEEDBACK INHIBITION
# ══════════════════════════════════════════════
story.append(section_header("15", "Allosteric Enzymes & Feedback Inhibition", "2 Marks"))
story.append(sp(6))
story.append(Paragraph("<b>Allosteric Enzymes - Definition</b>", h2))
story.append(Paragraph(
"Allosteric enzymes are enzymes whose catalytic activity is regulated by the "
"<b>noncovalent binding of small molecules called effectors (modulators)</b> at a site "
"other than the active site - called the <b>allosteric site</b>. The term 'allosteric' "
"means 'to occupy another space' (coined by Jacques Monod).", body))
story.append(sp(4))
story.append(Paragraph("<b>Key Features</b>", h3))
story.append(styled_table(
["Feature", "Detail"],
[
["Structure", "Almost always multi-subunit (oligomeric) proteins"],
["Allosteric site", "Distinct from active site; may be on non-catalytic subunit"],
["Kinetics", "Do NOT follow Michaelis-Menten; show SIGMOIDAL v\u2080 vs [S] curve"],
["Cooperativity", "Binding of substrate at one site enhances binding at other sites (positive cooperativity)"],
["Location in pathway", "Typically catalyze the FIRST COMMITTED (rate-limiting) step"],
["Regulation speed", "RAPID (noncovalent, reversible) - milliseconds"],
],
col_widths=[4.5*cm, None]
))
story.append(sp(6))
story.append(Paragraph("<b>Types of Effectors</b>", h2))
story.append(styled_table(
["Type", "Effect", "Mechanism", "Example"],
[
["Positive effector (activator)", "Increases enzyme activity", "Increases substrate affinity (\u2193K\u2080.\u2085) or \u2191Vmax", "AMP activates phosphofructokinase-1"],
["Negative effector (inhibitor)", "Decreases enzyme activity", "Decreases substrate affinity (\u2191K\u2080.\u2085) or \u2193Vmax", "Citrate inhibits phosphofructokinase-1"],
],
col_widths=[4*cm, 3*cm, 4.5*cm, None]
))
story.append(sp(4))
story.append(Paragraph("<b>Homotropic vs. Heterotropic</b>", h3))
story.append(Paragraph("<b>Homotropic</b>: Substrate itself is the effector \u2192 cooperative binding \u2192 sigmoidal curve", bullet))
story.append(Paragraph("<b>Heterotropic</b>: A DIFFERENT molecule (not the substrate) is the effector", bullet))
story.append(sp(6))
story.append(Paragraph("<b>Feedback Inhibition</b>", h2))
story.append(Paragraph(
"A type of <b>heterotropic negative allosteric regulation</b> where the <b>end product</b> "
"of a biosynthetic pathway <b>inhibits the enzyme catalyzing the first committed (irreversible) "
"step</b> of that same pathway:", body))
story.append(Paragraph("A \u2192 B \u2192 C \u2192 D \u2192 E \u2192 F \u2192 G", code))
story.append(Paragraph(" \u2191_____________________________|", code))
story.append(Paragraph(" (G inhibits enzyme at D\u2192E, the first committed step)", code))
story.append(sp(4))
fb_imgs = img("feedback", w=11*cm, caption_text="Figure: Feedback inhibition - end product G loops back to inhibit the first committed step (D\u2192E). Source: Lippincott's Illustrated Reviews: Biochemistry 8e")
if fb_imgs:
story += fb_imgs
story.append(sp(4))
story.append(Paragraph("<b>Key Points about Feedback Inhibition</b>", h3))
story.append(styled_table(
["Aspect", "Detail"],
[
["Mechanism", "End product binds allosteric site of first committed enzyme"],
["Result", "Slows/stops entire biosynthetic pathway"],
["Reversibility","Fully reversible - when end product is consumed, inhibition lifts"],
["Purpose", "Prevents wasteful overproduction; provides precise regulation"],
["Speed", "Rapid (seconds to minutes)"],
["Classic example", "Serine \u2192 inhibits 3-phosphoglycerate dehydrogenase (first committed step in serine synthesis)"],
["Another example", "Citrate \u2192 inhibits phosphofructokinase-1 in glycolysis (cross-pathway regulation)"],
["Vs. Feedforward","Feedforward = upstream metabolite ACTIVATES downstream enzyme (e.g., AMP activates PFK-1)"],
],
col_widths=[4*cm, None]
))
story.append(sp(6))
story.append(tip_box(
"For 2-mark answers: Define allosteric enzyme (noncovalent effector at allosteric site, "
"multi-subunit, sigmoidal kinetics). Define feedback inhibition (end product inhibits "
"first committed step enzyme). Give ONE example each.", label="2-MARK ANSWER GUIDE"))
story.append(sp(8))
story.append(divider())
story.append(Paragraph(
"<b>Sources:</b> Harper's Illustrated Biochemistry 32e (Chapters 3, 9, 14, 15) | "
"Lippincott's Illustrated Reviews: Biochemistry 8e (Chapter 5) | "
"Tietz Textbook of Laboratory Medicine 7e (Chapter 36)",
S("src", fontSize=8, textColor=colors.HexColor("#666"), fontName="Helvetica-Oblique",
alignment=TA_CENTER, leading=12)))
return story
# ─── MAIN ─────────────────────────────────────────────────────────────────────
if __name__ == "__main__":
print("Downloading images...")
img_paths = download_images()
print("Building PDF story...")
story = build_story(img_paths)
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=2.2*cm, bottomMargin=1.8*cm,
title="Biochemistry Study Guide Q11-15",
author="Orris AI",
subject="Carbohydrates, Amino Acids, Fatty Acids, Allosteric Enzymes"
)
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF saved: {OUTPUT}")
cd /home/daytona/workspace/biochem-study-guide && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/biochem-study-guide/Biochemistry_Study_Guide.pdf
Biochemistry Study Guide
PDF Document · PDF
| Section | Contents |
|---|---|
| Cover page | Indexed table of contents with all 5 questions |
| Q.11 - Carbohydrates | Definition, classification table (mono/di/oligo/poly), full polysaccharide comparison table |
| Q.12 - Structures | Glucose (Fischer + Haworth + Chair form diagrams), Galactose (epimer diagram), Maltose (disaccharide structure image), Glycogen vs Starch comparison table |
| Q.13 - Amino Acids | Zwitterion diagram, ionization/pI, optical activity, R-group classification table, functional group reactions table, ninhydrin test, essential vs non-essential table + mnemonic "PVT TIM HaLL" |
| Q.14 - Fatty Acids | Chain length classification, saturation types, cis vs trans comparison table, EFA table, common fatty acids nomenclature table |
| Q.15 - Allosteric Enzymes | Definition, key features table, effector types, feedback inhibition diagram with pathway illustration, 2-mark answer guide box |
Create a study guide PDF with structures and key points for exam prep
ls -lh /home/daytona/workspace/biochem-study-guide/Biochemistry_Study_Guide.pdf
Biochemistry Study Guide
PDF Document · PDF