Give me a solution in exam answer format for above questions
artificial blood hemoglobin based oxygen carriers perfluorocarbon emulsions clinical use 2024
newer obesity treatments 2024 2025 GLP-1 agonists tirzepatide semaglutide retatrutide orforglipron bariatric pharmacotherapy
domiciliary non-invasive ventilation indications COPD obesity hypoventilation setup home 2024
lipoprotein(a) structure pathophysiology cardiovascular risk lowering pelacarsen olpasiran 2024 review
injectable lipid lowering drugs PCSK9 inhibitors inclisiran bempedoic acid pemafibrate 2024 mechanism clinical use
| Modification | Product | Feature |
|---|---|---|
| Polymerization | Hemopure (HBOC-201) | Bovine, approved in Russia, South Africa |
| Cross-linking | DCLHb | alpha-alpha cross-linked |
| Conjugation | MP4OX (Hemospan) | PEGylated Hb |
| Encapsulation | Hemoglobin vesicles | Nano-liposome-encapsulated Hb |
| Recombinant | rHb1.1 | Genetically engineered |
| Product | Composition | Status |
|---|---|---|
| Fluosol-DA (20%) | Perfluorodecalin + perfluorotripropylamine | First FDA approved (1989), withdrawn |
| Oxygent (AF0144) | Perfluorooctyl bromide emulsion | Phase III, discontinued |
| Perftoran | PFC emulsion | Approved in Russia (1996) |
IDEAL BLOOD SUBSTITUTE
|
├── O2 carrying capacity equivalent to RBCs
├── No blood group compatibility required
├── Long shelf life (years at room temperature)
├── No disease transmission
├── Biodegradable / non-toxic
├── Adequate intravascular retention (>24 hours)
└── Maintains oncotic pressure
| Drug | Dose | Route | Weight Loss | Landmark Trial |
|---|---|---|---|---|
| Semaglutide 2.4 mg | 2.4 mg weekly | SC injection | ~14.9% body weight | STEP 1 trial (NEJM 2021) |
| Liraglutide 3.0 mg | 3.0 mg daily | SC injection | ~5-8% | SCALE trial |
| Oral semaglutide 25 mg | 25 mg daily | Oral | ~15% | OASIS-4 trial |
| Drug | Mechanism | Notes |
|---|---|---|
| Orlistat | Pancreatic lipase inhibitor | Reduces fat absorption by 30%; GI side effects |
| Phentermine/topiramate | Sympathomimetic + antiepileptic | Qsymia; contraindicated in pregnancy |
| Naltrexone/bupropion | Opioid antagonist + dopamine/NE reuptake inhibitor | Contrave; cardiac precautions |
| Phentermine alone | Sympathomimetic; suppresses appetite | Short-term use only |
| Procedure | Mechanism | Weight Loss |
|---|---|---|
| Roux-en-Y Gastric Bypass | Restriction + malabsorption + hormonal | 60-80% EWL |
| Sleeve Gastrectomy | Restriction + ghrelin reduction | 50-70% EWL |
| Adjustable Gastric Band | Restriction | 40-50% EWL |
| Biliopancreatic Diversion | Malabsorption dominant | >80% EWL |
BMI ≥ 25
|
├── Lifestyle Modification (diet + exercise + behavior) → FIRST LINE for all
|
├── BMI ≥ 27 + comorbidity OR BMI ≥ 30 → ADD PHARMACOTHERAPY
│ |
│ └── GLP-1 agonist (Semaglutide/Tirzepatide) preferred
|
└── BMI ≥ 35 + comorbidity OR BMI ≥ 40 → CONSIDER SURGERY
PCSK9 inhibitor → Blocks PCSK9-LDLR binding
→ LDLR recycles to hepatocyte surface
→ ↑ LDL uptake → ↓ LDL-C by 50-60%
| Drug | Class | Target | Route | Frequency | LDL Reduction |
|---|---|---|---|---|---|
| Evolocumab | mAb | PCSK9 (extracellular) | SC | Every 2 wks or monthly | 50-60% |
| Alirocumab | mAb | PCSK9 (extracellular) | SC | Every 2 wks or monthly | 50-60% |
| Inclisiran | siRNA | PCSK9 mRNA | SC | Twice yearly | ~50% |
| Mipomersen | ASO | ApoB-100 mRNA | SC | Weekly | 25-40% |
| Evinacumab | mAb | ANGPTL3 | IV/SC | Monthly | ~47% |
Patient with high LDL-C
|
Maximally tolerated statin + ezetimibe
|
LDL not at goal?
|
├── Atherosclerotic CVD or HeFH → PCSK9 inhibitor (evolocumab/alirocumab) or Inclisiran
├── HoFH → Evolocumab + Evinacumab ± Lomitapide/Mipomersen
└── Statin intolerant → PCSK9 inhibitor or Inclisiran as alternative
| Mode | Description | Use |
|---|---|---|
| CPAP | Continuous positive airway pressure - single pressure throughout respiratory cycle | Obstructive Sleep Apnoea (OSA) |
| BiPAP (NPPV) | Bilevel positive airway pressure - higher IPAP (inspiratory) and lower EPAP (expiratory) | Hypercapnic respiratory failure, COPD, OHS, NMD |
| AVAPS | Average volume-assured pressure support - targets tidal volume | NMD, OHS with variable respiratory effort |
| ASV | Adaptive servo-ventilation | Central/complex sleep apnoea (NOT in HFrEF) |
Stable outpatient with chronic respiratory failure
|
Clinical assessment + ABG (daytime, stable)
|
Meets criteria? (PaCO2, symptoms, FVC)
|
├── YES → Admit for NIV titration (in-lab or hospital)
│ |
│ Set initial IPAP 12, EPAP 4, Backup rate 12
│ |
│ Titrate IPAP upward (by 2 cmH2O) targeting:
│ SpO2 >90%, TcCO2 <45 mmHg, no leaks, comfort
│ |
│ Discharge with home NIV + written action plan
│ |
│ Follow-up: 4 weeks, 3 months, then 6 monthly
│
└── NO → Treat underlying cause; reassess
Lp(a) = LDL-like particle (Apolipoprotein B-100)
+
Apolipoprotein(a) [Apo(a)] - covalently linked via disulfide bond
+ Oxidized Phospholipids (OxPL) associated with both ApoB and Apo(a)
| Condition | Risk Increase |
|---|---|
| Myocardial infarction | 2-3x elevated risk with Lp(a) >50 mg/dL |
| Ischemic stroke | Increased risk |
| Peripheral arterial disease | Increased risk |
| Calcific aortic valve stenosis | 2x increased risk |
| Recurrent CV events despite statin therapy | Independent predictor |
| Drug | Class | Mechanism | Phase | Lp(a) Reduction |
|---|---|---|---|---|
| Pelacarsen (TQJ230) | ASO (GalNAc-conjugated) | Targets LPA mRNA in liver | Phase 3 (Lp(a)HORIZON) | 80-90% |
| Olpasiran | siRNA (GalNAc) | Targets LPA mRNA via RNAi | Phase 3 (OCEAN(a) - ~7,000 pts) | 80-95% |
| Zerlasiran | siRNA | LPA mRNA silencing | Phase 2 | >80% |
| Lepodisiran | siRNA | LPA mRNA silencing | Phase 2 | >90% |
| Muvalaplin | Small molecule oral | Inhibits Lp(a) particle assembly (blocks apo(a)-apoB interaction) | Phase 2 | ~65-85% |
Patient with ASCVD or high CV risk
|
Measure Lp(a) once in lifetime
|
Lp(a) < 50 mg/dL → Reassure, focus on LDL and other risk factors
|
Lp(a) ≥ 50 mg/dL
|
├── Optimize modifiable risk factors (BP, smoking, LDL, DM)
├── High-intensity statin + ezetimibe ± PCSK9 inhibitor (20-30% Lp(a) reduction)
├── Established ASCVD + Lp(a) >60 mg/dL → Consider lipoprotein apheresis
└── Enroll in clinical trial (pelacarsen/olpasiran) if eligible
Examiner's Note: All five questions carry 25 marks each. This paper answers Q1 through Q5. Answer any four as per instructions.
Create a study guide PDF with diagrams for all 5 topics
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"
mkdir -p /tmp/workspace/study-guide && echo "dir created"
~/study-guide/generate_pdf.py
#!/usr/bin/env python3
"""
MD General Medicine Paper IV - Study Guide PDF Generator
Topics: Artificial Blood, Obesity Treatment, Injectable Lipid-Lowering,
Domiciliary NIV, Lipoprotein(a)
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, KeepTogether
)
from reportlab.platypus.flowables import Flowable
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.graphics.shapes import Drawing, Rect, String, Line, Circle, Polygon, Path
from reportlab.graphics.shapes import Group
from reportlab.graphics import renderPDF
from reportlab.platypus import Image as RLImage
import io
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch
import numpy as np
# ──────────────────────────────────────────────
# COLOUR PALETTE
# ──────────────────────────────────────────────
C_DARK_BLUE = colors.HexColor('#1a237e')
C_MED_BLUE = colors.HexColor('#283593')
C_LIGHT_BLUE = colors.HexColor('#e8eaf6')
C_ACCENT = colors.HexColor('#e53935')
C_TEAL = colors.HexColor('#00695c')
C_TEAL_LIGHT = colors.HexColor('#e0f2f1')
C_AMBER = colors.HexColor('#f57f17')
C_AMBER_LIGHT = colors.HexColor('#fff8e1')
C_PURPLE = colors.HexColor('#6a1b9a')
C_PURPLE_LIGHT= colors.HexColor('#f3e5f5')
C_GREEN = colors.HexColor('#2e7d32')
C_GREEN_LIGHT = colors.HexColor('#e8f5e9')
C_GREY = colors.HexColor('#424242')
C_LIGHT_GREY = colors.HexColor('#f5f5f5')
C_WHITE = colors.white
PAGE_W, PAGE_H = A4
MARGIN = 1.8 * cm
# ──────────────────────────────────────────────
# STYLES
# ──────────────────────────────────────────────
def make_styles():
base = getSampleStyleSheet()
styles = {}
styles['cover_title'] = ParagraphStyle(
'cover_title', fontName='Helvetica-Bold',
fontSize=26, textColor=C_WHITE, alignment=TA_CENTER, leading=34)
styles['cover_sub'] = ParagraphStyle(
'cover_sub', fontName='Helvetica',
fontSize=13, textColor=C_LIGHT_BLUE, alignment=TA_CENTER, leading=18)
styles['q_title'] = ParagraphStyle(
'q_title', fontName='Helvetica-Bold',
fontSize=18, textColor=C_WHITE, alignment=TA_CENTER, leading=24)
styles['section'] = ParagraphStyle(
'section', fontName='Helvetica-Bold',
fontSize=13, textColor=C_DARK_BLUE, spaceBefore=10, spaceAfter=4, leading=17)
styles['subsection'] = ParagraphStyle(
'subsection', fontName='Helvetica-Bold',
fontSize=11, textColor=C_MED_BLUE, spaceBefore=6, spaceAfter=2, leading=15)
styles['body'] = ParagraphStyle(
'body', fontName='Helvetica',
fontSize=9.5, textColor=C_GREY, spaceBefore=2, spaceAfter=2,
leading=14, alignment=TA_JUSTIFY)
styles['bullet'] = ParagraphStyle(
'bullet', fontName='Helvetica',
fontSize=9.5, textColor=C_GREY, spaceBefore=1, spaceAfter=1,
leading=13, leftIndent=14, bulletIndent=0)
styles['key_point'] = ParagraphStyle(
'key_point', fontName='Helvetica-BoldOblique',
fontSize=9.5, textColor=C_TEAL, spaceBefore=2, spaceAfter=2,
leading=13, leftIndent=8)
styles['caption'] = ParagraphStyle(
'caption', fontName='Helvetica-Oblique',
fontSize=8.5, textColor=C_GREY, alignment=TA_CENTER, spaceBefore=2, spaceAfter=6)
styles['toc_entry'] = ParagraphStyle(
'toc_entry', fontName='Helvetica',
fontSize=11, textColor=C_DARK_BLUE, spaceBefore=4, spaceAfter=4, leading=16)
return styles
# ──────────────────────────────────────────────
# HELPER FLOWABLES
# ──────────────────────────────────────────────
class ColorBand(Flowable):
"""Full-width color header band."""
def __init__(self, text, bg=C_DARK_BLUE, fg=C_WHITE, height=1.1*cm, font_size=14):
super().__init__()
self.text = text
self.bg = bg
self.fg = fg
self.height = height
self.font_size = font_size
self.width = PAGE_W - 2 * MARGIN
def draw(self):
c = self.canv
c.setFillColor(self.bg)
c.roundRect(0, 0, self.width, self.height, 5, fill=1, stroke=0)
c.setFillColor(self.fg)
c.setFont('Helvetica-Bold', self.font_size)
c.drawCentredString(self.width / 2, self.height / 2 - self.font_size * 0.35,
self.text)
def wrap(self, aw, ah):
return self.width, self.height
def section_header(text, styles, color=C_DARK_BLUE):
return KeepTogether([
ColorBand(text, bg=color, height=1.0*cm, font_size=12),
Spacer(1, 4)
])
def key_box(text, styles, color=C_TEAL_LIGHT, border=C_TEAL):
"""Highlighted key-point paragraph in a colored box."""
data = [[Paragraph(text, styles['key_point'])]]
t = Table(data, colWidths=[PAGE_W - 2*MARGIN])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), color),
('BOX', (0,0), (-1,-1), 1, border),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
]))
return t
def styled_table(header, rows, col_widths, header_bg=C_DARK_BLUE, header_fg=C_WHITE,
alt_bg=C_LIGHT_GREY):
data = [header] + rows
n = len(data)
t = Table(data, colWidths=col_widths, repeatRows=1)
style_cmds = [
('BACKGROUND', (0,0), (-1,0), header_bg),
('TEXTCOLOR', (0,0), (-1,0), header_fg),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,-1), 9),
('FONTNAME', (0,1), (-1,-1), 'Helvetica'),
('TEXTCOLOR', (0,1), (-1,-1), C_GREY),
('ROWBACKGROUNDS', (0,1), (-1,-1), [C_WHITE, alt_bg]),
('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#bdbdbd')),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING',(0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
('WORDWRAP', (0,0), (-1,-1), 1),
]
t.setStyle(TableStyle(style_cmds))
return t
def mpl_to_rl(fig, width_cm=14, height_cm=8):
"""Convert matplotlib figure to ReportLab Image flowable."""
buf = io.BytesIO()
fig.savefig(buf, format='png', dpi=150, bbox_inches='tight',
facecolor=fig.get_facecolor())
buf.seek(0)
plt.close(fig)
return RLImage(buf, width=width_cm*cm, height=height_cm*cm)
# ══════════════════════════════════════════════
# DIAGRAM GENERATORS
# ══════════════════════════════════════════════
def diag_artificial_blood():
"""Classification tree + O2 dissociation concept."""
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5), facecolor='#fafafa')
# ── LEFT: Classification tree ──
ax = axes[0]
ax.set_facecolor('#fafafa')
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.axis('off')
ax.set_title('Classification of Artificial Blood', fontsize=11, fontweight='bold',
color='#1a237e', pad=8)
def box(ax, x, y, w, h, text, fc, ec, fs=8.5, tc='white', bold=False):
rx = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle="round,pad=0.1", fc=fc, ec=ec, lw=1.5)
ax.add_patch(rx)
fw = 'bold' if bold else 'normal'
ax.text(x, y, text, ha='center', va='center', fontsize=fs,
color=tc, fontweight=fw, wrap=True,
multialignment='center')
def arrow(ax, x1, y1, x2, y2):
ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle='->', color='#555', lw=1.2))
# Root
box(ax, 5, 9.2, 5, 0.9, 'ARTIFICIAL BLOOD\n(Oxygen Therapeutic Agents)', '#1a237e', '#0d0d6b', 9, 'white', True)
# Level 1
box(ax, 2.5, 7.6, 4.2, 0.75, 'HBOCs\n(Hemoglobin-Based)', '#283593', '#1a237e', 8.5, 'white', True)
box(ax, 7.5, 7.6, 4.2, 0.75, 'PFBOCs\n(Perfluorocarbon-Based)', '#00695c', '#004d40', 8.5, 'white', True)
arrow(ax, 5, 8.75, 2.5, 7.95)
arrow(ax, 5, 8.75, 7.5, 7.95)
# HBOC subtypes
hboc = [
(1.5, 6.3, 'Polymerized Hb\n(Hemopure/HBOC-201)', '#3949ab'),
(1.5, 5.2, 'PEGylated Hb\n(MP4OX/Hemospan)', '#3949ab'),
(1.5, 4.1, 'Cross-linked Hb\n(DCLHb)', '#3949ab'),
(1.5, 3.0, 'Recombinant Hb\n(rHb1.1)', '#3949ab'),
(1.5, 1.9, 'Hb Vesicles\n(Liposome-encapsulated)', '#3949ab'),
]
for x, y, t, c in hboc:
box(ax, x, y, 3.5, 0.7, t, c, '#283593', 7.5, 'white')
arrow(ax, 2.5, 7.23, x, y+0.35)
# PFBOC subtypes
pfboc = [
(8.5, 6.3, 'Fluosol-DA 20%\n(First FDA approved, 1989)', '#00897b'),
(8.5, 5.2, 'Oxygent (AF0144)\n(Perfluorooctyl bromide)', '#00897b'),
(8.5, 4.1, 'Perftoran\n(Approved Russia 1996)', '#00897b'),
(8.5, 3.0, 'Emerging 2nd Gen\nPFC Emulsions', '#00897b'),
]
for x, y, t, c in pfboc:
box(ax, x, y, 3.5, 0.7, t, c, '#00695c', 7.5, 'white')
arrow(ax, 7.5, 7.23, x, y+0.35)
# ── RIGHT: O2 dissociation curve comparison ──
ax2 = axes[1]
ax2.set_facecolor('#fafafa')
ax2.set_title('O₂ Carrying Mechanism', fontsize=11, fontweight='bold',
color='#1a237e', pad=8)
pO2 = np.linspace(0, 100, 300)
# Hb sigmoidal curve
hb_sat = 100 / (1 + (26 / pO2) ** 2.7)
# PFC linear dissolution
pfc = pO2 * 0.9
ax2.plot(pO2, hb_sat, color='#283593', lw=2.5, label='Hb (Sigmoidal)\nP50 ~26 mmHg')
ax2.plot(pO2, pfc, color='#00695c', lw=2.5, linestyle='--',
label='PFC (Linear)\nRequires high FiO₂')
ax2.axvline(26, color='#283593', lw=1, linestyle=':', alpha=0.7)
ax2.text(28, 30, 'P50\n~26 mmHg', color='#283593', fontsize=8)
ax2.set_xlabel('PO₂ (mmHg)', fontsize=9)
ax2.set_ylabel('O₂ Carrying (%)', fontsize=9)
ax2.legend(fontsize=8.5, framealpha=0.9)
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 100)
ax2.grid(alpha=0.3)
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
# Annotation boxes
ax2.annotate('HBOCs: Cooperative\nbinding - efficient\nO₂ release to tissues',
xy=(40, 90), fontsize=7.5,
bbox=dict(boxstyle='round', fc='#e8eaf6', ec='#283593', alpha=0.9))
ax2.annotate('PFCs: Linear - need\nhigh PaO₂ (FiO₂>0.6)\nfor adequate O₂',
xy=(55, 45), fontsize=7.5,
bbox=dict(boxstyle='round', fc='#e0f2f1', ec='#00695c', alpha=0.9))
plt.tight_layout(pad=1.5)
return fig
def diag_obesity():
"""GLP-1 axis diagram + drug comparison bar chart."""
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5), facecolor='#fafafa')
# ── LEFT: Mechanism flow diagram ──
ax = axes[0]
ax.set_facecolor('#fafafa')
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.axis('off')
ax.set_title('GLP-1/GIP Receptor Agonist Mechanism', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
def rbox(ax, x, y, w, h, text, fc, ec='white', fs=8.5, tc='white', bold=False):
rx = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle="round,pad=0.15", fc=fc, ec=ec, lw=1.5)
ax.add_patch(rx)
fw = 'bold' if bold else 'normal'
ax.text(x, y, text, ha='center', va='center', fontsize=fs,
color=tc, fontweight=fw, multialignment='center')
def arr(ax, x1, y1, x2, y2, col='#555'):
ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle='->', color=col, lw=1.5))
# Drug box at top
rbox(ax, 5, 9.3, 5.5, 0.9,
'GLP-1 / GIP Receptor Agonists\n(Semaglutide · Tirzepatide · Retatrutide)', '#e53935', fs=8.5, bold=True)
# 4 organ targets
organs = [
(1.5, 7.2, 'HYPOTHALAMUS\nAppetite suppression\nSatiety ↑', '#1a237e'),
(4.2, 7.2, 'STOMACH\nGastric emptying ↓\nFood intake ↓', '#283593'),
(6.8, 7.2, 'PANCREAS\nInsulin ↑\nGlucagon ↓', '#00695c'),
(9.3, 7.2, 'HEART/KIDNEY\nCardioprotection\nRenoprotection', '#6a1b9a'),
]
for x, y, t, c in organs:
rbox(ax, x, y, 2.8, 1.1, t, c, fs=7.5)
arr(ax, 5, 8.85, x, y+0.55, '#e53935')
# Outcomes
outcomes = [
(1.8, 5.0, 'Weight Loss\n14-25%\nbody weight', '#e53935'),
(4.2, 5.0, 'HbA1c ↓\n1.5-2.5%', '#f57f17'),
(6.5, 5.0, 'CV Events ↓\n(SURMOUNT\nSURFACE trials)', '#00695c'),
(8.8, 5.0, 'NASH/OHS\nImprovement', '#6a1b9a'),
]
for x, y, t, c in outcomes:
rbox(ax, x, y, 2.8, 1.3, t, c, fs=7.5)
for ox, oy, _, _ in organs:
for ox2, oy2, _, _ in outcomes:
if abs(ox - ox2) < 2:
arr(ax, ox, oy-0.55, ox2, oy2+0.65)
# Side effects
rbox(ax, 5, 2.7, 8, 0.9,
'Side Effects: Nausea · Vomiting · Diarrhoea · Constipation · Pancreatitis (rare)', '#ff7043',
fs=8, bold=False)
rbox(ax, 5, 1.5, 8, 0.7,
'CI: MEN2 / MTC history · Pregnancy', '#b71c1c', fs=8)
arr(ax, 5, 7.7, 5, 3.15, '#757575')
# ── RIGHT: Weight loss comparison bar chart ──
ax2 = axes[1]
ax2.set_facecolor('#fafafa')
ax2.set_title('Comparative Weight Loss (%)', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
drugs = ['Orlistat', 'Liraglutide\n3mg', 'Phenter-\nTopiramate',
'Naltrexone-\nBupropion', 'Semaglutide\n2.4mg', 'Tirzepatide\n15mg',
'Retatrutide\n(Phase3)']
wt_loss = [5.5, 6.5, 9.0, 5.0, 14.9, 22.5, 24.2]
bar_colors = ['#78909c', '#78909c', '#78909c', '#78909c', '#283593', '#1a237e', '#e53935']
bars = ax2.barh(drugs, wt_loss, color=bar_colors, edgecolor='white', height=0.6)
for bar, val in zip(bars, wt_loss):
ax2.text(val + 0.3, bar.get_y() + bar.get_height()/2,
f'{val}%', va='center', fontsize=8.5, color='#333')
ax2.set_xlabel('Mean Body Weight Reduction (%)', fontsize=9)
ax2.set_xlim(0, 30)
ax2.axvline(5, color='#e0e0e0', lw=1, linestyle='--')
ax2.text(5.2, -0.8, 'Clinically\nsignificant\nthreshold 5%',
fontsize=7, color='#9e9e9e')
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
ax2.grid(axis='x', alpha=0.3)
plt.tight_layout(pad=1.5)
return fig
def diag_injectable_lipid():
"""PCSK9 mechanism + drug comparison."""
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5), facecolor='#fafafa')
# ── LEFT: PCSK9 pathway ──
ax = axes[0]
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('PCSK9 Pathway & Inhibition', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
def rbox(ax, x, y, w, h, text, fc, fs=8.5, tc='white', bold=False):
rx = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle="round,pad=0.15", fc=fc, ec='white', lw=1)
ax.add_patch(rx)
fw = 'bold' if bold else 'normal'
ax.text(x, y, text, ha='center', va='center', fontsize=fs,
color=tc, fontweight=fw, multialignment='center')
def arr(ax, x1, y1, x2, y2, col='#555', style='->'):
ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle=style, color=col, lw=1.5))
# Hepatocyte
hep = FancyBboxPatch((0.3, 0.5), 9.4, 9, boxstyle="round,pad=0.2",
fc='#fff3e0', ec='#ff8f00', lw=2, linestyle='--')
ax.add_patch(hep)
ax.text(5, 9.2, 'HEPATOCYTE', ha='center', fontsize=9, color='#e65100', fontweight='bold')
# NORMAL pathway (left side)
rbox(ax, 2, 8, 2.8, 0.7, 'LPA gene\ntranscription', '#546e7a', fs=7.5)
rbox(ax, 2, 6.7, 2.8, 0.7, 'PCSK9 protein\nsynthesized', '#78909c', fs=7.5)
rbox(ax, 2, 5.4, 2.8, 0.7, 'PCSK9 binds LDLR', '#e53935', fs=7.5)
rbox(ax, 2, 4.1, 2.8, 0.7, 'LDLR degraded\nin lysosome', '#b71c1c', fs=7.5)
rbox(ax, 2, 2.8, 2.8, 0.7, 'Fewer LDLRs\non surface', '#b71c1c', fs=7.5)
rbox(ax, 2, 1.5, 2.8, 0.7, '↑ LDL-C\nin blood', '#c62828', fs=7.5, bold=True)
for y1, y2 in [(7.65, 7.05), (6.35, 5.75), (5.05, 4.45), (3.75, 3.15), (2.45, 1.85)]:
arr(ax, 2, y1, 2, y2, '#e53935')
ax.text(2, 9.5, 'NORMAL\nPathway', ha='center', fontsize=8.5, color='#b71c1c', fontweight='bold')
# INHIBITION pathway (right side)
rbox(ax, 7.5, 8.0, 3, 0.8, 'Inclisiran (siRNA)\nDegrades PCSK9 mRNA\n→ ↓ PCSK9 synthesis', '#00695c', fs=7)
rbox(ax, 7.5, 6.5, 3, 0.8, 'Evolocumab/Alirocumab\n(mAb) Binds circulating\nPCSK9 extracellularly', '#283593', fs=7)
rbox(ax, 7.5, 5.0, 3, 0.8, 'LDLR recycles\nback to surface\n↑ LDL uptake', '#1a237e', fs=7.5, bold=False)
rbox(ax, 7.5, 3.5, 3, 0.8, '↓ LDL-C\n50-60% reduction', '#1a237e', fs=8, bold=True)
rbox(ax, 7.5, 2.0, 3, 0.8, '↓ CV events\n(FOURIER/ODYSSEY)', '#004d40', fs=7.5, bold=False)
arr(ax, 7.5, 7.6, 7.5, 6.9, '#00695c')
arr(ax, 7.5, 6.1, 7.5, 5.4, '#283593')
arr(ax, 7.5, 4.6, 7.5, 3.9, '#1a237e')
arr(ax, 7.5, 3.1, 7.5, 2.4, '#004d40')
# Block arrow from inhibitors to normal pathway
ax.annotate('', xy=(3.4, 5.4), xytext=(6.0, 6.5),
arrowprops=dict(arrowstyle='->', color='#e53935', lw=2))
ax.text(4.8, 6.2, 'BLOCK', fontsize=9, color='#e53935', fontweight='bold',
rotation=-20)
ax.text(7.5, 9.5, 'WITH\nInhibition', ha='center', fontsize=8.5,
color='#00695c', fontweight='bold')
# ── RIGHT: Comparison table as chart ──
ax2 = axes[1]
ax2.set_facecolor('#fafafa')
ax2.set_title('Injectable Lipid-Lowering Drugs - LDL Reduction', fontsize=10,
fontweight='bold', color='#1a237e', pad=8)
drugs = ['Evolocumab\n(Repatha)', 'Alirocumab\n(Praluent)', 'Inclisiran\n(Leqvio)',
'Mipomersen\n(Kynamro)', 'Evinacumab\n(Evkeeza)']
ldl_red = [60, 58, 52, 37, 47]
freq = ['Q2W/Monthly\nSC', 'Q2W/Monthly\nSC', 'Twice Yearly\nSC',
'Weekly\nSC', 'Monthly\nIV/SC']
bar_cols = ['#1a237e', '#283593', '#00695c', '#6a1b9a', '#e65100']
y_pos = np.arange(len(drugs))
bars = ax2.barh(y_pos, ldl_red, color=bar_cols, height=0.55, edgecolor='white')
for i, (bar, val, fr) in enumerate(zip(bars, ldl_red, freq)):
ax2.text(val + 0.5, bar.get_y() + bar.get_height()/2,
f'{val}%\n{fr}', va='center', fontsize=7.5, color='#333')
ax2.set_yticks(y_pos)
ax2.set_yticklabels(drugs, fontsize=8.5)
ax2.set_xlabel('LDL-C Reduction (%)', fontsize=9)
ax2.set_xlim(0, 80)
ax2.axvline(50, color='#e0e0e0', lw=1, linestyle='--')
ax2.text(50.5, 4.7, '50%', fontsize=7.5, color='#9e9e9e')
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
ax2.grid(axis='x', alpha=0.3)
plt.tight_layout(pad=1.5)
return fig
def diag_niv():
"""Domiciliary NIV - indications + setup diagram."""
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5), facecolor='#fafafa')
# ── LEFT: Indications web ──
ax = axes[0]
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('Indications for Domiciliary NIV', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
def rbox(ax, x, y, w, h, text, fc, fs=8, tc='white', bold=False):
rx = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle="round,pad=0.15", fc=fc, ec='white', lw=1)
ax.add_patch(rx)
fw = 'bold' if bold else 'normal'
ax.text(x, y, text, ha='center', va='center', fontsize=fs,
color=tc, fontweight=fw, multialignment='center')
# Center
rbox(ax, 5, 5, 2.5, 1.2, 'DOMICILIARY\nNIV', '#1a237e', fs=10, bold=True)
# Spokes
indications = [
(5, 8.5, 2.8, 1.0, 'COPD\nPaCO2≥55 mmHg\nor ≥50+noc.desat', '#283593'),
(1.5, 7.0, 2.8, 1.1, 'Obesity\nHypoventilation\nSyndrome (OHS)', '#e65100'),
(1.5, 3.0, 2.8, 1.1, 'Neuromuscular\nDiseases\n(ALS, DMD, SMA)', '#6a1b9a'),
(5, 1.5, 2.8, 1.0, 'Chest Wall\nDeformities\n(Kyphoscoliosis)', '#00695c'),
(8.5, 3.0, 2.8, 1.1, 'Central\nHypoventilation\n(CCHS)', '#00838f'),
(8.5, 7.0, 2.8, 1.1, 'Post-Acute\nHypercapnic RF\n(discharge NIV)', '#e53935'),
]
centers = [(5,5)]
for x, y, w, h, t, c in indications:
rbox(ax, x, y, w, h, t, c, fs=7.5)
ax.plot([5, x], [5, y], color='#bdbdbd', lw=1, zorder=0)
# Key criteria callout
rbox(ax, 5, 9.3, 9.5, 0.6,
'Key: PaCO2 ≥ 55 mmHg OR PaCO2 50-54 + nocturnal desaturation OR recurrent hospitalizations', '#37474f', fs=7)
# ── RIGHT: NIV settings + titration ──
ax2 = axes[1]
ax2.set_xlim(0, 10)
ax2.set_ylim(0, 10)
ax2.axis('off')
ax2.set_facecolor('#fafafa')
ax2.set_title('NIV Setup & Titration Algorithm', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
def rbox2(ax, x, y, w, h, text, fc, fs=8, tc='white', bold=False):
rx = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle="round,pad=0.15", fc=fc, ec='white', lw=1)
ax.add_patch(rx)
fw = 'bold' if bold else 'normal'
ax.text(x, y, text, ha='center', va='center', fontsize=fs,
color=tc, fontweight=fw, multialignment='center')
def arr2(ax, x1, y1, x2, y2, col='#555'):
ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle='->', color=col, lw=1.5))
steps = [
(5, 9.0, 8, 0.75, 'ASSESS: ABG (stable, ≥3 wks off acute episode)\nSymptoms: dyspnoea, morning headache, hypersomnolence', '#1a237e', 8),
(5, 7.7, 8, 0.75, 'INITIATE: IPAP 12 / EPAP 4 cmH2O\nBackup rate 12/min · Titrate IPAP by 2 cmH2O', '#283593', 8),
(5, 6.4, 8, 0.75, 'TARGET: SpO2 >90% · TcCO2 <45 mmHg\nNo major leaks · Patient comfort', '#00695c', 8),
(5, 5.1, 8, 0.75, 'INTERFACE: Nasal mask (preferred) → Oronasal\nAdd heated humidifier for compliance', '#e65100', 8),
(5, 3.8, 8, 0.75, 'DISCHARGE: Home NIV + written action plan\nCompliance target: ≥4 hrs/night', '#6a1b9a', 8),
(5, 2.5, 8, 0.75, 'FOLLOW UP: 4 wks → 3 months → 6 monthly\nABG / TcCO2 · Compliance data (telemonitor)', '#00838f', 8),
]
for x, y, w, h, t, c, fs in steps:
rbox2(ax2, x, y, w, h, t, c, fs=fs)
for i in range(len(steps) - 1):
y1 = steps[i][1] - 0.375
y2 = steps[i+1][1] + 0.375
arr2(ax2, 5, y1, 5, y2, '#9e9e9e')
# Side note
rbox2(ax2, 5, 1.2, 8, 0.7,
'BiPAP Modes: CPAP → OSA | BiPAP/S-T → COPD/OHS/NMD | AVAPS → NMD | ASV → Central SA',
'#37474f', fs=7.5)
plt.tight_layout(pad=1.5)
return fig
def diag_lpa():
"""Lp(a) structure + pathogenesis pathways."""
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5), facecolor='#fafafa')
# ── LEFT: Structure diagram ──
ax = axes[0]
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('Structure of Lipoprotein(a)', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
# LDL core (cholesterol ester)
core = plt.Circle((5, 5.5), 2.2, fc='#fff3e0', ec='#f57f17', lw=2)
ax.add_patch(core)
ax.text(5, 5.5, 'Cholesteryl\nEsters\n+\nTriglycerides', ha='center', va='center',
fontsize=8, color='#e65100', fontweight='bold', multialignment='center')
# ApoB-100 ring
apoB = plt.Circle((5, 5.5), 3.2, fc='none', ec='#1a237e', lw=3, linestyle='-')
ax.add_patch(apoB)
ax.text(5, 8.85, 'ApoB-100', ha='center', fontsize=8.5, color='#1a237e', fontweight='bold')
# Phospholipid layer
phos = plt.Circle((5, 5.5), 2.7, fc='none', ec='#42a5f5', lw=1.5, linestyle='--')
ax.add_patch(phos)
ax.text(7.9, 7.5, 'Phospho-\nlipid layer', ha='center', fontsize=7.5, color='#1976d2')
# Apo(a) - kringle domain chain
theta = np.linspace(0.3, 2.1, 8)
kx = 5 + 3.5 * np.cos(theta)
ky = 5.5 + 3.5 * np.sin(theta)
ax.plot(kx, ky, 'o-', color='#e53935', lw=2, ms=12, mfc='#ef9a9a', mec='#e53935')
ax.text(kx[3], ky[3]+0.8, 'Apo(a) - Kringle IV repeats (KIV-2)', ha='center',
fontsize=8, color='#e53935', fontweight='bold')
ax.text(kx[3], ky[3]+0.3, '(Number ↑ = Smaller isoform = Higher Lp(a))', ha='center',
fontsize=7, color='#c62828')
# Disulfide bond
ax.annotate('', xy=(kx[0], ky[0]-0.3), xytext=(5 + 3.1, 5.5 + 0.5),
arrowprops=dict(arrowstyle='->', color='#6a1b9a', lw=2))
ax.text(6.8, 7.2, 'Disulfide\nbond\n(Apo(a)↔ApoB)', fontsize=7.5, color='#6a1b9a',
fontweight='bold', ha='center')
# OxPL
ax.annotate('OxPL\n(Oxidized\nPhospholipids)', xy=(2.1, 8.0), xytext=(1.2, 9.2),
fontsize=7.5, color='#e65100', fontweight='bold', ha='center',
arrowprops=dict(arrowstyle='->', color='#e65100', lw=1))
# Legend
legend_items = [
(mpatches.Patch(fc='#fff3e0', ec='#f57f17'), 'Lipid core (CE + TG)'),
(mpatches.Patch(fc='none', ec='#1a237e', linewidth=2), 'ApoB-100'),
(mpatches.Patch(fc='#ef9a9a', ec='#e53935'), 'Apo(a) kringle domains'),
(mpatches.Patch(fc='#ce93d8', ec='#6a1b9a'), 'Disulfide bond'),
]
handles, labels = zip(*legend_items)
ax.legend(handles, labels, loc='lower left', fontsize=7.5, framealpha=0.9)
# ── RIGHT: Pathogenesis pathways ──
ax2 = axes[1]
ax2.set_xlim(0, 10)
ax2.set_ylim(0, 10)
ax2.axis('off')
ax2.set_facecolor('#fafafa')
ax2.set_title('Lp(a) Pathogenic Mechanisms', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
def rbox3(ax, x, y, w, h, text, fc, fs=8.5, tc='white', bold=False):
rx = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle="round,pad=0.15", fc=fc, ec='white', lw=1)
ax.add_patch(rx)
fw = 'bold' if bold else 'normal'
ax.text(x, y, text, ha='center', va='center', fontsize=fs,
color=tc, fontweight=fw, multialignment='center')
# Center: Elevated Lp(a)
rbox3(ax2, 5, 8.5, 5, 0.9, 'ELEVATED Lp(a)\n[≥50 mg/dL or ≥125 nmol/L]', '#1a237e', fs=9, bold=True)
paths = [
(2.0, 6.5, 3.0, 1.2, 'ATHEROGENESIS\n• OxPL inflames endothelium\n• Foam cell formation\n• Plaque growth & instability', '#283593'),
(5.0, 6.5, 3.0, 1.2, 'THROMBOGENESIS\n• Homologous to plasminogen\n• Competes for fibrin\n• ↓ Fibrinolysis (↓ tPA activity)', '#e53935'),
(8.0, 6.5, 3.0, 1.2, 'INFLAMMATION\n• OxPL activates monocytes\n• Cytokine release\n• Vascular inflammation', '#e65100'),
]
for x, y, w, h, t, c in paths:
rbox3(ax2, x, y, w, h, t, c, fs=7.5)
ax2.annotate('', xy=(x, y+0.6), xytext=(5, 8.05),
arrowprops=dict(arrowstyle='->', color=c, lw=1.5))
outcomes = [
(2.0, 4.5, 3.0, 0.8, 'Atherosclerotic\nCVD (MI, Stroke)', '#1565c0'),
(5.0, 4.5, 3.0, 0.8, 'Calcific Aortic\nValve Stenosis', '#c62828'),
(8.0, 4.5, 3.0, 0.8, 'Recurrent Events\n(Residual Risk)', '#bf360c'),
]
for i, (x, y, w, h, t, c) in enumerate(outcomes):
rbox3(ax2, x, y, w, h, t, c, fs=7.5)
ax2.annotate('', xy=(x, y+0.4), xytext=(x, 5.9),
arrowprops=dict(arrowstyle='->', color=c, lw=1.5))
# Treatment
rbox3(ax2, 5, 2.9, 9.5, 1.2,
'TREATMENT:\n• PCSK9 inhibitors: 20-30% Lp(a) ↓\n'
'• Pelacarsen (ASO): 80-90% ↓ [Phase 3: Lp(a)HORIZON]\n'
'• Olpasiran (siRNA): 80-95% ↓ [Phase 3: OCEAN(a) ~7000 pts]\n'
'• Lipoprotein Apheresis: immediate removal', '#00695c', fs=7.5)
rbox3(ax2, 5, 1.4, 9.5, 0.7,
'⚠ Lp(a) levels are 80-90% genetically determined - minimally affected by diet/statins',
'#b71c1c', fs=7.5, bold=True)
plt.tight_layout(pad=1.5)
return fig
# ══════════════════════════════════════════════
# COVER PAGE
# ══════════════════════════════════════════════
def cover_page(styles):
elements = []
# Header band - dark blue full width
elements.append(Spacer(1, 1.5*cm))
# Main title box
title_data = [[
Paragraph('MD General Medicine', styles['cover_title']),
]]
t = Table(title_data, colWidths=[PAGE_W - 2*MARGIN])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_DARK_BLUE),
('TOPPADDING', (0,0), (-1,-1), 18),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 12),
('RIGHTPADDING', (0,0), (-1,-1), 12),
('ROUNDEDCORNERS', [8]),
]))
elements.append(t)
title_data2 = [[
Paragraph('Paper IV — Study Guide', styles['cover_sub']),
]]
t2 = Table(title_data2, colWidths=[PAGE_W - 2*MARGIN])
t2.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_MED_BLUE),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 18),
('LEFTPADDING', (0,0), (-1,-1), 12),
]))
elements.append(t2)
elements.append(Spacer(1, 0.8*cm))
subtitle = Paragraph('Examination: January 2025 · MDRSA-20 · 100 Marks',
ParagraphStyle('s', fontName='Helvetica', fontSize=11,
textColor=C_GREY, alignment=TA_CENTER))
elements.append(subtitle)
elements.append(Spacer(1, 0.5*cm))
elements.append(HRFlowable(color=C_ACCENT, thickness=2, width='100%'))
elements.append(Spacer(1, 0.5*cm))
# TOC
toc_header = Paragraph('Contents', ParagraphStyle('th', fontName='Helvetica-Bold',
fontSize=14, textColor=C_DARK_BLUE, alignment=TA_CENTER))
elements.append(toc_header)
elements.append(Spacer(1, 0.4*cm))
toc = [
('Q1', 'Artificial Blood', 'HBOCs · PFBOCs · Emerging Technologies'),
('Q2', 'Newer Treatments for Obesity', 'GLP-1/GIP Agonists · Surgical · Device-Based'),
('Q3', 'Injectable Lipid-Lowering Drugs', 'PCSK9 mAbs · siRNA · ASO · ANGPTL3 Inhibitors'),
('Q4', 'Domiciliary Non-Invasive Ventilation', 'Indications · Setup · Modes · Monitoring'),
('Q5', 'Lipoprotein (a)', 'Structure · Pathogenesis · Measurement · Therapies'),
]
topic_colors = [C_DARK_BLUE, C_TEAL, colors.HexColor('#6a1b9a'),
colors.HexColor('#e65100'), colors.HexColor('#c62828')]
for (qno, title, sub), col in zip(toc, topic_colors):
row_data = [[
Paragraph(f'<b>{qno}</b>', ParagraphStyle('qn', fontName='Helvetica-Bold',
fontSize=14, textColor=C_WHITE, alignment=TA_CENTER)),
Paragraph(f'<b>{title}</b><br/><font size="9" color="#555555">{sub}</font>',
ParagraphStyle('tt', fontName='Helvetica-Bold', fontSize=11,
textColor=C_DARK_BLUE, leading=16)),
]]
rt = Table(row_data, colWidths=[1.4*cm, PAGE_W - 2*MARGIN - 1.6*cm])
rt.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), col),
('BACKGROUND', (1,0), (1,-1), C_LIGHT_GREY),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#bdbdbd')),
]))
elements.append(rt)
elements.append(Spacer(1, 4))
elements.append(Spacer(1, 0.8*cm))
note = Paragraph(
'<i>Instructions: Answer any FOUR out of FIVE questions · Draw diagrams/flowcharts wherever necessary</i>',
ParagraphStyle('note', fontName='Helvetica-Oblique', fontSize=9,
textColor=C_GREY, alignment=TA_CENTER))
elements.append(note)
elements.append(PageBreak())
return elements
# ══════════════════════════════════════════════
# SECTION BUILDERS
# ══════════════════════════════════════════════
def build_q1(styles, diag_img):
E = []
# Header band
hdr = Table([[Paragraph('Q1. ARTIFICIAL BLOOD', styles['q_title'])]],
colWidths=[PAGE_W - 2*MARGIN])
hdr.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_DARK_BLUE),
('TOPPADDING', (0,0), (-1,-1), 12),
('BOTTOMPADDING', (0,0), (-1,-1), 12),
('ROUNDEDCORNERS', [6]),
]))
E.append(hdr)
E.append(Spacer(1, 8))
E.append(key_box('KEY CONCEPT: Artificial blood substitutes are oxygen therapeutic agents (OTAs) '
'designed to replicate the O₂-carrying function of red blood cells — classifying '
'into HBOCs (protein-based) and PFBOCs (synthetic fluoro-compound-based).', styles))
E.append(Spacer(1, 6))
E.append(section_header('WHY ARTIFICIAL BLOOD?', styles))
E.append(Paragraph(
'Blood shortages, transfusion-transmitted infections (HIV, HBV, HCV), immunological reactions, '
'limited shelf life (42 days), mass casualty/military scenarios, and religious objections (Jehovah\'s '
'Witnesses) drive the need for safe, universal, storable blood substitutes.', styles['body']))
E.append(Spacer(1, 8))
# Diagram
E.append(diag_img)
E.append(Paragraph('Fig 1. Classification of artificial blood and O₂ carrying mechanism', styles['caption']))
E.append(Spacer(1, 6))
E.append(section_header('A. HEMOGLOBIN-BASED OXYGEN CARRIERS (HBOCs)', styles, C_MED_BLUE))
E.append(Paragraph(
'HBOCs use modified hemoglobin as the oxygen-carrying molecule. Free Hb is toxic '
'(vasoconstriction via NO scavenging, renal toxicity) — hence chemical modifications are mandatory.', styles['body']))
E.append(Spacer(1, 4))
hboc_hdr = ['Product', 'Modification', 'Source', 'Status']
hboc_rows = [
['Hemopure (HBOC-201)', 'Polymerization', 'Bovine', 'Approved: South Africa, Russia'],
['MP4OX (Hemospan)', 'PEGylation', 'Human', 'Phase 2/3'],
['DCLHb', 'α-α Cross-linking', 'Human', 'Discontinued (vasoconstriction)'],
['HbV (Hb Vesicles)', 'Liposome encapsulation', 'Bovine/Human', 'Research stage'],
['rHb1.1', 'Recombinant (E.coli)', 'Synthetic', 'Early phase trials'],
]
cw = [(PAGE_W - 2*MARGIN) / 4] * 4
E.append(styled_table(hboc_hdr, hboc_rows, cw, header_bg=C_MED_BLUE))
E.append(Spacer(1, 6))
E.append(Paragraph('<b>Problems with free Hb (requiring modification):</b>', styles['subsection']))
problems = [
'NO scavenging → vasoconstriction and systemic hypertension',
'Short intravascular half-life (~2-4 hours)',
'Renal tubular precipitation and nephrotoxicity',
'Oxidative stress from methemoglobin formation',
'Complement activation',
]
for p in problems:
E.append(Paragraph(f'• {p}', styles['bullet']))
E.append(Spacer(1, 8))
E.append(section_header('B. PERFLUOROCARBON-BASED OXYGEN CARRIERS (PFBOCs)', styles, C_TEAL))
E.append(Paragraph(
'PFCs are inert synthetic carbon-fluorine compounds that dissolve O₂ linearly (proportional to PO₂), '
'unlike Hb\'s sigmoidal binding. They REQUIRE supplemental O₂ (FiO₂ >0.6) to be clinically effective.', styles['body']))
E.append(Spacer(1, 4))
pfboc_hdr = ['Product', 'Composition', 'Status']
pfboc_rows = [
['Fluosol-DA 20%', 'Perfluorodecalin + perfluorotripropylamine', 'FDA approved 1989; withdrawn'],
['Oxygent (AF0144)', 'Perfluorooctyl bromide emulsion', 'Phase III; discontinued'],
['Perftoran', 'PFC emulsion', 'Approved Russia (1996); used for hemorrhagic shock'],
]
cw2 = [3.5*cm, 8*cm, (PAGE_W - 2*MARGIN - 11.5*cm)]
E.append(styled_table(pfboc_hdr, pfboc_rows, cw2, header_bg=C_TEAL))
E.append(Spacer(1, 4))
E.append(Paragraph('<b>Advantages vs HBOCs:</b> Universal compatibility (no blood typing) · '
'Long shelf life · No disease transmission · Reaches ischemic microvasculature',
styles['body']))
E.append(Spacer(1, 8))
E.append(section_header('C. EMERGING / FUTURE TECHNOLOGIES', styles, C_PURPLE))
emerging = [
('Hemoglobin Vesicles (HbV)', 'Liposome-encapsulated Hb; avoids NO scavenging; closest RBC mimic'),
('Recombinant Hb', 'Genetically engineered; designed O₂ affinity and reduced toxicity'),
('Nano-artificial RBCs', 'PEG-coated Hb nanoparticles; extended circulation time'),
('Stem cell-derived RBCs', 'Ex-vivo expansion of autologous RBCs for universal donor'),
]
em_hdr = ['Technology', 'Key Feature']
em_rows = [[t, d] for t, d in emerging]
E.append(styled_table(em_hdr, em_rows,
[4*cm, PAGE_W - 2*MARGIN - 4.2*cm], header_bg=C_PURPLE))
E.append(Spacer(1, 8))
E.append(key_box(
'CURRENT STATUS (2025): No perfect blood substitute exists. Hemopure (HBOC-201) is the most '
'clinically advanced product. Major hurdles remain: vasoconstriction, oxidative damage, short half-life. '
'Research focus is on PEGylated Hb, HbV nanoparticles, and recombinant engineering.', styles, C_AMBER_LIGHT, C_AMBER))
E.append(PageBreak())
return E
def build_q2(styles, diag_img):
E = []
hdr = Table([[Paragraph('Q2. NEWER TREATMENTS FOR OBESITY', styles['q_title'])]],
colWidths=[PAGE_W - 2*MARGIN])
hdr.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_TEAL),
('TOPPADDING', (0,0), (-1,-1), 12),
('BOTTOMPADDING', (0,0), (-1,-1), 12),
('ROUNDEDCORNERS', [6]),
]))
E.append(hdr)
E.append(Spacer(1, 8))
E.append(key_box('KEY CONCEPT: Obesity (BMI ≥30) is a chronic relapsing disease. '
'The discovery of the hypothalamic-gut hormone axis (GLP-1, GIP, glucagon) '
'has revolutionized pharmacotherapy — enabling 15-25% body weight reductions '
'comparable to bariatric surgery.', styles))
E.append(Spacer(1, 6))
E.append(diag_img)
E.append(Paragraph('Fig 2. GLP-1/GIP mechanism and comparative weight loss of anti-obesity agents', styles['caption']))
E.append(Spacer(1, 6))
E.append(section_header('I. PHARMACOLOGICAL TREATMENT', styles, C_TEAL))
E.append(Paragraph('<b>A. GLP-1 Receptor Agonists (Single Agonists)</b>', styles['subsection']))
E.append(Paragraph(
'Activate GLP-1 receptors in hypothalamus (satiety), stomach (delayed emptying), pancreas '
'(insulin secretion), and cardiovascular/renal systems.', styles['body']))
E.append(Spacer(1, 4))
glp1_hdr = ['Drug', 'Dose/Route', 'Weight Loss', 'Trial', 'Additional Benefits']
glp1_rows = [
['Semaglutide 2.4 mg\n(Wegovy)', '2.4 mg SC weekly', '~14.9%', 'STEP 1 (NEJM 2021)', 'CV, renal, OSA reduction'],
['Liraglutide 3 mg\n(Saxenda)', '3.0 mg SC daily', '~6.5%', 'SCALE trial', 'T2DM prevention'],
['Oral Sema 25 mg', '25 mg orally daily', '~15%', 'OASIS-4', 'Convenience, no injection'],
]
cw = [3*cm, 2.5*cm, 1.8*cm, 2.8*cm, (PAGE_W - 2*MARGIN - 10.3*cm)]
E.append(styled_table(glp1_hdr, glp1_rows, cw, header_bg=C_TEAL))
E.append(Spacer(1, 6))
E.append(Paragraph('<b>B. Dual Agonists: GLP-1 + GIP</b>', styles['subsection']))
E.append(key_box(
'Tirzepatide (Zepbound/Mounjaro): Dual GIP/GLP-1 receptor agonist · 5/10/15 mg SC weekly · '
'SURMOUNT-1: Up to 22.5% weight loss with 15 mg · FDA approved for obesity (2023) · '
'Superior to semaglutide in head-to-head SURMOUNT-5 trial · Benefits in NASH (SYNERGY-NASH) and HFpEF (SUMMIT)', styles, C_TEAL_LIGHT, C_TEAL))
E.append(Spacer(1, 6))
E.append(Paragraph('<b>C. Triple Agonists: GLP-1 + GIP + Glucagon</b>', styles['subsection']))
E.append(Paragraph(
'Retatrutide (LY3437943) - Phase 3 trials. Phase 2 data: up to 24.2% weight loss at 48 weeks. '
'Most potent weight-loss agent to date. Also reduces osteoarthritis pain. '
'Side effects higher than dual agonists.', styles['body']))
E.append(Spacer(1, 4))
E.append(Paragraph('<b>D. Amylin + GLP-1 Combination</b>', styles['subsection']))
E.append(Paragraph(
'CagriSema (Cagrilintide + Semaglutide): Long-acting amylin analogue combined with GLP-1 RA. '
'Weekly SC injection. Phase 3: ~25% weight loss. Filed for FDA approval 2025. '
'Amylin acts on area postrema to reduce food intake via complementary mechanism.', styles['body']))
E.append(Spacer(1, 4))
E.append(Paragraph('<b>E. Oral GLP-1 Receptor Agonists (Small-Molecule, Non-Peptide)</b>', styles['subsection']))
E.append(Paragraph(
'Orforglipron (Foundayo, Eli Lilly): FDA approved 2026. Once-daily oral; no food/water '
'restrictions. ATTAIN-1b trial: 11.2% weight loss (36 mg/72 wks). First non-peptide oral GLP-1 RA.', styles['body']))
E.append(Spacer(1, 6))
E.append(Paragraph('<b>F. Older Approved Agents (for completeness)</b>', styles['subsection']))
old_hdr = ['Drug', 'Mechanism', 'Weight Loss', 'Key Side Effect']
old_rows = [
['Orlistat', 'Pancreatic lipase inhibitor\n(↓ fat absorption 30%)', '~5.5%', 'Steatorrhoea, oily stools'],
['Phentermine/Topiramate\n(Qsymia)', 'Sympathomimetic + antiepileptic', '~9%', 'CI in pregnancy; tachycardia'],
['Naltrexone/Bupropion\n(Contrave)', 'Opioid antagonist + DA/NE reuptake inhibitor', '~5%', 'Seizures; cardiac events'],
]
cw2 = [3.2*cm, 4.5*cm, 2*cm, (PAGE_W - 2*MARGIN - 9.9*cm)]
E.append(styled_table(old_hdr, old_rows, cw2, header_bg=colors.HexColor('#37474f')))
E.append(Spacer(1, 8))
E.append(section_header('II. SURGICAL & DEVICE-BASED TREATMENT', styles, colors.HexColor('#37474f')))
E.append(Paragraph('<b>Bariatric Surgery - Indications:</b> BMI ≥40 OR BMI ≥35 + obesity-related comorbidity', styles['body']))
E.append(Spacer(1, 4))
surg_hdr = ['Procedure', 'Mechanism', 'EWL %']
surg_rows = [
['Roux-en-Y Gastric Bypass (RYGB)', 'Restriction + malabsorption + hormonal (↑GLP-1)', '60-80%'],
['Sleeve Gastrectomy', 'Restriction + ↓ ghrelin', '50-70%'],
['Adjustable Gastric Band', 'Restriction only', '40-50%'],
['Biliopancreatic Diversion ± DS', 'Malabsorption dominant', '>80%'],
]
E.append(styled_table(surg_hdr, surg_rows,
[5*cm, 6*cm, (PAGE_W - 2*MARGIN - 11.2*cm)],
header_bg=colors.HexColor('#37474f')))
E.append(Spacer(1, 4))
E.append(Paragraph(
'<b>Endoscopic options:</b> Intragastric balloon (Orbera) · Endoscopic Sleeve Gastroplasty (ESG) · '
'Duodenal mucosal resurfacing — for BMI 30-40 or bridge to surgery.', styles['body']))
E.append(Spacer(1, 8))
E.append(key_box(
'SIDE EFFECTS of GLP-1/GIP agonists: Nausea · Vomiting · Diarrhoea (dose-dependent, improve over time) · '
'Constipation · Gallstones · Pancreatitis (rare). '
'CI: personal/family hx of MTC or MEN2; pregnancy.', styles, C_AMBER_LIGHT, C_AMBER))
E.append(PageBreak())
return E
def build_q3(styles, diag_img):
E = []
col = colors.HexColor('#6a1b9a')
hdr = Table([[Paragraph('Q3. INJECTABLE LIPID-LOWERING DRUGS', styles['q_title'])]],
colWidths=[PAGE_W - 2*MARGIN])
hdr.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), col),
('TOPPADDING', (0,0), (-1,-1), 12),
('BOTTOMPADDING', (0,0), (-1,-1), 12),
('ROUNDEDCORNERS', [6]),
]))
E.append(hdr)
E.append(Spacer(1, 8))
E.append(key_box('KEY CONCEPT: Injectable lipid-lowering drugs act primarily by increasing hepatic '
'LDL receptor (LDLR) density via PCSK9 inhibition — achieving 50-60% LDL-C reduction '
'on top of maximum statin + ezetimibe therapy. They are indicated in FH, ASCVD, '
'and statin intolerance.', styles))
E.append(Spacer(1, 6))
E.append(diag_img)
E.append(Paragraph('Fig 3. PCSK9 pathway, mechanism of inhibition, and comparative LDL reduction', styles['caption']))
E.append(Spacer(1, 6))
E.append(section_header('A. PCSK9 MONOCLONAL ANTIBODIES', styles, col))
E.append(Paragraph(
'PCSK9 is a liver-derived serine protease that binds LDLR and directs it to lysosomal degradation, '
'reducing hepatic LDL clearance. Monoclonal antibodies neutralize circulating PCSK9, allowing LDLR '
'to recycle to the hepatocyte surface → 50-60% LDL-C reduction.', styles['body']))
E.append(Spacer(1, 4))
mab_hdr = ['Drug', 'Type', 'Dose/Freq', 'LDL↓', 'Trial', 'Outcome Benefit']
mab_rows = [
['Evolocumab\n(Repatha)', 'Human IgG2 mAb', '140 mg Q2W SC\nor 420 mg monthly',
'~60%', 'FOURIER', '15% ↓ MACE (MI, stroke, revascularization)'],
['Alirocumab\n(Praluent)', 'Humanized IgG1 mAb', '75-150 mg Q2W SC\nor 300 mg monthly',
'~58%', 'ODYSSEY\nOUTCOMES', '↓ MACE in post-ACS; mortality benefit shown'],
]
E.append(styled_table(mab_hdr, mab_rows,
[2.5*cm, 2.5*cm, 2.8*cm, 1.3*cm, 1.8*cm,
PAGE_W - 2*MARGIN - 11.1*cm], header_bg=col))
E.append(Spacer(1, 6))
E.append(section_header('B. siRNA — INCLISIRAN (LEQVIO)', styles, C_TEAL))
E.append(key_box(
'UNIQUE MECHANISM: Inclisiran is a GalNAc-conjugated siRNA that degrades PCSK9 mRNA '
'INTRACELLULARLY in hepatocytes via RNA interference (RNAi). This SUPPRESSES PCSK9 SYNTHESIS '
'(vs mAbs which NEUTRALIZE circulating PCSK9). Half-yearly dosing due to durable intracellular silencing.', styles, C_TEAL_LIGHT, C_TEAL))
E.append(Spacer(1, 4))
incl_hdr = ['Parameter', 'Detail']
incl_rows = [
['Dosing', 'Day 1 → Day 90 → then every 6 MONTHS SC (twice yearly after loading)'],
['LDL-C reduction', '~50% on top of maximally tolerated statin'],
['Trials', 'ORION-9, 10, 11: 28-53% LDL reduction; ORION-4 (outcomes, ongoing)'],
['Advantage', 'Greatest adherence benefit due to semi-annual dosing; telemonitoring options'],
['ADRs', 'Injection site reactions; nasopharyngitis; otherwise excellent safety profile'],
]
E.append(styled_table(incl_hdr, incl_rows,
[3.5*cm, PAGE_W - 2*MARGIN - 3.7*cm], header_bg=C_TEAL))
E.append(Spacer(1, 6))
E.append(section_header('C. ANTISENSE OLIGONUCLEOTIDE — MIPOMERSEN (KYNAMRO)', styles, colors.HexColor('#e65100')))
E.append(Paragraph(
'ASO targeting ApoB-100 mRNA → ↓ ApoB-100 synthesis → ↓ VLDL/LDL assembly. '
'SC injection weekly. 25-40% LDL reduction. '
'FDA approved for homozygous FH (HoFH, 2013). '
'Limitations: hepatic steatosis (~20-30%), injection site reactions, flu-like symptoms.', styles['body']))
E.append(Spacer(1, 6))
E.append(section_header('D. ANTI-ANGPTL3 MONOCLONAL ANTIBODY — EVINACUMAB (EVKEEZA)', styles, colors.HexColor('#01579b')))
E.append(Paragraph(
'Targets Angiopoietin-like protein 3 (ANGPTL3), which normally inhibits lipoprotein lipase (LPL) '
'and endothelial lipase (EL). By inhibiting ANGPTL3: ↑ LPL activity → ↓ TG and LDL. '
'Unique: lowers LDL even in patients with NO functional LDL receptors (HoFH). '
'IV infusion monthly (also SC formulation). FDA approved for HoFH (2021). ~47% LDL reduction.', styles['body']))
E.append(Spacer(1, 6))
E.append(section_header('SUMMARY TABLE', styles, colors.HexColor('#37474f')))
sum_hdr = ['Drug', 'Class', 'Target', 'Route', 'Frequency', 'LDL ↓']
sum_rows = [
['Evolocumab', 'mAb', 'Circulating PCSK9', 'SC', 'Q2W or Monthly', '~60%'],
['Alirocumab', 'mAb', 'Circulating PCSK9', 'SC', 'Q2W or Monthly', '~58%'],
['Inclisiran', 'siRNA', 'PCSK9 mRNA', 'SC', 'Twice yearly', '~52%'],
['Mipomersen', 'ASO', 'ApoB-100 mRNA', 'SC', 'Weekly', '~37%'],
['Evinacumab', 'mAb', 'ANGPTL3', 'IV/SC', 'Monthly', '~47%'],
]
E.append(styled_table(sum_hdr, sum_rows,
[2.8*cm, 1.5*cm, 2.8*cm, 1.3*cm, 2.5*cm,
PAGE_W - 2*MARGIN - 11.1*cm],
header_bg=colors.HexColor('#37474f')))
E.append(Spacer(1, 8))
E.append(key_box(
'INDICATION ALGORITHM: Max-tolerated statin + ezetimibe → LDL not at goal? '
'→ ASCVD or HeFH: add PCSK9 inhibitor (evolocumab/alirocumab) OR inclisiran. '
'→ HoFH: evolocumab + evinacumab ± mipomersen/lomitapide. '
'→ Statin intolerant: PCSK9 inhibitor or inclisiran as primary injectable therapy.', styles, C_AMBER_LIGHT, C_AMBER))
E.append(PageBreak())
return E
def build_q4(styles, diag_img):
E = []
col = colors.HexColor('#e65100')
hdr = Table([[Paragraph('Q4. DOMICILIARY NON-INVASIVE VENTILATION', styles['q_title'])]],
colWidths=[PAGE_W - 2*MARGIN])
hdr.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), col),
('TOPPADDING', (0,0), (-1,-1), 12),
('BOTTOMPADDING', (0,0), (-1,-1), 12),
('ROUNDEDCORNERS', [6]),
]))
E.append(hdr)
E.append(Spacer(1, 8))
E.append(key_box('DEFINITION: Domiciliary (home) NIV = provision of mechanical ventilatory support '
'via a mask interface at home, without intubation, for chronic respiratory failure. '
'Corrects nocturnal hypoventilation, rests respiratory muscles, and normalizes PaCO₂.', styles))
E.append(Spacer(1, 6))
E.append(diag_img)
E.append(Paragraph('Fig 4. Indications and NIV initiation/titration algorithm', styles['caption']))
E.append(Spacer(1, 6))
E.append(section_header('NIV MODES', styles, col))
mode_hdr = ['Mode', 'Description', 'Primary Use']
mode_rows = [
['CPAP', 'Single continuous pressure throughout respiratory cycle', 'Obstructive Sleep Apnoea (OSA)'],
['BiPAP / NPPV', 'IPAP (inspiration) + EPAP (expiration) — bilevel; patient-triggered', 'COPD, OHS, NMD, CWD'],
['AVAPS', 'Average Volume-Assured Pressure Support — targets tidal volume', 'NMD, OHS with variable effort'],
['ASV', 'Adaptive Servo-Ventilation — matches patient breath pattern', 'Central/complex sleep apnoea (NOT HFrEF)'],
]
E.append(styled_table(mode_hdr, mode_rows,
[2*cm, 6.5*cm, PAGE_W - 2*MARGIN - 8.7*cm], header_bg=col))
E.append(Spacer(1, 6))
E.append(section_header('INDICATIONS (ERS/ATS GUIDELINES)', styles, col))
indications = [
('COPD', C_MED_BLUE,
'PaCO₂ ≥55 mmHg (stable, ≥3 wks off acute) OR PaCO₂ 50-54 + nocturnal SpO₂ <88% for ≥5 min on 2 L/min OR '
'2 hospitalisations for hypercapnic RF in 12 months. Use high-intensity BiPAP (IPAP 20-30 cmH₂O). '
'Benefit: ↓ hospitalisations, improved survival, better QoL.'),
('Obesity Hypoventilation Syndrome (OHS)', colors.HexColor('#e65100'),
'BMI ≥30 + awake PaCO₂ ≥45 mmHg + no other cause of hypoventilation. CPAP first if OSA without daytime '
'hypercapnia. Switch to BiPAP if: CPAP fails, persistent hypoventilation, serum HCO₃ >27 mmol/L. '
'Target SpO₂ >90% and PaCO₂ normalisation.'),
('Neuromuscular Diseases (NMD)', C_PURPLE,
'Duchenne MD, ALS, SMA, post-polio. Indication: FVC <50% OR nocturnal symptoms + SNIP <40 cmH₂O OR '
'MIP <60 cmH₂O OR hypercapnia. BiPAP nocturnally; progress to 24-hr ventilation as disease advances. '
'Prolongs survival in ALS and DMD.'),
('Chest Wall Deformities (CWD)', C_TEAL,
'Severe kyphoscoliosis, post-thoracoplasty, post-TB thoracoplasty. '
'Indication: PaCO₂ ≥45 mmHg + symptoms. Excellent BiPAP response; improves mechanics dramatically.'),
]
for title, c, text in indications:
row = [[Paragraph(f'<b>{title}</b>', ParagraphStyle('it', fontName='Helvetica-Bold',
fontSize=10, textColor=C_WHITE)),
Paragraph(text, styles['body'])]]
t = Table(row, colWidths=[3*cm, PAGE_W - 2*MARGIN - 3.2*cm])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), c),
('BACKGROUND', (1,0), (1,-1), C_LIGHT_GREY),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#bdbdbd')),
]))
E.append(t)
E.append(Spacer(1, 3))
E.append(Spacer(1, 6))
E.append(section_header('EQUIPMENT & SETTINGS', styles, colors.HexColor('#37474f')))
equip_hdr = ['Component', 'Options/Details']
equip_rows = [
['Ventilator', 'Home BiPAP machines (ResMed AirCurve, Philips DreamStation); IPAP 12-30 cmH₂O, EPAP 4-8 cmH₂O, Backup RR 12-16/min'],
['Interface', 'Nasal mask (preferred for compliance) · Oronasal mask (mouth breathers) · Nasal pillows (mild cases)'],
['Humidifier', 'Heated pass-over humidifier — reduces nasal dryness and improves tolerance'],
['Monitoring', 'Home pulse oximetry; TcCO₂ where available; remote telemonitoring via built-in modems; Annual ABG'],
['Compliance', 'Target ≥4 hours/night; adherence data downloaded at each review'],
]
E.append(styled_table(equip_hdr, equip_rows,
[3.5*cm, PAGE_W - 2*MARGIN - 3.7*cm],
header_bg=colors.HexColor('#37474f')))
E.append(Spacer(1, 6))
E.append(section_header('CONTRAINDICATIONS', styles, C_ACCENT))
ci = ['Unable to protect airway (impaired cough, severe bulbar palsy) — relative CI',
'Uncooperative or confused patient — relative CI',
'Facial trauma, burns, or recent facial/upper GI surgery',
'Hemodynamic instability requiring urgent intubation',
'Copious uncontrolled secretions',
'High risk of aspiration with active upper GI bleeding']
for c in ci:
E.append(Paragraph(f'• {c}', styles['bullet']))
E.append(Spacer(1, 6))
E.append(key_box(
'BENEFITS OF HOME NIV: ↓ PaCO₂ & ↑ PaO₂ · Reduced hospitalisations and ICU admissions · '
'Improved sleep quality · Prolonged survival (NMD, severe COPD, CWD) · '
'Improved QoL scores · Cost-effective vs repeated hospital admissions.', styles, C_AMBER_LIGHT, C_AMBER))
E.append(PageBreak())
return E
def build_q5(styles, diag_img):
E = []
col = colors.HexColor('#c62828')
hdr = Table([[Paragraph('Q5. LIPOPROTEIN (a) [Lp(a)]', styles['q_title'])]],
colWidths=[PAGE_W - 2*MARGIN])
hdr.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), col),
('TOPPADDING', (0,0), (-1,-1), 12),
('BOTTOMPADDING', (0,0), (-1,-1), 12),
('ROUNDEDCORNERS', [6]),
]))
E.append(hdr)
E.append(Spacer(1, 8))
E.append(key_box('KEY CONCEPT: Lp(a) is the ONLY major cardiovascular risk factor that is '
'80-90% genetically determined (LPA gene, chr 6q27). It is NOT significantly '
'reducible by diet, lifestyle, or statins. It explains "residual risk" — '
'CVD events despite optimal LDL-lowering. Upper limit: <50 mg/dL or <125 nmol/L.', styles))
E.append(Spacer(1, 6))
E.append(diag_img)
E.append(Paragraph('Fig 5. Lp(a) structure and pathogenic mechanisms leading to cardiovascular disease', styles['caption']))
E.append(Spacer(1, 6))
E.append(section_header('STRUCTURE', styles, col))
struct_data = [
['ApoB-100', 'Main protein backbone — same as LDL; covalently linked to Apo(a) via disulfide bond'],
['Apo(a)', 'Unique to Lp(a); homologous to plasminogen; contains Kringle IV type 2 repeats (KIV-2).\nFewer repeats = smaller isoform = HIGHER plasma Lp(a) levels'],
['Lipid core', 'Cholesteryl esters + triglycerides (similar to LDL)'],
['Oxidized\nPhospholipids', 'OxPL associated with both ApoB and Apo(a); major mediator of inflammation and CAVS'],
]
E.append(styled_table(['Component', 'Role / Key Feature'], struct_data,
[3*cm, PAGE_W - 2*MARGIN - 3.2*cm], header_bg=col))
E.append(Spacer(1, 6))
E.append(section_header('PATHOPHYSIOLOGY — THREE MECHANISMS', styles, col))
mechs = [
('1. ATHEROGENESIS', '#283593',
'OxPL on Lp(a) → endothelial activation → macrophage foam cell formation → smooth muscle '
'cell proliferation → plaque growth and destabilisation. Lp(a)\'s small dense LDL-like core '
'penetrates arterial intima efficiently.'),
('2. THROMBOGENESIS', '#c62828',
'Apo(a) is structurally homologous to plasminogen → competes with plasminogen for fibrin-binding '
'sites → inhibits fibrinolysis (↓ tPA activity) → impaired clot lysis → net pro-thrombotic state.'),
('3. CALCIFIC AORTIC VALVE STENOSIS (CAVS)', '#e65100',
'OxPL carried by Lp(a) deposited on aortic valve leaflets → valvular inflammation + calcium deposition → '
'progressive CAVS. Mendelian randomisation confirms causality. 2x risk of CAVS with elevated Lp(a).'),
]
for title, c, text in mechs:
row = [[Paragraph(f'<b>{title}</b>', ParagraphStyle('mt', fontName='Helvetica-Bold',
fontSize=9, textColor=C_WHITE)),
Paragraph(text, styles['body'])]]
t = Table(row, colWidths=[3.5*cm, PAGE_W - 2*MARGIN - 3.7*cm])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), colors.HexColor(c)),
('BACKGROUND', (1,0), (1,-1), C_LIGHT_GREY),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#bdbdbd')),
]))
E.append(t)
E.append(Spacer(1, 3))
E.append(Spacer(1, 6))
E.append(section_header('MEASUREMENT & WHEN TO TEST', styles, colors.HexColor('#37474f')))
E.append(Paragraph(
'Method: Immunonephelometry, immunoturbidimetry, or ELISA. Report in <b>nmol/L preferred</b> '
'(isoform-independent). One measurement in lifetime is sufficient (genetically stable). '
'Normal: <50 mg/dL or <125 nmol/L. ~20% of world population has elevated levels.', styles['body']))
E.append(Spacer(1, 4))
test_indications = [
'Premature ASCVD (<55 years M, <65 years F)',
'Family history of premature CVD or elevated Lp(a)',
'Recurrent ASCVD events DESPITE optimal LDL-lowering',
'Familial Hypercholesterolaemia (FH)',
'Intermediate CV risk — to reclassify for therapy intensity',
'Calcific aortic valve stenosis',
]
for ti in test_indications:
E.append(Paragraph(f'• {ti}', styles['bullet']))
E.append(Spacer(1, 6))
E.append(section_header('TREATMENT OF ELEVATED Lp(a)', styles, col))
treat_hdr = ['Treatment', 'Mechanism', 'Lp(a) Reduction', 'Notes']
treat_rows = [
['PCSK9 inhibitors\n(Evolocumab/Alirocumab)', 'Indirect — unknown exact mechanism', '20-30%', 'Secondary benefit; CV outcomes proven'],
['Niacin (Nicotinic acid)', '↓ Hepatic Lp(a) production', '20-30%', 'Abandoned — no CV outcome benefit (AIM-HIGH, HPS2-THRIVE); side effects'],
['Lipoprotein Apheresis', 'Directly removes Lp(a) from plasma', '>60% per session', 'Specialised centres; fortnightly; for Lp(a)>60+progressive ASCVD'],
['Pelacarsen (TQJ230)\nPhase 3', 'GalNAc-ASO → degrades LPA mRNA in liver', '80-90%', 'Lp(a)HORIZON trial; results 2025-26'],
['Olpasiran\nPhase 3', 'GalNAc-siRNA → RNAi silences LPA mRNA', '80-95%', 'OCEAN(a) trial ~7000 pts; results 2026-27'],
['Muvalaplin\nPhase 2', 'Small oral molecule → blocks Apo(a)-ApoB interaction', '65-85%', 'First oral Lp(a) inhibitor; JAMA 2023'],
]
E.append(styled_table(treat_hdr, treat_rows,
[3.3*cm, 4*cm, 2.5*cm, PAGE_W - 2*MARGIN - 10.0*cm],
header_bg=col))
E.append(Spacer(1, 8))
E.append(key_box(
'CLINICAL PEARLS: (1) Lp(a) is the most important genetically fixed CV risk factor. '
'(2) Statins do NOT lower Lp(a) — may mildly increase levels. '
'(3) RNA-targeted therapies (pelacarsen, olpasiran) reduce Lp(a) by >80-90%. '
'(4) Phase 3 trials will determine if Lp(a) lowering translates to CV event reduction. '
'(5) Lp(a) explains premature ASCVD in FH patients despite good LDL control.', styles, C_AMBER_LIGHT, C_AMBER))
return E
# ══════════════════════════════════════════════
# MAIN BUILD
# ══════════════════════════════════════════════
def build_pdf(output_path):
doc = SimpleDocTemplate(
output_path,
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=MARGIN, bottomMargin=MARGIN,
title='MD General Medicine Paper IV — Study Guide',
author='Orris AI Study Assistant',
subject='Artificial Blood, Obesity, Lipid-Lowering, Domiciliary NIV, Lipoprotein(a)',
)
styles = make_styles()
print('Generating diagrams...')
fig1 = diag_artificial_blood()
img1 = mpl_to_rl(fig1, 14.5, 7.5)
fig2 = diag_obesity()
img2 = mpl_to_rl(fig2, 14.5, 7.5)
fig3 = diag_injectable_lipid()
img3 = mpl_to_rl(fig3, 14.5, 7.5)
fig4 = diag_niv()
img4 = mpl_to_rl(fig4, 14.5, 7.5)
fig5 = diag_lpa()
img5 = mpl_to_rl(fig5, 14.5, 7.5)
print('Building PDF sections...')
elements = []
elements += cover_page(styles)
elements += build_q1(styles, img1)
elements += build_q2(styles, img2)
elements += build_q3(styles, img3)
elements += build_q4(styles, img4)
elements += build_q5(styles, img5)
print('Writing PDF...')
doc.build(elements)
print(f'PDF saved to: {output_path}')
if __name__ == '__main__':
build_pdf('/tmp/workspace/study-guide/MD_GeneralMedicine_StudyGuide.pdf')
cd /tmp/workspace/study-guide && python generate_pdf.py 2>&1
ls -lh /tmp/workspace/study-guide/MD_GeneralMedicine_StudyGuide.pdf
MD GeneralMedicine StudyGuide
PDF Document · PDF
Make similar pdf for this paper
theories of ageing telomere free radical mitochondrial inflammaging organ changes prevention interventions
cutaneous manifestations systemic disorders skin findings diabetes liver disease cardiac renal SLE 2024 review
Is the pdf made?
ls -lh /tmp/workspace/study-guide/
~/study-guide/generate_paper1.py
#!/usr/bin/env python3
"""
MD General Medicine Paper I (MDRSA-17) - Study Guide PDF
Q1: Theories of Ageing + Organ Changes + Prevention
Q2: Cutaneous Manifestations of Systemic Disorders
Q3 Short Notes: Lymphatic Drainage of Lungs / Arterial Supply of Brain / Stem Cell Therapy
Q4 Short Notes: ECMO / Heat Stroke / Targeted Therapy
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, KeepTogether
)
from reportlab.platypus.flowables import Flowable
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import Image as RLImage
import io, numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyBboxPatch
PAGE_W, PAGE_H = A4
MARGIN = 1.8 * cm
# ── PALETTE ──────────────────────────────────
C_DARK = colors.HexColor('#1a237e')
C_MED = colors.HexColor('#283593')
C_LIGHT = colors.HexColor('#e8eaf6')
C_TEAL = colors.HexColor('#00695c')
C_TEAL_L = colors.HexColor('#e0f2f1')
C_AMBER = colors.HexColor('#f57f17')
C_AMB_L = colors.HexColor('#fff8e1')
C_RED = colors.HexColor('#b71c1c')
C_RED_L = colors.HexColor('#ffebee')
C_PURPLE = colors.HexColor('#6a1b9a')
C_PURP_L = colors.HexColor('#f3e5f5')
C_ORANGE = colors.HexColor('#e65100')
C_ORG_L = colors.HexColor('#fff3e0')
C_GREEN = colors.HexColor('#2e7d32')
C_GREEN_L = colors.HexColor('#e8f5e9')
C_GREY = colors.HexColor('#424242')
C_LGREY = colors.HexColor('#f5f5f5')
C_WHITE = colors.white
# ── STYLES ───────────────────────────────────
def make_styles():
s = {}
s['q_title'] = ParagraphStyle('q_title', fontName='Helvetica-Bold',
fontSize=17, textColor=C_WHITE, alignment=TA_CENTER, leading=24)
s['cover_title'] = ParagraphStyle('cover_title', fontName='Helvetica-Bold',
fontSize=26, textColor=C_WHITE, alignment=TA_CENTER, leading=34)
s['cover_sub'] = ParagraphStyle('cover_sub', fontName='Helvetica',
fontSize=13, textColor=C_LIGHT, alignment=TA_CENTER, leading=18)
s['section'] = ParagraphStyle('section', fontName='Helvetica-Bold',
fontSize=12, textColor=C_DARK, spaceBefore=8, spaceAfter=3, leading=16)
s['subsec'] = ParagraphStyle('subsec', fontName='Helvetica-Bold',
fontSize=10.5, textColor=C_MED, spaceBefore=5, spaceAfter=2, leading=14)
s['body'] = ParagraphStyle('body', fontName='Helvetica',
fontSize=9.5, textColor=C_GREY, spaceBefore=2, spaceAfter=2,
leading=14, alignment=TA_JUSTIFY)
s['bullet'] = ParagraphStyle('bullet', fontName='Helvetica',
fontSize=9.5, textColor=C_GREY, spaceBefore=1, spaceAfter=1,
leading=13, leftIndent=14)
s['key'] = ParagraphStyle('key', fontName='Helvetica-BoldOblique',
fontSize=9.5, textColor=C_TEAL, spaceBefore=2, spaceAfter=2,
leading=13, leftIndent=8)
s['caption'] = ParagraphStyle('caption', fontName='Helvetica-Oblique',
fontSize=8.5, textColor=C_GREY, alignment=TA_CENTER,
spaceBefore=2, spaceAfter=6)
s['toc_e'] = ParagraphStyle('toc_e', fontName='Helvetica',
fontSize=11, textColor=C_DARK, spaceBefore=4, spaceAfter=4, leading=16)
return s
# ── HELPERS ──────────────────────────────────
class ColorBand(Flowable):
def __init__(self, text, bg=C_DARK, fg=C_WHITE, height=1.0*cm, font_size=12):
super().__init__()
self.text, self.bg, self.fg = text, bg, fg
self.height, self.font_size = height, font_size
self.width = PAGE_W - 2*MARGIN
def draw(self):
c = self.canv
c.setFillColor(self.bg)
c.roundRect(0, 0, self.width, self.height, 5, fill=1, stroke=0)
c.setFillColor(self.fg)
c.setFont('Helvetica-Bold', self.font_size)
c.drawCentredString(self.width/2, self.height/2 - self.font_size*0.35, self.text)
def wrap(self, aw, ah): return self.width, self.height
def sec_hdr(text, styles, color=C_DARK):
return KeepTogether([ColorBand(text, bg=color, height=0.95*cm, font_size=11), Spacer(1,4)])
def key_box(text, styles, bg=C_TEAL_L, border=C_TEAL):
t = Table([[Paragraph(text, styles['key'])]], colWidths=[PAGE_W-2*MARGIN])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1),bg),
('BOX',(0,0),(-1,-1),1,border),
('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),
('LEFTPADDING',(0,0),(-1,-1),10),('RIGHTPADDING',(0,0),(-1,-1),10),
]))
return t
def stbl(header, rows, cw, hbg=C_DARK, hfg=C_WHITE, alt=C_LGREY):
data = [header]+rows
t = Table(data, colWidths=cw, repeatRows=1)
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),hbg),('TEXTCOLOR',(0,0),(-1,0),hfg),
('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),('FONTNAME',(0,1),(-1,-1),'Helvetica'),
('FONTSIZE',(0,0),(-1,-1),9),('TEXTCOLOR',(0,1),(-1,-1),C_GREY),
('ROWBACKGROUNDS',(0,1),(-1,-1),[C_WHITE,alt]),
('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#bdbdbd')),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),6),('RIGHTPADDING',(0,0),(-1,-1),6),
('WORDWRAP',(0,0),(-1,-1),1),
]))
return t
def mpl_img(fig, w=14.5, h=8):
buf = io.BytesIO()
fig.savefig(buf, format='png', dpi=150, bbox_inches='tight',
facecolor=fig.get_facecolor())
buf.seek(0); plt.close(fig)
return RLImage(buf, width=w*cm, height=h*cm)
def rbox(ax, x, y, w, h, text, fc, ec='white', fs=8.5, tc='white', bold=False):
rx = FancyBboxPatch((x-w/2, y-h/2), w, h,
boxstyle="round,pad=0.13", fc=fc, ec=ec, lw=1.4)
ax.add_patch(rx)
ax.text(x, y, text, ha='center', va='center', fontsize=fs,
color=tc, fontweight='bold' if bold else 'normal',
multialignment='center')
def arr(ax, x1, y1, x2, y2, col='#666', lw=1.4):
ax.annotate('', xy=(x2,y2), xytext=(x1,y1),
arrowprops=dict(arrowstyle='->', color=col, lw=lw))
# ══════════════════════════════════════════════
# DIAGRAMS
# ══════════════════════════════════════════════
def diag_ageing():
fig, axes = plt.subplots(1, 2, figsize=(13, 6), facecolor='#fafafa')
# LEFT: Theories web
ax = axes[0]
ax.set_xlim(0,10); ax.set_ylim(0,10); ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('Theories of Ageing', fontsize=11, fontweight='bold', color='#1a237e', pad=8)
rbox(ax, 5, 5.2, 3, 0.9, 'AGEING\n(Hallmarks)', '#1a237e', fs=10, bold=True)
theories = [
(5, 8.6, 3.5, 0.85, 'Telomere Shortening Theory\n(Hayflick limit; loss of telomerase → senescence)', '#283593'),
(1.5, 7.0, 3.2, 0.9, 'Free Radical / Oxidative\nStress Theory (Harman 1956)\nROS → mtDNA & protein damage', '#c62828'),
(1.5, 4.0, 3.2, 0.9, 'Mitochondrial Theory\nETC → ROS → mtDNA\nmutations → ↓ ATP', '#e65100'),
(1.5, 1.5, 3.2, 0.9, 'Cross-Linking Theory\nGlycation (AGEs) of\ncollagen/proteins', '#6a1b9a'),
(8.5, 7.0, 3.2, 0.9, 'Neuroendocrine Theory\n↓ GH, IGF-1, sex hormones\n→ organ atrophy', '#00695c'),
(8.5, 4.0, 3.2, 0.9, 'Inflammaging Theory\nChronic low-grade\ninflammation → NF-kB', '#f57f17'),
(8.5, 1.5, 3.2, 0.9, 'Wear & Tear /\nError Catastrophe\nAccumulated DNA damage', '#37474f'),
(5, 1.5, 3.2, 0.9, 'Immunological Theory\nImmune senescence\n↓ T-cell function', '#00838f'),
]
for x, y, w, h, t, c in theories:
rbox(ax, x, y, w, h, t, c, fs=7)
ax.plot([5, x], [5.2, y], color='#ccc', lw=0.9, zorder=0)
# RIGHT: Organ changes + interventions
ax2 = axes[1]
ax2.set_xlim(0,10); ax2.set_ylim(0,10); ax2.axis('off')
ax2.set_facecolor('#fafafa')
ax2.set_title('Organ Changes & Prevention', fontsize=11, fontweight='bold', color='#1a237e', pad=8)
organ_data = [
('Cardiovascular', '#c62828', '↓ CO, ↑ arterial stiffness\nMyocardial hypertrophy'),
('Respiratory', '#1565c0', '↓ FEV1/FVC, ↑ RV\n↓ ciliary action, ↑ risk infection'),
('Renal', '#6a1b9a', '↓ GFR ~1%/yr after 40\n↓ concentrating ability'),
('Neurological', '#00695c', '↓ neurons, ↓ synaptic plasticity\n↓ myelin, ↓ dopamine'),
('Musculoskeletal', '#e65100', 'Sarcopenia, ↓ BMD\nOsteoporosis, kyphosis'),
('Endocrine', '#00838f', '↓ GH, IGF-1, DHEA\nInsulin resistance ↑'),
('Immune', '#37474f', 'Thymic involution\n↑ autoimmunity, ↓ vaccines response'),
]
y_start = 9.0
for organ, c, change in organ_data:
rbox(ax2, 2.5, y_start, 4.2, 0.72, f'{organ}\n{change}', c, fs=7)
y_start -= 1.2
# Prevention column
prev = [
('Caloric Restriction', '#2e7d32'),
('Exercise (aerobic + resistance)', '#2e7d32'),
('Metformin / Rapamycin', '#00695c'),
('Antioxidants (Vit C, E)', '#00695c'),
('Senolytics (dasatinib + quercetin)', '#1a237e'),
('Telomerase activators (TA-65)', '#283593'),
('Hormone replacement (select)', '#6a1b9a'),
('Good sleep / stress reduction', '#37474f'),
]
y_p = 9.0
ax2.text(7.5, 9.7, 'Interventions', ha='center', fontsize=9.5,
fontweight='bold', color='#1a237e')
for txt, c in prev:
rbox(ax2, 7.5, y_p, 4.5, 0.55, txt, c, fs=7.5)
y_p -= 1.1
plt.tight_layout(pad=1.5)
return fig
def diag_cutaneous():
fig, ax = plt.subplots(figsize=(13, 7), facecolor='#fafafa')
ax.set_xlim(0,12); ax.set_ylim(0,11); ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('Cutaneous Manifestations of Systemic Disorders', fontsize=12,
fontweight='bold', color='#1a237e', pad=10)
# Central box
rbox(ax, 6, 5.5, 3.2, 0.95, 'SKIN AS\n"WINDOW" TO\nSYSTEMIC DISEASE', '#1a237e', fs=9.5, bold=True)
systems = [
# (x, y, title, color, features)
(2.0, 9.5, 3.8, 1.5, 'DIABETES MELLITUS', '#c62828',
'Acanthosis nigricans · Necrobiosis lipoidica\nDiabetic dermopathy · Bullosis diabeticorum\nCandidosis · Neuropathic ulcers'),
(6.0, 9.5, 3.8, 1.5, 'LIVER DISEASE', '#e65100',
'Jaundice · Spider angiomas · Palmar erythema\nCaput medusae · Terry nails · Leukonychia\nPruritus · Dupuytren contracture'),
(10.0, 9.5, 3.8, 1.5, 'RENAL DISEASE', '#6a1b9a',
'Pruritus · Pallor (anaemia)\nHalf-and-half nails (Lindsay)\nCalciphylaxis · Xerosis · Frost'),
(2.0, 5.5, 3.8, 1.5, 'SLE / CONNECTIVE TISSUE', '#1565c0',
'Malar (butterfly) rash · Discoid lupus\nPhotosensitivity · Vasculitis · Alopecia\nRaynaud · Oral ulcers (SLICC criteria)'),
(10.0, 5.5, 3.8, 1.5, 'THYROID DISEASE', '#00695c',
'Hypothyroid: Myxoedema, coarse dry skin\nHair loss, macroglossia, non-pitting oedema\nHyperthyroid: Pretibial myxoedema (Graves)\nOnycholysis (Plummer nail), hyperhidrosis'),
(2.0, 1.5, 3.8, 1.5, 'CARDIAC DISEASE', '#283593',
'Cyanosis · Clubbing (endocarditis, cyanotic CHD)\nOsler nodes · Janeway lesions (infective endo)\nSplinter haemorrhages · Xanthelasma'),
(6.0, 1.5, 3.8, 1.5, 'MALIGNANCY', '#37474f',
'Acanthosis nigricans (gastric Ca)\nDermatomyositis · Leser-Trelat sign\nSweet syndrome · Erythema gyratum repens\nNecrolytic migratory erythema (glucagonoma)'),
(10.0, 1.5, 3.8, 1.5, 'SARCOIDOSIS / IBD', '#00838f',
'Sarcoid: Lupus pernio, erythema nodosum\nPapules, plaques, scar infiltration\nIBD: Pyoderma gangrenosum\nErythema nodosum · Aphthous ulcers'),
]
for x, y, w, h, title, c, feats in systems:
# Title bar
rbox(ax, x, y+0.35, w, 0.62, title, c, fs=8.5, bold=True)
# Feature box
feat_patch = FancyBboxPatch((x-w/2, y-h/2+0.35), w, h-0.62,
boxstyle="round,pad=0.08",
fc='#f5f5f5', ec=c, lw=1.2)
ax.add_patch(feat_patch)
ax.text(x, y-0.5, feats, ha='center', va='center',
fontsize=7, color='#333', multialignment='center')
# Arrow to centre
ax.plot([x, 6], [y, 5.5], color='#ccc', lw=0.8, zorder=0)
plt.tight_layout(pad=1.2)
return fig
def diag_lymph_brain():
fig, axes = plt.subplots(1, 2, figsize=(13, 6.5), facecolor='#fafafa')
# LEFT: Lymphatic drainage of lungs
ax = axes[0]
ax.set_xlim(0,10); ax.set_ylim(0,10); ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('Lymphatic Drainage of the Lungs', fontsize=11, fontweight='bold',
color='#1a237e', pad=8)
# Lung outline (simplified)
from matplotlib.patches import Ellipse
l_lung = Ellipse((3, 5), 4, 7, fc='#e3f2fd', ec='#1565c0', lw=2)
r_lung = Ellipse((7, 5), 4, 7, fc='#e8f5e9', ec='#2e7d32', lw=2)
ax.add_patch(l_lung); ax.add_patch(r_lung)
ax.text(3, 5, 'LEFT\nLUNG', ha='center', va='center', fontsize=9,
color='#1565c0', fontweight='bold')
ax.text(7, 5, 'RIGHT\nLUNG', ha='center', va='center', fontsize=9,
color='#2e7d32', fontweight='bold')
# Nodes
nodes = [
(5, 8.2, 1.8, 0.55, 'Subpleural plexus\n(visceral pleura)', '#00695c'),
(5, 7.0, 1.8, 0.55, 'Peribronchial /\nPerivascular plexus', '#00695c'),
(5, 5.8, 1.8, 0.55, 'Pulmonary nodes\n(intrapulmonary)', '#283593'),
(5, 4.6, 1.8, 0.55, 'Bronchopulmonary\n(hilar) nodes', '#283593'),
(5, 3.4, 1.8, 0.55, 'Tracheobronchial\nnodes (carinal)', '#1a237e'),
(5, 2.2, 1.8, 0.55, 'Paratracheal nodes\n→ Bronchomediastinal trunk', '#1a237e'),
(5, 1.0, 1.8, 0.55, 'Right: Right lymphatic duct\nLeft: Thoracic duct → SVC', '#c62828'),
]
for x, y, w, h, t, c in nodes:
rbox(ax, x, y, w, h, t, c, fs=7)
for i in range(len(nodes)-1):
arr(ax, nodes[i][0], nodes[i][1]-0.28, nodes[i+1][0], nodes[i+1][1]+0.28, '#888')
ax.text(0.5, 9.5,
'Superficial (subpleural)\n→ Deep (peribronchial)\n→ Hilum\n→ Mediastinum\n→ Venous angles',
fontsize=7.5, color='#333', va='top',
bbox=dict(boxstyle='round', fc='#fff8e1', ec='#f57f17', alpha=0.9))
# RIGHT: Arterial supply of brain
ax2 = axes[1]
ax2.set_xlim(0,10); ax2.set_ylim(0,10); ax2.axis('off')
ax2.set_facecolor('#fafafa')
ax2.set_title('Arterial Supply of the Brain', fontsize=11, fontweight='bold',
color='#1a237e', pad=8)
# Two main sources
rbox(ax2, 2.5, 9.2, 4, 0.7, 'Internal Carotid Arteries\n(Anterior circulation)', '#c62828', fs=8.5, bold=True)
rbox(ax2, 7.5, 9.2, 4, 0.7, 'Vertebral Arteries\n(Posterior circulation)', '#1565c0', fs=8.5, bold=True)
# ICA branches
ica_b = [
(2, 7.7, 3.5, 0.65, 'Ophthalmic artery\n(retina, orbit)', '#e53935'),
(2, 6.8, 3.5, 0.65, 'Posterior communicating\nartery (PComm)', '#e53935'),
(2, 5.9, 3.5, 0.65, 'Anterior choroidal artery\n(optic tract, internal capsule)', '#e53935'),
(2, 5.0, 3.5, 0.65, 'ACA (Ant. cerebral a.)\n→ Medial frontal/parietal', '#c62828'),
(2, 4.1, 3.5, 0.65, 'MCA (Mid. cerebral a.)\n→ Lateral cortex + basal ganglia', '#c62828'),
]
for x, y, w, h, t, c in ica_b:
rbox(ax2, x, y, w, h, t, c, fs=7)
arr(ax2, 2.5, 8.85, x, y+0.33, '#c62828')
# VA branches
va_b = [
(8, 7.7, 3.5, 0.65, 'PICA (Post. inf. cerebellar)\n→ Lateral medulla, cerebellum', '#1976d2'),
(8, 6.8, 3.5, 0.65, 'Basilar artery\n(from bilateral VA union)', '#1565c0'),
(8, 5.9, 3.5, 0.65, 'AICA (Ant. inf. cerebellar)\n→ Pons, lateral medulla', '#1565c0'),
(8, 5.0, 3.5, 0.65, 'SCA (Superior cerebellar)\n→ Superior cerebellum', '#1565c0'),
(8, 4.1, 3.5, 0.65, 'PCA (Post. cerebral a.)\n→ Occipital lobe, thalamus', '#0d47a1'),
]
for x, y, w, h, t, c in va_b:
rbox(ax2, x, y, w, h, t, c, fs=7)
arr(ax2, 7.5, 8.85, x, y+0.33, '#1565c0')
# Circle of Willis
rbox(ax2, 5, 3.0, 4.5, 0.85,
'Circle of Willis\nAComm (ACA-ACA) · PComm (ICA-PCA)\n= Anastomotic ring at base of brain',
'#6a1b9a', fs=8)
arr(ax2, 2, 3.75, 5, 3.4, '#6a1b9a', lw=1.8)
arr(ax2, 8, 3.75, 5, 3.4, '#6a1b9a', lw=1.8)
rbox(ax2, 5, 1.8, 7, 0.65,
'Clinical: ICA occlusion → contralateral hemiplegia (MCA)\nVA/Basilar occlusion → "crossed" deficits, cerebellar signs',
'#37474f', fs=7.5)
plt.tight_layout(pad=1.5)
return fig
def diag_stemcell_ecmo():
fig, axes = plt.subplots(1, 2, figsize=(13, 6.5), facecolor='#fafafa')
# LEFT: Stem cell therapy
ax = axes[0]
ax.set_xlim(0,10); ax.set_ylim(0,10); ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('Stem Cell Therapy', fontsize=11, fontweight='bold', color='#1a237e', pad=8)
rbox(ax, 5, 9.3, 7, 0.75, 'STEM CELLS — Self-renewal + Multipotent/Pluripotent differentiation', '#1a237e', fs=9, bold=True)
types = [
(2, 7.8, 3.5, 1.0, 'Embryonic SC\n(ESC)\nPluripotent; ethically\ncontroversial', '#c62828'),
(5, 7.8, 3.5, 1.0, 'Induced Pluripotent\n(iPSC) — Yamanaka factors\n(Oct4, Sox2, Klf4, c-Myc)', '#6a1b9a'),
(8, 7.8, 3.5, 1.0, 'Adult / Somatic SC\nHSC, MSC, NSC, CSC\nMultipotent', '#00695c'),
]
for x, y, w, h, t, c in types:
rbox(ax, x, y, w, h, t, c, fs=7.5)
arr(ax, 5, 8.93, x, y+0.5, '#888')
rbox(ax, 5, 6.4, 8.5, 0.75,
'Sources: Bone marrow · Cord blood · Peripheral blood (mobilised) · Adipose tissue · Placenta',
'#37474f', fs=8)
# Clinical applications
apps = [
(1.5, 5.0, 2.6, 0.85, 'Haematological\nMalignancies\nALL, AML, CML, MDS\nMyeloma, Lymphoma', '#c62828'),
(4.0, 5.0, 2.6, 0.85, 'Aplastic Anaemia\nHSC transplant\n= curative; match\nwith sibling/MUD', '#283593'),
(6.5, 5.0, 2.6, 0.85, 'Congenital\nDisorders\nSickle cell, Thal.\nSCID, Fanconi', '#6a1b9a'),
(9.0, 5.0, 2.6, 0.85, 'Emerging\nMyocardial infarct\nDiabetes (beta)\nParkinson, MS', '#00695c'),
]
arr(ax, 5, 6.03, 5, 5.5, '#888')
for x, y, w, h, t, c in apps:
rbox(ax, x, y, w, h, t, c, fs=7)
# Procedure types
rbox(ax, 3.2, 3.4, 5.5, 0.75, 'TYPES OF TRANSPLANT', '#1a237e', fs=9, bold=True)
trans = [
(1.8, 2.3, 2.8, 0.85, 'Autologous\n(Self → Self)\nNo GvHD; ↑ relapse', '#e65100'),
(5.0, 2.3, 2.8, 0.85, 'Allogeneic\n(Donor → Patient)\nGvL effect; GvHD risk', '#c62828'),
(8.2, 2.3, 2.8, 0.85, 'Syngeneic\n(Identical twin)\nNo GvHD; no GvL', '#283593'),
]
for x, y, w, h, t, c in trans:
rbox(ax, x, y, w, h, t, c, fs=7.5)
arr(ax, 5, 3.03, x, y+0.43, '#888')
rbox(ax, 5, 1.2, 9, 0.7,
'Complications: GvHD (acute/chronic) · Graft failure · Infections · VOD · Secondary malignancy',
'#37474f', fs=7.5)
# RIGHT: ECMO
ax2 = axes[1]
ax2.set_xlim(0,10); ax2.set_ylim(0,10); ax2.axis('off')
ax2.set_facecolor('#fafafa')
ax2.set_title('ECMO — Extracorporeal Membrane Oxygenation', fontsize=10,
fontweight='bold', color='#1a237e', pad=8)
rbox(ax2, 5, 9.3, 8.5, 0.75,
'ECMO: Diverts blood through external artificial lung → oxygenation + CO₂ removal',
'#1a237e', fs=8.5, bold=True)
# Two types
rbox(ax2, 2.5, 8.0, 4, 0.85, 'VV-ECMO\n(Veno-Venous)\nRespiratory support only\nVA: femoral/jugular', '#00695c', fs=8)
rbox(ax2, 7.5, 8.0, 4, 0.85, 'VA-ECMO\n(Veno-Arterial)\nCardiac + Respiratory\nVA: femoral a & v', '#c62828', fs=8)
arr(ax2, 5, 8.93, 2.5, 8.43, '#888')
arr(ax2, 5, 8.93, 7.5, 8.43, '#888')
# Indications
rbox(ax2, 5, 6.7, 8.5, 0.6, 'INDICATIONS', '#283593', fs=9.5, bold=True)
ind_vv = [
'ARDS (P/F <80 or pH <7.25)',
'Severe pneumonia (viral/bacterial)',
'Status asthmaticus',
'Bridge to lung transplant',
]
ind_va = [
'Refractory cardiogenic shock',
'Massive PE + haemodynamic collapse',
'Refractory cardiac arrest (ECPR)',
'Post-cardiac surgery low output',
]
y_v = 6.1
ax2.text(2.5, 6.4, 'VV-ECMO Indications', ha='center', fontsize=8.5,
fontweight='bold', color='#00695c')
ax2.text(7.5, 6.4, 'VA-ECMO Indications', ha='center', fontsize=8.5,
fontweight='bold', color='#c62828')
for i_vv, i_va in zip(ind_vv, ind_va):
ax2.text(2.5, y_v, f'• {i_vv}', ha='center', va='top', fontsize=7.5, color='#333')
ax2.text(7.5, y_v, f'• {i_va}', ha='center', va='top', fontsize=7.5, color='#333')
y_v -= 0.45
# Circuit
rbox(ax2, 5, 4.0, 8.5, 0.6, 'ECMO CIRCUIT', '#6a1b9a', fs=9.5, bold=True)
circuit = [
(1.5, 3.0, 2.5, 0.65, 'Drainage\ncannula\n(venous blood out)', '#455a64'),
(4.0, 3.0, 2.5, 0.65, 'Centrifugal\npump\n(blood flow driver)', '#455a64'),
(6.5, 3.0, 2.5, 0.65, 'Oxygenator\n(gas exchange\nO₂ in, CO₂ out)', '#00695c'),
(9.0, 3.0, 2.5, 0.65, 'Return\ncannula\n(oxygenated blood)', '#c62828'),
]
for x, y, w, h, t, c in circuit:
rbox(ax2, x, y, w, h, t, c, fs=7)
for i in range(len(circuit)-1):
arr(ax2, circuit[i][0]+1.25, circuit[i][1], circuit[i+1][0]-1.25, circuit[i+1][1])
# Complications
rbox(ax2, 5, 1.8, 8.5, 0.6, 'COMPLICATIONS', '#c62828', fs=9, bold=True)
comps = ['Bleeding (anticoagulation)', 'Thromboembolism', 'Limb ischaemia (VA)',
'Infection/sepsis', 'Neurological (stroke)', 'Circuit failure']
comp_text = ' · '.join(comps)
ax2.text(5, 1.45, comp_text, ha='center', va='top', fontsize=7.5, color='#555',
wrap=True)
rbox(ax2, 5, 0.7, 8.5, 0.5,
'Monitoring: ACT 180-220s (anticoag) · Flow 3-6 L/min · FiO₂ sweep gas · Daily CXR/echo',
'#37474f', fs=7.5)
plt.tight_layout(pad=1.5)
return fig
def diag_heat_targeted():
fig, axes = plt.subplots(1, 2, figsize=(13, 6.5), facecolor='#fafafa')
# LEFT: Heat stroke
ax = axes[0]
ax.set_xlim(0,10); ax.set_ylim(0,10); ax.axis('off')
ax.set_facecolor('#fafafa')
ax.set_title('Heat Stroke', fontsize=11, fontweight='bold', color='#1a237e', pad=8)
rbox(ax, 5, 9.4, 8.5, 0.75,
'Heat Stroke: Core body temp >40°C + CNS dysfunction\n(confusion, seizures, coma) — Medical Emergency',
'#c62828', fs=8.5, bold=True)
rbox(ax, 2.5, 8.2, 4, 0.75, 'CLASSIC Heat Stroke\nElderly, chronic illness\nPassive exposure; hot weather\n↓ sweating capacity', '#e65100', fs=7.5)
rbox(ax, 7.5, 8.2, 4, 0.75, 'EXERTIONAL Heat Stroke\nYoung athletes/military\nStrenuous physical activity\nHyperthermia + sweating', '#c62828', fs=7.5)
arr(ax, 5, 9.03, 2.5, 8.58, '#888')
arr(ax, 5, 9.03, 7.5, 8.58, '#888')
rbox(ax, 5, 7.1, 8.5, 0.65, 'PATHOPHYSIOLOGY', '#283593', fs=9.5, bold=True)
ax.text(5, 6.8, 'Hyperthermia → Cytokine storm → Endothelial injury → MODS\n'
'Rhabdomyolysis → AKI · Coagulopathy (DIC) · Cerebral oedema · Hepatocellular injury',
ha='center', va='top', fontsize=8, color='#333')
rbox(ax, 5, 5.9, 8.5, 0.6, 'CLINICAL FEATURES', '#1a237e', fs=9, bold=True)
features = [
('CNS', '#c62828', 'Confusion, delirium, seizures, coma, cerebellar signs'),
('CVS', '#1565c0', 'Tachycardia, hypotension, arrhythmia, cardiac failure'),
('Renal', '#6a1b9a', 'Oliguria, AKI (rhabdomyolysis + DIC), haematuria'),
('Resp', '#00695c', 'Tachypnoea, ARDS (in severe cases)'),
('Labs', '#37474f', 'CK ↑↑, LFT ↑, coags abnormal, Na+ deranged, lactate ↑'),
]
y_f = 5.35
for sys, c, feat in features:
row_data = [[Paragraph(f'<b>{sys}</b>', ParagraphStyle('x',fontName='Helvetica-Bold',fontSize=8,textColor=colors.white)),
Paragraph(feat, ParagraphStyle('x2',fontName='Helvetica',fontSize=7.5))]]
rbox(ax, 1.5, y_f, 2.0, 0.5, sys, c, fs=8, bold=True)
ax.text(5, y_f, feat, ha='center', va='center', fontsize=7.5, color='#333')
y_f -= 0.62
rbox(ax, 5, 2.9, 8.5, 0.65, 'MANAGEMENT — COOL FIRST, TRANSPORT SECOND', '#c62828', fs=9, bold=True)
mgmt = [
(2.0, 1.9, 3.5, 0.75, 'Cooling (PRIORITY)\nIce packs (neck, axilla, groin)\nEvaporative cooling (fan + mist)\nTarget <39°C within 30 min', '#1565c0'),
(5.5, 1.9, 3.5, 0.75, 'Supportive Care\nIV fluids (cold NS)\nBenzodiazepines (seizures)\nNo antipyretics (ineffective)', '#00695c'),
(9.0, 1.9, 3.5, 0.75, 'ICU\nMonitor core temp\nRRT if AKI\nFFP/platelets (DIC)\nOrgan support', '#6a1b9a'),
]
arr(ax, 5, 2.58, 2.0, 2.28, '#888')
arr(ax, 5, 2.58, 5.5, 2.28, '#888')
arr(ax, 5, 2.58, 9.0, 2.28, '#888')
for x, y, w, h, t, c in mgmt:
rbox(ax, x, y, w, h, t, c, fs=7)
rbox(ax, 5, 0.8, 8.5, 0.55,
'Prevention: Acclimatisation · Adequate hydration · Avoid peak heat hours · Remove from hot environment promptly',
'#37474f', fs=7.5)
# RIGHT: Targeted therapy
ax2 = axes[1]
ax2.set_xlim(0,10); ax2.set_ylim(0,10); ax2.axis('off')
ax2.set_facecolor('#fafafa')
ax2.set_title('Targeted Therapy in Cancer', fontsize=11,
fontweight='bold', color='#1a237e', pad=8)
rbox(ax2, 5, 9.4, 8.5, 0.75,
'Targeted Therapy: Drugs that specifically target molecular aberrations\nin cancer cells — sparing normal cells (cf. cytotoxic chemotherapy)',
'#1a237e', fs=8, bold=True)
classes = [
(2.0, 7.8, 3.8, 1.1, 'Tyrosine Kinase\nInhibitors (TKIs)\nimatinib (CML/c-kit)\ngefitinib (NSCLC-EGFR)\nsunitinib (RCC)', '#c62828'),
(6.0, 7.8, 3.8, 1.1, 'Monoclonal Antibodies\ntrastuzumab (HER2+ Ca)\nbevacizumab (anti-VEGF)\ncetuximab (EGFR)\nrituximab (CD20)', '#283593'),
(2.0, 6.1, 3.8, 1.1, 'mTOR Inhibitors\neverolimus, temsirolimus\nRCC, neuroendocrine tumours\nMantle cell lymphoma', '#00695c'),
(6.0, 6.1, 3.8, 1.1, 'CDK 4/6 Inhibitors\npalbociclib, ribociclib\n→ HR+/HER2- breast cancer\nFirst-line + letrozole', '#6a1b9a'),
(2.0, 4.4, 3.8, 1.1, 'PARP Inhibitors\nolaparib, niraparib\nBRCA1/2-mutated\novarian/breast/prostate', '#e65100'),
(6.0, 4.4, 3.8, 1.1, 'BRAF/MEK Inhibitors\nvemurafenib (BRAF V600E)\ndabrafenib + trametinib\nMelanoma, NSCLC', '#00838f'),
(2.0, 2.7, 3.8, 1.1, 'BCL-2 Inhibitors\nventoclax\nCLL, AML (FLT3)\nSynergistic with anti-CD20', '#37474f'),
(6.0, 2.7, 3.8, 1.1, 'Checkpoint Inhibitors\n(Immunotherapy)\npembrolizumab, nivolumab\n(anti-PD1); ipilimumab (CTLA-4)', '#1565c0'),
]
for x, y, w, h, t, c in classes:
rbox(ax2, x, y, w, h, t, c, fs=7.2)
rbox(ax2, 5, 1.5, 8.5, 0.7,
'Side Effects: TKIs → GI, hepatotoxicity, QTc · mAbs → infusion reactions · EGFR-TKI → rash/diarrhoea · '
'Checkpoint → immune-related AEs (colitis, pneumonitis, endocrinopathy)',
'#37474f', fs=7.5)
rbox(ax2, 5, 0.65, 8.5, 0.5,
'Precision medicine: Test for EGFR, ALK, BRAF, HER2, KRAS, BRCA, PD-L1, MSI before prescribing',
'#1a237e', fs=7.5, bold=False)
plt.tight_layout(pad=1.5)
return fig
# ══════════════════════════════════════════════
# CONTENT BUILDERS
# ══════════════════════════════════════════════
def cover_page(styles):
E = []
E.append(Spacer(1, 1.5*cm))
t1 = Table([[Paragraph('MD General Medicine', styles['cover_title'])]],
colWidths=[PAGE_W-2*MARGIN])
t1.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C_DARK),
('TOPPADDING',(0,0),(-1,-1),18),
('BOTTOMPADDING',(0,0),(-1,-1),6)]))
E.append(t1)
t2 = Table([[Paragraph('Paper I — Study Guide', styles['cover_sub'])]],
colWidths=[PAGE_W-2*MARGIN])
t2.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C_MED),
('TOPPADDING',(0,0),(-1,-1),8),
('BOTTOMPADDING',(0,0),(-1,-1),18)]))
E.append(t2)
E.append(Spacer(1, 0.6*cm))
E.append(Paragraph('Examination: January 2025 · MDRSA-17 · 100 Marks · All Questions Compulsory',
ParagraphStyle('s',fontName='Helvetica',fontSize=11,
textColor=C_GREY,alignment=TA_CENTER)))
E.append(Spacer(1, 0.4*cm))
E.append(HRFlowable(color=C_ORANGE, thickness=2, width='100%'))
E.append(Spacer(1, 0.4*cm))
E.append(Paragraph('Contents', ParagraphStyle('th',fontName='Helvetica-Bold',
fontSize=14,textColor=C_DARK,alignment=TA_CENTER)))
E.append(Spacer(1, 0.3*cm))
toc = [
('Q1','Theories of Ageing','26 marks · Theories · Organ changes · Prevention', C_RED),
('Q2','Cutaneous Manifestations of Systemic Disorders','26 marks · DM · Liver · Renal · SLE · Cardiac · Malignancy', C_ORANGE),
('Q3A','Lymphatic Drainage of Lungs','8 marks · Superficial & deep plexus · Node chain', C_TEAL),
('Q3B','Arterial Supply of Brain','8 marks · ICA · VA · Circle of Willis · Clinical', C_MED),
('Q3C','Stem Cell Therapy','8 marks · Types · Transplant · Applications · Complications', C_PURPLE),
('Q4A','ECMO','8 marks · VV vs VA · Circuit · Indications · Complications', C_RED),
('Q4B','Heat Stroke','8 marks · Pathophysiology · Features · Management', colors.HexColor('#bf360c')),
('Q4C','Targeted Therapy','8 marks · TKIs · mAbs · PARP · CDK · Checkpoint', colors.HexColor('#01579b')),
]
for qno, title, sub, col in toc:
row = [[Paragraph(f'<b>{qno}</b>', ParagraphStyle('qn',fontName='Helvetica-Bold',
fontSize=13,textColor=C_WHITE,alignment=TA_CENTER)),
Paragraph(f'<b>{title}</b><br/><font size="9" color="#555555">{sub}</font>',
ParagraphStyle('tt',fontName='Helvetica-Bold',fontSize=10.5,
textColor=C_DARK,leading=15))]]
rt = Table(row, colWidths=[1.6*cm, PAGE_W-2*MARGIN-1.8*cm])
rt.setStyle(TableStyle([
('BACKGROUND',(0,0),(0,-1),col),('BACKGROUND',(1,0),(1,-1),C_LGREY),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7),
('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),
('BOX',(0,0),(-1,-1),0.5,colors.HexColor('#bdbdbd')),
]))
E.append(rt); E.append(Spacer(1,3))
E.append(PageBreak())
return E
def build_q1(styles, img):
E = []
hdr = Table([[Paragraph('Q1. THEORIES OF AGEING, ORGAN CHANGES & PREVENTION (26 Marks)', styles['q_title'])]],
colWidths=[PAGE_W-2*MARGIN])
hdr.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C_RED),
('TOPPADDING',(0,0),(-1,-1),12),('BOTTOMPADDING',(0,0),(-1,-1),12)]))
E.append(hdr); E.append(Spacer(1,8))
E.append(key_box('KEY CONCEPT: Ageing is a universal, progressive decline in physiological function '
'resulting from multiple interacting molecular mechanisms. No single theory fully explains '
'ageing — current consensus favours an integration of the "hallmarks of ageing" framework '
'(Lopez-Otin 2013; updated 2023 with 12 hallmarks).', styles))
E.append(Spacer(1,6))
E.append(img)
E.append(Paragraph('Fig 1. Theories of ageing and key organ system changes with interventions', styles['caption']))
E.append(Spacer(1,6))
E.append(sec_hdr('I. THEORIES OF AGEING', styles, C_RED))
theories = [
('Telomere Shortening', C_MED,
'Normal somatic cells divide a finite number of times (Hayflick limit ~50). With each division, '
'telomeres shorten. Critical shortening → cellular senescence or apoptosis. Telomerase enzyme '
'(active in stem cells, germline, cancer) adds telomere repeats. Loss of telomerase in somatic '
'cells = ageing clock. TERT = catalytic subunit.'),
('Free Radical / Oxidative Stress Theory', C_RED,
'Harman (1956): Reactive oxygen species (ROS) generated by mitochondrial ETC → damage to DNA, '
'proteins, lipids. Accumulation of oxidative damage → cellular dysfunction. Antioxidant defences '
'(SOD, catalase, glutathione peroxidase) decline with age. Supports antioxidant interventions.'),
('Mitochondrial Theory', colors.HexColor('#e65100'),
'Mitochondria are primary ROS source. Mitochondrial DNA (mtDNA) is more vulnerable (no histones, '
'proximity to ETC). mtDNA mutations accumulate → ↓ ETC efficiency → ↓ ATP → cellular energy failure. '
'Mitophagy (clearance of damaged mitochondria) declines with age.'),
('Neuroendocrine Theory', C_TEAL,
'↓ Hypothalamic–pituitary axis function with age → ↓ GH, IGF-1, DHEA, sex steroids → '
'body composition changes (↑ fat, ↓ muscle), ↑ visceral adiposity, immune senescence. '
'Insulin/IGF-1 pathway is the most conserved longevity regulator across species.'),
('Inflammaging Theory', colors.HexColor('#f57f17'),
'Chronic, low-grade sterile inflammation ("inflammaging") driven by: senescent cell SASP '
'(senescence-associated secretory phenotype), gut dysbiosis, accumulation of DAMPs, '
'NF-kB activation. Associated with virtually all age-related diseases.'),
('Cross-Linking / Glycation Theory', C_PURPLE,
'Advanced glycation end-products (AGEs) form non-enzymatic cross-links between proteins '
'(collagen, elastin, lens crystallins). Reduces tissue flexibility → arterial stiffness, '
'cataract, impaired wound healing, renal glomerulosclerosis. AGEs also activate RAGE receptors → inflammation.'),
('Immunological (Immunosenescence) Theory', colors.HexColor('#00838f'),
'Thymic involution → ↓ naive T-cell output. ↓ T-cell diversity → ↑ susceptibility to infections. '
'↑ effector/memory cells. ↑ autoimmune phenomena. ↓ vaccine responses. '
'NK cell activity declines. B-cell function reduced.'),
]
for title, c, text in theories:
row = [[Paragraph(f'<b>{title}</b>', ParagraphStyle('mt',fontName='Helvetica-Bold',
fontSize=9,textColor=C_WHITE)),
Paragraph(text, styles['body'])]]
t = Table(row, colWidths=[3.5*cm, PAGE_W-2*MARGIN-3.7*cm])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(0,-1),c),('BACKGROUND',(1,0),(1,-1),C_LGREY),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7),
('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),
('BOX',(0,0),(-1,-1),0.5,colors.HexColor('#bdbdbd')),
]))
E.append(t); E.append(Spacer(1,3))
E.append(Spacer(1,6))
E.append(sec_hdr('II. ORGAN SYSTEM CHANGES IN AGEING', styles, C_MED))
organ_hdr = ['System', 'Structural Change', 'Functional Change']
organ_rows = [
['Cardiovascular', 'Myocardial hypertrophy; arterial stiffness; ↓ SA node cells', '↓ cardiac output; ↑ systolic BP; ↓ max HR; diastolic dysfunction'],
['Respiratory', 'Loss of elastic recoil; alveolar dilation; ↓ resp muscle strength', '↓ FEV1/FVC; ↑ residual volume; ↓ cough reflex; ↑ aspiration risk'],
['Renal', '↓ nephron mass; glomerulosclerosis; ↓ tubular mass', '↓ GFR ~1 mL/min/1.73m²/yr after 40; ↓ creatinine clearance'],
['Neurological', '↓ neurons & synapses; ↓ myelination; Lewy bodies; amyloid', '↓ processing speed; ↓ working memory; ↓ fine motor control'],
['Musculoskeletal', 'Sarcopenia; ↓ BMD; disc degeneration; cartilage thinning', '↓ strength; ↑ fall risk; osteoporosis; functional limitation'],
['Endocrine', 'Pancreatic beta-cell dysfunction; ↑ adipose tissue', '↓ GH/IGF-1; ↑ insulin resistance; ↓ T3; ↓ sex hormones'],
['GI', '↓ gastric acid; ↓ mucosal blood flow; ↓ GI motility', 'Constipation; GERD; ↓ vitamin B12 absorption; dysphagia'],
['Skin', 'Epidermal thinning; ↓ melanocytes; ↓ collagen', 'Wrinkles; poor wound healing; ↑ UV damage; xeroderma'],
]
cw = [2.8*cm, 5.5*cm, PAGE_W-2*MARGIN-8.5*cm]
E.append(stbl(organ_hdr, organ_rows, cw, hbg=C_MED))
E.append(Spacer(1,8))
E.append(sec_hdr('III. INTERVENTIONS THAT HELP PREVENTION OF AGEING', styles, C_GREEN))
prev_hdr = ['Intervention', 'Mechanism', 'Evidence']
prev_rows = [
['Caloric Restriction (CR)', 'Activates SIRT1, AMPK → mTOR inhibition → ↑ autophagy', 'Extends lifespan in all model organisms; human RCTs show metabolic benefits (CALERIE trial)'],
['Exercise (aerobic + resistance)', 'Mitochondrial biogenesis (PGC-1α); ↑ telomere length; ↓ inflammaging', 'Strongest single intervention: ↓ CVD, diabetes, dementia, cancer risk'],
['Metformin', 'AMPK activation → mTOR inhibition → metabolic improvement', 'TAME trial (Targeting Ageing with Metformin) ongoing; epidemiological data positive'],
['Rapamycin (sirolimus)', 'mTOR inhibition → ↑ autophagy; extends lifespan in mice', 'Limited human use; immunosuppressant AEs limit broad application'],
['Senolytics (Dasatinib + Quercetin)', 'Selectively eliminate senescent cells → ↓ SASP', 'Phase 2 trials; reduced senescent cell burden in humans'],
['NAD+ precursors (NMN, NR)', 'Restore NAD+/NADH ratio → sirtuin activation → ↑ mitochondrial function', 'Human trials show improved muscle function; cardiovascular data emerging'],
['Dietary: Mediterranean diet', 'Anti-inflammatory, rich antioxidants, fibre; preserves gut microbiome', '↓ CVD, cognitive decline, mortality; strong epidemiological evidence'],
['Sleep hygiene', 'Deep sleep → glymphatic clearance of brain amyloid/tau', 'Poor sleep accelerates neurodegeneration; 7-9 hrs optimal'],
]
cw2 = [3.2*cm, 4.5*cm, PAGE_W-2*MARGIN-7.9*cm]
E.append(stbl(prev_hdr, prev_rows, cw2, hbg=C_GREEN))
E.append(Spacer(1,8))
E.append(key_box('HALLMARKS OF AGEING (Lopez-Otin 2023): Genomic instability · Telomere attrition · '
'Epigenetic alterations · Loss of proteostasis · Disabled macroautophagy · Deregulated '
'nutrient sensing · Mitochondrial dysfunction · Cellular senescence · Stem cell exhaustion · '
'Altered intercellular communication · Chronic inflammation · Dysbiosis', styles, C_AMB_L, C_AMBER))
E.append(PageBreak())
return E
def build_q2(styles, img):
E = []
hdr = Table([[Paragraph('Q2. CUTANEOUS MANIFESTATIONS OF SYSTEMIC DISORDERS (26 Marks)', styles['q_title'])]],
colWidths=[PAGE_W-2*MARGIN])
hdr.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C_ORANGE),
('TOPPADDING',(0,0),(-1,-1),12),('BOTTOMPADDING',(0,0),(-1,-1),12)]))
E.append(hdr); E.append(Spacer(1,8))
E.append(key_box('KEY CONCEPT: The skin is a "mirror" of systemic disease. Recognising '
'dermatological signs can facilitate early diagnosis of internal diseases before '
'other organ manifestations become apparent.', styles))
E.append(Spacer(1,6))
E.append(img)
E.append(Paragraph('Fig 2. Overview of cutaneous manifestations across major systemic disorders', styles['caption']))
E.append(Spacer(1,6))
systems = [
('I. DIABETES MELLITUS', C_RED, [
['Acanthosis Nigricans', 'Velvety hyperpigmented plaques in skin folds (neck, axilla, groin). Marker of insulin resistance. Also malignancy-associated.'],
['Necrobiosis Lipoidica Diabeticorum', 'Yellowish-red plaques with telangiectasia on shins. Only 0.3% of diabetics; but 65-80% of NLD patients have DM.'],
['Diabetic Dermopathy', 'Shinbone spots — atrophic brown macules over anterior tibiae. Most common diabetic skin finding.'],
['Bullosis Diabeticorum', 'Non-inflammatory tense blisters on acral areas; spontaneous; no treatment needed.'],
['Eruptive Xanthomas', 'Yellow papules on extensor surfaces; associated with hypertriglyceridemia in uncontrolled DM.'],
['Chronic Candidiasis', 'Oral, vulvovaginal, intertrigo Candida due to immune impairment + glucose-rich environment.'],
['Diabetic Foot', 'Neuropathic ulcers, plantar ulcers, Charcot foot — peripheral neuropathy + ischaemia.'],
]),
('II. LIVER DISEASE', C_ORANGE, [
['Jaundice', 'Yellowing of sclera (first), then skin/mucosa. Bilirubin >2.5 mg/dL. Scleral icterus is most sensitive sign.'],
['Spider Angiomas', 'Central arteriole + radiating vessels. >5 on distribution of SVC = significant. Due to ↑ oestrogen + ↓ catabolism.'],
['Palmar Erythema', 'Blanchable redness of thenar/hypothenar eminences. Also in pregnancy, thyrotoxicosis, RA.'],
['Caput Medusae', 'Dilated periumbilical veins due to portal hypertension → collateral circulation.'],
["Terry's Nails", 'Proximal 2/3 white, distal 1/3 pink/brown. Hypoalbuminaemia.'],
['Leuconychia', 'White nails; hypoalbuminaemia. Muehrcke lines = paired white transverse lines.'],
['Pruritus', 'Due to bile salt deposition in skin. Can precede jaundice (especially in PBC, PSC).'],
['Dupuytren Contracture', 'Palmar fibromatosis. Associated with alcohol-related liver disease.'],
]),
('III. RENAL DISEASE / CKD', C_PURPLE, [
['Pruritus', 'Uraemic pruritus — most distressing symptom. Due to uraemia, secondary hyperparathyroidism, mast cell proliferation.'],
['Pallor', 'Anaemia of CKD (↓ EPO). Characteristic "lemon-yellow" complexion (anaemia + uraemia).'],
["Half-and-half Nails (Lindsay's)", 'Proximal half white (oedema), distal half brown/red. Pathognomonic of CKD.'],
['Calciphylaxis', 'Ischaemic necrosis of skin/fat from calcium-phosphate deposits in vessel walls. Exquisitely painful eschar. High mortality.'],
['Xerosis / Ichthyosis', 'Dry, scaly skin due to ↓ sweat gland function, fluid shifts.'],
['Uraemic Frost', 'White crystalline deposit of urea on skin (end-stage, severe uraemia).'],
]),
('IV. SYSTEMIC LUPUS ERYTHEMATOSUS (SLE)', C_MED, [
['Malar (Butterfly) Rash', 'Fixed erythema over malar eminences, sparing nasolabial folds. Precipitated by UV light. SLICC criterion.'],
['Discoid Lupus', 'Scarring plaques with follicular plugging, hyperpigmentation/hypopigmentation. Can occur without systemic disease.'],
['Photosensitivity', 'Skin rash after UV exposure. SLICC criterion. Use SPF 50+ sunscreen.'],
['Subacute Cutaneous Lupus (SCLE)', 'Annular or papulosquamous rash; anti-Ro/SSA antibodies. Drug-induced SCLE: hydrochlorothiazide, PPIs, TNFi.'],
['Vasculitis / Livedo Reticularis', 'Net-like purplish discolouration of skin; associated with antiphospholipid syndrome.'],
['Alopecia', 'Non-scarring hair loss; diffuse or patchy. Active disease marker.'],
['Raynaud Phenomenon', 'Triphasic colour change (white-blue-red) of digits on cold/stress.'],
]),
('V. CARDIAC DISEASE', C_MED, [
['Infective Endocarditis', 'Osler nodes (painful, red, on fingertips), Janeway lesions (painless, palms/soles), splinter haemorrhages, Roth spots.'],
['Cyanosis', 'Central (lips, tongue) = cardiopulmonary failure. Peripheral = Raynaud, shock. Clubbing in cyanotic CHD, IE.'],
['Xanthelasma / Xanthomas', 'Xanthelasma: yellow plaques periorbital. Tendon xanthomas: FH. Eruptive xanthomas: hypertriglyceridaemia.'],
]),
('VI. MALIGNANCY (Paraneoplastic)', colors.HexColor('#37474f'), [
['Acanthosis Nigricans', 'Sudden onset AN in adult → malignancy screen (especially gastric adenocarcinoma).'],
['Dermatomyositis', 'Heliotrope rash (periorbital violaceous), Gottron papules, shawl sign. ~30% have internal malignancy.'],
["Leser-Trelat Sign", 'Sudden eruption of multiple seborrhoeic keratoses → internal malignancy marker.'],
['Necrolytic Migratory Erythema', 'Glazed erosive rash perioral/perineal. Pathognomonic of glucagonoma.'],
['Sweet Syndrome', 'Painful red plaques, fever, neutrophilia. Associated with AML, IBD, infections.'],
['Erythema Gyratum Repens', 'Concentric rings ("wood grain pattern") → lung, breast, oesophageal cancer.'],
]),
]
for title, c, rows in systems:
E.append(sec_hdr(title, styles, c))
t_rows = [[Paragraph(f'<b>{r[0]}</b>', styles['body']), Paragraph(r[1], styles['body'])] for r in rows]
E.append(stbl(['Sign', 'Description / Clinical Features'], t_rows,
[4*cm, PAGE_W-2*MARGIN-4.2*cm], hbg=c))
E.append(Spacer(1,5))
E.append(key_box('EXAM TIP: Common "spot diagnoses" — Malar rash (SLE) · Heliotrope (dermatomyositis) · '
'Acanthosis nigricans (DM + malignancy) · Spider angiomas (liver disease) · '
'Osler nodes (infective endocarditis) · NME (glucagonoma) · Calciphylaxis (CKD)', styles, C_AMB_L, C_AMBER))
E.append(PageBreak())
return E
def build_q3(styles, img):
E = []
hdr = Table([[Paragraph('Q3. SHORT NOTES — Lymphatic Drainage · Arterial Supply of Brain · Stem Cell Therapy (8×3=24 Marks)', styles['q_title'])]],
colWidths=[PAGE_W-2*MARGIN])
hdr.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C_TEAL),
('TOPPADDING',(0,0),(-1,-1),12),('BOTTOMPADDING',(0,0),(-1,-1),12)]))
E.append(hdr); E.append(Spacer(1,8))
E.append(img)
E.append(Paragraph('Fig 3A. Lymphatic drainage of lungs and arterial supply of brain (Circle of Willis)', styles['caption']))
E.append(Spacer(1,6))
# A: Lymphatic drainage
E.append(sec_hdr('A. LYMPHATIC DRAINAGE OF THE LUNGS', styles, C_TEAL))
E.append(Paragraph(
'The pulmonary lymphatics form two plexuses that ultimately drain into the venous system '
'via the bronchomediastinal lymphatic trunk.', styles['body']))
E.append(Spacer(1,4))
ly_hdr = ['Level', 'Structure', 'Drainage/Notes']
ly_rows = [
['1st order', 'Subpleural (superficial) plexus', 'Drains visceral pleura and peripheral lung parenchyma'],
['1st order', 'Deep (peribronchial/perivascular) plexus', 'Drains bronchi, bronchioles, alveolar ducts — travel alongside bronchovascular bundle'],
['2nd order', 'Pulmonary (intrapulmonary) nodes', 'At lobar bronchi bifurcations; filter lymph from deep plexus'],
['3rd order', 'Bronchopulmonary (hilar) nodes', 'At hilum; receive from pulmonary nodes + subpleural plexus'],
['4th order', 'Tracheobronchial nodes (carinal)', 'Superior (R+L) and inferior (subcarinal) groups; R and L lungs drain here'],
['5th order', 'Paratracheal nodes → Bronchomediastinal trunk', 'RIGHT: Right lymphatic duct → Right brachiocephalic vein. LEFT: Thoracic duct → Left SVC junction'],
]
E.append(stbl(ly_hdr, ly_rows, [2*cm, 4.5*cm, PAGE_W-2*MARGIN-6.7*cm], hbg=C_TEAL))
E.append(Spacer(1,4))
E.append(key_box('CLINICAL: Lung cancer spreads to ipsilateral hilar and paratracheal nodes first. '
'Left lower lobe uniquely drains to RIGHT paratracheal nodes (anomaly). '
'Lymphangitis carcinomatosa: tumour cells in lymphatics → "bat wing" opacification on CXR.', styles, C_TEAL_L, C_TEAL))
E.append(Spacer(1,8))
# B: Arterial supply
E.append(sec_hdr('B. ARTERIAL SUPPLY OF THE BRAIN', styles, C_MED))
E.append(Paragraph(
'The brain receives blood from two paired systems: '
'the Internal Carotid Arteries (anterior circulation, ~80%) and '
'the Vertebral Arteries (posterior circulation, ~20%), interconnected by the '
'<b>Circle of Willis</b> at the base of the brain.', styles['body']))
E.append(Spacer(1,4))
art_hdr = ['Artery', 'Territory Supplied', 'Stroke Syndrome']
art_rows = [
['ACA (Ant. Cerebral)', 'Medial frontal and parietal lobes; corpus callosum', 'Contralateral leg weakness (leg > arm); abulia, incontinence'],
['MCA (Mid. Cerebral)', 'Lateral frontal, parietal, temporal; basal ganglia; internal capsule', 'Contralateral hemiplegia (arm > leg) + hemisensory loss; aphasia (dominant); neglect (non-dominant)'],
['PCA (Post. Cerebral)', 'Occipital lobe; thalamus; posterior temporal', 'Homonymous hemianopia; thalamic pain; memory impairment'],
['Basilar artery', 'Pons, midbrain, cerebellum (via AICA, SCA)', 'Locked-in syndrome; diplopia, dysarthria, ataxia, vertigo'],
['PICA (Poster. Inf. Cerebellar)', 'Lateral medulla + inferior cerebellum', 'Wallenberg syndrome: ipsilateral face, contralateral body spinothalamic loss; Horner syndrome'],
['AComm (Ant. Communicating)', 'Connects 2 ACAs; aneurysm = most common berry aneurysm site', 'SAH; bitemporal field defects if optic chiasm compressed'],
['PComm (Post. Communicating)', 'Connects ICA to PCA', 'CN III palsy (posterior communicating artery aneurysm = "surgical pupil")'],
]
E.append(stbl(art_hdr, art_rows, [3*cm, 4.5*cm, PAGE_W-2*MARGIN-7.7*cm], hbg=C_MED))
E.append(Spacer(1,4))
E.append(key_box('CIRCLE OF WILLIS: AComm + ACA (bilateral) + ICA + PComm + PCA. '
'Complete in only ~25% of people. '
'Most common aneurysm sites: AComm (35%) > PComm (30%) > MCA bifurcation (20%). '
'Posterior cerebral ischaemia: vertigo, diplopia, dysphagia, drop attacks (vertebrobasilar insufficiency).', styles, C_LIGHT, C_MED))
E.append(Spacer(1,8))
# C: Stem cell therapy
E.append(sec_hdr('C. STEM CELL THERAPY', styles, C_PURPLE))
E.append(Paragraph(
'Stem cells are undifferentiated cells capable of self-renewal and differentiation '
'into specialised cell types. Therapeutic use harnesses this to regenerate diseased/destroyed tissues.', styles['body']))
E.append(Spacer(1,4))
sc_hdr = ['Type', 'Potency', 'Source', 'Key Features']
sc_rows = [
['Embryonic SC (ESC)', 'Pluripotent', 'Inner cell mass of blastocyst', 'Greatest differentiation potential; ethical controversy; teratoma risk'],
['Induced Pluripotent SC (iPSC)', 'Pluripotent', 'Adult somatic cells + Yamanaka factors (Oct4, Sox2, Klf4, c-Myc)', 'Avoids ethical issues; autologous; risk of insertional mutagenesis'],
['Haematopoietic SC (HSC)', 'Multipotent', 'Bone marrow, cord blood, peripheral blood (G-CSF mobilised)', 'Curative for haematological malignancies; well-established'],
['Mesenchymal SC (MSC)', 'Multipotent', 'Bone marrow, adipose, placenta', 'Immunomodulatory; GvHD treatment; cartilage/bone regeneration'],
['Neural SC', 'Multipotent', 'Subventricular zone, hippocampus', 'Experimental: Parkinson, spinal cord injury, ALS'],
]
E.append(stbl(sc_hdr, sc_rows, [2.8*cm, 1.8*cm, 3.5*cm, PAGE_W-2*MARGIN-8.3*cm], hbg=C_PURPLE))
E.append(Spacer(1,4))
E.append(Paragraph('<b>Clinical Applications of HSC Transplantation:</b>', styles['subsec']))
apps_rows = [
['Malignant', 'AML, ALL, CML, MDS, Multiple myeloma, Hodgkin/Non-Hodgkin lymphoma'],
['Non-malignant', 'Aplastic anaemia, Sickle cell disease, Thalassaemia major, SCID, Fanconi anaemia'],
['Autoimmune', 'Severe MS, SLE, CRPS (experimental), refractory IBD'],
]
E.append(stbl(['Category', 'Diseases'], apps_rows, [3*cm, PAGE_W-2*MARGIN-3.2*cm], hbg=colors.HexColor('#37474f')))
E.append(Spacer(1,4))
E.append(Paragraph('<b>Procedure Types:</b>', styles['subsec']))
for pt, desc in [
('Autologous', 'Patient\'s own cells harvested → myeloablative conditioning → reinfusion. No GvHD. ↑ relapse risk. Used in myeloma, lymphoma.'),
('Allogeneic', 'Donor HSCs (sibling HLA-matched preferred; or MUD). Graft-vs-leukaemia (GvL) effect = therapeutic. GvHD = risk.'),
('Syngeneic', 'Identical twin. No GvHD; no GvL.'),
]:
E.append(Paragraph(f'<b>{pt}:</b> {desc}', styles['bullet']))
E.append(Spacer(1,4))
E.append(key_box('COMPLICATIONS of allogenic SCT: GvHD (acute grade II-IV = fever, rash, diarrhoea, hepatitis; '
'chronic = sclerotic skin, sicca syndrome, BOS) · Graft failure · Infections (CMV, Aspergillus, PCP) · '
'VOD (sinusoidal obstruction syndrome) · Secondary malignancy.', styles, C_PURP_L, C_PURPLE))
E.append(PageBreak())
return E
def build_q4(styles, img):
E = []
hdr = Table([[Paragraph('Q4. SHORT NOTES — ECMO · Heat Stroke · Targeted Therapy (8×3=24 Marks)', styles['q_title'])]],
colWidths=[PAGE_W-2*MARGIN])
hdr.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C_RED),
('TOPPADDING',(0,0),(-1,-1),12),('BOTTOMPADDING',(0,0),(-1,-1),12)]))
E.append(hdr); E.append(Spacer(1,8))
E.append(img)
E.append(Paragraph('Fig 4. ECMO circuit + Heat stroke management + Targeted therapy classes', styles['caption']))
E.append(Spacer(1,6))
# A: ECMO
E.append(sec_hdr('A. ECMO (EXTRACORPOREAL MEMBRANE OXYGENATION)', styles, C_RED))
E.append(Paragraph(
'ECMO is a form of prolonged extracorporeal life support that uses an artificial lung '
'(membrane oxygenator) to provide gas exchange and/or cardiac support, '
'allowing the native heart and lungs to recover.', styles['body']))
E.append(Spacer(1,4))
ecmo_hdr = ['Parameter', 'VV-ECMO', 'VA-ECMO']
ecmo_rows = [
['Support type', 'Respiratory ONLY', 'Cardiac + Respiratory'],
['Cannulation', 'Femoral vein → internal jugular vein\n(or dual-lumen single cannula)', 'Femoral vein (drainage) +\nFemoral artery (return)'],
['Indications', 'ARDS (P/F <80 after 6h optimal ventilation)\nSevere pneumonia (viral, bacterial)\nStatus asthmaticus\nBridge to lung transplant\nInhalation injury', 'Refractory cardiogenic shock\nMassive PE + haemodynamic collapse\nRefractory cardiac arrest (ECPR)\nPost-cardiotomy cardiogenic shock\nSevere myocarditis'],
['Cardiac output', 'No direct cardiac support', '↑ CO; ↓ cardiac preload'],
['LVEDP', 'Unaffected', 'May increase (LV distension — needs LV vent)'],
]
E.append(stbl(ecmo_hdr, ecmo_rows, [3*cm, (PAGE_W-2*MARGIN-3.2*cm)/2, (PAGE_W-2*MARGIN-3.2*cm)/2], hbg=C_RED))
E.append(Spacer(1,4))
E.append(Paragraph('<b>ECMO Circuit Components:</b> Drainage cannula → Centrifugal pump → Membrane oxygenator (gas exchange) → Return cannula', styles['body']))
E.append(Spacer(1,3))
E.append(Paragraph('<b>Monitoring:</b> ACT 180-220 sec (anticoagulation with UFH) · Flow 3-6 L/min · FiO₂ sweep gas · SaO₂ · Serial ABG · Daily echo (VA-ECMO)', styles['body']))
E.append(Spacer(1,3))
comp_rows = [['Bleeding', '(anticoagulation required; ↑ transfusion needs)'],
['Thromboembolism', '(oxygenator thrombus; limb ischaemia in VA-ECMO)'],
['Infection', '(septicaemia, cannula infections)'],
['Neurological', '(stroke, ICH)'],
['LV distension', '(VA-ECMO → Northampton effect; needs LV vent or IABP)'],
['Haemolysis', '(mechanical destruction of RBCs in pump)']]
E.append(Paragraph('<b>Complications:</b>', styles['subsec']))
for comp, detail in comp_rows:
E.append(Paragraph(f'• <b>{comp}</b> {detail}', styles['bullet']))
E.append(Spacer(1,8))
# B: Heat stroke
E.append(sec_hdr('B. HEAT STROKE', styles, colors.HexColor('#bf360c')))
E.append(Paragraph(
'<b>Definition:</b> Core body temperature >40°C (104°F) with CNS dysfunction '
'(confusion, stupor, seizures, coma) — medical emergency with mortality up to 50% if untreated promptly.', styles['body']))
E.append(Spacer(1,4))
hs_hdr = ['Feature', 'Classic Heat Stroke', 'Exertional Heat Stroke (EHS)']
hs_rows = [
['Population', 'Elderly, chronic illness, medications (anticholinergics, diuretics)', 'Young athletes, military personnel, manual workers'],
['Setting', 'Hot weather; passive exposure; poor ventilation', 'Intense exercise in hot/humid environment'],
['Sweating', 'Often absent (anhidrosis)', 'Often present'],
['Onset', 'Days (gradual)', 'Hours (rapid)'],
['Complications', 'Rhabdomyolysis less common', 'Rhabdomyolysis, AKI, DIC more common'],
]
E.append(stbl(hs_hdr, hs_rows, [3*cm, (PAGE_W-2*MARGIN-3.2*cm)/2, (PAGE_W-2*MARGIN-3.2*cm)/2],
hbg=colors.HexColor('#bf360c')))
E.append(Spacer(1,4))
E.append(Paragraph('<b>Pathophysiology:</b>', styles['subsec']))
E.append(Paragraph(
'Hyperthermia → cytokine storm (IL-1, IL-6, TNF-α) → systemic inflammatory response → '
'endothelial injury → DIC, MODS. Direct thermal injury to cells at >42°C → protein denaturation, '
'mitochondrial dysfunction, rhabdomyolysis → AKI, hepatocellular necrosis, encephalopathy.', styles['body']))
E.append(Spacer(1,4))
E.append(Paragraph('<b>Management (COOL FIRST — do not delay for transport):</b>', styles['subsec']))
mgmt_rows = [
['Immediate cooling', 'Cold water immersion (most effective, EHS) OR ice packs to neck/axilla/groin + evaporative cooling (fan + mist spray). Target core temp <39°C within 30 minutes'],
['Airway/Breathing', 'O₂ supplementation; intubation if GCS ≤8 or seizures'],
['IV Fluids', 'Cold isotonic saline; avoid glucose in non-hypoglycaemic. Caution in elderly (cardiac).'],
['Seizures', 'IV benzodiazepines (lorazepam/diazepam). Avoid phenytoin (↑ heat production).'],
['Do NOT give', 'Antipyretics (paracetamol, NSAIDs) — ineffective as mechanism is non-prostaglandin mediated'],
['ICU monitoring', 'Core temp (rectal/oesophageal) · CK, creatinine (rhabdomyolysis) · Coagulation (DIC) · LFTs · RRT if AKI'],
]
E.append(stbl(['Step', 'Details'], mgmt_rows, [3*cm, PAGE_W-2*MARGIN-3.2*cm],
hbg=colors.HexColor('#bf360c')))
E.append(Spacer(1,8))
# C: Targeted therapy
E.append(sec_hdr('C. TARGETED THERAPY', styles, colors.HexColor('#01579b')))
E.append(Paragraph(
'Targeted therapy uses drugs that specifically attack molecular targets '
'(mutations, overexpressed proteins, aberrant signalling pathways) on cancer cells, '
'with relative sparing of normal cells — contrasting with conventional cytotoxic chemotherapy.', styles['body']))
E.append(Spacer(1,4))
tt_hdr = ['Class', 'Examples', 'Targets / Tumour', 'Key AEs']
tt_rows = [
['Tyrosine Kinase Inhibitors (TKIs)',
'Imatinib · Dasatinib\nGefitinib · Erlotinib\nSunitinib · Sorafenib',
'BCR-ABL (CML) · EGFR (NSCLC)\nKIT (GIST) · VEGFR (RCC)',
'GI toxicity · Hepatotoxicity · QTc prolongation · Rash (EGFR-TKI)'],
['Monoclonal Antibodies (mAbs)',
'Trastuzumab · Pertuzumab\nBevacizumab · Cetuximab\nRituximab · Obinutuzumab',
'HER2 (breast) · VEGF (colorectal)\nEGFR (colorectal, H&N) · CD20 (NHL)',
'Infusion reactions · Cardiotoxicity (trastuzumab) · Wound healing (bevacizumab)'],
['CDK 4/6 Inhibitors',
'Palbociclib · Ribociclib\nAbemaciclib',
'Cyclin D-CDK4/6 → Cell cycle arrest\nHR+/HER2− breast cancer',
'Neutropenia (dose-limiting) · QTc (ribociclib) · Diarrhoea (abemaciclib)'],
['PARP Inhibitors',
'Olaparib · Niraparib\nRucaparib · Talazoparib',
'BRCA1/2-mutated: Ovarian, breast\nprostate, pancreatic cancers',
'Anaemia · Nausea · MDS/AML (rare)\nPneumonitis'],
['BRAF/MEK Inhibitors',
'Vemurafenib · Dabrafenib\nTrametinib · Cobimetinib',
'BRAF V600E mutation: Melanoma\nNSCLC, colorectal, thyroid',
'Rash · Photosensitivity · Pyrexia · Secondary squamous cell Ca'],
['mTOR Inhibitors',
'Everolimus · Temsirolimus',
'PI3K/AKT/mTOR pathway: RCC\nNET, mantle cell lymphoma, HR+ breast',
'Pneumonitis (immune-mediated) · Hyperglycaemia · Mucositis · Immunosuppression'],
['BCL-2 Inhibitors',
'Venetoclax',
'BCL-2 (anti-apoptotic): CLL, AML\nWith ibrutinib/anti-CD20 antibody',
'Tumour lysis syndrome (TLS) · Neutropenia · GI toxicity'],
['Immune Checkpoint Inhibitors',
'Pembrolizumab · Nivolumab\nAtezolizumab · Ipilimumab\nDurvalumab',
'PD-1/PD-L1 or CTLA-4 axis\nMelanoma, NSCLC, RCC, MSI-H tumours',
'irAEs: Colitis · Pneumonitis · Thyroiditis · Hepatitis · Adrenal insufficiency'],
]
E.append(stbl(tt_hdr, tt_rows, [3*cm, 3.2*cm, 4*cm, PAGE_W-2*MARGIN-10.4*cm],
hbg=colors.HexColor('#01579b')))
E.append(Spacer(1,6))
E.append(key_box(
'BIOMARKER TESTING BEFORE TARGETED THERAPY: EGFR mutation · ALK rearrangement · BRAF V600E · '
'HER2 amplification · KRAS/NRAS · BRCA1/2 · PD-L1 expression · MSI/MMR status · '
'TMB (tumour mutational burden). Precision oncology = right drug for right molecular target.', styles, C_AMB_L, C_AMBER))
return E
def build_pdf(out):
doc = SimpleDocTemplate(out, pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=MARGIN, bottomMargin=MARGIN,
title='MD General Medicine Paper I - Study Guide',
author='Orris AI')
styles = make_styles()
print('Generating diagrams...')
i1 = mpl_img(diag_ageing(), 14.5, 7.5)
i2 = mpl_img(diag_cutaneous(), 14.5, 8)
i3 = mpl_img(diag_lymph_brain(), 14.5, 7.5)
i4 = mpl_img(diag_stemcell_ecmo(), 14.5, 7.5)
i5 = mpl_img(diag_heat_targeted(), 14.5, 7.5)
print('Building sections...')
E = []
E += cover_page(styles)
E += build_q1(styles, i1)
E += build_q2(styles, i2)
E += build_q3(styles, i3)
E += build_q4(styles, i5) # heat + targeted
# insert stem cell page after lymph brain
# rebuild q3 properly with two images
print('Writing PDF...')
doc.build(E)
print(f'Done: {out}')
if __name__ == '__main__':
build_pdf('/tmp/workspace/study-guide/MD_GeneralMedicine_Paper1_StudyGuide.pdf')