attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment

Make a long question type answer for my exam and precise and to the point answer

Babesia (Babesiosis) - Long Answer for Exam


Q. Write a detailed account of Babesia under the following headings: Classification, Morphology, Species, Life Cycle, Pathogenesis, Clinical Signs, Lesions, Epidemiology, and Diagnosis.


Answer

1. CLASSIFICATION

TaxonName
SuborderPiroplasmorina
FamilyBabesiidae
GenusBabesia
Salient features of Suborder Piroplasmorina:
  • Organisms are pyriform, round, amoeboid or rod-like in shape
  • The apical complex is reduced
  • Asexual reproduction (schizogony or binary fission) occurs in both vertebrate host and vector; sexual cycle occurs only in the vector
  • Two important families: Babesiidae and Theileriidae

2. GENERAL CHARACTERS OF GENUS Babesia

  • They are intraerythrocytic protozoa (live inside RBCs)
  • They are tick-transmitted (obligate vector-borne) parasites
  • Historical significance: In 1893, Smith and Kilborne first discovered the transmission of Babesia bigemina (causative agent of Texas fever) by the tick Boophilus annulatus - considered a major landmark in the history of arthropod-borne diseases
  • Distributed throughout the world; in India, reported from every part
  • The disease is known as babesiosis, "red water fever", "tick fever", Texas fever, or piroplasmosis
  • Characterized by: high fever, anaemia, and haemoglobinuria (coffee-coloured urine)

3. MORPHOLOGY

  • Remain singly or in pairs inside the RBC; sometimes 4 (B. equi), or even 16 (B. canis)
  • Pyriform (pear-shaped) in shape; round, oval or elongated forms also found
  • Often form an acute angle by their narrow ends (characteristic of Babesia)
  • Size:
    • Small Babesia spp.: 1-2.5 µm long
    • Large Babesia spp.: 2.5-5 µm long
  • Show blue cytoplasm and red nucleus with Romanow-sky stain

4. IMPORTANT SPECIES

Sl. No.SpeciesHostVectorSize
1B. bovisCattle & buffaloBoophilus microplus (India), B. annulatusSmall
2B. bigeminaCattle & buffalo-do-Large
3B. divergensCattle-do-Small
4B. majorCattleHaemophysalis punctataLarge
5B. ovisSheep & goatHaemophysalis punctata, Rhipicephalus bursa, Dermacentor silvarumSmall
6B. motasiSheep & goat-do-Large
7B. equiHorseRhipicephalus sanguineus, Hyalomma anatolicum, H. dromedarii, Dermacentor sp.Small; gives maltese cross appearance
8B. caballiHorse-do-Large
9B. canisDogRhipicephalus sanguineus, Haemophysalis leachiLarge
10B. gibsoniDogRhipicephalus sanguineus, Haemophysalis bispinosaSmall
11B. trautmanniPigRhipicephalus, Boophilus, DermacentorLarge
12B. felisCatUnknownSmall

5. LIFE CYCLE (Indirect)

The life cycle is indirect - requires both a vertebrate host and a tick vector.

A. In the Host:

  • Infective sporozoites are inoculated by the tick and enter the RBCs
  • They divide asexually by binary fission to form two or rarely more piroplasms
  • Infected RBCs rupture and released piroplasms invade new RBCs

B. In the Vector (Tick):

  • When infected blood is ingested by the suitable tick, RBCs are lysed in the gut
  • Released piroplasms with oval-shape (gamonts) undergo syngamy to produce motile kinetes (ookinetes)
  • Motile kinetes migrate towards:
    • Ovary - in case of transovarian transmission (vertical transmission)
    • Salivary glands - in case of transstadial transmission (horizontal transmission)
  • In transovarian transmission: parasites invade ovary then ova → infected eggs are laid by adult female tick → kinetes penetrate salivary gland in larvae → give rise to many sporozoites → injected into next host by next generation tick
  • Some workers also report schizogony after syngamy, producing vermicules that are elongated, motile and club-shaped
Key terms: Transovarian = Vertical transmission; Transstadial = Horizontal transmission

6. PATHOGENESIS

