Atherosclerosis pathology
atherosclerosis pathology mechanisms
| Factor | Notes |
|---|---|
| Genetics | Most important independent risk factor; familial hypercholesterolemia (LDL receptor mutations) is a strong Mendelian example; most familial risk is polygenic |
| Age | Plaque development is progressive; clinical manifestations appear in middle age and later; clonal hematopoiesis of indeterminate potential (CHIP) from aging hematopoietic clones alters monocyte/macrophage function and may accelerate atherogenesis |
| Male sex | Premenopausal women are relatively protected; after menopause, risk equals or exceeds men |
| Factor | Mechanism |
|---|---|
| Hyperlipidemia | Elevated LDL, low HDL, elevated Lp(a); LDL enters intima, undergoes oxidation, triggers foam cell formation and inflammation |
| Hypertension | Hemodynamic stress causes endothelial dysfunction; two risk factors together multiply MI risk ~4-fold |
| Cigarette smoking | Toxins directly injure endothelium; three major modifiable factors together increase MI risk 7-fold |
| Diabetes mellitus | Induces hypercholesterolemia; doubles risk of IHD; promotes microvascular and macrovascular disease |
| Inflammation (elevated CRP) | Systemic and local inflammatory markers are independent predictors |



Endothelial Injury/Dysfunction
↓
Increased permeability + Monocyte adhesion (VCAM-1, ICAM-1)
↓
LDL enters intima → Oxidized LDL
↓
Macrophage scavenger receptor uptake → Foam cells → Fatty streak
↓
Cytokines/growth factors (IL-1, PDGF, FGF) → SMC migration & proliferation
↓
ECM (collagen) deposition + further lipid accumulation → Fibrous plaque
↓
Core necrosis, calcification, cap thinning → Mature atheroma
↓
Plaque rupture/erosion → Thrombus → MI / Stroke / Sudden death
| Site | Manifestation |
|---|---|
| Coronary arteries | Stable angina, unstable angina, MI, sudden cardiac death |
| Carotid / Cerebral arteries | TIA, ischemic stroke |
| Abdominal aorta | Aortic aneurysm, atheroembolism |
| Renal arteries | Renovascular hypertension, renal ischemia |
| Peripheral arteries | Peripheral artery disease (claudication, gangrene) |
| Mesenteric arteries | Intestinal ischemia |
Make the above ans pdf
mkdir -p /home/daytona/workspace/atherosclerosis-pdf && ls /home/daytona/workspa…
~/atherosclerosis-pdf/generate_pdf.py
import json, subprocess, base64, os
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.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, Image, KeepTogether
)
from reportlab.platypus.flowables import Flowable
from reportlab.lib.utils import ImageReader
from io import BytesIO
OUTPUT = "/home/daytona/workspace/atherosclerosis-pdf/Atherosclerosis_Pathology.pdf"
# ── Download images ──────────────────────────────────────────────────────────
IMAGE_URLS = [
"https://cdn.orris.care/cdss_images/74ab1878991d7b8fa8e1ff3ba3306c2a1ac640a261189d32ac918eeec422dddc.png", # pathogenesis diagram
"https://cdn.orris.care/cdss_images/cd9ec7f02a2e5f048851949bdbb6d6d2d33bbbe334b2243cdb302eea291a15b7.png", # fatty streaks
"https://cdn.orris.care/cdss_images/eebde1208afbe0e181cbe2bfdeecc9f86299f55a049e01983701561699084c39.png", # atherosclerotic plaques
]
print("Downloading images...")
result = json.loads(subprocess.check_output(
["node", "/home/daytona/skills/shared/scripts/fetch_images.js"] + IMAGE_URLS
))
img_paths = []
for i, img in enumerate(result):
if img.get("base64"):
raw = base64.b64decode(img["base64"].split(",")[1])
path = f"/home/daytona/workspace/atherosclerosis-pdf/img_{i}.png"
with open(path, "wb") as f:
f.write(raw)
img_paths.append(path)
print(f" Saved img_{i}.png")
else:
img_paths.append(None)
print(f" Failed to download image {i}: {img.get('error')}")
# ── Styles ───────────────────────────────────────────────────────────────────
PAGE_W, PAGE_H = A4
MARGIN = 2.0 * cm
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=MARGIN, bottomMargin=MARGIN,
title="Atherosclerosis - Pathology",
author="Orris Medical AI",
subject="Atherosclerosis Pathology Notes"
)
styles = getSampleStyleSheet()
BLUE_DARK = colors.HexColor("#1a3a5c")
BLUE_MID = colors.HexColor("#2d6a9f")
BLUE_LIGHT = colors.HexColor("#d6e8f7")
BLUE_PALE = colors.HexColor("#eef5fb")
TEAL = colors.HexColor("#1a7a6e")
TEAL_LIGHT = colors.HexColor("#d0efec")
ORANGE = colors.HexColor("#c25a00")
ORANGE_LIGHT= colors.HexColor("#fdf0e0")
GRAY_LIGHT = colors.HexColor("#f5f5f5")
GRAY_MED = colors.HexColor("#cccccc")
WHITE = colors.white
title_style = ParagraphStyle(
"MainTitle", parent=styles["Title"],
fontSize=26, textColor=WHITE,
spaceAfter=6, spaceBefore=0,
fontName="Helvetica-Bold", alignment=TA_CENTER,
leading=32
)
subtitle_style = ParagraphStyle(
"SubTitle", parent=styles["Normal"],
fontSize=11, textColor=colors.HexColor("#c8dff5"),
spaceAfter=4, fontName="Helvetica", alignment=TA_CENTER
)
h1_style = ParagraphStyle(
"H1", parent=styles["Heading1"],
fontSize=15, textColor=WHITE,
spaceBefore=14, spaceAfter=6,
fontName="Helvetica-Bold",
borderPad=6
)
h2_style = ParagraphStyle(
"H2", parent=styles["Heading2"],
fontSize=12, textColor=BLUE_DARK,
spaceBefore=10, spaceAfter=4,
fontName="Helvetica-Bold",
borderColor=BLUE_MID, borderWidth=0,
leftIndent=0
)
h3_style = ParagraphStyle(
"H3", parent=styles["Heading3"],
fontSize=11, textColor=TEAL,
spaceBefore=8, spaceAfter=3,
fontName="Helvetica-Bold"
)
body_style = ParagraphStyle(
"Body", parent=styles["Normal"],
fontSize=10, textColor=colors.HexColor("#222222"),
spaceAfter=5, spaceBefore=2,
fontName="Helvetica", alignment=TA_JUSTIFY,
leading=15
)
bullet_style = ParagraphStyle(
"Bullet", parent=body_style,
leftIndent=14, bulletIndent=4,
spaceBefore=1, spaceAfter=2,
bulletFontSize=10
)
sub_bullet_style = ParagraphStyle(
"SubBullet", parent=bullet_style,
leftIndent=28, bulletIndent=18,
fontSize=9.5
)
caption_style = ParagraphStyle(
"Caption", parent=styles["Normal"],
fontSize=8.5, textColor=colors.HexColor("#555555"),
spaceAfter=8, spaceBefore=2,
fontName="Helvetica-Oblique", alignment=TA_CENTER
)
code_style = ParagraphStyle(
"Code", parent=styles["Normal"],
fontSize=9, fontName="Courier",
textColor=BLUE_DARK, backColor=GRAY_LIGHT,
leftIndent=12, rightIndent=12,
spaceBefore=6, spaceAfter=6,
leading=14, borderPad=6,
borderColor=GRAY_MED, borderWidth=0.5
)
source_style = ParagraphStyle(
"Source", parent=styles["Normal"],
fontSize=8, textColor=colors.HexColor("#777777"),
fontName="Helvetica-Oblique", alignment=TA_CENTER,
spaceBefore=2, spaceAfter=10
)
def B(text):
return f"<b>{text}</b>"
def I(text):
return f"<i>{text}</i>"
# ── Helper: Section Header (colored band) ────────────────────────────────────
class ColoredHeader(Flowable):
def __init__(self, text, bg=BLUE_MID, fg=WHITE, height=22, fontsize=13):
Flowable.__init__(self)
self.text = text
self.bg = bg
self.fg = fg
self.height = height
self.fontsize = fontsize
self.width = PAGE_W - 2 * MARGIN
def draw(self):
self.canv.setFillColor(self.bg)
self.canv.rect(0, 0, self.width, self.height, fill=1, stroke=0)
self.canv.setFillColor(self.fg)
self.canv.setFont("Helvetica-Bold", self.fontsize)
self.canv.drawString(8, 5, self.text)
def wrap(self, aW, aH):
return self.width, self.height + 4
# ── Helper: add section ───────────────────────────────────────────────────────
def section(story, title, bg=BLUE_MID, fg=WHITE, fontsize=13):
story.append(Spacer(1, 8))
story.append(ColoredHeader(title, bg=bg, fg=fg, fontsize=fontsize))
story.append(Spacer(1, 4))
def h2(story, text):
story.append(Paragraph(text, h2_style))
def h3(story, text):
story.append(Paragraph(text, h3_style))
def body(story, text):
story.append(Paragraph(text, body_style))
def bullet(story, text, level=1):
style = bullet_style if level == 1 else sub_bullet_style
story.append(Paragraph(f"• {text}", style))
def spacer(story, h=6):
story.append(Spacer(1, h))
def hr(story):
story.append(HRFlowable(width="100%", thickness=0.5, color=GRAY_MED, spaceAfter=4))
def add_image(story, path, caption, width=14*cm):
if path and os.path.exists(path):
img = Image(path, width=width, height=None) # maintain aspect ratio
# Force aspect ratio
from PIL import Image as PILImage
with PILImage.open(path) as pil_img:
iw, ih = pil_img.size
ratio = ih / iw
img_height = width * ratio
if img_height > 16*cm:
img_height = 16*cm
width = img_height / ratio
img = Image(path, width=width, height=img_height)
story.append(img)
story.append(Paragraph(caption, caption_style))
# ── Build story ───────────────────────────────────────────────────────────────
story = []
# ── TITLE BLOCK ───────────────────────────────────────────────────────────────
title_table_data = [[Paragraph("ATHEROSCLEROSIS", title_style)]]
title_sub_data = [[Paragraph("Pathology — Comprehensive Notes", subtitle_style)],
[Paragraph("Source: Robbins & Kumar Basic Pathology 10e | Robbins, Cotran & Kumar Pathologic Basis of Disease 10e", subtitle_style)]]
title_table = Table([[Paragraph("ATHEROSCLEROSIS", title_style)],
[Paragraph("Pathology — Comprehensive Notes", subtitle_style)],
[Paragraph("Source: Robbins & Kumar Basic Pathology 10e | Robbins, Cotran & Kumar Pathologic Basis of Disease 10e", subtitle_style)]],
colWidths=[PAGE_W - 2*MARGIN])
title_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), BLUE_DARK),
("TOPPADDING", (0,0), (-1,-1), 16),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
("ROUNDEDCORNERS", [6]),
]))
story.append(title_table)
story.append(Spacer(1, 14))
# ── 1. DEFINITION ─────────────────────────────────────────────────────────────
section(story, "1. DEFINITION")
body(story, "Atherosclerosis (from Greek: <i>athero</i> = gruel/porridge; <i>sclerosis</i> = hardening) is a chronic "
"inflammatory disease of large and medium-sized arteries characterized by intimal lesions called "
"<b>atheromas (atherosclerotic plaques)</b> — raised lesions composed of a soft, friable lipid core "
"covered by a fibrous cap.")
body(story, "It is the single most important cause of morbidity and mortality in the Western world, "
"accounting for roughly <b>half of all deaths</b>. Atheromatous plaques can mechanically obstruct "
"vascular lumina and, more dangerously, are prone to rupture, causing thrombosis and sudden vessel occlusion.")
# ── 2. EPIDEMIOLOGY ───────────────────────────────────────────────────────────
section(story, "2. EPIDEMIOLOGY")
epi_data = [
[B("Region"), B("Notes")],
["Western nations", "Virtually ubiquitous; decreasing due to risk reduction & improved therapies"],
["Africa / India / Southeast Asia", "Death rate from CAD now exceeds that in the US"],
["Eastern Europe", "Rates 3-5x higher than US; 7-12x higher than Japan"],
["United States", "MI responsible for ~25% of all deaths"],
]
epi_table = Table(epi_data, colWidths=[6.5*cm, 10*cm])
epi_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), BLUE_MID),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("BACKGROUND", (0,1), (-1,1), BLUE_PALE),
("BACKGROUND", (0,3), (-1,3), BLUE_PALE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [BLUE_PALE, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MED),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
]))
story.append(epi_table)
spacer(story, 4)
bullet(story, "Incidence of MI increases <b>5-fold</b> between ages 40 and 60.")
bullet(story, "Two major risk factors multiply MI risk <b>~4-fold</b>; three major factors (hyperlipidemia + hypertension + smoking) increase it <b>7-fold</b>.")
# ── 3. RISK FACTORS ───────────────────────────────────────────────────────────
section(story, "3. RISK FACTORS")
h2(story, "Non-Modifiable (Constitutional)")
rf_const_data = [
[B("Factor"), B("Notes")],
["Genetics", "Most important independent risk factor; familial hypercholesterolemia (LDL receptor mutations) is a strong Mendelian example; most familial risk is polygenic"],
["Age", "Clinical manifestations appear in middle age/later; CHIP (clonal hematopoiesis of indeterminate potential) from aging hematopoietic clones alters monocyte/macrophage function and may accelerate atherogenesis"],
["Male sex", "Premenopausal women relatively protected; after menopause risk equals or exceeds men"],
]
rf_c_table = Table(rf_const_data, colWidths=[4.5*cm, 12*cm])
rf_c_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), BLUE_MID),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [BLUE_PALE, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MED),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
]))
story.append(rf_c_table)
spacer(story, 6)
h2(story, "Modifiable Risk Factors")
rf_mod_data = [
[B("Factor"), B("Mechanism / Notes")],
["Hyperlipidemia", "Elevated LDL, low HDL, elevated Lp(a); LDL enters intima, undergoes oxidation, triggers foam cell formation and inflammation"],
["Hypertension", "Hemodynamic stress causes endothelial dysfunction"],
["Cigarette smoking", "Toxins directly injure endothelium; also promotes thrombosis and vasoconstriction"],
["Diabetes mellitus", "Induces hypercholesterolemia; doubles risk of IHD; promotes both micro- and macrovascular disease"],
["Inflammation (CRP)", "Elevated CRP is an independent predictor; systemic and local inflammation drive plaque progression"],
["Obesity / Sedentary lifestyle", "Promotes hyperlipidemia, hypertension, insulin resistance, and pro-inflammatory state"],
]
rf_m_table = Table(rf_mod_data, colWidths=[5.5*cm, 11*cm])
rf_m_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [TEAL_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MED),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
]))
story.append(rf_m_table)
# ── 4. PATHOGENESIS ───────────────────────────────────────────────────────────
section(story, "4. PATHOGENESIS: RESPONSE-TO-INJURY HYPOTHESIS")
body(story, "The fundamental concept is that <b>atherosclerosis is the vascular response to endothelial injury</b>. "
"Since the response of the vessel wall to diverse causes of endothelial injury is quite stereotypic, "
"the process is described as a \"response to injury.\"")
spacer(story, 4)
# Show the pathogenesis diagram
if img_paths[0]:
add_image(story, img_paths[0],
"Fig. Evolution of arterial wall changes — Response-to-Injury Hypothesis. "
"1. Healthy vessel; 2. Endothelial dysfunction with monocyte & platelet adhesion; "
"3. Macrophage activation, SMC recruitment; 4. Foam cell formation (fatty streak); "
"5. SMC proliferation, ECM deposition → mature atheroma. "
"[Robbins, Cotran & Kumar Pathologic Basis of Disease 10e]",
width=9*cm)
spacer(story, 4)
h2(story, "Step 1 — Endothelial Injury and Dysfunction")
body(story, "EC injury is the <b>cornerstone</b> of the response-to-injury hypothesis. "
"Early lesions begin at sites of morphologically intact but <i>dysfunctional</i> endothelium — "
"increased permeability, enhanced leukocyte adhesion, and altered gene expression.")
body(story, "<b>Three most important causes of EC dysfunction:</b>")
bullet(story, "<b>Hemodynamic disturbances</b> — plaques preferentially form at ostia of vessels, branch points, "
"and the posterior abdominal aorta where flow is turbulent/nonlaminar. Laminar flow upregulates "
"atheroprotective KLF2 (Kruppel-like factor-2); turbulent flow drives \"atheroprone\" gene expression. "
"Statins also work partly via KLF2 upregulation.")
bullet(story, "<b>Hypercholesterolemia</b> — increases local ROS, accelerates NO decay (damping vasodilation), "
"and leads to LDL accumulation and oxidation in the intima.")
bullet(story, "<b>Inflammation</b> — systemic and local inflammation promotes endothelial activation and "
"leukocyte adhesion.")
body(story, "Other causes: cigarette smoke toxins, hypertriglyceridemia, homocysteine, local cytokines, viruses, immune reactions.")
h2(story, "Step 2 — Lipoprotein Accumulation and Oxidation")
bullet(story, "LDL crosses dysfunctional endothelium and accumulates in the intima.")
bullet(story, "Oxidized LDL (ox-LDL) is generated by macrophage- and EC-derived reactive oxygen species.")
bullet(story, "<b>Ox-LDL is taken up by macrophages via scavenger receptors</b> (not the classic LDL receptor — "
"hence no downregulation) → <b>foam cells</b>.")
bullet(story, "Ox-LDL also stimulates growth factors, cytokines, chemokines, and is directly cytotoxic to ECs and SMCs.")
bullet(story, "<b>Cholesterol crystals</b> activate the NLRP3 inflammasome in macrophages → IL-1 production → further leukocyte recruitment.")
h2(story, "Step 3 — Monocyte Recruitment and Foam Cell Formation")
bullet(story, "Dysfunctional ECs upregulate adhesion molecules: <b>VCAM-1, ICAM-1, selectins</b>.")
bullet(story, "Circulating monocytes adhere and transmigrate into the intima → differentiate into <b>macrophages</b>.")
bullet(story, "Macrophages phagocytose ox-LDL via scavenger receptors → become <b>foam cells</b> (lipid-laden macrophages) — hallmark of the fatty streak.")
bullet(story, "T lymphocytes are also recruited; activated T cells release IFN-gamma, further activating macrophages, ECs, and SMCs.")
h2(story, "Step 4 — SMC Proliferation and Matrix Synthesis")
bullet(story, "Growth factors from platelets (PDGF), macrophages, ECs, and SMCs drive <b>SMC migration</b> from the media into the intima.")
bullet(story, "Intimal SMCs proliferate and synthesize ECM (<b>especially collagen</b>) — this converts a fatty streak into a mature fibrous atheroma.")
bullet(story, "Key growth factors: <b>PDGF</b> (platelet-derived growth factor), <b>FGF</b> (fibroblast growth factor).")
bullet(story, "SMC collagen synthesis stabilizes plaques; however, activated inflammatory cells can cause SMC apoptosis and matrix breakdown, creating <b>unstable (vulnerable) plaques</b>.")
h2(story, "Step 5 — Lipid Accumulation and Calcification")
bullet(story, "Lipids accumulate both intracellularly (foam cells) and extracellularly.")
bullet(story, "Late in pathogenesis: <b>dystrophic calcification</b> of ECM and necrotic debris occurs.")
spacer(story, 4)
# Summary flow box
flow_data = [[Paragraph(
"<b>Endothelial Injury/Dysfunction</b><br/>"
"↓<br/>"
"Increased permeability + Monocyte adhesion (VCAM-1, ICAM-1)<br/>"
"↓<br/>"
"LDL enters intima → Oxidized LDL<br/>"
"↓<br/>"
"Macrophage scavenger receptor uptake → Foam cells → <b>Fatty streak</b><br/>"
"↓<br/>"
"Cytokines/growth factors (IL-1, PDGF, FGF) → SMC migration & proliferation<br/>"
"↓<br/>"
"ECM (collagen) deposition + lipid accumulation → <b>Fibrous plaque</b><br/>"
"↓<br/>"
"Core necrosis, calcification, cap thinning → <b>Mature atheroma</b><br/>"
"↓<br/>"
"Plaque rupture/erosion → Thrombus → <b>MI / Stroke / Sudden Death</b>",
ParagraphStyle("FlowBox", parent=body_style, fontSize=10,
textColor=BLUE_DARK, alignment=TA_CENTER, leading=16)
)]]
flow_table = Table(flow_data, colWidths=[PAGE_W - 2*MARGIN - 1*cm])
flow_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), BLUE_PALE),
("BOX", (0,0), (-1,-1), 1, BLUE_MID),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING",(0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
]))
story.append(KeepTogether([Paragraph("Atherogenesis — Summary Flow", h3_style), flow_table]))
# ── 5. MORPHOLOGY ─────────────────────────────────────────────────────────────
story.append(PageBreak())
section(story, "5. MORPHOLOGY OF ATHEROSCLEROTIC LESIONS")
h2(story, "A. Fatty Streaks (Earliest Lesion)")
body(story, "Fatty streaks are the <b>earliest grossly recognizable lesions</b> — flat or slightly raised, yellow "
"intimal streaks composed of lipid-filled foam cells (macrophages). They appear in the aorta of infants "
"and children, and coronary arteries in adolescents. <b>Not all fatty streaks progress</b> to fibrous plaques.")
if img_paths[1]:
add_image(story, img_paths[1],
"Fig. Fatty streaks: (A) Aorta with yellowish streaks near branch vessel ostia; "
"(B) Histology showing intimal macrophage-derived foam cells (arrows). "
"[Robbins & Kumar Basic Pathology 10e]",
width=13*cm)
h2(story, "B. Atherosclerotic Plaque (Atheroma) — Full Lesion")
body(story, "<b>Gross morphology:</b> White-yellow raised lesions projecting into the arterial lumen. "
"Variable in size (0.3-1.5 cm), can coalesce.")
body(story, "<b>Preferred sites (in order of frequency):</b>")
bullet(story, "Abdominal aorta (most commonly affected)")
bullet(story, "Coronary arteries")
bullet(story, "Popliteal arteries")
bullet(story, "Descending thoracic aorta")
bullet(story, "Internal carotid arteries")
bullet(story, "Circle of Willis")
if img_paths[2]:
add_image(story, img_paths[2],
"Fig. Atherosclerotic lesions: (A) Aorta with mild fibrous plaques (arrow); "
"(B) Aorta with severe complicated lesions — ulcerated plaque (open arrow) and "
"overlying thrombus (closed arrow). [Robbins & Kumar Basic Pathology 10e]",
width=14*cm)
spacer(story, 4)
h2(story, "C. Histological Components of a Plaque")
comp_data = [
[B("Component"), B("Description")],
["Fibrous cap", "Surface layer of SMCs, macrophages, foam cells, lymphocytes, and dense ECM (collagen). Overlies and contains the lipid core."],
["Necrotic/lipid core", "Soft, grumous mass of cholesterol, cholesterol esters, dead/dying foam cells, necrotic debris, and cholesterol crystals (appear as empty clefts on H&E after processing)."],
["Inflammatory cells", "Macrophages and T cells concentrated at the cap-core junction (\"shoulder region\") — the site most prone to rupture."],
["Neovascularization", "New microvessels (vasa vasorum) that penetrate the plaque; rupture causes intraplaque hemorrhage."],
["Calcification", "Dystrophic calcification in advanced lesions (basophilic deposits on H&E)."],
["Attenuated media", "Media is thinned under advanced plaques due to pressure atrophy and ischemia; weakens the wall."],
]
comp_table = Table(comp_data, colWidths=[5*cm, 11.5*cm])
comp_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [TEAL_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MED),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
]))
story.append(comp_table)
spacer(story, 4)
h3(story, "Glagov Phenomenon (Compensatory Remodeling)")
body(story, "In early-to-moderate atherosclerosis, the arterial media remodels <b>outward</b> to preserve lumen "
"size despite growing plaque. This means plaques may not impinge on the lumen until >40% of the "
"wall is involved. Eventually this compensation fails and the lumen critically narrows.")
# ── 6. COMPLICATIONS ──────────────────────────────────────────────────────────
story.append(PageBreak())
section(story, "6. COMPLICATIONS OF ATHEROSCLEROTIC PLAQUES")
compl_data = [
[B("Complication"), B("Mechanism"), B("Clinical Result")],
["Luminal stenosis\n(Stable)", "Progressive plaque growth narrows lumen; critical stenosis = 70-75% reduction in cross-sectional area in coronary circulation", "Stable angina, claudication, TIA"],
["Plaque rupture / erosion", "Rupture exposes pro-thrombotic core (tissue factor, collagen) to blood → platelet aggregation + coagulation", "ACS, MI, stroke, sudden cardiac death"],
["Thrombosis & embolism", "Thrombus on ruptured plaque; cholesterol crystal emboli from ulcerated plaques", "Complete vessel occlusion; Hollenhorst plaques, renal atheroembolism"],
["Aneurysm formation", "Plaques impede O2/nutrient diffusion to media; medial ischemia + inflammation weakens wall", "Abdominal aortic aneurysm (most common)"],
["Intraplaque hemorrhage", "Rupture of thin-walled neovessels within plaque or surface fissuring", "Rapid plaque expansion, acute symptoms"],
]
compl_table = Table(compl_data, colWidths=[4.2*cm, 7.3*cm, 5*cm])
compl_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), ORANGE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS",(0,1),(-1,-1), [ORANGE_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MED),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story.append(compl_table)
spacer(story, 8)
h2(story, "Vulnerable (Unstable) Plaque — Features")
vuln_data = [
[B("Feature"), B("Description")],
["Large soft lipid core", ">40% of plaque volume; more lipid = higher risk of rupture"],
["Thin fibrous cap", "<65 µm thick; reduced collagen; easily disrupted"],
["Dense cap inflammation", "High macrophage and T cell density at shoulder; MMP-mediated collagen degradation"],
["Low SMC density", "Fewer SMCs = less collagen synthesis = weaker cap"],
["Intraplaque hemorrhage", "From ruptured neovessels; rapidly expands plaque volume"],
]
vuln_table = Table(vuln_data, colWidths=[6*cm, 10.5*cm])
vuln_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#8b1a1a")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [colors.HexColor("#fde8e8"), WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MED),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
]))
story.append(vuln_table)
# ── 7. CLINICAL MANIFESTATIONS ────────────────────────────────────────────────
spacer(story, 8)
section(story, "7. CLINICAL MANIFESTATIONS BY SITE")
clinical_data = [
[B("Site"), B("Manifestation")],
["Coronary arteries", "Stable angina, unstable angina, MI, sudden cardiac death"],
["Carotid / Cerebral", "TIA, ischemic stroke"],
["Abdominal aorta", "Aortic aneurysm, cholesterol atheroembolism"],
["Renal arteries", "Renovascular hypertension, renal ischemia"],
["Peripheral arteries", "Peripheral artery disease — claudication, gangrene, critical limb ischemia"],
["Mesenteric arteries", "Intestinal ischemia / ischemic colitis"],
]
clin_table = Table(clinical_data, colWidths=[6*cm, 10.5*cm])
clin_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), BLUE_DARK),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [BLUE_PALE, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MED),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
]))
story.append(clin_table)
# ── FOOTER / SOURCE ───────────────────────────────────────────────────────────
spacer(story, 16)
hr(story)
story.append(Paragraph(
"Sources: Robbins & Kumar Basic Pathology 10e, pp. 313-320 | "
"Robbins, Cotran & Kumar Pathologic Basis of Disease 10e, pp. 464-475 | "
"Generated by Orris Medical AI — July 2026",
source_style
))
# ── Build ─────────────────────────────────────────────────────────────────────
print("Building PDF...")
doc.build(story)
print(f"Done! Saved to: {OUTPUT}")
cd /home/daytona/workspace/atherosclerosis-pdf && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/atherosclerosis-pdf/Atherosclerosis_Pathology.pdf
Atherosclerosis Pathology
PDF Document · PDF