Calculadora de dose radiológica client-side para raios-X diagnósticos (30–150 kVp). Modelo analítico calibrado contra dados publicados (IPEM Report 78, BJR Supplement 25), com Monte Carlo híbrido e incerteza típica de ±10–15% em condições padrão.
RadCalc calcula taxa de dose, distância segura, blindagem necessária, vazamento de carcaça (com distribuição espacial), perfil do feixe e scatter do paciente para tubos de raios-X na faixa diagnóstica. Projetado para uso profissional em proteção radiológica, com referências bibliográficas auditáveis.
Kramers modificado com auto-absorção no alvo (Birch-Marshall):
I(E) ∝ Z · (kVp - E) / E^1.5 · exp(-µ_target(E) · ρ · t_eff)
- Expoente
q = 1.5calibrado contra HVL publicados (Tucker & Barnes 1991) - Auto-absorção no alvo via
µ/ρ ≈ 1.67 × (Z/E)³com profundidade efetiva por material - Linhas características K-α e K-β com yield empírico
(kVp/K_edge - 1)^1.6 - Filtração inerente de 0.5 mm Al + filtração adicionada
Síntese de forma de onda kV(t) realista para cada tipo de gerador:
| Gerador | Forma de onda | freqHz | Z interna |
|---|---|---|---|
| MOT half-wave | kVp·max(0, sin(ωt)) | 60 | 5000 Ω |
| MOT full-wave | kVp·|sin(ωt)| | 60 | 3000 Ω |
| MOT + cap | Full-wave + decay RC | 60 | 2000 Ω |
| Monofásico | Similar cap, melhor regulação | 60 | 1500 Ω |
| HF / Inversor | kVp·(1 - ripple·sin(ω_hf·t)) | 40 kHz | 200 Ω |
| DC constante | kVp constante | — | 50 Ω |
- Regulação de carga: Child-Langmuir (I ∝ V^1.5 abaixo de saturação) + droop por impedância interna
- Espectro temporal: Waveform amostrada em ~100 pontos, agrupada em bins de 5 kV, espectro ponderado por tempo × mA
- kVp efetivo: Média ponderada por corrente instantânea (não estimativa estática)
Dados NIST XCOM (Hubbell & Seltzer, NISTIR 5632, 2004) para 9 materiais:
| Material | ρ (g/cm³) | Pontos | Notas |
|---|---|---|---|
| Chumbo (Pb) | 11.34 | ~35 | K-edge 88.0 keV, L-edges 13–16 keV |
| Aço/Ferro (Fe) | 7.87 | ~30 | K-edge 7.1 keV |
| Alumínio (Al) | 2.70 | ~30 | Material de referência para HVL |
| Concreto | 2.30 | ~28 | Composição padrão NIST |
| Vidro plumbífero | 5.20 | ~30 | 65% PbO + 35% SiO₂ |
| Madeira | 0.60 | ~25 | Celulose C₆H₁₀O₅ |
| Ar | 0.001205 | ~25 | STP, com µ_en/ρ |
| Tecido ICRU | 1.00 | ~25 | 4 componentes (ICRU-44), com µ_en/ρ |
| Gesso/Drywall | 0.90 | ~25 | CaSO₄·2H₂O |
Interpolação log-log entre pontos. Bordas de absorção capturadas com pontos em ambos os lados.
Ancorada em IPEM Report 78 (Cranley et al., 1997):
- Ponto de referência: W target, 80 kVp, 2.5 mm Al total, 17° ânodo, DC → 7.0 mR/mAs a 1m
- Extrapolação para outros kVp/filtrações via razão de intensidade espectral
- Validação contra 10 pontos IPEM-78 (50–150 kVp): output ±12% típico
Calculado rigorosamente a partir de dados NIST:
f = (µ_en/ρ)_tecido / (µ_en/ρ)_ar × 8.77
Usando µ_en/ρ para tecido ICRU-44 e ar seco, ponderados pelo espectro filtrado. Resultado típico: 8.5–9.7 µSv/mR na faixa diagnóstica.
Geometric Progression fitting (Harima 1993, ANSI/ANS-6.4.3) com 5 parâmetros:
K(x) = c · x^a · [tanh(x/Xk - 2) - tanh(-2)] / (1 - tanh(-2)) + d
B(E, x) = 1 + (b-1)(K^x - 1) / (K - 1) para K ≠ 1
B(E, x) = 1 + (b-1) · x para K ≈ 1
- Coeficientes tabelados para 5 materiais: Pb, Fe, concreto, Al, vidro plumbífero
- 10 pontos de energia por material (20–150 keV)
- Preciso até ±3–5% para blindagens de até 10 MFP
- Fallback para Berger (2 parâmetros) quando dados GP indisponíveis
Substituiu o modelo first-order (±30%) por radiosity iterativa:
- 6 superfícies retangulares com form factors analíticos (Hottel)
- Klein-Nishina angular: albedo modulado pela seção de choque diferencial Compton
- Degradação energética: Compton shift E' = E/(1 + (E/511)(1-cosθ)) por ordem
- Convergência automática: até 5 ordens, para quando contribuição < 1% da 1ª
- Calibração: NCRP-147 Table B.2 — 3×3×2.6m concreto → ~8% scatter a 1m
- Incerteza: ±12% (vs ±30% do modelo anterior)
Refinamento da radiosity via forced-detection Monte Carlo:
- Kahn rejection method: Amostragem de Klein-Nishina para ângulos Compton
- Forced detection: A cada scatter event, calcula probabilidade analítica de atingir detector (~100-1000x variance reduction)
- Xoshiro128**: PRNG seedable (Blackman & Vigna 2018), período 2^128
- 3000 fótons: Em ~5ms com forced detection → stdErr <5%
- Fator de correção:
scatterFinal = radiosity × (mc_raw / radiosity_raw)— ratios convergem mais rápido - Russian roulette: Termina fótons de baixo peso, mantém estimador unbiased
Modelo SPR (Scatter-to-Primary Ratio) baseado em Simpkin (1996) e NCRP-147:
scatter = entranceDose × SPR(E_mean) × fieldSize_cm² × angular(θ) × thickness(t) / d²
- SPR tabelado: 0.0005–0.0034 por cm² (30–150 keV) a 1m, 90°
- Correção angular: Forward (1.8×) → 90° (1.0×) → backscatter (0.7×)
- Correção espessura: Linear (±2% por cm vs 20cm referência)
- Espectro espalhado: Compton shift + atenuação em tecido ICRU-44
Mapa 2D θ×φ de leakage ao redor da carcaça:
- Geometria cilíndrica: Espessura efetiva = housingThick/sin(θ) (perpendicular = nominal)
- Assimetria heel: Mais radiação no lado do ânodo
- Junções/portas: Gaussianas angulares em pontos fracos (bearing, cabo, janela, vedação)
- Grid 264 pontos: θ=15°-165° × φ=0°-345° (step 15°)
- Compliance IEC 60601: Detecção automática de hotspots > 100 mR/h
Modelo de heel effect (Dixon & Ekstrand 1978) + obliquidade:
I(x, y) = heel(θ_field) × cos³(θ_obliquity)
- Heel effect: Variação de auto-absorção no alvo com ângulo de emissão θ
- t_eff(θ) = t_nominal / sin(θ_anode + θ_field)
- Produz feixe mais intenso no lado do cátodo, mais duro no lado do ânodo
- Obliquidade: cos³θ combina inverso do quadrado + projeção + ângulo sólido
- Grid 11×11: Otimizado por coluna (heel depende só de x), ~2–5ms
- Resultado: razão cátodo/ânodo ~1.2–1.4× para campo 30cm a 100cm SID (17° W)
Componentizado com soma em quadratura:
| Componente | Incerteza | Fonte |
|---|---|---|
| Espectro | ±5% | Kramers modificado + Birch-Marshall |
| µ/ρ | ±3% | Dados NIST XCOM |
| Calibração | ±10% | Ancoragem IPEM-78 |
| Geometria | ±3–5% | Com perfil off-axis (±15% para ânodos extremos) |
| Scatter | ±12% | Radiosity multi-ordem |
| Total típico | ±10–15% | RSS (soma em quadratura) |
Aplicada automaticamente para distâncias > 0.5 m, atenuando cada bin espectral individualmente.
Output e HVL validados contra IPEM Report 78 e BJR Supplement 25:
| kVp | Output ref (mR/mAs) | Modelo | Erro | HVL ref (mm Al) | Modelo | Erro |
|---|---|---|---|---|---|---|
| 50 | 2.1 | 1.87 | -11% | 1.7 | 2.12 | +25% |
| 70 | 5.2 | 5.03 | -3% | 2.5 | 2.92 | +17% |
| 80 | 7.0 | 7.00 | 0% | 2.9 | 3.26 | +12% |
| 100 | 11.5 | 11.55 | +0.4% | 3.6 | 3.82 | +6% |
| 120 | 16.0 | 16.72 | +5% | 4.5 | 4.29 | -5% |
| 150 | 22.7 | 25.39 | +12% | 5.6 | 4.85 | -13% |
Condições: W target, 17° ânodo, DC constante, 2.5 mm Al total.
lib/
physics.ts Motor de física puro (zero React, ~1700 linhas)
mc-scatter.ts Motor Monte Carlo (Klein-Nishina, forced detection, ~350 linhas)
mc-prng.ts PRNG seedable Xoshiro128** (~30 linhas)
data/
mu_rho_nist.ts Dados NIST XCOM + GP buildup + validação (~470 linhas)
components/
RadCalc.tsx UI "use client" com 6 abas (~1050 linhas)
Motor de cálculo sem dependências React. Funções principais:
Espectro e Calibração:
generateSpectrum()— Kramers + Birch-Marshall + filtração (delega a temporal quando mA fornecido)generateSpectrumTemporal()— Espectro via síntese temporal kV(t) completaspectrumTransmission()— Atenuação espectral com GP buildup (Harima) ou Berger fallbackspectrumHVL()— HVL por busca binária (50 iterações)spectrumFfactor()— f-factor via µ_en/ρ tecido/ar
Gerador Temporal:
synthesizeWaveform()— Sintetiza kV(t) para 6 tipos de geradorapplyLoadRegulation()— Regulação de carga Child-Langmuir + droop
Perfil do Feixe:
heelEffectSpectral()— Heel effect bin-a-bin por posição no campocalcObliquity()— cos³θ para pontos off-axiscalcBeamProfile()— Grid 11×11 com heel effect + obliquidade
Scatter:
calcScatterRadiosity()— Multi-ordem radiosity (6 patches, Hottel, Klein-Nishina)comptonShift()— Degradação energética Compton por ordemangularAlbedo()— Albedo ponderado pelo espectro com dependência angularcalcScatterLegacy()— First-order analítico (mantido como fallback)
Patient Scatter:
calcPatientScatter()— SPR × campo × ângulo × espessura / d² (Simpkin/NCRP-147)
Leakage Map:
calcLeakageMap()— Grid 264 pontos θ×φ, geometria cilíndrica + heel + junções
Pipeline Principal:
calcOutputV3()— Espectro → calibração → geometria → 1/r² → scatter(hybrid) → patient → dosecomputeUncertainty()— Budget de incerteza componentizadorunValidation()— Auto-teste contra pontos IPEM-78/BJR-25
Buildup:
interpGPBuildup()— Interpolação de coeficientes GP por energiagpBuildup()— Fator de buildup GP (Harima 1993)
Dados tabelados:
NIST_MATERIALS— µ/ρ e µ_en/ρ para 9 materiaisGP_BUILDUP_COEFFS— Coeficientes GP (5 parâmetros) para 5 materiais × 10 energiasBUILDUP_COEFFS— Coeficientes de Berger (fallback) para 4 materiaisVALIDATION_POINTS— 10 pontos de referência IPEM-78/BJR-25
UI client-side com React Context para estado global do tubo:
| Aba | Função |
|---|---|
| Dose | Taxa de dose com scatter híbrido (radiosity+MC), scatter paciente, waveform |
| Distância | Distância mínima por 1/r² para limite de dose |
| Blindagem | Transmissão espectral com GP buildup, HVL, espessura necessária |
| Vazamento | Modelo 2 componentes + mapa 2D espacial (θ×φ) com hotspots |
| Perfil | Heatmap 2D do feixe, perfil 1D ânodo-cátodo, uniformidade |
| Modelo | Documentação, validação ao vivo, limites regulamentares |
Parâmetros do tubo compartilhados via React Context (TubeProvider):
kVp, mA, gerador, alvo, ângulo do ânodo, filtração. Alterar em qualquer aba reflete em todas.
- NIST XCOM: Hubbell & Seltzer, NISTIR 5632 (2004) — Coeficientes de atenuação
- IPEM Report 78: Cranley et al. (1997) — Catálogo de espectros diagnósticos
- BJR Supplement 25 — Dados de dose em profundidade no eixo central
- Birch & Marshall: Phys Med Biol 24(3):505 (1979) — Auto-absorção no alvo
- Tucker & Barnes: Med Phys 18(2):211 (1991) — Espectros de alvo espesso
- Harima Y: Rad Phys Chem 41(4/5) (1993) — GP buildup factors
- Dixon & Ekstrand: Med Phys 5(6) (1978) — Heel effect e perfil do feixe
- ANSI/ANS-6.4.3 — Fatores de buildup para fontes isotrópicas pontuais
- NCRP Report 147 — Structural shielding design for medical X-ray imaging
- Simpkin DJ: Health Phys 68(5) (1995) — Scatter fractions para blindagem diagnóstica
- Blackman & Vigna: xoshiro/xoroshiro generators (2018) — PRNG para Monte Carlo
- Kalos & Whitlock: Monte Carlo Methods (2008) — Forced detection (NEE)
- Klein-Nishina: Z Physik 52, 853 (1929) — Seção de choque diferencial Compton
- ICRU Report 44 — Substitutos de tecido para dosimetria
- CNEN NN 3.01 — Diretrizes básicas de proteção radiológica (Brasil)
- ANVISA RDC 611/2022 — Requisitos de segurança em radiodiagnóstico
- IEC 60601 — Equipamentos eletromédicos (vazamento ≤ 100 mR/h a 1m)
npm install # Instalar dependências
npm run dev # Dev server com HMR (porta 3000)
npm run build # Build de produção
npm run start # Servidor de produçãoStack: React 19 + TypeScript 5 + Vinext (Vite + App Router).
- MC com 3000 fótons pode não convergir em cenários extremos (salas muito grandes, materiais atípicos)
- Scatter do paciente usa SPR empírico tabelado (não simulação full-body)
- Leakage assume carcaça cilíndrica simétrica (geometrias reais de tubos variam)
- Dados µ/ρ têm ~30 pontos por material com interpolação log-log; erros de interpolação ≤ 5% entre pontos
- GP buildup coefficients adaptados para faixa diagnóstica; acima de 150 keV requer dados adicionais
Este é um modelo analítico calibrado, não um substituto para dosimetria real. Para decisões de proteção radiológica, valide com dosímetros calibrados e supervisão de profissional qualificado.
Uso interno. Consulte o autor para termos de distribuição.