Give me diagonasis for this exg
| Parameter | Finding |
|---|---|
| Rhythm | Normal Sinus Rhythm |
| Rate | ~53 bpm (mild sinus bradycardia) |
| QRS Axis | Normal (~+30° to +45°) |
| PR Interval | ~160 ms (normal, < 200 ms) |
| QRS Duration | ~80 ms (narrow, normal < 120 ms) |
| P Waves | Normal morphology, upright in I, II, aVF; inverted in aVR |
Disclaimer: This is an educational ECG analysis tool. Clinical decisions must be made by a licensed physician with full patient context.
How you tell sinus bradycardia
Sinus bradycardia = Sinus rhythm + Rate < 60
Only 3 big box between R
Rate = 300 ÷ number of large boxes between R-R
| Large boxes between R-R | Rate |
|---|---|
| 1 | 300 |
| 2 | 150 |
| 3 | 100 |
| 4 | 75 |
| 5 | 60 |
| 6 | 50 |
Create a quick ECG measurement reference card
A clean, professional ECG quick reference card for medical students. Dark navy blue background. Organized into clearly labeled sections with white and yellow text: TITLE: "ECG Quick Reference Card" in large bold white text at top SECTION 1 - HEART RATE (yellow header): "300 Rule: 300 ÷ large boxes between R-R" Table: 1 box=300, 2 boxes=150, 3 boxes=100, 4 boxes=75, 5 boxes=60, 6 boxes=50 "Fast method: memorize 300-150-100-75-60-50" SECTION 2 - NORMAL INTERVALS (yellow header): PR interval: 120-200 ms (3-5 small boxes) QRS duration: <120 ms (<3 small boxes) QT interval: <440 ms (men), <460 ms (women) P wave: <120 ms wide, <2.5mm tall SECTION 3 - GRID REFERENCE (yellow header): Small box = 0.04s (40ms) / 1mm Large box = 0.20s (200ms) / 5mm Standard speed: 25mm/s Standard gain: 10mm/mV SECTION 4 - AXIS (yellow header): Normal: -30° to +90° LAD: more negative than -30° RAD: more positive than +90° Quick check: Lead I (+) and aVF (+) = Normal axis SECTION 5 - SINUS RHYTHM CRITERIA (yellow header): ✓ P before every QRS ✓ P upright in II, inverted in aVR ✓ PR interval 120-200ms ✓ Rate 60-100 bpm = Normal Sinus Rhythm Small ECG waveform diagram showing P, QRS, T wave labels at the bottom. Medical card style, compact layout.

