Peridtric oncology history collect format
pediatric oncology history taking format clinical assessment
https://www.mdpi.com/2813-141X/4/4/54
| Parameter | Details to Elicit |
|---|---|
| Onset | When did it start? Sudden or gradual? |
| Duration | How long has it been present? |
| Character | Nature of symptom (e.g., pain type, swelling consistency) |
| Location / Radiation | Where exactly? Does it spread? |
| Severity | Numerical pain scale (age-appropriate); functional limitation |
| Modifying factors | What makes it better or worse? |
| Associated symptoms | Fever, night sweats, weight loss ("B symptoms"), fatigue, pallor, bleeding, bruising, recurrent infections |
| Course | Static, progressive, or improving? |
Critical in pediatric oncology: ~10% of pediatric oncology patients have a heritable cancer predisposition syndrome or germline mutation (Harriet Lane Handbook, 23rd ed.)
| System | Key Points |
|---|---|
| Constitutional | Fever, weight loss, night sweats, fatigue, anorexia |
| HEENT | Headache, visual changes, proptosis, hearing loss, nasal obstruction |
| Respiratory | Cough, dyspnea, stridor, hemoptysis |
| Cardiovascular | Palpitations, chest pain, edema |
| GI | Abdominal pain, mass, nausea/vomiting, change in bowel habits, rectal bleeding, jaundice |
| GU | Hematuria, frequency, testicular swelling (boys) |
| MSK | Bone/joint pain (especially nocturnal), limp, pathological fracture |
| Neurological | Headache, seizures, weakness, ataxia, behavioral change, cranial nerve deficits |
| Skin | Pallor, jaundice, petechiae, ecchymoses, rash, café-au-lait spots |
| Lymphatic | Lymphadenopathy (location, size, duration, tenderness) |
| Endocrine | Precocious puberty, growth failure, polydipsia/polyuria |
| Psychological | Anxiety, depression, behavioral changes, school difficulties |
| Score | Lansky Scale Description |
|---|---|
| 100 | Fully active, normal |
| 80 | Minor restrictions in strenuous activity |
| 60 | Active but tired; play restricted |
| 40 | Mostly in bed, limited self-care |
| 20 | No active play; requires significant assistance |
| 0 | Unresponsive |
Create a Word document template for pediatric oncology history collection
mkdir -p /tmp/workspace/pediatric-oncology && ls /tmp/workspace/pediatric-oncology/
~/pediatric-oncology/create_template.py
from docx import Document
from docx.shared import Pt, Inches, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy
doc = Document()
# ── Page margins ──────────────────────────────────────────────────────────────
section = doc.sections[0]
section.page_width = Inches(8.5)
section.page_height = Inches(11)
section.left_margin = Inches(1)
section.right_margin = Inches(1)
section.top_margin = Inches(0.8)
section.bottom_margin = Inches(0.8)
# ── Default Normal style ──────────────────────────────────────────────────────
normal = doc.styles["Normal"]
normal.font.name = "Calibri"
normal.font.size = Pt(10.5)
# ── Colour palette ────────────────────────────────────────────────────────────
DARK_BLUE = RGBColor(0x1A, 0x3C, 0x6E) # header bg
MED_BLUE = RGBColor(0x1F, 0x6F, 0xB8) # section headings
LIGHT_BLUE = RGBColor(0xD6, 0xE4, 0xF4) # table header row bg
LIGHT_GREY = RGBColor(0xF5, 0xF5, 0xF5) # alternate row bg
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
RED_FLAG = RGBColor(0xC0, 0x39, 0x2B) # red-flag label
# ── Helper: shade a table cell ────────────────────────────────────────────────
def shade_cell(cell, hex_color: str):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
shd = OxmlElement("w:shd")
shd.set(qn("w:val"), "clear")
shd.set(qn("w:color"), "auto")
shd.set(qn("w:fill"), hex_color)
tcPr.append(shd)
# ── Helper: set cell border ───────────────────────────────────────────────────
def set_cell_border(cell, **kwargs):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
tcBorders = OxmlElement("w:tcBorders")
for edge in ("top","left","bottom","right","insideH","insideV"):
if edge in kwargs:
tag = OxmlElement(f"w:{edge}")
for k, v in kwargs[edge].items():
tag.set(qn(f"w:{k}"), v)
tcBorders.append(tag)
tcPr.append(tcBorders)
# ── Helper: thick bottom border on paragraph ──────────────────────────────────
def add_bottom_border(paragraph, color="1A3C6E"):
pPr = paragraph._p.get_or_add_pPr()
pBdr = OxmlElement("w:pBdr")
bottom = OxmlElement("w:bottom")
bottom.set(qn("w:val"), "single")
bottom.set(qn("w:sz"), "12")
bottom.set(qn("w:space"), "1")
bottom.set(qn("w:color"), color)
pBdr.append(bottom)
pPr.append(pBdr)
# ── Helper: coloured run ──────────────────────────────────────────────────────
def coloured_run(paragraph, text, bold=False, color=None, size=None, italic=False):
run = paragraph.add_run(text)
run.bold = bold
run.italic = italic
if color:
run.font.color.rgb = color
if size:
run.font.size = Pt(size)
return run
# ── Helper: add a labelled field line ─────────────────────────────────────────
def field_line(label, spaces=40):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(2)
run_label = p.add_run(f"{label}: ")
run_label.bold = True
run_label.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
run_label.font.size = Pt(10.5)
run_line = p.add_run("_" * spaces)
run_line.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
run_line.font.size = Pt(10.5)
return p
# ── Helper: checkbox line ─────────────────────────────────────────────────────
def checkbox_line(text, indent=0.3):
p = doc.add_paragraph()
p.paragraph_format.left_indent = Inches(indent)
p.paragraph_format.space_before = Pt(1)
p.paragraph_format.space_after = Pt(1)
run = p.add_run(f"\u25a1 {text}")
run.font.size = Pt(10.5)
return p
# ── Helper: section heading ───────────────────────────────────────────────────
def section_heading(title, number=""):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(10)
p.paragraph_format.space_after = Pt(3)
add_bottom_border(p)
run = p.add_run(f" {number} {title} " if number else f" {title} ")
run.bold = True
run.font.size = Pt(12)
run.font.color.rgb = WHITE
# Shade paragraph background
pPr = p._p.get_or_add_pPr()
shd = OxmlElement("w:shd")
shd.set(qn("w:val"), "clear")
shd.set(qn("w:color"), "auto")
shd.set(qn("w:fill"), "1F6FB8")
pPr.append(shd)
return p
# ── Helper: sub-heading ───────────────────────────────────────────────────────
def sub_heading(title):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(2)
run = p.add_run(title)
run.bold = True
run.font.size = Pt(10.5)
run.font.color.rgb = DARK_BLUE
return p
# ── Helper: note paragraph ────────────────────────────────────────────────────
def note_para(text, italic=True, color=None):
p = doc.add_paragraph()
p.paragraph_format.left_indent = Inches(0.2)
p.paragraph_format.space_before = Pt(1)
p.paragraph_format.space_after = Pt(1)
run = p.add_run(text)
run.italic = italic
run.font.size = Pt(9.5)
run.font.color.rgb = color if color else RGBColor(0x55, 0x55, 0x55)
return p
# ── Helper: two-column field table ───────────────────────────────────────────
def two_col_fields(pairs, col_widths=(2.5, 3.5)):
"""pairs = list of (label, line_length)"""
tbl = doc.add_table(rows=0, cols=2)
tbl.style = "Table Grid"
tbl.alignment = WD_TABLE_ALIGNMENT.LEFT
for label, line_len in pairs:
row = tbl.add_row()
row.height = Pt(22)
c0, c1 = row.cells
c0.width = Inches(col_widths[0])
c1.width = Inches(col_widths[1])
shade_cell(c0, "EBF3FB")
p0 = c0.paragraphs[0]
p0.paragraph_format.space_before = Pt(1)
r0 = p0.add_run(label)
r0.bold = True
r0.font.size = Pt(10)
r0.font.color.rgb = DARK_BLUE
p1 = c1.paragraphs[0]
p1.paragraph_format.space_before = Pt(1)
r1 = p1.add_run("_" * line_len)
r1.font.color.rgb = RGBColor(0xAA, 0xAA, 0xAA)
return tbl
# ─────────────────────────────────────────────────────────────────────────────
# DOCUMENT TITLE BLOCK
# ─────────────────────────────────────────────────────────────────────────────
# Top banner
banner = doc.add_paragraph()
banner.alignment = WD_ALIGN_PARAGRAPH.CENTER
banner.paragraph_format.space_before = Pt(0)
banner.paragraph_format.space_after = Pt(0)
pPr = banner._p.get_or_add_pPr()
shd = OxmlElement("w:shd")
shd.set(qn("w:val"), "clear")
shd.set(qn("w:color"), "auto")
shd.set(qn("w:fill"), "1A3C6E")
pPr.append(shd)
r = banner.add_run("PEDIATRIC ONCOLOGY")
r.bold = True
r.font.size = Pt(18)
r.font.color.rgb = WHITE
r.font.name = "Calibri"
banner2 = doc.add_paragraph()
banner2.alignment = WD_ALIGN_PARAGRAPH.CENTER
banner2.paragraph_format.space_before = Pt(0)
banner2.paragraph_format.space_after = Pt(6)
pPr2 = banner2._p.get_or_add_pPr()
shd2 = OxmlElement("w:shd")
shd2.set(qn("w:val"), "clear")
shd2.set(qn("w:color"), "auto")
shd2.set(qn("w:fill"), "1A3C6E")
pPr2.append(shd2)
r2 = banner2.add_run("HISTORY COLLECTION FORM")
r2.bold = True
r2.font.size = Pt(14)
r2.font.color.rgb = RGBColor(0xD6, 0xE8, 0xFF)
r2.font.name = "Calibri"
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 1 - IDENTIFYING DATA
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 1: IDENTIFYING / GENERAL DATA")
two_col_fields([
("Patient Name", 35),
("Date of Birth", 20),
("Age", 10),
("Sex", 10),
("Medical Record No.", 20),
("Date of Assessment", 20),
("Ward / Clinic", 20),
("Referring Physician", 25),
("Address", 35),
("Contact No. (Parent/Guardian)", 25),
("Informant", 30),
("Relationship to Patient", 25),
("Reliability of History", 25),
])
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 2 - CHIEF COMPLAINT
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 2: CHIEF COMPLAINT")
note_para('Record in patient\'s / caregiver\'s own words')
field_line("Chief Complaint", 55)
field_line("Duration", 30)
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 3 - HISTORY OF PRESENT ILLNESS
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 3: HISTORY OF PRESENT ILLNESS (HPI)")
sub_heading("A. Symptom Analysis (SOCRATES)")
hpi_tbl = doc.add_table(rows=0, cols=2)
hpi_tbl.style = "Table Grid"
hpi_fields = [
("Onset", "Sudden / Gradual Date: _______________"),
("Duration", "___________________________"),
("Character / Nature", "___________________________"),
("Location / Radiation","___________________________"),
("Severity (0-10)", "___________________________"),
("Modifying Factors", "Better with: ____________ Worse with: ____________"),
("Associated Symptoms", "___________________________"),
("Course / Progression","Static / Progressive / Improving / Fluctuating"),
]
for i, (lbl, placeholder) in enumerate(hpi_fields):
row = hpi_tbl.add_row()
row.height = Pt(22)
c0, c1 = row.cells
c0.width = Inches(2.2)
c1.width = Inches(3.8)
shade_cell(c0, "EBF3FB" if i % 2 == 0 else "F5F5F5")
p0 = c0.paragraphs[0]
r0 = p0.add_run(lbl)
r0.bold = True
r0.font.size = Pt(10)
r0.font.color.rgb = DARK_BLUE
p1 = c1.paragraphs[0]
r1 = p1.add_run(placeholder)
r1.font.size = Pt(10)
r1.font.color.rgb = RGBColor(0x88, 0x88, 0x88)
sub_heading("B. B-Symptom Screening (\"Red Flag\" Review)")
note_para("Tick all that apply — mandatory screening for ALL pediatric oncology visits", color=RED_FLAG)
bf_tbl = doc.add_table(rows=0, cols=4)
bf_tbl.style = "Table Grid"
bf_tbl.alignment = WD_TABLE_ALIGNMENT.LEFT
# Header row
hrow = bf_tbl.add_row()
for cell, txt in zip(hrow.cells, ["Symptom", "Present?", "Duration", "Notes"]):
shade_cell(cell, "1F6FB8")
p = cell.paragraphs[0]
r = p.add_run(txt)
r.bold = True
r.font.size = Pt(10)
r.font.color.rgb = WHITE
b_symptoms = [
"Unexplained weight loss (>10% in 3 months)",
"Persistent / recurrent fever (>2 weeks, unexplained)",
"Drenching night sweats",
"Severe unexplained fatigue / lethargy",
"Pallor (unexplained anaemia)",
"Petechiae / purpura / easy bruising",
"Unexplained bleeding",
"Lymphadenopathy (>1 cm, >4 wks, hard, non-tender)",
"Hepatosplenomegaly",
"Palpable abdominal / neck mass",
"Bone pain (especially nocturnal or at rest)",
"Limp or refusal to walk",
"Headache (persistent / morning / with vomiting)",
"Visual changes / proptosis",
"New neurological deficit / ataxia / seizures",
"Precocious puberty / growth failure",
]
for i, sym in enumerate(b_symptoms):
row = bf_tbl.add_row()
row.height = Pt(20)
c0, c1, c2, c3 = row.cells
c0.width = Inches(2.8)
c1.width = Inches(0.8)
c2.width = Inches(1.0)
c3.width = Inches(1.4)
bg = "F5F9FF" if i % 2 == 0 else "FFFFFF"
for c in (c0, c1, c2, c3):
shade_cell(c, bg)
c0.paragraphs[0].add_run(sym).font.size = Pt(9.5)
c1.paragraphs[0].add_run("\u25a1 Yes \u25a1 No").font.size = Pt(9.5)
c2.paragraphs[0].add_run("_________").font.size = Pt(9.5)
c3.paragraphs[0].add_run("_________").font.size = Pt(9.5)
# Narrative notes
doc.add_paragraph()
sub_heading("C. HPI Narrative")
note_para("Summarise the history of present illness in chronological order:")
for _ in range(5):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(1)
p.paragraph_format.space_after = Pt(1)
r = p.add_run("_" * 95)
r.font.color.rgb = RGBColor(0xBB, 0xBB, 0xBB)
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 4 - PAST MEDICAL & SURGICAL HISTORY
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 4: PAST MEDICAL & SURGICAL HISTORY")
sub_heading("A. Previous Illnesses / Hospitalizations")
pmh_tbl = doc.add_table(rows=1, cols=3)
pmh_tbl.style = "Table Grid"
for cell, txt in zip(pmh_tbl.rows[0].cells, ["Condition / Illness", "Year", "Hospital / Treatment"]):
shade_cell(cell, "1F6FB8")
r = cell.paragraphs[0].add_run(txt)
r.bold = True; r.font.size = Pt(10); r.font.color.rgb = WHITE
for _ in range(4):
row = pmh_tbl.add_row()
row.height = Pt(22)
for c in row.cells:
shade_cell(c, "FAFAFA")
sub_heading("B. Previous Oncology / Cancer History")
two_col_fields([
("Prior Cancer Diagnosis", 30),
("Type of Cancer", 30),
("Year of Diagnosis", 20),
("Previous Chemotherapy", 30),
("Previous Radiotherapy", 30),
("Previous Surgery", 30),
("Previous Transfusions", 20),
])
sub_heading("C. Known Genetic / Predisposition Syndromes")
note_para("Tick if present:")
syndromes = [
"Down syndrome (Trisomy 21)", "Li-Fraumeni syndrome (TP53)",
"Neurofibromatosis type 1 (NF1)", "Neurofibromatosis type 2 (NF2)",
"Beckwith-Wiedemann syndrome", "von Hippel-Lindau syndrome",
"BRCA1 / BRCA2 mutation", "Lynch syndrome",
"DICER1 syndrome", "Constitutional mismatch repair deficiency (CMMRD)",
"Fanconi anaemia", "Bloom syndrome",
"Ataxia-telangiectasia", "Wiskott-Aldrich syndrome",
"Other (specify): ____________", "",
]
syn_tbl = doc.add_table(rows=0, cols=2)
syn_tbl.style = "Table Grid"
for i in range(0, len(syndromes), 2):
row = syn_tbl.add_row()
row.height = Pt(18)
for j, txt in enumerate(syndromes[i:i+2]):
c = row.cells[j]
shade_cell(c, "F5F9FF" if i % 4 == 0 else "FFFFFF")
p = c.paragraphs[0]
r = p.add_run(f"\u25a1 {txt}")
r.font.size = Pt(9.5)
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 5 - FAMILY HISTORY
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 5: FAMILY HISTORY")
note_para("~10% of pediatric oncology patients have a heritable cancer predisposition syndrome — obtain thorough family cancer history", color=RED_FLAG)
fh_tbl = doc.add_table(rows=1, cols=4)
fh_tbl.style = "Table Grid"
for cell, txt in zip(fh_tbl.rows[0].cells, ["Relation", "Cancer Type", "Age at Diagnosis", "Genetic Testing Done?"]):
shade_cell(cell, "1F6FB8")
r = cell.paragraphs[0].add_run(txt)
r.bold = True; r.font.size = Pt(10); r.font.color.rgb = WHITE
relations = ["Father", "Mother", "Sibling 1", "Sibling 2", "Paternal Grandfather",
"Paternal Grandmother", "Maternal Grandfather", "Maternal Grandmother", "Other"]
for rel in relations:
row = fh_tbl.add_row()
row.height = Pt(20)
shade_cell(row.cells[0], "EBF3FB")
row.cells[0].paragraphs[0].add_run(rel).font.size = Pt(9.5)
for c in row.cells[1:]:
shade_cell(c, "FAFAFA")
doc.add_paragraph()
checkbox_line("Consanguinity in parents? Details: ___________________________")
checkbox_line("Unexplained childhood deaths in family? Details: ___________________________")
checkbox_line("Multiple primary tumors in a relative? Details: ___________________________")
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 6 - BIRTH & ANTENATAL HISTORY
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 6: BIRTH & ANTENATAL HISTORY")
two_col_fields([
("Gestational Age at Birth", 20),
("Mode of Delivery", 25),
("Birth Weight", 15),
("APGAR Score (1 min / 5 min)", 20),
("Maternal Age at Delivery", 15),
("Maternal Health During Pregnancy", 35),
("Drug / Toxin / Radiation Exposure", 35),
("Neonatal Complications", 35),
("Congenital Anomalies Noted", 35),
])
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 7 - DEVELOPMENTAL HISTORY
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 7: DEVELOPMENTAL HISTORY")
dev_tbl = doc.add_table(rows=1, cols=3)
dev_tbl.style = "Table Grid"
for cell, txt in zip(dev_tbl.rows[0].cells, ["Milestone", "Expected Age", "Age Achieved / Status"]):
shade_cell(cell, "1F6FB8")
r = cell.paragraphs[0].add_run(txt)
r.bold = True; r.font.size = Pt(10); r.font.color.rgb = WHITE
milestones = [
("Smiled socially", "6 weeks"),
("Sat unsupported", "6 months"),
("Walked independently", "12-15 months"),
("First words", "12 months"),
("Two-word phrases", "18-24 months"),
("Toilet trained", "2-3 years"),
("School entry", "5-6 years"),
]
for i, (ms, exp) in enumerate(milestones):
row = dev_tbl.add_row()
row.height = Pt(20)
shade_cell(row.cells[0], "EBF3FB" if i % 2 == 0 else "F5F5F5")
shade_cell(row.cells[1], "EBF3FB" if i % 2 == 0 else "F5F5F5")
shade_cell(row.cells[2], "FAFAFA")
row.cells[0].paragraphs[0].add_run(ms).font.size = Pt(9.5)
row.cells[1].paragraphs[0].add_run(exp).font.size = Pt(9.5)
row.cells[2].paragraphs[0].add_run("________________").font.size = Pt(9.5)
doc.add_paragraph()
checkbox_line("Regression of previously acquired milestones? (Especially important for CNS tumors)")
field_line("School performance / recent academic change", 35)
field_line("Behavioural changes noted", 40)
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 8 - IMMUNIZATION HISTORY
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 8: IMMUNIZATION HISTORY")
note_para("Critical before initiating chemotherapy — document baseline and any live vaccines received")
checkbox_line("Immunizations up to date for age?")
field_line("Last vaccine given (name + date)", 40)
checkbox_line("Live vaccines received in past 4 weeks? (BCG, MMR, Varicella, OPV) Details: _______________")
checkbox_line("Immunization record available?")
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 9 - NUTRITIONAL HISTORY
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 9: NUTRITIONAL HISTORY")
two_col_fields([
("Breastfeeding (duration)", 20),
("Current Diet (describe)", 40),
("Appetite", 20),
("Recent Weight Change", 25),
("Current Weight (kg)", 10),
("Current Height / Length (cm)", 15),
("Weight-for-Age z-score", 10),
("Height-for-Age z-score", 10),
("BMI", 10),
("Nutritional Supplements Used", 30),
])
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 10 - DRUG HISTORY & ALLERGIES
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 10: DRUG HISTORY & ALLERGIES")
sub_heading("A. Current Medications")
drug_tbl = doc.add_table(rows=1, cols=4)
drug_tbl.style = "Table Grid"
for cell, txt in zip(drug_tbl.rows[0].cells, ["Drug Name", "Dose", "Frequency", "Indication"]):
shade_cell(cell, "1F6FB8")
r = cell.paragraphs[0].add_run(txt)
r.bold = True; r.font.size = Pt(10); r.font.color.rgb = WHITE
for _ in range(6):
row = drug_tbl.add_row()
row.height = Pt(20)
for c in row.cells:
shade_cell(c, "FAFAFA")
sub_heading("B. Allergies")
allergy_tbl = doc.add_table(rows=1, cols=3)
allergy_tbl.style = "Table Grid"
for cell, txt in zip(allergy_tbl.rows[0].cells, ["Allergen", "Type of Reaction", "Severity"]):
shade_cell(cell, "1F6FB8")
r = cell.paragraphs[0].add_run(txt)
r.bold = True; r.font.size = Pt(10); r.font.color.rgb = WHITE
for _ in range(3):
row = allergy_tbl.add_row()
row.height = Pt(20)
for c in row.cells:
shade_cell(c, "FAFAFA")
checkbox_line("No Known Drug Allergies (NKDA)")
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 11 - SOCIAL HISTORY
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 11: SOCIAL HISTORY")
two_col_fields([
("Household Composition", 40),
("Primary Caregiver", 25),
("Caregiver Education Level", 25),
("Caregiver Employment Status", 25),
("Financial Status / Insurance", 30),
("Distance from Treatment Centre", 25),
("Transport Availability", 25),
("School Attendance", 20),
])
doc.add_paragraph()
checkbox_line("Tobacco smoke exposure in household?")
checkbox_line("Substance use in household?")
checkbox_line("Child protection concerns? Details: ____________________________")
checkbox_line("Psychosocial support available (extended family / community / religious)?")
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 12 - REVIEW OF SYSTEMS
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 12: REVIEW OF SYSTEMS (ROS)")
note_para("Circle or tick: Y = Yes | N = No | NK = Not Known")
ros_systems = [
("Constitutional", ["Fever", "Weight loss", "Night sweats", "Fatigue", "Anorexia", "Malaise"]),
("HEENT", ["Headache", "Visual changes", "Proptosis", "Hearing loss", "Nasal obstruction", "Oral ulcers"]),
("Respiratory", ["Cough", "Dyspnoea", "Stridor", "Haemoptysis", "Wheeze"]),
("Cardiovascular", ["Palpitations", "Chest pain", "Oedema", "Syncope"]),
("Gastrointestinal", ["Abdominal pain", "Abdominal mass", "Nausea / vomiting", "Change in bowel habits", "Rectal bleeding", "Jaundice"]),
("Genitourinary", ["Haematuria", "Frequency / dysuria", "Testicular swelling (M)", "Pelvic mass (F)"]),
("Musculoskeletal", ["Bone / joint pain", "Nocturnal pain", "Limp", "Pathological fracture", "Muscle weakness"]),
("Neurological", ["Headache", "Seizures", "Focal weakness", "Ataxia", "Behavioural change", "Cranial nerve deficit"]),
("Skin / Lymphatic", ["Pallor", "Jaundice", "Petechiae / purpura", "Café-au-lait spots", "Rash", "Lymphadenopathy"]),
("Endocrine", ["Precocious puberty", "Growth failure", "Polydipsia / polyuria", "Galactorrhoea"]),
("Psychological", ["Anxiety", "Depression", "Behavioural change", "School difficulties", "Sleep disturbance"]),
]
for sys_name, items in ros_systems:
ros_tbl = doc.add_table(rows=2, cols=len(items) if len(items) <= 4 else 4)
ros_tbl.style = "Table Grid"
# System name header spanning all columns
hrow = ros_tbl.rows[0]
hrow.cells[0].paragraphs[0].add_run(sys_name).font.size = Pt(10)
hrow.cells[0].paragraphs[0].runs[0].bold = True
hrow.cells[0].paragraphs[0].runs[0].font.color.rgb = WHITE
shade_cell(hrow.cells[0], "1F6FB8")
# Merge all header cells
if len(hrow.cells) > 1:
merged = hrow.cells[0].merge(hrow.cells[-1])
# Symptom rows
cols = 4
for chunk_start in range(0, len(items), cols):
chunk = items[chunk_start:chunk_start+cols]
if chunk_start > 0:
new_row = ros_tbl.add_row()
else:
new_row = ros_tbl.rows[1]
new_row.height = Pt(20)
for j, itm in enumerate(chunk):
c = new_row.cells[j]
shade_cell(c, "F5F9FF")
p = c.paragraphs[0]
p.add_run(f"\u25a1 {itm}").font.size = Pt(9)
for j in range(len(chunk), cols):
shade_cell(new_row.cells[j], "FAFAFA")
doc.add_paragraph().paragraph_format.space_after = Pt(2)
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 13 - GOALS OF CARE & FAMILY UNDERSTANDING
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 13: GOALS OF CARE & FAMILY UNDERSTANDING")
goc_questions = [
"What does the family currently understand about the diagnosis?",
"What are the family's main concerns / fears?",
"What are the treatment goals? (Curative / Quality of life / Palliation)",
"Cultural, religious, or personal beliefs that may affect treatment decisions?",
"Support systems available (family, community, religious, counselling)?",
"Caregiver emotional wellbeing — any signs of burnout or depression?",
]
for q in goc_questions:
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(3)
p.paragraph_format.space_after = Pt(1)
run = p.add_run(f" {q}")
run.bold = True
run.font.size = Pt(10)
run.font.color.rgb = DARK_BLUE
for _ in range(2):
lp = doc.add_paragraph()
lp.paragraph_format.space_before = Pt(0)
lp.paragraph_format.space_after = Pt(0)
lp.paragraph_format.left_indent = Inches(0.3)
lp.add_run("_" * 88).font.color.rgb = RGBColor(0xBB, 0xBB, 0xBB)
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 14 - FUNCTIONAL STATUS
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 14: FUNCTIONAL STATUS ASSESSMENT")
sub_heading("Lansky Performance Scale (Children <16 years)")
lansky_data = [
("100", "Fully active, normal"),
("90", "Minor restrictions in strenuous physical activity"),
("80", "Active but tires more quickly; restricted strenuous activity"),
("70", "Greater restriction of active play; less time in play activity"),
("60", "Up and around; active in quiet play only"),
("50", "Gets dressed but lies around much of the day; no active play"),
("40", "Mostly in bed; participates in quiet activities"),
("30", "In bed; needs assistance for most self-care"),
("20", "Often sleeping; can only take liquids; limited self-care"),
("10", "No play; does not get out of bed; does not eat"),
("0", "Unresponsive"),
]
ls_tbl = doc.add_table(rows=1, cols=3)
ls_tbl.style = "Table Grid"
for cell, txt in zip(ls_tbl.rows[0].cells, ["Score", "Description", "Select"]):
shade_cell(cell, "1F6FB8")
r = cell.paragraphs[0].add_run(txt)
r.bold = True; r.font.size = Pt(10); r.font.color.rgb = WHITE
for i, (score, desc) in enumerate(lansky_data):
row = ls_tbl.add_row()
row.height = Pt(18)
shade_cell(row.cells[0], "EBF3FB" if i % 2 == 0 else "F5F5F5")
shade_cell(row.cells[1], "EBF3FB" if i % 2 == 0 else "F5F5F5")
shade_cell(row.cells[2], "FFFFF0")
row.cells[0].paragraphs[0].add_run(score).font.size = Pt(9.5)
row.cells[1].paragraphs[0].add_run(desc).font.size = Pt(9.5)
row.cells[2].paragraphs[0].add_run("\u25a1").font.size = Pt(11)
doc.add_paragraph()
field_line("Lansky Score Selected", 10)
field_line("Karnofsky Score (if adolescent >16 yrs)", 10)
field_line("Activities of Daily Living (describe)", 40)
# ─────────────────────────────────────────────────────────────────────────────
# SECTION 15 - CLINICIAN SIGN-OFF
# ─────────────────────────────────────────────────────────────────────────────
section_heading("SECTION 15: CLINICIAN SIGN-OFF")
two_col_fields([
("History Collected By", 30),
("Designation / Grade", 25),
("Date", 20),
("Time", 15),
("Signature", 30),
("Supervisor / Consultant",30),
("Supervisor Signature", 30),
])
# ─────────────────────────────────────────────────────────────────────────────
# FOOTER note
# ─────────────────────────────────────────────────────────────────────────────
doc.add_paragraph()
footer_p = doc.add_paragraph()
footer_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
fr = footer_p.add_run(
"This form is for clinical use only. Maintain patient confidentiality at all times. "
"Based on Harriet Lane Handbook 23rd Ed. & standard pediatric oncology clinical guidelines."
)
fr.italic = True
fr.font.size = Pt(8)
fr.font.color.rgb = RGBColor(0x88, 0x88, 0x88)
# ─────────────────────────────────────────────────────────────────────────────
# SAVE
# ─────────────────────────────────────────────────────────────────────────────
out_path = "/tmp/workspace/pediatric-oncology/Pediatric_Oncology_History_Form.docx"
doc.save(out_path)
print(f"Saved: {out_path}")
cd /tmp/workspace/pediatric-oncology && python3 create_template.py 2>&1
python3 -c " from docx import Document doc = Document('/tmp/workspace/pediatric-oncology/Pediatric_Oncology_History_Form.docx') for p in doc.paragraphs[:30]: if p.text.strip(): print(f'[{p.style.name}] {p.text[:80]}') "
ls -lh /tmp/workspace/pediatric-oncology/Pediatric_Oncology_History_Form.docx
Pediatric Oncology History Form
Word Document · DOCX
| Section | Content |
|---|---|
| 1. Identifying Data | Patient demographics, MRN, informant, referral details |
| 2. Chief Complaint | Free-text + duration field |
| 3. HPI | SOCRATES analysis table, B-symptom / Red Flag checklist (16 items with Yes/No/Duration columns), narrative writing lines |
| 4. Past Medical & Surgical History | Hospitalization table, prior oncology treatment, known genetic syndromes checklist (14 syndromes) |
| 5. Family History | 9-relation cancer table, consanguinity, unexplained childhood deaths |
| 6. Birth & Antenatal History | Gestational age, mode of delivery, exposures, anomalies |
| 7. Developmental History | 7-milestone table, regression checkbox, school performance |
| 8. Immunization History | Up-to-date status, live vaccine alert |
| 9. Nutritional History | Dietary intake, anthropometric z-scores, BMI |
| 10. Drug History & Allergies | Current medications table, allergy table |
| 11. Social History | Household, caregiver, financial, transport, smoke/substance exposure |
| 12. Review of Systems | 11 organ systems, 60+ symptom checkboxes in colour-coded tables |
| 13. Goals of Care | 6 structured questions on family understanding, treatment goals, cultural beliefs |
| 14. Functional Status | Full Lansky Performance Scale (0-100) with select column, Karnofsky field |
| 15. Clinician Sign-off | Collector details, supervisor cosignature |
Retinoblastoma history collect format
retinoblastoma clinical history taking format presentation diagnosis
https://www.intechopen.com/chapters/66491
retinoblastoma leukocoria white pupil reflex child

