ascending and descending tracts of cerebellum pe ek seminar ready kro jo mujhe kak meri class mai present krna h aur sirf ak jain gk pal ya guytin ke basis pe bana na seminar
mkdir -p /home/daytona/workspace/cerebellum-seminar && ls /home/daytona/workspac…
~/cerebellum-seminar/build_seminar.py
#!/usr/bin/env python3
"""
Build Seminar PDF: Ascending and Descending Tracts of Cerebellum
Based on: Guyton & Hall (Physiology), GK Pal, AK Jain
For MBBS 1st Year Physiology
"""
import requests
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, Image, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.lib.utils import ImageReader
from io import BytesIO
OUTPUT = "/home/daytona/workspace/cerebellum-seminar/Cerebellar_Tracts_Seminar.pdf"
# ──────────────────────────────────────────────
# Download images from Guyton
# ──────────────────────────────────────────────
def download_image(url):
try:
resp = requests.get(url, timeout=15)
if resp.status_code == 200:
return BytesIO(resp.content)
except Exception as e:
print(f"Image download failed: {e}")
return None
IMG_AFFERENT = "https://cdn.orris.care/cdss_images/5a195f6aa767a37799015d286e5fb5e3dddc264827d2816f5a5fba81eeb54994.png"
IMG_EFFERENT = "https://cdn.orris.care/cdss_images/4949f2ef3ae284085467d86f94c44739b401953ca23a40b8600ea790d3168cbe.png"
# ──────────────────────────────────────────────
# Styles
# ──────────────────────────────────────────────
styles = getSampleStyleSheet()
DEEP_BLUE = colors.HexColor("#1a3a5c")
MID_BLUE = colors.HexColor("#2c6fad")
LIGHT_BLUE = colors.HexColor("#d6e8f7")
ACCENT = colors.HexColor("#e07b39")
LIGHT_GREEN = colors.HexColor("#dff0d8")
LIGHT_YELLOW= colors.HexColor("#fff8dc")
WHITE = colors.white
GREY = colors.HexColor("#f2f2f2")
title_style = ParagraphStyle(
"Title", parent=styles["Normal"],
fontSize=22, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER, spaceAfter=4
)
subtitle_style = ParagraphStyle(
"Subtitle", parent=styles["Normal"],
fontSize=13, fontName="Helvetica",
textColor=colors.HexColor("#cce0f5"), alignment=TA_CENTER, spaceAfter=2
)
h1_style = ParagraphStyle(
"H1", parent=styles["Normal"],
fontSize=16, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_LEFT,
spaceBefore=10, spaceAfter=6, leftIndent=0
)
h2_style = ParagraphStyle(
"H2", parent=styles["Normal"],
fontSize=13, fontName="Helvetica-Bold",
textColor=DEEP_BLUE, spaceBefore=8, spaceAfter=4
)
h3_style = ParagraphStyle(
"H3", parent=styles["Normal"],
fontSize=11, fontName="Helvetica-Bold",
textColor=MID_BLUE, spaceBefore=6, spaceAfter=3
)
body_style = ParagraphStyle(
"Body", parent=styles["Normal"],
fontSize=10, fontName="Helvetica",
textColor=colors.black, leading=15,
spaceAfter=4, alignment=TA_JUSTIFY
)
bullet_style = ParagraphStyle(
"Bullet", parent=styles["Normal"],
fontSize=10, fontName="Helvetica",
textColor=colors.black, leading=14,
leftIndent=18, spaceAfter=3,
bulletIndent=6
)
caption_style = ParagraphStyle(
"Caption", parent=styles["Normal"],
fontSize=8.5, fontName="Helvetica-Oblique",
textColor=colors.grey, alignment=TA_CENTER, spaceAfter=6
)
ref_style = ParagraphStyle(
"Ref", parent=styles["Normal"],
fontSize=9, fontName="Helvetica-Oblique",
textColor=colors.HexColor("#555555"), leading=13
)
important_style = ParagraphStyle(
"Important", parent=styles["Normal"],
fontSize=10, fontName="Helvetica-Bold",
textColor=DEEP_BLUE, leading=14,
leftIndent=10, spaceAfter=3
)
def section_header(text, style=h1_style, bg=DEEP_BLUE):
"""Colored section header block."""
table = Table([[Paragraph(text, style)]], colWidths=[17*cm])
table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROUNDEDCORNERS", [5,5,5,5]),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
return table
def info_box(title, content_paras, bg=LIGHT_BLUE, border=MID_BLUE):
"""Colored info box."""
inner = [[Paragraph(f"<b>{title}</b>", h3_style)]]
for p in content_paras:
inner.append([p])
t = Table(inner, colWidths=[16.2*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.5, border),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
return t
def two_col_table(headers, rows, col_widths, header_bg=MID_BLUE):
data = [[Paragraph(f"<b><font color='white'>{h}</font></b>", ParagraphStyle("th", fontSize=10, fontName="Helvetica-Bold", alignment=TA_CENTER)) for h in headers]]
for row in rows:
data.append([Paragraph(str(c), body_style) for c in row])
t = Table(data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), header_bg),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY]),
("BOX", (0,0), (-1,-1), 1, MID_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
# ──────────────────────────────────────────────
# Build document
# ──────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
topMargin=1.8*cm, bottomMargin=2*cm,
leftMargin=2*cm, rightMargin=2*cm,
title="Ascending and Descending Tracts of Cerebellum",
author="MBBS Seminar Presentation"
)
story = []
W = 17*cm # usable width
# ═══════════════════════════════════════════════════════════════
# COVER PAGE
# ═══════════════════════════════════════════════════════════════
cover_table = Table([[""]], colWidths=[W], rowHeights=[26*cm])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DEEP_BLUE),
]))
story.append(cover_table)
# Overlay text via absolute positioning — use a separate table approach
story.pop() # remove blank table, use a styled block instead
cover_content = [
Spacer(1, 1.5*cm),
Paragraph("MBBS 1st Year — Physiology Seminar", subtitle_style),
Spacer(1, 0.5*cm),
Paragraph("Ascending & Descending", title_style),
Paragraph("Tracts of the Cerebellum", title_style),
Spacer(1, 0.4*cm),
Paragraph("─────────────────────────────────", ParagraphStyle("sep", fontSize=11, textColor=colors.HexColor("#5a8fc4"), alignment=TA_CENTER)),
Spacer(1, 0.3*cm),
Paragraph("Based on: Guyton & Hall | GK Pal | AK Jain", subtitle_style),
Spacer(1, 1.2*cm),
]
cover_bg = Table(
[[c] for c in cover_content],
colWidths=[W]
)
cover_bg.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DEEP_BLUE),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
]))
story.append(cover_bg)
story.append(Spacer(1, 0.3*cm))
# Institute / submitted by block
info_data = [
[Paragraph("<b>Department of Physiology</b>", ParagraphStyle("info", fontSize=11, fontName="Helvetica-Bold", textColor=DEEP_BLUE, alignment=TA_CENTER))],
[Paragraph("MBBS 1st Year", ParagraphStyle("info2", fontSize=10, fontName="Helvetica", textColor=colors.HexColor("#333333"), alignment=TA_CENTER))],
[Paragraph("Seminar Presentation", ParagraphStyle("info3", fontSize=10, fontName="Helvetica-Oblique", textColor=colors.grey, alignment=TA_CENTER))],
]
info_cover = Table(info_data, colWidths=[W])
info_cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
("BOX", (0,0), (-1,-1), 1.5, MID_BLUE),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
]))
story.append(info_cover)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 2: CONTENTS / OVERVIEW
# ═══════════════════════════════════════════════════════════════
story.append(section_header("📋 Contents at a Glance"))
story.append(Spacer(1, 0.3*cm))
contents = [
["1.", "Introduction to the Cerebellum"],
["2.", "Anatomy & Lobes of the Cerebellum"],
["3.", "Cerebellar Cortex — Layers & Cells"],
["4.", "Deep Cerebellar Nuclei"],
["5.", "ASCENDING TRACTS (Afferent Pathways)"],
["6.", " 5a. Dorsal Spinocerebellar Tract (DSCT)"],
["7.", " 5b. Ventral Spinocerebellar Tract (VSCT)"],
["8.", " 5c. Cuneocerebellar Tract"],
["9.", " 5d. Corticopontocerebellar Pathway"],
["10.", " 5e. Olivocerebellar Tract"],
["11.", " 5f. Vestibulocerebellar Tract"],
["12.", " 5g. Reticulocerebellar Tract"],
["13.", "DESCENDING TRACTS (Efferent Pathways)"],
["14.", " 6a. Cerebellothalamocortical Tract"],
["15.", " 6b. Fastigioreticular & Fastigiovestibular Tracts"],
["16.", " 6c. Dentatorubral Tract"],
["17.", "Cerebellar Peduncles — Summary Table"],
["18.", "Functional Divisions (Archic / Paleo / Neocerebellum)"],
["19.", "Clinical Correlations"],
["20.", "Quick Revision — Important Points"],
]
cont_table_data = [[Paragraph(n, body_style), Paragraph(t, body_style)] for n,t in contents]
cont_table = Table(cont_table_data, colWidths=[1*cm, 16*cm])
cont_table.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0), (-1,-1), [WHITE, GREY]),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
]))
story.append(cont_table)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 3: INTRODUCTION
# ═══════════════════════════════════════════════════════════════
story.append(section_header("1. Introduction to the Cerebellum"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"The cerebellum (Latin: 'little brain') is a foliated, multi-lobed structure attached to the dorsal brainstem, "
"lying posterior to the pons and medulla, and below the tentorium cerebelli. Though it contains more neurons "
"than the entire rest of the brain, it accounts for only about 10% of total brain mass — yet its surface area "
"is approximately 75% of that of the cerebral cortex (Guyton & Hall).",
body_style
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Functions (GK Pal / AK Jain):</b>", h3_style))
functions = [
"Coordination of voluntary movements (synergy)",
"Regulation of muscle tone (hypotonia on damage)",
"Maintenance of equilibrium and posture",
"Planning and execution of movements (neocerebellum)",
"Coordination of head and eye movements",
"Error-correction in ongoing movement (comparator function)"
]
for f in functions:
story.append(Paragraph(f"• {f}", bullet_style))
story.append(Spacer(1, 0.3*cm))
story.append(info_box(
"Key Concept — The Comparator",
[Paragraph(
"The cerebellum acts as a <b>comparator</b>: it continuously compares the intended movement "
"(from cortex) with the actual movement (from proprioceptors) and corrects any error via "
"efferent output. It works subconsciously and does not initiate movement.",
body_style
)],
bg=LIGHT_YELLOW, border=ACCENT
))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 4: ANATOMY & LOBES
# ═══════════════════════════════════════════════════════════════
story.append(section_header("2. Anatomy and Lobes"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"The cerebellum is divided by the <b>primary fissure</b> and <b>posterolateral fissure</b> into three lobes:",
body_style
))
lobe_data = [
["Lobe", "Fissure Boundary", "Also Called", "Function"],
["Anterior lobe", "Anterior to primary fissure", "Paleocerebellum / Spinocerebellum", "Muscle tone, posture, gait"],
["Posterior lobe", "Between primary & posterolateral fissure", "Neocerebellum / Pontocerebellum", "Fine coordination of limb movements"],
["Flocculonodular lobe", "Posterior to posterolateral fissure", "Archicerebellum / Vestibulocerebellum", "Equilibrium, vestibular function"],
]
lobe_table = two_col_table(
lobe_data[0], lobe_data[1:],
[3.5*cm, 4.5*cm, 4.5*cm, 4.5*cm]
)
story.append(lobe_table)
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("<b>Cortical Regions (Mediolateral):</b>", h3_style))
med_data = [
["Region", "Deep Nucleus", "Main Connection", "Function"],
["Vermis (midline)", "Fastigial nucleus", "Vestibular, reticular nuclei (ICP)", "Truncal balance, gait"],
["Intermediate zone", "Interposed (globose + emboliform)", "Red nucleus, cortex (SCP)", "Distal limb movement"],
["Lateral hemisphere", "Dentate nucleus", "Cortex via thalamus (SCP)", "Planning, fine movement"],
]
story.append(two_col_table(med_data[0], med_data[1:], [3.5*cm, 3.5*cm, 4.5*cm, 5.5*cm]))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"<b>Three pairs of Cerebellar Peduncles</b> connect the cerebellum to the brainstem and are "
"the gateways for all ascending and descending tracts:",
body_style
))
ped_data = [
["Peduncle", "Position", "Main Tracts Carried"],
["Inferior Cerebellar Peduncle (ICP)\n= Restiform body", "Medullary level", "DSCT (in), Cuneocerebellar (in), Olivocerebellar (in), Vestibulocerebellar (in/out), Reticulocerebellar (in)"],
["Middle Cerebellar Peduncle (MCP)\n= Brachium pontis", "Pontine level", "Pontocerebellar (in) — ONLY afferent peduncle"],
["Superior Cerebellar Peduncle (SCP)\n= Brachium conjunctivum", "Midbrain level", "VSCT (in), Main EFFERENT output — dentatorubrothalamic"],
]
story.append(two_col_table(ped_data[0], ped_data[1:], [4*cm, 3*cm, 10*cm]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 5: CEREBELLAR CORTEX
# ═══════════════════════════════════════════════════════════════
story.append(section_header("3. Cerebellar Cortex — Layers and Cells"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"The cerebellar cortex has <b>three layers</b> (from outside in):",
body_style
))
layers = [
["Layer", "Cell Types Present", "Key Features"],
["Molecular layer\n(outer)", "Stellate cells, Basket cells, dendrites of Purkinje cells, axons of granule cells (parallel fibers)", "Parallel fibers run perpendicular to Purkinje dendrites; basket cells form inhibitory basket around Purkinje cell bodies"],
["Purkinje cell layer\n(middle)", "Purkinje cells only (single row)", "Largest neurons in CNS; ONLY OUTPUT of cerebellar cortex; inhibitory (GABA) to deep nuclei"],
["Granular layer\n(inner)", "Granule cells (most numerous), Golgi cells", "Receive mossy fiber input; granule cell axons → parallel fibers; ~500-1000 granule cells per Purkinje cell"],
]
story.append(two_col_table(layers[0], layers[1:], [3.5*cm, 6.5*cm, 7*cm]))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("<b>Two types of afferent fibers to the cortex:</b>", h3_style))
fiber_points = [
"<b>Mossy fibers</b> — from all sources EXCEPT inferior olive. Enter via ICP & MCP. Synapse on granule cells. Cause 'simple spikes' in Purkinje cells.",
"<b>Climbing fibers</b> — ONLY from inferior olivary nucleus (contralateral). Each fiber climbs and wraps around ONE Purkinje cell (1:1 ratio). Causes prolonged 'complex spikes'. Enter via ICP."
]
for f in fiber_points:
story.append(Paragraph(f"• {f}", bullet_style))
story.append(Spacer(1, 0.3*cm))
story.append(section_header("4. Deep Cerebellar Nuclei", h1_style, MID_BLUE))
story.append(Spacer(1, 0.3*cm))
dcn_data = [
["Nucleus", "Location", "Receives from", "Projects to", "Mnemonic"],
["Dentate", "Lateral", "Lateral hemisphere", "VL thalamus → cortex\nRed nucleus (contralateral)", "D for Distal / 'Don't forget Dentate'"],
["Emboliform", "Medial to dentate", "Intermediate zone", "Red nucleus, thalamus", ""],
["Globose", "Medial to emboliform", "Intermediate zone", "Red nucleus, thalamus", "E + G = Interposed"],
["Fastigial", "Most medial (near vermis)", "Vermis", "Vestibular nuclei\nReticular formation", "'Fastigial = Fast equilibrium'"],
]
story.append(two_col_table(dcn_data[0], dcn_data[1:], [2.5*cm, 2.5*cm, 3*cm, 4*cm, 5*cm]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 6: ASCENDING TRACTS OVERVIEW + DSCT
# ═══════════════════════════════════════════════════════════════
story.append(section_header("5. Ascending Tracts (Afferent Pathways to Cerebellum)"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"The cerebellum receives afferent inputs from the spinal cord, brainstem, cerebral cortex, "
"vestibular apparatus, and reticular formation. These are the <b>ascending (afferent) tracts</b>. "
"They carry sensory, motor-command, and balance information that the cerebellum uses to "
"coordinate and fine-tune movement.",
body_style
))
story.append(Spacer(1, 0.3*cm))
# -- DSCT --
story.append(Paragraph("5a. Dorsal Spinocerebellar Tract (DSCT)", h2_style))
dsct_content = [
Paragraph("Also called: Posterior spinocerebellar tract | <b>Flechsig's tract</b>", body_style),
Paragraph("<b>Origin:</b> Nucleus dorsalis of Clarke (Clarke's column) — C8 to L2/L3 of spinal cord (lamina VII)", body_style),
Paragraph("<b>Receptor input:</b> Muscle spindles, Golgi tendon organs, large joint receptors, large cutaneous tactile receptors of the LOWER LIMB", body_style),
Paragraph("<b>Decussation:</b> DOES NOT cross — IPSILATERAL throughout", body_style),
Paragraph("<b>Course:</b> Ascends in dorsolateral funiculus of spinal cord → Inferior Cerebellar Peduncle (ICP) → Terminates in ipsilateral vermis and intermediate zone", body_style),
Paragraph("<b>Peduncle:</b> Inferior Cerebellar Peduncle (ICP / Restiform body)", body_style),
Paragraph("<b>Information carried:</b> Unconscious proprioception — static limb position, rate of movement, muscle tension (lower limb)", body_style),
Paragraph("<b>Conduction velocity:</b> Up to 120 m/sec — fastest in CNS (Guyton)", body_style),
]
story.append(info_box("DSCT — Key Facts", dsct_content, bg=LIGHT_BLUE, border=MID_BLUE))
story.append(Spacer(1, 0.3*cm))
# -- VSCT --
story.append(Paragraph("5b. Ventral Spinocerebellar Tract (VSCT)", h2_style))
vsct_content = [
Paragraph("Also called: Anterior spinocerebellar tract | <b>Gowers' tract</b>", body_style),
Paragraph("<b>Origin:</b> Spinal border cells — anterior horn neurons and interneurons at L2 and below", body_style),
Paragraph("<b>Receptor input:</b> Motor signals from corticospinal & rubrospinal tracts + internal motor pattern generators (NOT direct proprioceptors)", body_style),
Paragraph("<b>Decussation:</b> DOUBLE CROSSING — crosses in spinal cord, then recrosses in cerebellum. Net result: ipsilateral.", body_style),
Paragraph("<b>Course:</b> Ascends in ventrolateral funiculus → passes medulla and pons → Superior Cerebellar Peduncle (SCP) → both sides of cerebellum", body_style),
Paragraph("<b>Peduncle:</b> Superior Cerebellar Peduncle (SCP / Brachium conjunctivum)", body_style),
Paragraph("<b>Information carried:</b> Motor commands arriving at the anterior horn — 'which motor signals have arrived' (Guyton)", body_style),
]
story.append(info_box("VSCT — Key Facts", vsct_content, bg=colors.HexColor("#e8f5e9"), border=colors.HexColor("#388e3c")))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 7: MORE ASCENDING TRACTS
# ═══════════════════════════════════════════════════════════════
story.append(section_header("5. Ascending Tracts (continued)"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("5c. Cuneocerebellar Tract", h2_style))
story.append(Paragraph(
"Equivalent to DSCT but for the <b>upper limb</b>. "
"Origin: External (accessory) cuneate nucleus in the medulla (receives proprioceptive input from C1-T1 dorsal columns). "
"It does NOT relay through Clarke's column (which only extends to C8). "
"Course: ICP → ipsilateral cerebellar cortex. "
"Carries: Unconscious proprioception from the arm and hand.",
body_style
))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("5d. Rostral Spinocerebellar Tract", h2_style))
story.append(Paragraph(
"Equivalent to VSCT for the <b>upper limb</b>. "
"Origin: Anterior horn interneurons at cervical levels. "
"Course: Via both superior and inferior cerebellar peduncles. "
"Carries: Motor command information for the arm.",
body_style
))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("5e. Corticopontocerebellar Pathway (Pontocerebellar Tract)", h2_style))
story.append(Paragraph(
"<b>Largest afferent pathway to the cerebellum.</b> "
"Origin: Cerebral motor cortex, premotor cortex, somatosensory cortex → "
"internal capsule → cerebral peduncles → pontine nuclei (synapse) → "
"pontocerebellar fibers cross midline → "
"Middle Cerebellar Peduncle (MCP) → contralateral lateral cerebellar hemisphere (neocerebellum). "
"Carries: Cortical motor plans (what movement is intended).",
body_style
))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("5f. Olivocerebellar Tract", h2_style))
story.append(Paragraph(
"Origin: Inferior olivary nucleus (medulla). Receives inputs from: cerebral motor cortex, basal ganglia, "
"brainstem reticular formation, and spinal cord. "
"Fibers cross the midline and enter via ICP. "
"These are the only source of <b>climbing fibers</b>. "
"Terminates throughout all cerebellar cortex (all parts). "
"Function: Error-signal input — encodes 'unexpected' sensory events and motor errors.",
body_style
))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("5g. Vestibulocerebellar Tract", h2_style))
story.append(Paragraph(
"Origin: (1) Direct: vestibular apparatus (semicircular canals, utricle, saccule) via CN VIII; "
"(2) Indirect: vestibular nuclei of brainstem. "
"Course: ICP (via juxtarestiform body). "
"Terminates: Flocculonodular lobe (nodulus and flocculus) and fastigial nucleus — the <b>vestibulocerebellum</b>. "
"Function: Balance, equilibrium, vestibulo-ocular reflex.",
body_style
))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("5h. Reticulocerebellar Tract", h2_style))
story.append(Paragraph(
"Origin: Reticular formation of brainstem (pons and medulla). "
"Course: ICP. "
"Terminates: Midline areas — vermis and adjacent regions. "
"Function: Modulates cerebellar activity based on brainstem arousal states.",
body_style
))
story.append(Spacer(1, 0.4*cm))
# Summary table afferent
story.append(Paragraph("<b>Summary Table — Ascending (Afferent) Tracts</b>", h2_style))
aff_data = [
["Tract", "Origin", "Peduncle", "Terminates in", "Carries"],
["DSCT (Flechsig's)", "Clarke's column C8-L3", "ICP", "Vermis + intermediate zone (ipsi)", "Lower limb proprioception (unconscious)"],
["VSCT (Gowers')", "Spinal border cells L2+", "SCP", "Both sides cerebellum", "Motor commands to ant. horn (lower limb)"],
["Cuneocerebellar", "Ext. cuneate nucleus (medulla)", "ICP", "Ipsilateral cortex", "Upper limb proprioception (unconscious)"],
["Rostral spinocerebellar", "Cervical ant. horn interneurons", "SCP + ICP", "Ipsilateral cortex", "Motor commands (upper limb)"],
["Pontocerebellar", "Pontine nuclei (from cortex)", "MCP", "Contralateral lat. hemisphere", "Cortical motor plans"],
["Olivocerebellar", "Inferior olivary nucleus", "ICP", "All parts (climbing fibers)", "Error signals"],
["Vestibulocerebellar", "Vestibular nucleus / CN VIII", "ICP (juxtarestiform)", "Flocculonodular lobe + fastigial", "Balance / equilibrium"],
["Reticulocerebellar", "Reticular formation", "ICP", "Vermis", "Brainstem arousal"],
]
story.append(two_col_table(aff_data[0], aff_data[1:], [3.5*cm, 3.5*cm, 2.5*cm, 3.5*cm, 4*cm]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 8: AFFERENT DIAGRAM FROM GUYTON
# ═══════════════════════════════════════════════════════════════
story.append(section_header("Figure 1 — Spinocerebellar Afferent Tracts (Guyton & Hall)"))
story.append(Spacer(1, 0.3*cm))
img_aff_data = download_image(IMG_AFFERENT)
if img_aff_data:
img_aff = Image(img_aff_data, width=11*cm, height=14*cm)
story.append(img_aff)
story.append(Paragraph(
"Figure 57.5 from Guyton & Hall Textbook of Medical Physiology — "
"Dorsal (DSCT) and Ventral (VSCT) spinocerebellar tracts showing Clark cells, "
"dorsolateral funiculus, inferior and superior cerebellar peduncles.",
caption_style
))
else:
story.append(Paragraph("[Figure: Spinocerebellar tracts diagram — Guyton Fig 57.5]", caption_style))
story.append(Spacer(1, 0.4*cm))
story.append(info_box(
"Mnemonics for Afferent Tracts",
[
Paragraph("• <b>DSCT = 'Don't Cross'</b> — ipsilateral, no crossing", bullet_style),
Paragraph("• <b>VSCT = 'Twice Crossed'</b> — crosses in cord, recrosses in cerebellum", bullet_style),
Paragraph("• <b>Peduncle rule:</b> DSCT (D for Down → ICP), VSCT (V for Very Superior → SCP), MCP = Middle = Massive cortical input", bullet_style),
Paragraph("• <b>ICP = In-Coming Proprioception</b> (carries most afferents)", bullet_style),
Paragraph("• <b>SCP = Sending output Cerebellar Projection</b> (main efferent + VSCT)", bullet_style),
],
bg=LIGHT_YELLOW, border=ACCENT
))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 9: DESCENDING (EFFERENT) TRACTS
# ═══════════════════════════════════════════════════════════════
story.append(section_header("6. Descending Tracts (Efferent Pathways from Cerebellum)"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"All efferent output from the cerebellar <b>cortex</b> is inhibitory (Purkinje cell axons — GABA). "
"However, the Purkinje cells project to the <b>deep cerebellar nuclei</b>, and it is from these nuclei "
"that the true efferent projections to the rest of the brain arise (excitatory). "
"Three major efferent pathways exist (Guyton, Fig. 57.6):",
body_style
))
story.append(Spacer(1, 0.3*cm))
# Efferent pathway 1
story.append(Paragraph("6a. Cerebellothalamocortical Tract (Dentatorubrothalamic Tract)", h2_style))
eff1 = [
Paragraph("<b>Origin:</b> Lateral cerebellar hemisphere (neocerebellum)", body_style),
Paragraph("<b>Deep nucleus:</b> Dentate nucleus", body_style),
Paragraph("<b>Course:</b> Dentate nucleus → SCP → Decussates in pons/midbrain (decussation of SCP) → "
"Contralateral red nucleus (midbrain) → Ventrolateral (VL) nucleus of thalamus → "
"Motor cortex (Area 4) + premotor cortex", body_style),
Paragraph("<b>Peduncle:</b> Superior Cerebellar Peduncle (SCP)", body_style),
Paragraph("<b>Function:</b> Fine coordination of distal limb movements — fingers, hands, thumbs. "
"Coordinate agonist/antagonist reciprocal contractions.", body_style),
Paragraph("<b>Note:</b> Also projects to basal ganglia. Dentate → Red nucleus → Rubrospinal tract as secondary branch.", body_style),
]
story.append(info_box("Dentatorubrothalamic Tract", eff1, bg=colors.HexColor("#fce4ec"), border=colors.HexColor("#c62828")))
story.append(Spacer(1, 0.3*cm))
# Efferent pathway 2
story.append(Paragraph("6b. Fastigioreticular & Fastigiovestibular Tracts", h2_style))
eff2 = [
Paragraph("<b>Origin:</b> Medial vermis", body_style),
Paragraph("<b>Deep nucleus:</b> Fastigial nucleus", body_style),
Paragraph("<b>Course:</b> Fastigial nucleus → ICP → Vestibular nuclei (lateral & medial) "
"→ Vestibulospinal tract → spinal cord", body_style),
Paragraph("<b>Also:</b> Fastigial → Reticular formation → Reticulospinal tract", body_style),
Paragraph("<b>Peduncle:</b> Inferior Cerebellar Peduncle (ICP) — via juxtarestiform body", body_style),
Paragraph("<b>Function:</b> Control of equilibrium, posture, axial muscles, gait. Tone of truncal and proximal limb muscles.", body_style),
]
story.append(info_box("Fastigiovestibular & Fastigioreticular Tracts", eff2, bg=LIGHT_BLUE, border=MID_BLUE))
story.append(Spacer(1, 0.3*cm))
# Efferent pathway 3
story.append(Paragraph("6c. Interposed Nucleus Pathway (Intermediate Zone)", h2_style))
eff3 = [
Paragraph("<b>Origin:</b> Intermediate zone of cerebellar hemisphere", body_style),
Paragraph("<b>Deep nucleus:</b> Interposed nucleus (globose + emboliform)", body_style),
Paragraph("<b>Course:</b> Interposed nucleus → SCP → Decussates → Red nucleus & VL thalamus → "
"Cortex and brainstem", body_style),
Paragraph("<b>Also:</b> Projects to reticular formation of pons/medulla and basal ganglia", body_style),
Paragraph("<b>Function:</b> Coordinates reciprocal contractions of agonist/antagonist in proximal limb muscles", body_style),
]
story.append(info_box("Interposed Nucleus Pathway", eff3, bg=LIGHT_GREEN, border=colors.HexColor("#388e3c")))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 10: EFFERENT DIAGRAM + SUMMARY TABLE
# ═══════════════════════════════════════════════════════════════
story.append(section_header("Figure 2 — Efferent Tracts from Cerebellum (Guyton & Hall)"))
story.append(Spacer(1, 0.3*cm))
img_eff_data = download_image(IMG_EFFERENT)
if img_eff_data:
img_eff = Image(img_eff_data, width=12*cm, height=10*cm)
story.append(img_eff)
story.append(Paragraph(
"Figure 57.6 from Guyton & Hall Textbook of Medical Physiology — "
"Principal efferent tracts showing dentate nucleus, cerebellothalamocortical tract, "
"fastigioreticular tract, and superior cerebellar peduncle pathways.",
caption_style
))
else:
story.append(Paragraph("[Figure: Efferent tracts — Guyton Fig 57.6]", caption_style))
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("<b>Summary Table — Descending (Efferent) Tracts</b>", h2_style))
eff_data = [
["Deep Nucleus", "Peduncle", "Relay Stations", "Final Target", "Function"],
["Dentate", "SCP", "Decussates → Red nucleus → VL thalamus", "Motor cortex", "Fine distal limb coordination"],
["Interposed (globose+emboliform)", "SCP", "Decussates → Red nucleus / thalamus", "Cortex + brainstem", "Proximal limb agonist/antagonist"],
["Fastigial", "ICP (juxtarestiform)", "Vestibular nuclei + Reticular formation", "Spinal cord (via vestibulospinal & reticulospinal)", "Posture, equilibrium, gait"],
]
story.append(two_col_table(eff_data[0], eff_data[1:], [3.5*cm, 2.5*cm, 4.5*cm, 3.5*cm, 3*cm]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 11: CEREBELLAR PEDUNCLES DETAILED TABLE
# ═══════════════════════════════════════════════════════════════
story.append(section_header("7. Cerebellar Peduncles — Complete Summary"))
story.append(Spacer(1, 0.3*cm))
ped_full_data = [
["Peduncle", "Level", "Type", "Tracts", "Direction"],
["Inferior\n(ICP / Restiform body)", "Medulla", "Mixed (mainly afferent)",
"DSCT, Cuneocerebellar, Olivocerebellar, Vestibulocerebellar, Reticulocerebellar, Spinoreticulocerebellar",
"Mainly IN; some OUT (Fastigiovestibular via juxtarestiform)"],
["Middle\n(MCP / Brachium pontis)", "Pons", "ONLY afferent",
"Pontocerebellar (corticopontocerebellar)",
"IN only — largest peduncle"],
["Superior\n(SCP / Brachium conjunctivum)", "Midbrain", "Mixed (mainly efferent)",
"VSCT (IN), Dentatorubrothalamic (OUT), Interposed nucleus output (OUT)",
"Mainly OUT; VSCT enters"],
]
story.append(two_col_table(ped_full_data[0], ped_full_data[1:], [3.5*cm, 2*cm, 2.5*cm, 5.5*cm, 3.5*cm]))
story.append(Spacer(1, 0.5*cm))
# ═══════════════════════════════════════════════════════════════
# PAGE 11 cont: FUNCTIONAL DIVISIONS
# ═══════════════════════════════════════════════════════════════
story.append(section_header("8. Functional Divisions of the Cerebellum", h1_style, MID_BLUE))
story.append(Spacer(1, 0.3*cm))
func_data = [
["Division", "Lobes Included", "Main Afferents", "Main Efferents (via)", "Function"],
["Archicerebellum\n(Vestibulocerebellum)", "Flocculonodular lobe", "Vestibulocerebellar fibers (vestibular nucleus + CN VIII)", "Vestibular nuclei → vestibulospinal tract (ICP)", "Equilibrium, balance, eye movements"],
["Paleocerebellum\n(Spinocerebellum)", "Anterior lobe + vermis", "DSCT, VSCT, Cuneocerebellar, Reticulocerebellar", "Fastigial → vestibular + reticular (ICP)\nInterposed → red nucleus (SCP)", "Muscle tone, posture, gait, coordination of limb movements"],
["Neocerebellum\n(Pontocerebellum)", "Posterior lobe (lateral hemispheres)", "Pontocerebellar (MCP)\nOlivocerebellar (ICP)", "Dentate → thalamus → cortex (SCP)", "Planning, fine voluntary movement, motor learning"],
]
story.append(two_col_table(func_data[0], func_data[1:], [3.5*cm, 2.8*cm, 3.5*cm, 3.2*cm, 4*cm]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 12: CLINICAL CORRELATIONS
# ═══════════════════════════════════════════════════════════════
story.append(section_header("9. Clinical Correlations"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"Damage to cerebellar tracts or the cerebellum itself produces characteristic signs. "
"These are IPSILATERAL (cerebellar lesions cause ipsilateral deficits because the "
"output decussates twice — once in the SCP and once in the cortex).",
body_style
))
story.append(Spacer(1, 0.2*cm))
clin_data = [
["Structure Damaged", "Sign / Symptom", "Explanation"],
["Cerebellum (general)", "Hypotonia", "Loss of cerebellar facilitation of muscle tone"],
["Lateral hemisphere (neocerebellum)", "Intention tremor, Dysmetria, Dysdiadochokinesia", "Disruption of dentatorubrothalamic tract; loss of fine limb coordination"],
["Vermis", "Truncal ataxia, wide-based gait, titubation", "Loss of fastigiovestibular pathway → postural instability"],
["Flocculonodular lobe", "Nystagmus, loss of balance (cannot stand even with eyes open)", "Loss of vestibulocerebellar feedback"],
["Superior cerebellar peduncle", "Ipsilateral limb ataxia (contralateral red nucleus deafferented)", "SCP carries main efferent output"],
["Inferior cerebellar peduncle", "Loss of proprioceptive feedback, gait disturbance", "DSCT, olivocerebellar fibers disrupted"],
["Friedrich's Ataxia", "Progressive spinocerebellar degeneration affecting DSCT and corticospinal tract", "Genetic (frataxin deficiency); presents in teens with gait ataxia, areflexia, sensory loss"],
]
story.append(two_col_table(clin_data[0], clin_data[1:], [4*cm, 5*cm, 8*cm]))
story.append(Spacer(1, 0.4*cm))
story.append(info_box(
"Cerebellar vs. Sensory Ataxia — Differentiation",
[
Paragraph("• <b>Cerebellar ataxia:</b> Present with eyes open AND closed; intention tremor; Romberg's NEGATIVE (or positive with wide base)", bullet_style),
Paragraph("• <b>Sensory (posterior column) ataxia:</b> Worsens with eye closure (Romberg's POSITIVE); no intention tremor; associated with vibration/position sense loss", bullet_style),
],
bg=LIGHT_YELLOW, border=ACCENT
))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 13: QUICK REVISION
# ═══════════════════════════════════════════════════════════════
story.append(section_header("10. Quick Revision — Important Points for Exam"))
story.append(Spacer(1, 0.3*cm))
qr_points = [
"<b>DSCT (Flechsig's)</b> — Ipsilateral, Clarke's column, ICP, lower limb proprioception",
"<b>VSCT (Gowers')</b> — Double crossing, spinal border cells, SCP, motor command info for lower limb",
"<b>Cuneocerebellar</b> — Upper limb equivalent of DSCT, external cuneate nucleus, ICP",
"<b>MCP carries ONLY afferent fibers</b> — corticopontocerebellar (largest input)",
"<b>SCP is mainly EFFERENT</b> — dentatorubrothalamic tract; VSCT is exception (afferent via SCP)",
"<b>ICP is mainly AFFERENT</b> — DSCT, cuneocerebellar, olivocerebellar, vestibulocerebellar",
"<b>Climbing fibers</b> come ONLY from inferior olivary nucleus — via ICP — 1 fiber: 1 Purkinje cell",
"<b>Mossy fibers</b> — all other sources — via MCP + ICP — synapse on granule cells",
"<b>Purkinje cells</b> — ONLY output of cerebellar cortex — INHIBITORY (GABA) — to deep nuclei",
"<b>Dentate nucleus</b> — projects via SCP → VL thalamus → motor cortex (neocerebellum efferent)",
"<b>Fastigial nucleus</b> — projects via ICP → vestibular nuclei + reticular formation",
"<b>Conduction velocity of spinocerebellar tracts = 120 m/sec (fastest in CNS)</b>",
"<b>Cerebellar lesion signs are IPSILATERAL</b> (double decussation of efferent pathway)",
"<b>Archic</b> = Flocculonodular (vestibular), <b>Paleo</b> = Anterior lobe (spinal), <b>Neo</b> = Posterior lobe (cortical)",
"<b>Comparator function</b> — Cerebellum compares intended vs. actual movement and corrects error",
]
for i, pt in enumerate(qr_points, 1):
row_bg = LIGHT_BLUE if i % 2 == 0 else WHITE
t = Table([[Paragraph(f"{i}. {pt}", body_style)]], colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), row_bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#aaaaaa")),
]))
story.append(t)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# PAGE 14: REFERENCES
# ═══════════════════════════════════════════════════════════════
story.append(section_header("References"))
story.append(Spacer(1, 0.4*cm))
refs = [
"1. Guyton AC, Hall JE. <i>Textbook of Medical Physiology</i>, 14th ed. Elsevier; 2021. Chapter 57: The Cerebellum, the Basal Ganglia, and Overall Motor Control. pp. 699-715.",
"2. Pal GK, Pal P. <i>Textbook of Practical Physiology</i>, 4th ed. Orient Longman; 2019. Cerebellum and cerebellar tracts.",
"3. Jain AK. <i>Manual of Practical Physiology</i>. Avichal Publishing Company. Section on Motor System — Cerebellum.",
"4. Ganong WF (reviewed by Barrett KE et al.). <i>Ganong's Review of Medical Physiology</i>, 26th ed. McGraw-Hill; 2019. Chapter 12: Higher Functions of the Nervous System. pp. 248-260.",
"5. Blumenfeld H. <i>Neuroanatomy through Clinical Cases</i>, 3rd ed. Sinauer Associates; 2022. Chapter 15: The Cerebellum.",
"6. Kandel ER et al. <i>Principles of Neural Science</i>, 6th ed. McGraw-Hill; 2021. Chapter on the Cerebellum.",
]
for ref in refs:
story.append(Paragraph(ref, ref_style))
story.append(Spacer(1, 0.2*cm))
story.append(Spacer(1, 0.5*cm))
story.append(HRFlowable(width=W, color=MID_BLUE, thickness=1))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Prepared for MBBS 1st Year — Department of Physiology | Seminar Presentation",
ParagraphStyle("footer", fontSize=9, fontName="Helvetica-Oblique",
textColor=colors.grey, alignment=TA_CENTER)
))
# ═══════════════════════════════════════════════════════════════
# BUILD
# ═══════════════════════════════════════════════════════════════
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/cerebellum-seminar && python3 build_seminar.py 2>&1
ls -lh /home/daytona/workspace/cerebellum-seminar/
Cerebellar Tracts Seminar
PDF Document · PDF
| Section | Content |
|---|---|
| Cover Page | Department of Physiology, MBBS 1st Year |
| Contents | 20 topics ka index |
| Introduction | Cerebellum ka overview, comparator function |
| Anatomy & Lobes | 3 lobes, mediolateral zones, peduncles table |
| Cortex & Cells | 3 layers, Purkinje/granule/basket/stellate/Golgi cells |
| Deep Nuclei | Dentate, Emboliform, Globose, Fastigial — with table |
| ASCENDING TRACTS | DSCT (Flechsig's), VSCT (Gowers'), Cuneocerebellar, Rostral spinocerebellar, Corticopontocerebellar, Olivocerebellar, Vestibulocerebellar, Reticulocerebellar |
| Guyton Figure 1 | Spinocerebellar tracts diagram (original from textbook) |
| DESCENDING TRACTS | Dentatorubrothalamic, Fastigiovestibular, Interposed nucleus pathway |
| Guyton Figure 2 | Principal efferent tracts diagram (original from textbook) |
| Peduncles Table | ICP / MCP / SCP — complete tract-wise breakdown |
| Functional Divisions | Archicerebellum / Paleocerebellum / Neocerebellum |
| Clinical Correlations | Hypotonia, intention tremor, Friedreich's ataxia, Romberg's sign |
| Quick Revision (15 points) | Exam ke liye sabse important facts |
| References | Guyton 14e, GK Pal, AK Jain, Ganong's 26e |