How to read seperate lead
| Lead | View of Heart | What to Look For |
|---|---|---|
| I | Left side | Lateral wall, axis check |
| II | Inferior-left | Best for P waves, rhythm strip |
| III | Inferior-right | Inferior MI changes |
| aVR | Right shoulder (cavity) | P inverted normally, ST elevation = global ischemia |
| aVL | Left shoulder | High lateral wall |
| aVF | Inferior (feet) | Inferior wall, axis check |
| Lead | Position | View |
|---|---|---|
| V1 | Right sternal border | RV, septal, bundle branches |
| V2 | Left sternal border | Septum |
| V3 | Between V2-V4 | Anterior wall (transition) |
| V4 | Midclavicular 5th ICS | Anterior wall |
| V5 | Anterior axillary | Lateral wall |
| V6 | Midaxillary | Lateral wall |
INFERIOR → II, III, aVF (RCA territory)
LATERAL → I, aVL, V5, V6 (LCx territory)
ANTERIOR → V1, V2, V3, V4 (LAD territory)
SEPTAL → V1, V2
HIGH LATERAL → I, aVL
Key rule: For any abnormality (ST change, Q wave, T inversion), it must appear in 2 or more contiguous leads in the same territory to be significant.
Genrate normal ECG
mkdir -p /tmp/workspace/ecg && python3 << 'EOF' import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.gridspec import GridSpec # --- ECG waveform generator --- def gaussian(x, mu, sig, amp): return amp * np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.))) def make_ecg_cycle(length=1000, hr=75): """Generate one ECG cycle with P, QRS, T waves""" t = np.linspace(0, 1, length) ecg = np.zeros(length) # P wave ecg += gaussian(t, 0.18, 0.025, 0.15) # Q wave ecg += gaussian(t, 0.38, 0.008, -0.08) # R wave ecg += gaussian(t, 0.40, 0.012, 1.2) # S wave ecg += gaussian(t, 0.42, 0.008, -0.15) # T wave ecg += gaussian(t, 0.60, 0.040, 0.35) return ecg def make_lead(amp_p=1.0, amp_qrs=1.0, amp_t=1.0, flip_p=False, n_cycles=4, noise=0.01): cycle = make_ecg_cycle() # Scale components t = np.linspace(0, 1, 1000) ecg = np.zeros(1000) if flip_p: ecg += gaussian(t, 0.18, 0.025, -0.15 * amp_p) else: ecg += gaussian(t, 0.18, 0.025, 0.15 * amp_p) ecg += gaussian(t, 0.38, 0.008, -0.08 * amp_qrs) ecg += gaussian(t, 0.40, 0.012, 1.2 * amp_qrs) ecg += gaussian(t, 0.42, 0.008, -0.15 * amp_qrs) ecg += gaussian(t, 0.60, 0.040, 0.35 * amp_t) full = np.tile(ecg, n_cycles) full += np.random.normal(0, noise, len(full)) return full # Lead configurations (amp_p, amp_qrs, amp_t, flip_p) lead_configs = { 'I': (1.0, 0.8, 0.8, False), 'II': (1.2, 1.0, 1.0, False), 'III': (0.5, 0.5, 0.6, False), 'aVR': (0.8, 0.9, 0.7, True), 'aVL': (0.6, 0.5, 0.4, False), 'aVF': (1.0, 0.8, 0.8, False), 'V1': (0.4, 0.4, -0.3, False), # rS pattern, inverted T 'V2': (0.5, 0.6, 0.2, False), 'V3': (0.6, 0.9, 0.5, False), 'V4': (0.8, 1.1, 0.7, False), 'V5': (0.9, 1.0, 0.8, False), 'V6': (0.8, 0.7, 0.7, False), } # V1 special - rS (small r, deep S) def make_v1(n_cycles=4): t = np.linspace(0, 1, 1000) ecg = np.zeros(1000) ecg += gaussian(t, 0.18, 0.025, 0.08) # small P ecg += gaussian(t, 0.39, 0.008, 0.15) # small r ecg += gaussian(t, 0.41, 0.015, -0.9) # deep S ecg += gaussian(t, 0.60, 0.040, -0.15) # inverted T ecg += np.random.normal(0, 0.01, 1000) return np.tile(ecg, n_cycles) n_cycles = 5 lead_data = {} for name, (ap, aq, at, fp) in lead_configs.items(): lead_data[name] = make_lead(ap, aq, at, fp, n_cycles) lead_data['V1'] = make_v1(n_cycles) # --- Plot --- fig = plt.figure(figsize=(20, 14), facecolor='#fff8f0') fig.patch.set_facecolor('#fff8f0') # Title fig.text(0.5, 0.97, 'Normal 12-Lead ECG | HR: 75 bpm | Normal Sinus Rhythm', ha='center', va='top', fontsize=15, fontweight='bold', color='#1a1a2e') fig.text(0.5, 0.94, 'Speed: 25 mm/s | Gain: 10 mm/mV | PR: 160ms | QRS: 80ms | QT: 380ms | Axis: +60°', ha='center', va='top', fontsize=10, color='#444') gs = GridSpec(3, 4, figure=fig, left=0.06, right=0.98, top=0.92, bottom=0.05, hspace=0.55, wspace=0.3) lead_order = [ ['I', 'aVR', 'V1', 'V4'], ['II', 'aVL', 'V2', 'V5'], ['III', 'aVF', 'V3', 'V6'], ] for row, leads in enumerate(lead_order): for col, name in enumerate(leads): ax = fig.add_subplot(gs[row, col]) data = lead_data[name] x = np.linspace(0, n_cycles * 0.8, len(data)) # 0.8s per cycle at 75bpm # Grid ax.set_facecolor('#fff8f0') # Minor grid (small boxes) ax.set_xticks(np.arange(0, x[-1], 0.04), minor=True) ax.set_yticks(np.arange(-1.5, 1.8, 0.1), minor=True) # Major grid (large boxes) ax.set_xticks(np.arange(0, x[-1], 0.2)) ax.set_yticks(np.arange(-1.5, 1.8, 0.5)) ax.grid(which='minor', color='#f4a7a7', linewidth=0.3, alpha=0.7) ax.grid(which='major', color='#e05555', linewidth=0.6, alpha=0.5) ax.tick_params(which='both', bottom=False, left=False, labelbottom=False, labelleft=False) # Waveform ax.plot(x, data, color='black', linewidth=1.2) ax.set_xlim(0, x[-1]) ax.set_ylim(-0.6, 1.5) # Lead label ax.set_title(name, fontsize=12, fontweight='bold', color='#1a1a2e', pad=3) # Baseline ax.axhline(0, color='#999', linewidth=0.5, linestyle='--', alpha=0.5) # Spines for spine in ax.spines.values(): spine.set_edgecolor('#ccc') # Annotation key at bottom fig.text(0.06, 0.02, 'P wave: SA node depolarization | QRS: Ventricular depolarization | T wave: Ventricular repolarization | ' 'Pink grid: 1mm=0.04s/0.1mV | Red grid: 5mm=0.2s/0.5mV', fontsize=8, color='#555', ha='left') plt.savefig('/tmp/workspace/ecg/normal_12lead_ecg.png', dpi=150, bbox_inches='tight', facecolor='#fff8f0') print("Saved!") EOF
normal 12lead ecg
Image · PNG
| Feature | Value |
|---|---|
| Heart Rate | 75 bpm (3 large boxes R-R) |
| Rhythm | Normal Sinus Rhythm |
| PR Interval | 160 ms |
| QRS Duration | 80 ms (narrow) |
| QT Interval | 380 ms |
| Axis | +60° (normal) |
What is r s t I don't understand
python3 << 'EOF' import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.patches import FancyArrowPatch def gaussian(x, mu, sig, amp): return amp * np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.))) # Generate one clean ECG cycle t = np.linspace(0, 1, 2000) ecg = np.zeros(2000) ecg += gaussian(t, 0.20, 0.028, 0.20) # P wave ecg += gaussian(t, 0.40, 0.009, -0.12) # Q wave ecg += gaussian(t, 0.42, 0.013, 1.4) # R wave ecg += gaussian(t, 0.44, 0.009, -0.18) # S wave ecg += gaussian(t, 0.62, 0.042, 0.38) # T wave fig, ax = plt.subplots(figsize=(14, 7), facecolor='#fff8f0') ax.set_facecolor('#fff8f0') # Grid ax.set_xticks(np.arange(0, 1.05, 0.04), minor=True) ax.set_yticks(np.arange(-0.6, 1.8, 0.1), minor=True) ax.set_xticks(np.arange(0, 1.05, 0.20)) ax.set_yticks(np.arange(-0.6, 1.8, 0.5)) ax.grid(which='minor', color='#f4a7a7', linewidth=0.4, alpha=0.7) ax.grid(which='major', color='#e05555', linewidth=0.7, alpha=0.6) ax.tick_params(which='both', bottom=False, left=False, labelbottom=False, labelleft=False) # Baseline ax.axhline(0, color='#888', linewidth=0.8, linestyle='--', alpha=0.6) # Plot ECG ax.plot(t, ecg, color='black', linewidth=2.2) ax.set_xlim(0.0, 1.0) ax.set_ylim(-0.6, 1.85) # ── ANNOTATIONS ────────────────────────────────────────────────────────────── arrow_props = dict(arrowstyle='->', color='#1a1a2e', lw=1.8) # P wave ax.annotate('', xy=(0.20, 0.21), xytext=(0.20, 0.65), arrowprops=dict(arrowstyle='->', color='#0057b7', lw=2)) ax.text(0.20, 0.70, 'P Wave', ha='center', fontsize=13, fontweight='bold', color='#0057b7') ax.text(0.20, 0.80, 'SA Node fires', ha='center', fontsize=10, color='#0057b7') ax.text(0.20, 0.87, 'Atria contract', ha='center', fontsize=10, color='#0057b7') # Q wave ax.annotate('', xy=(0.398, -0.13), xytext=(0.30, -0.42), arrowprops=dict(arrowstyle='->', color='#cc0000', lw=2)) ax.text(0.26, -0.50, 'Q Wave', ha='center', fontsize=13, fontweight='bold', color='#cc0000') ax.text(0.26, -0.57, 'Septal depol.', ha='center', fontsize=10, color='#cc0000') # R wave ax.annotate('', xy=(0.42, 1.42), xytext=(0.52, 1.65), arrowprops=dict(arrowstyle='->', color='#1a7a1a', lw=2)) ax.text(0.56, 1.68, 'R Wave', ha='center', fontsize=13, fontweight='bold', color='#1a7a1a') ax.text(0.56, 1.78, 'Ventricles depolarize', ha='center', fontsize=10, color='#1a7a1a') ax.text(0.56, 1.83, '(heart squeezes)', ha='center', fontsize=10, color='#1a7a1a') # S wave ax.annotate('', xy=(0.445, -0.19), xytext=(0.57, -0.42), arrowprops=dict(arrowstyle='->', color='#8B0000', lw=2)) ax.text(0.60, -0.50, 'S Wave', ha='center', fontsize=13, fontweight='bold', color='#8B0000') ax.text(0.60, -0.57, 'Late ventricular depol.', ha='center', fontsize=10, color='#8B0000') # T wave ax.annotate('', xy=(0.62, 0.39), xytext=(0.78, 0.70), arrowprops=dict(arrowstyle='->', color='#8B4513', lw=2)) ax.text(0.82, 0.74, 'T Wave', ha='center', fontsize=13, fontweight='bold', color='#8B4513') ax.text(0.82, 0.82, 'Ventricles repolarize', ha='center', fontsize=10, color='#8B4513') ax.text(0.82, 0.89, '(heart relaxes/refills)', ha='center', fontsize=10, color='#8B4513') # ── INTERVAL BRACKETS ──────────────────────────────────────────────────────── # PR interval bracket ax.annotate('', xy=(0.40, -0.30), xytext=(0.10, -0.30), arrowprops=dict(arrowstyle='<->', color='#555', lw=1.5)) ax.text(0.25, -0.36, 'PR Interval (120-200ms)', ha='center', fontsize=9, color='#555', style='italic') # QRS bracket ax.annotate('', xy=(0.455, -0.20), xytext=(0.388, -0.20), arrowprops=dict(arrowstyle='<->', color='#cc0000', lw=1.5)) ax.text(0.42, -0.26, 'QRS <120ms', ha='center', fontsize=9, color='#cc0000', style='italic') # QT interval bracket ax.annotate('', xy=(0.75, -0.38), xytext=(0.388, -0.38), arrowprops=dict(arrowstyle='<->', color='#555', lw=1.5)) ax.text(0.57, -0.44, 'QT Interval (<440ms)', ha='center', fontsize=9, color='#555', style='italic') # ── ISOELECTRIC LINE LABEL ──────────────────────────────────────────────────── ax.text(0.02, 0.03, 'Isoelectric\nbaseline', ha='left', fontsize=8, color='#888') # ── TITLE ───────────────────────────────────────────────────────────────────── ax.set_title('ECG Waveform Explained — P, Q, R, S, T Waves', fontsize=15, fontweight='bold', color='#1a1a2e', pad=10) # ── BOTTOM NOTE ─────────────────────────────────────────────────────────────── fig.text(0.5, 0.01, 'One complete cardiac cycle = P wave + QRS complex + T wave', ha='center', fontsize=11, color='#333', style='italic') plt.tight_layout(rect=[0, 0.04, 1, 1]) plt.savefig('/tmp/workspace/ecg/ecg_waves_explained.png', dpi=150, bbox_inches='tight', facecolor='#fff8f0') print("Done!") EOF
ecg waves explained
Image · PNG
P = Pump atria → QRS = Pump ventricles → T = Rest and refill
It's ok but what's Sr in V1 lead
|
___ |
/ \ |
-/-----\|-------- baseline
|\
| \___/
|
small r deep S
| Wave | Appearance | What it means |
|---|---|---|
| small r | Tiny upward blip | Small amount of electrical force moving toward V1 (septal depolarization going right) |
| deep S | Big downward deflection | Large electrical force moving away from V1 (ventricles depolarizing toward the left side) |
V1 V2 V3 V4 V5 V6
rS rS RS Rs qR qR
↑ ↑
small r tall R
deep S small s
| Finding | Meaning |
|---|---|
| Normal rS in V1 | ✅ Normal |
| Tall R in V1 (R > S) | ⚠️ RVH, RBBB, posterior MI, WPW |
| rS stays all the way to V4-V5 | ⚠️ Poor R progression = anterior MI or LVH |
| Completely flat in V1 | ⚠️ Check electrode placement first |