Pathogenesis depends on several factors:
(a) Species of the parasite - B. bovis, B. canis, and B. motasi are highly pathogenic
(b) Age of the host - Adults are more susceptible than young animals (inverse age resistance - Adults > Young)
(c) Breed of the host - Exotic and cross-breed animals are more susceptible than indigenous animals
(d) Immune status - Animals in endemic areas or after primary infection show premunity (mild signs in subsequent infection)
(e) Stress - Parturition or concomitant infections cause severe pathogenesis
Main Mechanism:
The primary pathogenesis is intravascular haemolysis due to rapid multiplication of parasites in RBCs, followed by extra-vascular haemolysis (destruction of infected and non-infected RBCs by the activated macrophage system, mainly in the spleen).
Consequences:
  • Haemoglobinaemia, haemoglobinuria, bilirubinuria, anaemia
  • Tissue hypoxia → anaerobic metabolism → acidosis → reduction of cellular energy → hypoxic cell damage → irreversible shock → death
  • Microvascular stasis (mainly in brain) → nervous signs (incoordination, hyperexcitability)
  • Release of pyrogens → pyrexia
Note: Lysis of erythrocytes (up to 75% in acute infection) is not proportional to parasitaemia, which varies from 0.1% to 50%.

7. CLINICAL SIGNS

  1. High fever (≥ 105°F)
  2. Haemoglobinuria - urine becomes coffee-coloured (hence called "red water fever")
  3. Mucous membranes become pale/jaundiced (especially in Turkey)
  4. Pulse, respiratory and heart rates are increased
  5. Cessation of ruminal movement
  6. Abortion may occur in pregnant animals
  7. Death in untreated cases
  8. If animal survives: loss of weight, decreased milk production, diarrhoea followed by constipation

8. POST-MORTEM LESIONS

  1. Subcutaneous and intramuscular oedema with icterus
  2. Fat is yellow and gelatinous
  3. Blood becomes thin and watery
  4. Spleen and liver are enlarged
  5. Deposition of haemosiderin in Kupffer cells
  6. Congestion of different organs

9. EPIDEMIOLOGY

  • Depends on: distribution of tick vectors, geographical distribution, age and immune status of hosts, climate
  • B. bigemina and B. bovis usually found in tropical and subtropical countries
  • In India, Boophilus microplus plays major role in transmission to cattle and buffalo
  • All cattle races are susceptible; indigenous breeds comparatively less susceptible due to tick resistance
  • Infection mostly confined to adult animals
  • Premunity is seen in recovered animals

10. DIAGNOSIS

  1. History of previous infection and tick infestation
  2. Clinical signs: high fever, haemoglobinuria, anaemia
  3. Blood examination:
    • Peripheral blood smear (thin or thick) examined during febrile condition
    • Giemsa-stained smear shows pyriform organisms mostly in pairs with acute angle in RBCs
  4. At necropsy: enlarged spleen and liver, subcutaneous oedema, congestion of different organs

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

Reading File
Running Command

ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"

Running Command

mkdir -p /home/daytona/workspace/babesia-revision && python3 -c "from reportlab.…

Writing File

~/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}")
Running Command

python3 /home/daytona/workspace/babesia-revision/make_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/babesia-revision/Babesia_Quick_Revision.pdf

Your Babesia revision PDF is ready! Here's what's inside:

PDF Contents (9 sections, colour-coded for fast scanning):
SectionWhat's covered
Quick Glance BoxDisease names, key feature, vector, historical note
ClassificationFull taxonomy table
MorphologySize, shape, staining, key characteristics
Species TableAll 12 species with host, vector & size
Life CycleSide-by-side: In Host vs. In Tick (transovarian/transstadial)
PathogenesisFactors + step-by-step flowchart to Death
Clinical SignsNumbered table + mnemonic H-H-M-P-C-A-D
Post-Mortem LesionsAll 6 PM findings
Epidemiology + DiagnosisKey points + 4 diagnostic methods

Babesia Quick Revision

PDF Document · PDF

Generate a comparison poster: Babesia vs Theileria

Reading File
Finding Sources
Finding Sources
Writing File

