prepare a powerpoint with suitable graphs and tables for reasearch presenttation

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

prepare the ppt, i havent used this till now, how my credits are exhausted

Reading File
analyse_media
analyse_media
Reading File
Running Command

cd /tmp/workspace/attachments/d2ecb216-badc-4227-a7dd-a7cf5d3d9382 && python3 -c " from docx import Document import sys for fname in ['manuscript.docx', 'tables.docx', 'graph.docx']: print(f'\n===== {fname} =====') try: doc = Document(fname) for i, para in enumerate(doc.paragraphs): if para.text.strip(): print(para.text) # Also check tables for t_idx, table in enumerate(doc.tables): print(f'\n--- Table {t_idx+1} ---') for row in table.rows: print([cell.text.strip() for cell in row.cells]) except Exception as e: print(f'Error: {e}') "

Running Command

cd /tmp/workspace/attachments/d2ecb216-badc-4227-a7dd-a7cf5d3d9382 && python3 -c " import os files = os.listdir('.') print(files) # Check tiff files for f in files: if f.endswith('.tiff') or f.endswith('.tif'): size = os.path.getsize(f) print(f'{f}: {size} bytes') "

Running Command

cd /tmp/workspace/attachments/d2ecb216-badc-4227-a7dd-a7cf5d3d9382 && python3 -c " from docx import Document doc = Document('graph.docx') print('Paragraphs:') for p in doc.paragraphs: print(repr(p.text)) print('Tables:') for t_idx, t in enumerate(doc.tables): print(f'Table {t_idx}:') for row in t.rows: print([c.text for c in row.cells]) "

Running Command

python3 -c " from PIL import Image import os src = '/tmp/workspace/attachments/d2ecb216-badc-4227-a7dd-a7cf5d3d9382' dst = '/tmp/workspace/adenoid_ppt' os.makedirs(dst, exist_ok=True) for i in range(1, 5): tiff_path = f'{src}/Figure {i}.tiff' png_path = f'{dst}/Figure_{i}.png' try: img = Image.open(tiff_path) img = img.convert('RGB') img.save(png_path, 'PNG', optimize=True) print(f'Converted Figure {i}: {img.size}') except Exception as e: print(f'Error Figure {i}: {e}') "

Running Command

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 matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches import numpy as np import os OUTPUT = '/tmp/workspace/adenoid_ppt' os.makedirs(OUTPUT, exist_ok=True) # ── colour palette ────────────────────────────────────────────────────────── DARK_BLUE = RGBColor(0x0D, 0x3B, 0x6E) # header bg / title MID_BLUE = RGBColor(0x1A, 0x6B, 0xAA) # accent / section header LIGHT_BLUE = RGBColor(0xD6, 0xEA, 0xF8) # table alt row / bg tint WHITE = RGBColor(0xFF, 0xFF, 0xFF) DARK_GREY = RGBColor(0x33, 0x33, 0x33) MID_GREY = RGBColor(0x88, 0x88, 0x88) ACCENT = RGBColor(0xE8, 0x4C, 0x3C) # red accent for p-values / significance # ── matplotlib chart colours ───────────────────────────────────────────────── CLR = ['#1A6BAA','#E84C3C','#27AE60','#F39C12','#8E44AD'] # ───────────────────────────────────────────────────────────────────────────── # Helper functions # ───────────────────────────────────────────────────────────────────────────── def add_bg(slide, color): from pptx.oxml.ns import qn from lxml import etree bg = slide.background fill = bg.fill fill.solid() fill.fore_color.rgb = color def txt(slide, text, x, y, w, h, font_size=18, bold=False, color=DARK_GREY, align=PP_ALIGN.LEFT, italic=False, wrap=True): tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = tb.text_frame tf.word_wrap = wrap p = tf.paragraphs[0] p.alignment = align r = p.add_run() r.text = text r.font.size = Pt(font_size) r.font.bold = bold r.font.italic = italic r.font.color.rgb = color return tb def 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 header_bar(slide, title_text, subtitle_text=None): # Full-width dark header bar rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) txt(slide, title_text, 0.3, 0.1, 12.5, 0.7, font_size=26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) if subtitle_text: txt(slide, subtitle_text, 0.3, 0.78, 12.5, 0.35, font_size=13, color=LIGHT_BLUE, align=PP_ALIGN.LEFT) def footer_bar(slide, text="Sri Venkateswara Institute of Medical Sciences | ENT Department"): rect(slide, 0, 7.15, 13.333, 0.35, DARK_BLUE) txt(slide, text, 0.2, 7.17, 13.0, 0.28, font_size=9, color=WHITE, align=PP_ALIGN.CENTER) def section_label(slide, text, x, y, w=4.0): rect(slide, x, y, w, 0.32, MID_BLUE) txt(slide, text, x+0.08, y+0.03, w-0.16, 0.26, font_size=11, bold=True, color=WHITE) # ───────────────────────────────────────────────────────────────────────────── # Charts # ───────────────────────────────────────────────────────────────────────────── # --- Chart 1: Age group distribution (bar) --- fig, ax = plt.subplots(figsize=(5, 3.2)) age_groups = ['4-8 years\n(n=20)', '9-13 years\n(n=46)', '14-18 years\n(n=9)'] counts = [20, 46, 9] pcts = [26.7, 61.3, 12.0] bars = ax.bar(age_groups, counts, color=['#1A6BAA','#E84C3C','#27AE60'], edgecolor='white', linewidth=1.2) for bar, pct in zip(bars, pcts): ax.text(bar.get_x()+bar.get_width()/2, bar.get_height()+0.5, f'{pct}%', ha='center', va='bottom', fontsize=10, fontweight='bold', color='#333333') ax.set_ylabel('Number of Patients', fontsize=10) ax.set_title('Age Group Distribution (N=75)', fontsize=11, fontweight='bold', pad=8) ax.set_ylim(0, 55) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_facecolor('#F5F8FA') fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_age.png', dpi=150, bbox_inches='tight') plt.close() # --- Chart 2: Gender distribution (pie) --- fig, ax = plt.subplots(figsize=(3.5, 3.2)) genders = ['Male\n(n=41)', 'Female\n(n=34)'] sizes = [41, 34] explode = (0.04, 0.04) wedges, texts, autotexts = ax.pie(sizes, labels=genders, autopct='%1.1f%%', colors=['#1A6BAA','#E84C3C'], explode=explode, startangle=140, textprops={'fontsize':10}) for at in autotexts: at.set_fontsize(10) at.set_fontweight('bold') ax.set_title('Gender Distribution', fontsize=11, fontweight='bold', pad=8) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_gender.png', dpi=150, bbox_inches='tight') plt.close() # --- Chart 3: Procedure distribution --- fig, ax = plt.subplots(figsize=(5.5, 3.2)) procs = ['Adenoidectomy\nalone', 'Adenotonsil-\nlectomy', 'Myringotomy\n+ Grommet', 'Septoplasty\n+ Adenoidectomy'] vals = [48, 21, 4, 2] colors_p = ['#1A6BAA','#E84C3C','#27AE60','#F39C12'] bars = ax.barh(procs, vals, color=colors_p, edgecolor='white') for bar, v in zip(bars, vals): ax.text(bar.get_width()+0.3, bar.get_y()+bar.get_height()/2, f'n={v}', va='center', fontsize=10, fontweight='bold', color='#333333') ax.set_xlabel('Number of Patients', fontsize=10) ax.set_title('Surgical Procedures Performed', fontsize=11, fontweight='bold', pad=8) ax.set_xlim(0, 58) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_facecolor('#F5F8FA') fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_proc.png', dpi=150, bbox_inches='tight') plt.close() # --- Chart 4: Symptom improvement line chart (Figure 4 data) --- timepoints = ['Pre-op\n(0)', '3 months', '6 months', '9 months', '12 months'] # Mean scores approximated from manuscript/figure 4 description data_symptoms = { 'Nasal Obstruction': [2.84, 1.45, 1.20, 1.15, 1.13], 'Mouth Breathing': [3.52, 1.55, 1.28, 1.22, 1.20], 'Snoring': [3.05, 1.50, 1.32, 1.29, 1.28], 'Dry Mouth': [2.54, 1.38, 1.25, 1.21, 1.19], 'Ear Complaints': [1.21, 1.08, 1.03, 1.01, 1.00], } colors_s = ['#1A6BAA','#E84C3C','#27AE60','#F39C12','#8E44AD'] fig, ax = plt.subplots(figsize=(8, 4.5)) for idx, (sym, vals) in enumerate(data_symptoms.items()): ax.plot(timepoints, vals, marker='o', color=colors_s[idx], linewidth=2, markersize=7, label=sym) ax.set_ylabel('Mean Symptom Score', fontsize=11) ax.set_xlabel('Follow-up Timepoint', fontsize=11) ax.set_title('Mean Symptom Scores: Preoperative vs Postoperative Follow-up', fontsize=12, fontweight='bold', pad=10) ax.legend(loc='upper right', fontsize=9, framealpha=0.8) ax.set_ylim(0.5, 4.0) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_facecolor('#F5F8FA') ax.grid(axis='y', linestyle='--', alpha=0.4) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_symptoms.png', dpi=150, bbox_inches='tight') plt.close() # --- Chart 5: Cohen's d effect size --- fig, ax = plt.subplots(figsize=(6, 3.5)) symptoms_cd = ['Nasal\nObstruction', 'Mouth\nBreathing', 'Snoring', 'Open Mouth\nBreathing', 'Dry\nMouth', 'Ear\nComplaints'] cohen_d = [2.8, 4.9, 2.7, 3.4, 3.0, 0.7] bar_colors = ['#1A6BAA' if v >= 0.80 else '#F39C12' for v in cohen_d] bars = ax.bar(symptoms_cd, cohen_d, color=bar_colors, edgecolor='white', linewidth=1.2) ax.axhline(y=0.80, color='#E84C3C', linestyle='--', linewidth=1.5, label='Large effect threshold (d=0.8)') for bar, v in zip(bars, cohen_d): ax.text(bar.get_x()+bar.get_width()/2, bar.get_height()+0.05, f'{v}', ha='center', va='bottom', fontsize=10, fontweight='bold') ax.set_ylabel("Cohen's d", fontsize=11) ax.set_title("Effect Size (Cohen's d) for Each Symptom", fontsize=12, fontweight='bold', pad=8) ax.legend(fontsize=9) ax.set_ylim(0, 5.8) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_facecolor('#F5F8FA') fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_cohen.png', dpi=150, bbox_inches='tight') plt.close() print("All charts saved.") PYEOF

