Give me pdf of menstrual cycle in understandable manner in detail

Reading File
Finding Sources
Searching Images

menstrual cycle phases hormones FSH LH estrogen progesterone diagram

A multi-panel pathophysiology diagram illustrating the synchronous physiological changes during a standard 28-day human menstrual cycle. The top panel graphs gonadotropin levels, showing a sharp surge in Luteinizing Hormone (LH) and a moderate rise in Follicle-Stimulating Hormone (FSH) at day 14, correlating with the follicular phase, ovulation, and luteal phase stages. The corresponding follicular development shows the maturation of a primary follicle into a Graafian follicle, ovulation, and the formation of the corpus luteum and corpus albicans. The middle panel tracks plasma sex hormone levels, highlighting the mid-cycle peak of Estradiol (E2) and the post-ovulatory rise of Progesterone (P4). The bottom panel depicts endometrial morphology, transitioning from the menstrual phase to the proliferative and secretory phases. A green-shaded layer highlights the glycocalyx development, which thickens and becomes most prominent during the secretory phase under the influence of P4, before thinning during menstruation. The diagram demonstrates the hormonal regulation of the ovary and uterine lining for medical educational purposes.

A multi-panel pathophysiology diagram illustrating the synchronous physiological changes during a standard 28-day human menstrual cycle. The top panel graphs gonadotropin levels, showing a sharp surge in Luteinizing Hormone (LH) and a moderate rise in Follicle-Stimulating Hormone (FSH) at day 14, correlating with the follicular phase, ovulation, and luteal phase stages. The corresponding follicular development shows the maturation of a primary follicle into a Graafian follicle, ovulation, and the formation of the corpus luteum and corpus albicans. The middle panel tracks plasma sex hormone levels, highlighting the mid-cycle peak of Estradiol (E2) and the post-ovulatory rise of Progesterone (P4). The bottom panel depicts endometrial morphology, transitioning from the menstrual phase to the proliferative and secretory phases. A green-shaded layer highlights the glycocalyx development, which thickens and becomes most prominent during the secretory phase under the influence of P4, before thinning during menstruation. The diagram demonstrates the hormonal regulation of the ovary and uterine lining for medical educational purposes.

A pathophysiology diagram illustrating the hypothalamic-pituitary-gonadal (HPG) axis and potential mechanisms for gynecological changes following COVID-19 vaccination or infection. The central axis shows the Hypothalamus releasing GnRH, which stimulates the Anterior Pituitary Gland to release the gonadotropins FSH and LH, acting upon the female reproductive system (uterus and ovaries). A secondary pathway details the 'Multiple COVID-19 vaccine doses stress' response, which is shown to inhibit pulsatile GnRH secretion and promote 'Cortisol upregulation.' This cortisol increase is linked to 'Vaginal microbiota dysregulation' and 'Abnormal Menstrual Bleeding.' Simultaneously, an 'Immune response' from vaccination is depicted affecting 'Ovarian hormones' (Estrogen and Progesterone), also contributing to menstrual irregularities. Finally, the diagram indicates that SARS-CoV-2 infection can lead to 'Angiotensin II dysregulation' via the ACE2 receptor on ovarian tissue, potentially resulting in 'Fertility alterations.' This medical illustration serves to visualize the complex neuroendocrine and immunological interactions impacting reproductive health in the context of viral stress and immune activation.

A pathophysiology diagram illustrating the hypothalamic-pituitary-gonadal (HPG) axis and potential mechanisms for gynecological changes following COVID-19 vaccination or infection. The central axis shows the Hypothalamus releasing GnRH, which stimulates the Anterior Pituitary Gland to release the gonadotropins FSH and LH, acting upon the female reproductive system (uterus and ovaries). A secondary pathway details the 'Multiple COVID-19 vaccine doses stress' response, which is shown to inhibit pulsatile GnRH secretion and promote 'Cortisol upregulation.' This cortisol increase is linked to 'Vaginal microbiota dysregulation' and 'Abnormal Menstrual Bleeding.' Simultaneously, an 'Immune response' from vaccination is depicted affecting 'Ovarian hormones' (Estrogen and Progesterone), also contributing to menstrual irregularities. Finally, the diagram indicates that SARS-CoV-2 infection can lead to 'Angiotensin II dysregulation' via the ACE2 receptor on ovarian tissue, potentially resulting in 'Fertility alterations.' This medical illustration serves to visualize the complex neuroendocrine and immunological interactions impacting reproductive health in the context of viral stress and immune activation.

This pathophysiology diagram illustrates the hypothalamic-pituitary-gonadal (HPG) axis and various external factors contributing to precocious or rapidly progressive puberty. The central vertical axis displays a downward cascade starting from the hypothalamus, leading to LHRH (GnRH), then the pituitary gland, which secretes LH and FSH. These hormones act on the uterus and ovaries to produce estrogen and progesterone. Surrounding this central axis are several environmental and physiological stressors linked by red arrows. Factors influencing the hypothalamus include SARS-CoV-2 binding to ACE II/NMDA receptors, catecholamines, physical activity changes, mental stress, nutrition, and microbiota alterations. Direct influences on LHRH involve corticosteroids, cortisol, and allopregnanolone. Endocrine-disrupting chemicals are shown targeting the reproductive organs. Positive symbols (+) indicate stimulatory pathways. The diagram serves as an educational tool for endocrinology and pediatrics, highlighting how modern lifestyle factors, infections, and environmental toxins can disrupt normal pubertal timing via neuroendocrine pathways.

This pathophysiology diagram illustrates the hypothalamic-pituitary-gonadal (HPG) axis and various external factors contributing to precocious or rapidly progressive puberty. The central vertical axis displays a downward cascade starting from the hypothalamus, leading to LHRH (GnRH), then the pituitary gland, which secretes LH and FSH. These hormones act on the uterus and ovaries to produce estrogen and progesterone. Surrounding this central axis are several environmental and physiological stressors linked by red arrows. Factors influencing the hypothalamus include SARS-CoV-2 binding to ACE II/NMDA receptors, catecholamines, physical activity changes, mental stress, nutrition, and microbiota alterations. Direct influences on LHRH involve corticosteroids, cortisol, and allopregnanolone. Endocrine-disrupting chemicals are shown targeting the reproductive organs. Positive symbols (+) indicate stimulatory pathways. The diagram serves as an educational tool for endocrinology and pediatrics, highlighting how modern lifestyle factors, infections, and environmental toxins can disrupt normal pubertal timing via neuroendocrine pathways.

This pathophysiology diagram illustrates hallmarks of major depressive disorder (MDD) across various stages of the female reproductive lifespan, including reproductive age, pregnancy, and peri- and postmenopause. A line graph labeled 'Physiological Hormonal Fluctuations' depicts the 28-day menstrual cycle, showing estrogen peaks prior to ovulation (Day 14) and progesterone dominance during the luteal phase. A signaling pathway shows how progesterone fluctuations lead to GABA and serotonin receptor modulation, contributing to premenstrual syndrome (PMS) and premenstrual dysphoric disorder (PMDD). In the pregnancy/postpartum pathway, reduced allopregnanolone levels and GABA alterations are linked to postpartum depression (PPD). The peri- and postmenopausal section illustrates declining estradiol (E2) and progesterone, linked to the intensification of depressive symptoms. The diagram also highlights secondary factors, including impaired estrobolome function (gut-microbiome-estrogen axis) involving bacteria like Prevotella and Ruminococcus, and an immune component characterized by attenuated microglia and inflammatory responses compared to men. This visualization integrates endocrinology, neurobiology, and immunology to explain sex-specific vulnerabilities in mood disorders.

This pathophysiology diagram illustrates hallmarks of major depressive disorder (MDD) across various stages of the female reproductive lifespan, including reproductive age, pregnancy, and peri- and postmenopause. A line graph labeled 'Physiological Hormonal Fluctuations' depicts the 28-day menstrual cycle, showing estrogen peaks prior to ovulation (Day 14) and progesterone dominance during the luteal phase. A signaling pathway shows how progesterone fluctuations lead to GABA and serotonin receptor modulation, contributing to premenstrual syndrome (PMS) and premenstrual dysphoric disorder (PMDD). In the pregnancy/postpartum pathway, reduced allopregnanolone levels and GABA alterations are linked to postpartum depression (PPD). The peri- and postmenopausal section illustrates declining estradiol (E2) and progesterone, linked to the intensification of depressive symptoms. The diagram also highlights secondary factors, including impaired estrobolome function (gut-microbiome-estrogen axis) involving bacteria like Prevotella and Ruminococcus, and an immune component characterized by attenuated microglia and inflammatory responses compared to men. This visualization integrates endocrinology, neurobiology, and immunology to explain sex-specific vulnerabilities in mood disorders.

