What all can you do?
I am a 3rd year mbbs student I have my university PSM and FMT paper in 15 days How should I study?
How many hours can you study per day? · Where are you right now with these subjects? · Which subject worries you more?
| Day | PSM Topic | FMT Topic |
|---|---|---|
| 1 | Epidemiology - concepts, study designs, bias, causation (Koch's postulates, Hill's criteria) | Introduction to FMT, definitions, courts, types of death |
| 2 | Screening, natural history of disease, levels of prevention, concepts of health | Decomposition, post-mortem changes, time since death |
| 3 | Biostatistics - mean/median/mode, SD, SE, tests (chi square, t-test), p-value, confidence interval | Mechanical asphyxia - hanging, strangulation, drowning, suffocation |
| 4 | National Health Programs - MCH, Family Planning, RCH, immunization schedule | Injuries - abrasion, contusion, laceration, incised wounds, stab wounds |
| 5 | Environmental health - water, air, sanitation, housing; Occupational health basics | Burns, scalds, lightning, heat & cold injuries |
| Day | PSM Topic | FMT Topic |
|---|---|---|
| 6 | Nutrition - PEM, vitamins, deficiency diseases, anthropometry | Firearm injuries - entry/exit wounds, range of fire, GSR |
| 7 | Communicable diseases - malaria, TB, HIV, polio, leprosy (key facts only) | Sexual offences - rape, POCSO, medical examination, documentation |
| 8 | Non-communicable diseases - epidemiology of CVD, DM, cancer, mental health | Toxicology overview - general principles, corrosives, irritants, narcotics |
| 9 | Health administration - PHC, district hospital, ASHA, Anganwadi, IPHS norms | Age estimation - bone ossification, dental age, radiological methods |
| 10 | Reproductive & Child Health, PCPNDT, MTP Act, maternal mortality indicators | Medicolegal aspects - MLC, dying declaration, inquest, exhumation |
Morning (2-2.5 hrs) → Main subject of the day (fresh brain = harder concepts)
Afternoon (1 hr) → PYQ practice OR write one long answer
Evening (1-1.5 hrs) → Second subject revision / notes review
Night (30 min) → Flash recall - close notes, write 5 key points from today
Generate a summary pdf on high yeild PSM topics
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "Created workspace"
mkdir -p /tmp/workspace/psm-notes && cat << 'PYEOF' > /tmp/workspace/psm-notes/generate_psm_pdf.py from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.colors import HexColor, white, black from reportlab.lib.units import mm, cm from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether, PageBreak ) from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY from reportlab.platypus import ListFlowable, ListItem # ── Colour palette ────────────────────────────────────────────────────────── DARK_BLUE = HexColor('#1a3a5c') MED_BLUE = HexColor('#2563a8') LIGHT_BLUE = HexColor('#dbeafe') ACCENT_GOLD = HexColor('#d97706') GREEN = HexColor('#15803d') RED_DARK = HexColor('#b91c1c') LIGHT_GREY = HexColor('#f1f5f9') BORDER_GREY = HexColor('#cbd5e1') TEXT_DARK = HexColor('#1e293b') WHITE = white PAGE_W, PAGE_H = A4 MARGIN = 18*mm doc = SimpleDocTemplate( '/tmp/workspace/psm-notes/PSM_High_Yield_Summary.pdf', pagesize=A4, leftMargin=MARGIN, rightMargin=MARGIN, topMargin=20*mm, bottomMargin=20*mm, title='PSM High-Yield Summary – MBBS 3rd Year', author='Orris AI' ) styles = getSampleStyleSheet() def s(name, **kw): return ParagraphStyle(name, **kw) # Custom styles TITLE_S = s('Title2', fontName='Helvetica-Bold', fontSize=22, textColor=WHITE, alignment=TA_CENTER, spaceAfter=4, leading=28) SUB_S = s('SubTitle', fontName='Helvetica', fontSize=11, textColor=LIGHT_BLUE, alignment=TA_CENTER, spaceAfter=2, leading=14) H1 = s('H1', fontName='Helvetica-Bold', fontSize=14, textColor=WHITE, spaceBefore=6, spaceAfter=4, leading=18, leftIndent=0) H2 = s('H2', fontName='Helvetica-Bold', fontSize=11, textColor=DARK_BLUE, spaceBefore=8, spaceAfter=3, leading=14) H3 = s('H3', fontName='Helvetica-BoldOblique', fontSize=10, textColor=MED_BLUE, spaceBefore=5, spaceAfter=2, leading=13) BODY = s('Body2', fontName='Helvetica', fontSize=9, textColor=TEXT_DARK, spaceAfter=3, leading=13, alignment=TA_JUSTIFY) BULLET = s('Bullet2', fontName='Helvetica', fontSize=9, textColor=TEXT_DARK, leftIndent=12, spaceAfter=2, leading=13, bulletIndent=4) BOLD_B = s('BoldBullet', fontName='Helvetica-Bold', fontSize=9, textColor=TEXT_DARK, leftIndent=12, spaceAfter=2, leading=13) NOTE = s('Note', fontName='Helvetica-Oblique', fontSize=8.5, textColor=GREEN, spaceAfter=3, leading=12, leftIndent=8) FORMULA = s('Formula', fontName='Helvetica-Bold', fontSize=9, textColor=RED_DARK, leftIndent=10, spaceAfter=3, leading=13) SMALL = s('Small', fontName='Helvetica', fontSize=8, textColor=TEXT_DARK, leading=11, spaceAfter=2) def section_header(text, color=DARK_BLUE): """Returns a coloured banner for a section heading.""" data = [[Paragraph(text, H1)]] t = Table(data, colWidths=[PAGE_W - 2*MARGIN]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), color), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 10), ('RIGHTPADDING', (0,0), (-1,-1), 10), ('ROWBACKGROUNDS', (0,0), (-1,-1), [color]), ])) return t def info_box(rows, col_widths=None): """Shaded table for key-value facts.""" if col_widths is None: col_widths = [(PAGE_W - 2*MARGIN)*0.4, (PAGE_W - 2*MARGIN)*0.6] fmt_rows = [[Paragraph(str(c), BOLD_B if i == 0 else BODY) for i, c in enumerate(r)] for r in rows] t = Table(fmt_rows, colWidths=col_widths) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), LIGHT_BLUE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_GREY, WHITE]), ('GRID', (0,0), (-1,-1), 0.4, BORDER_GREY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 7), ('VALIGN', (0,0), (-1,-1), 'TOP'), ])) return t def b(text): return Paragraph(f'<b>\u2022 {text}</b>', BULLET) def p(text): return Paragraph(text, BODY) def h2(text): return Paragraph(text, H2) def h3(text): return Paragraph(text, H3) def sp(n=4): return Spacer(1, n) def note(text): return Paragraph(f'<i>\u26a0 {text}</i>', NOTE) def formula(text): return Paragraph(text, FORMULA) def hr(): return HRFlowable(width='100%', thickness=0.5, color=BORDER_GREY, spaceAfter=4) story = [] # ═══════════════════════════════════════════════════════════════════ # COVER BANNER # ═══════════════════════════════════════════════════════════════════ cover_data = [[ Paragraph('PSM High-Yield Summary', TITLE_S), Paragraph('Preventive & Social Medicine | MBBS 3rd Year University Exam', SUB_S), Paragraph('Based on Park\'s Textbook | 15-Day Revision Edition', SUB_S), ]] cover_t = Table([[Paragraph('PSM High-Yield Summary', TITLE_S)], [Paragraph('Preventive & Social Medicine | MBBS 3rd Year University Exam', SUB_S)], [Paragraph('Based on Park\'s Textbook | 15-Day Revision Edition', SUB_S)]], colWidths=[PAGE_W - 2*MARGIN]) cover_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), DARK_BLUE), ('TOPPADDING', (0,0), (-1,-1), 10), ('BOTTOMPADDING', (0,0), (-1,-1), 10), ('LEFTPADDING', (0,0), (-1,-1), 12), ])) story.append(cover_t) story.append(sp(10)) # ═══════════════════════════════════════════════════════════════════ # 1. EPIDEMIOLOGY # ═══════════════════════════════════════════════════════════════════ story.append(section_header('1. EPIDEMIOLOGY')) story.append(sp()) story.append(h2('Key Definitions')) story.append(info_box([ ['Term', 'Definition'], ['Epidemiology', 'Study of distribution & determinants of health-related states in populations + application to control'], ['Endemic', 'Habitual presence of disease in an area (constant level)'], ['Epidemic', 'Occurrence clearly in excess of normal expectancy in a community'], ['Pandemic', 'Epidemic occurring worldwide, crossing international boundaries'], ['Incidence', 'New cases in a defined population over a defined time'], ['Prevalence', 'All cases (new + old) in a population at a given point/period'], ['Attack rate', 'Incidence used when population is exposed for a limited time'], ['Case Fatality Rate', '(Deaths due to disease / Cases of disease) × 100'], ])) story.append(sp(6)) story.append(h2('Epidemiological Triad')) story.append(b('Agent + Host + Environment = Disease (Leavell & Clark)')) story.append(b('Web of Causation: MacMahon & Pugh')) story.append(b("Koch's Postulates (Germ Theory): 1) Organism in every case, 2) Isolated in pure culture, 3) Reproduces disease when inoculated, 4) Re-isolated from experimental host")) story.append(b("Hill's Criteria of Causation (9): Strength, Consistency, Specificity, Temporality, Biological gradient, Plausibility, Coherence, Experiment, Analogy")) story.append(note('Temporality is the ONLY essential criterion among Hill\'s criteria')) story.append(sp(4)) story.append(h2('Study Designs')) story.append(info_box([ ['Study Type', 'Key Feature / Use'], ['Cross-sectional', 'Prevalence study; snapshot in time; no follow-up'], ['Case-Control', 'Retrospective; calculates Odds Ratio (OR); good for rare diseases'], ['Cohort', 'Prospective; calculates Relative Risk (RR); good for rare exposures'], ['RCT', 'Gold standard for therapeutic interventions; calculates Efficacy'], ['Ecological', 'Group-level data; ecological fallacy is a bias'], ['Meta-analysis', 'Pools data from multiple studies; highest evidence level'], ], col_widths=[(PAGE_W-2*MARGIN)*0.35, (PAGE_W-2*MARGIN)*0.65])) story.append(sp(4)) story.append(h2('Measures of Association')) story.append(formula('Relative Risk (RR) = Incidence in exposed / Incidence in unexposed [Cohort studies]')) story.append(formula('Odds Ratio (OR) = (a×d) / (b×c) [Case-Control studies]')) story.append(formula('Attributable Risk = Incidence(exposed) − Incidence(unexposed)')) story.append(formula('Population Attributable Risk % = (Incidence(total) − Incidence(unexposed)) / Incidence(total) × 100')) story.append(sp(4)) story.append(h2('Screening Criteria (Wilson & Jungner)')) story.append(b('Disease: Important health problem, recognisable latent/early stage')) story.append(b('Test: Simple, safe, acceptable, validated; high Sensitivity (to rule OUT)')) story.append(b('Treatment: Effective treatment available')) story.append(note('Sensitivity = TP/(TP+FN) | Specificity = TN/(TN+FP) | PPV increases with disease prevalence')) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 2. VITAL STATISTICS & BIOSTATISTICS # ═══════════════════════════════════════════════════════════════════ story.append(section_header('2. VITAL STATISTICS & BIOSTATISTICS')) story.append(sp()) story.append(h2('Key Mortality Rates')) story.append(info_box([ ['Rate', 'Formula', 'Notes'], ['Crude Birth Rate (CBR)', 'Live births / Mid-year population × 1000', 'India ~20/1000'], ['Crude Death Rate (CDR)', 'Deaths / Mid-year population × 1000', 'India ~7/1000'], ['Infant Mortality Rate (IMR)', 'Deaths <1yr / Live births × 1000', 'India ~28 (2023)'], ['Neonatal Mortality Rate', 'Deaths <28 days / Live births × 1000', 'Early (<7d) + Late'], ['Perinatal Mortality Rate', '(Stillbirths + Deaths <7d) / (Stillbirths + Live births) × 1000', 'Best index of obstetric care'], ['Maternal Mortality Ratio', 'Maternal deaths / Live births × 1,00,000', 'India ~97/lakh (2018-20)'], ['Under-5 Mortality Rate (U5MR)', 'Deaths <5yr / Live births × 1000', 'MDG/SDG indicator'], ['Total Fertility Rate (TFR)', 'Sum of Age-Specific Fertility Rates', 'India ~2.0; Replacement = 2.1'], ['Life Expectancy at Birth', 'Average years a newborn is expected to live', 'India ~70 years'], ], col_widths=[(PAGE_W-2*MARGIN)*0.30, (PAGE_W-2*MARGIN)*0.42, (PAGE_W-2*MARGIN)*0.28])) story.append(sp(6)) story.append(h2('Important Biostatistics')) story.append(info_box([ ['Concept', 'Key Points'], ['Mean/Median/Mode', 'Mean = sum/n; Median = middle value; Mode = most frequent. Normal distribution: all equal'], ['Standard Deviation (SD)', 'Spread around mean. 1 SD = 68%, 2 SD = 95%, 3 SD = 99.7% of data'], ['Standard Error (SE)', 'SD / √n [SE decreases as sample size increases]'], ['p-value', '<0.05 = statistically significant; <0.01 = highly significant'], ['Confidence Interval', '95% CI = Mean ± 1.96 × SE. If CI crosses 1 (for RR/OR) = not significant'], ['Chi-square (χ²)', 'Categorical data; tests association. NOT for small samples (<5 per cell)'], ["Student's t-test", 'Continuous data; compare 2 means; small samples with normal distribution'], ['ANOVA', 'Compare means of >2 groups simultaneously'], ['Correlation (r)', '-1 to +1. r=+1 perfect positive, r=-1 perfect negative, r=0 no correlation'], ])) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 3. LEVELS OF PREVENTION & NATURAL HISTORY # ═══════════════════════════════════════════════════════════════════ story.append(section_header('3. LEVELS OF PREVENTION & NATURAL HISTORY OF DISEASE')) story.append(sp()) story.append(h2('Leavell & Clark Model')) story.append(info_box([ ['Level', 'Stage of Disease', 'Examples'], ['Primordial Prevention', 'Before risk factors emerge', 'Health policy, legislation, social norms'], ['Primary Prevention', 'Pre-pathogenesis (susceptible host)', 'Vaccination, health education, chemoprophylaxis'], ['Secondary Prevention', 'Early pathogenesis', 'Screening, early diagnosis, prompt treatment'], ['Tertiary Prevention', 'Advanced disease', 'Disability limitation, rehabilitation'], ], col_widths=[(PAGE_W-2*MARGIN)*0.25, (PAGE_W-2*MARGIN)*0.30, (PAGE_W-2*MARGIN)*0.45])) story.append(sp(4)) story.append(h2('Modes of Intervention')) story.append(b('Health Promotion: Health education, nutrition, environmental sanitation')) story.append(b('Specific Protection: Immunisation, use of specific nutrients (iodine), occupational hazard protection')) story.append(b('Early Diagnosis & Prompt Treatment: Screening programmes, case finding')) story.append(b('Disability Limitation: Adequate treatment to prevent complications')) story.append(b('Rehabilitation: Medical, social, vocational rehabilitation')) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 4. IMMUNISATION # ═══════════════════════════════════════════════════════════════════ story.append(section_header('4. IMMUNISATION & NATIONAL IMMUNISATION SCHEDULE')) story.append(sp()) story.append(h2('Universal Immunisation Programme (UIP) Schedule')) story.append(info_box([ ['Age', 'Vaccines Given'], ['At birth', 'BCG, OPV-0 (birth dose), Hepatitis B (birth dose)'], ['6 weeks', 'OPV-1, Penta-1 (DPT+Hep B+Hib), IPV-1, Rota-1, PCV-1, fIPV-1'], ['10 weeks', 'OPV-2, Penta-2, Rota-2, PCV-2'], ['14 weeks', 'OPV-3, Penta-3, IPV-2, Rota-3, PCV-3, fIPV-2'], ['9 months', 'MR-1, JE-1 (endemic districts), Vitamin A (1st dose)'], ['16-24 months', 'MR-2, OPV booster, DPT booster-1, JE-2, Vitamin A (2nd dose)'], ['5-6 years', 'DPT booster-2'], ['10 years & 16 years', 'Td (Tetanus + low-dose diphtheria)'], ['Pregnant women', 'TT-1, TT-2 (or Td); IFA; Td booster if previously immunised'], ])) story.append(sp(4)) story.append(h2('Cold Chain & Vaccine Storage')) story.append(b('Cold chain: System of keeping vaccines potent from manufacturer to child')) story.append(b('OPV: Most heat sensitive. Store at -15 to -25°C. Shake test for damage')) story.append(b('BCG, Measles, MMR: 2-8°C (NOT frozen – freezing damages)')) story.append(b('DPT, Hepatitis B, TT: 2-8°C. NEVER freeze (adjuvant precipitates)')) story.append(b('Diluents: Store at 2-8°C or room temperature (never frozen)')) story.append(note('Potency order of heat sensitivity: OPV > Measles > BCG > Hep B > DPT/TT')) story.append(sp(4)) story.append(h2('Types of Immunity')) story.append(info_box([ ['Type', 'Examples'], ['Active Natural', 'Recovery from infection'], ['Active Artificial', 'Vaccination'], ['Passive Natural', 'Maternal antibodies (IgG crosses placenta; IgA in breast milk)'], ['Passive Artificial', 'Immunoglobulin injection (ATS, IVIG)'], ['Herd Immunity', 'Indirect protection of unimmunised via high community coverage'], ])) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 5. NUTRITION # ═══════════════════════════════════════════════════════════════════ story.append(section_header('5. NUTRITION')) story.append(sp()) story.append(h2('Protein-Energy Malnutrition (PEM)')) story.append(info_box([ ['Classification', 'Features'], ['Kwashiorkor', 'Predominantly protein deficiency. Oedema, moon face, dermatosis, fatty liver, apathy. Hair = flag sign'], ['Marasmus', 'Calorie + protein deficiency. Wasting, old man face, no oedema, alert, ravenous hunger'], ['Marasmic Kwashiorkor', 'Mixed – wasting + oedema'], ])) story.append(sp(4)) story.append(h2('Classification of Malnutrition')) story.append(info_box([ ['Classification', 'Parameter', 'Grade I', 'Grade II', 'Grade III', 'Grade IV'], ['Gomez', 'Weight-for-age vs 50th percentile', '75-90%', '60-74%', '<60%', '–'], ['IAP (India)', 'Weight-for-age vs 50th percentile', '71-80%', '61-70%', '51-60%', '≤50%'], ['Waterlow', 'Wasting=W/H; Stunting=H/A', 'Mild', 'Moderate', 'Severe', '–'], ], col_widths=[(PAGE_W-2*MARGIN)*0.18, (PAGE_W-2*MARGIN)*0.27, (PAGE_W-2*MARGIN)*0.14, (PAGE_W-2*MARGIN)*0.14, (PAGE_W-2*MARGIN)*0.14, (PAGE_W-2*MARGIN)*0.13])) story.append(sp(4)) story.append(h2('Vitamin Deficiency Diseases')) story.append(info_box([ ['Vitamin', 'Deficiency Disease', 'Key Feature'], ['A (Retinol)', 'Xerophthalmia → Keratomalacia', 'Night blindness, Bitot\'s spots. Dose: 2 lakh IU at 9m, 16-18m, then 6-monthly till 5yrs'], ['B1 (Thiamine)', 'Beriberi', 'Wet (cardiac), Dry (peripheral neuropathy), Wernicke\'s encephalopathy'], ['B2 (Riboflavin)', 'Ariboflavinosis', 'Angular stomatitis, glossitis, corneal vascularisation'], ['B3 (Niacin)', 'Pellagra', '3Ds: Dermatitis, Diarrhoea, Dementia (4th D = Death)'], ['B12 (Cobalamin)', 'Megaloblastic anaemia', 'Subacute combined degeneration of spinal cord'], ['C (Ascorbic acid)', 'Scurvy', 'Perifollicular haemorrhages, Corkscrew hair, Bleeding gums'], ['D (Calciferol)', 'Rickets (child) / Osteomalacia (adult)', 'Low Ca/P; Craniotabes, bow legs, Harrison\'s sulcus'], ['K', 'Haemorrhagic disease of newborn', 'Prolonged PT/APTT'], ])) story.append(sp(4)) story.append(h2('Recommended Dietary Allowances (RDA) – Key Values')) story.append(b('Calories: Adult man 2320 kcal; Adult woman 1900 kcal; Pregnancy +350 kcal; Lactation +600 kcal')) story.append(b('Protein: Adult 0.8 g/kg/day; Pregnancy +23 g/day; Lactation +19 g/day')) story.append(b('Iron: Adult man 17 mg/day; Adult woman 21 mg/day; Pregnancy 35 mg/day')) story.append(b('Calcium: Adult 600 mg/day; Pregnancy/Lactation 1200 mg/day')) story.append(b('Folic acid: Pregnancy 500 mcg/day (to prevent NTDs)')) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 6. ENVIRONMENTAL HEALTH # ═══════════════════════════════════════════════════════════════════ story.append(section_header('6. ENVIRONMENTAL HEALTH – WATER & SANITATION')) story.append(sp()) story.append(h2('Water Quality Standards')) story.append(info_box([ ['Parameter', 'WHO Standard', 'BIS (India) Standard'], ['pH', '6.5–8.5', '6.5–8.5'], ['Turbidity', '<1 NTU (desirable) / 5 NTU (max)', '1 NTU / 5 NTU'], ['TDS (Total Dissolved Solids)', '500 mg/L', '500 mg/L / 2000 mg/L'], ['Nitrates', '50 mg/L', '45 mg/L'], ['Fluoride', '1.5 mg/L', '1 mg/L / 1.5 mg/L'], ['Arsenic', '0.01 mg/L', '0.01 mg/L / 0.05 mg/L'], ['Coliform bacteria', '0/100 mL (treated)', '0/100 mL'], ['Residual Chlorine', '0.5 mg/L at source', '0.2 mg/L at tap'], ])) story.append(sp(4)) story.append(h2('Water Purification Methods')) story.append(b('Storage & Sedimentation: Allows 70-80% bacteria to die; removes suspended matter')) story.append(b('Coagulation: Alum (aluminium sulphate) at 5-40 mg/L; removes turbidity')) story.append(b('Filtration: Slow sand filter (Schmutzdecke layer) – most efficient biological purification')) story.append(b('Rapid sand filter: Faster but less efficient; needs coagulation first')) story.append(b('Chlorination: Most widely used disinfection. Breakpoint chlorination removes all impurities')) story.append(b('Bleaching powder: 25-35% available chlorine. Dose: 2.5 kg per lakh litres')) story.append(formula('Chlorine demand = Chlorine applied − Residual chlorine')) story.append(note('SODIS (Solar Disinfection): Place clear plastic bottle in sunlight for 6 hours')) story.append(sp(4)) story.append(h2('Excreta Disposal & Sanitation')) story.append(b('Sanitary latrine requirements: FLY-PROOF, ODOUR-PROOF, WATERTIGHT')) story.append(b('Bored-hole latrine: Simplest; suited for hard soil')) story.append(b('Septic tank: 3 zones – scum, liquid effluent, sludge. Soak pit for liquid')) story.append(b('Sewage treatment: Primary (physical sedimentation), Secondary (biological – trickling filter), Tertiary (chemical)')) story.append(b('BOD (Biochemical Oxygen Demand): Measure of organic pollution. Clean water BOD <1 mg/L; Highly polluted >200 mg/L')) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 7. COMMUNICABLE DISEASES # ═══════════════════════════════════════════════════════════════════ story.append(section_header('7. COMMUNICABLE DISEASES')) story.append(sp()) story.append(h2('Malaria')) story.append(info_box([ ['Feature', 'P. vivax', 'P. falciparum'], ['Cycle', '48 hrs (benign tertian)', '48 hrs (malignant tertian)'], ['Relapse', 'Yes (hypnozoites in liver)', 'No (recrudescence only)'], ['Dangerous complication', 'Rare', 'Cerebral malaria, severe anaemia'], ['Treatment', 'Chloroquine + Primaquine 14d', 'ACT (Artesunate combination) + Primaquine single dose'], ['Vector', 'Female Anopheles (night biting)', 'Same'], ])) story.append(b('API (Annual Parasite Incidence) = Positive blood slides × 1000 / Population')) story.append(b('SPR (Slide Positivity Rate) = Positive slides / Slides examined × 100')) story.append(b('SFR (Slide Falciparum Rate) = Falciparum positive / Slides examined × 100')) story.append(note('DDT spraying: 1g/m², 2 rounds/year – Indoor Residual Spraying (IRS)')) story.append(sp(4)) story.append(h2('Tuberculosis')) story.append(b('Causative agent: Mycobacterium tuberculosis (acid-fast bacillus)')) story.append(b('Transmission: Airborne droplet nuclei (1-5 microns) – Wells\' droplet nuclei')) story.append(b('Incubation period: 4-12 weeks for primary infection')) story.append(b('Infectivity: Sputum smear-positive cases most infectious')) story.append(h3('NTEP (National TB Elimination Programme) – formerly RNTCP')) story.append(b('Target: Eliminate TB by 2025 (SDG target 2030); Nikshay portal for registration')) story.append(b('DOTS: Directly Observed Treatment Short-course – cornerstone of NTEP')) story.append(b('Regimen 2HRZE/4HR: Intensive phase 2 months + Continuation phase 4 months')) story.append(b('Drug-Resistant TB: MDR-TB = Resistant to INH + Rifampicin. XDR-TB = MDR + Fluoroquinolone + injectables')) story.append(b('Nikshay Poshan Yojana: Rs 500/month nutritional support to TB patients')) story.append(sp(4)) story.append(h2('HIV/AIDS')) story.append(b('Causative agent: HIV-1 (pandemic), HIV-2 (West Africa). Retrovirus')) story.append(b('Window period: 3-12 weeks (antibody appears); RNA detectable in 10-14 days')) story.append(b('AIDS definition (WHO/CDC): CD4 <200/μL OR AIDS-defining illness')) story.append(b('Transmission: Sexual (most common globally), Blood (most common in IDUs), Mother-to-child (PMTCT)')) story.append(b('ICTC: Integrated Counselling & Testing Centre – voluntary, free, confidential')) story.append(b('PMTCT: Option B+ – all HIV+ pregnant women on ART regardless of CD4')) story.append(b('NACP (National AIDS Control Programme): Phase IV ongoing; NACO oversees')) story.append(sp(4)) story.append(h2('Polio')) story.append(b('Causative agent: Poliovirus types 1, 2, 3 (enterovirus). Type 1 = most paralytic')) story.append(b('Transmission: Faeco-oral route; water/food contamination')) story.append(b('AFP Surveillance: All cases of Acute Flaccid Paralysis <15 years reported')) story.append(b('OPV: Live attenuated – 2 drops orally. bOPV = types 1 & 3 only')) story.append(b('IPV: Inactivated – injectable, induces only humoral immunity')) story.append(b('India certified POLIO-FREE: March 27, 2014')) story.append(note('Wild Poliovirus Type 2 eradicated globally in 1999')) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 8. NATIONAL HEALTH PROGRAMMES # ═══════════════════════════════════════════════════════════════════ story.append(section_header('8. NATIONAL HEALTH PROGRAMMES')) story.append(sp()) story.append(h2('Key Programmes at a Glance')) story.append(info_box([ ['Programme', 'Launched', 'Key Feature'], ['NTEP (TB)', '1997 (as RNTCP)', 'DOTS; target TB elimination 2025'], ['NVBDCP (Vector-borne)', '2003 merger', 'Malaria, Dengue, Filaria, Kala-azar, JE, Chikungunya'], ['NLEP (Leprosy)', '1983', 'MDT (Multi-drug therapy); target elimination achieved 2005'], ['NPCB (Blindness)', '1976', 'Target: reduce blindness to 0.3% by 2020'], ['NPHCE (Elderly)', '2010', 'Health care for persons >60 years'], ['NPCDCS', '2010', 'Non-Communicable Diseases (HTN, DM, Cancer, Stroke)'], ['RKSK', '2014', 'Rashtriya Kishor Swasthya Karyakram – adolescent health'], ['NHM', '2013 (merger)', 'NRHM (2005) + NUHM (2013); strengthens health systems'], ['PM-JAY (Ayushman Bharat)', '2018', 'Rs 5 lakh/family/year health coverage; secondary & tertiary care'], ['JSSK', '2011', 'Free services for pregnant women & sick neonates'], ['PMSMA', '2016', 'Free ANCs on 9th of every month'], ])) story.append(sp(4)) story.append(h2('Leprosy')) story.append(b('Causative: M. leprae; Incubation 2-5 years (range: 6m to 40y)')) story.append(b('Classification: PB (Paucibacillary) – 1-5 lesions; MB (Multibacillary) – >5 lesions')) story.append(b('MDT: PB = Rifampicin 600mg monthly + Dapsone 100mg daily × 6 months')) story.append(b('MDT: MB = Rifampicin 600mg + Clofazimine 300mg monthly + Dapsone 100mg + Clofazimine 50mg daily × 12 months')) story.append(b('India declared elimination (<1/10,000) in 2005')) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 9. PRIMARY HEALTH CARE # ═══════════════════════════════════════════════════════════════════ story.append(section_header('9. HEALTH INFRASTRUCTURE & PRIMARY HEALTH CARE')) story.append(sp()) story.append(h2('Alma Ata Declaration (1978)')) story.append(b('"Health for All by 2000 AD" – WHO/UNICEF conference, Alma Ata (now Almaty), Kazakhstan')) story.append(b('PHC = Essential health care based on practically sound, scientifically and socially acceptable methods')) story.append(b('8 Essential Elements of PHC: MNEMONIC – "Eat Properly, Drink Clean, Treat Sick, Control Kids"')) story.append(BULLET := Paragraph('1. Education about prevailing health problems<br/>' '2. Locally endemic disease control<br/>' '3. Maternal & child health including FP<br/>' '4. Expanded immunisation programme<br/>' '5. Provision of essential drugs<br/>' '6. Nutrition & food supply<br/>' '7. Safe water and sanitation<br/>' '8. Treatment of common diseases & injuries', BODY)) story.append(sp(4)) story.append(h2('Health Infrastructure Norms (India)')) story.append(info_box([ ['Facility', 'Population Served', 'Key Staff/Functions'], ['Sub-Centre (SC)', 'Plains: 5000 / Hills: 3000', 'ANM + Male Health Worker. First contact for maternal & child health'], ['Primary Health Centre (PHC)', 'Plains: 30,000 / Hills: 20,000', '1 Medical Officer + 14 paramedics. 4-6 beds. 6 indoor beds (revised)'], ['Community Health Centre (CHC)', '1,20,000', '4 specialists (Surgeon, Physician, Gynaecologist, Paediatrician). 30 beds. FRU designation'], ['Sub-District/Taluka Hospital', '5-6 lakh', 'Referral centre'], ['District Hospital', '10-30 lakh', 'Apex referral in district'], ])) story.append(sp(4)) story.append(h2('Key Health Workers')) story.append(info_box([ ['Worker', 'Role / Key Facts'], ['ASHA (Accredited Social Health Activist)', 'Community link worker. 1 per 1000 population. Incentive-based. Trained for 23 days initially'], ['ANM (Auxiliary Nurse Midwife)', 'Staff at Sub-Centre. Conducts deliveries, immunisation, ANC'], ['LHV (Lady Health Visitor)', 'Supervisor of ANMs at PHC level'], ['Anganwadi Worker (AWW)', 'Under ICDS. Nutrition, preschool education, health check-ups. 1 per 400-800 population'], ['MPW – Male (Health Worker)', 'Malaria surveillance, sanitation, vital events reporting at Sub-Centre'], ])) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 10. MCH & FAMILY PLANNING # ═══════════════════════════════════════════════════════════════════ story.append(section_header('10. MATERNAL & CHILD HEALTH + FAMILY PLANNING')) story.append(sp()) story.append(h2('Antenatal Care (ANC)')) story.append(b('Minimum 8 ANC contacts (WHO 2016) – India target: 4+ contacts')) story.append(b('1st visit: As early as possible (confirm pregnancy, baseline investigations)')) story.append(b('PMSMA: Free comprehensive ANC on 9th of every month at govt facilities')) story.append(b('Routine investigations: Hb, blood group, urine albumin/sugar, VDRL, HIV, blood glucose')) story.append(b('IFA supplementation: 1 tablet/day from 1st trimester; continue 6 months postpartum')) story.append(b('TT/Td immunisation: 2 doses in first pregnancy (4 weeks apart); booster in subsequent')) story.append(sp(4)) story.append(h2('MTP Act (Medical Termination of Pregnancy) – Amended 2021')) story.append(info_box([ ['Condition', 'Limit'], ['Single provider opinion', 'Up to 20 weeks'], ['Two provider opinion', '20-24 weeks (special categories)'], ['Special categories for 20-24 wk', 'Rape survivors, minors, differently-abled, foetal abnormality, change in marital status'], ['Court order', 'Beyond 24 weeks (substantial foetal abnormality)'], ['For minors/mentally ill', 'Consent of guardian required'], ])) story.append(sp(4)) story.append(h2('PCPNDT Act – Pre-Conception & Pre-Natal Diagnostic Techniques Act')) story.append(b('Original act 1994 – amended 2003 (added pre-conception sex selection)')) story.append(b('Prohibits determination and communication of sex of foetus')) story.append(b('All ultrasound machines must be registered with appropriate authority')) story.append(b('Penalty: Imprisonment up to 3-5 years + fine')) story.append(sp(4)) story.append(h2('Family Planning Methods')) story.append(info_box([ ['Method', 'Pearl Index (lower = better)', 'Notes'], ['Male sterilisation (Vasectomy)', '0.15', 'Safest; local anaesthesia; no-scalpel vasectomy (NSV)'], ['Female sterilisation (TL)', '0.5', 'Pomeroy\'s method most common in India'], ['Copper IUD (Cu-T 380A)', '0.6-0.8', '10 years effective; best spacing method'], ['Combined OCP', '0.1-1', 'Start day 1-5 of cycle; protective against ovarian & endometrial ca'], ['DMPA (Depo-Provera)', '0.3', 'Injection every 3 months'], ['Condom (male)', '2-15', 'Only method protecting against STIs + pregnancy'], ['Natural methods (LAM)', 'Variable', 'Exclusive breastfeeding, <6 months, amenorrhoea – 98% effective'], ])) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 11. OCCUPATIONAL HEALTH # ═══════════════════════════════════════════════════════════════════ story.append(section_header('11. OCCUPATIONAL HEALTH')) story.append(sp()) story.append(h2('Pneumoconioses')) story.append(info_box([ ['Disease', 'Causative Dust', 'Industry / Occupation'], ['Silicosis', 'Free crystalline silica (SiO₂)', 'Mining, quarrying, sandblasting, pottery, glass. MOST COMMON pneumoconiosis'], ['Coal Workers\' Pneumoconiosis (CWP)', 'Coal dust', 'Coal miners. "Black lung disease"'], ['Asbestosis', 'Asbestos fibres', 'Ship building, insulation, construction'], ['Byssinosis', 'Cotton dust', 'Cotton textile workers. "Monday fever"'], ['Bagassosis', 'Bagasse (sugar cane residue)', 'Sugar cane industry workers'], ['Farmer\'s Lung', 'Thermophilic actinomycetes in hay', 'Farmers. Hypersensitivity pneumonitis'], ['Berylliosis', 'Beryllium dust', 'Aerospace, nuclear, fluorescent lamp industry'], ])) story.append(sp(4)) story.append(h2('Occupational Cancers')) story.append(b('Scrotal cancer: Chimney sweeps (soot) – first described by Percivall Pott')) story.append(b('Bladder cancer: Rubber industry, dye industry (beta-naphthylamine, benzidine)')) story.append(b('Lung cancer: Asbestos, arsenic, chromium, nickel, radon')) story.append(b('Mesothelioma: Asbestos (crocidolite most dangerous)')) story.append(b('Nasal/sinus cancer: Nickel, wood dust, leather dust')) story.append(b('Leukaemia: Benzene exposure')) story.append(sp(4)) story.append(h2('Key Occupational Diseases & Exposures')) story.append(info_box([ ['Substance', 'Disease / Feature'], ['Lead (Pb)', 'Burton\'s line (blue gum line), basophilic stippling of RBCs, wrist/foot drop, anaemia'], ['Mercury (Hg)', 'Minamata disease (organic), Pink disease (acrodynia), tremors, erethism'], ['Arsenic', 'Mee\'s lines on nails, hyperkeratosis, Blackfoot disease, lung/skin cancer'], ['Benzene', 'Aplastic anaemia, leukaemia. Urinary phenol as biomarker'], ['Carbon monoxide', 'Binds Hb (carboxyHb). Cherry red colour. Treat with 100% O₂'], ['Organophosphates', 'Inhibit acetylcholinesterase. SLUDGE. Treat with Atropine + Pralidoxime'], ])) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # 12. HEALTH INDICATORS & CONCEPTS # ═══════════════════════════════════════════════════════════════════ story.append(section_header('12. HEALTH INDICATORS & GLOBAL HEALTH CONCEPTS')) story.append(sp()) story.append(h2('Important Health Indices')) story.append(info_box([ ['Index', 'Description'], ['HDI (Human Development Index)', 'UNDP. Life expectancy + Education + GNI per capita'], ['Physical Quality of Life Index (PQLI)', 'D.M. Morris. IMR + Life expectancy at age 1 + Literacy rate (0-100 scale)'], ['DALYs', 'Disability-Adjusted Life Years = YLL (Years of Life Lost) + YLD (Years Lived with Disability)'], ['QALYs', 'Quality-Adjusted Life Years – used in health economics'], ['Gini coefficient', 'Measures income inequality (0 = perfect equality, 1 = maximum inequality)'], ['Lorenz curve', 'Graphical representation of income inequality; further from diagonal = more inequality'], ])) story.append(sp(4)) story.append(h2('Millennium Development Goals (MDGs) → SDGs')) story.append(b('MDGs: 8 goals (2000-2015) – Reduce child mortality (MDG4), Maternal mortality (MDG5), Combat HIV/TB/Malaria (MDG6)')) story.append(b('SDGs: 17 goals (2015-2030) – "Agenda 2030". SDG 3 = Ensure healthy lives for all at all ages')) story.append(b('SDG 3 targets: End AIDS, TB, Malaria; reduce NMR to ≤12/1000; MMR to <70/1,00,000')) story.append(sp(4)) story.append(h2('Social Determinants of Health (CSDH – WHO)')) story.append(b('Income & social protection, Education, Unemployment, Working conditions')) story.append(b('Social support networks, Culture, Gender, Race/Ethnicity')) story.append(b('Access to affordable health services of decent quality')) story.append(note('Commission on Social Determinants of Health (CSDH) report 2008: "Closing the gap in a generation"')) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # QUICK REVISION: IMPORTANT NUMBERS # ═══════════════════════════════════════════════════════════════════ story.append(section_header('QUICK REVISION: NUMBERS TO MEMORISE', color=ACCENT_GOLD)) story.append(sp()) story.append(info_box([ ['What', 'Number', 'What', 'Number'], ['IMR India (2023)', '~28/1000', 'MMR India (2018-20)', '97/lakh'], ['TFR India', '~2.0', 'Replacement TFR', '2.1'], ['Life expectancy India', '~70 years', 'PHC population (plains)', '30,000'], ['Sub-centre population', '5000 (plains)', 'CHC beds', '30 beds'], ['Herd immunity threshold (measles)', '92-95%', 'Herd immunity (polio)', '80-85%'], ['ANC contacts (WHO 2016)', '8 contacts', 'IFA tablets (pregnancy)', '180 tablets'], ['Safe drinking water residual Cl₂', '0.5 mg/L at source', 'Alum dose for water', '5-40 mg/L'], ['OPV doses in UIP', '5 (birth + 3 primary + 1 booster)', 'BCG at birth (dose)', '0.05 mL intradermal'], ['Chi-square: cell size minimum', '5 per cell', 'Normal dist: 2 SD covers', '95% data'], ['ASHA: population per ASHA', '1000', 'AWW: population', '400-800'], ], col_widths=[(PAGE_W-2*MARGIN)*0.25, (PAGE_W-2*MARGIN)*0.25, (PAGE_W-2*MARGIN)*0.25, (PAGE_W-2*MARGIN)*0.25])) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════ # FOOTER NOTE # ═══════════════════════════════════════════════════════════════════ story.append(hr()) story.append(Paragraph( 'Source: Park\'s Textbook of Preventive & Social Medicine (25th Ed.) | ' 'Compiled for MBBS 3rd Year University Exam Revision | Generated by Orris AI', SMALL)) # BUILD PDF doc.build(story) print("PDF generated successfully!") PYEOF echo "Script written"
cd /tmp/workspace/psm-notes && python generate_psm_pdf.py 2>&1
BULLET variable name collision). Let me fix the script:cd /tmp/workspace/psm-notes && python -c " # Test: find the collision line content = open('generate_psm_pdf.py').read() # Find where BULLET is reassigned import re matches = [(i+1, line) for i, line in enumerate(content.split('\n')) if 'BULLET' in line] for m in matches: print(m) "
~/psm-notes/generate_psm_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/psm-notes/generate_psm_pdf.py'
cd /tmp/workspace/psm-notes && python generate_psm_pdf.py 2>&1
ls -lh /tmp/workspace/psm-notes/PSM_High_Yield_Summary.pdf
PSM High Yield Summary
PDF Document · PDF
| # | Section | What's Covered |
|---|---|---|
| 1 | Epidemiology | Study designs, RR/OR formulas, Hill's criteria, screening |
| 2 | Vital Statistics & Biostatistics | All important rates (IMR, MMR, CBR, TFR), stat tests |
| 3 | Levels of Prevention | Leavell & Clark model, all 5 levels with examples |
| 4 | Immunisation | Full UIP schedule (birth to 16 yrs), cold chain, types of immunity |
| 5 | Nutrition | Kwashiorkor vs Marasmus, Gomez/IAP/Waterlow classification, all vitamins |
| 6 | Environmental Health | Water standards (WHO + BIS), purification, sewage treatment |
| 7 | Communicable Diseases | Malaria, TB (NTEP/DOTS), HIV (PMTCT), Polio |
| 8 | National Health Programmes | All major programmes with launch year + key feature |
| 9 | Health Infrastructure | Sub-centre, PHC, CHC norms + ASHA, ANM, AWW roles |
| 10 | MCH & Family Planning | ANC, MTP Act 2021, PCPNDT Act, Pearl Index table |
| 11 | Occupational Health | Pneumoconioses, occupational cancers, heavy metal toxicity |
| 12 | Health Indicators | HDI, PQLI, DALYs, MDGs → SDGs |
| ★ | Quick Revision Numbers | All key numbers/values in one table |
Few tables from the pdf are going outside the page
TW = PAGE_W - 2*MARGIN once and make all col_widths sum exactly to TW. I'll rewrite the script with a clean auto_table helper that always distributes columns across the full text width.cat << 'PYEOF' > /tmp/workspace/psm-notes/generate_psm_pdf.py from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.colors import HexColor, white from reportlab.lib.units import mm from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether, PageBreak ) from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY # ── Colour palette DARK_BLUE = HexColor('#1a3a5c') MED_BLUE = HexColor('#2563a8') LIGHT_BLUE = HexColor('#dbeafe') ACCENT_GOLD = HexColor('#d97706') GREEN = HexColor('#15803d') RED_DARK = HexColor('#b91c1c') LIGHT_GREY = HexColor('#f1f5f9') BORDER_GREY = HexColor('#cbd5e1') TEXT_DARK = HexColor('#1e293b') WHITE = white PAGE_W, PAGE_H = A4 MARGIN = 18*mm TW = PAGE_W - 2*MARGIN # usable text width (always!) doc = SimpleDocTemplate( '/tmp/workspace/psm-notes/PSM_High_Yield_Summary.pdf', pagesize=A4, leftMargin=MARGIN, rightMargin=MARGIN, topMargin=20*mm, bottomMargin=20*mm, title='PSM High-Yield Summary – MBBS 3rd Year', author='Orris AI' ) def s(name, **kw): return ParagraphStyle(name, **kw) TITLE_S = s('Title2', fontName='Helvetica-Bold', fontSize=22, textColor=WHITE, alignment=TA_CENTER, spaceAfter=4, leading=28) SUB_S = s('SubTitle', fontName='Helvetica', fontSize=11, textColor=LIGHT_BLUE, alignment=TA_CENTER, spaceAfter=2, leading=14) H1 = s('H1', fontName='Helvetica-Bold', fontSize=13, textColor=WHITE, spaceBefore=4, spaceAfter=4, leading=17) H2 = s('H2', fontName='Helvetica-Bold', fontSize=11, textColor=DARK_BLUE, spaceBefore=8, spaceAfter=3, leading=14) H3 = s('H3', fontName='Helvetica-BoldOblique', fontSize=10, textColor=MED_BLUE, spaceBefore=5, spaceAfter=2, leading=13) BODY = s('Body2', fontName='Helvetica', fontSize=8.5, textColor=TEXT_DARK, spaceAfter=3, leading=12, alignment=TA_JUSTIFY) TBOLD = s('TBold', fontName='Helvetica-Bold', fontSize=8.5, textColor=TEXT_DARK, spaceAfter=2, leading=12) BULLET = s('Bullet2', fontName='Helvetica', fontSize=8.5, textColor=TEXT_DARK, leftIndent=12, spaceAfter=2, leading=12) NOTE = s('Note', fontName='Helvetica-Oblique', fontSize=8, textColor=GREEN, spaceAfter=3, leading=11, leftIndent=8) FORMULA = s('Formula', fontName='Helvetica-Bold', fontSize=8.5, textColor=RED_DARK, leftIndent=10, spaceAfter=3, leading=12) SMALL = s('Small', fontName='Helvetica', fontSize=7.5, textColor=TEXT_DARK, leading=10, spaceAfter=2) # ── Helpers ────────────────────────────────────────────────────────────────── def section_header(text, color=DARK_BLUE): t = Table([[Paragraph(text, H1)]], colWidths=[TW]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), color), ('TOPPADDING', (0,0), (-1,-1), 7), ('BOTTOMPADDING', (0,0), (-1,-1), 7), ('LEFTPADDING', (0,0), (-1,-1), 10), ('RIGHTPADDING', (0,0), (-1,-1), 10), ])) return t def auto_table(rows, ratios=None, header_row=True): """ Build a table whose columns always sum to TW. ratios: list of floats (will be normalised to sum=1). If None, columns are equal-width. header_row: shade first row in LIGHT_BLUE. """ ncols = len(rows[0]) if ratios is None: ratios = [1] * ncols total = sum(ratios) col_widths = [TW * r / total for r in ratios] # Convert every cell to a Paragraph def cell(val, is_header_col=False): if isinstance(val, Paragraph): return val style = TBOLD if is_header_col else BODY return Paragraph(str(val), style) fmt_rows = [] for ri, row in enumerate(rows): is_hdr = (header_row and ri == 0) fmt_rows.append([cell(c, is_hdr) for c in row]) t = Table(fmt_rows, colWidths=col_widths, repeatRows=1 if header_row else 0) ts = [ ('GRID', (0,0), (-1,-1), 0.4, BORDER_GREY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING',(0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('RIGHTPADDING', (0,0), (-1,-1), 6), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('ROWBACKGROUNDS',(0,1),(-1,-1), [LIGHT_GREY, WHITE]), ] if header_row: ts.append(('BACKGROUND', (0,0), (-1,0), LIGHT_BLUE)) t.setStyle(TableStyle(ts)) return t def b(text): return Paragraph(f'<b>\u2022 {text}</b>', BULLET) def p(text): return Paragraph(text, BODY) def h2(text): return Paragraph(text, H2) def h3(text): return Paragraph(text, H3) def sp(n=4): return Spacer(1, n) def note(text):return Paragraph(f'<i>\u26a0 {text}</i>', NOTE) def f(text): return Paragraph(text, FORMULA) def hr(): return HRFlowable(width='100%', thickness=0.5, color=BORDER_GREY, spaceAfter=4) # ═══════════════════════════════════════════════════════════════════════════ story = [] # ── COVER ── cover = Table( [[Paragraph('PSM High-Yield Summary', TITLE_S)], [Paragraph('Preventive & Social Medicine | MBBS 3rd Year University Exam', SUB_S)], [Paragraph("Based on Park's Textbook | 15-Day Revision Edition", SUB_S)]], colWidths=[TW]) cover.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), DARK_BLUE), ('TOPPADDING', (0,0), (-1,-1), 10), ('BOTTOMPADDING', (0,0), (-1,-1), 10), ('LEFTPADDING', (0,0), (-1,-1), 12), ])) story += [cover, sp(12)] # ══════════════════════════════════════════════════════════ # 1. EPIDEMIOLOGY # ══════════════════════════════════════════════════════════ story += [section_header('1. EPIDEMIOLOGY'), sp()] story.append(h2('Key Definitions')) story.append(auto_table([ ['Term', 'Definition'], ['Epidemiology', 'Study of distribution & determinants of health-related states in populations + application to control'], ['Endemic', 'Habitual presence of disease in an area (constant level)'], ['Epidemic', 'Occurrence clearly in excess of normal expectancy in a community'], ['Pandemic', 'Epidemic occurring worldwide, crossing international boundaries'], ['Incidence', 'New cases in a defined population over a defined time'], ['Prevalence', 'All cases (new + old) in a population at a given point/period'], ['Attack rate', 'Incidence used when population is exposed for a limited time'], ['Case Fatality Rate', '(Deaths due to disease / Cases of disease) x 100'], ], ratios=[2, 5])) story.append(sp(6)) story.append(h2('Epidemiological Triad')) story += [ b('Agent + Host + Environment = Disease (Leavell & Clark)'), b('Web of Causation: MacMahon & Pugh'), b("Koch's Postulates: 1) Organism in every case 2) Isolated in pure culture 3) Reproduces disease when inoculated 4) Re-isolated from experimental host"), b("Hill's Criteria of Causation (9): Strength, Consistency, Specificity, Temporality, Biological gradient, Plausibility, Coherence, Experiment, Analogy"), note('Temporality is the ONLY essential criterion among Hill\'s criteria'), sp(4), ] story.append(h2('Study Designs')) story.append(auto_table([ ['Study Type', 'Key Feature'], ['Cross-sectional', 'Prevalence study; snapshot in time; no follow-up; calculates OR'], ['Case-Control', 'Retrospective; calculates Odds Ratio (OR); good for rare diseases'], ['Cohort', 'Prospective; calculates Relative Risk (RR); good for rare exposures'], ['RCT', 'Gold standard for therapeutic interventions; calculates Efficacy'], ['Ecological', 'Group-level data; subject to ecological fallacy'], ['Meta-analysis', 'Pools data from multiple studies; highest level of evidence'], ], ratios=[2, 5])) story.append(sp(4)) story.append(h2('Measures of Association')) story += [ f('Relative Risk (RR) = Incidence in exposed / Incidence in unexposed [Cohort studies]'), f('Odds Ratio (OR) = (a x d) / (b x c) [Case-Control studies]'), f('Attributable Risk = Incidence(exposed) - Incidence(unexposed)'), f('Population Attributable Risk % = [Incidence(total) - Incidence(unexposed)] / Incidence(total) x 100'), sp(4), ] story.append(h2('Screening (Wilson & Jungner Criteria)')) story += [ b('Disease must be an important health problem with a recognisable latent or early stage'), b('Test: Simple, safe, acceptable, validated. High Sensitivity used to rule OUT disease'), b('Treatment: Effective treatment must be available'), note('Sensitivity = TP/(TP+FN) | Specificity = TN/(TN+FP) | PPV rises with disease prevalence'), sp(8), ] # ══════════════════════════════════════════════════════════ # 2. VITAL STATISTICS & BIOSTATISTICS # ══════════════════════════════════════════════════════════ story += [section_header('2. VITAL STATISTICS & BIOSTATISTICS'), sp()] story.append(h2('Key Mortality & Fertility Rates')) story.append(auto_table([ ['Rate', 'Formula', 'Reference Value (India)'], ['Crude Birth Rate (CBR)', 'Live births / Mid-year pop x 1000', '~20/1000'], ['Crude Death Rate (CDR)', 'Deaths / Mid-year pop x 1000', '~7/1000'], ['Infant Mortality Rate (IMR)', 'Deaths <1 yr / Live births x 1000', '~28/1000 (2023)'], ['Neonatal Mortality Rate', 'Deaths <28 days / Live births x 1000', 'Early (<7d) + Late (7-28d)'], ['Perinatal Mortality Rate', '(Stillbirths + Deaths <7d) / (Stillbirths + Live births) x 1000', 'Best index of obstetric care'], ['Maternal Mortality Ratio', 'Maternal deaths / Live births x 1,00,000', '97/lakh (2018-20)'], ['Under-5 Mortality Rate', 'Deaths <5 yr / Live births x 1000', 'SDG indicator'], ['Total Fertility Rate (TFR)', 'Sum of Age-Specific Fertility Rates', 'India ~2.0; Replacement = 2.1'], ['Life Expectancy at Birth', 'Avg years newborn expected to live', '~70 years'], ], ratios=[3, 4, 2.5])) story.append(sp(6)) story.append(h2('Biostatistics Essentials')) story.append(auto_table([ ['Concept', 'Key Points'], ['Mean / Median / Mode', 'Mean = sum/n; Median = middle value; Mode = most frequent. In normal distribution all three are equal'], ['Standard Deviation', 'Spread around mean. 1 SD = 68%, 2 SD = 95%, 3 SD = 99.7% of data'], ['Standard Error (SE)', 'SE = SD / root(n). SE decreases as sample size increases'], ['p-value', '<0.05 = statistically significant; <0.01 = highly significant'], ['Confidence Interval', '95% CI = Mean +/- 1.96 x SE. If CI crosses 1 (for RR/OR) = NOT significant'], ['Chi-square', 'Categorical data; tests association. Avoid if any cell <5'], ["Student's t-test", 'Continuous data; compare 2 means; small samples with normal distribution'], ['ANOVA', 'Compare means of >2 groups simultaneously'], ['Correlation (r)', 'Range -1 to +1. r=+1 perfect positive, r=-1 perfect negative, r=0 none'], ], ratios=[2.5, 5])) story.append(sp(8)) # ══════════════════════════════════════════════════════════ # 3. LEVELS OF PREVENTION # ══════════════════════════════════════════════════════════ story += [section_header('3. LEVELS OF PREVENTION & NATURAL HISTORY'), sp()] story.append(h2('Leavell & Clark Model')) story.append(auto_table([ ['Level', 'Stage of Disease', 'Examples'], ['Primordial Prevention', 'Before risk factors emerge', 'Health policy, legislation, social norms'], ['Primary Prevention', 'Pre-pathogenesis (susceptible)', 'Vaccination, health education, chemoprophylaxis'], ['Secondary Prevention', 'Early pathogenesis', 'Screening, early diagnosis, prompt treatment'], ['Tertiary Prevention', 'Advanced / late disease', 'Disability limitation, rehabilitation'], ], ratios=[2.5, 2.5, 3.5])) story.append(sp(4)) story += [ b('Health Promotion: Health education, nutrition, environmental sanitation'), b('Specific Protection: Immunisation, specific nutrients (iodine), PPE in occupational settings'), b('Early Diagnosis & Treatment: Screening programmes, case finding'), b('Disability Limitation: Adequate treatment to prevent complications'), b('Rehabilitation: Medical, social, vocational rehabilitation'), sp(8), ] # ══════════════════════════════════════════════════════════ # 4. IMMUNISATION # ══════════════════════════════════════════════════════════ story += [section_header('4. IMMUNISATION & NATIONAL IMMUNISATION SCHEDULE'), sp()] story.append(h2('Universal Immunisation Programme (UIP) Schedule')) story.append(auto_table([ ['Age', 'Vaccines Given'], ['At birth', 'BCG, OPV-0 (birth dose), Hepatitis B (birth dose)'], ['6 weeks', 'OPV-1, Penta-1 (DPT+HepB+Hib), IPV-1, Rota-1, PCV-1, fIPV-1'], ['10 weeks', 'OPV-2, Penta-2, Rota-2, PCV-2'], ['14 weeks', 'OPV-3, Penta-3, IPV-2, Rota-3, PCV-3, fIPV-2'], ['9 months', 'MR-1, JE-1 (endemic districts), Vitamin A (1st dose)'], ['16-24 months', 'MR-2, OPV booster, DPT booster-1, JE-2, Vitamin A (2nd dose)'], ['5-6 years', 'DPT booster-2'], ['10 & 16 years', 'Td (Tetanus + low-dose diphtheria)'], ['Pregnant women', 'TT-1, TT-2 (4 weeks apart); IFA; Td booster if previously immunised'], ], ratios=[2, 5])) story.append(sp(4)) story.append(h2('Cold Chain & Vaccine Storage')) story.append(auto_table([ ['Vaccine', 'Storage Temperature', 'Important Notes'], ['OPV', '-15 to -25 deg C', 'Most heat-sensitive. Shake test for freeze damage'], ['BCG, Measles, MMR', '2-8 deg C', 'Do NOT freeze - damages live attenuated vaccines'], ['DPT, Hepatitis B, TT, Td', '2-8 deg C', 'NEVER freeze - adjuvant precipitates'], ['Diluents', '2-8 deg C or room temp', 'Never freeze diluents'], ], ratios=[3, 2.5, 3])) story += [note('Heat sensitivity order (most to least): OPV > Measles > BCG > Hep B > DPT/TT'), sp(4)] story.append(h2('Types of Immunity')) story.append(auto_table([ ['Type', 'Example'], ['Active Natural', 'Recovery from infection'], ['Active Artificial', 'Vaccination'], ['Passive Natural', 'Maternal antibodies - IgG crosses placenta; IgA in breast milk'], ['Passive Artificial', 'Immunoglobulin injection (ATS, HBIG, IVIG)'], ['Herd Immunity', 'Indirect protection of unimmunised via high community coverage'], ], ratios=[2.5, 5])) story.append(sp(8)) # ══════════════════════════════════════════════════════════ # 5. NUTRITION # ══════════════════════════════════════════════════════════ story += [section_header('5. NUTRITION'), sp()] story.append(h2('Protein-Energy Malnutrition (PEM)')) story.append(auto_table([ ['Type', 'Deficiency', 'Key Features'], ['Kwashiorkor', 'Predominantly protein', 'Oedema, moon face, dermatosis, fatty liver, apathy, flag sign in hair'], ['Marasmus', 'Calories + protein', 'Severe wasting, old man face, NO oedema, alert child, ravenous hunger'], ['Marasmic Kwashiorkor', 'Mixed', 'Features of both - wasting with oedema'], ], ratios=[2.5, 2.5, 4])) story.append(sp(4)) story.append(h2('Malnutrition Classification Scales')) story.append(auto_table([ ['Scale', 'Parameter', 'Mild', 'Moderate', 'Severe'], ['Gomez', 'Weight-for-age vs 50th %ile', '75-90%', '60-74%', '<60%'], ['IAP (India)','Weight-for-age vs 50th %ile', '71-80%', '61-70%', '51-60% (Gr III) / <=50% (Gr IV)'], ['Waterlow', 'Wasting = W/H; Stunting = H/A', 'Mild', 'Moderate', 'Severe'], ], ratios=[2, 3.5, 1.5, 1.5, 1.5])) story.append(sp(4)) story.append(h2('Vitamin Deficiency Diseases')) story.append(auto_table([ ['Vitamin', 'Disease', 'Key Clinical Feature'], ['A (Retinol)', 'Xerophthalmia / Keratomalacia', 'Night blindness; Bitot\'s spots. Vit A dose: 2 lakh IU at 9m, 16-18m, then 6-monthly to 5 yrs'], ['B1 (Thiamine)', 'Beriberi', 'Wet (cardiac), Dry (peripheral neuropathy), Wernicke\'s encephalopathy'], ['B2 (Riboflavin)', 'Ariboflavinosis', 'Angular stomatitis, glossitis, corneal vascularisation'], ['B3 (Niacin)', 'Pellagra', '3 Ds: Dermatitis, Diarrhoea, Dementia (4th D = Death)'], ['B12 (Cobalamin)', 'Megaloblastic anaemia', 'Subacute combined degeneration of spinal cord'], ['C (Ascorbic acid)', 'Scurvy', 'Perifollicular haemorrhages, corkscrew hair, bleeding gums'], ['D (Calciferol)', 'Rickets (child) / Osteomalacia', 'Low Ca/P; Craniotabes, bow legs, Harrison\'s sulcus'], ['K', 'Haemorrhagic disease of newborn', 'Prolonged PT and APTT'], ], ratios=[2, 2.5, 4])) story.append(sp(4)) story.append(h2('Key RDA Values')) story += [ b('Calories: Adult man 2320 kcal | Adult woman 1900 kcal | Pregnancy +350 | Lactation +600 kcal'), b('Protein: 0.8 g/kg/day (adult) | Pregnancy +23 g/day | Lactation +19 g/day'), b('Iron: Man 17 mg/day | Woman 21 mg/day | Pregnancy 35 mg/day'), b('Calcium: Adult 600 mg/day | Pregnancy/Lactation 1200 mg/day'), b('Folic acid in pregnancy: 500 mcg/day (prevents Neural Tube Defects)'), sp(8), ] # ══════════════════════════════════════════════════════════ # 6. ENVIRONMENTAL HEALTH # ══════════════════════════════════════════════════════════ story += [section_header('6. ENVIRONMENTAL HEALTH - WATER & SANITATION'), sp()] story.append(h2('Water Quality Standards')) story.append(auto_table([ ['Parameter', 'WHO Standard', 'BIS (India) Standard'], ['pH', '6.5 - 8.5', '6.5 - 8.5'], ['Turbidity', '<1 NTU / 5 NTU max', '1 NTU desirable / 5 NTU max'], ['TDS', '500 mg/L', '500 mg/L desirable / 2000 mg/L max'], ['Nitrates', '50 mg/L', '45 mg/L'], ['Fluoride', '1.5 mg/L', '1 mg/L / 1.5 mg/L max'], ['Arsenic', '0.01 mg/L', '0.01 mg/L / 0.05 mg/L max'], ['Coliform', '0 /100 mL (treated)', '0 /100 mL'], ['Residual Cl2', '0.5 mg/L at source', '0.2 mg/L at tap'], ], ratios=[3, 2.5, 3])) story.append(sp(4)) story.append(h2('Water Purification Methods')) story += [ b('Storage & Sedimentation: Allows 70-80% bacteria to die; removes suspended matter'), b('Coagulation: Alum (aluminium sulphate) 5-40 mg/L; removes turbidity'), b('Slow Sand Filter: Schmutzdecke layer = most efficient biological purification'), b('Rapid Sand Filter: Faster; needs coagulation first; less biologically efficient'), b('Chlorination: Most widely used. Breakpoint chlorination removes ALL impurities'), b('Bleaching powder: 25-35% available chlorine. Dose: 2.5 kg per lakh litres'), f('Chlorine demand = Chlorine applied - Residual chlorine'), note('SODIS: Clear plastic bottle in sunlight for 6 hours kills pathogens'), sp(4), ] story.append(h2('Sewage Treatment')) story += [ b('Primary (physical): Screening, sedimentation - removes solids'), b('Secondary (biological): Trickling filter, activated sludge - removes organics'), b('Tertiary (chemical): Chlorination, UV - removes remaining pathogens'), b('BOD (Biochemical Oxygen Demand): Measure of organic pollution. Clean water BOD <1 mg/L; Highly polluted >200 mg/L'), sp(8), ] # ══════════════════════════════════════════════════════════ # 7. COMMUNICABLE DISEASES # ══════════════════════════════════════════════════════════ story += [section_header('7. COMMUNICABLE DISEASES'), sp()] story.append(h2('Malaria')) story.append(auto_table([ ['Feature', 'P. vivax', 'P. falciparum'], ['Fever cycle', '48 hrs (benign tertian)', '48 hrs (malignant tertian)'], ['Relapse', 'YES - hypnozoites in liver', 'NO - recrudescence only'], ['Complication', 'Rare', 'Cerebral malaria, severe anaemia, ARDS'], ['Treatment', 'Chloroquine + Primaquine x 14d', 'ACT (Artesunate combo) + Primaquine single dose'], ['Vector', 'Female Anopheles (night biting)', 'Same'], ], ratios=[2.5, 3.5, 3.5])) story += [ b('API (Annual Parasite Incidence) = Positive blood slides x 1000 / Population'), b('SPR (Slide Positivity Rate) = Positive slides / Slides examined x 100'), note('DDT IRS (Indoor Residual Spraying): 1 g/m2, 2 rounds/year'), sp(4), ] story.append(h2('Tuberculosis (NTEP - formerly RNTCP)')) story += [ b('Agent: Mycobacterium tuberculosis (acid-fast bacillus). Airborne droplet nuclei (1-5 microns)'), b('DOTS: Directly Observed Treatment Short-course - cornerstone of NTEP'), b('Regimen 2HRZE / 4HR: 2-month intensive + 4-month continuation phase'), b('MDR-TB: Resistant to INH + Rifampicin. XDR-TB: MDR + fluoroquinolone + second-line injectables'), b('Nikshay Poshan Yojana: Rs 500/month nutritional support to TB patients'), b('Target: Eliminate TB by 2025 (India) vs SDG target of 2030'), sp(4), ] story.append(h2('HIV/AIDS')) story += [ b('Agent: HIV-1 (pandemic), HIV-2 (West Africa). Retrovirus. Window period 3-12 weeks'), b('AIDS: CD4 <200/uL OR AIDS-defining illness'), b('Transmission: Sexual (most common globally), Blood (IDUs), Mother-to-child (PMTCT)'), b('ICTC: Integrated Counselling & Testing Centre - voluntary, free, confidential'), b('PMTCT: Option B+ - ALL HIV+ pregnant women on lifelong ART regardless of CD4'), sp(4), ] story.append(h2('Polio')) story += [ b('Agent: Poliovirus types 1, 2, 3. Type 1 = most paralytic. Faeco-oral transmission'), b('AFP Surveillance: All Acute Flaccid Paralysis <15 years must be reported'), b('India certified POLIO-FREE: March 27, 2014'), b('Wild Poliovirus Type 2: Eradicated globally in 1999'), note('OPV = 2 drops orally; IPV = injectable, induces humoral immunity only'), sp(8), ] # ══════════════════════════════════════════════════════════ # 8. NATIONAL HEALTH PROGRAMMES # ══════════════════════════════════════════════════════════ story += [section_header('8. NATIONAL HEALTH PROGRAMMES'), sp()] story.append(auto_table([ ['Programme', 'Year', 'Key Feature'], ['NTEP (TB - was RNTCP)', '1997', 'DOTS; target TB elimination 2025; Nikshay portal'], ['NVBDCP (Vector-borne)', '2003', 'Covers Malaria, Dengue, Filaria, Kala-azar, JE, Chikungunya'], ['NLEP (Leprosy)', '1983', 'MDT (Multi-drug therapy); India elimination achieved 2005'], ['NPCB (Blindness)', '1976', 'Target: reduce blindness to 0.3%; cataract surgery camps'], ['NPCDCS (NCDs)', '2010', 'HTN, Diabetes, Cancer, Stroke screening & management'], ['RKSK (Adolescent)', '2014', 'Rashtriya Kishor Swasthya Karyakram (10-19 yrs)'], ['NHM', '2013', 'NRHM (2005) + NUHM (2013) merged; strengthens health systems'], ['PM-JAY (Ayushman Bharat)', '2018', 'Rs 5 lakh/family/year; secondary & tertiary care; 10 crore families'], ['JSSK', '2011', 'Free services for pregnant women & sick neonates'], ['PMSMA', '2016', 'Free comprehensive ANC on 9th of every month'], ], ratios=[4, 1.5, 5])) story.append(sp(4)) story.append(h2('Leprosy - MDT Regimens')) story.append(auto_table([ ['Type', 'Definition', 'MDT Regimen', 'Duration'], ['PB', '1-5 skin lesions', 'Rifampicin 600mg monthly + Dapsone 100mg daily', '6 months'], ['MB', '>5 skin lesions', 'Rifampicin 600mg + Clofazimine 300mg monthly + Dapsone 100mg + Clofazimine 50mg daily', '12 months'], ], ratios=[1.5, 2, 4, 1.5])) story.append(sp(8)) # ══════════════════════════════════════════════════════════ # 9. HEALTH INFRASTRUCTURE & PHC # ══════════════════════════════════════════════════════════ story += [section_header('9. HEALTH INFRASTRUCTURE & PRIMARY HEALTH CARE'), sp()] story.append(h2('Alma Ata Declaration (1978)')) story += [ b('"Health for All by 2000 AD" - WHO/UNICEF conference at Alma Ata (now Almaty), Kazakhstan'), b('PHC = Essential health care based on practically sound, scientifically and socially acceptable methods'), h3('8 Essential Elements of PHC:'), p('1. Education about prevailing health problems' ' 2. Locally endemic disease control' ' 3. Maternal & child health including FP' ' 4. Expanded immunisation programme' ' 5. Provision of essential drugs' ' 6. Nutrition & food supply' ' 7. Safe water and sanitation' ' 8. Treatment of common diseases & injuries'), sp(4), ] story.append(h2('Health Infrastructure Norms')) story.append(auto_table([ ['Facility', 'Population (Plains)', 'Population (Hills/Tribal)', 'Key Functions'], ['Sub-Centre (SC)', '5,000', '3,000', 'ANM + Male HW. Maternal & child health first contact'], ['Primary Health Centre (PHC)', '30,000', '20,000', '1 MO + 14 staff. 4-6 beds. Referral to CHC'], ['Community Health Centre (CHC)','1,20,000', '80,000', '4 specialists. 30 beds. FRU designation'], ['Sub-District Hospital', '5-6 lakh', '--', 'Referral for CHC cases'], ['District Hospital', '10-30 lakh', '--', 'Apex referral in district'], ], ratios=[3, 2, 2, 4])) story.append(sp(4)) story.append(h2('Key Health Workers')) story.append(auto_table([ ['Worker', 'Ratio / Level', 'Key Role'], ['ASHA', '1 per 1000 population', 'Community link; incentive-based; trained 23 days initially'], ['ANM', 'Sub-Centre level', 'Conducts deliveries, immunisation, ANC'], ['LHV', 'PHC level', 'Supervisor of ANMs'], ['Anganwadi Worker', '1 per 400-800 pop (ICDS)','Nutrition, preschool education, health check-ups'], ['MPW - Male', 'Sub-Centre level', 'Malaria surveillance, sanitation, vital event reporting'], ], ratios=[2.5, 2.5, 4])) story.append(sp(8)) # ══════════════════════════════════════════════════════════ # 10. MCH & FAMILY PLANNING # ══════════════════════════════════════════════════════════ story += [section_header('10. MATERNAL & CHILD HEALTH + FAMILY PLANNING'), sp()] story.append(h2('Antenatal Care')) story += [ b('Minimum 8 ANC contacts (WHO 2016). India target: 4+ contacts (ANC 1 as early as possible)'), b('PMSMA: Free comprehensive ANC on 9th of every month at government facilities'), b('IFA: 1 tablet/day from 1st trimester; continue 6 months postpartum'), b('TT/Td: 2 doses in first pregnancy (4 weeks apart); booster in subsequent pregnancies'), b('Routine tests: Hb, blood group, urine albumin/sugar, VDRL, HIV, blood glucose'), sp(4), ] story.append(h2('MTP Act (Amended 2021)')) story.append(auto_table([ ['Condition', 'Gestational Limit'], ['Single registered provider opinion', 'Up to 20 weeks'], ['Two provider opinion', '20-24 weeks (special categories)'], ['Special categories (20-24 wk)', 'Rape survivors, minors, differently-abled, foetal abnormality, change in marital status'], ['Substantial foetal abnormality', 'Beyond 24 weeks (Medical Board + Court order)'], ['Minors / Mentally ill', 'Consent of guardian required at any gestation'], ], ratios=[3, 4.5])) story.append(sp(4)) story.append(h2('PCPNDT Act (1994, amended 2003)')) story += [ b('Prohibits determination and communication of sex of foetus'), b('2003 amendment added pre-CONCEPTION sex selection (hence PC-PNDT)'), b('All ultrasound machines must be registered with appropriate authority'), b('Penalty: Imprisonment 3-5 years + fine for first offence'), sp(4), ] story.append(h2('Family Planning Methods (Pearl Index)')) story.append(auto_table([ ['Method', 'Pearl Index', 'Notes'], ['Male sterilisation (NSV)', '0.15', 'Safest; local anaesthesia; no-scalpel vasectomy'], ['Female sterilisation (TL)', '0.5', 'Pomeroy\'s method most common in India'], ['Copper IUD (Cu-T 380A)', '0.6-0.8', '10 years effective; best spacing method'], ['Combined OCP', '0.1-1', 'Start day 1-5 of cycle; protective vs ovarian & endometrial ca'], ['DMPA (Depo-Provera)', '0.3', 'Injection every 3 months'], ['Male condom', '2-15', 'ONLY method protecting against STIs + pregnancy'], ['LAM', '~2', 'Exclusive BF + <6 months + amenorrhoea = 98% effective'], ], ratios=[3.5, 1.5, 4.5])) story.append(sp(8)) # ══════════════════════════════════════════════════════════ # 11. OCCUPATIONAL HEALTH # ══════════════════════════════════════════════════════════ story += [section_header('11. OCCUPATIONAL HEALTH'), sp()] story.append(h2('Pneumoconioses')) story.append(auto_table([ ['Disease', 'Causative Dust', 'Occupation'], ['Silicosis', 'Free crystalline silica (SiO2)', 'Mining, quarrying, sandblasting, pottery. MOST COMMON pneumoconiosis'], ['CWP', 'Coal dust', 'Coal miners. "Black lung disease"'], ['Asbestosis', 'Asbestos fibres', 'Shipbuilding, insulation, construction. Risk of mesothelioma'], ['Byssinosis', 'Cotton dust', 'Cotton textile workers. "Monday fever"'], ['Bagassosis', 'Bagasse (sugarcane residue)', 'Sugar cane industry'], ['Farmer\'s Lung', 'Thermophilic actinomycetes (hay)', 'Farmers; Hypersensitivity pneumonitis'], ['Berylliosis', 'Beryllium dust', 'Aerospace, nuclear, fluorescent lamp industry'], ], ratios=[2.5, 3, 4])) story.append(sp(4)) story.append(h2('Occupational Cancers & Toxins')) story.append(auto_table([ ['Substance / Exposure', 'Disease / Feature'], ['Soot (chimney sweeps)', 'Scrotal cancer - first occupational cancer (Percivall Pott)'], ['Beta-naphthylamine, benzidine', 'Bladder cancer (rubber/dye industry)'], ['Asbestos (crocidolite)', 'Mesothelioma + Lung cancer'], ['Benzene', 'Aplastic anaemia, leukaemia. Urinary phenol as biomarker'], ['Lead (Pb)', "Burton's line (blue gums), basophilic stippling, wrist/foot drop, anaemia"], ['Mercury (Hg)', 'Minamata disease (organic Hg), Pink disease, tremors, erethism'], ['Carbon monoxide', 'Carboxyhaemoglobin. Cherry red colour. Treat with 100% O2'], ['Organophosphates', 'Inhibit acetylcholinesterase. SLUDGE syndrome. Treat: Atropine + Pralidoxime'], ], ratios=[3, 5.5])) story.append(sp(8)) # ══════════════════════════════════════════════════════════ # 12. HEALTH INDICATORS & GLOBAL HEALTH # ══════════════════════════════════════════════════════════ story += [section_header('12. HEALTH INDICATORS & GLOBAL HEALTH'), sp()] story.append(h2('Important Health Indices')) story.append(auto_table([ ['Index', 'Components / Description'], ['HDI (Human Development Index)', 'UNDP. Life expectancy + Education + GNI per capita'], ['PQLI (Physical Quality of Life Index)', 'D.M. Morris. IMR + Life expectancy at age 1 + Literacy rate (0-100)'], ['DALYs', 'Disability-Adjusted Life Years = YLL + YLD'], ['QALYs', 'Quality-Adjusted Life Years - used in health economics/CEA'], ['Gini coefficient', 'Income inequality: 0 = perfect equality, 1 = maximum inequality'], ], ratios=[3.5, 5])) story.append(sp(4)) story.append(h2('SDGs (2015-2030) - Agenda 2030')) story += [ b('17 SDGs replace 8 MDGs. SDG 3 = Ensure healthy lives and promote well-being for all at all ages'), b('SDG 3 targets: End AIDS, TB, Malaria; NMR <= 12/1000; MMR <70/lakh by 2030'), b('India SDG 3.1 (MMR <70): India MMR was 97 in 2018-20 - progress ongoing'), note('Commission on Social Determinants of Health (CSDH) 2008: "Closing the gap in a generation"'), sp(8), ] # ══════════════════════════════════════════════════════════ # QUICK REVISION NUMBERS # ══════════════════════════════════════════════════════════ story += [section_header('QUICK REVISION: KEY NUMBERS TO MEMORISE', color=ACCENT_GOLD), sp()] story.append(auto_table([ ['Parameter', 'Value', 'Parameter', 'Value'], ['IMR India (2023)', '~28/1000', 'MMR India (2018-20)', '97/lakh'], ['TFR India', '~2.0', 'Replacement TFR', '2.1'], ['Life expectancy India', '~70 years', 'PHC population (plains)', '30,000'], ['Sub-centre population (plains)', '5,000', 'CHC beds', '30 beds'], ['Herd immunity threshold (Measles)','92-95%', 'Herd immunity threshold (Polio)', '80-85%'], ['ANC contacts (WHO 2016)', '8 contacts', 'IFA tablets in pregnancy', '180 tablets'], ['Residual Cl2 at source', '0.5 mg/L', 'Alum dose for water', '5-40 mg/L'], ['ASHA per population', '1 per 1000', 'Anganwadi Worker per population','1 per 400-800'], ['Normal curve: 2 SD coverage', '95% of data', 'Chi-square: min cell count', '5 per cell'], ['BCG dose (intradermal)', '0.05 mL', 'BCG scar check at', '6 weeks'], ['Vitamin A dose (>1yr)', '2 lakh IU', 'Vitamin A dose (<1yr)', '1 lakh IU'], ], ratios=[3.5, 1.8, 3.5, 1.7])) story.append(sp(8)) # ── Footer story.append(hr()) story.append(Paragraph( "Source: Park's Textbook of Preventive & Social Medicine (25th Ed.) | " "MBBS 3rd Year University Exam Revision | Generated by Orris AI", SMALL)) doc.build(story) print("PDF generated successfully!") PYEOF echo "Script written OK"
cd /tmp/workspace/psm-notes && python generate_psm_pdf.py 2>&1
ls -lh /tmp/workspace/psm-notes/PSM_High_Yield_Summary.pdf
PSM High Yield Summary
PDF Document · PDF
auto_table() helper that calculates column widths as proportional ratios - they always sum exactly to the usable text widthrepeatRows=1 flag added to all tables so the header row repeats if a table spans two pages