I always face a challenge with deciding insulin doses in my wards Help me learn them to decide myself how much to give or not give

Reading File
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Finding Sources
Reading File
Reading File
Reading File
Reading File
I now have everything needed for a thorough, practical ward-focused insulin dosing guide. Let me compose the answer.

Insulin Dosing in the Wards: A Practical Guide

This is one of the most practical skills you can master. Here's a structured, step-by-step framework you can apply to virtually any admitted patient.

1. Know Your Insulins First

Before dosing, you must know what you're prescribing:
TypeExamplesOnsetPeakDuration
Ultrarapid-actingLispro-aabc, Aspart (faster)<15 min1 h5 h
Rapid-actingLispro, Aspart, Glulisine15-30 min0.5-1.5 h3-5 h
Short-actingRegular (Actrapid)30-60 min2-4 h6-8 h
IntermediateNPH1-2 h6-12 h16-20 h
Long-actingGlargine4-6 hFlat20-24 h
UltralongDegludec3-4 hFlat24-40 h
Key rule: Rapid-acting (lispro/aspart/glulisine) = prandial/bolus. Long-acting (glargine/detemir/degludec) = basal. Never mix these up.
  • Washington Manual of Medical Therapeutics, Table 23-4

2. The 3-Component Inpatient Insulin Regimen

The gold standard for non-ICU inpatients. "Sliding scale alone is inferior - always use basal + nutritional + correction."
Scheduled insulin with basal, nutritional, and correction components provides superior glycemic control compared to correction or "sliding scale" insulin alone.
  • Washington Manual of Medical Therapeutics

Component 1: BASAL Insulin

  • Controls fasting/overnight glucose by suppressing hepatic glucose output
  • Use glargine (Lantus) or detemir, given once daily at a fixed time
  • Dose: 40-50% of Total Daily Dose (TDD)
  • Never hold basal insulin just because the patient is NPO - it covers background glucose production, not food

Component 2: NUTRITIONAL (Prandial/Bolus) Insulin

  • Covers glucose rise from meals
  • Use rapid-acting: lispro, aspart, or glulisine - inject 15 min before meal
  • If blood glucose before eating is <80 mg/dL, give at onset of meal instead
  • Dose: 50% of TDD divided across 3 meals (roughly equal thirds)

Component 3: CORRECTION (Sliding Scale) Insulin

  • Corrects elevated pre-meal glucose on top of the prandial dose
  • Added to the prandial dose before meals - never given as a standalone replacement for scheduled insulin
  • Be more conservative at bedtime (higher threshold or omit entirely)
  • Washington Manual of Medical Therapeutics, p. 888

3. How to Calculate the Starting Dose (Step by Step)

Step 1: Calculate Total Daily Dose (TDD)

For insulin-naive patients (new to insulin):
Starting TDD = 0.1-0.2 units/kg for basal + 0.1-0.2 units/kg divided by 3 meals for nutritional
  • Washington Manual
For patients already on insulin at home:
  • Continue their home dose for T1DM
  • Reduce by 20% on admission for T2DM
  • If home dose looks excessive vs. weight-based 0.4-0.5 units/kg, reduce further
For full basal-bolus calculation:
TDD = Weight (kg) × 0.7 Example: 70 kg patient → TDD = 49 units/day
  • Textbook of Family Medicine 9e
For T1DM: TDD = 0.5-0.8 units/kg/day. Start conservatively at 0.4 units/kg and adjust.

Step 2: Split Basal and Bolus

ComponentDose
Basal (glargine once daily)50% of TDD
Bolus (rapid-acting × 3 meals)50% of TDD ÷ 3 per meal
Example for 70 kg patient (TDD = 49 units):
  • Glargine: ~25 units at bedtime
  • Lispro/Aspart: ~8 units before each of 3 meals

Step 3: Prandial Dose Adjustment for Meal Size

Meal SizeDose Adjustment
Standard mealNo change
Large meal without dessert+1 to 2 units
Very large meal with dessert+3 units
Smaller than usual meal-1 to 2 units
  • Textbook of Family Medicine 9e, Table 34-24

4. Correction Dose: The "Rule of 1800"

This is the formula for calculating how much 1 unit of rapid-acting insulin drops blood glucose:
Insulin Sensitivity Factor (ISF) = 1800 ÷ TDD Expected drop in blood glucose per 1 unit = ISF
  • Textbook of Family Medicine 9e
Example:
  • TDD = 70 units
  • ISF = 1800 ÷ 70 = 25 mg/dL per unit
  • If pre-meal glucose = 200 mg/dL, target = 150 mg/dL
  • Correction needed = (200 - 150) ÷ 25 = 2 extra units
  • Total pre-meal dose = 7 units (prandial) + 2 units (correction) = 9 units
Rule: Only correct if pre-meal glucose >180 mg/dL. Target postcorrection = 150 mg/dL (not 100 - that risks hypoglycemia).
At bedtime: Set a higher threshold for correction insulin (e.g., only correct if >250 mg/dL) or skip correction entirely to avoid overnight hypoglycemia.

5. Titrating Basal Insulin

Once started, adjust basal insulin based on the fasting (pre-breakfast) glucose:
Fasting Glucose (mg/dL)3-Day Average Action
<80Reduce by 3 units
80-110No change
>110Increase by 3 units (or 1 unit/day)
Goal: fasting glucose <130 mg/dL in the ward. Adjust by 5-10% increments daily.

6. Titrating Bolus Insulin

Check pre-meal AND 2-hour post-meal glucose:
If 2-hour postprandial glucose is consistently more than 50 mg/dL above pre-meal baseline for a given meal - increase insulin by 1-2 units for that meal.
If the 2-hour glucose is lower than pre-meal (negative delta) - that predicts hypoglycemia. Reduce dose by 1-2 units and recheck in 1 hour.
  • Textbook of Family Medicine 9e

7. Special Ward Situations

ICU / Critically Ill Patients

  • Use IV insulin infusion (variable rate), not subcutaneous
  • Target blood glucose 140-180 mg/dL (ADA recommendation for critically ill)
  • Check glucose hourly at bedside
  • Provide dextrose (D10W at 10-25 mL/h) alongside to prevent hypoglycemia
  • Before switching from IV to SC: give the long-acting insulin 2 hours before stopping the infusion
  • Washington Manual

Patient is NPO / Not Eating

  • Give basal insulin as usual - do not hold it
  • Hold prandial (meal-time) insulin - that's specific to food intake
  • For tube feeds: match regular insulin to the feed rate

Enteral Nutrition (Tube Feeds)

  • Intermittent feeds: short-acting (Regular) or rapid-acting matched to feeds
  • Continuous feeds: give regular insulin SC every 4-6 hours, or use a low-dose basal

Extreme Hyperglycemia (BG ≥300 mg/dL)

  • Check for ketoacidosis: order electrolytes + ketones
  • Do not just escalate the sliding scale - investigate the cause

Hypoglycemia (BG <70 mg/dL)

  • Treat promptly with oral or IV glucose
  • Recheck every 10 minutes until BG >100 mg/dL and stable
  • Then review the scheduled doses and look for causes: declining renal function, hepatic impairment, poor oral intake
  • Washington Manual

8. Quick Reference Card for a Ward Patient

STEP 1: Is patient insulin-naive or already on insulin?
  → Insulin-naive: Start 0.1-0.2 units/kg basal + 0.1 units/kg × 3 meals
  → Already on insulin (T1DM): Continue home dose
  → Already on insulin (T2DM): Reduce by 20% on admission

STEP 2: Calculate TDD = Weight (kg) × 0.7

STEP 3: 
  Basal = TDD × 50% → Give as glargine at fixed time daily
  Bolus = TDD × 50% ÷ 3 → Give as lispro/aspart before each meal

STEP 4: Add correction if pre-meal BG > 180 mg/dL
  Correction = (Current BG - 150) ÷ ISF
  ISF = 1800 ÷ TDD

STEP 5: Titrate daily
  Fasting BG guides basal adjustment
  2-hr postprandial guides meal bolus adjustment
  BG < 70? Treat hypoglycemia, reduce doses

9. Common Mistakes to Avoid

  1. Sliding scale alone - ineffective for inpatients; always add a scheduled basal dose
  2. Holding basal insulin when NPO - wrong; basal covers background glucose, not food
  3. Giving correction at bedtime without a higher threshold - risks overnight hypoglycemia
  4. Not checking BG before each meal - you cannot dose corrective insulin blindly
  5. Using the same dose in T1DM and T2DM - T2DM patients are insulin-resistant and may need more; newly diagnosed T1DM may need less early on (honeymoon phase: 0.3-0.4 units/kg)
  6. Ignoring renal impairment - kidneys clear insulin; renal failure prolongs insulin action and increases hypoglycemia risk. Reduce doses in AKI/CKD.

Sources:
  • Washington Manual of Medical Therapeutics, Chapter 23 (Diabetes Mellitus)
  • Textbook of Family Medicine 9e, Chapter 34 (Steps 1-5 for basal-bolus initiation)
  • Harrison's Principles of Internal Medicine 22E, Chapter 416 (Insulin preparations table)

Inj ha 14-14-14 Inj nph 10-0-10 Grbs is 106

This is a clinical interpretation question - let me break it down clearly right away.
Quick read of the prescription:
  • Inj HA (Human Actrapid / Regular insulin): 14 units before breakfast - 14 units before lunch - 14 units before dinner
  • Inj NPH: 10 units morning - 0 at noon - 10 units at night
  • GRBS = 106 mg/dL (Glucometer Random Blood Sugar)

What This Regimen Means

TimeInsulinUnitsPurpose
Morning (pre-breakfast)HA + NPH14 + 10 = 24 unitsPrandial (meal cover) + Intermediate basal
Afternoon (pre-lunch)HA only14 unitsPrandial
Evening (pre-dinner)HA + NPH14 + 10 = 24 unitsPrandial + overnight basal
Total Daily Dose = 14+14+14 (HA) + 10+10 (NPH) = 42 + 20 = 62 units/day
This is a conventional split-mixed regimen - very common in government/public hospital wards where insulin analogs are not available. NPH acts as a proxy basal, HA covers meals.

Interpreting GRBS = 106 mg/dL

This is a random glucose - so context matters enormously:
ScenarioWhat 106 meansAction
Fasting / pre-mealExcellent controlNo dose change needed
Post-meal (1-2 hrs after eating)Very well controlledMay even consider reducing slightly to watch for hypoglycemia
Random mid-dayGoodMonitor trend
106 mg/dL is within target range (80-140 mg/dL for wards). This patient is well-controlled on the current regimen.

Should You Change the Dose?

No immediate change needed if:
  • Patient is eating normally
  • No symptoms of hypoglycemia
  • Renal function is stable
  • GRBS 106 is a consistent finding (not a one-off after a missed meal)
Consider reducing by 1-2 units per shot if:
  • Patient is eating poorly / reduced appetite
  • GRBS has been consistently <120 mg/dL at multiple time points
  • Patient is elderly or has renal impairment (insulin clearance is reduced)
  • Patient develops any hypoglycemia episodes (sweating, tremor, BG <70)
Watch out - do NOT give correction insulin on top of this when BG is 106. Correction is only needed if pre-meal BG >180 mg/dL.

Key Clinical Tips for This Regimen

  1. HA must be given 30 min before meals (onset is 30-60 min, unlike analogs which are given 15 min before)
  2. NPH at night (10 units bedtime) - check a 3 AM glucose occasionally if you suspect nocturnal hypoglycemia (NPH peaks at 6-12 hours, so 10 PM NPH peaks around 4-10 AM)
  3. If patient goes NPO (surgery, procedure):
    • Hold all HA (no food = no prandial insulin)
    • Give NPH at half the usual dose (50%) to cover background needs - do not omit it entirely
  4. If GRBS drops below 80 mg/dL before a meal: hold that HA dose and give glucose first, then reassess

Bottom Line

Current regimen with GRBS 106 = patient is doing well. No change required today. Monitor pre-meal and 2-hour post-meal readings over the next 24 hours to confirm the trend, and reassess dose only if glucose consistently runs low (<100 fasting) or high (>180 post-meal).

With respect to inj ha and nph help me learn dosages and how to titrate

Finding Sources
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Reading File
Reading File
Loading Image
Finding Sources
I now have everything needed for a comprehensive, ward-practical answer. Here it is.

Inj HA (Regular/Actrapid) + Inj NPH: Dosing and Titration

This is the conventional split-mixed regimen - the backbone of insulin therapy in most Indian public hospital wards. Here is everything you need to know to use it confidently.

First, Understand the Pharmacology

PropertyInj HA (Regular / Actrapid)Inj NPH (Neutral Protamine Hagedorn)
TypeShort-actingIntermediate-acting
Onset30-60 min1-2 hours
Peak2-4 hours6-12 hours
Duration6-8 hours16-20 hours
RoleCovers meals (prandial)Covers background/basal glucose
When to give30 min BEFORE mealsFixed time (not flexible)
This diagram from Goodman & Gilman (Panel B = HA + NPH regimen) shows exactly how they work together:
Insulin regimen profiles showing HA+NPH (Panel B), basal-bolus (Panel A), and pump therapy (Panel C)
Panel B is your regimen: The dashed black curve = HA (peaks at each meal), the blue curve = NPH (broad hump providing background cover). Both are given at breakfast and again at dinner.

How the Doses Are Structured: The 2/3 - 1/3 Rule

The classic textbook teaching for this regimen:
Two thirds of the total daily dose is given in the morning before breakfast, and one third in the evening before dinner.
  • Goldman-Cecil Medicine
Within the morning dose:
  • 1/3 of that morning dose = HA (Regular)
  • 2/3 of that morning dose = NPH
Within the evening dose:
  • 1/2 as HA (Regular)
  • 1/2 as NPH

Example: Patient weighing 70 kg, TDD = ~49 units

TimeInsulinCalculationDose
MorningNPH2/3 of 2/3 TDD~22 units
MorningHA1/3 of 2/3 TDD~11 units
EveningNPH1/2 of 1/3 TDD~8 units
EveningHA1/2 of 1/3 TDD~8 units
But in practice in Indian wards, a simpler split is used: equal HA doses at each meal (as in your patient's 14-14-14) plus NPH twice daily (10-0-10). Both approaches are valid.

Starting Doses From Scratch

Step 1: Calculate Total Daily Dose (TDD)

Patient typeTDD formula
Average (T1DM, non-obese)0.5 units/kg/day
Conservative start (new diagnosis)0.4 units/kg/day
T2DM / obese / insulin-resistant0.7-1.0 units/kg/day

Step 2: Allocate HA and NPH

Option A (classical 2/3-1/3 rule):
Morning dose = 2/3 of TDD
  → NPH morning = 2/3 of morning dose
  → HA morning  = 1/3 of morning dose

Evening dose = 1/3 of TDD
  → NPH evening = 1/2 of evening dose
  → HA evening  = 1/2 of evening dose
Option B (simpler ward approach):
Basal (NPH) = 50% of TDD → split as NPH morning + NPH night (e.g., 60/40)
Bolus (HA)  = 50% of TDD → split equally across meals
Practical starting point for a 60 kg patient:
  • TDD = 60 × 0.5 = 30 units
  • HA: 5 units before each meal (5-5-5)
  • NPH: 10 units morning + 5 units at bedtime (10-0-5)

The Critical Timing Rules

  1. HA must be given 30 minutes before meals - not at the time of eating. This is the biggest mistake made in wards. HA onset is 30-60 min; if you give it with the food tray, the food gets absorbed first and glucose spikes before insulin kicks in.
  2. NPH timing is rigid and matters enormously:
    • Morning NPH given at ~7-8 AM peaks at ~1-3 PM → covers lunch
    • Bedtime NPH given at ~10-11 PM peaks at ~4-8 AM → covers the dawn phenomenon (early morning glucose rise)
    • Do NOT give evening NPH too early (e.g., 6-7 PM) - it will peak at 2-3 AM when glucose is naturally lowest, causing nocturnal hypoglycemia
"For many women taking NPH at 'bedtime' (8 or 9 pm), NPH will peak at 4 AM, exposing them to nocturnal hypoglycemia. It is better to administer NPH between 10 PM and midnight."
  • Creasy & Resnik's Maternal-Fetal Medicine

How to Titrate: The Core Framework

The key principle - each glucose reading tells you about a specific insulin dose given hours earlier. Once you map this, titration becomes logical.

The Glucose-Insulin Map

This glucose reading is high/lowIt reflects this insulin dose
Fasting (pre-breakfast)Previous night's NPH
Pre-lunch (midday)Morning HA + Morning NPH (its tail)
Pre-dinnerMidday HA (if given) + Morning NPH (its peak is fading)
Bedtime (2 hrs post-dinner)Evening HA

Titration Rules

For HA (meal cover):
  • Check 2-hour post-meal glucose
  • Target: post-meal glucose should be no more than 50 mg/dL above pre-meal glucose
  • If post-meal is consistently >50 mg/dL above pre-meal → increase HA for that meal by 1-2 units
  • If post-meal drops below pre-meal (negative delta) → patient is heading for hypoglycemia → reduce HA for that meal by 1-2 units
For NPH (basal cover):
  • Check fasting glucose to titrate night NPH
  • Check pre-dinner glucose to titrate morning NPH
Fasting GlucoseAction on Night NPH
<80 mg/dLReduce by 2-3 units
80-110 mg/dLNo change
110-150 mg/dLIncrease by 1-2 units
>150 mg/dLIncrease by 2-3 units
Titrate in small steps (1-2 units at a time), wait 2-3 days before the next adjustment unless glucose is dangerously high or low.

NPH-Specific Warnings to Know

1. The Somogyi Effect (Rebound Hyperglycemia)

  • Overnight hypoglycemia from excessive NPH causes a stress hormone (cortisol, glucagon) surge
  • Result: paradoxically HIGH fasting glucose the next morning
  • Trap: you increase the NPH thinking fasting is high → makes it worse
  • How to diagnose: check 3 AM glucose. If it is low (<70) but fasting is high → Somogyi effect
  • Fix: reduce night NPH, not increase it

2. The Dawn Phenomenon

  • Early morning glucose rise (4-8 AM) due to physiological cortisol/GH secretion
  • Treated by increasing night NPH (opposite of Somogyi)
  • Distinguish by checking 3 AM glucose: if 3 AM is normal/high → dawn phenomenon

3. NPH Peaks Are Unpredictable

  • Day-to-day variability in absorption is ±50% - NPH is much less reliable than glargine
  • Shake/roll the vial gently before drawing to resuspend the cloudy suspension

What to Do When Patient is NPO

InsulinNPO Action
HA (Regular)Hold completely - no food means no prandial cover needed
NPHGive at half the usual dose - still need some basal cover for background glucose production
Do NOT omit NPH entirely in a T1DM patient - they have zero endogenous insulin and will develop ketosis within 8-12 hours without it.

When to Suspect the Current Dose is Too High

Watch for these signs even without a documented low glucose:
  • Patient sweating at 3-4 AM
  • Feeling weak/dizzy before meals
  • Consistently low pre-meal GRBS (<80 mg/dL)
  • Paradoxically high fasting glucose despite good evening doses (Somogyi)
  • Patient has new AKI or worsening CKD (insulin clearance drops → hypoglycemia risk rises)

Quick Titration Decision Tree

Every morning, look at 4 glucose readings from the previous day:

FASTING HIGH (>130)?
  → Increase NIGHT NPH by 2 units

PRE-LUNCH HIGH (>160)?
  → Increase MORNING HA by 1-2 units
  → OR increase MORNING NPH if it is consistently the issue

PRE-DINNER HIGH (>160)?
  → Morning NPH is inadequate → increase morning NPH by 1-2 units

BEDTIME HIGH (>180)?
  → Increase EVENING HA by 1-2 units

ANY READING <70?
  → Treat hypoglycemia first
  → Identify which insulin caused it (see map above)
  → Reduce THAT dose by 2 units
  → Do not increase anything else for 48 hours

Sources:
  • Goodman & Gilman's Pharmacological Basis of Therapeutics - Insulin dosing and regimen profiles (Figure 51-8)
  • Goldman-Cecil Medicine - 2/3-1/3 split rule and titration targets
  • Creasy & Resnik's Maternal-Fetal Medicine - NPH timing and nocturnal hypoglycemia risk
  • Washington Manual of Medical Therapeutics - Inpatient non-critical care insulin management

I still dont understand this

Asking for Preferences
Everything. Let me restart completely from scratch, like explaining to someone seeing this for the first time. No formulas yet - just pure concepts first, then numbers.

Let's Build This From Zero

Step 1: Why Does a Diabetic Need Insulin at All?

In a normal person, the pancreas automatically releases insulin in two patterns:
  1. A slow trickle all day and night - to handle sugar the liver keeps releasing into the blood even when not eating
  2. A big burst after each meal - to handle the sugar that comes from food
A diabetic's pancreas cannot do this. So we give two types of insulin by injection to copy these two patterns.

Step 2: What HA and NPH Copy

What the body needsInjection we giveName
Slow background trickleInj NPHCalled "basal insulin"
Burst after each mealInj HA (Actrapid/Regular)Called "bolus/prandial insulin"
Think of it like this:
NPH = the background music playing all day HA = the loud beat that plays at mealtimes

Step 3: When Do They Work?

This is the most important thing to memorize:
Inj HA (Regular)
  ├── Starts working: 30 min after injection
  ├── Strongest at: 2-4 hours after injection
  └── Finished by: 6-8 hours

Inj NPH
  ├── Starts working: 1-2 hours after injection
  ├── Strongest at: 6-12 hours after injection
  └── Finished by: 16-20 hours
Practical consequence:
  • Give HA 30 minutes BEFORE the meal tray arrives - not when it arrives
  • Give NPH at a fixed time - because it peaks 6-12 hours later, so timing matters a lot

Step 4: The Standard Ward Regimen

Look at a typical day:
TIME          INJECTION              REASON
─────────────────────────────────────────────────────
7:30 AM  →   HA (e.g. 14 units)    Covers breakfast
7:30 AM  →   NPH (e.g. 10 units)   Peaks at 1-3 PM → covers lunch period

12:30 PM →   HA (e.g. 14 units)    Covers lunch
             (no NPH at noon)

7:30 PM  →   HA (e.g. 14 units)    Covers dinner
10:00 PM →   NPH (e.g. 10 units)   Peaks at 4-8 AM → covers overnight/fasting
This is exactly your patient's regimen: HA 14-14-14 and NPH 10-0-10
The NPH at 10 PM is given late - specifically so it peaks during the early morning hours (4-8 AM) when the body has a natural tendency for glucose to rise (called the "dawn phenomenon").

Step 5: What Dose to Start?

One simple formula:
Total Daily Dose (TDD) = Patient's weight in kg × 0.5
For a 60 kg patient:
TDD = 60 × 0.5 = 30 units per day
Then split it:
Half for HA  = 15 units → divide by 3 meals = 5 units before each meal
Half for NPH = 15 units → split as 10 morning + 5 at night
That's it. Your starting prescription:
Inj HA   5 - 5 - 5
Inj NPH  10 - 0 - 5

Step 6: The Glucose-Insulin Map (The Key to Titration)

This is the part most people find confusing. Here is the simplest way to understand it:
Every glucose reading tells you about an insulin that was given several hours BEFORE.
Draw this on paper and keep it on your ward:
GLUCOSE READING          WHICH INSULIN IS RESPONSIBLE
──────────────────────────────────────────────────────
Fasting (7 AM)      →   Last night's NPH (given at 10 PM)
Post-breakfast      →   Morning HA (given at 7:30 AM)
Pre-lunch           →   Morning HA (its tail)
Post-lunch          →   Midday HA (given at 12:30 PM)
Pre-dinner          →   Morning NPH (its peak/tail)
Post-dinner         →   Evening HA (given at 7:30 PM)
3 AM (spot check)   →   Night NPH (active at this time)

Step 7: Titration - Simple Rules

Once you know which reading reflects which insulin, titration is just this:
If glucose is HIGH at that time point → the responsible insulin was not enough → increase it by 2 units
If glucose is LOW (<80) at that time point → the responsible insulin was too much → decrease it by 2 units

Real examples:

Example 1: Fasting glucose today = 180 mg/dL (high) → Fasting reflects last night's NPH → Increase night NPH by 2 units Was: NPH 10-0-10 → Now: NPH 10-0-12
Example 2: Post-breakfast glucose = 240 mg/dL (high) → Post-breakfast reflects morning HA → Increase morning HA by 2 units Was: HA 14-14-14 → Now: HA 16-14-14
Example 3: Patient sweating at 3 AM, GRBS = 55 (low) → 3 AM hypoglycemia = night NPH is too much → Reduce night NPH by 2 units Was: NPH 10-0-10 → Now: NPH 10-0-8

Step 8: The One Trap - Don't Get Fooled by Rebound

Sometimes fasting glucose is very HIGH but it's actually because the night NPH caused hypoglycemia at 3 AM, the body panicked and released stress hormones, and glucose shot up by morning.
How to tell:
  • Check a 3 AM GRBS
  • If 3 AM is LOW (<70) but fasting is HIGH → reduce night NPH (not increase!)
  • If 3 AM is normal/high and fasting is high → increase night NPH
This is called the Somogyi effect and it is the classic trap for beginners.

Summary in One Table

Glucose readingInsulin to adjustHigh →Low →
Fasting (7 AM)Night NPHIncrease by 2uDecrease by 2u
Post-breakfastMorning HAIncrease by 2uDecrease by 2u
Post-lunchMidday HAIncrease by 2uDecrease by 2u
Pre-dinnerMorning NPHIncrease by 2uDecrease by 2u
Post-dinnerEvening HAIncrease by 2uDecrease by 2u
3 AM low + fasting highNight NPHDecrease (Somogyi!)-

Now apply this to your patient:
  • HA 14-14-14 + NPH 10-0-10
  • GRBS = 106 mg/dL
Ask yourself: when was this 106 taken? That tells you exactly which insulin is working well. If it was fasting - your night NPH of 10 units is doing a perfect job. Don't touch it.
Does this make more sense now? Tell me which specific step is still unclear and I will explain just that part further.

Grbs taken at 7 pm

GRBS at 7 PM = 106 mg/dL

Let's walk through the reasoning step by step.

What Happens at 7 PM?

On your patient's regimen, dinner is around 7-7:30 PM. So a GRBS at 7 PM is a PRE-DINNER reading - taken just before the evening meal.

Which Insulin Is Responsible for the 7 PM Reading?

Go back to the map:
PRE-DINNER glucose (7 PM)  →  Reflects MORNING NPH
Why?
Morning NPH was given at ~7:30 AM. Its peak is at 6-12 hours after injection. That means it is peaking at 1:30 PM - 7:30 PM. So at 7 PM, morning NPH is still active and has been controlling the blood sugar through the afternoon.

What Does 106 mg/dL Tell You?

Pre-dinner targetYour patientVerdict
80 - 140 mg/dL106 mg/dL✅ Perfect

Decision: What to Do With Morning NPH?

Nothing. Do not change it.
Morning NPH 10 units is doing exactly its job - keeping pre-dinner glucose at 106. This is ideal control.

But Now Ask the Next Question

You know pre-dinner is fine. But you don't yet know about:
Fasting (7 AM)     → reflects NIGHT NPH      ← still unknown
Post-breakfast     → reflects MORNING HA      ← still unknown
Post-lunch         → reflects MIDDAY HA       ← still unknown
Post-dinner        → reflects EVENING HA      ← still unknown
A single GRBS at one time point tells you about one insulin only. To fully assess the regimen, you need 4 readings per day:
  1. Fasting (7 AM) - before breakfast
  2. Post-breakfast (9:30 AM) - 2 hrs after breakfast
  3. Post-lunch (2:30 PM) - 2 hrs after lunch
  4. Post-dinner (9:30 PM) - 2 hrs after dinner
Until you have all four, you can only say:
"Morning NPH 10 units is appropriate. Cannot comment on the rest of the regimen yet."

Practical Order to Write in Notes

GRBS 7 PM = 106 mg/dL (pre-dinner)
→ Reflects morning NPH (10 units) - adequate control
→ Continue current regimen: HA 14-14-14, NPH 10-0-10
→ Advise 4-point GRBS tomorrow (fasting, post-breakfast, post-lunch, post-dinner)
→ Review and titrate based on full profile
That is the correct clinical reasoning for this reading.

Generate a printable 4-point GRBS tracking sheet for ward use

Reading File
Running Command

ls /home/daytona/workspace/ 2>/dev/null && echo "---exists---" || mkdir -p /home…

Running Command

mkdir -p /home/daytona/workspace/grbs-sheet

Writing File

~/grbs-sheet/generate_grbs_sheet.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import KeepTogether

OUTPUT = "/home/daytona/workspace/grbs-sheet/GRBS_4Point_Tracking_Sheet.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=1.5*cm,
    rightMargin=1.5*cm,
    topMargin=1.5*cm,
    bottomMargin=1.5*cm,
)

W, H = A4
styles = getSampleStyleSheet()

# ── Custom styles ──────────────────────────────────────────────────────────
NAVY   = colors.HexColor("#1a3a5c")
TEAL   = colors.HexColor("#1a7a6e")
AMBER  = colors.HexColor("#e07b00")
LGRAY  = colors.HexColor("#f0f4f8")
DGRAY  = colors.HexColor("#4a5568")
WHITE  = colors.white
RED    = colors.HexColor("#c0392b")
GREEN  = colors.HexColor("#27ae60")

title_style = ParagraphStyle(
    "TitleStyle", parent=styles["Normal"],
    fontSize=15, fontName="Helvetica-Bold",
    textColor=WHITE, alignment=TA_CENTER, spaceAfter=2
)
subtitle_style = ParagraphStyle(
    "SubStyle", parent=styles["Normal"],
    fontSize=9, fontName="Helvetica",
    textColor=WHITE, alignment=TA_CENTER
)
section_style = ParagraphStyle(
    "SectionStyle", parent=styles["Normal"],
    fontSize=8.5, fontName="Helvetica-Bold",
    textColor=NAVY, alignment=TA_LEFT
)
small_style = ParagraphStyle(
    "SmallStyle", parent=styles["Normal"],
    fontSize=7.5, fontName="Helvetica",
    textColor=DGRAY, alignment=TA_LEFT, leading=11
)
note_style = ParagraphStyle(
    "NoteStyle", parent=styles["Normal"],
    fontSize=7, fontName="Helvetica-Oblique",
    textColor=DGRAY, alignment=TA_LEFT, leading=10
)
center_small = ParagraphStyle(
    "CenterSmall", parent=styles["Normal"],
    fontSize=7.5, fontName="Helvetica",
    textColor=DGRAY, alignment=TA_CENTER
)
label_bold = ParagraphStyle(
    "LabelBold", parent=styles["Normal"],
    fontSize=8, fontName="Helvetica-Bold",
    textColor=NAVY, alignment=TA_CENTER
)
white_bold = ParagraphStyle(
    "WhiteBold", parent=styles["Normal"],
    fontSize=8, fontName="Helvetica-Bold",
    textColor=WHITE, alignment=TA_CENTER
)
tiny = ParagraphStyle(
    "Tiny", parent=styles["Normal"],
    fontSize=6.5, fontName="Helvetica",
    textColor=DGRAY, alignment=TA_CENTER, leading=9
)

story = []

# ══════════════════════════════════════════════════════════════════════════
# HEADER BANNER
# ══════════════════════════════════════════════════════════════════════════
header_data = [[
    Paragraph("4-POINT GRBS MONITORING CHART", title_style),
    Paragraph("Glucometer Random Blood Sugar — Insulin Tracking Sheet", subtitle_style)
]]
# Stack title and subtitle in one cell spanning full width
header_data = [[
    Paragraph(
        "<b>4-POINT GRBS MONITORING CHART</b><br/>"
        "<font size=9>Glucometer Random Blood Sugar &amp; Insulin Dose Tracking — Ward Use</font>",
        ParagraphStyle("H", parent=styles["Normal"], fontSize=14,
                       fontName="Helvetica-Bold", textColor=WHITE,
                       alignment=TA_CENTER, leading=20)
    )
]]
header_table = Table(header_data, colWidths=[doc.width])
header_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), NAVY),
    ("TOPPADDING",    (0,0), (-1,-1), 10),
    ("BOTTOMPADDING", (0,0), (-1,-1), 10),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
    ("RIGHTPADDING",  (0,0), (-1,-1), 8),
    ("ROUNDEDCORNERS", [4]),
]))
story.append(header_table)
story.append(Spacer(1, 4*mm))

# ══════════════════════════════════════════════════════════════════════════
# PATIENT INFO ROW
# ══════════════════════════════════════════════════════════════════════════
def field(label, width=3*cm):
    return Paragraph(f"<b>{label}:</b> {'_' * 22}", small_style)