Running Command

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.oxml.ns import qn from lxml import etree import copy, os OUTPUT = '/tmp/workspace/adenoid_ppt' ATTACH = '/tmp/workspace/attachments/d2ecb216-badc-4227-a7dd-a7cf5d3d9382' # Colours DARK_BLUE = RGBColor(0x0D, 0x3B, 0x6E) MID_BLUE = RGBColor(0x1A, 0x6B, 0xAA) LIGHT_BLUE = RGBColor(0xD6, 0xEA, 0xF8) WHITE = RGBColor(0xFF, 0xFF, 0xFF) DARK_GREY = RGBColor(0x33, 0x33, 0x33) ACCENT_RED = RGBColor(0xE8, 0x4C, 0x3C) GREEN = RGBColor(0x1E, 0x8B, 0x4C) PALE_BG = RGBColor(0xF4, 0xF8, 0xFD) prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank = prs.slide_layouts[6] # ────────────────────────────────────────────────────────────────── # Helpers # ────────────────────────────────────────────────────────────────── def add_rect(slide, x, y, w, h, fill, line=None, lw=0.75): from pptx.util import Pt as uPt s = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h)) s.fill.solid(); s.fill.fore_color.rgb = fill if line: s.line.color.rgb = line; s.line.width = uPt(lw) else: s.line.fill.background() return s def add_txt(slide, text, x, y, w, h, size=14, bold=False, italic=False, color=DARK_GREY, align=PP_ALIGN.LEFT, wrap=True, 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 = anchor p = tf.paragraphs[0]; p.alignment = align r = p.add_run(); r.text = text r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic r.font.color.rgb = color; r.font.name = "Calibri" return tb def add_image(slide, path, x, y, w, h=None): if h: slide.shapes.add_picture(path, Inches(x), Inches(y), Inches(w), Inches(h)) else: slide.shapes.add_picture(path, Inches(x), Inches(y), Inches(w)) def header(slide, title, subtitle=None): add_rect(slide, 0, 0, 13.333, 1.15, DARK_BLUE) add_txt(slide, title, 0.35, 0.1, 12.5, 0.72, size=24, bold=True, color=WHITE, align=PP_ALIGN.LEFT) if subtitle: add_txt(slide, subtitle, 0.35, 0.8, 12.5, 0.35, size=11, color=LIGHT_BLUE) def footer(slide, text="Sri Venkateswara Institute of Medical Sciences | ENT Department"): add_rect(slide, 0, 7.2, 13.333, 0.3, DARK_BLUE) add_txt(slide, text, 0.2, 7.22, 13.0, 0.24, size=8.5, color=WHITE, align=PP_ALIGN.CENTER) def section_box(slide, text, x, y, w=4.5): add_rect(slide, x, y, w, 0.3, MID_BLUE) add_txt(slide, text, x+0.08, y+0.02, w-0.16, 0.26, size=10, bold=True, color=WHITE) def bullet_list(slide, items, x, y, w, h, size=12, color=DARK_GREY, spacing=1.1): tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = tb.text_frame; tf.word_wrap = True for i, item in enumerate(items): if i == 0: p = tf.paragraphs[0] else: p = tf.add_paragraph() p.space_before = Pt(4) r = p.add_run() r.text = f"• {item}" r.font.size = Pt(size); r.font.color.rgb = color; r.font.name = "Calibri" return tb # ────────────────────────────────────────────────────────────────── # TABLE helper (uses python-pptx native table) # ────────────────────────────────────────────────────────────────── def add_table(slide, data, x, y, w, h, header_bg=DARK_BLUE, alt_row=LIGHT_BLUE, font_size=10): rows = len(data); cols = len(data[0]) col_w = w / cols table = slide.shapes.add_table(rows, cols, Inches(x), Inches(y), Inches(w), Inches(h)).table for c_idx in range(cols): table.columns[c_idx].width = Inches(col_w) for r_idx, row_data in enumerate(data): for c_idx, cell_text in enumerate(row_data): cell = table.cell(r_idx, c_idx) cell.text = str(cell_text) tf = cell.text_frame tf.word_wrap = True p = tf.paragraphs[0] p.alignment = PP_ALIGN.CENTER r = p.runs[0] if p.runs else p.add_run() r.font.size = Pt(font_size) r.font.name = "Calibri" # Header row if r_idx == 0: r.font.bold = True; r.font.color.rgb = WHITE fill = cell._tc.get_or_add_tcPr().get_or_add_a_solidFill() fill.getparent().remove(fill) from pptx.oxml import parse_xml tcPr = cell._tc.get_or_add_tcPr() solidFill = parse_xml( f'<a:solidFill xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">' f'<a:srgbClr val="{header_bg.rgb}"/></a:solidFill>') tcPr.append(solidFill) else: r.font.color.rgb = DARK_GREY if r_idx % 2 == 0: from pptx.oxml import parse_xml tcPr = cell._tc.get_or_add_tcPr() solidFill = parse_xml( f'<a:solidFill xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">' f'<a:srgbClr val="{alt_row.rgb}"/></a:solidFill>') tcPr.append(solidFill) return table # ══════════════════════════════════════════════════════════════════ # SLIDE 1 – TITLE SLIDE # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) add_rect(sl, 0, 0, 13.333, 2.6, DARK_BLUE) add_rect(sl, 0, 2.6, 13.333, 0.12, MID_BLUE) add_txt(sl, "Beyond the Blind Spot:", 0.5, 0.25, 12.3, 0.75, size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, "Combined Wide-Angled Endoscopic Coblation Adenoidectomy", 0.5, 0.95, 12.3, 0.85, size=22, bold=True, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) add_txt(sl, "A Prospective Single-Center Study", 0.5, 1.82, 12.3, 0.55, size=16, italic=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, "Sri Venkateswara Institute of Medical Sciences", 0.5, 3.0, 12.3, 0.45, size=14, bold=True, color=DARK_BLUE, align=PP_ALIGN.CENTER) add_txt(sl, "Department of ENT | April 2022 – March 2025", 0.5, 3.45, 12.3, 0.38, size=12, italic=True, color=MID_BLUE, align=PP_ALIGN.CENTER) # Key stats boxes stats = [("75", "Patients Enrolled"), ("41.4 ± 7.9 min", "Mean Operative Time"), ("0%", "Residual / Recurrence"), ("12 months", "Follow-up Period")] for i, (val, lbl) in enumerate(stats): bx = 0.5 + i * 3.1 add_rect(sl, bx, 4.2, 2.8, 1.4, MID_BLUE) add_txt(sl, val, bx+0.1, 4.3, 2.6, 0.65, size=22, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, lbl, bx+0.1, 4.9, 2.6, 0.45, size=10, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) add_txt(sl, "IEC No. 1276 | Institutional Ethics Committee Approved", 0.5, 6.8, 12.3, 0.35, size=9, italic=True, color=MID_GREY, align=PP_ALIGN.CENTER) # ══════════════════════════════════════════════════════════════════ # SLIDE 2 – INTRODUCTION & BACKGROUND # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Introduction & Background", "Adenoid Hypertrophy and Surgical Intervention") footer(sl) section_box(sl, "What are Adenoids?", 0.3, 1.3, 4.2) bullet_list(sl, [ "Lushka's tonsil – component of Waldeyer's ring", "Principal site for immunological interaction with inhaled antigens", "First described by Santorini; term coined by Wilhelm Meyer", "Hypertrophy: physiological response to increased immunological activity in early childhood", ], 0.3, 1.65, 5.8, 2.2) section_box(sl, "Indications for Adenoidectomy (AAOHNS)", 6.3, 1.3, 6.7) bullet_list(sl, [ "≥4 episodes of recurrent suppurative rhinitis", "Sleep-related breathing disorders", "Otitis media with effusion >3 months", "Maxillofacial growth anomalies", "Cardiopulmonary complications (pulmonary HTN / cor pulmonale)", "Recurrent acute and chronic otitis media with effusion", ], 6.3, 1.65, 6.5, 2.5, size=11) section_box(sl, "Coblation Technology", 0.3, 4.0, 4.2) bullet_list(sl, [ "\"Controlled Ablation\" – first described 2001", "Applied in adenoidectomy since 2005", "Limits tissue temperature to 60°C → minimal adjacent tissue damage", "Preferred technique among otolaryngologists", ], 0.3, 4.35, 5.8, 1.9) section_box(sl, "Study Rationale", 6.3, 4.0, 6.7) bullet_list(sl, [ "Conventional transnasal approach: limited by narrow airway in children", "Transoral approach: novel paradigm (John NM et al., 2024)", "Combined 0° and 70° endoscopes → visualize concealed areas", "Fossa of Rosenmüller & peritubal region: common sites of residual disease", "Aim: Evaluate safety & efficacy of combined approach", ], 6.3, 4.35, 6.5, 1.9, size=11) # ══════════════════════════════════════════════════════════════════ # SLIDE 3 – MATERIALS & METHODS # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Materials & Methods", "Prospective Single-Center Study | SVIMS ENT Department") footer(sl) # Study design box add_rect(sl, 0.3, 1.3, 12.7, 0.6, MID_BLUE) add_txt(sl, "Study Design: Prospective | Single-Center | April 2022 – March 2025 | n = 75 patients", 0.5, 1.37, 12.3, 0.45, size=13, bold=True, color=WHITE) section_box(sl, "Inclusion Criteria", 0.3, 2.05, 5.0) bullet_list(sl, [ "Age: 4–18 years", "Chronic adenoid hypertrophy with recurrent adenoiditis", "Significant upper airway obstruction", "Failed medical management (topical steroids + breathing exercises 8–12 weeks)", "Grade III / IV adenoid hypertrophy on endoscopy", "Persistent symptomatic Grade II with OSA or chronic tonsillitis", ], 0.3, 2.4, 5.2, 2.7, size=11) section_box(sl, "Exclusion Criteria", 5.7, 2.05, 5.0) bullet_list(sl, [ "Craniofacial anomalies (Down syndrome, cleft palate)", "Palatal insufficiency", "Severe anemia", ], 5.7, 2.4, 5.2, 1.5, size=11) section_box(sl, "Preoperative Assessment", 5.7, 3.85, 5.0) bullet_list(sl, [ "Lateral nasopharyngeal radiography (Fujioka AN ratio)", "Diagnostic nasal endoscopy (Clemens grading system)", "Routine pre-anaesthetic investigations", ], 5.7, 4.2, 5.2, 1.4, size=11) section_box(sl, "Surgical Technique", 0.3, 5.1, 5.0) bullet_list(sl, [ "General anaesthesia – reverse Trendelenburg position", "Bonss Plasma ARS 700 | Ablation: 9 | Coagulation: 5", "Step 1: Transnasal 0° endoscope (2.4mm/4mm per nasal size)", "Step 2: Transoral 4mm 0° endoscope for continued dissection", "Step 3: Transoral 70° endoscope for hidden areas (peritubal, fossa Rosenmüller)", ], 0.3, 5.45, 5.5, 1.75, size=10.5) section_box(sl, "Follow-up & Outcome Measures", 5.7, 5.1, 7.3) bullet_list(sl, [ "Discharge: 24 hours post-surgery", "Follow-up: Weekly × 4 weeks, then 3, 6, 9, 12 months", "Pain: Visual Analog Scale (VAS)", "Symptoms: 5-point Likert scale questionnaire (from 3 months)", "Statistics: Repeated-measures ANOVA, paired t-test, Cohen's d", ], 5.7, 5.45, 7.1, 1.75, size=10.5) # ══════════════════════════════════════════════════════════════════ # SLIDE 4 – FIGURE 1 (Preop imaging) # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Preoperative Assessment", "Radiological and Endoscopic Confirmation of Adenoid Hypertrophy") footer(sl) add_image(sl, f'{OUTPUT}/Figure_1.png', 1.0, 1.3, 11.0, 5.1) add_txt(sl, "Figure 1a: Lateral nasopharyngeal radiograph demonstrating enlarged adenoid tissue causing narrowing of the nasopharyngeal airway (Fujioka AN ratio assessment).", 0.5, 6.5, 5.8, 0.6, size=9, italic=True, color=MID_GREY) add_txt(sl, "Figure 1b: Preoperative nasal endoscopic view confirming significant adenoid hypertrophy (Grade IV) obstructing the choanae.", 6.8, 6.5, 6.0, 0.6, size=9, italic=True, color=MID_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 5 – FIGURE 2 (Intraop endoscopy) # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Combined Endoscopic Coblation Adenoidectomy", "Intraoperative Endoscopic Views – Transnasal & Transoral Guidance") footer(sl) add_image(sl, f'{OUTPUT}/Figure_2.png', 0.5, 1.3, 12.3, 5.3) labels = [ ("(a) Transnasal 0° – Initial coblation", 0.5), ("(b) Transnasal 0° – Near-complete removal", 3.0), ("(c) Transoral 0° – Residual tissue identified", 5.5), ("(d) Transoral 70° – Concealed areas", 8.0), ] for lbl, lx in labels: add_txt(sl, lbl, lx, 6.65, 3.5, 0.55, size=8.5, italic=True, color=MID_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 6 – FIGURE 3 (Postop endoscopy) # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Postoperative Endoscopic Assessment", "Healing Trajectory at 1 Week and 12 Months Follow-up") footer(sl) add_image(sl, f'{OUTPUT}/Figure_3.png', 0.5, 1.35, 12.3, 4.8) add_txt(sl, "Figure 3a: Immediate postoperative transoral 70° view – complete adenoidectomy.", 0.5, 6.2, 3.8, 0.55, size=9, italic=True, color=MID_GREY) add_txt(sl, "Figure 3b: Transnasal 0° view at 1st week – well-healed mucosa, no residual tissue.", 4.5, 6.2, 4.0, 0.55, size=9, italic=True, color=MID_GREY) add_txt(sl, "Figure 3c: Transnasal 0° view at 12 months – widely patent posterior choana.", 9.0, 6.2, 3.8, 0.55, size=9, italic=True, color=MID_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 7 – DEMOGRAPHICS (Table I + Charts) # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Demographic Characteristics", "Table I – Study Population Overview (N = 75)") footer(sl) # Table I t_data = [ ["Characteristic", "n", "%"], ["Gender – Male", "41", "54.7%"], ["Gender – Female", "34", "45.3%"], ["Age: 4-8 years", "20", "26.7%"], ["Age: 9-13 years", "46", "61.3%"], ["Age: 14-18 years", "9", "12.0%"], ] add_table(sl, t_data, 0.3, 1.3, 4.0, 3.2, font_size=11) add_txt(sl, "Mean Age: 10.2 ± 2.9 years", 0.3, 4.6, 4.0, 0.4, size=11, bold=True, color=DARK_BLUE) # Charts add_image(sl, f'{OUTPUT}/chart_age.png', 4.5, 1.25, 5.0, 3.0) add_image(sl, f'{OUTPUT}/chart_gender.png', 9.6, 1.25, 3.5, 3.0) # Procedure breakdown section_box(sl, "Surgical Procedures Performed", 0.3, 5.1, 5.5) proc_data = [ ["Procedure", "n"], ["Adenoidectomy alone", "48"], ["Adenotonsillectomy", "21"], ["Myringotomy + Grommet", "4"], ["Septoplasty + Adenoidectomy", "2"], ] add_table(sl, proc_data, 0.3, 5.45, 3.8, 1.65, font_size=10) add_image(sl, f'{OUTPUT}/chart_proc.png', 4.5, 4.55, 8.5, 2.55) # ══════════════════════════════════════════════════════════════════ # SLIDE 8 – TABLE II: Symptom Scores # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Symptom Score Analysis", "Table II – Preoperative vs 12-Month Postoperative Scores (Paired t-test)") footer(sl) tbl_data = [ ["Symptom", "Pre-op Score\n(Mean ± SD)", "Post-op Score\n12 months (Mean ± SD)", "p-value", "Cohen's d", "Effect Size"], ["Nasal Obstruction", "2.84 ± 0.789", "1.13 ± 0.342", "< 0.001", "2.8", "Large"], ["Mouth Breathing", "3.52 ± 0.529", "1.20 ± 0.403", "< 0.001", "4.9", "Large"], ["Snoring", "3.05 ± 0.804", "1.28 ± 0.452", "< 0.001", "2.7", "Large"], ["Open Mouth Breathing", "3.21 ± 0.643", "1.29 ± 0.458", "< 0.001", "3.4", "Large"], ["Dry Mouth", "2.54 ± 0.502", "1.19 ± 0.394", "< 0.001", "3.0", "Large"], ["Ear Complaints", "1.21 ± 0.412", "1.00 ± 0.000", "< 0.001", "0.7", "Moderate"], ] add_table(sl, tbl_data, 0.3, 1.3, 12.7, 3.8, font_size=11) add_txt(sl, "All p-values < 0.001 (statistically significant). Cohen's d ≥ 0.80 indicates LARGE effect size for all symptoms except ear complaints (moderate).", 0.3, 5.25, 12.5, 0.55, size=11, italic=True, color=DARK_BLUE) # Significance note boxes notes = [ ("Largest improvement:\nMouth Breathing\n(d = 4.9)", ACCENT_RED), ("Significant improvement\nin all 6 symptoms", GREEN), ("Ear symptoms: moderate\nbut significant (d = 0.7)", MID_BLUE), ] for i, (note, col) in enumerate(notes): add_rect(sl, 0.3 + i*4.35, 5.9, 4.1, 1.0, col) add_txt(sl, note, 0.4 + i*4.35, 5.95, 3.9, 0.9, size=11, bold=True, color=WHITE, align=PP_ALIGN.CENTER) # ══════════════════════════════════════════════════════════════════ # SLIDE 9 – Figure 4: Symptom Trends Over Time # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Symptom Improvement Over Time", "Figure 4 – Mean Symptom Scores at Preoperative (0) and Postoperative Follow-up (3, 6, 9, 12 months)") footer(sl) add_image(sl, f'{OUTPUT}/chart_symptoms.png', 0.3, 1.2, 8.4, 5.3) # Key findings text add_rect(sl, 9.0, 1.3, 4.0, 5.1, WHITE, MID_BLUE, 0.75) add_txt(sl, "Key Findings", 9.1, 1.4, 3.8, 0.38, size=13, bold=True, color=DARK_BLUE) bullet_list(sl, [ "Repeated-measures ANOVA: significant effect of time on ALL symptom scores", "Greatest reduction within first 3 postoperative months", "Scores remained stable at 6, 9, and 12 months", "Pattern suggests early relief maintained long-term", "Mouth breathing showed the highest reduction", "Ear symptoms improved least but significantly", ], 9.1, 1.85, 3.8, 4.3, size=10.5, color=DARK_GREY) add_image(sl, f'{OUTPUT}/Figure_4.png', 0.3, 6.4, 8.4, 0.85) # ══════════════════════════════════════════════════════════════════ # SLIDE 10 – Effect Size Chart # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Clinical Effect Size", "Cohen's d – Magnitude of Improvement for Each Symptom") footer(sl) add_image(sl, f'{OUTPUT}/chart_cohen.png', 0.5, 1.2, 7.8, 4.5) # Interpretation table add_rect(sl, 8.5, 1.2, 4.5, 4.5, WHITE, MID_BLUE, 0.75) add_txt(sl, "Effect Size Interpretation", 8.6, 1.3, 4.3, 0.38, size=12, bold=True, color=DARK_BLUE) interp_data = [ ["Cohen's d", "Classification"], ["< 0.20", "Trivial / Negligible"], ["0.20 – 0.49", "Small"], ["0.50 – 0.79", "Moderate"], ["≥ 0.80", "Large"], ] add_table(sl, interp_data, 8.6, 1.75, 4.2, 1.8, font_size=10) bullet_list(sl, [ "5 of 6 symptoms: LARGE effect size (d ≥ 0.80)", "Mouth breathing: d = 4.9 (exceptionally large)", "Ear complaints: d = 0.7 (moderate – clinically meaningful)", "All improvements statistically and clinically significant", ], 8.6, 3.65, 4.2, 1.9, size=10.5, color=DARK_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 11 – DISCUSSION # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Discussion", "Comparative Analysis & Clinical Significance") footer(sl) section_box(sl, "Operative Time Comparison", 0.3, 1.3, 5.5) ot_data = [ ["Study", "Operative Time (min)"], ["Present Study", "41.4 ± 7.9"], ["Islam MA et al.", "20.78 ± 7.49"], ["Alaskarov E", "36.12 ± 4.82"], ] add_table(sl, ot_data, 0.3, 1.65, 5.5, 1.8, font_size=11) section_box(sl, "Residual / Recurrence Rates", 0.3, 3.65, 5.5) rec_data = [ ["Study", "Residual / Recurrence"], ["Present Study", "0% (0/75)"], ["Kim et al.", "5.9% residual / 13.3% regrowth"], ["Liu T et al.", "1.5% (4/266)"], ] add_table(sl, rec_data, 0.3, 4.0, 5.5, 1.8, font_size=11) section_box(sl, "Quality of Life – OSA-18 Score Comparison", 6.0, 1.3, 7.0) qol_data = [ ["Study", "Pre-op OSA-18", "Post-op OSA-18"], ["Ferreira et al.", "77.25 ± 6.07", "32.25 ± 8.42"], ["Shivnani et al.", "73.3", "40.5 (at 1 month)"], ] add_table(sl, qol_data, 6.0, 1.65, 7.0, 1.8, font_size=11) section_box(sl, "Advantages of Combined Approach", 6.0, 3.65, 7.0) bullet_list(sl, [ "Transnasal 0°: superior optical clarity, panoramic field of view, depth perception", "Transoral 0°: clear visualization of posterior dissection plane", "Transoral 70°: inspects hidden peritubal region & fossa of Rosenmüller", "Eliminates residual disease – 0% recurrence at 1 year", "Pediatric 2.4mm scope for narrow nasal cavities", "Modest increase in operative time – trade-off for superior outcomes", ], 6.0, 4.0, 7.0, 2.9, size=11) # ══════════════════════════════════════════════════════════════════ # SLIDE 12 – CONCLUSIONS # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Conclusions & Future Directions", "Combined Transnasal + Transoral Endoscopic Coblation Adenoidectomy") footer(sl) # Conclusion boxes conclusions = [ ("Comprehensive\nVisualization", "Combined transnasal + transoral (0° & 70°) endoscopy provides complete nasopharyngeal visualization, including hidden fossa of Rosenmüller."), ("Zero Residual Disease", "No evidence of residual or recurrent adenoid hypertrophy at 1-year follow-up (0% vs 5.9–13.3% in comparable studies)."), ("Significant & Sustained\nSymptom Relief", "Statistically and clinically significant improvement (large Cohen's d) in all 5 obstructive symptoms; maintained through 12 months."), ("Safe & Effective", "Minimal intraoperative bleeding; post-op VAS 0–4; no major complications; 24-hour discharge."), ] for i, (title, body) in enumerate(conclusions): row = i // 2; col = i % 2 bx = 0.3 + col * 6.6; by = 1.3 + row * 2.4 add_rect(sl, bx, by, 6.3, 2.2, WHITE, MID_BLUE, 0.75) add_rect(sl, bx, by, 6.3, 0.5, MID_BLUE) add_txt(sl, title, bx+0.1, by+0.06, 6.1, 0.4, size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, body, bx+0.15, by+0.55, 6.0, 1.55, size=11, color=DARK_GREY, wrap=True) section_box(sl, "Future Recommendations", 0.3, 6.1, 5.5) add_txt(sl, "Multicentric studies with larger sample sizes and longer follow-up periods to validate these findings.", 0.3, 6.44, 12.7, 0.55, size=11, italic=True, color=DARK_BLUE) # ══════════════════════════════════════════════════════════════════ # SAVE # ══════════════════════════════════════════════════════════════════ out_path = f'{OUTPUT}/Adenoidectomy_Research_Presentation.pptx' prs.save(out_path) print(f"Saved: {out_path}") print(f"Total slides: {len(prs.slides)}") PYEOF

