Skip to content

kaykyr/radcalc

Repository files navigation

RadCalc v6.0

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.

Visão Geral

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.

Modelo Físico

Espectro de Raios-X

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.5 calibrado 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

Modelo Temporal do Gerador (v5.0)

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)

Coeficientes de Atenuação

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.

Calibração de Output

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

f-Factor Espectral

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.

Buildup Factors — GP Fitting (v5.0)

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

Scatter — Multi-Ordem Radiosity (v5.0)

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)

Monte Carlo Híbrido (v6.0)

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

Scatter do Paciente (v6.0)

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

Distribuição Espacial de Vazamento (v6.0)

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

Perfil Off-Axis 2D (v5.0)

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)

Modelo de Incerteza

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)

Atenuação no Ar

Aplicada automaticamente para distâncias > 0.5 m, atenuando cada bin espectral individualmente.

Validação

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.

Arquitetura

Dois arquivos core

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)

lib/physics.ts

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) completa
  • spectrumTransmission() — Atenuação espectral com GP buildup (Harima) ou Berger fallback
  • spectrumHVL() — 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 gerador
  • applyLoadRegulation() — Regulação de carga Child-Langmuir + droop

Perfil do Feixe:

  • heelEffectSpectral() — Heel effect bin-a-bin por posição no campo
  • calcObliquity() — cos³θ para pontos off-axis
  • calcBeamProfile() — Grid 11×11 com heel effect + obliquidade

Scatter:

  • calcScatterRadiosity() — Multi-ordem radiosity (6 patches, Hottel, Klein-Nishina)
  • comptonShift() — Degradação energética Compton por ordem
  • angularAlbedo() — Albedo ponderado pelo espectro com dependência angular
  • calcScatterLegacy() — 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 → dose
  • computeUncertainty() — Budget de incerteza componentizado
  • runValidation() — Auto-teste contra pontos IPEM-78/BJR-25

Buildup:

  • interpGPBuildup() — Interpolação de coeficientes GP por energia
  • gpBuildup() — Fator de buildup GP (Harima 1993)

lib/data/mu_rho_nist.ts

Dados tabelados:

  • NIST_MATERIALS — µ/ρ e µ_en/ρ para 9 materiais
  • GP_BUILDUP_COEFFS — Coeficientes GP (5 parâmetros) para 5 materiais × 10 energias
  • BUILDUP_COEFFS — Coeficientes de Berger (fallback) para 4 materiais
  • VALIDATION_POINTS — 10 pontos de referência IPEM-78/BJR-25

components/RadCalc.tsx

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

Estado Global

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.

Normas e Referências

Publicações Científicas

  • 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

Normas Regulamentares

  • 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)

Desenvolvimento

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ção

Stack: React 19 + TypeScript 5 + Vinext (Vite + App Router).

Limitações Residuais

  • 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.

Licença

Uso interno. Consulte o autor para termos de distribuição.

About

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.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors