Can u make a journal club presentation
https://pmc.ncbi.nlm.nih.gov/articles/PMC8023901/pdf/IORT_91_1818175.pdf This is the topic and I’ve uploaded a reference ppt also
cd /tmp/workspace/attachments/e294784f-e395-4faa-bfa1-0f581340efd0/ && python3 -c " from pptx import Presentation from pptx.util import Emu prs = Presentation('ACCIN final .pptx') print(f'Total slides: {len(prs.slides)}') print(f'Slide width: {Emu(prs.slide_width).inches:.2f} in, height: {Emu(prs.slide_height).inches:.2f} in') for i, slide in enumerate(prs.slides, 1): print(f'--- slide {i} (layout: {slide.slide_layout.name}) ---') for shape in slide.shapes: pos = (round(Emu(shape.left).inches,2), round(Emu(shape.top).inches,2)) if shape.left is not None else None sz = (round(Emu(shape.width).inches,2), round(Emu(shape.height).inches,2)) if shape.width is not None else None print(f' shape_type={shape.shape_type} name={shape.name!r} pos={pos} size={sz}') if shape.has_text_frame and shape.text_frame.text.strip(): print(f' text: {shape.text_frame.text[:200]}') "
cd /tmp/workspace/attachments/e294784f-e395-4faa-bfa1-0f581340efd0/ && python3 -c " from pptx import Presentation from pptx.util import Emu from pptx.dml.color import RGBColor import json prs = Presentation('ACCIN final .pptx') # Get colors from slide 1 slide1 = prs.slides[0] colors = {} for shape in slide1.shapes: if shape.has_text_frame: for para in shape.text_frame.paragraphs: for run in para.runs: if run.font.color.type is not None: try: rgb = run.font.color.rgb colors[shape.name] = str(rgb) except: pass # Shape fill color try: fill = shape.fill if fill.type is not None and fill.fore_color is not None: colors[f'{shape.name}_fill'] = str(fill.fore_color.rgb) except: pass print('Colors found:', colors) # Get all text from slide 3 (intro) for full content for i in [2,4,6,7,8,9,14]: slide = prs.slides[i] print(f'\\n=== SLIDE {i+1} FULL TEXT ===') for shape in slide.shapes: if shape.has_text_frame and shape.text_frame.text.strip(): print(shape.text_frame.text) "
cd /tmp/workspace/attachments/e294784f-e395-4faa-bfa1-0f581340efd0/ && python3 -c " from pptx import Presentation from pptx.util import Emu prs = Presentation('ACCIN final .pptx') # Extract table content from slides with tables for i, slide in enumerate(prs.slides, 1): for shape in slide.shapes: if shape.shape_type == 19: # TABLE print(f'\\n=== SLIDE {i} TABLE: {shape.name} ===') for row in shape.table.rows: row_data = [] for cell in row.cells: row_data.append(cell.text.strip()) print(' | '.join(row_data)) # Also get slides 16, 21, 22, 23, 24, 25 full text for i in [15,20,21,22,23,24]: slide = prs.slides[i] print(f'\\n=== SLIDE {i+1} FULL TEXT ===') for shape in slide.shapes: if shape.has_text_frame and shape.text_frame.text.strip(): print(shape.text_frame.text[:500]) "
mkdir -p /tmp/workspace/journal-club-accin && python /tmp/skills/pptx/scripts/office/unpack.py "/tmp/workspace/attachments/e294784f-e395-4faa-bfa1-0f581340efd0/ACCIN final .pptx" /tmp/workspace/journal-club-accin/unpacked/ 2>&1 | head -20
ls /tmp/workspace/journal-club-accin/unpacked/ppt/slides/ | head -30
https://pmc.ncbi.nlm.nih.gov/articles/PMC8023901/
curl -sL "https://pmc.ncbi.nlm.nih.gov/articles/PMC8023901/pdf/IORT_91_1818175.pdf" -o /tmp/workspace/journal-club-accin/paper.pdf --max-time 30 2>&1 && ls -la /tmp/workspace/journal-club-accin/paper.pdf
python3 -c " import pdfplumber with pdfplumber.open('/tmp/workspace/journal-club-accin/paper.pdf') as pdf: print(f'Pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages[:3]): print(f'--- Page {i+1} ---') print(page.extract_text()[:500]) " 2>&1
antibiotic cement intramedullary nail infection fracture
PMID: 33830842
cat << 'PYEOF' > /tmp/workspace/journal-club-accin/build_pptx.py from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN from pptx.oxml.ns import qn from pptx.util import Inches, Pt import copy from lxml import etree # Colors from reference DARK_NAVY = RGBColor(0x1B, 0x2A, 0x41) MAROON = RGBColor(0x8C, 0x1D, 0x1D) STEEL_BLUE = RGBColor(0x3E, 0x5C, 0x76) LIGHT_BG = RGBColor(0xF4, 0xF5, 0xF7) WHITE = RGBColor(0xFF, 0xFF, 0xFF) DARK_TEXT = RGBColor(0x22, 0x22, 0x22) LIGHT_GRAY = RGBColor(0xDD, 0xDD, 0xDD) MID_GRAY = RGBColor(0x88, 0x88, 0x88) W = Inches(13.33) H = Inches(7.5) def new_prs(): prs = Presentation() prs.slide_width = W prs.slide_height = H return prs def blank_slide(prs): layout = prs.slide_layouts[6] # blank return prs.slides.add_slide(layout) def add_rect(slide, x, y, w, h, fill_color=None, line_color=None, line_width=None): shape = slide.shapes.add_shape(1, x, y, w, h) shape.line.fill.background() if fill_color: shape.fill.solid() shape.fill.fore_color.rgb = fill_color else: shape.fill.background() if line_color: shape.line.color.rgb = line_color if line_width: shape.line.width = line_width else: shape.line.fill.background() return shape def add_textbox(slide, x, y, w, h, text, font_size=18, bold=False, color=DARK_TEXT, align=PP_ALIGN.LEFT, italic=False, word_wrap=True): txBox = slide.shapes.add_textbox(x, y, w, h) tf = txBox.text_frame tf.word_wrap = word_wrap p = tf.paragraphs[0] p.alignment = align run = p.add_run() run.text = text run.font.size = Pt(font_size) run.font.bold = bold run.font.italic = italic run.font.color.rgb = color return txBox def add_text_para(tf, text, font_size=14, bold=False, color=DARK_TEXT, align=PP_ALIGN.LEFT, italic=False, space_before=0): p = tf.add_paragraph() p.alignment = align if space_before: p.space_before = Pt(space_before) run = p.add_run() run.text = text run.font.size = Pt(font_size) run.font.bold = bold run.font.italic = italic run.font.color.rgb = color return p def header_bar(slide, title_text, page_num=None): """Add standard header bar used in reference template""" # Top colored bar bar = add_rect(slide, Inches(0), Inches(0), W, Inches(1.55), fill_color=LIGHT_BG) # Bottom accent line line = add_rect(slide, Inches(0), Inches(1.55), W, Inches(0.04), fill_color=MAROON) # Title text tb = add_textbox(slide, Inches(0.5), Inches(0.3), Inches(12.3), Inches(0.65), title_text, font_size=24, bold=True, color=DARK_NAVY) # Page number if page_num: add_textbox(slide, Inches(12.6), Inches(7.14), Inches(0.4), Inches(0.28), str(page_num), font_size=9, color=MID_GRAY, align=PP_ALIGN.RIGHT) return tb def footer_cite(slide, cite_text="Conway JD, et al. Injury 2021; 52(4): 1047-1054"): add_textbox(slide, Inches(0.5), Inches(7.1), Inches(10.0), Inches(0.28), cite_text, font_size=8, color=MID_GRAY, italic=True) def add_bullet_tb(slide, x, y, w, h, bullets, font_size=15, heading=None): """Add a textbox with optional heading + bullet list""" txBox = slide.shapes.add_textbox(x, y, w, h) tf = txBox.text_frame tf.word_wrap = True first = True if heading: p = tf.paragraphs[0] if first else tf.add_paragraph() first = False p.alignment = PP_ALIGN.LEFT run = p.add_run() run.text = heading run.font.size = Pt(font_size + 1) run.font.bold = True run.font.color.rgb = STEEL_BLUE for bullet in bullets: if first: p = tf.paragraphs[0] first = False else: p = tf.add_paragraph() p.alignment = PP_ALIGN.LEFT p.level = 0 # Add bullet character manually run = p.add_run() run.text = f"\u2022 {bullet}" run.font.size = Pt(font_size) run.font.color.rgb = DARK_TEXT return txBox # ============================================================ # BUILD PRESENTATION # ============================================================ prs = new_prs() # ---- SLIDE 1: Title ---- s = blank_slide(prs) # Background add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) # Top dark nav band add_rect(s, Inches(0), Inches(0), W, Inches(1.65), fill_color=DARK_NAVY) # Maroon accent line add_rect(s, Inches(0), Inches(1.65), W, Inches(0.06), fill_color=MAROON) # JOURNAL CLUB label add_textbox(s, Inches(0.8), Inches(0.5), Inches(6), Inches(0.5), "JOURNAL CLUB", font_size=14, bold=True, color=STEEL_BLUE, align=PP_ALIGN.LEFT) # Main title tb = s.shapes.add_textbox(Inches(0.8), Inches(2.0), Inches(11.7), Inches(2.5)) tf = tb.text_frame tf.word_wrap = True p = tf.paragraphs[0] p.alignment = PP_ALIGN.LEFT run = p.add_run() run.text = "Antibiotic Cement-Coated Intramedullary Nails (ACCINs) for Fracture-Related Infections, Infected Nonunions, and Arthrodeses" run.font.size = Pt(32) run.font.bold = True run.font.color.rgb = DARK_NAVY # Authors add_textbox(s, Inches(0.8), Inches(4.6), Inches(11.5), Inches(0.45), "Conway JD, Elhessy AH, Galiboglu S, Patel N, Gesheff MG", font_size=14, bold=False, color=DARK_TEXT) # Journal add_textbox(s, Inches(0.8), Inches(5.1), Inches(11.5), Inches(0.4), "Injury, 2021 | PMC8023901", font_size=13, italic=True, color=STEEL_BLUE) # Study type badge badge = add_rect(s, Inches(0.8), Inches(5.9), Inches(4.5), Inches(0.5), fill_color=MAROON) add_textbox(s, Inches(0.9), Inches(5.95), Inches(4.3), Inches(0.4), "Retrospective Cohort \u2022 n = 111 \u2022 Level of Evidence: IV", font_size=11, bold=True, color=WHITE) # ---- SLIDE 2: Index ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "INDEX", 2) sections = [ "1. Introduction", "2. Background & Rationale", "3. Study Objective", "4. PICO Framework", "5. Methods — Design & Eligibility", "6. Surgical Technique", "7. Outcome Measures & Follow-up", "8. Results — Primary Outcome", "9. Results — Microbiology", "10. Results — Segmental Defects", "11. Results — Complications & Rod Removal", "12. Results — Amputation & Limb Salvage", "13. Discussion", "14. Strengths & Limitations", "15. Conclusions", ] # Two columns mid = 8 left = sections[:mid] right = sections[mid:] tb_l = s.shapes.add_textbox(Inches(0.7), Inches(1.5), Inches(5.9), Inches(5.7)) tf_l = tb_l.text_frame; tf_l.word_wrap = True first = True for item in left: p = tf_l.paragraphs[0] if first else tf_l.add_paragraph() first = False run = p.add_run() run.text = item run.font.size = Pt(14) run.font.color.rgb = DARK_NAVY tb_r = s.shapes.add_textbox(Inches(6.8), Inches(1.5), Inches(5.9), Inches(5.7)) tf_r = tb_r.text_frame; tf_r.word_wrap = True first = True for item in right: p = tf_r.paragraphs[0] if first else tf_r.add_paragraph() first = False run = p.add_run() run.text = item run.font.size = Pt(14) run.font.color.rgb = DARK_NAVY footer_cite(s) # ---- SLIDE 3: Introduction ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "INTRODUCTION", 3) body_text = [ "Fracture-related infections (FRIs), infected nonunions, and infected arthrodeses are among the most challenging complications in orthopaedic trauma surgery.", "Once established, bacteria form biofilms on implants and necrotic bone — rendering them resistant to host immunity and systemic antibiotics.", "Successful management requires a comprehensive surgical strategy beyond antibiotics alone: radical debridement, dead-space elimination, local antibiotic delivery, and stable skeletal fixation.", "Traditional management relied on external fixation — placement of intramedullary implants into infected canals was historically thought to perpetuate infection.", "Antibiotic cement-coated intramedullary nails (ACCINs) challenge this paradigm by combining local antibiotic delivery with internal mechanical stability in a single construct.", "These conditions impose enormous burden: prolonged disability, repeated surgeries, delayed union, and risk of limb amputation.", ] add_bullet_tb(s, Inches(0.6), Inches(1.65), Inches(12.1), Inches(5.6), body_text, font_size=14) footer_cite(s) # ---- SLIDE 4: Background & Rationale ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "BACKGROUND & RATIONALE", 4) bullets = [ "FRI incidence: ~5% in closed fractures to >30% in severe open fractures — driven by contamination, soft-tissue injury, and patient comorbidities.", "Biofilm formation is the key failure mechanism: microorganisms adhere to implants and necrotic bone, protected from systemic antibiotics and host immunity.", "Conventional IV antibiotics fail without aggressive surgical debridement and local delivery.", "Antibiotic-loaded PMMA cement (tobramycin + vancomycin) provides sustained local release, fills dead space, and achieves concentrations far exceeding systemic levels.", "Prior series (Rice et al., Conway 2014) showed promising single-procedure infection eradication, but were small or limited to specific indications.", "This study expands the evidence base with the largest single-surgeon ACCIN cohort to date.", ] add_bullet_tb(s, Inches(0.6), Inches(1.65), Inches(12.1), Inches(5.5), bullets, font_size=14) footer_cite(s) # ---- SLIDE 5: Study Objective ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "STUDY OBJECTIVE", 5) # Large centered objective box obj_box = add_rect(s, Inches(0.8), Inches(1.75), Inches(11.7), Inches(2.8), fill_color=DARK_NAVY) tb = s.shapes.add_textbox(Inches(1.0), Inches(1.9), Inches(11.3), Inches(2.5)) tf = tb.text_frame; tf.word_wrap = True p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER run = p.add_run() run.text = "To evaluate the effectiveness of ACCINs in achieving simultaneous eradication of infection and successful bone healing in patients with FRI, infected nonunions, and infected knee or ankle arthrodeses." run.font.size = Pt(18); run.font.bold = False; run.font.color.rgb = WHITE # Secondary objectives add_textbox(s, Inches(0.6), Inches(4.85), Inches(12.1), Inches(0.4), "Secondary Objectives:", font_size=14, bold=True, color=STEEL_BLUE) sec_bullets = [ "Assess reoperation rates, complications, rod removal patterns", "Evaluate outcomes in segmental bone defect subgroup", "Determine overall limb-salvage and amputation rates", ] add_bullet_tb(s, Inches(0.6), Inches(5.25), Inches(12.1), Inches(1.7), sec_bullets, font_size=13) footer_cite(s) # ---- SLIDE 6: PICO Framework ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "PICO FRAMEWORK", 6) pico_data = [ ("P — Population", "111 adults (age 13-83 yrs) with FRI, infected long-bone nonunion, or infected knee/ankle arthrodesis\nCierny-Mader host type A or B; excluded type C hosts and follow-up < 6 months"), ("I — Intervention", "Single-stage radical debridement + insertion of antibiotic cement-coated IM nail\n(vancomycin + tobramycin-loaded Palacos cement) + 6 weeks organism-directed IV antibiotics"), ("C — Comparison", "None concurrent — historical/literature comparison only\n(external fixation, alternative ACCIN techniques, authors' own 2014 series)"), ("O — Outcome", "Primary: healed/uninfected bone or stable arthrodesis (clinical + radiographic + serologic)\nSecondary: reoperations, limb salvage, complications, rod removal, amputation"), ] colors_pico = [MAROON, DARK_NAVY, STEEL_BLUE, RGBColor(0x2E, 0x7D, 0x32)] y_start = Inches(1.65) row_h = Inches(1.38) for idx, (label, detail) in enumerate(pico_data): y = y_start + idx * row_h # Color block for label add_rect(s, Inches(0.5), y, Inches(2.8), row_h - Inches(0.05), fill_color=colors_pico[idx]) add_textbox(s, Inches(0.55), y + Inches(0.35), Inches(2.7), Inches(0.6), label, font_size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER) # Detail box detail_box = add_rect(s, Inches(3.35), y, Inches(9.4), row_h - Inches(0.05), fill_color=WHITE) tb2 = s.shapes.add_textbox(Inches(3.5), y + Inches(0.1), Inches(9.1), row_h - Inches(0.2)) tf2 = tb2.text_frame; tf2.word_wrap = True p2 = tf2.paragraphs[0]; p2.alignment = PP_ALIGN.LEFT run2 = p2.add_run(); run2.text = detail run2.font.size = Pt(12); run2.font.color.rgb = DARK_TEXT footer_cite(s) # ---- SLIDE 7: Methods — Design & Eligibility ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "METHODS \u2014 DESIGN & ELIGIBILITY", 7) bullets = [ "Study design: Retrospective, non-randomized, observational cohort", "Setting: Single tertiary referral center; single fellowship-trained limb reconstruction surgeon", "Period: January 2014 through December 2020", "IRB-approved; compliant with Declaration of Helsinki principles", "Inclusion: Adults with FRI, infected nonunion, or infected knee/ankle arthrodesis; Cierny-Mader host type A or B; min. 6 months follow-up", "Exclusion: Cierny-Mader type C hosts (severe medical compromise, limb salvage not in best interest); follow-up < 6 months", "120 consecutive patients identified → 9 excluded → final cohort n = 111", "Consecutive sampling minimizes selection bias while reflecting routine clinical practice", ] add_bullet_tb(s, Inches(0.6), Inches(1.65), Inches(12.1), Inches(5.5), bullets, font_size=14) footer_cite(s) # ---- SLIDE 8: Patient Demographics ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "PATIENT DEMOGRAPHICS (N = 111)", 8) # Build a simple table using shapes demo_data = [ ("Sex", "57 male (51.4%) / 54 female (48.6%)"), ("Mean Age", "56.9 yrs (range 13–83)"), ("Mean BMI", "33.4 kg/m\u00b2 (range 17.5–52.4)"), ("Host Type (Cierny-Mader)", "Type A: 5 (4.5%) | Type B: 106 (95.5%)"), ("Indication", "Infected TKA 38.7% \u2022 Infected fusion 20.7% \u2022 FRI 20.7% \u2022 Infected nonunion 19.8%"), ("ACCIN Location", "Knee fusion 46% \u2022 Hindfoot fusion 32.4% \u2022 Tibia 11.7% \u2022 Retrograde femur 5.4%"), ("Segmental Bone Defects", "35 patients (31.5%); mean defect 6.1 cm (range 0.5–24 cm)"), ("Mean Follow-up", "29.2 months (range 6–93)"), ] y_start = Inches(1.65) row_h = Inches(0.67) for idx, (k, v) in enumerate(demo_data): y = y_start + idx * row_h fill = DARK_NAVY if idx % 2 == 0 else STEEL_BLUE add_rect(s, Inches(0.5), y, Inches(4.0), row_h - Inches(0.03), fill_color=fill) add_textbox(s, Inches(0.55), y + Inches(0.05), Inches(3.9), row_h - Inches(0.1), k, font_size=12, bold=True, color=WHITE) add_rect(s, Inches(4.55), y, Inches(8.3), row_h - Inches(0.03), fill_color=WHITE) add_textbox(s, Inches(4.65), y + Inches(0.05), Inches(8.1), row_h - Inches(0.1), v, font_size=12, color=DARK_TEXT) footer_cite(s) # ---- SLIDE 9: Surgical Technique ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "SURGICAL TECHNIQUE", 9) steps = [ ("1. Radical Debridement", "Complete excision of infected/necrotic bone and devitalized soft tissue; multiple intraoperative cultures before antibiotic administration"), ("2. ACCIN Construction", "Standard Smith & Nephew Trigen IM nail coated with PMMA cement: 1g vancomycin + 3.6g tobramycin per 40g Palacos cement; molded via silicone tubing"), ("3. Nail Insertion", "Coated nail inserted under fluoroscopic guidance, locked in standard fashion — provides immediate internal stability + high local antibiotic concentrations"), ("4. Post-op Antibiotics", "6 weeks culture-directed IV antibiotics under infectious disease supervision; culture-negative cases receive broad-spectrum therapy"), ] y_start = Inches(1.65) step_h = Inches(1.38) for idx, (step_title, detail) in enumerate(steps): y = y_start + idx * step_h # Step number circle add_rect(s, Inches(0.5), y, Inches(3.2), step_h - Inches(0.1), fill_color=MAROON) add_textbox(s, Inches(0.55), y + Inches(0.2), Inches(3.1), Inches(0.8), step_title, font_size=13, bold=True, color=WHITE) add_rect(s, Inches(3.75), y, Inches(9.1), step_h - Inches(0.1), fill_color=WHITE) tb3 = s.shapes.add_textbox(Inches(3.9), y + Inches(0.12), Inches(8.8), step_h - Inches(0.25)) tf3 = tb3.text_frame; tf3.word_wrap = True p3 = tf3.paragraphs[0]; p3.alignment = PP_ALIGN.LEFT run3 = p3.add_run(); run3.text = detail run3.font.size = Pt(13); run3.font.color.rgb = DARK_TEXT footer_cite(s) # ---- SLIDE 10: Outcome Measures ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "OUTCOME MEASURES & FOLLOW-UP", 10) primary_box = add_rect(s, Inches(0.5), Inches(1.65), Inches(12.3), Inches(1.1), fill_color=DARK_NAVY) add_textbox(s, Inches(0.7), Inches(1.75), Inches(12.0), Inches(0.9), "Primary Outcome: Treatment success = healed AND infection-free bone, OR stable arthrodesis\n" "Confirmed by: concordant clinical exam + radiographic union (3/4 cortices + painless WB) + normalized ESR/CRP", font_size=13, bold=False, color=WHITE) bullets_sec = [ "Secondary outcomes: reoperation rate, complications, rod removal, limb salvage, amputation", "Radiographic assessment: X-rays at 6 weeks, 12 weeks (CT at ~16 weeks if unclear), 6 months, 12 months, 24 months", "Lab markers: ESR and CRP monitored serially — normalization required for success classification", "Minimum follow-up: 6 months; mean follow-up 29.2 months (range 6–93)", "ACCIN removal: performed when infection eradicated, bone healed, and patients clinically well", "Standardized protocol for all patients — minimizes inter-observer variability", ] add_bullet_tb(s, Inches(0.6), Inches(2.85), Inches(12.1), Inches(4.2), bullets_sec, font_size=14) footer_cite(s) # ---- SLIDE 11: Results — Primary Outcome ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "RESULTS \u2014 PRIMARY OUTCOME", 11) # Stat boxes stat_boxes = [ ("87.4%", "Healed & infection-free\n(97/111 patients)", MAROON), ("69.1%", "Single procedure\nsufficient (67/97)", DARK_NAVY), ("93.7%", "Overall limb\nsalvage (104/111)", STEEL_BLUE), ] for idx, (pct, label, color) in enumerate(stat_boxes): x = Inches(0.7) + idx * Inches(4.15) add_rect(s, x, Inches(1.5), Inches(3.85), Inches(2.1), fill_color=color) add_textbox(s, x + Inches(0.1), Inches(1.6), Inches(3.65), Inches(1.0), pct, font_size=38, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(s, x + Inches(0.1), Inches(2.65), Inches(3.65), Inches(0.75), label, font_size=12, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(s, Inches(0.6), Inches(3.75), Inches(12.1), Inches(0.35), "Key Findings:", font_size=14, bold=True, color=STEEL_BLUE) result_bullets = [ "97/111 patients (87.4%) achieved healed, infection-free bone or stable arthrodesis (mean follow-up 29.2 months)", "67/97 successful cases (69.1%) required only the index ACCIN procedure — confirming single-stage viability", "30 successful patients required further treatment: mean 2.1 additional procedures (mostly for persistent/recurrent infection)", "Success confirmed by clinical assessment, radiographic healing, AND normalization of inflammatory markers", "Patients with segmental bone defects: 85.7% success vs. 88.2% without defects — no statistically significant difference", ] add_bullet_tb(s, Inches(0.6), Inches(4.1), Inches(12.1), Inches(2.9), result_bullets, font_size=13) footer_cite(s) # ---- SLIDE 12: Results — Reoperations ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "RESULTS \u2014 REOPERATIONS (N = 30)", 12) add_textbox(s, Inches(0.6), Inches(1.65), Inches(12.1), Inches(0.35), "30/111 patients (27%) required at least one reoperation:", font_size=14, bold=True, color=DARK_NAVY) # Reoperation table (as colored rows) reop_data = [ ("Reason", "n (%)", "Mean Procedures", "Mean Time to Reop"), ("Infection only", "24 (80%)", "2.0 (range 1-5)", "7.6 mo (range 1-29)"), ("Nonunion only", "4 (13.3%)", "1.3 (range 1-2)", "18.3 mo (range 3-45)"), ("Both infection & nonunion", "2 (6.7%)", "1.0", "2.5 mo (range 1-4)"), ] col_widths = [Inches(4.0), Inches(2.3), Inches(2.8), Inches(2.7)] col_x = [Inches(0.6), Inches(4.65), Inches(7.0), Inches(9.85)] y_tbl = Inches(2.05) for row_idx, row in enumerate(reop_data): y = y_tbl + row_idx * Inches(0.62) fill = DARK_NAVY if row_idx == 0 else (STEEL_BLUE if row_idx % 2 == 0 else WHITE) text_color = WHITE if row_idx == 0 or row_idx % 2 == 0 else DARK_TEXT for c_idx, (cell, cx, cw) in enumerate(zip(row, col_x, col_widths)): add_rect(s, cx, y, cw - Inches(0.05), Inches(0.6), fill_color=fill) add_textbox(s, cx + Inches(0.05), y + Inches(0.08), cw - Inches(0.1), Inches(0.45), cell, font_size=12, bold=(row_idx == 0), color=text_color) add_textbox(s, Inches(0.6), Inches(4.65), Inches(12.1), Inches(0.35), "Common procedures for infection-related reoperations:", font_size=13, bold=True, color=STEEL_BLUE) reop_bullets = [ "Irrigation & debridement, bone resection, exchange rodding, rod removal + antibiotic calcium sulfate injection", "Nonunion-related: exchange nailing with fresh bone graft (uniform approach)", "Most reoperations occurred early (mean 7.6 mo) — suggesting residual infection rather than mechanical failure", ] add_bullet_tb(s, Inches(0.6), Inches(5.0), Inches(12.1), Inches(1.9), reop_bullets, font_size=13) footer_cite(s) # ---- SLIDE 13: Results — Microbiology ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "RESULTS \u2014 MICROBIOLOGY", 13) # Left: organism table org_data = [ ("Organism", "n (%)"), ("MSSA", "19 (17.1%)"), ("MRSA", "15 (13.5%)"), ("Multiple organisms", "14 (12.6%)"), ("Pseudomonas aeruginosa", "4 (3.6%)"), ("Enterobacter cloacae", "4 (3.6%)"), ("Corynebacterium", "3 (2.7%)"), ("Other organisms", "4 (3.6%)"), ("Culture-negative", "47 (42.3%)"), ] col_xs = [Inches(0.5), Inches(4.9)] col_ws = [Inches(4.4), Inches(1.7)] y_tbl = Inches(1.65) for row_idx, row in enumerate(org_data): y = y_tbl + row_idx * Inches(0.59) fill = DARK_NAVY if row_idx == 0 else (RGBColor(0xE8, 0xEE, 0xF5) if row_idx % 2 == 0 else WHITE) tc = WHITE if row_idx == 0 else DARK_TEXT for c_idx, (cell, cx, cw) in enumerate(zip(row, col_xs, col_ws)): add_rect(s, cx, y, cw - Inches(0.03), Inches(0.57), fill_color=fill) add_textbox(s, cx + Inches(0.05), y + Inches(0.08), cw - Inches(0.1), Inches(0.42), cell, font_size=12, bold=(row_idx == 0), color=tc) # Right: interpretation add_textbox(s, Inches(7.0), Inches(1.65), Inches(5.8), Inches(0.4), "Clinical Interpretation:", font_size=14, bold=True, color=STEEL_BLUE) interp_bullets = [ "42.3% culture-negative — within reported literature range for proven osteomyelitis (~40%); may reflect pre-op antibiotic exposure", "Culture-negative cases: treated with broad-spectrum antibiotics based on prior culture history", "S. aureus (MSSA + MRSA) = 30.6% — supports vancomycin inclusion in PMMA cement mixture", "Of 20 culture-positive reoperation patients: 18 (90%) remained sensitive to vancomycin or tobramycin — validating antibiotic choice", "Gram-negative and polymicrobial coverage provided by tobramycin component", ] add_bullet_tb(s, Inches(7.0), Inches(2.1), Inches(5.8), Inches(5.0), interp_bullets, font_size=12) footer_cite(s) # ---- SLIDE 14: Results — Segmental Defects ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "RESULTS \u2014 SEGMENTAL BONE DEFECTS", 14) seg_data = [ ("Subgroup", "n (%)", "Mean Defect", "Success Rate"), ("With segmental defect", "35 (31.5%)", "6.1 cm (0.5-24)", "85.7% (30/35)"), (" - Infected total joint", "22 (19.8%)", "6.7 cm (1-24)", "\u2014"), (" - Other causes (nonunion/FRI/fusion)", "13 (11.7%)", "5.2 cm (0.5-12)", "\u2014"), ("Without segmental defect", "76 (68.5%)", "\u2014", "88.2% (67/76)"), ] col_xs2 = [Inches(0.5), Inches(5.8), Inches(8.4), Inches(10.7)] col_ws2 = [Inches(5.3), Inches(2.6), Inches(2.3), Inches(2.15)] y_tbl = Inches(1.65) for row_idx, row in enumerate(seg_data): y = y_tbl + row_idx * Inches(0.68) fill = DARK_NAVY if row_idx == 0 else (RGBColor(0xE8, 0xEE, 0xF5) if row_idx % 2 == 0 else WHITE) tc = WHITE if row_idx == 0 else DARK_TEXT for c_idx, (cell, cx, cw) in enumerate(zip(row, col_xs2, col_ws2)): add_rect(s, cx, y, cw - Inches(0.03), Inches(0.65), fill_color=fill) add_textbox(s, cx + Inches(0.05), y + Inches(0.1), cw - Inches(0.1), Inches(0.5), cell, font_size=12, bold=(row_idx == 0), color=tc) key_box = add_rect(s, Inches(0.5), Inches(5.2), Inches(12.3), Inches(0.6), fill_color=MAROON) add_textbox(s, Inches(0.65), Inches(5.28), Inches(12.0), Inches(0.45), "Key Finding: No statistically significant difference in success rate between defect and non-defect groups (85.7% vs 88.2%)", font_size=13, bold=True, color=WHITE) add_textbox(s, Inches(0.6), Inches(5.9), Inches(12.1), Inches(0.85), "Note: Different from the authors' 2014 series where larger defects correlated with worse outcomes. " "Suggests improved technique, patient selection, or cement coverage may overcome the challenge of bone loss.", font_size=12, italic=True, color=DARK_TEXT) footer_cite(s) # ---- SLIDE 15: Results — Complications ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "RESULTS \u2014 COMPLICATIONS & ROD REMOVAL", 15) add_textbox(s, Inches(0.6), Inches(1.65), Inches(12.1), Inches(0.35), "22 patients (19.8%) had 25 nail-related complications:", font_size=14, bold=True, color=DARK_NAVY) comp_data = [ ("Complication", "n (%)", "Management"), ("Symptomatic hardware", "10 (40%)", "Removal"), ("Superficial infection", "6 (24%)", "IV antibiotics \u00b1 local wound care"), ("Nerve compression", "5 (20%)", "Decompression"), ("Joint contracture", "2 (8%)", "Soft-tissue release"), ("Hematoma", "1 (4%)", "I&D with drain"), ("Broken hardware", "1 (4%)", "Revision fusion nail"), ] col_xs3 = [Inches(0.5), Inches(5.6), Inches(8.4)] col_ws3 = [Inches(5.1), Inches(2.8), Inches(4.4)] y_tbl = Inches(2.1) for row_idx, row in enumerate(comp_data): y = y_tbl + row_idx * Inches(0.6) fill = DARK_NAVY if row_idx == 0 else (RGBColor(0xE8, 0xEE, 0xF5) if row_idx % 2 == 0 else WHITE) tc = WHITE if row_idx == 0 else DARK_TEXT for cell, cx, cw in zip(row, col_xs3, col_ws3): add_rect(s, cx, y, cw - Inches(0.03), Inches(0.58), fill_color=fill) add_textbox(s, cx + Inches(0.05), y + Inches(0.08), cw - Inches(0.1), Inches(0.45), cell, font_size=12, bold=(row_idx == 0), color=tc) add_textbox(s, Inches(0.6), Inches(6.25), Inches(6.0), Inches(0.35), "Rod Removal:", font_size=13, bold=True, color=STEEL_BLUE) add_textbox(s, Inches(0.6), Inches(6.6), Inches(12.1), Inches(0.6), "50 patients (45%) had 66 rods removed. Reasons: recurrent infection (44%), 2nd-stage TKA revision (24%), " "symptomatic hardware (15%), amputation (11%), nonunion (3%). Debonding at removal in only 4/66 rods.", font_size=12, color=DARK_TEXT) footer_cite(s) # ---- SLIDE 16: Results — Amputation & Limb Salvage ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "RESULTS \u2014 AMPUTATION & LIMB SALVAGE", 16) # Big number add_rect(s, Inches(0.5), Inches(1.65), Inches(4.0), Inches(2.5), fill_color=MAROON) add_textbox(s, Inches(0.6), Inches(1.75), Inches(3.8), Inches(1.2), "7 / 111", font_size=40, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(s, Inches(0.6), Inches(3.0), Inches(3.8), Inches(0.9), "patients\nunderwent amputation\n(6.3%)", font_size=13, color=WHITE, align=PP_ALIGN.CENTER) # Limb salvage box add_rect(s, Inches(4.6), Inches(1.65), Inches(8.2), Inches(2.5), fill_color=DARK_NAVY) add_textbox(s, Inches(4.7), Inches(1.75), Inches(8.0), Inches(1.2), "93.7%", font_size=42, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(s, Inches(4.7), Inches(3.0), Inches(8.0), Inches(0.9), "Overall Limb Salvage Rate (104/111)", font_size=14, color=WHITE, align=PP_ALIGN.CENTER) amp_bullets = [ "5 above-knee, 2 below-knee amputations; mean age 53.7 yrs (range 44-61)", "Mean 1.1 additional procedures before amputation (range 0-3)", "Mean time from index ACCIN to amputation: 30.5 months (range 15-50)", "Indications: persistent infection (5), nonunion (2)", "Cultures: 4 negative, 3 positive for S. aureus", ] add_textbox(s, Inches(0.6), Inches(4.3), Inches(12.1), Inches(0.35), "Amputation Details:", font_size=14, bold=True, color=STEEL_BLUE) add_bullet_tb(s, Inches(0.6), Inches(4.65), Inches(12.1), Inches(2.4), amp_bullets, font_size=13) footer_cite(s) # ---- SLIDE 17: Discussion ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "DISCUSSION", 17) discuss_bullets = [ "87.4% success rate is comparable to, or exceeds, reported rates with external fixation (70-85%) and prior ACCIN series, supporting single-stage internal fixation as a viable approach.", "The 69.1% single-procedure success challenges the traditional multi-stage paradigm — reducing patient burden, operative risk, and healthcare cost.", "Vancomycin + tobramycin cement combination addresses both gram-positive (especially MRSA) and gram-negative pathogens; 90% susceptibility at reoperation confirms continued antibiotic efficacy.", "Comparable outcomes in segmental defect patients (85.7%) vs. no-defect patients (88.2%) suggests ACCINs may bridge bone gaps while simultaneously treating infection.", "High culture-negativity rate (42.3%) is a recognized challenge in chronic osteomyelitis — broad-spectrum empiric coverage used; infectious disease co-management is essential.", "Limb salvage of 93.7% compares favorably with contemporary series for severe limb-threatening infections.", "The standardized cement protocol (1g vancomycin + 3.6g tobramycin / 40g Palacos) ensures reproducibility — critical for future comparative studies.", ] add_bullet_tb(s, Inches(0.6), Inches(1.65), Inches(12.1), Inches(5.6), discuss_bullets, font_size=13) footer_cite(s) # ---- SLIDE 18: Strengths & Limitations ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "STRENGTHS & LIMITATIONS", 18) # Two columns add_rect(s, Inches(0.4), Inches(1.65), Inches(6.0), Inches(5.65), fill_color=RGBColor(0xE8, 0xF4, 0xE8)) add_textbox(s, Inches(0.5), Inches(1.75), Inches(5.8), Inches(0.4), "\u2714 STRENGTHS", font_size=15, bold=True, color=RGBColor(0x1B, 0x5E, 0x20)) strengths = [ "Largest single-surgeon ACCIN series reported to date (n=111)", "Broad, clinically representative indication mix (TKA, FRI, nonunion, fusion)", "Fully standardized surgical technique and antibiotic protocol — minimizes confounding", "Long mean follow-up (29.2 months; range 6-93) — adequate for chronic infection endpoint", "Rigorous, triangulated success definition (clinical + radiographic + serological)", "Consecutive sampling reduces selection bias", ] add_bullet_tb(s, Inches(0.4), Inches(2.15), Inches(5.8), Inches(4.8), strengths, font_size=12) add_rect(s, Inches(6.95), Inches(1.65), Inches(6.0), Inches(5.65), fill_color=RGBColor(0xFD, 0xF0, 0xF0)) add_textbox(s, Inches(7.05), Inches(1.75), Inches(5.8), Inches(0.4), "\u2718 LIMITATIONS", font_size=15, bold=True, color=RGBColor(0x7F, 0x0C, 0x0C)) limitations = [ "Retrospective, single-surgeon, single-center — no concurrent comparator group", "No a priori power calculation; multiple subgroup comparisons without statistical correction", "Heterogeneous population: 4 distinct indications — limits generalizability of pooled results", "No patient-reported outcomes (functional scores, quality of life)", "Antibiotic resistance patterns not reported for organisms sensitive to cement antibiotics", "Referral center bias — may overestimate success vs. general orthopaedic practice", ] add_bullet_tb(s, Inches(6.95), Inches(2.15), Inches(5.8), Inches(4.8), limitations, font_size=12) footer_cite(s) # ---- SLIDE 19: Conclusions ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=LIGHT_BG) header_bar(s, "CONCLUSIONS", 19) # Key conclusions with big visual impact conc_items = [ (MAROON, "87.4% treatment success", "Confirms ACCIN as an effective single-stage strategy for FRI, infected nonunion, and infected arthrodesis"), (DARK_NAVY, "93.7% limb salvage", "Demonstrates potential to avoid amputation even in severe, complex infections with bone loss"), (STEEL_BLUE, "Single procedure in 69.1%", "Challenges multi-stage dogma — reduces surgical burden, anaesthetic risk, and cost"), (RGBColor(0x2E, 0x7D, 0x32), "Validated antibiotic choice", "Vancomycin + tobramycin coverage maintained efficacy in 90% of culture-positive reoperations"), ] y_c = Inches(1.65) for color, headline, detail in conc_items: add_rect(s, Inches(0.5), y_c, Inches(3.5), Inches(1.1), fill_color=color) add_textbox(s, Inches(0.6), y_c + Inches(0.2), Inches(3.3), Inches(0.75), headline, font_size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_rect(s, Inches(4.1), y_c, Inches(8.7), Inches(1.1), fill_color=WHITE) add_textbox(s, Inches(4.2), y_c + Inches(0.2), Inches(8.5), Inches(0.75), detail, font_size=13, color=DARK_TEXT) y_c += Inches(1.2) add_textbox(s, Inches(0.6), Inches(6.55), Inches(12.1), Inches(0.55), "Future directions: Prospective RCTs comparing ACCIN vs. external fixation; standardized antibiogram reporting; patient-reported outcome measures; cost-effectiveness analyses.", font_size=11, italic=True, color=STEEL_BLUE) footer_cite(s) # ---- SLIDE 20: Thank You ---- s = blank_slide(prs) add_rect(s, Inches(0), Inches(0), W, H, fill_color=DARK_NAVY) add_rect(s, Inches(0), Inches(3.5), W, Inches(0.06), fill_color=MAROON) add_textbox(s, Inches(0), Inches(2.9), W, Inches(0.9), "THANK YOU", font_size=48, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(s, Inches(0), Inches(3.75), W, Inches(0.7), "Questions & Discussion", font_size=22, color=STEEL_BLUE, align=PP_ALIGN.CENTER) add_textbox(s, Inches(0), Inches(4.75), W, Inches(0.4), "Conway JD, Elhessy AH, Galiboglu S, Patel N, Gesheff MG", font_size=14, color=LIGHT_GRAY, align=PP_ALIGN.CENTER) add_textbox(s, Inches(0), Inches(5.2), W, Inches(0.35), "Injury 2021 | PMC8023901 | IORT_91_1818175", font_size=12, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER) # Save out_path = "/tmp/workspace/journal-club-accin/JournalClub_ACCIN.pptx" prs.save(out_path) print(f"Saved: {out_path}") print(f"Slides: {len(prs.slides)}") PYEOF python3 /tmp/workspace/journal-club-accin/build_pptx.py
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/journal-club-accin/JournalClub_ACCIN.pptx') print(f'Total slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if shape.has_text_frame and shape.text_frame.text.strip(): texts.append(shape.text_frame.text[:60]) print(f'Slide {i}: {\" | \".join(texts[:3])}') "
JournalClub ACCIN
Presentation · PPTX
| # | Slide |
|---|---|
| 1 | Title slide — paper, authors, journal, study badge |
| 2 | Index / Table of Contents |
| 3 | Introduction |
| 4 | Background & Rationale |
| 5 | Study Objective (highlighted box + secondary objectives) |
| 6 | PICO Framework (color-coded 4-row layout) |
| 7 | Methods — Design & Eligibility |
| 8 | Patient Demographics (alternating colored table, n=111) |
| 9 | Surgical Technique (4-step color-block layout) |
| 10 | Outcome Measures & Follow-up |
| 11 | Results — Primary Outcome (3 big stat boxes: 87.4% / 69.1% / 93.7%) |
| 12 | Results — Reoperations (n=30, table + breakdown) |
| 13 | Results — Microbiology (organism table + interpretation) |
| 14 | Results — Segmental Bone Defects (with key finding callout) |
| 15 | Results — Complications & Rod Removal |
| 16 | Results — Amputation & Limb Salvage |
| 17 | Discussion |
| 18 | Strengths & Limitations (two-column, green/red) |
| 19 | Conclusions (4 color-coded takeaway boxes) |
| 20 | Thank You / Discussion |
#1B2A41, maroon #8C1D1D, steel blue #3E5C76, light background #F4F5F7), header bar format, footer citations on each slide, and 13.33" x 7.5" widescreen layout.Retry
ls /tmp/workspace/journal-club-accin/unpacked/ppt/slides/ && echo "---" && ls /tmp/workspace/journal-club-accin/unpacked/ppt/ && echo "---" && ls /tmp/workspace/journal-club-accin/unpacked/
python3 << 'EOF' # Inspect slide1 full XML and slide3 (intro) full XML to understand all text shape structures from lxml import etree def show_slide(path): tree = etree.parse(path) root = tree.getroot() ns = { 'p': 'http://schemas.openxmlformats.org/presentationml/2006/main', 'a': 'http://schemas.openxmlformats.org/drawingml/2006/main', } shapes = root.findall('.//p:sp', ns) print(f"\n=== {path.split('/')[-1]} has {len(shapes)} shapes ===") for sp in shapes: cNvPr = sp.find('.//p:nvSpPr/p:cNvPr', ns) name = cNvPr.get('name','?') if cNvPr is not None else '?' xfrm = sp.find('.//p:spPr/a:xfrm', ns) if xfrm is not None: off = xfrm.find('a:off', ns) ext = xfrm.find('a:ext', ns) x = int(off.get('x',0)) if off is not None else 0 y = int(off.get('y',0)) if off is not None else 0 cx = int(ext.get('cx',0)) if ext is not None else 0 cy = int(ext.get('cy',0)) if ext is not None else 0 runs_text = [] for r in sp.findall('.//a:r', ns): t = r.find('a:t', ns) if t is not None and t.text: runs_text.append(t.text[:40]) paras_text = [] for par in sp.findall('.//a:p', ns): texts = [r.find('a:t',ns).text for r in par.findall('a:r',ns) if r.find('a:t',ns) is not None and r.find('a:t',ns).text] if texts: paras_text.append(' '.join(texts)[:60]) print(f" [{name}] x={x} y={y} cx={cx} cy={cy} | {'|'.join(paras_text[:3]) if paras_text else '(no text)'}") for i in [1, 3, 5, 9, 15]: show_slide(f'/tmp/workspace/journal-club-accin/unpacked/ppt/slides/slide{i}.xml') EOF
cat << 'PYEOF' > /tmp/workspace/journal-club-accin/rebuild.py """ Journal Club PPTX — rebuild using the reference .pptx as the actual template. Strategy: 1. Open the original PPTX with python-pptx (it already has the theme/master/fonts). 2. Use add_slide() from the existing slide layouts (all slides use layout 'DEFAULT'). 3. Reproduce the EXACT XML shape pattern of each reference slide, but with new content. 4. Keep only the new slides; delete the original 26 slides. """ import copy from lxml import etree from pptx import Presentation from pptx.util import Emu, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN from pptx.oxml.ns import qn from io import BytesIO SRC = "/tmp/workspace/attachments/e294784f-e395-4faa-bfa1-0f581340efd0/ACCIN final .pptx" OUT = "/tmp/workspace/journal-club-accin/JournalClub_ACCIN_v2.pptx" prs = Presentation(SRC) # ── helpers ────────────────────────────────────────────────────────────────── NS_A = "http://schemas.openxmlformats.org/drawingml/2006/main" NS_P = "http://schemas.openxmlformats.org/presentationml/2006/main" def emu(inches): return int(inches * 914400) def _make_sp(slide_id, name, x, y, cx, cy, fill_rgb=None, line_rgb=None): """Create a minimal <p:sp> rectangle shape element.""" sp_xml = f'''<p:sp xmlns:p="{NS_P}" xmlns:a="{NS_A}"> <p:nvSpPr> <p:cNvPr id="{slide_id}" name="{name}"/> <p:cNvSpPr/> <p:nvPr/> </p:nvSpPr> <p:spPr> <a:xfrm><a:off x="{x}" y="{y}"/><a:ext cx="{cx}" cy="{cy}"/></a:xfrm> <a:prstGeom prst="rect"><a:avLst/></a:prstGeom> {'<a:solidFill><a:srgbClr val="' + fill_rgb + '"/></a:solidFill>' if fill_rgb else '<a:noFill/>'} <a:ln>{'<a:solidFill><a:srgbClr val="' + (line_rgb or fill_rgb or 'FFFFFF') + '"/></a:solidFill>' if (line_rgb or fill_rgb) else '<a:noFill/>'}</a:ln> </p:spPr> <p:txBody> <a:bodyPr/> <a:lstStyle/> <a:p/> </p:txBody> </p:sp>''' return etree.fromstring(sp_xml) def _make_txbox(sid, name, x, y, cx, cy): xml = f'''<p:sp xmlns:p="{NS_P}" xmlns:a="{NS_A}"> <p:nvSpPr> <p:cNvPr id="{sid}" name="{name}"/> <p:cNvSpPr txBox="1"/> <p:nvPr/> </p:nvSpPr> <p:spPr> <a:xfrm><a:off x="{x}" y="{y}"/><a:ext cx="{cx}" cy="{cy}"/></a:xfrm> <a:prstGeom prst="rect"><a:avLst/></a:prstGeom> <a:noFill/> <a:ln><a:noFill/></a:ln> </p:spPr> <p:txBody> <a:bodyPr wrap="square"/> <a:lstStyle/> <a:p/> </p:txBody> </p:sp>''' return etree.fromstring(xml) def set_text(shape, paragraphs, default_size=14, default_bold=False, default_color="222222", default_align=PP_ALIGN.LEFT, wrap=True): """ paragraphs: list of str OR list of dicts with keys: text, size, bold, color (hex str), align, italic, space_before """ tf = shape.text_frame tf.word_wrap = wrap # clear from pptx.oxml.ns import qn as Q txBody = tf._txBody for p in txBody.findall(Q('a:p')): txBody.remove(p) for i, item in enumerate(paragraphs): if isinstance(item, str): cfg = {'text': item} else: cfg = item text = cfg.get('text', '') size = cfg.get('size', default_size) bold = cfg.get('bold', default_bold) color = cfg.get('color', default_color) align = cfg.get('align', default_align) italic = cfg.get('italic', False) sp_b = cfg.get('space_before', 0) p_xml = f'<a:p xmlns:a="{NS_A}"></a:p>' p_el = etree.fromstring(p_xml) # paragraph properties pPr = etree.SubElement(p_el, f'{{{NS_A}}}pPr') align_map = {PP_ALIGN.LEFT:'l', PP_ALIGN.CENTER:'ctr', PP_ALIGN.RIGHT:'r', PP_ALIGN.JUSTIFY:'just'} pPr.set('algn', align_map.get(align, 'l')) if sp_b: pPr.set('marL','0') spcBef = etree.SubElement(pPr, f'{{{NS_A}}}spcBef') spcPts = etree.SubElement(spcBef, f'{{{NS_A}}}spcPts') spcPts.set('val', str(int(sp_b*100))) # run r = etree.SubElement(p_el, f'{{{NS_A}}}r') rPr = etree.SubElement(r, f'{{{NS_A}}}rPr') rPr.set('lang', 'en-US') rPr.set('sz', str(int(size*100))) rPr.set('b', '1' if bold else '0') rPr.set('i', '1' if italic else '0') rPr.set('dirty', '0') solidFill = etree.SubElement(rPr, f'{{{NS_A}}}solidFill') srgbClr = etree.SubElement(solidFill, f'{{{NS_A}}}srgbClr') srgbClr.set('val', color.upper()) t = etree.SubElement(r, f'{{{NS_A}}}t') t.text = text txBody.append(p_el) def add_shape_to_slide(slide, shape_el): spTree = slide.shapes._spTree spTree.append(shape_el) def get_spTree(slide): return slide.shapes._spTree def clear_spTree(slide): spTree = get_spTree(slide) for child in list(spTree): tag = child.tag.split('}')[-1] if '}' in child.tag else child.tag if tag not in ('nvGrpSpPr', 'grpSpPr'): spTree.remove(child) # reference slide layout (all slides use idx 0 which is 'DEFAULT') layout = prs.slide_layouts[0] # colours (hex strings for XML) C_BG = "F4F5F7" C_MAROON = "8C1D1D" C_NAVY = "1B2A41" C_STEEL = "3E5C76" C_WHITE = "FFFFFF" C_DARK = "222222" C_LGRAY = "DDDDDD" C_MGRAY = "888888" C_LTBLUE = "E8EEF5" # light blue tint for table alternating rows C_LTGREEN = "E8F4E8" C_LTRED = "FDF0F0" C_GREEN = "1B5E20" C_DKRED = "7F0C0C" # EMU shortcuts W = emu(13.33) H = emu(7.5) # ── shape id counter ── _id = 100 def nid(): global _id _id += 1 return _id # ── standard header + footer builders ──────────────────────────────────────── def add_header(slide, title, page_num): """Replicate the reference header: grey bg bar + maroon line + title + page num.""" # grey bg rect (full width) bg = _make_sp(nid(),'bg_rect', 0,0, W, emu(1.55), fill_rgb=C_BG, line_rgb=C_BG) add_shape_to_slide(slide, bg) # maroon accent line ln = _make_sp(nid(),'accent_ln', 0,emu(1.55), W, emu(0.04), fill_rgb=C_MAROON, line_rgb=C_MAROON) add_shape_to_slide(slide, ln) # title text box tb = _make_txbox(nid(),'hdr_title', emu(0.5),emu(0.3), emu(12.3),emu(0.65)) add_shape_to_slide(slide, tb) set_text(slide.shapes[-1], [{'text':title,'size':24,'bold':True,'color':C_NAVY}]) # page number pg = _make_txbox(nid(),'page_num', emu(12.6),emu(7.14), emu(0.5),emu(0.28)) add_shape_to_slide(slide, pg) set_text(slide.shapes[-1], [{'text':str(page_num),'size':9,'color':C_MGRAY,'align':PP_ALIGN.RIGHT}]) def add_footer_cite(slide, text="Conway JD, et al. Injury 2021; 52(4): 1047-1054"): tb = _make_txbox(nid(),'footer_cite', emu(0.5),emu(7.1), emu(10.0),emu(0.3)) add_shape_to_slide(slide, tb) set_text(slide.shapes[-1], [{'text':text,'size':8,'italic':True,'color':C_MGRAY}]) def add_text_block(slide, x,y,w,h, paras, size=14, bold=False, color=C_DARK, align=PP_ALIGN.LEFT, wrap=True): tb = _make_txbox(nid(),'txtblk', x,y,w,h) add_shape_to_slide(slide, tb) if isinstance(paras, str): paras = [paras] set_text(slide.shapes[-1], [ {'text':p,'size':size,'bold':bold,'color':color,'align':align} for p in paras ], wrap=wrap) def add_bullet_block(slide, x,y,w,h, items, size=14, heading=None, head_color=C_STEEL): tb = _make_txbox(nid(),'bullets', x,y,w,h) add_shape_to_slide(slide, tb) paras = [] if heading: paras.append({'text':heading,'size':size+1,'bold':True,'color':head_color, 'space_before':0}) for item in items: paras.append({'text':f"\u2022 {item}",'size':size,'color':C_DARK}) set_text(slide.shapes[-1], paras) def add_rect_shape(slide, x,y,w,h, fill=C_NAVY, line=None): r = _make_sp(nid(),'rect', x,y,w,h, fill_rgb=fill, line_rgb=line or fill) add_shape_to_slide(slide, r) # ── new_slide helper ────────────────────────────────────────────────────────── def new_slide(prs): sl = prs.slides.add_slide(layout) clear_spTree(sl) return sl # ═══════════════════════════════════════════════════════════════════════════════ # BUILD SLIDES # ═══════════════════════════════════════════════════════════════════════════════ # We'll build new slides AFTER the existing 26 originals, then delete originals. new_slide_objects = [] # ── SLIDE 1: Title ──────────────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) # white full bg add_rect_shape(s, 0,0, W,H, fill=C_BG) # dark navy top band add_rect_shape(s, 0,0, W,emu(1.65), fill=C_NAVY) # maroon divider add_rect_shape(s, 0,emu(1.65), W,emu(0.06), fill=C_MAROON) # JOURNAL CLUB label (matches ref: x=0.8, y=0.55, steel blue) add_text_block(s, emu(0.8),emu(0.5), emu(6),emu(0.5), 'JOURNAL CLUB', size=14, bold=True, color=C_STEEL) # Main title add_text_block(s, emu(0.8),emu(2.1), emu(11.7),emu(2.5), 'Antibiotic Cement-Coated Intramedullary Nails (ACCINs) for\nFracture-Related Infections, Infected Nonunions & Arthrodeses', size=30, bold=True, color=C_NAVY) # Authors add_text_block(s, emu(0.8),emu(4.65), emu(11.5),emu(0.45), 'Conway JD, Elhessy AH, Galiboglu S, Patel N, Gesheff MG', size=14, color=C_DARK) # Journal add_text_block(s, emu(0.8),emu(5.15), emu(11.5),emu(0.4), 'Injury, 2021 \u2022 PMC8023901 \u2022 IORT_91_1818175', size=13, bold=False, color=C_STEEL) # badge rect add_rect_shape(s, emu(0.8),emu(5.95), emu(5.0),emu(0.52), fill=C_MAROON) add_text_block(s, emu(0.9),emu(6.05), emu(4.8),emu(0.38), 'Retrospective Cohort \u2022 n = 111 \u2022 Level of Evidence: IV', size=11, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER) # ── SLIDE 2: Index ──────────────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s, 'INDEX', 2) sections_l = ['1. Introduction','2. Background & Rationale','3. Study Objective', '4. PICO Framework','5. Methods \u2014 Design & Eligibility', '6. Surgical Technique','7. Outcome Measures & Follow-up','8. Results \u2014 Primary Outcome'] sections_r = ['9. Results \u2014 Microbiology','10. Results \u2014 Segmental Defects', '11. Results \u2014 Complications','12. Results \u2014 Rod Removal', '13. Results \u2014 Amputation & Limb Salvage','14. Discussion', '15. Strengths & Limitations','16. Conclusions'] tb_l = _make_txbox(nid(),'idx_l', emu(0.7),emu(1.65), emu(5.9),emu(5.6)) add_shape_to_slide(s, tb_l) set_text(s.shapes[-1], [{'text':t,'size':14,'color':C_NAVY} for t in sections_l]) tb_r = _make_txbox(nid(),'idx_r', emu(6.8),emu(1.65), emu(5.9),emu(5.6)) add_shape_to_slide(s, tb_r) set_text(s.shapes[-1], [{'text':t,'size':14,'color':C_NAVY} for t in sections_r]) add_footer_cite(s) # ── SLIDE 3: Introduction ───────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'INTRODUCTION', 3) add_bullet_block(s, emu(0.6),emu(1.65), emu(12.1),emu(5.55), [ 'Fracture-related infections (FRIs), infected nonunions, and infected arthrodeses remain among the most difficult complications in orthopaedic trauma surgery.', 'Once infection establishes, bacteria form biofilms on implants and necrotic bone — conferring resistance to host immunity and systemic antibiotics.', 'Successful treatment requires comprehensive surgical strategy: radical debridement, dead-space elimination, local antibiotic delivery, and stable skeletal fixation.', 'Historically, infected medullary canals were managed with external fixation — placing an IM nail into an infected canal was believed to perpetuate infection.', 'Antibiotic cement-coated intramedullary nails (ACCINs) challenge this paradigm: combining local antibiotic delivery with immediate internal mechanical stability in one construct.', 'These conditions impose enormous patient burden: prolonged disability, repeated surgeries, risk of nonunion, and potential limb amputation.', ], size=14) add_footer_cite(s) # ── SLIDE 4: Background & Rationale ────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'BACKGROUND & RATIONALE', 4) add_bullet_block(s, emu(0.6),emu(1.65), emu(12.1),emu(5.55), [ 'Incidence of FRI: ~5% in closed fractures to >30% in severe open fractures; driven by contamination, soft-tissue injury, and comorbidities.', 'Biofilm formation is the key driver of treatment failure: microorganisms adhere to implants/necrotic bone, shielded from systemic antibiotics and host defenses.', 'Conventional IV antibiotics fail without aggressive surgical debridement and local delivery.', 'Antibiotic-loaded PMMA cement (vancomycin + tobramycin) provides sustained local drug release, fills dead space, and achieves concentrations far exceeding serum levels.', 'Prior series (Rice et al., Conway 2014) showed promising outcomes but were limited in sample size or indication breadth.', 'This study presents the largest single-surgeon ACCIN cohort (n=111) across four indications: FRI, infected nonunion, infected TKA, infected arthrodesis.', ], size=14) add_footer_cite(s) # ── SLIDE 5: Study Objective ────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'STUDY OBJECTIVE', 5) # Objective highlighted box add_rect_shape(s, emu(0.8),emu(1.75), emu(11.7),emu(2.5), fill=C_NAVY) add_text_block(s, emu(0.95),emu(1.9), emu(11.4),emu(2.2), 'To evaluate the effectiveness of ACCINs in achieving simultaneous eradication of infection ' 'and successful bone healing/stable arthrodesis in patients with FRI, infected nonunions, and infected knee/ankle arthrodeses.', size=17, color=C_WHITE, align=PP_ALIGN.CENTER) add_text_block(s, emu(0.6),emu(4.45), emu(12.1),emu(0.4), 'Secondary Objectives:', size=14, bold=True, color=C_STEEL) add_bullet_block(s, emu(0.6),emu(4.85), emu(12.1),emu(1.85), [ 'Determine reoperation rates, complication profile, and rod removal patterns', 'Evaluate outcomes in the segmental bone defect subgroup', 'Assess overall limb-salvage and amputation rates', ], size=13) add_footer_cite(s) # ── SLIDE 6: PICO ───────────────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'PICO FRAMEWORK', 6) pico = [ ('P', 'Population', C_MAROON, '111 adults (age 13\u201383 yrs) with FRI, infected long-bone nonunion, or infected knee/ankle arthrodesis.\nCierny-Mader host type A or B; excluded type C hosts and follow-up < 6 months.'), ('I', 'Intervention', C_NAVY, 'Single-stage radical debridement + ACCIN (vancomycin + tobramycin-loaded Palacos cement / silicone mould)\n+ 6 weeks culture-directed IV antibiotics under infectious disease supervision.'), ('C', 'Comparison', C_STEEL, 'None concurrent \u2014 historical/literature comparison only\n(external fixation, alternative ACCIN techniques, authors\u2019 own 2014 series).'), ('O', 'Outcome', RGBColor(0x2E,0x7D,0x32).rgb, #'2E7D32', 'Primary: healed/uninfected bone or stable arthrodesis (clinical + radiographic + serologic)\nSecondary: reoperations, limb salvage, complications, rod removal, amputation.'), ] y0 = emu(1.65); rh = emu(1.37) for letter, label, col, detail in pico: if isinstance(col, int): col_hex = f'{col:06X}' else: col_hex = col add_rect_shape(s, emu(0.5),y0, emu(2.8),rh-emu(0.05), fill=col_hex) add_text_block(s, emu(0.55),y0+emu(0.35), emu(2.7),emu(0.6), f'{letter} \u2014 {label}', size=14, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER) add_rect_shape(s, emu(3.35),y0, emu(9.5),rh-emu(0.05), fill=C_WHITE) add_text_block(s, emu(3.5),y0+emu(0.1), emu(9.2),rh-emu(0.2), detail, size=12, color=C_DARK) y0 += rh add_footer_cite(s) # ── SLIDE 7: Methods ───────────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'METHODS \u2014 DESIGN & ELIGIBILITY', 7) add_bullet_block(s, emu(0.6),emu(1.65), emu(12.1),emu(5.55), [ 'Study design: Retrospective, non-randomized, observational cohort study', 'Setting: Single tertiary referral centre; single fellowship-trained limb reconstruction surgeon', 'Study period: January 2014 \u2013 December 2020; IRB-approved; Declaration of Helsinki compliant', 'Inclusion: Adults with FRI, infected nonunion, or infected knee/ankle arthrodesis; Cierny-Mader host type A or B; \u226506 months follow-up', 'Exclusion: Cierny-Mader type C hosts (severe medical compromise where limb salvage not in best interest); follow-up <6 months', '120 consecutive patients identified \u2192 9 excluded \u2192 final cohort n = 111', 'Consecutive sampling strategy reduces selection bias while reflecting real-world practice', ], size=14) add_footer_cite(s) # ── SLIDE 8: Patient Demographics ──────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'PATIENT DEMOGRAPHICS (N = 111)', 8) rows = [ ('Characteristic','Value'), ('Sex','57 male (51.4%) / 54 female (48.6%)'), ('Mean Age','56.9 yrs (range 13\u201383)'), ('Mean BMI','33.4 kg/m\u00b2 (range 17.5\u201352.4)'), ('Host Type (Cierny-Mader)','Type A: 5 (4.5%) | Type B: 106 (95.5%)'), ('Indication','Infected TKA 38.7% \u2022 Infected fusion 20.7% \u2022 FRI 20.7% \u2022 Infected nonunion 19.8%'), ('ACCIN Location','Knee fusion 46% \u2022 Hindfoot fusion 32.4% \u2022 Tibia 11.7% \u2022 Retrograde femur 5.4% \u2022 Antegrade femur 4.5%'), ('Segmental Bone Defects','35 patients (31.5%); mean defect 6.1 cm (range 0.5\u201324 cm)'), ('Mean Follow-up','29.2 months (range 6\u201393)'), ] y0=emu(1.65); rh=emu(0.62) for i,(k,v) in enumerate(rows): fill = C_NAVY if i==0 else (C_STEEL if i%2==1 else C_LTBLUE) tc = C_WHITE if i<=1 or (i%2==1) else C_DARK add_rect_shape(s, emu(0.5),y0, emu(4.1),rh-emu(0.03), fill=fill) add_text_block(s, emu(0.55),y0+emu(0.07), emu(4.0),rh-emu(0.12), k, size=12, bold=(i==0), color=tc) add_rect_shape(s, emu(4.65),y0, emu(8.2),rh-emu(0.03), fill=C_WHITE if i>0 else C_NAVY) add_text_block(s, emu(4.75),y0+emu(0.07), emu(8.0),rh-emu(0.12), v, size=12, bold=(i==0), color=C_WHITE if i==0 else C_DARK) y0+=rh add_footer_cite(s) # ── SLIDE 9: Surgical Technique ─────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'SURGICAL TECHNIQUE', 9) steps = [ ('Step 1 | Radical Debridement', 'Complete excision of infected/necrotic bone and devitalized soft tissue. Multiple intraoperative cultures obtained before antibiotic administration. Infectious disease consulted intraoperatively.'), ('Step 2 | ACCIN Construction', 'Standard Smith & Nephew Trigen IM nail coated via silicone tubing mould with PMMA cement: 1 g vancomycin + 3.6 g tobramycin per 40 g Palacos cement. Allowed to cure fully before insertion.'), ('Step 3 | Nail Insertion', 'Coated nail inserted under fluoroscopic guidance and locked in standard fashion. Provides immediate internal stability while delivering sustained high-concentration local antibiotics.'), ('Step 4 | Post-operative Protocol', '6 weeks culture-directed IV antibiotics under infectious disease supervision. Culture-negative cases received broad-spectrum coverage based on prior microbiological history and clinical judgement.'), ] y0=emu(1.65); sh=emu(1.38) for step_title, detail in steps: add_rect_shape(s, emu(0.5),y0, emu(3.3),sh-emu(0.08), fill=C_MAROON) add_text_block(s, emu(0.55),y0+emu(0.22), emu(3.2),emu(0.75), step_title, size=13, bold=True, color=C_WHITE) add_rect_shape(s, emu(3.85),y0, emu(9.0),sh-emu(0.08), fill=C_WHITE) add_text_block(s, emu(4.0),y0+emu(0.1), emu(8.7),sh-emu(0.22), detail, size=13, color=C_DARK) y0+=sh add_footer_cite(s) # ── SLIDE 10: Outcome Measures ──────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'OUTCOME MEASURES & FOLLOW-UP', 10) add_rect_shape(s, emu(0.5),emu(1.65), emu(12.3),emu(1.15), fill=C_NAVY) add_text_block(s, emu(0.7),emu(1.75), emu(12.0),emu(0.95), 'PRIMARY OUTCOME: Treatment success = healed AND infection-free bone OR stable arthrodesis, confirmed by concordant clinical exam + radiographic union (\u22653/4 cortices bridged + painless WB) + normalized ESR/CRP', size=13, bold=False, color=C_WHITE) add_bullet_block(s, emu(0.6),emu(2.9), emu(12.1),emu(4.2), [ 'Secondary outcomes: reoperation rate, complications, rod removal patterns, limb salvage, amputation', 'Radiographic follow-up: X-rays at 6 wks, 12 wks (CT at ~16 wks if equivocal), 6 months, 12 months, 24 months', 'Serological monitoring: ESR and CRP measured serially; normalization required for classification as success', 'Minimum follow-up: 6 months; mean follow-up 29.2 months (range 6\u201393 months)', 'ACCIN removal: performed once infection eradicated and bone healed; not mandatory if asymptomatic', 'Standardized protocol for all patients \u2014 minimizes variability in success classification', ], size=14) add_footer_cite(s) # ── SLIDE 11: Results — Primary Outcome ────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'RESULTS \u2014 PRIMARY OUTCOME', 11) stats = [ ('87.4%','Healed & infection-free\n(97 / 111 patients)', C_MAROON), ('69.1%','Single procedure\nsufficient (67/97)', C_NAVY), ('93.7%','Overall limb\nsalvage (104/111)', C_STEEL), ] for i,(pct,label,col) in enumerate(stats): x = emu(0.7) + i*emu(4.15) add_rect_shape(s, x,emu(1.5), emu(3.9),emu(2.15), fill=col) add_text_block(s, x+emu(0.1),emu(1.6), emu(3.7),emu(1.1), pct, size=42, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER) add_text_block(s, x+emu(0.1),emu(2.75), emu(3.7),emu(0.8), label, size=12, color=C_WHITE, align=PP_ALIGN.CENTER) add_text_block(s, emu(0.6),emu(3.85), emu(12.1),emu(0.38), 'Key Findings:', size=14, bold=True, color=C_STEEL) add_bullet_block(s, emu(0.6),emu(4.25), emu(12.1),emu(2.85), [ '97/111 (87.4%) achieved healed, infection-free bone or stable arthrodesis at mean 29.2 months follow-up', '67/97 successful cases (69.1%) required only the index ACCIN procedure \u2014 validating single-stage viability', '30 successful patients required further treatment: mean 2.1 additional procedures (range 1\u20135), mostly for persistent/recurrent infection', 'Segmental bone defect subgroup (n=35): 85.7% success vs. 88.2% without defects \u2014 no significant difference', ], size=13) add_footer_cite(s) # ── SLIDE 12: Results — Reoperations ───────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'RESULTS \u2014 REOPERATIONS (N = 30)', 12) add_text_block(s, emu(0.6),emu(1.65), emu(12.1),emu(0.38), '30/111 patients (27%) required \u22651 reoperation:', size=14, bold=True, color=C_NAVY) # Table cols_x = [emu(0.5), emu(4.7), emu(7.1), emu(9.95)] cols_w = [emu(4.2), emu(2.4), emu(2.85), emu(2.7)] reop_tbl = [ ('Reason for Reoperation','n (%)','Mean Procedures','Mean Time to Reop.'), ('Infection only','24 (80%)','2.0 (range 1\u20135)','7.6 mo (range 1\u201329)'), ('Nonunion only','4 (13.3%)','1.3 (range 1\u20132)','18.3 mo (range 3\u201345)'), ('Both infection & nonunion','2 (6.7%)','1.0','2.5 mo (range 1\u20134)'), ] y0=emu(2.1); rh=emu(0.65) for ri,row in enumerate(reop_tbl): fill = C_NAVY if ri==0 else (C_LTBLUE if ri%2==0 else C_WHITE) tc = C_WHITE if ri==0 else C_DARK for ci,(cell,cx,cw) in enumerate(zip(row,cols_x,cols_w)): add_rect_shape(s, cx,y0, cw-emu(0.03),rh-emu(0.03), fill=fill) add_text_block(s, cx+emu(0.05),y0+emu(0.09), cw-emu(0.1),rh-emu(0.16), cell, size=12, bold=(ri==0), color=tc) y0+=rh add_text_block(s, emu(0.6),emu(4.85), emu(12.1),emu(0.38), 'Common procedures for infection-related reoperations:', size=13, bold=True, color=C_STEEL) add_bullet_block(s, emu(0.6),emu(5.25), emu(12.1),emu(1.85), [ 'I&D, bone resection, exchange rodding, rod removal + antibiotic calcium sulfate injection', 'Nonunion: exchange nailing with fresh bone graft', 'Early reoperation (mean 7.6 mo) suggests residual/recurrent infection rather than mechanical failure', ], size=13) add_footer_cite(s) # ── SLIDE 13: Results — Microbiology ───────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'RESULTS \u2014 MICROBIOLOGY', 13) org_rows = [ ('Organism','n (%)'), ('MSSA','19 (17.1%)'), ('MRSA','15 (13.5%)'), ('Multiple organisms','14 (12.6%)'), ('Pseudomonas aeruginosa','4 (3.6%)'), ('Enterobacter cloacae','4 (3.6%)'), ('Corynebacterium','3 (2.7%)'), ('Other organisms','4 (3.6%)'), ('Culture-negative','47 (42.3%)'), ] org_cx=[emu(0.5),emu(5.1)] org_cw=[emu(4.6),emu(1.9)] y0=emu(1.65); rh=emu(0.58) for ri,row in enumerate(org_rows): fill = C_NAVY if ri==0 else (C_LTBLUE if ri%2==0 else C_WHITE) tc = C_WHITE if ri==0 else C_DARK for cell,cx,cw in zip(row,org_cx,org_cw): add_rect_shape(s, cx,y0, cw-emu(0.03),rh-emu(0.03), fill=fill) add_text_block(s, cx+emu(0.05),y0+emu(0.09), cw-emu(0.1),rh-emu(0.16), cell, size=12, bold=(ri==0), color=tc) y0+=rh # Right panel interpretation add_text_block(s, emu(7.25),emu(1.65), emu(5.7),emu(0.4), 'Clinical Interpretation:', size=14, bold=True, color=C_STEEL) add_bullet_block(s, emu(7.25),emu(2.1), emu(5.7),emu(5.1), [ '42.3% culture-negative \u2014 consistent with osteomyelitis literature (~40%); may reflect pre-op antibiotic exposure', 'Culture-negative cases: broad-spectrum coverage guided by prior cultures', 'S. aureus total 30.6% (MSSA + MRSA) \u2014 supports vancomycin in cement', '90% of culture-positive reoperation patients remained sensitive to vancomycin or tobramycin', 'Tobramycin component addresses gram-negative (Pseudomonas, Enterobacter) and polymicrobial infections', ], size=12) add_footer_cite(s) # ── SLIDE 14: Results — Segmental Bone Defects ─────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'RESULTS \u2014 SEGMENTAL BONE DEFECTS', 14) seg_rows = [ ('Subgroup','n (%)','Mean Defect','Success Rate'), ('With segmental defect','35 (31.5%)','6.1 cm (0.5\u201324)','85.7% (30/35)'), (' \u2022 Infected total joint','22 (19.8%)','6.7 cm (1\u201324)','\u2014'), (' \u2022 Other (nonunion/FRI/fusion)','13 (11.7%)','5.2 cm (0.5\u201312)','\u2014'), ('Without segmental defect','76 (68.5%)','\u2014','88.2% (67/76)'), ] seg_cx=[emu(0.5),emu(5.9),emu(8.55),emu(10.95)] seg_cw=[emu(5.4),emu(2.65),emu(2.4), emu(2.2)] y0=emu(1.65); rh=emu(0.72) for ri,row in enumerate(seg_rows): fill = C_NAVY if ri==0 else (C_LTBLUE if ri%2==0 else C_WHITE) tc = C_WHITE if ri==0 else C_DARK for cell,cx,cw in zip(row,seg_cx,seg_cw): add_rect_shape(s, cx,y0, cw-emu(0.03),rh-emu(0.03), fill=fill) add_text_block(s, cx+emu(0.05),y0+emu(0.09), cw-emu(0.1),rh-emu(0.18), cell, size=12, bold=(ri==0), color=tc) y0+=rh # Key finding callout add_rect_shape(s, emu(0.5),emu(5.45), emu(12.3),emu(0.65), fill=C_MAROON) add_text_block(s, emu(0.65),emu(5.55), emu(12.0),emu(0.5), 'Key Finding: No statistically significant difference in success rate between defect (85.7%) and no-defect (88.2%) groups', size=13, bold=True, color=C_WHITE) add_text_block(s, emu(0.6),emu(6.15), emu(12.1),emu(0.85), 'This contrasts with the authors\u2019 2014 series where larger defects correlated with worse outcomes. Suggests refined technique, improved patient selection, or better cement coverage may overcome bone loss challenges.', size=12, color=C_DARK) add_footer_cite(s) # ── SLIDE 15: Results — Complications ──────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'RESULTS \u2014 COMPLICATIONS OF INDEX ACCIN', 15) add_text_block(s, emu(0.6),emu(1.65), emu(12.1),emu(0.38), '22 patients (19.8%) experienced 25 complications directly related to nail insertion:', size=14, bold=True, color=C_NAVY) comp_rows=[ ('Complication','n (%)','Management'), ('Symptomatic hardware','10 (40%)','Removal'), ('Superficial infection','6 (24%)','IV antibiotics \u00b1 local wound care'), ('Nerve compression','5 (20%)','Decompression'), ('Joint contracture','2 (8%)','Soft-tissue release'), ('Hematoma','1 (4%)','I&D with drain'), ('Broken hardware','1 (4%)','Revision fusion nail'), ] comp_cx=[emu(0.5),emu(5.75),emu(8.6)] comp_cw=[emu(5.25),emu(2.85),emu(4.3)] y0=emu(2.15); rh=emu(0.6) for ri,row in enumerate(comp_rows): fill = C_NAVY if ri==0 else (C_LTBLUE if ri%2==0 else C_WHITE) tc = C_WHITE if ri==0 else C_DARK for cell,cx,cw in zip(row,comp_cx,comp_cw): add_rect_shape(s, cx,y0, cw-emu(0.03),rh-emu(0.03), fill=fill) add_text_block(s, cx+emu(0.05),y0+emu(0.08), cw-emu(0.1),rh-emu(0.16), cell, size=12, bold=(ri==0), color=tc) y0+=rh add_footer_cite(s) # ── SLIDE 16: Results — Rod Removal ────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'RESULTS \u2014 ROD REMOVAL', 16) add_text_block(s, emu(0.6),emu(1.65), emu(12.1),emu(0.38), '50 patients (45%) underwent removal of 66 rods. Debonding at removal in only 4/66 cases (6%).', size=14, bold=True, color=C_NAVY) rod_rows=[ ('Reason for Removal','n (%)'), ('Recurrent infection','29 (43.9%)'), ('2nd stage TKA revision','16 (24.2%)'), ('Symptomatic hardware','10 (15.2%)'), ('Amputation','7 (10.6%)'), ('Nonunion','2 (3.0%)'), ('Planned by surgeon','1 (1.5%)'), ('Broken hardware','1 (1.5%)'), ] rod_cx=[emu(2.2),emu(8.0)] rod_cw=[emu(5.8),emu(2.6)] y0=emu(2.15); rh=emu(0.58) for ri,row in enumerate(rod_rows): fill = C_NAVY if ri==0 else (C_LTBLUE if ri%2==0 else C_WHITE) tc = C_WHITE if ri==0 else C_DARK for cell,cx,cw in zip(row,rod_cx,rod_cw): add_rect_shape(s, cx,y0, cw-emu(0.03),rh-emu(0.03), fill=fill) add_text_block(s, cx+emu(0.05),y0+emu(0.08), cw-emu(0.1),rh-emu(0.16), cell, size=12, bold=(ri==0), color=tc) y0+=rh add_text_block(s, emu(0.6),emu(6.7), emu(12.1),emu(0.55), 'Low debonding rate (6%) reflects secure cement-to-nail bonding; most removals were clinically indicated (infection recurrence, staged TKA revision).', size=12, italic=True, color=C_STEEL) add_footer_cite(s) # ── SLIDE 17: Results — Amputation & Limb Salvage ──────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'RESULTS \u2014 AMPUTATION & LIMB SALVAGE', 17) # stat boxes add_rect_shape(s, emu(0.5),emu(1.65), emu(4.0),emu(2.4), fill=C_MAROON) add_text_block(s, emu(0.6),emu(1.75), emu(3.8),emu(1.1), '7 / 111', size=40, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER) add_text_block(s, emu(0.6),emu(2.95), emu(3.8),emu(0.9), 'patients\nunderwent amputation (6.3%)', size=13, color=C_WHITE, align=PP_ALIGN.CENTER) add_rect_shape(s, emu(4.65),emu(1.65), emu(8.2),emu(2.4), fill=C_NAVY) add_text_block(s, emu(4.75),emu(1.75), emu(8.0),emu(1.1), '93.7%', size=44, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER) add_text_block(s, emu(4.75),emu(2.95), emu(8.0),emu(0.9), 'Overall Limb Salvage Rate (104 / 111)', size=14, color=C_WHITE, align=PP_ALIGN.CENTER) add_text_block(s, emu(0.6),emu(4.2), emu(12.1),emu(0.38), 'Amputation Details:', size=14, bold=True, color=C_STEEL) add_bullet_block(s, emu(0.6),emu(4.6), emu(12.1),emu(2.5), [ '5 above-knee, 2 below-knee; mean age 53.7 yrs (range 44\u201361)', 'Mean 1.1 additional procedures before amputation (range 0\u20133)', 'Mean time from index ACCIN to amputation: 30.5 months (range 15\u201350)', 'Indications: persistent infection (n=5), nonunion (n=2)', 'Cultures: 4 negative, 3 positive for S. aureus', ], size=13) add_footer_cite(s) # ── SLIDE 18: Discussion ────────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'DISCUSSION', 18) add_bullet_block(s, emu(0.6),emu(1.65), emu(12.1),emu(5.55), [ '87.4% success is comparable to or exceeds external fixation historical rates (70\u201385%), supporting ACCIN as a viable single-stage alternative.', 'Single-procedure success in 69.1% challenges the traditional multi-stage paradigm \u2014 reducing operative burden, anesthetic risk, and healthcare cost.', 'Vancomycin + tobramycin cement addresses both gram-positive (MRSA) and gram-negative pathogens; 90% susceptibility at reoperation confirms antibiotic efficacy.', 'Equivalent outcomes in segmental defect group (85.7%) vs. no defect (88.2%) \u2014 ACCIN may bridge bone gaps while simultaneously treating infection.', 'High culture-negativity (42.3%): recognized challenge in chronic osteomyelitis; broad-spectrum empiric coverage under infectious disease co-management is essential.', 'Limb salvage of 93.7% is favorable vs. contemporary series for limb-threatening infections.', 'Standardized cement protocol (1 g vancomycin + 3.6 g tobramycin / 40 g Palacos) ensures reproducibility \u2014 critical for future comparative studies.', ], size=13) add_footer_cite(s) # ── SLIDE 19: Strengths & Limitations ──────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'STRENGTHS & LIMITATIONS', 19) # green left panel add_rect_shape(s, emu(0.4),emu(1.65), emu(6.05),emu(5.65), fill=C_LTGREEN) add_text_block(s, emu(0.5),emu(1.75), emu(5.85),emu(0.45), '\u2714 STRENGTHS', size=15, bold=True, color=C_GREEN) add_bullet_block(s, emu(0.4),emu(2.2), emu(5.9),emu(4.9), [ 'Largest single-surgeon ACCIN series reported to date (n=111)', 'Clinically representative indication mix (TKA, FRI, nonunion, arthrodesis)', 'Fully standardized surgical technique and cement protocol \u2014 reduces confounding', 'Long mean follow-up (29.2 months; range 6\u201393 months)', 'Rigorous triangulated success definition (clinical + radiographic + serological)', 'Consecutive sampling reduces selection bias', ], size=12) # red right panel add_rect_shape(s, emu(7.0),emu(1.65), emu(5.9),emu(5.65), fill=C_LTRED) add_text_block(s, emu(7.1),emu(1.75), emu(5.7),emu(0.45), '\u2718 LIMITATIONS', size=15, bold=True, color=C_DKRED) add_bullet_block(s, emu(7.0),emu(2.2), emu(5.9),emu(4.9), [ 'Retrospective, single-surgeon, single-centre \u2014 no concurrent comparator group', 'No a priori power calculation; multiple subgroup comparisons without correction', 'Heterogeneous population (4 indications) limits pooled generalizability', 'No patient-reported outcomes (functional scores, quality of life)', 'Referral centre bias \u2014 may overestimate real-world success rates', 'Antibiotic resistance patterns not systematically reported', ], size=12) add_footer_cite(s) # ── SLIDE 20: Conclusions ───────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_BG) add_header(s,'CONCLUSIONS', 20) conc_items=[ (C_MAROON,'87.4% treatment success','Confirms ACCIN as effective single-stage strategy for FRI, infected nonunion, and infected arthrodesis'), (C_NAVY,'93.7% limb salvage','Demonstrates ACCIN\u2019s potential to avoid amputation even in severe, complex infections with bone loss'), (C_STEEL,'Single procedure in 69.1%','Challenges multi-stage dogma \u2014 reduces surgical burden, anaesthetic risk, and healthcare cost'), ('2E7D32','Validated antibiotic choice','Vancomycin + tobramycin maintained efficacy in 90% of culture-positive reoperations'), ] y0=emu(1.65) for col,headline,detail in conc_items: add_rect_shape(s, emu(0.5),y0, emu(3.6),emu(1.08), fill=col) add_text_block(s, emu(0.6),y0+emu(0.2), emu(3.4),emu(0.7), headline, size=14, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER) add_rect_shape(s, emu(4.2),y0, emu(8.75),emu(1.08), fill=C_WHITE) add_text_block(s, emu(4.35),y0+emu(0.2), emu(8.5),emu(0.7), detail, size=13, color=C_DARK) y0+=emu(1.18) add_text_block(s, emu(0.6),emu(6.55), emu(12.1),emu(0.55), 'Future directions: Prospective RCTs vs. external fixation; standardized antibiogram reporting; patient-reported outcomes; cost-effectiveness analyses.', size=11, bold=False, color=C_STEEL) add_footer_cite(s) # ── SLIDE 21: Thank You ─────────────────────────────────────────────────────── s = new_slide(prs); new_slide_objects.append(s) add_rect_shape(s,0,0,W,H, fill=C_NAVY) add_rect_shape(s, 0,emu(3.5), W,emu(0.07), fill=C_MAROON) add_text_block(s, 0,emu(2.85), W,emu(0.95), 'THANK YOU', size=52, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER) add_text_block(s, 0,emu(3.8), W,emu(0.7), 'Questions & Discussion', size=24, color=C_STEEL, align=PP_ALIGN.CENTER) add_text_block(s, 0,emu(4.75), W,emu(0.45), 'Conway JD, Elhessy AH, Galiboglu S, Patel N, Gesheff MG', size=14, color=C_LGRAY, align=PP_ALIGN.CENTER) add_text_block(s, 0,emu(5.25), W,emu(0.38), 'Injury 2021 \u2022 PMC8023901 \u2022 IORT_91_1818175', size=12, italic=True, color=C_MGRAY, align=PP_ALIGN.CENTER) # ── Delete original 26 slides (they are now slides 0..25; new ones are 26..46) ── from pptx.oxml.ns import qn as Q prs_xml = prs.presentation sldIdLst = prs_xml.find(Q('p:sldIdLst')) # remove first 26 slide references rId_to_remove = [] sldId_els = list(sldIdLst) for el in sldId_els[:26]: rId_to_remove.append(el.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id')) sldIdLst.remove(el) # also remove the actual slide parts from the package from pptx.opc.constants import RELATIONSHIP_TYPE as RT for sl in prs.slides._sldIdLst: pass # just enumerate prs.save(OUT) print(f"Saved: {OUT}") # verify prs2 = Presentation(OUT) print(f"Slides in output: {len(prs2.slides)}") for i,sl in enumerate(prs2.slides,1): texts = [sh.text_frame.text[:50] for sh in sl.shapes if sh.has_text_frame and sh.text_frame.text.strip()] print(f" Slide {i}: {texts[0] if texts else '(empty)'}") PYEOF python3 /tmp/workspace/journal-club-accin/rebuild.py 2>&1
This is the paper I want the ppt on