This clinical photograph displays a 5-year-old female child exhibiting a classic hallmark sign of intraocular pathology. The primary finding is leukocoria, or a 'white reflex,' visible in the patient's right eye. While the left eye demonstrates a normal dark pupillary reflex, the right pupil shows a distinct yellowish-white opacification instead of the normal red reflex. This visual phenomenon is highly characteristic of retinoblastoma, the most common primary intraocular malignancy of childhood. The image serves as an educational tool for ophthalmology and pediatrics, emphasizing the importance of recognizing abnormal pupillary reflexes during routine physical examinations. Early detection of leukocoria is critical for the diagnosis of potentially life-threatening and sight-threatening conditions, including retinoblastoma, Coats' disease, or congenital cataracts. The photograph illustrates the typical presentation where a parent or clinician might first notice the abnormality in dim lighting or via flash photography.

A clinical photograph of an infant demonstrating leukocoria (white pupillary reflex) and anisocoria. An adult's hand is seen retracting the infant's right upper eyelid to facilitate visualization of the globe. The right pupil exhibits a prominent, milky-white opacification, characteristic of an abnormal red reflex. There is visible nasal deviation of the right eye, suggesting esotropia or pseudostrabismus. The left pupil appears comparatively darker with a bluish-gray hue. This visual presentation is critical in pediatric ophthalmology for the differential diagnosis of conditions such as congenital cataracts, retinoblastoma, or Coats' disease. The image illustrates the 'white reflex' or cat's eye reflex, a significant clinical finding requiring urgent diagnostic evaluation to rule out intraocular malignancy or vision-threatening pathologies.

