WHO TPT eligibility criteria assessment checklist HIV contacts children healthcare workers 2024
Reading Web Page
https://tbksp.who.int/en/node/36
I now have enough material from WHO consolidated guidelines (2024 edition) and the WHO TB Knowledge Sharing Platform to build a thorough, structured assessment questionnaire. Here it is:
Assessment of Tuberculosis Preventive Therapy (TPT) - Questionnaire / Checklist
Based on: WHO Consolidated Guidelines on Tuberculosis: TB Preventive Treatment (2nd Edition, 2024) and WHO Operational Handbook on Tuberculosis, Module 1 (2023)
SECTION A: PATIENT IDENTIFICATION & DEMOGRAPHICS
#
Question
Response
A1
Patient Name / ID
__________
A2
Age
__________ years / months
A3
Sex
M / F / Other
A4
Date of assessment
__________
A5
Assessed by (name/designation)
__________
A6
Facility name
__________
A7
Country/Region (TB burden category: high / medium / low)
__________
SECTION B: ELIGIBILITY SCREENING - IDENTIFY THE AT-RISK POPULATION
Check all that apply. Any "Yes" flags this person as a TPT candidate (pending TB disease exclusion in Section C).
#
Question
Yes
No
B1
Is this person living with HIV (PLHIV)?
B2
Is this person a household contact of a confirmed or probable TB case?
B3
Is the patient a child < 5 years of age with any exposure to a TB case?
B4
Is this person a child or adolescent (5-14 years) living with HIV?
B5
Is this person receiving anti-TNF therapy (e.g. infliximab, adalimumab)?
B6
Is this person on dialysis (renal replacement therapy)?
B7
Is this person being prepared for an organ or haematopoietic stem cell transplant?
B8
Is this person a prisoner or detained in a correctional facility?
B9
Is this person a healthcare worker in a high TB transmission setting?
B10
Has this person been a close contact of a known MDR/RR-TB case? (requires special regimen - see Section E)
B11
Has this person previously been treated for TB disease and been re-exposed to a TB case?
B12
Has this person previously completed a course of TPT but has since had new close contact with a TB case?
If ALL responses in Section B are "No", the person does not meet current WHO eligibility criteria for TPT. Document and reassess if circumstances change.
SECTION C: RULING OUT ACTIVE TB DISEASE (MANDATORY BEFORE STARTING TPT)
Starting TPT in someone with active TB disease can delay cure and promote drug resistance. This section MUST be completed for ALL eligible patients.
C1 - WHO 4-Symptom Screen (W4SS) - Ask about ALL four symptoms
Symptom
Present (Yes)
Absent (No)
Current cough (of any duration)
Fever
Night sweats
Weight loss or poor weight gain in children
Interpretation:
Adults and adolescents with HIV: Any "Yes" = screen positive; refer for diagnostic workup before starting TPT
PLHIV on ART: W4SS alone is sufficient; if all negative, proceed to TPT
Contacts without HIV: Full clinical evaluation required if any symptom is present
C2 - Additional Symptom Queries (Especially for Contacts)
#
Question
Yes
No
C2a
Haemoptysis (coughing blood)
C2b
Chest pain
C2c
Shortness of breath or difficulty breathing
C2d
Fatigue / loss of energy
C2e
Loss of appetite
C2f
Failure to thrive / faltering growth (children)
C3 - Clinical Examination Findings
#
Finding
Present
Absent
C3a
Lymphadenopathy (especially cervical/axillary)
C3b
Abnormal chest auscultation findings
C3c
Signs of miliary TB or meningeal signs
C3d
Documented weight loss (verify with records)
C3e
Hepatosplenomegaly (children especially)
C4 - Investigations
Investigation
Result
Interpretation
Chest X-ray (CXR) - if available
Normal / Abnormal / Not done
Abnormal = refer for further workup; not a barrier to TPT if unavailable
Sputum smear/GeneXpert (if symptomatic)
Positive / Negative / Not done
Urine LAM (PLHIV with low CD4 or severely ill)
Positive / Negative / Not done
TST (Tuberculin Skin Test)
mm induration / Not done
≥5 mm in HIV; ≥10 mm in general
IGRA (Interferon Gamma Release Assay)
Positive / Negative / Indeterminate / Not done
Note: TB infection testing (TST/IGRA) is NOT required before starting TPT in PLHIV. It is recommended when available for contacts without HIV to determine eligibility, but a negative result should NOT withhold TPT from PLHIV.
C5 - Final TB Disease Exclusion Decision
Decision
Tick
TB disease EXCLUDED - proceed with TPT
TB disease SUSPECTED/CONFIRMED - refer for full TB diagnostic pathway; do NOT start TPT
Inconclusive - further investigation needed before TPT
SECTION D: CONTRAINDICATIONS AND SAFETY SCREENING
#
Question
Yes
No
Action if Yes
D1
Active liver disease (hepatitis, cirrhosis, elevated LFTs > 3x ULN)?
No contraindication; individual risk-benefit assessment
D12
Low body weight / malnutrition?
No contraindication; offer nutritional support alongside TPT
D13
Previous TB treatment (completed)?
TPT may still be given, especially if new exposure; document
SECTION E: TPT REGIMEN SELECTION
Based on WHO 2024 recommendations. Select the most appropriate regimen:
Regimen
Duration
Indication
Notes
3HP - Rifapentine + Isoniazid weekly
3 months (12 doses)
Adults and children ≥2 years; preferred in many settings
Avoid in <2 years, pregnancy (1st trimester), on PIs (some)
1HP - Rifapentine + Isoniazid daily
1 month (28 doses)
Adults ≥18 years; highest adherence rates
Limited data in children and pregnancy
4R - Rifampicin daily
4 months
Adults and children; useful if isoniazid resistance likely
Check drug interactions with ART
3RH - Rifampicin + Isoniazid daily
3 months
Children especially; adults where preferred
6H - Isoniazid daily
6 months
All populations; widely available
Always give with pyridoxine B6
6Lfx - Levofloxacin daily
6 months
Contacts of MDR/RR-TB cases (new WHO 2024 recommendation)
Do NOT use standard regimens for MDR contacts
Note (2024 update): The previous recommendation for ≥36 months of daily isoniazid (long-term IPT) in PLHIV in high-transmission settings has been WITHDRAWN. Shorter regimens are now preferred.
Contacts of MDR/RR-TB - 6Lfx for 6 months (new 2024 conditional recommendation)
Key 2024 Change: Long-term isoniazid (≥36 months) for PLHIV in high-burden settings is NO LONGER recommended. Shorter regimens (3HP, 1HP, 4R, 6H) are the standard of care.
make a questionaire using these resources for my thesis topic Evaluation Of Programmatic Management of Tuberculosis Preventive Therapy Among Household Contacts of Pulmonary Tuberculosis Patients in the Private Health Sector of Rajkot City: A Mixed-Method Cross-Sectional Study
Reading File
Running Command
python3 << 'EOF'
import pdfplumber
files = {
"idi1": "/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/idi1.pdf",
"facility_tool": "/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/facility assesment tb risk tool who.pdf",
"supplementary": "/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/tropicalmed-2707987-supplementary.pdf",
"india_guidelines": "/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/Guidelines-for-Programmatic-Management-of-Tuberculosis-Preventive-Treatment-in-India.pdf",
}
for name, path in files.items():
try:
with pdfplumber.open(path) as pdf:
print(f"\n{'='*60}")
print(f"FILE: {name} | Pages: {len(pdf.pages)}")
print('='*60)
# Extract first 4 pages to understand structure
for i, page in enumerate(pdf.pages[:4]):
text = page.extract_text()
if text:
print(f"\n--- Page {i+1} ---")
print(text[:2000])
except Exception as e:
print(f"Error reading {name}: {e}")
EOF
Running Command
python3 << 'EOF'
import pdfplumber
# Extract more pages from India guidelines (the main resource)
with pdfplumber.open("/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/Guidelines-for-Programmatic-Management-of-Tuberculosis-Preventive-Treatment-in-India.pdf") as pdf:
print(f"Total pages: {len(pdf.pages)}")
# Read pages 1-20 for structure and key content
for i, page in enumerate(pdf.pages[1:25]):
text = page.extract_text()
if text:
print(f"\n--- Page {i+2} ---")
print(text[:2500])
EOF
Running Command
python3 << 'EOF'
import pdfplumber
# Extract key chapters from India guidelines - Chapters 4, 5, 9, 12, 13, 14
with pdfplumber.open("/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/Guidelines-for-Programmatic-Management-of-Tuberculosis-Preventive-Treatment-in-India.pdf") as pdf:
# Pages 25 onwards (content pages - chapters start around page 26 based on TOC)
for i, page in enumerate(pdf.pages[25:70]):
text = page.extract_text()
if text and len(text.strip()) > 100:
print(f"\n--- Page {i+26} ---")
print(text[:2500])
EOF
Running Command
python3 << 'EOF'
import pdfplumber
# Extract Chapters 9, 12, 13 (Monitoring, Recording/Reporting, Private Sector)
with pdfplumber.open("/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/Guidelines-for-Programmatic-Management-of-Tuberculosis-Preventive-Treatment-in-India.pdf") as pdf:
for i, page in enumerate(pdf.pages[70:105]):
text = page.extract_text()
if text and len(text.strip()) > 100:
print(f"\n--- Page {i+71} ---")
print(text[:2500])
EOF
Running Command
python3 << 'EOF'
import pdfplumber
# Extract Chapter 14 (Monitoring, Supervision, Evaluation) and supplementary tables
with pdfplumber.open("/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/Guidelines-for-Programmatic-Management-of-Tuberculosis-Preventive-Treatment-in-India.pdf") as pdf:
for i, page in enumerate(pdf.pages[105:123]):
text = page.extract_text()
if text and len(text.strip()) > 100:
print(f"\n--- Page {i+106} ---")
print(text[:2500])
# Also check supplementary for more tables
with pdfplumber.open("/tmp/workspace/attachments/fb426b91-973f-4a5f-a6d2-0478dfd2357d/tropicalmed-2707987-supplementary.pdf") as pdf:
print(f"\n\nSUPPLEMENTARY PDF - Total pages: {len(pdf.pages)}")
for i, page in enumerate(pdf.pages[3:]):
text = page.extract_text()
if text and len(text.strip()) > 100:
print(f"\n--- Supp Page {i+4} ---")
print(text[:2500])
EOF
Running Command
mkdir -p /tmp/workspace/tpt-thesis-questionnaire
Reading File
Running Command
python3 << 'PYEOF'
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
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy
doc = Document()
# ─── Page margins ───────────────────────────────────────────────────
from docx.oxml.ns import qn
sections = doc.sections
for section in sections:
section.top_margin = Cm(2.5)
section.bottom_margin = Cm(2.5)
section.left_margin = Cm(3.0)
section.right_margin = Cm(2.5)
# ─── Styles ─────────────────────────────────────────────────────────
normal = doc.styles['Normal']
normal.font.name = 'Times New Roman'
normal.font.size = Pt(12)
# Helper: shade a table cell
def shade_cell(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_heading(doc, text, level=1, color_hex='1F3864'):
p = doc.add_heading(text, level=level)
run = p.runs[0] if p.runs else p.add_run(text)
run.font.color.rgb = RGBColor.from_string(color_hex)
run.font.bold = True
return p
def add_checkbox_row(table, row_idx, q_num, question, options_list, note=''):
"""Add a row with question and checkbox options."""
row = table.rows[row_idx]
row.cells[0].text = q_num
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = question
if note:
p = row.cells[1].add_paragraph()
p.add_run(f'({note})').italic = True
p.runs[0].font.size = Pt(10)
opts_cell = row.cells[2]
opts_cell.text = ''
for opt in options_list:
p = opts_cell.add_paragraph()
p.add_run(f'☐ {opt}')
p.paragraph_format.space_after = Pt(2)
def add_table_header(table, headers, bg='1F3864'):
hdr = table.rows[0]
for i, h in enumerate(headers):
cell = hdr.cells[i]
cell.text = ''
p = cell.paragraphs[0]
run = p.add_run(h)
run.bold = True
run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
run.font.size = Pt(11)
shade_cell(cell, bg)
# ═══════════════════════════════════════════════════════════════════
# TITLE PAGE
# ═══════════════════════════════════════════════════════════════════
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('GUJARAT ADANI INSTITUTE OF MEDICAL SCIENCES')
r.bold = True; r.font.size = Pt(13)
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Department of Community Medicine')
r.font.size = Pt(12)
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('THESIS STUDY QUESTIONNAIRE')
r.bold = True; r.font.size = Pt(14); r.font.color.rgb = RGBColor(0x1F, 0x38, 0x64)
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run(
'Evaluation of Programmatic Management of Tuberculosis Preventive Therapy\n'
'Among Household Contacts of Pulmonary Tuberculosis Patients\n'
'in the Private Health Sector of Rajkot City:\n'
'A Mixed-Method Cross-Sectional Study'
)
r.bold = True; r.font.size = Pt(13); r.font.color.rgb = RGBColor(0x1F, 0x38, 0x64)
doc.add_paragraph()
# Source box
tbl = doc.add_table(rows=1, cols=1)
tbl.style = 'Table Grid'
cell = tbl.rows[0].cells[0]
shade_cell(cell, 'E2EFDA')
cell.text = ''
p = cell.paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Sources: PMTPT India Guidelines 2021 (MoHFW/NTEP) | WHO Operational Handbook on TB Module 1 (2023) | WHO Facility TB Risk Assessment Tool | IDI Guide (Butani et al.) | Supplementary Materials (Tropical Medicine)')
r.font.size = Pt(9); r.italic = True
doc.add_page_break()
# ═══════════════════════════════════════════════════════════════════
# INFORMATION SHEET
# ═══════════════════════════════════════════════════════════════════
add_heading(doc, 'PARTICIPANT INFORMATION AND CONSENT', level=1)
doc.add_paragraph(
'This study aims to evaluate the programmatic management of TB Preventive Therapy (TPT) among '
'household contacts (HHC) of pulmonary TB patients registered with private health facilities in Rajkot city. '
'Your participation is voluntary and all information will be kept strictly confidential. There is no monetary '
'benefit for participation, but your responses will help improve TB prevention programs in India.'
)
doc.add_paragraph(
'Informed written consent will be obtained before commencement of any interview or data collection.'
)
doc.add_page_break()
# ═══════════════════════════════════════════════════════════════════
# INSTRUMENT 1 — SEMI-STRUCTURED QUESTIONNAIRE FOR HOUSEHOLD CONTACTS
# ═══════════════════════════════════════════════════════════════════
add_heading(doc, 'INSTRUMENT 1', level=1)
add_heading(doc, 'Semi-Structured Questionnaire for Household Contacts (HHC) of Pulmonary TB Patients', level=2)
p = doc.add_paragraph()
p.add_run('For: ').bold = True
p.add_run('Household contacts (of any age) of pulmonary TB index patients notified by private practitioners in Rajkot city.\n')
p.add_run('Method: ').bold = True
p.add_run('Face-to-face interview with contact/caregiver | ')
p.add_run('Duration: ').bold = True
p.add_run('30–40 minutes')
doc.add_paragraph()
# ── PART A: Demographics ──────────────────────────────────────────
add_heading(doc, 'PART A: Socio-Demographic Profile', level=3)
tbl = doc.add_table(rows=14, cols=3)
tbl.style = 'Table Grid'
tbl.autofit = False
tbl.columns[0].width = Cm(1.5)
tbl.columns[1].width = Cm(7.5)
tbl.columns[2].width = Cm(6.5)
add_table_header(tbl, ['Q.No.', 'Question', 'Response'])
questions_a = [
('A1', 'Name of HHC (initials only for confidentiality)', '______________________'),
('A2', 'Age of HHC', '__________ years'),
('A3', 'Sex', '☐ Male ☐ Female ☐ Other'),
('A4', 'Relation to index TB patient', '☐ Spouse ☐ Child ☐ Parent ☐ Sibling ☐ Other: ___'),
('A5', 'Duration of residence with index patient (prior to TB diagnosis)', '☐ <6 months ☐ 6–12 months ☐ >1 year'),
('A6', 'Education level', '☐ Illiterate ☐ Primary ☐ Secondary ☐ Graduate+'),
('A7', 'Occupation', '☐ Unemployed ☐ Daily wage ☐ Service ☐ Business ☐ Student ☐ Homemaker'),
('A8', 'Monthly household income', '☐ <₹5000 ☐ ₹5000–10000 ☐ ₹10001–20000 ☐ >₹20000'),
('A9', 'Type of housing', '☐ Pucca ☐ Semi-pucca ☐ Kuccha'),
('A10', 'Number of persons sharing the same room as index patient', '__________ persons'),
('A11', 'HIV status (if known)', '☐ Positive ☐ Negative ☐ Unknown/Not tested'),
('A12', 'Any known co-morbidity', '☐ Diabetes ☐ Renal disease ☐ Immunosuppressive therapy ☐ None ☐ Other: ___'),
('A13', 'Previous history of TB disease', '☐ Yes ☐ No ☐ Unsure'),
]
for i, (qno, q, resp) in enumerate(questions_a):
row = tbl.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# ── PART B: Index TB Patient Information ─────────────────────────
add_heading(doc, 'PART B: Index TB Patient Information', level=3)
tbl2 = doc.add_table(rows=9, cols=3)
tbl2.style = 'Table Grid'
tbl2.columns[0].width = Cm(1.5)
tbl2.columns[1].width = Cm(7.5)
tbl2.columns[2].width = Cm(6.5)
add_table_header(tbl2, ['Q.No.', 'Question', 'Response'])
questions_b = [
('B1', 'Nikshay ID of index patient (if available)', '______________________'),
('B2', 'Type of TB confirmed in index patient', '☐ Bacteriologically confirmed ☐ Clinically diagnosed'),
('B3', 'Name of private facility that diagnosed/notified index patient', '______________________'),
('B4', 'Date of TB diagnosis of index patient', '____ / ____ / ______'),
('B5', 'Is the index patient currently on anti-TB treatment?', '☐ Yes ☐ No ☐ Completed'),
('B6', 'Total number of household contacts (HHC) in the household', '__________ persons'),
('B7', 'Were ALL household members informed about the TB diagnosis?', '☐ Yes ☐ No ☐ Partially'),
('B8', 'Was the household visited by any health worker after TB diagnosis?', '☐ Yes (by whom: _________) ☐ No'),
]
for i, (qno, q, resp) in enumerate(questions_b):
row = tbl2.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# ── PART C: Contact Investigation & TB Screening ─────────────────
add_heading(doc, 'PART C: Contact Investigation and TB Screening', level=3)
tbl3 = doc.add_table(rows=13, cols=3)
tbl3.style = 'Table Grid'
tbl3.columns[0].width = Cm(1.5)
tbl3.columns[1].width = Cm(7.5)
tbl3.columns[2].width = Cm(6.5)
add_table_header(tbl3, ['Q.No.', 'Question', 'Response'])
questions_c = [
('C1', 'Were you informed that you need to be screened for TB after your family member was diagnosed with TB?',
'☐ Yes ☐ No ☐ Not told clearly'),
('C2', 'Who informed you about the need for screening?',
'☐ Private doctor ☐ ASHA/ANM ☐ STS/TBHV ☐ Family member ☐ No one ☐ Other: ___'),
('C3', 'Were you asked about TB symptoms (4-symptom screen: cough, fever, night sweats, weight loss)?',
'☐ Yes, by whom: _______ ☐ No'),
('C4', 'Current TB symptoms at time of assessment (tick all that apply)',
'☐ Cough (≥2 weeks) ☐ Fever ☐ Night sweats ☐ Weight loss ☐ Haemoptysis ☐ Chest pain ☐ Shortness of breath ☐ None'),
('C5', 'Was a chest X-ray (CXR) done?',
'☐ Yes - Normal ☐ Yes - Abnormal ☐ No ☐ Recommended but not done'),
('C6', 'If CXR not done, reason:',
'☐ Not advised ☐ Cost ☐ Not available ☐ Patient refused ☐ N/A'),
('C7', 'Was a sputum test / GeneXpert done?',
'☐ Yes - Negative ☐ Yes - Positive ☐ No ☐ N/A (asymptomatic)'),
('C8', 'Was a Tuberculin Skin Test (TST) done?',
'☐ Yes - Result: ___mm ☐ No ☐ Not available at facility'),
('C9', 'Was an IGRA (blood test for TB infection) done?',
'☐ Yes - Positive ☐ Yes - Negative ☐ No ☐ Not available'),
('C10', 'Was active TB disease ruled out before offering TPT?',
'☐ Yes ☐ No ☐ Not applicable'),
('C11', 'Were all members of your household screened?',
'☐ Yes, all ☐ No, only some ☐ None screened\n(If not all: reason: _______________________)'),
('C12', 'Was the contact investigation done through Nikshay / Prevent TB India App?',
'☐ Yes ☐ No ☐ Don\'t know'),
]
for i, (qno, q, resp) in enumerate(questions_c):
row = tbl3.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# ── PART D: TPT Eligibility and Initiation ────────────────────────
add_heading(doc, 'PART D: TPT Eligibility Assessment and Initiation', level=3)
tbl4 = doc.add_table(rows=15, cols=3)
tbl4.style = 'Table Grid'
tbl4.columns[0].width = Cm(1.5)
tbl4.columns[1].width = Cm(7.5)
tbl4.columns[2].width = Cm(6.5)
add_table_header(tbl4, ['Q.No.', 'Question', 'Response'])
questions_d = [
('D1', 'Were you told that you are eligible to receive TPT (medicine to prevent TB)?',
'☐ Yes ☐ No ☐ Never discussed'),
('D2', 'Age group of this contact (for eligibility pathway)',
'☐ <5 years ☐ 5–18 years ☐ >18 years (adult)'),
('D3', 'Was TPT offered/prescribed?',
'☐ Yes ☐ No'),
('D4', 'If TPT NOT offered, reason given (tick all applicable)',
'☐ Active TB not yet ruled out ☐ Contraindication cited ☐ Not aware of guidelines ☐ Patient refused ☐ No drugs available ☐ Not part of private facility protocol ☐ Other: ___'),
('D5', 'Was pre-TPT assessment done? (history of liver disease, alcohol, allergies, current medications)',
'☐ Yes - comprehensive ☐ Yes - partial ☐ No assessment done'),
('D6', 'Were baseline liver function tests (LFT) done before starting TPT?',
'☐ Yes ☐ No ☐ Risk factors present but LFT not done'),
('D7', 'Were contraindications to TPT screened? (hepatitis, peripheral neuropathy, heavy alcohol use)',
'☐ Yes ☐ No ☐ Partial'),
('D8', 'Contraindications identified (if any)',
'☐ Active hepatitis ☐ Peripheral neuropathy ☐ Heavy alcohol use ☐ Drug allergy ☐ End-stage liver disease ☐ None identified'),
('D9', 'Were you counselled about TPT before starting? (purpose, duration, side effects)',
'☐ Yes - detailed ☐ Yes - briefly ☐ Not counselled'),
('D10', 'Was a treatment supporter identified for you?',
'☐ Yes (who: _______) ☐ No ☐ Self-administration agreed'),
('D11', 'Were you enrolled in Nikshay / Prevent TB India App for TPT?',
'☐ Yes ☐ No ☐ Don\'t know'),
('D12', 'Was pyridoxine (Vitamin B6) prescribed along with isoniazid?',
'☐ Yes ☐ No ☐ Not applicable (no isoniazid)'),
('D13', 'Pregnancy status (for female contacts of reproductive age)',
'☐ Pregnant ☐ Breastfeeding ☐ Not applicable ☐ Not pregnant/BF'),
('D14', 'If pregnant/breastfeeding, was appropriate TPT regimen advised? (6H preferred; 3HP avoided in 1st trimester)',
'☐ Yes ☐ No ☐ N/A'),
]
for i, (qno, q, resp) in enumerate(questions_d):
row = tbl4.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# ── PART E: TPT Regimen Details ───────────────────────────────────
add_heading(doc, 'PART E: TPT Regimen Details and Drug Availability', level=3)
tbl5 = doc.add_table(rows=9, cols=3)
tbl5.style = 'Table Grid'
tbl5.columns[0].width = Cm(1.5)
tbl5.columns[1].width = Cm(7.5)
tbl5.columns[2].width = Cm(6.5)
add_table_header(tbl5, ['Q.No.', 'Question', 'Response'])
questions_e = [
('E1', 'TPT regimen prescribed',
'☐ 6H (6 months daily isoniazid) ☐ 3HP (3 months weekly rifapentine + isoniazid) ☐ 4R ☐ Other: ___ ☐ None'),
('E2', 'Correct weight-based dose prescribed as per PMTPT 2021?',
'☐ Yes ☐ No ☐ Not verified'),
('E3', 'Source of TPT drugs',
'☐ Public sector (free) ☐ Private pharmacy (self-purchased) ☐ Both ☐ Not obtained'),
('E4', 'Were TPT drugs available at first request?',
'☐ Yes, immediately ☐ No, had to wait ☐ Not available at all'),
('E5', 'Cost of TPT drugs borne by patient (if any)',
'☐ Free ☐ Partially paid ☐ Fully paid by patient | Amount: ₹_____'),
('E6', 'Were you given the full course of TPT at one time?',
'☐ Yes, full course ☐ No, given in installments ☐ Partial course only'),
('E7', 'Drug-drug interactions discussed (ART, anticoagulants, oral contraceptives, anticonvulsants)?',
'☐ Yes ☐ No ☐ Not applicable'),
('E8', 'For contacts of MDR/RR-TB index patient: was 6Lfx regimen prescribed (as per PMTPT 2021)?',
'☐ Yes ☐ No ☐ N/A (DS-TB index case) ☐ Don\'t know'),
]
for i, (qno, q, resp) in enumerate(questions_e):
row = tbl5.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# ── PART F: Adherence and Completion ─────────────────────────────
add_heading(doc, 'PART F: Adherence, Monitoring and Treatment Outcomes', level=3)
tbl6 = doc.add_table(rows=15, cols=3)
tbl6.style = 'Table Grid'
tbl6.columns[0].width = Cm(1.5)
tbl6.columns[1].width = Cm(7.5)
tbl6.columns[2].width = Cm(6.5)
add_table_header(tbl6, ['Q.No.', 'Question', 'Response'])
questions_f = [
('F1', 'Did you start taking TPT?', '☐ Yes ☐ No'),
('F2', 'If No, reason for not starting', '☐ Not informed about eligibility ☐ Fear of side effects ☐ Felt no need (no symptoms) ☐ Cost ☐ Drug not available ☐ Family pressure ☐ Other: ___'),
('F3', 'TPT completion status',
'☐ Completed full course ☐ Ongoing (in progress) ☐ Incomplete - stopped early ☐ Lost to follow-up ☐ Not started'),
('F4', 'If incomplete/stopped, reason for stopping',
'☐ Side effects ☐ Felt better ☐ Forgot ☐ Drug supply interrupted ☐ Too many pills ☐ Work/travel ☐ Other: ___'),
('F5', 'How many doses did you miss in total (approximate)?',
'☐ 0 ☐ 1–5 ☐ 6–10 ☐ >10 ☐ Don\'t remember'),
('F6', 'How was adherence monitored by the healthcare provider?',
'☐ Monthly visits to facility ☐ Home visits by health worker ☐ Phone/WhatsApp calls ☐ 99DOTS/MERM ☐ Pill count ☐ No monitoring done'),
('F7', 'Were you assessed for TB symptoms at every follow-up visit while on TPT?',
'☐ Yes, regularly ☐ Occasionally ☐ Never assessed during TPT'),
('F8', 'Were you asked about side effects at follow-up visits?',
'☐ Yes ☐ No ☐ No follow-up done'),
('F9', 'Did you experience any side effects while on TPT?',
'☐ No side effects\n☐ Nausea/vomiting ☐ Jaundice/yellow eyes ☐ Skin rash ☐ Tingling/numbness in hands/feet ☐ Orange urine (rifamycin) ☐ Fatigue ☐ Flu-like symptoms ☐ Other: ___'),
('F10', 'If side effect occurred, what action was taken?',
'☐ Managed by HCW, TPT continued ☐ TPT stopped temporarily ☐ TPT stopped permanently ☐ No action taken ☐ N/A'),
('F11', 'Weight measured and recorded at follow-up visits?',
'☐ Yes, regularly ☐ Occasionally ☐ No'),
('F12', 'Was LFT done during follow-up (if risk factors present)?',
'☐ Yes ☐ No ☐ Risk factors not present ☐ Don\'t know'),
('F13', 'Post-TPT follow-up done (assessment for breakthrough TB at 6, 12 months)?',
'☐ Yes ☐ No ☐ Ongoing'),
('F14', 'Overall TPT outcome',
'☐ Treatment completed ☐ Failed (developed active TB during TPT) ☐ Died ☐ Lost to follow-up ☐ Discontinued due to toxicity ☐ Not evaluated ☐ Ongoing'),
]
for i, (qno, q, resp) in enumerate(questions_f):
row = tbl6.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# ── PART G: Knowledge and Awareness about TPT ────────────────────
add_heading(doc, 'PART G: Knowledge and Awareness of HHC Regarding TPT', level=3)
p = doc.add_paragraph()
p.add_run('(Score: 1 = Correct, 0 = Incorrect/Don\'t know. Total KAP score: /15)').italic = True
p.runs[0].font.size = Pt(10)
tbl7 = doc.add_table(rows=16, cols=4)
tbl7.style = 'Table Grid'
tbl7.columns[0].width = Cm(1.2)
tbl7.columns[1].width = Cm(8.0)
tbl7.columns[2].width = Cm(5.0)
tbl7.columns[3].width = Cm(1.3)
add_table_header(tbl7, ['Q.No.', 'Knowledge Question', 'Response', 'Score'])
knowledge_qs = [
('G1', 'What does TB Preventive Therapy (TPT) do?',
'☐ Prevents TB from developing ☐ Treats active TB ☐ Increases immunity ☐ Don\'t know'),
('G2', 'Who in the household should take TPT?',
'☐ Only children ☐ All contacts after ruling out active TB ☐ Only HIV+ contacts ☐ Don\'t know'),
('G3', 'What is the recommended duration of the short TPT regimen (3HP)?',
'☐ 1 month ☐ 3 months ☐ 6 months ☐ 12 months ☐ Don\'t know'),
('G4', 'Can a person who feels completely healthy/well still need to take TPT?',
'☐ Yes ☐ No ☐ Don\'t know'),
('G5', 'What happens if you stop TPT midway?',
'☐ Risk of developing TB increases ☐ Nothing happens ☐ Drug resistance can develop ☐ Don\'t know'),
('G6', 'What tests are needed before starting TPT?',
'☐ Ruling out active TB (symptoms/X-ray) ☐ Blood test (IGRA/TST) ☐ Both ☐ No tests needed ☐ Don\'t know'),
('G7', 'Is TPT available for free under the government program (NTEP)?',
'☐ Yes ☐ No ☐ Don\'t know'),
('G8', 'Which of these is a side effect that requires IMMEDIATE medical attention?',
'☐ Orange urine ☐ Yellow eyes/jaundice ☐ Mild nausea ☐ Don\'t know'),
('G9', 'Can a pregnant woman take TPT?',
'☐ Yes, certain regimens are safe ☐ No, absolutely contraindicated ☐ Don\'t know'),
('G10', 'What is the source of your information about TPT?',
'☐ Treating doctor ☐ ASHA/ANM/health worker ☐ Family/friend ☐ Internet/media ☐ No information received'),
('G11', 'Is TB Preventive Therapy the same as TB treatment?',
'☐ Yes ☐ No ☐ Don\'t know'),
('G12', 'Does taking TPT guarantee that you will never get TB?',
'☐ Yes ☐ No, but it reduces risk significantly ☐ Don\'t know'),
('G13', 'After completing TPT, should you still watch for TB symptoms?',
'☐ Yes ☐ No ☐ Don\'t know'),
('G14', 'Is a child below 5 years of age who is a household contact recommended to receive TPT?',
'☐ Yes ☐ No ☐ Only if symptomatic ☐ Don\'t know'),
('G15', 'Vitamin B6 (pyridoxine) should be taken alongside isoniazid to prevent:',
'☐ Liver damage ☐ Peripheral neuropathy (hand/foot tingling) ☐ Drug resistance ☐ Don\'t know'),
]
for i, (qno, q, resp) in enumerate(knowledge_qs):
row = tbl7.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
row.cells[3].text = '____'
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# ── PART H: Barriers and Facilitators ────────────────────────────
add_heading(doc, 'PART H: Barriers and Facilitators to TPT Initiation and Completion', level=3)
tbl8 = doc.add_table(rows=9, cols=3)
tbl8.style = 'Table Grid'
tbl8.columns[0].width = Cm(1.5)
tbl8.columns[1].width = Cm(7.5)
tbl8.columns[2].width = Cm(6.5)
add_table_header(tbl8, ['Q.No.', 'Question', 'Response'])
questions_h = [
('H1', 'Barriers faced in accessing TPT (tick all applicable)',
'☐ Not informed by provider ☐ Cost of drugs/tests ☐ Distance to facility ☐ Stigma/fear of TB label ☐ Long duration of treatment ☐ Side effects ☐ No barriers faced ☐ Other: ___'),
('H2', 'Did TB-related stigma affect your decision to take or complete TPT?',
'☐ Yes, significantly ☐ Somewhat ☐ No'),
('H3', 'Did any family member discourage you from taking TPT?',
'☐ Yes ☐ No'),
('H4', 'Was there any financial difficulty due to TPT (travel, tests, drugs)?',
'☐ Yes, major ☐ Yes, minor ☐ No financial burden'),
('H5', 'Did you receive any social support to help with TPT adherence?',
'☐ Yes - from family ☐ Yes - from health worker ☐ Yes - from community volunteer/TB champion ☐ No support received'),
('H6', 'What could have been done to make it easier for you to take/complete TPT?',
'☐ Home delivery of drugs ☐ Shorter treatment duration ☐ Better counselling ☐ Financial support ☐ Nothing needed ☐ Other: ___'),
('H7', 'Were you ever contacted by the NTEP/ASHA/ANM to follow up on your TPT status?',
'☐ Yes, regularly ☐ Yes, once ☐ Never contacted'),
('H8', 'Was the private facility staff cooperative in facilitating your access to TPT?',
'☐ Very cooperative ☐ Somewhat cooperative ☐ Not cooperative ☐ Referred elsewhere without guidance'),
]
for i, (qno, q, resp) in enumerate(questions_h):
row = tbl8.rows[i+1]
row.cells[0].text = qno
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = q
row.cells[2].text = resp
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_page_break()
# ═══════════════════════════════════════════════════════════════════
# INSTRUMENT 2 — SEMI-STRUCTURED FACILITY ASSESSMENT CHECKLIST (Private Providers)
# ═══════════════════════════════════════════════════════════════════
add_heading(doc, 'INSTRUMENT 2', level=1)
add_heading(doc, 'Facility Assessment Checklist for Private Healthcare Providers', level=2)
p = doc.add_paragraph()
p.add_run('For: ').bold = True
p.add_run('Private practitioners/clinics notifying pulmonary TB in Rajkot city.\n')
p.add_run('Method: ').bold = True
p.add_run('Direct observation + interview with facility manager/doctor-in-charge | ')
p.add_run('Duration: ').bold = True
p.add_run('45–60 minutes')
doc.add_paragraph()
# Facility profile
add_heading(doc, 'SECTION F1: Facility Profile', level=3)
tbl_f1 = doc.add_table(rows=10, cols=2)
tbl_f1.style = 'Table Grid'
tbl_f1.columns[0].width = Cm(7.5)
tbl_f1.columns[1].width = Cm(8.0)
add_table_header(tbl_f1, ['Item', 'Details'])
facility_info = [
('Name and address of facility', '_______________________________'),
('Name of assessor', '_______________________________'),
('Name of doctor/facility manager interviewed', '_______________________________'),
('Date of assessment', '____ / ____ / ______'),
('Type of facility', '☐ Private clinic (solo practitioner) ☐ Nursing home ☐ Private hospital ☐ Diagnostic center ☐ PPSA-linked facility'),
('Speciality of doctor', '☐ General Medicine ☐ Pulmonology ☐ Paediatrics ☐ General Physician ☐ Other: ___'),
('Average TB cases notified per month', '__________ cases/month'),
('Is the facility registered with NTEP for TB notification?', '☐ Yes ☐ No'),
('Nikshay notification compliance in last quarter', '☐ 100% ☐ 75–99% ☐ 50–74% ☐ <50% ☐ Don\'t know'),
]
for i, (item, detail) in enumerate(facility_info):
row = tbl_f1.rows[i+1]
row.cells[0].text = item
row.cells[1].text = detail
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# Contact investigation practices
add_heading(doc, 'SECTION F2: Contact Investigation and TPT Practices', level=3)
tbl_f2 = doc.add_table(rows=14, cols=3)
tbl_f2.style = 'Table Grid'
tbl_f2.columns[0].width = Cm(1.5)
tbl_f2.columns[1].width = Cm(9.5)
tbl_f2.columns[2].width = Cm(4.5)
add_table_header(tbl_f2, ['#', 'Practice / Item', 'Status'])
facility_prac = [
('1', 'Does the facility routinely enumerate household contacts of notified TB patients?', '☐ Yes ☐ No ☐ Sometimes'),
('2', 'Is a contact tracing form / record maintained?', '☐ Yes ☐ No'),
('3', 'Is the 4-symptom screen (W4SS) routinely administered to all HHC?', '☐ Yes, to all ☐ Selective ☐ No'),
('4', 'Is CXR recommended for asymptomatic HHC aged ≥5 years?', '☐ Yes ☐ No ☐ Only if symptomatic'),
('5', 'Is TST / IGRA testing offered or referred for HHC aged ≥5 years?', '☐ Yes, in-house ☐ Referred out ☐ No'),
('6', 'Is active TB excluded before offering TPT?', '☐ Always ☐ Sometimes ☐ Not systematically done'),
('7', 'Is TPT prescribed/offered to eligible HHC by this facility?', '☐ Yes ☐ No ☐ Referred to NTEP/public sector'),
('8', 'What TPT regimen is prescribed?', '☐ 6H ☐ 3HP ☐ 4R ☐ Multiple options ☐ None prescribed here'),
('9', 'Is pyridoxine co-prescribed with isoniazid?', '☐ Yes, routinely ☐ Selectively ☐ No'),
('10', 'Are patients enrolled on Nikshay / Prevent TB India App for TPT?', '☐ Yes ☐ No ☐ Done by NTEP staff only'),
('11', 'Is follow-up monitoring of HHC on TPT conducted?', '☐ Yes - monthly visits ☐ Yes - phone calls ☐ Irregular ☐ No follow-up'),
('12', 'Are ADRs (adverse drug reactions) monitored and managed?', '☐ Yes - structured ADR system ☐ Managed ad-hoc when reported ☐ No'),
('13', 'Is the facility aware of PMTPT India Guidelines 2021?', '☐ Yes, followed ☐ Aware but not implemented ☐ Not aware'),
]
for i, (num, item, status) in enumerate(facility_prac):
row = tbl_f2.rows[i+1]
row.cells[0].text = num
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = item
row.cells[2].text = status
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# Staff training and private sector engagement
add_heading(doc, 'SECTION F3: Staff Training and NTEP Linkages', level=3)
tbl_f3 = doc.add_table(rows=9, cols=3)
tbl_f3.style = 'Table Grid'
tbl_f3.columns[0].width = Cm(1.5)
tbl_f3.columns[1].width = Cm(9.5)
tbl_f3.columns[2].width = Cm(4.5)
add_table_header(tbl_f3, ['#', 'Item', 'Status'])
training_qs = [
('1', 'Has the doctor/key staff received training on PMTPT guidelines in the past 2 years?', '☐ Yes ☐ No ☐ Don\'t remember'),
('2', 'Is PPSA (Patient Provider Support Agency) engaged with this facility?', '☐ Yes ☐ No ☐ Don\'t know'),
('3', 'Does a PPSA staff member visit this facility for contact investigation/TPT follow-up?', '☐ Yes, regularly ☐ Occasionally ☐ Never'),
('4', 'Is there a formal linkage with the District TB Office (DTO) / TB Unit for TPT services?', '☐ Yes - formal MoU/protocol ☐ Informal ☐ No linkage'),
('5', 'Does the facility provide free TPT drugs from NTEP stock, or are patients directed to buy from pharmacies?', '☐ NTEP stock provided free ☐ Patients buy from pharmacy ☐ Referred to public facility ☐ Both'),
('6', 'Is there any advocacy/IEC material about TPT displayed in the facility?', '☐ Yes ☐ No'),
('7', 'Are healthcare workers aware of drug-drug interactions between TPT and common medications (ARVs, OCP, anticonvulsants)?', '☐ Yes ☐ Partially ☐ No'),
('8', 'Challenges/barriers in implementing TPT at this facility (open-ended)', 'Record verbatim: ___________________________'),
]
for i, (num, item, status) in enumerate(training_qs):
row = tbl_f3.rows[i+1]
row.cells[0].text = num
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = item
row.cells[2].text = status
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# WHO Facility Risk Assessment - IPC
add_heading(doc, 'SECTION F4: WHO TB Infection Prevention & Control (IPC) Assessment', level=3)
p = doc.add_paragraph()
p.add_run('(Based on WHO Facility TB Risk Assessment Tool, Annex 2 – MSF Adaptation)').italic = True
p.runs[0].font.size = Pt(10)
tbl_f4 = doc.add_table(rows=14, cols=4)
tbl_f4.style = 'Table Grid'
tbl_f4.columns[0].width = Cm(1.5)
tbl_f4.columns[1].width = Cm(8.5)
tbl_f4.columns[2].width = Cm(2.5)
tbl_f4.columns[3].width = Cm(3.0)
add_table_header(tbl_f4, ['#', 'IPC Measure', 'Yes / No', 'Comments'])
ipc_items = [
('1', 'Is there a TB IPC focal person or committee at this facility?'),
('2', 'Is there a written, facility-specific IPC plan that includes TB?'),
('3', 'Are presumptive TB cases separated from other patients (triage/segregation)?'),
('4', 'Are symptomatic patients given medical masks?'),
('5', 'Is there a fast-tracking system to minimize waiting time for TB suspects?'),
('6', 'Is sputum collected in a designated, well-ventilated area?'),
('7', 'Are N95/FFP2 respirators available for staff?'),
('8', 'Do HCWs wear respirators when entering TB patient rooms?'),
('9', 'Are windows open during busy hours for natural ventilation?'),
('10', 'Do staff receive annual TB screening (symptom check ± CXR)?'),
('11', 'Have staff been offered TPT at least once?'),
('12', 'Is there educational content on TB and cough hygiene displayed for patients?'),
('13', 'Are GeneXpert/NAAT results available in <48 hours?'),
]
for i, (num, item) in enumerate(ipc_items):
row = tbl_f4.rows[i+1]
row.cells[0].text = num
row.cells[1].text = item
row.cells[2].text = '☐ Yes ☐ No'
row.cells[3].text = ''
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_page_break()
# ═══════════════════════════════════════════════════════════════════
# INSTRUMENT 3 — IN-DEPTH INTERVIEW GUIDE (IDI) — Mixed Method Component
# ═══════════════════════════════════════════════════════════════════
add_heading(doc, 'INSTRUMENT 3', level=1)
add_heading(doc, 'In-Depth Interview (IDI) Guide - Qualitative Component', level=2)
p = doc.add_paragraph()
p.add_run('Purpose: ').bold = True
p.add_run('To explore lived experiences, perceptions, barriers and facilitators related to TPT among HHC and private providers (qualitative strand of the mixed-method design).\n')
p.add_run('Participants: ').bold = True
p.add_run('(a) Index patients / HHC who were offered or refused TPT | (b) Private practitioners managing TB cases in Rajkot\n')
p.add_run('Duration: ').bold = True
p.add_run('45–60 minutes | ')
p.add_run('Mode: ').bold = True
p.add_run('Face-to-face, audio-recorded (with consent)\n')
p.add_run('Note: ').bold = True
r = p.add_run('These are guiding questions. Use probes flexibly. Record responses verbatim.')
r.italic = True
doc.add_paragraph()
add_heading(doc, 'IDI-A: For Index Patients and Household Contacts', level=3)
idi_questions_a = [
('IDI-A1', 'Opening', 'Can you describe the events that led up to the diagnosis of TB in your household? Who else in the family was involved?', 'Probe: symptoms, timeline, doctor visits, household contacts\' initial reactions'),
('IDI-A2', 'Contact Investigation', 'How were your family members tested/screened for TB after the diagnosis? Can you describe the process?', 'Probe: who initiated, what was done, what was explained, was assistance of index patient taken'),
('IDI-A3', 'Health Worker Interaction', 'Can you describe the visits made by health care workers to your home?', 'Probe: how many visits, who came, what information was given, whether TPT was specifically mentioned'),
('IDI-A4', 'TPT Awareness', 'What do you know about the medicine (TPT) that is given to family members to prevent TB?', 'Probe: source of information, perceived purpose, perceived benefits, myths'),
('IDI-A5', 'Decision Making', 'Why did you decide to take / not take TPT?', 'Probe: self-initiated actions, where obtained from, ease or difficulty, family discussions, provider advice'),
('IDI-A6', 'Barriers', 'What problems did you face in taking TPT?', 'Probe: cost, access, side effects, stigma, duration, lack of information, family opposition'),
('IDI-A7', 'Private Sector Specific', 'How did your private doctor guide you regarding TPT for your family members?', 'Probe: was TPT discussed, was a referral given, were drugs arranged, was NTEP involvement mentioned'),
('IDI-A8', 'Suggestions', 'What could have been done better to ensure that you and your family could access and complete TPT?', 'Probe: delivery, enrolment, testing, drug availability, counselling, follow-up support'),
]
for qno, domain, question, probe in idi_questions_a:
p = doc.add_paragraph()
p.add_run(f'{qno} [{domain}]: ').bold = True
p.add_run(question)
p2 = doc.add_paragraph()
p2.add_run(f'Probe: ').italic = True
p2.add_run(probe).italic = True
p2.runs[0].font.size = Pt(10)
p2.runs[1].font.size = Pt(10)
p2.paragraph_format.left_indent = Cm(1.0)
doc.add_paragraph('Response: _______________________________________________').paragraph_format.left_indent = Cm(0.5)
doc.add_paragraph()
doc.add_paragraph()
add_heading(doc, 'IDI-B: For Private Practitioners / Facility Managers', level=3)
idi_questions_b = [
('IDI-B1', 'Opening', 'How was your experience with TB case management and contact tracing in your practice?', 'Probe: frequency, challenges, team involved'),
('IDI-B2', 'Awareness of PMTPT', 'Are you aware of the PMTPT India Guidelines 2021 for TPT among household contacts? How do you implement them?', 'Probe: regimen, eligibility criteria, cascade of care, Nikshay reporting'),
('IDI-B3', 'Current Practice', 'What happens after you diagnose a TB patient? Do you systematically screen and offer TPT to household contacts?', 'Probe: who does the screening, where, what is told to contacts, how many complete TPT'),
('IDI-B4', 'Private Sector Barriers', 'What are the challenges in implementing TPT for contacts of private-sector TB patients?', 'Probe: guideline awareness, drug availability, PPSA linkage, patient willingness, cost, data entry into Nikshay'),
('IDI-B5', 'NTEP Linkage', 'How does your facility coordinate with NTEP/PPSA for contact tracing and TPT?', 'Probe: frequency of PPSA visits, data sharing, drug supply, patient referral pathway'),
('IDI-B6', 'Enablers', 'What factors help you implement TPT successfully?', 'Probe: community trust, patient motivation, PPSA support, training, drug availability'),
('IDI-B7', 'Solutions', 'From your experience, what programmatic changes would increase TPT acceptance and completion among private sector patients\' contacts?', 'Probe: training, drug supply, incentives, simplified protocols, digital tools'),
]
for qno, domain, question, probe in idi_questions_b:
p = doc.add_paragraph()
p.add_run(f'{qno} [{domain}]: ').bold = True
p.add_run(question)
p2 = doc.add_paragraph()
p2.add_run(f'Probe: ').italic = True
p2.add_run(probe).italic = True
p2.runs[0].font.size = Pt(10)
p2.runs[1].font.size = Pt(10)
p2.paragraph_format.left_indent = Cm(1.0)
doc.add_paragraph('Response: _______________________________________________').paragraph_format.left_indent = Cm(0.5)
doc.add_paragraph()
doc.add_page_break()
# ═══════════════════════════════════════════════════════════════════
# INSTRUMENT 4 — PROGRAMME MONITORING & SUPERVISORY CHECKLIST (for DTO/PPSA)
# ═══════════════════════════════════════════════════════════════════
add_heading(doc, 'INSTRUMENT 4', level=1)
add_heading(doc, 'Programme Supervisory Checklist for District TB Office / PPSA', level=2)
p = doc.add_paragraph()
p.add_run('Adapted from: ').bold = True
p.add_run('PMTPT India 2021 - Table 14.1 (Supervisory Checklist) and Supplementary Checklist (tropicalmed-2707987)')
doc.add_paragraph()
add_heading(doc, 'SECTION S1: Organizational and Administrative Readiness', level=3)
tbl_s1 = doc.add_table(rows=14, cols=3)
tbl_s1.style = 'Table Grid'
tbl_s1.columns[0].width = Cm(1.5)
tbl_s1.columns[1].width = Cm(10.5)
tbl_s1.columns[2].width = Cm(3.5)
add_table_header(tbl_s1, ['#', 'Item', 'Status'])
admin_items = [
('S1.1', 'State/District TPT committee established?', '☐ Yes ☐ No'),
('S1.2', 'TPT implementation plan included in Annual PIP (with budget)?', '☐ Yes ☐ No ☐ Planned'),
('S1.3', 'Mapping of private facilities managing TB patients done?', '☐ Done ☐ Partial ☐ Not done'),
('S1.4', 'Line list of all HHC of notified TB patients from private sector available?', '☐ Yes ☐ No ☐ Partial'),
('S1.5', 'Directory of treatment supporters available and updated?', '☐ Yes ☐ No'),
('S1.6', 'Human resources adequate for TPT contact tracing and monitoring?', '☐ Adequate ☐ Insufficient ☐ Vacant posts present'),
('S1.7', 'Training on PMTPT 2021 guidelines completed for staff? (STS, TBHV, ASHA, CHO, Private doctors)', '☐ All trained ☐ Majority ☐ Minority ☐ Not done'),
('S1.8', 'PPSA actively involved in private sector TPT contact tracing in Rajkot?', '☐ Yes - active ☐ Yes - limited ☐ No'),
('S1.9', 'Advocacy/IEC material on TPT available and distributed?', '☐ Available and distributed ☐ Available, not distributed ☐ Not available'),
('S1.10', 'Community volunteers (TB champions, ASHAs) trained and mobilized for TPT?', '☐ Yes ☐ Partially ☐ No'),
('S1.11', 'aDSM (active Drug Safety Monitoring) system in place for TPT ADRs?', '☐ Yes ☐ No'),
('S1.12', 'Mechanism for review of TPT data (Nikshay / Prevent TB India app)?', '☐ Nikshay portal ☐ Prevent TB India App ☐ TPT register ☐ None'),
('S1.13', 'Feedback mechanism to PHC/UPHC on TPT performance in place?', '☐ Yes - regular ☐ Irregular ☐ None'),
]
for i, (num, item, status) in enumerate(admin_items):
row = tbl_s1.rows[i+1]
row.cells[0].text = num
row.cells[1].text = item
row.cells[2].text = status
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
add_heading(doc, 'SECTION S2: Drug Supply and Diagnostics', level=3)
tbl_s2 = doc.add_table(rows=10, cols=3)
tbl_s2.style = 'Table Grid'
tbl_s2.columns[0].width = Cm(1.5)
tbl_s2.columns[1].width = Cm(10.5)
tbl_s2.columns[2].width = Cm(3.5)
add_table_header(tbl_s2, ['#', 'Item', 'Status'])
drug_items = [
('S2.1', 'Current stock of 6H (isoniazid) adequate for all eligible HHC?', '☐ >3 months ☐ 1–3 months ☐ <1 month ☐ Stock-out'),
('S2.2', 'Current stock of 3HP available?', '☐ >3 months ☐ 1–3 months ☐ <1 month ☐ Not available'),
('S2.3', 'Pyridoxine (Vitamin B6) available?', '☐ Yes ☐ No ☐ Insufficient'),
('S2.4', 'Storage space for TPT drugs adequate and suitable?', '☐ Yes ☐ No - space issues'),
('S2.5', 'TST (Tuberculin Skin Test) kits available / accessible?', '☐ In-house ☐ Referred out ☐ Not available'),
('S2.6', 'IGRA testing available (in-house or outsourced)?', '☐ In-house ☐ Outsourced - private lab ☐ Not available'),
('S2.7', 'CXR facilities available for HHC evaluation?', '☐ In-house ☐ Referred out ☐ Not accessible'),
('S2.8', 'Lab supplies for TB infection testing available for estimated number of HHC?', '☐ Adequate ☐ Inadequate ☐ None'),
('S2.9', 'ADR management plan documented and referral pathway to higher facility in place?', '☐ Yes ☐ No ☐ In development'),
]
for i, (num, item, status) in enumerate(drug_items):
row = tbl_s2.rows[i+1]
row.cells[0].text = num
row.cells[1].text = item
row.cells[2].text = status
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
add_heading(doc, 'SECTION S3: TPT Care Cascade Monitoring Indicators (PMTPT 2021, Table 14.3)', level=3)
tbl_s3 = doc.add_table(rows=7, cols=4)
tbl_s3.style = 'Table Grid'
tbl_s3.columns[0].width = Cm(5.0)
tbl_s3.columns[1].width = Cm(3.5)
tbl_s3.columns[2].width = Cm(3.5)
tbl_s3.columns[3].width = Cm(3.5)
add_table_header(tbl_s3, ['Indicator', 'Target (PMTPT)', 'Actual (Rajkot Private Sector)', 'Gap'])
cascade_rows = [
('HHC evaluated for TB disease & TBI / Total HHC of notified PTB patients (%)', '100%', '', ''),
('HHC tested for TBI / HHC evaluated (%)', '>90%', '', ''),
('HHC eligible for TPT / HHC evaluated (%)', 'As per algorithm', '', ''),
('HHC initiated on TPT / HHC eligible (%)', '>90%', '', ''),
('HHC completed TPT / HHC initiated (%)', '>90%', '', ''),
('Post-TPT follow-up at 6, 12, 18, 24 months (%)', '>90%', '', ''),
]
for i, (ind, target, actual, gap) in enumerate(cascade_rows):
row = tbl_s3.rows[i+1]
row.cells[0].text = ind
row.cells[1].text = target
row.cells[2].text = actual
row.cells[3].text = gap
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_page_break()
# ═══════════════════════════════════════════════════════════════════
# ANNEX: OPERATIONAL DEFINITIONS
# ═══════════════════════════════════════════════════════════════════
add_heading(doc, 'ANNEX: Operational Definitions', level=1)
p = doc.add_paragraph()
p.add_run('(As per PMTPT India Guidelines 2021 and Supplementary Data)').italic = True
definitions = [
('Household Contact (HHC)', 'A person who shared the same enclosed living space as the index TB patient for one or more nights or for frequent/extended daytime periods during the 3 months before current TB treatment started.'),
('Index Patient', 'Bacteriologically confirmed or clinically diagnosed pulmonary TB patient notified in Nikshay from a private facility.'),
('TB Preventive Treatment (TPT)', 'Treatment offered to individuals at risk of developing TB disease, to reduce that risk. Not the same as TB treatment.'),
('Eligible for TPT', 'After ruling out active TB: (a) Child HHC ≤5 years; (b) Child HHC >5 years & adults after TBI positive (TST/IGRA) with normal/unavailable CXR; (c) PLHIV.'),
('Started on TPT', 'Eligible person without contraindications who has been initiated on a TPT regimen.'),
('Completed TPT (6H)', '≥144/180 doses taken within 239 days (133% of 6 months).'),
('Completed TPT (3HP)', '≥11/12 doses taken within 120 days.'),
('Lost to Follow-Up', 'TPT interrupted for ≥8 consecutive weeks (6H/6Lfx/4R) or ≥4 weeks (3HP), without traceability.'),
('Breakthrough TB', 'TB disease diagnosed in a contact while receiving TPT, requiring stoppage of TPT and initiation of curative TB treatment.'),
('Programmatic Management of TPT (PMTPT)', 'All coordinated activities by public and private health caregivers and community aimed at scaling up TPT to people who need it.'),
]
tbl_ann = doc.add_table(rows=len(definitions)+1, cols=2)
tbl_ann.style = 'Table Grid'
tbl_ann.columns[0].width = Cm(5.5)
tbl_ann.columns[1].width = Cm(10.0)
add_table_header(tbl_ann, ['Term', 'Definition'])
for i, (term, defn) in enumerate(definitions):
row = tbl_ann.rows[i+1]
row.cells[0].text = term
row.cells[0].paragraphs[0].runs[0].bold = True
row.cells[1].text = defn
if i % 2 == 0:
for c in row.cells: shade_cell(c, 'F2F2F2')
doc.add_paragraph()
# Footer / References
add_heading(doc, 'References and Source Documents', level=2)
refs = [
'1. Ministry of Health and Family Welfare, India. Guidelines for Programmatic Management of Tuberculosis Preventive Treatment in India (PMTPT). Central TB Division, NTEP, New Delhi; 2021.',
'2. World Health Organization. WHO Consolidated Guidelines on Tuberculosis: Module 1 - Prevention: Tuberculosis Preventive Treatment, 2nd Edition. Geneva: WHO; 2024.',
'3. World Health Organization. WHO Operational Handbook on Tuberculosis: Module 1 - Prevention - Infection Prevention and Control. Geneva: WHO; 2023.',
'4. WHO Facility Tuberculosis Risk Assessment Tool. Annex 2 in: WHO Operational Handbook on TB Module 1 IPC (based on MSF tool).',
'5. Butani Y et al. Annexure 1: In-depth interview guide for index patient/HHC. [IDI Guide - Valsad TPT study].',
'6. Supplementary Checklist and Variables (Annex S1, S2, Table S1-S2). Tropical Medicine Supplementary Data (tropicalmed-2707987). Delhi Chest Clinic TPT Study.',
'7. WHO TB Knowledge Sharing Platform. Identifying Populations for TB Preventive Treatment. https://tbksp.who.int',
]
for ref in refs:
p = doc.add_paragraph(ref, style='List Number')
p.runs[0].font.size = Pt(10)
# ─── SAVE ────────────────────────────────────────────────────────
output_path = '/tmp/workspace/tpt-thesis-questionnaire/TPT_Thesis_Questionnaire_Rajkot.docx'
doc.save(output_path)
print(f"Saved: {output_path}")
PYEOF
Running Command
ls -lh /tmp/workspace/tpt-thesis-questionnaire/
Your questionnaire is ready. Here is the download link:
TPT Thesis Questionnaire Rajkot
Word Document · DOCX
What Was Built - Complete Overview
The questionnaire is a mixed-method, 4-instrument package tailored specifically for your thesis title ("Evaluation of Programmatic Management of TPT among Household Contacts of Pulmonary TB Patients in the Private Health Sector of Rajkot City"). Every section is directly grounded in your uploaded source documents.