mgr university bsc cardiac technology 3rd year syllabus

Searching the Web

MGR University BSc Cardiac Technology 3rd year syllabus

Reading Web Page

https://www.tnmgrmu.ac.in/index.php/library/e-questions/ahs-…

Here is the B.Sc. Cardiac Technology - 3rd Year Syllabus as prescribed by The Tamil Nadu Dr. M.G.R. Medical University (TNMGRMU):

B.Sc. Cardiac Technology - Third Year Syllabus (TNMGRMU)

The 3rd year focuses entirely on the Cardiac Catheterization Laboratory across two papers, split into a 3-month basics phase and a 9-month advanced phase.

Paper I - Cardiac Catheterization Laboratory: Basics (3 months)

  • Types of catheters; catheter cleaning, packing, and sterilization techniques
  • Setting up the cardiac catheterization laboratory for a diagnostic study
  • Table movement and image intensifier movement
  • Image playback
  • Intracardiac pressures and pressure recording systems
  • Fluid-filled catheters vs. catheter-tipped manometers
  • Artifacts, damping, and ventricularzation
  • Pressure gradient recording - pullback, peak-to-peak
  • Cardiac output determination:
    • Thermodilution method
    • Oxygen dilution method
  • Principles of cardiac catheterization (Fick's equation, oximetry, etc.)

Paper II - Cardiac Catheterization Laboratory: Advanced (9 months)

This covers deeper invasive cardiology procedures and interventional techniques, including:
  • Advanced hemodynamic assessment
  • Coronary angiography techniques
  • Ventriculography
  • Valvular assessment via catheterization
  • Interventional procedures (PTCA, stenting concepts)
  • Electrophysiology basics
  • Pacemaker implantation concepts
  • Radiation physics and safety
    • Techniques of monitoring radiation exposure
    • Measures to reduce radiation exposure
  • Cine-angiographic equipment and contrast agents
  • Complications and their management

Examination Pattern - 3rd Year

S.NoSubjectIA (Max/Min)Theory (Max/Min)Practical (Max/Min)Viva
1Cardiac Catheterization Lab - Basics50 / 25100 / 5050 / 25-
2Cardiac Catheterization Lab - Advanced50 / 25100 / 5050 / 25-
  • IA = Internal Assessment
  • Assessment components: Theory (20 marks) + Practical (20 marks) + Log Book/Project/Record (10 marks)

Quick Reference: All 3 Years at a Glance

YearPapers
1st YearApplied Anatomy, Physiology & Biochemistry; Pathology, Microbiology & Pharmacology; Medical Electronics, Biophysics, Computer Usage & Basic ECG
2nd YearClinical Features & Treatment + Basic Life Support; Advanced ECG, Treadmill Stress Testing & 24-hr Ambulatory ECG/BP; Echocardiography
3rd YearCardiac Catheterization Lab - Basics; Cardiac Catheterization Lab - Advanced

Notes:
  • The above is based on the 2014-2015 regulations (currently active for most enrolled batches as per the TNMGRMU official page). The 2021-2022 batch may have a slightly revised structure.
  • The full detailed syllabus PDF is available directly from TNMGRMU: bsccardiactechnology.pdf
  • If you are from the Dr. MGR Educational and Research Institute (Deemed University, Maduravoyal), the curriculum structure may differ slightly - their B.Sc. Cardiac Care Technology uses a semester system (Semesters 5 & 6 in 3rd year).
Let me know if you need the detailed topic-wise content for any specific paper!

Create a detailed study guide PDF for 3rd year topics

Reading File
Now I'll write the comprehensive study guide Python script and generate the PDF.
Running Command

mkdir -p /home/daytona/workspace/cardiac-study-guide && ls /home/daytona/workspace/cardiac-study-guide/

give me

On it! Let me build the full study guide PDF now.
Writing File

~/cardiac-study-guide/generate_pdf.py

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.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus.flowables import HRFlowable

OUTPUT = "/home/daytona/workspace/cardiac-study-guide/BSc_Cardiac_Technology_3rdYear_StudyGuide.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    rightMargin=2*cm, leftMargin=2*cm,
    topMargin=2.5*cm, bottomMargin=2.5*cm,
    title="B.Sc. Cardiac Technology 3rd Year Study Guide",
    author="TNMGRMU Study Guide"
)

W = A4[0] - 4*cm  # usable width

# ── Styles ──────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()

cover_title = ParagraphStyle("cover_title", parent=base["Title"],
    fontSize=26, textColor=colors.HexColor("#003366"),
    spaceAfter=10, alignment=TA_CENTER, leading=32)

cover_sub = ParagraphStyle("cover_sub", parent=base["Normal"],
    fontSize=13, textColor=colors.HexColor("#555555"),
    spaceAfter=6, alignment=TA_CENTER)

h1 = ParagraphStyle("h1", parent=base["Heading1"],
    fontSize=16, textColor=colors.white,
    backColor=colors.HexColor("#003366"),
    spaceBefore=14, spaceAfter=6,
    leftIndent=-10, rightIndent=-10, leading=22,
    borderPad=6)

h2 = ParagraphStyle("h2", parent=base["Heading2"],
    fontSize=13, textColor=colors.HexColor("#003366"),
    spaceBefore=10, spaceAfter=4, leading=18,
    borderPad=0)

h3 = ParagraphStyle("h3", parent=base["Heading3"],
    fontSize=11, textColor=colors.HexColor("#C05000"),
    spaceBefore=8, spaceAfter=3, leading=16)

body = ParagraphStyle("body", parent=base["Normal"],
    fontSize=10, leading=15, spaceAfter=4,
    alignment=TA_JUSTIFY)

bullet = ParagraphStyle("bullet", parent=base["Normal"],
    fontSize=10, leading=14, spaceAfter=2,
    leftIndent=18, bulletIndent=6)

note = ParagraphStyle("note", parent=base["Normal"],
    fontSize=9, leading=13, textColor=colors.HexColor("#444444"),
    backColor=colors.HexColor("#FFF8DC"),
    leftIndent=10, rightIndent=10, borderPad=5,
    spaceAfter=6)

keypoint = ParagraphStyle("keypoint", parent=base["Normal"],
    fontSize=10, leading=14, textColor=colors.HexColor("#003300"),
    backColor=colors.HexColor("#E8F5E9"),
    leftIndent=10, rightIndent=10, borderPad=5,
    spaceAfter=4)

toc_style = ParagraphStyle("toc", parent=base["Normal"],
    fontSize=11, leading=18, leftIndent=10)

# ── Helper functions ─────────────────────────────────────────────────────────
def H1(text):
    return [Spacer(1, 0.3*cm),
            Paragraph(f"  {text}", h1),
            Spacer(1, 0.1*cm)]

