Hi
I am medical officer trying to study for neet pg but still not started yet
| Subject | Why it matters |
|---|---|
| Medicine (PSM/SPM) | ~15-18% of paper alone |
| Surgery | Consistent 8-10% weightage |
| OBG | 8-10%, many straightforward questions |
| Pharmacology | ~7-8%, logic-based, high scoring |
| Pathology | ~7-8%, foundation for clinical subjects |
| Subject | Notes |
|---|---|
| Anatomy | Focus only on high-yield: nerves, foramina, embryology |
| Physiology | Stick to standard MCQ topics |
| Microbiology | Mostly factual - use mnemonics |
| Biochemistry | High-yield only: enzymes, disorders, lab values |
| Subject | Recommended |
|---|---|
| Medicine | Mudit Khanna / ACROSS |
| PSM | Park's textbook + Vivek Jain |
| Surgery | Pritesh Singh (ACROSS) |
| OBG | Sakshi Arora |
| Pharma | Gobind Garg |
| Pathology | Sparsh Gupta |
| Anatomy/Physio/Biochem | ACROSS series or Marrow |
Generate a quick reference PDF of high-yield topics
mkdir -p /home/daytona/workspace/neet-pg && ls /home/daytona/workspace/neet-pg/
~/neet-pg/generate_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 mm, cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/neet-pg/NEET_PG_High_Yield_Quick_Reference.pdf"
# ── Colours ──────────────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1a3a5c")
C_TEAL = colors.HexColor("#0e7c7b")
C_GOLD = colors.HexColor("#f4a261")
C_RED = colors.HexColor("#e63946")
C_GREEN = colors.HexColor("#2a9d8f")
C_LGREY = colors.HexColor("#f0f4f8")
C_MGREY = colors.HexColor("#c9d6e3")
C_WHITE = colors.white
C_BLACK = colors.black
# ── Styles ────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
TITLE_STYLE = S("DocTitle",
fontSize=26, leading=32, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4)
SUBTITLE_STYLE = S("DocSubtitle",
fontSize=13, leading=17, textColor=C_GOLD,
fontName="Helvetica", alignment=TA_CENTER, spaceAfter=2)
META_STYLE = S("Meta",
fontSize=9, leading=12, textColor=C_WHITE,
fontName="Helvetica", alignment=TA_CENTER)
SEC_HEADER = S("SecHeader",
fontSize=13, leading=16, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=6, spaceAfter=4,
leftIndent=6)
SUBHEAD = S("Subhead",
fontSize=10, leading=13, textColor=C_NAVY,
fontName="Helvetica-Bold", spaceBefore=5, spaceAfter=2)
BODY = S("Body",
fontSize=8.5, leading=12, textColor=C_BLACK,
fontName="Helvetica", spaceAfter=1)
BULLET = S("Bullet",
fontSize=8.5, leading=12, textColor=C_BLACK,
fontName="Helvetica", leftIndent=12, spaceAfter=1,
bulletIndent=4)
HIGHLIGHT = S("Highlight",
fontSize=8, leading=11, textColor=C_NAVY,
fontName="Helvetica-Bold", leftIndent=12,
backColor=colors.HexColor("#fff3cd"), spaceAfter=2)
FOOTER_STYLE = S("Footer",
fontSize=7.5, textColor=colors.HexColor("#888888"),
fontName="Helvetica", alignment=TA_CENTER)
# ── Header/Footer callbacks ───────────────────────────────────────────────────
def on_first_page(canvas, doc):
pass # handled by flowable header block
def on_later_pages(canvas, doc):
w, h = A4
canvas.saveState()
canvas.setFillColor(C_NAVY)
canvas.rect(0, h - 22*mm, w, 22*mm, fill=1, stroke=0)
canvas.setFont("Helvetica-Bold", 9)
canvas.setFillColor(C_WHITE)
canvas.drawString(15*mm, h - 14*mm, "NEET PG — High-Yield Quick Reference")
canvas.setFont("Helvetica", 8)
canvas.drawRightString(w - 15*mm, h - 14*mm, f"Page {doc.page}")
# footer line
canvas.setStrokeColor(C_MGREY)
canvas.setLineWidth(0.5)
canvas.line(15*mm, 12*mm, w - 15*mm, 12*mm)
canvas.setFont("Helvetica", 7)
canvas.setFillColor(colors.HexColor("#888888"))
canvas.drawCentredString(w/2, 8*mm, "For personal study use only. Always verify with current exam syllabus.")
canvas.restoreState()
# ── Helper: coloured section header ──────────────────────────────────────────
def section_header(title, bg=C_NAVY):
data = [[Paragraph(title, SEC_HEADER)]]
t = Table(data, colWidths=[175*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4, 4, 4, 4]),
]))
return t
def two_col_table(rows, col1_w=55*mm, col2_w=120*mm, header=None):
"""Zebra-striped two-column table."""
table_data = []
if header:
table_data.append([
Paragraph(header[0], S("TH", fontSize=8.5, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER)),
Paragraph(header[1], S("TH2", fontSize=8.5, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER))
])
for r in rows:
table_data.append([
Paragraph(r[0], S("TD1", fontSize=8, fontName="Helvetica-Bold",
textColor=C_NAVY)),
Paragraph(r[1], S("TD2", fontSize=8, fontName="Helvetica",
textColor=C_BLACK, leading=11))
])
style = [
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("GRID", (0,0), (-1,-1), 0.3, C_MGREY),
]
if header:
style += [
("BACKGROUND", (0,0), (-1,0), C_TEAL),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
]
start = 1
else:
start = 0
# zebra
for i in range(start, len(table_data)):
if (i - start) % 2 == 0:
style.append(("BACKGROUND", (0,i), (-1,i), C_LGREY))
t = Table(table_data, colWidths=[col1_w, col2_w])
t.setStyle(TableStyle(style))
return t
def three_col_table(rows, widths, header=None):
table_data = []
if header:
table_data.append([Paragraph(h, S(f"H{i}", fontSize=8.5,
fontName="Helvetica-Bold", textColor=C_WHITE, alignment=TA_CENTER))
for i, h in enumerate(header)])
for r in rows:
table_data.append([Paragraph(str(c), S(f"C{i}", fontSize=8,
fontName="Helvetica", textColor=C_BLACK, leading=11))
for i, c in enumerate(r)])
style = [
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("GRID", (0,0), (-1,-1), 0.3, C_MGREY),
]
if header:
style += [("BACKGROUND", (0,0), (-1,0), C_TEAL),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE)]
start = 1
else:
start = 0
for i in range(start, len(table_data)):
if (i - start) % 2 == 0:
style.append(("BACKGROUND", (0,i), (-1,i), C_LGREY))
t = Table(table_data, colWidths=widths)
t.setStyle(TableStyle(style))
return t
def bullet(text, star=False):
prefix = "★ " if star else "• "
return Paragraph(prefix + text, BULLET)
def sp(h=4):
return Spacer(1, h*mm)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=C_MGREY, spaceAfter=3)
# ════════════════════════════════════════════════════════════════════════════
# BUILD DOCUMENT
# ════════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=15*mm, rightMargin=15*mm,
topMargin=15*mm, bottomMargin=20*mm,
title="NEET PG High-Yield Quick Reference",
author="Orris AI Study Assistant"
)
story = []
# ── COVER BLOCK ──────────────────────────────────────────────────────────────
cover_data = [[
Paragraph("NEET PG", TITLE_STYLE),
Paragraph("High-Yield Quick Reference", SUBTITLE_STYLE),
Paragraph("3-Month Sprint Edition • All Subjects • July 2026", META_STYLE),
]]
cover_table = Table([[cover_data[0][0]], [cover_data[0][1]], [cover_data[0][2]]],
colWidths=[175*mm])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(cover_table)
story.append(sp(5))
# ── HOW TO USE ───────────────────────────────────────────────────────────────
how_data = [["HOW TO USE THIS GUIDE"]]
how_t = Table(how_data, colWidths=[175*mm])
how_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_GOLD),
("FONTNAME", (0,0), (-1,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 10),
("TEXTCOLOR", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
story.append(how_t)
how_bullets = [
"Focus on <b>Tier 1 subjects first</b>: PSM, Medicine, Surgery, OBG, Pharmacology, Pathology.",
"Each section lists the <b>highest-yield facts and patterns</b> most likely to appear as MCQs.",
"Items marked <b>★</b> are repeat PYQ favourites — memorize these before anything else.",
"Use this as a <b>daily revision sheet</b>, not a primary study resource.",
"Pair with <b>100 MCQs/day</b> practice from Marrow / PrepLadder / DAMS.",
]
how_rows = [[bullet(b)] for b in how_bullets]
how_content = Table(how_rows, colWidths=[175*mm])
how_content.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#fffbf0")),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING", (0,0), (-1,-1), 2),
("LEFTPADDING", (0,0), (-1,-1), 6),
("BOX", (0,0), (-1,-1), 0.5, C_GOLD),
]))
story.append(how_content)
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 1. PSM / COMMUNITY MEDICINE
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("1. PSM / COMMUNITY MEDICINE (~15-18% of paper)", C_NAVY))
story.append(sp(2))
story.append(Paragraph("National Health Programmes - Key Numbers", SUBHEAD))
psm_prog = [
("Programme", "Key High-Yield Facts"),
("RCH / MCH", "IMR target <12, MMR target <70/lakh LB by 2030 (NHP 2017)"),
("RNTCP / NTEP", "DOTS - 6 months (Cat I), Bedaquiline for MDR-TB; End TB 2025 target"),
("NVBDCP", "Malaria - slide positivity rate; Dengue NS1 Ag; Filaria - DEC+Albendazole MDA"),
("NLEP", "Grade 2 disability = deformity; elimination = <1/10,000"),
("NIP", "BCG at birth; OPV0 at birth; Pentavalent at 6,10,14 wk; MR at 9-12 m & 16-24 m"),
("NPCDCS", "Screening for DM, HTN, Ca Cervix/Breast/Oral at 30+ years"),
("Poshan 2.0", "Stunting <25%, wasting <5% by 2022 (targets)"),
]
story.append(two_col_table(psm_prog[1:], header=psm_prog[0], col1_w=45*mm, col2_w=130*mm))
story.append(sp(3))
story.append(Paragraph("Epidemiology Formulas", SUBHEAD))
epi = [
("Incidence rate", "New cases / Population at risk x Time"),
("Prevalence", "All cases (new+old) / Total population"),
("Attack rate", "New cases / Population exposed x 100"),
("CFR", "Deaths / Cases of disease x 100"),
("Sensitivity", "TP / (TP+FN) — 'PID' rule: +ve in disease"),
("Specificity", "TN / (TN+FP) — 'NIH' rule: -ve in health"),
("PPV", "TP / (TP+FP) — affected by prevalence"),
("Odds Ratio", "Used in case-control; ad/bc"),
("RR", "Used in cohort/RCT; (a/a+b) / (c/c+d)"),
("NNT", "1 / ARR (Absolute Risk Reduction)"),
]
story.append(two_col_table(epi, col1_w=45*mm, col2_w=130*mm))
story.append(sp(3))
story.append(Paragraph("★ Vaccine Cold Chain & Schedules", SUBHEAD))
vax = [
bullet("OPV stored at -15 to -25°C (only vaccine stored frozen in cold chain)", star=True),
bullet("BCG - freeze-dried, stored 2-8°C; given intradermally right deltoid", star=True),
bullet("Hepatitis B - IP 45-180 days; 3 doses 0,1,6 months", star=True),
bullet("HPV - 2 doses if <15 yrs; 3 doses if ≥15 yrs (0,1-2,6 months)"),
bullet("JE vaccine added to UIP in endemic districts"),
bullet("Rotavirus vaccine (Rotavac) - 3 doses at 6,10,14 weeks"),
]
vax_t = Table([[v] for v in vax], colWidths=[175*mm])
vax_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_LGREY),
("TOPPADDING", (0,0), (-1,-1), 1),
("BOTTOMPADDING", (0,0), (-1,-1), 1),
]))
story.append(vax_t)
story.append(sp(2))
story.append(Paragraph("★ Screening Tests High-Yield", SUBHEAD))
screen = [
bullet("Pap smear - Ca Cervix; start at 21 or 3 yrs after first intercourse", star=True),
bullet("Mammography - Ca Breast; annual from 40 or 10 yrs before index case age", star=True),
bullet("Colonoscopy - Ca Colon; start 50 yrs, every 10 yrs (or FOBT annually)", star=True),
bullet("PSA - Ca Prostate; controversial, not routine screening"),
bullet("FNAC - NOT a screening test (diagnostic)"),
]
sc_t = Table([[s] for s in screen], colWidths=[175*mm])
sc_t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_LGREY),
("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
story.append(sc_t)
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 2. MEDICINE
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("2. MEDICINE (~10-12% of paper)", C_TEAL))
story.append(sp(2))
story.append(Paragraph("Cardiology - High-Yield", SUBHEAD))
cardio = [
("STEMI treatment", "Primary PCI within 90 min (door-to-balloon); Fibrinolysis if PCI not available within 120 min"),
("Killip classification", "I=no CCF, II=basal creps/S3, III=pulm oedema, IV=cardiogenic shock"),
("CHADS2-VASc", "Score ≥2 in men / ≥3 in women: anticoagulate (AF). C=CHF,H=HTN,A2=Age≥75,D=DM,S2=Stroke,V=vasc,A=Age65-74,Sc=sex"),
("Aortic stenosis", "Syncope, Angina, Dyspnoea (SAD). AVA <1cm² = severe. Gradient >40 mmHg"),
("Long QT", "QTc >440ms men, >460ms women. Causes: quinidine, amiodarone, TCAs, erythromycin, hypoCa/K/Mg"),
("Heart failure Rx", "HFrEF: ACEi/ARB + Beta-blocker + MRA + SGLT2i (GDMT). Add hydralazine-nitrate if ACEi intolerant"),
]
story.append(two_col_table(cardio, col1_w=50*mm, col2_w=125*mm))
story.append(sp(3))
story.append(Paragraph("Endocrinology - High-Yield", SUBHEAD))
endo = [
("DM2 HbA1c target", "<7% general; <8% elderly/comorbid; <6.5% young/short duration"),
("DKA vs HHS", "DKA: pH<7.3, bicarb<15, ketones+; HHS: osmolality>320, glucose>600, no/mild ketosis"),
("Cushing syndrome", "24h UFC (best screening); LDDST (1mg overnight); high-dose DST (HDDST) for localisation"),
("Addison disease", "Low cortisol, high ACTH, hyponatraemia, hyperkalaemia. Tx: hydrocortisone + fludrocortisone"),
("Hypothyroidism", "TSH first (screening); T4 for confirmation. Levothyroxine - empty stomach"),
("Pheochromocytoma", "Rule of 10s. 24h urine metanephrines (best). Alpha-block FIRST then beta-block"),
("MEN syndromes", "MEN1: PPP (Parathyroid+Pituitary+Pancreas). MEN2A: Pheo+MTC+Parathyroid"),
]
story.append(two_col_table(endo, col1_w=50*mm, col2_w=125*mm))
story.append(sp(3))
story.append(Paragraph("Nephrology - High-Yield", SUBHEAD))
nephro = [
bullet("CKD staging: GFR ≥90=G1, 60-89=G2, 45-59=G3a, 30-44=G3b, 15-29=G4, <15=G5 (dialysis)"),
bullet("Nephrotic syndrome: proteinuria >3.5g/day, hypoalbuminaemia, oedema, hyperlipidaemia", star=True),
bullet("Minimal change disease: commonest nephrotic in children; responds to steroids", star=True),
bullet("FSGS: commonest nephrotic in adults (Black race); poor steroid response"),
bullet("IgA nephropathy (Berger's): haematuria 24-48h after URTI (not 2 wks like post-strep)"),
bullet("RPGN: crescents on biopsy; treat with pulse methylprednisolone ± cyclophosphamide"),
bullet("Hyperkalaemia emergency: IV calcium gluconate first (membrane stabilise) → insulin+dextrose → kayexalate"),
]
neph_t = Table([[b] for b in nephro], colWidths=[175*mm])
neph_t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_LGREY),
("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
story.append(neph_t)
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 3. SURGERY
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("3. SURGERY (~8-10% of paper)", C_NAVY))
story.append(sp(2))
story.append(Paragraph("GI Surgery - High-Yield", SUBHEAD))
gi_surg = [
("Appendicitis scoring", "Alvarado score (MANTRELS); Perforation rate >24h = 16-36%"),
("Duodenal ulcer", "Most common surgical emergency (perforation). Anterior = perforation; Posterior = bleeding (gastroduodenal artery)"),
("Gastric cancer", "Virchow's node (left supraclavicular). Krukenberg = ovarian mets. Sister Mary Joseph = umbilical"),
("Cholangitis (Charcot's triad)", "Fever+jaundice+RUQ pain. Reynold's pentad adds hypotension+AMS (suppurative)"),
("Pancreatitis (severe)", "Ranson >3 = severe. CT severity index (Balthazar). ERCP for biliary pancreatitis within 24-48h"),
("Bowel obstruction", "SBO: dilated loops >3cm, air-fluid levels, valvulae conniventes. LBO: haustra, >5cm"),
]
story.append(two_col_table(gi_surg, col1_w=50*mm, col2_w=125*mm))
story.append(sp(3))
story.append(Paragraph("Breast & Thyroid", SUBHEAD))
bt = [
bullet("DCIS: microcalcifications on mammography; treated with lumpectomy ± radiation", star=True),
bullet("Breast cancer: ER/PR+ = tamoxifen (pre-meno) / aromatase inhibitor (post-meno)", star=True),
bullet("HER2+: trastuzumab (Herceptin); Triple negative: chemo only"),
bullet("Papillary thyroid cancer (PTC): most common; psammoma bodies; RET/PTC mutation", star=True),
bullet("Follicular thyroid cancer: haematogenous spread (bone, lung). Hurthle cell = variant"),
bullet("MTC: calcitonin marker; amyloid in stroma. Associated with MEN2A/2B"),
bullet("Total thyroidectomy for differentiated thyroid cancer >1cm"),
]
bt_t = Table([[b] for b in bt], colWidths=[175*mm])
bt_t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_LGREY),
("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
story.append(bt_t)
story.append(sp(4))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# 4. OBG
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("4. OBG (~8-10% of paper)", C_TEAL))
story.append(sp(2))
story.append(Paragraph("Obstetrics - Key Facts", SUBHEAD))
obs = [
("APH", "Placenta praevia: painless, bright red bleeding; USG diagnosis. Abruptio: painful, dark, woody uterus"),
("Pre-eclampsia", "BP ≥140/90 after 20 wks + proteinuria. Severe: BP≥160/110 OR organ involvement. Tx: MgSO4 + antihypertensives"),
("Eclampsia", "Convulsions + pre-eclampsia features. MgSO4 first line. Diazepam if unavailable"),
("PPH", "Blood loss >500mL (vaginal) or >1000mL (LSCS). Causes: 4Ts (Tone, Trauma, Tissue, Thrombin). Oxytocin first"),
("IUGR", "Asymmetric IUGR: head-sparing (uteroplacental insufficiency). Doppler: absent/reversed EDF = deliver"),
("Gestational DM", "Screen 24-28 wks; OGTT 75g. FBS ≥92, 1h ≥180, 2h ≥153 mg/dL (any one = GDM)"),
("Ectopic pregnancy", "Serum hCG + TVS. Medical: methotrexate if haemodynamically stable + unruptured"),
]
story.append(two_col_table(obs, col1_w=45*mm, col2_w=130*mm))
story.append(sp(3))
story.append(Paragraph("Gynaecology - Key Facts", SUBHEAD))
gyn = [
bullet("PCOS: Rotterdam criteria - 2 of 3: oligo-ovulation, hyperandrogenism, PCO on USG", star=True),
bullet("PCOS management: OCP for menstrual irregularity; metformin for insulin resistance; clomiphene for ovulation induction"),
bullet("Endometriosis: chocolate cyst (endometrioma); frosted glass appearance on USG; CA-125 raised"),
bullet("Fibroid: most common pelvic tumour in women. Submucosal = menorrhagia. Intramural = bulk symptoms"),
bullet("Ca Cervix: HPV 16,18 (70%). CIN3 = LLETZ. Stage IIB+ = chemoradiation", star=True),
bullet("Ca Endometrium: Type I (endometrioid, ER+, low grade); Type II (serous, aggressive)"),
bullet("Ca Ovary: most common = serous cystadenocarcinoma. BRCA1/2 mutation. CA-125 marker"),
bullet("Menopause: FSH >40 IU/L + amenorrhoea >12 months after age 40. MHT for symptoms"),
]
gyn_t = Table([[b] for b in gyn], colWidths=[175*mm])
gyn_t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_LGREY),
("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
story.append(gyn_t)
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 5. PHARMACOLOGY
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("5. PHARMACOLOGY (~7-8% of paper)", C_NAVY))
story.append(sp(2))
story.append(Paragraph("Drug of Choice - High-Yield List", SUBHEAD))
doc_list = [
("Drug of Choice", "Condition / Indication"),
("Penicillin G", "Streptococcal pharyngitis, Syphilis, Gas gangrene"),
("Metronidazole", "Anaerobic infections, Amoebiasis, Giardiasis, BV, C.diff (mild)"),
("Vancomycin", "MRSA, C.diff (severe), Enterococcus VRE → Linezolid/Daptomycin"),
("Doxycycline", "Rickettsial, Chlamydia, Brucellosis, LRTI (atypical)"),
("Chloramphenicol", "Meningitis in penicillin allergy; Typhoid (historically); Bacterial conjunctivitis (topical)"),
("Lithium", "Bipolar disorder (prophylaxis); narrow TI; monitor TFT, renal, ECG"),
("Clozapine", "Treatment-resistant schizophrenia; agranulocytosis risk - monitor WBC weekly"),
("Carbamazepine", "TGN (drug of choice); Bipolar, partial seizures; induces CYP3A4"),
("Acetazolamide", "Altitude sickness (prophylaxis); Glaucoma; Metabolic alkalosis"),
("Heparin", "Anticoagulant in pregnancy (doesn't cross placenta). LMWH preferred"),
("Warfarin", "Reversal: Vit K (slow) + FFP (fast). INR target 2-3 (prosthetic valve 2.5-3.5)"),
("Colchicine", "Acute gout (first line); prophylaxis; familial Mediterranean fever"),
("Methotrexate", "RA, psoriasis, ectopic pregnancy, ALL. Monitor LFT, folate supplement"),
]
story.append(two_col_table(doc_list[1:], header=doc_list[0], col1_w=50*mm, col2_w=125*mm))
story.append(sp(3))
story.append(Paragraph("Adverse Drug Reactions - Must Know", SUBHEAD))
adr = [
("Drug", "Important ADR"),
("Amiodarone", "Thyroid (hypo/hyper), pulmonary fibrosis, corneal deposits, photosensitivity, liver"),
("Statins", "Myopathy/rhabdomyolysis; elevated LFT; drug interaction with CYP3A4 inhibitors"),
("ACE inhibitors", "Dry cough (bradykinin); angioedema; hyperkalaemia; teratogenic (2nd/3rd trimester)"),
("Quinolones", "QT prolongation; tendinopathy (Achilles); avoid in <18 yrs; phototoxicity"),
("Aminoglycosides", "Nephrotoxicity (proximal tubule) + ototoxicity (irreversible); monitor levels"),
("Rifampicin", "Red-orange urine/tears; hepatotoxicity; strong enzyme inducer (CYP3A4)"),
("Chloroquine", "Retinopathy; cardiomyopathy; haemolysis in G6PD deficiency"),
("Aspirin OD", "Resp alkalosis then metabolic acidosis. Tinnitus, hyperventilation"),
("Tricyclic antidepressants", "Anticholinergic (ABCDE: Arrhythmia, Blurred vision, Constipation, Dry mouth, Excitation/seizure)"),
("Metformin", "Lactic acidosis (rare); Vit B12 deficiency; NOT nephrotoxic directly"),
]
story.append(two_col_table(adr[1:], header=adr[0], col1_w=50*mm, col2_w=125*mm))
story.append(sp(4))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# 6. PATHOLOGY
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("6. PATHOLOGY (~7-8% of paper)", C_TEAL))
story.append(sp(2))
story.append(Paragraph("Cell Injury & Inflammation", SUBHEAD))
path1 = [
bullet("Reversible injury: cell swelling, ER dilation, ribosome detachment, myelin figures", star=True),
bullet("Irreversible: nuclear changes (pyknosis→karyorrhexis→karyolysis), dense amorphous deposits in mitochondria"),
bullet("Apoptosis: cell shrinkage, membrane blebbing, apoptotic bodies, no inflammation. Caspase-mediated"),
bullet("Coagulative necrosis: most common; architecture preserved. Liquefactive = brain abscess; TB = caseous"),
bullet("Granuloma: epithelioid macrophages + Langhans giant cells. TB, sarcoid, fungal, foreign body"),
bullet("Acute inflammation mediators: Histamine (mast cells), PGI2/TXA2 (arachidonic acid), C3a/C5a"),
]
p1_t = Table([[b] for b in path1], colWidths=[175*mm])
p1_t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_LGREY),
("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
story.append(p1_t)
story.append(sp(3))
story.append(Paragraph("Haematology Pathology - High-Yield", SUBHEAD))
haem = [
("Condition", "Key Feature"),
("Iron deficiency anaemia", "Microcytic hypochromic; low ferritin, low serum iron, high TIBC; koilonychia"),
("Megaloblastic anaemia", "B12/folate deficiency; hypersegmented neutrophils; oval macrocytes; Schilling test for B12"),
("Sickle cell anaemia", "HbS (Glu→Val at position 6 of beta chain); sickling with hypoxia; autosplenectomy"),
("Thalassaemia", "Beta-thal major: Hb A absent, Hb F high; target cells; Erlenmeyer flask deformity on X-ray"),
("G6PD deficiency", "X-linked; Heinz bodies; bite cells; triggered by oxidants (primaquine, dapsone, fava beans)"),
("CML", "BCR-ABL (t9;22) Philadelphia chromosome; imatinib (gleevec); LAP score LOW"),
("CLL", "CD5+CD19+CD23+; smudge cells; Rai staging; indolent course"),
("AML (M3)", "t(15;17); PML-RARA; ATRA + arsenic trioxide; DIC risk"),
("Hodgkin lymphoma", "Reed-Sternberg cells (CD15+CD30+); EBV assoc; bimodal age; contiguous spread"),
("NHL - Burkitt", "t(8;14); c-Myc; starry sky appearance; EBV (endemic); fastest growing tumour"),
]
story.append(two_col_table(haem[1:], header=haem[0], col1_w=55*mm, col2_w=120*mm))
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 7. MICROBIOLOGY
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("7. MICROBIOLOGY (~5-6% of paper)", C_NAVY))
story.append(sp(2))
story.append(Paragraph("Bacteria - Virulence & Key Features", SUBHEAD))
micro = [
("Organism", "High-Yield Feature"),
("S. aureus", "Coagulase+; protein A (anti-opsonin); TSST-1 (toxic shock); PVL toxin (necrotising fasciitis)"),
("S. pyogenes", "ASO titre; M protein; causes RF; Dick test (scarlet fever)"),
("Mycobacterium TB", "Obligate aerobe; slow grower (18-24h); Ziehl-Neelsen stain; cord factor (virulence)"),
("Clostridium tetani", "Tetanospasmin (blocks GABA/glycine); drum stick appearance; risus sardonicus"),
("Vibrio cholerae", "El Tor biotype; rice water stools; Kanagawa phenomenon; CT toxin - ADP ribosylation"),
("N. meningitidis", "Serogroup B = most common; C/W135 = vaccine preventable; Waterhouse-Friderichsen"),
("H. influenzae", "Type b = meningitis in children; encapsulated; Pfeiffer's bacillus"),
("Bordetella pertussis", "Whooping cough; Bordet-Gengou medium; lymphocytosis; PT toxin"),
("Treponema pallidum", "VDRL (non-specific), TPHA/FTA-ABS (specific); Hutchinson's triad (congenital)"),
("Chlamydia trachomatis", "L1-L3 = LGV; D-K = genital + neonatal conjunctivitis; A-C = trachoma"),
]
story.append(two_col_table(micro[1:], header=micro[0], col1_w=45*mm, col2_w=130*mm))
story.append(sp(3))
story.append(Paragraph("Parasitology - High-Yield", SUBHEAD))
para = [
bullet("P. falciparum: most dangerous; no relapse (no hypnozoites); cerebral malaria; blackwater fever", star=True),
bullet("P. vivax/ovale: relapse due to hypnozoites. Primaquine for radical cure (check G6PD first)", star=True),
bullet("Entamoeba histolytica: flask-shaped ulcer; PAS-positive; rx with metronidazole + diloxanide"),
bullet("Giardia: trophozoites in stool; falling leaf motility; metronidazole DOC"),
bullet("Toxoplasma: congenital (TORCH); immunocompromised (ring-enhancing lesion brain); pyrimethamine+sulfadiazine"),
bullet("Hydatid cyst (E. granulosus): liver most common; daughter cysts; PAIR procedure; albendazole"),
]
para_t = Table([[b] for b in para], colWidths=[175*mm])
para_t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_LGREY),
("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
story.append(para_t)
story.append(sp(4))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# 8. ANATOMY
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("8. ANATOMY (~5-6% of paper)", C_TEAL))
story.append(sp(2))
story.append(Paragraph("Nerve Injuries - Must Know", SUBHEAD))
nerves = [
("Nerve Injured", "Deformity / Feature"),
("Radial nerve (midshaft humerus)", "Wrist drop; loss of finger extension; no triceps loss"),
("Ulnar nerve (medial epicondyle)", "Claw hand (4th/5th digits); loss of interossei; Froment's sign"),
("Median nerve (supracondylar)", "Hand of benediction; ape thumb; loss of opposition/lateral 2 lumbricals"),
("Axillary nerve (surgical neck humerus)", "Deltoid palsy; loss of shoulder abduction; loss of sensation regimental badge area"),
("Long thoracic nerve", "Winging of scapula (serratus anterior palsy)"),
("Common peroneal (fibula neck)", "Foot drop; loss of dorsiflexion/eversion"),
("Femoral nerve", "Loss of knee extension (quadriceps); absent knee jerk"),
("Sciatic nerve (posterior dislocation hip)", "Foot drop + sensory loss below knee (except medial)"),
]
story.append(two_col_table(nerves[1:], header=nerves[0], col1_w=60*mm, col2_w=115*mm))
story.append(sp(3))
story.append(Paragraph("Important Foramina & Contents", SUBHEAD))
foram = [
("Foramen", "Contents"),
("Foramen magnum", "Medulla oblongata, vertebral arteries, CN XI spinal root, spinal accessory nerve"),
("Foramen ovale", "CN V3 (mandibular), lesser petrosal nerve, accessory meningeal artery"),
("Foramen spinosum", "Middle meningeal artery, meningeal branch of mandibular nerve"),
("Superior orbital fissure", "CN III, IV, VI, V1, superior ophthalmic vein, sympathetic fibres"),
("Inferior orbital fissure", "CN V2 (infraorbital), inferior ophthalmic vein, infraorbital artery"),
("Jugular foramen", "CN IX, X, XI; sigmoid sinus → IJV; inferior petrosal sinus"),
("Internal acoustic meatus", "CN VII, VIII, labyrinthine artery"),
]
story.append(two_col_table(foram[1:], header=foram[0], col1_w=55*mm, col2_w=120*mm))
story.append(sp(3))
story.append(Paragraph("Embryology - High-Yield", SUBHEAD))
embry = [
bullet("Neural tube defects: folic acid deficiency; spina bifida occulta (most common NTD)", star=True),
bullet("DiGeorge syndrome: 3rd/4th pharyngeal pouch failure; absent thymus/parathyroids; 22q11 deletion"),
bullet("Branchial cyst: 2nd arch remnant; lateral neck; lined by stratified squamous epithelium"),
bullet("Thyroglossal cyst: midline; moves with tongue protrusion; lined by respiratory/squamous epithelium"),
bullet("Meckel's diverticulum: 2 feet from IC valve, 2% pop, 2 inches long, symptomatic in 2 yrs. Contains gastric/pancreatic tissue"),
bullet("Fallot's tetralogy: VSD + PS + Overriding aorta + RVH. Boot-shaped heart on X-ray. Tet spells - squat"),
]
embry_t = Table([[b] for b in embry], colWidths=[175*mm])
embry_t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),C_LGREY),
("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
story.append(embry_t)
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 9. PHYSIOLOGY
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("9. PHYSIOLOGY (~5-6% of paper)", C_NAVY))
story.append(sp(2))
story.append(Paragraph("Key Values & Normal Ranges", SUBHEAD))
phys_vals = [
("Parameter", "Normal Value / Key Fact"),
("GFR", "125 mL/min (measured by inulin clearance; estimated by creatinine clearance)"),
("RMP (nerve)", "-70 mV; Na+/K+ ATPase maintains gradient; Na+ in = depolarisation"),
("Cardiac output", "5 L/min; CO = HR x SV; Frank-Starling: increased preload → increased SV"),
("Spirometry", "FVC ~4L; FEV1 ~3.2L; FEV1/FVC >0.7 normal; <0.7 = obstruction; >0.7 with low FVC = restriction"),
("Renal threshold glucose", "180 mg/dL; glucosuria above this level; Tm = 320 mg/min"),
("Renin-angiotensin", "Renin → Angiotensinogen → Ang I → ACE → Ang II → aldosterone; macula densa senses NaCl"),
("Dead space", "Anatomical = 150mL; physiological includes alveolar dead space; Bohr equation"),
("Haemoglobin oxygen", "P50 = 26.5 mmHg; right shift: high temp, CO2, 2,3-DPG, acidosis (Bohr effect)"),
]
story.append(two_col_table(phys_vals[1:], header=phys_vals[0], col1_w=50*mm, col2_w=125*mm))
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 10. BIOCHEMISTRY
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("10. BIOCHEMISTRY (~4-5% of paper)", C_TEAL))
story.append(sp(2))
story.append(Paragraph("Metabolic Disorders & Enzymes", SUBHEAD))
biochem = [
("Disorder", "Enzyme Deficient / Key Feature"),
("PKU", "Phenylalanine hydroxylase; musty odour; intellectual disability; avoid phenylalanine diet"),
("Alkaptonuria", "Homogentisate oxidase; ochronosis; black urine on standing; arthritis"),
("Maple syrup urine disease", "Branched chain keto acid dehydrogenase; BCAA accumulation; maple syrup urine"),
("Gaucher's disease", "Glucocerebrosidase; most common lysosomal storage disease; Gaucher cells (crinkled paper)"),
("Niemann-Pick", "Sphingomyelinase; foam cells; cherry-red macula (like Tay-Sachs)"),
("Tay-Sachs", "Hexosaminidase A; ganglioside accumulation; cherry-red macula; no hepatosplenomegaly"),
("Homocystinuria", "CBS or MTHFR; lens dislocation (downward); DVT risk; Marfanoid features"),
("Wilson's disease", "ATP7B mutation; copper accumulation; Kayser-Fleischer rings; low ceruloplasmin"),
("Haemochromatosis", "HFE gene (C282Y); iron overload; bronze diabetes; hepatocirrhosis; transferrin sat >45%"),
("Porphyria (AIP)", "PBG deaminase; acute attacks with abdominal pain; port wine urine; avoid barbiturates"),
]
story.append(two_col_table(biochem[1:], header=biochem[0], col1_w=55*mm, col2_w=120*mm))
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 11. MINOR SUBJECTS QUICK REFERENCE
# ════════════════════════════════════════════════════════════════════════════
story.append(section_header("11. MINOR SUBJECTS - PYQ Favourites", C_NAVY))
story.append(sp(2))
# Three-column layout: Subject | Topic | Key Fact
minor_data = [
("Subject", "Topic", "Key High-Yield Fact"),
("Ophthalmology", "Glaucoma", "POAG: optic cup:disc ratio >0.6; raised IOP; peripheral field loss first"),
("Ophthalmology", "Cataract", "Nuclear: myopic shift. Posterior subcapsular: DM/steroids. Congenital: TORCH"),
("Ophthalmology", "Retinal detachment", "Painless floaters + flashes + curtain defect. Emergency: laser/cryo/surgery"),
("ENT", "Otosclerosis", "Conductive HL; Carhart's notch at 2kHz; fixation of stapes footplate; stapedectomy"),
("ENT", "Acoustic neuroma", "CN VIII; SNHL + tinnitus; widened IAM on X-ray; neurofibromatosis 2 (bilateral)"),
("ENT", "Quinsy", "Peritonsillar abscess; uvula deviated away; trismus; I&D + tonsillectomy 6 wks later"),
("Orthopaedics", "Colles fracture", "FOOSH; dinner fork deformity; distal radius; garden spade deformity"),
("Orthopaedics", "Neck of femur", "Garden classification; AVN risk (displaced). Hemiarthroplasty if displaced in elderly"),
("Orthopaedics", "Osteosarcoma", "Codman's triangle + sunburst pattern; distal femur; LDH raised; chemotherapy + surgery"),
("Dermatology", "Pemphigus vulgaris", "Intraepidermal blister; Nikolsky sign +ve; desmoglein 1&3 antibody; steroids"),
("Dermatology", "Bullous pemphigoid", "Subepidermal blister; Nikolsky -ve; BP180/230 antibody; elderly"),
("Dermatology", "Psoriasis", "Auspitz sign; Koebner phenomenon; nail pitting; HLA-Cw6; MTX for severe"),
("Psychiatry", "Schizophrenia", "Schneider's first rank: thought insertion/withdrawal/broadcasting, passivity, voices"),
("Psychiatry", "Depression", "SIG-E-CAPS (Sleep, Interest, Guilt, Energy, Concentration, Appetite, Psychomotor, Suicide)"),
("Psychiatry", "PTSD", "Re-experiencing, hyperarousal, avoidance >1 month. 1st line: SSRIs + trauma-focused CBT"),
("Forensic Med.", "Rigor mortis", "Starts 2-6h; complete 12h; passes off 24-48h at 27°C"),
("Forensic Med.", "Hanging", "Incomplete hanging = judicial. Dribbling of saliva = antemortem sign"),
("Radiology", "CXR patterns", "Air bronchogram = consolidation. Bat-wing = pulm oedema. Eggshell calcification = silicosis/sarcoid"),
("Anaesthesia", "Thiopentone", "Ultra short acting; context sensitive; malignant hyperthermia trigger; NOT for porphyria"),
("Anaesthesia", "Succinylcholine", "Depolarising NMB; fastest onset; SE: hyperkalaemia, malignant hyperthermia, bradycardia"),
]
story.append(three_col_table(
minor_data[1:],
widths=[35*mm, 40*mm, 100*mm],
header=minor_data[0]
))
story.append(sp(4))
# ════════════════════════════════════════════════════════════════════════════
# 12. LAST-MINUTE REVISION BOX
# ════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header("12. LAST-MINUTE POWER FACTS (48-hour revision)", C_RED))
story.append(sp(2))
lm_facts = [
("Associations", "Fact"),
("GOLD standard tests", "Cardiac output = Swan-Ganz; BO obstuction = colonoscopy; GFR = inulin clearance; OSA = PSG"),
("'Classical' presentations", "Pancoast tumour: apical lung CA + Horner's + brachial plexus. Budd-Chiari: PCV/hypercoag+HJV obstruction"),
("'Never do' combinations", "Aspirin + warfarin (without indication); beta-blocker in decompensated HF; ACEi + ARB + MRA"),
("Quick genetics", "AD: Marfan, Huntington, NF1&2, VHL, FAP. AR: CF, PKU, sickle cell, haemochromatosis, Wilson"),
("Chromosome deletions", "5p- = Cri-du-chat; 7q11 = Williams; 15q paternal = Prader-Willi; 15q maternal = Angelman; 22q11 = DiGeorge"),
("Paraneoplastic syndromes", "SCLC: SIADH, Cushing, Lambert-Eaton. Thymoma: MG, pure RCA, hypogamma. RCC: PTHrP, polycythaemia"),
("Tumour markers", "AFP: HCC + testicular (non-seminoma). CEA: colorectal (not specific). CA-125: ovary. PSA: prostate"),
("Iron study pattern", "IDA: ↓ferritin, ↓Fe, ↑TIBC. ACD: ↑ferritin, ↓Fe, ↓TIBC. Haemochromatosis: ↑ferritin, ↑Fe, ↓TIBC"),
("CURB-65 (pneumonia)", "C=confusion, U=urea>7, R=RR>30, B=BP<90/60, 65=age≥65. Score 0-1=outpatient, 2=admit, 3+=ICU"),
("Meningitis empirical Rx", "Adults: ceftriaxone + amoxicillin (>50yr for Listeria) + dexamethasone. Add acyclovir if viral not excluded"),
("High altitude physiology", "Hypoxic ventilatory response → resp alkalosis → ↓PCO2. Adaptation: EPO, ↑2,3-DPG, polycythaemia"),
("Vitamin deficiencies", "B1=Wernicke/beriberi; B2=angular cheilitis; B3=Pellagra(3Ds); B6=peripheral neuropathy; B12=megaloblastic+subacute combined"),
]
story.append(two_col_table(lm_facts[1:], header=lm_facts[0], col1_w=50*mm, col2_w=125*mm))
story.append(sp(5))
# ── FOOTER BOX ───────────────────────────────────────────────────────────────
footer_data = [["★ Remember: 100 MCQs/day + analyse wrong answers + weekly revision = NEET PG success ★"]]
footer_t = Table(footer_data, colWidths=[175*mm])
footer_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_GOLD),
("FONTNAME", (0,0), (-1,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 10),
("TEXTCOLOR", (0,0), (-1,-1), C_NAVY),
("ALIGNMENT", (0,0), (-1,-1), "CENTER"),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
]))
story.append(footer_t)
# ════════════════════════════════════════════════════════════════════════════
# BUILD PDF
# ════════════════════════════════════════════════════════════════════════════
doc.build(story, onFirstPage=on_first_page, onLaterPages=on_later_pages)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/neet-pg && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/neet-pg/NEET_PG_High_Yield_Quick_Reference.pdf
NEET PG High Yield Quick Reference
PDF Document · PDF
| Section | Content |
|---|---|
| PSM/Community Medicine | National programmes, epidemiology formulas, vaccines, screening |
| Medicine | Cardiology, endocrinology, nephrology high-yield facts |
| Surgery | GI surgery, breast & thyroid key points |
| OBG | Obstetrics emergencies, gynaecology conditions |
| Pharmacology | Drug of choice list + ADR table |
| Pathology | Cell injury, haematology disorders with key features |
| Microbiology | Bacteria virulence, parasitology |
| Anatomy | Nerve injuries, foramina contents, embryology |
| Physiology | Key values and normal ranges |
| Biochemistry | Metabolic disorders and enzyme deficiencies |
| Minor subjects | Ophth, ENT, Ortho, Dermatology, Psychiatry, Forensic, Radiology, Anaesthesia |
| Last-minute power facts | 48-hour revision - associations, genetics, tumour markers, vitamin deficiencies |
My source of study is marrow for pyq and gt and for studing core btr so make schedule and as I M officer I have weekly 3 duties one morning one afternoon and one full night per week so make plan accordingly and exam is on August 30 2026
~/neet-pg/generate_schedule.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
import datetime
OUTPUT = "/home/daytona/workspace/neet-pg/NEET_PG_Study_Schedule.pdf"
# ── Colours ──────────────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1a3a5c")
C_TEAL = colors.HexColor("#0e7c7b")
C_GOLD = colors.HexColor("#f4a261")
C_RED = colors.HexColor("#e63946")
C_GREEN = colors.HexColor("#2d6a4f")
C_ORANGE = colors.HexColor("#e76f51")
C_PURPLE = colors.HexColor("#6d3b8e")
C_LGREY = colors.HexColor("#f0f4f8")
C_MGREY = colors.HexColor("#c9d6e3")
C_YELLOW = colors.HexColor("#fff3cd")
C_WHITE = colors.white
C_BLACK = colors.black
C_DUTY_NIGHT = colors.HexColor("#fce4ec")
C_DUTY_MORN = colors.HexColor("#e3f2fd")
C_DUTY_AFT = colors.HexColor("#f3e5f5")
C_STUDY = colors.HexColor("#e8f5e9")
C_GT = colors.HexColor("#fff8e1")
# ── Styles ────────────────────────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
TITLE = S("T", fontSize=24, leading=30, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=2)
SUBTITLE = S("ST", fontSize=12, leading=16, textColor=C_GOLD,
fontName="Helvetica", alignment=TA_CENTER, spaceAfter=2)
META = S("M", fontSize=9, leading=12, textColor=C_WHITE,
fontName="Helvetica", alignment=TA_CENTER)
SEC = S("SH", fontSize=12, leading=15, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT)
SUBH = S("sub", fontSize=10, leading=13, textColor=C_NAVY,
fontName="Helvetica-Bold", spaceBefore=4, spaceAfter=2)
BODY = S("B", fontSize=8.5, leading=12, textColor=C_BLACK, fontName="Helvetica")
BULL = S("Bu", fontSize=8.5, leading=12, textColor=C_BLACK,
fontName="Helvetica", leftIndent=12, spaceAfter=1, bulletIndent=4)
SMALL = S("Sm", fontSize=7.5, leading=10, textColor=colors.HexColor("#444444"),
fontName="Helvetica")
CELL = S("Ce", fontSize=7.5, leading=10, textColor=C_BLACK, fontName="Helvetica")
CELL_B = S("CeB", fontSize=7.5, leading=10, textColor=C_NAVY, fontName="Helvetica-Bold")
CELL_C = S("CeC", fontSize=7.5, leading=10, textColor=C_BLACK,
fontName="Helvetica", alignment=TA_CENTER)
def sp(h=4): return Spacer(1, h*mm)
def hr(): return HRFlowable(width="100%", thickness=0.5, color=C_MGREY, spaceAfter=3)
def sec_header(title, bg=C_NAVY):
t = Table([[Paragraph(title, SEC)]], colWidths=[180*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
return t
def on_later_pages(canvas, doc):
w, h = A4
canvas.saveState()
canvas.setFillColor(C_NAVY)
canvas.rect(0, h-20*mm, w, 20*mm, fill=1, stroke=0)
canvas.setFont("Helvetica-Bold", 8.5)
canvas.setFillColor(C_WHITE)
canvas.drawString(15*mm, h-13*mm, "NEET PG 2026 - Personalised Study Schedule (MO Edition)")
canvas.setFont("Helvetica", 8)
canvas.drawRightString(w-15*mm, h-13*mm, f"Page {doc.page} | Exam: 30 Aug 2026")
canvas.setStrokeColor(C_MGREY)
canvas.setLineWidth(0.5)
canvas.line(15*mm, 12*mm, w-15*mm, 12*mm)
canvas.setFont("Helvetica", 7)
canvas.setFillColor(colors.HexColor("#888888"))
canvas.drawCentredString(w/2, 8*mm, "Resources: Marrow (PYQ + GT) | BnB / Dams for core reading | 100 MCQs/day")
canvas.restoreState()
# ════════════════════════════════════════════════════════════════════════════
# SCHEDULE LOGIC
# ════════════════════════════════════════════════════════════════════════════
start = datetime.date(2026, 7, 9)
exam = datetime.date(2026, 8, 30)
total_days = (exam - start).days # 52 days
# Duty pattern per week (repeating):
# Morning duty -> reduced study (4h available)
# Afternoon duty -> moderate study (5h available, morning free)
# Night duty -> post-night recovery next day = 2 days affected
# We'll label days in each week:
# Week pattern (7 days): Mon=Full, Tue=Morning Duty, Wed=Full, Thu=Afternoon Duty,
# Fri=Full, Sat=Night Duty, Sun=Post-Night Recovery
# Day types and study hours
DAY_TYPES = {
"Full Study": {"hours": 8, "color": C_STUDY, "label": "Full Study (8h)"},
"Morning Duty": {"hours": 4, "color": C_DUTY_MORN, "label": "Morning Duty (4h study)"},
"Afternoon Duty": {"hours": 5, "color": C_DUTY_AFT, "label": "Afternoon Duty (5h study)"},
"Night Duty": {"hours": 2, "color": C_DUTY_NIGHT,"label": "Night Duty (2h light study)"},
"Post-Night Rest": {"hours": 2, "color": C_DUTY_NIGHT,"label": "Post-Night Rest (2h light)"},
}
# 7-week recurring duty pattern (0=Mon ... 6=Sun)
# Tue = Morning duty, Thu = Afternoon duty, Sat = Night duty, Sun = post-night
DUTY_MAP = {
1: "Morning Duty",
3: "Afternoon Duty",
5: "Night Duty",
6: "Post-Night Rest",
}
# Subject plan - 7 weeks
# Week 1: PSM + Medicine
# Week 2: Surgery + OBG
# Week 3: Pharmacology + Pathology
# Week 4: Microbiology + Biochemistry
# Week 5: Anatomy + Physiology (high-yield)
# Week 6: Minor subjects + Full revision
# Week 7 (partial): Mock tests + Final revision
WEEK_PLANS = [
{
"week": 1,
"dates": "Jul 09 - Jul 15",
"theme": "PSM + Medicine",
"color": C_TEAL,
"subjects": [
("PSM", "BnB / Dams Preventive Med", "National health programmes, epidemiology, biostatistics, screening"),
("Medicine", "BnB Internal Medicine", "Cardiology, HTN, IHD, heart failure, arrhythmias"),
],
"marrow": "Marrow PSM + Medicine PYQ subject-wise (all years). Target: 150 MCQs/day",
"gt": "No GT this week - build foundation first",
"milestones": "Complete PSM full + Medicine Cardiology/Resp/GI by end of week",
},
{
"week": 2,
"dates": "Jul 16 - Jul 22",
"theme": "Surgery + OBG",
"color": C_ORANGE,
"subjects": [
("Surgery", "BnB / Dams Surgery", "GI surgery, hepatobiliary, breast, thyroid, trauma basics"),
("OBG", "BnB Obs+Gynae", "Obstetric emergencies, normal labour, gynaecology, infertility"),
],
"marrow": "Marrow Surgery + OBG PYQ. Target: 150 MCQs/day",
"gt": "Saturday (post-night): 50 MCQ mini-test from Week 1 subjects",
"milestones": "Surgery + OBG chapters + first revision of PSM+Medicine",
},
{
"week": 3,
"dates": "Jul 23 - Jul 29",
"theme": "Pharmacology + Pathology",
"color": C_PURPLE,
"subjects": [
("Pharmacology", "Gobind Garg / BnB Pharma", "Autonomic, CVS, CNS, antimicrobials, drug of choice, ADRs"),
("Pathology", "BnB / Sparsh Gupta", "Cell injury, inflammation, haematology, neoplasia, organ pathology"),
],
"marrow": "Marrow Pharma + Pathology PYQ. Target: 150 MCQs/day",
"gt": "Sunday (post-night): Marrow Grand Test 1 (Surgery + OBG focused)",
"milestones": "Pharma + Path completed. Start subject-wise revision of Wk1+2",
},
{
"week": 4,
"dates": "Jul 30 - Aug 05",
"theme": "Microbiology + Biochemistry",
"color": C_RED,
"subjects": [
("Microbiology", "BnB / Dams Micro", "Bacteriology, virology, parasitology, mycology, immunology"),
("Biochemistry", "BnB Biochemistry", "Enzymes, metabolic disorders, vitamins, molecular biology"),
],
"marrow": "Marrow Micro + Biochem PYQ. Target: 150 MCQs/day",
"gt": "Weekend: Marrow Grand Test 2 (all Tier-1 subjects: PSM+Med+Surg+OBG+Pharma+Path)",
"milestones": "All Tier-1 + Tier-2 core subjects done. GT2 analysis on rest day",
},
{
"week": 5,
"dates": "Aug 06 - Aug 12",
"theme": "Anatomy + Physiology + Minor Subjects",
"color": C_GREEN,
"subjects": [
("Anatomy", "BnB Anatomy (high-yield only)", "Nerve injuries, foramina, embryology, clinical anatomy"),
("Physiology", "BnB Physiology (high-yield)", "CVS, renal, resp, endocrine - key values only"),
("Minor subjects", "Marrow PYQ only", "Ophthalmology, ENT, Orthopaedics, Dermatology, Psychiatry"),
],
"marrow": "Marrow Anatomy + Physio + Minor subjects PYQ. Target: 100 MCQs/day each",
"gt": "Weekend: Marrow Grand Test 3 (full syllabus). ANALYSE every wrong answer",
"milestones": "Full syllabus covered. GT3 score baseline set. Identify weak areas for Rev wk",
},
{
"week": 6,
"dates": "Aug 13 - Aug 19",
"theme": "FULL REVISION WEEK",
"color": C_NAVY,
"subjects": [
("All subjects", "Marrow Revision + PYQ", "Revision of all subjects in priority order"),
("Weak areas", "Targeted from GT analysis", "Focus on topics missed in GT2 and GT3"),
],
"marrow": "Marrow PYQ last 3 years - ALL subjects. Target: 200 MCQs/day",
"gt": "GT4 on Wednesday + GT5 on Saturday. Analyse same day",
"milestones": "GT4 + GT5 scores should be improving. Revision notes on all PYQ patterns",
},
{
"week": 7,
"dates": "Aug 20 - Aug 30",
"theme": "FINAL SPRINT - Mock Tests + Recall",
"color": C_RED,
"subjects": [
("Rapid revision", "High-yield reference PDF + Marrow flashcards", "All subjects - 30 min each"),
("Mock tests", "Marrow full-length GTs", "3 full GTs this week, timed"),
],
"marrow": "Marrow full-length mock tests (timed, 200Q). Target: 1 full test/2 days",
"gt": "GT6 (Aug 21), GT7 (Aug 23), GT8 (Aug 26). Final revision Aug 28-29",
"milestones": "Do NOT start new topics after Aug 20. Only revision + mock tests",
},
]
# Daily timetable templates
TIMETABLES = {
"Full Study": [
("05:30 - 06:00", "Wake up, freshen up, light breakfast"),
("06:00 - 08:30", "Core reading - BnB / Dams (Subject 1) - 2.5h"),
("08:30 - 09:00", "Break / Morning routine"),
("09:00 - 11:00", "Marrow PYQ - Subject 1 (50 MCQs + analysis)"),
("11:00 - 11:30", "Break + snack"),
("11:30 - 13:30", "Core reading - BnB / Dams (Subject 2) - 2h"),
("13:30 - 14:30", "Lunch + rest"),
("14:30 - 16:30", "Marrow PYQ - Subject 2 (50 MCQs + analysis)"),
("16:30 - 17:00", "Tea break + short walk"),
("17:00 - 19:00", "Weekly subject revision / weak area re-read"),
("19:00 - 20:00", "Dinner + relax"),
("20:00 - 21:30", "Marrow flashcards + last 1-yr PYQ (50 MCQs)"),
("21:30 - 22:00", "Review today's notes + plan tomorrow"),
("22:00", "Sleep (7h minimum)"),
],
"Morning Duty": [
("05:30 - 07:00", "Core reading - 1.5h before duty"),
("07:00 - 14:00", "Hospital morning duty"),
("14:00 - 15:00", "Lunch + rest / nap 30 min"),
("15:00 - 17:00", "Marrow PYQ (50 MCQs + analysis)"),
("17:00 - 17:30", "Break"),
("17:30 - 19:00", "Core reading / revision - 1.5h"),
("19:00 - 20:00", "Dinner + relax"),
("20:00 - 21:00", "Marrow flashcards / light reading (30-40 MCQs)"),
("21:00", "Sleep (early - prep for next day)"),
],
"Afternoon Duty": [
("06:00 - 08:30", "Core reading - BnB / Dams (2.5h - best focus window)"),
("08:30 - 09:00", "Break"),
("09:00 - 11:00", "Marrow PYQ (60 MCQs + analysis)"),
("11:00 - 12:00", "Lunch + prep for duty"),
("12:00 - 20:00", "Hospital afternoon/evening duty"),
("20:00 - 21:00", "Dinner"),
("21:00 - 22:00", "Light revision - Marrow flashcards / PYQ (30 MCQs)"),
("22:00", "Sleep"),
],
"Night Duty": [
("08:00 - 10:00", "Wake up, light breakfast, light reading only - no heavy new topics"),
("10:00 - 12:00", "Marrow flashcards / revision of last topic (not new learning)"),
("12:00 - 13:00", "Lunch + rest / nap"),
("13:00 - 19:00", "Free time / hospital admin / personal time"),
("19:00 - 20:00", "Dinner"),
("20:00 - 24:00", "Night duty starts"),
("00:00 - 08:00", "Night duty continues - if quiet: Marrow flashcards on phone (30 MCQs)"),
],
"Post-Night Rest": [
("08:00 - 10:00", "Home, breakfast, sleep"),
("10:00 - 14:00", "Rest / sleep (mandatory - do not study when exhausted)"),
("14:00 - 15:00", "Light lunch"),
("15:00 - 17:00", "Light revision only - Marrow PYQ (50 MCQs, no timer pressure)"),
("17:00 - 17:30", "Tea break"),
("17:30 - 19:00", "Review GT if weekend, or weekly revision"),
("19:00", "Dinner, relax, sleep by 21:00"),
],
}
# ════════════════════════════════════════════════════════════════════════════
# BUILD STORY
# ════════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=12*mm, rightMargin=12*mm,
topMargin=14*mm, bottomMargin=20*mm,
title="NEET PG 2026 Study Schedule - MO Edition",
author="Orris AI"
)
story = []
# ── COVER ────────────────────────────────────────────────────────────────────
cover = Table([
[Paragraph("NEET PG 2026", TITLE)],
[Paragraph("Personalised Study Schedule", SUBTITLE)],
[Paragraph("Medical Officer Edition | Resources: Marrow + BnB/Dams | Exam: 30 August 2026", META)],
[Paragraph("52 Days | 3 Duties/Week Accounted | Jul 09 - Aug 30, 2026", META)],
], colWidths=[180*mm])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
story.append(cover)
story.append(sp(4))
# ── OVERVIEW STATS ────────────────────────────────────────────────────────────
story.append(sec_header("SCHEDULE OVERVIEW", C_TEAL))
overview_rows = [
["Total days available", "52 days (Jul 09 - Aug 29)", "Exam date", "30 August 2026 (Sunday)"],
["Duties per week", "3 (1 morning + 1 afternoon + 1 night)", "Study hrs/week", "~42-45 hours (full week)"],
["Duty-day study hrs", "Morning duty=4h, Aft duty=5h, Night=2h, Post-night=2h", "Full day study", "8 hours"],
["Primary MCQ source", "Marrow (PYQ + Grand Tests)", "Core reading", "BnB / Dams lecture series"],
["Weekly GTs", "From Week 2 onwards (Sat/Sun)", "Daily MCQ target", "100-200 MCQs/day"],
["Revision strategy", "Every 3rd day = revision of previous topics", "Final 10 days", "Mock tests only, no new topics"],
]
ov_table = Table(overview_rows, colWidths=[45*mm, 55*mm, 38*mm, 42*mm])
ov_table.setStyle(TableStyle([
("FONTNAME", (0,0), (-1,-1), "Helvetica"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"),
("FONTNAME", (0,0), (2,-1), "Helvetica-Bold"),
("BACKGROUND", (0,0), (-1,0), C_LGREY),
("GRID", (0,0), (-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
# zebra
for i in range(len(overview_rows)):
if i % 2 == 0:
ov_table.setStyle(TableStyle([("BACKGROUND",(0,i),(-1,i), C_LGREY)]))
story.append(ov_table)
story.append(sp(4))
# ── DUTY DAY LEGEND ──────────────────────────────────────────────────────────
story.append(Paragraph("Duty Day Legend & Study Hours", SUBH))
legend = [
[Paragraph("Day Type", CELL_B), Paragraph("Study Hours", CELL_B),
Paragraph("Strategy", CELL_B), Paragraph("MCQ Target", CELL_B)],
[Paragraph("Full Study Day", CELL), Paragraph("8 hours", CELL),
Paragraph("Core reading (BnB) + Marrow PYQ + Flashcards", CELL), Paragraph("150-200 MCQs", CELL)],
[Paragraph("Morning Duty (7am-2pm)", CELL), Paragraph("4 hours", CELL),
Paragraph("Pre-duty reading (1.5h) + post-duty PYQ (2.5h)", CELL), Paragraph("80-100 MCQs", CELL)],
[Paragraph("Afternoon Duty (12pm-8pm)", CELL), Paragraph("5 hours", CELL),
Paragraph("Morning reading (2.5h) + PYQ + light evening revision", CELL), Paragraph("90-100 MCQs", CELL)],
[Paragraph("Night Duty (8pm-8am)", CELL), Paragraph("2 hours", CELL),
Paragraph("Pre-duty flashcards only; during quiet hours: phone MCQs", CELL), Paragraph("30-50 MCQs", CELL)],
[Paragraph("Post-Night Rest Day", CELL), Paragraph("2 hours", CELL),
Paragraph("Rest until 2pm mandatory; light revision only, no pressure", CELL), Paragraph("50 MCQs max", CELL)],
]
leg_t = Table(legend, colWidths=[42*mm, 22*mm, 80*mm, 30*mm])
leg_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("BACKGROUND", (0,1), (-1,1), C_STUDY),
("BACKGROUND", (0,2), (-1,2), C_DUTY_MORN),
("BACKGROUND", (0,3), (-1,3), C_DUTY_AFT),
("BACKGROUND", (0,4), (-1,4), C_DUTY_NIGHT),
("BACKGROUND", (0,5), (-1,5), C_DUTY_NIGHT),
("GRID", (0,0), (-1,-1), 0.3, C_MGREY),
("FONTSIZE", (0,0), (-1,-1), 8),
("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(leg_t)
story.append(sp(4))
# ── SUBJECT PRIORITY ─────────────────────────────────────────────────────────
story.append(sec_header("SUBJECT PRIORITY & MARROW RESOURCES", C_PURPLE))
story.append(sp(2))
subj_rows = [
["Priority", "Subject", "Core Reading (BnB/Dams)", "Marrow Usage", "% Weightage"],
["TIER 1", "PSM / Community Medicine", "Dams PSM / BnB Preventive", "PYQ subject-wise + all GT", "15-18%"],
["TIER 1", "Medicine", "BnB Internal Medicine", "PYQ subject-wise + GT", "10-12%"],
["TIER 1", "Surgery", "BnB Surgery / Dams Surgery", "PYQ subject-wise + GT", "8-10%"],
["TIER 1", "OBG", "BnB Obs+Gynae", "PYQ subject-wise + GT", "8-10%"],
["TIER 1", "Pharmacology", "Gobind Garg / BnB Pharma", "PYQ subject-wise + GT", "7-8%"],
["TIER 1", "Pathology", "BnB / Sparsh Gupta Path", "PYQ subject-wise + GT", "7-8%"],
["TIER 2", "Microbiology", "BnB Micro / Dams Micro", "PYQ subject-wise", "5-6%"],
["TIER 2", "Biochemistry", "BnB Biochemistry", "PYQ subject-wise", "4-5%"],
["TIER 2", "Anatomy", "BnB Anatomy (HY only)", "PYQ subject-wise", "5-6%"],
["TIER 2", "Physiology", "BnB Physiology (HY only)", "PYQ subject-wise", "5-6%"],
["TIER 3", "Ophthalmology", "PYQ + Marrow only", "PYQ + quick notes", "2-3%"],
["TIER 3", "ENT", "PYQ + Marrow only", "PYQ + quick notes", "2-3%"],
["TIER 3", "Orthopaedics", "PYQ + Marrow only", "PYQ + quick notes", "2-3%"],
["TIER 3", "Dermatology", "PYQ + Marrow only", "PYQ + quick notes", "2%"],
["TIER 3", "Psychiatry", "PYQ + Marrow only", "PYQ + quick notes", "2-3%"],
["TIER 3", "Forensic / Radiology / Anaesthesia", "PYQ only", "GT revision", "2-4%"],
]
col_w = [18*mm, 42*mm, 52*mm, 42*mm, 20*mm]
s_t = Table(subj_rows, colWidths=col_w)
style = [
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("GRID", (0,0), (-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
# colour tiers
for i in range(1, len(subj_rows)):
row = subj_rows[i]
if row[0] == "TIER 1":
style.append(("BACKGROUND", (0,i), (0,i), colors.HexColor("#c8f7c5")))
style.append(("FONTNAME", (0,i), (0,i), "Helvetica-Bold"))
elif row[0] == "TIER 2":
style.append(("BACKGROUND", (0,i), (0,i), C_YELLOW))
style.append(("FONTNAME", (0,i), (0,i), "Helvetica-Bold"))
else:
style.append(("BACKGROUND", (0,i), (0,i), C_DUTY_NIGHT))
style.append(("FONTNAME", (0,i), (0,i), "Helvetica-Bold"))
if i % 2 == 0:
style.append(("BACKGROUND", (1,i), (-1,i), C_LGREY))
s_t.setStyle(TableStyle(style))
story.append(s_t)
story.append(sp(4))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# WEEK-BY-WEEK PLAN
# ════════════════════════════════════════════════════════════════════════════
story.append(sec_header("7-WEEK MASTER PLAN", C_NAVY))
story.append(sp(2))
for wp in WEEK_PLANS:
wk_header = Table([[Paragraph(
f"WEEK {wp['week']} | {wp['dates']} | Focus: {wp['theme']}",
S(f"WH{wp['week']}", fontSize=10, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_LEFT)
)]], colWidths=[180*mm])
wk_header.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), wp["color"]),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
story.append(wk_header)
# subjects table
subj_data = [["Subject", "Core Resource (BnB/Dams)", "Topics to Cover"]]
for s in wp["subjects"]:
subj_data.append([s[0], s[1], s[2]])
st = Table(subj_data, colWidths=[30*mm, 55*mm, 95*mm])
st.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), C_MGREY),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
("BACKGROUND", (0,1),(-1,1), C_LGREY),
]))
story.append(st)
# Marrow + GT instructions
detail_data = [
[Paragraph("Marrow PYQ:", CELL_B), Paragraph(wp["marrow"], CELL)],
[Paragraph("Grand Test:", CELL_B), Paragraph(wp["gt"], CELL)],
[Paragraph("Milestone:", CELL_B), Paragraph(wp["milestones"], CELL)],
]
dt = Table(detail_data, colWidths=[28*mm, 152*mm])
dt.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), colors.HexColor("#f9f9f9")),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("FONTSIZE", (0,0),(-1,-1), 8),
("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(dt)
story.append(sp(4))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# DAILY TIMETABLES
# ════════════════════════════════════════════════════════════════════════════
story.append(sec_header("DAILY TIMETABLES (BY DAY TYPE)", C_TEAL))
story.append(sp(2))
timetable_colors = {
"Full Study": C_STUDY,
"Morning Duty": C_DUTY_MORN,
"Afternoon Duty": C_DUTY_AFT,
"Night Duty": C_DUTY_NIGHT,
"Post-Night Rest": C_DUTY_NIGHT,
}
timetable_descs = {
"Full Study": "Days: Monday, Wednesday, Friday (Full 8h study days)",
"Morning Duty": "Days: Tuesday (Duty 7am-2pm; study before and after)",
"Afternoon Duty": "Days: Thursday (Duty 12pm-8pm; morning free for study)",
"Night Duty": "Days: Saturday (Night duty from evening; light study pre-duty)",
"Post-Night Rest": "Days: Sunday (Post-night recovery; rest is non-negotiable)",
}
for dtype, slots in TIMETABLES.items():
th = Table([[Paragraph(f"{dtype.upper()} - {timetable_descs[dtype]}",
S(f"TH{dtype}", fontSize=9, fontName="Helvetica-Bold",
textColor=C_NAVY, alignment=TA_LEFT)
)]], colWidths=[180*mm])
th.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), timetable_colors[dtype]),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("BOX", (0,0),(-1,-1), 1, C_MGREY),
]))
story.append(th)
tt_data = [[Paragraph("Time", CELL_B), Paragraph("Activity", CELL_B)]]
for time_slot, activity in slots:
tt_data.append([
Paragraph(time_slot, S("TS", fontSize=7.5, fontName="Helvetica-Bold",
textColor=C_NAVY)),
Paragraph(activity, CELL),
])
tt = Table(tt_data, colWidths=[42*mm, 138*mm])
tts = [
("BACKGROUND", (0,0),(-1,0), C_NAVY),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
]
for i in range(1, len(tt_data)):
if i % 2 == 0:
tts.append(("BACKGROUND", (0,i),(-1,i), C_LGREY))
tt.setStyle(TableStyle(tts))
story.append(tt)
story.append(sp(4))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# WEEK-BY-WEEK CALENDAR VIEW
# ════════════════════════════════════════════════════════════════════════════
story.append(sec_header("WEEK-BY-WEEK CALENDAR (Day-by-Day Plan)", C_NAVY))
story.append(sp(2))
# Generate each day from Jul 9 to Aug 29
days_of_week = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
duty_labels = {1:"Morning Duty",3:"Afternoon Duty",5:"Night Duty",6:"Post-Night"}
week_subjects = {
1: ["PSM Natl Programmes + Biostatistics", "PSM Epidemiology + Screening", "Medicine Cardiology", "Medicine HTN + IHD", "Medicine Heart Failure + CCF", "Medicine GI/Resp", "REVISION: PSM + Medicine Cardio"],
2: ["Surgery GI + Hepatobiliary", "Surgery Breast + Thyroid + Trauma", "OBG Normal Obstetrics + ANC", "OBG APH + PPH + Pre-eclampsia", "OBG Gynaecology", "Mini-test (50Q) + OBG Infertility", "REVISION: Surgery + OBG + GT"],
3: ["Pharmacology Autonomic + CVS", "Pharmacology CNS + Analgesics", "Pharmacology Antimicrobials", "Pharmacology Drug-of-choice + ADR", "Pathology Cell injury + Inflammation", "Pathology Haematology", "REVISION: Pharma + Pathology + GT1"],
4: ["Pathology Neoplasia + Organ Path", "Microbiology Bacteriology", "Microbiology Virology + Immunology", "Microbiology Parasitology", "Biochemistry Metabolism + Enzymes", "Biochem Vitamins + Mol Bio + GT2", "FULL REVISION Wk1-4 subjects"],
5: ["Anatomy HY (Nerves + Foramina)", "Anatomy Embryology + Clinical", "Physiology CVS + Renal", "Physiology Resp + Endocrine", "Minor subjects (Ophth + ENT)", "Minor (Ortho + Derma + Psych) + GT3", "REVISION Minor + weak areas"],
6: ["REVISION PSM + Medicine", "REVISION Surgery + OBG", "REVISION Pharma + Path + GT4", "REVISION Micro + Biochem", "REVISION Anatomy + Physio + Minors", "FULL REVISION + GT5", "REST + review GT4+GT5 analysis"],
7: ["REVISION all subjects rapidly", "GT6 Full Mock (200Q timed)", "Analyse GT6 + revise weak topics", "GT7 Full Mock (200Q timed)", "Analyse GT7 + final revision", "GT8 Full Mock + rapid revision", "REST - light flashcard revision only"],
}
current_date = start
week_num = 0
while current_date <= exam - datetime.timedelta(days=1):
week_num += 1
if week_num > 7:
break
wk_data = [[
Paragraph(f"Week {week_num}", S(f"WCH{week_num}", fontSize=9,
fontName="Helvetica-Bold", textColor=C_WHITE)),
Paragraph("Date", S("WCHd", fontSize=8, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER)),
Paragraph("Day Type", S("WCHt", fontSize=8, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER)),
Paragraph("Study Plan", S("WCHs", fontSize=8, fontName="Helvetica-Bold",
textColor=C_WHITE)),
Paragraph("MCQ Target", S("WCHm", fontSize=8, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER)),
]]
week_styles = [
("BACKGROUND", (0,0),(-1,0), WEEK_PLANS[week_num-1]["color"]),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 7.5),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "TOP"),
]
for day_in_week in range(7):
if current_date > exam - datetime.timedelta(days=1):
break
dow = current_date.weekday()
date_str = current_date.strftime("%d %b")
day_label = days_of_week[dow]
if dow in duty_labels:
dtype = duty_labels[dow]
else:
dtype = "Full Study"
# study plan
splan_list = week_subjects.get(week_num, ["Revision"])
splan = splan_list[day_in_week] if day_in_week < len(splan_list) else "Revision"
# MCQ target
mcq_targets = {
"Full Study": "150-200 Q",
"Morning Duty": "80-100 Q",
"Afternoon Duty": "90-100 Q",
"Night Duty": "30-50 Q",
"Post-Night": "50 Q",
}
mcq = mcq_targets.get(dtype, "100 Q")
# row colour
row_color = {
"Full Study": C_STUDY,
"Morning Duty": C_DUTY_MORN,
"Afternoon Duty": C_DUTY_AFT,
"Night Duty": C_DUTY_NIGHT,
"Post-Night": C_DUTY_NIGHT,
}.get(dtype, C_LGREY)
row_idx = len(wk_data)
wk_data.append([
Paragraph(f"{day_label}", S(f"DL{row_idx}", fontSize=7.5,
fontName="Helvetica-Bold", textColor=C_NAVY)),
Paragraph(date_str, S(f"DS{row_idx}", fontSize=7.5,
fontName="Helvetica", alignment=TA_CENTER)),
Paragraph(dtype, S(f"DT{row_idx}", fontSize=7.5,
fontName="Helvetica-Bold",
textColor=C_RED if "Duty" in dtype else C_GREEN)),
Paragraph(splan, S(f"SP{row_idx}", fontSize=7.5, fontName="Helvetica")),
Paragraph(mcq, S(f"MQ{row_idx}", fontSize=7.5,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
])
week_styles.append(("BACKGROUND", (0,row_idx),(-1,row_idx), row_color))
current_date += datetime.timedelta(days=1)
wk_t = Table(wk_data, colWidths=[12*mm, 16*mm, 30*mm, 100*mm, 22*mm])
wk_t.setStyle(TableStyle(week_styles))
story.append(wk_t)
story.append(sp(3))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# MARROW STRATEGY DETAIL
# ════════════════════════════════════════════════════════════════════════════
story.append(sec_header("HOW TO USE MARROW EFFECTIVELY", C_TEAL))
story.append(sp(2))
marrow_tips = [
("PYQ Mode", "Go subject-wise. Start with Tier-1 subjects. Do ALL years available, not just last 3."),
("Wrong answer analysis", "MOST IMPORTANT habit. For every wrong answer: read the explanation fully + open BnB for that topic. This is where the real learning happens."),
("Flashcards", "After finishing a subject's PYQ, activate Marrow flashcards for that subject. Review them daily during low-energy slots (post-night, evenings)."),
("Grand Tests (GT)", "Start from Week 2. Take GTs under timed conditions (200Q in 3.5 hours). Analyse same day or next morning. Sort by subject and identify your weakest areas."),
("GT strategy", "Don't take GT just to 'complete' it. After each GT: list top 3 weakest subjects → revise those from BnB → redo PYQ from those subjects on Marrow."),
("Revision tests", "Use Marrow's subject-wise revision tests after completing each week's topic. These reinforce before you move forward."),
("High-yield video lectures", "Use BnB (Bhatia's or Dams equivalent) for core concepts. Marrow video lectures are good but go to them only if BnB doesn't cover a topic clearly."),
("Night duty / low energy", "Marrow app on phone → flashcard mode or quick 30Q test. Never open heavy BnB textbook when sleep-deprived."),
("Daily discipline", "Log your Marrow score every day. Track weekly: total Q done, accuracy %, weakest subject. Review this every Sunday."),
("Final 10 days", "Only Marrow GTs + flashcards. No new topics. Your brain needs consolidation, not new information."),
]
mrow_data = [["Marrow Feature", "How to Use It"]]
for tip in marrow_tips:
mrow_data.append([tip[0], tip[1]])
m_t = Table(mrow_data, colWidths=[40*mm, 140*mm])
m_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), C_TEAL),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1),(0,-1), C_NAVY),
]))
for i in range(1, len(mrow_data)):
if i % 2 == 0:
m_t.setStyle(TableStyle([("BACKGROUND",(0,i),(-1,i),C_LGREY)]))
story.append(m_t)
story.append(sp(5))
# ── FINAL MOTIVATION BOX ──────────────────────────────────────────────────────
mot = Table([[Paragraph(
"You have 52 days. Thousands of doctors cleared NEET PG in exactly this timeframe. "
"Consistency beats perfection every time. Do your 100 MCQs even on duty days. "
"Sleep. Eat well. Trust the process. You've got this.",
S("Mot", fontSize=9, fontName="Helvetica-Bold", textColor=C_NAVY, alignment=TA_CENTER,
leading=14)
)]], colWidths=[180*mm])
mot.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_GOLD),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
]))
story.append(mot)
# ════════════════════════════════════════════════════════════════════════════
doc.build(story, onFirstPage=on_later_pages, onLaterPages=on_later_pages)
print(f"Schedule PDF created: {OUTPUT}")
cd /home/daytona/workspace/neet-pg && python generate_schedule.py 2>&1
ls -lh /home/daytona/workspace/neet-pg/
NEET PG Study Schedule
PDF Document · PDF
| Section | What it covers |
|---|---|
| Schedule Overview | Stats, total hours, resources at a glance |
| Subject Priority Table | All subjects with BnB/Dams + Marrow usage mapped |
| 7-Week Master Plan | Week-by-week subjects, Marrow PYQ targets, GT schedule, milestones |
| Daily Timetables | Hour-by-hour plan for each of the 5 day types |
| Day-by-Day Calendar | Every single day Jul 9 - Aug 29 with date, day type, study topic, MCQ target |
| Marrow Strategy Guide | Exactly how to use PYQ mode, GTs, flashcards, wrong answer analysis |
My source of readingi core btr of zainab mam I have not at all started reading
~/neet-pg/generate_schedule_v2.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
import datetime
OUTPUT = "/home/daytona/workspace/neet-pg/NEET_PG_Study_Schedule_v2.pdf"
# ── Colours ────────────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1a3a5c")
C_TEAL = colors.HexColor("#0e7c7b")
C_GOLD = colors.HexColor("#f4a261")
C_RED = colors.HexColor("#e63946")
C_GREEN = colors.HexColor("#2d6a4f")
C_ORANGE = colors.HexColor("#e76f51")
C_PURPLE = colors.HexColor("#6d3b8e")
C_LGREY = colors.HexColor("#f0f4f8")
C_MGREY = colors.HexColor("#c9d6e3")
C_YELLOW = colors.HexColor("#fff3cd")
C_WHITE = colors.white
C_BLACK = colors.black
C_DUTY_NIGHT = colors.HexColor("#fce4ec")
C_DUTY_MORN = colors.HexColor("#e3f2fd")
C_DUTY_AFT = colors.HexColor("#f3e5f5")
C_STUDY = colors.HexColor("#e8f5e9")
def S(name, **kw):
return ParagraphStyle(name, **kw)
TITLE = S("T", fontSize=24, leading=30, textColor=C_WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)
SUBTITLE= S("ST", fontSize=12, leading=16, textColor=C_GOLD, fontName="Helvetica", alignment=TA_CENTER)
META = S("M", fontSize=9, leading=12, textColor=C_WHITE, fontName="Helvetica", alignment=TA_CENTER)
SEC = S("SH", fontSize=12, leading=15, textColor=C_WHITE, fontName="Helvetica-Bold", alignment=TA_LEFT)
SUBH = S("SU", fontSize=10, leading=13, textColor=C_NAVY, fontName="Helvetica-Bold", spaceBefore=4, spaceAfter=2)
BODY = S("B", fontSize=8.5,leading=12, textColor=C_BLACK, fontName="Helvetica")
BULL = S("Bu", fontSize=8.5,leading=12, textColor=C_BLACK, fontName="Helvetica", leftIndent=12, spaceAfter=1)
CELL = S("Ce", fontSize=7.5,leading=10, textColor=C_BLACK, fontName="Helvetica")
CELL_B = S("CB", fontSize=7.5,leading=10, textColor=C_NAVY, fontName="Helvetica-Bold")
CELL_C = S("CC", fontSize=7.5,leading=10, textColor=C_BLACK, fontName="Helvetica", alignment=TA_CENTER)
def sp(h=4): return Spacer(1, h*mm)
def sec_header(title, bg=C_NAVY):
t = Table([[Paragraph(title, SEC)]], colWidths=[180*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
return t
def on_page(canvas, doc):
w, h = A4
canvas.saveState()
canvas.setFillColor(C_NAVY)
canvas.rect(0, h-20*mm, w, 20*mm, fill=1, stroke=0)
canvas.setFont("Helvetica-Bold", 8.5)
canvas.setFillColor(C_WHITE)
canvas.drawString(15*mm, h-13*mm, "NEET PG 2026 - Study Schedule | Zainab Ma'am BnB + Marrow | Starting from Zero")
canvas.setFont("Helvetica", 8)
canvas.drawRightString(w-15*mm, h-13*mm, f"Page {doc.page} | Exam: 30 Aug 2026")
canvas.setStrokeColor(C_MGREY)
canvas.setLineWidth(0.5)
canvas.line(15*mm, 12*mm, w-15*mm, 12*mm)
canvas.setFont("Helvetica", 7)
canvas.setFillColor(colors.HexColor("#888888"))
canvas.drawCentredString(w/2, 8*mm, "Core: Zainab Ma'am BnB Lectures (watch first) → Marrow PYQ (same day) → Marrow GT (weekly)")
canvas.restoreState()
# ═══════════════════════════════════════════════════════════════════════════
# ZAINAB BNB LECTURE PLAYLIST - subject-wise (HY topics only for 52 days)
# ═══════════════════════════════════════════════════════════════════════════
ZAINAB_PLAYLIST = {
"PSM": [
("PSM-1", "Epidemiology basics, study designs, bias, causality (Bradford Hill)"),
("PSM-2", "Biostatistics: sensitivity/specificity, tests, sampling"),
("PSM-3", "National Health Programmes: RCH, RNTCP, NLEP, NVBDCP"),
("PSM-4", "Immunisation: UIP schedule, cold chain, vaccine storage"),
("PSM-5", "Nutrition: PEM, deficiency diseases, national nutrition programmes"),
("PSM-6", "Demography + vital statistics + screening concepts"),
],
"Medicine": [
("Med-1", "Cardiology: IHD, STEMI, arrhythmias, CCF (High yield)"),
("Med-2", "Cardiology: valvular diseases, cardiomyopathy, pericarditis"),
("Med-3", "Respiratory: COPD, asthma, ILD, pleural effusion, TB"),
("Med-4", "Nephrology: CKD, nephrotic/nephritic, RTA, electrolytes"),
("Med-5", "Endocrinology: DM, thyroid, adrenal, pituitary"),
("Med-6", "Gastroenterology: hepatitis, cirrhosis, IBD, malabsorption"),
("Med-7", "Haematology: anaemia types, bleeding disorders, leukaemias"),
("Med-8", "Neurology: stroke, meningitis, epilepsy, movement disorders"),
],
"Surgery": [
("Surg-1", "GI surgery: oesophagus, stomach, duodenal ulcer, appendix"),
("Surg-2", "Hepatobiliary: liver abscess, cholecystitis, portal HTN, pancreatitis"),
("Surg-3", "Breast: benign + malignant, staging, treatment"),
("Surg-4", "Thyroid + parathyroid: classification, surgery, malignancy"),
("Surg-5", "Hernias, intestinal obstruction, peritonitis"),
("Surg-6", "Urology: BPH, renal stones, bladder + renal tumours"),
("Surg-7", "Vascular: varicose veins, PAD, DVT + surgical emergencies overview"),
],
"OBG": [
("OBG-1", "Normal pregnancy, ANC, partograph, Bishop score, labour"),
("OBG-2", "APH: placenta praevia vs abruption + management"),
("OBG-3", "Hypertensive disorders: pre-eclampsia, eclampsia, HELLP"),
("OBG-4", "PPH, puerperal sepsis, retained placenta, molar pregnancy"),
("OBG-5", "IUGR, PROM, preterm labour, post-dates"),
("OBG-6", "Gynaecology: PCOS, endometriosis, fibroids, DUB"),
("OBG-7", "Gynaecological malignancies: Ca Cervix, Endometrium, Ovary"),
("OBG-8", "Contraception, infertility, menopause"),
],
"Pharmacology": [
("Pharma-1", "Pharmacokinetics + pharmacodynamics: basics, first pass, half-life"),
("Pharma-2", "Autonomic pharmacology: cholinergic, adrenergic drugs"),
("Pharma-3", "CVS pharmacology: antihypertensives, antiarrhythmics, antianginals"),
("Pharma-4", "CNS pharmacology: sedatives, antiepileptics, antipsychotics, antidepressants"),
("Pharma-5", "Analgesics + NSAIDs + opioids + drugs of abuse"),
("Pharma-6", "Antimicrobials: penicillins, cephalosporins, macrolides, quinolones, aminoglycosides"),
("Pharma-7", "Antimicrobials: anti-TB, antifungals, antivirals, antiparasitals"),
("Pharma-8", "Drug of choice list + important ADRs + drug interactions"),
],
"Pathology": [
("Path-1", "Cell injury, death, apoptosis, adaptations, free radicals"),
("Path-2", "Inflammation: acute, chronic, granuloma, healing and repair"),
("Path-3", "Haematology: RBC disorders - anaemias, haemoglobinopathies"),
("Path-4", "Haematology: WBC disorders - leukaemias, lymphomas"),
("Path-5", "Neoplasia: molecular basis, oncogenes, tumour suppressors, carcinogens"),
("Path-6", "Cardiovascular pathology: atherosclerosis, MI, cardiomyopathy"),
("Path-7", "Organ pathology: liver, kidney, lung (high-yield for exams)"),
],
"Microbiology": [
("Micro-1", "Bacteriology part 1: Gram+ve cocci - Staph, Strep, Enterococcus"),
("Micro-2", "Bacteriology part 2: Gram-ve rods - E.coli, Salmonella, Shigella, Vibrio"),
("Micro-3", "Bacteriology part 3: Mycobacteria TB + leprosy, STIs, spirochaetes"),
("Micro-4", "Virology: hepatitis viruses, HIV, herpesviruses, respiratory viruses"),
("Micro-5", "Parasitology: malaria, amoeba, giardia, helminths - high yield"),
("Micro-6", "Mycology + immunology: innate/adaptive, hypersensitivity, vaccines"),
],
"Biochemistry": [
("Biochem-1", "Carbohydrate metabolism: glycolysis, TCA, glycogen, DM biochemistry"),
("Biochem-2", "Lipid metabolism: beta-oxidation, ketogenesis, lipoproteins, hyperlipidaemias"),
("Biochem-3", "Protein + amino acid metabolism: urea cycle, inborn errors (PKU, alkaptonuria)"),
("Biochem-4", "Enzymes, vitamins (water + fat soluble), minerals, trace elements"),
("Biochem-5", "Molecular biology: DNA replication, transcription, translation, mutations"),
],
"Anatomy": [
("Anat-1", "Upper limb: brachial plexus, nerve injuries, compartments (HY only)"),
("Anat-2", "Lower limb: nerve injuries, hip, knee, foot (HY only)"),
("Anat-3", "Head & neck: cranial nerves, foramina, triangles, thyroid/parathyroid anatomy"),
("Anat-4", "Embryology: heart, gut, CNS, pharyngeal arches, common anomalies"),
],
"Physiology": [
("Physio-1", "CVS physiology: cardiac cycle, pressures, Frank-Starling, ECG"),
("Physio-2", "Renal physiology: GFR, tubular function, concentration, RAS"),
("Physio-3", "Respiratory physiology: spirometry, compliance, V/Q, oxygen transport"),
("Physio-4", "Endocrine + neuro physiology: pituitary, thyroid, adrenal, synapses"),
],
}
# ═══════════════════════════════════════════════════════════════════════════
# HOW TO STUDY WITH ZAINAB MA'AM (first-timer strategy)
# ═══════════════════════════════════════════════════════════════════════════
ZAINAB_METHOD = [
("Step 1: Watch lecture", "Play Zainab ma'am's BnB lecture for the topic at 1.25-1.5x speed. Keep a notepad. Write only the HIGH-YIELD facts she emphasises (she usually says 'this is important' or 'this comes in exam')."),
("Step 2: Same-day PYQ", "Immediately after the lecture (same sitting if possible), open Marrow and do the subject-wise PYQ for that exact topic. This cements what you just watched."),
("Step 3: Analyse wrongs", "For every wrong answer in Marrow: go back to that timestamp in the BnB lecture OR read the Marrow explanation. Do NOT skip this step."),
("Step 4: Quick notes", "Make a 1-page handwritten or phone-note of the top 10 facts from that lecture. You will use this for rapid revision later."),
("Step 5: Next day flashcards", "Activate Marrow flashcards for the topics you studied yesterday. Review for 15-20 min each morning before starting new content."),
("Step 6: Weekly revision", "Every Sunday (or post-night rest day): re-read your quick notes from the whole week. Do a 50Q rapid test on Marrow for those topics."),
("CRITICAL rule", "Never watch a lecture WITHOUT doing PYQ the same day. Watching alone = 20% retention. Watching + PYQ = 70%+ retention. This is non-negotiable."),
]
# ═══════════════════════════════════════════════════════════════════════════
# 7-WEEK PLAN (with Zainab BnB lecture numbers)
# ═══════════════════════════════════════════════════════════════════════════
WEEK_PLANS = [
{
"week": 1, "dates": "Jul 09 - Jul 15", "color": C_TEAL,
"theme": "PSM (complete) + Medicine (Cardiology + Resp)",
"day_plan": [
("Thu Jul 10", "Afternoon Duty", "PSM-1 (Epidemiology, study designs)", "Marrow PSM PYQ: Epidemiology (50Q)"),
("Fri Jul 11", "Full Study", "PSM-2 (Biostatistics) + PSM-3 (Natl Programmes)", "Marrow PSM PYQ: Biostatistics + Natl Prog (100Q)"),
("Sat Jul 12", "Night Duty", "PSM-4 (Immunisation) - watch before duty", "Marrow flashcards only (phone) during duty"),
("Sun Jul 13", "Post-Night", "Rest until 2pm. PSM-5 (Nutrition) light watch", "Marrow PSM 50Q (no timer)"),
("Mon Jul 14", "Full Study", "PSM-6 (Demography) + Med-1 (Cardio: IHD, STEMI)", "Marrow PSM complete revision 50Q + Med Cardio 50Q"),
("Tue Jul 15", "Morning Duty", "Med-2 (Valvular + cardiomyopathy) before duty", "Marrow Medicine Cardiology PYQ 60Q after duty"),
],
"marrow_gt": "No GT this week. Build base. Do Marrow subject-wise PYQ only.",
"target": "PSM fully done. Medicine Cardiology started. Marrow PSM accuracy >60%.",
"bnb_lectures": "PSM-1 to PSM-6 + Med-1 + Med-2 (8 lectures total)"
},
{
"week": 2, "dates": "Jul 16 - Jul 22", "color": C_ORANGE,
"theme": "Medicine (complete) + Surgery (start)",
"day_plan": [
("Wed Jul 16", "Full Study", "Med-3 (Resp) + Med-4 (Nephrology)", "Marrow Medicine Resp + Nephro PYQ (100Q)"),
("Thu Jul 17", "Afternoon Duty", "Med-5 (Endocrinology) morning watch", "Marrow Endocrinology PYQ 60Q after duty"),
("Fri Jul 18", "Full Study", "Med-6 (Gastro) + Med-7 (Haematology)", "Marrow Medicine GI + Haem PYQ (100Q)"),
("Sat Jul 19", "Night Duty", "Med-8 (Neurology) - watch pre-duty", "Marrow Neurology flashcards during quiet time"),
("Sun Jul 20", "Post-Night", "Rest. Surg-1 (GI Surgery) light watch", "Marrow Medicine full subject 50Q revision"),
("Mon Jul 21", "Full Study", "Surg-2 (Hepatobiliary) + Surg-3 (Breast)", "Marrow Surgery GI + Breast PYQ (100Q)"),
("Tue Jul 22", "Morning Duty", "Surg-4 (Thyroid) pre-duty", "Marrow Thyroid surgery PYQ 60Q after duty"),
],
"marrow_gt": "Sat post-duty (if energy): Marrow Mini-test PSM+Medicine (50Q). Analyse Sunday morning.",
"target": "Medicine complete. Surgery 50% done. Marrow Medicine PYQ accuracy >55%.",
"bnb_lectures": "Med-3 to Med-8 + Surg-1 to Surg-4 (10 lectures)"
},
{
"week": 3, "dates": "Jul 23 - Jul 29", "color": C_PURPLE,
"theme": "Surgery (complete) + OBG (complete)",
"day_plan": [
("Wed Jul 23", "Full Study", "Surg-5 (Hernias/obstruction) + Surg-6 (Urology)", "Marrow Surgery PYQ (100Q)"),
("Thu Jul 24", "Afternoon Duty", "Surg-7 (Vascular + emergencies) morning", "Marrow Surgery complete subject revision 60Q"),
("Fri Jul 25", "Full Study", "OBG-1 (Normal pregnancy, ANC, labour) + OBG-2 (APH)", "Marrow OBG PYQ Obstetrics (100Q)"),
("Sat Jul 26", "Night Duty", "OBG-3 (Pre-eclampsia/eclampsia) pre-duty", "Marrow OBG flashcards during quiet time"),
("Sun Jul 27", "Post-Night", "Rest. OBG-4 (PPH, molar) light watch", "Marrow Surgery+OBG 50Q light"),
("Mon Jul 28", "Full Study", "OBG-5 (IUGR/PROM) + OBG-6 (PCOS/fibroids)", "Marrow OBG Gynaecology PYQ (100Q)"),
("Tue Jul 29", "Morning Duty", "OBG-7 (Malignancies) + OBG-8 (Contraception) pre-duty", "Marrow OBG complete subject 60Q after duty"),
],
"marrow_gt": "MARROW GT-1 (Sunday post-night, 100Q): PSM + Medicine. Analyse Monday morning.",
"target": "Surgery + OBG complete. GT-1 taken. Review GT-1 weak areas on Monday.",
"bnb_lectures": "Surg-5 to Surg-7 + OBG-1 to OBG-8 (10 lectures)"
},
{
"week": 4, "dates": "Jul 30 - Aug 05", "color": C_RED,
"theme": "Pharmacology (complete) + Pathology (complete)",
"day_plan": [
("Wed Jul 30", "Full Study", "Pharma-1 (PK/PD) + Pharma-2 (Autonomic)", "Marrow Pharmacology PYQ (100Q)"),
("Thu Jul 31", "Afternoon Duty", "Pharma-3 (CVS drugs) morning watch", "Marrow CVS Pharma PYQ 60Q after duty"),
("Fri Aug 01", "Full Study", "Pharma-4 (CNS drugs) + Pharma-5 (Analgesics)", "Marrow CNS Pharma + Analgesics PYQ (100Q)"),
("Sat Aug 02", "Night Duty", "Pharma-6 (Antimicrobials part 1) pre-duty", "Marrow Antimicrobials flashcards during duty"),
("Sun Aug 03", "Post-Night", "Rest. Pharma-7+8 (Anti-infectives + DOC/ADR) light", "Marrow Pharmacology 50Q light"),
("Mon Aug 04", "Full Study", "Path-1 (Cell injury) + Path-2 (Inflammation)", "Marrow Pathology PYQ (100Q)"),
("Tue Aug 05", "Morning Duty", "Path-3 (RBC disorders) pre-duty", "Marrow Pathology Haematology 60Q after duty"),
],
"marrow_gt": "MARROW GT-2 (Sunday, if energy): Surgery + OBG (100Q). Analyse Monday.",
"target": "Pharmacology complete. Pathology 50% done. All Tier-1 subjects in progress.",
"bnb_lectures": "Pharma-1 to Pharma-8 + Path-1 to Path-3 (11 lectures)"
},
{
"week": 5, "dates": "Aug 06 - Aug 12", "color": C_GREEN,
"theme": "Pathology (complete) + Microbiology + Biochemistry",
"day_plan": [
("Wed Aug 06", "Full Study", "Path-4 (WBC/lymphomas) + Path-5 (Neoplasia)", "Marrow Pathology PYQ (100Q)"),
("Thu Aug 07", "Afternoon Duty", "Path-6+7 (CVS + Organ path) morning watch", "Marrow Pathology complete subject 60Q"),
("Fri Aug 08", "Full Study", "Micro-1 (Gram+ve cocci) + Micro-2 (Gram-ve rods)", "Marrow Microbiology Bacteriology PYQ (100Q)"),
("Sat Aug 09", "Night Duty", "Micro-3 (Mycobacteria, STIs) pre-duty", "Marrow Micro flashcards during duty"),
("Sun Aug 10", "Post-Night", "Rest. Micro-4 (Virology) light watch", "Marrow Micro + Path 50Q light"),
("Mon Aug 11", "Full Study", "Micro-5+6 (Parasitology+Immunology) + Biochem-1+2", "Marrow Micro complete + Biochem PYQ (120Q)"),
("Tue Aug 12", "Morning Duty", "Biochem-3+4 (Protein+Vitamins) pre-duty watch", "Marrow Biochemistry PYQ 60Q after duty"),
],
"marrow_gt": "MARROW GT-3 (Sunday): Full 200Q Grand Test - all subjects covered so far. CRITICAL milestone.",
"target": "Pathology + Micro + Biochem done. GT-3 full test taken. Identify top 3 weak subjects.",
"bnb_lectures": "Path-4 to Path-7 + Micro-1 to Micro-6 + Biochem-1 to Biochem-4 (14 lectures)"
},
{
"week": 6, "dates": "Aug 13 - Aug 19", "color": C_NAVY,
"theme": "Anatomy + Physiology + Minor Subjects + FULL REVISION",
"day_plan": [
("Wed Aug 13", "Full Study", "Anat-1+2 (Limb nerve injuries HY) + Anat-3+4 (Head+Embryology)", "Marrow Anatomy PYQ (100Q)"),
("Thu Aug 14", "Afternoon Duty", "Physio-1+2 (CVS + Renal) morning watch", "Marrow Physiology PYQ 60Q after duty"),
("Fri Aug 15", "Full Study", "Physio-3+4 (Resp + Endocrine) + Minor subjects PYQ (Ophth+ENT)", "Marrow Physio + Ophth + ENT PYQ (120Q)"),
("Sat Aug 16", "Night Duty", "Marrow Minor subjects: Ortho+Derma+Psych PYQ (phone)", "Minor subjects flashcards + Forensic/Radiology/Anaes PYQ"),
("Sun Aug 17", "Post-Night", "Rest. GT-4: 200Q full syllabus timed test", "MARROW GT-4 full mock (take after 3pm, rested)"),
("Mon Aug 18", "Full Study", "GT-4 ANALYSIS: revisit every wrong answer in BnB", "Revision of GT-4 weak subjects (Marrow PYQ re-do)"),
("Tue Aug 19", "Morning Duty", "Rapid revision: PSM + Medicine notes pre-duty", "Marrow PSM + Medicine revision test 60Q after duty"),
],
"marrow_gt": "GT-4 on Sunday (full 200Q timed). Monday = full GT analysis day. This week is the turning point.",
"target": "All subjects covered. GT-4 score benchmarked. Weak areas identified for final sprint.",
"bnb_lectures": "Anat-1 to Anat-4 + Physio-1 to Physio-4 (8 lectures - only HY). Minor = Marrow PYQ only."
},
{
"week": 7, "dates": "Aug 20 - Aug 30", "color": C_RED,
"theme": "FINAL SPRINT - Mock Tests + Rapid Revision ONLY (NO new topics)",
"day_plan": [
("Wed Aug 20", "Full Study", "REVISION: Surgery + OBG notes + Marrow flashcards", "Marrow Surgery + OBG 100Q revision test"),
("Thu Aug 21", "Afternoon Duty", "REVISION: Pharmacology DOC + ADR list morning", "Marrow Pharma 60Q revision test after duty"),
("Fri Aug 22", "Full Study", "GT-5: Full 200Q timed mock. Analyse same evening.", "MARROW GT-5 full mock test"),
("Sat Aug 23", "Night Duty", "REVISION: Pathology + Micro quick notes pre-duty", "Marrow flashcards on phone during duty"),
("Sun Aug 24", "Post-Night", "Rest. GT-5 analysis + revision of weak points", "Review GT-5 wrong answers"),
("Mon Aug 25", "Full Study", "GT-6: Full 200Q timed mock. Analyse same day.", "MARROW GT-6 full mock test"),
("Tue Aug 26", "Morning Duty", "Rapid revision: Biochem + Anatomy quick notes", "Marrow 50Q rapid subject test after duty"),
("Wed Aug 27", "Full Study", "GT-7: Final full mock. Identify last weak spots.", "MARROW GT-7 full mock test"),
("Thu Aug 28", "Afternoon Duty", "Rapid revision ONLY: High-yield PDF + flashcards", "Marrow flashcards only. NO new study."),
("Fri Aug 29", "Full Study", "FINAL REVISION DAY: Quick notes only, flashcards, sleep early", "50Q rapid revision. STOP by 8pm. Sleep by 10pm."),
("Sat Aug 30", "EXAM DAY", "Wake 5:30am. Light breakfast. Reach centre early. Trust your prep.", "NEET PG 2026 EXAM"),
],
"marrow_gt": "GT-5 (Aug 22), GT-6 (Aug 25), GT-7 (Aug 27). After Aug 27 = ONLY flashcards + quick notes.",
"target": "3 full GTs done. No new topics after Aug 20. Sleep 7h every night. Trust your 52 days.",
"bnb_lectures": "ZERO new lectures in Week 7. Only revision of your own notes + Marrow flashcards."
},
]
# ═══════════════════════════════════════════════════════════════════════════
# BUILD PDF
# ═══════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=12*mm, rightMargin=12*mm,
topMargin=14*mm, bottomMargin=20*mm,
title="NEET PG 2026 Schedule - Zainab Ma'am BnB Edition",
author="Orris AI"
)
story = []
# ── COVER ─────────────────────────────────────────────────────────────────
cover = Table([
[Paragraph("NEET PG 2026", TITLE)],
[Paragraph("Personalised Study Schedule - Starting from Zero", SUBTITLE)],
[Paragraph("Core: Zainab Ma'am BnB Lectures | MCQ: Marrow PYQ + Grand Tests", META)],
[Paragraph("Medical Officer | 3 Duties/Week | 52 Days | Exam: 30 Aug 2026", META)],
], colWidths=[180*mm])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_NAVY),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
story.append(cover)
story.append(sp(4))
# ── OVERVIEW BOX ─────────────────────────────────────────────────────────
story.append(sec_header("YOUR PERSONALISED OVERVIEW", C_TEAL))
overview = [
["Start date", "Jul 09, 2026 (Thu)", "Exam date", "Aug 30, 2026 (Sun)"],
["Total days", "52 days", "Core reading source", "Zainab Ma'am - BnB Lectures"],
["MCQ practice", "Marrow (PYQ + Grand Tests)", "Daily MCQ target", "80-150 Q (duty days: 50-80 Q)"],
["Weekly duties", "3/week: 1 Morning + 1 Afternoon + 1 Night", "Full study days/week", "4 days"],
["Total BnB lectures", "~58 lectures (all subjects)", "Study hrs/week", "~42h full week, ~30h duty week"],
["Grand Tests planned", "7 GTs total (GT-1 to GT-7)", "Final sprint start", "Aug 20 (no new topics after this)"],
]
ov = Table(overview, colWidths=[35*mm, 50*mm, 42*mm, 53*mm])
ov.setStyle(TableStyle([
("FONTSIZE", (0,0),(-1,-1), 8),
("FONTNAME", (0,0),(0,-1), "Helvetica-Bold"),
("FONTNAME", (0,0),(2,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,0),(0,-1), C_NAVY),
("TEXTCOLOR", (0,0),(2,-1), C_NAVY),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
for i in range(len(overview)):
if i % 2 == 0:
ov.setStyle(TableStyle([("BACKGROUND",(0,i),(-1,i), C_LGREY)]))
story.append(ov)
story.append(sp(4))
# ── HOW TO STUDY WITH ZAINAB MA'AM ─────────────────────────────────────────
story.append(sec_header("HOW TO STUDY WITH ZAINAB MA'AM BnB (First-Timer Method)", C_PURPLE))
story.append(sp(2))
zm_data = [["Step", "What to Do & Why"]]
for step in ZAINAB_METHOD:
zm_data.append([step[0], step[1]])
zm_t = Table(zm_data, colWidths=[35*mm, 145*mm])
zm_s = [
("BACKGROUND", (0,0),(-1,0), C_PURPLE),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1),(0,-1), C_NAVY),
]
for i in range(1, len(zm_data)):
if i % 2 == 0:
zm_s.append(("BACKGROUND",(0,i),(-1,i), C_LGREY))
if zm_data[i][0] == "CRITICAL rule":
zm_s.append(("BACKGROUND",(0,i),(-1,i), colors.HexColor("#ffe0e0")))
zm_s.append(("FONTNAME",(0,i),(-1,i), "Helvetica-Bold"))
zm_t.setStyle(TableStyle(zm_s))
story.append(zm_t)
story.append(sp(4))
# ── SUBJECT-WISE BNB LECTURE LIST ──────────────────────────────────────────
story.append(sec_header("ZAINAB MA'AM BnB LECTURES - Subject-Wise Playlist", C_TEAL))
story.append(sp(2))
subj_colors = {
"PSM": C_TEAL, "Medicine": C_NAVY, "Surgery": C_ORANGE,
"OBG": C_PURPLE, "Pharmacology": C_RED, "Pathology": C_GREEN,
"Microbiology": colors.HexColor("#5c6bc0"), "Biochemistry": colors.HexColor("#00695c"),
"Anatomy": colors.HexColor("#4e342e"), "Physiology": colors.HexColor("#1565c0"),
}
tier_map = {
"PSM":"TIER 1","Medicine":"TIER 1","Surgery":"TIER 1","OBG":"TIER 1",
"Pharmacology":"TIER 1","Pathology":"TIER 1","Microbiology":"TIER 2",
"Biochemistry":"TIER 2","Anatomy":"TIER 2","Physiology":"TIER 2",
}
playlist_rows = [["Subject", "Lecture Code", "Topics to Cover", "Tier"]]
for subj, lectures in ZAINAB_PLAYLIST.items():
for lec in lectures:
playlist_rows.append([subj, lec[0], lec[1], tier_map.get(subj, "TIER 2")])
pl_t = Table(playlist_rows, colWidths=[28*mm, 22*mm, 115*mm, 15*mm])
pl_s = [
("BACKGROUND", (0,0),(-1,0), C_NAVY),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 7.5),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "TOP"),
]
current_subj = None
for i in range(1, len(playlist_rows)):
row_subj = playlist_rows[i][0]
if i % 2 == 0:
pl_s.append(("BACKGROUND",(1,i),(-2,i), C_LGREY))
tier = playlist_rows[i][3]
if tier == "TIER 1":
pl_s.append(("BACKGROUND",(-1,i),(-1,i), colors.HexColor("#c8f7c5")))
pl_s.append(("FONTNAME", (-1,i),(-1,i), "Helvetica-Bold"))
else:
pl_s.append(("BACKGROUND",(-1,i),(-1,i), C_YELLOW))
if row_subj != current_subj:
sc = subj_colors.get(row_subj, C_NAVY)
pl_s.append(("BACKGROUND",(0,i),(0,i), sc))
pl_s.append(("TEXTCOLOR", (0,i),(0,i), C_WHITE))
pl_s.append(("FONTNAME", (0,i),(0,i), "Helvetica-Bold"))
current_subj = row_subj
else:
pl_s.append(("TEXTCOLOR", (0,i),(0,i), colors.HexColor("#cccccc")))
pl_s.append(("FONTSIZE", (0,i),(0,i), 6))
pl_t.setStyle(TableStyle(pl_s))
story.append(pl_t)
story.append(sp(2))
story.append(Paragraph("★ Total: ~58 lectures. Watch 1-2 per study session. Minor subjects (Ophth, ENT, Ortho, Derma, Psych, Forensic, Radiology, Anaesthesia) = Marrow PYQ only, no BnB needed.",
S("Note", fontSize=8, fontName="Helvetica-Bold", textColor=C_RED, leftIndent=4)))
story.append(sp(4))
story.append(PageBreak())
# ── WEEK-BY-WEEK DETAILED PLAN ───────────────────────────────────────────
story.append(sec_header("WEEK-BY-WEEK DETAILED STUDY PLAN", C_NAVY))
story.append(sp(2))
for wp in WEEK_PLANS:
# Week header
wh = Table([[Paragraph(
f"WEEK {wp['week']} | {wp['dates']} | {wp['theme']}",
S(f"WH{wp['week']}", fontSize=10, fontName="Helvetica-Bold", textColor=C_WHITE)
)]], colWidths=[180*mm])
wh.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), wp["color"]),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
story.append(wh)
# BnB lectures for the week
bnb_row = Table([[
Paragraph("BnB Lectures:", CELL_B),
Paragraph(wp["bnb_lectures"], CELL),
Paragraph("Marrow GT:", CELL_B),
Paragraph(wp["marrow_gt"], CELL),
]], colWidths=[22*mm, 68*mm, 22*mm, 68*mm])
bnb_row.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_YELLOW),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("FONTSIZE", (0,0),(-1,-1), 7.5),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story.append(bnb_row)
# Day-by-day table
day_data = [["Date", "Day Type", "BnB Lecture to Watch", "Marrow Task"]]
for d in wp["day_plan"]:
day_data.append(list(d))
day_styles = [
("BACKGROUND", (0,0),(-1,0), C_MGREY),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 7.5),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "TOP"),
]
for i in range(1, len(day_data)):
dtype = day_data[i][1]
row_color = {
"Full Study": C_STUDY,
"Morning Duty": C_DUTY_MORN,
"Afternoon Duty": C_DUTY_AFT,
"Night Duty": C_DUTY_NIGHT,
"Post-Night": C_DUTY_NIGHT,
"EXAM DAY": colors.HexColor("#ffcdd2"),
}.get(dtype, C_LGREY)
day_styles.append(("BACKGROUND", (0,i),(-1,i), row_color))
if "Duty" in dtype or dtype in ("Post-Night", "EXAM DAY"):
day_styles.append(("TEXTCOLOR", (1,i),(1,i), C_RED))
day_styles.append(("FONTNAME", (1,i),(1,i), "Helvetica-Bold"))
day_t = Table(day_data, colWidths=[22*mm, 28*mm, 70*mm, 60*mm])
day_t.setStyle(TableStyle(day_styles))
story.append(day_t)
# Milestone
mil = Table([[
Paragraph("Week Target:", CELL_B),
Paragraph(wp["target"], S("tgt", fontSize=7.5, fontName="Helvetica",
textColor=C_GREEN if "complete" in wp["target"].lower() or "done" in wp["target"].lower() else C_NAVY)),
]], colWidths=[25*mm, 155*mm])
mil.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_STUDY),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 4),
("FONTSIZE", (0,0),(-1,-1), 8),
]))
story.append(mil)
story.append(sp(5))
story.append(PageBreak())
# ── DAILY TIMETABLES ──────────────────────────────────────────────────────
story.append(sec_header("DAILY TIMETABLES BY DAY TYPE", C_TEAL))
story.append(sp(2))
timetables = {
"FULL STUDY DAY (Mon / Wed / Fri)": {
"color": C_STUDY,
"slots": [
("05:30", "Wake up, freshen up"),
("06:00 - 08:30", "BnB Lecture 1 - Zainab ma'am (watch at 1.25x, take notes)"),
("08:30 - 10:00", "Marrow PYQ - Lecture 1 topic (50Q + full analysis of wrongs)"),
("10:00 - 10:30", "Break + breakfast if not eaten"),
("10:30 - 12:30", "BnB Lecture 2 - Zainab ma'am (watch + notes)"),
("12:30 - 13:30", "Marrow PYQ - Lecture 2 topic (50Q + analysis)"),
("13:30 - 14:30", "Lunch + rest (mandatory 30 min rest)"),
("14:30 - 15:00", "Review yesterday's Marrow flashcards"),
("15:00 - 17:00", "Marrow PYQ continuation OR subject revision (50Q)"),
("17:00 - 17:30", "Tea break + short walk"),
("17:30 - 19:00", "Quick notes review + weak area re-read from BnB"),
("19:00 - 20:00", "Dinner + relax"),
("20:00 - 21:30", "Marrow flashcards (today's topics) + 30Q rapid fire"),
("21:30 - 22:00", "Write tomorrow's plan. Sleep by 22:00 (7h sleep)"),
]
},
"MORNING DUTY DAY (Tue - Duty 7am to 2pm)": {
"color": C_DUTY_MORN,
"slots": [
("05:30 - 07:00", "BnB Lecture (1.5h) - watch before duty. Just watch, no PYQ yet."),
("07:00 - 14:00", "Hospital morning duty"),
("14:00 - 14:30", "Lunch"),
("14:30 - 15:00", "Short rest / nap"),
("15:00 - 17:00", "Marrow PYQ for morning's lecture (60-70Q + analysis)"),
("17:00 - 17:30", "Tea break"),
("17:30 - 18:30", "BnB Lecture 2 (1h watch) - if energy allows"),
("18:30 - 19:30", "Marrow flashcards for today's topics"),
("19:30 - 20:00", "Dinner"),
("20:00 - 21:00", "30Q light revision (phone, no pressure)"),
("21:00", "Sleep (early night - post-duty recovery)"),
]
},
"AFTERNOON DUTY DAY (Thu - Duty 12pm to 8pm)": {
"color": C_DUTY_AFT,
"slots": [
("06:00 - 08:30", "BnB Lecture 1 - best focus window of the day (2.5h)"),
("08:30 - 10:00", "Marrow PYQ - Lecture 1 topic (60Q + analysis)"),
("10:00 - 10:30", "Breakfast + break"),
("10:30 - 12:00", "BnB Lecture 2 (watch + notes, 1.5h)"),
("12:00 - 12:30", "Lunch + prep for duty"),
("12:30 - 20:00", "Hospital afternoon/evening duty"),
("20:00 - 21:00", "Dinner"),
("21:00 - 22:00", "Marrow flashcards + 30Q light revision (phone)"),
("22:00", "Sleep"),
]
},
"NIGHT DUTY DAY (Sat - Duty from ~8pm)": {
"color": C_DUTY_NIGHT,
"slots": [
("08:00 - 09:00", "Wake up, breakfast"),
("09:00 - 11:00", "BnB Lecture (1-2 lectures watch - lighter day)"),
("11:00 - 12:30", "Marrow PYQ for lecture (50Q + analysis)"),
("12:30 - 13:30", "Lunch + rest / nap"),
("13:30 - 18:00", "Personal time / rest / admin work"),
("18:00 - 19:30", "Marrow flashcards review + 30Q quick revision"),
("19:30 - 20:00", "Dinner + prep for night duty"),
("20:00 - 08:00", "Night duty. If quiet hours: Marrow flashcards on phone (30-50Q)"),
]
},
"POST-NIGHT REST DAY (Sun - After night duty)": {
"color": C_DUTY_NIGHT,
"slots": [
("08:00 - 10:00", "Reach home, light breakfast, sleep. DO NOT STUDY."),
("10:00 - 14:00", "Sleep (mandatory - memory consolidation happens here)"),
("14:00 - 15:00", "Light lunch + gentle wakeup"),
("15:00 - 17:00", "LIGHT revision only: Marrow flashcards or 50Q PYQ (no timer, no pressure)"),
("17:00 - 17:30", "Tea + relax"),
("17:30 - 19:00", "Grand Test (if scheduled for this week) OR weekly revision of notes"),
("19:00 - 20:00", "Dinner + family time"),
("20:00 - 21:00", "Plan next week. Review what's done, what's pending."),
("21:00", "Sleep early (recover for Mon full study day)"),
]
},
}
for dtype, tdata in timetables.items():
th = Table([[Paragraph(dtype, S(f"TH_{dtype[:5]}", fontSize=9, fontName="Helvetica-Bold",
textColor=C_NAVY))]], colWidths=[180*mm])
th.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), tdata["color"]),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("BOX", (0,0),(-1,-1), 1, C_MGREY),
]))
story.append(th)
tt_rows = [["Time", "Activity"]]
for slot in tdata["slots"]:
tt_rows.append([slot[0], slot[1]])
tt = Table(tt_rows, colWidths=[40*mm, 140*mm])
tts = [
("BACKGROUND", (0,0),(-1,0), C_NAVY),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1),(0,-1), C_NAVY),
]
for i in range(1, len(tt_rows)):
if i % 2 == 0:
tts.append(("BACKGROUND",(0,i),(-1,i), C_LGREY))
tt.setStyle(TableStyle(tts))
story.append(tt)
story.append(sp(4))
# ── FINAL BOX ──────────────────────────────────────────────────────────────
story.append(PageBreak())
story.append(sec_header("STARTING-FROM-ZERO MINDSET RULES", C_RED))
story.append(sp(2))
rules = [
("Rule 1", "Start TODAY - not tomorrow, not Monday. The best time was yesterday. The second best time is right now. Play PSM-1 today."),
("Rule 2", "Watch → PYQ same day. ALWAYS. This is the entire system. If you skip PYQ, the lecture was wasted time."),
("Rule 3", "Done is better than perfect. A 70% understood lecture + PYQ beats a 100% understood lecture with no MCQ practice."),
("Rule 4", "On duty days, watch even 1 lecture. Even 30 minutes of BnB + 30 Marrow MCQs = productive duty day."),
("Rule 5", "Never study after a night duty. Sleep is revision. Your brain consolidates memory during sleep - this is neuroscience, not laziness."),
("Rule 6", "After every GT, identify your BOTTOM 3 subjects. Spend the next 2 days specifically on those. This is how rank improves."),
("Rule 7", "After Aug 20 - NO new Zainab ma'am lectures. Only Marrow GTs + your own notes + flashcards. The brain needs to retrieve, not absorb."),
("Rule 8", "You have practised medicine. You know more than you think. Most NEET PG questions are clinical - your real patient experience is an asset."),
]
r_data = [["Rule", "Principle"]]
for r in rules:
r_data.append([r[0], r[1]])
r_t = Table(r_data, colWidths=[18*mm, 162*mm])
r_s = [
("BACKGROUND", (0,0),(-1,0), C_RED),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.3, C_MGREY),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1),(0,-1), C_RED),
]
for i in range(1, len(r_data)):
if i % 2 == 0:
r_s.append(("BACKGROUND",(0,i),(-1,i), C_LGREY))
r_t.setStyle(TableStyle(r_s))
story.append(r_t)
story.append(sp(5))
mot = Table([[Paragraph(
"52 days. Zainab ma'am's BnB. Marrow. Discipline. Sleep. "
"That is the entire formula. Thousands of MOs and working doctors have cleared NEET PG "
"starting from zero. You are not behind - you are exactly at the start line, and the race begins today.",
S("Mot", fontSize=9.5, fontName="Helvetica-Bold", textColor=C_NAVY,
alignment=TA_CENTER, leading=14)
)]], colWidths=[180*mm])
mot.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_GOLD),
("TOPPADDING", (0,0),(-1,-1), 12),
("BOTTOMPADDING", (0,0),(-1,-1), 12),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
]))
story.append(mot)
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/neet-pg && python generate_schedule_v2.py 2>&1
ls -lh /home/daytona/workspace/neet-pg/
NEET PG Study Schedule v2
PDF Document · PDF
Play PSM-1 (Epidemiology + study designs) on Zainab ma'am's BnB. After watching, open Marrow → PYQ → PSM → Epidemiology. Do 50 questions. That is your first session done.