This pathophysiology diagram illustrates the neurobiological mechanisms by which female sex hormones, estradiol and progesterone, regulate the sleep-wake cycle. The diagram depicts hormonal signaling pathways originating from the ovaries and targeting specific neural regions. In the Ventrolateral Preoptic Nucleus (VLPO), the hormones suppress L-PGDS and PGD2, which along with decreased adenosine and A2A receptor activity, reduces sleep drive. Conversely, the hormones strengthen the arousal drive by stimulating three key regions: the Lateral Hypothalamus (LH), increasing HcrtR1 activity and hypocretin production; the Tuberomammillary Nucleus (TMN), enhancing histamine receptor binding and transmission; and the Locus Coeruleus (LC), where upregulation of enzymes DBH and TH increases norepinephrine synthesis. The visual summary indicates that these combined hormonal actions lead to a reduction in REM and NREM sleep while promoting wakefulness. The illustration uses color-coded boxes for sleep-promoting (blue) and wake-promoting (red) pathways, supported by rodent model representations for clinical research context.

This pathophysiology diagram illustrates the neurobiological mechanisms by which female sex hormones, estradiol and progesterone, regulate the sleep-wake cycle. The diagram depicts hormonal signaling pathways originating from the ovaries and targeting specific neural regions. In the Ventrolateral Preoptic Nucleus (VLPO), the hormones suppress L-PGDS and PGD2, which along with decreased adenosine and A2A receptor activity, reduces sleep drive. Conversely, the hormones strengthen the arousal drive by stimulating three key regions: the Lateral Hypothalamus (LH), increasing HcrtR1 activity and hypocretin production; the Tuberomammillary Nucleus (TMN), enhancing histamine receptor binding and transmission; and the Locus Coeruleus (LC), where upregulation of enzymes DBH and TH increases norepinephrine synthesis. The visual summary indicates that these combined hormonal actions lead to a reduction in REM and NREM sleep while promoting wakefulness. The illustration uses color-coded boxes for sleep-promoting (blue) and wake-promoting (red) pathways, supported by rodent model representations for clinical research context.

This pathophysiology diagram illustrates the sequential stages of ovarian follicular development and the regulatory factors influencing the ovulation rate, using a murine model for context. The process initiates with primordial follicles, which undergo 'Activation' to become preantral follicles. These then mature into antral follicles, eventually culminating in ovulation. The Hypothalamic-Pituitary-Gonadal (HPG) axis is shown influencing the cycle through GnRH, which regulates LH and FSH, along with Progesterone (P4) involvement. Key regulatory pathways highlighted include 'Follicular survival,' which leads toward ovulation, and an opposing pathway for 'Follicular atresia.' The diagram maps specific molecular markers to the Diestrus and Estrus stages of the cycle. During Diestrus, follicular activation and survival are associated with Foxl2, Kit, Smad1, Lhcgr, Cxcr4, and Nos2. During Estrus, these processes involve Esr1, Fgf2, and Igfbp2. The educational focus is on the complex interplay between endocrine signaling and local gene expression that determines follicular fate and overall ovulation rate.

This pathophysiology diagram illustrates the sequential stages of ovarian follicular development and the regulatory factors influencing the ovulation rate, using a murine model for context. The process initiates with primordial follicles, which undergo 'Activation' to become preantral follicles. These then mature into antral follicles, eventually culminating in ovulation. The Hypothalamic-Pituitary-Gonadal (HPG) axis is shown influencing the cycle through GnRH, which regulates LH and FSH, along with Progesterone (P4) involvement. Key regulatory pathways highlighted include 'Follicular survival,' which leads toward ovulation, and an opposing pathway for 'Follicular atresia.' The diagram maps specific molecular markers to the Diestrus and Estrus stages of the cycle. During Diestrus, follicular activation and survival are associated with Foxl2, Kit, Smad1, Lhcgr, Cxcr4, and Nos2. During Estrus, these processes involve Esr1, Fgf2, and Igfbp2. The educational focus is on the complex interplay between endocrine signaling and local gene expression that determines follicular fate and overall ovulation rate.

Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/menstrual-cycle-pdf && ls /tmp/workspace/

Writing File

~/menstrual-cycle-pdf/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib.colors import (
    HexColor, white, black, Color
)
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
from reportlab.lib import colors
import urllib.request
import os

# ── Color Palette ──────────────────────────────────────────────────────────────
DEEP_PURPLE   = HexColor("#5C2D91")
MEDIUM_PURPLE = HexColor("#7B4DB3")
LIGHT_PURPLE  = HexColor("#E8D5F5")
PINK          = HexColor("#D63384")
LIGHT_PINK    = HexColor("#FCE4EC")
TEAL          = HexColor("#00897B")
LIGHT_TEAL    = HexColor("#E0F2F1")
ORANGE        = HexColor("#E65100")
LIGHT_ORANGE  = HexColor("#FFF3E0")
BLUE          = HexColor("#1565C0")
LIGHT_BLUE    = HexColor("#E3F2FD")
GREY_BG       = HexColor("#F5F5F5")
DARK_GREY     = HexColor("#37474F")
MID_GREY      = HexColor("#607D8B")
LIGHT_GREY    = HexColor("#ECEFF1")
DARK_TEXT     = HexColor("#1A1A2E")

OUTPUT_PATH = "/tmp/workspace/menstrual-cycle-pdf/Menstrual_Cycle_Guide.pdf"

# ── Styles ─────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def make_style(name, parent="Normal", **kwargs):
    return ParagraphStyle(name, parent=styles[parent], **kwargs)

cover_title = make_style("CoverTitle", fontSize=34, textColor=white,
    leading=42, alignment=TA_CENTER, fontName="Helvetica-Bold")

cover_subtitle = make_style("CoverSub", fontSize=16, textColor=HexColor("#E8D5F5"),
    leading=22, alignment=TA_CENTER, fontName="Helvetica")

chapter_title = make_style("ChapterTitle", fontSize=22, textColor=white,
    leading=28, alignment=TA_LEFT, fontName="Helvetica-Bold", spaceBefore=4)

section_heading = make_style("SectionH", fontSize=14, textColor=DEEP_PURPLE,
    leading=18, fontName="Helvetica-Bold", spaceBefore=14, spaceAfter=5)

sub_heading = make_style("SubH", fontSize=12, textColor=MEDIUM_PURPLE,
    leading=16, fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=4)

body = make_style("Body", fontSize=10.5, textColor=DARK_TEXT,
    leading=16, fontName="Helvetica", spaceAfter=5, alignment=TA_JUSTIFY)

bullet_style = make_style("Bullet", fontSize=10.5, textColor=DARK_TEXT,
    leading=15, fontName="Helvetica", leftIndent=18, spaceAfter=3,
    bulletIndent=6)

highlight_box = make_style("HighBox", fontSize=10.5, textColor=DARK_TEXT,
    leading=16, fontName="Helvetica", leftIndent=10, rightIndent=10,
    spaceBefore=5, spaceAfter=5)

caption_style = make_style("Caption", fontSize=9, textColor=MID_GREY,
    leading=13, fontName="Helvetica-Oblique", alignment=TA_CENTER,
    spaceBefore=2, spaceAfter=8)

key_point_style = make_style("KP", fontSize=10.5, textColor=DARK_TEXT,
    leading=15, fontName="Helvetica", leftIndent=22, spaceAfter=4)

phase_label = make_style("PhaseLabel", fontSize=11, textColor=white,
    leading=15, fontName="Helvetica-Bold", alignment=TA_CENTER)

toc_style = make_style("TOC", fontSize=11, textColor=DARK_TEXT,
    leading=18, fontName="Helvetica")

toc_title_style = make_style("TOCTitle", fontSize=20, textColor=DEEP_PURPLE,
    leading=26, fontName="Helvetica-Bold", alignment=TA_CENTER,
    spaceBefore=0, spaceAfter=18)


# ── Custom Flowables ───────────────────────────────────────────────────────────

class ColorRect(Flowable):
    """A filled rectangle used as a section-header banner."""
    def __init__(self, width, height, color, radius=6):
        Flowable.__init__(self)
        self.width  = width
        self.height = height
        self.color  = color
        self.radius = radius
    def draw(self):
        self.canv.setFillColor(self.color)
        self.canv.roundRect(0, 0, self.width, self.height,
                            self.radius, fill=1, stroke=0)


class ChapterBanner(Flowable):
    """Full-width gradient-style banner for chapter headings."""
    def __init__(self, title, subtitle, width, color1, color2, icon=""):
        Flowable.__init__(self)
        self.title    = title
        self.subtitle = subtitle
        self.width    = width
        self.height   = 58
        self.color1   = color1
        self.color2   = color2
        self.icon     = icon

    def draw(self):
        c = self.canv
        c.setFillColor(self.color1)
        c.roundRect(0, 0, self.width, self.height, 8, fill=1, stroke=0)
        # accent stripe
        c.setFillColor(self.color2)
        c.roundRect(0, 0, 8, self.height, 0, fill=1, stroke=0)
        # title
        c.setFillColor(white)
        c.setFont("Helvetica-Bold", 17)
        c.drawString(20, self.height - 26, self.title)
        # subtitle
        c.setFillColor(HexColor("#E0D0F0"))
        c.setFont("Helvetica", 10)
        c.drawString(20, self.height - 43, self.subtitle)