info_data = [[
    field("Patient Name"),
    field("Age/Sex"),
    field("Ward/Bed No."),
    field("IP No."),
]]
info_table = Table(info_data, colWidths=[doc.width/4]*4)
info_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), LGRAY),
    ("TOPPADDING",    (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
    ("RIGHTPADDING",  (0,0), (-1,-1), 4),
    ("BOX", (0,0), (-1,-1), 0.5, NAVY),
    ("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#c0ccd8")),
]))
story.append(info_table)

info_data2 = [[
    field("Diagnosis"),
    field("Consultant"),
    field("Insulin Regimen"),
    Paragraph("<b>Sheet Period:</b> ______ to ______", small_style),
]]
info_table2 = Table(info_data2, colWidths=[doc.width/4]*4)
info_table2.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), WHITE),
    ("TOPPADDING",    (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ("LEFTPADDING",   (0,0), (-1,-1), 6),
    ("RIGHTPADDING",  (0,0), (-1,-1), 4),
    ("BOX", (0,0), (-1,-1), 0.5, NAVY),
    ("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#c0ccd8")),
    ("LINEABOVE", (0,0), (-1,0), 0, WHITE),
]))
story.append(info_table2)
story.append(Spacer(1, 4*mm))

# ══════════════════════════════════════════════════════════════════════════
# QUICK REFERENCE BOX
# ══════════════════════════════════════════════════════════════════════════
ref_header = [[Paragraph("QUICK REFERENCE: Which insulin does each reading reflect?", white_bold)]]
ref_header_table = Table(ref_header, colWidths=[doc.width])
ref_header_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), TEAL),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
]))
story.append(ref_header_table)

ref_data = [
    [
        Paragraph("<b>Reading</b>", label_bold),
        Paragraph("<b>Time</b>", label_bold),
        Paragraph("<b>Reflects this insulin</b>", label_bold),
        Paragraph("<b>Normal target</b>", label_bold),
        Paragraph("<b>If HIGH → action</b>", label_bold),
        Paragraph("<b>If LOW (<80) → action</b>", label_bold),
    ],
    [
        Paragraph("Fasting", center_small),
        Paragraph("~7 AM\n(before breakfast)", tiny),
        Paragraph("Night NPH\n(given ~10 PM)", tiny),
        Paragraph("80–110 mg/dL", tiny),
        Paragraph("↑ Night NPH by 2u", tiny),
        Paragraph("↓ Night NPH by 2u", tiny),
    ],
    [
        Paragraph("Post-Breakfast", center_small),
        Paragraph("~9:30 AM\n(2 hrs after BF)", tiny),
        Paragraph("Morning HA\n(given ~7:30 AM)", tiny),
        Paragraph("<140 mg/dL", tiny),
        Paragraph("↑ Morning HA by 2u", tiny),
        Paragraph("↓ Morning HA by 2u", tiny),
    ],
    [
        Paragraph("Pre-Dinner / Post-Lunch", center_small),
        Paragraph("~7 PM\n(before dinner)", tiny),
        Paragraph("Morning NPH\n(given ~7:30 AM)", tiny),
        Paragraph("80–140 mg/dL", tiny),
        Paragraph("↑ Morning NPH by 2u", tiny),
        Paragraph("↓ Morning NPH by 2u", tiny),
    ],
    [
        Paragraph("Post-Dinner / Bedtime", center_small),
        Paragraph("~9:30 PM\n(2 hrs after dinner)", tiny),
        Paragraph("Evening HA\n(given ~7:30 PM)", tiny),
        Paragraph("<140 mg/dL", tiny),
        Paragraph("↑ Evening HA by 2u", tiny),
        Paragraph("↓ Evening HA by 2u", tiny),
    ],
]

cw = [2.8*cm, 2.4*cm, 3.2*cm, 2.4*cm, 3.5*cm, 3.5*cm]
ref_table = Table(ref_data, colWidths=cw)
ref_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#dceef5")),
    ("BACKGROUND", (0,1), (-1,1), WHITE),
    ("BACKGROUND", (0,2), (-1,2), LGRAY),
    ("BACKGROUND", (0,3), (-1,3), WHITE),
    ("BACKGROUND", (0,4), (-1,4), LGRAY),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 5),
    ("RIGHTPADDING",  (0,0), (-1,-1), 4),
    ("BOX", (0,0), (-1,-1), 0.7, TEAL),
    ("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#b0c8d8")),
    ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ("ALIGN", (0,0), (-1,-1), "CENTER"),
]))
story.append(ref_table)
story.append(Spacer(1, 4*mm))

# ══════════════════════════════════════════════════════════════════════════
# DAILY TRACKING TABLE  (7 days)
# ══════════════════════════════════════════════════════════════════════════
track_header = [[Paragraph("DAILY BLOOD GLUCOSE LOG  (7-Day Record)", white_bold)]]
track_header_table = Table(track_header, colWidths=[doc.width])
track_header_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), NAVY),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
]))
story.append(track_header_table)

# Sub-header
sub_data = [[
    Paragraph("", center_small),
    Paragraph("", center_small),
    Paragraph("FASTING\n~7 AM", tiny),
    Paragraph("POST-BREAKFAST\n~9:30 AM", tiny),
    Paragraph("PRE-DINNER\n~7 PM", tiny),
    Paragraph("POST-DINNER\n~9:30 PM", tiny),
    Paragraph("3 AM*\n(if needed)", tiny),
    Paragraph("INSULIN GIVEN TODAY", label_bold),
    Paragraph("NOTES /\nHypo episodes", tiny),
]]

span1_data = [[
    Paragraph("<b>Date</b>", label_bold),
    Paragraph("<b>Day</b>", label_bold),
    Paragraph("<b>FASTING</b><br/><font size=6>~7 AM</font>", label_bold),
    Paragraph("<b>POST-BF</b><br/><font size=6>~9:30 AM</font>", label_bold),
    Paragraph("<b>PRE-DINNER</b><br/><font size=6>~7 PM</font>", label_bold),
    Paragraph("<b>POST-DINNER</b><br/><font size=6>~9:30 PM</font>", label_bold),
    Paragraph("<b>3 AM</b><br/><font size=6>if ordered</font>", label_bold),
    Paragraph("<b>HA (units)</b><br/><font size=6>B – L – D</font>", label_bold),
    Paragraph("<b>NPH (units)</b><br/><font size=6>AM – PM</font>", label_bold),
    Paragraph("<b>Notes / Hypo</b>", label_bold),
]]

