A 60 year male patient is come our clinic 1 month ago wth complain of urine not pass then i inserted catheterisation adv psa usg psa range 11 usg showing 3rd grade prostamegaly and chronic cysties i injection Monoceff 1 gm bd for 7 days cap silodal d od 1 month now patient catheter remove and urination pass easy but what i do again i repeat usg same problem showing
benign prostatic hyperplasia urinary retention alpha blocker 5-alpha reductase inhibitor
PMID: 42095477
"Combination therapy (alpha-blocker and 5-alpha-reductase inhibitor) is better for the larger gland... combination therapy has a better outcome in glands bigger than 35g." - Bailey & Love's Short Practice of Surgery, 28th Ed.
| Priority | Action | Timeframe |
|---|---|---|
| Urgent | DRE examination | Now |
| Urgent | Repeat PSA (after infection settled) | 4-6 weeks |
| Important | Free PSA ratio if PSA still >4 | With repeat PSA |
| Important | Urology referral for biopsy if PSA >10 persists | After repeat PSA |
| Continue | Silodal-D (silodosin + dutasteride) | Minimum 6 months |
| Continue | Renal function tests (creatinine, urea) | Now + 3 months |
| Follow-up | USG with post-void residual | At 6 months |
| Symptomatic monitoring | Uroflowmetry if available | At 3 months |
A 60 year Male patient came 1 month back with acute urinary retention and suprapubic pain. He was diagnosed with prostatomegaly and underwent per urethral catheterization. After that, he was started on Silodosin. PSA was done which came 11 ng/ml. After around 10 days of catheterization, patient developed fever. TLC was 19000. Suspected catheter associated UTI and treated with Ceftriaxone 1 gm BD IV for 7 days. Patient improved clinically, fever subsided. Catheter was removed. Now patient is able to pass urine. No pain, only mild difficulty in urination. USG shows Grade III prostatomegaly with features of chronic cystitis. Query: Further management? Whether PSA should be repeated after some time and need to rule out malignancy vs benign cause.
PSA elevation urinary tract infection catheterization repeat testing
PSA elevation benign prostate conditions prostatitis BPH confounders repeat testing
prostate specific antigen BPH acute urinary retention management
PSA after urinary tract infection repeat interval prostate cancer screening
PSA repeat after UTI catheterization how long to wait prostate cancer evaluation guidelines
PSA prostate specific antigen false elevation urinary retention acute prostatitis interval repeat
"Clinicians should also recognize that urinary tract infections and instrumentation (e.g., recent bladder catheterization, prostate biopsy or cystoscopy, urinary retention) cause transient increases in PSA. PSA elevations in these settings should be repeated after appropriate time periods to allow for PSA to reach baseline level."
| Confounding factor present | Recommended wait before repeat PSA |
|---|---|
| UTI alone (mild) | 6 weeks after completing antibiotics |
| UTI + catheterization | 6-8 weeks after resolution |
| UTI + fever + urinary retention + catheterization (this patient) | 8-12 weeks after full resolution |
| Test | Favors BPH | Favors Malignancy |
|---|---|---|
| Free PSA % (free/total PSA ratio) | >25% | <10% |
| PSA density (PSA ÷ prostate volume in mL) | <0.15 ng/mL/mL | >0.15 ng/mL/mL |
| Digital Rectal Examination (DRE) | Smooth, rubbery, symmetric | Hard nodule, asymmetry, fixation |
Repeat PSA at 8-12 weeks
|
PSA normalized (<4)? ─── Yes ──► Continue BPH management,
| annual PSA monitoring
No
|
Perform DRE
Check Free PSA% + PSA density
|
Low-risk (free PSA >25%, density <0.15, normal DRE)
─── Consider MRI prostate before biopsy decision
High-risk (free PSA <10%, density >0.15, or abnormal DRE)
─── Refer Urology: mpMRI prostate ± TRUS/MRI-fusion biopsy
"Combination therapy (alpha-blocker and 5-alpha-reductase inhibitor) is better for the larger gland... combination therapy has a better outcome in glands bigger than 35g."
| Priority | Action | Timing |
|---|---|---|
| Immediate | DRE examination | Now |
| Immediate | Add Dutasteride 0.5 mg OD to Silodosin | Now |
| Immediate | Renal function tests (Cr, urea, eGFR) | Now |
| Important | Repeat PSA (same lab, standardized conditions) | 8-12 weeks post-resolution |
| Important | Free PSA% and PSA density at repeat testing | With repeat PSA |
| Important | mpMRI prostate if PSA remains elevated | After repeat PSA |
| Urology referral | If PSA still >10 + density >0.15 or abnormal DRE | After repeat PSA |
| Follow-up | USG with PVR, uroflowmetry | 3-6 months |
| Follow-up | Recheck renal function | 3 months |
Now tell what i do next step
0.15 ng/mL/mL → higher cancer risk, consider biopsy
| Result | What to Do |
|---|---|
| PSA normalized (<4 ng/mL) | Continue BPH medications, annual PSA monitoring |
| PSA 4-10 + normal DRE + free PSA >25% + density <0.15 | Active surveillance, repeat PSA in 6 months |
| PSA 4-10 + any suspicious feature | Order mpMRI prostate before deciding on biopsy |
| PSA still >10 OR abnormal DRE OR free PSA <10% | Refer to Urology for mpMRI ± prostate biopsy |
Create a management flowchart/protocol for this BPH case to share with staff
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"
mkdir -p /tmp/workspace/bhp-flowchart && python3 << 'EOF' import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.patches import FancyBboxPatch, FancyArrowPatch import matplotlib.patheffects as pe fig, ax = plt.subplots(1, 1, figsize=(18, 26)) ax.set_xlim(0, 18) ax.set_ylim(0, 26) ax.axis('off') fig.patch.set_facecolor('#F7F9FC') # ─── COLOR PALETTE ─── C_HEADER = '#1A3A5C' # dark navy C_BLUE = '#2471A3' # mid blue – assessment boxes C_GREEN = '#1E8449' # dark green – action/treatment C_ORANGE = '#D35400' # orange – warning / urgent C_RED = '#C0392B' # red – refer / emergency C_PURPLE = '#6C3483' # purple – decision diamonds C_TEAL = '#117A65' # teal – monitoring C_YELLOW = '#F4D03F' # yellow highlight accent C_LIGHT = '#EBF5FB' # very light blue background C_TEXT = '#1C2833' # near-black text def rounded_box(ax, x, y, w, h, text, facecolor, textcolor='white', fontsize=9.5, bold=False, radius=0.35, alpha=1.0, sublabel=None, sublabel_color='#FFEB99', border_color=None): fc = facecolor ec = border_color if border_color else facecolor box = FancyBboxPatch((x - w/2, y - h/2), w, h, boxstyle=f"round,pad=0.0,rounding_size={radius}", facecolor=fc, edgecolor=ec, linewidth=1.8, alpha=alpha, zorder=3) ax.add_patch(box) weight = 'bold' if bold else 'normal' ya = y + 0.15 if sublabel else y ax.text(x, ya, text, ha='center', va='center', fontsize=fontsize, color=textcolor, weight=weight, zorder=4, wrap=True, multialignment='center', linespacing=1.35) if sublabel: ax.text(x, y - 0.32, sublabel, ha='center', va='center', fontsize=7.8, color=sublabel_color, style='italic', zorder=4) def diamond(ax, x, y, w, h, text, facecolor=C_PURPLE, textcolor='white', fontsize=9): pts = [(x, y+h/2), (x+w/2, y), (x, y-h/2), (x-w/2, y)] patch = plt.Polygon(pts, closed=True, facecolor=facecolor, edgecolor='white', linewidth=1.8, zorder=3) ax.add_patch(patch) ax.text(x, y, text, ha='center', va='center', fontsize=fontsize, color=textcolor, weight='bold', zorder=4, multialignment='center') def arrow(ax, x1, y1, x2, y2, label='', color='#2E4057', lw=1.8): ax.annotate('', xy=(x2, y2), xytext=(x1, y1), arrowprops=dict(arrowstyle='->', color=color, lw=lw, connectionstyle='arc3,rad=0.0'), zorder=2) if label: mx, my = (x1+x2)/2, (y1+y2)/2 ax.text(mx+0.12, my, label, fontsize=8, color=color, va='center', style='italic', zorder=5) def h_arrow(ax, x1, y1, x2, y2, label='', color='#2E4057', lw=1.8): ax.annotate('', xy=(x2, y2), xytext=(x1, y1), arrowprops=dict(arrowstyle='->', color=color, lw=lw, connectionstyle='arc3,rad=0.0'), zorder=2) if label: mx, my = (x1+x2)/2 + 0.1, (y1+y2)/2 + 0.15 ax.text(mx, my, label, fontsize=8, color=color, va='center', ha='center', style='italic', zorder=5) # ══════════════════════════════════════════════ # TITLE BANNER # ══════════════════════════════════════════════ title_box = FancyBboxPatch((0.3, 24.7), 17.4, 1.1, boxstyle="round,pad=0.0,rounding_size=0.4", facecolor=C_HEADER, edgecolor='none', zorder=3) ax.add_patch(title_box) ax.text(9, 25.33, 'BPH with Acute Urinary Retention — Clinical Management Protocol', ha='center', va='center', fontsize=14, color='white', weight='bold', zorder=4) ax.text(9, 24.95, 'For a 60-year Male • Grade III Prostatomegaly • PSA 11 ng/mL • Catheter-Associated UTI', ha='center', va='center', fontsize=9, color='#AED6F1', zorder=4) # ══════════════════════════════════════════════ # PHASE LABELS (left sidebar) # ══════════════════════════════════════════════ def phase_label(ax, y, text, color): ax.text(0.55, y, text, ha='center', va='center', fontsize=7.5, color='white', weight='bold', rotation=90, bbox=dict(boxstyle='round,pad=0.3', facecolor=color, edgecolor='none', alpha=0.9), zorder=5) phase_label(ax, 23.2, 'PHASE 1\nPRESENTATION', C_BLUE) phase_label(ax, 20.5, 'PHASE 2\nIMM. MGMT', C_GREEN) phase_label(ax, 17.0, 'PHASE 3\nCOMPLICATION', C_ORANGE) phase_label(ax, 13.8, 'PHASE 4\nPSA REPEAT', C_PURPLE) phase_label(ax, 10.2, 'PHASE 5\nDECISION', C_RED) phase_label(ax, 6.8, 'PHASE 6\nFOLLOW-UP', C_TEAL) phase_label(ax, 3.2, 'RED FLAGS', C_RED) # ══════════════════════════════════════════════ # PHASE 1: PRESENTATION # ══════════════════════════════════════════════ rounded_box(ax, 9, 23.5, 14, 0.85, '60M • Acute Urinary Retention (AUR) • Suprapubic Pain • Grade III Prostatomegaly on USG', C_BLUE, fontsize=9.5, bold=True) arrow(ax, 9, 23.08, 9, 22.72) rounded_box(ax, 9, 22.42, 14, 0.55, 'Per-Urethral Catheterization performed • Urine drained • Patient stabilized', C_BLUE, fontsize=9, alpha=0.85) arrow(ax, 9, 22.15, 9, 21.72) # PSA + Silodosin started rounded_box(ax, 5.5, 21.42, 6.2, 0.55, 'Silodosin (alpha-blocker) started\nfor symptom relief', C_GREEN, fontsize=9) rounded_box(ax, 12.5, 21.42, 6.2, 0.55, 'PSA sent: Result = 11 ng/mL\n⚠ Drawn during AUR + catheter — CONFOUNDED', '#7D6608', textcolor='#FDFEFE', fontsize=9) ax.annotate('', xy=(5.5, 21.7), xytext=(9, 21.72), arrowprops=dict(arrowstyle='->', color='#2E4057', lw=1.5), zorder=2) ax.annotate('', xy=(12.5, 21.7), xytext=(9, 21.72), arrowprops=dict(arrowstyle='->', color='#2E4057', lw=1.5), zorder=2) # ══════════════════════════════════════════════ # PHASE 2: IMMEDIATE MANAGEMENT (TODAY) # ══════════════════════════════════════════════ rounded_box(ax, 9, 20.5, 16, 0.6, '▼ IMMEDIATE ACTIONS — TODAY ▼', C_HEADER, fontsize=10, bold=True) # 3 action boxes rounded_box(ax, 3.5, 19.55, 4.8, 0.95, '① DIGITAL RECTAL EXAM (DRE)\nSmooth/rubbery → BPH likely\nNodule/hard → Urgent Urology referral', C_GREEN, fontsize=8.5) rounded_box(ax, 9, 19.55, 4.8, 0.95, '② ADD DUTASTERIDE 0.5 mg OD\nCombine with Silodosin\n(alpha-blocker + 5-ARI = gold standard for large gland)', C_GREEN, fontsize=8.5) rounded_box(ax, 14.5, 19.55, 4.8, 0.95, '③ RENAL FUNCTION TESTS\nSerum Creatinine + Urea + eGFR\n(Back-pressure nephropathy screen)', C_GREEN, fontsize=8.5) for bx in [3.5, 9, 14.5]: arrow(ax, bx, 20.2, bx, 20.03) # ══════════════════════════════════════════════ # PHASE 3: COMPLICATION (UTI) # ══════════════════════════════════════════════ rounded_box(ax, 9, 18.45, 16, 0.6, '▼ CATHETER-ASSOCIATED UTI (Day ~10 post-catheter) ▼', C_ORANGE, fontsize=9.5, bold=True) rounded_box(ax, 6, 17.55, 7, 0.85, 'Fever + TLC 19,000\nDiagnosis: CA-UTI\nCeftriaxone 1g BD IV × 7 days', C_ORANGE, fontsize=9) rounded_box(ax, 13, 17.55, 7, 0.85, 'Clinical improvement\nFever resolved • Catheter removed\nPatient now voiding (mild difficulty only)', C_GREEN, fontsize=9) arrow(ax, 6, 18.15, 6, 17.98) arrow(ax, 13, 18.15, 13, 17.98) ax.annotate('', xy=(13, 17.98), xytext=(9, 18.15), arrowprops=dict(arrowstyle='->', color='#2E4057', lw=1.5), zorder=2) ax.annotate('', xy=(6, 17.98), xytext=(9, 18.15), arrowprops=dict(arrowstyle='->', color='#2E4057', lw=1.5), zorder=2) arrow(ax, 9, 17.13, 9, 16.72) # ══════════════════════════════════════════════ # PHASE 4: PSA REPEAT — key decision # ══════════════════════════════════════════════ rounded_box(ax, 9, 16.42, 16, 0.6, '▼ PSA INTERPRETATION & REPEAT PLAN ▼', C_PURPLE, fontsize=10, bold=True) # Why PSA is confounded rounded_box(ax, 9, 15.42, 15, 0.85, 'PSA of 11 ng/mL is UNRELIABLE — 3 simultaneous confounders at time of draw:\n' '① Acute Urinary Retention ② Urethral Catheterization ③ Active UTI with Fever (TLC 19,000)', '#4A235A', textcolor='#FDFEFE', fontsize=9) arrow(ax, 9, 15.0, 9, 14.62) rounded_box(ax, 9, 14.32, 15, 0.55, '⏱ REPEAT PSA at 8–12 WEEKS after catheter removal + fever resolution\n' '(Same lab • Same assay • No UTI • No ejaculation 48h prior)', C_PURPLE, fontsize=9, bold=True) arrow(ax, 9, 14.05, 9, 13.65) # Also order simultaneously rounded_box(ax, 5.5, 13.35, 6.5, 0.55, 'Free PSA %\n(Free PSA ÷ Total PSA × 100)', '#884EA0', fontsize=9) rounded_box(ax, 12.5, 13.35, 6.5, 0.55, 'PSA Density\n(PSA ÷ Prostate Volume mL)', '#884EA0', fontsize=9) ax.annotate('', xy=(5.5, 13.63), xytext=(9, 13.65), arrowprops=dict(arrowstyle='->', color='#6C3483', lw=1.5), zorder=2) ax.annotate('', xy=(12.5, 13.63), xytext=(9, 13.65), arrowprops=dict(arrowstyle='->', color='#6C3483', lw=1.5), zorder=2) # ══════════════════════════════════════════════ # PHASE 5: DECISION TREE # ══════════════════════════════════════════════ rounded_box(ax, 9, 12.6, 16, 0.5, '▼ DECISION AFTER REPEAT PSA ▼', C_RED, fontsize=10, bold=True) diamond(ax, 9, 11.7, 5.5, 1.0, 'Repeat PSA\nresult?', C_PURPLE, fontsize=9.5) # Branch LEFT: PSA normalized rounded_box(ax, 3, 10.3, 4.8, 0.85, 'PSA < 4 ng/mL\n(Normalized)', C_GREEN, fontsize=9, bold=True) ax.annotate('', xy=(3.2, 10.73), xytext=(6.75, 11.45), arrowprops=dict(arrowstyle='->', color=C_GREEN, lw=1.8), zorder=2) ax.text(4.5, 11.25, 'Normalized', fontsize=8, color=C_GREEN, style='italic') rounded_box(ax, 3, 9.3, 4.8, 0.75, 'Continue BPH meds\nAnnual PSA monitoring', C_TEAL, fontsize=9) arrow(ax, 3, 9.88, 3, 9.68) # Branch MIDDLE: PSA 4-10 rounded_box(ax, 9, 10.3, 4.8, 0.85, 'PSA 4–10 ng/mL\n+ Normal DRE\n+ Free PSA >25%\n+ Density <0.15', '#D4AC0D', textcolor=C_TEXT, fontsize=8.5, bold=True) ax.annotate('', xy=(9, 10.73), xytext=(9, 11.2), arrowprops=dict(arrowstyle='->', color='#D4AC0D', lw=1.8), zorder=2) ax.text(9.15, 11.0, 'Intermediate', fontsize=8, color='#7D6608', style='italic') rounded_box(ax, 9, 9.3, 4.8, 0.75, 'mpMRI Prostate\nthen reassess biopsy need', C_BLUE, fontsize=9) arrow(ax, 9, 9.88, 9, 9.68) # Branch RIGHT: PSA >10 or high risk rounded_box(ax, 15, 10.3, 4.8, 0.85, 'PSA still >10\nOR Abnormal DRE\nOR Free PSA <10%\nOR Density >0.15', C_RED, textcolor='white', fontsize=8.5, bold=True) ax.annotate('', xy=(14.8, 10.73), xytext=(11.25, 11.45), arrowprops=dict(arrowstyle='->', color=C_RED, lw=1.8), zorder=2) ax.text(13.3, 11.25, 'High Risk', fontsize=8, color=C_RED, style='italic') rounded_box(ax, 15, 9.3, 4.8, 0.75, '⚠ REFER UROLOGY\nmpMRI ± TRUS/MRI-fusion Biopsy', C_RED, fontsize=9, bold=True) arrow(ax, 15, 9.88, 15, 9.68) # ══════════════════════════════════════════════ # PHASE 6: ONGOING MONITORING # ══════════════════════════════════════════════ rounded_box(ax, 9, 8.45, 16, 0.5, '▼ ONGOING MONITORING (All Patients) ▼', C_TEAL, fontsize=10, bold=True) rounded_box(ax, 3.5, 7.5, 4.8, 0.95, '📅 1 MONTH\nSymptom review\nMedication compliance\nSide effects of dutasteride', C_TEAL, fontsize=8.5) rounded_box(ax, 9, 7.5, 4.8, 0.95, '📅 3 MONTHS\nRepeat renal function\nUroflowmetry (Qmax target >10 mL/s)\nPVR on USG (target <150 mL)', C_TEAL, fontsize=8.5) rounded_box(ax, 14.5, 7.5, 4.8, 0.95, '📅 6 MONTHS\nUSG prostate volume\n(expect 20-25% reduction)\nRepeat PSA if still elevated', C_TEAL, fontsize=8.5) for bx in [3.5, 9, 14.5]: arrow(ax, bx, 8.2, bx, 7.98) # ══════════════════════════════════════════════ # SURGERY INDICATIONS # ══════════════════════════════════════════════ rounded_box(ax, 9, 6.35, 16, 0.5, '▼ INDICATIONS TO REFER FOR SURGERY (TURP / HoLEP) ▼', C_HEADER, fontsize=9.5, bold=True) surg_items = [ (2.2, 'AUR\nRecurs'), (5.3, 'PVR\n>200 mL'), (8.0, 'Hydronephrosis\nor ↑ Creatinine'), (11.2, 'Recurrent UTI\nor Haematuria'), (14.2, 'Failed Medical Rx\nat 6–12 months'), (16.8, 'Qmax\n<10 mL/s'), ] for sx, st in surg_items: rounded_box(ax, sx, 5.55, 2.7, 0.85, st, C_ORANGE, fontsize=8.3) arrow(ax, sx, 6.1, sx, 5.98) # ══════════════════════════════════════════════ # RED FLAG BANNER # ══════════════════════════════════════════════ red_box = FancyBboxPatch((0.3, 3.85), 17.4, 0.85, boxstyle="round,pad=0.0,rounding_size=0.3", facecolor=C_RED, edgecolor='none', zorder=3) ax.add_patch(red_box) ax.text(9, 4.28, '🚨 RED FLAGS — Immediate Urology Referral / Emergency: ' 'AUR Recurrence • Anuric / Oliguria • Hydronephrosis • ' 'Rising Creatinine • Haematuria • Hard Nodule on DRE • Suspected Cancer', ha='center', va='center', fontsize=9, color='white', weight='bold', zorder=4) # ══════════════════════════════════════════════ # PSA GUIDE LEGEND BOX # ══════════════════════════════════════════════ legend_box = FancyBboxPatch((0.3, 1.05), 17.4, 2.55, boxstyle="round,pad=0.0,rounding_size=0.3", facecolor='#EBF5FB', edgecolor=C_BLUE, linewidth=1.5, zorder=3) ax.add_patch(legend_box) ax.text(9, 3.32, 'PSA INTERPRETATION GUIDE & MEDICATION NOTES', ha='center', va='center', fontsize=10, color=C_HEADER, weight='bold', zorder=4) guide_cols = [ (2.5, ' PSA Confounders\n(Falsely elevate PSA):\n• Acute urinary retention\n• Urethral catheterization\n• UTI / prostatitis\n• Prostate biopsy\n• Vigorous DRE / cycling\n• Ejaculation within 48h'), (7.2, ' Free PSA % Guide:\n• >25% → Likely BPH\n• 10–25% → Intermediate\n• <10% → Suspicious,\n consider biopsy\n\n PSA Density Guide:\n• <0.15 → Likely BPH\n• >0.15 → Higher cancer risk'), (12.0, ' 5-ARI Effect on PSA:\nDutasteride/Finasteride\nreduce PSA by ~50%\nafter 6 months.\nDouble the measured PSA\nto estimate true value\nif on 5-ARI for >6 months.'), (16.2, ' Combination Therapy:\nAlpha-blocker (Silodosin)\n+ 5-ARI (Dutasteride)\n= Standard of care for\nlarge prostate (>35 mL).\nContinue minimum\n12 months.'), ] for gx, gt in guide_cols: ax.text(gx, 2.45, gt, ha='left', va='center', fontsize=8.2, color=C_TEXT, zorder=4, linespacing=1.4) # ══════════════════════════════════════════════ # FOOTER # ══════════════════════════════════════════════ ax.text(9, 0.72, 'Sources: AUA/SUO Guideline 2023 (Early Detection of Prostate Cancer) • AUA Guideline 2026 (LUTS/BPH) • EAU Guidelines 2024 • Bailey & Love\'s Surgery 28th Ed. • Campbell Walsh Wein Urology', ha='center', va='center', fontsize=7.5, color='#5D6D7E', zorder=4) ax.text(9, 0.42, 'This protocol is for clinical guidance purposes. Individual patient decisions should involve shared decision-making and specialist input where indicated.', ha='center', va='center', fontsize=7.2, color='#85929E', style='italic', zorder=4) plt.tight_layout(pad=0.3) plt.savefig('/tmp/workspace/bhp-flowchart/BHP_Management_Protocol.pdf', format='pdf', bbox_inches='tight', dpi=200, facecolor=fig.get_facecolor()) plt.savefig('/tmp/workspace/bhp-flowchart/BHP_Management_Protocol.png', format='png', bbox_inches='tight', dpi=180, facecolor=fig.get_facecolor()) print("Saved successfully.") plt.close() EOF
python3 << 'EOF' import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.patches import FancyBboxPatch import warnings warnings.filterwarnings('ignore') fig, ax = plt.subplots(1, 1, figsize=(18, 26)) ax.set_xlim(0, 18) ax.set_ylim(0, 26) ax.axis('off') fig.patch.set_facecolor('#F7F9FC') C_HEADER = '#1A3A5C' C_BLUE = '#2471A3' C_GREEN = '#1E8449' C_ORANGE = '#D35400' C_RED = '#C0392B' C_PURPLE = '#6C3483' C_TEAL = '#117A65' C_TEXT = '#1C2833' def rbox(ax, x, y, w, h, text, fc, tc='white', fs=9.5, bold=False, r=0.32, lw=1.8, ec=None): ec = ec or fc p = FancyBboxPatch((x-w/2, y-h/2), w, h, boxstyle=f"round,pad=0.0,rounding_size={r}", facecolor=fc, edgecolor=ec, linewidth=lw, zorder=3) ax.add_patch(p) ax.text(x, y, text, ha='center', va='center', fontsize=fs, color=tc, weight='bold' if bold else 'normal', zorder=4, multialignment='center', linespacing=1.35) def diamond(ax, x, y, w, h, text, fc=C_PURPLE, tc='white', fs=9.5): pts = [(x, y+h/2), (x+w/2, y), (x, y-h/2), (x-w/2, y)] ax.add_patch(plt.Polygon(pts, closed=True, facecolor=fc, edgecolor='white', linewidth=1.8, zorder=3)) ax.text(x, y, text, ha='center', va='center', fontsize=fs, color=tc, weight='bold', zorder=4, multialignment='center') def arr(ax, x1, y1, x2, y2, col='#2E4057', lw=1.8, label='', lpos='right'): ax.annotate('', xy=(x2,y2), xytext=(x1,y1), arrowprops=dict(arrowstyle='->', color=col, lw=lw), zorder=2) if label: mx = (x1+x2)/2 + (0.15 if lpos=='right' else -0.15) my = (y1+y2)/2 ax.text(mx, my, label, fontsize=8, color=col, style='italic', va='center', ha='left' if lpos=='right' else 'right', zorder=5) def phase_bar(ax, y, text, color): ax.text(0.52, y, text, ha='center', va='center', fontsize=7, color='white', weight='bold', rotation=90, bbox=dict(boxstyle='round,pad=0.28', facecolor=color, edgecolor='none', alpha=0.92), zorder=5) # ── TITLE ────────────────────────────────────────────── tb = FancyBboxPatch((0.3,24.7),17.4,1.1, boxstyle="round,pad=0.0,rounding_size=0.4", facecolor=C_HEADER, edgecolor='none', zorder=3) ax.add_patch(tb) ax.text(9,25.33,'BPH with Acute Urinary Retention — Clinical Management Protocol', ha='center',va='center',fontsize=14,color='white',weight='bold',zorder=4) ax.text(9,24.93,'60-Year Male | Grade III Prostatomegaly | PSA 11 ng/mL | Catheter-Associated UTI', ha='center',va='center',fontsize=9,color='#AED6F1',zorder=4) # ── PHASE LABELS ────────────────────────────────────── phase_bar(ax, 23.2, 'PHASE 1\nPRESENTATION', C_BLUE) phase_bar(ax, 20.55,'PHASE 2\nTODAY', C_GREEN) phase_bar(ax, 17.8, 'PHASE 3\nCA-UTI', C_ORANGE) phase_bar(ax, 14.0, 'PHASE 4\nPSA REPEAT', C_PURPLE) phase_bar(ax, 10.4, 'PHASE 5\nDECISION', C_RED) phase_bar(ax, 6.9, 'PHASE 6\nFOLLOW-UP', C_TEAL) phase_bar(ax, 4.85, 'SURGERY\nINDICATIONS', C_ORANGE) phase_bar(ax, 3.3, 'RED FLAGS', C_RED) # ── PHASE 1: PRESENTATION ───────────────────────────── rbox(ax, 9, 23.5, 14, 0.78, '60M | Acute Urinary Retention (AUR) | Suprapubic Pain\nGrade III Prostatomegaly on USG | Per-Urethral Catheterization Performed', C_BLUE, fs=9.5, bold=True) arr(ax, 9,23.11, 9,22.74) rbox(ax, 9,22.44, 14, 0.55, 'PSA sent during catheterization + active UTI => PSA = 11 ng/mL (CONFOUNDED — see Phase 4)\n' 'Silodosin started for alpha-blocker symptom relief', '#2471A3', tc='#FDFEFE', fs=9) # ── PHASE 2: IMMEDIATE ACTIONS TODAY ────────────────── arr(ax, 9,22.16, 9,21.76) rbox(ax, 9,21.46, 16, 0.56, 'IMMEDIATE ACTIONS — TODAY', C_HEADER, fs=10.5, bold=True) for bx,bt in [ (3.5, 'ACTION 1: DIGITAL RECTAL EXAM\nSmooth & rubbery -> BPH favored\nHard nodule / asymmetry -> Urgent Urology'), (9, 'ACTION 2: ADD DUTASTERIDE 0.5 mg OD\nSilodosin + Dutasteride = Combination therapy\nGold standard for Grade III / large prostate'), (14.5,'ACTION 3: RENAL FUNCTION TESTS\nSerum Creatinine + Urea + eGFR\nRule out back-pressure nephropathy'), ]: arr(ax, bx,21.18, bx,20.98) rbox(ax, bx,20.55, 4.85, 0.85, bt, C_GREEN, fs=8.6) # ── PHASE 3: CA-UTI ─────────────────────────────────── arr(ax, 9,20.13, 9,19.73) rbox(ax, 9,19.43, 16, 0.56, 'COMPLICATION: Catheter-Associated UTI (~Day 10 post-catheter)', C_ORANGE, fs=10, bold=True) rbox(ax, 5.5,18.5, 7, 0.85, 'Fever | TLC 19,000\nDiagnosis: CA-UTI\nTx: Ceftriaxone 1g BD IV x 7 days', C_ORANGE, fs=9) rbox(ax, 12.5,18.5, 7, 0.85, 'Fever resolved | TLC normalized\nCatheter removed\nNow voiding (mild difficulty only)', C_GREEN, fs=9) for bx in [5.5,12.5]: arr(ax, bx,19.15, bx,18.93) # ── PHASE 4: PSA REPEAT ─────────────────────────────── arr(ax, 9,18.08, 9,17.68) rbox(ax, 9,17.38, 16, 0.56, 'PSA INTERPRETATION & REPEAT STRATEGY', C_PURPLE, fs=10.5, bold=True) rbox(ax, 9,16.5, 15.5, 0.78, 'PSA of 11 ng/mL is UNRELIABLE — drawn with THREE simultaneous confounders:\n' '(1) Acute Urinary Retention (2) Urethral Catheterization (3) Active UTI + Fever', '#4A235A', tc='#FDFEFE', fs=9.2) arr(ax, 9,16.11, 9,15.71) rbox(ax, 9,15.41, 15.5, 0.56, 'REPEAT PSA at 8-12 WEEKS after catheter removal + fever resolution\n' 'Conditions: no active UTI | same lab & assay | no ejaculation 48h prior', C_PURPLE, fs=9.2, bold=True) arr(ax, 9,15.13, 9,14.73) rbox(ax, 5.5,14.43, 6.5, 0.56, 'Simultaneously: Order FREE PSA %\n(Free PSA / Total PSA x 100)', '#884EA0', fs=9) rbox(ax, 12.5,14.43, 6.5, 0.56, 'Simultaneously: Calculate PSA DENSITY\n(PSA value / Prostate Volume in mL)', '#884EA0', fs=9) for bx in [5.5,12.5]: ax.annotate('', xy=(bx,14.71), xytext=(9,14.73), arrowprops=dict(arrowstyle='->', color='#6C3483', lw=1.5), zorder=2) # ── PHASE 5: DECISION ───────────────────────────────── arr(ax, 9,14.15, 9,13.75) rbox(ax, 9,13.45, 16, 0.56, 'DECISION TREE — AFTER REPEAT PSA', C_RED, fs=10.5, bold=True) diamond(ax, 9,12.3, 5.5, 1.1, 'Repeat\nPSA Result?', C_PURPLE, fs=9.5) # LEFT: normalized ax.annotate('', xy=(3.2,11.65), xytext=(6.75,12.05), arrowprops=dict(arrowstyle='->', color=C_GREEN, lw=1.8), zorder=2) ax.text(4.7,12.05,'Normalized',fontsize=8,color=C_GREEN,style='italic',ha='center') rbox(ax, 3,11.28, 4.85, 0.7, 'PSA < 4 ng/mL\n(Normalized)', C_GREEN, fs=9, bold=True) arr(ax, 3,10.93, 3,10.6) rbox(ax, 3,10.3, 4.85, 0.56, 'Continue BPH meds\nAnnual PSA monitoring', C_TEAL, fs=9) # MIDDLE: borderline ax.annotate('', xy=(9,11.75), xytext=(9,11.85), arrowprops=dict(arrowstyle='->', color='#D4AC0D', lw=1.8), zorder=2) ax.text(9.15,11.7,'Borderline',fontsize=8,color='#7D6608',style='italic') rbox(ax, 9,11.28, 4.85, 0.7, 'PSA 4-10\nNormal DRE + Free PSA >25%\n+ Density <0.15', '#D4AC0D', tc=C_TEXT, fs=8.3, bold=True) arr(ax, 9,10.93, 9,10.6) rbox(ax, 9,10.3, 4.85, 0.56, 'Order mpMRI Prostate\nthen reassess biopsy need', C_BLUE, fs=9) # RIGHT: high risk ax.annotate('', xy=(14.8,11.65), xytext=(11.25,12.05), arrowprops=dict(arrowstyle='->', color=C_RED, lw=1.8), zorder=2) ax.text(13.3,12.1,'High Risk',fontsize=8,color=C_RED,style='italic',ha='center') rbox(ax, 15,11.28, 4.85, 0.7, 'PSA still >10 OR Abnormal DRE\nFree PSA <10% OR Density >0.15', C_RED, fs=8.3, bold=True) arr(ax, 15,10.93, 15,10.6) rbox(ax, 15,10.3, 4.85, 0.56, 'REFER UROLOGY\nmpMRI +/- TRUS/MRI-Fusion Biopsy', C_RED, fs=9, bold=True) # ── PHASE 6: MONITORING ─────────────────────────────── arr(ax, 9,10.02, 9,9.62) rbox(ax, 9,9.32, 16, 0.56, 'ONGOING MONITORING (All Patients Continue)', C_TEAL, fs=10.5, bold=True) for bx,bt in [ (3.5, '1 MONTH REVIEW\nSymptom response\nMedication compliance\nSide effects check'), (9, '3 MONTHS REVIEW\nRepeat renal function\nUroflowmetry (Qmax >10 mL/s)\nUSG post-void residual (<150 mL)'), (14.5,'6 MONTHS REVIEW\nUSG prostate volume\n(expect 20-25% reduction)\nRepeat PSA if still elevated'), ]: arr(ax, bx,9.04, bx,8.85) rbox(ax, bx,8.45, 4.85, 0.82, bt, C_TEAL, fs=8.6) # ── SURGICAL INDICATIONS ────────────────────────────── arr(ax, 9,8.04, 9,7.64) rbox(ax, 9,7.34, 16, 0.56, 'REFER FOR SURGERY (TURP / HoLEP) if any of the following:', C_ORANGE, fs=10, bold=True) surg = [ (2.0, 'AUR\nRecurrence'), (5.0, 'Post-Void\nResidual >200 mL'), (8.0, 'Hydronephrosis\nor Rising Creatinine'), (11.0,'Recurrent UTI\nor Haematuria'), (14.0,'Failed Medical Rx\nat 6-12 months'), (16.8,'Qmax\n< 10 mL/s'), ] for sx,st in surg: arr(ax, sx,7.06, sx,6.95) rbox(ax, sx,6.6, 2.65, 0.82, st, C_ORANGE, fs=8.3) # ── RED FLAG BANNER ─────────────────────────────────── rb = FancyBboxPatch((0.3,3.88),17.4,0.8, boxstyle="round,pad=0.0,rounding_size=0.3", facecolor=C_RED, edgecolor='none', zorder=3) ax.add_patch(rb) ax.text(9,4.28, 'RED FLAGS — Immediate Urology Referral / Emergency:\n' 'AUR Recurrence | Anuric/Oliguria | Hydronephrosis | ' 'Rising Creatinine | Haematuria | Hard Nodule on DRE | Suspected Malignancy', ha='center',va='center',fontsize=9,color='white',weight='bold',zorder=4, multialignment='center', linespacing=1.4) # ── REFERENCE / LEGEND BOX ──────────────────────────── lb = FancyBboxPatch((0.3,0.8),17.4,2.88, boxstyle="round,pad=0.0,rounding_size=0.3", facecolor='#EBF5FB', edgecolor=C_BLUE, linewidth=1.4, zorder=3) ax.add_patch(lb) ax.text(9,3.42,'PSA INTERPRETATION QUICK REFERENCE', ha='center',va='center',fontsize=10,color=C_HEADER,weight='bold',zorder=4) cols = [ (2.0, 'PSA Confounders\n(Falsely raise PSA):\n- Acute urinary retention\n- Catheterization\n- UTI / prostatitis\n- Prostate biopsy\n- Vigorous DRE\n- Ejaculation <48h'), (6.5, 'Free PSA % Guide:\n>25% => Likely BPH\n10-25% => Intermediate\n<10% => Suspicious\n (consider biopsy)\n\nPSA Density Guide:\n<0.15 => Likely BPH\n>0.15 => Higher cancer risk'), (11.2,'5-ARI Effect on PSA:\nDutasteride/Finasteride\nreduce PSA by ~50%\nafter 6 months of use.\nIf on 5-ARI >6 months:\nDouble the PSA value\nto get true estimate.'), (15.8,'Combination Therapy:\nAlpha-blocker (Silodosin)\n+ 5-ARI (Dutasteride)\n= Standard of care for\ngrade III / large prostate\n(>35 mL volume).\nMin. 12 months duration.'), ] for cx,ct in cols: ax.text(cx,2.2,ct,ha='left',va='center',fontsize=8.3, color=C_TEXT,zorder=4,linespacing=1.45) ax.text(9,0.6, 'Sources: AUA/SUO Guideline 2023 (Early Detection of Prostate Cancer) | AUA Guideline 2026 (LUTS/BPH) | EAU Guidelines 2024 | NHS Scotland Referral Guidelines | Bailey & Love Surgery 28th Ed. | Campbell Walsh Wein Urology', ha='center',va='center',fontsize=7.2,color='#5D6D7E',zorder=4) ax.text(9,0.32, 'This protocol is for clinical guidance purposes. Individual management decisions should incorporate shared decision-making and specialist input where indicated.', ha='center',va='center',fontsize=6.8,color='#85929E',style='italic',zorder=4) plt.tight_layout(pad=0.3) out_pdf = '/tmp/workspace/bhp-flowchart/BHP_Management_Protocol.pdf' out_png = '/tmp/workspace/bhp-flowchart/BHP_Management_Protocol.png' plt.savefig(out_pdf, format='pdf', bbox_inches='tight', dpi=200, facecolor=fig.get_facecolor()) plt.savefig(out_png, format='png', bbox_inches='tight', dpi=180, facecolor=fig.get_facecolor()) print("Done:", out_pdf) plt.close() EOF
BHP Management Protocol
PDF Document · PDF
BHP Management Protocol
Image · PNG
| Phase | Content |
|---|---|
| Phase 1 | Initial presentation - AUR, catheterization, PSA drawn |
| Phase 2 | Immediate actions today - DRE, add Dutasteride, renal function |
| Phase 3 | CA-UTI management - Ceftriaxone, recovery, catheter removal |
| Phase 4 | PSA strategy - why 11 is confounded, when and how to repeat |
| Phase 5 | Decision tree - 3 branches based on repeat PSA result |
| Phase 6 | Monitoring schedule - 1, 3 and 6 month reviews |
| Surgery | TURP/HoLEP referral indications |
| Red flags | Emergency referral triggers |
| Legend box | PSA confounders, Free PSA%, PSA density guide, 5-ARI effect |