class InfoBox(Flowable):
    """Coloured info box with left accent bar."""
    def __init__(self, text, width, bg_color, bar_color, text_color=None):
        Flowable.__init__(self)
        from reportlab.lib.utils import simpleSplit
        self.lines = simpleSplit(text, "Helvetica", 10.5, width - 28)
        self.width = width
        self.bg    = bg_color
        self.bar   = bar_color
        self.tc    = text_color or DARK_TEXT
        self.height = len(self.lines) * 15 + 14

    def draw(self):
        c = self.canv
        c.setFillColor(self.bg)
        c.roundRect(0, 0, self.width, self.height, 6, fill=1, stroke=0)
        c.setFillColor(self.bar)
        c.rect(0, 0, 5, self.height, fill=1, stroke=0)
        c.setFillColor(self.tc)
        c.setFont("Helvetica", 10.5)
        y = self.height - 19
        for line in self.lines:
            c.drawString(14, y, line)
            y -= 15


# ── Document Setup ─────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT_PATH,
    pagesize=A4,
    leftMargin=2*cm, rightMargin=2*cm,
    topMargin=2.2*cm, bottomMargin=2.2*cm,
    title="The Menstrual Cycle – A Complete Guide",
    author="Orris Medical Education",
    subject="Reproductive Physiology"
)

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

# ═══════════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ═══════════════════════════════════════════════════════════════════════════════

def cover_page(canvas, doc):
    canvas.saveState()
    w, h = A4
    # Deep purple background
    canvas.setFillColor(DEEP_PURPLE)
    canvas.rect(0, 0, w, h, fill=1, stroke=0)
    # Pink wave accent at bottom
    canvas.setFillColor(PINK)
    canvas.rect(0, 0, w, 28, fill=1, stroke=0)
    canvas.setFillColor(MEDIUM_PURPLE)
    canvas.rect(0, 28, w, 18, fill=1, stroke=0)
    # Top accent
    canvas.setFillColor(PINK)
    canvas.rect(0, h - 14, w, 14, fill=1, stroke=0)
    # Title block
    canvas.setFillColor(white)
    canvas.setFont("Helvetica-Bold", 40)
    canvas.drawCentredString(w/2, h/2 + 60, "The Menstrual Cycle")
    canvas.setFont("Helvetica", 18)
    canvas.setFillColor(HexColor("#E8D5F5"))
    canvas.drawCentredString(w/2, h/2 + 20, "A Complete Educational Guide")
    canvas.setFont("Helvetica", 12)
    canvas.setFillColor(HexColor("#C0A0E0"))
    canvas.drawCentredString(w/2, h/2 - 14,
        "Physiology · Hormones · Phases · Clinical Significance")
    # Decorative circle
    canvas.setFillColor(HexColor("#7B4DB3"))
    canvas.circle(w/2, h/2 + 40, 130, fill=0, stroke=1)
    canvas.setStrokeColor(HexColor("#7B4DB3"))
    canvas.setLineWidth(1.5)
    canvas.circle(w/2, h/2 + 40, 145, fill=0, stroke=1)
    # Footer
    canvas.setFillColor(HexColor("#E8D5F5"))
    canvas.setFont("Helvetica", 10)
    canvas.drawCentredString(w/2, 58,
        "Based on Berek & Novak's Gynecology | Ganong's Physiology | Costanzo Physiology")
    canvas.drawCentredString(w/2, 44, "Orris Medical Education  •  2026")
    canvas.restoreState()

story.append(Spacer(1, 18*cm))   # push to cover; actual cover drawn by onFirstPage
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# TABLE OF CONTENTS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(Paragraph("Table of Contents", toc_title_style))
story.append(HRFlowable(width=W, thickness=2, color=MEDIUM_PURPLE, spaceAfter=10))

toc_entries = [
    ("1", "Introduction & Overview", "3"),
    ("2", "The Hypothalamic-Pituitary-Ovarian Axis", "4"),
    ("3", "The Ovarian Cycle", "5"),
    ("  3.1", "Follicular Phase (Days 1-14)", "5"),
    ("  3.2", "Ovulation (Day 14)", "6"),
    ("  3.3", "Luteal Phase (Days 14-28)", "7"),
    ("4", "The Uterine (Endometrial) Cycle", "8"),
    ("  4.1", "Menstrual Phase (Days 1-5)", "8"),
    ("  4.2", "Proliferative Phase (Days 5-14)", "8"),
    ("  4.3", "Secretory Phase (Days 14-28)", "9"),
    ("5", "Hormonal Changes Throughout the Cycle", "10"),
    ("6", "Cervical Mucus & Other Signs", "11"),
    ("7", "What Happens if Pregnancy Occurs?", "12"),
    ("8", "Normal Cycle Parameters", "13"),
    ("9", "Key Points Summary", "14"),
]

toc_data = []
for num, title, page in toc_entries:
    toc_data.append([
        Paragraph(f"<font color='#5C2D91'>{num}</font>", toc_style),
        Paragraph(title, toc_style),
        Paragraph(f"<font color='#5C2D91'>{page}</font>", toc_style),
    ])

toc_table = Table(toc_data, colWidths=[1.2*cm, W - 2.5*cm, 1.3*cm])
toc_table.setStyle(TableStyle([
    ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
    ("ROWBACKGROUNDS", (0, 0), (-1, -1), [white, GREY_BG]),
    ("LEFTPADDING",  (0, 0), (-1, -1), 6),
    ("RIGHTPADDING", (0, 0), (-1, -1), 6),
    ("TOPPADDING",   (0, 0), (-1, -1), 5),
    ("BOTTOMPADDING",(0, 0), (-1, -1), 5),
    ("LINEBELOW", (0, -1), (-1, -1), 1, MEDIUM_PURPLE),
]))
story.append(toc_table)
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# HELPER
# ═══════════════════════════════════════════════════════════════════════════════

def chapter(title, subtitle):
    story.append(ChapterBanner(title, subtitle, W, DEEP_PURPLE, PINK))
    story.append(Spacer(1, 8))

def sec(title):
    story.append(Paragraph(title, section_heading))

def sub(title):
    story.append(Paragraph(title, sub_heading))

def para(text):
    story.append(Paragraph(text, body))

def bullet(text, icon="•"):
    story.append(Paragraph(f"{icon}  {text}", bullet_style))

def space(n=8):
    story.append(Spacer(1, n))

def key_box(text, bg=LIGHT_PURPLE, bar=MEDIUM_PURPLE):
    story.append(InfoBox(text, W, bg, bar))
    story.append(Spacer(1, 4))

def tip_box(text, bg=LIGHT_TEAL, bar=TEAL):
    story.append(InfoBox(text, W, bg, bar, DARK_GREY))
    story.append(Spacer(1, 4))

def warning_box(text, bg=LIGHT_ORANGE, bar=ORANGE):
    story.append(InfoBox(text, W, bg, bar, DARK_GREY))
    story.append(Spacer(1, 4))

def phase_table(phases):
    """phases: list of (name, color, description)"""
    rows = []
    for name, col, desc in phases:
        rows.append([
            Paragraph(f"<font color='white'><b>{name}</b></font>", phase_label),
            Paragraph(desc, body)
        ])
    t = Table(rows, colWidths=[3.2*cm, W - 3.2*cm])
    style_cmds = [
        ("VALIGN",       (0, 0), (-1, -1), "TOP"),
        ("LEFTPADDING",  (0, 0), (-1, -1), 8),
        ("RIGHTPADDING", (0, 0), (-1, -1), 8),
        ("TOPPADDING",   (0, 0), (-1, -1), 6),
        ("BOTTOMPADDING",(0, 0), (-1, -1), 6),
        ("ROWSEP", (0, 0), (-1, -1), 1, LIGHT_GREY),
    ]
    for i, (_, col, _) in enumerate(phases):
        style_cmds.append(("BACKGROUND", (0, i), (0, i), col))
    t.setStyle(TableStyle(style_cmds))
    story.append(t)
    space()


# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 1 – INTRODUCTION
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 1", "Introduction & Overview")

sec("What is the Menstrual Cycle?")
para(
    "The menstrual cycle is the monthly series of changes a woman's body goes through "
    "in preparation for the possibility of pregnancy. Each month, one of the ovaries "
    "releases an egg - a process called ovulation. At the same time, hormonal changes "
    "prepare the uterus for pregnancy. If ovulation takes place and the egg is not "
    "fertilised, the lining of the uterus sheds through the vagina. This is a menstrual period."
)
para(
    "In women and other primates, the reproductive cycle is a <b>menstrual cycle</b>, "
    "and its most conspicuous feature is the periodic vaginal bleeding that occurs with "
    "the shedding of the uterine mucosa. The length of the cycle is variable, but the "
    "average is <b>28 days</b> from the start of one menstrual period to the start of the next. "
    "By common usage, the days of the cycle are identified by number, starting with "
    "the <b>first day of menstruation</b>."
)

sec("The Four Organs Involved")
para(
    "The female reproductive process involves a tightly coordinated interaction between "
    "four organs. All must function appropriately for normal reproduction to occur:"
)