| Field | Entry |
|---|---|
| Patient name | |
| Date of birth / Age | |
| Sex | |
| Medical record number | |
| Date of assessment | |
| Referring physician / source | |
| Address / Contact (parent) | |
| Informant & relationship | |
| Reliability of history |
| Symptom | Present? | Eye (R/L/B) | Onset | Duration | Progression |
|---|---|---|---|---|---|
| Leukocoria (white pupil / "cat's eye" / white flash in photos) | |||||
| Strabismus (squint / eye turn) | |||||
| Decreased / poor vision | |||||
| Red eye (without obvious infection) | |||||
| Painful eye | |||||
| Proptosis (bulging eye) | |||||
| Tearing / watering | |||||
| Photophobia | |||||
| Periorbital swelling / redness | |||||
| Hyphema (blood in front of eye) | |||||
| Change in pupil size or shape |
Key questions to ask:
- "Have you noticed a white glow or white spot in your child's eye in photographs taken with flash?"
- "Does the eye look different in dim lighting compared to bright light?"
- "Has your child been bumping into things or showing difficulty seeing?"
| Parameter | Details |
|---|---|
| Gestational age at birth | |
| Mode of delivery | |
| Birth weight | |
| Prematurity? (if yes: gestational age, NICU admission, oxygen therapy duration) | |
| Maternal health during pregnancy | |
| Maternal infections during pregnancy (TORCH: toxoplasmosis, rubella, CMV, herpes) | |
| Drug / toxin / radiation exposure in pregnancy | |
| Neonatal complications | |
| Was leukocoria present at birth or noticed later? | |
| Hearing problems at birth or early infancy (helps DD) |
Note: History of prematurity + oxygen therapy raises ROP in the differential. TORCH infections can cause retinal lesions mimicking RB. Leukocoria present from birth suggests congenital cataract or PHPV rather than RB.
~40% of retinoblastoma is heritable (germline RB1 mutation). A positive family history points strongly to the diagnosis, as simulating lesions do not occur in this setting. - Kanski's Clinical Ophthalmology & IntechOpen
| Relation | Cancer / Eye Condition | Age at Diagnosis | Eye Removed? | Treatment Given |
|---|---|---|---|---|
| Father | ||||
| Mother | ||||
| Sibling 1 | ||||
| Sibling 2 | ||||
| Paternal grandfather | ||||
| Paternal grandmother | ||||
| Maternal grandfather | ||||
| Maternal grandmother | ||||
| Paternal uncle / aunt | ||||
| Maternal uncle / aunt |
| Parameter | Details |
|---|---|
| Prior ocular diagnoses | |
| Prior ocular surgeries / procedures | |
| Previous retinoblastoma treatment (if known case) | |
| History of prior chemotherapy | |
| History of radiotherapy (eye / head) | |
| Chromosomal / genetic conditions (Down syndrome / 13q deletion syndrome) | |
| Other systemic malignancies | |
| Hospitalizations | |
| Blood transfusions |
Note: 13q deletion syndrome (partial deletion of chromosome 13q) is associated with retinoblastoma plus dysmorphic features, intellectual disability, and growth delay. Ask specifically about these features.
| Field | Details |
|---|---|
| Current eye drops / medications | |
| Systemic medications | |
| Herbal / traditional remedies applied to eye | |
| Drug allergies (with reaction type) |
| Parameter | Details |
|---|---|
| Household composition | |
| Primary caregiver | |
| Distance from ophthalmology / oncology centre | |
| Financial status / health insurance | |
| Prior healthcare seeking (traditional / religious healers?) | |
| Psychosocial impact on parents (anxiety, depression - note for referral) |
Note: The psychological impact on parents of a child with retinoblastoma is high, with many experiencing depression, anxiety and stress (Kanski's Clinical Ophthalmology, 10th ed.). Psychosocial support referral should be considered at first visit.
Note: Trilateral retinoblastoma = bilateral RB + pinealoblastoma. Occurs in ~10% of heritable cases, usually before age 5. - Kanski's
| Condition | Key History Points to Ask |
|---|---|
| Coats disease (most common simulator) | Male child, unilateral, no family history, older age (~5 yrs), yellow fundal reflex |
| PHPV / PFV (persistent hyperplastic primary vitreous) | Leukocoria from birth, microphthalmos, no family history |
| Retinopathy of Prematurity | Prematurity, NICU, oxygen therapy history |
| Toxocariasis | Dog / cat contact, soil play, pica |
| Congenital cataract | Leukocoria from birth, family history of cataracts |
| Endophthalmitis | Preceding fever, systemic illness, trauma |
| Coloboma | Keyhole-shaped pupil, may be familial |
| Retinal detachment | Trauma history, older child, Marfan features |
| Group | Description | Eye Affected |
|---|---|---|
| A | Small tumors <3 mm, away from foveola and disc | R / L / B |
| B | Tumors >3 mm, macular/juxtapapillary location, or subretinal fluid | |
| C | Focal subretinal or vitreous seeding within 3 mm of tumor | |
| D | Diffuse subretinal or vitreous seeding >3 mm from tumor | |
| E | Extensive RB >50% of globe, glaucoma, hemorrhage, or extraocular extension |
| Field | |
|---|---|
| History taken by | |
| Designation | |
| Date & Time | |
| Supervisor cosignature |
| Feature | Statistic |
|---|---|
| Most common presentation | Leukocoria (60-80%) |
| 2nd most common | Strabismus (20-30%) |
| Age of diagnosis - bilateral | ~9-12 months |
| Age of diagnosis - unilateral | ~24-30 months |
| Heritable cases | ~40% (germline RB1 mutation) |
| Bilateral cases | ~40% |
| Risk of second malignancy (heritable) | ~6% (30% if external beam RT used) |
| Trilateral RB (+ pinealoblastoma) | ~10% of heritable cases |
| Survival (developed nations) | >95% |