tcw = [1.6*cm, 1.0*cm, 1.8*cm, 1.8*cm, 1.9*cm, 2.0*cm, 1.5*cm, 2.0*cm, 1.8*cm, 2.4*cm]

track_rows = [span1_data[0]]

for i in range(1, 8):
    row = [
        Paragraph(f"Day {i}", center_small),
        Paragraph("", center_small),  # day name
        Paragraph("", center_small),
        Paragraph("", center_small),
        Paragraph("", center_small),
        Paragraph("", center_small),
        Paragraph("", center_small),
        Paragraph("", center_small),
        Paragraph("", center_small),
        Paragraph("", center_small),
    ]
    track_rows.append(row)

track_table = Table(track_rows, colWidths=tcw, rowHeights=[1.0*cm] + [1.1*cm]*7)
ts = TableStyle([
    # Header row
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
    ("TEXTCOLOR",  (0,0), (-1,0), WHITE),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("FONTSIZE",   (0,0), (-1,0), 7.5),
    ("ALIGN",      (0,0), (-1,0), "CENTER"),
    ("VALIGN",     (0,0), (-1,-1), "MIDDLE"),
    ("TOPPADDING",    (0,0), (-1,-1), 4),
    ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ("LEFTPADDING",   (0,0), (-1,-1), 4),
    ("RIGHTPADDING",  (0,0), (-1,-1), 3),
    ("BOX", (0,0), (-1,-1), 0.8, NAVY),
    ("INNERGRID", (0,0), (-1,-1), 0.4, colors.HexColor("#c0ccd8")),
    # Alternate row shading
    ("BACKGROUND", (0,2), (-1,2), LGRAY),
    ("BACKGROUND", (0,4), (-1,4), LGRAY),
    ("BACKGROUND", (0,6), (-1,6), LGRAY),
    # Highlight glucose columns
    ("BACKGROUND", (2,0), (2,0), colors.HexColor("#2e6da4")),
    ("BACKGROUND", (3,0), (3,0), colors.HexColor("#2e6da4")),
    ("BACKGROUND", (4,0), (4,0), colors.HexColor("#2e6da4")),
    ("BACKGROUND", (5,0), (5,0), colors.HexColor("#2e6da4")),
    ("BACKGROUND", (6,0), (6,0), colors.HexColor("#2e6da4")),
    # Insulin columns
    ("BACKGROUND", (7,0), (8,0), colors.HexColor("#1a7a6e")),
])
track_table.setStyle(ts)
story.append(track_table)
story.append(Spacer(1, 4*mm))

# ══════════════════════════════════════════════════════════════════════════
# TITRATION DECISION GUIDE
# ══════════════════════════════════════════════════════════════════════════
tit_header = [[Paragraph("TITRATION DECISION GUIDE  (use daily after reviewing glucose log)", white_bold)]]
tit_header_table = Table(tit_header, colWidths=[doc.width])
tit_header_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), AMBER),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
]))
story.append(tit_header_table)

tit_data = [
    [
        Paragraph("<b>Fasting glucose</b>", label_bold),
        Paragraph("<b>Action on Night NPH</b>", label_bold),
        Paragraph("<b>Post-meal glucose</b>", label_bold),
        Paragraph("<b>Action on that meal's HA</b>", label_bold),
    ],
    [
        Paragraph("< 80 mg/dL", center_small),
        Paragraph("↓ Reduce night NPH by 2–3 units", center_small),
        Paragraph("< 140 mg/dL (target)", center_small),
        Paragraph("✓ No change", center_small),
    ],
    [
        Paragraph("80–110 mg/dL (ideal)", center_small),
        Paragraph("✓ No change", center_small),
        Paragraph("140–180 mg/dL (acceptable)", center_small),
        Paragraph("Consider ↑ by 1 unit if consistent", center_small),
    ],
    [
        Paragraph("110–150 mg/dL", center_small),
        Paragraph("↑ Increase night NPH by 1–2 units", center_small),
        Paragraph("> 180 mg/dL (high)", center_small),
        Paragraph("↑ Increase that HA by 2 units", center_small),
    ],
    [
        Paragraph("> 150 mg/dL", center_small),
        Paragraph("↑ Increase night NPH by 2–3 units", center_small),
        Paragraph("< 70 mg/dL (hypoglycemia!)", center_small),
        Paragraph("↓ Decrease that HA by 2 units immediately", center_small),
    ],
]

tit_cw = [doc.width*0.22, doc.width*0.28, doc.width*0.25, doc.width*0.25]
tit_table = Table(tit_data, colWidths=tit_cw)
tit_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#fdebd0")),
    ("FONTNAME",   (0,0), (-1,0), "Helvetica-Bold"),
    ("BACKGROUND", (0,2), (-1,2), colors.HexColor("#fef9f0")),
    ("BACKGROUND", (0,4), (-1,4), colors.HexColor("#fdeee0")),
    ("TEXTCOLOR",  (0,3), (1,3), colors.HexColor("#c0392b")),
    ("TEXTCOLOR",  (2,4), (3,4), colors.HexColor("#c0392b")),
    ("FONTNAME",   (0,3), (1,3), "Helvetica-Bold"),
    ("FONTNAME",   (2,4), (3,4), "Helvetica-Bold"),
    ("ALIGN",      (0,0), (-1,-1), "CENTER"),
    ("VALIGN",     (0,0), (-1,-1), "MIDDLE"),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("BOX", (0,0), (-1,-1), 0.8, AMBER),
    ("INNERGRID", (0,0), (-1,-1), 0.4, colors.HexColor("#f0d8b0")),
    ("LINEAFTER", (1,0), (1,-1), 1.0, AMBER),
]))
story.append(tit_table)
story.append(Spacer(1, 3*mm))