organs_data = [
    ["Organ", "Role in the Cycle"],
    ["Hypothalamus (Brain)", "Releases GnRH in pulses to control the entire axis"],
    ["Anterior Pituitary", "Releases FSH and LH in response to GnRH signals"],
    ["Ovary", "Responds to FSH/LH to produce follicles, ovulation, and corpus luteum"],
    ["Uterus (Endometrium)", "Responds to ovarian hormones; prepares for implantation"],
]
org_table = Table(organs_data, colWidths=[4.5*cm, W - 4.5*cm])
org_table.setStyle(TableStyle([
    ("BACKGROUND",   (0, 0), (-1, 0), DEEP_PURPLE),
    ("TEXTCOLOR",    (0, 0), (-1, 0), white),
    ("FONTNAME",     (0, 0), (-1, 0), "Helvetica-Bold"),
    ("FONTSIZE",     (0, 0), (-1, 0), 11),
    ("ROWBACKGROUNDS",(0, 1), (-1, -1), [white, LIGHT_PURPLE]),
    ("FONTSIZE",     (0, 1), (-1, -1), 10.5),
    ("GRID",         (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",       (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",  (0, 0), (-1, -1), 10),
    ("TOPPADDING",   (0, 0), (-1, -1), 7),
    ("BOTTOMPADDING",(0, 0), (-1, -1), 7),
]))
story.append(org_table)
space()

sec("Two Parallel Cycles")
para(
    "The menstrual cycle has two distinct but simultaneous cycles running in parallel:"
)
bullet("<b>Ovarian Cycle</b> - what happens inside the ovary (follicular growth, ovulation, corpus luteum)")
bullet("<b>Uterine Cycle</b> - what happens to the uterine lining (menstruation, proliferation, secretion)")
para(
    "These two cycles are synchronized by hormones, so changes in the ovary directly "
    "drive changes in the uterus."
)

key_box(
    "REMEMBER: The first day of bleeding = Day 1 of the cycle. Ovulation occurs around "
    "Day 14 in a 28-day cycle. The secretory (luteal) phase is almost always exactly 14 days long. "
    "Variation in cycle length comes from the follicular phase, not the luteal phase."
)

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 2 – HPO AXIS
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 2", "The Hypothalamic-Pituitary-Ovarian (HPO) Axis")

sec("The Master Control System")
para(
    "The menstrual cycle is regulated by a sophisticated hormonal feedback system "
    "called the <b>Hypothalamic-Pituitary-Ovarian (HPO) Axis</b>. Think of it as a "
    "three-level command chain:"
)

hpo_data = [
    ["Level", "Structure", "Hormone Released", "Target"],
    ["1st (Highest)", "Hypothalamus", "GnRH (pulsatile)", "Anterior Pituitary"],
    ["2nd", "Anterior Pituitary", "FSH & LH", "Ovary"],
    ["3rd", "Ovary", "Estrogen, Progesterone, Inhibin", "Pituitary & Hypothalamus"],
]
hpo_table = Table(hpo_data, colWidths=[2.8*cm, 3.5*cm, 4.2*cm, W - 10.5*cm])
hpo_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, 0), 10),
    ("ROWBACKGROUNDS",(0, 1), (-1, -1), [white, LIGHT_TEAL]),
    ("FONTSIZE",      (0, 1), (-1, -1), 10),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 8),
    ("TOPPADDING",    (0, 0), (-1, -1), 6),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
]))
story.append(hpo_table)
space()

sub("GnRH - The Pulse Generator")
para(
    "Gonadotropin-Releasing Hormone (GnRH) is released in <b>pulses</b> from the "
    "hypothalamus - not continuously. This pulsatile secretion is critical:"
)
bullet("Slow pulses (every 90-120 min) favour FSH secretion")
bullet("Fast pulses (every 60 min) favour LH secretion")
bullet("Continuous GnRH actually <i>suppresses</i> gonadotropins (used clinically with GnRH agonists)")
para(
    "GnRH travels through a special portal blood system directly to the pituitary, "
    "which then releases FSH and LH into the general circulation."
)

sub("FSH & LH - The Ovarian Drivers")
para("<b>FSH (Follicle-Stimulating Hormone)</b> - stimulates:")
bullet("Growth and development of ovarian follicles")
bullet("Estrogen production by granulosa cells")
bullet("Expression of LH receptors on granulosa cells late in follicular phase")
space(4)
para("<b>LH (Luteinizing Hormone)</b> - stimulates:")
bullet("Final maturation of the dominant follicle")
bullet("Ovulation when it surges (LH surge)")
bullet("Formation and maintenance of the corpus luteum")
bullet("Androgen production by theca cells (which granulosa cells convert to estrogen)")

tip_box(
    "TWO-CELL THEORY: Theca cells produce androgens (androstenedione) under LH stimulation. "
    "These androgens diffuse into adjacent granulosa cells and are converted (aromatised) "
    "to estrogen (estradiol) under FSH stimulation. Both cell types work together."
)

sub("Feedback Mechanisms")
para("Ovarian hormones feed back to the hypothalamus and pituitary to control the cycle:")
bullet("<b>Negative feedback</b> - Rising estrogen reduces FSH (prevents multiple eggs)")
bullet("<b>Positive feedback</b> - Very high estrogen (late follicular phase) triggers the LH surge")
bullet("<b>Inhibin B</b> - secreted by granulosa cells; specifically suppresses FSH")
bullet("<b>Inhibin A</b> - secreted by corpus luteum; suppresses FSH in luteal phase")

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 3 – OVARIAN CYCLE
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 3", "The Ovarian Cycle")

para(
    "The ovarian cycle describes the sequence of changes in the ovary during each "
    "menstrual cycle. It has three distinct phases: <b>Follicular Phase</b>, "
    "<b>Ovulation</b>, and <b>Luteal Phase</b>."
)

sec("3.1  Follicular Phase (Days 1-14)")
para(
    "At birth, a female already has all the eggs she will ever have - about "
    "<b>1 to 2 million primordial follicles</b>. By puberty this drops to ~400,000. "
    "Each month, a cohort of these dormant follicles is recruited into the growing pool."
)

sub("Early Follicular Phase (Days 1-5)")
para(
    "With the demise of the previous cycle's corpus luteum, FSH levels begin to rise. "
    "This rise recruits a cohort of antral follicles. Each recruited follicle:"
)
bullet("Enlarges and develops a fluid-filled cavity (antrum)")
bullet("Has an egg (oocyte) surrounded by granulosa cells")
bullet("Is encased in theca cells on the outside")
bullet("Begins producing estradiol")

sub("Dominant Follicle Selection (Days 5-7)")
para(
    "Usually one follicle in one ovary starts to grow rapidly around day 6 and "
    "becomes the <b>dominant follicle</b>. The others regress (atresia). How one "
    "follicle is selected is not fully understood, but it appears related to its "
    "ability to produce estrogen internally and its greater sensitivity to FSH."
)
key_box(
    "The dominant follicle is also called the Graafian follicle. It can grow up to "
    "20-25 mm before ovulation. It produces 90% of the estradiol in the follicular phase."
)

sub("Late Follicular Phase (Days 8-14)")
para(
    "The dominant follicle grows rapidly, producing escalating amounts of estradiol. "
    "Key events:"
)
bullet("Estradiol reaches a peak (~200-400 pg/mL) about 24-36 hours before ovulation")
bullet("FSH induces LH receptors on granulosa cells, sensitising them to LH")
bullet("Progesterone begins to rise slightly - this triggers the FSH midcycle surge")
bullet("Rising estradiol switches from negative to POSITIVE feedback on LH secretion")

sec("3.2  Ovulation (Day 14)")
para(
    "After sufficient estrogen stimulation, the pituitary releases a <b>massive surge of LH</b> "
    "(the LH surge). This is the trigger for ovulation."
)

ovulation_data = [
    ["Event", "Timing", "Details"],
    ["LH Surge begins", "~36 hrs before ovulation", "Triggered by peak estradiol (positive feedback)"],
    ["FSH mini-surge", "~36 hrs before ovulation", "Helps follicle maturation and oocyte release"],
    ["Oocyte maturation", "~24-36 hrs before", "Meiosis I completes, oocyte becomes secondary oocyte"],
    ["Follicle rupture", "Day 14 (approx.)", "Follicle wall dissolves; egg released into fallopian tube"],
    ["Egg pickup", "Minutes after rupture", "Fimbriae of fallopian tube sweep up the egg"],
]
ovul_table = Table(ovulation_data, colWidths=[3.5*cm, 3.5*cm, W - 7*cm])
ovul_table.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, 0), PINK),
    ("TEXTCOLOR",     (0, 0), (-1, 0), white),
    ("FONTNAME",      (0, 0), (-1, 0), "Helvetica-Bold"),
    ("ROWBACKGROUNDS",(0, 1), (-1, -1), [white, LIGHT_PINK]),
    ("FONTSIZE",      (0, 0), (-1, -1), 10),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 8),
    ("TOPPADDING",    (0, 0), (-1, -1), 6),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
]))
story.append(ovul_table)
space()

tip_box(
    "MITTELSCHMERZ: Some women feel mild one-sided pelvic pain at ovulation. This is caused by "
    "minor bleeding from the ruptured follicle irritating the peritoneum. It typically lasts "
    "a few hours to 1-2 days and is completely normal."
)

