Questions gulor ans reference book soho dau & English ans gula ektu shortly and easy ans dau Banglay breafly bujhay dau
| Flagellate | Pathogenicity | Site |
|---|---|---|
| Giardia lamblia | + (Pathogenic) | Intestine |
| Dientamoeba fragilis | ? (Uncertain) | Intestine |
| Chilomastix mesnili | − (Non-pathogenic) | Intestine |
| Enteromonas hominis | − | Intestine |
| Retortamonas intestinalis | − | Intestine |
| Trichomonas hominis | − | Intestine |
| Trichomonas tenax | − | Mouth |
| Trichomonas vaginalis | + (Pathogenic) | Vagina |
| Form | কী |
|---|---|
| Infective form | Cyst (4 nuclei) |
| Pathogenic form | Trophozoite (পেটে রোগ তৈরি করে) |
| Diagnostic form | Cyst (মলে পাওয়া যায়); তীব্র অসুস্থতায় Trophozoiteও পাওয়া যায় |
| মহিলা | পুরুষ |
|---|---|
| Vagina - warm, moist, পরজীবীর জন্য ideal environment | Urethra সরু, প্রস্রাবের সাথে জীবাণু ধুয়ে যায় |
| Low pH (acidic) - T. vaginalis পছন্দ করে | Urine flow mechanically পরজীবী সরিয়ে দেয় |
| Squamous epithelium বেশি exposed | Squamous epithelium কম exposed |
Reference: Sherris & Ryan's Medical Microbiology, 8th Edition (Chapter 53 - Flagellates) | Goodman & Gilman's Pharmacological Basis of Therapeutics (Trichomoniasis treatment)
Create a study guide PDF comparing Giardia vs Trichomonas pathology
mkdir -p /tmp/workspace/giardia-trichomonas && ls /tmp/workspace/
~/giardia-trichomonas/create_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/tmp/workspace/giardia-trichomonas/Giardia_vs_Trichomonas_Study_Guide.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm,
leftMargin=1.8*cm,
topMargin=2*cm,
bottomMargin=2*cm
)
styles = getSampleStyleSheet()
# ── Custom styles ──────────────────────────────────────────────────────────────
TEAL = colors.HexColor("#007B7F")
GREEN = colors.HexColor("#2E7D32")
PURPLE = colors.HexColor("#6A1B9A")
AMBER = colors.HexColor("#E65100")
LIGHT_TEAL = colors.HexColor("#E0F4F4")
LIGHT_GREEN = colors.HexColor("#E8F5E9")
LIGHT_PURPLE= colors.HexColor("#F3E5F5")
LIGHT_AMBER = colors.HexColor("#FFF3E0")
LIGHT_BLUE = colors.HexColor("#E3F2FD")
DARK_GREY = colors.HexColor("#263238")
MID_GREY = colors.HexColor("#455A64")
ROW_ALT = colors.HexColor("#F5F5F5")
WHITE = colors.white
title_style = ParagraphStyle(
"TitleStyle",
parent=styles["Title"],
fontSize=22,
textColor=WHITE,
alignment=TA_CENTER,
spaceAfter=6,
fontName="Helvetica-Bold",
)
subtitle_style = ParagraphStyle(
"SubtitleStyle",
parent=styles["Normal"],
fontSize=11,
textColor=colors.HexColor("#B2EBF2"),
alignment=TA_CENTER,
spaceAfter=4,
fontName="Helvetica",
)
section_style = ParagraphStyle(
"SectionStyle",
parent=styles["Heading1"],
fontSize=13,
textColor=WHITE,
fontName="Helvetica-Bold",
spaceAfter=6,
spaceBefore=10,
leftIndent=0,
)
subsection_style = ParagraphStyle(
"SubsectionStyle",
parent=styles["Heading2"],
fontSize=11,
textColor=DARK_GREY,
fontName="Helvetica-Bold",
spaceAfter=4,
spaceBefore=8,
)
body_style = ParagraphStyle(
"BodyStyle",
parent=styles["Normal"],
fontSize=9.5,
leading=14,
textColor=DARK_GREY,
fontName="Helvetica",
spaceAfter=4,
)
bullet_style = ParagraphStyle(
"BulletStyle",
parent=styles["Normal"],
fontSize=9.5,
leading=13,
textColor=DARK_GREY,
fontName="Helvetica",
leftIndent=14,
bulletIndent=4,
spaceAfter=2,
)
label_g = ParagraphStyle("LG", parent=styles["Normal"], fontSize=10,
fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER,
backColor=TEAL)
label_t = ParagraphStyle("LT", parent=styles["Normal"], fontSize=10,
fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER,
backColor=PURPLE)
table_header = ParagraphStyle("TH", parent=styles["Normal"], fontSize=9.5,
fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER)
table_cell = ParagraphStyle("TC", parent=styles["Normal"], fontSize=9,
fontName="Helvetica", textColor=DARK_GREY, alignment=TA_LEFT, leading=12)
table_cell_c = ParagraphStyle("TCC", parent=styles["Normal"], fontSize=9,
fontName="Helvetica", textColor=DARK_GREY, alignment=TA_CENTER, leading=12)
note_style = ParagraphStyle("NoteStyle", parent=styles["Normal"], fontSize=8.5,
textColor=MID_GREY, fontName="Helvetica-Oblique", spaceAfter=2,
leftIndent=8)
W = A4[0] - 3.6*cm # usable width
def section_banner(title, color):
"""Full-width coloured banner for section headings."""
data = [[Paragraph(title, section_style)]]
t = Table(data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4]),
]))
return t
def info_box(text, bg):
data = [[Paragraph(text, body_style)]]
t = Table(data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#B0BEC5")),
]))
return t
def two_col_box(left_text, right_text, left_bg, right_bg, left_label="Giardia lamblia", right_label="Trichomonas vaginalis"):
half = W / 2 - 0.1*cm
def make_cell(label, text, bg, label_color):
inner = [
[Paragraph(f"<b>{label}</b>", ParagraphStyle("lbl", parent=styles["Normal"],
fontSize=10, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_CENTER))],
[Paragraph(text, body_style)],
]
inner_t = Table(inner, colWidths=[half])
inner_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), label_color),
("BACKGROUND", (0,1), (0,1), bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 0.4, colors.HexColor("#B0BEC5")),
]))
return inner_t
outer = [[make_cell(left_label, left_text, left_bg, TEAL),
make_cell(right_label, right_text, right_bg, PURPLE)]]
outer_t = Table(outer, colWidths=[half+0.1*cm, half+0.1*cm])
outer_t.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 2),
("RIGHTPADDING", (0,0), (-1,-1), 2),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING", (0,0), (-1,-1), 2),
]))
return outer_t
# ── Comparison table helper ───────────────────────────────────────────────────
def comp_table(rows):
"""rows = list of (Feature, Giardia, Trichomonas)"""
col_w = [4.5*cm, (W-4.5*cm)/2, (W-4.5*cm)/2]
data = [
[Paragraph("Feature", table_header),
Paragraph("Giardia lamblia", table_header),
Paragraph("Trichomonas vaginalis", table_header)]
]
for i, (feat, g, t) in enumerate(rows):
data.append([
Paragraph(f"<b>{feat}</b>", table_cell),
Paragraph(g, table_cell_c),
Paragraph(t, table_cell_c),
])
tbl = Table(data, colWidths=col_w, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), TEAL),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#B0BEC5")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
for i in range(1, len(data)):
bg = WHITE if i % 2 == 1 else ROW_ALT
style.append(("BACKGROUND", (0,i), (-1,i), bg))
tbl.setStyle(TableStyle(style))
return tbl
# ══════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ══════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER BANNER ─────────────────────────────────────────────────────────────
cover_data = [[
Paragraph("Parasitology Study Guide", title_style),
Paragraph("Giardia intestinalis vs Trichomonas vaginalis", subtitle_style),
Paragraph("Card 05 · Second Term · AMCB-08 · Flagellates", subtitle_style),
]]
cover_tbl = Table(cover_data, colWidths=[W])
cover_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), TEAL),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 18),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
("ROUNDEDCORNERS", [6]),
]))
story.append(cover_tbl)
story.append(Spacer(1, 0.5*cm))
# ── QUICK REFERENCE TABLE ────────────────────────────────────────────────────
story.append(section_banner("QUICK REFERENCE COMPARISON", TEAL))
story.append(Spacer(1, 0.25*cm))
qr_rows = [
("Classification", "Intestinal flagellate protozoan", "Genital flagellate protozoan"),
("Synonym", "G. intestinalis / G. duodenalis", "—"),
("Shape", "Pear-shaped (pyriform)", "Oval / piriform"),
("Size", "10–20 μm (trophozoite)", "7×15 μm (trophozoite)"),
("Forms", "Trophozoite + Cyst", "Trophozoite ONLY (no cyst)"),
("Nuclei", "2 (trophozoite) / 4 (cyst)", "1 (single elongated nucleus)"),
("Flagella", "6 flagella", "5 flagella (4 anterior + 1 recurrent)"),
("Special Structure", "Ventral sucking disc", "Axostyle, Costa, Undulating membrane"),
("Motility", "Tumbling / falling-leaf", "Jerky, non-directional"),
("Infective Form", "Cyst (4 nuclei)", "Trophozoite (no cyst stage)"),
("Pathogenic Form", "Trophozoite", "Trophozoite"),
("Diagnostic Form", "Cyst in stool (Trophozoite in diarrhea)", "Trophozoite in vaginal/urethral discharge"),
("Definitive Host", "Humans, dogs, cats, beavers", "Humans only"),
("Intermediate Host", "None", "None"),
("Transmission", "Feco-oral (contaminated water/food)", "Sexual intercourse (STD)"),
("Site of Infection", "Duodenum & Jejunum", "Vagina, urethra, prostate"),
("Invasive?", "NON-INVASIVE", "NON-INVASIVE"),
("Disease", "Giardiasis", "Trichomoniasis"),
("Treatment", "Metronidazole / Tinidazole", "Metronidazole / Tinidazole (single 2g dose)"),
]
story.append(comp_table(qr_rows))
story.append(Spacer(1, 0.3*cm))
# ── MORPHOLOGY ───────────────────────────────────────────────────────────────
story.append(section_banner("MORPHOLOGY IN DETAIL", GREEN))
story.append(Spacer(1, 0.25*cm))
g_morph = (
"<b>Trophozoite:</b> Pear-shaped, 10–20 μm. Two nuclei with prominent karyosomes — "
"gives a characteristic 'face-like' image. Six flagella. Ventral sucking disc for attachment "
"to intestinal wall. Falls in 'tumbling leaf' motion.<br/><br/>"
"<b>Cyst:</b> Oval, 7–10 μm. Contains 4 nuclei and axonemes. Resistant to chlorination. "
"Infective dose: as few as 10–25 cysts."
)
t_morph = (
"<b>Trophozoite only</b> (no cyst stage): Oval, 7×15 μm. One elongated nucleus anteriorly. "
"Five flagella — 4 exit anteriorly, 1 runs along undulating membrane. "
"<b>Axostyle</b> bisects the cell longitudinally and protrudes posteriorly (aids attachment). "
"<b>Costa</b> — cross-striated structure along undulating membrane base. "
"Wet mount: jerky, non-directional movement."
)
story.append(two_col_box(g_morph, t_morph, LIGHT_TEAL, LIGHT_PURPLE))
story.append(Spacer(1, 0.3*cm))
# ── PATHOGENESIS ─────────────────────────────────────────────────────────────
story.append(section_banner("PATHOGENESIS", PURPLE))
story.append(Spacer(1, 0.25*cm))
g_path = (
"1. Cyst ingested → excysts in duodenum → Trophozoites<br/>"
"2. Trophozoites attach via <b>ventral disc</b> to jejunal epithelium<br/>"
"3. Damage to brush border → ↓ disaccharidase & digestive enzymes<br/>"
"4. Fat & vitamin (B12, folate) malabsorption → <b>Steatorrhoea</b><br/>"
"5. Osmotic diarrhoea, weight loss, bloating<br/>"
"6. <b>Non-invasive</b> — does NOT penetrate intestinal wall"
)
t_path = (
"1. Trophozoite contacts squamous epithelium of vagina/urethra<br/>"
"2. <b>Adhesins + lectin-binding proteins</b> mediate attachment<br/>"
"3. <b>Proteinases</b> released → contact-dependent cytolysis<br/>"
"4. Neutrophilic infiltration + petechial haemorrhages<br/>"
"5. Toll-like receptors → pro-inflammatory cytokines → CD4+ response<br/>"
"6. Degrades IgG & IgA → immune evasion<br/>"
"7. ↑ HIV susceptibility; ↑ preterm birth risk"
)
story.append(two_col_box(g_path, t_path, LIGHT_GREEN, LIGHT_PURPLE))
story.append(Spacer(1, 0.3*cm))
# ── VIRULENCE FACTORS ─────────────────────────────────────────────────────────
story.append(section_banner("VIRULENCE FACTORS", AMBER))
story.append(Spacer(1, 0.25*cm))
vf_rows = [
("Attachment", "Ventral sucking disc", "Adhesins, laminin-binding proteins, lectins"),
("Tissue damage", "Brush border enzyme disruption", "Proteinases → cytolysis (contact-dependent)"),
("Immune evasion", "Variant Surface Proteins (VSPs)", "IgG/IgA degradation; phenotypic antigenic variation"),
("Other", "Cyst wall (environmental resistance)", "200 kDa glycoprotein (contact-independent damage)"),
]
story.append(comp_table(vf_rows))
story.append(Spacer(1, 0.3*cm))
# ── CLINICAL FEATURES ─────────────────────────────────────────────────────────
story.append(section_banner("CLINICAL FEATURES", colors.HexColor("#00695C")))
story.append(Spacer(1, 0.25*cm))
g_clin = (
"• <b>Acute:</b> Explosive, foul-smelling watery diarrhoea<br/>"
"• Abdominal cramps, bloating, flatulence<br/>"
"• Nausea, anorexia<br/>"
"• <b>Chronic:</b> Steatorrhoea, malabsorption<br/>"
"• Weight loss, growth retardation (children)<br/>"
"• Vitamin B12 & folate deficiency<br/>"
"• <b>No fever</b> (non-invasive)"
)
t_clin = (
"<b>Women (75% symptomatic):</b><br/>"
"• Yellow, frothy, malodorous vaginal discharge<br/>"
"• Vulvar itching/burning (50%), dyspareunia (50%)<br/>"
"• Dysuria (50%)<br/>"
"• 'Strawberry cervix' — petechial haemorrhages (characteristic)<br/>"
"• Symptoms worsen during menses/pregnancy<br/><br/>"
"<b>Men (mostly asymptomatic):</b><br/>"
"• Mild urethritis, scant discharge<br/>"
"• Prostatitis (occasionally)"
)
story.append(two_col_box(g_clin, t_clin, LIGHT_TEAL, LIGHT_PURPLE))
story.append(Spacer(1, 0.3*cm))
# ── WHY MALES ASYMPTOMATIC ────────────────────────────────────────────────────
story.append(section_banner("WHY ARE MALES MORE ASYMPTOMATIC IN TRICHOMONIASIS?", PURPLE))
story.append(Spacer(1, 0.25*cm))
why_rows = [
("Factor", "Females", "Males"),
("Environment", "Warm, moist vagina — ideal for T. vaginalis", "Narrow urethra — less hospitable"),
("Mechanical flushing","No voiding to remove organisms", "Urine flow mechanically flushes organisms out"),
("pH", "Acidic vaginal pH favours T. vaginalis growth", "Urethral pH less favourable"),
("Epithelium", "Large exposed squamous epithelium", "Less squamous epithelium exposed"),
("Outcome", "75% symptomatic vaginitis", ">50% asymptomatic; may self-clear"),
]
col_w2 = [4.5*cm, (W-4.5*cm)/2, (W-4.5*cm)/2]
data2 = [
[Paragraph("Factor", table_header),
Paragraph("Females", table_header),
Paragraph("Males", table_header)]
]
for i, row in enumerate(why_rows[1:]):
data2.append([Paragraph(f"<b>{row[0]}</b>", table_cell),
Paragraph(row[1], table_cell),
Paragraph(row[2], table_cell)])
tbl2 = Table(data2, colWidths=col_w2, repeatRows=1)
s2 = [
("BACKGROUND", (0,0), (-1,0), PURPLE),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#B0BEC5")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
for i in range(1, len(data2)):
s2.append(("BACKGROUND", (0,i), (-1,i), WHITE if i%2==1 else ROW_ALT))
tbl2.setStyle(TableStyle(s2))
story.append(tbl2)
story.append(Spacer(1, 0.3*cm))
# ── DIAGNOSIS ────────────────────────────────────────────────────────────────
story.append(section_banner("DIAGNOSIS", TEAL))
story.append(Spacer(1, 0.25*cm))
diag_rows = [
("Best specimen", "Stool (cyst/trophozoite)", "Vaginal discharge / urethral exudate / urine sediment"),
("Microscopy", "Stool wet mount — cysts; diarrheal stool — trophozoites", "Wet mount — motile trophozoites (jerky motion)"),
("Sensitivity", "Stool microscopy ~50–70%; improves with 3 samples", "Wet mount 50–60%; less sensitive in asymptomatic"),
("Staining", "Trichrome, iron-haematoxylin, DFA", "Giemsa / Papanicolaou (limited help)"),
("Antigen test", "ELISA antigen test (high sensitivity)", "Direct immunofluorescent antibody (70–90%)"),
("Special test", "String test (Enterotest)", "NAA/PCR — most sensitive method"),
("Culture", "Available but rarely used", "Artificial media, anaerobic, pH 5.5–6.0 (rarely used)"),
("Gold standard", "PCR", "PCR / NAA"),
]
story.append(comp_table(diag_rows))
story.append(Spacer(1, 0.15*cm))
story.append(info_box(
"<b>String Test (Enterotest):</b> Patient swallows a gelatin capsule containing a coiled nylon string "
"— one end taped to the cheek. After 4–6 hours it is retrieved. The bile-stained distal portion "
"carries duodenal fluid which is examined for Giardia trophozoites. Useful when stool microscopy is negative.",
LIGHT_BLUE
))
story.append(Spacer(1, 0.3*cm))
# ── TREATMENT & PREVENTION ───────────────────────────────────────────────────
story.append(section_banner("TREATMENT & PREVENTION", GREEN))
story.append(Spacer(1, 0.25*cm))
tx_rows = [
("Drug of choice", "Metronidazole or Tinidazole", "Metronidazole or Tinidazole"),
("Dosing", "Metronidazole 250–500 mg TDS × 5–7 days\nTinidazole 2g single dose", "Metronidazole 2g single dose OR 500 mg BD × 7 days"),
("Cure rate", "~90–95%", ">95%"),
("Partner treatment", "Not routinely required", "BOTH partners must be treated simultaneously"),
("Pregnancy", "Avoid in 1st trimester; use after if needed", "Avoid in 1st trimester"),
("Alcohol", "Avoid (disulfiram-like reaction)", "Avoid (disulfiram-like reaction)"),
("Prevention", "Boil/filter water; hand hygiene; food safety", "Condom use; reduce sexual partners; STI screening"),
("Resistance", "Rare", "Metronidazole-resistant strains exist → use Tinidazole"),
]
story.append(comp_table(tx_rows))
story.append(Spacer(1, 0.3*cm))
# ── STEATORRHOEA BOX ────────────────────────────────────────────────────────
story.append(section_banner("KEY CONCEPTS", AMBER))
story.append(Spacer(1, 0.2*cm))
boxes = [
(LIGHT_AMBER, "<b>Steatorrhoea</b>",
"Passage of abnormally high amounts of fat in stool (pale, greasy, foul-smelling, floats). "
"In Giardiasis, Trophozoites damage duodenal brush border → ↓ lipase activity + ↓ fat absorption "
"→ fat passes undigested into stool."),
(LIGHT_GREEN, "<b>Amoebiasis vs Giardiasis — Invasiveness</b>",
"<b>Amoebiasis (E. histolytica):</b> INVASIVE — penetrates intestinal wall, causes flask-shaped ulcers, "
"spreads to liver (amoebic abscess).<br/>"
"<b>Giardiasis:</b> NON-INVASIVE — remains in intestinal lumen, no ulcers, no liver involvement."),
(LIGHT_PURPLE, "<b>Parasitic STDs</b>",
"1. <i>Trichomonas vaginalis</i> — Trichomoniasis<br/>"
"2. <i>Phthirus pubis</i> — Pubic lice (crabs)<br/>"
"3. <i>Sarcoptes scabiei</i> — Scabies<br/>"
"<b>T. vaginalis</b> is the most common curable non-viral STD worldwide (>200 million cases/year)."),
(LIGHT_BLUE, "<b>Strawberry Cervix</b>",
"Characteristic but uncommon finding in Trichomoniasis. "
"Petechial haemorrhages on the cervix give it a red, granular, friable appearance resembling a strawberry. "
"Highly specific when present."),
]
for bg, title, text in boxes:
data = [[Paragraph(title, subsection_style)], [Paragraph(text, body_style)]]
t = Table(data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), bg),
("BACKGROUND", (0,1), (0,1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#B0BEC5")),
("LINEBELOW", (0,0), (-1,0), 0.8, colors.HexColor("#90A4AE")),
]))
story.append(t)
story.append(Spacer(1, 0.15*cm))
# ── MNEMONICS ────────────────────────────────────────────────────────────────
story.append(Spacer(1, 0.1*cm))
story.append(section_banner("MNEMONICS & MEMORY TIPS", colors.HexColor("#BF360C")))
story.append(Spacer(1, 0.2*cm))
mnemonics = [
("Giardia has 2 faces", "2 nuclei → looks like a face = 'Giardia smiles at you'"),
("Giardia cyst has 4 N", "4 Nuclei in cyst → '4 doors to infect'"),
("Trichomonas = NO CYST", "T for Trichomonas = T for Trophozoite-only"),
("T. vaginalis 5 Flagella","4 go forward, 1 goes back = '4+1 = Five'"),
("Both treated by METRO", "Metro goes to BOTH stations: Giardia-town & Trichomo-town"),
("Males flush T. vaginalis","URINE = natural flushing system → asymptomatic in males"),
("Strawberry cervix", "Petechial haemorrhages = red dots = strawberry pattern"),
("Steatorrhoea", "Fat floats → 'STEA = FAT floats, cannot be absorbed'"),
]
mn_data = [[Paragraph("Tip", table_header), Paragraph("Memory Hook", table_header)]]
for tip, hook in mnemonics:
mn_data.append([Paragraph(f"<b>{tip}</b>", table_cell), Paragraph(hook, table_cell)])
mn_tbl = Table(mn_data, colWidths=[6*cm, W-6*cm], repeatRows=1)
mn_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#BF360C")),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#B0BEC5")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
*[("BACKGROUND", (0,i), (-1,i), WHITE if i%2==1 else ROW_ALT) for i in range(1, len(mn_data))],
]))
story.append(mn_tbl)
story.append(Spacer(1, 0.3*cm))
# ── FOOTER ───────────────────────────────────────────────────────────────────
story.append(HRFlowable(width=W, thickness=0.5, color=colors.HexColor("#B0BEC5")))
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph(
"Reference: Sherris & Ryan's Medical Microbiology, 8th Ed. | "
"Goodman & Gilman's Pharmacological Basis of Therapeutics | "
"Card 05 · AMCB-08 Parasitology",
note_style
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /tmp/workspace/giardia-trichomonas && python create_pdf.py 2>&1
ls -lh /tmp/workspace/giardia-trichomonas/
Giardia vs Trichomonas Study Guide
PDF Document · PDF
| Section | Content |
|---|---|
| Quick Reference Table | 18-row side-by-side comparison (morphology, host, transmission, treatment) |
| Morphology in Detail | Trophozoite + Cyst details for both organisms |
| Pathogenesis | Step-by-step mechanism for both, side by side |
| Virulence Factors | Attachment, tissue damage, immune evasion |
| Clinical Features | Symptoms for women vs men in Trichomoniasis |
| Why Males Asymptomatic | Table explaining 5 key reasons |
| Diagnosis | All methods including String Test explanation |
| Treatment & Prevention | Drug doses, cure rates, partner treatment |
| Key Concepts | Steatorrhoea, Invasiveness, Strawberry Cervix, Parasitic STDs |
| Mnemonics | 8 easy memory tricks for exam |
Reference: Sherris & Ryan's Medical Microbiology, 8th Ed. | Goodman & Gilman's Pharmacological Basis of Therapeutics
Ans gulo English a age dau & sathe sathe banglay describe koro
| Flagellate | Pathogenicity | Site |
|---|---|---|
| Giardia lamblia | + (Pathogenic) | Intestine |
| Dientamoeba fragilis | ? (Uncertain) | Intestine |
| Chilomastix mesnili | − (Non-pathogenic) | Intestine |
| Enteromonas hominis | − | Intestine |
| Retortamonas intestinalis | − | Intestine |
| Trichomonas hominis | − | Intestine |
| Trichomonas tenax | − | Mouth |
| Trichomonas vaginalis | + (Pathogenic) | Vagina |
| Parameter | Details |
|---|---|
| Definitive Host | Humans (also dogs, cats, beavers — zoonotic reservoir) |
| Intermediate Host | None — no intermediate host required |
| Infective Form | Cyst (4 nuclei) |
| Mode of Infection | Feco-oral route |
| Vehicle | Contaminated water (most common), contaminated food, person-to-person |
| Infective dose | As few as 10–25 cysts |
| Form | Which one | Why |
|---|---|---|
| Infective form | Cyst | Resistant to environment; survives to be ingested |
| Pathogenic form | Trophozoite | Attaches to gut wall, causes malabsorption & diarrhoea |
| Diagnostic form | Cyst (routine) / Trophozoite (in acute/watery diarrhoea) | Cysts shed in formed stool; trophozoites in liquid stool |
| Factor | Role |
|---|---|
| Ventral sucking disc | Attaches firmly to jejunal brush border — physical blockade of absorption |
| Variant Surface Proteins (VSPs) | Antigenic variation — escapes host immune recognition |
| Proteinases & lectins | Damage epithelial cells, degrade mucus layer |
| Brush border enzyme disruption | Reduces disaccharidase activity → malabsorption |
| Cyst wall (β-giardin) | Environmental resistance — survives chlorination |
Passage of abnormally large amounts of fat in stool — stool appears pale, greasy, bulky, foul-smelling, and floats in the toilet.
| Method | Details |
|---|---|
| 1. Stool microscopy | Cysts in formed stool; Trophozoites in watery stool. Examine 3 samples on alternate days |
| 2. Stool antigen test | ELISA for Giardia antigen — sensitivity ~94%, specificity ~97% |
| 3. String test (Enterotest) | See below |
| 4. Duodenal biopsy | Gold standard for tissue confirmation; rarely done |
| 5. PCR | Most sensitive — gold standard for research/difficult cases |
Note: No tissue invasion, no fever, no blood in stool — key features distinguishing Giardiasis from Amoebiasis
| Feature | Details |
|---|---|
| Shape | Oval / piriform |
| Size | 7 × 15 μm (occasionally up to 30 μm in asymptomatic patients) |
| Nucleus | 1 single elongated nucleus (anterior) with small cytostome |
| Flagella | 5 total — 4 exit anteriorly; 1 bends posteriorly along undulating membrane |
| Undulating membrane | Runs only halfway along the body (abbreviated) |
| Costa | Cross-striated rod along the base of the undulating membrane |
| Axostyle | Microtubule-containing rod that bisects the cell and protrudes from the posterior end — aids attachment |
| Cyst | ABSENT — only trophozoite stage exists |
| Motility | Jerky, non-directional (tumbling motion) — seen in wet mount |
| Staining | Identified in unstained wet mounts by axostyle + jerky motility |
| Culture | Grows on artificial media, anaerobic conditions, pH 5.5–6.0 |
| Regimen | Details |
|---|---|
| Drug of choice | Metronidazole OR Tinidazole |
| Single dose | Metronidazole 2g oral (single dose) OR Tinidazole 2g oral (single dose) |
| Alternative | Metronidazole 500mg twice daily × 7 days |
| Cure rate | >95% of all infections cured |
| Partner treatment | MANDATORY — both sexual partners must be treated simultaneously to prevent reinfection |
| Resistance | Metronidazole-resistant strains exist → use Tinidazole (better tolerated, effective) |
| Pregnancy | Avoid in 1st trimester; treat after if symptomatic |
| Alcohol | Strictly avoid — disulfiram-like reaction (nausea, vomiting, flushing) |
| Breastfeeding | Discontinue breastfeeding for 12–24h after single dose Metronidazole |
| Method | Details |
|---|---|
| Condom use | Most effective barrier method |
| Treat both partners | Prevents reinfection cycle |
| Reduce sexual partners | Directly reduces transmission risk |
| Regular STI screening | Especially in high-risk groups |
| Avoid shared towels/washcloths | Non-sexual transmission possible |
| Retesting | Retest all sexually active women 3 months after initial treatment (high reinfection rate) |
| Route | Details |
|---|---|
| 1. Sexual intercourse (primary) | Direct contact with infected genital secretions — >99% of cases |
| 2. Shared fomites | Shared washcloths, wet towels — uncommon but possible (organism survives hours outside host) |
| 3. Vertical (birth canal) | Female neonates can acquire T. vaginalis during passage through infected birth canal |
| Factor | Females | Males |
|---|---|---|
| Environment | Warm, moist vagina — ideal pH (3.8–4.5, acidic) for T. vaginalis growth | Narrow urethra, less hospitable environment |
| Mechanical flushing | No regular flushing mechanism | Urine flow mechanically washes organisms out from urethra — key reason |
| Epithelium | Large area of exposed squamous epithelium | Less exposed squamous epithelium |
| pH | Acidic vaginal pH favours organism growth | Urethral pH less favourable |
| Hormonal | Oestrogen-influenced vaginal environment supports colonisation | No comparable hormonal support |
| Outcome | 75% develop symptomatic vaginitis | >50% asymptomatic; many self-clear |
Key point: The most important reason is voiding of urine in males, which mechanically removes T. vaginalis from the urethra before significant colonisation can occur.
📖 Reference: Sherris & Ryan's Medical Microbiology, 8th Edition — Chapter 53: Flagellates | Goodman & Gilman's Pharmacological Basis of Therapeutics — Trichomoniasis
Create a quick reference cheat sheet PDF for exam
~/giardia-trichomonas/create_cheatsheet.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
)
OUTPUT = "/tmp/workspace/giardia-trichomonas/Cheatsheet_Giardia_Trichomonas.pdf"
# ── Page setup: A4, tight margins ─────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.2*cm, leftMargin=1.2*cm,
topMargin=1.1*cm, bottomMargin=1.1*cm,
)
W = A4[0] - 2.4*cm
# ── Palette ───────────────────────────────────────────────────────────────────
TEAL = colors.HexColor("#00838F")
TEAL_LT = colors.HexColor("#E0F7FA")
PURPLE = colors.HexColor("#6A1B9A")
PURPLE_LT = colors.HexColor("#F3E5F5")
GREEN = colors.HexColor("#2E7D32")
GREEN_LT = colors.HexColor("#E8F5E9")
AMBER = colors.HexColor("#E65100")
AMBER_LT = colors.HexColor("#FFF8E1")
RED = colors.HexColor("#B71C1C")
RED_LT = colors.HexColor("#FFEBEE")
BLUE = colors.HexColor("#1565C0")
BLUE_LT = colors.HexColor("#E3F2FD")
GREY_LT = colors.HexColor("#F5F5F5")
GREY_MID = colors.HexColor("#90A4AE")
DARK = colors.HexColor("#212121")
WHITE = colors.white
# ── Styles ────────────────────────────────────────────────────────────────────
SS = getSampleStyleSheet()
def sty(name, **kw):
base = kw.pop("parent", SS["Normal"])
return ParagraphStyle(name, parent=base, **kw)
H_BANNER = sty("hbanner", fontSize=8.5, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER)
H_TH = sty("hth", fontSize=8, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER)
H_CELL = sty("hcell", fontSize=7.8, fontName="Helvetica",
textColor=DARK, alignment=TA_LEFT, leading=10)
H_CELLB = sty("hcellb", fontSize=7.8, fontName="Helvetica-Bold",
textColor=DARK, alignment=TA_LEFT, leading=10)
H_CELLC = sty("hcellc", fontSize=7.8, fontName="Helvetica",
textColor=DARK, alignment=TA_CENTER, leading=10)
H_SMALL = sty("hsmall", fontSize=7, fontName="Helvetica-Oblique",
textColor=GREY_MID, alignment=TA_CENTER)
H_TITLE = sty("htitle", fontSize=13, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER)
H_SUB = sty("hsub", fontSize=8, fontName="Helvetica",
textColor=colors.HexColor("#B2EBF2"), alignment=TA_CENTER)
H_MNE = sty("hmne", fontSize=7.8, fontName="Helvetica-Bold",
textColor=AMBER, alignment=TA_LEFT)
H_MNE2 = sty("hmne2", fontSize=7.5, fontName="Helvetica",
textColor=DARK, alignment=TA_LEFT, leading=10)
# ── Helpers ───────────────────────────────────────────────────────────────────
TP = 4 # top/bottom cell padding
LP = 5 # left/right cell padding
def banner(text, color, w=None):
w = w or W
t = Table([[Paragraph(text, H_BANNER)]], colWidths=[w])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
return t
def grid(headers, rows, col_widths, header_color=TEAL, alt=GREY_LT):
data = [[Paragraph(h, H_TH) for h in headers]]
for row in rows:
data.append([Paragraph(str(c), H_CELLB if i == 0 else H_CELLC)
for i, c in enumerate(row)])
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), header_color),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), TP),
("BOTTOMPADDING", (0,0), (-1,-1), TP),
("LEFTPADDING", (0,0), (-1,-1), LP),
("RIGHTPADDING", (0,0), (-1,-1), LP),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
for i in range(1, len(data)):
style.append(("BACKGROUND", (0,i), (-1,i),
WHITE if i % 2 == 1 else alt))
t.setStyle(TableStyle(style))
return t
def two_box(left_title, left_body, right_title, right_body,
lc=TEAL, rc=PURPLE, lbg=TEAL_LT, rbg=PURPLE_LT):
hw = W / 2 - 0.15*cm
def make(title, body, tc, bg):
inner = [
[Paragraph(title, sty("_", fontSize=8, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER))],
[Paragraph(body, H_CELL)],
]
t = Table(inner, colWidths=[hw])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), tc),
("BACKGROUND", (0,1), (0,1), bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.3, GREY_MID),
]))
return t
outer = Table(
[[make(left_title, left_body, lc, lbg),
make(right_title, right_body, rc, rbg)]],
colWidths=[hw + 0.15*cm, hw + 0.15*cm]
)
outer.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 1),
("RIGHTPADDING", (0,0), (-1,-1), 1),
("TOPPADDING", (0,0), (-1,-1), 1),
("BOTTOMPADDING", (0,0), (-1,-1), 1),
]))
return outer
def colored_box(title, body, tc, bg):
data = [
[Paragraph(title, sty("_cb", fontSize=8, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_LEFT))],
[Paragraph(body, H_CELL)],
]
t = Table(data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), tc),
("BACKGROUND", (0,1), (0,1), bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 0.3, GREY_MID),
]))
return t
SP = lambda h=0.12: Spacer(1, h*cm)
# ══════════════════════════════════════════════════════════════════════════════
story = []
# ── TOP BANNER ────────────────────────────────────────────────────────────────
top = Table(
[[Paragraph("⚡ QUICK REFERENCE CHEAT SHEET", H_TITLE)],
[Paragraph("Parasitology · Card 05 · AMCB-08 | Giardia intestinalis vs Trichomonas vaginalis", H_SUB)],
[Paragraph("Ref: Sherris & Ryan's Medical Microbiology, 8th Ed.", H_SMALL)]],
colWidths=[W]
)
top.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), TEAL),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
story += [top, SP(0.18)]
# ══ SECTION 1: MASTER COMPARISON ════════════════════════════════════════════
story += [banner("① MASTER COMPARISON TABLE", TEAL), SP(0.1)]
cw = [3.6*cm, (W-3.6*cm)/2, (W-3.6*cm)/2]
rows = [
("Classification", "Intestinal flagellate", "Genital flagellate"),
("Synonym", "G. intestinalis / G. duodenalis", "—"),
("Shape", "Pear-shaped (pyriform)", "Oval / piriform"),
("Size", "10–20 μm (trophozoite)", "7×15 μm (trophozoite)"),
("Forms", "Trophozoite + Cyst", "Trophozoite ONLY ★"),
("Nuclei", "2 (tropho) / 4 (cyst)", "1 (single nucleus)"),
("Flagella", "6", "5 (4 anterior + 1 recurrent)"),
("Special structure", "Ventral sucking disc", "Axostyle + Costa + Undulating membrane"),
("Motility", "Tumbling / falling-leaf", "Jerky, non-directional"),
("Infective form", "Cyst (4 nuclei)", "Trophozoite (no cyst)"),
("Pathogenic form", "Trophozoite", "Trophozoite"),
("Diagnostic form", "Cyst (formed stool)\nTrophozoite (watery stool)", "Trophozoite in vaginal/urethral discharge"),
("Definitive host", "Human, dog, cat, beaver", "Human only"),
("Inter. host", "None", "None"),
("Transmission", "Feco-oral (water/food)", "Sexual intercourse (STD)"),
("Site", "Duodenum & Jejunum", "Vagina / urethra / prostate"),
("Invasive?", "NON-INVASIVE", "NON-INVASIVE"),
("Disease", "Giardiasis", "Trichomoniasis"),
("Tx drug", "Metronidazole / Tinidazole", "Metronidazole 2 g single dose ★"),
]
story += [grid(["Feature", "Giardia lamblia", "Trichomonas vaginalis"], rows, cw), SP(0.18)]
# ══ SECTION 2: MORPHOLOGY ════════════════════════════════════════════════════
story += [banner("② MORPHOLOGY AT A GLANCE", GREEN), SP(0.1)]
story += [two_box(
"Giardia lamblia — Morphology",
"<b>TROPHOZOITE:</b> Pear-shaped, 10–20 μm. <b>2 nuclei</b> → 'face-like' image. "
"6 flagella. <b>Ventral sucking disc</b> (attachment). Tumbling motility.<br/>"
"<b>CYST:</b> Oval, 7–10 μm. <b>4 nuclei</b> + axonemes. Thick wall — survives "
"chlorination. Infective dose: 10–25 cysts.",
"Trichomonas vaginalis — Morphology",
"<b>TROPHOZOITE ONLY</b> (no cyst). Oval, 7×15 μm. <b>1 nucleus</b> (elongated). "
"<b>5 flagella</b> (4 anterior + 1 along undulating membrane). "
"<b>Axostyle</b> protrudes posteriorly (attachment). <b>Costa</b> along undulating membrane. "
"Jerky non-directional motility on wet mount.",
), SP(0.18)]
# ══ SECTION 3: PATHOGENESIS ══════════════════════════════════════════════════
story += [banner("③ PATHOGENESIS", PURPLE), SP(0.1)]
story += [two_box(
"Giardiasis — Pathogenesis",
"1. Cyst ingested → excysts in duodenum → 2 trophozoites<br/>"
"2. Attach via <b>ventral disc</b> to jejunal microvilli<br/>"
"3. ↓ Brush border enzymes (lactase, sucrase)<br/>"
"4. ↓ Fat & vitamin absorption → <b>STEATORRHOEA</b><br/>"
"5. Osmotic diarrhoea, bloating, weight loss<br/>"
"6. <b>NO invasion, NO fever, NO blood in stool</b>",
"Trichomoniasis — Pathogenesis",
"1. Trophozoite contacts squamous epithelium<br/>"
"2. <b>Adhesins + lectin proteins</b> → attachment<br/>"
"3. <b>Proteinases</b> → contact-dependent cytolysis<br/>"
"4. Neutrophilic inflammation + petechial haemorrhages<br/>"
"5. TLR activation → pro-inflammatory cytokines<br/>"
"6. Degrades IgG & IgA → <b>immune evasion</b><br/>"
"7. ↑ HIV risk, ↑ preterm birth risk",
lc=PURPLE, rc=GREEN, lbg=PURPLE_LT, rbg=GREEN_LT,
), SP(0.18)]
# ══ SECTION 4: CLINICAL + DIAGNOSIS (side by side) ══════════════════════════
story += [banner("④ CLINICAL FEATURES & DIAGNOSIS", BLUE), SP(0.1)]
hw = W / 2 - 0.15*cm
# Clinical
clin_g = (
"• Explosive foul-smelling watery diarrhoea<br/>"
"• Abdominal cramps, bloating, flatulence<br/>"
"• Steatorrhoea (pale, greasy, floating stool)<br/>"
"• Weight loss, malnutrition (children)<br/>"
"• Vit B12 / folate deficiency<br/>"
"• <b>No fever, no blood</b>"
)
clin_t = (
"<b>Women (75% symptomatic):</b><br/>"
"• Yellow frothy malodorous discharge<br/>"
"• Vulvar itch/burn, dyspareunia, dysuria<br/>"
"• <b>Strawberry cervix</b> ★ (petechial haemorrhages)<br/>"
"<b>Men (>50% asymptomatic):</b><br/>"
"• Mild urethritis, scant discharge<br/>"
"• Urine flushes organisms → self-limiting"
)
# Diagnosis
diag_g = (
"• <b>Stool microscopy</b> × 3 samples (alternate days)<br/>"
"• Cysts in formed stool; trophozoites in watery stool<br/>"
"• <b>ELISA antigen test</b> (sens ~94%)<br/>"
"• <b>String test</b> (Enterotest) — if stool −ve<br/>"
"• PCR — most sensitive (gold standard)"
)
diag_t = (
"• <b>Wet mount</b> of vaginal discharge (motile trophozo.)<br/>"
"• Sensitivity 50–60% (wet mount)<br/>"
"• <b>Direct immunofluorescence</b> (70–90%)<br/>"
"• <b>PCR / NAA</b> — most sensitive ★<br/>"
"• Culture: anaerobic, pH 5.5–6.0 (rarely used)"
)
def quad_cell(title, body, tc, bg, w):
inner = [
[Paragraph(title, sty("_q", fontSize=7.8, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_LEFT))],
[Paragraph(body, H_CELL)],
]
t = Table(inner, colWidths=[w])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), tc),
("BACKGROUND", (0,1), (0,1), bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.3, GREY_MID),
]))
return t
quad = Table([
[quad_cell("Giardia — Clinical", clin_g, TEAL, TEAL_LT, hw),
quad_cell("Trichomonas — Clinical", clin_t, PURPLE, PURPLE_LT, hw)],
[quad_cell("Giardia — Diagnosis", diag_g, GREEN, GREEN_LT, hw),
quad_cell("Trichomonas — Diagnosis", diag_t, BLUE, BLUE_LT, hw)],
], colWidths=[hw+0.15*cm, hw+0.15*cm])
quad.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 1),
("RIGHTPADDING", (0,0), (-1,-1), 1),
("TOPPADDING", (0,0), (-1,-1), 1),
("BOTTOMPADDING", (0,0), (-1,-1), 1),
]))
story += [quad, SP(0.18)]
# ══ SECTION 5: KEY CONCEPTS ROW ══════════════════════════════════════════════
story += [banner("⑤ KEY CONCEPTS & IMPORTANT DEFINITIONS", AMBER), SP(0.1)]
kw = W / 3 - 0.2*cm
def kbox(title, body, tc, bg, w):
inner = [
[Paragraph(title, sty("_k", fontSize=7.8, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER))],
[Paragraph(body, H_CELL)],
]
t = Table(inner, colWidths=[w])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), tc),
("BACKGROUND", (0,1), (0,1), bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.3, GREY_MID),
]))
return t
k1 = kbox("STEATORRHOEA",
"Pale, greasy, foul-smelling, floating stool. "
"Fat unabsorbed due to brush border enzyme ↓ by Giardia trophozoite. "
"Leads to fat-soluble vitamin deficiency (A,D,E,K) + B12/folate deficiency.",
AMBER, AMBER_LT, kw)
k2 = kbox("STRING TEST (Enterotest)",
"Gelatin capsule + coiled nylon string — one end taped to cheek. "
"Swallowed, left 4–6h. Withdrawn → bile-stained tip carries duodenal fluid. "
"Examined for Giardia trophozoites. Used when stool exam is negative.",
BLUE, BLUE_LT, kw)
k3 = kbox("STRAWBERRY CERVIX",
"Petechial haemorrhages on cervix → red, granular, friable appearance. "
"Characteristic but uncommon finding in Trichomoniasis. "
"Highly specific when present.",
RED, RED_LT, kw)
k_row = Table([[k1, k2, k3]], colWidths=[kw+0.2*cm, kw+0.2*cm, kw+0.2*cm])
k_row.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 1),
("RIGHTPADDING", (0,0), (-1,-1), 1),
("TOPPADDING", (0,0), (-1,-1), 1),
("BOTTOMPADDING", (0,0), (-1,-1), 1),
]))
story += [k_row, SP(0.18)]
# ══ SECTION 6: WHY MALES ASYMPTOMATIC + TREATMENT ════════════════════════════
story += [banner("⑥ WHY MALES ASYMPTOMATIC | TREATMENT | PREVENTION", GREEN), SP(0.1)]
# Why males — small table
why_rows = [
("Mechanical flushing", "No flushing", "Urine flow washes organisms out ★"),
("Environment", "Warm, moist vagina — ideal", "Narrow urethra, less hospitable"),
("pH", "Acidic (3.8–4.5) — favours growth", "Less favourable urethral pH"),
("Epithelium", "Large exposed squamous area", "Less exposed squamous area"),
("Outcome", "75% symptomatic vaginitis", ">50% asymptomatic; self-clear"),
]
cw2 = [3.8*cm, (W-3.8*cm)/2, (W-3.8*cm)/2]
story += [grid(["Factor", "Females", "Males "], why_rows, cw2, header_color=PURPLE), SP(0.12)]
# Treatment table
tx_rows = [
("Drug of choice", "Metronidazole OR Tinidazole", "Metronidazole 2 g single dose OR Tinidazole 2 g"),
("Alt. regimen", "Metronidazole 500 mg TDS × 5–7 days", "Metronidazole 500 mg BD × 7 days"),
("Cure rate", "~90–95%", ">95%"),
("Both partners", "Not routinely required", "MANDATORY — treat simultaneously ★"),
("Pregnancy", "Avoid 1st trimester", "Avoid 1st trimester"),
("Alcohol", "AVOID — disulfiram reaction", "AVOID — disulfiram reaction"),
("Prevention", "Boil/filter water; hand hygiene; food safety", "Condoms; reduce partners; STI screening; retest at 3 months"),
]
story += [grid(["", "Giardia", "Trichomonas"], tx_rows, cw, header_color=GREEN), SP(0.18)]
# ══ SECTION 7: VIRULENCE + AMOEBIASIS vs GIARDIASIS ══════════════════════════
story += [banner("⑦ VIRULENCE FACTORS & AMOEBIASIS vs GIARDIASIS", TEAL), SP(0.1)]
vf_rows = [
("Attachment", "Ventral sucking disc", "Adhesins, laminin-binding proteins, lectin-carbohydrates"),
("Cell damage", "Brush border enzyme disruption", "Proteinases → contact-dependent cytolysis"),
("Immune evasion", "Variant Surface Proteins (VSPs)", "IgG/IgA degradation; phenotypic antigenic variation"),
("Other", "Cyst wall — environmental resistance", "200 kDa glycoprotein (contact-independent damage)"),
]
story += [grid(["Factor", "Giardia", "Trichomonas"], vf_rows, cw), SP(0.1)]
story += [two_box(
"Amoebiasis (E. histolytica) — INVASIVE",
"• Penetrates intestinal wall<br/>"
"• Flask-shaped ulcers → bloody diarrhoea<br/>"
"• Haematogenous spread → liver abscess<br/>"
"• Fever present<br/>"
"• Blood & mucus in stool",
"Giardiasis (G. lamblia) — NON-INVASIVE",
"• Stays in intestinal lumen only<br/>"
"• No ulcers, no tissue invasion<br/>"
"• No systemic spread<br/>"
"• NO fever<br/>"
"• NO blood in stool — only fatty diarrhoea",
lc=RED, rc=TEAL, lbg=RED_LT, rbg=TEAL_LT,
), SP(0.18)]
# ══ SECTION 8: MNEMONICS ══════════════════════════════════════════════════════
story += [banner("⑧ MNEMONICS & EXAM MEMORY TRICKS", AMBER), SP(0.1)]
mn_data = [
[Paragraph("Mnemonic", H_TH), Paragraph("Hook", H_TH)],
[Paragraph("Giardia = 2 faces", H_CELLB),
Paragraph("2 nuclei → 'Giardia smiles at you' | Cyst = 4 nuclei = '4 doors to infect'", H_CELL)],
[Paragraph("Trichomonas = NO CYST", H_CELLB),
Paragraph("T = Trophozoite-only | No cyst → transmitted only by sex / direct contact", H_CELL)],
[Paragraph("5 Flagella of T. vaginalis", H_CELLB),
Paragraph("'4 go forward, 1 turns back' → 4+1 = Five", H_CELL)],
[Paragraph("METRO goes to BOTH stations", H_CELLB),
Paragraph("Metronidazole treats BOTH Giardia AND Trichomonas", H_CELL)],
[Paragraph("Males FLUSH T. vaginalis", H_CELLB),
Paragraph("Urine = natural flushing system → asymptomatic in males", H_CELL)],
[Paragraph("Strawberry Cervix", H_CELLB),
Paragraph("Petechial dots = red seeds on strawberry → Trichomonas vaginitis", H_CELL)],
[Paragraph("STEA-torrhoea = FAT", H_CELLB),
Paragraph("Fat floats, pale, greasy → brush border enzymes ↓ by Giardia", H_CELL)],
[Paragraph("Invasive vs Non-invasive", H_CELLB),
Paragraph("Amoeba INVADES (liver abscess), Giardia STAYS in lumen (no fever, no blood)", H_CELL)],
[Paragraph("Feco-oral Flagellate", H_CELLB),
Paragraph("Giardia = Water-borne | Trichomonas = Sex-borne (different routes!)", H_CELL)],
]
mn_tbl = Table(mn_data, colWidths=[4.2*cm, W-4.2*cm], repeatRows=1)
mn_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), AMBER),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), TP),
("BOTTOMPADDING", (0,0), (-1,-1), TP),
("LEFTPADDING", (0,0), (-1,-1), LP),
("RIGHTPADDING", (0,0), (-1,-1), LP),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
*[("BACKGROUND", (0,i), (-1,i), WHITE if i%2==1 else AMBER_LT)
for i in range(1, len(mn_data))],
]))
story += [mn_tbl, SP(0.12)]
# ══ FOOTER ════════════════════════════════════════════════════════════════════
story.append(HRFlowable(width=W, thickness=0.4, color=GREY_MID))
story.append(SP(0.08))
footer = Table([[
Paragraph("★ = High-yield exam point", H_SMALL),
Paragraph("Ref: Sherris & Ryan's Medical Microbiology 8th Ed. | Goodman & Gilman's Pharmacology", H_SMALL),
Paragraph("Card 05 · Second Term · AMCB-08", H_SMALL),
]], colWidths=[W/3, W/3, W/3])
footer.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 1),
("BOTTOMPADDING", (0,0), (-1,-1), 1),
("LEFTPADDING", (0,0), (-1,-1), 2),
("RIGHTPADDING", (0,0), (-1,-1), 2),
]))
story.append(footer)
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"Cheatsheet saved: {OUTPUT}")
cd /tmp/workspace/giardia-trichomonas && python create_cheatsheet.py 2>&1
ls -lh /tmp/workspace/giardia-trichomonas/
Cheatsheet Giardia Trichomonas
PDF Document · PDF
| Section | Content |
|---|---|
| ① Master Comparison Table | ১৯টি feature — morphology থেকে treatment পর্যন্ত পাশাপাশি |
| ② Morphology at a Glance | Trophozoite ও Cyst — দুটো color-box-এ side by side |
| ③ Pathogenesis | Step-by-step, দুটো organism আলাদা color-এ |
| ④ Clinical Features + Diagnosis | ৪টি box — Clinical (G), Clinical (T), Diagnosis (G), Diagnosis (T) |
| ⑤ Key Concepts | Steatorrhoea · String Test · Strawberry Cervix — সংক্ষেপে |
| ⑥ Why Males Asymptomatic + Treatment | Table + full treatment comparison |
| ⑦ Virulence + Amoebiasis vs Giardiasis | Invasive vs Non-invasive clearly |
| ⑧ Mnemonics | ৯টি memory trick — exam-এ দ্রুত মনে করার জন্য |
★ = High-yield exam point দিয়ে সবচেয়ে গুরুত্বপূর্ণ জিনিসগুলো mark করা আছে।