Hi
I want information about urogenital examination for use in collage project
| Region | Key Examination Technique | Significant Findings |
|---|---|---|
| Flank / Kidney | CVA percussion, bimanual palpation | Tenderness (pyelonephritis, stones), mass (tumor, PKD) |
| Bladder | Suprapubic palpation/percussion | Distension (urinary retention) |
| Penis | Inspection of meatus, foreskin, shaft | Hypospadias, phimosis, Peyronie plaques |
| Scrotum/Testis | Bimanual palpation, transillumination | Testicular mass, orchitis, varicocele, hydrocele |
| Epididymis | Posterior ridge palpation | Epididymitis, cysts |
| Inguinal canal | Digital invagination + Valsalva | Inguinal hernia |
| Prostate | Digital rectal exam | BPH, prostatitis, prostate cancer |
| Female pelvis | Pelvic exam + CVA tenderness | PID, adnexal mass, ectopic pregnancy |
Can you make 2*5feetvchart
mkdir -p /home/daytona/workspace/urogenital-poster && ls /home/daytona/workspace…
~/urogenital-poster/generate_poster.py
from reportlab.lib.pagesizes import inch
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import KeepTogether
# ── Page size: 2 ft wide × 5 ft tall ──────────────────────────────────────────
PAGE_W = 2 * 12 * inch # 24 inches
PAGE_H = 5 * 12 * inch # 60 inches
MARGIN = 0.4 * inch
# ── Colour palette ─────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MID_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
TEAL = colors.HexColor("#1B7A75")
LIGHT_TEAL = colors.HexColor("#D0EFED")
ORANGE = colors.HexColor("#D4600A")
LIGHT_ORANGE= colors.HexColor("#FDEBD0")
GRAY_BG = colors.HexColor("#F4F6F8")
WHITE = colors.white
BLACK = colors.black
HEADING_BG = colors.HexColor("#0D2B45")
# ── Styles ─────────────────────────────────────────────────────────────────────
def make_styles():
main_title = ParagraphStyle(
"MainTitle",
fontName="Helvetica-Bold",
fontSize=54,
textColor=WHITE,
alignment=TA_CENTER,
spaceAfter=6,
leading=62,
)
subtitle = ParagraphStyle(
"Subtitle",
fontName="Helvetica",
fontSize=28,
textColor=colors.HexColor("#A8D4F5"),
alignment=TA_CENTER,
spaceAfter=4,
leading=34,
)
section_title = ParagraphStyle(
"SectionTitle",
fontName="Helvetica-Bold",
fontSize=30,
textColor=WHITE,
alignment=TA_LEFT,
spaceAfter=0,
leading=36,
)
body = ParagraphStyle(
"Body",
fontName="Helvetica",
fontSize=18,
textColor=BLACK,
alignment=TA_LEFT,
spaceAfter=4,
leading=24,
)
bullet = ParagraphStyle(
"Bullet",
fontName="Helvetica",
fontSize=17,
textColor=colors.HexColor("#1A1A1A"),
alignment=TA_LEFT,
spaceAfter=3,
leading=22,
leftIndent=18,
bulletIndent=0,
bulletFontName="Helvetica-Bold",
bulletFontSize=17,
)
sub_bullet = ParagraphStyle(
"SubBullet",
fontName="Helvetica",
fontSize=15,
textColor=colors.HexColor("#333333"),
alignment=TA_LEFT,
spaceAfter=2,
leading=19,
leftIndent=36,
)
key_term = ParagraphStyle(
"KeyTerm",
fontName="Helvetica-Bold",
fontSize=17,
textColor=DARK_BLUE,
alignment=TA_LEFT,
spaceAfter=2,
leading=22,
leftIndent=10,
)
key_def = ParagraphStyle(
"KeyDef",
fontName="Helvetica",
fontSize=15,
textColor=colors.HexColor("#2A2A2A"),
alignment=TA_LEFT,
spaceAfter=5,
leading=19,
leftIndent=10,
)
table_header = ParagraphStyle(
"TableHeader",
fontName="Helvetica-Bold",
fontSize=17,
textColor=WHITE,
alignment=TA_CENTER,
leading=21,
)
table_cell = ParagraphStyle(
"TableCell",
fontName="Helvetica",
fontSize=15,
textColor=BLACK,
alignment=TA_LEFT,
leading=19,
)
source = ParagraphStyle(
"Source",
fontName="Helvetica-Oblique",
fontSize=13,
textColor=colors.HexColor("#555555"),
alignment=TA_CENTER,
leading=17,
)
return dict(
main_title=main_title, subtitle=subtitle,
section_title=section_title, body=body,
bullet=bullet, sub_bullet=sub_bullet,
key_term=key_term, key_def=key_def,
table_header=table_header, table_cell=table_cell,
source=source,
)
S = make_styles()
# ── Helper: coloured section header bar ───────────────────────────────────────
def section_header(text, bg=MID_BLUE, icon=""):
label = f"{icon} {text}" if icon else text
data = [[Paragraph(label, S["section_title"])]]
tbl = Table(data, colWidths=[PAGE_W - 2 * MARGIN])
tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), bg),
("TOPPADDING", (0, 0), (-1, -1), 10),
("BOTTOMPADDING", (0, 0), (-1, -1), 10),
("LEFTPADDING", (0, 0), (-1, -1), 16),
("RIGHTPADDING", (0, 0), (-1, -1), 16),
("ROUNDEDCORNERS", [6, 6, 6, 6]),
]))
return tbl
# ── Helper: bullet paragraph ──────────────────────────────────────────────────
def B(text, style="bullet"):
return Paragraph(f"• {text}", S[style])
def SB(text):
return Paragraph(f" ◦ {text}", S["sub_bullet"])
def SP(n=6):
return Spacer(1, n)
# ── Build content ──────────────────────────────────────────────────────────────
def build_story():
story = []
# ── TITLE BANNER ──────────────────────────────────────────────────────────
title_data = [[
Paragraph("UROGENITAL EXAMINATION", S["main_title"]),
]]
sub_data = [[
Paragraph("A Complete Clinical Reference for Medical Students", S["subtitle"]),
]]
title_tbl = Table(title_data, colWidths=[PAGE_W - 2 * MARGIN])
title_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), HEADING_BG),
("TOPPADDING", (0, 0), (-1, -1), 28),
("BOTTOMPADDING", (0, 0), (-1, -1), 6),
("LEFTPADDING", (0, 0), (-1, -1), 20),
("RIGHTPADDING", (0, 0), (-1, -1), 20),
]))
sub_tbl = Table(sub_data, colWidths=[PAGE_W - 2 * MARGIN])
sub_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), HEADING_BG),
("TOPPADDING", (0, 0), (-1, -1), 0),
("BOTTOMPADDING", (0, 0), (-1, -1), 24),
("LEFTPADDING", (0, 0), (-1, -1), 20),
("RIGHTPADDING", (0, 0), (-1, -1), 20),
]))
story.append(title_tbl)
story.append(sub_tbl)
story.append(SP(14))
# ── TWO-COLUMN LAYOUT using a Table ──────────────────────────────────────
col_w = (PAGE_W - 2 * MARGIN - 0.2 * inch) / 2
# ============================================================
# LEFT COLUMN content
# ============================================================
left = []
# 1. VITAL SIGNS
left.append(section_header("1. VITAL SIGNS", bg=DARK_BLUE))
left.append(SP(6))
left.append(B("Temperature"))
left.append(B("Heart rate"))
left.append(B("Blood pressure"))
left.append(B("Respiratory rate"))
left.append(B("Pain rating (0–10 scale)"))
left.append(SP(4))
left.append(Paragraph(
"Critically abnormal vitals (hypotension, tachycardia) require immediate triage to the emergency department.",
S["body"]))
left.append(SP(12))
# 2. GENERAL APPEARANCE
left.append(section_header("2. GENERAL APPEARANCE", bg=DARK_BLUE))
left.append(SP(6))
left.append(Paragraph("Four modes of examination:", S["body"]))
left.append(B("Inspection — Auscultation — Percussion — Palpation"))
left.append(SP(6))
left.append(Paragraph("Observe for:", S["body"]))
left.append(B("Pain / emotional distress level"))
left.append(B("Nutritional status & frailty (gait, grip strength, calf circumference)"))
left.append(B("Skin quality, hydration (moist mucous membranes)"))
left.append(B("Dentition quality"))
left.append(SP(4))
left.append(Paragraph("Urologically relevant stigmata:", S["body"]))
left.append(B("Gynecomastia → hyperestrogenic state (testicular/adrenal tumour)"))
left.append(B("Cushingoid features → buffalo hump, abdominal striae"))
left.append(B("Priapism → prolonged visible erection"))
left.append(B("Lymphedema → penile/scrotal lymphatic obstruction"))
left.append(B("Exophthalmos → Graves disease"))
left.append(SP(12))
# 3. ABDOMINAL EXAMINATION
left.append(section_header("3. ABDOMINAL EXAMINATION", bg=TEAL))
left.append(SP(6))
left.append(B("Inspect for suprapubic fullness → distended bladder (urinary retention)"))
left.append(B("Palpate for abdominal masses (renal tumours, polycystic kidneys)"))
left.append(SP(4))
left.append(Paragraph(
"<b>Costovertebral Angle (CVA) Tenderness:</b>", S["body"]))
left.append(B("Elicited by percussion over the flank (posterior costovertebral angle)"))
left.append(B("Positive result → suggests pyelonephritis or renal calculi"))
left.append(SP(12))
# 4. MALE GENITAL EXAM
left.append(section_header("4. MALE GENITAL EXAMINATION", bg=MID_BLUE))
left.append(SP(6))
left.append(Paragraph("<b>PENIS</b>", S["body"]))
left.append(B("Inspect meatus location (normally at tip of glans):"))
left.append(SB("Ventral surface → Hypospadias"))
left.append(SB("Dorsal surface → Epispadias"))
left.append(B("Uncircumcised: retract foreskin to expose glans"))
left.append(SB("Phimosis: foreskin cannot be retracted"))
left.append(SB("Paraphimosis: retracted foreskin trapped behind glans (emergency)"))
left.append(B("Inspect shaft for Peyronie plaques (fibrous scar → penile curvature)"))
left.append(SP(8))
left.append(Paragraph("<b>SCROTUM & TESTES</b>", S["body"]))
left.append(B("Palpate each testis between thumb and first two fingers"))
left.append(B("Normal: smooth, mobile, slightly tender"))
left.append(B("Small testis → prior infarct, hypogonadism, Klinefelter syndrome"))
left.append(B("Testicular tenderness → orchitis or torsion"))
left.append(B("<b>Hard testicular mass → testicular cancer until proven otherwise</b>"))
left.append(B("Epididymal masses (posterior ridge) → almost always benign"))
left.append(B("Vas deferens: palpable bilaterally — 'thick al dente linguini'"))
left.append(SP(8))
left.append(Paragraph("<b>TRANSILLUMINATION</b>", S["body"]))
left.append(B("Torch applied to scrotal mass in darkened room"))
left.append(SB("Fluid (hydrocele) → glows/transilluminates"))
left.append(SB("Solid mass → does not transilluminate"))
left.append(SP(8))
left.append(Paragraph("<b>VARICOCELE</b>", S["body"]))
left.append(B("'Bag of worms' — dilated pampiniform venous plexus"))
left.append(B("Best detected: patient standing + Valsalva manoeuvre"))
left.append(SP(12))
# ============================================================
# RIGHT COLUMN content
# ============================================================
right = []
# 5. INGUINAL HERNIA EXAM
right.append(section_header("5. INGUINAL CANAL / HERNIA", bg=MID_BLUE))
right.append(SP(6))
right.append(B("Place index finger over testis, invaginate scrotum toward external inguinal ring"))
right.append(B("Other hand palpates over internal ring and Hesselbach triangle"))
right.append(SB("Hesselbach triangle: bordered by inferior epigastric artery, inguinal ligament, midline"))
right.append(B("Patient performs Valsalva → hernia = distinct bulge against fingertip"))
right.append(B("Children: 'Silk glove sign' — hernia sac rolls over itself like a silk glove finger"))
right.append(SP(12))
# 6. DIGITAL RECTAL EXAM
right.append(section_header("6. DIGITAL RECTAL EXAM (DRE)", bg=DARK_BLUE))
right.append(SP(6))
right.append(Paragraph("<b>Indications:</b>", S["body"]))
right.append(B("Prostate size assessment"))
right.append(B("Detection / provocation of prostatitis"))
right.append(B("Prostate cancer screening"))
right.append(B("Neonates: evaluate for internal Müllerian structures"))
right.append(SP(6))
right.append(Paragraph("<b>Patient positioning:</b>", S["body"]))
right.append(B("Standing, bent ~90° at waist (hands on table), OR"))
right.append(B("Lateral decubitus position, hips and knees flexed"))
right.append(SP(6))
right.append(Paragraph("<b>Technique:</b>", S["body"]))
right.append(B("Non-dominant hand spreads gluteal folds — inspect anus for hemorrhoids or lesions"))
right.append(B("Gloved, lubricated finger advanced gently through anus"))
right.append(B("Advance until prostate is palpable"))
right.append(SP(6))
right.append(Paragraph("<b>Normal prostate findings:</b>", S["body"]))
right.append(B("Size of a chestnut"))
right.append(B("Feels like contracted thenar eminence (soft)"))
right.append(SP(4))
right.append(Paragraph("<b>Abnormal findings:</b>", S["body"]))
right.append(B("Nodular firmness ('feels like a flexed knuckle') → prostate cancer → biopsy"))
right.append(B("Tenderness → prostatitis"))
right.append(SP(6))
right.append(Paragraph(
"⚕ AUA Guideline: Prostate cancer screening offered to men aged <b>55–69 years</b>, every 2 years.",
S["body"]))
right.append(SP(12))
# 7. FEMALE PELVIC EXAM
right.append(section_header("7. FEMALE PELVIC EXAMINATION", bg=TEAL))
right.append(SP(6))
right.append(Paragraph("<b>Indications in urology / acute abdomen:</b>", S["body"]))
right.append(B("Acute lower abdominal pain"))
right.append(B("Suspected ectopic pregnancy"))
right.append(B("Adnexal mass"))
right.append(B("Pelvic Inflammatory Disease (PID)"))
right.append(B("Lower urinary tract symptoms"))
right.append(SP(6))
right.append(Paragraph("<b>Key assessments:</b>", S["body"]))
right.append(B("CVA tenderness (pyelonephritis)"))
right.append(B("Cervical motion tenderness → PID"))
right.append(B("Adnexal fullness or mass → ovarian cyst, ectopic pregnancy"))
right.append(B("Uterine tenderness or irregularity"))
right.append(SP(12))
# 8. SUMMARY TABLE
right.append(section_header("8. QUICK REFERENCE SUMMARY", bg=ORANGE))
right.append(SP(8))
t_style = S["table_header"]
c_style = S["table_cell"]
table_data = [
[Paragraph("Region", t_style),
Paragraph("Key Technique", t_style),
Paragraph("Significant Finding", t_style)],
[Paragraph("Flank / Kidney", c_style),
Paragraph("CVA percussion, bimanual palpation", c_style),
Paragraph("Tenderness → pyelonephritis/stones; Mass → tumour/PKD", c_style)],
[Paragraph("Bladder", c_style),
Paragraph("Suprapubic palpation & percussion", c_style),
Paragraph("Distension → urinary retention", c_style)],
[Paragraph("Penis", c_style),
Paragraph("Inspect meatus, foreskin, shaft", c_style),
Paragraph("Hypospadias, phimosis, Peyronie plaques", c_style)],
[Paragraph("Scrotum / Testis", c_style),
Paragraph("Bimanual palpation, transillumination", c_style),
Paragraph("Mass (cancer), orchitis, torsion, hydrocele", c_style)],
[Paragraph("Epididymis", c_style),
Paragraph("Posterior ridge palpation", c_style),
Paragraph("Epididymitis, cysts (benign)", c_style)],
[Paragraph("Inguinal Canal", c_style),
Paragraph("Digital invagination + Valsalva", c_style),
Paragraph("Inguinal hernia", c_style)],
[Paragraph("Prostate (DRE)", c_style),
Paragraph("Lubricated digital rectal exam", c_style),
Paragraph("BPH, prostatitis, prostate cancer", c_style)],
[Paragraph("Female Pelvis", c_style),
Paragraph("Pelvic exam + CVA percussion", c_style),
Paragraph("PID, adnexal mass, ectopic pregnancy", c_style)],
]
col1 = col_w * 0.22
col2 = col_w * 0.40
col3 = col_w * 0.38
tbl = Table(table_data, colWidths=[col1, col2, col3], repeatRows=1)
row_colors = [LIGHT_BLUE, WHITE] * 5
tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), DARK_BLUE),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("TOPPADDING", (0, 0), (-1, -1), 7),
("BOTTOMPADDING", (0, 0), (-1, -1), 7),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("GRID", (0, 0), (-1, -1), 0.5, colors.HexColor("#AAAAAA")),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [LIGHT_BLUE, WHITE]),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
right.append(tbl)
right.append(SP(12))
# 9. KEY TERMS
right.append(section_header("9. KEY TERMS GLOSSARY", bg=ORANGE))
right.append(SP(6))
terms = [
("Hypospadias", "Urethral meatus on ventral (underside) surface of penis"),
("Epispadias", "Urethral meatus on dorsal (top) surface of penis"),
("Phimosis", "Foreskin cannot be retracted over the glans"),
("Paraphimosis", "Retracted foreskin trapped behind the glans — urological emergency"),
("Hydrocele", "Fluid collection around the testis; transilluminates"),
("Varicocele", "Dilated pampiniform venous plexus; 'bag of worms'"),
("Orchitis", "Inflammation of the testis"),
("Epididymitis", "Inflammation of the epididymis"),
("Peyronie disease", "Fibrous plaques in penile shaft causing curvature"),
("CVA tenderness", "Costovertebral angle tenderness; sign of upper urinary tract pathology"),
("DRE", "Digital rectal examination; used to assess prostate"),
("Valsalva manoeuvre", "Forced expiration against closed airway; reveals varicocele/hernia"),
("Klinefelter syndrome", "47,XXY karyotype; associated with small testes, hypogonadism"),
("PID", "Pelvic inflammatory disease; ascending female genital tract infection"),
]
for term, defn in terms:
right.append(Paragraph(f"<b>{term}</b>", S["key_term"]))
right.append(Paragraph(defn, S["key_def"]))
# ── Pad columns to equal length
from reportlab.platypus import Spacer as Sp
two_col = Table(
[[left, right]],
colWidths=[col_w, col_w],
style=TableStyle([
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 0),
("BOTTOMPADDING",(0, 0), (-1, -1), 0),
])
)
story.append(two_col)
story.append(SP(18))
# ── SOURCES FOOTER ────────────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=1.5, color=DARK_BLUE))
story.append(SP(8))
story.append(Paragraph(
"Sources: Campbell Walsh Wein Urology, 3-Volume Set (Elsevier) • "
"Yamada's Textbook of Gastroenterology, 7th Ed. • AUA Guidelines",
S["source"]
))
return story
# ── Build PDF ──────────────────────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/urogenital-poster/Urogenital_Examination_Poster.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=(PAGE_W, PAGE_H),
leftMargin=MARGIN,
rightMargin=MARGIN,
topMargin=MARGIN,
bottomMargin=MARGIN,
)
doc.build(build_story())
print(f"✅ Poster saved to: {OUTPUT}")
python /home/daytona/workspace/urogenital-poster/generate_poster.py
ls -lh /home/daytona/workspace/urogenital-poster/
Urogenital Examination Poster
PDF Document · PDF
| Column | Sections |
|---|---|
| Left | 1. Vital Signs · 2. General Appearance · 3. Abdominal Exam · 4. Male Genital Exam (Penis, Scrotum, Transillumination, Varicocele) |
| Right | 5. Inguinal Canal/Hernia · 6. Digital Rectal Exam (DRE) · 7. Female Pelvic Exam · 8. Quick Reference Summary Table · 9. Key Terms Glossary |