Kya tum image generate kar sakte ho agar mai tumhe content du to
Cystic Fibrosis (CF) – MBBS Final Year Medicine Definition Cystic fibrosis (CF) is an autosomal recessive genetic disorder caused by mutation in the CFTR gene on chromosome 7, leading to defective chloride transport. This causes thick, sticky secretions affecting the lungs, pancreas, liver, intestines, and reproductive tract. --- High-Yield Mnemonic "CF = CLOGGED FLUIDS" C → Chronic lung infections F → Fat malabsorption C → Chloride ↑ in sweat L → Lung bronchiectasis O → Obstruction of pancreatic ducts G → Growth failure G → Gene defect (CFTR) E → Electrolyte loss (salty sweat) D → Diabetes (late complication) --- Genetics Inheritance: Autosomal recessive Gene: CFTR Chromosome: 7 Most common mutation: ΔF508 (Deletion of Phenylalanine at position 508) Easy Trick "7 din se F-508 gayab hai." 7 → Chromosome 7 F508 → Most common mutation --- Pathophysiology Remember: "No Chloride Out → Water Doesn't Follow → Thick Mucus" 1. CFTR defect 2. ↓ Chloride secretion 3. ↑ Sodium absorption 4. Water absorbed into cells 5. Secretions become thick 6. Duct obstruction 7. Infection + inflammation 8. Organ damage --- Organs Affected 1. Respiratory System Thick mucus Chronic cough Recurrent pneumonia Bronchiectasis Wheezing Hemoptysis Respiratory failure Common organisms Staphylococcus aureus Haemophilus influenzae Pseudomonas aeruginosa (adults) Trick "SHP attacks lungs" S = Staph H = H. influenzae P = Pseudomonas --- 2. Pancreas Pancreatic duct obstruction Exocrine pancreatic insufficiency Fat malabsorption Steatorrhea Fat-soluble vitamin deficiency (A, D, E, K) Diabetes mellitus (late) --- 3. Gastrointestinal Meconium ileus (newborn) Distal intestinal obstruction syndrome Constipation --- 4. Liver Biliary cirrhosis Portal hypertension --- 5. Sweat Glands High sweat chloride Salty skin Hyponatremia in hot weather Trick "Kiss of a CF baby tastes salty." --- 6. Reproductive System Male Congenital bilateral absence of vas deferens Infertility Female Thick cervical mucus Reduced fertility --- Clinical Features Respiratory Chronic productive cough Wheezing Breathlessness Recurrent chest infections Bronchiectasis Digital clubbing Gastrointestinal Steatorrhea Failure to thrive Poor weight gain Vitamin deficiency Others Salty sweat Nasal polyps Infertility --- Diagnosis Gold Standard Sweat Chloride Test Chloride ≥60 mmol/L = Diagnostic Other tests Newborn screening (IRT) Genetic testing (CFTR mutation) Chest X-ray / HRCT Pulmonary function tests Sputum culture Fecal elastase (pancreatic insufficiency) Trick "CF = Chloride Full (Sweat chloride ↑)" --- Management 1. Airway Clearance Chest physiotherapy Postural drainage Positive expiratory pressure devices 2. Mucolytics Dornase alfa (DNase) Hypertonic saline nebulization MOA Dornase alfa: Breaks extracellular DNA → decreases sputum viscosity. Hypertonic saline: Draws water into airway → hydrates mucus. --- 3. Antibiotics According to sputum culture Anti-pseudomonal antibiotics when indicated --- 4. Bronchodilators If bronchospasm present --- 5. Pancreatic Enzyme Replacement Therapy (PERT) Lipase Amylase Protease --- 6. Nutritional Support High-calorie diet High-protein diet Fat-soluble vitamins (A, D, E, K) --- 7. CFTR Modulators (Disease-modifying) Drug MOA Ivacaftor Increases opening of CFTR channel Lumacaftor Improves CFTR folding and trafficking Tezacaftor Improves CFTR processing Elexacaftor Improves CFTR function; used in triple therapy Trick "Correct → Potentiate" Correctors = Lumacaftor, Tezacaftor, Elexacaftor Potentiator = Ivacaftor --- 8. Lung Transplant End-stage lung disease --- Complications Bronchiectasis Massive hemoptysis Pneumothorax Respiratory failure Pulmonary hypertension Cor pulmonale Diabetes mellitus Liver cirrhosis Osteoporosis Infertility --- Exam Pearls (Very High Yield) ✅ Autosomal recessive disorder ✅ CFTR mutation on chromosome 7 ✅ ΔF508 is the commonest mutation ✅ Thick mucus due to defective chloride transport ✅ Sweat chloride >60 mmol/L confirms diagnosis ✅ Bronchiectasis + recurrent Pseudomonas infection ✅ Pancreatic insufficiency → steatorrhea + ADEK deficiency ✅ Meconium ileus in neonates ✅ Male infertility (absence of vas deferens) ✅ CFTR modulators: Ivacaftor, Lumacaftor, Tezacaftor, Elexacaftor One-line Revision Trick "CF = 7 → F508 → Thick mucus → Salty sweat → Pseudomonas lungs → Steatorrhea → Sweat chloride >60 → Ivacaftor + Enzymes + Chest physiotherapy." Ye content hai ache se image banao jisme ye saara content cover hona chaie kuch bhi rehna nhi chaie baaki saath he trick add kar do jis se mai aasani se yaad kar saku
ls -la /home/daytona/workspace/
mkdir -p /home/daytona/workspace/cf-notes && python3 -c "from reportlab.lib import colors; print('reportlab ok')"
~/cf-notes/generate_cf_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
# ── Colour palette ──────────────────────────────────────────────────────────
TEAL = colors.HexColor("#0D7377")
DARK_TEAL = colors.HexColor("#14302D")
LIGHT_TEAL = colors.HexColor("#E0F4F4")
ORANGE = colors.HexColor("#E07B39")
LIGHT_ORANGE= colors.HexColor("#FFF3EC")
YELLOW_BG = colors.HexColor("#FFFBEA")
GREEN = colors.HexColor("#2E7D32")
LIGHT_GREEN = colors.HexColor("#E8F5E9")
RED = colors.HexColor("#C62828")
LIGHT_RED = colors.HexColor("#FFEBEE")
PURPLE = colors.HexColor("#6A1B9A")
LIGHT_PURPLE= colors.HexColor("#F3E5F5")
GREY_BG = colors.HexColor("#F5F5F5")
DARK_GREY = colors.HexColor("#424242")
WHITE = colors.white
BLACK = colors.black
# ── Page setup ───────────────────────────────────────────────────────────────
W, H = A4
MARGIN = 14 * mm
doc = SimpleDocTemplate(
"/home/daytona/workspace/cf-notes/Cystic_Fibrosis_MBBS.pdf",
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=12*mm, bottomMargin=12*mm
)
styles = getSampleStyleSheet()
def style(name, **kw):
return ParagraphStyle(name, **kw)
# ── Custom paragraph styles ──────────────────────────────────────────────────
title_style = style("Title2",
fontSize=20, leading=24, alignment=TA_CENTER,
textColor=WHITE, fontName="Helvetica-Bold", spaceAfter=2)
subtitle_style = style("Sub",
fontSize=10, leading=13, alignment=TA_CENTER,
textColor=colors.HexColor("#B2DFDB"), fontName="Helvetica", spaceAfter=0)
section_header = style("SH",
fontSize=11, leading=14, alignment=TA_LEFT,
textColor=WHITE, fontName="Helvetica-Bold",
spaceBefore=2, spaceAfter=2, leftIndent=4)
body = style("Body2",
fontSize=8.5, leading=12, alignment=TA_LEFT,
textColor=DARK_GREY, fontName="Helvetica", spaceAfter=1)
body_b = style("BodyB",
fontSize=8.5, leading=12, alignment=TA_LEFT,
textColor=BLACK, fontName="Helvetica-Bold", spaceAfter=1)
mnemonic_style = style("Mnem",
fontSize=9, leading=13, alignment=TA_CENTER,
textColor=DARK_TEAL, fontName="Helvetica-Bold", spaceAfter=1)
trick_style = style("Trick",
fontSize=8.5, leading=12, alignment=TA_LEFT,
textColor=ORANGE, fontName="Helvetica-BoldOblique", spaceAfter=1)
bullet_style = style("Bullet",
fontSize=8.5, leading=12, leftIndent=10,
textColor=DARK_GREY, fontName="Helvetica", spaceAfter=1, bulletIndent=2)
pearl_style = style("Pearl",
fontSize=8.5, leading=12, leftIndent=6,
textColor=GREEN, fontName="Helvetica-Bold", spaceAfter=1)
# ── Helper builders ───────────────────────────────────────────────────────────
def section_box(title, color=TEAL):
"""Coloured section header box."""
data = [[Paragraph(title, section_header)]]
t = Table(data, colWidths=[W - 2*MARGIN])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROUNDEDCORNERS", [4,4,4,4]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
return t
def mnemonic_box(heading, lines, bg=LIGHT_TEAL, border=TEAL):
"""Box with mnemonic / trick content."""
content = [Paragraph(heading, mnemonic_style)]
for l in lines:
content.append(Paragraph(l, trick_style))
data = [[content]]
t = Table(data, colWidths=[W - 2*MARGIN])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.2, border),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING",(0,0), (-1,-1), 10),
]))
return t
def two_col(left_items, right_items, header_left="", header_right=""):
col = (W - 2*MARGIN) / 2 - 1*mm
def make_cell(hdr, items):
cell = []
if hdr:
cell.append(Paragraph(hdr, body_b))
for it in items:
cell.append(Paragraph(f"• {it}", bullet_style))
return cell
data = [[make_cell(header_left, left_items), make_cell(header_right, right_items)]]
t = Table(data, colWidths=[col+2*mm, col])
t.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("BACKGROUND", (0,0), (0,-1), LIGHT_TEAL),
("BACKGROUND", (1,0), (1,-1), LIGHT_GREEN),
("BOX", (0,0), (0,-1), 0.5, TEAL),
("BOX", (1,0), (1,-1), 0.5, GREEN),
]))
return t
def info_table(rows, col_ratio=(0.35, 0.65)):
usable = W - 2*MARGIN
col_w = [usable*col_ratio[0], usable*col_ratio[1]]
table_data = []
for i,(k,v) in enumerate(rows):
bg = GREY_BG if i%2==0 else WHITE
table_data.append([
Paragraph(k, body_b),
Paragraph(v, body)
])
t = Table(table_data, colWidths=col_w)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), LIGHT_TEAL),
("ROWBACKGROUNDS",(0,0),(-1,-1),[GREY_BG, WHITE]),
("BOX", (0,0), (-1,-1), 0.5, TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
return t
def drug_table(rows):
usable = W - 2*MARGIN
col_w = [usable*0.30, usable*0.70]
hdr = [Paragraph("Drug", style("dh", fontSize=9, fontName="Helvetica-Bold",
textColor=WHITE)),
Paragraph("Mechanism of Action", style("dh2", fontSize=9,
fontName="Helvetica-Bold", textColor=WHITE))]
table_data = [hdr]
for d,m in rows:
table_data.append([Paragraph(d, body_b), Paragraph(m, body)])
t = Table(table_data, colWidths=col_w)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), PURPLE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_PURPLE, WHITE]),
("BOX", (0,0), (-1,-1), 0.5, PURPLE),
("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
return t
def sp(h=3):
return Spacer(1, h*mm)
def hr(color=TEAL):
return HRFlowable(width="100%", thickness=0.5, color=color, spaceAfter=2, spaceBefore=2)
def bullets(items, color=DARK_GREY):
bs = style("bs_", fontSize=8.5, leading=12, leftIndent=12,
textColor=color, fontName="Helvetica", spaceAfter=1, bulletIndent=4)
return [Paragraph(f"• {i}", bs) for i in items]
def organ_box(title, items, bg, border):
cell_content = [Paragraph(title, style("ot", fontSize=9, fontName="Helvetica-Bold",
textColor=border, spaceAfter=3))]
for it in items:
cell_content.append(Paragraph(f"• {it}", style("oi", fontSize=8, leading=11,
leftIndent=8, fontName="Helvetica",
textColor=DARK_GREY, spaceAfter=1)))
data = [[cell_content]]
t = Table(data, colWidths=[(W-2*MARGIN)/3 - 2*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1.2, border),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
]))
return t
# ═══════════════════════════════════════════════════════════════════════════
# CONTENT BUILD
# ═══════════════════════════════════════════════════════════════════════════
story = []
# ── TITLE BANNER ─────────────────────────────────────────────────────────────
title_data = [[
Paragraph("CYSTIC FIBROSIS (CF)", title_style),
Paragraph("MBBS Final Year · Medicine", subtitle_style)
]]
title_table = Table([[
Paragraph("CYSTIC FIBROSIS (CF)", title_style),
]], colWidths=[W - 2*MARGIN])
title_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_TEAL),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 12),
("ALIGN", (0,0), (-1,-1), "CENTER"),
]))
story.append(title_table)
sub_table = Table([[Paragraph("MBBS Final Year · Medicine · High-Yield Study Notes", subtitle_style)]], colWidths=[W-2*MARGIN])
sub_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), TEAL),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("ALIGN", (0,0), (-1,-1), "CENTER"),
]))
story.append(sub_table)
story.append(sp(4))
# ── DEFINITION BOX ───────────────────────────────────────────────────────────
def_text = ("<b>Cystic Fibrosis</b> is an <b>autosomal recessive</b> genetic disorder caused by "
"mutation in the <b>CFTR gene on chromosome 7</b>, leading to <b>defective chloride "
"transport</b>. This causes thick, sticky secretions affecting the <b>lungs, pancreas, "
"liver, intestines,</b> and <b>reproductive tract</b>.")
def_data = [[Paragraph(def_text, style("def", fontSize=9, leading=13,
textColor=DARK_TEAL, fontName="Helvetica", spaceAfter=0))]]
def_table = Table(def_data, colWidths=[W-2*MARGIN])
def_table.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), LIGHT_TEAL),
("BOX", (0,0),(-1,-1), 1.5, TEAL),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
]))
story.append(def_table)
story.append(sp(4))
# ── MNEMONIC + GENETICS side by side ─────────────────────────────────────────
mnem_lines = [
"C → Chronic lung infections",
"F → Fat malabsorption",
"C → Chloride ↑ in sweat",
"L → Lung bronchiectasis",
"O → Obstruction of pancreatic ducts",
"G → Growth failure",
"G → Gene defect (CFTR)",
"E → Electrolyte loss (salty sweat)",
"D → Diabetes (late complication)",
]
mnem_cell = [Paragraph("🧠 MNEMONIC: \"CF = CLOGGED FLUIDS\"", style("mh",
fontSize=9.5, fontName="Helvetica-Bold", textColor=TEAL, spaceAfter=4))]
for l in mnem_lines:
letter, rest = l.split("→", 1)
mnem_cell.append(Paragraph(
f"<b><font color='#E07B39'>{letter.strip()}→</font></b> {rest.strip()}",
style("ml", fontSize=8.5, leading=12, leftIndent=6, fontName="Helvetica",
textColor=DARK_GREY, spaceAfter=1)))
gen_rows = [
("Inheritance", "Autosomal Recessive"),
("Gene", "CFTR"),
("Chromosome", "7"),
("Common Mutation", "ΔF508 (deletion of Phe at position 508)"),
]
gen_cell = [Paragraph("🧬 GENETICS", style("gh", fontSize=9.5,
fontName="Helvetica-Bold", textColor=PURPLE, spaceAfter=4))]
for k,v in gen_rows:
gen_cell.append(Paragraph(
f"<b>{k}:</b> {v}",
style("gr", fontSize=8.5, leading=12, leftIndent=4, fontName="Helvetica",
textColor=DARK_GREY, spaceAfter=3)))
gen_cell.append(sp(1))
gen_cell.append(Paragraph(
"💡 Trick: <i>\"7 din se F-508 gayab hai\"</i><br/>"
"7 → Chromosome 7 | F508 → Commonest mutation",
style("gt", fontSize=8.5, leading=12, leftIndent=4, fontName="Helvetica",
textColor=ORANGE, spaceAfter=0)))
col = (W-2*MARGIN)/2 - 1.5*mm
row_data = [[mnem_cell, gen_cell]]
side_table = Table(row_data, colWidths=[col+3*mm, col-3*mm])
side_table.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1), "TOP"),
("BACKGROUND", (0,0),(0,-1), YELLOW_BG),
("BACKGROUND", (1,0),(1,-1), LIGHT_PURPLE),
("BOX", (0,0),(0,-1), 1, ORANGE),
("BOX", (1,0),(1,-1), 1, PURPLE),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
]))
story.append(side_table)
story.append(sp(4))
# ── PATHOPHYSIOLOGY ───────────────────────────────────────────────────────────
story.append(section_box("⚙️ PATHOPHYSIOLOGY", DARK_TEAL))
story.append(sp(2))
patho_trick = mnemonic_box(
"💡 Key Concept: \"No Chloride Out → Water Doesn't Follow → Thick Mucus\"",
[], bg=LIGHT_TEAL, border=TEAL)
story.append(patho_trick)
story.append(sp(2))
patho_steps = [
("1", "CFTR gene defect"),
("2", "↓ Chloride secretion into lumen"),
("3", "↑ Sodium absorption (compensatory)"),
("4", "Water absorbed back into cells"),
("5", "Secretions become thick & viscous"),
("6", "Duct obstruction"),
("7", "Infection + Inflammation"),
("8", "Progressive organ damage"),
]
patho_data = [[
Paragraph(f"<b><font color='#0D7377'>{n}</font></b>",
style("pn", fontSize=11, fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph(desc, style("pd", fontSize=8.5, leading=12, fontName="Helvetica", textColor=DARK_GREY))
] for n, desc in patho_steps]
patho_table = Table(patho_data, colWidths=[12*mm, W-2*MARGIN-14*mm])
patho_table.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [LIGHT_TEAL, WHITE]),
("BOX", (0,0),(-1,-1), 0.5, TEAL),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("ALIGN", (0,0),(0,-1), "CENTER"),
]))
story.append(patho_table)
story.append(sp(4))
# ── ORGANS AFFECTED ────────────────────────────────────────────────────────────
story.append(section_box("🫁 ORGANS AFFECTED", colors.HexColor("#1565C0")))
story.append(sp(2))
organ_col_w = (W-2*MARGIN)/3 - 1.5*mm
organs = [
("RESPIRATORY", [
"Thick mucus, Chronic cough",
"Recurrent pneumonia",
"Bronchiectasis, Wheezing",
"Hemoptysis, Resp. failure",
"Organisms: Staph → H.influenzae → Pseudomonas",
"Trick: 'SHP attacks lungs'",
], LIGHT_TEAL, TEAL),
("PANCREAS", [
"Pancreatic duct obstruction",
"Exocrine insufficiency",
"Fat malabsorption, Steatorrhea",
"Vit A,D,E,K deficiency",
"Diabetes mellitus (late)",
], LIGHT_GREEN, GREEN),
("GIT + LIVER", [
"Meconium ileus (newborn)",
"Distal intestinal obstruction",
"Constipation",
"Biliary cirrhosis",
"Portal hypertension",
], LIGHT_ORANGE, ORANGE),
("SWEAT GLANDS", [
"High sweat chloride",
"Salty skin",
"Hyponatremia in hot weather",
"Trick: 'Kiss of a CF baby",
"tastes salty'",
], YELLOW_BG, ORANGE),
("REPRODUCTIVE", [
"Male: Absence of vas deferens → Infertility",
"Female: Thick cervical mucus",
"Reduced female fertility",
], LIGHT_PURPLE, PURPLE),
("CLINICAL FEATURES", [
"Digital clubbing",
"Nasal polyps",
"Failure to thrive",
"Poor weight gain",
"Salty sweat",
], LIGHT_RED, RED),
]
# 3-column organ grid
for i in range(0, 6, 3):
row = []
for bg, border, title_col in [(organs[i][2], organs[i][3], organs[i][0]),
(organs[i+1][2], organs[i+1][3], organs[i+1][0]),
(organs[i+2][2], organs[i+2][3], organs[i+2][0])]:
idx = i + [organs[i][0],organs[i+1][0],organs[i+2][0]].index(title_col)
cell_content = [Paragraph(organs[idx][0],
style("ot2", fontSize=9, fontName="Helvetica-Bold",
textColor=organs[idx][3], spaceAfter=3))]
for it in organs[idx][1]:
cell_content.append(Paragraph(f"• {it}",
style("oi2", fontSize=8, leading=11, leftIndent=6,
fontName="Helvetica", textColor=DARK_GREY, spaceAfter=1)))
row.append(cell_content)
row_table = Table([row], colWidths=[organ_col_w+2*mm]*3)
row_table.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1), "TOP"),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 6),
("RIGHTPADDING", (0,0),(-1,-1), 6),
("BACKGROUND", (0,0),(0,-1), organs[i][2]),
("BACKGROUND", (1,0),(1,-1), organs[i+1][2]),
("BACKGROUND", (2,0),(2,-1), organs[i+2][2]),
("BOX", (0,0),(0,-1), 1, organs[i][3]),
("BOX", (1,0),(1,-1), 1, organs[i+1][3]),
("BOX", (2,0),(2,-1), 1, organs[i+2][3]),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#DDDDDD")),
]))
story.append(row_table)
story.append(sp(2))
story.append(sp(2))
# ── DIAGNOSIS ─────────────────────────────────────────────────────────────────
story.append(section_box("🔬 DIAGNOSIS", GREEN))
story.append(sp(2))
gold_data = [[Paragraph(
"⭐ GOLD STANDARD: Sweat Chloride Test | Chloride ≥ 60 mmol/L = Diagnostic",
style("gs", fontSize=9.5, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER))]]
gold_table = Table(gold_data, colWidths=[W-2*MARGIN])
gold_table.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), GREEN),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("ALIGN", (0,0),(-1,-1), "CENTER"),
]))
story.append(gold_table)
story.append(sp(2))
diag_rows = [
("Newborn Screening", "Immunoreactive Trypsinogen (IRT)"),
("Genetic Testing", "CFTR mutation analysis (ΔF508)"),
("Imaging", "Chest X-ray / HRCT (bronchiectasis)"),
("Lung Function", "Pulmonary function tests (obstructive pattern)"),
("Microbiology", "Sputum culture (Pseudomonas, Staph, H. influenzae)"),
("Pancreas", "Fecal elastase (pancreatic insufficiency)"),
]
story.append(info_table(diag_rows))
story.append(sp(2))
story.append(mnemonic_box(
"💡 Trick: \"CF = Chloride Full (Sweat chloride ↑)\"",
[], bg=LIGHT_GREEN, border=GREEN))
story.append(sp(4))
# ── MANAGEMENT ────────────────────────────────────────────────────────────────
story.append(section_box("💊 MANAGEMENT", ORANGE))
story.append(sp(2))
mgmt_col = (W-2*MARGIN)/2 - 1.5*mm
mgmt_left = [
Paragraph("1️⃣ AIRWAY CLEARANCE", style("mh2", fontSize=9, fontName="Helvetica-Bold",
textColor=TEAL, spaceAfter=3)),
*bullets(["Chest physiotherapy", "Postural drainage", "Positive expiratory pressure devices"]),
sp(2),
Paragraph("2️⃣ MUCOLYTICS", style("mh2", fontSize=9, fontName="Helvetica-Bold",
textColor=TEAL, spaceAfter=3)),
*bullets(["Dornase alfa (DNase) → breaks extracellular DNA → ↓ sputum viscosity",
"Hypertonic saline → draws water into airway → hydrates mucus"]),
sp(2),
Paragraph("3️⃣ ANTIBIOTICS", style("mh2", fontSize=9, fontName="Helvetica-Bold",
textColor=TEAL, spaceAfter=3)),
*bullets(["Per sputum culture", "Anti-pseudomonal when Pseudomonas isolated"]),
sp(2),
Paragraph("4️⃣ BRONCHODILATORS", style("mh2", fontSize=9, fontName="Helvetica-Bold",
textColor=TEAL, spaceAfter=3)),
*bullets(["If bronchospasm present"]),
]
mgmt_right = [
Paragraph("5️⃣ PERT (Pancreatic Enzyme Replacement)", style("mh2", fontSize=9,
fontName="Helvetica-Bold", textColor=ORANGE, spaceAfter=3)),
*bullets(["Lipase", "Amylase", "Protease"]),
sp(2),
Paragraph("6️⃣ NUTRITIONAL SUPPORT", style("mh2", fontSize=9, fontName="Helvetica-Bold",
textColor=ORANGE, spaceAfter=3)),
*bullets(["High-calorie, high-protein diet", "Fat-soluble vitamins: A, D, E, K"]),
sp(2),
Paragraph("7️⃣ CFTR MODULATORS ★", style("mh2", fontSize=9, fontName="Helvetica-Bold",
textColor=PURPLE, spaceAfter=3)),
Paragraph("💡 Trick: <i>\"Correct → Potentiate\"</i>",
style("ct", fontSize=8.5, textColor=ORANGE, fontName="Helvetica-BoldOblique",
spaceAfter=3, leftIndent=6)),
Paragraph("<b>Correctors:</b> Lumacaftor, Tezacaftor, Elexacaftor<br/>"
"<b>Potentiator:</b> Ivacaftor",
style("cmod", fontSize=8.5, leading=12, textColor=PURPLE, fontName="Helvetica",
spaceAfter=4, leftIndent=6)),
sp(2),
Paragraph("8️⃣ LUNG TRANSPLANT", style("mh2", fontSize=9, fontName="Helvetica-Bold",
textColor=RED, spaceAfter=3)),
*bullets(["End-stage lung disease"]),
]
mgmt_table = Table([[mgmt_left, mgmt_right]], colWidths=[mgmt_col+2*mm, mgmt_col-2*mm])
mgmt_table.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1), "TOP"),
("BACKGROUND", (0,0),(0,-1), LIGHT_TEAL),
("BACKGROUND", (1,0),(1,-1), LIGHT_ORANGE),
("BOX", (0,0),(0,-1), 1, TEAL),
("BOX", (1,0),(1,-1), 1, ORANGE),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
]))
story.append(mgmt_table)
story.append(sp(3))
# Drug table
story.append(Paragraph("CFTR Modulators – Mechanism of Action",
style("dt_h", fontSize=9.5, fontName="Helvetica-Bold", textColor=PURPLE,
spaceBefore=2, spaceAfter=3)))
drug_rows = [
("Ivacaftor", "Potentiator – Increases opening (gating) of CFTR channel"),
("Lumacaftor", "Corrector – Improves CFTR protein folding and trafficking to cell surface"),
("Tezacaftor", "Corrector – Improves CFTR processing and stability"),
("Elexacaftor", "Next-gen Corrector – Improves CFTR function; used in triple therapy (Kaftrio)"),
]
story.append(drug_table(drug_rows))
story.append(sp(4))
# ── COMPLICATIONS ─────────────────────────────────────────────────────────────
story.append(section_box("⚠️ COMPLICATIONS", RED))
story.append(sp(2))
comp_items = [
["Bronchiectasis", "Massive Hemoptysis", "Pneumothorax", "Respiratory Failure", "Pulmonary Hypertension"],
["Cor Pulmonale", "Diabetes Mellitus", "Liver Cirrhosis", "Osteoporosis", "Infertility (Male/Female)"],
]
comp_data = []
for left, right in zip(comp_items[0], comp_items[1]):
comp_data.append([
Paragraph(f"🔴 {left}", style("ci", fontSize=8.5, fontName="Helvetica",
textColor=RED, spaceAfter=1)),
Paragraph(f"🔴 {right}", style("ci2", fontSize=8.5, fontName="Helvetica",
textColor=RED, spaceAfter=1)),
])
comp_table = Table(comp_data, colWidths=[(W-2*MARGIN)/2]*2)
comp_table.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [LIGHT_RED, WHITE]),
("BOX", (0,0),(-1,-1), 0.5, RED),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#FFCDD2")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(comp_table)
story.append(sp(4))
# ── EXAM PEARLS ───────────────────────────────────────────────────────────────
story.append(section_box("⭐ EXAM PEARLS (Very High Yield)", colors.HexColor("#F57F17")))
story.append(sp(2))
pearls = [
"Autosomal recessive disorder",
"CFTR mutation on chromosome 7",
"ΔF508 is the commonest mutation (deletion of Phenylalanine)",
"Thick mucus due to defective chloride transport",
"Sweat Chloride >60 mmol/L confirms diagnosis",
"Bronchiectasis + recurrent Pseudomonas infection",
"Pancreatic insufficiency → Steatorrhea + ADEK deficiency",
"Meconium ileus in neonates (first presentation)",
"Male infertility – Congenital bilateral absence of vas deferens",
"CFTR modulators: Ivacaftor (potentiator) + Lumacaftor/Tezacaftor/Elexacaftor (correctors)",
]
pearl_data = [[Paragraph(f"✅ {p}", style("ep", fontSize=8.5, leading=12,
fontName="Helvetica-Bold", textColor=GREEN, spaceAfter=1))]
for p in pearls]
pearl_table = Table(pearl_data, colWidths=[W-2*MARGIN])
pearl_table.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [LIGHT_GREEN, WHITE]),
("BOX", (0,0),(-1,-1), 0.5, GREEN),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#C8E6C9")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
story.append(pearl_table)
story.append(sp(4))
# ── ONE-LINE REVISION TRICK ──────────────────────────────────────────────────
revision = ("CF = Chromosome <b>7</b> → <b>F508</b> → Thick mucus → "
"<b>Salty sweat</b> → Pseudomonas lungs → <b>Steatorrhea</b> → "
"Sweat Cl⁻ <b>>60</b> → <b>Ivacaftor</b> + Enzymes + Chest physio")
rev_data = [[
Paragraph("🚀 ONE-LINE REVISION TRICK", style("rh", fontSize=9,
fontName="Helvetica-Bold", textColor=WHITE, spaceAfter=3)),
Paragraph(revision, style("rb", fontSize=8.5, leading=13,
fontName="Helvetica", textColor=WHITE, spaceAfter=0))
]]
rev_table = Table(rev_data, colWidths=[62*mm, W-2*MARGIN-64*mm])
rev_table.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DARK_TEAL),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
("LINEAFTER", (0,0),(0,-1), 1, TEAL),
]))
story.append(rev_table)
story.append(sp(3))
# ── FOOTER ───────────────────────────────────────────────────────────────────
footer_data = [[Paragraph(
"Prepared for MBBS Final Year · Cystic Fibrosis · High-Yield Notes",
style("ft", fontSize=7.5, textColor=colors.HexColor("#888888"),
fontName="Helvetica", alignment=TA_CENTER))]]
footer_table = Table(footer_data, colWidths=[W-2*MARGIN])
footer_table.setStyle(TableStyle([
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("ALIGN", (0,0),(-1,-1), "CENTER"),
("LINEABOVE", (0,0),(-1,-1), 0.5, colors.HexColor("#AAAAAA")),
]))
story.append(footer_table)
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print("PDF generated successfully!")
cd /home/daytona/workspace/cf-notes && python3 generate_cf_pdf.py 2>&1
ls -lh /home/daytona/workspace/cf-notes/
Cystic Fibrosis MBBS
PDF Document · PDF
| Section | Detail |
|---|---|
| Title Banner | Dark teal header - MBBS Final Year badge |
| Definition Box | Key points highlighted |
| Mnemonic: CLOGGED FLUIDS | Color-coded with orange arrows |
| Genetics | Table + "7 din se F-508 gayab hai" trick |
| Pathophysiology | Step-by-step numbered flow |
| 6 Organs Affected | Color-coded 3x2 grid boxes |
| Diagnosis | Gold standard highlighted + table |
| Management | 2-column layout, all 8 steps |
| CFTR Modulators | Purple drug table with MOA |
| Complications | Red 2-column table |
| Exam Pearls | Green checklist - 10 high-yield points |
| One-Line Revision | Dark footer banner |
Nhi bana
ls -lh /home/daytona/workspace/cf-notes/ && python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/cf-notes/Cystic_Fibrosis_MBBS.pdf') print(f'Pages: {len(r.pages)}') print(f'Page 1 text (first 200 chars): {r.pages[0].extract_text()[:200]}') "
Cystic Fibrosis MBBS
PDF Document · PDF
Convert PDF to high-resolution PNG images
which pdftoppm && pdftoppm -r 200 /home/daytona/workspace/cf-notes/Cystic_Fibrosis_MBBS.pdf /home/daytona/workspace/cf-notes/cf_page && ls -lh /home/daytona/workspace/cf-notes/
python3 -c " from PIL import Image import os for i in range(1, 4): ppm = f'/home/daytona/workspace/cf-notes/cf_page-{i}.ppm' png = f'/home/daytona/workspace/cf-notes/CF_Page_{i}.png' img = Image.open(ppm) img.save(png, 'PNG', optimize=True) os.remove(ppm) size = os.path.getsize(png) / 1024 print(f'Page {i}: {img.size[0]}x{img.size[1]}px | {size:.0f} KB -> {png}') "
CF Page 1
Image · PNG
CF Page 2
Image · PNG
CF Page 3
Image · PNG