def H2(text):
    return [Paragraph(text, h2),
            HRFlowable(width="100%", thickness=1,
                       color=colors.HexColor("#003366"), spaceAfter=3)]

def H3(text):
    return [Paragraph(text, h3)]

def B(text):
    return Paragraph(f"• {text}", bullet)

def P(text):
    return Paragraph(text, body)

def Note(text):
    return Paragraph(f"<b>📝 Note:</b> {text}", note)

def Key(text):
    return Paragraph(f"<b>✔ Key Point:</b> {text}", keypoint)

def HR():
    return HRFlowable(width="100%", thickness=0.5,
                      color=colors.HexColor("#CCCCCC"), spaceAfter=4)

# ── Content builder ──────────────────────────────────────────────────────────
story = []

# ─── COVER PAGE ──────────────────────────────────────────────────────────────
story.append(Spacer(1, 3*cm))
story.append(Paragraph("B.Sc. Cardiac Technology", cover_title))
story.append(Paragraph("3rd Year Comprehensive Study Guide", cover_sub))
story.append(Spacer(1, 0.4*cm))
story.append(HRFlowable(width="70%", thickness=3,
                         color=colors.HexColor("#C05000"), hAlign="CENTER"))
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph("Tamil Nadu Dr. M.G.R. Medical University", cover_sub))
story.append(Paragraph("(TNMGRMU) — Allied Health Sciences", cover_sub))
story.append(Spacer(1, 2*cm))

# Course overview table on cover
cover_data = [
    ["Programme", "B.Sc. Cardiac Technology (3 Years + Internship)"],
    ["Year / Regulation", "Third Year | 2014–2015 Regulation"],
    ["Paper I", "Cardiac Catheterization Laboratory – Basics (3 months)"],
    ["Paper II", "Cardiac Catheterization Laboratory – Advanced (9 months)"],
    ["Exam Pattern", "IA 50 | Theory 100 | Practical 50 (each paper)"],
]
ct = Table(cover_data, colWidths=[4.5*cm, W - 4.5*cm])
ct.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (0,-1), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (0,-1), colors.white),
    ("BACKGROUND", (1,0), (1,-1), colors.HexColor("#EEF4FF")),
    ("FONTNAME",   (0,0), (-1,-1), "Helvetica"),
    ("FONTSIZE",   (0,0), (-1,-1), 9.5),
    ("FONTNAME",   (0,0), (0,-1), "Helvetica-Bold"),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("VALIGN",     (0,0), (-1,-1), "MIDDLE"),
    ("TOPPADDING", (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
]))
story.append(ct)
story.append(Spacer(1, 2*cm))
story.append(Paragraph("Prepared for Students Appearing in University Examinations", cover_sub))
story.append(PageBreak())

# ─── TABLE OF CONTENTS ────────────────────────────────────────────────────────
story += H1("Table of Contents")
toc_items = [
    ("PAPER I – CARDIAC CATHETERIZATION LABORATORY: BASICS", ""),
    ("  1. Introduction to the Cardiac Catheterization Laboratory", ""),
    ("  2. Catheters – Types, Cleaning, Packing & Sterilization", ""),
    ("  3. Setting Up the Cath Lab for a Diagnostic Study", ""),
    ("  4. Equipment – Table, Image Intensifier & Playback", ""),
    ("  5. Intracardiac Pressures & Pressure Recording Systems", ""),
    ("  6. Cardiac Output Determination", ""),
    ("  7. Pressure Gradient Recording", ""),
    ("  8. Radiation Physics & Safety", ""),
    ("PAPER II – CARDIAC CATHETERIZATION LABORATORY: ADVANCED", ""),
    ("  9. Coronary Angiography", ""),
    ("  10. Left Heart Catheterization & Ventriculography", ""),
    ("  11. Right Heart Catheterization", ""),
    ("  12. Valvular Assessment via Catheterization", ""),
    ("  13. Interventional Cardiology – PTCA & Stenting", ""),
    ("  14. Electrophysiology Basics", ""),
    ("  15. Pacemaker & ICD Concepts", ""),
    ("  16. Complications & Emergency Management", ""),
    ("  17. Contrast Agents & Pharmacology in Cath Lab", ""),
    ("EXAMINATION TIPS & IMPORTANT QUESTIONS", ""),
]
for item, _ in toc_items:
    story.append(Paragraph(item, toc_style))
story.append(PageBreak())

# ═════════════════════════════════════════════════════════════════════════════
#  PAPER I
# ═════════════════════════════════════════════════════════════════════════════
story += H1("PAPER I – CARDIAC CATHETERIZATION LABORATORY: BASICS")
story.append(P("This paper covers the foundational knowledge of the cardiac catheterization laboratory, "
               "including equipment, catheters, pressure measurements, and cardiac output assessment. "
               "It forms the backbone of all invasive cardiac procedures."))
story.append(Spacer(1, 0.3*cm))

# ── Section 1 ──
story += H2("1. Introduction to the Cardiac Catheterization Laboratory")
story.append(P("The cardiac catheterization laboratory (Cath Lab) is a specialized area equipped with "
               "fluoroscopy, pressure monitoring systems, and imaging technology to perform diagnostic "
               "and interventional cardiac procedures."))
story += H3("Key Components of a Cath Lab:")
for item in [
    "Fluoroscopy unit with C-arm / bi-plane imaging",
    "Hemodynamic monitoring consoles",
    "Injectors for contrast media",
    "Defibrillator and resuscitation equipment",
    "Radiation shielding (lead aprons, shields, thyroid guards)",
    "Sterile field setup with surgical drapes",
    "ECG monitoring system with recorder",
    "Oximetry and blood gas analysis equipment",
]:
    story.append(B(item))
story.append(Key("The cath lab must maintain strict sterility. Staff wear lead aprons for radiation protection at all times during procedures."))
story.append(Spacer(1, 0.2*cm))

# ── Section 2 ──
story += H2("2. Catheters – Types, Cleaning, Packing & Sterilization")
story += H3("Types of Cardiac Catheters:")
cat_data = [
    ["Catheter", "Purpose", "Common Use"],
    ["Judkins Left (JL)", "Left coronary artery engagement", "Diagnostic coronary angiogram"],
    ["Judkins Right (JR)", "Right coronary artery engagement", "Diagnostic coronary angiogram"],
    ["Pigtail", "Ventriculography, aortography", "LV gram, aortic root injections"],
    ["Swan-Ganz (PA catheter)", "Right heart pressures, PCWP", "Hemodynamic monitoring"],
    ["Multipurpose (MPA)", "Versatile – right/left heart", "Diagnostic & interventional"],
    ["Amplatz Left/Right", "Coronary engagement (deep)", "Tortuous vessels"],
    ["Balloon-tipped catheter", "Right heart floatation", "Pulmonary artery pressure"],
    ["EP catheters", "Electrophysiology mapping", "Arrhythmia diagnosis"],
]
ct2 = Table(cat_data, colWidths=[3.8*cm, 5.5*cm, W-9.3*cm])
ct2.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct2)
story.append(Spacer(1, 0.3*cm))

