The following files are required for me to teach students appearing for the INI SS CET CVTS which is a single best answer multiple choice question examination. Generate 3 files from chapter 123. 1. 5 page High yield notes from the chapter for teaching with probable questions, and include teaching notes, flowcharts, landmark trials, guidelines, tables, memory aids, exam pearls and most probably INI SS Questions. Also include last minute revision tables. 2. 25 MCQs from the chapter in the INI CET SS standard format single best answer, can have a paragraph questions, vignettes, image based questions, photographs with attributes. Source can be the internet as well. Make sure that the PDF has all 25 questions. 3. Answer key with detailed explanation of the correct answer and explanation of the distractors. Do not copy paste the same explanations loop to all answers. Make sure that the explanation pdf has all 25 explanations. Answers can be either a,b,c or d. Explain every correct answer and give distractor analysis as well. Correct answer, explanation, why each distractor is incorrect, relevant guideline, and learning point. Create 3 pdfs with a direct download link. Make sure the questions are based on decision making, guidelines, landmark trials, operative judgement, hemodynamics, clinical scenarios and imaging interpretation. Please provide all 3 sets in downloadable PDF format only with link.
cd /home/daytona/workspace/attachments/41cc0c27-b161-493d-85f7-bf2946a0e0da && p…
mkdir -p /home/daytona/workspace/PA_IVS_Chapter123 && ls /home/daytona/workspace…
~/PA_IVS_Chapter123/generate_pdf1_notes.py
#!/usr/bin/env python3
"""Generate High Yield Notes PDF for PA/IVS Chapter 123 - INI SS CET CVTS"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus.flowables import BalancedColumns
from reportlab.lib.colors import HexColor
OUTPUT = "/home/daytona/workspace/PA_IVS_Chapter123/01_HighYield_Notes_PA_IVS.pdf"
# Color palette
DARK_BLUE = HexColor('#003366')
MED_BLUE = HexColor('#1a5276')
LIGHT_BLUE= HexColor('#d6eaf8')
GOLD = HexColor('#b7950b')
GOLD_LIGHT= HexColor('#fef9e7')
RED = HexColor('#922b21')
RED_LIGHT = HexColor('#fadbd8')
GREEN = HexColor('#1e8449')
GREEN_LIGHT=HexColor('#d5f5e3')
ORANGE = HexColor('#d35400')
ORANGE_LIGHT=HexColor('#fdebd0')
PURPLE = HexColor('#6c3483')
PURPLE_LIGHT=HexColor('#f5eef8')
GREY = HexColor('#616a6b')
LIGHT_GREY= HexColor('#f2f3f4')
doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
topMargin=1.5*cm, bottomMargin=1.5*cm,
leftMargin=1.8*cm, rightMargin=1.8*cm)
styles = getSampleStyleSheet()
def S(name, **kwargs):
return ParagraphStyle(name, **kwargs)
# Custom styles
title_style = S('Title', fontName='Helvetica-Bold', fontSize=20, textColor=colors.white,
alignment=TA_CENTER, spaceAfter=4)
subtitle_style = S('Subtitle', fontName='Helvetica', fontSize=11, textColor=colors.white,
alignment=TA_CENTER, spaceAfter=2)
h1 = S('H1', fontName='Helvetica-Bold', fontSize=13, textColor=colors.white,
backColor=DARK_BLUE, spaceBefore=8, spaceAfter=4, leading=16,
leftIndent=6, rightIndent=6)
h2 = S('H2', fontName='Helvetica-Bold', fontSize=11, textColor=colors.white,
backColor=MED_BLUE, spaceBefore=6, spaceAfter=3, leading=14,
leftIndent=4, rightIndent=4)
h3 = S('H3', fontName='Helvetica-Bold', fontSize=10, textColor=DARK_BLUE,
spaceBefore=5, spaceAfter=2)
body = S('Body', fontName='Helvetica', fontSize=9, leading=13,
spaceBefore=2, spaceAfter=2, alignment=TA_JUSTIFY)
bullet = S('Bullet', fontName='Helvetica', fontSize=9, leading=12,
leftIndent=12, spaceBefore=1, spaceAfter=1,
bulletIndent=4, bulletText='•')
bold_body = S('BoldBody', fontName='Helvetica-Bold', fontSize=9, leading=12,
spaceBefore=2, spaceAfter=2)
pearl = S('Pearl', fontName='Helvetica-Bold', fontSize=9, textColor=RED,
leading=12, spaceBefore=1, spaceAfter=1)
mnemonic = S('Mnemonic', fontName='Helvetica-BoldOblique', fontSize=10,
textColor=PURPLE, leading=14, spaceBefore=2, spaceAfter=2, alignment=TA_CENTER)
small = S('Small', fontName='Helvetica', fontSize=8, leading=10,
spaceBefore=1, spaceAfter=1)
table_header = S('TH', fontName='Helvetica-Bold', fontSize=8, textColor=colors.white,
alignment=TA_CENTER, leading=10)
table_cell = S('TC', fontName='Helvetica', fontSize=8, leading=10, alignment=TA_CENTER)
table_cell_l = S('TCL', fontName='Helvetica', fontSize=8, leading=10, alignment=TA_LEFT)
warn = S('Warn', fontName='Helvetica-Bold', fontSize=9, textColor=RED,
backColor=RED_LIGHT, leading=12, leftIndent=6, rightIndent=6,
spaceBefore=3, spaceAfter=3)
tip = S('Tip', fontName='Helvetica-Bold', fontSize=9, textColor=GREEN,
leading=12, spaceBefore=2, spaceAfter=2)
note_style = S('Note', fontName='Helvetica-Oblique', fontSize=8.5, leading=11,
textColor=GREY, spaceBefore=1, spaceAfter=1)
def header_box(text, bg=DARK_BLUE, fg=colors.white, size=13):
data = [[Paragraph(text, S('hb', fontName='Helvetica-Bold', fontSize=size,
textColor=fg, alignment=TA_CENTER, leading=size+3))]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING',(0,0),(-1,-1), 6),
('LEFTPADDING', (0,0),(-1,-1), 8),
('RIGHTPADDING',(0,0),(-1,-1), 8),
('ROUNDEDCORNERS', [4]),
]))
return t
def colored_box(content_list, bg=LIGHT_BLUE, border=DARK_BLUE):
inner = Table([[c] for c in content_list], colWidths=[16.5*cm])
inner.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), bg),
('TOPPADDING',(0,0),(-1,-1),4),
('BOTTOMPADDING',(0,0),(-1,-1),4),
('LEFTPADDING',(0,0),(-1,-1),8),
('RIGHTPADDING',(0,0),(-1,-1),8),
('BOX',(0,0),(-1,-1),1.5,border),
]))
return inner
def two_col_table(left_items, right_items, left_header='', right_header='', width=17*cm):
data = []
if left_header or right_header:
data.append([
Paragraph(left_header, table_header),
Paragraph(right_header, table_header)
])
max_len = max(len(left_items), len(right_items))
for i in range(max_len):
l = Paragraph(left_items[i] if i < len(left_items) else '', table_cell_l)
r = Paragraph(right_items[i] if i < len(right_items) else '', table_cell_l)
data.append([l, r])
t = Table(data, colWidths=[width/2, width/2])
style = [
('GRID',(0,0),(-1,-1),0.5,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),5),
('RIGHTPADDING',(0,0),(-1,-1),5),
]
if left_header or right_header:
style += [('BACKGROUND',(0,0),(-1,0),DARK_BLUE)]
t.setStyle(TableStyle(style))
return t
story = []
# =========================================================
# COVER / TITLE BLOCK
# =========================================================
story.append(Spacer(1, 0.3*cm))
title_data = [[
Paragraph("INI SS CET — CARDIOTHORACIC & VASCULAR SURGERY",
S('ct', fontName='Helvetica-Bold', fontSize=10, textColor=GOLD, alignment=TA_CENTER)),
],[
Paragraph("CHAPTER 123",
S('ch', fontName='Helvetica-Bold', fontSize=22, textColor=colors.white, alignment=TA_CENTER)),
],[
Paragraph("PULMONARY ATRESIA WITH INTACT VENTRICULAR SEPTUM",
S('main', fontName='Helvetica-Bold', fontSize=15, textColor=colors.white, alignment=TA_CENTER, leading=20)),
],[
Paragraph("(PA/IVS)",
S('sub', fontName='Helvetica-Bold', fontSize=13, textColor=GOLD, alignment=TA_CENTER)),
],[
Paragraph("HIGH YIELD NOTES • TEACHING GUIDE • EXAM PEARLS • LAST MINUTE REVISION",
S('tag', fontName='Helvetica', fontSize=8.5, textColor=HexColor('#aed6f1'), alignment=TA_CENTER)),
]]
title_table = Table(title_data, colWidths=[17*cm])
title_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), DARK_BLUE),
('TOPPADDING',(0,0),(-1,-1),5),
('BOTTOMPADDING',(0,0),(-1,-1),5),
('BOX',(0,0),(-1,-1),2,GOLD),
('ROUNDEDCORNERS',[6]),
]))
story.append(title_table)
story.append(Spacer(1, 0.4*cm))
# Quick stats box
stats = [
["Prevalence", "4–8 per 100,000 live births"],
["% of all CHD", "1%–3%"],
["Key feature", "Complete RVOTO + intact IVS"],
["Survival (5–10 yr)", "Up to 90% (modern era)"],
["First repair", "Weinberg, 1962 (transventricular valvotomy)"],
]
stats_table = Table(
[[Paragraph(r[0], S('sk', fontName='Helvetica-Bold', fontSize=8.5, textColor=DARK_BLUE)),
Paragraph(r[1], S('sv', fontName='Helvetica', fontSize=8.5))] for r in stats],
colWidths=[5.5*cm, 11.5*cm]
)
stats_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1),GOLD_LIGHT),
('ROWBACKGROUNDS',(0,0),(-1,-1),[GOLD_LIGHT, colors.white]),
('BOX',(0,0),(-1,-1),1.5,GOLD),
('GRID',(0,0),(-1,-1),0.3,HexColor('#d4ac0d')),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),6),
]))
story.append(stats_table)
story.append(Spacer(1, 0.3*cm))
# =========================================================
# PAGE 1 — ANATOMY & PATHOPHYSIOLOGY
# =========================================================
story.append(header_box("PAGE 1 — ANATOMY & PATHOPHYSIOLOGY", bg=DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
story.append(header_box("ANATOMIC CLASSIFICATION — THE THREE PILLARS", bg=MED_BLUE, size=10))
story.append(Spacer(1, 0.1*cm))
# Pillar table
pillar_data = [
[Paragraph("TRICUSPID VALVE (TV)", table_header),
Paragraph("RIGHT VENTRICLE (RV)", table_header),
Paragraph("CORONARY ANATOMY", table_header)],
[Paragraph("• z-score ≤ −4 → unipartite RV\n• z-score −4 to −2 → variable hypoplasia\n• z-score −2 to 0 → tripartite (near normal)\n• 5-10% Ebstein-like inferior displacement\n• TV size = proxy for RV size + coronary anomaly risk", small),
Paragraph("• Tripartite (inlet+body+outlet): 60-80%\n• Bipartite (inlet+body only): 15-30%\n• Unipartite (inlet only): 2-10%\n• Muscular overgrowth reduces cavity\n• Suprasystemic pressure if TV competent", small),
Paragraph("• Sinusoids → fistulae persist in fetal life\n• 50-70%: RV-to-coronary fistulae\n• 25%: RVDCC (right ventricle–dependent coronary circulation)\n• Ostial atresia = most lethal variant\n• RVDCC = contraindication to RV decompression alone", small)],
]
pillar_table = Table(pillar_data, colWidths=[5.6*cm, 5.6*cm, 5.6*cm])
pillar_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), DARK_BLUE),
('BACKGROUND',(0,1),(-1,-1), LIGHT_BLUE),
('GRID',(0,0),(-1,-1),0.5,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),4),
('BOTTOMPADDING',(0,0),(-1,-1),4),
('LEFTPADDING',(0,0),(-1,-1),5),
('RIGHTPADDING',(0,0),(-1,-1),5),
]))
story.append(pillar_table)
story.append(Spacer(1, 0.25*cm))
# Anatomy table 123.1 recreation
story.append(Paragraph("TABLE 123.1 — RV Hypoplasia Severity & Anatomic Correlates (HIGH YIELD)", h3))
anat_data = [
[Paragraph("Feature", table_header),
Paragraph("MILD", S('mh', fontName='Helvetica-Bold', fontSize=8, textColor=colors.white, alignment=TA_CENTER)),
Paragraph("MODERATE", S('moh', fontName='Helvetica-Bold', fontSize=8, textColor=colors.white, alignment=TA_CENTER)),
Paragraph("SEVERE", S('sh', fontName='Helvetica-Bold', fontSize=8, textColor=colors.white, alignment=TA_CENTER))],
[Paragraph("TV z-score", table_cell_l), Paragraph("> −2", table_cell), Paragraph("−2 to −4", table_cell), Paragraph("< −4", table_cell)],
[Paragraph("RV morphology", table_cell_l), Paragraph("Tripartite", table_cell), Paragraph("Bipartite", table_cell), Paragraph("Unipartite", table_cell)],
[Paragraph("RVOT infundibular cavity", table_cell_l), Paragraph("Present", table_cell), Paragraph("Intermediate", table_cell), Paragraph("Absent", table_cell)],
[Paragraph("RVDCC", table_cell_l), Paragraph("Rare", table_cell), Paragraph("Possible", table_cell), Paragraph("Common", table_cell)],
[Paragraph("Surgical target", table_cell_l), Paragraph("Biventricular repair", table_cell), Paragraph("1.5-V or BiV", table_cell), Paragraph("Single ventricle (Fontan)", table_cell)],
]
anat_table = Table(anat_data, colWidths=[4.5*cm, 3.5*cm, 3.5*cm, 5.3*cm])
anat_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), DARK_BLUE),
('BACKGROUND',(1,1),(1,-1), GREEN_LIGHT),
('BACKGROUND',(2,1),(2,-1), ORANGE_LIGHT),
('BACKGROUND',(3,1),(3,-1), RED_LIGHT),
('GRID',(0,0),(-1,-1),0.5,colors.grey),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),4),
('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white, LIGHT_GREY]),
]))
story.append(anat_table)
story.append(Spacer(1, 0.2*cm))
# Pulmonary valve types
story.append(header_box("PULMONARY VALVE ATRESIA TYPES", bg=MED_BLUE, size=10))
pv_data = [
[Paragraph("MEMBRANOUS ATRESIA (~75%)", S('mh2', fontName='Helvetica-Bold', fontSize=9, textColor=DARK_BLUE)),
Paragraph("MUSCULAR ATRESIA (~25%)", S('mh3', fontName='Helvetica-Bold', fontSize=9, textColor=RED))],
[Paragraph("• Fused/dysplastic valve leaflets present\n• RVOT/infundibulum structurally developed\n• RV and infundibulum usually formed\n• Amenable to transcatheter wire perforation\n• Good candidate for balloon valvuloplasty\n• Associated with less severe RV hypoplasia", small),
Paragraph("• Complete obliteration of muscular infundibulum\n• More severe RV hypoplasia\n• Higher association with RVDCC\n• NOT suitable for transcatheter perforation alone\n• Requires surgical RVOT reconstruction\n• Worse prognosis overall", small)],
]
pv_table = Table(pv_data, colWidths=[8.5*cm, 8.5*cm])
pv_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(0,0), GREEN_LIGHT),
('BACKGROUND',(1,0),(1,0), RED_LIGHT),
('BACKGROUND',(0,1),(0,1), colors.white),
('BACKGROUND',(1,1),(1,1), HexColor('#fff5f5')),
('BOX',(0,0),(0,-1),1, GREEN),
('BOX',(1,0),(1,-1),1, RED),
('GRID',(0,0),(-1,-1),0.3,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),4),
('BOTTOMPADDING',(0,0),(-1,-1),4),
('LEFTPADDING',(0,0),(-1,-1),5),
]))
story.append(pv_table)
story.append(Spacer(1, 0.2*cm))
# Pathophysiology flowchart
story.append(header_box("PATHOPHYSIOLOGY FLOWCHART", bg=MED_BLUE, size=10))
flow_steps = [
("RVOTO (complete)", DARK_BLUE, colors.white),
("↓ No antegrade pulmonary blood flow", MED_BLUE, colors.white),
("↓ RV pressure rises → suprasystemic", RED, colors.white),
("↓ If TV competent: RV hypertension → coronary fistulae/RVDCC", ORANGE, colors.white),
("↓ If TV regurgitant: RV decompresses via TR → less RVDCC risk", GREEN, colors.white),
("↓ Right-to-left shunt via PFO/ASD (mandatory for survival)", MED_BLUE, colors.white),
("↓ PDA = sole source of pulmonary blood flow (ductal-dependent)", RED, colors.white),
("↓ PROSTAGLANDIN E1 infusion essential from diagnosis", GOLD, DARK_BLUE),
]
for step_text, bg_col, fg_col in flow_steps:
fd = [[Paragraph(step_text, S('fs', fontName='Helvetica-Bold', fontSize=9,
textColor=fg_col, alignment=TA_CENTER))]]
ft = Table(fd, colWidths=[16.6*cm])
ft.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), bg_col),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),5),
('RIGHTPADDING',(0,0),(-1,-1),5),
]))
story.append(ft)
story.append(Spacer(1, 1))
story.append(Spacer(1, 0.2*cm))
# RVDCC warning box
rvdcc_box = Table([[
Paragraph("⚠ RVDCC — EXAM CRITICAL CONCEPT: In RVDCC, coronary flow is RETROGRADE from RV. "
"Decompressing the RV (RVOT surgery, CPB, ECMO) drops RV pressure → coronary steal → "
"myocardial ischemia → sudden death. Ostial atresia (coronary ostia absent) = 100% mortality "
"with single-ventricle palliation in Cheung series. RVDCC = maintain RV preload during CPB "
"(bicaval snare + RA cannula for RV filling).", warn)
]], colWidths=[17*cm])
rvdcc_box.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), RED_LIGHT),
('BOX',(0,0),(-1,-1),2, RED),
('TOPPADDING',(0,0),(-1,-1),6),
('BOTTOMPADDING',(0,0),(-1,-1),6),
('LEFTPADDING',(0,0),(-1,-1),8),
('RIGHTPADDING',(0,0),(-1,-1),8),
]))
story.append(rvdcc_box)
story.append(PageBreak())
# =========================================================
# PAGE 2 — DIAGNOSIS & INITIAL MANAGEMENT
# =========================================================
story.append(header_box("PAGE 2 — DIAGNOSIS, CLINICAL PRESENTATION & INITIAL MANAGEMENT", bg=DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
# Clinical presentation
story.append(header_box("CLINICAL PRESENTATION", bg=MED_BLUE, size=10))
story.append(Spacer(1, 0.1*cm))
cp_data = [
[Paragraph("HISTORY/PRESENTATION", S('cph', fontName='Helvetica-Bold', fontSize=9, textColor=DARK_BLUE)),
Paragraph("EXAM FINDINGS", S('cph2', fontName='Helvetica-Bold', fontSize=9, textColor=DARK_BLUE))],
[Paragraph("• Full-term, well-developed neonate (typical)\n• Cyanosis worsening as ductus closes (hours to days)\n• Ductal-dependent circulation\n• May be detected prenatally on fetal echo\n• Differential: Critical PS, Ebstein anomaly, TAPVR", small),
Paragraph("• Cyanosis (central)\n• Single S2 (absent P2)\n• Holosystolic murmur (TR) in severe cases\n• Massive cardiomegaly if severe TR (Ebstein-like)\n• Normal or reduced pulmonary vascularity on CXR", small)],
]
cp_table = Table(cp_data, colWidths=[8.5*cm, 8.5*cm])
cp_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), LIGHT_BLUE),
('BOX',(0,0),(-1,-1),1,MED_BLUE),
('GRID',(0,0),(-1,-1),0.3,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),4),
('BOTTOMPADDING',(0,0),(-1,-1),4),
('LEFTPADDING',(0,0),(-1,-1),5),
]))
story.append(cp_table)
story.append(Spacer(1, 0.2*cm))
# Investigations table
story.append(header_box("DIAGNOSTIC INVESTIGATIONS — HIGH YIELD TABLE", bg=MED_BLUE, size=10))
inv_data = [
[Paragraph("Investigation", table_header),
Paragraph("Typical Findings", table_header),
Paragraph("Exam Pearl", table_header)],
[Paragraph("ECG", table_cell_l),
Paragraph("QRS axis 0–120°; decreased anterior RV forces; dominant LV pattern", table_cell_l),
Paragraph("LV dominance on ECG in PA/IVS (unlike TOF where RVH dominates)", table_cell_l)],
[Paragraph("CXR", table_cell_l),
Paragraph("Variable cardiac size; ↓ pulmonary vascularity; massive cardiomegaly if severe TR", table_cell_l),
Paragraph("'Boot-shaped' heart if RVH; massive cardiomegaly = Ebstein-like TR", table_cell_l)],
[Paragraph("TTE (primary)", table_cell_l),
Paragraph("TV size/function; RV size & morphology; infundibular cavity; PDA; PFO; coronary fistulae", table_cell_l),
Paragraph("TTE is the PRIMARY modality; determines TV z-score; assesses all 3 pillars", table_cell_l)],
[Paragraph("Cardiac cath", table_cell_l),
Paragraph("RV ventriculography; coronary angiography; hemodynamics; balloon atrial septostomy if needed", table_cell_l),
Paragraph("MANDATORY to diagnose RVDCC; coronary angiography non-negotiable before any surgery", table_cell_l)],
[Paragraph("CT / MRI", table_cell_l),
Paragraph("Complex PA anatomy; RV volume assessment; post-op follow-up; 'rehabilitated' RV at 10 yr", table_cell_l),
Paragraph("MRI at 10 yr follow-up shows RV recruitment after early decompression", table_cell_l)],
]
inv_table = Table(inv_data, colWidths=[3*cm, 7*cm, 7*cm])
inv_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), DARK_BLUE),
('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white, LIGHT_GREY]),
('GRID',(0,0),(-1,-1),0.5,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),4),
('RIGHTPADDING',(0,0),(-1,-1),4),
]))
story.append(inv_table)
story.append(Spacer(1, 0.2*cm))
# Initial management flowchart
story.append(header_box("INITIAL MANAGEMENT ALGORITHM", bg=MED_BLUE, size=10))
mgmt_steps = [
"STEP 1: SUSPECT PA/IVS → Cyanotic newborn, single S2, ↓ pulmonary vascularity on CXR",
"STEP 2: START PGE1 INFUSION IMMEDIATELY (0.05–0.1 mcg/kg/min) → maintain PDA",
"STEP 3: CXR + ECG + TTE → confirm diagnosis, assess TV z-score, RV morphology",
"STEP 4: Cardiac catheterization → RV ventriculography + CORONARY ANGIOGRAPHY (rule out RVDCC)",
"STEP 5: Stabilize → correct acidosis, optimize ventilation, inotropes if needed",
"STEP 6: Ensure unrestricted ASD/PFO (balloon septostomy if restrictive)",
"STEP 7: Surgical or transcatheter palliation based on anatomic features",
]
for i, step in enumerate(mgmt_steps):
bg = [DARK_BLUE, MED_BLUE, LIGHT_BLUE, ORANGE_LIGHT, GREEN_LIGHT, LIGHT_BLUE, GOLD_LIGHT][i]
fg = [colors.white, colors.white, DARK_BLUE, DARK_BLUE, DARK_BLUE, DARK_BLUE, DARK_BLUE][i]
sd = [[Paragraph(step, S('ms', fontName='Helvetica-Bold', fontSize=8.5, textColor=fg))]]
st = Table(sd, colWidths=[16.6*cm])
st.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), bg),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),8),
('BOX',(0,0),(-1,-1),0.5,colors.grey),
]))
story.append(st)
if i < len(mgmt_steps)-1:
arr = [[Paragraph("▼", S('arr', fontName='Helvetica-Bold', fontSize=10, textColor=MED_BLUE, alignment=TA_CENTER))]]
at = Table(arr, colWidths=[16.6*cm])
at.setStyle(TableStyle([('TOPPADDING',(0,0),(-1,-1),0),('BOTTOMPADDING',(0,0),(-1,-1),0)]))
story.append(at)
story.append(Spacer(1, 0.2*cm))
# PGE1 teaching note
pge_box = Table([[
Paragraph("TEACHING NOTE — PGE1: The most important drug in ductal-dependent lesions. "
"PGE1 maintains PDA patency → ensures pulmonary blood flow. "
"Side effects: apnea (most feared), fever, hypotension, cortical hyperostosis (long term). "
"Always have respiratory support ready when starting PGE1.",
S('tn', fontName='Helvetica', fontSize=8.5, textColor=DARK_BLUE, leading=12))
]], colWidths=[17*cm])
pge_box.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), GOLD_LIGHT),
('BOX',(0,0),(-1,-1),1.5, GOLD),
('TOPPADDING',(0,0),(-1,-1),6),
('BOTTOMPADDING',(0,0),(-1,-1),6),
('LEFTPADDING',(0,0),(-1,-1),8),
]))
story.append(pge_box)
story.append(PageBreak())
# =========================================================
# PAGE 3 — SURGICAL MANAGEMENT
# =========================================================
story.append(header_box("PAGE 3 — SURGICAL MANAGEMENT & DECISION ALGORITHM", bg=DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
# Decision algorithm
story.append(header_box("SURGICAL DECISION ALGORITHM (HIGH YIELD FLOWCHART)", bg=MED_BLUE, size=10))
story.append(Spacer(1, 0.1*cm))
algo_data = [
[Paragraph("ALL PA/IVS PATIENTS", S('top', fontName='Helvetica-Bold', fontSize=10,
textColor=colors.white, alignment=TA_CENTER))],
]
algo_t = Table(algo_data, colWidths=[17*cm])
algo_t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1),DARK_BLUE),
('TOPPADDING',(0,0),(-1,-1),5),
('BOTTOMPADDING',(0,0),(-1,-1),5),
('BOX',(0,0),(-1,-1),2,GOLD),
]))
story.append(algo_t)
branch_data = [
[Paragraph("TV z-score ≥ −2\nTripartite RV\nNo RVDCC",
S('b1', fontName='Helvetica-Bold', fontSize=9, textColor=DARK_BLUE, alignment=TA_CENTER)),
Paragraph("TV z-score −2 to −4\nBipartite RV\n± RVDCC possible",
S('b2', fontName='Helvetica-Bold', fontSize=9, textColor=DARK_BLUE, alignment=TA_CENTER)),
Paragraph("TV z-score < −4\nUnipartite RV\nRVDCC present",
S('b3', fontName='Helvetica-Bold', fontSize=9, textColor=RED, alignment=TA_CENTER))],
[Paragraph("↓\nRV DECOMPRESSION\n(Transcatheter or surgical)\n+\nSystemic-PA shunt if needed\n(mBT or central shunt)\n\nTarget: Biventricular repair\n→ ASD closure at follow-up\n→ Shunt takedown",
S('r1', fontName='Helvetica', fontSize=8, textColor=DARK_BLUE)),
Paragraph("↓\nRV DECOMPRESSION\n+\nSystemic-PA shunt\n\nIf RV recruits adequately\n→ BIVENTRICULAR REPAIR\n\nIf RV fails to recruit\n→ 1.5 VENTRICLE REPAIR\n(Bidirectional Glenn + RVOT patch)\n→ ± ASD fenestration (4mm)",
S('r2', fontName='Helvetica', fontSize=8, textColor=DARK_BLUE)),
Paragraph("↓\nInitial neonatal palliation\n(Systemic-PA shunt / PDA stent)\n\n2nd stage at 3–6 months:\nBidirectional Glenn\n\nFontan completion\n(3–4 years)\n\n⚠ RVDCC: CPB with\nbicaval snare + RA perfusion\nkeep RV beating/filled",
S('r3', fontName='Helvetica', fontSize=8, textColor=RED))],
[Paragraph("BIVENTRICULAR\nREPAIR", S('out1', fontName='Helvetica-Bold', fontSize=9, textColor=GREEN, alignment=TA_CENTER)),
Paragraph("BIVENTRICULAR or\n1.5-VENTRICLE REPAIR", S('out2', fontName='Helvetica-Bold', fontSize=9, textColor=ORANGE, alignment=TA_CENTER)),
Paragraph("SINGLE-VENTRICLE\n(FONTAN) PALLIATION", S('out3', fontName='Helvetica-Bold', fontSize=9, textColor=RED, alignment=TA_CENTER))],
]
branch_table = Table(branch_data, colWidths=[5.6*cm, 5.6*cm, 5.6*cm])
branch_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(0,0), GREEN_LIGHT),
('BACKGROUND',(1,0),(1,0), ORANGE_LIGHT),
('BACKGROUND',(2,0),(2,0), RED_LIGHT),
('BACKGROUND',(0,1),(0,1), HexColor('#eafaf1')),
('BACKGROUND',(1,1),(1,1), HexColor('#fef5e7')),
('BACKGROUND',(2,1),(2,1), HexColor('#fdedec')),
('BACKGROUND',(0,2),(0,2), GREEN_LIGHT),
('BACKGROUND',(1,2),(1,2), ORANGE_LIGHT),
('BACKGROUND',(2,2),(2,2), RED_LIGHT),
('BOX',(0,0),(0,-1),1.5,GREEN),
('BOX',(1,0),(1,-1),1.5,ORANGE),
('BOX',(2,0),(2,-1),1.5,RED),
('GRID',(0,0),(-1,-1),0.3,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),5),
('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),5),
('RIGHTPADDING',(0,0),(-1,-1),5),
]))
story.append(branch_table)
story.append(Spacer(1, 0.2*cm))
# Surgical options table
story.append(header_box("SURGICAL OPTIONS — DETAILED TABLE", bg=MED_BLUE, size=10))
surg_data = [
[Paragraph("Procedure", table_header),
Paragraph("Indication", table_header),
Paragraph("Key Points", table_header)],
[Paragraph("Transcatheter pulmonary valve perforation + balloon valvuloplasty", table_cell_l),
Paragraph("Membranous PA, mild-moderate RV hypoplasia, no RVDCC", table_cell_l),
Paragraph("Increasing popularity; avoids CPB; follow-up cath at 6-12 months; may need supplementary shunt", table_cell_l)],
[Paragraph("Surgical pulmonary valvotomy + RVOT/transannular patch", table_cell_l),
Paragraph("Membranous or muscular PA with formed infundibulum", table_cell_l),
Paragraph("CPB required; direct visualization; RVOT augmentation with pericardial patch; RV decompression promotes growth", table_cell_l)],
[Paragraph("Modified Blalock-Taussig (mBT) shunt (3–3.5mm PTFE, innominate → RPA)", table_cell_l),
Paragraph("Need for reliable pulmonary blood flow source (all severity)", table_cell_l),
Paragraph("Can be done with or without CPB; PDA ligated and divided; most commonly used shunt", table_cell_l)],
[Paragraph("Central systemic-PA shunt", table_cell_l),
Paragraph("Alternative to mBT; favorable anatomy", table_cell_l),
Paragraph("Ascending aorta to MPA; requires CPB", table_cell_l)],
[Paragraph("PDA stenting (transcatheter)", table_cell_l),
Paragraph("Alternative to surgical shunt; gaining popularity", table_cell_l),
Paragraph("Avoids surgery/CPB; useful in unstable neonates; may be combined with transcatheter valve perforation", table_cell_l)],
[Paragraph("1.5-Ventricle repair", table_cell_l),
Paragraph("Failed biventricular candidate; bipartite RV with some function", table_cell_l),
Paragraph("BDG + RVOT reconstruction + ± fenestrated ASD closure; IVC → RV → PA; SVC → directly to PA", table_cell_l)],
[Paragraph("Staged Fontan (BDG → Fontan)", table_cell_l),
Paragraph("Severe RV hypoplasia, RVDCC, unipartite RV", table_cell_l),
Paragraph("BDG at 3-6 months; Fontan at 3-4 years; RVDCC patients: 50% mortality if RV decompressed", table_cell_l)],
]
surg_table = Table(surg_data, colWidths=[4.5*cm, 4.5*cm, 8*cm])
surg_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), DARK_BLUE),
('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white, LIGHT_GREY]),
('GRID',(0,0),(-1,-1),0.5,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),4),
('RIGHTPADDING',(0,0),(-1,-1),4),
]))
story.append(surg_table)
story.append(Spacer(1, 0.2*cm))
# Follow-up cath box
followup = Table([[
Paragraph("FOLLOW-UP CARDIAC CATHETERIZATION PROTOCOL (After initial RV decompression):\n"
"• Timing: 6–12 months post-initial palliation\n"
"• Occlude systemic-PA shunt → assess O2 saturation\n"
"• Occlude ASD → assess RA pressure (target: <15 mmHg)\n"
"• If RA pressure <15 mmHg with adequate CO → ASD closure (percutaneous)\n"
"• Shunt can be closed during same catheterization session",
S('fc', fontName='Helvetica', fontSize=8.5, textColor=DARK_BLUE, leading=13))
]], colWidths=[17*cm])
followup.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), LIGHT_BLUE),
('BOX',(0,0),(-1,-1),1.5, MED_BLUE),
('TOPPADDING',(0,0),(-1,-1),6),
('BOTTOMPADDING',(0,0),(-1,-1),6),
('LEFTPADDING',(0,0),(-1,-1),8),
]))
story.append(followup)
story.append(PageBreak())
# =========================================================
# PAGE 4 — OUTCOMES, LANDMARK STUDIES & EXAM PEARLS
# =========================================================
story.append(header_box("PAGE 4 — OUTCOMES, LANDMARK TRIALS & EXAM PEARLS", bg=DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
# Outcomes table
story.append(header_box("SURGICAL OUTCOMES — KEY DATA POINTS", bg=MED_BLUE, size=10))
out_data = [
[Paragraph("Series / Reference", table_header),
Paragraph("N", table_header),
Paragraph("Key Finding", table_header)],
[Paragraph("Hanley et al. 1993\n(J Thorac Cardiovasc Surg)", table_cell_l),
Paragraph("Multi-institutional", table_cell),
Paragraph("Landmark multicenter outcomes study; established role of TV z-score and RV morphology as predictors", table_cell_l)],
[Paragraph("Schneider et al. 2014", table_cell_l),
Paragraph("60", table_cell),
Paragraph("87% survival at 10 years follow-up", table_cell_l)],
[Paragraph("Zheng et al. 2016\n(single-center)", table_cell_l),
Paragraph("33", table_cell),
Paragraph("Single-stage: 97%, 94%, 88% at 1, 5, 15 years\nStaged: 90%, 88%, 69% at 1, 5, 15 years", table_cell_l)],
[Paragraph("Cheung et al. 2014\n(Ann Thorac Surg)", table_cell_l),
Paragraph("Multicenter", table_cell),
Paragraph("50% mortality in RVDCC; 100% mortality in RVDCC with ostial atresia undergoing single-ventricle palliation", table_cell_l)],
[Paragraph("Elias et al.\n(RVDCC Fontan outcomes)", table_cell_l),
Paragraph("—", table_cell),
Paragraph("Presence vs absence of RVDCC: dramatically worse Fontan outcomes with RVDCC (significant mortality difference)", table_cell_l)],
[Paragraph("Mayo Clinic Adult\nSurvivors Study", table_cell_l),
Paragraph("20 adults\n1998–2009", table_cell),
Paragraph("100% needed reintervention in adulthood; 80% atrial arrhythmias; 15% ventricular arrhythmias; TV replacement most common", table_cell_l)],
[Paragraph("Overall modern era\n(multiple series)", table_cell_l),
Paragraph("—", table_cell),
Paragraph("Overall survival ~90% at 5–10 years; ~60% at 10–15 years", table_cell_l)],
]
out_table = Table(out_data, colWidths=[4.5*cm, 2.5*cm, 10*cm])
out_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), DARK_BLUE),
('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white, LIGHT_GREY]),
('GRID',(0,0),(-1,-1),0.5,colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),4),
('RIGHTPADDING',(0,0),(-1,-1),4),
]))
story.append(out_table)
story.append(Spacer(1, 0.2*cm))
# Predictors of biventricular repair
story.append(header_box("PREDICTORS OF SUCCESSFUL BIVENTRICULAR REPAIR (HIGH YIELD)", bg=MED_BLUE, size=10))
pred_data = [
["✅ TV z-score ≥ −2", "✅ Tripartite (near-normal) RV", "✅ Absence of RVDCC"],
["✅ Significant tricuspid regurgitation\n(decompresses RV, reduces RVDCC risk)", "✅ Membranous (not muscular) atresia", "✅ Adequate RVOT/infundibulum"],
]
pred_rows = []
for row in pred_data:
pred_rows.append([Paragraph(cell, S('pr', fontName='Helvetica', fontSize=8.5, leading=12)) for cell in row])
pred_table = Table(pred_rows, colWidths=[5.6*cm, 5.6*cm, 5.6*cm])
pred_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), GREEN_LIGHT),
('BOX',(0,0),(-1,-1),1.5, GREEN),
('GRID',(0,0),(-1,-1),0.5, colors.grey),
('TOPPADDING',(0,0),(-1,-1),5),
('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),6),
('VALIGN',(0,0),(-1,-1),'TOP'),
]))
story.append(pred_table)
story.append(Spacer(1, 0.2*cm))
# EXAM PEARLS section
story.append(header_box("🔥 INI SS CET EXAM PEARLS — PA/IVS", bg=RED, size=11))
story.append(Spacer(1, 0.1*cm))
pearls = [
("PEARL 1", "PA/IVS is distinguished from PA/VSD by: intact IVS + usually normal PAs + no MAPCAs"),
("PEARL 2", "TV z-score is the MOST important single predictor of surgical outcome and RV recruitment"),
("PEARL 3", "RVDCC = most feared anatomic variant; coronary flow is RETROGRADE from RV; decompression kills"),
("PEARL 4", "Membranous PA (75%) is amenable to transcatheter perforation; muscular PA (25%) is NOT"),
("PEARL 5", "PGE1 must be started IMMEDIATELY when PA/IVS is suspected — before echocardiography if needed"),
("PEARL 6", "Coronary angiography is MANDATORY before any surgical intervention to identify RVDCC"),
("PEARL 7", "RA pressure <15 mmHg at cath = criterion for ASD closure in biventricular repair pathway"),
("PEARL 8", "1.5-ventricle repair = BDG + RVOT reconstruction; SVC → directly to PA; IVC → RV → PA"),
("PEARL 9", "Atrial arrhythmias occur in 80% of adult survivors; all require reintervention"),
("PEARL 10", "Weinberg (1962) = first successful surgical repair of PA/IVS by transventricular valvotomy"),
]
for title, text in pearls:
pearl_row = Table([[
Paragraph(title, S('pt', fontName='Helvetica-Bold', fontSize=9, textColor=RED, leading=12)),
Paragraph(text, S('pb', fontName='Helvetica', fontSize=9, leading=12))
]], colWidths=[2.5*cm, 14.5*cm])
pearl_row.setStyle(TableStyle([
('BACKGROUND',(0,0),(0,0), RED_LIGHT),
('BACKGROUND',(1,0),(1,0), colors.white),
('BOX',(0,0),(-1,-1),0.5, RED),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),4),
('BOTTOMPADDING',(0,0),(-1,-1),4),
('LEFTPADDING',(0,0),(-1,-1),5),
]))
story.append(pearl_row)
story.append(Spacer(1, 2))
story.append(Spacer(1, 0.2*cm))
# Memory aids
story.append(header_box("MEMORY AIDS & MNEMONICS", bg=PURPLE, size=10))
story.append(Spacer(1, 0.1*cm))
mnem_data = [
[Paragraph("PA/IVS ANATOMY = '3T' Framework:\nTricuspid valve z-score\nTripartite vs bipartite vs unipartite RV\nType of pulmonary atresia (Membranous vs Muscular)\n→ Determines ALL management decisions",
S('m1', fontName='Helvetica-BoldOblique', fontSize=9, textColor=PURPLE, leading=14)),
Paragraph("RVDCC RED FLAGS (DECO):\nD — Deoxygenated blood to myocardium\nE — ECG: ischemia if RV decompressed\nC — Coronary flow = Retrograde from RV\nO — Ostial atresia = 100% mortality with SV palliation\n→ Never decompress RV without addressing RVDCC",
S('m2', fontName='Helvetica-BoldOblique', fontSize=9, textColor=RED, leading=14))],
[Paragraph("BIVENTRICULAR REPAIR CRITERIA (TAT):\nT — TV z-score ≥ −2\nA — Absence of RVDCC\nT — Tripartite RV\n(+ adequate TR = lower RVDCC risk = helps BiV candidacy)",
S('m3', fontName='Helvetica-BoldOblique', fontSize=9, textColor=GREEN, leading=14)),
Paragraph("FONTAN PATHWAY (SVP):\nS — Severe RV hypoplasia (unipartite)\nV — RVDCC present\nP — Poor TV function with unipartite RV\n→ Neonatal shunt → BDG at 3-6 months → Fontan at 3-4 yrs",
S('m4', fontName='Helvetica-BoldOblique', fontSize=9, textColor=ORANGE, leading=14))],
]
mnem_table = Table(mnem_data, colWidths=[8.5*cm, 8.5*cm])
mnem_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(0,0), PURPLE_LIGHT),
('BACKGROUND',(1,0),(1,0), RED_LIGHT),
('BACKGROUND',(0,1),(0,1), GREEN_LIGHT),
('BACKGROUND',(1,1),(1,1), ORANGE_LIGHT),
('BOX',(0,0),(0,0),1, PURPLE),
('BOX',(1,0),(1,0),1, RED),
('BOX',(0,1),(0,1),1, GREEN),
('BOX',(1,1),(1,1),1, ORANGE),
('GRID',(0,0),(-1,-1),0.3, colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),6),
('BOTTOMPADDING',(0,0),(-1,-1),6),
('LEFTPADDING',(0,0),(-1,-1),6),
]))
story.append(mnem_table)
story.append(PageBreak())
# =========================================================
# PAGE 5 — LAST MINUTE REVISION TABLE
# =========================================================
story.append(header_box("PAGE 5 — LAST MINUTE REVISION & PROBABLE INI SS QUESTIONS", bg=DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
# Rapid fire comparison
story.append(header_box("RAPID FIRE COMPARISON TABLE — PA/IVS vs RELATED CONDITIONS", bg=MED_BLUE, size=10))
compare_data = [
[Paragraph("Feature", table_header),
Paragraph("PA/IVS", table_header),
Paragraph("PA/VSD", table_header),
Paragraph("Critical PS", table_header),
Paragraph("Ebstein Anomaly", table_header)],
[Paragraph("IVS", table_cell_l), Paragraph("Intact", table_cell), Paragraph("Large VSD", table_cell),
Paragraph("Intact", table_cell), Paragraph("Intact", table_cell)],
[Paragraph("PAs", table_cell_l), Paragraph("Usually normal", table_cell), Paragraph("Hypoplastic ± MAPCAs", table_cell),
Paragraph("Normal", table_cell), Paragraph("Normal", table_cell)],
[Paragraph("Coronary fistulae", table_cell_l), Paragraph("Common (50-70%)", table_cell), Paragraph("Rare", table_cell),
Paragraph("Rare", table_cell), Paragraph("Rare", table_cell)],
[Paragraph("RV", table_cell_l), Paragraph("Hypoplastic (variable)", table_cell), Paragraph("Variable", table_cell),
Paragraph("Hypertrophied", table_cell), Paragraph("Displaced inlet", table_cell)],
[Paragraph("RVDCC", table_cell_l), Paragraph("25% of cases", table_cell), Paragraph("Rare", table_cell),
Paragraph("No", table_cell), Paragraph("No", table_cell)],
[Paragraph("PGE1", table_cell_l), Paragraph("MANDATORY", table_cell), Paragraph("Often needed", table_cell),
Paragraph("Yes (ductal-dependent)", table_cell), Paragraph("Sometimes", table_cell)],
[Paragraph("ECG", table_cell_l), Paragraph("LV dominance\n↓ ant RV forces", table_cell), Paragraph("RVH", table_cell),
Paragraph("RVH", table_cell), Paragraph("RAE, RBBB,\ndelta waves (WPW)", table_cell)],
]
compare_table = Table(compare_data, colWidths=[3*cm, 3.5*cm, 3.5*cm, 3.5*cm, 3.3*cm])
compare_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), DARK_BLUE),
('BACKGROUND',(0,0),(0,-1), HexColor('#d6dbdf')),
('ROWBACKGROUNDS',(1,1),(-1,-1),[colors.white, LIGHT_GREY]),
('GRID',(0,0),(-1,-1),0.5, colors.grey),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),3),
('RIGHTPADDING',(0,0),(-1,-1),3),
('FONTNAME',(0,0),(0,-1),'Helvetica-Bold'),
('FONTSIZE',(0,0),(-1,-1),8),
]))
story.append(compare_table)
story.append(Spacer(1, 0.2*cm))
# Last minute revision summary
story.append(header_box("LAST MINUTE REVISION — ONE-LINE FACTS", bg=MED_BLUE, size=10))
lmr_items = [
"PA/IVS prevalence: 4–8 per 100,000 live births; 1–3% of all CHD",
"First successful repair: Weinberg (1962) — transventricular valvotomy",
"Most common anatomy: Situs solitus, levocardia, AV/VA concordance, left-sided aortic arch",
"Pulmonary arteries: Usually NORMAL size and architecture (unlike PA/VSD)",
"Membranous PA: 75%; Muscular PA: 25% (more severe, more RVDCC)",
"Coronary fistulae (sinusoids): 50–70% of cases",
"RVDCC: ~25% of cases; coronary flow depends on RV (retrograde)",
"TV z-score ≤−4 → unipartite RV; −4 to −2 → variable; −2 to 0 → tripartite",
"Tripartite RV: 60–80%; Bipartite: 15–30%; Unipartite: 2–10%",
"PGE1: Start immediately; maintains PDA; side effect = apnea",
"Primary diagnostic modality: Transthoracic echocardiography (TTE)",
"Cardiac catheterization: MANDATORY to identify RVDCC before any surgery",
"ASD closure criterion: RA pressure <15 mmHg with adequate CO",
"mBT shunt: 3–3.5 mm PTFE, innominate artery → right pulmonary artery",
"1.5-ventricle repair: BDG + RVOT reconstruction + ±fenestrated ASD",
"Fontan for: severe RV hypoplasia + RVDCC + unipartite RV",
"RVDCC CPB strategy: Bicaval venous snare + RA arterial cannula (keeps RV preloaded)",
"Overall survival: ~90% at 5–10 yr; ~60% at 10–15 yr",
"Schneider 2014: 87% survival at 10 years in 60 patients",
"Cheung 2014: 100% mortality in RVDCC + ostial atresia on SV palliation",
"Adult survivors: 100% need reintervention; 80% atrial arrhythmias",
"Long-term reinterventions: TV replacement, PV replacement, MV replacement",
"Quality of life: High prevalence of arrhythmias; exercise capacity reduced",
"Follow-up cath: At 6–12 months; shunt occlusion test; ASD occlusion test",
]
lmr_rows = []
for i, item in enumerate(lmr_items):
bg = colors.white if i % 2 == 0 else LIGHT_GREY
lmr_rows.append([
Paragraph(f"{i+1}.", S('lmrn', fontName='Helvetica-Bold', fontSize=8.5, textColor=MED_BLUE)),
Paragraph(item, S('lmrt', fontName='Helvetica', fontSize=8.5, leading=12))
])
lmr_table = Table(lmr_rows, colWidths=[1*cm, 16*cm])
lmr_table.setStyle(TableStyle([
('ROWBACKGROUNDS',(0,0),(-1,-1),[colors.white, LIGHT_GREY]),
('GRID',(0,0),(-1,-1),0.3, colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),2),
('BOTTOMPADDING',(0,0),(-1,-1),2),
('LEFTPADDING',(0,0),(-1,-1),4),
('BOX',(0,0),(-1,-1),1, MED_BLUE),
]))
story.append(lmr_table)
story.append(Spacer(1, 0.2*cm))
# Probable questions
story.append(header_box("PROBABLE INI SS CET QUESTIONS — TOPIC LIST", bg=RED, size=10))
pq_data = [
[Paragraph("Most Important Q Areas", S('pqh', fontName='Helvetica-Bold', fontSize=9, textColor=RED)),
Paragraph("Expected Question Type", S('pqh2', fontName='Helvetica-Bold', fontSize=9, textColor=RED))],
[Paragraph("RVDCC definition and consequences", small),
Paragraph("Single best answer: 'In PA/IVS with RVDCC, decompressing the RV leads to…'", small)],
[Paragraph("TV z-score and surgical decision", small),
Paragraph("Vignette: 'PA/IVS neonate with TV z-score of −1.5 — best surgical option?'", small)],
[Paragraph("Coronary angiography indication", small),
Paragraph("'Before surgical repair of PA/IVS, mandatory investigation is…'", small)],
[Paragraph("CPB strategy in RVDCC", small),
Paragraph("'Cannulation strategy for CPB in PA/IVS with RVDCC is…'", small)],
[Paragraph("Types of pulmonary atresia", small),
Paragraph("'Membranous vs muscular PA/IVS — which can undergo transcatheter perforation?'", small)],
[Paragraph("1.5-ventricle repair components", small),
Paragraph("'Which of the following components are part of 1.5 ventricle repair?'", small)],
[Paragraph("Fontan outcomes with RVDCC", small),
Paragraph("'According to Cheung et al., mortality in RVDCC with ostial atresia on SV palliation is…'", small)],
[Paragraph("PGE1 initiation", small),
Paragraph("Clinical scenario: 'First treatment on establishing diagnosis of PA/IVS in neonate…'", small)],
[Paragraph("Follow-up cath criteria", small),
Paragraph("'Criterion for ASD closure in biventricular repair pathway at follow-up cath…'", small)],
]
pq_table = Table(pq_data, colWidths=[6*cm, 11*cm])
pq_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), RED_LIGHT),
('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white, LIGHT_GREY]),
('GRID',(0,0),(-1,-1),0.5, colors.grey),
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),3),
('BOTTOMPADDING',(0,0),(-1,-1),3),
('LEFTPADDING',(0,0),(-1,-1),5),
('BOX',(0,0),(-1,-1),1.5, RED),
]))
story.append(pq_table)
story.append(Spacer(1, 0.2*cm))
# Footer
footer_data = [[
Paragraph("Chapter 123 — PA/IVS | INI SS CET CVTS High Yield Notes | "
"Sources: Sabiston & Spencer Surgery of the Chest (Ch.123), Hanley et al. 1993, Cheung et al. 2014, Zheng et al. 2016",
S('footer', fontName='Helvetica-Oblique', fontSize=7.5, textColor=GREY, alignment=TA_CENTER))
]]
footer_table = Table(footer_data, colWidths=[17*cm])
footer_table.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), LIGHT_GREY),
('BOX',(0,0),(-1,-1),0.5, GREY),
('TOPPADDING',(0,0),(-1,-1),4),
('BOTTOMPADDING',(0,0),(-1,-1),4),
]))
story.append(footer_table)
doc.build(story)
print(f"✅ PDF 1 generated: {OUTPUT}")
Update
cd /home/daytona/workspace/PA_IVS_Chapter123 && python3 generate_pdf1_notes.py 2…
~/PA_IVS_Chapter123/generate_pdf2_mcqs.py
#!/usr/bin/env python3
"""Generate 25 MCQs PDF for PA/IVS Chapter 123 — INI SS CET CVTS"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.lib.colors import HexColor
OUTPUT = "/home/daytona/workspace/PA_IVS_Chapter123/02_MCQs_PA_IVS_25Questions.pdf"
DARK_BLUE = HexColor('#003366')
MED_BLUE = HexColor('#1a5276')
LIGHT_BLUE = HexColor('#d6eaf8')
GOLD = HexColor('#b7950b')
GOLD_LIGHT = HexColor('#fef9e7')
RED = HexColor('#922b21')
RED_LIGHT = HexColor('#fadbd8')
GREEN = HexColor('#1e8449')
GREEN_LIGHT= HexColor('#d5f5e3')
ORANGE = HexColor('#d35400')
GREY = HexColor('#616a6b')
LIGHT_GREY = HexColor('#f2f3f4')
PURPLE = HexColor('#6c3483')
PURPLE_LIGHT=HexColor('#f5eef8')
doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
topMargin=1.5*cm, bottomMargin=1.5*cm,
leftMargin=1.8*cm, rightMargin=1.8*cm)
def S(name, **kw): return ParagraphStyle(name, **kw)
body = S('body', fontName='Helvetica', fontSize=9.5, leading=14, spaceAfter=3)
bold = S('bold', fontName='Helvetica-Bold', fontSize=9.5, leading=14)
option = S('opt', fontName='Helvetica', fontSize=9.5, leading=14, leftIndent=14)
opt_lbl = S('optl', fontName='Helvetica-Bold', fontSize=9.5, leading=14, leftIndent=14)
small = S('sm', fontName='Helvetica', fontSize=8.5, leading=12, textColor=GREY)
center = S('ctr', fontName='Helvetica', fontSize=9.5, leading=14, alignment=TA_CENTER)
italic = S('itl', fontName='Helvetica-Oblique', fontSize=8.5, leading=11, textColor=GREY)
def header_box(text, bg=DARK_BLUE, fg=colors.white, size=12):
d = [[Paragraph(text, S('hb', fontName='Helvetica-Bold', fontSize=size,
textColor=fg, alignment=TA_CENTER, leading=size+4))]]
t = Table(d, colWidths=[17*cm])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1),bg),
('TOPPADDING',(0,0),(-1,-1),7),
('BOTTOMPADDING',(0,0),(-1,-1),7),
('LEFTPADDING',(0,0),(-1,-1),8),
]))
return t
def q_number_box(n, qtype=''):
lbl = f"Q{n}"
if qtype:
lbl += f" [{qtype}]"
d = [[Paragraph(lbl, S('ql', fontName='Helvetica-Bold', fontSize=10,
textColor=colors.white, alignment=TA_LEFT, leading=14))]]
t = Table(d, colWidths=[17*cm])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), MED_BLUE),
('TOPPADDING',(0,0),(-1,-1),4),
('BOTTOMPADDING',(0,0),(-1,-1),4),
('LEFTPADDING',(0,0),(-1,-1),8),
]))
return t
def vignette_box(text):
d = [[Paragraph(text, S('vg', fontName='Helvetica', fontSize=9.5, leading=14,
textColor=DARK_BLUE))]]
t = Table(d, colWidths=[17*cm])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), LIGHT_BLUE),
('BOX',(0,0),(-1,-1),1, MED_BLUE),
('TOPPADDING',(0,0),(-1,-1),6),
('BOTTOMPADDING',(0,0),(-1,-1),6),
('LEFTPADDING',(0,0),(-1,-1),8),
('RIGHTPADDING',(0,0),(-1,-1),8),
]))
return t
def image_desc_box(text):
d = [[Paragraph(text, S('img', fontName='Helvetica-Oblique', fontSize=9,
leading=13, textColor=PURPLE))]]
t = Table(d, colWidths=[17*cm])
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), PURPLE_LIGHT),
('BOX',(0,0),(-1,-1),1, PURPLE),
('TOPPADDING',(0,0),(-1,-1),5),
('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),8),
]))
return t
def options_table(opts):
rows = []
for lbl, txt in opts:
rows.append([
Paragraph(f"({lbl})", S('ol', fontName='Helvetica-Bold', fontSize=9.5,
textColor=DARK_BLUE, leading=14)),
Paragraph(txt, S('ot', fontName='Helvetica', fontSize=9.5, leading=14))
])
t = Table(rows, colWidths=[1*cm, 16*cm])
t.setStyle(TableStyle([
('VALIGN',(0,0),(-1,-1),'TOP'),
('TOPPADDING',(0,0),(-1,-1),2),
('BOTTOMPADDING',(0,0),(-1,-1),2),
('LEFTPADDING',(0,0),(-1,-1),4),
]))
return t
def q_block(n, qtype, stem, opts, extra=None):
items = []
items.append(q_number_box(n, qtype))
items.append(Spacer(1, 3))
if extra and extra.startswith('[IMG]'):
items.append(image_desc_box(extra[5:].strip()))
items.append(Spacer(1, 3))
elif extra:
items.append(vignette_box(extra))
items.append(Spacer(1, 3))
items.append(Paragraph(stem, S('stem', fontName='Helvetica-Bold', fontSize=9.5,
leading=14, textColor=DARK_BLUE)))
items.append(Spacer(1, 3))
items.append(options_table(opts))
items.append(Spacer(1, 8))
items.append(HRFlowable(width='100%', thickness=0.5, color=colors.grey))
items.append(Spacer(1, 6))
return KeepTogether(items)
story = []
# ===== COVER =====
story.append(Spacer(1, 0.3*cm))
cover_data = [
[Paragraph("INI SS CET — CARDIOTHORACIC & VASCULAR SURGERY", S('ct', fontName='Helvetica-Bold', fontSize=10, textColor=GOLD, alignment=TA_CENTER))],
[Paragraph("CHAPTER 123 — PULMONARY ATRESIA WITH INTACT VENTRICULAR SEPTUM", S('mt', fontName='Helvetica-Bold', fontSize=14, textColor=colors.white, alignment=TA_CENTER, leading=18))],
[Paragraph("25 SINGLE BEST ANSWER MCQs", S('st', fontName='Helvetica-Bold', fontSize=16, textColor=GOLD, alignment=TA_CENTER))],
[Paragraph("Decision Making • Clinical Scenarios • Guidelines • Landmark Trials • Imaging • Operative Judgement",
S('tt', fontName='Helvetica', fontSize=8.5, textColor=HexColor('#aed6f1'), alignment=TA_CENTER))],
[Paragraph("Time Allowed: 25 minutes | Each question carries equal marks | No negative marking",
S('inst', fontName='Helvetica-Oblique', fontSize=8.5, textColor=HexColor('#d6eaf8'), alignment=TA_CENTER))],
]
cover = Table(cover_data, colWidths=[17*cm])
cover.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,-1), DARK_BLUE),
('TOPPADDING',(0,0),(-1,-1),6),
('BOTTOMPADDING',(0,0),(-1,-1),6),
('BOX',(0,0),(-1,-1),2,GOLD),
]))
story.append(cover)
story.append(Spacer(1, 0.5*cm))
instructions = [
"INSTRUCTIONS:",
"• Each question has ONE correct answer (Single Best Answer format).",
"• Read the clinical scenario carefully before selecting your answer.",
"• Questions are based on decision-making, guidelines, landmark trials, operative judgement, hemodynamics, and imaging.",
"• Answers with detailed explanations are in the separate Answer Key document.",
]
for line in instructions:
style = bold if line.startswith('INST') else body
story.append(Paragraph(line, style))
story.append(Spacer(1, 0.4*cm))
story.append(HRFlowable(width='100%', thickness=1.5, color=DARK_BLUE))
story.append(Spacer(1, 0.3*cm))
# ===== 25 QUESTIONS =====
# Q1 — Clinical scenario, initial management
story.append(q_block(
1, "Clinical Scenario / Initial Management",
"What is the MOST IMPORTANT immediate intervention when a ductal-dependent cyanotic lesion is suspected in a neonate in the delivery suite?",
[('a', 'Emergency surgical systemic-to-pulmonary artery shunt'),
('b', 'Intravenous prostaglandin E1 (PGE1) infusion'),
('c', 'Urgent cardiac catheterization with coronary angiography'),
('d', 'Balloon atrial septostomy (Rashkind procedure)')],
))
# Q2 — Anatomy
story.append(q_block(
2, "Anatomy",
"A TV z-score of −5 in a neonate with PA/IVS MOST LIKELY indicates which morphological variant of the right ventricle?",
[('a', 'Tripartite right ventricle with normal infundibulum'),
('b', 'Bipartite right ventricle with absent apical trabecular component'),
('c', 'Unipartite right ventricle with severely hypoplastic cavity'),
('d', 'Tripartite right ventricle with mild hypoplasia')],
))
# Q3 — RVDCC concept
story.append(q_block(
3, "Pathophysiology — RVDCC",
"In a neonate with PA/IVS and right ventricle–dependent coronary circulation (RVDCC), which of the following hemodynamic events is most feared following RV decompression?",
[('a', 'Pulmonary over-circulation and congestive heart failure'),
('b', 'Sudden coronary artery steal with myocardial ischemia and death'),
('c', 'Paradoxical embolism through the patent foramen ovale'),
('d', 'Progressive tricuspid valve regurgitation and right heart dilatation')],
))
# Q4 — Vignette, surgical decision
story.append(q_block(
4, "Vignette — Operative Judgement",
"What is the MOST APPROPRIATE surgical strategy for this neonate?",
[('a', 'Transcatheter pulmonary valve wire perforation and balloon valvuloplasty'),
('b', 'Staged single-ventricle palliation (systemic-PA shunt → BDG → Fontan)'),
('c', 'RV decompression with transannular patch + modified Blalock-Taussig shunt'),
('d', 'Urgent cardiac transplantation')],
extra="A 2-day-old term neonate presents with central cyanosis and oxygen saturation of 65% on room air. "
"Echocardiography reveals membranous pulmonary atresia with an intact ventricular septum, TV z-score of −1.8, "
"tripartite right ventricle, no evidence of RVDCC on initial assessment, and a left-sided PDA with confluent normal pulmonary arteries. "
"The neonate is currently on PGE1 infusion and is hemodynamically stable."
))
# Q5 — Imaging / ECG
story.append(q_block(
5, "Imaging — ECG Interpretation",
"Which of the following ECG findings is CHARACTERISTIC of PA/IVS in a neonate, distinguishing it from tetralogy of Fallot?",
[('a', 'Right axis deviation with right ventricular hypertrophy (dominant R in V1)'),
('b', 'Left ventricular dominance with decreased anterior right ventricular forces'),
('c', 'Complete right bundle branch block with epsilon waves'),
('d', 'Delta waves with short PR interval suggesting Wolff-Parkinson-White syndrome')],
))
# Q6 — Landmark trial (Hanley)
story.append(q_block(
6, "Landmark Trial",
"The 1993 multicenter study by Hanley et al. (J Thorac Cardiovasc Surg) on neonatal PA/IVS established which of the following as the KEY predictor of achieving biventricular repair?",
[('a', 'Presence of a muscular infundibulum on cardiac CT'),
('b', 'TV z-score, RV morphology, and absence of RVDCC'),
('c', 'Pulmonary artery index (Nakata score) > 150 mm²/m²'),
('d', 'Mean pulmonary artery pressure < 15 mmHg at cardiac catheterization')],
))
# Q7 — Guideline / criterion
story.append(q_block(
7, "Guidelines — ASD Closure Criterion",
"During follow-up cardiac catheterization at 6–12 months in a PA/IVS patient who underwent RV decompression and systemic-PA shunt, which hemodynamic criterion must be met before the ASD can be closed to progress toward biventricular repair?",
[('a', 'Mean pulmonary artery pressure < 25 mmHg'),
('b', 'Right atrial pressure < 15 mmHg with adequate cardiac output'),
('c', 'Pulmonary vascular resistance < 3 Wood units/m²'),
('d', 'Qp:Qs ratio > 1.5 with fully saturated pulmonary veins')],
))
# Q8 — Vignette RVDCC CPB
story.append(q_block(
8, "Vignette — CPB Strategy in RVDCC",
"Which CPB cannulation strategy is MOST APPROPRIATE for this patient?",
[('a', 'Standard aortic cannulation with single right atrial venous cannula and cardioplegic arrest'),
('b', 'Bicaval venous cannulation with snares AND right atrial arterial cannulation to maintain RV preload; repair performed with RV filled and beating'),
('c', 'Femoral arterial and femoral venous cannulation to avoid cardiac manipulation'),
('d', 'Deep hypothermic circulatory arrest (DHCA) with complete cardiac decompression')],
extra="A 3-week-old neonate with PA/IVS is scheduled for bidirectional Glenn procedure. "
"Pre-operative cardiac catheterization confirms right ventricle–dependent coronary circulation (RVDCC) with "
"coronary ostial atresia of the left coronary artery. The right coronary artery fills entirely from retrograde "
"RV injection with no filling seen from the aortic root."
))
# Q9 — Coronary anatomy
story.append(q_block(
9, "Coronary Anatomy",
"In PA/IVS, the MOST LETHAL anatomic variant of coronary artery disease, associated with 100% mortality when single-ventricle palliation is attempted (Cheung et al., 2014), is:",
[('a', 'RV-RCA fistulae without coronary stenosis'),
('b', 'RV-RCA fistulae with proximal coronary stenosis'),
('c', 'RVDCC with coronary ostial atresia (aortocoronary atresia)'),
('d', 'Isolated RCA dominance with hypoplastic LAD')],
))
# Q10 — 1.5 ventricle repair
story.append(q_block(
10, "Operative Judgement — 1.5 Ventricle Repair",
"A 6-month-old infant with PA/IVS underwent neonatal RV decompression and mBT shunt. Follow-up catheterization reveals: TV z-score −3.2, bipartite RV, adequate antegrade pulmonary blood flow but RA pressure rises to 22 mmHg on ASD occlusion test. The BEST surgical option is:",
[('a', 'Complete biventricular repair with ASD closure and shunt takedown'),
('b', '1.5-ventricle repair: bidirectional Glenn + RVOT reconstruction ± fenestrated ASD closure'),
('c', 'Fontan completion (total cavopulmonary connection)'),
('d', 'Continue current palliation and reassess in 12 months')],
))
# Q11 — Image-based (echo description)
story.append(q_block(
11, "Image-Based — Echocardiography",
"Based on this echocardiographic image description, what is the MOST LIKELY diagnosis and what is the NEXT best step?",
[('a', 'Critical pulmonary stenosis — proceed with balloon valvuloplasty'),
('b', 'Membranous PA/IVS — perform wire perforation of atretic pulmonary valve followed by balloon valvuloplasty'),
('c', 'Muscular PA/IVS — schedule urgent surgical RVOT reconstruction with CPB'),
('d', 'Ebstein anomaly with functional pulmonary atresia — medical management with PGE1 only')],
extra="[IMG] Transthoracic echocardiogram, apical four-chamber view and parasternal long-axis RVOT view of a 1-day-old neonate: "
"The image shows a moderately hypoplastic right ventricle with a small but identifiable infundibular cavity. "
"A thin echogenic membrane is visible at the level of the pulmonary valve annulus with NO identifiable valve motion and NO flow across it on color Doppler. "
"TV z-score measures −1.5. The left ventricle appears hypertrophied and dominant. "
"A PDA is visible with continuous left-to-right flow. No VSD is identified. "
"(This corresponds to the echocardiographic appearance described in Fig. 123.3 of the source chapter.)"
))
# Q12 — Surgical anatomy mBT shunt
story.append(q_block(
12, "Operative Detail — mBT Shunt",
"During neonatal palliation for PA/IVS, a modified Blalock-Taussig shunt is placed. Which of the following CORRECTLY describes the standard configuration used?",
[('a', 'Direct anastomosis of right subclavian artery to right pulmonary artery'),
('b', 'PTFE tube graft (3.0–3.5 mm) from innominate artery to right pulmonary artery; PDA ligated and divided'),
('c', 'PTFE tube graft (5.0 mm) from ascending aorta to main pulmonary artery; PDA stented'),
('d', 'Conduit from left subclavian artery to left pulmonary artery; PDA left patent')],
))
# Q13 — Membranous vs muscular
story.append(q_block(
13, "Decision Making — Type of Atresia",
"In PA/IVS, the type of pulmonary atresia that is MOST amenable to transcatheter wire perforation followed by balloon valvuloplasty WITHOUT CPB is:",
[('a', 'Muscular pulmonary atresia with absent infundibulum'),
('b', 'Membranous pulmonary atresia with an identifiable infundibular cavity'),
('c', 'Both types are equally amenable to transcatheter intervention'),
('d', 'Neither type — all PA/IVS requires surgical repair with CPB')],
))
# Q14 — Vignette outcome
story.append(q_block(
14, "Vignette — Fontan Outcome",
"What finding MOST SIGNIFICANTLY predicts worse Fontan completion outcomes in this patient compared to a PA/IVS patient without this feature?",
[('a', 'TV z-score of −4.5'),
('b', 'Bipartite rather than unipartite RV morphology'),
('c', 'Presence of right ventricle–dependent coronary circulation (RVDCC)'),
('d', 'Pulmonary artery pressure of 12 mmHg at pre-Fontan catheterization')],
extra="A 3.5-year-old child with PA/IVS is being evaluated for Fontan completion following bidirectional Glenn at 5 months of age. "
"Cardiac catheterization confirms: mean PA pressure 11 mmHg, PVR 1.8 Wood units/m², "
"adequate pulmonary artery growth, and the presence of RVDCC with retrograde right coronary filling from RV injection. "
"TV z-score is −4.8."
))
# Q15 — Historical
story.append(q_block(
15, "Historical Landmark",
"Who is credited with performing the FIRST successful surgical repair of pulmonary atresia with intact ventricular septum (PA/IVS) using transventricular valvotomy in 1962?",
[('a', 'Alfred Blalock'),
('b', 'C. Walton Lillehei'),
('c', 'Weinberg and colleagues'),
('d', 'Denton Cooley')],
))
# Q16 — Vignette adult survivors
story.append(q_block(
16, "Long-Term Outcomes — Adult Survivor",
"An adult survivor of PA/IVS repair in childhood is most likely to present with which of the following during long-term follow-up?",
[('a', 'Complete resolution of cardiac symptoms without need for further intervention'),
('b', 'Supravalvular pulmonary stenosis requiring conduit replacement'),
('c', 'Requirement for reintervention (valve replacement) and atrial arrhythmias in >80% of patients'),
('d', 'Progressive pulmonary arterial hypertension leading to Eisenmenger syndrome')],
))
# Q17 — Prevalence/epidemiology
story.append(q_block(
17, "Epidemiology",
"The prevalence of pulmonary atresia with intact ventricular septum (PA/IVS) among all congenital cardiac defects is approximately:",
[('a', '5% to 8%'),
('b', '1% to 3%'),
('c', '8% to 12%'),
('d', '< 0.5%')],
))
# Q18 — Vignette PDA stenting
story.append(q_block(
18, "Vignette — Transcatheter vs Surgery",
"Which of the following is the MOST ACCURATE statement regarding the current management trend for this neonate?",
[('a', 'PDA stenting is contraindicated in PA/IVS because it does not provide adequate pulmonary blood flow'),
('b', 'Transcatheter PDA stenting has gained popularity as an alternative to surgical systemic-PA shunt for neonatal palliation'),
('c', 'Surgical mBT shunt remains mandatory as transcatheter approaches have not been validated'),
('d', 'ECMO is the preferred bridge to definitive biventricular repair in all neonates with PA/IVS')],
extra="A 1-day-old neonate with PA/IVS, TV z-score −3.1, and bipartite RV is on PGE1 infusion. "
"The interventional cardiology team proposes transcatheter PDA stenting instead of surgical mBT shunt "
"given the small size and hemodynamic instability of the patient."
))
# Q19 — Coronary sinusoids
story.append(q_block(
19, "Pathophysiology — Coronary Sinusoids",
"In PA/IVS, the persistence of coronary sinusoids communicating with the coronary arterial bed (fistulae) is PRIMARILY caused by:",
[('a', 'Genetic mutation in the HEY2 transcription factor causing abnormal coronary artery development'),
('b', 'A hypertensive right ventricle forcing decompression through persistent fetal sinusoids into the coronary bed'),
('c', 'Congenital absence of the coronary ostia with compensatory sinusoidal development'),
('d', 'Elevated left ventricular pressure forcing retrograde coronary blood flow through the IVS')],
))
# Q20 — Vignette imaging (cardiac cath)
story.append(q_block(
20, "Imaging — Cardiac Catheterization",
"Which finding on cardiac catheterization CONFIRMS the diagnosis of RVDCC in this neonate?",
[('a', 'Right ventricular systolic pressure equal to systemic pressure'),
('b', 'Absence of coronary artery filling on aortic root injection, with coronary arteries filling from right ventriculography injection'),
('c', 'Pulmonary artery wedge pressure > 15 mmHg'),
('d', 'Tricuspid regurgitation jet velocity > 4 m/s on Doppler echocardiography')],
extra="A 3-day-old neonate with PA/IVS undergoes diagnostic cardiac catheterization. "
"Right ventriculography demonstrates a severely hypoplastic RV with multiple sinusoidal connections. "
"Contrast injected into the aortic root shows NO filling of either the right or left coronary systems. "
"When contrast is injected into the RV, both coronary arteries fill retrogradely."
))
# Q21 — Transannular patch
story.append(q_block(
21, "Operative Detail — Surgical Technique",
"During neonatal surgical palliation for membranous PA/IVS with RV decompression, a transannular patch is placed. Which of the following BEST describes the purpose and construction of this patch?",
[('a', 'A Dacron patch is sewn across the tricuspid valve annulus to reduce tricuspid regurgitation'),
('b', 'A pericardial patch is used to enlarge and augment the main pulmonary artery and RVOT after excision of valve tissue and obstructing infundibular muscle'),
('c', 'A patch is placed across the atrial septum to restrict interatrial shunting'),
('d', 'A Gore-Tex patch is sutured to close the patent ductus arteriosus after shunt placement')],
))
# Q22 — TV z-score limitation
story.append(q_block(
22, "Clinical Decision Making — TV z-score Limitations",
"A PA/IVS expert committee reviews their institutional data and identifies a key limitation of using TV z-score alone to predict biventricular repair candidacy. Which limitation is CORRECTLY identified?",
[('a', 'TV z-score cannot be measured by echocardiography and requires cardiac MRI'),
('b', 'TV z-score only reflects annular size and does not account for leaflet morphology, subvalvular apparatus status, or RV volume'),
('c', 'TV z-score is unreliable in premature neonates but accurate in term neonates'),
('d', 'TV z-score correlates with PA anatomy but not with RV morphology')],
))
# Q23 — Zheng outcomes
story.append(q_block(
23, "Landmark Data — Survival Statistics",
"According to Zheng et al. (2016) single-center study of 33 PA/IVS patients, the 15-year survival for patients undergoing STAGED repair (as opposed to single-stage repair) is approximately:",
[('a', '88%'),
('b', '94%'),
('c', '69%'),
('d', '97%')],
))
# Q24 — Vignette: what to do when RA pressure is high
story.append(q_block(
24, "Vignette — Intraoperative Decision",
"What is the MOST APPROPRIATE intraoperative management of the atrial septum in this situation?",
[('a', 'Proceed with complete ASD closure — the elevated RA pressure will resolve spontaneously'),
('b', 'Create a fenestration (~4 mm) in the atrial septum rather than complete closure, with intent to close percutaneously later'),
('c', 'Convert the procedure to Fontan completion immediately'),
('d', 'Leave the ASD completely open and abandon the 1.5-ventricle repair')],
extra="During 1.5-ventricle repair for PA/IVS, after completion of bidirectional Glenn anastomosis and RVOT reconstruction, "
"intraoperative hemodynamic assessment shows RA pressure of 18 mmHg when the ASD is test-occluded, "
"with a marginal cardiac output. The surgeon is deciding whether to close the ASD completely or perform a fenestration."
))
# Q25 — Comprehensive: best predictor of biventricular repair
story.append(q_block(
25, "Comprehensive — Best Overall Predictor",
"According to multiple published series on PA/IVS, which combination of factors MOST STRONGLY predicts the likelihood of achieving a successful complete biventricular repair?",
[('a', 'Pulmonary artery z-score > 0, absence of PDA, and low PVR'),
('b', 'TV z-score ≥ −2, tripartite RV, absence of RVDCC, and significant tricuspid regurgitation'),
('c', 'TV z-score < −4, unipartite RV, and presence of RVDCC with ostial atresia'),
('d', 'Membranous pulmonary atresia, normal coronary anatomy, and TV z-score between −4 and −2 only')],
))
# ===== FOOTER =====
story.append(Spacer(1, 0.3*cm))
story.append(HRFlowable(width='100%', thickness=1, color=DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
footer_data = [[
Paragraph("Chapter 123 — PA/IVS | INI SS CET CVTS | 25 MCQs | "
"Sources: Sabiston & Spencer Surgery of the Chest (Ch.123), Hanley 1993, Cheung 2014, Zheng 2016, Schneider 2014",
S('ft', fontName='Helvetica-Oblique', fontSize=7.5, textColor=GREY, alignment=TA_CENTER))
]]
story.append(Table(footer_data, colWidths=[17*cm]))
doc.build(story)
print(f"✅ PDF 2 generated: {OUTPUT}")
Stop. Received files
01 HighYield Notes PA IVS
PDF Document · PDF
02 MCQs PA IVS 25Questions
PDF Document · PDF