Make a long question type answer for my exam and precise and to the point answer
| Taxon | Name |
|---|---|
| Suborder | Piroplasmorina |
| Family | Babesiidae |
| Genus | Babesia |
| Sl. No. | Species | Host | Vector | Size |
|---|---|---|---|---|
| 1 | B. bovis | Cattle & buffalo | Boophilus microplus (India), B. annulatus | Small |
| 2 | B. bigemina | Cattle & buffalo | -do- | Large |
| 3 | B. divergens | Cattle | -do- | Small |
| 4 | B. major | Cattle | Haemophysalis punctata | Large |
| 5 | B. ovis | Sheep & goat | Haemophysalis punctata, Rhipicephalus bursa, Dermacentor silvarum | Small |
| 6 | B. motasi | Sheep & goat | -do- | Large |
| 7 | B. equi | Horse | Rhipicephalus sanguineus, Hyalomma anatolicum, H. dromedarii, Dermacentor sp. | Small; gives maltese cross appearance |
| 8 | B. caballi | Horse | -do- | Large |
| 9 | B. canis | Dog | Rhipicephalus sanguineus, Haemophysalis leachi | Large |
| 10 | B. gibsoni | Dog | Rhipicephalus sanguineus, Haemophysalis bispinosa | Small |
| 11 | B. trautmanni | Pig | Rhipicephalus, Boophilus, Dermacentor | Large |
| 12 | B. felis | Cat | Unknown | Small |
Key terms: Transovarian = Vertical transmission; Transstadial = Horizontal transmission
Note: Lysis of erythrocytes (up to 75% in acute infection) is not proportional to parasitaemia, which varies from 0.1% to 50%.
Summary Mnemonic for Clinical Signs: H-H-M-P-C-A-D = High fever, Haemoglobinuria, Mucous membrane pallor, Pulse increase, Cessation of ruminal movement, Abortion, Death
Create a summary PDF of Babesia for quick exam revision
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/babesia-revision && python3 -c "from reportlab.…
~/babesia-revision/make_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
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 ListFlowable, ListItem
OUTPUT = "/home/daytona/workspace/babesia-revision/Babesia_Quick_Revision.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Babesia - Quick Exam Revision",
author="Veterinary Parasitology"
)
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_GREEN = colors.HexColor("#1B5E20")
MED_GREEN = colors.HexColor("#2E7D32")
LIGHT_GREEN = colors.HexColor("#E8F5E9")
ACCENT = colors.HexColor("#FF6F00") # amber for highlights
BOX_BG = colors.HexColor("#F1F8E9")
TABLE_HDR = colors.HexColor("#33691E")
TABLE_ALT = colors.HexColor("#F9FBE7")
WHITE = colors.white
RED_DARK = colors.HexColor("#B71C1C")
styles = getSampleStyleSheet()
# Custom paragraph styles
title_style = ParagraphStyle(
"MyTitle",
parent=styles["Title"],
fontSize=20, leading=26,
textColor=WHITE,
alignment=TA_CENTER,
spaceAfter=4
)
subtitle_style = ParagraphStyle(
"MySubtitle",
parent=styles["Normal"],
fontSize=10, leading=13,
textColor=colors.HexColor("#DCEDC8"),
alignment=TA_CENTER,
spaceAfter=0
)
section_style = ParagraphStyle(
"SectionHead",
parent=styles["Heading1"],
fontSize=11, leading=14,
textColor=WHITE,
spaceAfter=4, spaceBefore=6,
leftIndent=0, borderPad=4,
backColor=MED_GREEN,
borderRadius=3
)
sub_style = ParagraphStyle(
"SubHead",
parent=styles["Heading2"],
fontSize=9.5, leading=12,
textColor=DARK_GREEN,
spaceAfter=2, spaceBefore=4,
fontName="Helvetica-Bold"
)
body_style = ParagraphStyle(
"Body",
parent=styles["Normal"],
fontSize=8.5, leading=12,
textColor=colors.HexColor("#212121"),
spaceAfter=2,
alignment=TA_JUSTIFY
)
bullet_style = ParagraphStyle(
"Bullet",
parent=body_style,
leftIndent=12,
bulletIndent=2,
spaceAfter=1.5
)
highlight_style = ParagraphStyle(
"Highlight",
parent=body_style,
backColor=colors.HexColor("#FFF8E1"),
borderPad=3,
textColor=RED_DARK,
fontName="Helvetica-Bold",
fontSize=8.5,
alignment=TA_CENTER
)
note_style = ParagraphStyle(
"Note",
parent=body_style,
backColor=LIGHT_GREEN,
borderPad=4,
textColor=DARK_GREEN,
fontName="Helvetica-Oblique",
fontSize=8
)
def section(title_text):
return [
Spacer(1, 4*mm),
Paragraph(f" {title_text}", section_style),
Spacer(1, 1.5*mm),
]
def sub(text):
return Paragraph(text, sub_style)
def body(text):
return Paragraph(text, body_style)
def bullet(text):
return Paragraph(f"• {text}", bullet_style)
def note(text):
return Paragraph(f"ⓘ {text}", note_style)
def highlight(text):
return Paragraph(text, highlight_style)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C8E6C9"), spaceAfter=2, spaceBefore=2)
# ── BUILD STORY ─────────────────────────────────────────────────────────────
story = []
# ── TITLE BANNER ────────────────────────────────────────────────────────────
banner_data = [[
Paragraph("<b><i>Babesia</i></b> — Quick Exam Revision", title_style),
]]
banner_table = Table(banner_data, colWidths=[17.1*cm])
banner_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_GREEN),
("ROUNDEDCORNERS", [6]),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
story.append(banner_table)
sub_banner_data = [[
Paragraph("Veterinary Parasitology | Suborder: Piroplasmorina | Family: Babesiidae", subtitle_style)
]]
sub_banner = Table(sub_banner_data, colWidths=[17.1*cm])
sub_banner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), MED_GREEN),
("ROUNDEDCORNERS", [4]),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
]))
story.append(sub_banner)
story.append(Spacer(1, 3*mm))
# ── QUICK-GLANCE BOX ────────────────────────────────────────────────────────
qg_data = [
[Paragraph("<b>QUICK GLANCE</b>", ParagraphStyle("qg", parent=body_style, textColor=ACCENT, fontName="Helvetica-Bold", fontSize=9)), ""],
[Paragraph("Disease names:", body_style),
Paragraph("<b>Babesiosis / Red Water Fever / Tick Fever / Texas Fever / Piroplasmosis</b>", body_style)],
[Paragraph("Main feature:", body_style),
Paragraph("<b>High fever + Anaemia + Haemoglobinuria (coffee-coloured urine)</b>", body_style)],
[Paragraph("Key vector:", body_style),
Paragraph("<b>Boophilus microplus</b> (India) for cattle & buffalo", body_style)],
[Paragraph("Historical note:", body_style),
Paragraph("1893 — Smith & Kilborne: <i>B. bigemina</i> transmitted by <i>Boophilus annulatus</i> (1st arthropod-borne disease discovery)", body_style)],
]
qg_table = Table(qg_data, colWidths=[4*cm, 13.1*cm])
qg_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#FFF8E1")),
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#FFF8E1")),
("SPAN", (0,0), (-1,0)),
("BOX", (0,0), (-1,-1), 0.8, ACCENT),
("ROUNDEDCORNERS",[4]),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING",(0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 5),
]))
story.append(qg_table)
# ── 1. CLASSIFICATION ───────────────────────────────────────────────────────
story += section("1. CLASSIFICATION")
cl_data = [
["Taxon", "Name"],
["Kingdom", "Protista"],
["Phylum", "Apicomplexa"],
["Suborder", "Piroplasmorina"],
["Family", "Babesiidae"],
["Genus", "Babesia"],
]
cl_table = Table(cl_data, colWidths=[5*cm, 12.1*cm])
cl_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, TABLE_ALT]),
("BOX", (0,0), (-1,-1), 0.5, MED_GREEN),
("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#C8E6C9")),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING",(0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story.append(cl_table)
# ── 2. MORPHOLOGY ───────────────────────────────────────────────────────────
story += section("2. MORPHOLOGY")
morph_points = [
"Intraerythrocytic protozoa (live inside RBCs)",
"Shape: Pyriform (pear-shaped); round, oval or elongated forms also seen",
"Characteristic: often form an <b>acute angle</b> by their narrow ends",
"Remain singly or in <b>pairs</b> in RBC; 4 in <i>B. equi</i> (maltese cross); up to 16 in <i>B. canis</i>",
"<b>Small Babesia:</b> 1–2.5 µm | <b>Large Babesia:</b> 2.5–5 µm",
"Staining: Blue cytoplasm + Red nucleus with <b>Romanowsky stain</b>",
"Apical complex is reduced",
]
for pt in morph_points:
story.append(bullet(pt))
# ── 3. SPECIES TABLE ────────────────────────────────────────────────────────
story += section("3. IMPORTANT SPECIES")
sp_headers = ["Species", "Host", "Vector", "Size"]
sp_data = [
["B. bovis", "Cattle & buffalo", "Boophilus microplus (India), B. annulatus", "Small"],
["B. bigemina", "Cattle & buffalo", "B. microplus, B. annulatus", "Large"],
["B. divergens", "Cattle", "B. microplus, B. annulatus", "Small"],
["B. major", "Cattle", "Haemophysalis punctata", "Large"],
["B. ovis", "Sheep & goat", "Haemophysalis punctata, Rhipicephalus bursa, Dermacentor silvarum", "Small"],
["B. motasi", "Sheep & goat", "—do—", "Large"],
["B. equi", "Horse", "Rhipicephalus sanguineus, Hyalomma anatolicum, H. dromedarii, Dermacentor sp.", "Small (maltese cross)"],
["B. caballi", "Horse", "—do—", "Large"],
["B. canis", "Dog", "Rhipicephalus sanguineus, Haemophysalis leachi", "Large"],
["B. gibsoni", "Dog", "Rhipicephalus sanguineus, H. bispinosa", "Small"],
["B. trautmanni", "Pig", "Rhipicephalus, Boophilus, Dermacentor", "Large"],
["B. felis", "Cat", "Unknown", "Small"],
]
full_sp = [sp_headers] + sp_data
sp_table = Table(
[[Paragraph(f"<i>{r[0]}</i>" if i > 0 else r[0], body_style),
Paragraph(r[1], body_style),
Paragraph(r[2], body_style),
Paragraph(r[3], body_style)] for i, r in enumerate(full_sp)],
colWidths=[3.0*cm, 3.0*cm, 7.5*cm, 3.6*cm]
)
sp_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.8),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, TABLE_ALT]),
("BOX", (0,0), (-1,-1), 0.5, MED_GREEN),
("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#C8E6C9")),
("TOPPADDING", (0,0), (-1,-1), 2.5),
("BOTTOMPADDING",(0,0), (-1,-1), 2.5),
("LEFTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(sp_table)
# ── 4. LIFE CYCLE ───────────────────────────────────────────────────────────
story += section("4. LIFE CYCLE (Indirect)")
lc_data = [
[
Paragraph("<b>IN HOST (Vertebrate)</b>", ParagraphStyle("lch", parent=body_style, textColor=DARK_GREEN, fontName="Helvetica-Bold")),
Paragraph("<b>IN VECTOR (Tick)</b>", ParagraphStyle("lct", parent=body_style, textColor=RED_DARK, fontName="Helvetica-Bold"))
],
[
Paragraph(
"1. Infective <b>sporozoites</b> inoculated by tick into host blood<br/>"
"2. Enter RBCs → trophozoite stage<br/>"
"3. Divide by <b>binary fission</b> → 2 (or more) piroplasms<br/>"
"4. RBC lyses → piroplasms released<br/>"
"5. Re-invade fresh RBCs (cycle repeats)",
body_style
),
Paragraph(
"1. Tick ingests infected blood → RBCs lysed in gut<br/>"
"2. Piroplasms (gamonts) undergo <b>syngamy</b><br/>"
"3. Form <b>motile kinetes (ookinetes)</b><br/>"
"4a. <b>Transovarian</b>: kinetes → ovary → ova → larvae → salivary glands → sporozoites (Vertical)<br/>"
"4b. <b>Transstadial</b>: kinetes → salivary glands directly → sporozoites (Horizontal)<br/>"
"5. Sporozoites injected into next host during blood meal",
body_style
)
]
]
lc_table = Table(lc_data, colWidths=[8.4*cm, 8.7*cm])
lc_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), colors.HexColor("#E8F5E9")),
("BACKGROUND", (1,0), (1,0), colors.HexColor("#FFEBEE")),
("BACKGROUND", (0,1), (0,1), colors.HexColor("#F1F8E9")),
("BACKGROUND", (1,1), (1,1), colors.HexColor("#FFF8F8")),
("BOX", (0,0), (-1,-1), 0.7, MED_GREEN),
("INNERGRID", (0,0), (-1,-1), 0.4, colors.HexColor("#C8E6C9")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(lc_table)
story.append(Spacer(1, 2*mm))
story.append(note("Key: Transovarian = Vertical (next generation tick) | Transstadial = Horizontal (same generation, next stage)"))
# ── 5. PATHOGENESIS ─────────────────────────────────────────────────────────
story += section("5. PATHOGENESIS")
story.append(sub("Factors affecting pathogenesis:"))
path_factors = [
"<b>Species:</b> B. bovis, B. canis, B. motasi are highly pathogenic",
"<b>Age:</b> Adults > Young (Inverse age resistance)",
"<b>Breed:</b> Exotic/crossbreed > Indigenous",
"<b>Immune status:</b> Premunity in endemic/recovered animals — mild signs on re-infection",
"<b>Stress:</b> Parturition, concomitant infection → severe disease",
]
for f in path_factors:
story.append(bullet(f))
story.append(sub("Mechanism (Flowchart):"))
flow_data = [
["Sporozoites inoculated by tick → Invade RBCs"],
["Intravascular haemolysis (rapid parasite multiplication)"],
["+ Extravascular haemolysis (phagocytosis of infected & non-infected RBCs in spleen)"],
["Haemoglobinaemia | Haemoglobinuria | Bilirubinuria | Anaemia | Jaundice"],
["Anaemia → ↓O₂ carrying capacity → Tissue Hypoxia"],
["Anaerobic metabolism → Acidosis → ↓ Cellular energy → Hypoxic cell damage"],
["Irreversible shock → DEATH"],
]
for i, row in enumerate(flow_data):
bg = colors.HexColor("#FFCDD2") if i == len(flow_data)-1 else (LIGHT_GREEN if i % 2 == 0 else BOX_BG)
fc = RED_DARK if i == len(flow_data)-1 else DARK_GREEN
ft = Table([[Paragraph(row[0], ParagraphStyle("fc", parent=body_style, textColor=fc, alignment=TA_CENTER))]],
colWidths=[17.1*cm])
ft.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 0.4, MED_GREEN),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING",(0,0), (-1,-1), 2),
]))
story.append(ft)
if i < len(flow_data)-1:
story.append(Paragraph("▼", ParagraphStyle("arr", parent=body_style, alignment=TA_CENTER,
textColor=MED_GREEN, fontSize=8)))
story.append(Spacer(1, 1*mm))
story.append(note("Note: RBC lysis up to 75% in acute infection — NOT proportional to parasitaemia (0.1%–50%)"))
story.append(note("Also: Microvascular stasis in brain → Nervous signs (incoordination, hyperexcitability)"))
# ── 6. CLINICAL SIGNS ───────────────────────────────────────────────────────
story += section("6. CLINICAL SIGNS")
cs_data = [
["No.", "Sign", "Note"],
["1", "High fever (≥ 105°F)", "Cardinal sign"],
["2", "Haemoglobinuria", "Urine coffee-coloured → 'Red Water Fever'"],
["3", "Pale/jaundiced mucous membranes", "Especially jaundice in Turkey"],
["4", "↑ Pulse, respiratory & heart rate", ""],
["5", "Cessation of ruminal movement", ""],
["6", "Abortion", "In pregnant animals"],
["7", "Death", "In untreated cases"],
["8", "Survivors", "Weight loss, ↓ milk, diarrhoea → constipation"],
]
cs_table = Table(
[[Paragraph(c, body_style) for c in row] for row in cs_data],
colWidths=[1.2*cm, 6.5*cm, 9.4*cm]
)
cs_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, TABLE_ALT]),
("BOX", (0,0), (-1,-1), 0.5, MED_GREEN),
("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#C8E6C9")),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING",(0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(cs_table)
story.append(Spacer(1, 1*mm))
story.append(highlight("MNEMONIC: H-H-M-P-C-A-D = High fever | Haemoglobinuria | Mucous membrane pallor | Pulse increase | Cessation of ruminal movement | Abortion | Death"))
# ── 7. POST-MORTEM LESIONS ──────────────────────────────────────────────────
story += section("7. POST-MORTEM LESIONS")
pm_points = [
"Subcutaneous and intramuscular <b>oedema with icterus</b>",
"Fat is <b>yellow and gelatinous</b>",
"Blood becomes <b>thin and watery</b>",
"<b>Spleen and liver enlarged</b>",
"Deposition of <b>haemosiderin in Kupffer cells</b>",
"<b>Congestion</b> of different organs",
]
for pt in pm_points:
story.append(bullet(pt))
# ── 8. EPIDEMIOLOGY ─────────────────────────────────────────────────────────
story += section("8. EPIDEMIOLOGY")
epi_points = [
"Depends on: distribution of tick vectors, geography, host age, immune status, climate",
"<i>B. bigemina</i> and <i>B. bovis</i> found mainly in <b>tropical and subtropical</b> countries",
"In India: <b>Boophilus microplus</b> is the main vector for cattle and buffalo",
"All cattle breeds susceptible; <b>indigenous breeds less susceptible</b> (tick resistance)",
"Infection mostly in <b>adult animals</b>",
"<b>Premunity</b> seen in recovered animals — mild signs on re-infection",
]
for pt in epi_points:
story.append(bullet(pt))
# ── 9. DIAGNOSIS ────────────────────────────────────────────────────────────
story += section("9. DIAGNOSIS")
dx_data = [
["Method", "Details"],
["History", "Previous infection, tick exposure"],
["Clinical signs", "High fever, haemoglobinuria, anaemia"],
["Blood smear (Giemsa stain)", "Pyriform organisms in pairs at acute angle inside RBCs; thin or thick smear during febrile period"],
["Necropsy", "Enlarged spleen & liver, subcutaneous oedema, organ congestion"],
]
dx_table = Table(
[[Paragraph(c, body_style) for c in row] for row in dx_data],
colWidths=[4.5*cm, 12.6*cm]
)
dx_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HDR),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, TABLE_ALT]),
("BOX", (0,0), (-1,-1), 0.5, MED_GREEN),
("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#C8E6C9")),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING",(0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(dx_table)
# ── FOOTER NOTE ─────────────────────────────────────────────────────────────
story.append(Spacer(1, 4*mm))
story.append(HRFlowable(width="100%", thickness=1, color=DARK_GREEN))
story.append(Spacer(1, 1*mm))
story.append(Paragraph(
"<b>Source:</b> Essentials of Veterinary Parasitology (S. Pal and P.K. Sanyal) | Pages 330–334",
ParagraphStyle("footer", parent=body_style, fontSize=7.5, textColor=colors.grey, alignment=TA_CENTER)
))
# ── BUILD ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
python3 /home/daytona/workspace/babesia-revision/make_pdf.py 2>&1
ls -lh /home/daytona/workspace/babesia-revision/Babesia_Quick_Revision.pdf
| Section | What's covered |
|---|---|
| Quick Glance Box | Disease names, key feature, vector, historical note |
| Classification | Full taxonomy table |
| Morphology | Size, shape, staining, key characteristics |
| Species Table | All 12 species with host, vector & size |
| Life Cycle | Side-by-side: In Host vs. In Tick (transovarian/transstadial) |
| Pathogenesis | Factors + step-by-step flowchart to Death |
| Clinical Signs | Numbered table + mnemonic H-H-M-P-C-A-D |
| Post-Mortem Lesions | All 6 PM findings |
| Epidemiology + Diagnosis | Key points + 4 diagnostic methods |
Babesia Quick Revision
PDF Document · PDF
Generate a comparison poster: Babesia vs Theileria
~/babesia-revision/make_comparison_poster.py
from reportlab.lib.pagesizes import A3, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
OUTPUT = "/home/daytona/workspace/babesia-revision/Babesia_vs_Theileria_Poster.pdf"
# ── Page: A3 landscape ───────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=landscape(A3),
rightMargin=1.5*cm, leftMargin=1.5*cm,
topMargin=1.2*cm, bottomMargin=1.2*cm,
title="Babesia vs Theileria - Comparison Poster",
)
PAGE_W = landscape(A3)[0] - 3*cm # usable width ~38.5 cm
# ── Colour palette ───────────────────────────────────────────────────────────
BAB_DARK = colors.HexColor("#1565C0") # deep blue – Babesia
BAB_MID = colors.HexColor("#1976D2")
BAB_LIGHT = colors.HexColor("#E3F2FD")
BAB_PALE = colors.HexColor("#F0F7FF")
THEIL_DARK = colors.HexColor("#2E7D32") # deep green – Theileria
THEIL_MID = colors.HexColor("#388E3C")
THEIL_LIGHT= colors.HexColor("#E8F5E9")
THEIL_PALE = colors.HexColor("#F1FBF2")
VS_DARK = colors.HexColor("#4A148C") # purple – VS column
VS_LIGHT = colors.HexColor("#F3E5F5")
HDR_TEXT = colors.white
ACCENT = colors.HexColor("#FF6F00")
DARK_TEXT = colors.HexColor("#212121")
MUTED = colors.HexColor("#757575")
RED_WARN = colors.HexColor("#B71C1C")
styles = getSampleStyleSheet()
def PS(name, **kw):
base = kw.pop("parent", styles["Normal"])
return ParagraphStyle(name, parent=base, **kw)
# Shared styles
title_s = PS("T", fontSize=26, leading=32, textColor=HDR_TEXT, alignment=TA_CENTER, fontName="Helvetica-Bold")
sub_s = PS("S", fontSize=11, leading=14, textColor=colors.HexColor("#E8EAF6"), alignment=TA_CENTER)
cat_bab = PS("CB", fontSize=9, leading=12, textColor=BAB_DARK, fontName="Helvetica-Bold")
cat_theil= PS("CT", fontSize=9, leading=12, textColor=THEIL_DARK, fontName="Helvetica-Bold")
cat_vs = PS("CV", fontSize=9, leading=12, textColor=VS_DARK, fontName="Helvetica-Bold", alignment=TA_CENTER)
body_s = PS("B", fontSize=8.2, leading=11.5, textColor=DARK_TEXT, alignment=TA_LEFT)
body_c = PS("BC", fontSize=8.2, leading=11.5, textColor=DARK_TEXT, alignment=TA_CENTER)
bold_s = PS("BD", fontSize=8.2, leading=11.5, textColor=DARK_TEXT, fontName="Helvetica-Bold")
bold_bab = PS("BB", fontSize=8.2, leading=11.5, textColor=BAB_DARK, fontName="Helvetica-Bold")
bold_th = PS("BT", fontSize=8.2, leading=11.5, textColor=THEIL_DARK,fontName="Helvetica-Bold")
note_s = PS("N", fontSize=7.5, leading=10, textColor=MUTED, fontName="Helvetica-Oblique", alignment=TA_CENTER)
diff_s = PS("D", fontSize=8.2, leading=11.5, textColor=RED_WARN, fontName="Helvetica-Bold", alignment=TA_CENTER)
def p(text, style=body_s): return Paragraph(text, style)
def b(text): return Paragraph(f"• {text}", PS("bl", parent=body_s, leftIndent=8))
# ── Column widths ─────────────────────────────────────────────────────────────
# category | Babesia | VS | Theileria
C = [4.5*cm, 15.8*cm, 3.0*cm, 15.8*cm]
story = []
# ══════════════════════════════════════════════════════════════════════════════
# TITLE BANNER
# ══════════════════════════════════════════════════════════════════════════════
title_data = [[
Paragraph("<b><i>Babesia</i></b>", PS("TL", fontSize=28, leading=34, textColor=colors.HexColor("#90CAF9"), alignment=TA_CENTER, fontName="Helvetica-BoldOblique")),
Paragraph("<b>VS</b>", PS("TM", fontSize=22, leading=28, textColor=colors.HexColor("#CE93D8"), alignment=TA_CENTER, fontName="Helvetica-Bold")),
Paragraph("<b><i>Theileria</i></b>", PS("TR", fontSize=28, leading=34, textColor=colors.HexColor("#A5D6A7"), alignment=TA_CENTER, fontName="Helvetica-BoldOblique")),
]]
title_t = Table(title_data, colWidths=[PAGE_W*0.42, PAGE_W*0.16, PAGE_W*0.42])
title_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#1A237E")),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(title_t)
subtitle_data = [[
Paragraph("Suborder Piroplasmorina | Family Babesiidae", PS("SL", fontSize=9, leading=12, textColor=colors.HexColor("#BBDEFB"), alignment=TA_CENTER)),
Paragraph("Comparative Chart for Quick Exam Revision", PS("SM", fontSize=9, leading=12, textColor=colors.HexColor("#E1BEE7"), alignment=TA_CENTER)),
Paragraph("Suborder Piroplasmorina | Family Theileriidae", PS("SR", fontSize=9, leading=12, textColor=colors.HexColor("#C8E6C9"), alignment=TA_CENTER)),
]]
sub_t = Table(subtitle_data, colWidths=[PAGE_W*0.42, PAGE_W*0.16, PAGE_W*0.42])
sub_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#283593")),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
]))
story.append(sub_t)
story.append(Spacer(1, 3*mm))
# ══════════════════════════════════════════════════════════════════════════════
# MAIN COMPARISON TABLE
# ══════════════════════════════════════════════════════════════════════════════
def row(category, bab_content, vs_text, theil_content, bab_bg=BAB_PALE, theil_bg=THEIL_PALE, highlight_diff=False):
vs_style = diff_s if highlight_diff else body_c
return [
p(category, cat_bab),
bab_content if not isinstance(bab_content, str) else p(bab_content, body_s),
p(vs_text, vs_style),
theil_content if not isinstance(theil_content, str) else p(theil_content, body_s),
]
# Header row
hdr = [
p("PARAMETER", PS("PH", fontSize=9.5, leading=12, textColor=HDR_TEXT, fontName="Helvetica-Bold", alignment=TA_CENTER)),
p("BABESIA", PS("BH", fontSize=11, leading=14, textColor=HDR_TEXT, fontName="Helvetica-Bold", alignment=TA_CENTER)),
p("VS", PS("VH", fontSize=11, leading=14, textColor=HDR_TEXT, fontName="Helvetica-Bold", alignment=TA_CENTER)),
p("THEILERIA", PS("TH", fontSize=11, leading=14, textColor=HDR_TEXT, fontName="Helvetica-Bold", alignment=TA_CENTER)),
]
def rows_with_bullets(category, bab_bullets, vs_text, theil_bullets, highlight_diff=False):
bab_cell = [b(x) for x in bab_bullets]
theil_cell= [b(x) for x in theil_bullets]
vs_style = diff_s if highlight_diff else body_c
return [
p(category, cat_bab),
bab_cell,
p(vs_text, vs_style),
theil_cell,
]
data = [hdr]
# 1. Classification
data.append(row(
"CLASSIFICATION",
p("Family: <b>Babesiidae</b>\nGenus: <i>Babesia</i>", body_s),
"",
p("Family: <b>Theileriidae</b>\nGenus: <i>Theileria</i>", body_s),
))
# 2. Location in host
data.append(row(
"LOCATION\nIN HOST",
p("<b>Intraerythrocytic only</b>\n(inside RBCs)", body_s),
"KEY\nDIFF",
p("<b>Intraerythrocytic + Intralymphocytic</b>\n(both RBCs & lymphocytes/WBCs)", body_s),
highlight_diff=True
))
# 3. Schizogony
data.append(row(
"SCHIZOGONY\nIN HOST",
p("<b>ABSENT</b> in vertebrate host\n(only binary fission in RBCs)", body_s),
"KEY\nDIFF",
p("<b>PRESENT</b> in lymphocytes\n(Koch's blue bodies / macroschizonts)", body_s),
highlight_diff=True
))
# 4. Morphology in RBC
data.append(rows_with_bullets(
"MORPHOLOGY\n(in RBC)",
[
"Pyriform (pear-shaped), round, oval",
"Often in pairs at <b>acute angle</b>",
"Small spp: 1–2.5 µm; Large spp: 2.5–5 µm",
"<i>B. equi</i>: tetrad = maltese cross (4/RBC)",
"Blue cytoplasm + red nucleus (Romanowsky)",
"No pigment production",
],
"≈ Similar\nin RBC",
[
"Pyriform, round, rod or comma-shaped",
"Mostly <b>single or pairs</b> inside RBC",
"Smaller than Babesia; 0.5–2 µm",
"<i>T. parva</i>: rod/comma shape in RBC",
"Blue cytoplasm + red nucleus (Romanowsky)",
"No pigment production",
]
))
# 5. Schizont stage
data.append(row(
"SCHIZONT\n(Koch's Blue Body)",
p("<b>ABSENT</b>", PS("AB", parent=body_s, textColor=RED_WARN, fontName="Helvetica-Bold")),
"KEY\nDIFF",
p("<b>PRESENT</b> in lymphocytes\n= Koch's blue bodies\n(pathognomonic for Theileria)", PS("PR", parent=body_s, textColor=THEIL_DARK, fontName="Helvetica-Bold")),
highlight_diff=True
))
# 6. Species & Hosts
data.append(rows_with_bullets(
"IMPORTANT\nSPECIES",
[
"<i>B. bovis</i> – Cattle/buffalo (small)",
"<i>B. bigemina</i> – Cattle/buffalo (large)",
"<i>B. ovis</i> – Sheep & goat",
"<i>B. equi</i> – Horse (maltese cross)",
"<i>B. canis</i> – Dog (large; up to 16/RBC)",
"<i>B. gibsoni</i> – Dog (small)",
"<i>B. felis</i> – Cat",
],
"",
[
"<i>T. parva</i> – Cattle (East Coast Fever)",
"<i>T. annulata</i> – Cattle/buffalo (Tropical Theileriosis)",
"<i>T. mutans</i> – Cattle (benign)",
"<i>T. ovis</i> – Sheep & goat",
"<i>T. equi</i> – Horse (formerly <i>B. equi</i>)",
"<i>T. camelensis</i> – Camel",
"<i>T. lestoquardi</i> – Sheep (highly pathogenic)",
]
))
# 7. Vectors
data.append(rows_with_bullets(
"VECTORS\n(Ticks)",
[
"<i>Boophilus microplus</i> – cattle (India)",
"<i>B. annulatus</i> – cattle",
"<i>Haemophysalis punctata</i> – sheep/cattle",
"<i>Rhipicephalus sanguineus</i> – dog",
"<i>Hyalomma anatolicum</i> – horse",
"<i>Dermacentor</i> spp. – various",
],
"≈ Ticks\n(different\ngenera)",
[
"<i>Rhipicephalus appendiculatus</i> – T. parva",
"<i>Hyalomma anatolicum</i> – T. annulata (India)",
"<i>Amblyomma</i> spp. – T. mutans",
"<i>Rhipicephalus evertsi</i> – T. equi",
"<i>Haemophysalis punctata</i> – T. ovis",
]
))
# 8. Life cycle
data.append(rows_with_bullets(
"LIFE CYCLE\n(Type)",
[
"<b>Indirect</b> – requires tick vector",
"In host: sporozoite → trophozoite → binary fission in RBC",
"In tick: gamonts → syngamy → motile kinetes (ookinetes)",
"Transovarian (vertical) OR transstadial (horizontal) transmission",
"No schizogony in lymphocytes",
],
"KEY\nDIFF",
[
"<b>Indirect</b> – requires tick vector",
"In host: sporozoite → infects LYMPHOCYTES → schizogony (macro/microschizonts)",
"Merozoites released → invade RBCs → piroplasms",
"In tick: gametocytes → syngamy → kinetes → sporozoites in salivary gland",
"Transstadial ONLY (no transovarian transmission)",
],
highlight_diff=True
))
# 9. Transmission type
data.append(row(
"TICK\nTRANSMISSION",
p("<b>Transovarian</b> (vertical) +\n<b>Transstadial</b> (horizontal)\nboth possible", body_s),
"KEY\nDIFF",
p("<b>Transstadial ONLY</b>\n(no transovarian transmission)\nhorizontal only", body_s),
highlight_diff=True
))
# 10. Pathogenesis
data.append(rows_with_bullets(
"PATHO-\nGENESIS",
[
"Intravascular haemolysis (main)",
"Extra-vascular haemolysis in spleen",
"Haemoglobinaemia, Haemoglobinuria",
"Anaemia → Hypoxia → Acidosis → Death",
"Microvascular stasis in brain → nervous signs",
],
"KEY\nDIFF",
[
"Lymphoproliferation (schizont-infected cells) – main in acute phase",
"Lymphocyte destruction → immunosuppression",
"Later: RBC destruction → anaemia (less haemoglobinuria)",
"Leucopenia, lymphadenopathy",
"Pulmonary oedema common in T. parva (East Coast Fever)",
]
))
# 11. Clinical signs
data.append(rows_with_bullets(
"CLINICAL\nSIGNS",
[
"High fever ≥ 105°F",
"<b>Haemoglobinuria</b> (coffee urine = red water fever)",
"Pale/jaundiced mucous membranes",
"↑ Pulse, respiratory & heart rates",
"Cessation of ruminal movement",
"Abortion in pregnant animals",
"Death in untreated cases",
],
"≈ Fever\n+\nAnaemia",
[
"High fever (early sign)",
"<b>Lymphadenopathy</b> (characteristic)",
"Anaemia (less haemoglobinuria than Babesia)",
"Lacrimation, nasal discharge",
"Dyspnoea (esp. T. parva – pulmonary oedema)",
"Corneal opacity in T. parva",
"Death in susceptible animals",
]
))
# 12. Haemoglobinuria
data.append(row(
"HAEMO-\nGLOBINURIA",
p("<b>PROMINENT</b>\nCoffee/red-coloured urine\n('Red Water Fever')", PS("HBB", parent=body_s, textColor=BAB_DARK, fontName="Helvetica-Bold")),
"KEY\nDIFF",
p("<b>ABSENT / MILD</b>\nNot a characteristic feature;\nno 'red water'", PS("HBT", parent=body_s, textColor=THEIL_DARK, fontName="Helvetica-Bold")),
highlight_diff=True
))
# 13. Lymphadenopathy
data.append(row(
"LYMPH-\nADENOPATHY",
p("<b>NOT a feature</b>", PS("LNB", parent=body_s, textColor=MUTED)),
"KEY\nDIFF",
p("<b>PROMINENT feature</b>\n(due to lymphoproliferation\nof schizont-infected cells)", PS("LNT", parent=body_s, textColor=THEIL_DARK, fontName="Helvetica-Bold")),
highlight_diff=True
))
# 14. PM Lesions
data.append(rows_with_bullets(
"POST-MORTEM\nLESIONS",
[
"Subcutaneous + intramuscular oedema with icterus",
"Fat yellow and gelatinous",
"Blood thin and watery",
"Spleen and liver enlarged",
"Haemosiderin in Kupffer cells",
"Congestion of different organs",
],
"",
[
"Generalised lymphadenopathy (LN enlarged, haemorrhagic)",
"Splenomegaly, hepatomegaly",
"Pulmonary oedema (esp. T. parva)",
"Anaemia, pale mucous membranes",
"Petechiae on serosal surfaces",
"Koch's blue bodies in lymph node smears",
]
))
# 15. Diagnosis
data.append(rows_with_bullets(
"DIAGNOSIS",
[
"History of tick infestation",
"Clinical: fever + haemoglobinuria",
"Giemsa blood smear: pyriform pairs at acute angle in RBC",
"Necropsy: enlarged spleen/liver, congestion",
"Serology: CFT, IFAT, ELISA",
],
"≈ Blood\nsmear\n+\nHistory",
[
"History of tick infestation",
"Clinical: fever + lymphadenopathy + dyspnoea",
"Giemsa blood smear: piroplasms in RBC",
"<b>Lymph node smear / biopsy: Koch's blue bodies (macroschizonts)</b>",
"Serology: IFAT, ELISA",
]
))
# 16. Disease names
data.append(row(
"DISEASE\nNAMES",
p("<b>Babesiosis</b>\nRed Water Fever\nTick Fever\nTexas Fever\nPiroplasmosis", body_s),
"",
p("<b>Theileriosis</b>\nEast Coast Fever (<i>T. parva</i>)\nTropical Theileriosis (<i>T. annulata</i>)\nMediterranean Coast Fever", body_s),
))
# 17. Epidemiology
data.append(rows_with_bullets(
"EPDEMI-\nOLOGY",
[
"Worldwide; tropical & subtropical",
"India: B. bovis & B. bigemina (Boophilus microplus)",
"Adult animals more susceptible (inverse age resistance)",
"Premunity in recovered animals",
"Indigenous breeds less susceptible",
],
"",
[
"Sub-Saharan Africa (T. parva); Asia/Med (T. annulata)",
"India: T. annulata (Hyalomma anatolicum)",
"Calves more susceptible to T. annulata",
"No premunity as effective as in Babesia",
"Exotic breeds more susceptible",
]
))
# ══════════════════════════════════════════════════════════════════════════════
# Build table with cell-by-cell styling
# ══════════════════════════════════════════════════════════════════════════════
def flatten_cell(cell):
if isinstance(cell, list):
return cell # list of Paragraphs — Table handles it as a stack
return cell
table_data = []
for row_data in data:
table_data.append([flatten_cell(c) for c in row_data])
col_w = [C[0], C[1], C[2], C[3]]
main_table = Table(table_data, colWidths=col_w, repeatRows=1)
n = len(table_data)
ts = TableStyle([
# Header
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1A237E")),
("TEXTCOLOR", (0,0), (-1,0), HDR_TEXT),
("FONTSIZE", (0,0), (-1,0), 10),
("TOPPADDING", (0,0), (-1,0), 6),
("BOTTOMPADDING", (0,0), (-1,0), 6),
("ALIGN", (0,0), (-1,0), "CENTER"),
# Category column
("BACKGROUND", (0,1), (0,-1), colors.HexColor("#E8EAF6")),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,1), (0,-1), 8),
("TEXTCOLOR", (0,1), (0,-1), colors.HexColor("#1A237E")),
("ALIGN", (0,1), (0,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "TOP"),
# Babesia column background (alternating)
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#C5CAE9")),
("BOX", (0,0), (-1,-1), 1.0, colors.HexColor("#1A237E")),
# Padding
("TOPPADDING", (0,1), (-1,-1), 3),
("BOTTOMPADDING", (0,1), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
# VS column
("BACKGROUND", (2,1), (2,-1), colors.HexColor("#EDE7F6")),
("ALIGN", (2,0), (2,-1), "CENTER"),
("VALIGN", (2,0), (2,-1), "MIDDLE"),
("FONTNAME", (2,1), (2,-1), "Helvetica-Bold"),
("FONTSIZE", (2,1), (2,-1), 7.5),
])
# Alternating row backgrounds for Babesia and Theileria columns
for i in range(1, n):
if i % 2 == 0:
ts.add("BACKGROUND", (1,i), (1,i), BAB_LIGHT)
ts.add("BACKGROUND", (3,i), (3,i), THEIL_LIGHT)
else:
ts.add("BACKGROUND", (1,i), (1,i), BAB_PALE)
ts.add("BACKGROUND", (3,i), (3,i), THEIL_PALE)
main_table.setStyle(ts)
story.append(main_table)
# ══════════════════════════════════════════════════════════════════════════════
# BOTTOM KEY DIFFERENCES BOX
# ══════════════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 3*mm))
key_title = Paragraph("<b>★ KEY DIFFERENCES AT A GLANCE ★</b>",
PS("KT", fontSize=9.5, leading=12, textColor=HDR_TEXT, alignment=TA_CENTER, fontName="Helvetica-Bold"))
key_points = [
("Schizogony in lymphocytes", "ABSENT in Babesia", "PRESENT in Theileria (Koch's blue bodies)"),
("Haemoglobinuria", "PROMINENT (Red Water Fever)", "ABSENT / Mild"),
("Lymphadenopathy", "ABSENT", "PROMINENT (pathognomonic finding)"),
("Tick transmission", "Transovarian + Transstadial", "Transstadial ONLY"),
("Location in host", "RBCs only", "Lymphocytes + RBCs"),
("Key diagnostic smear", "Blood smear (acute angle pairs in RBC)", "Lymph node smear (Koch's blue bodies)"),
]
kd_data = [[
p("<b>Feature</b>", PS("KF", parent=body_s, textColor=HDR_TEXT, fontName="Helvetica-Bold", alignment=TA_CENTER)),
p("<b><i>Babesia</i></b>", PS("KB", parent=body_s, textColor=colors.HexColor("#90CAF9"), fontName="Helvetica-Bold", alignment=TA_CENTER)),
p("<b><i>Theileria</i></b>", PS("KG", parent=body_s, textColor=colors.HexColor("#A5D6A7"), fontName="Helvetica-Bold", alignment=TA_CENTER)),
]]
for feat, bab, theil in key_points:
kd_data.append([
p(feat, body_c),
p(bab, PS("kbb", parent=body_s, textColor=BAB_DARK, fontName="Helvetica-Bold", alignment=TA_CENTER)),
p(theil,PS("kbt", parent=body_s, textColor=THEIL_DARK, fontName="Helvetica-Bold", alignment=TA_CENTER)),
])
kd_w = [PAGE_W*0.22, PAGE_W*0.39, PAGE_W*0.39]
kd_table = Table(kd_data, colWidths=kd_w)
kd_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1A237E")),
("BACKGROUND", (1,1), (1,-1), BAB_LIGHT),
("BACKGROUND", (2,1), (2,-1), THEIL_LIGHT),
("BACKGROUND", (0,1), (0,-1), colors.HexColor("#EDE7F6")),
("BOX", (0,0), (-1,-1), 1.0, colors.HexColor("#1A237E")),
("INNERGRID", (0,0), (-1,-1), 0.4, colors.HexColor("#C5CAE9")),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
# Wrap key box
outer = Table(
[[key_title], [kd_table]],
colWidths=[PAGE_W]
)
outer.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1A237E")),
("TOPPADDING", (0,0), (-1,0), 5),
("BOTTOMPADDING", (0,0), (-1,0), 4),
("BOX", (0,0), (-1,-1), 1.2, colors.HexColor("#1A237E")),
("TOPPADDING", (0,1), (-1,1), 0),
("BOTTOMPADDING", (0,1), (-1,1), 0),
("LEFTPADDING", (0,1), (-1,1), 0),
("RIGHTPADDING", (0,1), (-1,1), 0),
]))
story.append(outer)
# Footer
story.append(Spacer(1, 2*mm))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#9E9E9E")))
story.append(Paragraph(
"Source: Essentials of Veterinary Parasitology (S. Pal & P.K. Sanyal) | Suborder Piroplasmorina — Babesiidae & Theileriidae",
PS("foot", fontSize=7, leading=9, textColor=MUTED, alignment=TA_CENTER)
))
doc.build(story)
print(f"Poster PDF created: {OUTPUT}")
python3 /home/daytona/workspace/babesia-revision/make_comparison_poster.py 2>&1
ls -lh /home/daytona/workspace/babesia-revision/Babesia_vs_Theileria_Poster.pdf
Babesia vs Theileria Poster
PDF Document · PDF
| Section | Covered |
|---|---|
| Classification | Family & genus for both |
| Location in host | RBCs only vs RBCs + Lymphocytes |
| Schizogony | Absent vs Present (Koch's blue bodies) |
| Morphology in RBC | Shape, size, staining details |
| Species list | 7 Babesia + 7 Theileria species with hosts |
| Vectors | Tick species for each genus |
| Life cycle | Step-by-step, side-by-side |
| Tick transmission | Transovarian+Transstadial vs Transstadial ONLY |
| Pathogenesis | Haemolysis-driven vs Lymphoproliferation-driven |
| Clinical signs | Full list with key differences highlighted |
| Haemoglobinuria | Prominent vs Absent |
| Lymphadenopathy | Absent vs Prominent |
| PM Lesions | All findings |
| Diagnosis | Blood smear vs Lymph node smear |
| Epidemiology | Distribution, India-specific data |
| KEY DIFFERENCES summary table | 6 most exam-critical points at bottom |
Do the same for this quick revision type
~/babesia-revision/make_eimeria_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
OUTPUT = "/home/daytona/workspace/babesia-revision/Eimeria_Coccidiosis_Quick_Revision.pdf"
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
rightMargin=1.7*cm, leftMargin=1.7*cm,
topMargin=1.4*cm, bottomMargin=1.4*cm,
title="Eimeria / Coccidiosis – Quick Exam Revision",
)
# ── Palette ──────────────────────────────────────────────────────────────────
DARK = colors.HexColor("#4A148C") # deep purple
MID = colors.HexColor("#6A1B9A")
LIGHT = colors.HexColor("#F3E5F5")
PALE = colors.HexColor("#FAF3FF")
ACCENT = colors.HexColor("#FF6F00")
HDR = colors.white
RED = colors.HexColor("#B71C1C")
GREEN = colors.HexColor("#1B5E20")
MUTED = colors.HexColor("#757575")
ALT = colors.HexColor("#EDE7F6")
TBL_HDR = colors.HexColor("#6A1B9A")
TBL_ALT = colors.HexColor("#F8F0FF")
FOWL = colors.HexColor("#E65100")
CATTLE = colors.HexColor("#1565C0")
SHEEP = colors.HexColor("#2E7D32")
WHITE = colors.white
styles = getSampleStyleSheet()
def PS(name, **kw):
base = kw.pop("parent", styles["Normal"])
return ParagraphStyle(name, parent=base, **kw)
body = PS("Bo", fontSize=8.2, leading=11.5, textColor=colors.HexColor("#212121"), alignment=TA_JUSTIFY)
bodyL = PS("BL", fontSize=8.2, leading=11.5, textColor=colors.HexColor("#212121"), alignment=TA_LEFT)
bodyC = PS("BC", fontSize=8.2, leading=11.5, textColor=colors.HexColor("#212121"), alignment=TA_CENTER)
bold = PS("BD", fontSize=8.2, leading=11.5, textColor=colors.HexColor("#212121"), fontName="Helvetica-Bold")
note_s = PS("NS", fontSize=7.8, leading=11, textColor=GREEN, fontName="Helvetica-Oblique", backColor=colors.HexColor("#E8F5E9"), alignment=TA_LEFT)
warn_s = PS("WS", fontSize=7.8, leading=11, textColor=RED, fontName="Helvetica-Bold", backColor=colors.HexColor("#FFEBEE"), alignment=TA_CENTER)
muted = PS("MU", fontSize=7.5, leading=10, textColor=MUTED, alignment=TA_CENTER)
def sec(txt, color=MID):
t = Table([[Paragraph(f" {txt}", PS("SH", fontSize=10.5, leading=13, textColor=WHITE,
fontName="Helvetica-Bold"))]], colWidths=[16.3*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), color),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 6),
]))
return [Spacer(1,3*mm), t, Spacer(1,1.5*mm)]
def sub(txt, color=DARK):
return Paragraph(txt, PS("SB", fontSize=9, leading=12, textColor=color, fontName="Helvetica-Bold", spaceBefore=4, spaceAfter=2))
def p(txt, st=body): return Paragraph(txt, st)
def b(txt, st=bodyL): return Paragraph(f"• {txt}", PS("BU", parent=st, leftIndent=10))
def note(txt): return Paragraph(f"ⓘ {txt}", note_s)
def warn(txt): return Paragraph(f"⚠ {txt}", warn_s)
def hr(): return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#CE93D8"), spaceAfter=2, spaceBefore=2)
def make_table(data, col_w, hdr_bg=TBL_HDR):
t = Table([[p(c, PS("TC", fontSize=8, leading=11, textColor=WHITE if i==0 else colors.HexColor("#212121"),
fontName="Helvetica-Bold" if i==0 else "Helvetica",
alignment=TA_CENTER)) for c in row]
for i, row in enumerate(data)], colWidths=col_w)
n = len(data)
ts = TableStyle([
("BACKGROUND", (0,0),(-1,0), hdr_bg),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 7.8),
("BOX", (0,0),(-1,-1), 0.6, MID),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CE93D8")),
("TOPPADDING", (0,0),(-1,-1), 2.5),
("BOTTOMPADDING", (0,0),(-1,-1), 2.5),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, TBL_ALT]),
])
t.setStyle(ts)
return t
story = []
# ══════════════════ TITLE BANNER ═════════════════════════════════════════════
banner = Table([[
Paragraph("<b><i>Eimeria</i> & Coccidiosis</b>", PS("TT", fontSize=22, leading=28, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold")),
]], colWidths=[16.3*cm])
banner.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), DARK),
("TOPPADDING",(0,0),(-1,-1), 10),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
]))
story.append(banner)
sub_banner = Table([[
Paragraph("Quick Exam Revision | Family: Eimeriidae | Order: Eucoccidiorida | Veterinary Parasitology",
PS("ST", fontSize=8.5, leading=11, textColor=colors.HexColor("#E1BEE7"), alignment=TA_CENTER)),
]], colWidths=[16.3*cm])
sub_banner.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), MID),
("TOPPADDING",(0,0),(-1,-1), 3),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
]))
story.append(sub_banner)
story.append(Spacer(1, 3*mm))
# ── Quick Glance Box ─────────────────────────────────────────────────────────
qg = Table([
[p("<b>QUICK GLANCE</b>", PS("QG", parent=bodyC, textColor=ACCENT, fontName="Helvetica-Bold", fontSize=9.5)), ""],
[p("Classification:", bold), p("Family Eimeriidae | Intracellular parasites of intestinal epithelial cells", bodyL)],
[p("Life cycle:", bold), p("Direct (monoxenous) | Host-specific AND location-specific", bodyL)],
[p("Infective stage:", bold), p("<b>Sporulated oocyst</b> (ingested with feed and water)", bodyL)],
[p("Prepatent period:", bold), p("<b>1 week in birds</b> | 3–4 weeks in animals", bodyL)],
[p("Sporulation:", bold), p("Outside host | 29–30°C, O₂, moisture | 1–3 days", bodyL)],
[p("Key disease:", bold), p("<b>Coccidiosis</b> — most important protozoan disease of poultry | Man-made, self-limiting", bodyL)],
], colWidths=[3.5*cm, 12.8*cm])
qg.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), colors.HexColor("#FFF8E1")),
("SPAN", (0,0),(-1,0)),
("BOX", (0,0),(-1,-1), 0.8, ACCENT),
("INNERGRID", (0,0),(-1,-1), 0.2, colors.HexColor("#FFE082")),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 5),
]))
story.append(qg)
# ══════════════════ 1. CLASSIFICATION ════════════════════════════════════════
story += sec("1. CLASSIFICATION & FAMILY EIMERIIDAE")
story.append(make_table(
[["Taxon","Name"],["Phylum","Apicomplexa"],["Order","Eucoccidiorida"],["Family","Eimeriidae"],
["Important genera","Eimeria, Isospora, Toxoplasma, Sarcocystis, Wenyonella, Cryptosporidium, Tyzzeria"]],
[3.5*cm, 12.8*cm]
))
story.append(Spacer(1,1*mm))
for pt in [
"Mostly <b>intracellular parasites of intestinal epithelial cells</b>",
"Direct life cycle — both asexual and sexual multiplication occur in same host",
"Not only <b>host-specific</b> but also <b>location-specific</b>",
"Sporulation occurs <b>outside the host</b>; sporulated oocyst = infective stage",
]:
story.append(b(pt))
# ══════════════════ 2. OOCYST MORPHOLOGY ═════════════════════════════════════
story += sec("2. MORPHOLOGY OF COCCIDIAL OOCYST")
story.append(make_table(
[["Feature","Detail"],
["Shape","Spherical, sub-spherical, ovoid or ellipsoidal"],
["Size","15–50 µm"],
["Wall","Two layers — transparent, refractile, clearly visible"],
["Micropyle","Small pore at one end, often covered by polar cap / micropyle cap"],
["Unsporulated","Contains nucleated mass (sporont) at center"],
["Sporulated","Contains sporocysts with banana-shaped sporozoites + sporocyst residium + stieda body (at pointed end)"],
],
[3.5*cm, 12.8*cm]
))
story.append(Spacer(1,1*mm))
story.append(note("Eimeria: 2 sporocysts, each with 4 sporozoites (= 8 sporozoites total per oocyst)"))
# ══════════════════ 3. LIFE CYCLE ════════════════════════════════════════════
story += sec("3. LIFE CYCLE OF Eimeria (Direct)")
# Two-column layout: In Host | Outside Host
lc = Table([
[p("<b>IN HOST (3 phases)</b>", PS("IH", parent=bodyC, textColor=DARK, fontName="Helvetica-Bold")),
p("<b>OUTSIDE HOST (Sporulation)</b>", PS("OH", parent=bodyC, textColor=GREEN, fontName="Helvetica-Bold"))],
[
[
p("<b>1. Excystation</b>", PS("E1", parent=bodyL, textColor=DARK, fontName="Helvetica-Bold")),
b("CO₂, bile, trypsin in alimentary canal"),
b("CO₂ ↑ permeability of micropyle"),
b("Sporozoites liberated → penetrate intestinal epithelial cells → form trophozoites"),
Spacer(1,2*mm),
p("<b>2. Schizogony (Asexual)</b>", PS("E2", parent=bodyL, textColor=DARK, fontName="Helvetica-Bold")),
b("Trophozoites → multiply in cytoplasm (schizogony/multiple fission)"),
b("Form schizont with elongated merozoites"),
b("Exception: <i>E. alabamensis</i> — schizogony in <b>nucleus</b> of gut cell"),
b("Schizonts rupture → merozoites released → invade new cells"),
b("Multiple generations; 2nd generation schizonts = <b>most pathogenic</b>"),
Spacer(1,2*mm),
p("<b>3. Syngamy (Sexual / Gametogony)</b>", PS("E3", parent=bodyL, textColor=DARK, fontName="Helvetica-Bold")),
b("Last-generation merozoites → micro & macrogametocytes"),
b("Microgametocyte → many flagellated microgametes"),
b("Macrogametocyte → one macrogamete"),
b("Fertilization → zygote → oocyst wall forms → oocyst voided in faeces"),
],
[
p("<b>Sporogony (outside host)</b>", PS("SP", parent=bodyL, textColor=GREEN, fontName="Helvetica-Bold")),
b("Requires: O₂, temperature 29–30°C, moisture"),
b("Duration: 1–3 days"),
b("Unsporulated → Sporulated oocyst (infective)"),
Spacer(1,3*mm),
p("<b>Summary Flow:</b>", PS("SF", parent=bodyL, fontName="Helvetica-Bold", textColor=MUTED)),
] + [p(x, PS("FL", parent=bodyC, fontSize=8, textColor=DARK)) for x in [
"Sporulated oocyst ingested",
"▼ Excystation",
"▼ Sporozoites → Trophozoites",
"▼ Schizogony (multiple generations)",
"▼ Merozoites → Gametocytes",
"▼ Syngamy → Oocyst",
"▼ Voided in faeces",
"▼ Sporulation (outside host)",
"▼ Infective sporulated oocyst",
]],
]
], colWidths=[8.2*cm, 8.1*cm])
lc.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), LIGHT),
("BACKGROUND", (1,0),(1,0), colors.HexColor("#E8F5E9")),
("BACKGROUND", (0,1),(0,1), PALE),
("BACKGROUND", (1,1),(1,1), colors.HexColor("#F1FBF2")),
("BOX", (0,0),(-1,-1), 0.7, MID),
("INNERGRID", (0,0),(-1,-1), 0.4, colors.HexColor("#CE93D8")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story.append(lc)
# ══════════════════ 4. FOWL COCCIDIOSIS ══════════════════════════════════════
story += sec("4. COCCIDIOSIS IN DOMESTIC FOWL — 12 Species", color=colors.HexColor("#BF360C"))
fowl_data = [
["Sl.","Species","Location","Pathogenicity"],
["1","E. tenella","Caecum","Most pathogenic; causes caecal coccidiosis"],
["2","E. necatrix","Small intestine","Highly pathogenic; next to E. tenella"],
["3","E. brunetti","Rectum","Rectal coccidiosis; very pathogenic"],
["4","E. acervulina","Small intestine","Moderately pathogenic"],
["5","E. maxima","Small intestine","Largest oocyst; moderately pathogenic"],
["6","E. mivati","Small intestine","Moderately pathogenic"],
["7","E. mitis","Intestine","Less pathogenic"],
["8","E. hagani","Small intestine","Less pathogenic"],
["9","E. praecox","Small intestine","Less pathogenic"],
["10","Isospora gallinae","Intestine","Non pathogenic"],
["11","Wenyonella gallinae","Colon","Non pathogenic"],
["12","Cryptosporidium tyzzeri","Caecum","Non pathogenic"],
]
ft = Table([[p(c, PS("FW", fontSize=7.8, leading=11,
textColor=WHITE if i==0 else (RED if (i>0 and j==3 and "Most" in c) else (colors.HexColor("#4A148C") if (i>0 and j==3 and "High" in c) else colors.HexColor("#212121"))),
fontName="Helvetica-Bold" if i==0 else ("Helvetica-BoldOblique" if j==1 and i>0 else "Helvetica"),
alignment=TA_CENTER)) for j,c in enumerate(row)]
for i,row in enumerate(fowl_data)],
colWidths=[0.7*cm, 3.8*cm, 3.2*cm, 8.6*cm])
ft.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), colors.HexColor("#BF360C")),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTSIZE", (0,0),(-1,-1), 7.8),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#FFF3E0")]),
("BOX", (0,0),(-1,-1), 0.6, colors.HexColor("#BF360C")),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#FFCCBC")),
("TOPPADDING", (0,0),(-1,-1), 2.5),
("BOTTOMPADDING", (0,0),(-1,-1), 2.5),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(ft)
story.append(Spacer(1,1*mm))
story.append(warn("Most pathogenic ranking: E. tenella > E. necatrix > E. brunetti | Mixed infection is common"))
# ══════════════════ 5. PATHOGENESIS (FOWL) ═══════════════════════════════════
story += sec("5. PATHOGENESIS IN FOWL")
path_cols = Table([
[p("<b>(A) CAECAL COCCIDIOSIS</b>", PS("CA", parent=bodyC, textColor=colors.HexColor("#BF360C"), fontName="Helvetica-Bold")),
p("<b>(B) INTESTINAL COCCIDIOSIS</b>", PS("IB", parent=bodyC, textColor=DARK, fontName="Helvetica-Bold")),
p("<b>(C) RECTAL COCCIDIOSIS</b>", PS("RC", parent=bodyC, textColor=GREEN, fontName="Helvetica-Bold"))],
[
[b("Caused by <b>E. tenella</b>; 2nd-gen schizonts most pathogenic"),
b("Young birds 3–7 weeks"),
b("Petechial haemorrhage on 4th day"),
b("Caeca dilated — clotted/unclotted blood"),
b("Day 8: lumen filled with consolidated caseated mass (caecal core)"),
b("Symptoms: drooping, no feed, blood in faeces, huddling"),
b("Death from haemorrhage + toxin")],
[b("Key species: <i>E. necatrix</i> (most pathogenic, less common)"),
b("<i>E. acervulina</i>, <i>E. maxima</i>, <i>E. mitis</i> — moderate"),
b("<i>E. hagani</i>, <i>E. praecox</i> — less pathogenic"),
b("Older birds affected; chronic form more common"),
b("Submucosal haemorrhage in middle small intestine (<i>E. necatrix</i>)"),
b("Symptoms from day 3: watery diarrhoea ± blood, anorexia, ↓egg production, listlessness")],
[b("Caused by <b>E. brunetti</b>"),
b("Very pathogenic; next to E. tenella and E. necatrix"),
b("Mostly young birds"),
b("White fluidy diarrhoea stained with blood"),
b("Dehydration, loss of appetite"),
b("Reduced body weight")],
]
], colWidths=[5.5*cm, 5.5*cm, 5.3*cm])
path_cols.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), colors.HexColor("#FFEBEE")),
("BACKGROUND", (1,0),(1,0), LIGHT),
("BACKGROUND", (2,0),(2,0), colors.HexColor("#E8F5E9")),
("BACKGROUND", (0,1),(0,1), colors.HexColor("#FFF8F8")),
("BACKGROUND", (1,1),(1,1), PALE),
("BACKGROUND", (2,1),(2,1), colors.HexColor("#F1FBF2")),
("BOX", (0,0),(-1,-1), 0.7, MID),
("INNERGRID", (0,0),(-1,-1), 0.4, colors.HexColor("#CE93D8")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story.append(path_cols)
# ══════════════════ 6. EPIDEMIOLOGY ══════════════════════════════════════════
story += sec("6. EPIDEMIOLOGY")
for pt in [
"Man-made but <b>self-limiting</b> disease; mixed infection (>1 species) is common",
"Overcrowding and unhygienic conditions are main drivers",
"Oocysts are key: infected bird sheds <b>thousands/day</b>; sporulate within 2–5 days; highly resistant to environment",
"Factors: improper droppings disposal, contaminated feed/water, introduction of new birds, overcrowding, poor nutrition, entry of pets/rodents/beetles/flies, unhygienic attendants, improper ventilation, moist floor",
]:
story.append(b(pt))
# ══════════════════ 7. DIAGNOSIS ═════════════════════════════════════════════
story += sec("7. DIAGNOSIS")
for pt in [
"History of the flock",
"Clinical signs as described above",
"Faecal examination: detect double-walled oocysts with nucleated mass (various shapes)",
"Post-mortem: sacrifice dead/affected birds; location and type of lesion gives clue; schizont and oocysts in <b>intestinal scrapings</b> confirm diagnosis",
]:
story.append(b(pt))
# ══════════════════ 8. TREATMENT ═════════════════════════════════════════════
story += sec("8. TREATMENT (Anti-coccidial Drugs for POULTRY)")
tx_data = [
["Class","Drug","Dose","Notes"],
["1. Sulphonamides","Sulfaquinoxaline","120–250 ppm in feed/water","Curative + prophylactic"],
["","Sulfadimidine","Same",""],
["2. Thiamine analogues","Amprolium","62.5–125 ppm","Given alone or in combination"],
["","Amprolium+Ethopabate","25:1.6 ratio","Combination"],
["","Amprolium+Ethopabate+Sulfaquinoxaline","100:5:60","Triple combination"],
["3. Nitrofurans","Nitrofurazone, Furazolidone","120 ppm (curative), 50 ppm (prophylactic)","Coccidiostatic"],
["4. Carbanilide","Nicarbazin","100–125 ppm",""],
["5. Nitrobenzamide","Zoalene","62.5–125 ppm",""],
["6. Pyridinoles","Clopidol","125 ppm",""],
["7. Ionophores","Monensin-Na","100–125 ppm","Resistance emerges slowly"],
["","Lasalocid","100–125 ppm",""],
["","Salinomycin","50–70 ppm",""],
["8. Triazines","Toltrazuril (Baycox®)","25 ppm in water",""],
["","Diclazuril (Clinacox®)","1–5 ppm in water",""],
["9. Others","Teramycin, Zycox (herbal)","—","Also effective"],
]
tx_t = Table([[p(c, PS("TX", fontSize=7.5, leading=10.5,
textColor=WHITE if i==0 else colors.HexColor("#212121"),
fontName="Helvetica-Bold" if i==0 else "Helvetica",
alignment=TA_CENTER)) for c in row]
for i,row in enumerate(tx_data)],
colWidths=[3.5*cm, 4.8*cm, 4.2*cm, 3.8*cm])
tx_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), TBL_HDR),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTSIZE", (0,0),(-1,-1), 7.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, TBL_ALT]),
("BOX", (0,0),(-1,-1), 0.6, MID),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CE93D8")),
("TOPPADDING", (0,0),(-1,-1), 2.5),
("BOTTOMPADDING", (0,0),(-1,-1), 2.5),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(tx_t)
story.append(Spacer(1,1*mm))
story.append(note("Resistance emergence: Rapid – decoquinate | Moderate – sulphonamides | Slow – amprolium, zoalene | Very slow – nicarbazin | None – monensin"))
# ══════════════════ 9. CONTROL ═══════════════════════════════════════════════
story += sec("9. CONTROL")
story.append(sub("(1) Chemotherapy — Shuttle Programme:"))
for pt in [
"Coccidiosis = man-made, self-limiting; control = good management + chemotherapy",
"<b>Shuttle programme:</b> Switch drug class within life span of each batch to prevent resistance",
"Drugs used for both curative (acute) and prophylactic (prevention/immunity) purposes",
]:
story.append(b(pt))
story.append(sub("(2) Hygienic Measures:"))
hm_cols = Table([[
[b("Keep litter dry"),
b("Feed/water troughs above droppings level"),
b("Good ventilation — ↓ humidity and sporulation"),
b("Avoid overcrowding"),
b("Clean and sterilize litters between batches")],
[b("Clean feed and water regularly"),
b("Floor of litter above ground level"),
b("Clear faeces regularly"),
b("High protein feed + fat-soluble vitamins (A, D, E, K) + minerals (Zn)"),
b("Separate infected birds")]
]], colWidths=[8.1*cm, 8.2*cm])
hm_cols.setStyle(TableStyle([
("BOX", (0,0),(-1,-1), 0.5, MID),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CE93D8")),
("TOPPADDING",(0,0),(-1,-1), 3), ("BOTTOMPADDING",(0,0),(-1,-1), 3),
("LEFTPADDING",(0,0),(-1,-1), 4),
("VALIGN",(0,0),(-1,-1), "TOP"),
("BACKGROUND",(0,0),(-1,-1), PALE),
]))
story.append(hm_cols)
story.append(sub("(3) Vaccination:"))
for pt in [
"<b>Coccivac® / Immunocox®</b> — Live vaccine; suspension of 8 species of <i>Eimeria</i> of fowl (except <i>E. hagani</i>); given in drinking water at 3–5 days of age; virulence reduced by coccidiostat drug 10 days later",
"<b>Paracox®</b> — Live attenuated vaccine; precocious lines of different species; given orally",
"<b>Coxabic®</b> — Subunit vaccine; purified proteins of gametocytes (recently launched)",
]:
story.append(b(pt))
# ══════════════════ 10. OTHER HOST SPECIES ════════════════════════════════════
story += sec("10. COCCIDIAN SPECIES IN OTHER ANIMALS")
other_data = Table([
[p("<b>TURKEY</b>", PS("TK", parent=bodyC, textColor=colors.HexColor("#E65100"), fontName="Helvetica-Bold")),
p("<b>DUCK</b>", PS("DK", parent=bodyC, textColor=colors.HexColor("#1565C0"), fontName="Helvetica-Bold"))],
[
[b("<i>E. adenoides</i>"), b("<i>E. meleagridis</i>"), b("<i>E. gallopavonis</i>"), b("<i>E. meleagrimitis</i>")],
[b("<i>E. anatis</i>"), b("<i>E. battakhi</i>"), b("<i>W. anatis</i>"), b("<i>W. gagari</i>")],
]
], colWidths=[8.1*cm, 8.2*cm])
other_data.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), colors.HexColor("#FFF3E0")),
("BACKGROUND", (1,0),(1,0), colors.HexColor("#E3F2FD")),
("BACKGROUND", (0,1),(0,1), colors.HexColor("#FFF8F0")),
("BACKGROUND", (1,1),(1,1), colors.HexColor("#F0F8FF")),
("BOX", (0,0),(-1,-1), 0.6, MID),
("INNERGRID", (0,0),(-1,-1), 0.4, colors.HexColor("#CE93D8")),
("TOPPADDING", (0,0),(-1,-1), 4), ("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5), ("VALIGN",(0,0),(-1,-1), "TOP"),
]))
story.append(other_data)
story.append(Spacer(1,2*mm))
# ══════════════════ 11. CATTLE & BUFFALO ════════════════════════════════════
story += sec("11. COCCIDIOSIS IN CATTLE & BUFFALO", color=CATTLE)
story.append(p("Occurs under 1 year of age. Distributed worldwide. Species reported from India:", bodyL))
cattle_data = [
["Sl.","Species","Remark"],
["1","E. zuernii","Most pathogenic; responsible for WINTER coccidiosis"],
["2","E. bovis","Pathogenic; next to E. zuernii; produces giant schizont"],
["3","E. auburnensis","—"],
["4","E. bareillyi","Main pathogenic species in buffalo"],
["5","E. alabamensis","Schizogony in nucleus of intestinal epithelial cells"],
["6","E. cylindrica","—"],
["7","E. ellipsoidalis","—"],
["8","E. brasiliensis","—"],
["9","Cryptosporidium parvum","Oocysts with polar cap"],
]
ct_t = Table([[p(c, PS("CT2", fontSize=7.8, leading=11,
textColor=WHITE if i==0 else (RED if (i>0 and j==2 and "Most" in c) else (colors.HexColor("#1565C0") if (i>0 and j==1) else colors.HexColor("#212121"))),
fontName="Helvetica-Bold" if (i==0 or (i>0 and j==1)) else "Helvetica",
fontName_="Helvetica-BoldOblique" if (i>0 and j==1) else None,
alignment=TA_CENTER)) for j,c in enumerate(row)]
for i,row in enumerate(cattle_data)],
colWidths=[0.7*cm, 4.8*cm, 10.8*cm])
ct_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), CATTLE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTSIZE", (0,0),(-1,-1), 7.8),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#E3F2FD")]),
("BOX", (0,0),(-1,-1), 0.6, CATTLE),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#90CAF9")),
("TOPPADDING", (0,0),(-1,-1), 2.5), ("BOTTOMPADDING",(0,0),(-1,-1), 2.5),
("LEFTPADDING", (0,0),(-1,-1), 4), ("VALIGN",(0,0),(-1,-1), "MIDDLE"),
]))
story.append(ct_t)
story.append(Spacer(1,1*mm))
story.append(sub("Pathogenesis in Cattle (3 factors):", color=CATTLE))
for pt in [
"<b>Number of ingested oocysts:</b> Clinical infection if 50,000–100,000 oocysts; severe illness and death with 3 lakhs of oocysts",
"<b>Species of parasite:</b> <i>E. zuernii</i> and <i>E. bovis</i> most pathogenic; Gamont causes greatest pathogenesis",
"<b>Age of animal:</b> Primarily disease of calves 3 weeks to 6 months; adults act as carriers",
"<b>Winter coccidiosis:</b> <i>E. zuernii</i> causes this; occurs in winter when temperature too low for sporulation, so bedding materials become source of infection",
]:
story.append(b(pt))
story.append(sub("Symptoms in Cattle:", color=CATTLE))
symp_t = Table([[
[p("<b>ACUTE:</b>", PS("ACU", parent=bodyL, textColor=RED, fontName="Helvetica-Bold")),
b("Foul-smelling diarrhoea ± blood and mucus"),
b("Tenesmus"),
b("Abdominal pain"),
b("Rough body coat"),
b("Anorexia and weakness"),
b("Young calves die from heavy loss of blood")],
[p("<b>CHRONIC:</b>", PS("CHR", parent=bodyL, textColor=DARK, fontName="Helvetica-Bold")),
b("Soft or watery faeces with mucus"),
b("Loss of body weight and emaciation"),
b("Anorexia and weakness"),
b("Convulsion and tachypnoea"),
b("Death due to pneumonia")]
]], colWidths=[8.1*cm, 8.2*cm])
symp_t.setStyle(TableStyle([
("BACKGROUND",(0,0),(0,0), colors.HexColor("#FFEBEE")),
("BACKGROUND",(1,0),(1,0), PALE),
("BOX",(0,0),(-1,-1), 0.5, CATTLE),
("INNERGRID",(0,0),(-1,-1), 0.4, colors.HexColor("#90CAF9")),
("TOPPADDING",(0,0),(-1,-1), 4), ("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 5), ("VALIGN",(0,0),(-1,-1), "TOP"),
]))
story.append(symp_t)
story.append(sub("Diagnosis in Cattle:", color=CATTLE))
for pt in [
"Clinical symptoms: bloody diarrhoea, anorexia, rough coat",
"Detection of oocysts by faecal examination",
"Examination of blood-stained faecal smear"
]:
story.append(b(pt))
story.append(sub("Treatment in Cattle:", color=CATTLE))
btx_data = [
["Drug","Dose","Notes"],
["Amprolium","20–25 mg/kg body wt for 5 days","Most effective drug against bovine coccidiosis"],
["Sulphonamides (Sulphaguanidine, Sulphamethazine, Sulphamethazine)","@ 125 mg/kg body wt, for 2 weeks","Also effective"],
["Decoquinate","@ 1.5 mg/kg body wt",""],
["Salmonycin","@ 0.5 mg/kg body wt",""],
["Antibiotics (Monensin)","@ 1 mg/kg body wt",""],
]
btx_t = Table([[p(c, PS("BTX", fontSize=7.5, leading=10.5,
textColor=WHITE if i==0 else colors.HexColor("#212121"),
fontName="Helvetica-Bold" if i==0 else "Helvetica",
alignment=TA_CENTER)) for c in row]
for i,row in enumerate(btx_data)],
colWidths=[5.5*cm, 6.0*cm, 4.8*cm])
btx_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), CATTLE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTSIZE", (0,0),(-1,-1), 7.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#E3F2FD")]),
("BOX", (0,0),(-1,-1), 0.6, CATTLE),
("INNERGRID", (0,0),(-1,-1), 0.3, colors.HexColor("#90CAF9")),
("TOPPADDING", (0,0),(-1,-1), 2.5), ("BOTTOMPADDING",(0,0),(-1,-1), 2.5),
("LEFTPADDING", (0,0),(-1,-1), 4), ("VALIGN",(0,0),(-1,-1), "MIDDLE"),
]))
story.append(btx_t)
story.append(sub("Control of Bovine Coccidiosis:", color=CATTLE))
for pt in [
"Clean feeding troughs and water containers regularly",
"Avoid overcrowding; keep in separate clean enclosures",
"Provide dry bedding with warmth and moisture for winter",
"Sterilize animal shed: 0.05 M mercuric chloride OR 0.05 M phenol OR 1.25% sodium hypochloride solution",
]:
story.append(b(pt))
# ══════════════════ 12. SHEEP ════════════════════════════════════════════════
story += sec("12. COCCIDIAN SPECIES OF SHEEP & OTHER ANIMALS", color=SHEEP)
sheep_data = Table([[
[p("<b>SHEEP</b>", PS("SHP", parent=bodyC, textColor=SHEEP, fontName="Helvetica-Bold")),
b("<i>E. ovina</i>"), b("<i>E. ovinoidalis</i>"),
b("<i>E. ahsata</i>"), b("<i>E. gilruthi</i>"),
b("<i>E. parva</i>"), b("<i>E. crandallis</i>"),
b("<i>E. intricata</i> — largest oocyst in sheep"),
b("<i>Sarcocystis</i> spp.")],
[p("<b>OTHER ANIMALS</b>", PS("OTH", parent=bodyC, textColor=DARK, fontName="Helvetica-Bold")),
b("<i>S. hominis</i> — cattle acts as IH"),
b("<i>S. hirusta</i> — buffalo acts as IH"),
b("<i>Toxoplasma gondii</i> — cattle & buffalo as IH"),
b("<i>C. bovis</i> — sometimes causes abortion in cattle"),
b("<i>Cryptosporidium</i> spp. — oocysts with polar cap"),
Spacer(1,2*mm),
p("IH = Intermediate host", muted)],
]], colWidths=[8.1*cm, 8.2*cm])
sheep_data.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), colors.HexColor("#E8F5E9")),
("BACKGROUND", (1,0),(1,0), PALE),
("BOX",(0,0),(-1,-1), 0.6, SHEEP),
("INNERGRID",(0,0),(-1,-1), 0.4, colors.HexColor("#A5D6A7")),
("TOPPADDING",(0,0),(-1,-1), 4), ("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 5), ("VALIGN",(0,0),(-1,-1), "TOP"),
]))
story.append(sheep_data)
# ══════════════════ FOOTER ═══════════════════════════════════════════════════
story.append(Spacer(1, 3*mm))
story.append(HRFlowable(width="100%", thickness=0.8, color=DARK))
story.append(Spacer(1, 1*mm))
story.append(p("Source: Essentials of Veterinary Parasitology (S. Pal & P.K. Sanyal) | Pages 302–311 | Family Eimeriidae", muted))
doc.build(story)
print(f"PDF created: {OUTPUT}")
python3 /home/daytona/workspace/babesia-revision/make_eimeria_pdf.py 2>&1
ls -lh /home/daytona/workspace/babesia-revision/Eimeria_Coccidiosis_Quick_Revisi…
Eimeria Coccidiosis Quick Revision
PDF Document · PDF
| # | Section | Highlights |
|---|---|---|
| 1 | Classification | Family Eimeriidae, genera, key characters |
| 2 | Oocyst Morphology | Shape, size, wall, micropyle, unsporulated vs sporulated |
| 3 | Life Cycle | 3 phases in host (Excystation → Schizogony → Syngamy) + Sporulation outside |
| 4 | Fowl Coccidiosis | All 12 species with location and pathogenicity ranked |
| 5 | Pathogenesis (Fowl) | Caecal vs Intestinal vs Rectal — 3-column layout |
| 6 | Epidemiology | Man-made, self-limiting; 10 epidemiological factors |
| 7 | Diagnosis | History, faecal exam, PM findings, intestinal scrapings |
| 8 | Treatment (Poultry) | Full drug table with 9 classes, doses and notes |
| 9 | Control | Shuttle programme, 9 hygienic measures, 3 vaccines |
| 10 | Turkey & Duck species | 4 species each |
| 11 | Cattle & Buffalo | 9 species, pathogenesis factors, acute vs chronic symptoms, treatment, control |
| 12 | Sheep & Other Animals | E. intricata (largest oocyst), Sarcocystis, Toxoplasma, Cryptosporidium |