story += H3("Catheter Cleaning & Packing:")
for item in [
    "Rinse with sterile water immediately after use to remove blood/contrast",
    "Soak in enzymatic detergent solution for 15–20 minutes",
    "Manual cleaning with soft brushes through lumens",
    "Final rinse with sterile distilled water",
    "Air-dry or dry with lint-free cloth before packing",
    "Pack in individual sealed pouches with sterility indicators",
    "Label with date, type, and batch number",
]:
    story.append(B(item))

story += H3("Sterilization Methods:")
ster_data = [
    ["Method", "Temperature", "Time", "Advantages", "Disadvantages"],
    ["Ethylene Oxide (EtO)", "37–63°C", "2–6 hours", "Suitable for heat-sensitive items", "Toxic residues; long aeration time needed"],
    ["Steam Autoclave", "121–134°C", "15–30 min", "Reliable, fast, non-toxic", "Damages heat-sensitive catheters"],
    ["Glutaraldehyde (2%)", "Room temp", "10 hrs (HLD: 20 min)", "Simple, chemical sterilant", "Toxic fumes, limited efficacy"],
    ["Hydrogen Peroxide Plasma", "<50°C", "45–75 min", "Rapid, no toxic residues", "Costly, cannot sterilize liquids"],
    ["Dry Heat", "160–180°C", "1–2 hours", "Good for glass/metal", "Not suitable for catheters"],
]
ct3 = Table(ster_data, colWidths=[3.2*cm, 2.2*cm, 2cm, W/2-0.7*cm, W/2-0.7*cm])
ct3.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#C05000")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 8.5),
    ("GRID",       (0,0), (-1,-1), 0.4, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#FFF0E8")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 5),
    ("WORDWRAP", (0,0), (-1,-1), True),
]))
story.append(ct3)
story.append(Note("EtO sterilization requires 12–24 hours of aeration after the cycle before items can be used safely."))

# ── Section 3 ──
story += H2("3. Setting Up the Cath Lab for a Diagnostic Study")
story += H3("Pre-Procedure Checklist:")
for item in [
    "Verify patient identity, consent form, and allergies (especially contrast/iodine)",
    "Check pre-procedure labs: CBC, coagulation profile (PT, aPTT), renal function (Creatinine, eGFR), electrolytes",
    "Ensure IV access is patent (18G or larger)",
    "Set up hemodynamic monitoring – zero transducers to atmospheric pressure",
    "Prepare sterile field: drapes, catheters, wires, manifold, contrast syringes",
    "Check fluoroscopy unit: C-arm positioning, image intensifier function",
    "Prepare contrast injector: load contrast, set volume and rate",
    "Resuscitation equipment ready: defibrillator charged, crash cart at bedside",
    "Administer pre-medications as prescribed (antihistamines, corticosteroids if allergic history)",
    "Record baseline ECG, BP, SpO2",
]:
    story.append(B(item))

story += H3("Access Sites:")
access_data = [
    ["Site", "Vessel", "Advantages", "Disadvantages"],
    ["Femoral (TF)", "Femoral artery/vein", "Large caliber, easy access", "Bed rest, bleeding risk, haematoma"],
    ["Radial (TR)", "Radial artery", "Early ambulation, less bleeding", "Smaller caliber, spasm risk"],
    ["Brachial", "Brachial artery", "Alternative if femoral not feasible", "Brachial artery injury risk"],
]
ct4 = Table(access_data, colWidths=[2.5*cm, 3.5*cm, (W-6*cm)/2, (W-6*cm)/2])
ct4.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct4)
story.append(Spacer(1, 0.2*cm))

# ── Section 4 ──
story += H2("4. Equipment – Table, Image Intensifier & Playback")
story += H3("Fluoroscopy Table:")
for item in [
    "Motorized, carbon-fiber floating tabletop for minimum X-ray absorption",
    "Movements: longitudinal (head-foot), lateral, and height adjustment",
    "Tilt function: Trendelenburg and reverse Trendelenburg",
    "Foot pedals or joystick for hands-free table movement during procedures",
]:
    story.append(B(item))

story += H3("Image Intensifier (II):")
for item in [
    "Converts X-ray to visible light image – components: input phosphor, photocathode, electron lens, output phosphor",
    "C-arm: rotates in RAO/LAO (right/left anterior oblique) and cranial/caudal angulations",
    "Standard views: RAO 30°, LAO 60°, AP cranial, AP caudal, Spider view (LAO 60° cranial 25°)",
    "Magnification modes: 9-inch, 7-inch, 5-inch fields of view",
    "Bi-plane systems allow simultaneous two-view imaging reducing contrast load",
]:
    story.append(B(item))

story += H3("Image Playback / Cine Recording:")
for item in [
    "Digital flat-panel detector (FPD) systems have replaced traditional cine film",
    "Images stored in DICOM format on PACS (Picture Archiving Communication System)",
    "Frame rates: 7.5–30 frames/sec (higher = better temporal resolution)",
    "Review workstation allows frame-by-frame, zoom, and quantitative coronary analysis (QCA)",
]:
    story.append(B(item))
story.append(Key("Always document: patient name, ID, date, views taken, contrast volume, and radiation dose (DAP – Dose Area Product) in the procedure record."))
story.append(PageBreak())

# ── Section 5 ──
story += H2("5. Intracardiac Pressures & Pressure Recording Systems")
story += H3("Normal Intracardiac Pressures:")
press_data = [
    ["Chamber / Vessel", "Systolic (mmHg)", "Diastolic (mmHg)", "Mean (mmHg)"],
    ["Right Atrium (RA)", "—", "—", "2–8"],
    ["Right Ventricle (RV)", "15–30", "0–8", "—"],
    ["Pulmonary Artery (PA)", "15–30", "4–12", "9–18"],
    ["PCWP (Wedge)", "—", "—", "4–12"],
    ["Left Atrium (LA)", "—", "—", "4–12"],
    ["Left Ventricle (LV)", "90–140", "4–12", "—"],
    ["Aorta", "90–140", "60–90", "70–100"],
]
ct5 = Table(press_data, colWidths=[4.5*cm, 3.5*cm, 3.5*cm, 3.5*cm])
ct5.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9.5),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("ALIGN",      (1,0), (-1,-1), "CENTER"),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct5)
story.append(Spacer(1, 0.3*cm))

story += H3("Pressure Recording Systems:")
story.append(P("Two systems are used: <b>fluid-filled catheters</b> with external transducers, and "
               "<b>catheter-tipped (micromanometer) transducers</b> at the catheter tip."))