sec("3.3  Luteal Phase (Days 14-28)")
para(
    "After the egg is released, the ruptured follicle undergoes a remarkable transformation:"
)
bullet("The follicle fills with blood (corpus hemorrhagicum) briefly")
bullet("Granulosa and theca cells rapidly proliferate")
bullet("These cells become <b>luteal cells</b> (yellow, lipid-rich cells) forming the <b>corpus luteum</b>")
bullet("The corpus luteum secretes large amounts of <b>progesterone</b> and some estradiol")
bullet("Vascular Endothelial Growth Factor (VEGF) drives blood vessel growth into the corpus luteum")

space(4)
para(
    "The corpus luteum is the ovary's temporary endocrine gland. It is essential for "
    "maintaining the uterine lining in early pregnancy."
)

sub("Corpus Luteum Lifespan")
para("If pregnancy does NOT occur:")
bullet("The corpus luteum involutes (breaks down) after ~14 days")
bullet("Progesterone and estrogen levels fall sharply")
bullet("The endometrium can no longer be maintained and sheds (menstruation)")
bullet("FSH rises again, beginning a new cycle")
space(4)
para("If pregnancy DOES occur:")
bullet("The embryo produces hCG (human Chorionic Gonadotropin)")
bullet("hCG has an LH-like action and 'rescues' the corpus luteum")
bullet("The corpus luteum persists for the first 10-12 weeks of pregnancy")
bullet("After ~12 weeks, the placenta takes over progesterone production")

key_box(
    "The luteal phase is ALWAYS ~14 days long, regardless of total cycle length. "
    "A woman with a 35-day cycle has a 21-day follicular phase + 14-day luteal phase. "
    "This is why ovulation day varies but menstruation is predictable from ovulation."
)

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 4 – UTERINE CYCLE
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 4", "The Uterine (Endometrial) Cycle")

para(
    "While the ovary undergoes its cycle of follicular development and corpus luteum "
    "formation, the <b>uterine lining (endometrium)</b> undergoes its own parallel cycle "
    "of regeneration, growth, and shedding - all driven by ovarian hormones."
)

sec("Anatomy of the Endometrium")
para(
    "The endometrium has two layers with different behaviors:"
)
endo_data = [
    ["Layer", "Also Called", "Blood Supply", "Fate During Menstruation"],
    ["Superficial 2/3", "Stratum Functionale", "Spiral arteries (long, coiled)", "SHED during menstruation"],
    ["Deep 1/3", "Stratum Basale", "Basilar arteries (short, straight)", "RETAINED; source of regeneration"],
]
endo_table = Table(endo_data, colWidths=[2.8*cm, 3.2*cm, 4*cm, W - 10*cm])
endo_table.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, 0), DARK_GREY),
    ("TEXTCOLOR",     (0, 0), (-1, 0), white),
    ("FONTNAME",      (0, 0), (-1, 0), "Helvetica-Bold"),
    ("ROWBACKGROUNDS",(0, 1), (-1, -1), [white, LIGHT_GREY]),
    ("FONTSIZE",      (0, 0), (-1, -1), 10),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 8),
    ("TOPPADDING",    (0, 0), (-1, -1), 6),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
]))
story.append(endo_table)
space()

sec("4.1  Menstrual Phase (Days 1-5)")
para(
    "This is the most visible phase - the <b>'period'</b>. It marks Day 1 of a new cycle."
)

sub("What causes menstruation?")
para(
    "When the corpus luteum regresses at the end of the previous cycle, progesterone "
    "and estrogen levels fall sharply. Without hormonal support:"
)
bullet("The endometrium becomes thinner, adding to the coiling of spiral arteries")
bullet("Spiral arteries go into spasm (vasospasm) - cutting off blood supply")
bullet("<b>Prostaglandins</b> (especially PGF2α) are released, causing intense vasospasm and uterine contractions")
bullet("Foci of necrosis (tissue death) appear and coalesce")
bullet("The stratum functionale sheds as menstrual flow")
space(4)
para("Menstrual blood characteristics:")
bullet("Approximately <b>20-60 mL</b> total blood loss (normal)")
bullet("Predominantly <b>arterial</b> blood (~75% arterial, ~25% venous)")
bullet("Contains tissue debris, prostaglandins, and <b>fibrinolysin</b>")
bullet("Fibrinolysin prevents clotting - so normal menstrual blood does <b>NOT</b> contain clots")
bullet("Clots in menstrual blood suggest excessive flow")

warning_box(
    "DYSMENORRHOEA (painful periods): Prostaglandins cause uterine contractions and ischaemia. "
    "NSAIDs (like ibuprofen) work by blocking prostaglandin synthesis, reducing cramping. "
    "Excessive pain may indicate conditions like endometriosis."
)

sec("4.2  Proliferative Phase (Days 5-14)")
para(
    "After menstruation, the endometrium regenerates under the influence of "
    "<b>estradiol</b> from the growing dominant follicle. This phase is also called "
    "the <b>follicular phase</b> of the uterine cycle."
)

sub("What estrogen does to the endometrium:")
bullet("Rapid increase in endometrial thickness (from 1-2 mm to 8-10 mm)")
bullet("Uterine glands grow and elongate (but do not yet secrete)")
bullet("Growth of glandular epithelium and stroma")
bullet("Elongation of spiral arteries that supply the endometrium")
bullet("Cell proliferation - restoring the stratum functionale lost during menstruation")
space(4)
para(
    "This phase is sometimes called the 'proliferative' phase because the main "
    "feature is rapid cellular proliferation driven by estrogen. The endometrium "
    "looks straight and regular on imaging."
)

sec("4.3  Secretory Phase (Days 14-28)")
para(
    "After ovulation, the corpus luteum produces progesterone (+ some estrogen), "
    "which transforms the endometrium from a growing state to a <b>secretory state</b> "
    "ready to receive a fertilised egg. This is also called the <b>luteal phase</b>."
)

sub("What progesterone does to the endometrium:")
bullet("Proliferation SLOWS (anti-proliferative effect)")
bullet("Uterine glands become <b>tortuous (coiled) and secrete</b> a clear, glycogen-rich fluid")
bullet("Glycogen accumulates in vacuoles within gland cells")
bullet("Stroma becomes <b>oedematous</b> (swollen with fluid)")
bullet("Spiral arteries <b>elongate further and become very coiled</b>")
bullet("Endometrium reaches maximum thickness (~12-14 mm)")
space(4)
para(
    "If fertilisation occurs, the blastocyst implants into this secretory endometrium "
    "around Days 20-23 (the 'implantation window'). The progesterone-primed endometrium "
    "provides the ideal environment for implantation and early embryo nutrition."
)

key_box(
    "CLINICAL NOTE: The secretory phase is remarkably constant at ~14 days. "
    "If a woman has a 35-day cycle, the extra length is in the proliferative phase (21 days), "
    "not the secretory phase. Endometrial biopsy in the secretory phase shows gland "
    "tortuosity and vacuoles - used clinically to date the endometrium."
)

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 5 – HORMONAL CHANGES
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 5", "Hormonal Changes Throughout the Cycle")

para(
    "Understanding the hormonal profile across the 28-day cycle is essential. "
    "Here is a day-by-day summary of each key hormone:"
)

sec("FSH (Follicle-Stimulating Hormone)")
para("Produced by: Anterior pituitary   |   Unit: IU/L")
bullet("<b>Days 1-5:</b> Rises as corpus luteum regresses - recruits follicles")
bullet("<b>Days 5-13:</b> Gradually falls as estrogen rises (negative feedback) and inhibin B rises")
bullet("<b>Day 13-14:</b> Brief midcycle surge (triggered by progesterone from pre-ovulatory follicle)")
bullet("<b>Days 14-28:</b> Falls during luteal phase (suppressed by inhibin A + progesterone)")

sec("LH (Luteinizing Hormone)")
para("Produced by: Anterior pituitary   |   Unit: IU/L")
bullet("<b>Days 1-12:</b> Low, gradually falls with rising estrogen (negative feedback)")
bullet("<b>Day 12-13:</b> Estrogen crosses a threshold → switches to POSITIVE feedback")
bullet("<b>Day 13-14:</b> Massive LH SURGE (10-fold increase) - triggers ovulation 24-36 hrs later")
bullet("<b>Days 14-28:</b> Falls and remains low during luteal phase")

key_box(
    "The LH Surge is the most important hormone event in the cycle. Home ovulation predictor "
    "kits (OPKs) detect the LH surge in urine. A positive OPK means ovulation will occur "
    "within 12-36 hours."
)

sec("Estradiol (E2)")
para("Produced by: Granulosa cells of dominant follicle (follicular), corpus luteum (luteal)")
bullet("<b>Days 1-5:</b> Low (corpus luteum has regressed)")
bullet("<b>Days 5-13:</b> Steadily and markedly rises as follicle grows")
bullet("<b>Day 12-13:</b> Reaches PEAK (~200-400 pg/mL) - this triggers the LH surge")
bullet("<b>Day 14:</b> Drops slightly at ovulation")
bullet("<b>Days 14-21:</b> Rises again as corpus luteum forms (second smaller peak)")
bullet("<b>Days 21-28:</b> Falls as corpus luteum regresses")