~/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"&#8226; {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 &amp; P.K. Sanyal) | Suborder Piroplasmorina — Babesiidae &amp; Theileriidae",
    PS("foot", fontSize=7, leading=9, textColor=MUTED, alignment=TA_CENTER)
))

doc.build(story)
print(f"Poster PDF created: {OUTPUT}")
Running Command

python3 /home/daytona/workspace/babesia-revision/make_comparison_poster.py 2>&1

Running Command

ls -lh /home/daytona/workspace/babesia-revision/Babesia_vs_Theileria_Poster.pdf

Your A3 landscape comparison poster is ready!

Babesia vs Theileria Poster

PDF Document · PDF


What's on the poster (A3 Landscape, colour-coded Blue=Babesia / Green=Theileria):
SectionCovered
ClassificationFamily & genus for both
Location in hostRBCs only vs RBCs + Lymphocytes
SchizogonyAbsent vs Present (Koch's blue bodies)
Morphology in RBCShape, size, staining details
Species list7 Babesia + 7 Theileria species with hosts
VectorsTick species for each genus
Life cycleStep-by-step, side-by-side
Tick transmissionTransovarian+Transstadial vs Transstadial ONLY
PathogenesisHaemolysis-driven vs Lymphoproliferation-driven
Clinical signsFull list with key differences highlighted
HaemoglobinuriaProminent vs Absent
LymphadenopathyAbsent vs Prominent
PM LesionsAll findings
DiagnosisBlood smear vs Lymph node smear
EpidemiologyDistribution, India-specific data
KEY DIFFERENCES summary table6 most exam-critical points at bottom
Top 5 exam-critical differences to memorise:
  1. Schizogony in lymphocytes - Absent (Babesia) vs Present (Theileria)
  2. Haemoglobinuria - Prominent vs Absent
  3. Lymphadenopathy - Absent vs Prominent
  4. Transmission - Transovarian+Transstadial vs Transstadial only
  5. Diagnosis - Blood smear (RBC pairs) vs Lymph node smear (Koch's blue bodies)
attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment

Do the same for this quick revision type

analyse_media
analyse_media
analyse_media
analyse_media
analyse_media
analyse_media
Writing File

~/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"&#8226; {txt}", PS("BU", parent=st, leftIndent=10))
def note(txt): return Paragraph(f"&#9432; {txt}", note_s)
def warn(txt): return Paragraph(f"&#9888; {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> &amp; 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}")
Running Command

python3 /home/daytona/workspace/babesia-revision/make_eimeria_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/babesia-revision/Eimeria_Coccidiosis_Quick_Revisi…

Your Eimeria / Coccidiosis quick revision PDF is ready!

Eimeria Coccidiosis Quick Revision

PDF Document · PDF


What's inside (12 colour-coded sections, A4 format):
#SectionHighlights
1ClassificationFamily Eimeriidae, genera, key characters
2Oocyst MorphologyShape, size, wall, micropyle, unsporulated vs sporulated
3Life Cycle3 phases in host (Excystation → Schizogony → Syngamy) + Sporulation outside
4Fowl CoccidiosisAll 12 species with location and pathogenicity ranked
5Pathogenesis (Fowl)Caecal vs Intestinal vs Rectal — 3-column layout
6EpidemiologyMan-made, self-limiting; 10 epidemiological factors
7DiagnosisHistory, faecal exam, PM findings, intestinal scrapings
8Treatment (Poultry)Full drug table with 9 classes, doses and notes
9ControlShuttle programme, 9 hygienic measures, 3 vaccines
10Turkey & Duck species4 species each
11Cattle & Buffalo9 species, pathogenesis factors, acute vs chronic symptoms, treatment, control
12Sheep & Other AnimalsE. intricata (largest oocyst), Sarcocystis, Toxoplasma, Cryptosporidium
Key facts to remember:
  • Infective stage = Sporulated oocyst
  • Most pathogenic in fowl: E. tenella > E. necatrix > E. brunetti
  • In cattle: E. zuernii = most pathogenic = winter coccidiosis
  • E. alabamensis = schizogony in nucleus (unique)
  • Shuttle programme prevents drug resistance
  • Vaccine: Coccivac® / Immunocox® (8 species, live)
This is a shared conversation. Sign in to Orris to start your own chat.