Journal club presentation for Ent pg

Reading File
Running Command

cd /tmp/workspace/attachments/c98a4a47-fcfd-4943-a3b7-eab2a6256144/ && python3 -c " import pdfplumber with pdfplumber.open('JOURNAL.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): text = page.extract_text() print(f'--- PAGE {i+1} ---') print(text) print() " 2>&1 | head -500

Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/journal-club && python3 << 'PYEOF' from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.util import Inches, Pt import copy prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank = prs.slide_layouts[6] # ─── COLOUR PALETTE ─────────────────────────────────────────────────────────── ENT_BLUE = RGBColor(0x00, 0x3A, 0x70) # deep navy ENT_TEAL = RGBColor(0x00, 0x7A, 0x8A) # teal accent ENT_LIGHT = RGBColor(0xE8, 0xF4, 0xF8) # very light blue bg ENT_WHITE = RGBColor(0xFF, 0xFF, 0xFF) ENT_GOLD = RGBColor(0xF0, 0xA5, 0x00) ENT_DARK = RGBColor(0x1A, 0x1A, 0x2E) ENT_GREY = RGBColor(0x55, 0x55, 0x66) ENT_GREEN = RGBColor(0x00, 0x86, 0x50) ENT_RED = RGBColor(0xC0, 0x1C, 0x2A) ENT_LTGREY = RGBColor(0xF0, 0xF4, 0xF8) # ─── HELPERS ────────────────────────────────────────────────────────────────── def add_rect(slide, x, y, w, h, fill_color, line_color=None, line_width=None): from pptx.util import Pt as Pt2 shape = slide.shapes.add_shape( 1, # MSO_SHAPE_TYPE.RECTANGLE Inches(x), Inches(y), Inches(w), Inches(h) ) shape.fill.solid() shape.fill.fore_color.rgb = fill_color if line_color: shape.line.color.rgb = line_color if line_width: shape.line.width = Pt2(line_width) else: shape.line.fill.background() return shape def add_text(slide, text, x, y, w, h, font_size=18, bold=False, color=ENT_DARK, align=PP_ALIGN.LEFT, italic=False, wrap=True, v_anchor=MSO_ANCHOR.TOP): tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = tb.text_frame tf.word_wrap = wrap tf.vertical_anchor = v_anchor tf.margin_left = Pt(4) tf.margin_right = Pt(4) tf.margin_top = Pt(2) tf.margin_bottom= Pt(2) p = tf.paragraphs[0] p.alignment = align run = p.add_run() run.text = text run.font.name = "Calibri" run.font.size = Pt(font_size) run.font.bold = bold run.font.italic = italic run.font.color.rgb = color return tb def add_bullet_slide(prs, title, bullets, sub=None): slide = prs.slides.add_slide(blank) # header bar add_rect(slide, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide, title, 0.3, 0.1, 12.5, 0.9, font_size=28, bold=True, color=ENT_WHITE, align=PP_ALIGN.LEFT, v_anchor=MSO_ANCHOR.MIDDLE) # accent bar add_rect(slide, 0, 1.1, 13.333, 0.08, ENT_TEAL) # light bg add_rect(slide, 0, 1.18, 13.333, 6.32, ENT_LTGREY) if sub: add_text(slide, sub, 0.5, 1.3, 12.5, 0.45, font_size=16, italic=True, color=ENT_TEAL, bold=False) start_y = 1.8 else: start_y = 1.4 step = (5.9 - (start_y - 1.18)) / max(len(bullets), 1) step = min(step, 0.85) for i, bul in enumerate(bullets): y = start_y + i * step # bullet dot dot = slide.shapes.add_shape(1, Inches(0.45), Inches(y + 0.07), Inches(0.18), Inches(0.18)) dot.fill.solid(); dot.fill.fore_color.rgb = ENT_TEAL dot.line.fill.background() add_text(slide, bul, 0.75, y, 12.1, step, font_size=18, color=ENT_DARK, wrap=True) return slide def add_two_col_slide(prs, title, left_title, left_items, right_title, right_items, sub=None): slide = prs.slides.add_slide(blank) add_rect(slide, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide, title, 0.3, 0.1, 12.5, 0.9, font_size=26, bold=True, color=ENT_WHITE, align=PP_ALIGN.LEFT, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide, 0, 1.1, 13.333, 0.08, ENT_TEAL) add_rect(slide, 0, 1.18, 13.333, 6.32, ENT_LTGREY) if sub: add_text(slide, sub, 0.4, 1.25, 12.5, 0.4, font_size=15, italic=True, color=ENT_TEAL, bold=False) # left column add_rect(slide, 0.4, 1.75, 5.9, 0.45, ENT_BLUE) add_text(slide, left_title, 0.4, 1.75, 5.9, 0.45, font_size=17, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) lbox = slide.shapes.add_textbox(Inches(0.5), Inches(2.3), Inches(5.7), Inches(4.8)) ltf = lbox.text_frame; ltf.word_wrap = True for it in left_items: lp = ltf.add_paragraph() lp.text = "• " + it lp.space_before = Pt(5) r = lp.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(16); r.font.color.rgb = ENT_DARK # right column add_rect(slide, 7.0, 1.75, 5.9, 0.45, ENT_TEAL) add_text(slide, right_title, 7.0, 1.75, 5.9, 0.45, font_size=17, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) rbox = slide.shapes.add_textbox(Inches(7.1), Inches(2.3), Inches(5.7), Inches(4.8)) rtf = rbox.text_frame; rtf.word_wrap = True for it in right_items: rp = rtf.add_paragraph() rp.text = "• " + it rp.space_before = Pt(5) r = rp.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(16); r.font.color.rgb = ENT_DARK return slide # ============================================================================== # SLIDE 1 – TITLE # ============================================================================== slide1 = prs.slides.add_slide(blank) # Full dark background add_rect(slide1, 0, 0, 13.333, 7.5, ENT_BLUE) # Decorative teal stripe add_rect(slide1, 0, 5.6, 13.333, 0.12, ENT_GOLD) add_rect(slide1, 0, 5.72, 13.333, 0.06, ENT_TEAL) # Journal badge add_rect(slide1, 0.5, 0.35, 3.8, 0.45, ENT_TEAL) add_text(slide1, "IRISH JOURNAL OF MEDICAL SCIENCE | ORIGINAL ARTICLE", 0.5, 0.35, 3.8, 0.45, font_size=10, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) add_text(slide1, "Aetiological Profile and Treatment Outcomes\nof Epistaxis at a Major Teaching Hospital", 0.5, 1.0, 12.3, 2.5, font_size=38, bold=True, color=ENT_WHITE, align=PP_ALIGN.LEFT, wrap=True) add_text(slide1, "A Review of 721 Cases", 0.5, 3.5, 10, 0.55, font_size=24, bold=False, color=ENT_GOLD, align=PP_ALIGN.LEFT) add_text(slide1, "Brian Carey & Patrick Sheahan\nSouth Infirmary Victoria University Hospital, Cork, Ireland\nReceived: March 2017 | Accepted: November 2017", 0.5, 4.15, 10, 1.2, font_size=16, color=ENT_LTGREY, italic=True) add_text(slide1, "Journal Club Presentation | ENT Postgraduate", 0.5, 6.0, 12.3, 0.7, font_size=15, bold=False, color=ENT_TEAL, align=PP_ALIGN.CENTER) # ============================================================================== # SLIDE 2 – OVERVIEW / AGENDA # ============================================================================== slide2 = prs.slides.add_slide(blank) add_rect(slide2, 0, 0, 13.333, 7.5, ENT_LTGREY) add_rect(slide2, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide2, "Presentation Overview", 0.3, 0.1, 12.5, 0.9, font_size=28, bold=True, color=ENT_WHITE, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide2, 0, 1.1, 13.333, 0.08, ENT_GOLD) sections = [ ("1", "Background & Rationale", "Why this study matters"), ("2", "Study Objectives", "Aims of the research"), ("3", "Methods", "Study design and data collection"), ("4", "Results – Demographics", "Patient characteristics"), ("5", "Results – Treatments", "Interventions and outcomes"), ("6", "Results – Key Statistics", "Odds ratios and seasonal trends"), ("7", "Discussion", "Interpretation and clinical implications"), ("8", "Management Algorithm", "Stepwise approach to epistaxis"), ("9", "Strengths & Limitations", "Critical appraisal"), ("10","Key Takeaways & Conclusion", "Summary for practice"), ] for i, (num, sec, desc) in enumerate(sections): row = i % 5 col = i // 5 x = 0.4 + col * 6.5 y = 1.35 + row * 1.18 add_rect(slide2, x, y, 6.1, 1.0, ENT_WHITE, line_color=ENT_TEAL, line_width=1) add_rect(slide2, x, y, 0.55, 1.0, ENT_TEAL) add_text(slide2, num, x, y, 0.55, 1.0, font_size=18, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) add_text(slide2, sec, x+0.6, y+0.04, 5.4, 0.5, font_size=15, bold=True, color=ENT_BLUE) add_text(slide2, desc, x+0.6, y+0.52, 5.4, 0.38, font_size=12, color=ENT_GREY, italic=True) # ============================================================================== # SLIDE 3 – BACKGROUND # ============================================================================== add_bullet_slide(prs, "Background & Rationale", [ "Epistaxis is one of the COMMONEST ENT emergencies worldwide", "Affects 12% of the population annually; 10% require medical attention", "60% of the general population experience at least one episode in their lifetime", "Management varies considerably: cautery, nasal packing, arterial ligation, embolisation", "Significant burden on ENT services — cost, time and resource management", "Outcomes analysis of available interventions is essential for evidence-based practice", ], sub="Epidemiology and Clinical Significance" ) # ============================================================================== # SLIDE 4 – STUDY OBJECTIVES # ============================================================================== add_bullet_slide(prs, "Study Objectives", [ "Assess the current epistaxis management in a major Irish tertiary ENT centre", "Evaluate outcomes of available treatment modalities", "Identify patient demographics and comorbidities predisposing to epistaxis", "Determine risk factors for treatment failure and recurrence", "Highlight areas for improvement in clinical practice and resource allocation", ], sub="South Infirmary Victoria University Hospital (SIVUH), Cork, Ireland" ) # ============================================================================== # SLIDE 5 – METHODS # ============================================================================== add_two_col_slide(prs, "Methods", "Study Design", [ "Retrospective descriptive study", "Study period: June 2014 – May 2015 (1 year)", "Setting: ENT emergency dept., SIVUH (Irish tertiary centre)", "Research Ethics Board approval obtained", "Data extracted from ENT casualty logbooks and medical records", "Statistical analysis: SPSS v20 & v23", ], "Data Collected", [ "Patient demographics (age, sex)", "Comorbidities (hypertension, haematologic disease, allergic rhinitis, DNS)", "Medications (antiplatelet / anticoagulant)", "Treatment modalities used", "Admission/discharge details and duration of stay", "Return presentations within 24 h and within 14 days", ] ) # ============================================================================== # SLIDE 6 – DEFINITIONS # ============================================================================== add_bullet_slide(prs, "Key Definitions", [ "Success: No recurrent epistaxis after pack removal OR no readmission within 24 h of discharge", "Failure: Ipsilateral recurrence of epistaxis within 14 days of initial treatment", "Return patient: Scheduled follow-up (pack removal) OR unscheduled representation", "Out-of-hours: Presentations outside regular hospital working hours and weekends", ], sub="Standard criteria applied throughout the study" ) # ============================================================================== # SLIDE 7 – DEMOGRAPHICS # ============================================================================== slide7 = prs.slides.add_slide(blank) add_rect(slide7, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide7, "Patient Demographics (n = 721)", 0.3, 0.1, 12.5, 0.9, font_size=26, bold=True, color=ENT_WHITE, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide7, 0, 1.1, 13.333, 0.08, ENT_TEAL) add_rect(slide7, 0, 1.18, 13.333, 6.32, ENT_LTGREY) stat_blocks = [ ("721", "Total Visits", ENT_BLUE), ("56.1%", "Male", ENT_TEAL), ("66.8 yrs", "Mean Age\n(non-recurrent)", ENT_BLUE), ("62.7 yrs", "Mean Age\n(recurrent)", ENT_TEAL), ("338", "Hypertension", ENT_BLUE), ("197", "Antiplatelet /\nAnticoagulant use", ENT_TEAL), ] for i, (val, lbl, col) in enumerate(stat_blocks): col_i = i % 3 row_i = i // 3 x = 0.5 + col_i * 4.2 y = 1.5 + row_i * 2.8 add_rect(slide7, x, y, 3.8, 2.4, col) add_text(slide7, val, x, y+0.2, 3.8, 1.2, font_size=36, bold=True, color=ENT_GOLD, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) add_text(slide7, lbl, x, y+1.5, 3.8, 0.8, font_size=15, bold=False, color=ENT_WHITE, align=PP_ALIGN.CENTER, wrap=True) # ============================================================================== # SLIDE 8 – TREATMENT MODALITIES # ============================================================================== slide8 = prs.slides.add_slide(blank) add_rect(slide8, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide8, "Initial Treatment Modalities", 0.3, 0.1, 12.5, 0.9, font_size=26, bold=True, color=ENT_WHITE, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide8, 0, 1.1, 13.333, 0.08, ENT_TEAL) add_rect(slide8, 0, 1.18, 13.333, 6.32, ENT_LTGREY) treatments = [ ("298", "Nasal Cautery\n(Silver Nitrate 41%)", ENT_BLUE, 0.4), ("200", "Nasal Packing\n(Rapid Rhino, BIPP,\nKaltostat, Posterior)", ENT_TEAL, 5.2), ("223", "No Treatment\n(Conservative / Observation)", ENT_GOLD, 9.5), ] for val, lbl, col, x in treatments: add_rect(slide8, x, 1.6, 3.6, 4.5, col) add_text(slide8, val, x, 1.9, 3.6, 1.5, font_size=52, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) add_text(slide8, lbl, x, 3.5, 3.6, 2.4, font_size=17, bold=False, color=ENT_WHITE, align=PP_ALIGN.CENTER, wrap=True) add_text(slide8, "Admitted Patients: 51 | Blood Transfusions: 6 | Mean LOS (non-surgical): 5 nights | Mean LOS (surgical): 8 nights", 0.4, 6.3, 12.5, 0.6, font_size=14, bold=True, color=ENT_BLUE, align=PP_ALIGN.CENTER) # ============================================================================== # SLIDE 9 – SURGICAL INTERVENTIONS # ============================================================================== add_bullet_slide(prs, "Surgical Interventions (n = 15 patients)", [ "Septal surgery — 3 patients", "Sphenopalatine artery ligation (SPAL) — 7 patients", "Endovascular embolisation — 5 patients", "Surgical patients had mean duration of stay of 8 nights vs 5 nights for non-surgical", "15 of 51 admitted patients required surgical intervention (29%)", "Sphenopalatine artery ligation is the primary surgical option for intractable epistaxis", ], sub="Indicated for intractable epistaxis unresponsive to packing" ) # ============================================================================== # SLIDE 10 – OUTCOMES & FAILURE # ============================================================================== add_two_col_slide(prs, "Treatment Outcomes", "Successful Treatment (n = 644)", [ "No recurrent epistaxis after pack removal", "No readmission with epistaxis within 24 h of discharge", "89.3% overall success rate", "Cautery superior to nasal packing (RR 0.09, p<0.002)", "Bleeding rates after pack removal similar across pack types", ], "Treatment Failure (n = 60, 8.3%)", [ "Mean age: 62.7 years", "65% presented out-of-hours / weekends", "76% were on antiplatelet or anticoagulant medication", "Only 6/60 had documented epistaxis education at first visit", "Haemostatic material use: higher odds of failure (OR 3.56, p=0.002)", ] ) # ============================================================================== # SLIDE 11 – KEY STATISTICS / ODDS RATIOS # ============================================================================== slide11 = prs.slides.add_slide(blank) add_rect(slide11, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide11, "Key Statistics & Odds Ratios", 0.3, 0.1, 12.5, 0.9, font_size=26, bold=True, color=ENT_WHITE, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide11, 0, 1.1, 13.333, 0.08, ENT_TEAL) add_rect(slide11, 0, 1.18, 13.333, 6.32, ENT_LTGREY) # table header headers = ["Variable", "OR", "95% CI", "P value", "Significance"] col_widths = [4.0, 1.3, 2.5, 1.5, 2.5] col_x = [0.3] for w in col_widths[:-1]: col_x.append(col_x[-1] + w + 0.06) for j, (hdr, w, x) in enumerate(zip(headers, col_widths, col_x)): add_rect(slide11, x, 1.35, w, 0.42, ENT_BLUE) add_text(slide11, hdr, x, 1.35, w, 0.42, font_size=13, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) rows = [ ("Electrocautery", "0.09", "0.02 – 0.24", "0.002", "Protective ↓"), ("Haemostatic material", "3.56", "1.42 – 5.25", "0.002", "Risk ↑"), ("Winter months", "1.62", "1.12 – 1.56", "0.001", "Risk ↑"), ("Summer months", "0.59", "0.54 – 0.65", "0.026", "Protective ↓"), ("Weekends / Out-of-hours", "1.35", "1.02 – 1.45", "0.002", "Risk ↑"), ("Antithrombotic agent", "1.46", "0.76 – 3.21", "NS", "—"), ("Male sex", "1.87", "0.79 – 3.96", "NS", "—"), ] row_colors = [ENT_WHITE, ENT_LTGREY] sig_colors = { "Protective ↓": ENT_GREEN, "Risk ↑": ENT_RED, "—": ENT_GREY, } for r_i, row in enumerate(rows): bg = row_colors[r_i % 2] y_r = 1.8 + r_i * 0.58 for j, (val, w, x) in enumerate(zip(row, col_widths, col_x)): if j == 4: # significance sc = sig_colors.get(val, ENT_GREY) add_rect(slide11, x, y_r, w, 0.52, sc) add_text(slide11, val, x, y_r, w, 0.52, font_size=13, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) else: add_rect(slide11, x, y_r, w, 0.52, bg, line_color=RGBColor(0xCC,0xCC,0xDD), line_width=0.5) add_text(slide11, val, x, y_r, w, 0.52, font_size=13, color=ENT_DARK, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) # ============================================================================== # SLIDE 12 – SEASONAL / TEMPORAL TRENDS # ============================================================================== add_bullet_slide(prs, "Seasonal & Temporal Trends", [ "FEWER presentations in summer months — RR 0.59 (95% CI 0.54–0.65), p<0.026", "MOST presentations in September (n=85 cases) — highest single month", "WINTER months had significantly more cases — OR 1.62, p<0.001", "More admissions at WEEKENDS and out-of-hours — RR 1.35, p<0.002", "Majority of return and admitted patients presented out-of-hours", "Implications: staffing and resource allocation must account for these patterns", ], sub="Seasonal variation consistent with prior published studies" ) # ============================================================================== # SLIDE 13 – REFERRAL SOURCES # ============================================================================== slide13 = prs.slides.add_slide(blank) add_rect(slide13, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide13, "Referral Sources & Staffing", 0.3, 0.1, 12.5, 0.9, font_size=26, bold=True, color=ENT_WHITE, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide13, 0, 1.1, 13.333, 0.08, ENT_TEAL) add_rect(slide13, 0, 1.18, 13.333, 6.32, ENT_LTGREY) ref_data = [ ("50.3%", "GP / Out-of-hours GP", ENT_BLUE), ("26.1%", "Local Emergency Dept.", ENT_TEAL), ("21.2%", "Self-referral", ENT_GOLD), ("1.6%", "Inpatient ward", ENT_GREY), ] for i, (pct, lbl, col) in enumerate(ref_data): x = 0.5 + i * 3.15 add_rect(slide13, x, 1.6, 2.8, 3.0, col) add_text(slide13, pct, x, 1.7, 2.8, 1.6, font_size=40, bold=True, color=ENT_WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE) add_text(slide13, lbl, x, 3.3, 2.8, 1.1, font_size=15, color=ENT_WHITE, align=PP_ALIGN.CENTER, wrap=True) add_text(slide13, "Staffing Profile", 0.5, 4.85, 12.5, 0.4, font_size=18, bold=True, color=ENT_BLUE) staff_items = [ ("73.7%", "Cases managed by Senior House Officers (SHOs)", ENT_RED), ("44.3%", "Cases involved Registrar", ENT_TEAL), ("9.1%", "Cases had Consultant involvement", ENT_GREEN), ] for i, (pct, txt, col) in enumerate(staff_items): x2 = 0.5 + i * 4.2 add_rect(slide13, x2, 5.3, 3.9, 0.9, col) add_text(slide13, f"{pct} {txt}", x2, 5.3, 3.9, 0.9, font_size=13, bold=False, color=ENT_WHITE, align=PP_ALIGN.CENTER, wrap=True, v_anchor=MSO_ANCHOR.MIDDLE) # ============================================================================== # SLIDE 14 – DISCUSSION: HYPERTENSION & ANTICOAGULATION # ============================================================================== add_two_col_slide(prs, "Discussion: Key Risk Factors", "Hypertension", [ "338/721 patients had hypertension (69.5% of admitted)", "Relationship between HT and epistaxis is contentious", "60%+ of Irish adults >50 years have hypertension", "Raised arterial pressure may cause arteriolosclerosis of nasal vasculature", "Blood vessels in nose lie relatively unprotected under mucosa", "No statistically significant independent association found (OR 0.94, NS)", ], "Anticoagulation / Antiplatelet", [ "197/721 patients on antiplatelet/anticoagulant medications", "STATISTICALLY SIGNIFICANT — anticoagulants linked to recurrence (p=0.0264)", "76% of failed treatment patients were on at least one such drug", "Aspirin role is not definitive — conflicting evidence in literature", "NOACs: lower rate of bleeding BUT harder to control once started", "More research needed, especially with complex anticoagulant regimes", ] ) # ============================================================================== # SLIDE 15 – MANAGEMENT ALGORITHM # ============================================================================== slide15 = prs.slides.add_slide(blank) add_rect(slide15, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide15, "Proposed Epistaxis Management Algorithm", 0.3, 0.1, 12.5, 0.9, font_size=24, bold=True, color=ENT_WHITE, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide15, 0, 1.1, 13.333, 0.08, ENT_GOLD) add_rect(slide15, 0, 1.18, 13.333, 6.32, ENT_LTGREY) steps = [ ("STEP 1", "Active Epistaxis → ABC Assessment\nResuscitate if needed", ENT_RED), ("STEP 2", "Stable? → Conservative Rx\nNasal compression, head forward", ENT_BLUE), ("STEP 3", "Bleeding persists? → Inspect nostrils\nIdentify bleeding source", ENT_TEAL), ("STEP 4", "Anterior source → Cautery / Anterior packing\nBilateral packing if needed", ENT_BLUE), ("STEP 5", "Persists → Posterior packing\nNasal balloon catheter (48–72 hrs)", ENT_TEAL), ("STEP 6", "Still persists → Surgical referral\nSPAL or endovascular embolisation", ENT_RED), ] for i, (num, txt, col) in enumerate(steps): row = i % 3 c = i // 3 x = 0.4 + c * 6.5 y = 1.4 + row * 1.8 add_rect(slide15, x, y, 6.0, 1.55, col) add_text(slide15, num, x+0.1, y+0.05, 1.5, 0.5, font_size=13, bold=True, color=ENT_GOLD) add_text(slide15, txt, x+0.1, y+0.5, 5.7, 0.95, font_size=15, color=ENT_WHITE, wrap=True) if i < 5: arrow_x = x + (2.9 if c == 0 else -0.1) # arrow label add_text(slide15, "▼" if row < 2 else "", x + 5.7, y + 0.6, 0.5, 0.5, font_size=18, color=ENT_GOLD, align=PP_ALIGN.CENTER) # ============================================================================== # SLIDE 16 – STRENGTHS & LIMITATIONS # ============================================================================== add_two_col_slide(prs, "Strengths & Limitations", "Strengths", [ "Large sample size: 721 cases over 12 months", "Real-world tertiary centre data", "Comprehensive data collection: demographics, treatment, outcomes", "Ethics board approved with Helsinki standards", "Seasonal and temporal analysis adds depth", "Practical output: management algorithm + discharge advice sheet", ], "Limitations", [ "Retrospective design — inherent selection and information bias", "Single centre — may not be generalisable to all settings", "No standardised follow-up beyond 24 h discharge / 14 day failure window", "Only 10% of return patients had documented epistaxis education", "Junior staff (SHOs) managed 73.7% of cases — variability in practice", "Antithrombotic/aspirin relationship remains inconclusive", ] ) # ============================================================================== # SLIDE 17 – CRITICAL APPRAISAL # ============================================================================== add_bullet_slide(prs, "Critical Appraisal", [ "Study design appropriate for a service review; ethics approval obtained", "SPSS analysis and RR/OR with CI reported — adequate statistical methodology", "Definition of 'success' (no readmission within 24 h) may be too narrow", "Definition of 'failure' (14 days ipsilateral recurrence) — clinically relevant", "Key finding (cautery superior to packing) aligns with existing ENT literature", "The paper does not address patient quality of life or patient-reported outcomes", "No comparison arm / control group — inherent limitation of retrospective design", "Results support the need for epistaxis first-aid education in the community", ], sub="Evidence level: Retrospective Descriptive Study (Level IV Evidence)" ) # ============================================================================== # SLIDE 18 – COMPARISON WITH LITERATURE # ============================================================================== add_bullet_slide(prs, "Comparison with Existing Literature", [ "Pallin et al. 2005 (US): Confirmed increase in autumn/winter presentations — consistent with this study", "Traboulsi et al. 2015: Changing trends in epistaxis management — cautery increasingly preferred", "Fox et al. 2016: Junior doctors have poor knowledge of epistaxis management — supports SHO findings here", "Strachan & England 1998: Widespread ignorance of first-aid for epistaxis in public — confirmed by 10% education rate", "Gokdogan et al. 2017: NOACs cause lower bleeding rates but harder control — same conclusion here", "Musgrave & Powell 2016 (systematic review): Antithrombotic therapy in epistaxis — inconclusive data", ], sub="Findings are consistent with and contribute to the existing body of evidence" ) # ============================================================================== # SLIDE 19 – KEY TAKEAWAYS # ============================================================================== slide19 = prs.slides.add_slide(blank) add_rect(slide19, 0, 0, 13.333, 1.1, ENT_BLUE) add_text(slide19, "Key Takeaways for Clinical Practice", 0.3, 0.1, 12.5, 0.9, font_size=26, bold=True, color=ENT_WHITE, v_anchor=MSO_ANCHOR.MIDDLE) add_rect(slide19, 0, 1.1, 13.333, 0.08, ENT_GOLD) add_rect(slide19, 0, 1.18, 13.333, 6.32, ENT_LTGREY) takeaways = [ ("Cautery first", "Silver nitrate cautery is superior to nasal packing for treatment success (RR 0.09, p<0.002) when bleeding point is identifiable", ENT_BLUE), ("Anticoagulation", "Antiplatelet/anticoagulant use significantly increases recurrence risk — co-manage with cardiology/haematology", ENT_RED), ("Seasonal planning", "Staff resources should increase in autumn/winter and out-of-hours to cope with demand peaks", ENT_TEAL), ("Education gap", "Only 10% of return patients received epistaxis first-aid advice — community education is urgently needed", ENT_GOLD), ("Stepwise algorithm", "A structured management algorithm improves consistency and reduces unnecessary escalation", ENT_GREEN), ("Training", "Junior doctors manage the bulk of cases; targeted ENT training for SHOs is essential", ENT_BLUE), ] for i, (title, body, col) in enumerate(takeaways): row = i % 3 c = i // 3 x = 0.35 + c * 6.5 y = 1.3 + row * 1.9 add_rect(slide19, x, y, 6.1, 1.7, col) add_text(slide19, title, x+0.15, y+0.08, 5.8, 0.45, font_size=16, bold=True, color=ENT_WHITE) add_text(slide19, body, x+0.15, y+0.55, 5.8, 1.0, font_size=13, color=ENT_WHITE, wrap=True) # ============================================================================== # SLIDE 20 – CONCLUSION # ============================================================================== slide20 = prs.slides.add_slide(blank) add_rect(slide20, 0, 0, 13.333, 7.5, ENT_BLUE) add_rect(slide20, 0, 5.9, 13.333, 0.12, ENT_GOLD) add_text(slide20, "Conclusion", 0.5, 0.3, 12.3, 0.7, font_size=36, bold=True, color=ENT_WHITE) conc = ( "This 721-case retrospective study confirms epistaxis as a major ENT emergency burden " "with peak presentations in autumn/winter and out-of-hours periods. Silver nitrate cautery " "was the most effective first-line treatment. Anticoagulation significantly increases " "recurrence risk. Most cases are initially managed by junior doctors — underscoring the need " "for improved training. A step-wise management algorithm and patient education initiative " "can reduce representation rates and ease strain on ENT services." ) add_text(slide20, conc, 0.5, 1.2, 12.3, 3.4, font_size=19, color=ENT_LTGREY, wrap=True) add_rect(slide20, 0.5, 4.7, 12.3, 0.08, ENT_TEAL) add_text(slide20, "Reference: Carey B, Sheahan P. Aetiological profile and treatment outcomes of epistaxis at a major teaching hospital: a review of 721 cases. Ir J Med Sci. 2017.", 0.5, 4.85, 12.3, 0.7, font_size=13, italic=True, color=RGBColor(0xAA,0xCC,0xDD)) add_text(slide20, "Thank You | Questions Welcome", 0.5, 5.7, 12.3, 0.7, font_size=22, bold=True, color=ENT_GOLD, align=PP_ALIGN.CENTER) # ============================================================================== # SAVE # ============================================================================== out_path = "/tmp/workspace/journal-club/Epistaxis_Journal_Club.pptx" prs.save(out_path) print(f"Saved: {out_path}") PYEOF

Your journal club presentation is ready:

Epistaxis Journal Club

Presentation · PPTX


What's inside (20 slides, ENT-themed navy/teal colour scheme):
SlideContent
1Title slide — journal, authors, institution
2Presentation overview / agenda (10 sections)
3Background & rationale (epidemiology, prevalence)
4Study objectives
5Methods (study design + data collected — two columns)
6Key definitions (success, failure, return patient)
7Patient demographics — 6 stat boxes (n=721, sex, age, comorbidities)
8Initial treatment modalities — 3 big-number tiles (Cautery 298, Packing 200, Conservative 223)
9Surgical interventions (SPAL, embolisation, septal surgery)
10Treatment outcomes (success vs failure — two columns)
11Key statistics table — OR, 95% CI, p-values, colour-coded significance
12Seasonal & temporal trends
13Referral sources + staffing profile (SHO vs Registrar vs Consultant)
14Discussion — hypertension & anticoagulation (two columns)
15Proposed management algorithm (6-step flowchart tiles)
16Strengths & limitations (two columns)
17Critical appraisal (Level IV evidence)
18Comparison with existing literature
196 key takeaways for clinical practice
20Conclusion + reference + thank you
This is a shared conversation. Sign in to Orris to start your own chat.