sec("Progesterone")
para("Produced by: Corpus luteum (primarily), adrenal glands (minor)")
bullet("<b>Days 1-13:</b> Very low (< 1 ng/mL)")
bullet("<b>Day 13-14:</b> Small rise from pre-ovulatory follicle (triggers FSH surge)")
bullet("<b>Days 14-21:</b> Rises sharply as corpus luteum forms - PEAK at Day 21 (~10-20 ng/mL)")
bullet("<b>Days 21-28:</b> Falls as corpus luteum regresses → triggers menstruation")
bullet("<b>Important effect:</b> Raises basal body temperature (BBT) by 0.2-0.5°C - basis of fertility charting")

warning_box(
    "PROGESTERONE AND BBT: Progesterone's thermogenic effect causes basal body temperature "
    "to rise 0.2-0.5°C AFTER ovulation. This rise is retrospective evidence of ovulation "
    "having occurred. It forms the basis of the 'BBT method' of natural family planning."
)

sec("Summary Hormone Table")
space(4)

hormone_table_data = [
    ["Phase", "FSH", "LH", "Estradiol", "Progesterone", "Endometrium"],
    ["Menstrual\n(Days 1-5)", "Rising", "Low", "Low", "Very Low", "Shedding"],
    ["Early Follicular\n(Days 5-9)", "Moderate, falling", "Low", "Rising", "Very Low", "Proliferating"],
    ["Late Follicular\n(Days 9-13)", "Low", "Rising", "Peak", "Very Low - Low", "Thick proliferative"],
    ["Ovulation\n(Day 14)", "Mini-surge", "LH SURGE", "Slight drop", "Slight rise", "Transitioning"],
    ["Early Luteal\n(Days 14-21)", "Low", "Low", "Rising (2nd peak)", "Rapidly rising", "Secretory"],
    ["Late Luteal\n(Days 21-28)", "Low", "Low", "Falling", "PEAK then falls", "Secretory → shed"],
]
hormones_t = Table(hormone_table_data, colWidths=[2.5*cm, 2*cm, 2*cm, 2.5*cm, 2.5*cm, W - 11.5*cm])
hormones_t.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, 0), MEDIUM_PURPLE),
    ("TEXTCOLOR",     (0, 0), (-1, 0), white),
    ("FONTNAME",      (0, 0), (-1, 0), "Helvetica-Bold"),
    ("FONTSIZE",      (0, 0), (-1, -1), 9),
    ("ROWBACKGROUNDS",(0, 1), (-1, -1), [white, LIGHT_PURPLE]),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 6),
    ("TOPPADDING",    (0, 0), (-1, -1), 5),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
    # Highlight ovulation row
    ("BACKGROUND",    (0, 4), (-1, 4), LIGHT_PINK),
]))
story.append(hormones_t)
space()

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 6 – CERVICAL MUCUS
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 6", "Cervical Mucus & Other Cyclic Signs")

sec("Cervical Mucus Changes")
para(
    "The cervix secretes mucus throughout the cycle. The character of this mucus "
    "changes dramatically depending on which hormone is dominant:"
)

mucus_data = [
    ["Phase", "Hormone", "Mucus Character", "Clinical Significance"],
    ["Follicular\n(Pre-ovulatory)", "Estrogen", "Copious, watery, clear, elastic, low viscosity - 'egg white' consistency", "Sperm-friendly; channels form allowing sperm to penetrate cervix. Shows FERNING pattern on slide."],
    ["Ovulation", "Peak Estrogen + LH", "Maximum quantity, very stretchy (spinnbarkeit up to 6-10 cm)", "Peak fertility - sperm can travel most easily to egg"],
    ["Luteal\n(Post-ovulatory)", "Progesterone", "Scanty, thick, viscous, cloudy, non-elastic", "Sperm-hostile; acts as barrier. Does NOT fern on slide."],
    ["Late Luteal\n/ Menstruation", "Falling P4 & E2", "Minimal / shed with menstruation", "N/A"],
]
mucus_t = Table(mucus_data, colWidths=[2.5*cm, 2.5*cm, 4.5*cm, W - 9.5*cm])
mucus_t.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), [white, LIGHT_TEAL]),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "TOP"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 7),
    ("TOPPADDING",    (0, 0), (-1, -1), 6),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
]))
story.append(mucus_t)
space()

tip_box(
    "FERNING: Cervical mucus from the follicular phase forms a fern-like pattern when dried "
    "on a glass slide and viewed under a microscope. This occurs because of the high salt "
    "and water content driven by estrogen. In the luteal phase, progesterone makes mucus "
    "thick and no ferning pattern is seen."
)

sec("Spinnbarkeit")
para(
    "Spinnbarkeit (from German for 'spinnability') refers to the ability of cervical "
    "mucus to form a thread when stretched between two surfaces. At ovulation, estrogen "
    "is highest and spinnbarkeit is maximal (6-10 cm). This test is used clinically to "
    "assess the estrogenic state of the reproductive tract."
)

sec("Basal Body Temperature (BBT)")
para(
    "Progesterone has a thermogenic (heat-generating) effect. After ovulation, when "
    "the corpus luteum begins secreting progesterone, basal body temperature rises "
    "by 0.2-0.5°C and stays elevated for the rest of the luteal phase."
)
bullet("BBT should be measured first thing in the morning, before getting out of bed")
bullet("A rise in BBT is RETROSPECTIVE evidence that ovulation occurred")
bullet("BBT charting over several cycles can identify ovulation patterns")
bullet("Illness, alcohol, and disrupted sleep can falsely raise BBT")

sec("Other Signs of Ovulation")
bullet("<b>Mittelschmerz</b> - mid-cycle pelvic pain from follicle rupture")
bullet("<b>Light mid-cycle spotting</b> - occasional, from the drop in estrogen at ovulation")
bullet("<b>Increased libido</b> - many women report heightened sexual drive around ovulation")
bullet("<b>Breast tenderness</b> - estrogen then progesterone cause breast changes")
bullet("<b>Bloating</b> - fluid retention in luteal phase driven by progesterone")

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 7 – IF PREGNANCY OCCURS
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 7", "What Happens if Pregnancy Occurs?")

para(
    "The entire menstrual cycle is designed to prepare for the possibility of pregnancy. "
    "When fertilisation and implantation occur, the cycle is interrupted and maintained."
)

sec("Timeline of Early Pregnancy")

pregnancy_data = [
    ["Event", "Day (from LMP)", "What Happens"],
    ["Ovulation", "~Day 14", "Egg released from ovary"],
    ["Fertilisation", "Day 14-15", "Sperm fertilises egg in fallopian tube (ampulla)"],
    ["Cell division begins", "Days 14-18", "Zygote cleaves into morula while travelling to uterus"],
    ["Blastocyst formation", "Days 18-20", "Fluid-filled blastocyst reaches the uterine cavity"],
    ["Implantation", "Days 20-23", "Blastocyst embeds into secretory endometrium"],
    ["hCG production begins", "Days 22-24", "Trophoblast cells produce hCG to rescue corpus luteum"],
    ["hCG detectable in blood", "Day ~24-26", "Positive pregnancy blood test possible"],
    ["hCG detectable in urine", "Day ~28-30", "Positive home pregnancy test possible"],
    ["Corpus luteum rescued", "Days 22 onwards", "Continues making progesterone; no period occurs"],
    ["Placenta takes over", "Week 8-12", "Placenta produces progesterone; corpus luteum regresses"],
]
preg_t = Table(pregnancy_data, colWidths=[4*cm, 3*cm, W - 7*cm])
preg_t.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, 0), PINK),
    ("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), [white, LIGHT_PINK]),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 8),
    ("TOPPADDING",    (0, 0), (-1, -1), 6),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
]))
story.append(preg_t)
space()

key_box(
    "hCG (human Chorionic Gonadotropin) is the 'pregnancy hormone' produced by the "
    "trophoblast (future placenta). It mimics LH, preventing corpus luteum regression. "
    "This keeps progesterone levels high, maintains the endometrium, and prevents menstruation. "
    "hCG is what home pregnancy tests detect."
)

sec("Role of Progesterone in Pregnancy")
bullet("Maintains the endometrial lining (prevents shedding)")
bullet("Inhibits uterine contractions (prevents preterm labour)")
bullet("Promotes growth of uterine blood vessels")
bullet("Suppresses maternal immune response (prevents rejection of fetus)")
bullet("In late pregnancy, progesterone withdrawal contributes to onset of labour")

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 8 – NORMAL PARAMETERS
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 8", "Normal Cycle Parameters")