# ══════════════════════════════════════════════════════════════════════════
# SOMOGYI WARNING + NPO RULES
# ══════════════════════════════════════════════════════════════════════════
warn_data = [[
    Paragraph(
        "<b>⚠ SOMOGYI EFFECT (Rebound hyperglycemia):</b>  "
        "If fasting glucose is HIGH but 3 AM glucose was LOW — do NOT increase night NPH. "
        "The body rebounded from nocturnal hypoglycemia. REDUCE night NPH by 2 units.",
        ParagraphStyle("W", parent=styles["Normal"], fontSize=7.5, fontName="Helvetica",
                       textColor=colors.HexColor("#7b1a1a"), alignment=TA_LEFT, leading=11)
    ),
    Paragraph(
        "<b>NPO / No oral intake:</b>  "
        "HOLD all HA (no food = no prandial dose needed). "
        "Give NPH at HALF the usual dose — do NOT omit entirely in T1DM.",
        ParagraphStyle("W2", parent=styles["Normal"], fontSize=7.5, fontName="Helvetica",
                       textColor=colors.HexColor("#1a3a5c"), alignment=TA_LEFT, leading=11)
    ),
]]
warn_table = Table(warn_data, colWidths=[doc.width*0.52, doc.width*0.48])
warn_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (0,0), colors.HexColor("#fde8e8")),
    ("BACKGROUND", (1,0), (1,0), colors.HexColor("#e8f0f8")),
    ("BOX", (0,0), (0,0), 0.6, colors.HexColor("#c0392b")),
    ("BOX", (1,0), (1,0), 0.6, NAVY),
    ("TOPPADDING",    (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ("LEFTPADDING",   (0,0), (-1,-1), 7),
    ("RIGHTPADDING",  (0,0), (-1,-1), 7),
    ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(warn_table)
story.append(Spacer(1, 3*mm))

# ══════════════════════════════════════════════════════════════════════════
# FOOTER
# ══════════════════════════════════════════════════════════════════════════
footer_data = [[
    Paragraph(
        "* Check 3 AM glucose if: fasting glucose is unexpectedly high despite adequate night NPH, "
        "or patient reports night sweats / restless sleep (symptoms of nocturnal hypoglycemia).  "
        "Titrate in steps of 1–2 units. Wait 2–3 days between adjustments unless glucose is <70 or >300.",
        note_style
    )
]]
footer_table = Table(footer_data, colWidths=[doc.width])
footer_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#eef2f7")),
    ("TOPPADDING",    (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
    ("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#c0ccd8")),
]))
story.append(footer_table)

# ══════════════════════════════════════════════════════════════════════════
# BUILD
# ══════════════════════════════════════════════════════════════════════════
doc.build(story)
print(f"PDF generated: {OUTPUT}")
Running Command

cd /home/daytona/workspace/grbs-sheet && python generate_grbs_sheet.py 2>&1

Your printable sheet is ready:

GRBS 4Point Tracking Sheet

PDF Document · PDF


Here is what's included on the single A4 page:
1. Patient Info Header - Name, Age/Sex, Ward/Bed, IP No., Diagnosis, Consultant, Regimen, Sheet Period
2. Quick Reference Box - colour-coded table showing exactly which insulin each reading reflects, with normal targets and the specific action to take if high or low
3. 7-Day Daily Log Table - columns for Date, Day, Fasting, Post-Breakfast, Pre-Dinner, Post-Dinner, 3 AM (optional), HA doses (B-L-D), NPH doses (AM-PM), and Notes
4. Titration Decision Guide - fasting glucose ranges mapped to night NPH adjustments, and post-meal ranges mapped to HA adjustments - at a glance
5. Somogyi warning box - reminds not to increase night NPH when fasting is paradoxically high due to 3 AM hypo
6. NPO rules box - hold HA, give NPH at half dose
Print it, attach it to the case sheet, and fill it in each day. After 2-3 days you will have a full picture to confidently adjust any insulin dose.

Here inj ha is given 7.30am, nph is given at 10am

Good catch. This changes the glucose-insulin map significantly. Let me work through it.

Your Ward's Actual Timing

7:30 AM  →  Inj HA (covers breakfast)
10:00 AM →  Inj NPH (morning dose)

Evening:
~7:30 PM →  Inj HA (covers dinner)
~10:00 PM → Inj NPH (night dose)  ← assumed same pattern

How This Changes the NPH Coverage

NPH given at 10 AM peaks at 4 PM - 10 PM (peak is 6-12 hrs after injection).
So morning NPH at 10 AM:
  • Covers afternoon + pre-dinner + post-dinner period
  • Is NOT active during breakfast (HA alone covers breakfast)
  • Is fading by midnight
NPH given at 10 PM peaks at 4 AM - 10 AM
  • Covers the overnight + fasting + early morning period

Revised Glucose-Insulin Map for YOUR Ward

GRBS ReadingTimeReflects which insulin
Fasting (7 AM)Before breakfastNight NPH (given 10 PM) — still active
Post-breakfast (9:30 AM)2 hrs after BFMorning HA (given 7:30 AM)
Pre-dinner (7 PM)Before dinnerMorning NPH (given 10 AM, peaking now)
Post-dinner (9:30 PM)2 hrs after dinnerEvening HA + Morning NPH (tail)
3 AMSpot checkNight NPH (given 10 PM, actively peaking)

So Your Patient's 7 PM Reading = 106

7 PM reading  →  Morning NPH (given at 10 AM)
NPH 10 AM peak = 4 PM to 10 PM → at 7 PM it is at its PEAK
GRBS = 106 mg/dL → Morning NPH 10 units is working perfectly
Same conclusion - no change needed to morning NPH. But now you also know:
  • Morning NPH given at 10 AM does NOT cover lunch well (it only starts at 12 noon at best, but HA for lunch was given at 12:30 PM anyway)
  • There is a gap between 7:30 AM HA finishing (~2 PM) and morning NPH peaking (~4 PM) - this 2-4 PM window is a potential hyperglycemia window with no dominant coverage

Practical Warning With This Timing

7:30 AM  HA starts → covers breakfast → fades by ~2 PM
10:00 AM NPH starts → kicks in ~12 PM → peaks 4-10 PM

GAP RISK: 2 PM to 4 PM
  → HA has faded, NPH not yet at peak
  → If midday HA was not given, post-lunch glucose may spike
  → Check 2 PM glucose if patient complains of afternoon symptoms

Updated Revised Tracking Map to Use

FASTING (7 AM)         →  Adjust NIGHT NPH (10 PM dose)
POST-BREAKFAST (9:30)  →  Adjust MORNING HA (7:30 AM dose)
PRE-DINNER (7 PM)      →  Adjust MORNING NPH (10 AM dose)  ← your current reading
POST-DINNER (9:30 PM)  →  Adjust EVENING HA (7:30 PM dose)
The logic is the same as before - just shift all the NPH timings 2 hours later than the standard textbook. The titration rules (increase/decrease by 2 units based on high/low) remain identical.
This is a shared conversation. Sign in to Orris to start your own chat.