Immunomodulatory action of progesterone actions in pregnancy. Help me understand and note for my exams
progesterone immunomodulation pregnancy
PMID: 42303279
PMID: 41895062
progesterone Th2 cytokine shift uterine NK cells tolerance
progesterone immunomodulatory mechanisms pregnancy PIBF uterine NK cells HLA-G regulatory T cells
Progesterone levels rise dramatically throughout pregnancy - initially from the corpus luteum, then from the placenta after ~8 weeks. Concentrations at the maternal-fetal interface are far higher than in peripheral blood, which explains why immune changes are largely local rather than systemic.
| Feature | Th1 Response | Th2 Response |
|---|---|---|
| Key cytokines | IFN-γ, TNF-α, IL-12, IL-2 | IL-4, IL-5, IL-10, IL-13, TGF-β |
| Immune type | Pro-inflammatory, cell-mediated | Anti-inflammatory, humoral |
| Effect on pregnancy | Harmful - promotes rejection | Protective - promotes tolerance |
PIBF colocalizes within the cytoplasmic granules of decidual NK (dNK) cells. It can directly inhibit NK cell degranulation in vitro.
PROGESTERONE
│
├─► Th1 → Th2 Shift (↓IFN-γ, TNF-α; ↑IL-4, IL-10, TGF-β)
│
├─► PIBF Induction
│ ├── Suppresses cytotoxic T cells
│ ├── Inhibits NK cell degranulation
│ └── ↓ Arachidonic acid → ↓ Preterm labor risk
│
├─► HLA-G Upregulation on trophoblasts
│ └── Inhibits dNK cell killing via inhibitory receptors
│
├─► Treg Expansion (CD4+CD25+FOXP3+)
│ └── Produces IL-10, TGF-β → further tolerance
│
├─► NK cell suppression (via GR, ↓STAT4/IκB phosphorylation)
│
└─► Direct T cell suppression (K+ channels → ↓Ca²+ signaling)
| Clinical Scenario | Progesterone's Role |
|---|---|
| Recurrent miscarriage | Low PIBF / excess Th1 - progesterone supplementation helps |
| Threatened abortion | Progesterone supports fetal tolerance |
| Luteal phase defect | Inadequate progesterone → poor implantation |
| Preterm labor | Loss of PIBF → arachidonic acid ↑ → prostaglandins ↑ → contractions |
| Preeclampsia | Associated with Th1 shift / dysregulated immune tolerance |
Generate a study guide PDF on progesterone immunology for quick revision
mkdir -p /home/daytona/workspace/progesterone-study-guide && ls /home/daytona/workspace/
~/progesterone-study-guide/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/progesterone-study-guide/Progesterone_Immunology_Study_Guide.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
PURPLE = colors.HexColor("#4A235A") # headers
LIGHT_PURPLE = colors.HexColor("#7D3C98") # sub-headers
ACCENT = colors.HexColor("#D7BDE2") # table header fills
PALE = colors.HexColor("#F5EEF8") # alternating row / callout bg
WHITE = colors.white
RED_WARN = colors.HexColor("#C0392B")
TEAL = colors.HexColor("#117A65")
ORANGE = colors.HexColor("#E67E22")
LIGHT_BLUE = colors.HexColor("#EAF2FF")
DARK_GREY = colors.HexColor("#2C3E50")
# ── Document ─────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="Progesterone Immunology Study Guide",
author="Orris Medical Education"
)
styles = getSampleStyleSheet()
# ── Custom styles ─────────────────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("MainTitle",
fontName="Helvetica-Bold", fontSize=22, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=4)
subtitle_style = S("SubTitle",
fontName="Helvetica", fontSize=11, textColor=ACCENT,
alignment=TA_CENTER, spaceAfter=2)
h1 = S("H1",
fontName="Helvetica-Bold", fontSize=14, textColor=WHITE,
spaceBefore=14, spaceAfter=6, backColor=PURPLE,
borderPadding=(5, 8, 5, 8), leftIndent=0)
h2 = S("H2",
fontName="Helvetica-Bold", fontSize=12, textColor=LIGHT_PURPLE,
spaceBefore=10, spaceAfter=4, borderPadding=(2,0,2,4))
h3 = S("H3",
fontName="Helvetica-Bold", fontSize=10.5, textColor=TEAL,
spaceBefore=6, spaceAfter=2)
body = S("Body",
fontName="Helvetica", fontSize=9.5, leading=14,
textColor=DARK_GREY, spaceAfter=4, alignment=TA_JUSTIFY)
bullet = S("Bullet",
fontName="Helvetica", fontSize=9.5, leading=13,
textColor=DARK_GREY, leftIndent=14, bulletIndent=4,
spaceAfter=2)
sub_bullet = S("SubBullet",
fontName="Helvetica", fontSize=9, leading=12,
textColor=DARK_GREY, leftIndent=28, bulletIndent=18,
spaceAfter=1)
bold_bullet = S("BoldBullet",
fontName="Helvetica-Bold", fontSize=9.5, leading=13,
textColor=DARK_GREY, leftIndent=14, bulletIndent=4,
spaceAfter=2)
callout = S("Callout",
fontName="Helvetica-Oblique", fontSize=9.5, leading=13,
textColor=RED_WARN, backColor=colors.HexColor("#FDEDEC"),
borderPadding=(6, 8, 6, 8), spaceBefore=4, spaceAfter=6,
alignment=TA_JUSTIFY)
key_box = S("KeyBox",
fontName="Helvetica-Bold", fontSize=9.5, leading=13,
textColor=DARK_GREY, backColor=PALE,
borderPadding=(6, 8, 6, 8), spaceBefore=4, spaceAfter=6)
footnote = S("Footnote",
fontName="Helvetica-Oblique", fontSize=7.5,
textColor=colors.grey, spaceAfter=2)
# ── Helper builders ───────────────────────────────────────────────────────────
def title_block(story):
"""Purple title banner"""
data = [[Paragraph("PROGESTERONE IMMUNOLOGY IN PREGNANCY", title_style)],
[Paragraph("Quick Revision Study Guide • Exam Edition", subtitle_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), PURPLE),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING", (0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [6]),
]))
story.append(t)
story.append(Spacer(1, 8))
def section_header(story, text):
data = [[Paragraph(text, h1)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), PURPLE),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(t)
story.append(Spacer(1, 4))
def hr(story, color=LIGHT_PURPLE, thickness=0.8):
story.append(HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4))
def two_col_table(story, headers, rows, col_widths=None, alt=True):
if col_widths is None:
col_widths = [17*cm / len(headers)] * len(headers)
data = [[Paragraph(f"<b>{h}</b>", S("TH", fontName="Helvetica-Bold",
fontSize=9.5, textColor=WHITE, alignment=TA_CENTER))
for h in headers]]
for i, row in enumerate(rows):
data.append([Paragraph(str(cell), body) for cell in row])
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), LIGHT_PURPLE),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#BDC3C7")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
if alt:
for i in range(1, len(rows)+1):
if i % 2 == 0:
style.append(("BACKGROUND", (0,i), (-1,i), PALE))
t.setStyle(TableStyle(style))
story.append(t)
story.append(Spacer(1, 6))
# ══════════════════════════════════════════════════════════════════════════════
# BUILD STORY
# ══════════════════════════════════════════════════════════════════════════════
story = []
# ── Cover / Title ─────────────────────────────────────────────────────────────
title_block(story)
story.append(Paragraph(
"Progesterone (P4) is the master immunological regulator of pregnancy. It prevents "
"maternal rejection of the semi-allogeneic fetus by shifting immune responses from "
"pro-inflammatory (Th1) to tolerogenic (Th2), inducing blocking factors, and "
"remodelling the uterine immune microenvironment. Understanding these mechanisms is "
"high-yield for OBGYN, Immunology, and Physiology exams.", body))
story.append(Spacer(1, 4))
story.append(Paragraph(
"⚠ The Fundamental Problem: The fetus carries PATERNAL (foreign) antigens — it is a "
"semi-allograft. Without active immune suppression, the maternal immune system would "
"reject it. Progesterone solves this — primarily at the LOCAL level (concentrations "
"at the maternal-fetal interface are far higher than in peripheral blood).", callout))
story.append(Spacer(1, 6))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — Th1/Th2 Shift
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "1. THE Th1 / Th2 CYTOKINE SHIFT (Most Exam-Important!)")
story.append(Paragraph("Normal pregnancy = Th2-dominant environment", h2))
story.append(Paragraph(
"Progesterone drives a fundamental shift from Th1 (cell-mediated, inflammatory) to "
"Th2 (humoral, anti-inflammatory) immune responses at the maternal-fetal interface.", body))
two_col_table(story,
["Feature", "Th1 Response (BAD in pregnancy)", "Th2 Response (GOOD in pregnancy)"],
[
["Key cytokines", "IFN-γ, TNF-α, IL-12, IL-2", "IL-4, IL-5, IL-10, IL-13, TGF-β"],
["Immune type", "Pro-inflammatory, cell-mediated", "Anti-inflammatory, humoral"],
["Effect on fetus","Promotes rejection / miscarriage", "Promotes tolerance / implantation"],
["Clinical outcome if dominant", "Spontaneous abortion, preeclampsia, preterm labor",
"Successful pregnancy maintenance"],
],
col_widths=[4*cm, 6.5*cm, 6.5*cm]
)
story.append(Paragraph("<b>How progesterone achieves this shift:</b>", h3))
for pt in [
"Inhibits mitogen-induced proliferation of CD8+ T cells",
"Alters transcription factors that drive Th1 cell development",
"Promotes synthesis of Th2 cytokines (IL-4, IL-10, IL-13, TGF-β) at the decidua",
"Downregulates pro-inflammatory cytokines: IL-6, TNF-α, IFN-γ",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Spacer(1, 4))
story.append(Paragraph(
"EXAM ALERT: Th1 shift (↑TNF-α, IFN-γ) = associated with recurrent pregnancy loss, "
"preeclampsia, and preterm labour. TNF-α is a measurable marker of inflammation in RPL.", callout))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — PIBF
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "2. PROGESTERONE-INDUCED BLOCKING FACTOR (PIBF)")
story.append(Paragraph(
"PIBF is progesterone's KEY indirect immunomediator — arguably the single most "
"important molecule to memorise for exams.", key_box))
story.append(Paragraph("How PIBF is produced:", h3))
for pt in [
"Progesterone binds to progesterone receptor (PR) on activated T lymphocytes (esp. CD8+ cells) at the maternal-fetal interface",
"These cells synthesise and secrete PIBF",
"PIBF receptor is GPI-anchored; forms a heterodimer with the IL-4 receptor α-chain",
"PIBF colocalises within cytoplasmic granules of decidual NK (dNK) cells",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Paragraph("Actions of PIBF:", h3))
two_col_table(story,
["PIBF Action", "Mechanism / Significance"],
[
["↑ Th2 cytokine synthesis", "Reinforces the Th1→Th2 shift"],
["↓ Cytotoxic T cell activity", "Prevents direct fetal cell killing by CTLs"],
["↓ NK cell degranulation", "Prevents NK-mediated trophoblast destruction"],
["↓ Arachidonic acid synthesis", "↓ Prostaglandins → reduces preterm labour risk"],
["Modulates lymphocyte proliferation","Suppresses anti-fetal immune responses"],
],
col_widths=[6*cm, 11*cm]
)
story.append(Paragraph(
"Clinical link: Low PIBF levels are found in women with threatened miscarriage and "
"recurrent pregnancy loss. Progesterone supplementation raises PIBF and improves "
"outcomes. (Mehta et al., J Obstet Gynaecol Res, 2026)", footnote))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — NK cells
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "3. UTERINE NK CELL SUPPRESSION")
story.append(Paragraph(
"Uterine NK cells (uNK) are the most abundant immune cells in the decidua — but "
"unlike peripheral NK cells, they are TOLEROGENIC, not cytolytic, in normal pregnancy.", body))
story.append(Paragraph("How progesterone suppresses uNK cells:", h3))
for pt in [
"uNK cells express GLUCOCORTICOID RECEPTOR (GR) — NOT the progesterone receptor (PR)",
"Progesterone acts via GR to suppress NK cell activation and IFN-γ production",
"Molecular mechanism: altered STAT4 and IκB phosphorylation (key signal transduction steps)",
"PIBF also directly inhibits NK cell degranulation within decidual granules",
"Net effect: uNK cells cannot kill trophoblasts — they assist implantation instead",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Spacer(1, 4))
story.append(Paragraph(
"Exam pearl: uNK cells express GR not PR — progesterone's suppression of NK cells is "
"INDIRECT via the glucocorticoid receptor pathway.", callout))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — HLA-G
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "4. HLA-G UPREGULATION ON TROPHOBLASTS")
story.append(Paragraph("What is HLA-G?", h3))
for pt in [
"Non-classical MHC class I molecule expressed on trophoblasts",
"Does NOT present antigens for T cell recognition (unlike classical HLA-A, -B, -C)",
"Acts as a LIGAND for INHIBITORY RECEPTORS on decidual NK cells and T cells",
"Progesterone upregulates HLA-G expression on trophoblast cells",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Paragraph("HLA-G Functions:", h3))
two_col_table(story,
["Target Cell", "Receptor on Target", "Effect"],
[
["Decidual NK cells", "ILT2, ILT4, KIR2DL4 (inhibitory receptors)", "Prevents NK killing of trophoblasts"],
["CD8+ T cells", "ILT2", "Suppresses cytotoxic T cell attack"],
["γδ T cells", "NKG2A/CD94", "Activates tolerogenic γδ T cells"],
["Macrophages/DCs", "ILT4", "Induces tolerogenic APC phenotype"],
],
col_widths=[4.5*cm, 7*cm, 5.5*cm]
)
story.append(Paragraph(
"HLA-G is progesterone-dependent. It is the trophoblast's 'do not kill me' signal — "
"allowing invasion without immune attack.", key_box))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — Tregs
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "5. REGULATORY T CELLS (Tregs) EXPANSION")
story.append(Paragraph(
"Tregs (CD4+CD25+FOXP3+) are gatekeepers of immune tolerance. Progesterone expands "
"their numbers and enhances their function.", body))
story.append(Paragraph("How progesterone promotes Tregs:", h3))
for pt in [
"Pregnancy-level P4 expands CD4+CD25+FOXP3+ Tregs both systemically and in the uterus",
"Direct hormone receptor signalling on Tregs → enhanced suppressive capacity",
"Indirect effects on antigen-presenting cells (APCs) → tolerogenic DC phenotype",
"P4 promotes T cell differentiation INTO Tregs",
"P4 SUPPRESSES differentiation into pro-inflammatory Th17 cells",
"Tregs release TGF-β and IL-10 → further suppress Th1 and Th17 responses",
"Tregs also interact with uNK cells to promote decidual vascular remodelling",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Paragraph(
"P4 also promotes differentiation of fetal T cells into Tregs (cord blood studies), "
"establishing immune tolerance from the fetal side too.", footnote))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 6 — Direct T cell effects
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "6. DIRECT T CELL MEMBRANE EFFECTS")
story.append(Paragraph(
"Progesterone has direct biophysical effects on T cells, independent of gene "
"transcription:", body))
for pt in [
"Alters membrane-resident POTASSIUM CHANNELS → membrane depolarisation",
"Membrane depolarisation → disrupts intracellular CALCIUM SIGNALLING cascades",
"Disrupted Ca²⁺ signalling → reduced T cell activation and cytokine gene expression",
"Net: T cells cannot mount a full effector response against fetal antigens",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Spacer(1, 4))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 7 — IDO pathway
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "7. TRYPTOPHAN / IDO PATHWAY (Supplementary Mechanism)")
story.append(Paragraph(
"Indoleamine 2,3-dioxygenase (IDO) is expressed in human uterine decidua and "
"provides an additional tolerogenic mechanism:", body))
for pt in [
"T cells REQUIRE tryptophan for activation and proliferation",
"IDO catabolises local tryptophan → creates tryptophan-depleted microenvironment",
"Tryptophan depletion → T cell starvation → cannot mount anti-fetal responses",
"In mice: IDO inhibition → loss of allogeneic (but not syngeneic) fetuses",
"IDO expression in human decidua increases with gestational age",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Paragraph(
"Note: This pathway is not directly driven by progesterone but is part of the "
"overall tolerogenic milieu that progesterone helps establish.", footnote))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 8 — Summary Flowchart (text-based)
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "8. SUMMARY FLOWCHART")
flow_data = [
["PROGESTERONE (P4) — Rising throughout pregnancy (corpus luteum → placenta)"],
["↓"],
["Direct T cell effects\n(K⁺ channels → ↓Ca²⁺ → ↓activation)\n+\nTh1 → Th2 shift\n(↑IL-4, IL-10, TGF-β; ↓IFN-γ, TNF-α)"],
["+"],
["PIBF induction (via PR on T lymphocytes)\n→ ↓CTL activity → ↓NK degranulation → ↓PG synthesis"],
["+"],
["HLA-G upregulation on trophoblasts\n→ binds inhibitory receptors on dNK cells\n→ trophoblasts EVADE immune killing"],
["+"],
["Treg expansion (CD4+CD25+FOXP3+)\n→ ↑IL-10, TGF-β → suppresses Th1 and Th17 → vascular remodelling"],
["↓"],
["RESULT: Maternal-fetal immune tolerance → Successful pregnancy"]
]
for row in flow_data:
bg = PALE if row[0] not in ["↓", "+"] else WHITE
is_arrow = row[0] in ["↓", "+"]
txt_style = S("Flow",
fontName="Helvetica-Bold" if not is_arrow else "Helvetica",
fontSize=9 if not is_arrow else 14,
textColor=DARK_GREY if not is_arrow else LIGHT_PURPLE,
alignment=TA_CENTER,
leading=13)
last = row[0] == "RESULT: Maternal-fetal immune tolerance → Successful pregnancy"
result_style = S("Result",
fontName="Helvetica-Bold", fontSize=10,
textColor=WHITE, alignment=TA_CENTER, leading=14)
t = Table([[Paragraph(row[0], result_style if last else txt_style)]],
colWidths=[17*cm])
cell_bg = TEAL if last else bg
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), cell_bg),
("TOPPADDING", (0,0), (-1,-1), 5 if not is_arrow else 0),
("BOTTOMPADDING", (0,0), (-1,-1), 5 if not is_arrow else 0),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 0.5, LIGHT_PURPLE) if not is_arrow else ("LINEBELOW",(0,0),(-1,-1),0,WHITE),
]))
story.append(t)
if not is_arrow:
story.append(Spacer(1, 2))
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 9 — Clinical Correlations
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "9. CLINICAL CORRELATIONS (High-Yield)")
two_col_table(story,
["Clinical Scenario", "Progesterone's Immune Role", "Key Molecule"],
[
["Recurrent miscarriage (RPL)", "Low PIBF / excess Th1 cytokines → fetal rejection;\nP4 supplementation restores tolerance", "PIBF, TNF-α"],
["Threatened abortion", "P4 maintains PIBF & Th2 environment;\noral/vaginal P4 reduces risk of loss", "PIBF, IL-10"],
["Preterm labour", "↓PIBF → ↑arachidonic acid → ↑prostaglandins → uterine contractions", "PIBF, PGE2"],
["Preeclampsia", "Associated with Th1 shift and dysregulated tolerance at spiral arteries", "IFN-γ, TNF-α"],
["Luteal phase defect", "Inadequate P4 → poor implantation, Treg deficiency", "Tregs, PIBF"],
["IVF / ART failure", "Insufficient P4 supplementation → inadequate tolerance induction", "All pathways"],
],
col_widths=[5*cm, 8*cm, 4*cm]
)
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 10 — Quick Recall Box
# ══════════════════════════════════════════════════════════════════════════════
section_header(story, "10. RAPID RECALL — 10 MUST-KNOW POINTS")
points = [
("1", "Fetus = semi-allograft (paternal antigens) → progesterone prevents immune rejection"),
("2", "Normal pregnancy = Th2 dominant; Th1 dominance = miscarriage / preeclampsia / preterm birth"),
("3", "PIBF (Progesterone-Induced Blocking Factor) = key indirect immune mediator of P4"),
("4", "PIBF suppresses: CTLs + NK degranulation + arachidonic acid → prostaglandins"),
("5", "uNK cells express GR (not PR); P4 acts via GR → ↓STAT4/IκB → ↓NK activation + ↓IFN-γ"),
("6", "HLA-G on trophoblasts = non-classical MHC I; binds ILT2/ILT4/KIR2DL4 → 'do not kill' signal"),
("7", "P4 expands CD4+CD25+FOXP3+ Tregs → ↑IL-10, TGF-β → tolerance"),
("8", "P4 promotes Treg differentiation + SUPPRESSES Th17 differentiation"),
("9", "Direct T cell effect: P4 alters K⁺ channels → ↓Ca²⁺ signalling → ↓T cell activation"),
("10", "IDO in decidua depletes tryptophan → T cell starvation → tolerogenic microenvironment"),
]
data = [[Paragraph(f"<b>{n}.</b>", S("Num", fontName="Helvetica-Bold", fontSize=10,
textColor=LIGHT_PURPLE, alignment=TA_CENTER)),
Paragraph(p, body)] for n, p in points]
t = Table(data, colWidths=[1*cm, 16*cm])
t.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("LINEBELOW", (0,0), (-1,-2), 0.3, colors.HexColor("#D5D8DC")),
*[("BACKGROUND", (0,i), (-1,i), PALE) for i in range(0,10,2)],
]))
story.append(t)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════════════════════════════════════
# SOURCES
# ══════════════════════════════════════════════════════════════════════════════
hr(story)
story.append(Paragraph("<b>Key Sources</b>", h3))
for src in [
"Berek & Novak's Gynecology — 'Regulation of Decidual Immune Cells', pp. 1811–1813",
"Tietz Textbook of Laboratory Medicine 7e — 'Allergy and Pregnancy'",
"Mehta P et al. (2026) Immunomodulatory Role of Natural Progesterone in Pregnancy. J Obstet Gynaecol Res. PMID: 42303279",
"Szekeres-Bartho J. Progesterone-related immune modulation of pregnancy and labor. Front Endocrinol, 2019.",
"Frontiers in Immunology (2026) — Regulatory T cells in human pregnancy. PMID: (in press)",
]:
story.append(Paragraph(f"• {src}", footnote))
story.append(Spacer(1, 6))
story.append(Paragraph(
"Generated by Orris Medical Education • July 2026 • For revision purposes only — not a substitute for clinical guidance.",
S("Disc", fontName="Helvetica-Oblique", fontSize=7, textColor=colors.grey, alignment=TA_CENTER)))
# ══════════════════════════════════════════════════════════════════════════════
# BUILD PDF
# ══════════════════════════════════════════════════════════════════════════════
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/progesterone-study-guide && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/progesterone-study-guide/Progesterone_Immunology_Study_Guide.pdf
Progesterone Immunology Study Guide
PDF Document · PDF