sec("What is a Normal Period?")
normal_data = [
    ["Parameter", "Normal Range", "Notes"],
    ["Cycle length", "21 - 35 days", "Average 28 days; ~2/3 of women fall in 21-35 days"],
    ["Duration of flow", "2 - 6 days", "Average 4-5 days"],
    ["Blood loss volume", "20 - 60 mL", ">80 mL = heavy menstrual bleeding (menorrhagia)"],
    ["Interval variability", "< 7 days cycle-to-cycle", "Within the same woman over time"],
    ["Age of menarche", "10 - 15 years", "Average 12.5 years in developed countries"],
    ["Age of menopause", "45 - 55 years", "Average 51 years; defined as 12 months no periods"],
    ["Follicular phase length", "10 - 21 days", "Variable - source of most cycle variation"],
    ["Luteal phase length", "~14 days (12-16)", "Remarkably constant across women"],
]
norm_t = Table(normal_data, colWidths=[4.5*cm, 3.5*cm, W - 8*cm])
norm_t.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, 0), BLUE),
    ("TEXTCOLOR",     (0, 0), (-1, 0), white),
    ("FONTNAME",      (0, 0), (-1, 0), "Helvetica-Bold"),
    ("FONTSIZE",      (0, 0), (-1, -1), 10),
    ("ROWBACKGROUNDS",(0, 1), (-1, -1), [white, LIGHT_BLUE]),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 8),
    ("TOPPADDING",    (0, 0), (-1, -1), 6),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
]))
story.append(norm_t)
space()

sec("Common Menstrual Disorders")
disorders_data = [
    ["Term", "Definition"],
    ["Amenorrhoea (Primary)", "No period by age 15 in girl with secondary sex characteristics"],
    ["Amenorrhoea (Secondary)", "No period for 3+ months in a woman who previously had periods"],
    ["Oligomenorrhoea", "Infrequent periods - cycle length > 35 days"],
    ["Polymenorrhoea", "Frequent periods - cycle length < 21 days"],
    ["Menorrhagia", "Heavy periods - blood loss > 80 mL or flow lasting > 7 days"],
    ["Dysmenorrhoea", "Painful periods; primary (prostaglandins) or secondary (e.g. endometriosis)"],
    ["Metrorrhagia", "Irregular, intermenstrual bleeding"],
    ["Premenstrual Syndrome (PMS)", "Physical/emotional symptoms in luteal phase, resolving with menses"],
    ["PMDD", "Severe PMS with significant mood disturbance (dysphoric symptoms)"],
    ["Anovulation", "Cycles without ovulation; common cause of infertility"],
]
dis_t = Table(disorders_data, colWidths=[4.5*cm, W - 4.5*cm])
dis_t.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, 0), DARK_GREY),
    ("TEXTCOLOR",     (0, 0), (-1, 0), white),
    ("FONTNAME",      (0, 0), (-1, 0), "Helvetica-Bold"),
    ("FONTSIZE",      (0, 0), (-1, -1), 10),
    ("ROWBACKGROUNDS",(0, 1), (-1, -1), [white, LIGHT_GREY]),
    ("GRID",          (0, 0), (-1, -1), 0.5, LIGHT_GREY),
    ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING",   (0, 0), (-1, -1), 8),
    ("TOPPADDING",    (0, 0), (-1, -1), 5),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
]))
story.append(dis_t)
space()

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════════
# CHAPTER 9 – KEY POINTS SUMMARY
# ═══════════════════════════════════════════════════════════════════════════════
chapter("Chapter 9", "Key Points Summary")

sec("The Big Picture")
key_points = [
    ("1", "The menstrual cycle is controlled by the HPO axis: Hypothalamus → GnRH → Pituitary → FSH/LH → Ovary → Estrogen/Progesterone → Uterus."),
    ("2", "GnRH must be pulsatile to work. Continuous GnRH suppresses the axis (used clinically)."),
    ("3", "FSH recruits follicles in early follicular phase. One dominant follicle is selected around Day 6."),
    ("4", "The dominant follicle produces estradiol, which drives endometrial proliferation (follicular/proliferative phase)."),
    ("5", "Rising estradiol first inhibits then stimulates LH secretion (positive feedback), causing the LH surge."),
    ("6", "The LH surge triggers ovulation 24-36 hours later. Ovulation occurs around Day 14."),
    ("7", "After ovulation, the follicle becomes the corpus luteum, secreting large amounts of progesterone."),
    ("8", "Progesterone transforms the endometrium into secretory phase - ideal for implantation."),
    ("9", "The luteal phase is always ~14 days. Progesterone raises basal body temperature."),
    ("10", "If no pregnancy: corpus luteum regresses → hormones fall → endometrium sheds (menstruation)."),
    ("11", "If pregnancy: hCG from embryo rescues corpus luteum → progesterone maintained → no period."),
    ("12", "Cervical mucus is sperm-friendly at ovulation (watery, stretchy, ferning) and hostile in luteal phase (thick, no ferning)."),
]

for num, point in key_points:
    row_data = [[
        Paragraph(f"<font color='white'><b>{num}</b></font>",
                  make_style(f"kpnum{num}", fontSize=11, textColor=white,
                             fontName="Helvetica-Bold", alignment=TA_CENTER)),
        Paragraph(point, body)
    ]]
    kp_t = Table(row_data, colWidths=[1*cm, W - 1*cm])
    bg = DEEP_PURPLE if int(num) % 2 == 1 else PINK
    kp_t.setStyle(TableStyle([
        ("BACKGROUND",    (0, 0), (0, 0), bg),
        ("VALIGN",        (0, 0), (-1, -1), "MIDDLE"),
        ("LEFTPADDING",   (0, 0), (-1, -1), 8),
        ("TOPPADDING",    (0, 0), (-1, -1), 5),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
        ("ROWBACKGROUNDS",(1, 0), (1, 0), [LIGHT_PURPLE if int(num) % 2 == 1 else LIGHT_PINK]),
        ("LINEBELOW",     (0, 0), (-1, 0), 0.5, LIGHT_GREY),
    ]))
    story.append(kp_t)
    story.append(Spacer(1, 3))

space(10)
sec("References")
para("<b>Berek & Novak's Gynecology</b> (16th Edition) - Chapter 7: Menstrual Cycle Physiology")
para("<b>Ganong's Review of Medical Physiology</b> (26th Edition) - Chapter 22: Menstrual Cycle")
para("<b>Costanzo Physiology</b> (7th Edition) - Female Reproductive Physiology")
para("<b>The Developing Human: Clinically Oriented Embryology</b> - Moore & Persaud")
para("<b>Junqueira's Basic Histology</b> (17th Edition) - Endometrial Changes")

space(10)
story.append(HRFlowable(width=W, thickness=2, color=MEDIUM_PURPLE, spaceAfter=8))
para(
    "<font color='#7B4DB3'><b>Prepared by Orris Medical Education  •  Based on authoritative medical textbooks  •  2026</b></font>"
)

# ── Page Template ──────────────────────────────────────────────────────────────

def on_first_page(canvas, doc):
    cover_page(canvas, doc)

def on_later_pages(canvas, doc):
    canvas.saveState()
    w, h = A4
    # Top bar
    canvas.setFillColor(DEEP_PURPLE)
    canvas.rect(0, h - 22, w, 22, fill=1, stroke=0)
    canvas.setFillColor(PINK)
    canvas.rect(0, h - 24, w, 2, fill=1, stroke=0)
    # Header text
    canvas.setFillColor(HexColor("#E8D5F5"))
    canvas.setFont("Helvetica-Bold", 9)
    canvas.drawString(2*cm, h - 15, "THE MENSTRUAL CYCLE - A COMPLETE EDUCATIONAL GUIDE")
    canvas.setFont("Helvetica", 8)
    canvas.setFillColor(HexColor("#C0A0E0"))
    canvas.drawRightString(w - 2*cm, h - 15, "Orris Medical Education 2026")
    # Bottom bar
    canvas.setFillColor(DEEP_PURPLE)
    canvas.rect(0, 0, w, 20, fill=1, stroke=0)
    canvas.setFillColor(PINK)
    canvas.rect(0, 20, w, 2, fill=1, stroke=0)
    # Page number
    canvas.setFillColor(white)
    canvas.setFont("Helvetica", 9)
    canvas.drawCentredString(w/2, 7, f"Page {doc.page}")
    canvas.restoreState()

# ── Build ──────────────────────────────────────────────────────────────────────
doc.build(story,
          onFirstPage=on_first_page,
          onLaterPages=on_later_pages)

print(f"PDF generated: {OUTPUT_PATH}")
Running Command

cd /tmp/workspace/menstrual-cycle-pdf && python generate_pdf.py 2>&1

Running Command

ls -lh /tmp/workspace/menstrual-cycle-pdf/Menstrual_Cycle_Guide.pdf

Your PDF is ready! Here's the download link:

Menstrual Cycle Guide

PDF Document · PDF


