Analyze this and create me a fully organized paragraph type pdf with graphs , images mnemonics . And at end of every sub topic create a summary note tooo. Make Mcqs at the end If there’s any unclearly explained area explain them simply too.
cd /tmp/workspace/attachments/42e513ce-0fa8-448b-a009-b0fc64a1e21e/ && python3 -c " import pdfplumber with pdfplumber.open('5_6228601013343887298.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages[:5]): print(f'--- PAGE {i+1} ---') print(page.extract_text()) print() "
cd /tmp/workspace/attachments/42e513ce-0fa8-448b-a009-b0fc64a1e21e/ && python3 -c " import pdfplumber with pdfplumber.open('5_6228601013343887298.pdf') as pdf: for i, page in enumerate(pdf.pages[5:]): print(f'--- PAGE {i+6} ---') print(page.extract_text()) print() " 2>&1 | head -400
mkdir -p /tmp/workspace/enzyme-regulation && ls /tmp/workspace/enzyme-regulation/
?
mkdir -p /tmp/workspace/enzyme-regulation && cat > /tmp/workspace/enzyme-regulation/build_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import inch, cm from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, HRFlowable, KeepTogether) from reportlab.platypus import Image as RLImage from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.graphics.shapes import Drawing, Rect, String, Line, Circle, Polygon from reportlab.graphics.charts.lineplots import LinePlot from reportlab.graphics.charts.barcharts import VerticalBarChart from reportlab.graphics import renderPDF from reportlab.graphics.widgets.markers import makeMarker import io, math # ─── Color palette ────────────────────────────────────────────────────────────── NAVY = colors.HexColor('#1A237E') TEAL = colors.HexColor('#00695C') AMBER = colors.HexColor('#E65100') PURPLE = colors.HexColor('#4A148C') LIGHT_BLUE = colors.HexColor('#E3F2FD') LIGHT_TEAL = colors.HexColor('#E0F2F1') LIGHT_AMBER= colors.HexColor('#FFF3E0') LIGHT_PURP = colors.HexColor('#F3E5F5') LIGHT_GREY = colors.HexColor('#F5F5F5') RED_SOFT = colors.HexColor('#FFEBEE') GREEN_SOFT = colors.HexColor('#E8F5E9') YELLOW_SOFT= colors.HexColor('#FFFDE7') MNEMONIC_BG= colors.HexColor('#FFFDE7') MNEMONIC_BORDER = colors.HexColor('#F9A825') SUMMARY_BG = colors.HexColor('#E8F5E9') SUMMARY_BORDER = colors.HexColor('#2E7D32') CLINICAL_BG= colors.HexColor('#FCE4EC') CLINICAL_BORDER= colors.HexColor('#C62828') W, H = A4 # ─── Document ─────────────────────────────────────────────────────────────────── doc = SimpleDocTemplate( '/tmp/workspace/enzyme-regulation/Enzyme_Regulation.pdf', pagesize=A4, rightMargin=2*cm, leftMargin=2*cm, topMargin=2.2*cm, bottomMargin=2.2*cm ) styles = getSampleStyleSheet() # Custom styles def S(name, **kw): return ParagraphStyle(name, **kw) TITLE_S = S('TitleS', fontSize=28, textColor=NAVY, alignment=TA_CENTER, spaceAfter=6, fontName='Helvetica-Bold', leading=34) SUBTITLE_S = S('SubtitleS', fontSize=13, textColor=TEAL, alignment=TA_CENTER, spaceAfter=4, fontName='Helvetica') H1 = S('H1', fontSize=18, textColor=colors.white, spaceAfter=6, spaceBefore=14, fontName='Helvetica-Bold', backColor=NAVY, leftIndent=-6, rightIndent=-6, borderPad=6, leading=22) H2 = S('H2', fontSize=14, textColor=NAVY, spaceAfter=4, spaceBefore=10, fontName='Helvetica-Bold', leading=18) H3 = S('H3', fontSize=12, textColor=TEAL, spaceAfter=3, spaceBefore=7, fontName='Helvetica-Bold', leading=16) BODY = S('Body', fontSize=10.5, textColor=colors.HexColor('#212121'), spaceAfter=5, fontName='Helvetica', leading=16, alignment=TA_JUSTIFY) BULLET = S('Bullet', fontSize=10.5, textColor=colors.HexColor('#212121'), spaceAfter=3, fontName='Helvetica', leading=15, leftIndent=18, bulletIndent=6) MNEM_TITLE = S('MnemT', fontSize=11, textColor=colors.HexColor('#F57F17'), fontName='Helvetica-Bold', spaceAfter=3) MNEM_BODY = S('MnemB', fontSize=10.5, textColor=colors.HexColor('#4E342E'), fontName='Helvetica', leading=15) SUMM_TITLE = S('SummT', fontSize=11, textColor=colors.HexColor('#1B5E20'), fontName='Helvetica-Bold', spaceAfter=2) SUMM_BODY = S('SummB', fontSize=10, textColor=colors.HexColor('#1B5E20'), fontName='Helvetica', leading=14) CLIN_TITLE = S('ClinT', fontSize=11, textColor=colors.HexColor('#B71C1C'), fontName='Helvetica-Bold', spaceAfter=2) CLIN_BODY = S('ClinB', fontSize=10.5, textColor=colors.HexColor('#B71C1C'), fontName='Helvetica', leading=14) MCQ_Q = S('McqQ', fontSize=11, textColor=NAVY, fontName='Helvetica-Bold', spaceAfter=2, spaceBefore=6, leading=15) MCQ_OPT = S('McqOpt', fontSize=10.5, textColor=colors.HexColor('#424242'), fontName='Helvetica', leading=14, leftIndent=12, spaceAfter=1) MCQ_ANS = S('McqAns', fontSize=10.5, textColor=TEAL, fontName='Helvetica-Bold', leading=14, leftIndent=12, spaceAfter=4) CAPTION = S('Caption', fontSize=9, textColor=colors.HexColor('#757575'), alignment=TA_CENTER, fontName='Helvetica-Oblique', spaceAfter=6) def hr(color=NAVY, thickness=1.2): return HRFlowable(width='100%', thickness=thickness, color=color, spaceAfter=4, spaceBefore=4) def spacer(h=0.15): return Spacer(1, h*inch) # ─── Helper: Coloured Box ──────────────────────────────────────────────────────── def colored_box(content_rows, bg=LIGHT_BLUE, border=NAVY, radius=6): tbl = Table([[row] for row in content_rows], colWidths=[doc.width]) tbl.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), bg), ('BOX', (0,0), (-1,-1), 1.2, border), ('ROUNDEDCORNERS', [radius]), ('TOPPADDING', (0,0), (-1,-1), 8), ('BOTTOMPADDING', (0,0), (-1,-1), 8), ('LEFTPADDING', (0,0), (-1,-1), 12), ('RIGHTPADDING', (0,0), (-1,-1), 12), ])) return tbl def mnemonic_box(title, lines): items = [Paragraph(f'🧠 {title}', MNEM_TITLE)] for l in lines: items.append(Paragraph(l, MNEM_BODY)) return colored_box(items, bg=MNEMONIC_BG, border=MNEMONIC_BORDER) def summary_box(lines): items = [Paragraph('📋 Summary Notes', SUMM_TITLE)] for l in lines: items.append(Paragraph(f'✔ {l}', SUMM_BODY)) return colored_box(items, bg=SUMMARY_BG, border=SUMMARY_BORDER) def clinical_box(lines): items = [Paragraph('🏥 Clinical Correlation', CLIN_TITLE)] for l in lines: items.append(Paragraph(l, CLIN_BODY)) return colored_box(items, bg=CLINICAL_BG, border=CLINICAL_BORDER) # ─── CHARTS & DIAGRAMS ────────────────────────────────────────────────────────── def make_regulation_overview_chart(): """Bar chart: speed of different regulation types""" drawing = Drawing(460, 200) drawing.add(Rect(0, 0, 460, 200, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#E0E0E0'))) bc = VerticalBarChart() bc.x = 60; bc.y = 30; bc.height = 140; bc.width = 370 bc.data = [[5, 4, 3, 2, 1]] # relative speed scores bc.categoryAxis.categoryNames = ['Allosteric', 'Cov.Modif.', 'Substrate/\nProduct', 'Zymogens', 'Gene\nExpression'] bc.categoryAxis.labels.fontSize = 8 bc.categoryAxis.labels.angle = 0 bc.valueAxis.valueMin = 0; bc.valueAxis.valueMax = 6 bc.valueAxis.valueStep = 1 bc.bars[0].fillColor = colors.HexColor('#1565C0') bc.bars[0].strokeColor = colors.HexColor('#0D47A1') bc.valueAxis.labels.fontSize = 8 title = String(230, 185, 'Relative Speed of Enzyme Regulation Mechanisms', fontSize=9, fillColor=NAVY, textAnchor='middle', fontName='Helvetica-Bold') ytitle = String(12, 90, 'Relative Speed (Fastest=5)', fontSize=7.5, fillColor=colors.grey, textAnchor='middle', fontName='Helvetica') drawing.add(bc) drawing.add(title) drawing.add(ytitle) return drawing def make_sigmoid_vs_mm_chart(): """Compare Michaelis-Menten hyperbola vs allosteric sigmoidal curve""" drawing = Drawing(440, 200) drawing.add(Rect(0, 0, 440, 200, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#E0E0E0'))) # Axes ax, ay = 55, 20 aw, ah = 340, 155 drawing.add(Line(ax, ay, ax, ay+ah, strokeColor=colors.black, strokeWidth=1.2)) drawing.add(Line(ax, ay, ax+aw, ay, strokeColor=colors.black, strokeWidth=1.2)) # Axis labels drawing.add(String(ax+aw//2, 5, '[S] Substrate Concentration', fontSize=8, textAnchor='middle', fillColor=colors.black)) drawing.add(String(14, ay+ah//2, 'V (Rate)', fontSize=8, textAnchor='middle', fillColor=colors.black)) # Michaelis-Menten hyperbola V = Vmax*S/(Km+S) Vmax=130; Km=25 mm_pts = [] for i in range(1, 80): s = i * 2.0 v = Vmax * s / (Km + s) mm_pts.append((ax + s*2.1, ay + v)) for i in range(len(mm_pts)-1): drawing.add(Line(mm_pts[i][0], mm_pts[i][1], mm_pts[i+1][0], mm_pts[i+1][1], strokeColor=colors.HexColor('#1565C0'), strokeWidth=2)) # Sigmoidal V = Vmax*S^n/(K0.5^n + S^n) n=3 n=3; K=40 sig_pts = [] for i in range(1, 80): s = i * 2.0 v = Vmax * (s**n) / (K**n + s**n) sig_pts.append((ax + s*2.1, ay + v)) for i in range(len(sig_pts)-1): drawing.add(Line(sig_pts[i][0], sig_pts[i][1], sig_pts[i+1][0], sig_pts[i+1][1], strokeColor=colors.HexColor('#C62828'), strokeWidth=2)) # Legend drawing.add(Rect(310, 155, 12, 8, fillColor=colors.HexColor('#1565C0'), strokeColor=colors.HexColor('#1565C0'))) drawing.add(String(326, 163, 'Michaelis-Menten', fontSize=7.5, fillColor=colors.black)) drawing.add(Rect(310, 143, 12, 8, fillColor=colors.HexColor('#C62828'), strokeColor=colors.HexColor('#C62828'))) drawing.add(String(326, 151, 'Allosteric (Sigmoidal)', fontSize=7.5, fillColor=colors.black)) drawing.add(String(ax+aw//2, 185, 'Allosteric Enzymes: Sigmoidal vs Michaelis-Menten Kinetics', fontSize=9, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) return drawing def make_phospho_diagram(): """Phosphorylation/Dephosphorylation cycle diagram""" drawing = Drawing(440, 160) drawing.add(Rect(0, 0, 440, 160, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#E0E0E0'))) # Inactive enzyme box drawing.add(Rect(20, 55, 110, 50, fillColor=colors.HexColor('#FFCDD2'), strokeColor=colors.HexColor('#C62828'), strokeWidth=1.5)) drawing.add(String(75, 85, 'INACTIVE', fontSize=9, textAnchor='middle', fillColor=colors.HexColor('#B71C1C'), fontName='Helvetica-Bold')) drawing.add(String(75, 70, 'Enzyme', fontSize=8.5, textAnchor='middle', fillColor=colors.HexColor('#B71C1C'))) # Active enzyme box drawing.add(Rect(310, 55, 110, 50, fillColor=colors.HexColor('#C8E6C9'), strokeColor=colors.HexColor('#2E7D32'), strokeWidth=1.5)) drawing.add(String(365, 85, 'ACTIVE', fontSize=9, textAnchor='middle', fillColor=colors.HexColor('#1B5E20'), fontName='Helvetica-Bold')) drawing.add(String(365, 70, 'Enzyme-P', fontSize=8.5, textAnchor='middle', fillColor=colors.HexColor('#1B5E20'))) # Top arrow: Phosphorylation drawing.add(Line(135, 90, 305, 90, strokeColor=colors.HexColor('#1565C0'), strokeWidth=2)) drawing.add(Polygon([305,90, 295,85, 295,95], fillColor=colors.HexColor('#1565C0'), strokeColor=colors.HexColor('#1565C0'))) drawing.add(String(220, 100, 'Kinase + ATP', fontSize=8, textAnchor='middle', fillColor=colors.HexColor('#1565C0'), fontName='Helvetica-Bold')) drawing.add(String(220, 114, 'PHOSPHORYLATION', fontSize=7.5, textAnchor='middle', fillColor=colors.HexColor('#1565C0'))) # Bottom arrow: Dephosphorylation drawing.add(Line(305, 68, 135, 68, strokeColor=colors.HexColor('#E65100'), strokeWidth=2)) drawing.add(Polygon([135,68, 145,63, 145,73], fillColor=colors.HexColor('#E65100'), strokeColor=colors.HexColor('#E65100'))) drawing.add(String(220, 58, 'Phosphatase + H2O', fontSize=8, textAnchor='middle', fillColor=colors.HexColor('#E65100'), fontName='Helvetica-Bold')) drawing.add(String(220, 44, 'DEPHOSPHORYLATION', fontSize=7.5, textAnchor='middle', fillColor=colors.HexColor('#E65100'))) drawing.add(String(220, 148, 'Phosphorylation / Dephosphorylation Cycle', fontSize=9, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) return drawing def make_zymogen_diagram(): """Zymogen -> active enzyme diagram""" drawing = Drawing(440, 140) drawing.add(Rect(0, 0, 440, 140, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#E0E0E0'))) boxes = [ (20, 40, 100, 50, '#FFF9C4', '#F9A825', 'ZYMOGEN\n(Inactive)', '#F57F17'), (175, 40, 100, 50, '#FFCCBC', '#BF360C', 'Proteolytic\nCleavage', '#BF360C'), (320, 40, 100, 50, '#C8E6C9', '#2E7D32', 'ACTIVE\nEnzyme', '#1B5E20'), ] for bx, by, bw, bh, fill, stroke, label, tc in boxes: drawing.add(Rect(bx, by, bw, bh, fillColor=colors.HexColor(fill), strokeColor=colors.HexColor(stroke), strokeWidth=1.5)) for j, part in enumerate(label.split('\n')): drawing.add(String(bx+bw//2, by+bh//2+5-j*13, part, fontSize=9, textAnchor='middle', fillColor=colors.HexColor(tc), fontName='Helvetica-Bold')) # arrows for x1, x2 in [(123,172),(278,317)]: drawing.add(Line(x1, 65, x2, 65, strokeColor=NAVY, strokeWidth=2)) drawing.add(Polygon([x2,65,x2-10,60,x2-10,70], fillColor=NAVY, strokeColor=NAVY)) # examples pairs = [('Pepsinogen','Pepsin'),('Trypsinogen','Trypsin'), ('Chymotrypsinogen','Chymotrypsin'),('Proelastase','Elastase')] tdata = [['Inactive Zymogen', 'Active Enzyme']] + [[a, b] for a,b in pairs] t = Table(tdata, colWidths=[120,120]) t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), colors.HexColor('#1A237E')), ('TEXTCOLOR',(0,0),(-1,0), colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1), 8), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.HexColor('#F3F3F3'), colors.white]), ('GRID',(0,0),(-1,-1),0.5, colors.HexColor('#BDBDBD')), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3), ])) drawing.add(String(220, 128, 'Proteolytic Activation: Zymogens → Active Enzymes', fontSize=9, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) return drawing, t def make_feedback_diagram(): """Feedback inhibition pathway diagram""" drawing = Drawing(440, 120) drawing.add(Rect(0, 0, 440, 120, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#E0E0E0'))) steps = ['A', 'B', 'C', 'D', 'E', 'G\n(End Product)'] xs = [30, 95, 160, 225, 290, 370] for i, (x, label) in enumerate(zip(xs, steps)): col = colors.HexColor('#FFCDD2') if i == len(steps)-1 else colors.HexColor('#BBDEFB') sc = colors.HexColor('#C62828') if i == len(steps)-1 else colors.HexColor('#1565C0') drawing.add(Circle(x+20, 70, 18, fillColor=col, strokeColor=sc, strokeWidth=1.5)) for j, part in enumerate(label.split('\n')): drawing.add(String(x+20, 74-j*11, part, fontSize=8, textAnchor='middle', fillColor=sc, fontName='Helvetica-Bold')) for i in range(len(xs)-1): x1 = xs[i]+38; x2 = xs[i+1]+2 drawing.add(Line(x1, 70, x2, 70, strokeColor=NAVY, strokeWidth=1.5)) drawing.add(Polygon([x2,70,x2-8,66,x2-8,74], fillColor=NAVY, strokeColor=NAVY)) # feedback inhibition arrow (curved, simulated with dashed line) fx = xs[-1]+20; tx = xs[0]+20 drawing.add(Line(fx, 52, tx, 52, strokeColor=colors.HexColor('#C62828'), strokeWidth=1.5, strokeDashArray=[4,3])) drawing.add(Polygon([tx,52,tx+8,48,tx+8,56], fillColor=colors.HexColor('#C62828'), strokeColor=colors.HexColor('#C62828'))) drawing.add(String(220, 38, '⊣ Feedback Inhibition', fontSize=8.5, textAnchor='middle', fillColor=colors.HexColor('#C62828'), fontName='Helvetica-Bold')) drawing.add(String(220, 112, 'Feedback Inhibition: End Product Inhibits First Enzyme in Pathway', fontSize=8.5, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) return drawing def make_allosteric_diagram(): """Allosteric regulation diagram""" drawing = Drawing(440, 160) drawing.add(Rect(0, 0, 440, 160, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#E0E0E0'))) # Enzyme shape (pac-man like) drawing.add(Circle(180, 80, 50, fillColor=colors.HexColor('#BBDEFB'), strokeColor=NAVY, strokeWidth=2)) # Active site notch drawing.add(Rect(195, 62, 40, 36, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#FAFAFA'))) drawing.add(String(180, 84, 'ENZYME', fontSize=9, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) # Active site label drawing.add(String(230, 95, 'Active\nSite', fontSize=8, textAnchor='middle', fillColor=NAVY)) # Allosteric site drawing.add(Circle(140, 50, 18, fillColor=colors.HexColor('#FFF9C4'), strokeColor=colors.HexColor('#F9A825'), strokeWidth=1.5)) drawing.add(String(140, 54, 'Allosteri-', fontSize=7, textAnchor='middle', fillColor=colors.HexColor('#E65100'))) drawing.add(String(140, 44, 'c Site', fontSize=7, textAnchor='middle', fillColor=colors.HexColor('#E65100'))) # Substrate drawing.add(Rect(265, 68, 40, 24, fillColor=colors.HexColor('#C8E6C9'), strokeColor=colors.HexColor('#2E7D32'), strokeWidth=1.5)) drawing.add(String(285, 83, 'Substrate', fontSize=7.5, textAnchor='middle', fillColor=colors.HexColor('#1B5E20'), fontName='Helvetica-Bold')) # Effector drawing.add(Rect(60, 35, 45, 24, fillColor=colors.HexColor('#FFCCBC'), strokeColor=colors.HexColor('#BF360C'), strokeWidth=1.5)) drawing.add(String(82, 51, 'Effector', fontSize=7.5, textAnchor='middle', fillColor=colors.HexColor('#BF360C'), fontName='Helvetica-Bold')) drawing.add(String(82, 39, '(+) or (-)', fontSize=7, textAnchor='middle', fillColor=colors.HexColor('#BF360C'))) # Arrows drawing.add(Line(108, 47, 122, 53, strokeColor=colors.HexColor('#E65100'), strokeWidth=1.5)) drawing.add(Line(265, 80, 232, 80, strokeColor=colors.HexColor('#2E7D32'), strokeWidth=1.5)) drawing.add(Polygon([232,80,240,76,240,84], fillColor=colors.HexColor('#2E7D32'), strokeColor=colors.HexColor('#2E7D32'))) # Legend drawing.add(Rect(320, 110, 10, 10, fillColor=colors.HexColor('#C8E6C9'), strokeColor=colors.HexColor('#2E7D32'))) drawing.add(String(334, 120, 'Substrate binds Active Site', fontSize=7.5, fillColor=colors.black)) drawing.add(Rect(320, 95, 10, 10, fillColor=colors.HexColor('#FFCCBC'), strokeColor=colors.HexColor('#BF360C'))) drawing.add(String(334, 105, 'Effector binds Allosteric Site', fontSize=7.5, fillColor=colors.black)) drawing.add(String(220, 148, 'Allosteric Regulation: Two-Site Model', fontSize=9, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) return drawing def make_metabolic_flux_chart(): """Metabolic flux control illustration""" drawing = Drawing(440, 160) drawing.add(Rect(0, 0, 440, 160, fillColor=colors.HexColor('#FAFAFA'), strokeColor=colors.HexColor('#E0E0E0'))) labels = ['Glucose', 'G-6-P', 'F-6-P', 'F-1,6-BP', 'Pyruvate'] fluxes = [90, 75, 60, 40, 35] colors_bar = ['#1565C0','#1976D2','#42A5F5','#64B5F6','#90CAF9'] bw = 55; gap = 20; startx = 40 for i, (label, flux, col) in enumerate(zip(labels, fluxes, colors_bar)): x = startx + i*(bw+gap) bh = flux by = 30 drawing.add(Rect(x, by, bw, bh, fillColor=colors.HexColor(col), strokeColor=NAVY, strokeWidth=0.8)) drawing.add(String(x+bw//2, by+bh+5, str(flux)+'%', fontSize=7.5, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) drawing.add(String(x+bw//2, 20, label, fontSize=7.5, textAnchor='middle', fillColor=colors.black)) # PFK-1 marker pfk_x = startx + 3*(bw+gap) + bw//2 drawing.add(Line(pfk_x, 125, pfk_x, 135, strokeColor=colors.HexColor('#C62828'), strokeWidth=2)) drawing.add(String(pfk_x, 142, 'PFK-1\n(Rate-Limiting)', fontSize=7.5, textAnchor='middle', fillColor=colors.HexColor('#C62828'), fontName='Helvetica-Bold')) drawing.add(String(220, 152, 'Glycolytic Flux: Rate-Limiting Step at PFK-1', fontSize=9, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) return drawing def make_channeling_diagram(): """Metabolic channeling: multienzyme complex""" drawing = Drawing(440, 140) drawing.add(Rect(0, 0, 440, 140, fillColor=colors.HexColor('#F8F9FA'), strokeColor=colors.HexColor('#E0E0E0'))) # Large complex drawing.add(Circle(220, 65, 52, fillColor=colors.HexColor('#E8EAF6'), strokeColor=PURPLE, strokeWidth=2)) drawing.add(String(220, 70, 'Multienzyme', fontSize=8.5, textAnchor='middle', fillColor=PURPLE, fontName='Helvetica-Bold')) drawing.add(String(220, 58, 'Complex', fontSize=8.5, textAnchor='middle', fillColor=PURPLE, fontName='Helvetica-Bold')) # Sub-enzymes sub = [('E1', 185, 50), ('E2', 220, 80), ('E3', 255, 50)] sub_colors = ['#BBDEFB','#C8E6C9','#FFCCBC'] for (label, sx, sy), sc in zip(sub, sub_colors): drawing.add(Circle(sx, sy, 14, fillColor=colors.HexColor(sc), strokeColor=NAVY, strokeWidth=1)) drawing.add(String(sx, sy+4, label, fontSize=8, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) # Substrate in drawing.add(Rect(30, 55, 50, 24, fillColor=colors.HexColor('#FFF9C4'), strokeColor=colors.HexColor('#F9A825'), strokeWidth=1.5)) drawing.add(String(55, 70, 'Substrate', fontSize=7.5, textAnchor='middle', fillColor=colors.HexColor('#E65100'))) # Product out drawing.add(Rect(360, 55, 50, 24, fillColor=colors.HexColor('#C8E6C9'), strokeColor=colors.HexColor('#2E7D32'), strokeWidth=1.5)) drawing.add(String(385, 70, 'Product', fontSize=7.5, textAnchor='middle', fillColor=colors.HexColor('#1B5E20'))) # Arrows drawing.add(Line(82, 67, 167, 67, strokeColor=colors.HexColor('#E65100'), strokeWidth=1.8)) drawing.add(Polygon([167,67,158,63,158,71], fillColor=colors.HexColor('#E65100'), strokeColor=colors.HexColor('#E65100'))) drawing.add(Line(273, 67, 358, 67, strokeColor=colors.HexColor('#2E7D32'), strokeWidth=1.8)) drawing.add(Polygon([358,67,349,63,349,71], fillColor=colors.HexColor('#2E7D32'), strokeColor=colors.HexColor('#2E7D32'))) # Direct channeling arrows inside complex drawing.add(Line(199, 54, 208, 65, strokeColor=NAVY, strokeWidth=1, strokeDashArray=[3,2])) drawing.add(Line(222, 67, 242, 55, strokeColor=NAVY, strokeWidth=1, strokeDashArray=[3,2])) drawing.add(String(220, 128, 'Metabolic Channeling: Intermediates Passed Directly Between Enzymes', fontSize=8.5, textAnchor='middle', fillColor=NAVY, fontName='Helvetica-Bold')) return drawing # ─── BUILD STORY ──────────────────────────────────────────────────────────────── story = [] # ═══════════════════════════════════════════════════════════ # COVER # ═══════════════════════════════════════════════════════════ story.append(spacer(1.5)) story.append(Paragraph('ENZYME REGULATION', TITLE_S)) story.append(spacer(0.1)) story.append(hr(NAVY, 2)) story.append(spacer(0.1)) story.append(Paragraph('A Comprehensive Study Guide', SUBTITLE_S)) story.append(Paragraph('Dr. Dilusha Fernando | Department of Biochemistry & Molecular Biology', SUBTITLE_S)) story.append(spacer(0.3)) # Quick-reference overview table overview_data = [ ['Topic', 'Type', 'Speed', 'Key Example'], ['Allosteric Regulation', 'Rapid', '⚡⚡⚡⚡⚡', 'ATCase, PFK-1'], ['Covalent Modification', 'Rapid', '⚡⚡⚡⚡', 'Glycogen Phosphorylase'], ['Substrate/Product Conc.', 'Rapid', '⚡⚡⚡', 'General Enzymes'], ['Proteolytic Activation', 'Irreversible', '⚡⚡', 'Trypsinogen → Trypsin'], ['Gene Expression Control', 'Slow', '⚡', 'Glucokinase, PFK-1'], ] ot = Table(overview_data, colWidths=[140, 90, 80, 130]) ot.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), NAVY), ('TEXTCOLOR',(0,0),(-1,0), colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.HexColor('#E3F2FD'), colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#90CAF9')), ('TOPPADDING',(0,0),(-1,-1),5), ('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1.5, NAVY), ])) story.append(ot) story.append(Paragraph('Table 1: Overview of Enzyme Regulation Mechanisms', CAPTION)) story.append(spacer(0.3)) story.append(colored_box([ Paragraph('Why does the body regulate enzymes?', H3), Paragraph('After a carbohydrate-rich meal, blood glucose rises and glycolysis must accelerate. ' 'Simultaneously, gluconeogenesis must be suppressed — you cannot make glucose while you are ' 'breaking it down at full speed. Without regulation, ATP would be wasted on futile cycles, ' 'toxic metabolites would accumulate, and homeostasis would collapse. Enzyme regulation is the ' 'master solution: it allows the cell to respond precisely and rapidly to changing metabolic demands.', BODY), ], bg=LIGHT_BLUE, border=NAVY)) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 1 — INTRODUCTION # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 1. Introduction to Enzyme Regulation', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Enzyme regulation is the process by which cells control the activity of enzymes to meet metabolic needs. ' 'It ensures that biochemical reactions occur at the right time, in the right place, and at the appropriate rate. ' 'Rather than keeping all enzymes working at maximum speed continuously — which would be enormously wasteful — ' 'the cell uses a sophisticated set of control mechanisms to fine-tune enzyme activity moment by moment.', BODY)) story.append(spacer(0.1)) tbl_why = Table([ [Paragraph('<b>WITHOUT Regulation</b>', S('wh', fontSize=10, textColor=colors.HexColor('#B71C1C'), fontName='Helvetica-Bold', alignment=TA_CENTER)), Paragraph('<b>WITH Regulation</b>', S('wh2', fontSize=10, textColor=colors.HexColor('#1B5E20'), fontName='Helvetica-Bold', alignment=TA_CENTER))], [Paragraph('ATP is wasted', BODY), Paragraph('Energy is conserved', BODY)], [Paragraph('Futile cycles occur', BODY), Paragraph('Rapid response to conditions', BODY)], [Paragraph('Toxic metabolites accumulate', BODY), Paragraph('Homeostasis maintained', BODY)], [Paragraph('Loss of homeostasis', BODY), Paragraph('Metabolism is coordinated', BODY)], ], colWidths=[220, 220]) tbl_why.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), colors.HexColor('#FFCDD2')), ('BACKGROUND',(1,0),(1,0), colors.HexColor('#C8E6C9')), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.HexColor('#FFF3E0'), colors.HexColor('#F1F8E9')]), ('GRID',(0,0),(-1,-1),0.5, colors.HexColor('#BDBDBD')), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4), ('BOX',(0,0),(-1,-1),1.5, NAVY), ])) story.append(tbl_why) story.append(Paragraph('Table 2: Consequences of regulation vs. no regulation', CAPTION)) story.append(spacer(0.2)) story.append(Paragraph('Types of Enzyme Regulation (Overview)', H2)) story.append(Paragraph( 'There are six major mechanisms by which enzyme activity is regulated in living cells:', BODY)) for item in [ '<b>1. Allosteric regulation</b> — binding of an effector at a non-active site changes enzyme shape and activity.', '<b>2. Feedback (product) inhibition</b> — end products of a pathway inhibit enzymes earlier in the pathway.', '<b>3. Covalent modification</b> — chemical groups (e.g., phosphate) are added or removed to switch enzymes on/off.', '<b>4. Proteolytic activation (zymogens)</b> — inactive precursors are cleaved to generate active enzymes.', '<b>5. Substrate and product concentration</b> — enzyme rates respond to mass-action changes.', '<b>6. Induction/repression of enzyme synthesis</b> — hormones alter gene expression to change enzyme levels.', ]: story.append(Paragraph(item, BULLET)) story.append(spacer(0.15)) story.append(Paragraph('Speed Comparison of Regulation Mechanisms', H3)) story.append(make_regulation_overview_chart()) story.append(Paragraph('Figure 1: Relative speed of different enzyme regulation mechanisms (fastest = allosteric).', CAPTION)) story.append(spacer(0.2)) story.append(mnemonic_box('Remember ALL Types: "A FCS-PI Gene"', ['<b>A</b> — Allosteric regulation', '<b>F</b> — Feedback inhibition', '<b>C</b> — Covalent modification', '<b>S</b> — Substrate/product concentration', '<b>P</b> — Proteolytic activation (zymogens)', '<b>I/Gene</b> — Induction/repression of gene expression'])) story.append(spacer(0.15)) story.append(summary_box([ 'Enzyme regulation controls enzyme activity based on cellular needs.', 'It ensures reactions happen at the right time, place, and rate.', 'Without regulation: ATP waste, futile cycles, toxicity, loss of homeostasis.', 'Six main types: Allosteric, Feedback, Covalent, Substrate/Product, Zymogens, Gene expression.', 'Allosteric regulation is the fastest; gene expression changes are the slowest.', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 2 — COVALENT MODIFICATION # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 2. Covalent Modification', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Covalent modification is the regulation of enzyme activity by the addition or removal of a ' 'covalently attached chemical group. This produces a conformational change that alters catalytic activity. ' 'The modification may be reversible (like phosphorylation) or irreversible (like proteolytic cleavage). ' 'Covalent modification is generally rapid in onset and critically important in both metabolic regulation ' 'and cell signalling.', BODY)) story.append(Paragraph('2.1 Features of Covalent Modification', H2)) feat_data = [['Feature','Detail'], ['Speed','Rapid (seconds to minutes)'], ['Reversibility','Reversible OR Irreversible'], ['Effect','Alters enzyme conformation → changes activity'], ['Biological role','Metabolic regulation & cell signalling']] ft = Table(feat_data, colWidths=[150, 290]) ft.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),TEAL), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9.5), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_TEAL, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#B2DFDB')), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4), ('BOX',(0,0),(-1,-1),1.5,TEAL), ])) story.append(ft) story.append(Paragraph('Table 3: Features of covalent modification', CAPTION)) story.append(Paragraph('2.2 Types of Covalent Modification', H2)) story.append(Paragraph('<b>Reversible modifications</b> (most clinically important):', BODY)) for m in ['Phosphorylation (most common)', 'Dephosphorylation', 'Acetylation', 'Methylation', 'ADP-ribosylation']: story.append(Paragraph(f'• {m}', BULLET)) story.append(Paragraph('<b>Irreversible modifications:</b>', BODY)) for m in ['Proteolytic cleavage (zymogen activation)', 'Irreversible chemical modification']: story.append(Paragraph(f'• {m}', BULLET)) story.append(Paragraph('2.3 Phosphorylation and Dephosphorylation', H2)) story.append(Paragraph( 'Phosphorylation is by far the most widespread and important reversible covalent modification. ' 'A protein kinase uses ATP to donate a phosphate group to a serine, threonine, or tyrosine residue on the enzyme. ' 'Phosphoprotein phosphatases catalyze the reverse reaction, removing the phosphate group. ' 'The resulting conformational change can either activate or inhibit the enzyme — the outcome depends entirely ' 'on the specific enzyme in question.', BODY)) story.append(spacer(0.1)) story.append(make_phospho_diagram()) story.append(Paragraph('Figure 2: Phosphorylation/dephosphorylation cycle. ATP-dependent kinase adds phosphate; phosphatase removes it.', CAPTION)) story.append(spacer(0.15)) story.append(Paragraph( 'A key point that confuses many students: phosphorylation does NOT always activate an enzyme. ' 'For example:', BODY)) eg_data = [ ['Enzyme', 'Phosphorylated Form', 'Dephosphorylated Form'], ['Glycogen Synthase', 'INACTIVE', 'ACTIVE'], ['Glycogen Phosphorylase', 'ACTIVE', 'INACTIVE'], ] et = Table(eg_data, colWidths=[160, 120, 160]) et.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),AMBER), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9.5), ('BACKGROUND',(1,1),(1,1),colors.HexColor('#FFCDD2')), ('BACKGROUND',(2,1),(2,1),colors.HexColor('#C8E6C9')), ('BACKGROUND',(1,2),(1,2),colors.HexColor('#C8E6C9')), ('BACKGROUND',(2,2),(2,2),colors.HexColor('#FFCDD2')), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#FFCC80')), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1.5,AMBER), ])) story.append(et) story.append(Paragraph('Table 4: Effect of phosphorylation depends on the specific enzyme.', CAPTION)) story.append(spacer(0.15)) story.append(Paragraph( 'Glucagon, released during fasting, phosphorylates many key enzymes simultaneously through a hormone-receptor ' 'cascade, rapidly shifting the cell from an anabolic to a catabolic state. This is one of the most elegant ' 'examples of coordinated enzyme regulation in human physiology.', BODY)) story.append(mnemonic_box('Phosphorylation Memory Trick: "Kinase Kills Glycogen Synthase, Phosphorylase Lives"', ['<b>K</b>inase phosphorylates both enzymes.', 'Glycogen <b>S</b>ynthase → phosphorylated = <b>S</b>topped (inactive).', 'Glycogen <b>P</b>hosphorylase → phosphorylated = <b>P</b>roceeds (active).', 'Think: during fasting (glucagon), you want to BREAK DOWN glycogen, so Phosphorylase turns ON.'])) story.append(spacer(0.2)) story.append(summary_box([ 'Covalent modification = addition/removal of chemical groups to alter enzyme activity.', 'Most important: Phosphorylation (by kinases) and Dephosphorylation (by phosphatases).', 'Phosphorylation can either ACTIVATE or INACTIVATE — depends on the enzyme.', 'Glycogen Synthase: Active when dephosphorylated. Glycogen Phosphorylase: Active when phosphorylated.', 'Glucagon triggers phosphorylation of many enzymes during fasting.', 'Slower than allosteric modulation but still considered rapid regulation.', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 3 — PROTEOLYTIC ACTIVATION (ZYMOGENS) # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 3. Proteolytic Activation (Zymogens)', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Many enzymes — particularly digestive enzymes — are synthesized as inactive precursors called ' '<b>zymogens</b> (also called proenzymes). This is an irreversible form of covalent modification ' 'where a specific peptide bond is cleaved to convert the inactive zymogen into the active enzyme. ' 'The key reason for this: <b>to prevent autodigestion</b>. If proteases were synthesized already active ' 'inside the pancreas, they would digest the pancreatic cells themselves.', BODY)) story.append(spacer(0.1)) zymo_drawing, zymo_table = make_zymogen_diagram() story.append(zymo_drawing) story.append(Paragraph('Figure 3: Zymogens are cleaved irreversibly to produce active enzymes.', CAPTION)) story.append(spacer(0.1)) story.append(zymo_table) story.append(Paragraph('Table 5: Common zymogens and their active forms.', CAPTION)) story.append(spacer(0.15)) story.append(Paragraph('3.1 Hormonal Control — Cholecystokinin (CCK)', H2)) story.append(Paragraph( 'Cholecystokinin (CCK) is a duodenal hormone that regulates pancreatic enzyme secretion and bile release ' 'in response to dietary fats and proteins. When fat and protein enter the duodenum, CCK is released. ' 'It acts on the pancreas to increase secretion of zymogens (trypsinogen, lipase, amylase) and on the ' 'gallbladder to trigger contraction and bile release. Crucially, a negative feedback loop operates: once ' 'trypsin is activated in the intestinal lumen, it degrades CCK-releasing peptide and monitor peptide, ' 'reducing CCK release and thereby slowing further enzyme secretion. This prevents overproduction.', BODY)) cck_data = [ ['Step', 'Event'], ['1', 'Fat/protein enters duodenum'], ['2', 'CCK released from duodenal I-cells'], ['3', 'CCK → Pancreas: secrete zymogens; Gallbladder: contract → bile'], ['4', 'Trypsinogen → Trypsin (activated in intestine)'], ['5', 'Trypsin degrades CCK-releasing peptide & monitor peptide'], ['6', 'CCK release decreases → less enzyme secretion (negative feedback)'], ] ct = Table(cck_data, colWidths=[35, 405]) ct.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),PURPLE), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_PURP, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#CE93D8')), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4), ('BOX',(0,0),(-1,-1),1.5,PURPLE), ])) story.append(ct) story.append(Paragraph('Table 6: CCK negative feedback loop step-by-step.', CAPTION)) story.append(spacer(0.15)) story.append(clinical_box([ '<b>Acute Pancreatitis:</b> Premature activation of trypsinogen INSIDE the pancreas (rather than ' 'the intestinal lumen) triggers autodigestion of pancreatic tissue. This is one of the most ' 'clinically dramatic examples of failed enzyme regulation. The pancreas literally digests itself, ' 'causing severe abdominal pain, elevated serum amylase/lipase, and potentially life-threatening ' 'systemic inflammation.' ])) story.append(spacer(0.15)) story.append(mnemonic_box('Remember zymogens: "Please Try Chewing Elastically"', ['<b>P</b>epsinogen → Pepsin', '<b>T</b>rypsinogen → Trypsin', '<b>C</b>hymotrypsinogen → Chymotrypsin', '<b>E</b>lastase precursor (Proelastase) → Elastase'])) story.append(spacer(0.2)) story.append(summary_box([ 'Zymogens are inactive enzyme precursors activated by irreversible proteolytic cleavage.', 'Purpose: prevent autodigestion of secretory tissues (e.g., pancreas).', 'Key zymogens: Pepsinogen, Trypsinogen, Chymotrypsinogen, Proelastase.', 'CCK hormone triggers zymogen secretion; trypsin provides negative feedback to stop over-secretion.', 'Clinical failure: acute pancreatitis = premature trypsinogen activation inside the pancreas.', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 4 — ALLOSTERIC REGULATION # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 4. Allosteric Regulation', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Allosteric regulation is the modulation of an enzyme\'s activity by the binding of a regulatory ' 'molecule — called an <b>effector</b> — at a specific site called the <b>allosteric site</b>, which is ' 'physically separate from the active (catalytic) site. When the effector binds, it causes a ' '<b>conformational change</b> (shape change) in the enzyme that either increases or decreases ' 'catalytic activity. This is the fastest and most flexible form of enzyme regulation.', BODY)) story.append(spacer(0.1)) story.append(make_allosteric_diagram()) story.append(Paragraph('Figure 4: Allosteric enzyme with separate active site and allosteric site. Effector binding changes enzyme shape.', CAPTION)) story.append(Paragraph('4.1 Types of Allosteric Effectors', H2)) eff_data = [ ['Type', 'Effect on Enzyme', 'Example'], ['Positive Effector (Activator)', 'Increases enzyme activity', 'AMP activates PFK-1'], ['Negative Effector (Inhibitor)', 'Decreases enzyme activity', 'ATP inhibits PFK-1'], ] eff_t = Table(eff_data, colWidths=[155, 155, 130]) eff_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),TEAL), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9.5), ('BACKGROUND',(0,1),(2,1),colors.HexColor('#E8F5E9')), ('BACKGROUND',(0,2),(2,2),colors.HexColor('#FFEBEE')), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#B2DFDB')), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1.5,TEAL), ])) story.append(eff_t) story.append(Paragraph('Table 7: Positive vs. negative allosteric effectors.', CAPTION)) story.append(Paragraph('4.2 Cooperativity', H2)) story.append(Paragraph( 'A special and important feature of allosteric enzymes is <b>cooperativity</b>. Many allosteric enzymes ' 'are multi-subunit proteins with multiple active sites. When one substrate molecule binds to one subunit, ' 'it alters the conformation of the other subunits, changing their affinity for substrate. ' 'Positive cooperativity means the first binding event makes subsequent binding easier (like hemoglobin ' 'binding oxygen). Negative cooperativity means the first binding event makes subsequent binding harder. ' 'ATCase (aspartate transcarbamoylase) is the classic example of a highly cooperative allosteric enzyme.', BODY)) story.append(spacer(0.1)) story.append(Paragraph('4.3 Sigmoidal Kinetics — Why Allosteric Enzymes are Different', H2)) story.append(Paragraph( 'Unlike ordinary enzymes that follow Michaelis-Menten kinetics (producing a hyperbolic velocity curve), ' 'allosteric enzymes produce a characteristic <b>sigmoidal (S-shaped) velocity curve</b> when velocity is ' 'plotted against substrate concentration. This S-shape reflects cooperativity: at low substrate, the ' 'enzyme responds sluggishly; once a threshold is reached, activity increases steeply. This gives allosteric ' 'enzymes a "switch-like" response, making them exquisitely sensitive to small changes in substrate ' 'concentration near their K0.5 value.', BODY)) story.append(spacer(0.1)) story.append(make_sigmoid_vs_mm_chart()) story.append(Paragraph('Figure 5: Michaelis-Menten (hyperbolic, blue) vs. Allosteric enzyme (sigmoidal S-shaped, red) kinetics.', CAPTION)) story.append(spacer(0.15)) coop_data = [ ['Feature', 'Michaelis-Menten Enzyme', 'Allosteric Enzyme'], ['Velocity curve', 'Hyperbolic', 'Sigmoidal (S-shaped)'], ['Cooperativity', 'None', 'Positive or negative'], ['Kinetic constant', 'Km', 'K0.5'], ['Regulatory sites', 'Active site only', 'Active + allosteric sites'], ['Response sensitivity', 'Gradual', 'Switch-like (sharp threshold)'], ] coop_t = Table(coop_data, colWidths=[140, 150, 150]) coop_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),NAVY), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_BLUE, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#90CAF9')), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4), ('BOX',(0,0),(-1,-1),1.5,NAVY), ])) story.append(coop_t) story.append(Paragraph('Table 8: Michaelis-Menten vs. Allosteric enzyme kinetics.', CAPTION)) story.append(spacer(0.15)) story.append(mnemonic_box('Allosteric = "ALL OTHER SITE"', ['"Allo" means OTHER in Greek — the effector binds to a site OTHER than the active site.', 'Positive effectors = ACTIVATE (think: activator = assistant)', 'Negative effectors = INHIBIT (think: inhibitor = blocker)', 'S-shaped curve = SIGMOIDAL = SWITCH-like response', 'Key enzyme: PFK-1 — inhibited by ATP (energy surplus), activated by AMP (energy deficit)'])) story.append(spacer(0.2)) story.append(summary_box([ 'Allosteric regulation = effector binds allosteric site (NOT active site) → conformational change.', 'Positive effectors increase activity; negative effectors decrease it.', 'Cooperativity: binding at one site affects affinity at other sites.', 'Allosteric enzymes show sigmoidal kinetics, NOT hyperbolic Michaelis-Menten.', 'The S-shaped curve gives switch-like sensitivity to substrate concentration.', 'Classic examples: PFK-1 (glycolysis), ATCase (pyrimidine synthesis).', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 5 — FEEDBACK & FEEDFORWARD # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 5. Feedback Inhibition and Feedforward Activation', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Feedback inhibition and feedforward activation are two elegant strategies the cell uses to coordinate ' 'multi-step metabolic pathways. They are closely related to allosteric regulation — the effector molecules ' 'involved usually bind to allosteric sites.', BODY)) story.append(Paragraph('5.1 Feedback Inhibition', H2)) story.append(Paragraph( 'In feedback inhibition, the <b>end product</b> of a metabolic pathway inhibits an enzyme near the ' '<b>beginning</b> of that same pathway. This creates an automatic self-regulating loop: as the end product ' 'accumulates, it slows its own production. When the end product is consumed or its concentration falls, ' 'the pathway resumes activity. This maintains appropriate metabolite concentrations within the cell without ' 'any external signal.', BODY)) story.append(spacer(0.1)) story.append(make_feedback_diagram()) story.append(Paragraph('Figure 6: Feedback inhibition. End product G inhibits the first enzyme in the pathway (dashed red arrow).', CAPTION)) story.append(spacer(0.1)) story.append(Paragraph( '<b>Example — Glycolysis:</b> ATP is both a product and an allosteric inhibitor of ' 'phosphofructokinase-1 (PFK-1). When ATP is abundant (high energy charge), PFK-1 is inhibited, ' 'slowing glycolysis. When AMP and ADP are elevated (low energy), PFK-1 is activated and glycolysis ' 'accelerates. This is textbook feedback inhibition keeping energy metabolism in perfect balance.', BODY)) story.append(Paragraph('5.2 Feedforward Activation', H2)) story.append(Paragraph( 'Feedforward activation is the opposite concept: a metabolite produced <b>early in a pathway</b> ' 'activates an enzyme <b>further downstream</b>. This anticipates increased product demand and primes ' 'the downstream enzymes before they are needed.', BODY)) story.append(Paragraph( '<b>Example — Glycolysis:</b> Fructose-1,6-bisphosphate (FBP), produced by PFK-1, activates ' 'pyruvate kinase (PK) further downstream. So when glycolysis is running fast (lots of FBP), ' 'pyruvate kinase is already being switched on to handle the increased flux. This elegant coordination ' 'prevents bottlenecks in the pathway.', BODY)) ff_data = [ ['Feature', 'Feedback Inhibition', 'Feedforward Activation'], ['Direction', 'End product → early enzyme', 'Early metabolite → downstream enzyme'], ['Effect', 'Inhibition (slows pathway)', 'Activation (accelerates pathway)'], ['Purpose', 'Prevent overproduction', 'Anticipate increased demand'], ['Glycolysis example', 'ATP inhibits PFK-1', 'FBP activates Pyruvate Kinase'], ] fft = Table(ff_data, colWidths=[120, 160, 160]) fft.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),NAVY), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9), ('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.HexColor('#FFF3E0'), colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#FFCC80')), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4), ('BOX',(0,0),(-1,-1),1.5,NAVY), ])) story.append(fft) story.append(Paragraph('Table 9: Feedback inhibition vs. feedforward activation.', CAPTION)) story.append(spacer(0.15)) story.append(mnemonic_box('Feedback vs Feedforward: "Back to Stop, Forward to Go"', ['"Feedback" = product goes BACK to STOP early enzyme (end product → first enzyme)', '"Feedforward" = early product goes FORWARD to GO faster (early metabolite → later enzyme)', 'FB example: ATP (end) → inhibits PFK-1 (beginning)', 'FF example: FBP (middle) → activates Pyruvate Kinase (end)'])) story.append(spacer(0.2)) story.append(summary_box([ 'Feedback inhibition: end product inhibits a start-of-pathway enzyme (self-regulating loop).', 'Feedforward activation: early metabolite activates a downstream enzyme (anticipatory activation).', 'Both mechanisms use allosteric sites to achieve their effects.', 'ATP feedback-inhibits PFK-1 in glycolysis — key energy homeostasis mechanism.', 'FBP feedforward-activates Pyruvate Kinase — prevents bottleneck at glycolysis end.', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 6 — SUBSTRATE/PRODUCT CONCENTRATION & CASCADES # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 6. Substrate/Product Concentration & Cascade Reactions', H1)) story.append(spacer(0.1)) story.append(Paragraph('6.1 Substrate and Product Concentration', H2)) story.append(Paragraph( 'Enzyme reaction rates are fundamentally responsive to substrate concentration. At substrate ' 'concentrations near the Km, small changes in substrate availability produce significant changes in ' 'reaction rate. Similarly, product accumulation can slow an enzyme through product inhibition or mass ' 'action. In metabolic pathways, maintaining a steady supply of substrate (A) while continuously ' 'removing product (P) keeps reactions moving efficiently. When substrate is depleted or product ' 'accumulates beyond normal, the pathway naturally slows — a built-in, chemistry-based regulatory ' 'mechanism that requires no special regulatory proteins.', BODY)) story.append(Paragraph('6.2 Coordinated Control at Metabolic Branch Points', H2)) story.append(Paragraph( 'Metabolic pathways are not simple linear chains. They have <b>branch points</b> where metabolites ' 'can be diverted into different routes. Changes in substrate and product concentrations at these ' 'branch points regulate which pathway is favored at any given moment. Cyclic pathways and cascade ' 'reactions add further layers of coordination.', BODY)) story.append(Paragraph('6.3 Cascade Reactions', H2)) story.append(Paragraph( 'A <b>cascade reaction</b> is a sequential activation of several components in a series, where ' 'each activated component activates the next. Cascades are powerful because they provide enormous ' 'signal amplification: a single activated molecule at the top of the cascade can lead to thousands ' 'of activated molecules at the bottom.', BODY)) cas_data = [ ['Cascade Type', 'Mechanism', 'Example'], ['Proteolytic Cascade', 'Activated protease cleaves and activates next protease', 'Blood coagulation cascade; Digestive enzyme activation'], ['Phosphorylase Cascade', 'One kinase phosphorylates (activates) another kinase', 'Glycogen breakdown: Glucagon → PKA → Phosphorylase Kinase → Glycogen Phosphorylase'], ] cast = Table(cas_data, colWidths=[110, 160, 170]) cast.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),AMBER), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_AMBER, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#FFCC80')), ('VALIGN',(0,0),(-1,-1),'TOP'), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1.5,AMBER), ('WORDWRAP',(0,0),(-1,-1),'CJK'), ])) story.append(cast) story.append(Paragraph('Table 10: Types of metabolic cascades.', CAPTION)) story.append(spacer(0.15)) story.append(colored_box([ Paragraph('Signal Amplification in Phosphorylase Cascade', H3), Paragraph('1 glucagon molecule → activates 1 adenylyl cyclase → produces many cAMP molecules → ' 'activates many PKA molecules → each phosphorylates many phosphorylase kinase molecules → ' 'each activates many glycogen phosphorylase molecules → massive glycogen breakdown. ' 'A single hormone signal is amplified millions of times!', BODY), ], bg=LIGHT_AMBER, border=AMBER)) story.append(spacer(0.15)) story.append(summary_box([ 'Enzyme rates naturally respond to substrate (↑[S] → ↑rate) and product concentration (↑[P] → ↓rate).', 'Branch points in metabolic pathways allow metabolite concentrations to direct flux.', 'Cascade reactions amplify signals: one molecule at the top → millions of effects at the bottom.', 'Proteolytic cascade: activated protease cleaves next protease (e.g., coagulation, digestion).', 'Phosphorylase cascade: kinase activates kinase in a chain (e.g., glucagon → glycogen breakdown).', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 7 — GENE EXPRESSION REGULATION # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 7. Regulation by Gene Expression (Induction & Repression)', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'The most fundamental level of enzyme regulation involves controlling how much enzyme protein ' 'the cell makes in the first place. By increasing or decreasing the transcription of the gene ' 'encoding an enzyme, the cell can adjust enzyme levels over hours to days. This is the <b>slowest ' 'form of enzyme regulation</b> but provides the most sustained, long-term control over metabolism.', BODY)) story.append(Paragraph('7.1 Hormonal Control of Gene Expression', H2)) story.append(Paragraph( 'Hormones such as insulin can alter gene expression, producing 10- to 20-fold increases in ' 'enzyme synthesis over hours to days. Insulin binds its receptor on the cell surface, triggering ' 'a cascade of intracellular signalling events that ultimately activate transcription factors. ' 'These transcription factors enter the nucleus and increase transcription of target genes, ' 'leading to increased mRNA production and ultimately more enzyme protein.', BODY)) story.append(spacer(0.1)) gene_data = [ ['Mechanism', 'Result', 'Time Course', 'Example'], ['Increased gene transcription', '↑ enzyme synthesis → ↑ metabolic activity', 'Hours to days', 'Insulin → ↑ Glucokinase, PFK-1, Pyruvate Kinase'], ['Decreased gene transcription', '↓ enzyme synthesis → ↓ metabolic activity', 'Hours to days', 'Glucocorticoids → ↑ gluconeogenic enzymes'], ] genet = Table(gene_data, colWidths=[115, 140, 80, 105]) genet.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),PURPLE), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_PURP, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#CE93D8')), ('VALIGN',(0,0),(-1,-1),'TOP'), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1.5,PURPLE), ])) story.append(genet) story.append(Paragraph('Table 11: Gene expression regulation of enzymes.', CAPTION)) story.append(spacer(0.1)) story.append(Paragraph('7.2 Insulin Signalling Pathway (Simplified)', H2)) insulin_steps = [ ('1', 'Insulin', 'Binds insulin receptor on cell surface'), ('2', 'Receptor', 'Activates intracellular tyrosine kinase cascade'), ('3', 'PI3K/Akt', 'Activates downstream signalling proteins'), ('4', 'Transcription Factors', 'Enter nucleus; bind gene promoters'), ('5', 'Glucokinase, PFK-1, PK genes', 'Transcription increases → more mRNA → more enzyme'), ] for num, actor, action in insulin_steps: story.append(Paragraph(f'<b>Step {num} ({actor}):</b> {action}', BULLET)) story.append(spacer(0.1)) story.append(Paragraph('7.3 HMG-CoA Reductase — A Classic Example of Multi-Level Regulation', H2)) story.append(Paragraph( 'HMG-CoA reductase (HMGR) is the rate-limiting enzyme in cholesterol biosynthesis and is regulated ' 'at multiple levels simultaneously — making it the perfect example of integrated enzyme control:', BODY)) hmg_data = [ ['Regulation Level', 'Mechanism', 'Effect'], ['Allosteric', 'Cholesterol (end product) inhibits HMGR', 'Reduces activity immediately'], ['Covalent Modification', 'AMP kinase phosphorylates HMGR', 'Inactivates HMGR (energy conservation)'], ['Gene Expression', 'Low sterol → SREBP activates HMGR gene', 'Increases enzyme synthesis'], ['Protein Degradation', 'High sterol → HMGR ubiquitination', 'Accelerates enzyme breakdown'], ] hmgt = Table(hmg_data, colWidths=[110, 170, 160]) hmgt.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),TEAL), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_TEAL, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#B2DFDB')), ('VALIGN',(0,0),(-1,-1),'TOP'), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4), ('BOX',(0,0),(-1,-1),1.5,TEAL), ])) story.append(hmgt) story.append(Paragraph('Table 12: HMG-CoA reductase — example of multi-level enzyme regulation.', CAPTION)) story.append(spacer(0.1)) story.append(clinical_box([ '<b>Statins (Clinical Application):</b> Statins (e.g., atorvastatin, simvastatin) are the most ' 'widely prescribed cholesterol-lowering drugs. They work by competitively inhibiting HMG-CoA ' 'reductase, reducing cholesterol synthesis. Reduced intracellular cholesterol triggers upregulation ' 'of LDL receptors, increasing LDL clearance from blood. This is a prime example of exploiting ' 'enzyme regulation for therapeutic benefit.' ])) story.append(spacer(0.15)) story.append(mnemonic_box('Gene expression regulation: "SLOW but STRONG"', ['<b>S</b>LOW: takes hours to days (transcription, translation, protein synthesis)', '<b>S</b>TRONG: 10-20 fold changes in enzyme levels — powerful long-term control', 'Insulin = master anabolic hormone: ↑ Glucokinase + PFK-1 + Pyruvate Kinase (glycolytic enzymes)', 'HMGR = multi-level regulated enzyme: allosteric + covalent + gene + degradation'])) story.append(spacer(0.2)) story.append(summary_box([ 'Gene expression regulation is the SLOWEST but most powerful long-term control mechanism.', 'Hormones like insulin cause 10-20 fold increases in enzyme synthesis over hours to days.', 'Insulin upregulates glycolytic enzymes: Glucokinase, PFK-1, and Pyruvate Kinase.', 'HMG-CoA reductase is regulated at 4 levels: allosteric, covalent, gene expression, and degradation.', 'Statins inhibit HMGR — the most prescribed enzyme-targeting drug class.', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 8 — METABOLIC FLUX # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 8. Metabolic Flux', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Metabolic flux refers to the <b>rate at which substrates and intermediates flow through a metabolic ' 'pathway</b>. Think of it like the flow of water through pipes — flux tells you how fast molecules ' 'are moving from the beginning to the end of a pathway. Appropriate flux is essential for energy ' 'balance, biosynthesis of essential compounds, and cell survival under varying conditions.', BODY)) story.append(spacer(0.1)) story.append(make_metabolic_flux_chart()) story.append(Paragraph('Figure 7: Glycolytic flux showing the rate-limiting step at PFK-1 (Fructose-1,6-bisphosphate production).', CAPTION)) story.append(Paragraph('8.1 How Enzymes Regulate Metabolic Flux', H2)) flux_data = [ ['Mechanism', 'How It Controls Flux'], ['Rate-limiting enzymes\n(e.g., PFK-1)', 'Act as "traffic controllers" — the slowest step determines overall pathway speed'], ['Allosteric regulation', 'ATP inhibits PFK-1 → slows flux when energy is high'], ['Covalent modification', 'Phosphorylation activates/inhibits key enzymes rapidly'], ['Substrate availability', 'Low substrate → reduced flux regardless of enzyme activity'], ['Gene expression', 'More enzyme protein → greater flux capacity (long-term)'], ['Feedback inhibition', 'End products inhibit upstream enzymes → prevents overflow'], ] fluxt = Table(flux_data, colWidths=[145, 295]) fluxt.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),NAVY), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),9), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_BLUE, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#90CAF9')), ('VALIGN',(0,0),(-1,-1),'TOP'), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1.5,NAVY), ('WORDWRAP',(0,0),(-1,-1),'CJK'), ])) story.append(fluxt) story.append(Paragraph('Table 13: How different mechanisms control metabolic flux.', CAPTION)) story.append(spacer(0.15)) story.append(summary_box([ 'Metabolic flux = rate of substrate/intermediate flow through a pathway.', 'Rate-limiting step (e.g., PFK-1 in glycolysis) determines the maximum possible flux.', 'Flux is controlled by: allosteric regulation, covalent modification, substrate levels, gene expression.', 'Feedback inhibition prevents overflow by slowing flux when end products accumulate.', 'High ATP → low flux through glycolysis; low ATP (high AMP) → high flux through glycolysis.', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # SECTION 9 — METABOLIC CHANNELING # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' 9. Metabolic Channeling', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Metabolic channeling refers to the phenomenon where the product of one enzyme reaction is ' 'directly transferred to the next enzyme in the pathway, without being released into the bulk ' 'cytoplasm. This "passing of the baton" prevents intermediates from diffusing away, being ' 'diverted to other pathways, or reaching toxic concentrations. Channeling dramatically increases ' 'the efficiency of multi-step metabolic sequences.', BODY)) story.append(spacer(0.1)) story.append(make_channeling_diagram()) story.append(Paragraph('Figure 8: Metabolic channeling in a multienzyme complex. Intermediates are passed directly between enzyme subunits.', CAPTION)) story.append(Paragraph('9.1 Three Mechanisms of Metabolic Channeling', H2)) ch_data = [ ['Mechanism', 'Description', 'Example'], ['Multienzyme Complex', 'Different enzymes that catalyze sequential reactions are physically bound together as a complex', 'Pyruvate Dehydrogenase Complex (PDC): Pyruvate → Acetyl-CoA'], ['Multifunctional Enzyme', 'Multiple distinct catalytic activities reside on a single polypeptide chain (bifunctional)', 'Fatty Acid Synthase (FAS): synthesizes fatty acids through 7+ reactions on one protein'], ['Scaffold-Bound Complex', 'Enzymes are organized on a scaffold protein that brings them into proximity', 'MAPK pathway: scaffold organizes kinases for insulin gene expression signalling'], ] cht = Table(ch_data, colWidths=[105, 185, 150]) cht.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),PURPLE), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_PURP, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#CE93D8')), ('VALIGN',(0,0),(-1,-1),'TOP'), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1.5,PURPLE), ])) story.append(cht) story.append(Paragraph('Table 14: Three types of metabolic channeling.', CAPTION)) story.append(spacer(0.1)) story.append(Paragraph('9.2 Importance of Metabolic Channeling', H2)) for point in [ '<b>Increases efficiency:</b> intermediates are not lost to diffusion.', '<b>Prevents side reactions:</b> unstable intermediates are protected within the complex.', '<b>Speeds up reactions:</b> no diffusion delay between sequential reactions.', '<b>Prevents toxic accumulation:</b> intermediates do not accumulate in the cytoplasm.', '<b>Coordinates regulation:</b> an entire multi-step sequence can be regulated as a unit.', ]: story.append(Paragraph(point, BULLET)) story.append(spacer(0.1)) story.append(mnemonic_box('Channeling types: "Multi-Multi-Scaffold"', ['<b>Multi</b>enzyme Complex → PDH Complex (different proteins held together)', '<b>Multi</b>functional Enzyme → Fatty Acid Synthase (all functions on ONE protein)', '<b>Scaffold</b>-bound Complex → MAPK pathway (scaffold brings enzymes together)', 'Think of a factory assembly line: each station passes the product directly to the next!'])) story.append(spacer(0.2)) story.append(summary_box([ 'Metabolic channeling = direct transfer of intermediates between sequential enzymes.', 'Type 1: Multienzyme complex (e.g., Pyruvate Dehydrogenase Complex).', 'Type 2: Multifunctional enzyme — all activities on one polypeptide (e.g., Fatty Acid Synthase).', 'Type 3: Scaffold-bound complex (e.g., MAPK signalling pathway).', 'Benefits: efficiency, speed, protection of unstable intermediates, prevention of toxic accumulation.', ])) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # MASTER SUMMARY TABLE # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' Master Summary: All Regulation Mechanisms', H1)) story.append(spacer(0.1)) master_data = [ ['Mechanism', 'Type', 'Speed', 'Reversible?', 'Key Enzyme Example', 'Clinical Link'], ['Allosteric Regulation', 'Rapid', '⚡⚡⚡⚡⚡', 'Yes', 'PFK-1, ATCase', 'Drug targets'], ['Feedback Inhibition', 'Rapid', '⚡⚡⚡⚡⚡', 'Yes', 'ATP inhibits PFK-1', 'Energy homeostasis'], ['Feedforward Activation', 'Rapid', '⚡⚡⚡⚡⚡', 'Yes', 'FBP activates PK', 'Pathway coordination'], ['Phosphorylation', 'Covalent', '⚡⚡⚡⚡', 'Yes', 'Glycogen Phosphorylase', 'Diabetes, cancer'], ['Dephosphorylation', 'Covalent', '⚡⚡⚡⚡', 'Yes', 'Glycogen Synthase', 'Insulin signalling'], ['Proteolytic Cleavage', 'Covalent', '⚡⚡', 'NO', 'Trypsinogen→Trypsin', 'Pancreatitis'], ['Substrate/Product Conc.', 'Mass action', '⚡⚡⚡', 'Yes', 'General', 'All pathways'], ['Cascade Reactions', 'Amplification', '⚡⚡⚡', 'Yes', 'cAMP cascade', 'Signalling diseases'], ['Gene Expression', 'Transcriptional', '⚡', 'Yes', 'Glucokinase, PFK-1', 'Diabetes, statins'], ['Metabolic Channeling', 'Structural', '—', 'N/A', 'PDH complex, FAS', 'Metabolic diseases'], ] mt = Table(master_data, colWidths=[90, 65, 40, 55, 105, 85]) mt.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),NAVY), ('TEXTCOLOR',(0,0),(-1,0),colors.white), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),7.5), ('ROWBACKGROUNDS',(0,1),(-1,-1),[LIGHT_BLUE, colors.white]), ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#90CAF9')), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4), ('BOX',(0,0),(-1,-1),1.5,NAVY), ])) story.append(mt) story.append(Paragraph('Table 15: Master comparison of all enzyme regulation mechanisms.', CAPTION)) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # MCQs # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' MCQ Practice Questions', H1)) story.append(spacer(0.1)) story.append(Paragraph( 'Test your understanding with these 20 multiple-choice questions. Answers with explanations appear at the end.', BODY)) story.append(spacer(0.15)) mcqs = [ ("1. Which of the following BEST describes enzyme regulation?", ["A. The permanent inactivation of enzymes by covalent bonding", "B. Control of enzyme activity according to cellular metabolic needs", "C. The synthesis of new enzyme molecules in response to hormones", "D. Competitive inhibition of all enzymes by their products"], "B", "Enzyme regulation is defined as controlling enzyme ACTIVITY according to cellular needs — this includes rapid (allosteric) and slow (gene expression) mechanisms."), ("2. A patient with acute pancreatitis presents with severe abdominal pain and elevated serum amylase. Which mechanism of enzyme regulation has FAILED?", ["A. Allosteric regulation of pancreatic enzymes", "B. Gene expression control of digestive enzymes", "C. Proteolytic activation occurring prematurely inside the pancreas", "D. Feedback inhibition of CCK by trypsin"], "C", "Acute pancreatitis results from premature activation of zymogens (especially trypsinogen → trypsin) INSIDE the pancreas rather than the intestinal lumen, causing autodigestion. This is a failure of proteolytic activation (zymogen) regulation."), ("3. Glycogen phosphorylase is ACTIVE in which form?", ["A. Dephosphorylated form", "B. Phosphorylated form", "C. Both forms equally active", "D. Only when bound to AMP"], "B", "Glycogen Phosphorylase is ACTIVE in its phosphorylated form. This is opposite to Glycogen Synthase, which is active when dephosphorylated. Remember: Phosphorylase needs phosphate to Proceed (break down glycogen)."), ("4. Which kinetic curve is characteristic of allosteric enzymes?", ["A. Hyperbolic (Michaelis-Menten)", "B. Linear", "C. Sigmoidal (S-shaped)", "D. Exponential decay"], "C", "Allosteric enzymes display sigmoidal (S-shaped) kinetics due to cooperativity. This is distinct from Michaelis-Menten hyperbolic kinetics seen in simple non-allosteric enzymes. The S-shape gives a switch-like response near the K0.5."), ("5. In feedback inhibition, which enzyme is typically inhibited?", ["A. The last enzyme in the pathway", "B. The enzyme immediately before the end product", "C. The first (or an early) enzyme in the pathway", "D. A branch-point enzyme in a parallel pathway"], "C", "In feedback inhibition, the END PRODUCT inhibits an enzyme near the BEGINNING of the pathway. This self-regulating loop prevents overproduction. E.g., ATP inhibits PFK-1 (early in glycolysis)."), ("6. Which hormone triggers the phosphorylation of many metabolic enzymes simultaneously?", ["A. Insulin", "B. Glucagon", "C. Thyroxine", "D. Cortisol"], "B", "Glucagon (released during fasting/low glucose) activates adenylyl cyclase → cAMP → PKA → phosphorylates many enzymes. This shifts metabolism toward catabolism (glycogen breakdown, gluconeogenesis)."), ("7. What is the PRIMARY reason digestive enzymes are synthesized as zymogens?", ["A. To increase the speed of enzyme activation", "B. To prevent autodigestion of secretory tissues", "C. To allow hormonal regulation of enzyme activity", "D. To increase enzyme stability during transport"], "B", "Zymogens (inactive precursors) protect secretory tissues from self-digestion. If proteases were synthesized already active inside the pancreas, they would digest pancreatic cells — as occurs in acute pancreatitis."), ("8. Fructose-1,6-bisphosphate (FBP) activates pyruvate kinase in glycolysis. This is an example of:", ["A. Feedback inhibition", "B. Feedforward activation", "C. Competitive inhibition", "D. Proteolytic activation"], "B", "FBP is produced EARLY in glycolysis and activates Pyruvate Kinase DOWNSTREAM. This is feedforward activation — an early metabolite primes later enzymes to handle increased flux."), ("9. Which of the following is an example of IRREVERSIBLE covalent modification?", ["A. Phosphorylation of glycogen phosphorylase", "B. ADP-ribosylation of adenylyl cyclase", "C. Proteolytic cleavage of trypsinogen to trypsin", "D. Acetylation of histones"], "C", "Proteolytic cleavage (e.g., trypsinogen → trypsin) is IRREVERSIBLE — once the peptide bond is cleaved, the zymogen cannot revert to its inactive form. Phosphorylation, acetylation, and ADP-ribosylation are reversible."), ("10. Phosphorylation reactions in enzyme regulation are catalyzed by:", ["A. Phosphoprotein phosphatases", "B. Protein kinases using ATP", "C. Proteases", "D. Allosteric activators"], "B", "Protein kinases catalyze phosphorylation using ATP as the phosphate donor. The phosphate is transferred to serine, threonine, or tyrosine residues of the target enzyme."), ("11. ATCase is an example of an enzyme that displays:", ["A. Michaelis-Menten kinetics with no cooperativity", "B. High cooperativity and allosteric regulation", "C. Proteolytic activation", "D. Feedback activation"], "B", "ATCase (aspartate transcarbamoylase) is a classic example of a multi-subunit allosteric enzyme with high cooperativity. It is inhibited by CTP (end product of pyrimidine synthesis) and activated by ATP."), ("12. Which enzyme is the key rate-limiting step of glycolysis?", ["A. Hexokinase", "B. Pyruvate kinase", "C. Phosphofructokinase-1 (PFK-1)", "D. Phosphoglucose isomerase"], "C", "PFK-1 is the primary regulatory (rate-limiting) enzyme of glycolysis. It is allosterically inhibited by ATP and citrate (high energy) and activated by AMP, ADP, and fructose-2,6-bisphosphate."), ("13. The process where intermediates are directly transferred between sequential enzymes without being released into the cytoplasm is called:", ["A. Cascade amplification", "B. Metabolic channeling", "C. Allosteric relay", "D. Enzyme induction"], "B", "Metabolic channeling is the direct transfer of intermediates between sequential enzymes (e.g., within a multienzyme complex). This increases efficiency and protects unstable intermediates."), ("14. The Pyruvate Dehydrogenase Complex is an example of which type of metabolic channeling?", ["A. Multifunctional enzyme", "B. Scaffold-bound complex", "C. Multienzyme complex", "D. Allosteric complex"], "C", "The Pyruvate Dehydrogenase Complex is a MULTIENZYME COMPLEX — multiple distinct enzyme proteins (E1, E2, E3) bound together, channeling pyruvate → acetyl-CoA through multiple steps."), ("15. Insulin increases the transcription of which glycolytic enzymes?", ["A. Phosphorylase kinase and glycogen synthase", "B. Glucokinase, PFK-1, and Pyruvate Kinase", "C. HMG-CoA reductase and cholesterol synthase", "D. Trypsinogen and chymotrypsinogen"], "B", "Insulin, the key anabolic hormone released after a carbohydrate meal, upregulates glycolytic enzyme gene expression: Glucokinase, PFK-1, and Pyruvate Kinase. This promotes glucose utilization in the fed state."), ("16. Cholecystokinin (CCK) is regulated by which feedback mechanism?", ["A. CCK inhibits its own release from duodenal I-cells directly", "B. Trypsin degrades CCK-releasing peptide, reducing CCK secretion", "C. ATP allosterically inhibits CCK synthesis", "D. Feedback phosphorylation of CCK receptor"], "B", "Trypsin (the activated digestive enzyme) degrades both CCK-releasing peptide and monitor peptide, reducing stimulation of CCK release. This negative feedback prevents excessive pancreatic enzyme secretion."), ("17. Which statement about allosteric regulation is INCORRECT?", ["A. The effector binds at a site different from the active site", "B. Allosteric enzymes always show sigmoidal kinetics", "C. Positive effectors increase enzyme activity", "D. Allosteric regulation is slower than covalent modification"], "D", "Allosteric regulation is actually FASTER than covalent modification, not slower. Allosteric changes are near-instantaneous (conformational changes upon ligand binding), while covalent modification (phosphorylation) requires enzymatic reactions."), ("18. HMG-CoA reductase is regulated at multiple levels. Statins work primarily by:", ["A. Blocking phosphorylation of HMG-CoA reductase", "B. Competitively inhibiting HMG-CoA reductase", "C. Downregulating the gene encoding HMG-CoA reductase", "D. Activating proteolytic degradation of HMG-CoA reductase"], "B", "Statins are competitive inhibitors of HMG-CoA reductase — they structurally resemble the substrate (HMG-CoA) and block the active site. This reduces cholesterol synthesis and secondarily upregulates LDL receptor expression."), ("19. Metabolic flux is BEST described as:", ["A. The total concentration of enzymes in a pathway", "B. The rate at which substrates and intermediates flow through a metabolic pathway", "C. The equilibrium constant of key metabolic reactions", "D. The maximum velocity (Vmax) of the rate-limiting enzyme"], "B", "Metabolic flux = rate of flow of substrates/intermediates through a pathway. It depends on enzyme activity, substrate availability, and regulation at key control points (especially the rate-limiting step)."), ("20. Fatty Acid Synthase (FAS) performing multiple synthetic reactions on a single polypeptide chain is an example of:", ["A. Multienzyme complex", "B. Scaffold-bound complex", "C. Multifunctional enzyme", "D. Allosteric enzyme complex"], "C", "Fatty Acid Synthase is a MULTIFUNCTIONAL ENZYME — multiple distinct catalytic activities (including ACP, KS, KR, DH, ER, and TE domains) are all encoded on a single polypeptide chain. This is distinct from a multienzyme complex where multiple separate proteins associate."), ] for i, (q, opts, ans, exp) in enumerate(mcqs): story.append(Paragraph(q, MCQ_Q)) for opt in opts: story.append(Paragraph(opt, MCQ_OPT)) story.append(spacer(0.05)) story.append(PageBreak()) # Answer Key story.append(Paragraph(' Answer Key with Explanations', H1)) story.append(spacer(0.1)) for i, (q, opts, ans, exp) in enumerate(mcqs): story.append(Paragraph(f'Q{i+1}: {q}', MCQ_Q)) story.append(Paragraph(f'✅ Correct Answer: <b>{ans}</b>', MCQ_ANS)) story.append(Paragraph(f'<i>{exp}</i>', S('ExpS', fontSize=9.5, textColor=colors.HexColor('#37474F'), fontName='Helvetica-Oblique', leading=14, leftIndent=12, spaceAfter=8))) story.append(hr(colors.HexColor('#E0E0E0'), 0.5)) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════ # FINAL MASTER MNEMONIC PAGE # ═══════════════════════════════════════════════════════════ story.append(Paragraph(' Quick Reference: All Mnemonics', H1)) story.append(spacer(0.1)) mnemonics_all = [ ('All 6 Regulation Types: "A FCS-PI Gene"', ['A = Allosteric', 'F = Feedback inhibition', 'C = Covalent modification', 'S = Substrate/product concentration', 'P = Proteolytic (zymogen) activation', 'I/Gene = Induction/repression of gene expression']), ('Zymogens: "Please Try Chewing Elastically"', ['Pepsinogen → Pepsin', 'Trypsinogen → Trypsin', 'Chymotrypsinogen → Chymotrypsin', 'Proelastase → Elastase']), ('Phosphorylation: "Kinase Kills Synthase, Phosphorylase Lives"', ['Glycogen Synthase: phosphorylated = INACTIVE (Killed)', 'Glycogen Phosphorylase: phosphorylated = ACTIVE (Lives)', 'Glucagon (fasting) activates kinases → breaks down glycogen']), ('Allosteric Sites: "ALL OTHER SITE"', ['"Allo" = Greek for OTHER', 'Binds at a site OTHER than the active site', 'S-shaped (Sigmoidal) curve = Switch-like response', 'PFK-1: ATP inhibits (−), AMP activates (+)']), ('Feedback vs Feedforward: "Back to Stop, Forward to Go"', ['Feedback = product goes BACK to STOP early enzyme', 'Feedforward = early product goes FORWARD to GO faster', 'FB: ATP → inhibits PFK-1 | FF: FBP → activates Pyruvate Kinase']), ('Gene Expression: "SLOW but STRONG"', ['SLOW: hours to days', 'STRONG: 10-20 fold changes', 'Insulin → ↑ Glucokinase + PFK-1 + Pyruvate Kinase']), ('Metabolic Channeling: "Multi-Multi-Scaffold"', ['MULTIenzyme Complex → PDH Complex', 'MULTIfunctional Enzyme → Fatty Acid Synthase', 'SCAFFOLD-bound Complex → MAPK pathway']), ] for title, lines in mnemonics_all: story.append(mnemonic_box(title, lines)) story.append(spacer(0.1)) # Build doc.build(story) print('PDF built successfully!') PYEOF python3 /tmp/workspace/enzyme-regulation/build_pdf.py
ls -lh /tmp/workspace/enzyme-regulation/Enzyme_Regulation.pdf
Enzyme Regulation
PDF Document · PDF
| Section | Content |
|---|---|
| Cover Page | Full overview table comparing all 6 regulation mechanisms at a glance |
| 1. Introduction | Why regulation matters, With vs. Without table, types overview |
| 2. Covalent Modification | Phosphorylation/Dephosphorylation diagram, enzyme comparison table |
| 3. Proteolytic Activation | Zymogen diagram, CCK feedback table, step-by-step cascade |
| 4. Allosteric Regulation | Two-site diagram, sigmoidal vs. MM kinetics graph, cooperativity table |
| 5. Feedback & Feedforward | Pathway diagram, comparison table, glycolysis examples |
| 6. Substrate/Product & Cascades | Cascade types table, signal amplification explanation |
| 7. Gene Expression | Insulin signalling steps, HMG-CoA reductase multi-level table |
| 8. Metabolic Flux | Glycolytic flux bar chart, flux control mechanisms table |
| 9. Metabolic Channeling | Assembly-line diagram, 3-type comparison table |