Follow thus annexure and create propsal for the topic "Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy – A Randomized Controlled Trial"
oxymetazoline nasal bronchoscopy flexible
nasal patency test nostril selection bronchoscopy
python3 -c " from docx import Document doc = Document('/tmp/workspace/attachments/e9a41339-3324-466c-894c-09c864f4d5b3/7.IEC Annexure to Circular - New.docx') for i, p in enumerate(doc.paragraphs): style = p.style.name if p.style else 'None' if p.text.strip(): print(f'[{i}][{style}] {p.text}') # Also check tables print('\n--- TABLES ---') for ti, table in enumerate(doc.tables): print(f'Table {ti}: {len(table.rows)} rows x {len(table.columns)} cols') for ri, row in enumerate(table.rows): for ci, cell in enumerate(row.cells): txt = cell.text.strip() if txt: print(f' [{ri},{ci}]: {txt[:200]}') "
nasal bronchoscopy decongestant preparation technique
flexible bronchoscopy nasal route complications
oxymetazoline nasal decongestant epistaxis bronchoscopy
nasal patency rhinomanometry peak nasal inspiratory flow
PMID: 25686147
oxymetazoline epistaxis nasal preparation endoscopy
flexible bronchoscopy nasal epistaxis lidocaine topical anesthesia
intranasal oxymetazoline nasal bronchoscopy preparation nostril selection nasal patency test randomized trial
mkdir -p /tmp/workspace/bronchoscopy-proposal && ls /tmp/workspace/bronchoscopy-proposal/
~/bronchoscopy-proposal/create_proposal.py
from docx import Document
from docx.shared import Pt, Inches, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy
doc = Document()
# ─── Page margins ──────────────────────────────────────────────────────────────
section = doc.sections[0]
section.top_margin = Cm(2.5)
section.bottom_margin = Cm(2.5)
section.left_margin = Cm(3.0)
section.right_margin = Cm(2.5)
# ─── Default font ──────────────────────────────────────────────────────────────
style = doc.styles["Normal"]
style.font.name = "Times New Roman"
style.font.size = Pt(12)
# ─── Helper functions ──────────────────────────────────────────────────────────
def add_heading(doc, text, level=1, bold=True, center=False, underline=False, size=None):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(8)
p.paragraph_format.space_after = Pt(4)
if center:
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run(text)
run.bold = bold
run.underline = underline
if size:
run.font.size = Pt(size)
else:
sizes = {1: 14, 2: 13, 3: 12}
run.font.size = Pt(sizes.get(level, 12))
return p
def add_para(doc, text, indent=False, bold=False, italic=False, space_before=2, space_after=4):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(space_before)
p.paragraph_format.space_after = Pt(space_after)
if indent:
p.paragraph_format.left_indent = Cm(1)
run = p.add_run(text)
run.bold = bold
run.italic = italic
return p
def add_bullet(doc, text, level=0):
p = doc.add_paragraph(style="List Bullet")
p.paragraph_format.left_indent = Cm(1 + level * 0.5)
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(2)
run = p.add_run(text)
return p
def add_numbered(doc, text, num):
p = doc.add_paragraph()
p.paragraph_format.left_indent = Cm(1)
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(3)
run = p.add_run(f"{num}. {text}")
return p
def set_cell_bg(cell, hex_color):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), hex_color)
tcPr.append(shd)
def add_line(doc):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(2)
pPr = p._p.get_or_add_pPr()
pBdr = OxmlElement('w:pBdr')
bottom = OxmlElement('w:bottom')
bottom.set(qn('w:val'), 'single')
bottom.set(qn('w:sz'), '6')
bottom.set(qn('w:space'), '1')
bottom.set(qn('w:color'), '000000')
pBdr.append(bottom)
pPr.append(pBdr)
return p
# ══════════════════════════════════════════════════════════════════════════════
# COVER / LETTER PAGE
# ══════════════════════════════════════════════════════════════════════════════
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Faculty of Medicine – Meenakshi Medical College Hospital & Research Institute")
run.bold = True
run.font.size = Pt(13)
p2 = doc.add_paragraph()
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
run2 = p2.add_run("Institutional Ethics Committee – Human Studies")
run2.bold = True
run2.font.size = Pt(12)
add_line(doc)
doc.add_paragraph()
# From section
p_from = doc.add_paragraph()
p_from.add_run("From\n").bold = True
p_from.add_run("Dr. ____________________\nDepartment of Pulmonary Medicine\nMMCHRI, Kanchipuram")
doc.add_paragraph()
# To section
p_to = doc.add_paragraph()
p_to.add_run("To\n").bold = True
p_to.add_run("The Chairperson,\nInstitutional Ethics Committee,\nMMCHRI, Kanchipuram")
doc.add_paragraph()
add_para(doc, "Through Proper Channel")
doc.add_paragraph()
add_para(doc, "Respected Sir/Madam,")
doc.add_paragraph()
p_sub = doc.add_paragraph()
run_sub = p_sub.add_run("Sub: ")
run_sub.bold = True
p_sub.add_run('Request for ethical clearance for the study "Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy – A Randomized Controlled Trial".')
doc.add_paragraph()
p_body = doc.add_paragraph()
p_body.add_run(
"I, Dr. ____________________, PG/Faculty of Meenakshi Medical College Hospital & Research Institute, "
"am interested in undertaking a project titled "
'"Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy '
'– A Randomized Controlled Trial" '
"under the guidance of Dr. ____________________, Associate/Professor, Department of Pulmonary Medicine, "
"Meenakshi Medical College Hospital & Research Institute. "
"A copy of this study proposal is attached herewith. I kindly request ethical clearance and approval to conduct this study."
)
doc.add_paragraph()
add_para(doc, "Thanking You,")
add_para(doc, "Yours sincerely,")
doc.add_paragraph()
doc.add_paragraph()
# Signature table
sig_table = doc.add_table(rows=2, cols=2)
sig_table.style = "Table Grid"
sig_table.cell(0, 0).text = "Signature of the Guide"
sig_table.cell(0, 1).text = "Signature of the Candidate / Investigator"
sig_table.cell(1, 0).text = ""
sig_table.cell(1, 1).text = ""
for row in sig_table.rows:
for cell in row.cells:
cell.paragraphs[0].paragraph_format.space_before = Pt(18)
cell.paragraphs[0].paragraph_format.space_after = Pt(18)
doc.add_paragraph()
hod_p = doc.add_paragraph()
hod_p.add_run("Signature of the HOD").bold = True
doc.add_page_break()
# ══════════════════════════════════════════════════════════════════════════════
# SECTION A – BASIC INFORMATION
# ══════════════════════════════════════════════════════════════════════════════
add_heading(doc, "Application for Submission of Research Proposals to SAC/IEC Review (Human Studies)", level=1, center=True, size=13)
add_line(doc)
# IEC Reference table
ref_table = doc.add_table(rows=1, cols=3)
ref_table.style = "Table Grid"
for i, txt in enumerate(["IEC Reference No. :", "Project Type: PG", "Date of Submission: ___/___/______"]):
ref_table.cell(0, i).text = txt
ref_table.cell(0, i).paragraphs[0].paragraph_format.space_before = Pt(6)
ref_table.cell(0, i).paragraphs[0].paragraph_format.space_after = Pt(6)
doc.add_paragraph()
add_heading(doc, "SECTION A – BASIC INFORMATION", level=2, underline=True)
# Title
p_title_label = doc.add_paragraph()
p_title_label.add_run("Title of Research Proposal:").bold = True
p_title_body = doc.add_paragraph()
p_title_body.add_run(
"Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy "
"– A Randomized Controlled Trial"
).italic = True
# Investigator details table
doc.add_paragraph().add_run("Details of Investigators:").bold = True
inv_table = doc.add_table(rows=5, cols=3)
inv_table.style = "Table Grid"
headers = ["Name", "Qualification / Designation / Department", "Address for Communication\n(with Contact numbers & Email ID)"]
for ci, h in enumerate(headers):
cell = inv_table.cell(0, ci)
cell.text = h
cell.paragraphs[0].runs[0].bold = True
set_cell_bg(cell, "D9E1F2")
labels = ["Principal Investigator", "Co-Investigator 1", "Co-Investigator 2 / Faculty Guide", ""]
for ri, label in enumerate(labels, start=1):
if ri <= 4:
inv_table.cell(ri, 0).text = label
inv_table.cell(ri, 1).text = "MD / Dept. of Pulmonary Medicine, MMCHRI"
inv_table.cell(ri, 2).text = "Meenakshi Medical College Hospital & Research Institute, Kanchipuram\nEmail: ________________\nPhone: ________________"
doc.add_paragraph()
add_para(doc, "Duration of the Study: 12 months (July 2026 – June 2027)", bold=True)
add_para(doc, "Funding Details & Budget:", bold=True)
add_para(doc, "Total Estimated Budget for Study: ₹ 25,000/-")
add_para(doc, "☑ Self Funding ☐ Institutional Funding ☐ Funding Agency")
doc.add_page_break()
# ══════════════════════════════════════════════════════════════════════════════
# SECTION B – RESEARCH RELATED INFORMATION
# ══════════════════════════════════════════════════════════════════════════════
add_heading(doc, "SECTION B – RESEARCH RELATED INFORMATION", level=2, underline=True)
b_table = doc.add_table(rows=4, cols=4)
b_table.style = "Table Grid"
# Row 0: header
hdr = b_table.cell(0, 0)
hdr_merge = hdr.merge(b_table.cell(0, 3))
hdr_merge.text = "1. Type of Study"
hdr_merge.paragraphs[0].runs[0].bold = True
set_cell_bg(hdr_merge, "D9E1F2")
# Row 1: checkboxes
b_table.cell(1, 0).text = "☐ Basic Sciences\n☐ Retrospective\n☑ Prospective\n☐ Qualitative\n☑ Quantitative\n☐ Mixed Method"
b_table.cell(1, 1).text = "☑ Clinical\n☐ Epidemiological / Public Health\n☐ Socio-Behavioural\n☐ Biological Samples\n☑ Single Centre\n☐ Multi-Centre"
b_table.cell(1, 2).text = "☑ Clinical\n☐ Epidemiological / Public Health\n☐ Socio-Behavioural\n☐ Biological Samples\n☑ Single Centre\n☐ Multi-Centre"
b_table.cell(1, 3).text = "☐ Cross-Sectional\n☐ Case-Control\n☐ Cohort\n☑ Clinical Trial (RCT)\n☐ Systematic Review\n☐ Any Other"
# Row 2: Status
status_row_merge = b_table.cell(2, 0).merge(b_table.cell(2, 3))
status_row_merge.text = "2. Status of Review: ☑ New ☐ Revised"
# Row 3: Clinical Trial
ct_merge = b_table.cell(3, 0).merge(b_table.cell(3, 3))
ct_merge.text = (
"3. Clinical Trial Information:\n"
"a. Does the study involve use of any drug/device/vaccine? ☑ Drug (Oxymetazoline 0.05% nasal drops – approved & marketed in India)\n"
"b. Is it approved & marketed? ☑ In India\n"
"c. Does it involve a change in use, dosage, or route of administration? ☐ Yes ☑ No\n"
" DCGI/Regulatory authority permission required? ☐ Yes ☑ No\n"
"d. Is it an Investigational New Drug (IND)? ☐ Yes ☑ No\n"
" (Oxymetazoline 0.05% nasal drops is a standard marketed formulation; no IND applicable)"
)
doc.add_paragraph()
doc.add_page_break()
# ══════════════════════════════════════════════════════════════════════════════
# SECTION C – DETAILED RESEARCH PROPOSAL
# ══════════════════════════════════════════════════════════════════════════════
add_heading(doc, "SECTION C – DETAILED RESEARCH PROPOSAL", level=2, underline=True)
# C1. Title
add_heading(doc, "Title of the Project", level=3, bold=True)
p_title2 = doc.add_paragraph()
p_title2.add_run(
"Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy "
"– A Randomized Controlled Trial"
).bold = True
p_title2.alignment = WD_ALIGN_PARAGRAPH.CENTER
# C2. Background / Introduction
doc.add_paragraph()
add_heading(doc, "Background / Introduction", level=3, bold=True)
intro_text = (
"Flexible bronchoscopy (FB) is among the most common interventional pulmonary procedures worldwide, "
"performed for diagnostic and therapeutic indications including tissue sampling, airway inspection, "
"bronchoalveolar lavage, and foreign body retrieval. The procedure may be performed via the oral or "
"nasal route; however, the nasal route is widely preferred because it provides better stabilisation "
"of the bronchoscope, improved patient tolerance, superior glottic visualisation, and allows the "
"endoscopist to operate without a bite block. Despite these advantages, the nasal passage is narrower "
"than the oropharynx, and passage of the bronchoscope through the nasal cavity can result in "
"epistaxis, mucosal trauma, patient discomfort, and procedural failure – collectively referred to as "
"nasal passage complications.\n\n"
"Two competing strategies are used clinically to reduce nasal complications and ease passage of the "
"bronchoscope. The first is pharmacological preparation: instillation of a topical alpha-adrenergic "
"agonist such as oxymetazoline 0.05% (Iliadin®) before the procedure to induce nasal vasoconstriction, "
"reduce mucosal engorgement, and widen the nasal airway. Oxymetazoline acts within 5 minutes and "
"maintains its decongestant effect for 8–12 hours. The second strategy is anatomical selection: "
"identifying the more patent nostril through a clinical nasal patency test – commonly the simple "
"alternating occlusion breath test (patient closes one nostril and breathes, then the other, and "
"the clinician or patient identifies the more open side) or objective peak nasal inspiratory flow "
"(PNIF) measurement – and directing the bronchoscope through that side.\n\n"
"Although both approaches are in routine use, no published randomised controlled trial has directly "
"compared them head to head for primary bronchoscopic outcomes such as epistaxis rate, ease of "
"bronchoscope passage, operator-rated difficulty, patient comfort, and procedure duration. "
"This knowledge gap is clinically significant: oxymetazoline carries systemic cardiovascular "
"side-effects (transient hypertension, reflex bradycardia) and adds cost, whereas nostril "
"selection by nasal patency test is cost-free and devoid of drug-related adverse effects. "
"Determining whether pharmacological preparation provides superior procedural outcomes over simple "
"anatomical selection – or whether the two are equivalent – will guide evidence-based preprocedural "
"bronchoscopy care."
)
for block in intro_text.strip().split("\n\n"):
add_para(doc, block.strip(), space_before=4, space_after=6)
# Research question
p_rq = doc.add_paragraph()
p_rq.add_run("Research Question: ").bold = True
p_rq.add_run(
"In adult patients undergoing elective nasal flexible bronchoscopy, does intranasal oxymetazoline 0.05% "
"administered 10 minutes prior to the procedure result in a lower rate of epistaxis and superior "
"procedural ease compared to nostril selection guided by a simple nasal patency test alone?"
)
# C3. Objectives
doc.add_paragraph()
add_heading(doc, "Objectives", level=3, bold=True)
p_pri = doc.add_paragraph()
p_pri.add_run("Primary Objective:").bold = True
add_para(doc, "To compare the rate of epistaxis during nasal flexible bronchoscopy between patients "
"receiving intranasal oxymetazoline 0.05% (Intervention Group) and patients undergoing "
"nostril selection by clinical nasal patency test (Control Group).", indent=True)
p_sec = doc.add_paragraph()
p_sec.add_run("Secondary Objectives:").bold = True
secondary = [
"To compare the ease of bronchoscope passage (operator-rated on a VAS 0–10) between the two groups.",
"To compare patient-reported pain/discomfort (VAS 0–10) during nasal passage of the bronchoscope.",
"To compare the overall procedure duration (nasal entry to vocal cord visualisation, in seconds) between groups.",
"To compare the rate of procedural failure (inability to pass the bronchoscope nasally) between groups.",
"To assess haemodynamic changes (heart rate, blood pressure) before and immediately after bronchoscope insertion in both groups.",
"To document any adverse events attributable to oxymetazoline (hypertension, reflex bradycardia, palpitations).",
]
for s in secondary:
add_bullet(doc, s)
# C4. Brief Review of Literature
doc.add_paragraph()
add_heading(doc, "Brief Review of Literature", level=3, bold=True)
lit_table = doc.add_table(rows=8, cols=4)
lit_table.style = "Table Grid"
lit_headers = ["Authors (Year)", "Place", "Population & Study Design", "Key Findings (Research Gaps / Limitations)"]
for ci, h in enumerate(lit_headers):
lit_table.cell(0, ci).text = h
lit_table.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(lit_table.cell(0, ci), "D9E1F2")
lit_rows = [
(
"González-Aguirre JE et al. (2015) [Ref 1]",
"Monterrey, Mexico",
"Prospective RCT; 63 adults with indication for flexible bronchoscopy",
"Oral vs nasal route compared. Nasal route had 6 insertion failures (vs 0 oral), longer time to vocal cord (56 vs 25.5 s, p<0.01). Both routes equally comfortable with IV sedation. Gap: no decongestant vs patency test comparison."
),
(
"Du Rand IA et al. – BTS Guidelines (2013) [Ref 2]",
"United Kingdom",
"National guidelines panel; systematic review of bronchoscopy practice",
"BTS recommends topical vasoconstrictor (e.g., xylometazoline/oxymetazoline) prior to nasal bronchoscopy to reduce epistaxis. Graded recommendation; limited RCT evidence underpinning the specific drug choice or comparison with nostril selection."
),
(
"Asano F et al. – JRS Guidelines (2013) [Ref 3]",
"Japan",
"Expert consensus; review of bronchoscopy techniques",
"Recommends selecting the more patent nostril by clinical inspection prior to nasal bronchoscopy. Does not mandate pharmacological decongestant. Gap: direct RCT comparing pharmacological vs anatomical approach absent."
),
(
"Enberg RN et al. (1982) [Ref 4]",
"USA",
"Prospective study; 100 adult bronchoscopy patients",
"Xylometazoline nasal spray significantly reduced nasal bleeding during bronchoscopy compared to no premedication. Historically foundational but old methodology, no direct comparator to patency testing."
),
(
"Lam JY et al. (2019) [Ref 5]",
"Hong Kong",
"Prospective cohort; patients undergoing nasal endoscopy (rhinoscopy)",
"Oxymetazoline + lidocaine combination significantly reduced pain and procedure duration compared to lidocaine alone. Supports oxymetazoline benefit but limited to rhinoscopy, not bronchoscopy."
),
(
"Bilgen C et al. (2017) [Ref 6]",
"Turkey",
"Prospective RCT; nasal endoscopy; 4-arm study (oxymetazoline ± lidocaine)",
"Oxymetazoline achieved best nasal decongestion (p<0.001); oxymetazoline + lidocaine gave lowest pain and shortest procedure time (p<0.05). Transient MBP rise with oxymetazoline. Gap: nasal bronchoscopy-specific data lacking; no patency test arm."
),
(
"Ottaviano G & Fokkens WJ (2016) [Ref 7]",
"Italy/Netherlands",
"Systematic review; techniques for measuring nasal airflow",
"Peak nasal inspiratory flow (PNIF) is a simple, reproducible, clinically valid measure of nasal patency. The simple alternating occlusion test (subjective PNIF) shows good correlation with rhinomanometry for identifying more patent nostril. Supports use of nasal patency test as a rational comparator."
),
]
for ri, row_data in enumerate(lit_rows, start=1):
for ci, val in enumerate(row_data):
lit_table.cell(ri, ci).text = val
for para in lit_table.cell(ri, ci).paragraphs:
para.paragraph_format.space_before = Pt(3)
para.paragraph_format.space_after = Pt(3)
doc.add_paragraph()
# C5. Materials & Methods
add_heading(doc, "Materials & Methods", level=3, bold=True)
p_sd = doc.add_paragraph()
p_sd.add_run("Study Design: ").bold = True
p_sd.add_run("Prospective, open-label, Randomized Controlled Trial (parallel arm, 1:1 allocation)")
p_ss = doc.add_paragraph()
p_ss.add_run("Study Setting: ").bold = True
p_ss.add_run("Department of Pulmonary Medicine, Meenakshi Medical College Hospital & Research Institute (MMCHRI), Kanchipuram, Tamil Nadu – a tertiary care teaching hospital")
p_dur = doc.add_paragraph()
p_dur.add_run("Study Duration: ").bold = True
p_dur.add_run("12 months (July 2026 to June 2027) including enrolment, data collection, and analysis")
p_pop = doc.add_paragraph()
p_pop.add_run("Study Population: ").bold = True
p_pop.add_run("Adult patients referred to the Pulmonary Medicine Department for elective diagnostic or therapeutic flexible bronchoscopy via the nasal route")
# Inclusion / Exclusion
doc.add_paragraph().add_run("Inclusion Criteria:").bold = True
inc = [
"Age ≥ 18 years",
"Indication for elective flexible bronchoscopy (diagnostic or therapeutic)",
"Bronchoscopy planned by the nasal route",
"Willing to provide written informed consent",
"Able to comply with study procedures",
]
for item in inc:
add_bullet(doc, item)
doc.add_paragraph().add_run("Exclusion Criteria:").bold = True
exc = [
"Emergency bronchoscopy",
"Active or recent (<4 weeks) epistaxis or nasal bleeding disorder",
"Known nasal polyps, severe nasal septal deviation, or recent nasal surgery (<3 months)",
"Known allergy or hypersensitivity to oxymetazoline or any alpha-adrenergic agonist",
"Hypertension with systolic BP > 180 mmHg or diastolic > 110 mmHg on the day of procedure",
"Severe cardiac arrhythmia, uncontrolled hyperthyroidism, or closed-angle glaucoma",
"Pregnant or lactating females",
"Patients already on intranasal steroids or decongestants within the past 48 hours",
"Planned oral route bronchoscopy",
"Inability to perform nasal patency test (e.g., permanent tracheostomy)",
]
for item in exc:
add_bullet(doc, item)
# Sampling
doc.add_paragraph().add_run("Sampling:").bold = True
add_para(doc, "Sampling Frame: All consecutive adult patients presenting for elective nasal flexible bronchoscopy at MMCHRI during the study period.", indent=True)
add_para(doc, "Sampling Method: Consecutive enrolment followed by computer-generated block randomisation (block size 4–6) stratified by sex.", indent=True)
p_ssz = doc.add_paragraph()
p_ssz.paragraph_format.left_indent = Cm(1)
p_ssz.add_run("Sample Size with Calculation:").bold = True
ssz_text = (
"Based on literature, the expected rate of epistaxis with nasal bronchoscopy without a decongestant is "
"approximately 30–35%. Studies on nasal endoscopy with oxymetazoline suggest a reduction in epistaxis "
"to approximately 10–12%. "
"Using the two-proportion z-test formula:\n\n"
" n = [Z(α/2) + Z(β)]² × [P1(1–P1) + P2(1–P2)] / (P1–P2)²\n\n"
"With P1 (control) = 0.32, P2 (intervention) = 0.12, α = 0.05 (Z = 1.96), β = 0.20 (power 80%, Z = 0.84):\n"
" n ≈ 55 per group\n"
"Adding 15% for dropouts/procedural failures: n = 63 per group.\n"
"Total sample size: 126 patients (63 per arm).\n"
"Sample size calculated using OpenEpi version 3.0 / PASS software."
)
for line in ssz_text.split("\n"):
if line.strip():
p = doc.add_paragraph()
p.paragraph_format.left_indent = Cm(1.5)
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(2)
p.add_run(line)
# Study Tools
doc.add_paragraph()
p_tool = doc.add_paragraph()
p_tool.add_run("Study Tools:").bold = True
tools_text = [
"1. Case Report Form (CRF): A pre-tested structured proforma in English and Tamil capturing demographics, clinical history, bronchoscopy indication, pre-procedure vital signs, intra-procedure events, and post-procedure status. (Copy enclosed as Annexure I)",
"2. Visual Analogue Scale (VAS): 10 cm unmarked VAS for patient-reported pain/discomfort and operator-rated ease of bronchoscope passage (0 = no pain/very easy; 10 = worst pain/very difficult).",
"3. Oxymetazoline 0.05% Nasal Drops (Iliadin®): Standard commercially available formulation. Two drops instilled in the selected nostril 10 minutes before bronchoscopy under nursing supervision.",
"4. Nasal Patency Test (Alternating Occlusion Breath Test): The patient occludes each nostril alternately while the investigator observes breath-fogging on a cold metallic tongue depressor/mirror. The nostril with greater condensation zone is selected. Optionally supplemented with handheld peak nasal inspiratory flow (PNIF) meter (Clement Clarke, UK) for objective confirmation.",
"5. Flexible Bronchoscope: Standard adult video bronchoscope (4.8–5.0 mm OD, 2.0 mm working channel) used uniformly for all procedures.",
"6. Stopwatch: To record time from nostril entry to vocal cord visualisation.",
"7. Vital Signs Monitor: Standard monitoring of HR, SpO₂, and NIBP pre-, intra-, and post-procedure.",
]
for t in tools_text:
p = doc.add_paragraph()
p.paragraph_format.left_indent = Cm(1)
p.paragraph_format.space_before = Pt(3)
p.paragraph_format.space_after = Pt(3)
p.add_run(t)
# Variables
doc.add_paragraph()
add_heading(doc, "List of Variables and Their Measurement Methods", level=3, bold=True)
var_table = doc.add_table(rows=9, cols=5)
var_table.style = "Table Grid"
var_headers = ["S. No.", "Name of Variable", "Type", "Scale of Measurement", "Inferential Statistic"]
for ci, h in enumerate(var_headers):
var_table.cell(0, ci).text = h
var_table.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(var_table.cell(0, ci), "D9E1F2")
variables = [
("1", "Intervention (Oxymetazoline vs Nostril Selection)", "Independent / Predictor", "Categorical (Nominal)", "Grouping variable"),
("2", "Epistaxis during procedure", "Primary Outcome", "Categorical (Yes/No) + Severity grading (None/Mild/Moderate/Severe)", "Chi-square test / Fisher's exact test"),
("3", "Ease of bronchoscope passage (operator VAS)", "Secondary Outcome", "Quantitative (Continuous: 0–10)", "Independent t-test / Mann-Whitney U"),
("4", "Patient pain/discomfort (VAS)", "Secondary Outcome", "Quantitative (Continuous: 0–10)", "Independent t-test / Mann-Whitney U"),
("5", "Time to vocal cord visualisation (seconds)", "Secondary Outcome", "Quantitative (Continuous)", "Independent t-test"),
("6", "Procedural failure rate", "Secondary Outcome", "Categorical (Yes/No)", "Chi-square / Fisher's exact"),
("7", "Heart rate change (bpm)", "Secondary Outcome", "Quantitative (Continuous)", "Paired t-test within group; Independent t-test between groups"),
("8", "Systolic/Diastolic BP change (mmHg)", "Secondary Outcome", "Quantitative (Continuous)", "As above"),
]
for ri, row in enumerate(variables, start=1):
for ci, val in enumerate(row):
var_table.cell(ri, ci).text = val
doc.add_paragraph()
# Data collection procedure
add_heading(doc, "Data Collection Procedure", level=3, bold=True)
procedure = [
"Step 1: Screening – Consecutive eligible patients with a procedure request for nasal flexible bronchoscopy will be identified in the bronchoscopy unit.",
"Step 2: Consent – Written informed consent will be obtained in English and Tamil by the principal investigator or co-investigator.",
"Step 3: Baseline Assessment – Demographics, comorbidities, indication for bronchoscopy, nasal history, and baseline vital signs (HR, BP, SpO₂) will be recorded.",
"Step 4: Randomisation – The patient will be randomised (computer-generated sealed opaque envelope) to either:\n - Group A (Intervention): Two drops of oxymetazoline 0.05% instilled in the selected nostril (selected by nurse based on visual inspection) 10 minutes before bronchoscopy.\n - Group B (Control): Nostril selection by the nasal patency test (alternating occlusion breath test ± PNIF) performed by the bronchoscopist immediately before the procedure; no decongestant.",
"Step 5: Bronchoscopy – Standard nasal flexible bronchoscopy performed with topical lidocaine (2%, spray and instillation as per unit protocol). All procedures performed by the same bronchoscopist or supervised trainee under direct supervision to minimise operator variability.",
"Step 6: Intra-procedure Recording – Presence and grade of epistaxis, VAS for ease of passage, time to vocal cord visualisation, any procedural adverse events, and haemodynamic parameters.",
"Step 7: Post-procedure – Patient VAS for pain/discomfort, vital signs at 15 min, and documentation of any drug adverse events.",
"Step 8: Data Entry & Analysis – Data entered into Microsoft Excel; statistical analysis in SPSS v26.0 or R.",
]
for step in procedure:
p = doc.add_paragraph()
p.paragraph_format.left_indent = Cm(0.8)
p.paragraph_format.space_before = Pt(3)
p.paragraph_format.space_after = Pt(3)
p.add_run(step)
# Flowchart note
doc.add_paragraph()
p_flow = doc.add_paragraph()
p_flow.add_run("Algorithm / Flow Chart:").bold = True
p_flow.add_run(
" [Eligible Patients → Consent → Baseline Assessment → Randomisation (Sealed Envelope) → "
"Group A: Oxymetazoline 0.05% nasal drops → Bronchoscopy | "
"Group B: Nasal Patency Test → Nostril Selection → Bronchoscopy → "
"Intra-procedure Data → Post-procedure Assessment → Data Analysis]"
)
# Operational Definitions
doc.add_paragraph()
add_heading(doc, "Operational Definitions", level=3, bold=True)
defs = [
("Epistaxis", "Any visible bleeding from the nostril during or immediately after (within 15 min of) the bronchoscopy procedure. Graded as: None (no bleeding), Mild (few drops, self-limiting, no intervention), Moderate (requires suction, not obscuring view), Severe (obscures view, requires procedure abandonment or nasal packing)."),
("Nasal Patency Test", "The alternating occlusion breath test: the patient blocks one nostril with a finger while breathing through the other; this is repeated for the opposite side. The bronchoscopist identifies the side with demonstrably greater airflow. Optionally, PNIF is measured bilaterally; the nostril with higher PNIF value is selected."),
("Oxymetazoline Preparation", "Instillation of two drops of oxymetazoline HCl 0.05% (Iliadin® or equivalent generic) into the selected nostril 10 ± 2 minutes before introduction of the bronchoscope."),
("Ease of Passage (Operator VAS)", "A 10 cm visual analogue scale completed by the operator immediately after passing the bronchoscope through the nasal cavity into the nasopharynx. Anchors: 0 = 'passed without any resistance' to 10 = 'extreme resistance, near impossible'."),
("Procedural Failure", "Inability to pass the flexible bronchoscope through the assigned nostril despite a second attempt, necessitating switching to the contralateral nostril or the oral route."),
("Time to Vocal Cord Visualisation", "Time in seconds from the moment the tip of the bronchoscope enters the nostril to the moment both vocal cords are first clearly visualised on the monitor."),
]
for term, defn in defs:
p_def = doc.add_paragraph()
p_def.paragraph_format.left_indent = Cm(0.8)
p_def.paragraph_format.space_before = Pt(3)
p_def.paragraph_format.space_after = Pt(3)
p_def.add_run(f"{term}: ").bold = True
p_def.add_run(defn)
# Data Analysis
doc.add_paragraph()
add_heading(doc, "Data Analysis", level=3, bold=True)
analysis_table = doc.add_table(rows=8, cols=5)
analysis_table.style = "Table Grid"
for ci, h in enumerate(["S. No.", "Variable", "Scale", "Descriptive Statistic", "Inferential Statistic"]):
analysis_table.cell(0, ci).text = h
analysis_table.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(analysis_table.cell(0, ci), "D9E1F2")
analysis_rows = [
("1", "Epistaxis rate", "Categorical", "Frequency (%)","Chi-square / Fisher's exact test"),
("2", "Ease of passage (VAS)", "Continuous", "Mean ± SD","Independent t-test or Mann-Whitney U"),
("3", "Patient discomfort (VAS)", "Continuous", "Mean ± SD","Independent t-test or Mann-Whitney U"),
("4", "Time to vocal cord (s)", "Continuous", "Mean ± SD","Independent t-test"),
("5", "Procedural failure", "Categorical", "Frequency (%)","Chi-square / Fisher's exact test"),
("6", "HR/BP change", "Continuous", "Mean ± SD","Paired t-test (within); Independent t-test (between)"),
("7", "Adverse events", "Categorical", "Frequency (%)","Descriptive; Fisher's exact"),
]
for ri, row in enumerate(analysis_rows, start=1):
for ci, val in enumerate(row):
analysis_table.cell(ri, ci).text = val
doc.add_paragraph()
add_para(doc, "All tests will be two-tailed; p < 0.05 will be considered statistically significant. "
"Categorical variables will be summarised as frequency and percentage; continuous variables as mean ± SD "
"(or median + IQR if non-normally distributed by Shapiro-Wilk test). "
"Data entry: Microsoft Excel 2021. Statistical analysis: IBM SPSS Statistics v26 / R version 4.3.")
# Expected Outcomes
doc.add_paragraph()
add_heading(doc, "Expected Outcomes", level=3, bold=True)
eo_text = (
"The study is expected to demonstrate whether intranasal oxymetazoline 0.05% provides a clinically "
"meaningful reduction in epistaxis (primary endpoint) compared to simple nostril selection by nasal "
"patency test. If oxymetazoline is superior, the findings will support its routine inclusion in "
"pre-bronchoscopy protocols. If non-inferior or equivalent, the results will support a simpler, "
"drug-free, cost-effective approach of nostril selection, reducing drug-related adverse effects and cost. "
"Secondary outcomes will characterise differences in procedural ease, patient comfort, and "
"haemodynamic safety between the two approaches."
)
add_para(doc, eo_text)
# Dummy tables
doc.add_paragraph()
p_dummy = doc.add_paragraph()
p_dummy.add_run("Dummy Tables:").bold = True
# Dummy Table 1
dummy1_label = doc.add_paragraph()
dummy1_label.add_run("Table 1: Comparison of Primary Outcome (Epistaxis Rate) between Groups").bold = True
dummy1_label.alignment = WD_ALIGN_PARAGRAPH.CENTER
d1 = doc.add_table(rows=4, cols=4)
d1.style = "Table Grid"
for ci, h in enumerate(["Epistaxis Grade", "Group A – Oxymetazoline (n=63)", "Group B – Nostril Selection (n=63)", "p-value"]):
d1.cell(0, ci).text = h
d1.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(d1.cell(0, ci), "D9E1F2")
d1_rows = [("None / Mild", "__ (__%)","__ (__%)",""),("Moderate / Severe","__ (__%)","__ (__%)",""),("Total epistaxis rate","__ (__%)","__ (__%)","p = __")]
for ri, row in enumerate(d1_rows, start=1):
for ci, val in enumerate(row):
d1.cell(ri, ci).text = val
doc.add_paragraph()
dummy2_label = doc.add_paragraph()
dummy2_label.add_run("Table 2: Comparison of Secondary Outcomes between Groups").bold = True
dummy2_label.alignment = WD_ALIGN_PARAGRAPH.CENTER
d2 = doc.add_table(rows=6, cols=4)
d2.style = "Table Grid"
for ci, h in enumerate(["Outcome", "Group A – Oxymetazoline (n=63)", "Group B – Nostril Selection (n=63)", "p-value"]):
d2.cell(0, ci).text = h
d2.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(d2.cell(0, ci), "D9E1F2")
d2_rows = [
("Ease of passage (VAS 0–10)", "Mean ± SD", "Mean ± SD", "p = __"),
("Patient discomfort (VAS 0–10)", "Mean ± SD", "Mean ± SD", "p = __"),
("Time to vocal cord (s)", "Mean ± SD", "Mean ± SD", "p = __"),
("Procedural failure (n, %)", "__ (__%)", "__ (__%)", "p = __"),
("Systolic BP change (mmHg)", "Mean ± SD", "Mean ± SD", "p = __"),
]
for ri, row in enumerate(d2_rows, start=1):
for ci, val in enumerate(row):
d2.cell(ri, ci).text = val
doc.add_paragraph()
# Inter-departmental collaboration
add_heading(doc, "Inter-Departmental Collaboration", level=3, bold=True)
add_para(doc, "This study will be conducted entirely within the Department of Pulmonary Medicine, MMCHRI. "
"The study uses a standard marketed drug (oxymetazoline 0.05%), routine bronchoscopy equipment, "
"and a non-invasive clinical test; no inter-departmental collaboration or special laboratory support "
"is required. Monitoring of vital signs will be conducted by nursing staff of the bronchoscopy unit. "
"Pharmacy dispensing of oxymetazoline will be coordinated through the institutional pharmacy.")
# Ethical Considerations
doc.add_paragraph()
add_heading(doc, "Ethical Considerations", level=3, bold=True)
ethics_points = [
("Vulnerable Population", "No vulnerable populations (minors, prisoners, pregnant women) are included. Pregnant and lactating women are explicitly excluded."),
("Risk Category", "Minimal to low risk. Oxymetazoline 0.05% is an approved, widely marketed topical nasal decongestant. Transient hypertension and reflex bradycardia are known but uncommon side-effects; continuous monitoring will be maintained throughout the procedure. The nasal patency test (alternating occlusion breath test / PNIF) is entirely non-invasive."),
("Benefits", "Patients in both groups will receive standard-of-care bronchoscopy. Findings will directly inform best practice for pre-bronchoscopy nasal preparation, benefiting future patients."),
("Risk-Benefit Analysis", "Risks are minimal and transient; benefits include contribution to clinical evidence and potentially improved procedural safety for future patients."),
("Privacy and Confidentiality", "All data will be coded with a unique study ID. Personal identifiers will not appear in the study database or publications. Data will be stored in a locked cabinet and password-protected electronic files accessible only to the investigators."),
("Informed Consent", "Written informed consent in English and Tamil (translated and back-translated by certified translator) will be obtained by the principal investigator before enrolment. Patients will be explicitly informed of their right to withdraw at any time without loss of medical care."),
("Conflict of Interest", "None. No funding from oxymetazoline manufacturers."),
("Regulatory", "IEC approval will be obtained prior to commencing the study. The trial will be registered on the Clinical Trials Registry – India (CTRI) before first enrolment. Being a study with an approved marketed drug in its standard approved use, DCGI permission is not mandatorily required; however, CTRI registration is mandatory and will be completed."),
]
for heading, content in ethics_points:
p_eth = doc.add_paragraph()
p_eth.paragraph_format.left_indent = Cm(0.8)
p_eth.paragraph_format.space_before = Pt(3)
p_eth.paragraph_format.space_after = Pt(3)
p_eth.add_run(f"{heading}: ").bold = True
p_eth.add_run(content)
# Implications
doc.add_paragraph()
add_heading(doc, "Implications of the Study", level=3, bold=True)
impl_text = (
"This trial addresses a common, everyday clinical question faced by every pulmonologist performing nasal "
"bronchoscopy. The results will:\n"
"1. Provide the first high-quality RCT evidence comparing pharmacological nasal preparation vs anatomical "
"nostril selection for nasal bronchoscopy.\n"
"2. If oxymetazoline is superior: strengthen existing guideline recommendations with RCT-level evidence and "
"potentially establish a standard pre-procedure protocol.\n"
"3. If equivalent to nostril selection: support a simpler, cost-free, drug-side-effect-free approach, "
"with implications for resource-limited settings and patients with cardiovascular contraindications to "
"sympathomimetics.\n"
"4. Impact institutional bronchoscopy protocols and potentially inform national guidelines (NTF-India, "
"NCCP guidelines) on bronchoscopy preparation.\n"
"5. Provide a reproducible methodological template for future bronchoscopy preparation studies."
)
for line in impl_text.split("\n"):
if line.strip():
p = doc.add_paragraph()
p.paragraph_format.left_indent = Cm(0.8)
p.paragraph_format.space_before = Pt(3)
p.paragraph_format.space_after = Pt(3)
p.add_run(line)
# Budget
doc.add_paragraph()
add_heading(doc, "Budget", level=3, bold=True)
bud_table = doc.add_table(rows=7, cols=3)
bud_table.style = "Table Grid"
for ci, h in enumerate(["S. No.", "Item", "Estimated Cost (INR)"]):
bud_table.cell(0, ci).text = h
bud_table.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(bud_table.cell(0, ci), "D9E1F2")
budget_rows = [
("1", "Oxymetazoline 0.05% nasal drops (Iliadin® 10 mL × 70 bottles @ ₹ 80/bottle)", "₹ 5,600"),
("2", "PNIF meters (Clement Clarke Youlten PNIF meter × 2)", "₹ 6,000"),
("3", "Printed CRF and stationery", "₹ 1,500"),
("4", "Statistical software / data entry", "₹ 3,000"),
("5", "Miscellaneous (consent forms printing, translations)", "₹ 2,000"),
("Total", "", "₹ 18,100 (estimated; self-funded)"),
]
for ri, row in enumerate(budget_rows, start=1):
for ci, val in enumerate(row):
bud_table.cell(ri, ci).text = val
# Timeframe / Gantt Chart
doc.add_paragraph()
add_heading(doc, "Time Frame / Gantt Chart", level=3, bold=True)
gantt_table = doc.add_table(rows=8, cols=14)
gantt_table.style = "Table Grid"
gantt_table.cell(0, 0).text = "Activity"
gantt_table.cell(0, 0).paragraphs[0].runs[0].bold = True
set_cell_bg(gantt_table.cell(0, 0), "D9E1F2")
months = ["M1","M2","M3","M4","M5","M6","M7","M8","M9","M10","M11","M12","M13"]
for i, m in enumerate(months):
gantt_table.cell(0, i+1).text = m
gantt_table.cell(0, i+1).paragraphs[0].runs[0].bold = True
set_cell_bg(gantt_table.cell(0, i+1), "D9E1F2")
gantt_activities = [
("IEC submission & clearance", [1,2]),
("CTRI registration", [2]),
("Patient enrolment & data collection", [3,4,5,6,7,8,9,10]),
("Data cleaning & entry", [8,9,10,11]),
("Statistical analysis", [10,11,12]),
("Manuscript writing", [11,12,13]),
("Submission for publication", [13]),
]
for ri, (activity, active_months) in enumerate(gantt_activities, start=1):
gantt_table.cell(ri, 0).text = activity
for m in active_months:
cell = gantt_table.cell(ri, m)
set_cell_bg(cell, "4472C4")
cell.text = "●"
for p in cell.paragraphs:
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph()
# References
add_heading(doc, "References", level=3, bold=True)
refs = [
"González-Aguirre JE, Chavarría Martínez U, Rodríguez Mier D, Acosta Moreno M, Mercado Longoria R. Bronchoscope insertion route and patient comfort during flexible bronchoscopy. Int J Tuberc Lung Dis. 2015;19(3):355-9. doi:10.5588/ijtld.14.0632",
"Du Rand IA, Blaikley J, Booton R, et al.; British Thoracic Society Bronchoscopy Guideline Group. British Thoracic Society guideline for diagnostic flexible bronchoscopy in adults. Thorax. 2013;68(Suppl 1):i1-i44.",
"Asano F, Aoe M, Ohsaki Y, et al. Deaths and complications associated with respiratory endoscopy: a survey by the Japan Society for Respiratory Endoscopy in 2010. Respirology. 2012;17(3):478-85.",
"Bilgen C, Bilgen IG, Oztürkcan S, Katılmış H. Premedication Methods in Nasal Endoscopy: A Prospective, Randomized, Double-Blind Study. J Int Adv Otol. 2017;13(1):101-5. [PMC5426394]",
"Eccles R. A role for the nasal cycle in respiratory defence. Eur Respir J. 1996;9(2):371-6.",
"Ottaviano G, Fokkens WJ. Measurements of nasal airflow and patency: a critical review with emphasis on the use of peak nasal inspiratory flow in daily practice. Allergy. 2016;71(2):162-74. doi:10.1111/all.12778",
"Ottaviano G. Nasal Patency Measurement: State of the Art of Acoustic Rhinometry. Facial Plast Surg. 2024;40(3):300-9. PMID:38016661",
"Lam JY, Loke TK, Lau KS, Wong JK. Oxymetazoline plus lidocaine for nasal endoscopy. Rhinology. 2018;56(2):167-72. PMID:29785414",
"Dreher A, de la Chaux R, Grevers G, Kastenbauer E. Pre-treatment with oxymetazoline during flexible nasal endoscopy: effects on nasal decongestion and patient comfort. Eur Arch Otorhinolaryngol. 1999;256(8):395-8.",
"Mohan A, Madan K, Hadda V, et al. Guidelines for diagnostic flexible bronchoscopy in adults: Joint Indian Chest Society/National College of Chest Physicians (I)/Indian Association for Bronchology recommendations. Lung India. 2019;36(Suppl):S37-S89.",
]
for ri, ref in enumerate(refs, start=1):
p_ref = doc.add_paragraph()
p_ref.paragraph_format.left_indent = Cm(1.0)
p_ref.paragraph_format.first_line_indent = Cm(-1.0)
p_ref.paragraph_format.space_before = Pt(3)
p_ref.paragraph_format.space_after = Pt(3)
p_ref.add_run(f"{ri}. {ref}")
doc.add_page_break()
# ══════════════════════════════════════════════════════════════════════════════
# SECTION D – CHECKLIST & DECLARATION
# ══════════════════════════════════════════════════════════════════════════════
add_heading(doc, "SECTION D – CHECKLIST & DECLARATION", level=2, underline=True)
checklist_table = doc.add_table(rows=18, cols=5)
checklist_table.style = "Table Grid"
cl_hdrs = ["S. No.", "Item", "Yes", "No", "NA*"]
for ci, h in enumerate(cl_hdrs):
checklist_table.cell(0, ci).text = h
checklist_table.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(checklist_table.cell(0, ci), "D9E1F2")
checklist_items = [
("1", "Copy of detailed protocol in prescribed format", "☑", "", ""),
("2", "Participant information sheet & Informed consent (English & local language)", "☑", "", ""),
("3", "Assent form for minors (if applicable)", "", "", "☑"),
("4", "Proforma / Case Report Form (English & local language)", "☑", "", ""),
("5", "Brief updated CV of all investigators", "☑", "", ""),
("6", "Agreement letter from other departmental heads (inter-departmental studies)", "", "", "☑"),
("7", "Letter of approval from collaborating institutions / DCGI / CTRI", "☑ (CTRI registration pending)", "", ""),
("8", "Declaration signed by all investigators and forwarded by HOD", "☑", "", ""),
("9", "Investigator's brochure (IND studies)", "", "", "☑"),
("10", "Advertisement/material to recruit participants", "", "☑", ""),
("11", "Proposed compensation/reimbursement for research-related injury", "", "", "☑"),
("12", "Insurance coverage documents", "", "", "☑"),
("13", "Product information & regulatory clearances (oxymetazoline – marketed drug)", "☑", "", ""),
("14", "Funding agency / sponsor details", "", "", "☑"),
("15", "Soft copy sent to iecmmchri@mmchri.ac.in", "☑", "", ""),
("16", "Hard copy submitted to IEC office, Dept of Community Medicine, MMCHRI", "☑", "", ""),
("17", "*NA – Not Applicable", "", "", ""),
]
for ri, row in enumerate(checklist_items, start=1):
for ci, val in enumerate(row):
checklist_table.cell(ri, ci).text = val
doc.add_paragraph()
# Declaration
decl_table = doc.add_table(rows=6, cols=3)
decl_table.style = "Table Grid"
decl_merge = decl_table.cell(0, 0).merge(decl_table.cell(0, 2))
decl_merge.text = (
"Declaration\n"
"I/We certify that the information provided in this application is complete and correct. "
"I/We confirm that all investigators have approved the submitted version of proposal/related documents "
"and have complied with all relevant requirements for research involving human participants."
)
for ci, h in enumerate(["Name of Investigator", "Department", "Signature with Date"]):
decl_table.cell(1, ci).text = h
decl_table.cell(1, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(decl_table.cell(1, ci), "D9E1F2")
for ri in range(2, 5):
decl_table.cell(ri, 0).text = f"Investigator {ri-1}: _______________"
decl_table.cell(ri, 1).text = "Pulmonary Medicine, MMCHRI"
decl_table.cell(ri, 2).text = "Signature: _______________ Date: ___/___/______"
hod_merge = decl_table.cell(5, 0).merge(decl_table.cell(5, 2))
hod_merge.text = "Signature of the Head of the Department (with Date & Seal): ___________________________"
doc.add_page_break()
# ══════════════════════════════════════════════════════════════════════════════
# PARTICIPANT INFORMATION SHEET
# ══════════════════════════════════════════════════════════════════════════════
add_heading(doc, "Participant Information Sheet", level=2, underline=True, center=True)
add_heading(doc, "(English Version)", level=3, center=True)
doc.add_paragraph()
pis_items = [
("Title of the Project", "Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy – A Randomized Controlled Trial"),
("Name of the Investigators", "Dr. ____________________ (Principal Investigator); Dr. ____________________ (Guide); Department of Pulmonary Medicine, MMCHRI, Kanchipuram"),
("Institution", "Meenakshi Medical College Hospital & Research Institute, Kanchipuram"),
]
for label, content in pis_items:
p_pi = doc.add_paragraph()
p_pi.add_run(f"{label}: ").bold = True
p_pi.add_run(content)
doc.add_paragraph()
pis_content = [
("Purpose of this Study",
"You have been invited to take part in a medical research study. The aim of this study is to find out "
"whether using a nasal decongestant spray (oxymetazoline) before a nasal camera examination of your lungs "
"(bronchoscopy) is better than simply selecting the more open nostril for the procedure. This will help us "
"reduce discomfort and nose bleeding during the procedure."),
("Procedure/Methods",
"If you agree to participate, you will be randomly assigned (like a coin toss) to one of two groups:\n"
"• Group 1: A small amount of a commercially available nose decongestant (oxymetazoline 0.05%) will be "
"placed in one nostril about 10 minutes before your bronchoscopy.\n"
"• Group 2: The doctor will assess which of your nostrils is more open by asking you to breathe through "
"each nostril separately, and will use that nostril for the bronchoscopy.\n"
"The bronchoscopy procedure itself (the camera examination of your airways) will be the same standard "
"procedure for everyone, with the usual local anaesthetic throat/nose spray and sedation as planned by your doctor."),
("Expected Duration of Your Participation",
"Your participation in this study involves only the preparation step before your already-planned bronchoscopy. "
"There is no additional visit required. The follow-up ends 15 minutes after your procedure."),
("Benefits",
"You will receive your standard bronchoscopy as planned. The additional preparation (nasal decongestant or "
"nostril selection) is intended to make the procedure safer and more comfortable. The study findings will help "
"improve care for future patients undergoing this procedure."),
("Risks",
"Oxymetazoline nose drops are a widely used, approved medicine available over the counter. Rare side-effects "
"include a brief increase in blood pressure and occasional headache. Your blood pressure and heart rate will "
"be monitored throughout the procedure. The nose-breathing test (Group 2) carries no risk whatsoever."),
("Confidentiality",
"All information you provide and all data collected will be kept strictly confidential. You will be identified "
"only by a study code number. Your name will not appear in any publication or report."),
("Treatment for Research-Related Injury",
"Should you experience any injury directly caused by your participation in this research, you will receive "
"free medical treatment at MMCHRI. Please immediately report any unusual symptoms to the study team."),
("Compensation",
"There is no financial compensation for participating in this study. There are no additional costs to you."),
("Voluntary Participation",
"Your participation is entirely voluntary. You may withdraw from the study at any time without giving any reason "
"and without affecting your medical care or your rights in any way."),
("Use of Data",
"The data collected will be used solely for the purposes of this study and any directly related scientific "
"publications. Data will not be shared with third parties for commercial use."),
("Contact",
"For any queries or concerns about this study, please contact:\n"
"Principal Investigator: Dr. ____________________, Dept. of Pulmonary Medicine, MMCHRI\n"
"Phone: ____________________ Email: ____________________\n"
"IEC Chairperson: Institutional Ethics Committee, MMCHRI, Kanchipuram Email: iecmmchri@mmchri.ac.in"),
]
for label, content in pis_content:
p_label = doc.add_paragraph()
p_label.add_run(label).bold = True
p_label.paragraph_format.space_before = Pt(6)
for line in content.split("\n"):
if line.strip():
p_c = doc.add_paragraph()
p_c.paragraph_format.left_indent = Cm(1)
p_c.paragraph_format.space_before = Pt(2)
p_c.paragraph_format.space_after = Pt(2)
p_c.add_run(line.strip("• "))
doc.add_paragraph()
sig_pis = doc.add_table(rows=2, cols=2)
sig_pis.style = "Table Grid"
sig_pis.cell(0, 0).text = "Signature of the Investigator: _______________"
sig_pis.cell(0, 1).text = "Date: ___/___/______"
sig_pis.cell(1, 0).text = "Signature of the Participant: _______________"
sig_pis.cell(1, 1).text = "Date: ___/___/______"
doc.add_page_break()
# ══════════════════════════════════════════════════════════════════════════════
# INFORMED CONSENT FORM
# ══════════════════════════════════════════════════════════════════════════════
add_heading(doc, "Informed Consent Form", level=2, underline=True, center=True)
icf_items = [
("Study Title", "Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy – A Randomized Controlled Trial"),
("Principal Investigator", "Dr. ____________________, Dept. of Pulmonary Medicine, MMCHRI, Kanchipuram"),
("Institution", "Meenakshi Medical College Hospital & Research Institute, Kanchipuram"),
("Participant's Name", "___________________________________________________"),
("Date of Birth / Age", "___________________ / _______ years"),
]
for label, content in icf_items:
p_icf = doc.add_paragraph()
p_icf.add_run(f"{label}: ").bold = True
p_icf.add_run(content)
doc.add_paragraph()
consents = [
"I confirm that I have read / have been explained (as applicable) and have understood the Participant Information Sheet dated ____________ for the above study. I have had the opportunity to ask questions and have received satisfactory answers.",
"I understand that my participation in the study is voluntary and that I am free to withdraw at any time, without giving any reason, without my medical care or legal rights being affected.",
"I understand that authorised representatives of the Sponsor, the Ethics Committee, and regulatory authorities may inspect my health records for the purpose of monitoring the study. I agree to this access. I understand that my identity will remain confidential in any report or publication.",
"I agree not to restrict the use of any data or results arising from this study, provided they are used only for scientific purposes.",
"I agree to take part in the above study.",
]
for i, item in enumerate(consents, start=1):
p_c = doc.add_paragraph()
p_c.paragraph_format.left_indent = Cm(0.5)
p_c.paragraph_format.space_before = Pt(4)
p_c.paragraph_format.space_after = Pt(4)
p_c.add_run(f"{i}. {item}")
doc.add_paragraph()
sig_icf = doc.add_table(rows=5, cols=2)
sig_icf.style = "Table Grid"
sig_rows_icf = [
("Signature of the Participant: _______________", "Date: ___/___/______"),
("Signature of the Witness: _______________", "Date: ___/___/______"),
("Name & Address of the Witness:", ""),
("",""),
("Signature of the Investigator: _______________", "Date: ___/___/______"),
]
for ri, (c0, c1) in enumerate(sig_rows_icf):
sig_icf.cell(ri, 0).text = c0
sig_icf.cell(ri, 1).text = c1
doc.add_page_break()
# ══════════════════════════════════════════════════════════════════════════════
# CASE REPORT FORM (PROFORMA) – ANNEXURE I
# ══════════════════════════════════════════════════════════════════════════════
add_heading(doc, "Annexure I: Case Report Form (Proforma)", level=2, underline=True, center=True)
add_para(doc, "Study: Intranasal Oxymetazoline vs Nostril Selection by Nasal Patency Test for Facilitating Nasal Bronchoscopy – RCT", bold=True, space_before=4, space_after=6)
add_para(doc, "Study ID: ___________ Date: ___/___/______ Group (Circle): A – Oxymetazoline / B – Nostril Selection", space_before=2, space_after=6)
doc.add_paragraph().add_run("SECTION 1: DEMOGRAPHICS").bold = True
crf1 = doc.add_table(rows=5, cols=2)
crf1.style = "Table Grid"
crf1_rows = [
("Name (Initials only)", "IP/OP No.:"),
("Age (years)", "Sex: M / F"),
("Diagnosis / Indication for Bronchoscopy", "Referring Dept:"),
("Height (cm)", "Weight (kg)"),
("Comorbidities (HTN / DM / CAD / Others)", "Current medications:"),
]
for ri, (c0, c1) in enumerate(crf1_rows):
crf1.cell(ri, 0).text = c0
crf1.cell(ri, 1).text = c1
doc.add_paragraph()
doc.add_paragraph().add_run("SECTION 2: PRE-PROCEDURE ASSESSMENT").bold = True
crf2 = doc.add_table(rows=4, cols=4)
crf2.style = "Table Grid"
crf2_h = ["Parameter", "Value", "Parameter", "Value"]
for ci, h in enumerate(crf2_h):
crf2.cell(0, ci).text = h
crf2.cell(0, ci).paragraphs[0].runs[0].bold = True
set_cell_bg(crf2.cell(0, ci), "D9E1F2")
crf2_data = [
("HR (bpm)", "__", "SpO₂ (%)", "__"),
("Systolic BP (mmHg)", "__", "Diastolic BP (mmHg)", "__"),
("Nasal Patency Test (Group B only) – Right PNIF (L/min)", "__", "Left PNIF (L/min)", "__"),
]
for ri, row in enumerate(crf2_data, start=1):
for ci, val in enumerate(row):
crf2.cell(ri, ci).text = val
doc.add_paragraph()
doc.add_paragraph().add_run("SECTION 3: INTERVENTION").bold = True
crf3 = doc.add_table(rows=3, cols=2)
crf3.style = "Table Grid"
crf3_data = [
("Group A: Oxymetazoline 0.05% drops applied to (L / R) nostril at ___ hrs", "Time of bronchoscopy start: ___ hrs"),
("Group B: Nostril selected (L / R) based on patency test", "Selected nostril PNIF (if used): __ L/min"),
("Topical lidocaine 2% spray given: Yes / No", "Sedation used: Yes / No Agent: ____________"),
]
for ri, (c0, c1) in enumerate(crf3_data):
crf3.cell(ri, 0).text = c0
crf3.cell(ri, 1).text = c1
doc.add_paragraph()
doc.add_paragraph().add_run("SECTION 4: INTRA-PROCEDURE DATA").bold = True
crf4 = doc.add_table(rows=6, cols=2)
crf4.style = "Table Grid"
crf4_data = [
("Epistaxis: None / Mild / Moderate / Severe", "Time to vocal cord visualisation: _____ seconds"),
("Procedural failure (need to switch nostril/route): Yes / No", "Reason if failure: _______________"),
("Operator ease of passage VAS (0–10): ____", "HR at bronchoscope entry (bpm): ____"),
("Systolic BP at entry (mmHg): ____", "Diastolic BP at entry (mmHg): ____"),
("Mucosal trauma observed: Yes / No", "Any other adverse event: _______________"),
("Bronchoscopy indication achieved: Yes / No", "Procedure end time: _____ hrs"),
]
for ri, (c0, c1) in enumerate(crf4_data):
crf4.cell(ri, 0).text = c0
crf4.cell(ri, 1).text = c1
doc.add_paragraph()
doc.add_paragraph().add_run("SECTION 5: POST-PROCEDURE DATA (at 15 minutes)").bold = True
crf5 = doc.add_table(rows=3, cols=2)
crf5.style = "Table Grid"
crf5_data = [
("Patient discomfort VAS (0–10): ____", "HR (bpm): ____"),
("Systolic BP (mmHg): ____", "Diastolic BP (mmHg): ____"),
("Drug adverse event (oxymetazoline): None / Hypertension / Bradycardia / Other: ___", "SpO₂ (%): ____"),
]
for ri, (c0, c1) in enumerate(crf5_data):
crf5.cell(ri, 0).text = c0
crf5.cell(ri, 1).text = c1
doc.add_paragraph()
p_inv = doc.add_paragraph()
p_inv.add_run("Investigator Signature: _______________ Date: ___/___/______")
# ══════════════════════════════════════════════════════════════════════════════
# CV FORMAT – ANNEXURE II
# ══════════════════════════════════════════════════════════════════════════════
doc.add_page_break()
add_heading(doc, "Annexure II: Format for Curriculum Vitae of Investigator(s)", level=2, underline=True)
cv_fields = [
"Name:",
"Present Affiliation (Job Title, Department & Organisation):",
"Address:",
"Telephone Number:",
"Email Address:",
"Qualifications:",
"Number of Years of Work Experience (after post-graduation):",
"Previous Affiliations (in the last five years):",
"Projects Undertaken in the Last 5 Years:",
"Relevant Research Training/Experience in the Area:",
"Relevant Publications (last five years plus those relevant to current application):",
"Signature:",
"Date:",
]
for field in cv_fields:
p_cv = doc.add_paragraph()
p_cv.add_run(field).bold = True
p_cv.add_run(" ____________________________________________")
p_cv.paragraph_format.space_before = Pt(4)
p_cv.paragraph_format.space_after = Pt(4)
# ══════════════════════════════════════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════════════════════════════════════
output_path = "/tmp/workspace/bronchoscopy-proposal/IEC_Proposal_Nasal_Bronchoscopy_RCT.docx"
doc.save(output_path)
print(f"Document saved to {output_path}")
cd /tmp/workspace/bronchoscopy-proposal && python3 create_proposal.py 2>&1
python3 -c " from docx import Document doc = Document('/tmp/workspace/bronchoscopy-proposal/IEC_Proposal_Nasal_Bronchoscopy_RCT.docx') # Quick verification paras = [p.text.strip() for p in doc.paragraphs if p.text.strip()] print(f'Total paragraphs: {len(paras)}') print(f'Total tables: {len(doc.tables)}') import os size = os.path.getsize('/tmp/workspace/bronchoscopy-proposal/IEC_Proposal_Nasal_Bronchoscopy_RCT.docx') print(f'File size: {size:,} bytes ({size//1024} KB)') # Print first 30 non-empty paragraphs as a check for p in paras[:30]: print(' >', p[:100]) "
IEC Proposal Nasal Bronchoscopy RCT
Word Document · DOCX