comp_data = [
    ["Feature", "Fluid-Filled System", "Catheter-Tipped Manometer"],
    ["Transducer location", "External (outside body)", "At catheter tip (inside)"],
    ["Frequency response", "Lower (limited by tubing)", "High fidelity"],
    ["Artifacts", "Susceptible to damping, air bubbles", "Minimal artifacts"],
    ["dP/dt measurement", "Less accurate", "Highly accurate"],
    ["Cost", "Inexpensive", "Expensive"],
    ["Common use", "Routine hemodynamics", "Research, LV dP/dt"],
]
ct6 = Table(comp_data, colWidths=[3.5*cm, (W-3.5*cm)/2, (W-3.5*cm)/2])
ct6.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#C05000")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#FFF0E8")]),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct6)
story.append(Spacer(1, 0.2*cm))

story += H3("Artifacts & Damping:")
for item in [
    "Over-damping: caused by air bubbles, clots, kinks – produces blunted waveform with loss of dicrotic notch",
    "Under-damping: caused by stiff tubing – produces overshoot and ring artifacts (falsely high systolic, low diastolic)",
    "Optimally damped system: natural frequency >25 Hz, damping coefficient 0.6–0.7",
    "Ventricularzation of PA pressure: catheter slips back from wedge into RV position – produces RV-type waveform",
    "Zeroing: must zero transducer at mid-axillary line (phlebostatic axis) before every measurement",
]:
    story.append(B(item))
story.append(Note("Always flush the catheter and manifold with heparinized saline before recording to eliminate air bubbles and ensure accurate waveforms."))

# ── Section 6 ──
story += H2("6. Cardiac Output Determination")
story.append(P("Cardiac output (CO) is the volume of blood pumped by the heart per minute. Normal: <b>4–8 L/min</b>. "
               "Cardiac Index (CI) = CO / BSA. Normal CI: <b>2.4–4.0 L/min/m²</b>."))

story += H3("A. Fick's Oxygen Method (Direct Fick):")
story.append(P("Based on the principle: oxygen consumed by the body = oxygen delivered by the heart."))
story.append(Paragraph("<b>Formula:</b> CO (L/min) = O₂ Consumption (mL/min) / [A-V O₂ Difference (mL/L)]", body))
story.append(Paragraph("A-V O₂ Difference = (Arterial O₂ content − Mixed venous O₂ content)", body))
for item in [
    "O₂ content (mL/L) = Hb (g/dL) × 1.36 × SaO₂ × 10",
    "Assumed O₂ consumption: 125 mL/min/m² (if not directly measured)",
    "Requires simultaneous arterial and pulmonary artery blood sampling",
    "Most accurate method – gold standard for low cardiac output states",
]:
    story.append(B(item))

story += H3("B. Thermodilution Method:")
story.append(P("Cold or room-temperature injectate (saline/D5W) injected into right atrium; temperature change "
               "detected by thermistor at PA catheter tip. CO calculated by Stewart-Hamilton equation."))
story.append(Paragraph("<b>Stewart-Hamilton equation:</b> CO = V × (T_B − T_I) × K₁K₂ / ∫ΔT_B dt", body))
for item in [
    "Average 3 measurements taken; should be within 10% of each other",
    "Injectate volume: 10 mL cold saline (0–4°C) or room temperature",
    "Inject rapidly (<4 seconds) at end-expiration for consistency",
    "Over-estimates CO in tricuspid regurgitation",
    "Unreliable in low CO states, intracardiac shunts",
]:
    story.append(B(item))
story.append(Key("Thermodilution is the most commonly used bedside method. Fick method is the reference standard."))

# ── Section 7 ──
story += H2("7. Pressure Gradient Recording")
story.append(P("Pressure gradients across valves or vessels indicate stenosis. "
               "Two methods: <b>pullback</b> and <b>peak-to-peak</b>."))
story += H3("Pullback Gradient:")
for item in [
    "Catheter is withdrawn from distal to proximal chamber while continuously recording pressure",
    "Simultaneous dual transducer system gives instantaneous gradient",
    "Used for: aortic stenosis (LV to Aorta pullback), mitral stenosis (PCW to LV), pulmonic stenosis",
    "Peak instantaneous gradient > peak-to-peak gradient (due to timing differences)",
]:
    story.append(B(item))

story += H3("Peak-to-Peak Gradient:")
for item in [
    "Non-simultaneous: peak systolic LV pressure minus peak systolic aortic pressure",
    "Obtained during catheter pullback",
    "Not physiologically valid (peaks don't occur at the same time) but clinically useful",
    "Mean gradient (area under curve) is most accurate and correlates best with echocardiographic gradient",
]:
    story.append(B(item))

grad_data = [
    ["Valve", "Significant Gradient", "Severe Stenosis Gradient"],
    ["Aortic Valve", ">20 mmHg (mean)", ">40 mmHg mean / >64 mmHg peak"],
    ["Mitral Valve", ">5 mmHg (mean)", ">10 mmHg mean"],
    ["Pulmonary Valve", ">25 mmHg", ">40 mmHg"],
]
ct7 = Table(grad_data, colWidths=[3.5*cm, 5*cm, W-8.5*cm])
ct7.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct7)
story.append(Spacer(1, 0.2*cm))

# ── Section 8 ──
story += H2("8. Radiation Physics & Safety")
story += H3("Basic Radiation Physics:")
for item in [
    "X-rays are produced when high-speed electrons hit a tungsten target in an X-ray tube",
    "Fluoroscopy uses continuous/pulsed X-ray – dose rate ~1–10 mGy/min",
    "Cine angiography uses higher dose pulses – ~10× fluoroscopy dose",
    "Radiation quantity: measured in Gray (Gy) or milliGray (mGy) – absorbed dose",
    "Effective dose (patient risk): Sievert (Sv) – accounts for organ sensitivity",
    "Dose Area Product (DAP): total radiation delivered – measured in Gy·cm²",
]:
    story.append(B(item))

story += H3("Radiation Monitoring:")
for item in [
    "Personal dosimeters (TLD – thermoluminescent dosimeters) worn on collar and under lead apron",
    "Dose limits: Occupational – 20 mSv/year (averaged over 5 years), Lens of eye – 20 mSv/year",
    "Fluoroscopy time and DAP recorded for every procedure",
    "Annual radiation exposure report reviewed by Radiation Safety Officer",
]:
    story.append(B(item))