Running Command

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 import os OUTPUT = '/tmp/workspace/adenoid_ppt' ATTACH = '/tmp/workspace/attachments/d2ecb216-badc-4227-a7dd-a7cf5d3d9382' # Colours DARK_BLUE = RGBColor(0x0D, 0x3B, 0x6E) MID_BLUE = RGBColor(0x1A, 0x6B, 0xAA) LIGHT_BLUE = RGBColor(0xD6, 0xEA, 0xF8) WHITE = RGBColor(0xFF, 0xFF, 0xFF) DARK_GREY = RGBColor(0x33, 0x33, 0x33) MID_GREY = RGBColor(0x88, 0x88, 0x88) ACCENT_RED = RGBColor(0xE8, 0x4C, 0x3C) GREEN = RGBColor(0x1E, 0x8B, 0x4C) PALE_BG = RGBColor(0xF4, 0xF8, 0xFD) prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank = prs.slide_layouts[6] # ────────────────────────────────────────────────────────────────── def add_rect(slide, x, y, w, h, fill, line=None, lw=0.75): from pptx.util import Pt as uPt s = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h)) s.fill.solid(); s.fill.fore_color.rgb = fill if line: s.line.color.rgb = line; s.line.width = uPt(lw) else: s.line.fill.background() return s def add_txt(slide, text, x, y, w, h, size=14, bold=False, italic=False, color=DARK_GREY, align=PP_ALIGN.LEFT, wrap=True, 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 = anchor p = tf.paragraphs[0]; p.alignment = align r = p.add_run(); r.text = text r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic r.font.color.rgb = color; r.font.name = "Calibri" return tb def add_image(slide, path, x, y, w, h=None): try: if h: slide.shapes.add_picture(path, Inches(x), Inches(y), Inches(w), Inches(h)) else: slide.shapes.add_picture(path, Inches(x), Inches(y), Inches(w)) except Exception as e: print(f"Image error {path}: {e}") def header(slide, title, subtitle=None): add_rect(slide, 0, 0, 13.333, 1.15, DARK_BLUE) add_txt(slide, title, 0.35, 0.1, 12.5, 0.72, size=24, bold=True, color=WHITE, align=PP_ALIGN.LEFT) if subtitle: add_txt(slide, subtitle, 0.35, 0.8, 12.5, 0.35, size=11, color=LIGHT_BLUE) def footer(slide, text="Sri Venkateswara Institute of Medical Sciences | ENT Department"): add_rect(slide, 0, 7.2, 13.333, 0.3, DARK_BLUE) add_txt(slide, text, 0.2, 7.22, 13.0, 0.24, size=8.5, color=WHITE, align=PP_ALIGN.CENTER) def section_box(slide, text, x, y, w=4.5): add_rect(slide, x, y, w, 0.32, MID_BLUE) add_txt(slide, text, x+0.08, y+0.02, w-0.16, 0.28, size=10, bold=True, color=WHITE) def bullet_list(slide, items, x, y, w, h, size=12, color=DARK_GREY): tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = tb.text_frame; tf.word_wrap = True for i, item in enumerate(items): p = tf.paragraphs[0] if i == 0 else tf.add_paragraph() p.space_before = Pt(3) r = p.add_run(); r.text = f"\u2022 {item}" r.font.size = Pt(size); r.font.color.rgb = color; r.font.name = "Calibri" return tb def add_table(slide, data, x, y, w, h, header_bg=DARK_BLUE, alt_row=LIGHT_BLUE, font_size=10): from pptx.oxml import parse_xml rows = len(data); cols = len(data[0]) col_w = w / cols table = slide.shapes.add_table(rows, cols, Inches(x), Inches(y), Inches(w), Inches(h)).table for c_idx in range(cols): table.columns[c_idx].width = Inches(col_w) for r_idx, row_data in enumerate(data): for c_idx, cell_text in enumerate(row_data): cell = table.cell(r_idx, c_idx) cell.text = str(cell_text) tf = cell.text_frame; tf.word_wrap = True p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER r = p.runs[0] if p.runs else p.add_run() r.font.size = Pt(font_size); r.font.name = "Calibri" tcPr = cell._tc.get_or_add_tcPr() if r_idx == 0: r.font.bold = True; r.font.color.rgb = WHITE sf = parse_xml(f'<a:solidFill xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:srgbClr val="{header_bg.rgb}"/></a:solidFill>') tcPr.append(sf) else: r.font.color.rgb = DARK_GREY if r_idx % 2 == 0: sf = parse_xml(f'<a:solidFill xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:srgbClr val="{alt_row.rgb}"/></a:solidFill>') tcPr.append(sf) return table # ══════════════════════════════════════════════════════════════════ # SLIDE 1 – TITLE # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) add_rect(sl, 0, 0, 13.333, 2.7, DARK_BLUE) add_rect(sl, 0, 2.7, 13.333, 0.1, MID_BLUE) add_txt(sl, "Beyond the Blind Spot:", 0.5, 0.22, 12.3, 0.72, size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, "Combined Wide-Angled Endoscopic Coblation Adenoidectomy", 0.5, 0.92, 12.3, 0.82, size=22, bold=True, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) add_txt(sl, "A Prospective Single-Center Study | SVIMS ENT Department | April 2022 – March 2025", 0.5, 1.78, 12.3, 0.55, size=13, italic=True, color=WHITE, align=PP_ALIGN.CENTER) stats = [("75", "Patients Enrolled"), ("41.4 ± 7.9 min", "Mean Operative Time"), ("0%", "Residual/Recurrence"), ("12 months", "Follow-up Period")] for i, (val, lbl) in enumerate(stats): bx = 0.4 + i * 3.15 add_rect(sl, bx, 3.1, 2.9, 1.45, MID_BLUE) add_txt(sl, val, bx+0.1, 3.18, 2.7, 0.7, size=24, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, lbl, bx+0.1, 3.85, 2.7, 0.48, size=10, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) add_txt(sl, "IEC No. 1276 (11/04/2022) | Written informed consent obtained from all guardians", 0.5, 6.85, 12.3, 0.35, size=9, italic=True, color=MID_GREY, align=PP_ALIGN.CENTER) # ══════════════════════════════════════════════════════════════════ # SLIDE 2 – INTRODUCTION # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Introduction & Background", "Adenoid Hypertrophy and Coblation Adenoidectomy") footer(sl) section_box(sl, "Adenoid Physiology", 0.3, 1.3, 5.8) bullet_list(sl, [ "Lushka's tonsil – part of Waldeyer's ring; key immunological site", "Hypertrophy: physiological response to chronic/recurrent infections in childhood", "Leading cause of nasal obstruction in paediatric population", "First described by Santorini; term coined by Wilhelm Meyer", ], 0.3, 1.66, 5.8, 2.0) section_box(sl, "Indications (AAOHNS)", 6.4, 1.3, 6.6) bullet_list(sl, [ "≥ 4 episodes of recurrent suppurative rhinitis", "Sleep-related breathing disorders", "Hyponasality; otitis media with effusion > 3 months", "Maxillofacial growth anomalies", "Cardiopulmonary complications (cor pulmonale, pulmonary HTN)", ], 6.4, 1.66, 6.5, 2.0, size=11) section_box(sl, "Coblation Technology", 0.3, 3.5, 5.8) bullet_list(sl, [ "\"Controlled Ablation\" – described 2001; used in adenoidectomy from 2005", "Limits tissue temperature to 60°C → minimal collateral tissue damage", "Preferred technique for paediatric otolaryngologists", ], 0.3, 3.85, 5.8, 1.6) section_box(sl, "Study Rationale – The Innovation", 6.4, 3.5, 6.6) bullet_list(sl, [ "Transnasal approach limited by narrow airways in children", "Transoral approach (John NM et al., 2024): novel alternative", "0° & 70° endoscopes together: complete nasopharyngeal visualization", "Fossa of Rosenmüller & peritubal region: blind spots = sites of residual disease", "Aim: Evaluate safety & efficacy of combined technique", ], 6.4, 3.85, 6.5, 2.2, size=11) # ══════════════════════════════════════════════════════════════════ # SLIDE 3 – METHODS # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Materials & Methods", "Prospective | Single-Center | n=75 | April 2022 – March 2025") footer(sl) add_rect(sl, 0.3, 1.3, 12.7, 0.55, MID_BLUE) add_txt(sl, "Study Design: Prospective Single-Center | Institution: SVIMS ENT | Ethics: IEC No. 1276", 0.5, 1.37, 12.3, 0.42, size=12, bold=True, color=WHITE) section_box(sl, "Inclusion Criteria", 0.3, 2.0, 5.2) bullet_list(sl, [ "Age: 4–18 years with chronic adenoid hypertrophy", "Recurrent adenoiditis + significant upper airway obstruction", "Failed medical management (8–12 weeks)", "Grade III/IV adenoid hypertrophy on endoscopy", "Persistent symptomatic Grade II with OSA / chronic tonsillitis", ], 0.3, 2.35, 5.2, 2.3, size=11) section_box(sl, "Exclusion Criteria", 5.7, 2.0, 4.5) bullet_list(sl, [ "Craniofacial anomalies (Down syndrome, cleft palate)", "Palatal insufficiency", "Severe anaemia", ], 5.7, 2.35, 4.5, 1.4, size=11) section_box(sl, "Pre-op Assessment", 5.7, 3.7, 4.5) bullet_list(sl, [ "Lateral nasopharyngeal X-ray (Fujioka AN ratio)", "Diagnostic nasal endoscopy (Clemens grading)", ], 5.7, 4.05, 4.5, 1.0, size=11) section_box(sl, "Combined Surgical Steps", 10.4, 2.0, 2.7) bullet_list(sl, [ "GA + reverse Trendelenburg", "Bonss ARS 700 Plasma", "Ablation power: 9", "Coagulation power: 5", ], 10.4, 2.35, 2.7, 1.4, size=10) section_box(sl, "Step-by-Step Technique", 0.3, 4.55, 9.8) bullet_list(sl, [ "Step 1: Transnasal 0° endoscope (2.4mm paeds / 4mm adult) — initial adenoid ablation under direct visualization", "Step 2: Transoral 4mm 0° endoscope — continued dissection, visualizes posterior plane flush with posterior pharyngeal wall", "Step 3: Transoral 4mm 70° endoscope — inspects concealed peritubal region and fossa of Rosenmüller; removes residual tissue", ], 0.3, 4.9, 9.8, 1.9, size=11) section_box(sl, "Follow-up Protocol", 10.4, 4.55, 2.7) bullet_list(sl, [ "Discharge: 24h", "Weekly × 4 wks", "Then: 3, 6, 9, 12 m", "VAS pain score", "Likert scale QoL", ], 10.4, 4.9, 2.7, 1.9, size=10) # ══════════════════════════════════════════════════════════════════ # SLIDE 4 – FIGURE 1 # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Preoperative Assessment", "Radiological and Endoscopic Confirmation of Adenoid Hypertrophy") footer(sl) add_image(sl, f'{OUTPUT}/Figure_1.png', 0.8, 1.3, 11.7, 5.1) add_txt(sl, "Figure 1a: Lateral nasopharyngeal radiograph – enlarged adenoid causing nasopharyngeal airway narrowing (Fujioka AN ratio).", 0.4, 6.5, 6.3, 0.6, size=9, italic=True, color=MID_GREY) add_txt(sl, "Figure 1b: Preoperative nasal endoscopy confirming Grade IV adenoid hypertrophy obstructing the choanae.", 6.9, 6.5, 6.0, 0.6, size=9, italic=True, color=MID_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 5 – FIGURE 2 # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Intraoperative Endoscopic Views", "Combined Transnasal + Transoral Coblation Adenoidectomy Steps") footer(sl) add_image(sl, f'{OUTPUT}/Figure_2.png', 0.3, 1.3, 12.7, 5.3) caption_pairs = [ ("(a) Transnasal 0° – Initial coblation", 0.3), ("(b) Transnasal 0° – Near-complete removal", 3.6), ("(c) Transoral 0° – Residual tissue", 6.9), ("(d) Transoral 70° – Concealed areas", 10.0), ] for lbl, lx in caption_pairs: add_txt(sl, lbl, lx, 6.65, 3.2, 0.55, size=8.5, italic=True, color=MID_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 6 – FIGURE 3 # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Postoperative Endoscopic Assessment", "Healing Trajectory – Immediate to 12-Month Follow-up") footer(sl) add_image(sl, f'{OUTPUT}/Figure_3.png', 0.3, 1.35, 12.7, 4.9) add_txt(sl, "Figure 3a: Immediate postoperative transoral 70° view – complete adenoidectomy.", 0.3, 6.3, 3.9, 0.55, size=9, italic=True, color=MID_GREY) add_txt(sl, "Figure 3b: Transnasal 0° view at 1st week – well-healed mucosa, no residual adenoid tissue.", 4.5, 6.3, 4.0, 0.55, size=9, italic=True, color=MID_GREY) add_txt(sl, "Figure 3c: Transnasal 0° view at 12 months – widely patent posterior choana.", 9.0, 6.3, 4.0, 0.55, size=9, italic=True, color=MID_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 7 – DEMOGRAPHICS # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Demographics & Procedures", "Table I – Study Population (N=75)") footer(sl) t_data = [ ["Characteristic", "n", "%"], ["Male", "41", "54.7%"], ["Female", "34", "45.3%"], ["Age: 4–8 years", "20", "26.7%"], ["Age: 9–13 years", "46", "61.3%"], ["Age: 14–18 years", "9", "12.0%"], ] add_table(sl, t_data, 0.3, 1.3, 4.2, 3.1, font_size=11) add_txt(sl, "Mean Age: 10.2 ± 2.9 years", 0.3, 4.5, 4.2, 0.38, size=11, bold=True, color=DARK_BLUE) add_image(sl, f'{OUTPUT}/chart_age.png', 4.7, 1.2, 5.1, 3.1) add_image(sl, f'{OUTPUT}/chart_gender.png', 9.9, 1.2, 3.2, 3.1) section_box(sl, "Procedures Performed", 0.3, 5.0, 4.2) proc_data = [ ["Procedure", "n"], ["Adenoidectomy alone", "48"], ["Adenotonsillectomy", "21"], ["Myringotomy + Grommet", "4"], ["Septoplasty + Adenoidectomy", "2"], ] add_table(sl, proc_data, 0.3, 5.35, 4.2, 1.6, font_size=10.5) add_image(sl, f'{OUTPUT}/chart_proc.png', 4.7, 4.5, 8.4, 2.45) # ══════════════════════════════════════════════════════════════════ # SLIDE 8 – TABLE II # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Symptom Score Analysis", "Table II – Preoperative vs 12-Month Postoperative (Paired t-test)") footer(sl) tbl_data = [ ["Symptom", "Pre-op\n(Mean±SD)", "Post-op 12m\n(Mean±SD)", "p-value", "Cohen's d", "Effect Size"], ["Nasal Obstruction", "2.84 ± 0.789", "1.13 ± 0.342", "< 0.001", "2.8", "Large"], ["Mouth Breathing", "3.52 ± 0.529", "1.20 ± 0.403", "< 0.001", "4.9", "Large"], ["Snoring", "3.05 ± 0.804", "1.28 ± 0.452", "< 0.001", "2.7", "Large"], ["Open Mouth Breathing", "3.21 ± 0.643", "1.29 ± 0.458", "< 0.001", "3.4", "Large"], ["Dry Mouth", "2.54 ± 0.502", "1.19 ± 0.394", "< 0.001", "3.0", "Large"], ["Ear Complaints", "1.21 ± 0.412", "1.00 ± 0.000", "< 0.001", "0.7", "Moderate"], ] add_table(sl, tbl_data, 0.3, 1.3, 12.7, 3.9, font_size=11) add_txt(sl, "All p-values < 0.001 (statistically significant). Cohen's d ≥ 0.80 = LARGE effect for 5/6 symptoms.", 0.3, 5.35, 12.5, 0.48, size=11, italic=True, color=DARK_BLUE) notes = [ ("Largest Improvement\nMouth Breathing (d=4.9)", ACCENT_RED), ("5/6 Symptoms: Large Effect\nCohen's d ≥ 0.80", GREEN), ("Ear Symptoms: Moderate\nd = 0.7", MID_BLUE), ] for i, (note, col) in enumerate(notes): add_rect(sl, 0.3 + i*4.35, 5.9, 4.1, 1.0, col) add_txt(sl, note, 0.4 + i*4.35, 5.98, 3.9, 0.85, size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER) # ══════════════════════════════════════════════════════════════════ # SLIDE 9 – SYMPTOM TRENDS (Figure 4) # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Symptom Improvement Over Time", "Figure 4 – Mean Symptom Scores at Preoperative and Postoperative Follow-up") footer(sl) add_image(sl, f'{OUTPUT}/chart_symptoms.png', 0.3, 1.2, 8.6, 5.2) add_rect(sl, 9.1, 1.3, 3.9, 5.1, WHITE, MID_BLUE, 0.75) add_txt(sl, "Key Findings", 9.2, 1.4, 3.7, 0.38, size=13, bold=True, color=DARK_BLUE) bullet_list(sl, [ "Repeated-measures ANOVA: significant effect of time (all symptoms)", "Greatest reduction in first 3 postoperative months", "Stable scores at 6, 9, and 12 months", "Suggests early relief maintained long-term", "Mouth breathing: highest reduction", "Ear symptoms: least but significant", ], 9.2, 1.85, 3.7, 4.2, size=10.5, color=DARK_GREY) add_image(sl, f'{OUTPUT}/Figure_4.png', 0.3, 6.4, 8.6, 0.7) # ══════════════════════════════════════════════════════════════════ # SLIDE 10 – EFFECT SIZE # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Clinical Effect Size (Cohen's d)", "Magnitude of Improvement Across All Symptoms") footer(sl) add_image(sl, f'{OUTPUT}/chart_cohen.png', 0.3, 1.2, 7.8, 4.5) add_rect(sl, 8.4, 1.2, 4.6, 4.6, WHITE, MID_BLUE, 0.75) add_txt(sl, "Effect Size Guide", 8.5, 1.3, 4.4, 0.38, size=12, bold=True, color=DARK_BLUE) guide_data = [ ["Cohen's d", "Interpretation"], ["< 0.20", "Trivial"], ["0.20 – 0.49", "Small"], ["0.50 – 0.79", "Moderate"], ["\u2265 0.80", "Large"], ] add_table(sl, guide_data, 8.5, 1.72, 4.4, 1.9, font_size=10.5) bullet_list(sl, [ "5 of 6 symptoms: LARGE effect (d ≥ 0.80)", "Mouth breathing: d = 4.9 (exceptionally large)", "Ear complaints: d = 0.7 (moderate but significant)", "Improvements are clinically substantial — not just statistically significant", ], 8.5, 3.7, 4.4, 2.0, size=10.5, color=DARK_GREY) # ══════════════════════════════════════════════════════════════════ # SLIDE 11 – DISCUSSION # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Discussion", "Comparative Analysis with Published Literature") footer(sl) section_box(sl, "Operative Time Comparison", 0.3, 1.3, 5.5) ot_data = [ ["Study", "Operative Time (min)"], ["Present Study (combined approach)", "41.4 \u00b1 7.9"], ["Islam MA et al. (coblation)", "20.78 \u00b1 7.49"], ["Alaskarov E (combined)", "36.12 \u00b1 4.82"], ] add_table(sl, ot_data, 0.3, 1.65, 5.5, 1.9, font_size=11) section_box(sl, "Residual / Recurrence Rate Comparison", 0.3, 3.75, 5.5) rec_data = [ ["Study", "Residual / Recurrence"], ["Present Study", "0% (0/75 at 1 year)"], ["Kim et al.", "5.9% residual; 13.3% regrowth"], ["Liu T et al.", "1.5% residual (4/266)"], ] add_table(sl, rec_data, 0.3, 4.1, 5.5, 1.9, font_size=11) section_box(sl, "QoL: OSA-18 Score Comparison", 6.0, 1.3, 7.0) qol_data = [ ["Study", "Pre-op OSA-18", "Post-op OSA-18"], ["Ferreira et al.", "77.25 \u00b1 6.07", "32.25 \u00b1 8.42"], ["Shivnani et al.", "73.3", "40.5 (1 month)"], ["Present Study", "Symptom-based Likert", "Significant improvement"], ] add_table(sl, qol_data, 6.0, 1.65, 7.0, 2.0, font_size=11) section_box(sl, "Advantages of Combined Endoscopic Approach", 6.0, 3.75, 7.0) bullet_list(sl, [ "Transnasal 0° (4mm): superior optical clarity + depth perception + panoramic view", "Transoral 0°: defines posterior dissection plane (posterior pharyngeal wall boundary)", "Transoral 70°: accesses fossa of Rosenmüller + peritubal region – zero blind spots", "Zero recurrence: 0% vs 5.9–13.3% in comparable studies at 1 year", "Acceptable operative time – justified by superior visualisation and outcomes", ], 6.0, 4.1, 7.0, 2.9, size=11) # ══════════════════════════════════════════════════════════════════ # SLIDE 12 – CONCLUSION # ══════════════════════════════════════════════════════════════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Conclusions", "Combined Transnasal + Transoral Endoscopic Coblation Adenoidectomy") footer(sl) conclusions = [ ("Complete Visualisation", "Transnasal + transoral 0° and 70° endoscopy eliminates blind spots in nasopharynx, including fossa of Rosenmüller and peritubal region."), ("Zero Residual Disease", "No residual or recurrent adenoid hypertrophy at 1-year follow-up – superior to comparable techniques (0% vs up to 13.3%)."), ("Significant Symptom Relief", "Statistically significant improvement in all symptoms; large Cohen's d in 5/6 measures; greatest improvement in first 3 months."), ("Safe & Effective", "Minimal bleeding; post-op VAS 0–4; no major complications; 24-hour discharge; outcomes sustained at 12 months."), ] for i, (title, body) in enumerate(conclusions): row = i // 2; col = i % 2 bx = 0.3 + col * 6.55; by = 1.3 + row * 2.45 add_rect(sl, bx, by, 6.25, 2.25, WHITE, MID_BLUE, 0.75) add_rect(sl, bx, by, 6.25, 0.48, MID_BLUE) add_txt(sl, title, bx+0.1, by+0.06, 6.05, 0.38, size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, body, bx+0.12, by+0.55, 6.0, 1.6, size=11, color=DARK_GREY, wrap=True) section_box(sl, "Recommendation for Future Research", 0.3, 6.1, 6.0) add_txt(sl, "Multicentric randomised controlled trials with larger sample sizes and extended follow-up to validate findings.", 6.5, 6.1, 6.5, 0.7, size=11, italic=True, color=DARK_BLUE) # ══════════════════════════════════════════════════════════════════ # SAVE # ══════════════════════════════════════════════════════════════════ out_path = f'{OUTPUT}/Adenoidectomy_Research_Presentation.pptx' prs.save(out_path) print(f"Saved: {out_path}") print(f"Total slides: {len(prs.slides)}") PYEOF

