Give all the functions and the relations of Oestrogen Progesterone LH FSH
menstrual cycle LH FSH estrogen progesterone levels graph
| System | Effect |
|---|---|
| Uterus | Proliferates endometrial stroma and glands (proliferative phase); increases uterine size at puberty |
| Vagina | Changes epithelium from cuboidal to stratified (more resistant to infection and trauma) |
| Fallopian tubes | Stimulates glandular proliferation, increases ciliated cells; enhances ciliary beating toward uterus to propel ovum |
| Breasts | Develops stromal tissue, duct system, and fat deposition; initiates mammary growth |
| Skeleton | Inhibits osteoclastic activity; stimulates osteoprotegerin (osteoclastogenesis inhibitory factor); causes the pubertal growth spurt AND then closes the epiphyseal plates, limiting final height |
| Protein metabolism | Causes slight positive nitrogen balance (mild anabolic effect) |
| Fat deposition | Increases fat deposition in subcutaneous tissue, breasts, buttocks, thighs - responsible for female body contour |
| Skin | Makes skin softer and smoother; increases skin vascularity |
| Hair | Creates female body-hair distribution pattern |
| Electrolytes / fluid | Causes slight sodium and water retention (similar to aldosterone, but weaker) |
| Cardiovascular | Increases HDL, decreases LDL; protective effect on vessels pre-menopause |
| CNS | Libido effects; negative feedback on GnRH/LH/FSH at low levels |
| Cervical mucus | Produces thin, watery, ferning mucus - favorable for sperm penetration |
| Feedback (KEY) | At low levels → negative feedback on pituitary/hypothalamus, suppresses LH & FSH. At high pre-ovulatory levels → positive feedback → triggers the LH surge that causes ovulation |
| System | Effect |
|---|---|
| Uterus (endometrium) | Converts proliferative endometrium → secretory endometrium (rich in glycogen and lipids) - prepares for implantation |
| Myometrium | Decreases uterine contractility (prevents premature expulsion of implanted egg) |
| Cervical mucus | Makes mucus thick, viscid, and cellular - forms a "plug" that blocks sperm and bacteria |
| Breasts | Together with prolactin, completes development of alveoli and lobules into milk-secreting structures (estrogen initiates duct growth; progesterone develops alveoli) |
| Body temperature | Raises basal body temperature by ~0.5°C after ovulation - used clinically to confirm ovulation |
| Respiration | Stimulates respiratory drive; increases minute ventilation (important in pregnancy) |
| Sodium excretion | Competes with aldosterone at the renal tubule → mild natriuresis (sodium-losing effect) |
| Smooth muscle | Relaxes smooth muscle throughout body (GI tract → constipation in pregnancy; ureter dilation; gallbladder stasis) |
| CNS/mood | Has sedative/anxiolytic properties via GABA-A receptor modulation (metabolite allopregnanolone) |
| Immune modulation | Suppresses maternal immune response to allow tolerance of the semi-allogeneic embryo |
| Feedback | Amplifies estrogen's negative feedback on LH and FSH. Progesterone alone has little effect, but together with estrogen, strongly suppresses gonadotropins |
| Context | Effect |
|---|---|
| Follicular phase | Stimulates theca cells of ovarian follicle to produce androgens (androstenedione, testosterone) - which then diffuse to granulosa cells for aromatization to estrogen |
| LH surge (day ~13-14) | A massive mid-cycle LH surge (triggered by high estrogen positive feedback) causes ovulation - rupture of the dominant follicle and release of the oocyte. Ovulation occurs ~9-12 hours after the LH peak |
| Luteinization | After ovulation, LH converts the ruptured follicle into the corpus luteum |
| Corpus luteum maintenance | LH maintains corpus luteum and stimulates it to produce progesterone and estrogen during the luteal phase |
| Male function | Stimulates Leydig cells of testes to produce testosterone (hence LH is also called ICSH - interstitial cell stimulating hormone, in males) |
| Context | Effect |
|---|---|
| Follicular development | Stimulates growth and maturation of ovarian follicles each cycle |
| Aromatase stimulation | Acts on granulosa cells to upregulate aromatase enzyme - which converts androgens (from theca cells) into estrogens |
| Granulosa cell proliferation | Causes granulosa cell mitosis and increases the number of FSH and LH receptors on granulosa cells |
| Antrum formation | Stimulates production of follicular fluid and antrum formation |
| Dominant follicle selection | The follicle with the most FSH receptors becomes the dominant one; rising estrogen + inhibin suppress FSH, causing atresia of non-dominant follicles |
| Male function | Acts on Sertoli cells of the testes to stimulate spermatogenesis and to produce inhibin and androgen-binding protein (ABP) |
Hypothalamus (GnRH, pulsatile)
↓
Anterior Pituitary → LH + FSH
↓
Ovarian follicle → Estrogen + (some Progesterone)
↓
Feedback back to Hypothalamus + Pituitary
| Hormone | Effect on GnRH | Effect on LH | Effect on FSH |
|---|---|---|---|
| Low estrogen | Negative feedback ↓ | ↓ | ↓ |
| High estrogen (pre-ovulatory) | Positive feedback ↑ | ↑↑ (LH surge) | ↑ (small) |
| Progesterone + estrogen | Negative feedback ↓ | ↓↓ | ↓↓ |
| Inhibin B (granulosa cells) | Little effect | Little effect | ↓ specifically |
Create it as a pdf
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"
mkdir -p /tmp/workspace/hormones-pdf && cat > /tmp/workspace/hormones-pdf/create_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm 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 ListFlowable, ListItem # ── Output path ────────────────────────────────────────────────────────────── OUTPUT = "/tmp/workspace/hormones-pdf/Reproductive_Hormones.pdf" # ── Colour palette ─────────────────────────────────────────────────────────── DARK_BLUE = colors.HexColor("#1A3557") MID_BLUE = colors.HexColor("#2E6DA4") LIGHT_BLUE = colors.HexColor("#D6E8F7") ACCENT_PINK = colors.HexColor("#C0392B") TEAL = colors.HexColor("#117A65") LIGHT_TEAL = colors.HexColor("#D5F5E3") LIGHT_PINK = colors.HexColor("#FADBD8") LIGHT_GOLD = colors.HexColor("#FEF9E7") GOLD = colors.HexColor("#D4AC0D") LIGHT_PURPLE= colors.HexColor("#EBD5F5") PURPLE = colors.HexColor("#7D3C98") WHITE = colors.white DARK_GRAY = colors.HexColor("#2C3E50") MED_GRAY = colors.HexColor("#5D6D7E") LIGHT_GRAY = colors.HexColor("#ECF0F1") doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=1.8*cm, rightMargin=1.8*cm, topMargin=2*cm, bottomMargin=2*cm, title="Reproductive Hormones – Functions & Relations", author="Orris Medical" ) styles = getSampleStyleSheet() # ── Custom styles ───────────────────────────────────────────────────────────── def S(name, **kw): return ParagraphStyle(name, **kw) cover_title = S("CoverTitle", fontSize=26, textColor=WHITE, alignment=TA_CENTER, leading=32, fontName="Helvetica-Bold") cover_sub = S("CoverSub", fontSize=13, textColor=LIGHT_BLUE, alignment=TA_CENTER, leading=18, fontName="Helvetica") h_section = S("HSection", fontSize=15, textColor=WHITE, alignment=TA_LEFT, leading=20, fontName="Helvetica-Bold", spaceBefore=6, spaceAfter=4) h2 = S("H2", fontSize=11, textColor=DARK_BLUE, fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=4, leading=15) h3 = S("H3", fontSize=10, textColor=MID_BLUE, fontName="Helvetica-Bold", spaceBefore=6, spaceAfter=2, leading=13) body = S("Body", fontSize=9, textColor=DARK_GRAY, fontName="Helvetica", spaceBefore=2, spaceAfter=2, leading=13) body_j = S("BodyJ", fontSize=9, textColor=DARK_GRAY, fontName="Helvetica", spaceBefore=2, spaceAfter=2, leading=13, alignment=TA_JUSTIFY) small_italic = S("SmallItalic",fontSize=7.5,textColor=MED_GRAY, fontName="Helvetica-Oblique", spaceBefore=2, spaceAfter=4, alignment=TA_CENTER) label = S("Label", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=10) cell_bold = S("CellBold", fontSize=8, textColor=DARK_BLUE, fontName="Helvetica-Bold", leading=11) cell_normal = S("CellNormal", fontSize=8, textColor=DARK_GRAY, fontName="Helvetica", leading=11) # ── Helper ─────────────────────────────────────────────────────────────────── def section_banner(text, bg=DARK_BLUE): tbl = Table([[Paragraph(text, h_section)]], colWidths=[17.4*cm]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("ROUNDEDCORNERS", [4,4,4,4]), ("TOPPADDING", (0,0),(-1,-1), 7), ("BOTTOMPADDING", (0,0),(-1,-1), 7), ("LEFTPADDING", (0,0),(-1,-1), 10), ])) return tbl def func_table(headers, rows, col_widths, header_bg=MID_BLUE): data = [[Paragraph(h, S("TH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", leading=10)) for h in headers]] for row in rows: data.append([Paragraph(str(c), cell_normal) for c in row]) tbl = Table(data, colWidths=col_widths, repeatRows=1) ts = TableStyle([ ("BACKGROUND", (0,0), (-1,0), header_bg), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GRAY]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BDC3C7")), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 5), ("RIGHTPADDING", (0,0), (-1,-1), 5), ("VALIGN", (0,0), (-1,-1), "TOP"), ]) tbl.setStyle(ts) return tbl def info_box(text, bg=LIGHT_BLUE, border=MID_BLUE): tbl = Table([[Paragraph(text, body_j)]], colWidths=[17.4*cm]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(-1,-1), bg), ("LINEAFTER", (0,0),(0,-1), 2, border), ("LEFTPADDING", (0,0),(-1,-1), 10), ("RIGHTPADDING", (0,0),(-1,-1), 8), ("TOPPADDING", (0,0),(-1,-1), 6), ("BOTTOMPADDING", (0,0),(-1,-1), 6), ("LINEBEFORE", (0,0),(0,-1), 3, border), ])) return tbl def feedback_row(items, bgs): """Horizontal coloured tiles""" cells = [Paragraph(t, S("Tile", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=11)) for t in items] tbl = Table([cells], colWidths=[17.4/len(items)*cm]*len(items)) ts = [("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6), ("LEFTPADDING",(0,0),(-1,-1),3),("RIGHTPADDING",(0,0),(-1,-1),3), ("ALIGN",(0,0),(-1,-1),"CENTER"),("VALIGN",(0,0),(-1,-1),"MIDDLE")] for i, bg in enumerate(bgs): ts.append(("BACKGROUND",(i,0),(i,0), bg)) tbl.setStyle(TableStyle(ts)) return tbl # ═══════════════════════════════════════════════════════════════════════════════ story = [] # ─── COVER PAGE ────────────────────────────────────────────────────────────── cover_bg = Table( [[Paragraph("Reproductive Hormones", cover_title)], [Spacer(1, 0.3*cm)], [Paragraph("Functions & Relations", cover_sub)], [Spacer(1, 0.4*cm)], [Paragraph("Oestrogen · Progesterone · LH · FSH", S("CS2", fontSize=11, textColor=LIGHT_BLUE, alignment=TA_CENTER, fontName="Helvetica-Oblique"))], [Spacer(1, 0.6*cm)], [HRFlowable(width="80%", thickness=1, color=LIGHT_BLUE, hAlign="CENTER")], [Spacer(1, 0.4*cm)], [Paragraph("Based on Guyton & Hall · Costanzo Physiology · Ganong's Physiology", small_italic)], ], colWidths=[17.4*cm] ) cover_bg.setStyle(TableStyle([ ("BACKGROUND", (0,0),(-1,-1), DARK_BLUE), ("TOPPADDING", (0,0),(-1,-1), 14), ("BOTTOMPADDING", (0,0),(-1,-1), 14), ("LEFTPADDING", (0,0),(-1,-1), 20), ("RIGHTPADDING", (0,0),(-1,-1), 20), ])) story += [Spacer(1, 2*cm), cover_bg, PageBreak()] # ─── SECTION 1: OESTROGEN ──────────────────────────────────────────────────── story.append(section_banner("1. OESTROGEN (17β-Estradiol — Principal Form)", bg=ACCENT_PINK)) story.append(Spacer(1, 0.3*cm)) story.append(Paragraph("<b>Source:</b> Granulosa cells (follicular phase) → Corpus luteum (luteal phase) → Placenta (pregnancy) → Adrenal cortex (minor). Synthesised from androgens via aromatase in granulosa cells, stimulated by FSH.", body)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("<b>Functions</b>", h2)) est_rows = [ ["Uterus", "Proliferates endometrial stroma and glands (proliferative phase); increases uterine size at puberty 2-3×"], ["Vagina", "Changes epithelium from cuboidal → stratified; greatly increases resistance to trauma and infection"], ["Fallopian tubes","Stimulates glandular proliferation; increases ciliated cells; enhances ciliary beating toward uterus to propel the ovum"], ["Breasts", "Develops stromal tissue, extensive duct system, fat deposition; initiates mammary growth (alveolar completion needs progesterone + prolactin)"], ["Skeleton", "Inhibits osteoclasts via osteoprotegerin; causes pubertal growth spurt then closes epiphyseal plates, limiting final height"], ["Protein/Anabolic","Slight positive nitrogen balance; mild anabolic effect on body proteins"], ["Fat distribution","Deposits fat in breasts, buttocks, thighs, subcutaneous tissue — responsible for female body contour"], ["Skin & Hair", "Softer, smoother skin; increased vascularity; female body-hair distribution pattern"], ["Electrolytes", "Mild sodium and water retention (weak aldosterone-like effect)"], ["Cardiovascular", "Raises HDL, lowers LDL; vasculoprotective before menopause"], ["Cervical mucus", "Thin, watery, ferning mucus — favourable for sperm penetration (mid-cycle)"], ["Feedback (KEY)", "Low levels → negative feedback → suppresses LH & FSH. High pre-ovulatory levels → POSITIVE feedback → triggers the mid-cycle LH surge → ovulation"], ] story.append(func_table(["System / Target", "Effect"], est_rows, [4.5*cm, 12.9*cm], header_bg=ACCENT_PINK)) story.append(Spacer(1, 0.3*cm)) story.append(info_box("<b>Liver metabolism:</b> Estradiol and estrone are converted to the weaker estriol by the liver; conjugated to glucuronides/sulfates and excreted in bile and urine. Liver disease → elevated estrogen activity (hyperestrinism).", bg=LIGHT_PINK, border=ACCENT_PINK)) story.append(Spacer(1, 0.4*cm)) # ─── SECTION 2: PROGESTERONE ───────────────────────────────────────────────── story.append(section_banner("2. PROGESTERONE", bg=TEAL)) story.append(Spacer(1, 0.3*cm)) story.append(Paragraph("<b>Source:</b> Corpus luteum (dominant source, luteal phase); placenta (takes over from ~8 weeks of pregnancy); adrenal cortex (minor). Transported in blood bound to albumin and progesterone-binding globulin. Degraded → pregnanediol (excreted in urine).", body)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("<b>Functions</b>", h2)) prog_rows = [ ["Endometrium", "Converts proliferative → secretory endometrium (rich in glycogen and lipids); prepares uterus for implantation"], ["Myometrium", "Decreases uterine contractility → prevents premature expulsion of implanted ovum / fetus"], ["Cervical mucus", "Makes mucus thick, viscid, and cellular → forms a plug blocking sperm and pathogens in luteal phase and pregnancy"], ["Breasts", "With prolactin, completes development of alveoli and lobules into milk-secreting structures"], ["Body temperature", "Raises basal body temperature ~0.5 °C after ovulation — used clinically to confirm ovulation has occurred"], ["Respiration", "Stimulates respiratory drive; increases alveolar ventilation (important in pregnancy to compensate for fetal CO₂)"], ["Renal", "Competes with aldosterone at renal tubule → mild natriuresis (sodium-losing effect)"], ["Smooth muscle", "Relaxes GI smooth muscle (→ constipation in pregnancy); ureteral dilation; gallbladder stasis"], ["CNS / Mood", "Sedative/anxiolytic via GABA-A modulation (metabolite allopregnanolone); contributes to premenstrual symptoms"], ["Immune", "Suppresses maternal immune response to allow tolerance of semi-allogeneic embryo"], ["Feedback", "Amplifies estrogen's negative feedback on LH and FSH → strongly suppresses both gonadotropins in the luteal phase"], ] story.append(func_table(["System / Target", "Effect"], prog_rows, [4.5*cm, 12.9*cm], header_bg=TEAL)) story.append(Spacer(1, 0.4*cm)) # ─── SECTION 3: LH ─────────────────────────────────────────────────────────── story.append(section_banner("3. LH — Luteinizing Hormone", bg=GOLD)) story.append(Spacer(1, 0.3*cm)) story.append(Paragraph("<b>Source:</b> Gonadotroph cells of the <b>anterior pituitary gland</b>. Stimulated by pulsatile GnRH. Glycoprotein with a shared α-subunit (with FSH, TSH, hCG) and a unique β-subunit. Secreted in pulses every 60-90 min.", body)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("<b>Functions</b>", h2)) lh_rows = [ ["Follicular phase (female)","Stimulates theca cells → produce androgens (androstenedione, testosterone) → diffuse to granulosa cells for aromatization to estrogens. Low basal pulsatile LH supports ongoing follicular steroid synthesis."], ["Mid-cycle LH surge", "High estrogen (positive feedback) triggers a massive LH surge. This causes: (1) completion of 1st meiotic division of oocyte, (2) rupture of dominant follicle → OVULATION ~9-24 h after peak"], ["Luteinization", "LH converts the ruptured follicle into the corpus luteum (luteinization of granulosa and theca cells)"], ["Corpus luteum maintenance","Maintains CL and drives its secretion of progesterone (and estrogen) throughout the luteal phase"], ["Male — Leydig cells", "Stimulates Leydig (interstitial) cells of testes to produce testosterone (hence also called ICSH — Interstitial Cell Stimulating Hormone in males)"], ] story.append(func_table(["Context", "Effect"], lh_rows, [4.5*cm, 12.9*cm], header_bg=GOLD)) story.append(Spacer(1, 0.4*cm)) # ─── SECTION 4: FSH ────────────────────────────────────────────────────────── story.append(section_banner("4. FSH — Follicle-Stimulating Hormone", bg=PURPLE)) story.append(Spacer(1, 0.3*cm)) story.append(Paragraph("<b>Source:</b> Gonadotroph cells of the <b>anterior pituitary gland</b>. Co-secreted with LH in response to GnRH pulses. Same α-subunit as LH; unique β-subunit confers specificity.", body)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("<b>Functions</b>", h2)) fsh_rows = [ ["Follicular development", "Stimulates growth and maturation of ovarian follicles each menstrual cycle; drives granulosa cell proliferation"], ["Aromatase stimulation", "Upregulates aromatase in granulosa cells → converts LH-driven androgens (from theca cells) into estrogens. This is the two-cell, two-gonadotropin model."], ["Receptor upregulation", "Increases FSH and LH receptors on granulosa cells, sensitising the dominant follicle to LH for the mid-cycle surge"], ["Antrum formation", "Stimulates production of follicular fluid accumulation forming the antrum (FSH is present in the antral fluid)"], ["Dominant follicle selection","Rising estrogen + inhibin-B suppress FSH → follicles with fewer FSH receptors undergo atresia; only the dominant follicle (most receptors) survives"], ["Male — Sertoli cells", "Acts on Sertoli cells → stimulates spermatogenesis; drives production of inhibin-B and androgen-binding protein (ABP)"], ] story.append(func_table(["Context", "Effect"], fsh_rows, [4.5*cm, 12.9*cm], header_bg=PURPLE)) story.append(Spacer(1, 0.4*cm)) # ─── SECTION 5: RELATIONS ──────────────────────────────────────────────────── story.append(PageBreak()) story.append(section_banner("5. RELATIONS BETWEEN THE FOUR HORMONES", bg=DARK_BLUE)) story.append(Spacer(1, 0.3*cm)) story.append(Paragraph("Hypothalamic-Pituitary-Ovarian Axis", h2)) axis_rows = [ [Paragraph("HYPOTHALAMUS", S("AX", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)), "", ""], [Paragraph("GnRH (pulsatile, every 60-90 min)", S("AX2", fontSize=8, textColor=DARK_GRAY, alignment=TA_CENTER)), "", ""], [Paragraph("↓", S("Arrow", fontSize=14, textColor=MID_BLUE, alignment=TA_CENTER, fontName="Helvetica-Bold")), "", ""], [Paragraph("ANTERIOR PITUITARY", S("AX", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)), "", ""], [Paragraph("LH + FSH", S("AX2", fontSize=8, textColor=DARK_GRAY, alignment=TA_CENTER)), "", ""], [Paragraph("↓", S("Arrow", fontSize=14, textColor=MID_BLUE, alignment=TA_CENTER, fontName="Helvetica-Bold")), "", ""], [Paragraph("OVARY", S("AX", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)), "", ""], [Paragraph("Estrogen + Progesterone + Inhibin", S("AX2", fontSize=8, textColor=DARK_GRAY, alignment=TA_CENTER)), "", ""], [Paragraph("↑ Feedback loop ↑", S("AX2", fontSize=8, textColor=ACCENT_PINK, fontName="Helvetica-Bold", alignment=TA_CENTER)), "", ""], ] ax_tbl = Table(axis_rows, colWidths=[17.4*cm, 0*cm, 0*cm]) ax_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(0,0), MID_BLUE), ("BACKGROUND", (0,3),(0,3), MID_BLUE), ("BACKGROUND", (0,6),(0,6), TEAL), ("TOPPADDING", (0,0),(-1,-1), 3), ("BOTTOMPADDING",(0,0),(-1,-1), 3), ("LEFTPADDING", (0,0),(-1,-1), 10), ("RIGHTPADDING",(0,0),(-1,-1), 10), ("BACKGROUND", (0,1),(0,1), LIGHT_BLUE), ("BACKGROUND", (0,4),(0,4), LIGHT_BLUE), ("BACKGROUND", (0,7),(0,7), LIGHT_TEAL), ("BACKGROUND", (0,8),(0,8), LIGHT_PINK), ])) story.append(ax_tbl) story.append(Spacer(1, 0.4*cm)) # ── Menstrual Cycle Phase-by-Phase ─────────────────────────────────────────── story.append(Paragraph("Menstrual Cycle — Phase-by-Phase Hormone Relations", h2)) story.append(Spacer(1, 0.15*cm)) phase_rows = [ ["Phase", "Key Hormonal Events"], ["Follicular\n(Days 1-13)", "FSH rises → follicular growth → granulosa cells produce ↑Estrogen\n" "Rising estrogen → negative feedback → suppresses FSH & LH\n" "LH (low, pulsatile) → theca cells → androgens → aromatized to estrogen (FSH-driven)\n" "Only the dominant follicle (most FSH receptors) survives — others undergo atresia"], ["Pre-Ovulatory\n(Day 12-13)", "Estrogen peaks (~200-400 pg/mL) → SWITCHES to POSITIVE feedback\n" "→ Triggers the MID-CYCLE LH SURGE (and smaller FSH surge)\n" "→ Ovulation occurs 9-24 h after LH peak"], ["Luteal\n(Days 14-28)", "LH → converts ruptured follicle → Corpus Luteum\n" "Corpus luteum secretes large Progesterone + moderate Estrogen\n" "Progesterone + Estrogen → strong negative feedback → LH & FSH suppressed\n" "Inhibin-B from CL → specifically suppresses FSH\n" "If no pregnancy: CL degenerates → Progesterone & Estrogen fall → menstruation begins\n" "LH and FSH rise again → new cycle starts"], ["Pregnancy\n(if fertilised)", "hCG (from trophoblast) mimics LH → maintains CL → Progesterone stays high\n" "Placenta eventually takes over steroid production (~8-10 weeks)\n" "High Progesterone + Estrogen throughout pregnancy → LH & FSH remain suppressed"], ] phase_tbl = Table(phase_rows, colWidths=[3.5*cm, 13.9*cm], repeatRows=1) phase_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("TEXTCOLOR", (0,0), (-1,0), WHITE), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTSIZE", (0,0), (-1,0), 9), ("FONTNAME", (0,1), (-1,-1), "Helvetica"), ("FONTSIZE", (0,1), (-1,-1), 8), ("BACKGROUND", (0,1), (-1,1), LIGHT_BLUE), ("BACKGROUND", (0,2), (-1,2), LIGHT_PINK), ("BACKGROUND", (0,3), (-1,3), LIGHT_TEAL), ("BACKGROUND", (0,4), (-1,4), LIGHT_GOLD), ("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"), ("FONTSIZE", (0,1), (0,-1), 8), ("TEXTCOLOR", (0,1), (0,-1), DARK_BLUE), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BDC3C7")), ("VALIGN", (0,0), (-1,-1), "TOP"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("RIGHTPADDING", (0,0), (-1,-1), 6), ])) story.append(phase_tbl) story.append(Spacer(1, 0.4*cm)) # ── Feedback Summary Table ─────────────────────────────────────────────────── story.append(Paragraph("Feedback Summary", h2)) fb_rows = [ ["Hormone State", "Effect on GnRH", "Effect on LH", "Effect on FSH"], ["Low Estrogen", "Negative (↓)", "↓", "↓"], ["High Estrogen (pre-ovulatory peak)", "Positive (↑)", "↑↑ LH SURGE", "↑ (smaller)"], ["Progesterone + Estrogen (luteal)", "Negative (↓↓)", "↓↓", "↓↓"], ["Inhibin-B (granulosa / Sertoli)", "Little effect", "Little effect", "↓↓ specifically"], ["Inhibin-A (corpus luteum)", "Little effect", "Little effect", "↓ specifically"], ] fb_tbl = Table(fb_rows, colWidths=[5.5*cm, 3.8*cm, 4*cm, 4.1*cm], repeatRows=1) fb_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("TEXTCOLOR", (0,0), (-1,0), WHITE), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTSIZE", (0,0), (-1,-1), 8), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GRAY]), ("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"), ("TEXTCOLOR", (0,1), (0,-1), DARK_BLUE), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BDC3C7")), ("ALIGN", (1,0), (-1,-1), "CENTER"), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 5), ("RIGHTPADDING", (0,0), (-1,-1), 5), ])) story.append(fb_tbl) story.append(Spacer(1, 0.4*cm)) # ── Key Interplay Points ───────────────────────────────────────────────────── story.append(Paragraph("Key Interplay Points", h2)) key_points = [ "<b>Two-cell, two-gonadotropin model:</b> LH acts on theca cells → androgens. FSH acts on granulosa cells → aromatase → converts those androgens to estrogens. Neither cell can produce estrogen alone.", "<b>FSH drives estrogen, estrogen suppresses FSH:</b> A classic negative feedback loop that ensures only one dominant follicle survives per cycle.", "<b>Estrogen triggers the LH surge:</b> The same hormone that is normally inhibitory becomes stimulatory at high concentrations — the positive feedback switch. This is the central event that causes ovulation.", "<b>LH creates and maintains the corpus luteum:</b> Without LH, there is no CL, no progesterone, and no preparation for implantation.", "<b>Progesterone amplifies estrogen's brake on gonadotropins:</b> Progesterone alone has little feedback effect, but combined with estrogen it strongly suppresses both LH and FSH throughout the luteal phase.", "<b>Corpus luteum lifespan governs cycle length:</b> If fertilisation fails, the CL involutes after ~14 days, progesterone and estrogen fall, the brake is lifted, FSH rises, and the next cycle begins.", "<b>hCG rescues the corpus luteum in pregnancy:</b> hCG mimics LH's action, keeping the CL alive and progesterone high until the placenta takes over, preventing menstruation.", ] for pt in key_points: row = Table([[Paragraph("•", S("Bullet", fontSize=10, textColor=MID_BLUE, fontName="Helvetica-Bold")), Paragraph(pt, body_j)]], colWidths=[0.4*cm, 17.0*cm]) row.setStyle(TableStyle([ ("TOPPADDING", (0,0),(-1,-1), 2), ("BOTTOMPADDING", (0,0),(-1,-1), 2), ("LEFTPADDING", (0,0),(-1,-1), 0), ("VALIGN", (0,0),(-1,-1), "TOP"), ])) story.append(row) story.append(Spacer(1, 0.4*cm)) story.append(HRFlowable(width="100%", thickness=0.5, color=MED_GRAY)) story.append(Spacer(1, 0.15*cm)) story.append(Paragraph("Sources: Guyton & Hall Textbook of Medical Physiology 14e · Costanzo Physiology 7e · Ganong's Review of Medical Physiology 26e", small_italic)) # ── Build ───────────────────────────────────────────────────────────────────── doc.build(story) print("PDF created:", OUTPUT) PYEOF echo "Script written"
cd /tmp/workspace/hormones-pdf && python create_pdf.py
Reproductive Hormones
PDF Document · PDF