story += H3("ALARA Principle – As Low As Reasonably Achievable:")
for item in [
    "<b>Distance:</b> Radiation intensity ∝ 1/distance². Double the distance = quarter the dose",
    "<b>Shielding:</b> Lead aprons (0.25–0.5 mm Pb), thyroid collar, lead glasses, ceiling/table-mounted shields",
    "<b>Time:</b> Minimize fluoroscopy time; use last-image-hold feature",
    "<b>Collimation:</b> Restrict X-ray beam to area of interest – reduces scatter",
    "<b>Angulation:</b> Steep angles (e.g., LAO cranial) increase patient and operator dose – use sparingly",
    "<b>Magnification:</b> Avoid unnecessary magnification modes – increases dose",
    "<b>Pulsed fluoroscopy:</b> Use lowest frame rate adequate for clinical task",
]:
    story.append(B(item))
story.append(Note("Pregnant staff should not work in the cath lab during the first trimester. If unavoidable, dose must be kept <1 mSv for the gestational period."))
story.append(PageBreak())

# ═════════════════════════════════════════════════════════════════════════════
#  PAPER II
# ═════════════════════════════════════════════════════════════════════════════
story += H1("PAPER II – CARDIAC CATHETERIZATION LABORATORY: ADVANCED")
story.append(P("The advanced paper covers invasive diagnostic and interventional procedures performed in the "
               "cath lab. This 9-month rotation covers coronary angiography, left and right heart "
               "catheterization, valvular assessment, interventional procedures (PTCA/stenting), "
               "electrophysiology, and pacemaker concepts."))
story.append(Spacer(1, 0.3*cm))

# ── Section 9 ──
story += H2("9. Coronary Angiography")
story.append(P("Coronary angiography is the gold standard for visualization of coronary artery anatomy and "
               "detection of stenosis/occlusion."))
story += H3("Standard Coronary Views:")
view_data = [
    ["Projection", "Angle", "Best Visualizes"],
    ["AP", "0°/0°", "Left main, mid LAD overview"],
    ["RAO Caudal (Spider)", "RAO 30° / Caudal 25°", "Left main bifurcation, LCx origin"],
    ["RAO Cranial", "RAO 20° / Cranial 25°", "LAD mid and distal, diagonal origin"],
    ["LAO Cranial", "LAO 45° / Cranial 25°", "LAD proximal, septal perforators"],
    ["LAO Caudal", "LAO 45° / Caudal 25°", "LCx, obtuse marginals"],
    ["AP Cranial", "0° / Cranial 20°", "Proximal and mid LAD"],
    ["LAO 60°", "LAO 60° / 0°", "RCA – proximal to mid segment"],
    ["RAO 30°", "RAO 30° / 0°", "RCA – mid to distal, PDA"],
    ["Left lateral", "90° / 0°", "RCA proximal, anomalous origins"],
]
ct8 = Table(view_data, colWidths=[3.5*cm, 3.5*cm, W-7*cm])
ct8.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct8)

story += H3("Coronary Artery Anatomy – Key Branches:")
for item in [
    "<b>Left Main (LMCA):</b> bifurcates into LAD and LCx (trifurcation if ramus intermedius present)",
    "<b>LAD:</b> diagonal branches (D1, D2), septal perforators; supplies anterior wall and septum",
    "<b>LCx:</b> obtuse marginals (OM1, OM2); supplies lateral wall",
    "<b>RCA:</b> acute marginals, conus branch, SA nodal artery; → PDA + PL branches (dominant RCA in 85%)",
    "<b>Right dominant circulation:</b> PDA and posterolateral artery arise from RCA (85% population)",
    "<b>Left dominant:</b> PDA from LCx (~8%); <b>Co-dominant:</b> ~7%",
]:
    story.append(B(item))

story += H3("Stenosis Grading (Visual Estimation):")
sten_data = [
    ["Grade", "% Diameter Stenosis", "Significance"],
    ["Minimal", "<25%", "Non-significant"],
    ["Mild", "25–49%", "Non-obstructive"],
    ["Moderate", "50–69%", "Borderline – FFR assessment advised"],
    ["Severe", "70–89%", "Significant – revascularization considered"],
    ["Critical", "90–99%", "High-grade – urgent intervention"],
    ["Total occlusion", "100%", "CTO – no antegrade flow (TIMI 0)"],
]
ct9 = Table(sten_data, colWidths=[2.5*cm, 4*cm, W-6.5*cm])
ct9.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#C05000")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#FFF0E8")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct9)
story.append(Key("TIMI Flow Grades: 0 = no flow (occlusion); 1 = minimal penetration; 2 = partial flow; 3 = normal flow."))

# ── Section 10 ──
story += H2("10. Left Heart Catheterization & Ventriculography")
story += H3("Left Heart Catheterization:")
for item in [
    "Access via femoral artery (retrograde) or radial artery",
    "Catheter crosses aortic valve retrograde into LV",
    "Measures LV systolic and end-diastolic pressure (LVEDP) – normal LVEDP: 5–12 mmHg",
    "Elevated LVEDP (>18 mmHg) indicates LV dysfunction / heart failure",
    "Aortic valve gradient measured by LV-to-aorta pullback",
]:
    story.append(B(item))

story += H3("Left Ventriculography (LV Gram):")
for item in [
    "Pigtail catheter placed in LV; contrast injected at 10–15 mL/sec, total 30–40 mL",
    "Standard view: RAO 30° (best for wall motion assessment)",
    "LAO 60° view: assesses septal and posterior wall motion",
    "Assesses: LVEF, regional wall motion abnormalities (RWMA), MR severity, LV aneurysm",
    "Normal LVEF: ≥55%; Mildly reduced: 45–54%; Moderately reduced: 30–44%; Severely reduced: <30%",
    "Wall motion: normal → hypokinetic → akinetic → dyskinetic (paradoxical systolic bulge)",
]:
    story.append(B(item))
story.append(Note("In patients with severe aortic stenosis or very poor LV function, LV gram may be omitted to reduce contrast load and risk."))

# ── Section 11 ──
story += H2("11. Right Heart Catheterization (RHC)")
story += H3("Procedure:")
for item in [
    "Access via femoral vein, internal jugular vein, or subclavian vein",
    "Swan-Ganz (balloon-tipped) catheter floated through RA → RV → PA → wedge position",
    "Balloon inflated to float catheter and obtain PCWP (reflects LA pressure / LVEDP)",
]:
    story.append(B(item))

story += H3("Hemodynamic Measurements:")
rhc_data = [
    ["Measurement", "Normal Value", "Clinical Significance"],
    ["RA pressure (mean)", "2–8 mmHg", "Elevated in RHF, TR, PE, tamponade"],
    ["RV systolic/diastolic", "15–30 / 0–8 mmHg", "Elevated in pulmonary HTN"],
    ["PA systolic/diastolic", "15–30 / 4–12 mmHg", "Elevated in pulmonary HTN"],
    ["PCWP (mean)", "4–12 mmHg", ">18 mmHg = LHF / pulmonary oedema"],
    ["Cardiac Output (Fick)", "4–8 L/min", "Reduced in heart failure/shock"],
    ["PVR", "< 3 Wood Units", ">3 WU = significant pulmonary HTN"],
    ["SVR", "800–1200 dynes·s/cm⁵", "Elevated in hypertension/vasoconstriction"],
]
ct10 = Table(rhc_data, colWidths=[4*cm, 4*cm, W-8*cm])
ct10.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct10)
story.append(Spacer(1, 0.2*cm))

