Write long answer of paediatric renal tumoura
| Gene (Chromosome) | Frequency | Somatic/Germline |
|---|---|---|
| IGF2 (11p15) | 70% | Both |
| WTX (Xq11) | 20% | Somatic only |
| WT1 (11p13) | 20% | Both |
| CTNNB1/beta-catenin (3p21) | 15% | Somatic only |
| TP53 (17p13) | 4% overall; 70% of anaplastic | Both |


| Stage | Definition |
|---|---|
| I | Tumour limited to the kidney, completely excised without rupture or biopsy; renal capsule intact |
| II | Tumour extends through the renal capsule but completely removed; no microscopic involvement of margins; vessels outside kidney contain tumour; or pre-operative biopsy was performed |
| III | Residual non-haematogenous tumour confined to abdomen (positive lymph nodes, peritoneal implants, tumour spill, positive surgical margin, tumour thrombus in IVC) |
| IV | Haematogenous metastases (lungs, liver, bone, brain) or lymph node metastases beyond the abdomino-pelvic region |
| V | Bilateral renal involvement at diagnosis |
| Stage | Histology | Regimen |
|---|---|---|
| Stage I | Favourable histology (FH) or focal anaplasia | Surgery + Vincristine/Actinomycin D × 18 wk, no XRT |
| Stage II | FH | Surgery + Vincristine/Actinomycin D × 18 wk, no XRT |
| Stage III | FH | Surgery + Vincristine/Actinomycin D/Doxorubicin + XRT |
| Stage IV | FH | Surgery + Vincristine/Actinomycin D/Doxorubicin + XRT |
| All stages | Diffuse anaplasia/UH | Intensified regimen + XRT |
| Feature | Wilms Tumour | Neuroblastoma | Mesoblastic Nephroma | CCSK | Rhabdoid Tumour |
|---|---|---|---|---|---|
| Age | 2-5 years | <2 years | Neonates | <4 years | <2 years |
| Origin | Renal | Adrenal/paraspinal | Renal | Renal | Renal |
| Midline crossing | Rarely | Common | No | No | No |
| IVC invasion | ~6% | Rare | No | Rare | Rare |
| Calcification | Uncommon | Common (shell-like) | Rare | Rare | Rare |
| Urinary catecholamines | Normal | Elevated | Normal | Normal | Normal |
| Metastases | Lung, LN | Bone, bone marrow, liver | Rare | Bone (characteristic) | Brain, lung |
| Prognosis | >90% (FH) | Variable | Excellent | 70-80% | <30% |
Make pdf
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /home/daytona/workspace/paediatric-renal-tumours
~/paediatric-renal-tumours/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib.colors import HexColor, black, white
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.lib import colors
OUTPUT = "/home/daytona/workspace/paediatric-renal-tumours/Paediatric_Renal_Tumours.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = HexColor("#1a3a5c")
TEAL = HexColor("#2e86ab")
LIGHT_BG = HexColor("#eaf4fb")
ACCENT = HexColor("#e8f5e9")
TABLE_HDR = HexColor("#1a3a5c")
TABLE_ALT = HexColor("#f0f7fc")
RED_WARN = HexColor("#c0392b")
GREY_LINE = HexColor("#bdc3c7")
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="Paediatric Renal Tumours",
author="Orris Medical Assistant",
)
W = A4[0] - 4*cm # usable width
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def style(name, parent="Normal", **kw):
s = ParagraphStyle(name, parent=base[parent])
for k, v in kw.items():
setattr(s, k, v)
return s
title_style = style("DocTitle", fontSize=24, textColor=white,
alignment=TA_CENTER, spaceAfter=4,
fontName="Helvetica-Bold", leading=30)
subtitle_style = style("DocSub", fontSize=11, textColor=HexColor("#cce8f4"),
alignment=TA_CENTER, spaceAfter=2,
fontName="Helvetica")
h1 = style("H1", fontSize=14, textColor=white,
fontName="Helvetica-Bold", leading=18,
spaceBefore=14, spaceAfter=6)
h2 = style("H2", fontSize=12, textColor=NAVY,
fontName="Helvetica-Bold", leading=15,
spaceBefore=10, spaceAfter=4)
h3 = style("H3", fontSize=10.5, textColor=TEAL,
fontName="Helvetica-Bold", leading=13,
spaceBefore=8, spaceAfter=3)
body = style("Body", fontSize=9.5, textColor=black,
leading=14, alignment=TA_JUSTIFY,
spaceAfter=5)
bullet = style("Bullet", fontSize=9.5, textColor=black,
leading=13, leftIndent=14, firstLineIndent=-10,
spaceAfter=3)
caption = style("Caption", fontSize=8, textColor=HexColor("#555555"),
alignment=TA_CENTER, spaceAfter=6, fontName="Helvetica-Oblique")
key_box = style("KeyBox", fontSize=9.5, textColor=NAVY,
leading=14, leftIndent=8, spaceAfter=4,
fontName="Helvetica-Bold")
source_style = style("Source", fontSize=7.5, textColor=HexColor("#777777"),
alignment=TA_CENTER, spaceAfter=2,
fontName="Helvetica-Oblique")
# ── Helper: section header band ──────────────────────────────────────────────
def section_header(text):
tbl = Table([[Paragraph(text, h1)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("ROUNDEDCORNERS", [4]),
]))
return tbl
def sub_header(text):
return Paragraph(text, h2)
def sub_sub(text):
return Paragraph(text, h3)
def para(text):
return Paragraph(text, body)
def bul(text):
return Paragraph(f"• {text}", bullet)
def sp(h=4):
return Spacer(1, h)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=GREY_LINE, spaceAfter=4)
def key_box_row(text):
tbl = Table([[Paragraph(text, key_box)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BG),
("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, TEAL),
]))
return tbl
def gene_table():
data = [
["Gene (Chromosome)", "Frequency", "Somatic / Germline"],
["IGF2 (11p15)", "70%", "Both"],
["WTX (Xq11)", "20%", "Somatic only"],
["WT1 (11p13)", "20%", "Both"],
["CTNNB1 (3p21)","15%", "Somatic only"],
["TP53 (17p13)", "4% overall; 70% of anaplastic", "Both"],
]
col_w = [W*0.42, W*0.24, W*0.34]
t = Table(data, colWidths=col_w)
style_cmds = [
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS", (0,1), (-1,-1), [white, TABLE_ALT]),
("GRID", (0,0), (-1,-1), 0.4, GREY_LINE),
("LEFTPADDING",(0,0), (-1,-1), 6),
("RIGHTPADDING",(0,0),(-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1),4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
t.setStyle(TableStyle(style_cmds))
return t
def staging_table():
data = [
["Stage", "Definition"],
["I", "Tumour limited to kidney; completely excised; capsule intact; no rupture"],
["II", "Extends through capsule but completely removed; no residual microscopic disease; pre-op biopsy or vessels outside kidney involved"],
["III", "Residual non-haematogenous tumour in abdomen: positive LN, peritoneal implants, spill, positive margin, or IVC thrombus"],
["IV", "Haematogenous metastases (lungs, liver, bone, brain) or lymph nodes beyond abdominopelvic region"],
["V", "Bilateral renal involvement at diagnosis"],
]
col_w = [W*0.10, W*0.90]
t = Table(data, colWidths=col_w)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), NAVY),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS",(0,1),(-1,-1), [white, TABLE_ALT]),
("GRID", (0,0), (-1,-1), 0.4, GREY_LINE),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def chemo_table():
data = [
["Stage", "Histology", "Regimen"],
["I", "FH / Focal anaplasia", "Surgery + VA × 18 wk; no XRT"],
["II", "FH", "Surgery + VA × 18 wk; no XRT"],
["III", "FH", "Surgery + VAD + XRT (abdominal)"],
["IV", "FH", "Surgery + VAD + XRT + whole-lung XRT if lung mets"],
["I–IV", "Diffuse anaplasia (UH)","Intensified regimen (+ cyclophosphamide/etoposide) + XRT"],
["All", "CCSK", "VAD + cyclophosphamide/etoposide + XRT all stages"],
["All", "Rhabdoid tumour", "Intensive multiagent + XRT all stages"],
]
col_w = [W*0.09, W*0.28, W*0.63]
t = Table(data, colWidths=col_w)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [white, TABLE_ALT]),
("GRID", (0,0), (-1,-1), 0.4, GREY_LINE),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def diff_dx_table():
hdrs = ["Feature","Wilms Tumour","Neuroblastoma","Mesoblastic Nephroma","CCSK","Rhabdoid Tumour"]
rows = [
["Age", "2–5 yr", "<2 yr", "Neonate", "<4 yr", "<2 yr"],
["Origin", "Renal", "Adrenal/paraspinal","Renal", "Renal", "Renal"],
["Midline crossing","Rarely","Common","No", "No", "No"],
["IVC invasion","~6%", "Rare", "No", "Rare", "Rare"],
["Calcification","Uncommon","Common (shell)","Rare", "Rare", "Rare"],
["Urinary catecholamines","Normal","Elevated","Normal", "Normal", "Normal"],
["Metastases", "Lung, LN", "Bone, marrow,liver","Rare", "Bone (hallmark)","Brain, lung"],
["5-yr Survival",">90% (FH)","Variable","Excellent", "70–80%", "<30%"],
]
data = [hdrs] + rows
col_w = [W*0.18, W*0.15, W*0.16, W*0.17, W*0.15, W*0.19]
t = Table(data, colWidths=col_w)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), NAVY),
("FONTSIZE", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS",(0,1),(-1,-1), [white, TABLE_ALT]),
("GRID", (0,0), (-1,-1), 0.4, GREY_LINE),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING",(0,0), (-1,-1), 3),
("VALIGN", (0,0), (-1,-1), "TOP"),
("WORDWRAP", (0,0), (-1,-1), True),
]))
return t
# ── Cover banner ─────────────────────────────────────────────────────────────
def cover_banner():
banner_data = [[
Paragraph("PAEDIATRIC RENAL TUMOURS", title_style),
Paragraph("A Comprehensive Clinical Review", subtitle_style),
Paragraph("Orris Medical Library • July 2026", subtitle_style),
]]
t = Table(banner_data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 18),
("ROUNDEDCORNERS",[6]),
]))
return t
# ═══════════════════════════════════════════════════════════════════════════
# Build story
# ═══════════════════════════════════════════════════════════════════════════
story = []
# Cover
story.append(cover_banner())
story.append(sp(14))
# ── OVERVIEW ─────────────────────────────────────────────────────────────────
story.append(section_header("1. Overview and Classification"))
story.append(sp(6))
story.append(para(
"Renal tumours account for approximately 6–7% of all childhood cancers. "
"They range from benign to highly malignant and vary considerably by age of onset, "
"molecular biology, histology, and prognosis. The major types encountered in children are:"
))
for item in [
"Wilms Tumour (Nephroblastoma) — most common (>85% of all paediatric renal tumours)",
"Clear Cell Sarcoma of the Kidney (CCSK) — ~1.6%",
"Malignant Rhabdoid Tumour of the Kidney (RTK) — ~1%",
"Congenital Mesoblastic Nephroma (CMN) — most common in neonates",
"Multilocular Cystic Nephroma",
"Renal Cell Carcinoma — rare in children",
]:
story.append(bul(item))
story.append(sp(8))
# ── WILMS TUMOUR ──────────────────────────────────────────────────────────────
story.append(section_header("2. Wilms Tumour (Nephroblastoma)"))
story.append(sp(6))
# 2.1 Epidemiology
story.append(sub_header("2.1 Epidemiology"))
story.append(para(
"Wilms tumour (WT) is the most common primary malignant renal tumour of childhood and the "
"second most common solid tumour outside the brain in infants, behind neuroblastoma. "
"It represents 95% of all kidney cancers in children under 15 years in the United States, "
"with an average annual age-adjusted incidence of 8 per million (approximately 500 new cases/year in the US). "
"Over 80% of cases are diagnosed before 5 years of age; median age at diagnosis is 3.5 years "
"(36 months in boys, 43 months in girls for unilateral tumours; younger for bilateral disease). "
"Incidence is highest in Black/African populations and lowest in East Asian populations. "
"The sex ratio is approximately equal, with a slight female predominance. "
"Only 1–2% of cases are familial."
))
story.append(sp(4))
# 2.2 Genetics
story.append(sub_header("2.2 Genetics and Molecular Biology"))
story.append(para(
"Most Wilms tumours arise from somatic mutations restricted to tumour tissue; germline mutations "
"account for a much smaller percentage. The Knudson two-hit model does not fully explain most cases. "
"Key genetic alterations are shown in the table below:"
))
story.append(sp(4))
story.append(gene_table())
story.append(Paragraph(
"Source: Campbell Walsh Wein Urology, Table 53.3 • Robbins & Kumar Basic Pathology",
source_style
))
story.append(sp(8))
story.append(sub_sub("WT1 Gene (11p13)"))
story.append(para(
"WT1 is a tumour suppressor critical for normal renal and gonadal development. It was identified "
"following cytogenetic observations of deletions at 11p13 in WAGR syndrome. WT1 mutations are "
"often associated with CTNNB1 (beta-catenin) mutations, defining a 'type I' Wilms tumour — "
"characterised by stromal-predominant histology, intralobar nephrogenic rests, early onset, "
"and genitourinary anomalies in males."
))
story.append(sub_sub("11p15 / IGF2 Pathway"))
story.append(para(
"The IGF2 gene at 11p15.5 is normally expressed only from the paternal allele. Loss of imprinting "
"(re-expression from the maternal allele) leads to overexpression of IGF-2 protein, driving "
"organomegaly and tumorigenesis. This mechanism underlies Beckwith-Wiedemann syndrome. "
"Overexpression of IGF2 is the most frequent molecular alteration in Wilms tumours (70%)."
))
story.append(sub_sub("MicroRNA Processing Mutations"))
story.append(para(
"In 15–20% of sporadic tumours, recurrent mutations affect proteins involved in microRNA processing "
"(e.g., DROSHA, DGCR8, DICER1). This impairs mesenchymal-to-epithelial transformation during "
"renal morphogenesis, perpetuating blastemal rests that can evolve into tumours."
))
story.append(sub_sub("TP53 Mutations"))
story.append(para(
"Found in approximately 70% of anaplastic Wilms tumours. TP53 mutations confer "
"chemoresistance and are associated with the worst prognosis."
))
story.append(sp(8))
# 2.3 Associated syndromes
story.append(sub_header("2.3 Associated Syndromes and Congenital Anomalies"))
story.append(para(
"Approximately 10–15% of Wilms tumours occur in the context of a predisposing syndrome. "
"The three classic high-risk syndromic associations are:"
))
story.append(sp(4))
synd_data = [
["Syndrome", "Features", "Gene / Locus", "WT Risk"],
["WAGR", "Wilms tumour, Aniridia, Genital abnormalities, intellectual disability",
"Deletion 11p13\n(WT1 + PAX6)", "~33%"],
["Denys-Drash (DDS)", "Gonadal dysgenesis, early nephropathy, pseudohermaphroditism",
"Dominant-negative WT1 mutation", "~90%"],
["Beckwith-Wiedemann", "Macroglossia, visceromegaly, exomphalos, hemihypertrophy, neonatal hypoglycaemia",
"11p15.5 (IGF2/H19)", "4–10%"],
]
synd_col_w = [W*0.20, W*0.36, W*0.26, W*0.18]
st = Table(synd_data, colWidths=synd_col_w)
st.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS",(0,1),(-1,-1), [white, TABLE_ALT]),
("GRID", (0,0), (-1,-1), 0.4, GREY_LINE),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(st)
story.append(sp(5))
story.append(para(
"Other associated conditions: hemihypertrophy, Sotos syndrome, Bloom syndrome, Perlman syndrome, "
"neurofibromatosis, Li-Fraumeni syndrome, cryptorchidism, horseshoe kidney. "
"Aniridia is present in 1.1% of WT patients. "
"Around 10% of Wilms tumours are bilateral (Stage V); two-thirds are synchronous, one-third metachronous."
))
story.append(sp(8))
# 2.4 Pathology
story.append(sub_header("2.4 Pathology"))
story.append(sub_sub("Gross Appearance"))
story.append(para(
"Wilms tumour is typically a large, solitary, well-circumscribed mass. On cut section it is soft, "
"homogeneous, and tan to grey, with occasional foci of haemorrhage, cystic degeneration, and necrosis. "
"10% are bilateral or multicentric at the time of diagnosis."
))
story.append(sp(4))
story.append(sub_sub("Microscopy — Triphasic Pattern"))
story.append(para(
"The histological hallmark is the classic triphasic combination of blastemal, stromal, and epithelial "
"cell types, reflecting attempts to recapitulate different stages of nephrogenesis:"
))
for b in [
"<b>Blastemal component:</b> Sheets of densely packed small blue cells with high N:C ratio and few distinctive features.",
"<b>Epithelial component:</b> Abortive tubules or primitive glomeruli representing early nephron formation.",
"<b>Stromal component:</b> Fibroblastic or myxoid cells; skeletal muscle differentiation is not uncommon.",
]:
story.append(bul(b))
story.append(sp(4))
story.append(sub_sub("Histological Classification"))
story.append(para(
"<b>Favourable Histology (FH):</b> Classic triphasic pattern without anaplasia. Epithelial-predominant "
"tumours tend to be less aggressive and are often Stage I at diagnosis."
))
story.append(para(
"<b>Unfavourable Histology / Anaplasia:</b> Present in ~5–7% of WT. Defined by enlarged hyperchromatic "
"pleomorphic nuclei with multipolar polyploid mitotic figures. <b>Diffuse anaplasia</b> (anaplasia "
"present in more than one area or at extrarenal sites) is the single most important adverse prognostic "
"indicator and confers resistance to chemotherapy. It is associated with TP53 mutations, found "
"disproportionately in older children and in African/Latin-American patients."
))
story.append(sp(4))
story.append(key_box_row(
"Key Point: Diffuse anaplasia is the single most important adverse prognostic factor in Wilms tumour, "
"predicting chemoresistance and tumour recurrence."
))
story.append(sp(8))
story.append(sub_sub("Nephrogenic Rests"))
story.append(para(
"Nephrogenic rests are putative precursor lesions — persistent foci of embryonal renal tissue "
"(metanephric blastema) beyond the 36th gestational week, present in 25–40% of kidneys resected "
"for WT. Two subtypes have distinct molecular associations:"
))
for b in [
"<b>Intralobar nephrogenic rests (ILNRs):</b> Located within the renal lobe; associated with WT1 mutations, DDS, and hemihypertrophy.",
"<b>Perilobar nephrogenic rests (PLNRs):</b> Located at the periphery of the lobe; associated with BWS and 11p15 (IGF2) abnormalities.",
]:
story.append(bul(b))
story.append(para(
"Nephrogenic rests have no direct oncologic potential — they can differentiate and spontaneously "
"regress. Their documentation signals increased risk for contralateral kidney tumour development."
))
story.append(sp(8))
# 2.5 Clinical Features
story.append(sub_header("2.5 Clinical Features"))
story.append(para(
"The typical presentation is an otherwise healthy child with an <b>asymptomatic abdominal flank mass</b>, "
"often discovered incidentally by a parent while bathing or dressing the child. "
"The mass is firm, smooth, non-tender, and does not usually cross the midline "
"(distinguishing it from neuroblastoma)."
))
story.append(sp(4))
story.append(para("<b>Additional presenting features:</b>"))
for b in [
"Haematuria — microscopic in 25%; gross haematuria less common, may follow minor trauma",
"Hypertension — present in 25% (due to disturbance of the renin-angiotensin axis)",
"Vague abdominal discomfort or pain",
"Fever and weight loss",
"Obstipation or intestinal obstruction from pressure",
"Varicocele (from left renal vein involvement), hepatomegaly (from hepatic vein obstruction), ascites (<10%)",
"Congestive heart failure (if large IVC/atrial thrombus)",
"Lung metastases — present in 8% at diagnosis",
"IVC tumour thrombus — in ~6% of cases; often clinically silent in >50%",
]:
story.append(bul(b))
story.append(sp(8))
# 2.6 Investigations
story.append(sub_header("2.6 Investigations"))
story.append(sub_sub("Imaging"))
for b in [
"<b>Ultrasound (US):</b> First-line investigation. Identifies renal origin, characterises the mass, "
"and assesses for renal vein/IVC thrombus (Doppler). Mandatory pre-operatively.",
"<b>CT scan (abdomen + chest):</b> Characterises the mass, detects regional adenopathy, "
"contralateral kidney involvement, hepatic metastases, and pulmonary metastases (present in 8% at diagnosis). "
"Claw sign confirms intrarenal origin.",
"<b>MRI:</b> Valuable for IVC extension assessment and equivocal CT findings.",
"<b>Chest X-ray:</b> To assess for pulmonary metastases.",
]:
story.append(bul(b))
story.append(sub_sub("Laboratory"))
for b in [
"Full blood count, renal and hepatic function, urinalysis (haematuria)",
"Serum AFP (to exclude hepatoblastoma)",
"Urinary catecholamines/VMA/HVA (to exclude neuroblastoma)",
"Coagulation screen (acquired von Willebrand disease associated)",
]:
story.append(bul(b))
story.append(sp(8))
# 2.7 Staging
story.append(sub_header("2.7 Staging"))
story.append(para(
"The <b>NWTSG (National Wilms Tumor Study Group)</b> staging is the most widely used in North America "
"and is applied after primary surgical resection. The SIOP system (used in Europe) is applied "
"after preoperative chemotherapy and is a post-chemotherapy pathological system. "
"The key difference: NWTSG = surgery first (to allow true pathological staging); "
"SIOP = chemotherapy first (to reduce tumour size and spill risk)."
))
story.append(sp(4))
story.append(staging_table())
story.append(Paragraph(
"Source: Sabiston Textbook of Surgery, Table 117.3 • Campbell Walsh Wein Urology",
source_style
))
story.append(sp(8))
# 2.8 Treatment
story.append(sub_header("2.8 Treatment"))
story.append(sub_sub("Surgical Principles"))
story.append(para(
"Radical transperitoneal nephrectomy is the cornerstone of NWTSG management. "
"Key intraoperative principles:"
))
for b in [
"<b>En bloc resection</b> with tumour-free margins is mandatory — contamination/spillage upstages the patient and mandates additional radiation and chemotherapy.",
"<b>Gentle tumour handling</b> throughout — intraoperative spillage occurs in ~9.7% and significantly increases local abdominal relapse risk.",
"<b>Lymph node sampling</b> (hilar, para-aortic, paracaval) is essential for accurate staging; formal lymph node dissection is not required.",
"The adrenal gland can be preserved if not adjacent to the tumour.",
"Contralateral kidney exploration is no longer mandatory if pre-operative CT/MRI shows a normal contralateral kidney.",
"Renal vein and IVC must be palpated pre-ligation to exclude intravascular extension.",
"<b>Nephron-sparing surgery (partial nephrectomy)</b> is reserved for bilateral WT (Stage V) or solitary kidney.",
]:
story.append(bul(b))
story.append(sp(6))
story.append(sub_sub("Chemotherapy and Radiation"))
story.append(para(
"The NWTSG standard backbone is <b>vincristine (V) and dactinomycin/actinomycin D (A)</b>, "
"with the addition of <b>doxorubicin (D)</b> and/or radiotherapy (XRT) based on stage and histology:"
))
story.append(sp(4))
story.append(chemo_table())
story.append(Paragraph(
"FH = Favourable Histology; VA = Vincristine + Actinomycin D; VAD = VA + Doxorubicin; "
"CCSK = Clear Cell Sarcoma of Kidney; XRT = radiotherapy • Source: Sabiston; Smith & Tanagho",
source_style
))
story.append(sp(8))
# 2.9 Prognosis
story.append(sub_header("2.9 Prognosis"))
story.append(para(
"Treatment of Wilms tumour is one of paediatric oncology's greatest success stories, "
"with overall survival improving from ~30% in the 1950s to over 90% currently."
))
prog_data = [
["Stage / Histology", "Approx. 5-year Survival"],
["Stage I–II, Favourable Histology", "~95%"],
["Stage III, Favourable Histology", "~90%"],
["Stage IV, Favourable Histology", "~85%"],
["Stage II–III, Diffuse Anaplasia", "56–70%"],
["Stage IV, Diffuse Anaplasia", "~17%"],
["Overall (all stages, FH)", ">90%"],
]
pt = Table(prog_data, colWidths=[W*0.65, W*0.35])
pt.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS",(0,1),(-1,-1),[white, TABLE_ALT]),
("GRID", (0,0), (-1,-1), 0.4, GREY_LINE),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
]))
story.append(pt)
story.append(sp(5))
story.append(para(
"Key adverse prognostic factors: diffuse anaplasia, combined loss of heterozygosity (LOH) at 1p and 16q, "
"blastemal-predominant histology, positive lymph nodes, tumour spill, residual disease."
))
story.append(sp(12))
# ── OTHER TUMOURS ─────────────────────────────────────────────────────────────
story.append(section_header("3. Clear Cell Sarcoma of the Kidney (CCSK)"))
story.append(sp(6))
story.append(para(
"CCSK accounts for ~1.6% of paediatric renal cancers. It is NOT a Wilms tumour variant "
"but a distinct entity classified as unfavourable histology. It was historically called the "
"'bone-metastasising renal tumour of childhood' due to its characteristic skeletal spread."
))
for b in [
"<b>Age:</b> Typically under 4 years; peak at 2 years.",
"<b>Molecular basis:</b> BCOR gene alterations; YWHAE-NUTM2B/E fusion in a subset.",
"<b>Histology:</b> Pale cells with optically clear cytoplasm in cords or nests separated by an arborising fibrovascular stroma. No blastema or epithelial elements.",
"<b>Metastases:</b> Characteristic bone metastases; also brain, soft tissue, liver.",
"<b>Treatment:</b> Radical nephrectomy + VAD + cyclophosphamide/etoposide + radiation therapy at all stages.",
"<b>Prognosis:</b> ~70–80% 5-year survival with current intensive regimens.",
]:
story.append(bul(b))
story.append(sp(12))
story.append(section_header("4. Malignant Rhabdoid Tumour of the Kidney (RTK)"))
story.append(sp(6))
story.append(para(
"RTK is the most aggressive paediatric renal tumour, accounting for ~1% of paediatric renal cancers. "
"It disseminates early and has the worst prognosis of any paediatric renal tumour."
))
for b in [
"<b>Age:</b> Almost exclusively infants; median age 11–18 months; most diagnosed before 2 years.",
"<b>Presentation:</b> Often presents with metastatic disease; fever and haematuria are common.",
"<b>Molecular basis:</b> Loss-of-function mutations of <b>SMARCB1 (INI1/hSNF5)</b> at chromosome 22q11.2, encoding a subunit of the SWI/SNF chromatin remodelling complex. Germline SMARCB1 mutations → familial predisposition and increased risk for CNS atypical teratoid/rhabdoid tumours (AT/RT).",
"<b>Histology:</b> Large cells with eccentric vesicular nuclei, prominent eosinophilic nucleoli, and cytoplasmic inclusions containing whorled intermediate filaments (true rhabdoid cells). No actual skeletal muscle differentiation despite the name.",
"<b>Metastases:</b> Lung, brain, lymph nodes, liver — dissemination is early.",
"<b>Treatment:</b> Radical nephrectomy + intensive multiagent chemotherapy + radiation therapy at all stages.",
"<b>Prognosis:</b> <30% 5-year survival despite aggressive treatment.",
]:
story.append(bul(b))
story.append(sp(12))
story.append(section_header("5. Congenital Mesoblastic Nephroma (CMN)"))
story.append(sp(6))
story.append(para(
"CMN is the <b>most common renal neoplasm in the first 3 months of life</b>, accounting for "
"3–10% of all paediatric renal tumours. It was originally considered uniformly benign, "
"but cellular variants can behave aggressively."
))
for b in [
"<b>Presentation:</b> Neonatal abdominal mass, often detected prenatally on routine ultrasound.",
"<b>Imaging:</b> Solid, homogeneous mass with relatively hypo-echoic vascular periphery on US. Neither US nor CT reliably distinguishes CMN from Wilms tumour; CMN shows uptake of 99mTc-DMSA.",
"<b>CMN does not invade the vascular pedicle and does not usually metastasise.</b>",
"<b>Classic type:</b> Bundles of spindle cells resembling fibromatosis; low mitotic activity; excellent prognosis with complete excision.",
"<b>Cellular type:</b> Higher cellularity, increased mitotic activity; harbours the ETV6-NTRK3 fusion gene (identical to infantile fibrosarcoma); more prone to local recurrence.",
"<b>Treatment:</b> Complete surgical nephrectomy is curative in the vast majority. Adjuvant chemotherapy may be required for cellular type with incomplete resection.",
"<b>Prognosis:</b> Excellent with complete resection; local recurrence occurs only with incomplete removal or capsular penetration.",
]:
story.append(bul(b))
story.append(sp(12))
story.append(section_header("6. Multilocular Cystic Nephroma"))
story.append(sp(6))
story.append(para(
"An uncommon cystic renal mass derived from metanephric blastema with a bimodal age distribution: "
"predominantly in boys under 4 years, and in women in the 5th–6th decade."
))
for b in [
"Presents with an abdominal mass.",
"US shows multilocular cystic renal mass with multiple cysts and hyperechoic septations.",
"CT/MRI: well-defined margins/capsule, multicystic architecture, enhancing septae; may herniate into the collecting system.",
"Non-functioning on isotope imaging.",
"Imaging cannot reliably distinguish the spectrum from benign (multilocular renal cyst) to malignant (multilocular cystic Wilms tumour).",
"<b>Treatment:</b> Nephrectomy (or partial) is curative and recommended given malignant potential.",
]:
story.append(bul(b))
story.append(sp(12))
# ── BILATERAL WT ──────────────────────────────────────────────────────────────
story.append(section_header("7. Bilateral Wilms Tumour (Stage V)"))
story.append(sp(6))
story.append(para(
"Bilateral WT (Stage V) occurs in 5–13% of cases at diagnosis. "
"It is associated with younger age at presentation, higher frequency of predisposing syndromes, "
"and a greater prevalence of nephrogenic rests. Management is complex and aims to preserve "
"maximum functioning renal parenchyma."
))
for b in [
"Pre-operative (neoadjuvant) chemotherapy with vincristine + actinomycin D ± doxorubicin to reduce tumour burden bilaterally.",
"Subsequent <b>bilateral nephron-sparing surgery</b> — partial nephrectomy is standard where feasible.",
"Partial nephrectomy criteria: tumour in one pole only, no collecting system/vascular involvement, clear margins, adequate residual function.",
"Post-operative chemotherapy and radiation therapy as per final stage and histology.",
"Biopsy confirmation at diagnosis is not required per NWTSG guidelines.",
"Dialysis or renal transplantation may ultimately be required in a subset of patients.",
]:
story.append(bul(b))
story.append(sp(12))
# ── DIFFERENTIAL DIAGNOSIS ───────────────────────────────────────────────────
story.append(section_header("8. Differential Diagnosis of a Paediatric Renal Mass"))
story.append(sp(6))
story.append(diff_dx_table())
story.append(Paragraph(
"CCSK = Clear Cell Sarcoma of Kidney; FH = Favourable Histology; LN = Lymph Nodes • Multiple sources",
source_style
))
story.append(sp(8))
story.append(para(
"<b>Key distinguishing features:</b> Neuroblastoma commonly crosses the midline, "
"elevates urinary catecholamines, and has typical calcification. "
"Mesoblastic nephroma presents exclusively in neonates and has no IVC invasion. "
"CCSK uniquely metastasises to bone. Rhabdoid tumour presents in infants with early "
"metastatic disease and the worst prognosis."
))
story.append(sp(12))
# ── SCREENING ─────────────────────────────────────────────────────────────────
story.append(section_header("9. Screening in High-Risk Children"))
story.append(sp(6))
story.append(para(
"Children with predisposing conditions (BWS, WAGR, DDS, hemihypertrophy, WT1 mutations, "
"sporadic aniridia) should undergo surveillance abdominal ultrasound. Current recommendations "
"suggest screening every 3–4 months until age 7–8 years. However, the benefit is debated — "
"despite regular 3-monthly surveillance, large interval tumours can still develop. "
"The primary goal is detection at an earlier stage to improve outcomes. "
"Surveillance should be accompanied by genetic counselling."
))
story.append(sp(12))
# ── SUMMARY ────────────────────────────────────────────────────────────────────
story.append(section_header("10. Clinical Summary and Key Points"))
story.append(sp(6))
story.append(key_box_row(
"A smooth, firm, non-tender flank mass in a child aged 1–5 years is a Wilms tumour "
"until proven otherwise."
))
story.append(sp(5))
for b in [
"Wilms tumour is the dominant paediatric renal tumour — >90% overall survival makes it one of oncology's greatest treatment successes.",
"Assess IVC extension with Doppler ultrasound before every operation.",
"Accurate pathological staging with mandatory lymph node sampling is essential — it determines chemotherapy regimen and need for radiotherapy.",
"Triphasic histology without anaplasia = favourable histology = excellent prognosis.",
"Diffuse anaplasia (TP53-associated) = the single most important adverse prognostic factor.",
"WAGR, Denys-Drash, and Beckwith-Wiedemann syndromes require active genetic counselling and contralateral kidney surveillance.",
"NWTSG = surgery first strategy; SIOP = pre-operative chemotherapy strategy — both are evidence-based.",
"Clear cell sarcoma requires radiation at all stages; rhabdoid tumour requires intensive multiagent chemotherapy + XRT at all stages.",
"Congenital mesoblastic nephroma in the neonate: complete excision alone is curative in most cases.",
"Bilateral WT (Stage V): neoadjuvant chemotherapy + nephron-sparing bilateral surgery to preserve renal function.",
]:
story.append(bul(b))
story.append(sp(14))
story.append(hr())
story.append(Paragraph(
"Sources: Campbell Walsh Wein Urology (3-Volume Set) • Robbins & Kumar Basic Pathology • "
"Sabiston Textbook of Surgery • Schwartz's Principles of Surgery, 11th Ed • "
"Grainger & Allison's Diagnostic Radiology • Smith and Tanagho's General Urology, 19th Ed • "
"Bailey and Love's Short Practice of Surgery, 28th Ed • Mulholland and Greenfield's Surgery, 7th Ed",
source_style
))
# ── Build ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/paediatric-renal-tumours && python generate_pdf.py 2>…
ls -lh /home/daytona/workspace/paediatric-renal-tumours/Paediatric_Renal_Tumours…
Paediatric Renal Tumours
PDF Document · PDF