Hello I am the medical student you can help me
I am BNYS students under MGR University
Create study notes or a summary document for your courses
BNYS 1st year Physiology syllabus MGR University topics
mkdir -p /home/daytona/workspace/bnys-physiology && ls /home/daytona/workspace/bβ¦
~/bnys-physiology/generate_notes.py
#!/usr/bin/env python3
"""
BNYS 1st Year Physiology Study Notes PDF Generator
MGR University | Generated: July 2026
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.colors import HexColor, white, black
from reportlab.lib.units import cm, mm
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 BaseDocTemplate, Frame, PageTemplate
OUTPUT = "/home/daytona/workspace/bnys-physiology/BNYS_Physiology_Notes.pdf"
# ββ Colours ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DARK_BLUE = HexColor("#1A3A5C")
MID_BLUE = HexColor("#2E6DA4")
LIGHT_BLUE = HexColor("#D6E8F7")
ACCENT = HexColor("#E8941A")
LIGHT_GREY = HexColor("#F5F5F5")
DARK_GREY = HexColor("#444444")
GREEN = HexColor("#2E7D32")
RED = HexColor("#C62828")
PURPLE = HexColor("#6A1B9A")
TEAL = HexColor("#00695C")
def make_styles():
base = getSampleStyleSheet()
styles = {
"title": ParagraphStyle("title",
fontSize=28, fontName="Helvetica-Bold",
textColor=white, alignment=TA_CENTER,
spaceAfter=6),
"subtitle": ParagraphStyle("subtitle",
fontSize=14, fontName="Helvetica",
textColor=LIGHT_BLUE, alignment=TA_CENTER,
spaceAfter=4),
"cover_small": ParagraphStyle("cover_small",
fontSize=11, fontName="Helvetica",
textColor=LIGHT_BLUE, alignment=TA_CENTER,
spaceAfter=2),
"chapter_title": ParagraphStyle("chapter_title",
fontSize=20, fontName="Helvetica-Bold",
textColor=white, alignment=TA_LEFT,
spaceAfter=4, spaceBefore=2),
"section_head": ParagraphStyle("section_head",
fontSize=14, fontName="Helvetica-Bold",
textColor=DARK_BLUE, spaceAfter=6, spaceBefore=12,
borderPad=4),
"subsection_head": ParagraphStyle("subsection_head",
fontSize=12, fontName="Helvetica-Bold",
textColor=MID_BLUE, spaceAfter=4, spaceBefore=8),
"body": ParagraphStyle("body",
fontSize=10, fontName="Helvetica",
textColor=DARK_GREY, spaceAfter=4, leading=15,
alignment=TA_JUSTIFY),
"bullet": ParagraphStyle("bullet",
fontSize=10, fontName="Helvetica",
textColor=DARK_GREY, spaceAfter=3, leading=14,
leftIndent=16, bulletIndent=4),
"key_box": ParagraphStyle("key_box",
fontSize=10, fontName="Helvetica-Bold",
textColor=DARK_BLUE, spaceAfter=2, leading=14),
"note": ParagraphStyle("note",
fontSize=9, fontName="Helvetica-Oblique",
textColor=HexColor("#555555"), spaceAfter=3, leading=13,
leftIndent=8),
"table_header": ParagraphStyle("table_header",
fontSize=10, fontName="Helvetica-Bold",
textColor=white, alignment=TA_CENTER),
"table_cell": ParagraphStyle("table_cell",
fontSize=9, fontName="Helvetica",
textColor=DARK_GREY, alignment=TA_LEFT, leading=13),
"toc_entry": ParagraphStyle("toc_entry",
fontSize=11, fontName="Helvetica",
textColor=DARK_BLUE, spaceAfter=3, leading=16,
leftIndent=10),
"toc_title": ParagraphStyle("toc_title",
fontSize=16, fontName="Helvetica-Bold",
textColor=DARK_BLUE, spaceAfter=10, alignment=TA_CENTER),
}
return styles
S = make_styles()
def hr(color=MID_BLUE, thickness=1):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=6, spaceBefore=2)
def chapter_banner(title, color=DARK_BLUE):
data = [[Paragraph(title, S["chapter_title"])]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROWBACKGROUNDS", (0,0), (-1,-1), [color]),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING",(0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [6]),
]))
return t
def key_point_box(items, title="Key Points", color=LIGHT_BLUE, title_color=DARK_BLUE):
rows = [[Paragraph(f"<b>{title}</b>", ParagraphStyle("kh",
fontSize=11, fontName="Helvetica-Bold",
textColor=title_color))]]
for item in items:
rows.append([Paragraph(f"β’ {item}", S["key_box"])])
t = Table(rows, colWidths=[16.5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), color),
("BACKGROUND", (0,1), (-1,-1), HexColor("#EAF3FB")),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 1, MID_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.25, HexColor("#BBDEFB")),
]))
return t
def simple_table(headers, rows, col_widths=None):
if col_widths is None:
n = len(headers)
col_widths = [16.5*cm / n] * n
header_row = [Paragraph(h, S["table_header"]) for h in headers]
data = [header_row]
for row in rows:
data.append([Paragraph(str(c), S["table_cell"]) for c in row])
t = Table(data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1), (-1,-1), [white, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#BBBBBB")),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# CONTENT SECTIONS
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def cover_page():
elems = []
# Big banner
data = [[
Paragraph("BNYS 1st Year", S["subtitle"]),
],[
Paragraph("Human Physiology", S["title"]),
],[
Paragraph("Comprehensive Study Notes", S["subtitle"]),
]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
("TOPPADDING", (0,0), (0,0), 30),
("BOTTOMPADDING",(0,-1), (-1,-1), 30),
("TOPPADDING", (0,1), (-1,1), 5),
("BOTTOMPADDING",(0,1), (-1,1), 5),
]))
elems.append(t)
elems.append(Spacer(1, 1*cm))
info_data = [
["University", "The Tamil Nadu Dr. M.G.R. Medical University"],
["Program", "Bachelor of Naturopathy & Yogic Sciences (BNYS)"],
["Year", "1st Year"],
["Subject", "Human Physiology I & II"],
["Reference", "Ganong's / Guyton & Hall / Costanzo Physiology"],
["Prepared", "July 2026"],
]
t2 = Table(info_data, colWidths=[4.5*cm, 12*cm])
t2.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0), (-1,-1), [LIGHT_BLUE, white]),
("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"),
("FONTNAME", (1,0), (1,-1), "Helvetica"),
("FONTSIZE", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 1, MID_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, HexColor("#BBBBBB")),
]))
elems.append(t2)
elems.append(Spacer(1, 0.8*cm))
chapters = [
"1. Cell Physiology", "2. Blood & Hematology",
"3. Cardiovascular System", "4. Respiratory System",
"5. Digestive System", "6. Nervous System",
"7. Endocrine System", "8. Renal Physiology",
"9. Muscle Physiology", "10. Reproductive Physiology",
]
elems.append(Paragraph("Contents at a Glance", S["toc_title"]))
for ch in chapters:
elems.append(Paragraph(ch, S["toc_entry"]))
elems.append(PageBreak())
return elems
def chapter_1():
"""Cell Physiology"""
elems = []
elems.append(chapter_banner("Chapter 1: Cell Physiology"))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("1.1 Cell Structure", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"The cell is the fundamental structural and functional unit of all living organisms. "
"Human cells are <b>eukaryotic</b> - they possess a membrane-bound nucleus and specialised organelles.",
S["body"]))
organelles = [
["Organelle", "Structure", "Function"],
["Nucleus", "Double membrane, contains DNA", "Controls cell activities; stores genetic info"],
["Mitochondria", "Double membrane, cristae", "ATP production (cellular respiration)"],
["Endoplasmic Reticulum (RER)", "Ribosomes on surface", "Protein synthesis & modification"],
["Endoplasmic Reticulum (SER)", "Smooth, no ribosomes", "Lipid synthesis; detoxification"],
["Golgi Apparatus", "Flattened membrane sacs", "Protein packaging & secretion"],
["Lysosomes", "Membrane-bound vesicles", "Intracellular digestion (hydrolytic enzymes)"],
["Ribosomes", "rRNA + protein", "Site of protein synthesis"],
["Cytoskeleton", "Microfilaments, microtubules", "Cell shape, movement, organelle transport"],
]
elems.append(simple_table(organelles[0], organelles[1:], [4*cm, 5.5*cm, 7*cm]))
elems.append(Spacer(1, 0.3*cm))
elems.append(Paragraph("1.2 Cell Membrane", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"The <b>Fluid Mosaic Model</b> (Singer & Nicolson, 1972) describes the plasma membrane as a "
"phospholipid bilayer with embedded proteins that can move laterally.",
S["body"]))
elems.append(Paragraph("<b>Components:</b>", S["subsection_head"]))
for item in [
"Phospholipids - hydrophilic head (faces water) + hydrophobic tail (faces inward)",
"Cholesterol - stabilises membrane fluidity; prevents crystallisation at low temperatures",
"Integral proteins - span the bilayer; include ion channels, transporters, receptors",
"Peripheral proteins - attached to inner/outer surface; include enzymes and structural proteins",
"Glycoproteins & Glycolipids - cell recognition, immune function",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("1.3 Membrane Transport", S["section_head"]))
elems.append(hr())
transport = [
["Type", "Energy", "Carrier?", "Direction", "Example"],
["Simple Diffusion", "None", "No", "High β Low", "Oβ, COβ, lipids"],
["Facilitated Diffusion", "None", "Yes", "High β Low", "Glucose (GLUT), ions"],
["Active Transport (Primary)", "ATP", "Yes", "Low β High", "NaβΊ/KβΊ ATPase"],
["Active Transport (Secondary)", "Gradient", "Yes", "Coupled", "NaβΊ/Glucose cotransport"],
["Osmosis", "None", "No", "HβO moves", "Red cell in hypotonic"],
["Endocytosis", "ATP", "Vesicle", "Into cell", "Phagocytosis"],
["Exocytosis", "ATP", "Vesicle", "Out of cell", "Neurotransmitter release"],
]
elems.append(simple_table(transport[0], transport[1:], [3.5*cm, 2.5*cm, 2*cm, 3*cm, 5.5*cm]))
elems.append(Spacer(1, 0.3*cm))
elems.append(key_point_box([
"NaβΊ/KβΊ ATPase pumps 3 NaβΊ out and 2 KβΊ in per ATP hydrolysed - maintains RMP",
"Osmolarity of plasma = ~285-295 mOsm/kg",
"Isotonic = 0.9% NaCl (normal saline) or 5% dextrose",
"Oncotic pressure (colloid osmotic) is mainly due to albumin (~25 mmHg)",
], "Key Points - Cell Membrane"))
elems.append(Paragraph("1.4 Resting Membrane Potential (RMP)", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"RMP is the electrical potential difference across the plasma membrane of a cell at rest. "
"It is <b>-70 mV</b> in neurons (inside negative relative to outside).",
S["body"]))
for item in [
"Maintained by NaβΊ/KβΊ ATPase and differential permeability",
"KβΊ is the main determinant of RMP (high intracellular KβΊ leaks out)",
"NaβΊ is high outside, low inside",
"Clβ» is high outside, low inside",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("1.5 Action Potential", S["section_head"]))
elems.append(hr())
phases = [
["Phase", "Membrane Potential", "Ion Movement", "Channel State"],
["Resting", "-70 mV", "KβΊ leaks out slightly", "KβΊ leak channels open"],
["Depolarisation", "-70 β +30 mV", "NaβΊ rushes IN", "Voltage-gated NaβΊ opens"],
["Repolarisation", "+30 β -70 mV", "KβΊ rushes OUT", "KβΊ opens, NaβΊ closes"],
["Hyperpolarisation", "< -70 mV", "Excess KβΊ exits", "KβΊ slow to close"],
["Recovery (Refractory)", "Returns to -70 mV", "Pump restores gradient", "NaβΊ/KβΊ ATPase active"],
]
elems.append(simple_table(phases[0], phases[1:], [3.5*cm, 3.5*cm, 5*cm, 5*cm]))
elems.append(Paragraph(
"<i>Note: All-or-none law - once threshold (-55 mV) is reached, full AP fires regardless of stimulus strength.</i>",
S["note"]))
elems.append(PageBreak())
return elems
def chapter_2():
"""Blood & Hematology"""
elems = []
elems.append(chapter_banner("Chapter 2: Blood & Hematology", TEAL))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("2.1 Composition of Blood", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"Blood is a connective tissue consisting of <b>plasma (55%)</b> and <b>formed elements (45%)</b>. "
"Total blood volume in adults = <b>5-6 litres</b> (70 mL/kg body weight).",
S["body"]))
comp = [
["Component", "% of Blood", "Normal Value", "Function"],
["Plasma", "55%", "β", "Transport medium, homeostasis"],
["Red Blood Cells (RBC)", "44%", "M: 5.0-5.5 million/Β΅L; F: 4.5-5.0 million/Β΅L", "Oβ and COβ transport"],
["White Blood Cells (WBC)", "<1%", "4,000-11,000/Β΅L", "Immunity, defence"],
["Platelets", "<1%", "1,50,000-4,00,000/Β΅L", "Haemostasis, clotting"],
]
elems.append(simple_table(comp[0], comp[1:], [3.5*cm, 2.5*cm, 5.5*cm, 6*cm]))
elems.append(Paragraph("2.2 Plasma", S["section_head"]))
elems.append(hr())
for item in [
"Water: 90-92% of plasma",
"Proteins: 7-8% - Albumin (60%), Globulins (35%), Fibrinogen (4%), others",
"Albumin - maintains oncotic pressure, transports hormones/drugs/bilirubin",
"Globulins - alpha/beta (transport), gamma (antibodies/immunoglobulins)",
"Fibrinogen - clotting; converted to fibrin by thrombin",
"Inorganic salts: NaβΊ, KβΊ, CaΒ²βΊ, HCOββ», Clβ»",
"Glucose: 70-100 mg/dL (fasting)",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("2.3 Red Blood Cells (Erythrocytes)", S["section_head"]))
elems.append(hr())
elems.append(Paragraph("<b>Normal Values:</b>", S["subsection_head"]))
rbc_vals = [
["Parameter", "Male", "Female"],
["RBC count", "5.0-5.5 million/Β΅L", "4.5-5.0 million/Β΅L"],
["Haemoglobin (Hb)", "13-17 g/dL", "12-15 g/dL"],
["Haematocrit (PCV)", "40-50%", "36-46%"],
["MCV", "80-100 fL", "80-100 fL"],
["MCH", "27-32 pg", "27-32 pg"],
["MCHC", "32-36 g/dL", "32-36 g/dL"],
["Reticulocytes", "0.5-1.5%", "0.5-1.5%"],
]
elems.append(simple_table(rbc_vals[0], rbc_vals[1:], [5*cm, 5.5*cm, 6*cm]))
elems.append(Paragraph("<b>Life cycle of RBC:</b>", S["subsection_head"]))
for item in [
"Site of production: Red bone marrow (adults) - process = Erythropoiesis",
"Stimulus: Erythropoietin (EPO) from kidney in response to hypoxia",
"RBC has no nucleus, no mitochondria - cannot divide or do oxidative phosphorylation",
"Lifespan: 120 days",
"Destruction: Spleen (graveyard of RBCs), liver - by macrophages",
"Hb breakdown β Haem β Biliverdin β Bilirubin β conjugated in liver β bile",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("2.4 Haemoglobin", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"Haemoglobin (Hb) is a protein made of <b>4 polypeptide chains</b> each carrying a <b>haem</b> group. "
"Each haem contains one FeΒ²βΊ ion that binds one Oβ molecule β each Hb carries 4 Oβ.",
S["body"]))
for item in [
"HbA (adult): 2Ξ± + 2Ξ² chains - 97% of adult Hb",
"HbAβ: 2Ξ± + 2Ξ΄ chains - 2.5% of adult Hb",
"HbF (fetal): 2Ξ± + 2Ξ³ chains - higher Oβ affinity than HbA",
"Oβ carrying capacity of blood = 1.34 mL Oβ per gram of Hb",
"Oxyhaemoglobin (HbOβ) = bright red; Deoxyhaemoglobin = dark red",
"Carbaminohaemoglobin = COβ carried on Hb (23% of COβ transport)",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("2.5 White Blood Cells (Leukocytes)", S["section_head"]))
elems.append(hr())
wbc = [
["WBC Type", "% of WBC", "Function"],
["Neutrophils", "60-70%", "Phagocytosis (first responders to bacterial infection)"],
["Eosinophils", "2-4%", "Allergic reactions; parasite defence"],
["Basophils", "0-1%", "Release histamine and heparin; allergic response"],
["Monocytes", "2-8%", "Become macrophages; phagocytosis, antigen presentation"],
["Lymphocytes", "20-30%", "B cells (antibody production); T cells (cell-mediated immunity)"],
]
elems.append(simple_table(wbc[0], wbc[1:], [4*cm, 3*cm, 9.5*cm]))
elems.append(Paragraph(
"<i>Mnemonic: Never Let Monkeys Eat Bananas = Neutrophils, Lymphocytes, Monocytes, Eosinophils, Basophils (most to least common)</i>",
S["note"]))
elems.append(Paragraph("2.6 Blood Groups", S["section_head"]))
elems.append(hr())
bg = [
["Blood Group", "Antigen on RBC", "Antibody in Plasma", "Can Donate To", "Can Receive From"],
["A", "A", "Anti-B", "A, AB", "A, O"],
["B", "B", "Anti-A", "B, AB", "B, O"],
["AB", "A and B", "None", "AB only", "A, B, AB, O (Universal Recipient)"],
["O", "None", "Anti-A & Anti-B", "A, B, AB, O (Universal Donor)", "O only"],
]
elems.append(simple_table(bg[0], bg[1:], [2.5*cm, 3*cm, 3.5*cm, 4*cm, 4.5*cm]))
elems.append(Paragraph(
"<b>Rh System:</b> Rh positive = has D antigen. Rh negative = no D antigen. "
"Significance: Erythroblastosis fetalis when Rh-ve mother carries Rh+ve fetus in 2nd+ pregnancy.",
S["body"]))
elems.append(Paragraph("2.7 Haemostasis & Coagulation", S["section_head"]))
elems.append(hr())
for item in [
"Haemostasis = stoppage of bleeding - involves 3 steps:",
" 1. Vascular spasm - immediate vasoconstriction at injury site",
" 2. Platelet plug formation - platelet adhesion (vWF) β activation β aggregation",
" 3. Coagulation cascade - fibrin mesh formation",
"Extrinsic pathway - triggered by tissue factor (TF/Factor III) - faster (seconds)",
"Intrinsic pathway - triggered by contact with damaged vessel (Factor XII) - slower",
"Both converge at Factor X β Prothrombin β Thrombin β Fibrinogen β Fibrin",
"Vitamin K required for Factors II, VII, IX, X (mnemonic: 1972)",
"Anticoagulants: Heparin (activates antithrombin III); Warfarin (inhibits Vit K)",
"PT (Prothrombin Time): tests extrinsic pathway; normal 11-13 sec",
"aPTT: tests intrinsic pathway; normal 25-35 sec",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(PageBreak())
return elems
def chapter_3():
"""Cardiovascular System"""
elems = []
elems.append(chapter_banner("Chapter 3: Cardiovascular System", HexColor("#B71C1C")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("3.1 Heart - Structure & Function", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"The heart is a hollow, muscular organ located in the mediastinum. "
"It has 4 chambers: 2 atria (receiving) and 2 ventricles (pumping). "
"Weight: ~250-300g in adults.",
S["body"]))
for item in [
"Right side: receives deoxygenated blood β pumps to lungs (pulmonary circulation)",
"Left side: receives oxygenated blood from lungs β pumps to body (systemic circulation)",
"Valves: Tricuspid (RAβRV), Pulmonary (RVβPA), Mitral/Bicuspid (LAβLV), Aortic (LVβAo)",
"Cardiac muscle = involuntary, striated, branched, connected by intercalated discs",
"Intercalated discs contain gap junctions β electrical coupling β functional syncytium",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("3.2 Cardiac Cycle", S["section_head"]))
elems.append(hr())
cycle = [
["Phase", "Duration", "Pressure/Volume Change", "Valves"],
["Isovolumetric Contraction", "0.05 sec", "LV pressure rises rapidly; volume constant", "All closed"],
["Rapid Ejection", "0.09 sec", "Blood ejected; LV pressure peaks (~120 mmHg)", "Aortic open"],
["Reduced Ejection", "0.13 sec", "Continued ejection at slowing rate", "Aortic open"],
["Isovolumetric Relaxation", "0.08 sec", "LV pressure falls; volume constant", "All closed"],
["Rapid Filling", "0.11 sec", "LV fills rapidly; volume rises fast", "Mitral open"],
["Reduced Filling (Diastasis)", "0.19 sec", "Slow filling; low pressure gradient", "Mitral open"],
["Atrial Systole", "0.11 sec", "Atrial contraction adds 20% more volume", "Mitral open"],
]
elems.append(simple_table(cycle[0], cycle[1:], [4*cm, 2.5*cm, 5.5*cm, 5*cm]))
elems.append(Paragraph(
"<i>Total cardiac cycle duration = 0.8 sec at HR 75 bpm. Systole = 0.3 sec; Diastole = 0.5 sec.</i>",
S["note"]))
elems.append(Paragraph("3.3 Cardiac Output (CO)", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"<b>CO = Stroke Volume (SV) Γ Heart Rate (HR)</b><br/>"
"Normal CO = 70 mL Γ 75 bpm = 5,250 mL/min β 5 L/min",
S["body"]))
for item in [
"Stroke Volume = End-Diastolic Volume (EDV) - End-Systolic Volume (ESV)",
"EDV (preload) β 120-130 mL; ESV β 50-60 mL; SV β 70 mL",
"Ejection Fraction (EF) = SV/EDV Γ 100 = normal 55-70%",
"Frank-Starling Law: β preload β β stretch of myocardium β β force of contraction",
"Afterload: resistance ventricle must overcome to eject blood (= aortic pressure for LV)",
"Contractility (Inotropy): intrinsic ability of cardiac muscle to develop force",
"Cardiac Index = CO / Body Surface Area = 2.5-4.0 L/min/mΒ²",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("3.4 Blood Pressure (BP)", S["section_head"]))
elems.append(hr())
bp_data = [
["Category", "Systolic (mmHg)", "Diastolic (mmHg)"],
["Normal", "< 120", "< 80"],
["Elevated", "120-129", "< 80"],
["Hypertension Stage 1", "130-139", "80-89"],
["Hypertension Stage 2", "β₯ 140", "β₯ 90"],
["Hypotension", "< 90", "< 60"],
]
elems.append(simple_table(bp_data[0], bp_data[1:], [5*cm, 5*cm, 5*cm]))
for item in [
"Pulse Pressure = Systolic - Diastolic = 120 - 80 = 40 mmHg",
"Mean Arterial Pressure (MAP) = Diastolic + 1/3 Pulse Pressure = 80 + 13 = 93 mmHg",
"MAP = CO Γ Total Peripheral Resistance (TPR)",
"Korotkoff sounds: Phase I (systolic BP) β Phase V (diastolic BP)",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("3.5 ECG (Electrocardiogram)", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"ECG records the electrical activity of the heart from the body surface.",
S["body"]))
ecg = [
["Wave/Interval", "Represents", "Normal Duration/Value"],
["P wave", "Atrial depolarisation (SA node β AV node)", "< 0.12 sec; < 0.25 mV"],
["PR interval", "AV conduction time", "0.12 - 0.20 sec"],
["QRS complex", "Ventricular depolarisation", "< 0.12 sec"],
["ST segment", "Plateau of ventricular AP", "Isoelectric (flat)"],
["T wave", "Ventricular repolarisation", "Upright in most leads"],
["QT interval", "Total ventricular systole", "< 0.44 sec (corrected)"],
]
elems.append(simple_table(ecg[0], ecg[1:], [3.5*cm, 7*cm, 6*cm]))
elems.append(Paragraph("3.6 Cardiac Conduction System", S["section_head"]))
elems.append(hr())
for item in [
"SA Node (Sinoatrial) β pace maker of the heart β 60-100 impulses/min",
"AV Node (Atrioventricular) β delays impulse by 0.1 sec (allows atrial filling)",
"Bundle of His β transmits to ventricles",
"Right & Left Bundle Branches β divide for each ventricle",
"Purkinje Fibres β rapid distribution to ventricular myocardium",
"Intrinsic rate: SA node 60-100; AV node 40-60; Purkinje 20-40 bpm",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(PageBreak())
return elems
def chapter_4():
"""Respiratory System"""
elems = []
elems.append(chapter_banner("Chapter 4: Respiratory System", HexColor("#1B5E20")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("4.1 Anatomy Overview", S["section_head"]))
elems.append(hr())
for item in [
"Upper airways: nose, nasopharynx, oropharynx, larynx",
"Lower airways: trachea β primary bronchi β secondary bronchi β tertiary β bronchioles β respiratory bronchioles β alveolar ducts β alveoli",
"Alveoli: ~300-500 million; total surface area ~70-80 mΒ²",
"Type I pneumocytes: gas exchange (thin, flat - 95% of surface)",
"Type II pneumocytes: produce surfactant, repair epithelium",
"Surfactant: dipalmitoyl phosphatidylcholine (DPPC); reduces surface tension, prevents alveolar collapse",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("4.2 Lung Volumes & Capacities", S["section_head"]))
elems.append(hr())
lung_vol = [
["Parameter", "Definition", "Normal Value"],
["Tidal Volume (TV)", "Air moved per normal breath", "500 mL"],
["Inspiratory Reserve Vol (IRV)", "Extra air inspired forcibly", "3,000 mL"],
["Expiratory Reserve Vol (ERV)", "Extra air expired forcibly", "1,100 mL"],
["Residual Volume (RV)", "Air remaining after max expiration", "1,200 mL"],
["Inspiratory Capacity (IC)", "TV + IRV", "3,500 mL"],
["Functional Residual Capacity (FRC)", "ERV + RV", "2,300 mL"],
["Vital Capacity (VC)", "TV + IRV + ERV", "4,600 mL"],
["Total Lung Capacity (TLC)", "VC + RV", "5,800 mL"],
["FEVβ", "Forced expiration in 1st second", ">80% of FVC"],
]
elems.append(simple_table(lung_vol[0], lung_vol[1:], [4.5*cm, 6*cm, 6*cm]))
elems.append(Paragraph("4.3 Mechanics of Breathing", S["section_head"]))
elems.append(hr())
for item in [
"Inspiration = active process; diaphragm contracts (descends 1.5 cm)",
"External intercostals contract β ribs elevate β thoracic volume β",
"Intrathoracic pressure falls below atmospheric β air flows IN",
"Expiration = passive at rest (elastic recoil of lungs)",
"Forced expiration uses internal intercostals, abdominal muscles",
"Compliance = change in volume per unit change in pressure (normal ~200 mL/cmHβO)",
"Airway resistance: mainly in medium bronchi; increases in asthma (bronchoconstriction)",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("4.4 Gas Exchange & Transport", S["section_head"]))
elems.append(hr())
gas_transport = [
["Gas", "Transport in Blood", "% of Total"],
["Oβ dissolved in plasma", "Henry's law", "1.5%"],
["Oβ bound to haemoglobin", "HbOβ", "98.5%"],
["COβ as bicarbonate (HCOββ»)", "Chloride shift (Band 3 protein)", "70%"],
["COβ as carbaminohaemoglobin", "Bound to Hb (globin chains)", "23%"],
["COβ dissolved in plasma", "Henry's law", "7%"],
]
elems.append(simple_table(gas_transport[0], gas_transport[1:], [5*cm, 6.5*cm, 5*cm]))
elems.append(Paragraph(
"<b>Chloride Shift (Hamburger Shift):</b> COβ β HβCOβ (carbonic anhydrase) β HβΊ + HCOββ». "
"HCOββ» exits RBC β Clβ» enters to maintain electrical neutrality.",
S["body"]))
elems.append(Paragraph("4.5 Regulation of Respiration", S["section_head"]))
elems.append(hr())
for item in [
"Respiratory centres in brainstem: Dorsal (DRG) and Ventral (VRG) respiratory groups in medulla",
"Pneumotaxic centre (upper pons): limits inspiration, controls rate",
"Apneustic centre (lower pons): prolongs inspiration",
"Central chemoreceptors (medulla): respond to HβΊ (from COβ); most powerful stimulus to breathe",
"Peripheral chemoreceptors (carotid & aortic bodies): respond to βPaOβ, βPaCOβ, βpH",
"Normal PaOβ = 95-100 mmHg; PaCOβ = 35-45 mmHg",
"Hering-Breuer reflex: stretch receptors in lungs β inhibit further inspiration (prevent over-inflation)",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(PageBreak())
return elems
def chapter_5():
"""Digestive System"""
elems = []
elems.append(chapter_banner("Chapter 5: Digestive System", HexColor("#4A148C")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("5.1 Overview of GI Tract", S["section_head"]))
elems.append(hr())
for item in [
"Mouth β Oesophagus β Stomach β Small intestine (duodenum, jejunum, ileum) β Large intestine β Rectum β Anus",
"Accessory organs: Salivary glands, Pancreas, Liver, Gallbladder",
"4 layers of GI wall: Mucosa, Submucosa, Muscularis externa, Serosa",
"Enteric Nervous System (ENS): Meissner's plexus (submucosa) & Auerbach's plexus (myenteric) - the 'gut brain'",
"Motility: Peristalsis (propulsion) and Segmentation (mixing)",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("5.2 Gastric Secretion", S["section_head"]))
elems.append(hr())
gastric = [
["Cell Type", "Location", "Secretion", "Function"],
["Chief cells", "Fundus/body", "Pepsinogen", "Converted to pepsin by HCl; digests protein"],
["Parietal cells", "Fundus/body", "HCl & Intrinsic factor", "Kills bacteria; activates pepsin; IF for B12 absorption"],
["G cells", "Antrum/pylorus", "Gastrin", "Stimulates parietal cells to secrete HCl"],
["Mucous neck cells", "Throughout", "Mucus", "Protects stomach wall"],
["Enterochromaffin-like (ECL) cells", "Fundus", "Histamine", "Stimulates acid secretion"],
]
elems.append(simple_table(gastric[0], gastric[1:], [4*cm, 3*cm, 3.5*cm, 6.5*cm]))
elems.append(Paragraph("5.3 Intestinal Digestion & Absorption", S["section_head"]))
elems.append(hr())
absorb = [
["Nutrient", "Site of Absorption", "Mechanism"],
["Glucose/Fructose", "Duodenum/Jejunum", "NaβΊ-glucose cotransport (SGLT1); GLUT5 for fructose"],
["Amino acids", "Jejunum", "NaβΊ-dependent cotransport"],
["Fatty acids/Glycerol", "Jejunum", "Diffusion; form chylomicrons β lymphatics"],
["Fat-soluble vit (A,D,E,K)", "Jejunum/Ileum", "Bile-dependent absorption"],
["Vitamin B12", "Terminal Ileum", "Requires Intrinsic Factor (IF)"],
["Iron (FeΒ²βΊ)", "Duodenum", "DMT1 transporter; enhanced by Vit C"],
["Calcium", "Duodenum", "Active transport; enhanced by Vit D & PTH"],
["Water", "Small & Large intestine", "Osmosis - follows solute absorption"],
]
elems.append(simple_table(absorb[0], absorb[1:], [4*cm, 4*cm, 8.5*cm]))
elems.append(Paragraph("5.4 Liver Functions", S["section_head"]))
elems.append(hr())
for item in [
"Metabolism: carbohydrate (glycogenesis, glycogenolysis, gluconeogenesis), protein (transamination, deamination, urea cycle), fat (fatty acid oxidation, ketogenesis, lipoprotein synthesis)",
"Bile production: 600-1000 mL/day; bile salts emulsify fats",
"Detoxification: cytochrome P450 enzymes; first-pass metabolism of drugs",
"Synthesis: albumin, clotting factors (fibrinogen, prothrombin), complement proteins",
"Storage: glycogen (glucose), Vit A, D, B12, iron (as ferritin)",
"Bilirubin metabolism: unconjugated (indirect) β conjugated (direct) β bile β gut β urobilinogen",
"Kupffer cells: resident macrophages in liver sinusoids",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(PageBreak())
return elems
def chapter_6():
"""Nervous System"""
elems = []
elems.append(chapter_banner("Chapter 6: Nervous System", HexColor("#1A237E")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("6.1 Organisation", S["section_head"]))
elems.append(hr())
for item in [
"Central Nervous System (CNS): Brain + Spinal cord",
"Peripheral Nervous System (PNS): Somatic (voluntary) + Autonomic (involuntary)",
"Autonomic NS: Sympathetic ('fight or flight') vs Parasympathetic ('rest and digest')",
"Neurons: Sensory (afferent) β CNS β Motor (efferent) β effector",
"Neuroglia: Astrocytes, Oligodendrocytes, Microglia, Ependymal cells (CNS); Schwann cells, Satellite cells (PNS)",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("6.2 Synaptic Transmission", S["section_head"]))
elems.append(hr())
for item in [
"AP arrives at presynaptic terminal β CaΒ²βΊ enters through voltage-gated channels",
"CaΒ²βΊ triggers exocytosis of neurotransmitter-containing vesicles",
"Neurotransmitter diffuses across synaptic cleft (20-40 nm)",
"Binds postsynaptic receptors β opens ion channels β EPSP or IPSP",
"EPSP (excitatory): depolarisation (NaβΊ in) β may trigger AP if threshold reached",
"IPSP (inhibitory): hyperpolarisation (KβΊ out or Clβ» in) β reduces firing",
"Spatial & temporal summation determine whether AP fires",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("6.3 Key Neurotransmitters", S["section_head"]))
elems.append(hr())
nt = [
["Neurotransmitter", "Type", "Location/Function"],
["Acetylcholine (ACh)", "Excitatory/Inhibitory", "NMJ, autonomic ganglia, parasympathetic effectors; CNS memory"],
["Dopamine", "Mostly inhibitory", "Substantia nigra (movement); reward pathway; decreased in Parkinson's"],
["Serotonin (5-HT)", "Mostly inhibitory", "Mood, sleep, appetite; decreased in depression"],
["Noradrenaline (NE)", "Excitatory", "Sympathetic NS; arousal, attention"],
["GABA", "Inhibitory", "Main inhibitory NT in brain; target of benzodiazepines"],
["Glutamate", "Excitatory", "Main excitatory NT in CNS; learning (NMDA receptors)"],
["Endorphins/Enkephalins", "Inhibitory", "Pain modulation; natural opioids"],
]
elems.append(simple_table(nt[0], nt[1:], [4*cm, 3*cm, 9.5*cm]))
elems.append(Paragraph("6.4 Autonomic Nervous System (ANS)", S["section_head"]))
elems.append(hr())
ans = [
["Feature", "Sympathetic", "Parasympathetic"],
["Origin", "Thoraco-lumbar (T1-L2)", "Cranio-sacral (CN III,VII,IX,X; S2-4)"],
["Preganglionic NT", "Acetylcholine", "Acetylcholine"],
["Postganglionic NT", "Noradrenaline (NE)", "Acetylcholine"],
["Heart rate", "Increases (βHR)", "Decreases (βHR)"],
["Pupils", "Dilates (mydriasis)", "Constricts (miosis)"],
["Bronchi", "Dilates", "Constricts"],
["GI motility", "Decreases", "Increases"],
["Bladder", "Relaxes (urinary retention)", "Contracts (micturition)"],
["Sweating", "Increases (cholinergic)", "No effect"],
["Adrenal medulla", "Releases adrenaline/NE", "No innervation"],
]
elems.append(simple_table(ans[0], ans[1:], [4.5*cm, 6*cm, 6*cm]))
elems.append(PageBreak())
return elems
def chapter_7():
"""Endocrine System"""
elems = []
elems.append(chapter_banner("Chapter 7: Endocrine System", HexColor("#E65100")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("7.1 Key Hormones Overview", S["section_head"]))
elems.append(hr())
hormones = [
["Gland", "Hormone", "Target", "Action"],
["Anterior Pituitary", "GH (Growth Hormone)", "Liver, all cells", "Growth; protein anabolism; β IGF-1"],
["Anterior Pituitary", "TSH", "Thyroid", "Stimulates T3/T4 synthesis"],
["Anterior Pituitary", "ACTH", "Adrenal cortex", "Stimulates cortisol, androgens"],
["Anterior Pituitary", "FSH/LH", "Gonads", "Gametogenesis & sex hormone production"],
["Posterior Pituitary", "ADH (Vasopressin)", "Kidney collecting duct", "Water reabsorption (β aquaporin 2)"],
["Posterior Pituitary", "Oxytocin", "Uterus, breast", "Labour contractions; milk ejection"],
["Thyroid", "T3/T4 (thyroxine)", "All cells", "β BMR, protein synthesis, growth, CNS maturation"],
["Thyroid", "Calcitonin", "Bone, kidney", "β blood calcium"],
["Parathyroid", "PTH", "Bone, kidney, GI", "β blood calcium (osteoclasts, Ca reabsorption, Vit D activation)"],
["Adrenal cortex", "Cortisol", "Widespread", "Stress hormone; β glucose; anti-inflammatory"],
["Adrenal cortex", "Aldosterone", "Kidney DCT", "NaβΊ retention, KβΊ excretion β β BP"],
["Adrenal medulla", "Adrenaline (Epinephrine)", "Widespread", "Fight/flight; βHR, βBP, βglucose"],
["Pancreas - Ξ² cells", "Insulin", "Liver, muscle, fat", "β blood glucose; anabolic"],
["Pancreas - Ξ± cells", "Glucagon", "Liver", "β blood glucose; catabolic"],
]
elems.append(simple_table(hormones[0], hormones[1:], [4*cm, 4*cm, 3.5*cm, 5*cm]))
elems.append(Paragraph("7.2 Glucose Regulation", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"Blood glucose is maintained between <b>70-100 mg/dL</b> (fasting) through a tight hormonal balance.",
S["body"]))
for item in [
"After a meal: β blood glucose β Ξ² cells release insulin β glucose enters cells β glycogenesis β glucose β to normal",
"Fasting/exercise: β blood glucose β Ξ± cells release glucagon β glycogenolysis + gluconeogenesis in liver β glucose β",
"Counter-regulatory hormones (against insulin): glucagon, adrenaline, cortisol, GH",
"Type 1 DM: absolute insulin deficiency (autoimmune destruction of Ξ² cells)",
"Type 2 DM: insulin resistance + relative insulin deficiency",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(PageBreak())
return elems
def chapter_8():
"""Renal Physiology"""
elems = []
elems.append(chapter_banner("Chapter 8: Renal Physiology", HexColor("#006064")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("8.1 Kidney Structure & Function", S["section_head"]))
elems.append(hr())
for item in [
"2 kidneys, each ~150g; located retroperitoneally at T12-L3",
"Functional unit = Nephron (~1 million per kidney)",
"Nephron parts: Glomerulus β Bowman's capsule β PCT β Loop of Henle β DCT β Collecting duct",
"Functions: Filtration, Reabsorption, Secretion, Excretion",
"Also: regulate blood pressure, acid-base balance, erythropoietin production, Vit D activation",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("8.2 GFR & Renal Clearance", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"GFR = Glomerular Filtration Rate = volume filtered by all glomeruli per minute. "
"Normal GFR = <b>125 mL/min</b> (180 L/day filtered; ~1.5 L/day urine produced).",
S["body"]))
for item in [
"GFR measured by inulin clearance (gold standard) or estimated by creatinine clearance",
"Filtration fraction = GFR / Renal Plasma Flow = 125/625 = ~20%",
"Starling forces across glomerular membrane determine GFR",
"Autoregulation: myogenic mechanism + tubuloglomerular feedback maintain GFR despite BP changes",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("8.3 Tubular Reabsorption Summary", S["section_head"]))
elems.append(hr())
tubular = [
["Segment", "What is Reabsorbed", "Key Mechanism"],
["PCT", "65% of NaβΊ, Clβ», KβΊ, HCOββ», glucose, amino acids, water", "NaβΊ/KβΊ ATPase; cotransporters"],
["Loop of Henle (descending)", "Water (25%)", "Impermeable to solutes"],
["Loop of Henle (ascending)", "NaβΊ, Clβ», KβΊ (25%) - NO water", "NKCC2 cotransporter (target of furosemide)"],
["DCT", "NaβΊ, Clβ» (5%)", "NCC cotransporter (target of thiazides)"],
["Collecting Duct", "NaβΊ (3%); HβO (ADH-dependent)", "ENaC (aldosterone); Aquaporin 2 (ADH)"],
]
elems.append(simple_table(tubular[0], tubular[1:], [4*cm, 7*cm, 5.5*cm]))
elems.append(PageBreak())
return elems
def chapter_9():
"""Muscle Physiology"""
elems = []
elems.append(chapter_banner("Chapter 9: Muscle Physiology", HexColor("#37474F")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("9.1 Types of Muscle", S["section_head"]))
elems.append(hr())
muscle_types = [
["Property", "Skeletal", "Cardiac", "Smooth"],
["Shape", "Long, cylindrical", "Branched", "Spindle-shaped"],
["Nuclei", "Multinucleate (periphery)", "1-2 (central)", "Single (central)"],
["Striations", "Yes", "Yes", "No"],
["Control", "Voluntary", "Involuntary (autorhythmic)", "Involuntary"],
["Speed", "Fast", "Moderate", "Slow"],
["Fatigue", "Yes (fast twitch)", "No (sustained)", "Slow fatigue"],
]
elems.append(simple_table(muscle_types[0], muscle_types[1:], [3.5*cm, 4.5*cm, 4.5*cm, 4*cm]))
elems.append(Paragraph("9.2 Sliding Filament Theory", S["section_head"]))
elems.append(hr())
elems.append(Paragraph(
"Muscle contraction occurs by <b>thick filaments (myosin)</b> pulling <b>thin filaments (actin)</b> toward the "
"centre of the sarcomere - the filaments themselves do not shorten.",
S["body"]))
for item in [
"Sarcomere: functional unit of striated muscle - Z line to Z line",
"At rest: tropomyosin blocks actin-myosin binding sites",
"AP arrives β T-tubule β SR releases CaΒ²βΊ",
"CaΒ²βΊ binds troponin C β tropomyosin moves β actin binding sites exposed",
"Myosin head binds actin β power stroke (ADP+Pi released) β filaments slide",
"ATP binds myosin β head detaches β ATP hydrolysis re-cocks the head",
"Relaxation: CaΒ²βΊ pumped back into SR (by SERCA) β troponin-tropomyosin covers actin again",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(key_point_box([
"Cross-bridge cycle: Attach β Power stroke β Detach β Re-cock",
"Rigor mortis: ATP depleted after death β myosin heads permanently attached to actin",
"Motor unit: one motor neuron + all muscle fibres it innervates",
"Neuromuscular junction (NMJ): ACh released β binds nicotinic receptors β EPP β AP β contraction",
], "Key Points - Muscle Contraction"))
elems.append(PageBreak())
return elems
def chapter_10():
"""Reproductive Physiology"""
elems = []
elems.append(chapter_banner("Chapter 10: Reproductive Physiology", HexColor("#880E4F")))
elems.append(Spacer(1, 0.4*cm))
elems.append(Paragraph("10.1 Male Reproductive Physiology", S["section_head"]))
elems.append(hr())
for item in [
"Testes: primary gonad; produce testosterone (Leydig cells) and spermatozoa (seminiferous tubules)",
"Spermatogenesis: begins at puberty; takes ~74 days; regulated by FSH (Sertoli cells) and LH (Leydig cells)",
"Testosterone: promotes spermatogenesis, secondary sex characteristics, anabolic effects",
"Sertoli cells: provide nourishment to developing spermatids; form blood-testis barrier; secrete inhibin (inhibits FSH)",
"Sperm: Head (acrosome - contains enzymes for penetrating ovum), Midpiece (mitochondria for energy), Tail (flagellum for motility)",
"Normal sperm count: β₯ 15 million/mL; motility β₯ 40%; morphology β₯ 4%",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
elems.append(Paragraph("10.2 Female Reproductive Physiology", S["section_head"]))
elems.append(hr())
for item in [
"Ovaries: produce oocytes and hormones (oestrogen, progesterone)",
"Menstrual cycle: average 28 days",
"Phase 1 (Days 1-5): Menstruation - shedding of endometrium",
"Phase 2 (Days 1-13): Follicular/Proliferative - FSH stimulates follicle growth β β oestrogen",
"Ovulation (Day 14): LH surge β release of secondary oocyte",
"Phase 3 (Days 15-28): Luteal/Secretory - corpus luteum β progesterone + oestrogen",
"If no fertilisation: corpus luteum degenerates β hormones fall β menstruation",
"Oestrogen: proliferates endometrium, develops female secondary sex characteristics",
"Progesterone: prepares endometrium for implantation, maintains pregnancy",
]:
elems.append(Paragraph(f"β’ {item}", S["bullet"]))
menstrual = [
["Day", "Phase", "Dominant Hormone", "Endometrium", "FSH/LH"],
["1-5", "Menstruation", "None (low)", "Shed", "FSH rising"],
["6-13", "Proliferative", "Oestrogen", "Thickens (proliferates)", "FSH high β LH surge"],
["14", "Ovulation", "LH surge", "Maximal thickness", "LH peak"],
["15-28", "Secretory", "Progesterone", "Secretory glands develop", "Both low"],
]
elems.append(simple_table(menstrual[0], menstrual[1:], [2*cm, 3*cm, 4*cm, 5*cm, 4.5*cm]))
elems.append(PageBreak())
return elems
def quick_reference():
"""Quick reference page with normal values"""
elems = []
elems.append(chapter_banner("Quick Reference: Normal Physiological Values", DARK_GREY))
elems.append(Spacer(1, 0.3*cm))
values = [
["Parameter", "Normal Range", "Unit"],
["Heart Rate", "60 - 100", "bpm"],
["Blood Pressure (Systolic/Diastolic)", "120 / 80", "mmHg"],
["Respiratory Rate", "12 - 20", "breaths/min"],
["Temperature (oral)", "36.5 - 37.5", "Β°C"],
["SpOβ", "95 - 100", "%"],
["Haemoglobin (Male/Female)", "13-17 / 12-15", "g/dL"],
["WBC count", "4,000 - 11,000", "/Β΅L"],
["Platelet count", "1,50,000 - 4,00,000", "/Β΅L"],
["Fasting blood glucose", "70 - 100", "mg/dL"],
["Serum NaβΊ", "136 - 145", "mEq/L"],
["Serum KβΊ", "3.5 - 5.0", "mEq/L"],
["Serum CaΒ²βΊ (total)", "8.5 - 10.5", "mg/dL"],
["Serum Clβ»", "98 - 107", "mEq/L"],
["pH (arterial blood)", "7.35 - 7.45", "β"],
["PaOβ", "80 - 100", "mmHg"],
["PaCOβ", "35 - 45", "mmHg"],
["Serum creatinine", "0.6 - 1.2", "mg/dL"],
["BUN (Blood Urea Nitrogen)", "7 - 20", "mg/dL"],
["GFR", "> 90 (CKD < 60)", "mL/min/1.73mΒ²"],
["Total serum protein", "6.0 - 8.3", "g/dL"],
["Albumin", "3.5 - 5.0", "g/dL"],
["Total bilirubin", "0.2 - 1.2", "mg/dL"],
["Tidal Volume", "500", "mL"],
["Vital Capacity (approx)", "4,600", "mL"],
["Cardiac Output", "4 - 8", "L/min"],
["Stroke Volume", "60 - 100", "mL"],
["Ejection Fraction", "55 - 70", "%"],
]
elems.append(simple_table(values[0], values[1:], [8*cm, 5.5*cm, 3*cm]))
return elems
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# BUILD PDF
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def build_pdf():
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2*cm,
title="BNYS 1st Year Physiology Study Notes",
author="Orris AI | MGR University",
subject="Human Physiology",
)
story = []
story += cover_page()
story += chapter_1()
story += chapter_2()
story += chapter_3()
story += chapter_4()
story += chapter_5()
story += chapter_6()
story += chapter_7()
story += chapter_8()
story += chapter_9()
story += chapter_10()
story += quick_reference()
doc.build(story)
print(f"PDF generated: {OUTPUT}")
if __name__ == "__main__":
build_pdf()
cd /home/daytona/workspace/bnys-physiology && python3 generate_notes.py 2>&1
ls -lh /home/daytona/workspace/bnys-physiology/BNYS_Physiology_Notes.pdf
BNYS Physiology Notes
PDF Document Β· PDF
| Chapter | Topic |
|---|---|
| 1 | Cell Physiology - cell structure, membrane transport, action potential |
| 2 | Blood & Hematology - RBC/WBC values, Hb, blood groups, coagulation |
| 3 | Cardiovascular System - cardiac cycle, CO, BP, ECG, conduction |
| 4 | Respiratory System - lung volumes, gas exchange, breathing regulation |
| 5 | Digestive System - GI secretions, absorption, liver functions |
| 6 | Nervous System - synaptic transmission, neurotransmitters, ANS |
| 7 | Endocrine System - all major hormones, glucose regulation |
| 8 | Renal Physiology - GFR, nephron, tubular reabsorption |
| 9 | Muscle Physiology - sliding filament theory, NMJ |
| 10 | Reproductive Physiology - menstrual cycle, spermatogenesis |
| + | Quick Reference: all normal values in one table |
Babinski Sign Benefits of Pain Sensation Audiometry Dichromatism Infertility Oligozoospermia Osteoporosis Functions of Rods and Cones Optic Chiasma Composition of Semen Give answer 2m according to physiology by K. sembulingam
- Ganong's Review of Medical Physiology, 26th Ed.
| Type | Principle | Measures |
|---|---|---|
| Pure tone audiometry | Air & bone conduction tested with audiometer | Threshold at each frequency (250-8000 Hz) |
| Speech audiometry | Uses spoken words | Speech discrimination/understanding |
| Impedance audiometry | Tympanometry | Middle ear function, stapedial reflexes |
| Brainstem Evoked Response (BERA) | Electrical potentials | Objective, used in infants/unconscious |
| Type | Missing Cone | Cannot Distinguish |
|---|---|---|
| Protanopia | Red cones (L-cones) | Red-green confusion |
| Deuteranopia | Green cones (M-cones) | Red-green confusion |
| Tritanopia | Blue cones (S-cones) | Blue-yellow confusion |
- Ganong's Review of Medical Physiology, 26th Ed.
| Feature | Rods | Cones |
|---|---|---|
| Light threshold | Low (sensitive) | High (less sensitive) |
| Vision type | Scotopic (dim/night vision) | Photopic (bright/day vision) |
| Colour vision | No (monochromatic) | Yes (trichromatic) |
| Visual acuity | Low | High |
| Location | Peripheral retina | Concentrated in fovea/macula |
| Photopigment | Rhodopsin (visual purple) | 3 iodopsins (R/G/B) |
| Dark adaptation | Slow (30 min) | Fast (7 min) |
- Costanzo Physiology 7th Ed.; Ganong's 26th Ed.
| Fibre Origin | Behaviour at Chiasma | Destination |
|---|---|---|
| Nasal retina (temporal visual field) | Crosses to opposite side | Contralateral optic tract |
| Temporal retina (nasal visual field) | Does NOT cross (stays ipsilateral) | Ipsilateral optic tract |
- Costanzo Physiology 7th Ed., p. 91
| Gland | Contribution (%) | Key Components |
|---|---|---|
| Seminal vesicles | 60% | Fructose (energy for sperm), prostaglandins, phosphorylcholine, ascorbic acid, flavins |
| Prostate gland | 20% | Citric acid, zinc, acid phosphatase, fibrinolysin, cholesterol, phospholipids |
| Bulbourethral (Cowper's) glands | ~5% | Mucus, alkaline secretion (lubricant) |
| Epididymis/testes | ~15% | Spermatozoa, fluid |
- Ganong's Review of Medical Physiology, 26th Ed., Table 23-1