# ── Section 12 ──
story += H2("12. Valvular Assessment via Catheterization")
story += H3("Gorlin Formula – Valve Area Calculation:")
story.append(Paragraph("<b>Gorlin formula:</b> Valve Area (cm²) = Cardiac Output / (DFP or SEP × HR × 44.3 × √mean gradient)", body))
story.append(P("Where DFP = diastolic filling period (for mitral), SEP = systolic ejection period (for aortic)."))

val_data = [
    ["Valve", "Normal Area", "Mild Stenosis", "Moderate", "Severe"],
    ["Aortic", "3.0–4.0 cm²", ">1.5 cm²", "1.0–1.5 cm²", "<1.0 cm²"],
    ["Mitral", "4.0–6.0 cm²", ">1.5 cm²", "1.0–1.5 cm²", "<1.0 cm²"],
    ["Pulmonary", "2.0–4.0 cm²", ">1.0 cm²", "0.5–1.0 cm²", "<0.5 cm²"],
    ["Tricuspid", "7.0–9.0 cm²", ">1.5 cm²", "1.0–1.5 cm²", "<1.0 cm²"],
]
ct11 = Table(val_data, colWidths=[3*cm, 3*cm, 3*cm, 3*cm, W-12*cm])
ct11.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#C05000")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#FFF0E8")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct11)
story.append(Spacer(1, 0.2*cm))

# ── Section 13 ──
story += H2("13. Interventional Cardiology – PTCA & Stenting")
story.append(P("Percutaneous Transluminal Coronary Angioplasty (PTCA) and coronary stenting are the core "
               "interventional procedures performed in the cath lab for coronary artery disease."))

story += H3("PTCA Procedure Steps:")
for i, item in enumerate([
    "Arterial access obtained (radial or femoral); large-bore sheath placed (6–8 French)",
    "Guiding catheter (GC) engaged in target coronary ostium",
    "Heparin administered (70–100 U/kg IV); target ACT > 250–300 seconds",
    "Coronary guidewire (0.014 inch) advanced across the stenosis",
    "Balloon catheter tracked over wire to lesion site",
    "Balloon inflated to 6–12 atm for 20–30 seconds to dilate stenosis",
    "Post-dilation angiogram to assess result",
    "If stent planned: stent crimped on balloon deployed at lesion site",
], 1):
    story.append(B(f"Step {i}: {item}"))

story += H3("Types of Coronary Stents:")
stent_data = [
    ["Stent Type", "Description", "Duration of DAPT"],
    ["Bare Metal Stent (BMS)", "Plain metal mesh; high restenosis rate (~20–30%)", "1 month"],
    ["Drug Eluting Stent (DES)", "Polymer coated with antiproliferative drug (sirolimus, paclitaxel, everolimus)", "6–12 months"],
    ["Bioresorbable Vascular Scaffold (BVS)", "Absorbable polymer; dissolves over 2–3 years", "≥12 months"],
    ["Drug Coated Balloon (DCB)", "No stent; drug delivered via balloon only", "1–3 months"],
]
ct12 = Table(stent_data, colWidths=[4.5*cm, W/2, W/2-2.5*cm])
ct12.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct12)
story.append(Key("DAPT = Dual Antiplatelet Therapy (aspirin + clopidogrel/ticagrelor). Never stop DAPT prematurely – risk of stent thrombosis."))

# ── Section 14 ──
story += H2("14. Electrophysiology (EP) Basics")
story.append(P("Electrophysiology studies (EPS) assess the heart's electrical system to diagnose and treat arrhythmias."))
story += H3("Cardiac Conduction System:")
for item in [
    "SA node → AV node → Bundle of His → Left/Right Bundle Branches → Purkinje fibers",
    "SA node: pacemaker (60–100 bpm); located at SVC–RA junction",
    "AV node: delays conduction by 120–200 ms (PR interval); located in Koch's triangle",
    "His bundle: only electrical bridge between atria and ventricles",
    "Left bundle branch (LBB): anterior and posterior fascicles",
    "Right bundle branch (RBB): single fascicle; runs along right side of septum",
]:
    story.append(B(item))

story += H3("EP Study – Measurements:")
ep_data = [
    ["Interval", "Normal Value", "Significance if Prolonged"],
    ["PA interval", "25–55 ms", "Intra-atrial conduction delay"],
    ["AH interval", "55–130 ms", "AV nodal conduction delay"],
    ["HV interval", "35–55 ms", "Infranodal (His-Purkinje) delay"],
    ["SNRT (SA node recovery time)", "<1500 ms", ">1600 ms = sinus node dysfunction"],
    ["ERP of AV node", "250–400 ms", "Short ERP = risk of rapid conduction in AF"],
]
ct13 = Table(ep_data, colWidths=[4*cm, 3.5*cm, W-7.5*cm])
ct13.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct13)

# ── Section 15 ──
story += H2("15. Pacemaker & ICD Concepts")
story += H3("Indications for Pacemaker:")
for item in [
    "Symptomatic sinus node dysfunction (sick sinus syndrome)",
    "High-degree AV block (2nd degree Mobitz II, 3rd degree / complete heart block)",
    "Bifascicular or trifascicular block with symptoms",
    "Post-cardiac surgery conduction disturbance",
    "Neurocardiogenic syncope (refractory)",
]:
    story.append(B(item))

story += H3("Pacemaker Nomenclature (NBG Code – 5 positions):")
story.append(Paragraph("<b>Position I:</b> Chamber paced | <b>Position II:</b> Chamber sensed | "
                       "<b>Position III:</b> Response (I=inhibited, T=triggered, D=dual) | "
                       "<b>Position IV:</b> Rate modulation (R) | <b>Position V:</b> Multisite pacing", body))

pm_data = [
    ["Mode", "Description", "Common Use"],
    ["AOO/VOO", "Asynchronous – no sensing", "MRI mode / temporary pacing"],
    ["AAI(R)", "Atrial pacing, sensed, inhibited", "Sick sinus syndrome with intact AV node"],
    ["VVI(R)", "Ventricular pacing, sensed, inhibited", "AF + bradycardia"],
    ["DDD(R)", "Dual pacing/sensing, inhibited+triggered", "Complete heart block (most physiologic)"],
    ["CRT (BiV)", "Biventricular pacing", "HF with LBBB, EF<35%"],
]
ct14 = Table(pm_data, colWidths=[3*cm, 6.5*cm, W-9.5*cm])
ct14.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#C05000")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#FFF0E8")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
]))
story.append(ct14)

