Glucoma surgery notes with flow charts
mkdir -p /home/daytona/workspace/glaucoma-surgery && echo "Directory ready"
~/glaucoma-surgery/create_glaucoma_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
from reportlab.graphics.shapes import Drawing, Rect, String, Line
from reportlab.graphics import renderPDF
out_path = '/home/daytona/workspace/glaucoma-surgery/Glaucoma_Surgery_Notes_Flowcharts.pdf'
doc = SimpleDocTemplate(out_path, pagesize=A4, rightMargin=36, leftMargin=36, topMargin=36, bottomMargin=36)
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(name='H1', parent=styles['Heading1'], fontSize=18, leading=22, spaceAfter=10))
styles.add(ParagraphStyle(name='H2', parent=styles['Heading2'], fontSize=13, leading=16, spaceAfter=6))
styles.add(ParagraphStyle(name='Body', parent=styles['BodyText'], fontSize=10.5, leading=14))
styles.add(ParagraphStyle(name='Small', parent=styles['BodyText'], fontSize=9, leading=12, textColor=colors.grey))
story = []
story.append(Paragraph('Glaucoma Surgery Notes with Flow Charts', styles['H1']))
story.append(Paragraph('Audience: Medical student / exam preparation', styles['Body']))
story.append(Spacer(1, 6))
story.append(Paragraph('Core procedures covered: Trabeculectomy, Non-penetrating surgery, Drainage tube shunts, MIGS, and Cyclodestructive procedures.', styles['Body']))
story.append(Spacer(1, 12))
story.append(Paragraph('1) Surgical Decision Flow Chart (Exam-Oriented)', styles['H2']))
flow1 = [
['Patient with glaucoma needing intervention'],
['Progression despite max tolerated meds/laser?'],
['Target IOP very low (low teens or lower)?'],
['Yes -> Trabeculectomy (consider MMC)'],
['No -> Moderate target (about 15-17 mmHg), mild-moderate disease -> MIGS +/- cataract surgery'],
['Conjunctival scarring / high risk failed filtration / refractory secondary glaucoma?'],
['Yes -> Drainage device (Ahmed/Baerveldt/Molteno)'],
['Poor visual potential or painful blind eye with high IOP -> Cyclodestructive (trans-scleral or endoscopic CPC)']
]
t = Table(flow1, colWidths=[520])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), colors.HexColor('#dbeafe')),
('BACKGROUND', (0,1), (0,2), colors.HexColor('#eff6ff')),
('BACKGROUND', (0,3), (0,7), colors.HexColor('#f8fafc')),
('BOX', (0,0), (-1,-1), 1, colors.black),
('INNERGRID', (0,0), (-1,-1), 0.5, colors.grey),
('FONTNAME', (0,0), (-1,-1), 'Helvetica'),
('FONTSIZE', (0,0), (-1,-1), 10),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
]))
story.append(t)
story.append(Spacer(1, 10))
story.append(Paragraph('2) Trabeculectomy', styles['H2']))
story.append(Paragraph('<b>Mechanism:</b> guarded fistula from anterior chamber to sub-Tenon/subconjunctival space to create a filtering bleb and lower IOP.', styles['Body']))
story.append(Paragraph('<b>Key indications:</b> failed conservative therapy, progression despite seemingly adequate IOP, advanced disease requiring low target pressure.', styles['Body']))
story.append(Paragraph('<b>Essential steps:</b> conjunctival flap -> partial-thickness scleral flap -> paracentesis -> sclerostomy -> peripheral iridectomy (often) -> scleral flap suturing -> watertight conjunctival closure.', styles['Body']))
story.append(Paragraph('<b>Post-op principles:</b> frequent steroid, monitor bleb morphology/IOP, adjust sutures, massage/needling if early failure.', styles['Body']))
story.append(Paragraph('<b>Complication themes:</b> hypotony/shallow AC, bleb leak, fibrosis/encapsulation, infection (blebitis/endophthalmitis), late failure.', styles['Body']))
story.append(Spacer(1, 8))
story.append(Paragraph('3) Non-penetrating Surgery (Deep sclerectomy, Viscocanalostomy)', styles['H2']))
story.append(Paragraph('Used when lower complication profile is desired; generally less IOP reduction than trabeculectomy.', styles['Body']))
story.append(Paragraph('Deep sclerectomy creates a Descemet window to permit controlled aqueous egress; may be augmented with implant and later goniopuncture.', styles['Body']))
story.append(Spacer(1, 8))
story.append(Paragraph('4) MIGS (Minimally Invasive Glaucoma Surgery)', styles['H2']))
story.append(Paragraph('<b>General concept:</b> less tissue disruption and lower surgical risk, typically for mild-moderate glaucoma and modest target IOP.', styles['Body']))
story.append(Paragraph('<b>Types:</b> (A) trabecular/Schlemm canal procedures (iStent, Hydrus, Trabectome, KDB, canaloplasty), (B) subconjunctival bleb-forming microshunts (Xen/Preserflo), (C) supraciliary devices.', styles['Body']))
story.append(Paragraph('<b>Caveats:</b> may need later surgery; stent malposition/erosion possible; bleb-forming MIGS share bleb-related risks.', styles['Body']))
story.append(Spacer(1, 8))
story.append(Paragraph('5) Drainage Tube Shunts (GDD)', styles['H2']))
story.append(Paragraph('<b>Principle:</b> tube shunts aqueous from AC to episcleral plate reservoir in sub-Tenon space; capsule forms around plate and governs outflow resistance.', styles['Body']))
story.append(Paragraph('<b>Common devices:</b> Ahmed (valved), Baerveldt (non-valved), Molteno.', styles['Body']))
story.append(Paragraph('<b>Expected outcomes:</b> often mid-teen IOP with ongoing medication requirement in many patients.', styles['Body']))
story.append(Paragraph('<b>Complications:</b> hypotony, hypertensive phase/encapsulation, tube obstruction, tube erosion, corneal endothelial loss, diplopia, late failure.', styles['Body']))
story.append(Spacer(1, 8))
story.append(Paragraph('6) Cyclodestructive Procedures (CPC)', styles['H2']))
story.append(Paragraph('<b>Mechanism:</b> ablation of ciliary epithelium to reduce aqueous production.', styles['Body']))
story.append(Paragraph('<b>Indications:</b> poor visual potential or painful blind eye with high IOP, refractory secondary glaucoma, difficult conjunctival/surgical terrain.', styles['Body']))
story.append(Paragraph('<b>Trans-scleral CPC essentials:</b> 810-nm diode; titrate to just below audible pop; avoid 3 and 9 o\'clock neurovascular bundles; often multiple sessions.', styles['Body']))
story.append(Paragraph('<b>Risks:</b> inflammation, transient IOP spike, visual decline, hypotony/phthisis in excessive treatment.', styles['Body']))
story.append(PageBreak())
story.append(Paragraph('Flow Chart: Postoperative IOP Problem-Solving', styles['H2']))
flow2 = [
['Post-op elevated IOP after filtering surgery'],
['Check bleb + AC depth + tube/stoma patency'],
['Flat bleb + deep AC -> suture too tight/scar early'],
['Actions: massage -> releasable suture adjustment/laser lysis -> needling +/- antimetabolite'],
['Encapsulated bleb/Tenon cyst -> needling +/- antimetabolite, consider revision'],
['Tube surgery: assess intraluminal blockage, plate phase, malposition or erosion'],
['Persistent failure despite optimization -> repeat/revision surgery or alternate pathway (tube/trab/cyclodestruction)']
]
t2 = Table(flow2, colWidths=[520])
t2.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), colors.HexColor('#fee2e2')),
('BACKGROUND', (0,1), (0,2), colors.HexColor('#fff7ed')),
('BACKGROUND', (0,3), (0,6), colors.HexColor('#f8fafc')),
('BOX', (0,0), (-1,-1), 1, colors.black),
('INNERGRID', (0,0), (-1,-1), 0.5, colors.grey),
('FONTNAME', (0,0), (-1,-1), 'Helvetica'),
('FONTSIZE', (0,0), (-1,-1), 10),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
]))
story.append(t2)
story.append(Spacer(1, 14))
story.append(Paragraph('Rapid Comparison Table', styles['H2']))
comparison = [
['Procedure', 'Best fit', 'IOP lowering (relative)', 'Common trade-off'],
['Trabeculectomy', 'Need very low target IOP', 'High', 'Bleb-related complications, intensive follow-up'],
['MIGS', 'Mild-moderate disease, modest target', 'Low to moderate', 'May be insufficient alone for advanced disease'],
['Tube shunt (GDD)', 'Scarred conjunctiva/refractory cases', 'Moderate to high', 'Tube/plate complications, meds often still needed'],
['Cyclodestruction', 'Poor visual potential/refractory high IOP', 'Variable', 'Inflammation/hypotony risk if overtreatment']
]
ct = Table(comparison, colWidths=[110, 150, 110, 150])
ct.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#e2e8f0')),
('BOX', (0,0), (-1,-1), 1, colors.black),
('INNERGRID', (0,0), (-1,-1), 0.5, colors.grey),
('FONTNAME', (0,0), (-1,-1), 'Helvetica'),
('FONTSIZE', (0,0), (-1,-1), 9),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
]))
story.append(ct)
story.append(Spacer(1, 14))
story.append(Paragraph('Source', styles['H2']))
story.append(Paragraph('Kanski\'s Clinical Ophthalmology: A Systematic Approach, 10th ed. Sections on trabeculectomy, non-penetrating glaucoma surgery, MIGS, drainage shunts, and diode laser cycloablation (pp. 416-442 in section pagination).', styles['Small']))
doc.build(story)
print(out_path)
python /home/daytona/workspace/glaucoma-surgery/create_glaucoma_pdf.py