Running Command

python3 -c " from pptx.dml.color import RGBColor c = RGBColor(0x0D, 0x3B, 0x6E) print(dir(c)) print(str(c)) "

Running Command

python3 << 'PYEOF' from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.oxml import parse_xml import os OUTPUT = '/tmp/workspace/adenoid_ppt' DARK_BLUE = RGBColor(0x0D, 0x3B, 0x6E) MID_BLUE = RGBColor(0x1A, 0x6B, 0xAA) LIGHT_BLUE = RGBColor(0xD6, 0xEA, 0xF8) WHITE = RGBColor(0xFF, 0xFF, 0xFF) DARK_GREY = RGBColor(0x33, 0x33, 0x33) MID_GREY = RGBColor(0x88, 0x88, 0x88) ACCENT_RED = RGBColor(0xE8, 0x4C, 0x3C) GREEN = RGBColor(0x1E, 0x8B, 0x4C) PALE_BG = RGBColor(0xF4, 0xF8, 0xFD) prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank = prs.slide_layouts[6] def add_rect(slide, x, y, w, h, fill, line=None, lw=0.75): s = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h)) s.fill.solid(); s.fill.fore_color.rgb = fill if line: s.line.color.rgb = line; s.line.width = Pt(lw) else: s.line.fill.background() return s def add_txt(slide, text, x, y, w, h, size=14, bold=False, italic=False, color=DARK_GREY, align=PP_ALIGN.LEFT, wrap=True, 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 = anchor p = tf.paragraphs[0]; p.alignment = align r = p.add_run(); r.text = text r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic r.font.color.rgb = color; r.font.name = "Calibri" return tb def add_image(slide, path, x, y, w, h=None): try: if h: slide.shapes.add_picture(path, Inches(x), Inches(y), Inches(w), Inches(h)) else: slide.shapes.add_picture(path, Inches(x), Inches(y), Inches(w)) except Exception as e: print(f" [img err] {path}: {e}") def header(slide, title, subtitle=None): add_rect(slide, 0, 0, 13.333, 1.15, DARK_BLUE) add_txt(slide, title, 0.35, 0.1, 12.5, 0.72, size=24, bold=True, color=WHITE, align=PP_ALIGN.LEFT) if subtitle: add_txt(slide, subtitle, 0.35, 0.8, 12.5, 0.35, size=11, color=LIGHT_BLUE) def footer(slide, text="Sri Venkateswara Institute of Medical Sciences | ENT Department"): add_rect(slide, 0, 7.2, 13.333, 0.3, DARK_BLUE) add_txt(slide, text, 0.2, 7.22, 13.0, 0.24, size=8.5, color=WHITE, align=PP_ALIGN.CENTER) def section_box(slide, text, x, y, w=4.5): add_rect(slide, x, y, w, 0.32, MID_BLUE) add_txt(slide, text, x+0.08, y+0.02, w-0.16, 0.28, size=10, bold=True, color=WHITE) def bullet_list(slide, items, x, y, w, h, size=12, color=DARK_GREY): tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = tb.text_frame; tf.word_wrap = True for i, item in enumerate(items): p = tf.paragraphs[0] if i == 0 else tf.add_paragraph() p.space_before = Pt(3) r = p.add_run(); r.text = f"\u2022 {item}" r.font.size = Pt(size); r.font.color.rgb = color; r.font.name = "Calibri" return tb def solid_fill_xml(color_rgb_obj): hex_val = str(color_rgb_obj) # e.g. "0D3B6E" return parse_xml( f'<a:solidFill xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">' f'<a:srgbClr val="{hex_val}"/></a:solidFill>') def add_table(slide, data, x, y, w, h, header_bg=DARK_BLUE, alt_row=LIGHT_BLUE, font_size=10): rows = len(data); cols = len(data[0]) col_w = w / cols tbl = slide.shapes.add_table(rows, cols, Inches(x), Inches(y), Inches(w), Inches(h)).table for ci in range(cols): tbl.columns[ci].width = Inches(col_w) for ri, row_data in enumerate(data): for ci, cell_text in enumerate(row_data): cell = tbl.cell(ri, ci) cell.text = str(cell_text) tf = cell.text_frame; tf.word_wrap = True p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER r = p.runs[0] if p.runs else p.add_run() r.font.size = Pt(font_size); r.font.name = "Calibri" tcPr = cell._tc.get_or_add_tcPr() if ri == 0: r.font.bold = True; r.font.color.rgb = WHITE tcPr.append(solid_fill_xml(header_bg)) else: r.font.color.rgb = DARK_GREY if ri % 2 == 0: tcPr.append(solid_fill_xml(alt_row)) return tbl # ══════════ SLIDE 1 – TITLE ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) add_rect(sl, 0, 0, 13.333, 2.7, DARK_BLUE) add_rect(sl, 0, 2.7, 13.333, 0.1, MID_BLUE) add_txt(sl, "Beyond the Blind Spot:", 0.5, 0.22, 12.3, 0.72, size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, "Combined Wide-Angled Endoscopic Coblation Adenoidectomy", 0.5, 0.92, 12.3, 0.82, size=22, bold=True, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) add_txt(sl, "A Prospective Single-Center Study | SVIMS ENT | April 2022 – March 2025", 0.5, 1.82, 12.3, 0.55, size=13, italic=True, color=WHITE, align=PP_ALIGN.CENTER) stats = [("75", "Patients Enrolled"), ("41.4 ± 7.9 min", "Mean Operative Time"), ("0%", "Residual/Recurrence"), ("12 months", "Follow-up")] for i, (val, lbl) in enumerate(stats): bx = 0.4 + i * 3.15 add_rect(sl, bx, 3.1, 2.9, 1.45, MID_BLUE) add_txt(sl, val, bx+0.1, 3.18, 2.7, 0.7, size=24, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, lbl, bx+0.1, 3.85, 2.7, 0.48, size=10, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) add_txt(sl, "IEC No. 1276 (11/04/2022) | Written informed consent obtained from all guardians", 0.5, 6.85, 12.3, 0.35, size=9, italic=True, color=MID_GREY, align=PP_ALIGN.CENTER) # ══════════ SLIDE 2 – INTRO ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Introduction & Background", "Adenoid Hypertrophy and Coblation Adenoidectomy") footer(sl) section_box(sl, "Adenoid Physiology", 0.3, 1.3, 5.8) bullet_list(sl, [ "Lushka's tonsil – component of Waldeyer's ring; key immunological site", "Hypertrophy: physiological response to chronic/recurrent infections in childhood", "One of the leading causes of nasal obstruction in the paediatric population", "First described by Santorini; term 'adenoid' coined by Wilhelm Meyer", ], 0.3, 1.65, 5.8, 2.1) section_box(sl, "AAOHNS Indications for Adenoidectomy", 6.4, 1.3, 6.6) bullet_list(sl, [ "4 or more episodes of recurrent suppurative rhinitis", "Sleep-related breathing disorders", "Otitis media with effusion persisting > 3 months", "Maxillofacial growth anomalies", "Cardiopulmonary complications (cor pulmonale, pulmonary HTN)", ], 6.4, 1.65, 6.5, 2.1, size=11) section_box(sl, "Coblation Technology", 0.3, 3.6, 5.8) bullet_list(sl, [ '"Controlled Ablation" – described 2001; used in adenoidectomy from 2005', "Limits tissue temperature to 60°C → minimal collateral damage", "Preferred technique for paediatric otolaryngologists", ], 0.3, 3.95, 5.8, 1.6) section_box(sl, "Study Rationale – The Innovation", 6.4, 3.6, 6.6) bullet_list(sl, [ "Transnasal approach limited by narrow airways in paediatric patients", "Transoral approach (John NM et al., 2024): emerging alternative", "Combined 0° & 70° endoscopes: complete nasopharyngeal coverage", "Fossa of Rosenmüller & peritubal region: blind spots for residual disease", "Aim: Evaluate safety & efficacy of combined endoscopic technique", ], 6.4, 3.95, 6.5, 2.2, size=11) # ══════════ SLIDE 3 – METHODS ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Materials & Methods", "Prospective | Single-Center | n=75 | April 2022 – March 2025") footer(sl) add_rect(sl, 0.3, 1.3, 12.7, 0.55, MID_BLUE) add_txt(sl, "Study Design: Prospective Single-Center | SVIMS ENT | Ethics: IEC No. 1276 (11/04/2022)", 0.5, 1.36, 12.3, 0.42, size=12, bold=True, color=WHITE) section_box(sl, "Inclusion Criteria", 0.3, 2.0, 5.2) bullet_list(sl, [ "Age: 4–18 years with chronic adenoid hypertrophy", "Recurrent adenoiditis + significant upper airway obstruction", "Failed medical management (8–12 weeks)", "Grade III/IV on endoscopy; or persistent Grade II with OSA", ], 0.3, 2.35, 5.2, 1.9, size=11) section_box(sl, "Exclusion Criteria", 5.7, 2.0, 4.5) bullet_list(sl, [ "Craniofacial anomalies (Down syndrome, cleft palate)", "Palatal insufficiency", "Severe anaemia", ], 5.7, 2.35, 4.5, 1.3, size=11) section_box(sl, "Pre-op Assessment", 5.7, 3.5, 4.5) bullet_list(sl, [ "Lateral nasopharyngeal X-ray (Fujioka AN ratio)", "Diagnostic nasal endoscopy (Clemens grading)", ], 5.7, 3.85, 4.5, 0.9, size=11) section_box(sl, "Coblation Settings", 10.4, 2.0, 2.7) bullet_list(sl, [ "Bonss ARS 700 Plasma", "Ablation power: 9", "Coagulation: 5", "GA + Reverse Trendelenburg", ], 10.4, 2.35, 2.7, 1.3, size=10) section_box(sl, "Combined Surgical Technique – Step by Step", 0.3, 4.55, 12.7) bullet_list(sl, [ "Step 1: Transnasal 0° endoscope (2.4mm paeds / 4mm adult) — Initial adenoid ablation under direct nasopharyngeal visualization", "Step 2: Transoral 4mm 0° endoscope — Continued dissection; clear view of posterior plane aligned with posterior pharyngeal wall", "Step 3: Transoral 4mm 70° endoscope — Inspects concealed peritubal region + fossa of Rosenmüller; removes residual tissue under direct vision", ], 0.3, 4.9, 12.7, 2.0, size=11) section_box(sl, "Follow-up", 10.4, 3.5, 2.7) bullet_list(sl, [ "Discharge: 24h", "Weekly x 4 weeks", "3/6/9/12 months", "VAS pain + Likert QoL", ], 10.4, 3.85, 2.7, 1.3, size=10) # ══════════ SLIDE 4 – FIGURE 1 ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Preoperative Assessment", "Radiological and Endoscopic Confirmation of Adenoid Hypertrophy") footer(sl) add_image(sl, f'{OUTPUT}/Figure_1.png', 0.8, 1.3, 11.7, 5.1) add_txt(sl, "Fig 1a: Lateral nasopharyngeal X-ray – enlarged adenoid tissue narrowing nasopharyngeal airway (Fujioka AN ratio).", 0.4, 6.5, 6.3, 0.6, size=9, italic=True, color=MID_GREY) add_txt(sl, "Fig 1b: Preoperative nasal endoscopy – Grade IV adenoid hypertrophy obstructing the choanae.", 7.0, 6.5, 5.9, 0.6, size=9, italic=True, color=MID_GREY) # ══════════ SLIDE 5 – FIGURE 2 ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Intraoperative Endoscopic Views", "Combined Transnasal + Transoral Coblation – Step-by-Step Progression") footer(sl) add_image(sl, f'{OUTPUT}/Figure_2.png', 0.3, 1.3, 12.7, 5.3) for lbl, lx in [("(a) Transnasal 0° – Initial coblation", 0.3), ("(b) Transnasal 0° – Near-complete removal", 3.6), ("(c) Transoral 0° – Residual identified", 7.0), ("(d) Transoral 70° – Concealed areas", 10.0)]: add_txt(sl, lbl, lx, 6.65, 3.2, 0.55, size=8.5, italic=True, color=MID_GREY) # ══════════ SLIDE 6 – FIGURE 3 ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Postoperative Endoscopic Assessment", "Healing Trajectory – Immediate to 12-Month Follow-up") footer(sl) add_image(sl, f'{OUTPUT}/Figure_3.png', 0.3, 1.35, 12.7, 4.9) for lbl, lx in [("Fig 3a: Immediate post-op – complete adenoidectomy.", 0.3), ("Fig 3b: 1st week – healed mucosa, no residual tissue.", 4.5), ("Fig 3c: 12 months – widely patent posterior choana.", 9.0)]: add_txt(sl, lbl, lx, 6.35, 4.0, 0.6, size=9, italic=True, color=MID_GREY) # ══════════ SLIDE 7 – DEMOGRAPHICS ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Demographics & Procedures", "Table I – Study Population (N=75)") footer(sl) t_data = [ ["Characteristic", "n", "%"], ["Male", "41", "54.7%"], ["Female", "34", "45.3%"], ["Age: 4–8 years", "20", "26.7%"], ["Age: 9–13 years", "46", "61.3%"], ["Age: 14–18 years", "9", "12.0%"], ] add_table(sl, t_data, 0.3, 1.3, 4.2, 3.1, font_size=11) add_txt(sl, "Mean Age: 10.2 ± 2.9 years", 0.3, 4.5, 4.2, 0.38, size=11, bold=True, color=DARK_BLUE) add_image(sl, f'{OUTPUT}/chart_age.png', 4.7, 1.2, 5.1, 3.1) add_image(sl, f'{OUTPUT}/chart_gender.png', 9.9, 1.2, 3.2, 3.1) section_box(sl, "Procedures Performed", 0.3, 5.0, 4.2) proc_data = [ ["Procedure", "n"], ["Adenoidectomy alone", "48"], ["Adenotonsillectomy", "21"], ["Myringotomy + Grommet", "4"], ["Septoplasty + Adenoidectomy", "2"], ] add_table(sl, proc_data, 0.3, 5.35, 4.2, 1.6, font_size=10.5) add_image(sl, f'{OUTPUT}/chart_proc.png', 4.7, 4.5, 8.4, 2.45) # ══════════ SLIDE 8 – TABLE II ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Symptom Score Analysis", "Table II – Preoperative vs 12-Month Postoperative (Paired t-test)") footer(sl) tbl_data = [ ["Symptom", "Pre-op (Mean±SD)", "Post-op 12m (Mean±SD)", "p-value", "Cohen's d", "Effect Size"], ["Nasal Obstruction", "2.84 ± 0.789", "1.13 ± 0.342", "< 0.001", "2.8", "Large"], ["Mouth Breathing", "3.52 ± 0.529", "1.20 ± 0.403", "< 0.001", "4.9", "Large"], ["Snoring", "3.05 ± 0.804", "1.28 ± 0.452", "< 0.001", "2.7", "Large"], ["Open Mouth Breathing", "3.21 ± 0.643", "1.29 ± 0.458", "< 0.001", "3.4", "Large"], ["Dry Mouth", "2.54 ± 0.502", "1.19 ± 0.394", "< 0.001", "3.0", "Large"], ["Ear Complaints", "1.21 ± 0.412", "1.00 ± 0.000", "< 0.001", "0.7", "Moderate"], ] add_table(sl, tbl_data, 0.3, 1.3, 12.7, 3.85, font_size=11) add_txt(sl, "All p-values < 0.001 (statistically significant). Cohen's d >= 0.80 = LARGE effect size for 5 of 6 symptoms.", 0.3, 5.3, 12.5, 0.48, size=11, italic=True, color=DARK_BLUE) notes = [("Largest Improvement\nMouth Breathing (d=4.9)", ACCENT_RED), ("5/6 Symptoms: LARGE\nEffect Size (d >= 0.80)", GREEN), ("Ear Symptoms: Moderate\nd = 0.7", MID_BLUE)] for i, (note, col) in enumerate(notes): add_rect(sl, 0.3 + i*4.35, 5.9, 4.1, 1.05, col) add_txt(sl, note, 0.4 + i*4.35, 5.97, 3.9, 0.9, size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER) # ══════════ SLIDE 9 – SYMPTOM TRENDS ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Symptom Improvement Over Time", "Figure 4 – Mean Symptom Scores at Preoperative and Postoperative Follow-up (3, 6, 9, 12 months)") footer(sl) add_image(sl, f'{OUTPUT}/chart_symptoms.png', 0.3, 1.2, 8.6, 5.2) add_rect(sl, 9.1, 1.3, 3.9, 5.1, WHITE, MID_BLUE, 0.75) add_txt(sl, "Key Findings", 9.2, 1.4, 3.7, 0.38, size=13, bold=True, color=DARK_BLUE) bullet_list(sl, [ "Repeated-measures ANOVA: significant time effect on ALL symptoms", "Greatest reduction in first 3 postoperative months", "Scores stable at 6, 9, and 12 months", "Early relief maintained long-term", "Mouth breathing: highest reduction", "Ear symptoms: least but significant", ], 9.2, 1.85, 3.7, 4.2, size=10.5, color=DARK_GREY) add_image(sl, f'{OUTPUT}/Figure_4.png', 0.3, 6.42, 8.6, 0.68) # ══════════ SLIDE 10 – COHEN'S d ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Results: Clinical Effect Size (Cohen's d)", "Magnitude of Improvement Across All Symptoms") footer(sl) add_image(sl, f'{OUTPUT}/chart_cohen.png', 0.3, 1.2, 7.8, 4.5) add_rect(sl, 8.4, 1.2, 4.6, 4.6, WHITE, MID_BLUE, 0.75) add_txt(sl, "Effect Size Guide", 8.5, 1.3, 4.4, 0.38, size=12, bold=True, color=DARK_BLUE) guide_data = [ ["Cohen's d", "Interpretation"], ["< 0.20", "Trivial"], ["0.20 – 0.49", "Small"], ["0.50 – 0.79", "Moderate"], [">= 0.80", "Large"], ] add_table(sl, guide_data, 8.5, 1.72, 4.4, 1.9, font_size=10.5) bullet_list(sl, [ "5 of 6 symptoms: LARGE effect (d >= 0.80)", "Mouth breathing: d = 4.9 (exceptionally large)", "Ear complaints: d = 0.7 (moderate; clinically meaningful)", "Improvements clinically substantial – not just statistical", ], 8.5, 3.7, 4.4, 2.0, size=10.5, color=DARK_GREY) # ══════════ SLIDE 11 – DISCUSSION ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Discussion", "Comparative Analysis with Published Literature") footer(sl) section_box(sl, "Operative Time Comparison", 0.3, 1.3, 5.5) ot_data = [ ["Study", "Operative Time (min)"], ["Present Study (combined)", "41.4 +/- 7.9"], ["Islam MA et al. (coblation)", "20.78 +/- 7.49"], ["Alaskarov E (combined)", "36.12 +/- 4.82"], ] add_table(sl, ot_data, 0.3, 1.65, 5.5, 1.9, font_size=11) section_box(sl, "Residual / Recurrence Rate", 0.3, 3.75, 5.5) rec_data = [ ["Study", "Residual / Recurrence"], ["Present Study", "0% (0/75 at 1 year)"], ["Kim et al.", "5.9% residual; 13.3% regrowth"], ["Liu T et al.", "1.5% residual (4/266)"], ] add_table(sl, rec_data, 0.3, 4.1, 5.5, 1.9, font_size=11) section_box(sl, "QoL Comparison – OSA-18 Scores", 6.0, 1.3, 7.0) qol_data = [ ["Study", "Pre-op OSA-18", "Post-op OSA-18"], ["Ferreira et al.", "77.25 +/- 6.07", "32.25 +/- 8.42"], ["Shivnani et al.", "73.3", "40.5 (at 1 month)"], ["Present Study", "Likert score", "Significant improvement"], ] add_table(sl, qol_data, 6.0, 1.65, 7.0, 2.0, font_size=11) section_box(sl, "Advantages of Combined Endoscopic Approach", 6.0, 3.75, 7.0) bullet_list(sl, [ "Transnasal 0° (4mm): superior optical clarity + depth perception + panoramic view", "Transoral 0°: defines posterior dissection plane (posterior pharyngeal wall boundary)", "Transoral 70°: accesses fossa of Rosenmüller + peritubal region – zero blind spots", "0% recurrence vs 5.9–13.3% in comparable studies at 1 year", "Modest increase in operative time justified by superior outcomes", ], 6.0, 4.1, 7.0, 2.85, size=11) # ══════════ SLIDE 12 – CONCLUSION ══════════ sl = prs.slides.add_slide(blank) add_rect(sl, 0, 0, 13.333, 7.5, PALE_BG) header(sl, "Conclusions", "Combined Transnasal + Transoral Endoscopic Coblation Adenoidectomy") footer(sl) conclusions = [ ("Complete Visualisation", "Transnasal + transoral 0° and 70° endoscopy eliminates nasopharyngeal blind spots including fossa of Rosenmüller and peritubal region."), ("Zero Residual Disease", "No residual or recurrent adenoid at 1-year follow-up – superior to comparable techniques (0% vs up to 13.3%)."), ("Significant Symptom Relief", "Statistically significant improvement in all symptoms; large Cohen's d in 5/6 measures; greatest gains in first 3 months."), ("Safe & Effective", "Minimal bleeding; post-op VAS 0–4; no major complications; 24-hour discharge; outcomes sustained at 12 months."), ] for i, (title, body) in enumerate(conclusions): row = i // 2; col = i % 2 bx = 0.3 + col * 6.55; by = 1.3 + row * 2.45 add_rect(sl, bx, by, 6.25, 2.25, WHITE, MID_BLUE, 0.75) add_rect(sl, bx, by, 6.25, 0.48, MID_BLUE) add_txt(sl, title, bx+0.1, by+0.06, 6.05, 0.38, size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_txt(sl, body, bx+0.12, by+0.55, 6.0, 1.6, size=11, color=DARK_GREY, wrap=True) section_box(sl, "Recommendation for Future Research", 0.3, 6.1, 6.2) add_txt(sl, "Multicentric RCTs with larger sample sizes and extended follow-up to validate these findings.", 6.7, 6.12, 6.2, 0.65, size=11, italic=True, color=DARK_BLUE) # ══════════ SAVE ══════════ out_path = f'{OUTPUT}/Adenoidectomy_Research_Presentation.pptx' prs.save(out_path) print(f"Saved: {out_path}") print(f"Slides: {len(prs.slides)}") import os; print(f"File size: {os.path.getsize(out_path):,} bytes") PYEOF

Your presentation is ready! Here is the download link:

Adenoidectomy Research Presentation

Presentation · PPTX


The PowerPoint has 12 slides built entirely from your manuscript, tables, graph data, and all 4 figures:
SlideContent
1Title Slide – Study title, institution, date range, 4 key stat boxes (75 patients, 41.4 min OR time, 0% recurrence, 12-month follow-up)
2Introduction & Background – Adenoid physiology, AAOHNS indications, Coblation technology, study rationale
3Materials & Methods – Inclusion/exclusion criteria, surgical technique (step-by-step), follow-up protocol
4Figure 1 – Preoperative lateral X-ray & endoscopic Grade IV hypertrophy
5Figure 2 – 4-panel intraoperative endoscopy (transnasal 0°, transoral 0°, transoral 70°)
6Figure 3 – Postoperative healing at immediate, 1 week, and 12 months
7Demographics – Table I + age bar chart + gender pie chart + procedure bar chart
8Table II – Pre-op vs post-op symptom scores with p-values, Cohen's d, and effect size classification
9Figure 4 – Line graph of symptom trends across all 5 timepoints (0, 3, 6, 9, 12 months)
10Effect Size – Cohen's d bar chart with effect size guide table
11Discussion – Comparative tables (operative time, recurrence, QoL) + advantages of combined approach
12Conclusions – 4 conclusion boxes + future research recommendation
All charts (bar, pie, line, Cohen's d) were generated fresh from your data. The colour theme is professional navy blue with white and light blue accents.

the manuscript should be ready to present also if needed you can take some more reference articles and make it conference style at national superspeciality institute

Searching PubMed

coblation adenoidectomy endoscopic pediatric outcomes

Searching PubMed

transoral endoscopic adenoidectomy residual adenoid recurrence

Running Command

ls /tmp/workspace/adenoid_ppt/ && python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/adenoid_ppt/Adenoidectomy_Research_Presentation.pptx') print(f'Existing slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [sh.text_frame.text.strip() for sh in slide.shapes if sh.has_text_frame and sh.text_frame.text.strip()] print(f' Slide {i}: {texts[0][:80] if texts else \"(no text)\"}') "

Reading Article

PMID: 41052632

Reading Article

PMID: 39476644

Searching PubMed

adenoid hypertrophy quality of life children obstructive sleep apnea adenoidectomy

Running Command

python3 << 'PYEOF' # Regenerate all charts with conference-quality styling import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches import numpy as np import os OUTPUT = '/tmp/workspace/adenoid_ppt' # Conference colour palette C1 = '#0D3B6E' # deep navy C2 = '#1A6BAA' # mid blue C3 = '#E84C3C' # red C4 = '#27AE60' # green C5 = '#F39C12' # amber C6 = '#8E44AD' # purple LIGHT = '#EAF2FB' plt.rcParams.update({ 'font.family': 'DejaVu Sans', 'axes.titlesize': 13, 'axes.labelsize': 11, 'xtick.labelsize': 10, 'ytick.labelsize': 10, 'axes.spines.top': False, 'axes.spines.right': False, }) # ── Chart 1: Age group bar ────────────────────────────── fig, ax = plt.subplots(figsize=(5.2, 3.4)) age_groups = ['4–8 yrs\n(n=20)', '9–13 yrs\n(n=46)', '14–18 yrs\n(n=9)'] counts = [20, 46, 9] pcts = ['26.7%', '61.3%', '12.0%'] colors = [C2, C1, C5] bars = ax.bar(age_groups, counts, color=colors, edgecolor='white', linewidth=1.5, width=0.55) for bar, pct in zip(bars, pcts): ax.text(bar.get_x()+bar.get_width()/2, bar.get_height()+0.6, pct, ha='center', va='bottom', fontsize=11, fontweight='bold', color='#222') ax.set_ylabel('Number of Patients', fontsize=11) ax.set_title('Age Group Distribution (N=75)', fontsize=13, fontweight='bold', pad=10) ax.set_ylim(0, 58) ax.set_facecolor(LIGHT) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_age.png', dpi=180, bbox_inches='tight') plt.close() # ── Chart 2: Gender pie ────────────────────────────────── fig, ax = plt.subplots(figsize=(3.8, 3.4)) ax.pie([41, 34], labels=['Male (n=41)', 'Female (n=34)'], autopct='%1.1f%%', colors=[C1, C3], explode=(0.04, 0.04), startangle=140, textprops={'fontsize': 11}, wedgeprops={'edgecolor': 'white', 'linewidth': 2}) ax.set_title('Gender Distribution', fontsize=13, fontweight='bold', pad=8) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_gender.png', dpi=180, bbox_inches='tight') plt.close() # ── Chart 3: Procedure horizontal bar ─────────────────── fig, ax = plt.subplots(figsize=(6.0, 3.0)) procs = ['Adenoidectomy Alone\n(n=48)', 'Adenotonsillectomy\n(n=21)', 'Myringotomy + Grommet\n(n=4)', 'Septoplasty +\nAdenoidectomy (n=2)'] vals = [48, 21, 4, 2] clrs = [C1, C3, C4, C5] bars = ax.barh(procs, vals, color=clrs, edgecolor='white', height=0.6) for bar, v in zip(bars, vals): ax.text(bar.get_width()+0.3, bar.get_y()+bar.get_height()/2, f'n={v}', va='center', fontsize=11, fontweight='bold', color='#222') ax.set_xlabel('Number of Patients', fontsize=11) ax.set_title('Surgical Procedures Performed', fontsize=13, fontweight='bold', pad=10) ax.set_xlim(0, 60) ax.set_facecolor(LIGHT) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_proc.png', dpi=180, bbox_inches='tight') plt.close() # ── Chart 4: Symptom line graph ────────────────────────── timepoints = ['Pre-op\n(0)', '3 months', '6 months', '9 months', '12 months'] x = np.arange(len(timepoints)) data_symptoms = { 'Nasal Obstruction (2.84→1.13)': [2.84, 1.45, 1.22, 1.16, 1.13], 'Mouth Breathing (3.52→1.20)': [3.52, 1.57, 1.28, 1.23, 1.20], 'Snoring (3.05→1.28)': [3.05, 1.52, 1.33, 1.30, 1.28], 'Open Mouth (3.21→1.29)': [3.21, 1.55, 1.35, 1.31, 1.29], 'Dry Mouth (2.54→1.19)': [2.54, 1.38, 1.24, 1.21, 1.19], 'Ear Complaints (1.21→1.00)': [1.21, 1.09, 1.04, 1.02, 1.00], } colors_s = [C1, C3, C4, C5, C6, '#16A085'] fig, ax = plt.subplots(figsize=(9, 5.0)) for idx, (sym, vals) in enumerate(data_symptoms.items()): ax.plot(x, vals, marker='o', color=colors_s[idx], linewidth=2.5, markersize=8, label=sym) ax.set_xticks(x); ax.set_xticklabels(timepoints, fontsize=11) ax.set_ylabel('Mean Symptom Score (5-point Likert)', fontsize=11) ax.set_title('Mean Symptom Scores: Preoperative vs Postoperative Follow-up', fontsize=13, fontweight='bold', pad=12) ax.legend(loc='upper right', fontsize=9, framealpha=0.9, ncol=2) ax.set_ylim(0.5, 4.2) ax.set_facecolor(LIGHT) ax.grid(axis='y', linestyle='--', alpha=0.5) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_symptoms.png', dpi=180, bbox_inches='tight') plt.close() # ── Chart 5: Cohen's d ──────────────────────────────────── fig, ax = plt.subplots(figsize=(7, 4.0)) symptoms_cd = ['Nasal\nObstruction', 'Mouth\nBreathing', 'Snoring', 'Open Mouth\nBreathing', 'Dry\nMouth', 'Ear\nComplaints'] cohen_d = [2.8, 4.9, 2.7, 3.4, 3.0, 0.7] bar_colors = [C1 if v >= 0.80 else C5 for v in cohen_d] bars = ax.bar(symptoms_cd, cohen_d, color=bar_colors, edgecolor='white', linewidth=1.5, width=0.55) ax.axhline(y=0.80, color=C3, linestyle='--', linewidth=2.0, label='Large effect threshold (d=0.80)') for bar, v in zip(bars, cohen_d): ax.text(bar.get_x()+bar.get_width()/2, bar.get_height()+0.07, f'd={v}', ha='center', va='bottom', fontsize=11, fontweight='bold') ax.set_ylabel("Cohen's d", fontsize=11) ax.set_title("Effect Size (Cohen's d) for Each Symptom", fontsize=13, fontweight='bold', pad=10) ax.legend(fontsize=10, loc='upper right') ax.set_ylim(0, 6.2) ax.set_facecolor(LIGHT) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_cohen.png', dpi=180, bbox_inches='tight') plt.close() # ── Chart 6: Comparison of recurrence rates ───────────── fig, ax = plt.subplots(figsize=(7, 3.8)) studies = ['Present Study\n(Combined Endo-\nscopic Coblation)', 'Kim et al.\n2013\n(Coblation)', 'Liu T et al.\n2022\n(Coblation)', 'Wang L et al.\n2024\n(Curettage)'] recurrence = [0.0, 13.3, 1.5, 14.81] residual = [0.0, 5.9, 1.5, 35.19] x2 = np.arange(len(studies)) w = 0.35 b1 = ax.bar(x2 - w/2, residual, w, label='Residual Rate (%)', color=C2, edgecolor='white') b2 = ax.bar(x2 + w/2, recurrence, w, label='Recurrence Rate (%)', color=C3, edgecolor='white') for bar in b1: if bar.get_height() > 0: ax.text(bar.get_x()+bar.get_width()/2, bar.get_height()+0.3, f'{bar.get_height()}%', ha='center', va='bottom', fontsize=9, fontweight='bold') else: ax.text(bar.get_x()+bar.get_width()/2, 0.3, '0%', ha='center', va='bottom', fontsize=9, fontweight='bold', color=C4) for bar in b2: if bar.get_height() > 0: ax.text(bar.get_x()+bar.get_width()/2, bar.get_height()+0.3, f'{bar.get_height()}%', ha='center', va='bottom', fontsize=9, fontweight='bold') else: ax.text(bar.get_x()+bar.get_width()/2, 0.3, '0%', ha='center', va='bottom', fontsize=9, fontweight='bold', color=C4) ax.set_xticks(x2); ax.set_xticklabels(studies, fontsize=9) ax.set_ylabel('Rate (%)', fontsize=11) ax.set_title('Residual & Recurrence Rate Comparison Across Studies', fontsize=12, fontweight='bold', pad=10) ax.legend(fontsize=10) ax.set_ylim(0, 42) ax.set_facecolor(LIGHT) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_recurrence.png', dpi=180, bbox_inches='tight') plt.close() # ── Chart 7: Operative time comparison ─────────────────── fig, ax = plt.subplots(figsize=(6.5, 3.2)) st_labels = ['Present Study\n(Combined)', 'Islam MA et al.\n2023', 'Alaskarov E\n2024', 'Elbakry et al.\n2026 (RCT)'] ot_means = [41.4, 20.78, 36.12, 33.5] # 33.5 approx for Elbakry coblation arm ot_errs = [7.9, 7.49, 4.82, 4.2] clrs2 = [C3, C1, C2, C4] bars = ax.bar(st_labels, ot_means, yerr=ot_errs, capsize=5, color=clrs2, edgecolor='white', linewidth=1.5, width=0.55, error_kw={'ecolor': '#555', 'elinewidth': 1.5}) ax.set_ylabel('Operative Time (min)', fontsize=11) ax.set_title('Operative Time Comparison Across Studies', fontsize=12, fontweight='bold', pad=10) ax.set_ylim(0, 58) for bar, v in zip(bars, ot_means): ax.text(bar.get_x()+bar.get_width()/2, bar.get_height()+1.5, f'{v}m', ha='center', fontsize=10, fontweight='bold') ax.set_facecolor(LIGHT) fig.patch.set_facecolor('white') plt.tight_layout() plt.savefig(f'{OUTPUT}/chart_optime.png', dpi=180, bbox_inches='tight') plt.close() print("All 7 conference-quality charts saved.") PYEOF

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

no still i have credits

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

how many credits did i used

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

i havent used my credits

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.
This is a shared conversation. Sign in to Orris to start your own chat.