story += H3("ICD (Implantable Cardioverter-Defibrillator):")
for item in [
    "Indications: Secondary prevention (survived VF/VT arrest), Primary prevention (EF<35% + NYHA II–III despite optimal medical therapy for ≥3 months)",
    "Detects VT/VF and delivers therapy: ATP (anti-tachycardia pacing) first; shock if ATP fails",
    "Shock energy: typically 20–40 Joules (biphasic waveform)",
    "Lead system: single coil (RV) or dual coil (RV + SVC) sensing/defibrillation",
]:
    story.append(B(item))
story.append(PageBreak())

# ── Section 16 ──
story += H2("16. Complications & Emergency Management in Cath Lab")
comp_data2 = [
    ["Complication", "Recognition", "Immediate Management"],
    ["Coronary dissection", "New contrast staining/haziness, flow reduction", "Prolonged balloon inflation; stenting"],
    ["Coronary perforation", "Contrast extravasation into pericardium", "Pericardiocentesis; covered stent; surgery"],
    ["Cardiac tamponade", "Hypotension, JVD, muffled sounds (Beck's triad); equalization of pressures", "Urgent pericardiocentesis"],
    ["No-reflow", "TIMI 0–1 flow after intervention", "IC adenosine/verapamil/nitroprusside; GP IIb/IIIa inhibitors"],
    ["Contrast reaction (anaphylaxis)", "Urticaria, bronchospasm, hypotension", "Adrenaline 0.5 mg IM; IV fluids; steroids; antihistamines"],
    ["Contrast nephropathy", "Creatinine rise >25% or >0.5 mg/dL at 48–72 hrs", "Hydration (NS); minimize contrast; hold nephrotoxic drugs"],
    ["Femoral haematoma", "Groin swelling, pain, hypotension", "Manual compression; reverse heparin (protamine); surgery if expanding"],
    ["Ventricular fibrillation", "Pulseless, chaotic rhythm on ECG", "Immediate defibrillation (200 J biphasic); CPR protocol"],
    ["Stroke/TIA", "Focal neurological deficit during procedure", "Stop procedure; CT scan; neurology consult; possible thrombolysis"],
    ["Air embolism", "ST elevation, ventricular arrhythmia; air on fluoroscopy", "Aspirate air; patient in left lateral Trendelenburg; O2 100%"],
]
ct15 = Table(comp_data2, colWidths=[3.5*cm, 4.5*cm, W-8*cm])
ct15.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 8.5),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 5),
    ("WORDWRAP",      (0,0), (-1,-1), True),
]))
story.append(ct15)
story.append(Note("Always have a defibrillator, pericardiocentesis tray, and emergency drugs (atropine, adrenaline, adenosine, lidocaine) immediately available in the cath lab."))

# ── Section 17 ──
story += H2("17. Contrast Agents & Pharmacology in Cath Lab")
story += H3("Contrast Agents:")
contrast_data = [
    ["Agent Type", "Examples", "Osmolality", "Side Effects"],
    ["High osmolar ionic (HOCA)", "Meglumine diatrizoate (Urografin)", "~1500–2000 mOsm/kg", "More nephrotoxic, allergic reactions"],
    ["Low osmolar non-ionic (LOCA)", "Iohexol (Omnipaque), Iopamidol", "~600–800 mOsm/kg", "Better tolerated, less nephrotoxic"],
    ["Iso-osmolar non-ionic", "Iodixanol (Visipaque)", "~290 mOsm/kg (isosmolar)", "Least nephrotoxic – preferred in CKD"],
]
ct16 = Table(contrast_data, colWidths=[4*cm, 4*cm, 4*cm, W-12*cm])
ct16.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#C05000")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#FFF0E8")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 5),
]))
story.append(ct16)

story += H3("Key Drugs Used in Cath Lab:")
drug_data = [
    ["Drug", "Class", "Dose/Route", "Indication"],
    ["Heparin (UFH)", "Anticoagulant", "70–100 U/kg IV bolus; target ACT >250–300 s", "Prevent thrombosis during PCI"],
    ["Bivalirudin", "Direct thrombin inhibitor", "0.75 mg/kg IV bolus + 1.75 mg/kg/hr", "Alternative to heparin in HIT or ACS"],
    ["Aspirin", "Antiplatelet (COX-1 inhibitor)", "300 mg loading; 75 mg OD maintenance", "Pre/post PCI – prevent stent thrombosis"],
    ["Clopidogrel", "P2Y12 inhibitor", "600 mg loading; 75 mg OD", "DAPT with aspirin after stenting"],
    ["Ticagrelor", "P2Y12 inhibitor (reversible)", "180 mg loading; 90 mg BD", "Preferred in STEMI/NSTEMI over clopidogrel"],
    ["Adenosine", "Purine nucleoside", "30–60 mcg IC (bolus)", "No-reflow; FFR measurement"],
    ["Nitroglycerine (IC)", "Nitrate/vasodilator", "100–200 mcg IC", "Coronary spasm, radial spasm prevention"],
    ["Atropine", "Anticholinergic", "0.6–1.2 mg IV", "Vagal reactions, bradycardia"],
    ["Protamine", "Heparin antidote", "1 mg per 100 U of heparin IV slowly", "Reverse heparin at end of procedure"],
    ["Adrenaline (Epinephrine)", "Catecholamine", "0.5 mg IM / 1 mg IV (cardiac arrest)", "Anaphylaxis, cardiac arrest"],
]
ct17 = Table(drug_data, colWidths=[3.5*cm, 3*cm, 4.5*cm, W-11*cm])
ct17.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 8.5),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 5),
]))
story.append(ct17)
story.append(PageBreak())

# ═════════════════════════════════════════════════════════════════════════════
#  EXAM TIPS & IMPORTANT QUESTIONS
# ═════════════════════════════════════════════════════════════════════════════
story += H1("EXAMINATION TIPS & IMPORTANT QUESTIONS")
story.append(P("Based on the TNMGRMU exam pattern, questions are drawn from both papers. "
               "Below are frequently asked and high-yield topics."))

story += H2("High-Yield Topics – Paper I")
for item in [
    "Describe the types of catheters used in cardiac catheterization and their clinical uses.",
    "Explain the methods of sterilization used in the cath lab. Compare advantages and disadvantages of EtO vs. autoclave.",
    "Describe the fluid-filled pressure recording system. What are the sources of damping artifacts?",
    "Explain Fick's method and thermodilution method for cardiac output measurement. Which is more accurate?",
    "What is a pressure gradient? How is it measured using pullback technique? Give normal valve area values.",
    "Explain the ALARA principle in radiation safety. What protective measures are employed in the cath lab?",
    "What are the components of a cardiac catheterization laboratory? Describe the function of the image intensifier.",
    "What is the difference between peak-to-peak gradient and peak instantaneous gradient?",
]:
    story.append(B(item))

