Give me a table of growth factors involved in regeneration and repair based on Robbins textbook of pathology
| Growth Factor | Sources | Functions |
|---|---|---|
| Epidermal growth factor (EGF) | Activated macrophages, salivary glands, keratinocytes, many other cells | Mitogenic for many cell types; stimulates epithelial cell migration; stimulates formation of granulation tissue |
| Transforming growth factor-α (TGF-α) | Activated macrophages, keratinocytes, many other cells | Stimulates proliferation of hepatocytes and many other epithelial cells |
| Hepatocyte growth factor (HGF) (scatter factor) | Fibroblasts, stromal cells in the liver, endothelial cells | Enhances proliferation of hepatocytes and other epithelial cells; increases cell motility |
| Vascular endothelial growth factor (VEGF) | Mesenchymal cells | Stimulates proliferation of endothelial cells; increases vascular permeability |
| Platelet-derived growth factor (PDGF) | Platelets, macrophages, endothelial cells, smooth muscle cells, keratinocytes | Chemotactic for neutrophils, macrophages, fibroblasts, and smooth muscle cells; activates and stimulates proliferation of fibroblasts, endothelial cells, and other cells; stimulates ECM protein synthesis |
| Fibroblast growth factors (FGFs) including acidic (FGF-1) and basic (FGF-2) | Macrophages, mast cells, endothelial cells, many other cell types | Chemotactic and mitogenic for fibroblasts; stimulates angiogenesis and ECM protein synthesis |
| Transforming growth factor-β (TGF-β) | Platelets, T lymphocytes, macrophages, endothelial cells, epithelial cells, smooth muscle cells, fibroblasts | Chemotactic for leukocytes and fibroblasts; stimulates ECM protein synthesis; suppresses acute inflammation |
| Keratinocyte growth factor (KGF) (i.e., FGF-7) | Fibroblasts | Stimulates keratinocyte migration, proliferation, and differentiation |
Give me summary of stem cells based on same book
| Division Type | What Happens | When It Occurs |
|---|---|---|
| Asymmetric division | One daughter cell differentiates; the other stays undifferentiated and self-renews | Normal homeostasis |
| Symmetric division | Both daughter cells retain self-renewal capacity | Early embryogenesis (expanding stem cell pools) and under stress (e.g., bone marrow repopulation after chemotherapy) |
Generate a visual summary PDF on stem cell niches and differentiation
mkdir -p /home/daytona/workspace/stem-cell-pdf && ls /home/daytona/workspace/
~/stem-cell-pdf/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
from reportlab.graphics.shapes import Drawing, Rect, String, Circle, Line, Arrow, Polygon
from reportlab.graphics import renderPDF
import math
OUTPUT = "/home/daytona/workspace/stem-cell-pdf/Stem_Cell_Niches_and_Differentiation.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
C_DEEP = colors.HexColor("#1A3A5C") # deep navy – headings
C_MID = colors.HexColor("#2E6DA4") # mid blue – sub-headings / borders
C_LIGHT = colors.HexColor("#D6E8F7") # pale blue – table fills
C_ACCENT = colors.HexColor("#E07B39") # orange – highlights
C_GREEN = colors.HexColor("#2E8B57") # sea-green – ES cells
C_PURPLE = colors.HexColor("#6A5ACD") # purple – iPS cells
C_TEAL = colors.HexColor("#1B7B8A") # teal – adult/tissue stem cells
C_GOLD = colors.HexColor("#C8A400") # gold – niches
C_BG = colors.HexColor("#F5F9FD") # page background tint
WHITE = colors.white
BLACK = colors.black
# ── Document ────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="Stem Cell Niches and Differentiation",
author="Robbins, Cotran & Kumar – Pathologic Basis of Disease"
)
W, H = A4
styles = getSampleStyleSheet()
def style(name, **kw):
s = ParagraphStyle(name, **kw)
return s
S_TITLE = style("Title2",
fontName="Helvetica-Bold", fontSize=22,
textColor=WHITE, alignment=TA_CENTER, spaceAfter=4)
S_SUBTITLE = style("Subtitle2",
fontName="Helvetica", fontSize=11,
textColor=colors.HexColor("#CBD8E8"), alignment=TA_CENTER, spaceAfter=2)
S_H1 = style("H1",
fontName="Helvetica-Bold", fontSize=13,
textColor=C_DEEP, spaceBefore=10, spaceAfter=4)
S_H2 = style("H2",
fontName="Helvetica-Bold", fontSize=11,
textColor=C_MID, spaceBefore=6, spaceAfter=3)
S_BODY = style("Body2",
fontName="Helvetica", fontSize=9.5,
textColor=colors.HexColor("#222222"),
leading=14, spaceAfter=3, alignment=TA_JUSTIFY)
S_SMALL = style("Small",
fontName="Helvetica", fontSize=8,
textColor=colors.HexColor("#444444"), leading=11, spaceAfter=2)
S_CAPTION = style("Caption",
fontName="Helvetica-Oblique", fontSize=8,
textColor=colors.HexColor("#555555"), alignment=TA_CENTER, spaceAfter=6)
S_BULLET = style("Bullet",
fontName="Helvetica", fontSize=9.5,
textColor=colors.HexColor("#222222"),
leading=14, spaceAfter=2, leftIndent=14, firstLineIndent=-10)
S_LABEL = style("Label",
fontName="Helvetica-Bold", fontSize=8.5,
textColor=WHITE, alignment=TA_CENTER)
S_SOURCE = style("Source",
fontName="Helvetica-Oblique", fontSize=7.5,
textColor=colors.HexColor("#777777"), alignment=TA_CENTER, spaceAfter=0)
# ── Custom Flowables ─────────────────────────────────────────────────────────
class HeaderBanner(Flowable):
"""Full-width colour banner for the page title."""
def __init__(self, width, title, subtitle):
Flowable.__init__(self)
self.width = width
self.title = title
self.subtitle = subtitle
self.height = 70
def draw(self):
c = self.canv
# gradient-ish background (two rects)
c.setFillColor(C_DEEP)
c.rect(0, 0, self.width, self.height, fill=1, stroke=0)
c.setFillColor(colors.HexColor("#1E4A7A"))
c.rect(0, 0, self.width/2, self.height, fill=1, stroke=0)
# accent bar at bottom
c.setFillColor(C_ACCENT)
c.rect(0, 0, self.width, 4, fill=1, stroke=0)
# title
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 20)
c.drawCentredString(self.width/2, self.height - 30, self.title)
# subtitle
c.setFillColor(colors.HexColor("#CBD8E8"))
c.setFont("Helvetica", 10)
c.drawCentredString(self.width/2, self.height - 50, self.subtitle)
class SectionHeader(Flowable):
def __init__(self, width, text, color=C_MID):
Flowable.__init__(self)
self.width = width
self.text = text
self.color = color
self.height = 22
def draw(self):
c = self.canv
c.setFillColor(self.color)
c.roundRect(0, 2, self.width, self.height - 2, 4, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 11)
c.drawString(10, 7, self.text)
class DivisionDiagram(Flowable):
"""Asymmetric vs Symmetric division diagram."""
def __init__(self, width):
Flowable.__init__(self)
self.width = width
self.height = 130
def _cell(self, c, x, y, r, label, fill_col, text_col=WHITE):
c.setFillColor(fill_col)
c.setStrokeColor(colors.HexColor("#333333"))
c.setLineWidth(0.8)
c.circle(x, y, r, fill=1, stroke=1)
c.setFillColor(text_col)
c.setFont("Helvetica-Bold", 7)
c.drawCentredString(x, y - 3, label)
def _arrow(self, c, x1, y1, x2, y2):
c.setStrokeColor(C_DEEP)
c.setLineWidth(1.2)
c.line(x1, y1, x2, y2)
# arrowhead
angle = math.atan2(y2 - y1, x2 - x1)
size = 6
ax = x2 - size * math.cos(angle - 0.4)
ay = y2 - size * math.sin(angle - 0.4)
bx = x2 - size * math.cos(angle + 0.4)
by = y2 - size * math.sin(angle + 0.4)
c.setFillColor(C_DEEP)
p = c.beginPath()
p.moveTo(x2, y2)
p.lineTo(ax, ay)
p.lineTo(bx, by)
p.close()
c.drawPath(p, fill=1, stroke=0)
def draw(self):
c = self.canv
mid = self.width / 2
# ---- LEFT: Asymmetric ----
lx = mid * 0.45
# label
c.setFillColor(C_DEEP)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(lx, self.height - 12, "Asymmetric Division")
# parent
self._cell(c, lx, self.height - 40, 16, "Stem", C_TEAL)
# two arrows
self._arrow(c, lx - 8, self.height - 57, lx - 22, self.height - 78)
self._arrow(c, lx + 8, self.height - 57, lx + 22, self.height - 78)
# daughter 1 – stem
self._cell(c, lx - 24, self.height - 95, 14, "Stem", C_TEAL)
c.setFillColor(colors.HexColor("#444444"))
c.setFont("Helvetica", 7)
c.drawCentredString(lx - 24, self.height - 113, "(self-renewal)")
# daughter 2 – differentiated
self._cell(c, lx + 24, self.height - 95, 14, "Diff", C_ACCENT)
c.setFillColor(colors.HexColor("#444444"))
c.setFont("Helvetica", 7)
c.drawCentredString(lx + 24, self.height - 113, "(differentiated)")
# divider
c.setStrokeColor(colors.HexColor("#CCCCCC"))
c.setLineWidth(0.8)
c.line(mid, 10, mid, self.height - 5)
# ---- RIGHT: Symmetric ----
rx = mid + mid * 0.55
c.setFillColor(C_DEEP)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(rx, self.height - 12, "Symmetric Division")
self._cell(c, rx, self.height - 40, 16, "Stem", C_TEAL)
self._arrow(c, rx - 8, self.height - 57, rx - 22, self.height - 78)
self._arrow(c, rx + 8, self.height - 57, rx + 22, self.height - 78)
self._cell(c, rx - 24, self.height - 95, 14, "Stem", C_TEAL)
c.setFillColor(colors.HexColor("#444444"))
c.setFont("Helvetica", 7)
c.drawCentredString(rx - 24, self.height - 113, "(self-renewal)")
self._cell(c, rx + 24, self.height - 95, 14, "Stem", C_TEAL)
c.setFillColor(colors.HexColor("#444444"))
c.setFont("Helvetica", 7)
c.drawCentredString(rx + 24, self.height - 113, "(self-renewal)")
class DifferentiationTree(Flowable):
"""ES → lineage commitment → differentiated cell types."""
def __init__(self, width):
Flowable.__init__(self)
self.width = width
self.height = 180
def _box(self, c, x, y, w, h, fill, label, fsize=8, text_col=WHITE, radius=5):
c.setFillColor(fill)
c.setStrokeColor(colors.HexColor("#333333"))
c.setLineWidth(0.7)
c.roundRect(x - w/2, y - h/2, w, h, radius, fill=1, stroke=1)
c.setFillColor(text_col)
c.setFont("Helvetica-Bold", fsize)
c.drawCentredString(x, y - fsize*0.35, label)
def _line(self, c, x1, y1, x2, y2):
c.setStrokeColor(C_MID)
c.setLineWidth(1)
c.line(x1, y1, x2, y2)
def draw(self):
c = self.canv
W = self.width
top = self.height - 18
# ES cell (top centre)
self._box(c, W/2, top, 80, 22, C_GREEN, "Embryonic Stem Cell", fsize=8)
# Three germ layers
ly = top - 52
for xi, label, col in [
(W*0.18, "Ectoderm", colors.HexColor("#5B8DB8")),
(W*0.50, "Mesoderm", colors.HexColor("#5BA87A")),
(W*0.82, "Endoderm", colors.HexColor("#C07840")),
]:
self._line(c, W/2, top - 11, xi, ly + 11)
self._box(c, xi, ly, 70, 20, col, label, fsize=8)
# Differentiated progeny
prog = {
W*0.18: [("Neurons", colors.HexColor("#3A6B94")), ("Skin cells", colors.HexColor("#5596C8"))],
W*0.50: [("Cardiomyocytes", colors.HexColor("#3A8A5C")), ("Bone / Cartilage", colors.HexColor("#2E7A50"))],
W*0.82: [("Hepatocytes", colors.HexColor("#A05C28")), ("Gut epithelium", colors.HexColor("#C08040"))],
}
dy = ly - 52
for xi, items in prog.items():
lx_list = [xi - 36, xi + 36] if len(items) == 2 else [xi]
for (lbl, col), lxi in zip(items, lx_list):
self._line(c, xi, ly - 10, lxi, dy + 10)
self._box(c, lxi, dy, 62, 18, col, lbl, fsize=7.5)
# iPS arrow (left side)
c.setStrokeColor(C_PURPLE)
c.setLineWidth(1.5)
c.setDash([4, 3])
c.line(18, dy - 5, 18, top)
c.setDash([])
# arrowhead up
c.setFillColor(C_PURPLE)
p = c.beginPath()
p.moveTo(18, top + 4)
p.lineTo(14, top - 6)
p.lineTo(22, top - 6)
p.close()
c.drawPath(p, fill=1, stroke=0)
c.setFillColor(C_PURPLE)
c.setFont("Helvetica-Bold", 7.5)
c.saveState()
c.translate(10, (top + dy)/2)
c.rotate(90)
c.drawCentredString(0, 0, "iPS Reprogramming")
c.restoreState()
# source label at bottom
c.setFillColor(colors.HexColor("#777777"))
c.setFont("Helvetica-Oblique", 7)
c.drawCentredString(W/2, 4, "Source: Robbins, Cotran & Kumar – Pathologic Basis of Disease")
class NicheDiagram(Flowable):
"""Visual representation of stem cell niches across tissues."""
def __init__(self, width):
Flowable.__init__(self)
self.width = width
self.height = 95
def _niche_box(self, c, x, y, w, h, tissue, location, tc, lc):
# outer rect
c.setFillColor(tc)
c.setStrokeColor(colors.HexColor("#999999"))
c.setLineWidth(0.6)
c.roundRect(x, y, w, h, 5, fill=1, stroke=1)
# inner lighter band
c.setFillColor(lc)
c.roundRect(x+2, y+2, w-4, h/2 - 2, 3, fill=1, stroke=0)
# text
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 8)
c.drawCentredString(x + w/2, y + h - 13, tissue)
c.setFillColor(colors.HexColor("#EEEEEE"))
c.setFont("Helvetica", 7)
# wrap long location text
words = location.split()
line1 = " ".join(words[:3])
line2 = " ".join(words[3:]) if len(words) > 3 else ""
c.drawCentredString(x + w/2, y + h/2 - 6, line1)
if line2:
c.drawCentredString(x + w/2, y + h/2 - 16, line2)
def draw(self):
c = self.canv
niches = [
("Bone Marrow", "Perivascular niches", colors.HexColor("#2E6DA4"), colors.HexColor("#4A8AC0")),
("Intestine", "Crypt base (CBC cells)", colors.HexColor("#2E8B57"), colors.HexColor("#4AAD72")),
("Skin / Hair", "Bulge of hair follicle", colors.HexColor("#C07840"), colors.HexColor("#D89050")),
("Cornea", "Limbus region", colors.HexColor("#6A5ACD"), colors.HexColor("#8A7AED")),
("Brain", "Subventricular zone", colors.HexColor("#1B7B8A"), colors.HexColor("#3A9BAA")),
]
n = len(niches)
gap = 6
bw = (self.width - gap*(n+1)) / n
bh = 75
y0 = 10
for i, (tissue, loc, tc, lc) in enumerate(niches):
x = gap + i*(bw + gap)
self._niche_box(c, x, y0, bw, bh, tissue, loc, tc, lc)
# ── Build story ──────────────────────────────────────────────────────────────
story = []
page_w = W - 3.6*cm # usable width
# ── HEADER BANNER ──
story.append(HeaderBanner(page_w, "Stem Cell Niches & Differentiation", "Based on Robbins, Cotran & Kumar – Pathologic Basis of Disease"))
story.append(Spacer(1, 10))
# ── 1. DEFINITION ──
story.append(SectionHeader(page_w, "1. What Are Stem Cells?", C_DEEP))
story.append(Spacer(1, 6))
story.append(Paragraph(
"Stem cells possess two cardinal properties: <b>self-renewal</b> (the ability to replicate "
"indefinitely) and <b>differentiation</b> (the capacity to produce specialised daughter cells). "
"In normal tissues, a homeostatic equilibrium exists between stem cell replication, "
"differentiation into mature cells, and death of terminally differentiated cells.",
S_BODY))
# ── 2. TYPES TABLE ──
story.append(Spacer(1, 8))
story.append(SectionHeader(page_w, "2. Types of Stem Cells", C_MID))
story.append(Spacer(1, 6))
type_data = [
[Paragraph("<b>Type</b>", S_LABEL), Paragraph("<b>Location</b>", S_LABEL),
Paragraph("<b>Potency</b>", S_LABEL), Paragraph("<b>Key Features</b>", S_LABEL)],
[Paragraph("Embryonic\nStem (ES) Cells", S_BODY),
Paragraph("Inner cell mass of blastocyst", S_BODY),
Paragraph("Totipotent / Pluripotent", S_BODY),
Paragraph("Limitless renewal; form all three germ layers; can be maintained in culture without differentiating", S_BODY)],
[Paragraph("Tissue (Adult)\nStem Cells", S_BODY),
Paragraph("Tissue-specific niches (see §4)", S_BODY),
Paragraph("Multipotent / Unipotent", S_BODY),
Paragraph("Limited lineage repertoire; regulated by niche signals; maintain high- and low-turnover tissues", S_BODY)],
[Paragraph("Induced Pluripotent\nStem (iPS) Cells", S_BODY),
Paragraph("Lab-derived from patient somatic cells", S_BODY),
Paragraph("Pluripotent", S_BODY),
Paragraph("Reprogrammed by introducing specific transcription factor genes; avoid immune rejection; used for disease modelling & drug screening", S_BODY)],
[Paragraph("Mesenchymal\nStem Cells (MSCs)", S_BODY),
Paragraph("Bone marrow, adipose tissue", S_BODY),
Paragraph("Multipotent", S_BODY),
Paragraph("Differentiate into chondrocytes, osteocytes, adipocytes, myocytes; locally immunosuppressive; potential scaffold for tissue regeneration", S_BODY)],
[Paragraph("Hematopoietic\nStem Cells (HSCs)", S_BODY),
Paragraph("Bone marrow perivascular niche; peripheral blood (after G-CSF)", S_BODY),
Paragraph("Multipotent", S_BODY),
Paragraph("Replenish all blood lineages; purified by surface markers; clinical use: marrow reconstitution, sickle cell disease", S_BODY)],
]
col_w = [page_w * f for f in [0.17, 0.20, 0.17, 0.46]]
type_table = Table(type_data, colWidths=col_w, repeatRows=1)
type_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_DEEP),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ROWBACKGROUNDS",(0,1),(-1,-1), [C_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#AAAAAA")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
# Colour-code first column
("BACKGROUND", (0,1), (0,1), colors.HexColor("#D0EAD8")), # ES – green tint
("BACKGROUND", (0,2), (0,2), C_LIGHT),
("BACKGROUND", (0,3), (0,3), colors.HexColor("#E8D8F5")), # iPS – purple tint
("BACKGROUND", (0,4), (0,4), colors.HexColor("#FFF0E0")), # MSC – orange tint
("BACKGROUND", (0,5), (0,5), colors.HexColor("#D0E8FF")), # HSC – blue tint
]))
story.append(type_table)
# ── 3. DIVISION TYPES ──
story.append(Spacer(1, 10))
story.append(SectionHeader(page_w, "3. Types of Stem Cell Division", C_TEAL))
story.append(Spacer(1, 6))
story.append(DivisionDiagram(page_w))
story.append(Paragraph(
"<b>Asymmetric division</b> – one daughter remains a stem cell; the other differentiates. "
"Maintains the stem cell pool during normal homeostasis. "
"<b>Symmetric division</b> – both daughters retain stem cell identity. "
"Occurs during embryogenesis (pool expansion) and after bone-marrow-ablative chemotherapy.",
S_SMALL))
# ── 4. NICHES ──
story.append(Spacer(1, 10))
story.append(SectionHeader(page_w, "4. Stem Cell Niches", C_GOLD))
story.append(Spacer(1, 6))
story.append(Paragraph(
"Adult stem cells reside in specialised microenvironments called <b>niches</b>. "
"Soluble factors and supporting cells within the niche regulate the balance between "
"stem cell <i>quiescence</i>, <i>expansion</i>, and <i>differentiation</i>.",
S_BODY))
story.append(Spacer(1, 6))
story.append(NicheDiagram(page_w))
story.append(Spacer(1, 4))
niche_data = [
[Paragraph("<b>Tissue</b>", S_LABEL), Paragraph("<b>Niche Location</b>", S_LABEL),
Paragraph("<b>Stem Cell Type</b>", S_LABEL), Paragraph("<b>Clinical Relevance</b>", S_LABEL)],
["Bone Marrow", "Perivascular niches", "Hematopoietic stem cells",
"Transplant after chemotherapy; sickle cell disease"],
["Small Intestine","Crypt base (between Paneth cells)", "Epithelial (CBC) stem cells",
"Rapid epithelial renewal; target in GI diseases"],
["Skin / Hair", "Bulge of hair follicle + basal epidermis", "Keratinocyte stem cells",
"Wound healing; re-epithelialisation"],
["Cornea", "Limbus region", "Limbal stem cells",
"Corneal transplantation; chemical-burn repair"],
["Brain", "Subventricular zone", "Neural stem cells",
"Neurogenesis; potential target in neurodegeneration"],
["Liver", "Canals of Hering", "Hepatic progenitor (oval) cells",
"Liver regeneration after massive injury"],
]
niche_col_w = [page_w * f for f in [0.16, 0.26, 0.26, 0.32]]
niche_tbl = Table(niche_data, colWidths=niche_col_w, repeatRows=1)
niche_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_GOLD),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 9),
("ROWBACKGROUNDS",(0,1), (-1,-1), [colors.HexColor("#FFFBE8"), WHITE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
story.append(niche_tbl)
# ── 5. DIFFERENTIATION PATHWAY ──
story.append(Spacer(1, 10))
story.append(SectionHeader(page_w, "5. ES Cell Differentiation Pathway & iPS Reprogramming", C_GREEN))
story.append(Spacer(1, 6))
story.append(DifferentiationTree(page_w))
story.append(Spacer(1, 4))
story.append(Paragraph(
"ES cells from the blastocyst inner cell mass can differentiate into cells of all three "
"germ layers. The <b style='color:#6A5ACD'>dashed purple arrow</b> represents iPS reprogramming – "
"the introduction of pluripotency genes (e.g., Oct4, Sox2, Klf4, c-Myc) into differentiated "
"somatic cells to generate patient-specific pluripotent stem cells.",
S_SMALL))
# ── 6. iPS CELLS DETAIL ──
story.append(Spacer(1, 10))
story.append(SectionHeader(page_w, "6. Induced Pluripotent Stem (iPS) Cells", C_PURPLE))
story.append(Spacer(1, 6))
ips_data = [
[Paragraph("<b>Step</b>", S_LABEL), Paragraph("<b>Detail</b>", S_LABEL)],
["1. Harvest somatic cells", "Obtain patient fibroblasts or other differentiated cells"],
["2. Introduce reprogramming genes", "Transcription factors (Oct4, Sox2, Klf4, c-Myc) are delivered via viral or non-viral vectors"],
["3. iPS colonies form", "Reprogrammed cells acquire ES-like morphology, surface markers, and gene expression profile"],
["4. Direct differentiation", "iPS cells are directed toward specific lineages (e.g., cardiomyocytes, β-cells, neurons) by growth factors"],
["5. Clinical / Research use","Disease-specific avatars for drug screening; potential autologous cell therapy without immune rejection"],
]
ips_col_w = [page_w*0.30, page_w*0.70]
ips_tbl = Table(ips_data, colWidths=ips_col_w, repeatRows=1)
ips_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_PURPLE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 9),
("ROWBACKGROUNDS",(0,1), (-1,-1), [colors.HexColor("#F0EAF9"), WHITE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
story.append(ips_tbl)
# ── 7. REGENERATIVE MEDICINE ──
story.append(Spacer(1, 10))
story.append(SectionHeader(page_w, "7. Regenerative Medicine & Clinical Applications", C_ACCENT))
story.append(Spacer(1, 6))
regen_data = [
[Paragraph("<b>Application</b>", S_LABEL), Paragraph("<b>Stem Cell Used</b>", S_LABEL),
Paragraph("<b>Target Tissue</b>", S_LABEL), Paragraph("<b>Status / Notes</b>", S_LABEL)],
["Bone marrow transplant", "Hematopoietic stem cells (HSCs)", "Blood / immune system",
"Established clinical practice; used in leukaemia, lymphoma, sickle cell disease"],
["Corneal stem cell transplant", "Limbal stem cells", "Corneal epithelium",
"Clinical use for limbal stem cell deficiency after chemical burns"],
["Myocardial regeneration", "MSCs / iPS-derived cardiomyocytes", "Heart",
"Active research; limited success so far – engraftment and integration remain challenges"],
["Neural repair (stroke, SCI)", "Neural stem cells / iPS-derived neurons", "Brain / spinal cord",
"Pre-clinical and early clinical trials; low intrinsic regenerative capacity of CNS is a barrier"],
["Diabetes therapy", "iPS-derived β-cells", "Pancreatic islets",
"Not yet in routine practice; potential to restore insulin secretion in Type 1 diabetes"],
["Tissue engineering", "MSCs + scaffolds", "Bone, cartilage, skin",
"Emerging; MSCs generate immunosuppressive microenvironment; good for structural tissues"],
]
regen_col_w = [page_w*f for f in [0.22, 0.22, 0.20, 0.36]]
regen_tbl = Table(regen_data, colWidths=regen_col_w, repeatRows=1)
regen_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_ACCENT),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [colors.HexColor("#FFF4EC"), WHITE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
story.append(regen_tbl)
# ── KEY LIMITATIONS BOX ──
story.append(Spacer(1, 10))
lim_data = [[
Paragraph(
"<b>Key Limitations in Regenerative Medicine:</b> "
"(1) Difficulty integrating transplanted cells at damage sites. "
"(2) Most adult and ES cells express HLA – risk of immune rejection. "
"(3) iPS technology addresses rejection but is not yet in routine practice. "
"(4) Tissues with very low regenerative capacity (myocardium, neurons) remain the biggest challenge.",
S_SMALL)
]]
lim_tbl = Table(lim_data, colWidths=[page_w])
lim_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#FFF0E0")),
("BOX", (0,0), (-1,-1), 1.2, C_ACCENT),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING",(0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(lim_tbl)
# ── FOOTER ──
story.append(Spacer(1, 12))
story.append(HRFlowable(width=page_w, thickness=0.5, color=C_MID))
story.append(Spacer(1, 4))
story.append(Paragraph(
"Source: Robbins, Cotran & Kumar – Pathologic Basis of Disease (Chapter 1, pp. 42-44) | "
"Compiled by Orris AI | For educational purposes only",
S_SOURCE))
# ── BUILD ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /home/daytona/workspace/stem-cell-pdf && python generate_pdf.py 2>&1
~/stem-cell-pdf/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/stem-cell-pdf/generate_pdf.py'
cd /home/daytona/workspace/stem-cell-pdf && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/stem-cell-pdf/
Stem Cell Niches and Differentiation
PDF Document · PDF