Here's what the guide covers across 9 detailed chapters:
ChapterContent
1 - IntroductionWhat the cycle is, 4 organs involved, ovarian vs uterine cycle overview
2 - HPO AxisGnRH pulses, FSH, LH, feedback mechanisms, two-cell theory
3 - Ovarian CycleFollicular phase (recruitment → dominant follicle), ovulation trigger & timing, luteal phase & corpus luteum
4 - Uterine CycleEndometrial anatomy, menstrual/proliferative/secretory phases with what changes and why
5 - HormonesDay-by-day changes in FSH, LH, Estradiol, Progesterone - with a color-coded summary table
6 - Cervical MucusSpinnbarkeit, ferning, BBT, and other ovulation signs
7 - If Pregnancy OccurshCG, corpus luteum rescue, implantation timeline
8 - Normal ParametersNormal ranges for cycle length, flow, blood loss + common disorders (amenorrhea, menorrhagia, dysmenorrhea, etc.)
9 - Key Points Summary12-point rapid revision summary + references
Sources used: Berek & Novak's Gynecology, Ganong's Review of Medical Physiology, Costanzo Physiology, and Junqueira's Basic Histology - all authoritative medical textbooks.

Find latest research papers on menstrual cycle physiology from PubMed

Reading File
Searching PubMed

"menstrual cycle"[MeSH Terms] AND physiology[MeSH Terms]

Searching PubMed

"menstrual cycle"[MeSH Terms] AND "hormones"[MeSH Terms]

Searching PubMed

"ovarian cycle" AND "follicular development" AND physiology

Searching PubMed

"menstrual cycle" AND "endometrium" AND physiology

Searching PubMed

"menstrual cycle" AND "ovulation" AND "GnRH" OR "gonadotropin"

Searching PubMed

"menstrual cycle" AND "cycle variability" OR "cycle tracking" OR "wearable"

Reading Article

PMID: 39120268

Reading Article

PMID: 39813600

Reading Article

PMID: 39862134

Reading Article

PMID: 40695607

Reading Article

PMID: 38110672

Reading Article

PMID: 40590223

Searching PubMed

"menstrual cycle" AND "gut microbiome" OR "microbiota"

Reading Article

PMID: 39887996

Reading Article

PMID: 40251875

Searching PubMed

"menstrual cycle" AND "immune system" AND physiology

Excellent - now I have a rich, well-rounded set of papers. Let me compile the final answer.

Latest Research Papers on Menstrual Cycle Physiology - PubMed Search Results

Here are the most relevant, high-quality recent papers, organized by research theme:

🧬 Theme 1: Endometrial Physiology & Hormone Signaling

[Review · 2024] Dias Da Silva I, Wuidar V, et al. "Unraveling the Dynamics of Estrogen and Progesterone Signaling in the Endometrium: An Overview." Cells. PMID: 39120268
Comprehensive narrative review of how estrogen and progesterone receptor signaling drives cyclical endometrial regeneration, differentiation, and shedding. Covers paracrine epithelial-stromal crosstalk and how hormonal imbalances contribute to gynecological disease and tumorigenesis. Full text freely available via PMC.

[Review · 2024] Garg A, Zielinska AP, et al. "Luteal phase support in assisted reproductive technology." Nature Reviews Endocrinology. PMID: 38110672
Published in Nature Reviews Endocrinology - explains the physiological luteal phase, how IVF stimulation disrupts it, endometrial transformation, the "window of implantation," progesterone receptor signalling, and implications for clinical luteal support. Essential reading on luteal-phase biology.

[Review · 2025] Bulun SE. "Endometriosis and ovulatory menstruation: beyond the Sampson principle." Journal of Clinical Investigation. PMID: 40590223
Challenging the classic retrograde menstruation theory, this 2025 review proposes that ovulatory cycles specifically maximize shedding of basalis endometrial cells carrying somatic mutations (e.g. KRAS). Shows how estrogen from follicular fluid at ovulation supports endometriotic implants, and how epigenetic defects (aromatase overexpression, progesterone resistance) drive lesion survival.

🧠 Theme 2: HPO Axis & GnRH Regulation - New Insights

[Review · Tier 7 · 2025] Koysombat K, Tsoutsouki J, Patel AH, et al. "Kisspeptin and neurokinin B: roles in reproductive health." Physiological Reviews. PMID: 39813600
Published in Physiological Reviews (the highest-impact physiology journal), this major 2025 review covers how kisspeptin neurons in the hypothalamic infundibulum co-expressing neurokinin B (NKB) regulate GnRH pulsatility - and thus the entire menstrual cycle. Covers:
  • Kisspeptin as the natural trigger of ovulation (now being trialled in IVF)
  • NKB's role in menopausal hot flashes
  • FDA-approved fezolinetant (NK3 receptor antagonist) for menopausal vasomotor symptoms
  • Applications in treating reproductive disorders
This is arguably the most important recent paper on menstrual cycle neuroendocrinology.

[Review · 2025] Saadedine M, Berga SL, Faubion SS, Shufelt CL. "The silent pandemic of stress: impact on menstrual cycle and ovulation." Stress. PMID: 39862134
Reviews how chronic psychosocial stress disrupts GnRH pulsatility via HPA axis activation, producing a spectrum from luteal phase deficiency → oligomenorrhea → anovulation → functional hypothalamic amenorrhea (FHA). Links FHA to bone loss, endothelial dysfunction, and cardiovascular risk. Calls out a major research gap in this underdiagnosed condition.

🏃 Theme 3: Menstrual Cycle & Physical Performance

[Systematic Review · Tier 1 · 2025] Schlie J, Krassowski V, Schmidt A. "Effects of menstrual cycle phases on athletic performance and related physiological outcomes: a systematic review of studies using high methodological standards." Journal of Applied Physiology. PMID: 40695607
Only included studies that measured 17β-estradiol, progesterone AND LH (not just calendar-based phase estimation). Key findings from 19 studies (n=279):
  • Early follicular phase may be unfavorable for VO₂max and peak power
  • Maximum and explosive strength are largely unaffected by cycle phase
  • Neuromuscular coordination improved at ovulation
  • Submaximal ventilation reduced in early follicular phase
  • Elite athletes are underrepresented in current research

[Systematic Review + Meta-Analysis · Tier 1 · 2025] Gilmer G, Crasta N, Tanaka MJ. "The Effect of Sex Hormones on Joint Ligament Properties: A Systematic Review and Meta-analysis." American Journal of Sports Medicine. PMID: 39887996
54 studies reviewed; 27 focused on ACL. Meta-analysis finding: the menstrual cycle does NOT meaningfully affect knee laxity or anterior tibial translation. However, 17β-estradiol decreases types I and III procollagen in ACL fibroblasts in vitro. Pregnancy, OCP use, and menopause DO affect ligament properties - mediated partly by relaxin. Clinically important for sports medicine.

🧪 Theme 4: Immune System & Menstrual Cycle

[Systematic Review · Tier 1 · 2024] Zwahlen M, Stute P. "Impact of progesterone on the immune system in women: a systematic literature review." Archives of Gynecology and Obstetrics. PMID: 36933040
Reviews how cyclical progesterone changes modulate immune function throughout the cycle - with implications for autoimmune disease flares, susceptibility to infections, and endometrial immune tolerance for implantation.

[Review · 2026] Obeagu EI. "Immune-Endometrial Crosstalk in Heavy Menstrual Bleeding: Interorgan Dynamics and Systemic Implications of Monocyte Dysregulation." Comprehensive Physiology. PMID: 42289950
2026 paper on how monocyte dysfunction and immune-endometrial crosstalk contribute to heavy menstrual bleeding (menorrhagia), with systemic implications beyond the uterus.

🧠 Theme 5: Hormones & Brain/Behavior

[Systematic Review · Tier 1 · 2025] Osianlis E, Thomas EHX, Jenkins LM, Gurvich C. "ADHD and Sex Hormones in Females: A Systematic Review." Journal of Attention Disorders. PMID: 40251875
Reviews evidence that ADHD symptoms fluctuate with menstrual cycle phases in females. Suggests estrogen and progesterone modulate dopamine and norepinephrine systems relevant to ADHD - explaining why females are underdiagnosed (symptoms vary cyclically rather than being constant).

Summary Table

PMIDYearTypeKey Topic
398136002025Review (Physiol Rev)Kisspeptin/NKB regulation of GnRH & menstrual cycle
391202682024ReviewEstrogen/progesterone signaling in endometrium
381106722024Review (Nat Rev Endocrinol)Luteal phase physiology + IVF support
405902232025Review (JCI)Ovulatory menstruation & endometriosis
398621342025ReviewStress → GnRH disruption → cycle disruption
406956072025Systematic ReviewCycle phases & athletic performance
398879962025SR + Meta-AnalysisSex hormones & ligament/joint properties
369330402024Systematic ReviewProgesterone & immune system
402518752025Systematic ReviewADHD symptoms & menstrual cycle hormones
422899502026ReviewImmune-endometrial crosstalk in heavy bleeding

Key Trends in Current Research

  1. Kisspeptin/NKB biology is the hottest area in menstrual cycle physiology - leading to new drugs (fezolinetant, kisspeptin-based IVF triggers)
  2. Phase verification standards are being tightened - researchers now demand actual hormone measurements, not just calendar counting
  3. Systemic effects of menstrual hormones (brain, immune, musculoskeletal, cardiovascular) are receiving major research attention
  4. Stress and FHA are recognized as clinically underdiagnosed and under-researched
  5. Single-cell transcriptomics of endometrial tissue is opening new frontiers in understanding implantation biology
This is a shared conversation. Sign in to Orris to start your own chat.