story += H2("High-Yield Topics – Paper II")
for item in [
    "Describe the standard angiographic views for left coronary artery and right coronary artery. What structures does each view best demonstrate?",
    "Explain the procedure of coronary angiography – access, catheter selection, and technique.",
    "What is a drug-eluting stent? How does it differ from a bare-metal stent? What is the DAPT duration?",
    "Describe left ventriculography – technique, views used, and findings assessed.",
    "What are the indications and procedure of right heart catheterization? Interpret given hemodynamic values.",
    "Describe the complications of cardiac catheterization and their immediate management.",
    "Explain the Gorlin formula. Calculate mitral valve area from given data.",
    "What are the indications for pacemaker implantation? Explain DDD pacing mode.",
    "Describe the ICD – indications, how it detects and treats VF/VT.",
    "Classify contrast agents. What is contrast-induced nephropathy and how is it prevented?",
    "Explain no-reflow phenomenon – causes, mechanism, and treatment.",
]:
    story.append(B(item))

story += H2("Quick Revision – Important Normal Values")
val_ref = [
    ["Parameter", "Normal Value"],
    ["LVEDP", "5–12 mmHg"],
    ["LA pressure (mean)", "4–12 mmHg"],
    ["PCWP (mean)", "4–12 mmHg"],
    ["PA systolic", "15–30 mmHg"],
    ["Aortic pressure", "90–140 / 60–90 mmHg"],
    ["RV systolic", "15–30 mmHg"],
    ["Cardiac Output", "4–8 L/min"],
    ["Cardiac Index", "2.4–4.0 L/min/m²"],
    ["PVR", "< 3 Wood Units"],
    ["SVR", "800–1200 dynes·s/cm⁵"],
    ["Normal LVEF", "≥ 55%"],
    ["Normal AVA (Aortic Valve Area)", "3.0–4.0 cm²"],
    ["Normal MVA (Mitral Valve Area)", "4.0–6.0 cm²"],
    ["HV interval", "35–55 ms"],
    ["AH interval", "55–130 ms"],
    ["Occupational radiation limit", "20 mSv/year"],
    ["Target ACT during PCI", "> 250–300 seconds"],
]
ct18 = Table(val_ref, colWidths=[W/2, W/2])
ct18.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#003366")),
    ("TEXTCOLOR",  (0,0), (-1,0), colors.white),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,-1), 9.5),
    ("GRID",       (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")),
    ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#EEF4FF")]),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
]))
story.append(ct18)

story += H2("Exam Writing Tips")
for item in [
    "Always start long answers with a definition, then classification/types, then details.",
    "Include labeled diagrams for: cardiac catheterization setup, pressure waveforms, coronary anatomy.",
    "For complication questions: state the complication, how to recognise it, and management.",
    "For drug questions: class, mechanism, dose, indication, and side effects.",
    "In practical exams: demonstrate proper zeroing of transducer and explain readings aloud.",
    "Time management: 3 hours for theory – spend ~30 min per long essay (5 marks), ~10 min per short note.",
]:
    story.append(B(item))

story.append(Spacer(1, 0.5*cm))
story.append(HR())
story.append(Paragraph(
    "Study Guide prepared for B.Sc. Cardiac Technology 3rd Year students – TNMGRMU Affiliated Colleges. "
    "Always cross-reference with your college notes and prescribed textbooks. "
    "Recommended texts: Grossman's Cardiac Catheterization (Baim & Grossman), "
    "Braunwald's Heart Disease, Davidson's Principles and Practice of Medicine.",
    ParagraphStyle("footer", parent=base["Normal"], fontSize=8, textColor=colors.grey, alignment=TA_CENTER, leading=12)
))

# ── Build PDF ──────────────────────────────────────────────────────────────────
def add_page_number(canvas, doc):
    canvas.saveState()
    canvas.setFont("Helvetica", 8)
    canvas.setFillColor(colors.HexColor("#888888"))
    page_num = canvas.getPageNumber()
    canvas.drawRightString(A4[0] - 2*cm, 1.5*cm, f"Page {page_num}")
    canvas.drawString(2*cm, 1.5*cm, "B.Sc. Cardiac Technology – 3rd Year Study Guide | TNMGRMU")
    canvas.restoreState()

doc.build(story, onFirstPage=add_page_number, onLaterPages=add_page_number)
print("PDF generated successfully:", OUTPUT)
Running Command

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

Editing File

~/cardiac-study-guide/generate_pdf.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/cardiac-study-guide/generate_pdf.py'
Running Command

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

Running Command

ls -lh /home/daytona/workspace/cardiac-study-guide/BSc_Cardiac_Technology_3rdYear_StudyGuide.pdf

Your study guide PDF is ready! Download it here:

BSc Cardiac Technology 3rdYear StudyGuide

PDF Document · PDF


Here's what's inside the PDF (17 sections across both papers):
Paper I – Cath Lab Basics
  1. Introduction to the Cardiac Catheterization Lab (components, equipment)
  2. Catheters - types, cleaning, packing + sterilization comparison table (EtO, autoclave, glutaraldehyde, H2O2 plasma)
  3. Setting up the cath lab - pre-procedure checklist + access site comparison table
  4. Fluoroscopy table, Image Intensifier, and digital cine playback
  5. Intracardiac pressures (normal values table) + fluid-filled vs. catheter-tipped manometer comparison
  6. Cardiac output - Fick's method + thermodilution (Stewart-Hamilton equation)
  7. Pressure gradient recording - pullback, peak-to-peak + valve significance thresholds
  8. Radiation physics, ALARA principle, dosimetry, and safety measures
Paper II – Cath Lab Advanced 9. Coronary angiography - standard views table (RAO/LAO/cranial/caudal), coronary anatomy, stenosis grading + TIMI flow 10. Left heart catheterization + ventriculography (LV gram technique, LVEF grading, wall motion) 11. Right heart catheterization - Swan-Ganz catheter, full hemodynamic values table 12. Valvular assessment - Gorlin formula + valve area normal/mild/moderate/severe table 13. PTCA & stenting - step-by-step procedure + stent types (BMS, DES, BVS, DCB) + DAPT duration 14. Electrophysiology basics - conduction system, EP intervals table 15. Pacemaker (NBG code, modes table) + ICD indications 16. Complications table with recognition and immediate management (10 complications) 17. Contrast agents + key cath lab drugs (dose, indication, mechanism)
Plus: High-yield exam questions for both papers, quick-revision normal values table, and exam writing tips.
This is a shared conversation. Sign in to Orris to start your own chat.