morphos / js /analisis.js
Jose Salazar
Expand analyzer coverage: coagulation, blood gas, full urinalysis panels
a50e2a1
Raw
History Blame Contribute Delete
28.4 kB
// Gravedad
// La desviación se mide en múltiplos del ancho del rango de referencia.
// Ej: rango WBC 6-17 (ancho = 11). WBC = 28 → desviación = 11/11 = 1.0 → moderado.
const UMBRALES_GRAVEDAD = { leve: 0.5, moderado: 1.5 };
const clasificarGravedad = (valor, ref) => {
// Mide cuantos anchos de rango de referencia se desvia el valor
const rango = ref.superior - ref.inferior;
const desviacion = valor > ref.superior
? (valor - ref.superior) / rango
: (ref.inferior - valor) / rango;
if (desviacion <= UMBRALES_GRAVEDAD.leve) return 'leve';
if (desviacion <= UMBRALES_GRAVEDAD.moderado) return 'moderado';
return 'grave';
};
// Edad
const categorizarEdad = (edadMeses, especie) => {
if (edadMeses === null) return 'adulto';
if (especie === 'canino') {
if (edadMeses < 12) return 'cachorro';
if (edadMeses < 84) return 'adulto';
if (edadMeses < 120) return 'senior';
return 'geriatrico';
}
// felino
if (edadMeses < 12) return 'cachorro';
if (edadMeses < 120) return 'adulto';
return 'senior';
};
// Ajustes por edad
const AJUSTES_EDAD = {
canino: {
cachorro: { fal: { superior: 3.0 }, wbc: { superior: 1.25 } },
adulto: {},
senior: { bun: { superior: 1.15 }, creat: { superior: 1.15 } },
geriatrico: { bun: { superior: 1.25 }, creat: { superior: 1.25 }, fal: { superior: 1.40 } }
},
felino: {
cachorro: { fal: { superior: 2.0 }, wbc: { superior: 1.20 } },
adulto: {},
senior: { bun: { superior: 1.20 }, creat: { superior: 1.20 } }
}
};
// Ajustes por raza
const AJUSTES_RAZA = {
canino: [
{
razas: ['galgo', 'greyhound', 'whippet', 'lebrel'],
ajustes: {
rbc: { inferior: 1.15, superior: 1.15 },
hgb: { inferior: 1.12, superior: 1.12 },
hct: { inferior: 1.12, superior: 1.12 },
plt: { inferior: 0.75, superior: 0.75 }
}
},
{
razas: ['shiba', 'akita'],
ajustes: {
rbc: { inferior: 1.10, superior: 1.10 },
hct: { inferior: 1.08, superior: 1.08 },
hgb: { inferior: 1.08, superior: 1.08 }
}
}
]
};
// Ajustes por sexo
const AJUSTES_SEXO = {
felino: {
Macho: { creat: { superior: 1.15 } }
}
};
const obtenerAjustesRaza = (raza, especie) => {
const razaNorm = raza?.toLowerCase().trim() ?? '';
const grupos = AJUSTES_RAZA[especie] ?? [];
return grupos.find(g => g.razas.some(r => razaNorm.includes(r)))?.ajustes ?? {};
};
// Ajuste de referencias
const ajustarReferencias = (refsEspecie, paciente) => {
const catEdad = categorizarEdad(paciente.edadMeses, paciente.especie);
const ajEdad = AJUSTES_EDAD[paciente.especie]?.[catEdad] ?? {};
const ajRaza = obtenerAjustesRaza(paciente.raza, paciente.especie);
const ajSexo = AJUSTES_SEXO[paciente.especie]?.[paciente.sexo] ?? {};
// Multiplica los limites inferiores y superiores por los factores de edad, raza y sexo
return Object.entries(refsEspecie).reduce((acc, [clave, ref]) => {
const factorEdad = ajEdad[clave] ?? {};
const factorRaza = ajRaza[clave] ?? {};
const factorSexo = ajSexo[clave] ?? {};
acc[clave] = {
...ref,
inferior: ref.inferior * (factorEdad.inferior ?? 1) * (factorRaza.inferior ?? 1) * (factorSexo.inferior ?? 1),
superior: ref.superior * (factorEdad.superior ?? 1) * (factorRaza.superior ?? 1) * (factorSexo.superior ?? 1)
};
return acc;
}, {});
};
// Detección de patrones clínicos
const detectarPatrones = (hallazgos, especie, alt) => {
const mapa = hallazgos.reduce((acc, h) => { acc[h.clave] = h; return acc; }, {});
const esAlto = (clave) => mapa[clave]?.direccion === 'alto';
const esBajo = (clave) => mapa[clave]?.direccion === 'bajo';
const presente = (clave) => clave in mapa;
const valor = (clave) => mapa[clave]?.valor ?? null;
const gravedadDe = (...claves) => {
const clave = claves.find(c => mapa[c]);
return mapa[clave]?.gravedad ?? 'leve';
};
const patrones = [];
const agregar = (patron) => patrones.push(patron);
// Serie roja
if (esBajo('hct') || esBajo('hgb') || esBajo('rbc')) {
// Clasifica el tipo de anemia segun el VCM para sugerir la etiologia mas probable
const tipoPorVcm = !presente('vcm') ? '' :
esBajo('vcm') ? 'microcítica' :
esAlto('vcm') ? 'macrocítica' : 'normocítica';
const claveEtiologia = esBajo('vcm') ? 'ferropenia' :
esAlto('vcm') ? 'macrocitica' :
tipoPorVcm === 'normocítica' ? 'normocitica' : null;
const etiologia = claveEtiologia ? alt.anemia.etiologias?.[claveEtiologia] ?? '' : '';
agregar({
nombre: `${alt.anemia.nombre}${tipoPorVcm ? ` ${tipoPorVcm}` : ''}`,
descripcion: [alt.anemia.prefijo, etiologia].filter(Boolean).join(' '),
gravedad: gravedadDe('hct', 'hgb', 'rbc'),
parametros: ['hct', 'hgb', 'rbc', 'vcm'].filter(presente)
});
}
if (esAlto('hct') || esAlto('rbc')) agregar({
nombre: alt.eritrocitosis.nombre,
descripcion: alt.eritrocitosis.descripcion,
gravedad: gravedadDe('hct', 'rbc'),
parametros: ['hct', 'rbc', 'hgb'].filter(presente)
});
// Serie blanca
if (esAlto('wbc')) {
// Diferencia leucocitosis neutrofilica de linfocitica; si no hay diferencial, informa generico
const neutrofilia = esAlto('neutro');
const linfocitosis = esAlto('linfo');
if (neutrofilia) agregar({
nombre: alt.leucocitosis_neutrofilica.nombre,
descripcion: alt.leucocitosis_neutrofilica.descripcion,
gravedad: gravedadDe('wbc', 'neutro'),
parametros: ['wbc', 'neutro'].filter(presente)
});
if (linfocitosis) agregar({
nombre: alt.leucocitosis_linfocitica.nombre,
descripcion: alt.leucocitosis_linfocitica.descripcion,
gravedad: gravedadDe('wbc', 'linfo'),
parametros: ['wbc', 'linfo'].filter(presente)
});
if (!neutrofilia && !linfocitosis) agregar({
nombre: alt.leucocitosis.nombre,
descripcion: alt.leucocitosis.descripcion,
gravedad: gravedadDe('wbc'),
parametros: ['wbc']
});
}
if (esBajo('wbc')) agregar({
nombre: alt.leucopenia.nombre,
descripcion: alt.leucopenia.descripcion,
gravedad: gravedadDe('wbc'),
parametros: ['wbc']
});
if (esBajo('neutro')) agregar({
nombre: alt.neutropenia.nombre,
descripcion: alt.neutropenia.descripcion,
gravedad: gravedadDe('neutro'),
parametros: ['neutro']
});
if (esBajo('linfo')) agregar({
nombre: alt.linfopenia.nombre,
descripcion: alt.linfopenia.descripcion,
gravedad: gravedadDe('linfo'),
parametros: ['linfo']
});
if (esAlto('eosino')) agregar({
nombre: alt.eosinofilia.nombre,
descripcion: alt.eosinofilia.descripcion,
gravedad: gravedadDe('eosino'),
parametros: ['eosino']
});
// Plaquetas
if (esBajo('plt')) agregar({
nombre: alt.trombocitopenia.nombre,
descripcion: alt.trombocitopenia.descripcion,
gravedad: gravedadDe('plt'),
parametros: ['plt']
});
if (esAlto('plt')) agregar({
nombre: alt.trombocitosis.nombre,
descripcion: alt.trombocitosis.descripcion,
gravedad: gravedadDe('plt'),
parametros: ['plt']
});
// Hígado
if (esAlto('alt') && esAlto('ast')) agregar({
nombre: alt.dano_hepatocelular.nombre,
descripcion: alt.dano_hepatocelular.descripcion,
gravedad: gravedadDe('alt', 'ast'),
parametros: ['alt', 'ast'].filter(presente)
});
else if (esAlto('alt')) agregar({
nombre: alt.alt_aislada.nombre,
descripcion: alt.alt_aislada.descripcion,
gravedad: gravedadDe('alt'),
parametros: ['alt']
});
if (esAlto('fal')) agregar({
nombre: alt.patron_colestasico.nombre,
descripcion: alt.patron_colestasico.descripcion[especie] ?? alt.patron_colestasico.descripcion.canino,
gravedad: gravedadDe('fal'),
parametros: ['fal']
});
if (esAlto('bili')) agregar({
nombre: alt.hiperbilirrubinemia.nombre,
descripcion: alt.hiperbilirrubinemia.descripcion,
gravedad: gravedadDe('bili'),
parametros: ['bili']
});
// Riñón
if (esAlto('bun') && esAlto('creat')) agregar({
nombre: alt.azotemia.nombre,
descripcion: alt.azotemia.descripcion,
gravedad: gravedadDe('creat', 'bun'),
parametros: ['bun', 'creat'].filter(presente)
});
else if (esAlto('bun')) agregar({
nombre: alt.hiperuremia_bun.nombre,
descripcion: alt.hiperuremia_bun.descripcion,
gravedad: gravedadDe('bun'),
parametros: ['bun']
});
else if (esAlto('creat')) agregar({
nombre: alt.creatinina_aislada.nombre,
descripcion: alt.creatinina_aislada.descripcion,
gravedad: gravedadDe('creat'),
parametros: ['creat']
});
if (esBajo('bun')) agregar({
nombre: alt.bun_disminuido.nombre,
descripcion: alt.bun_disminuido.descripcion,
gravedad: gravedadDe('bun'),
parametros: ['bun']
});
// Glucosa
if (esAlto('gluc')) agregar({
nombre: alt.hiperglucemia.nombre,
descripcion: alt.hiperglucemia.descripcion[especie] ?? alt.hiperglucemia.descripcion.canino,
gravedad: gravedadDe('gluc'),
parametros: ['gluc']
});
if (esBajo('gluc')) agregar({
nombre: alt.hipoglucemia.nombre,
descripcion: alt.hipoglucemia.descripcion,
gravedad: gravedadDe('gluc'),
parametros: ['gluc']
});
// Proteínas
if (esAlto('prot')) agregar({
nombre: alt.hiperproteinemia.nombre,
descripcion: alt.hiperproteinemia.descripcion,
gravedad: gravedadDe('prot'),
parametros: ['prot']
});
if (esBajo('alb')) {
const hipoproteinemia = esBajo('prot');
const claveAlteracion = hipoproteinemia ? 'hipoproteinemia_hipoalbuminemia' : 'hipoalbuminemia';
agregar({
nombre: alt[claveAlteracion].nombre,
descripcion: alt[claveAlteracion].descripcion,
gravedad: gravedadDe('alb'),
parametros: ['alb', ...(hipoproteinemia ? ['prot'] : [])].filter(presente)
});
}
// Electrolitos
const valSodio = valor('sodio');
const valPotasio = valor('potasio');
// Ratio Na/K < 27 es sugestivo de hipoadrenocorticismo; la gravedad aumenta a menor ratio
if (valSodio !== null && valPotasio !== null && valPotasio > 0) {
const ratioNaK = valSodio / valPotasio;
if (ratioNaK < 27) agregar({
nombre: alt.ratio_nak.nombre,
descripcion: alt.ratio_nak.descripcion.replace('{ratio}', ratioNaK.toFixed(1)),
gravedad: ratioNaK < 20 ? 'grave' : ratioNaK < 24 ? 'moderado' : 'leve',
parametros: ['sodio', 'potasio'].filter(presente)
});
}
if (esAlto('sodio')) agregar({
nombre: alt.hipernatremia.nombre,
descripcion: alt.hipernatremia.descripcion,
gravedad: gravedadDe('sodio'),
parametros: ['sodio']
});
if (esBajo('sodio')) agregar({
nombre: alt.hiponatremia.nombre,
descripcion: alt.hiponatremia.descripcion,
gravedad: gravedadDe('sodio'),
parametros: ['sodio']
});
if (esAlto('calc')) agregar({
nombre: alt.hipercalcemia.nombre,
descripcion: alt.hipercalcemia.descripcion,
gravedad: gravedadDe('calc'),
parametros: ['calc']
});
if (esBajo('calc')) agregar({
nombre: alt.hipocalcemia.nombre,
descripcion: alt.hipocalcemia.descripcion,
gravedad: gravedadDe('calc'),
parametros: ['calc']
});
if (esBajo('potasio')) agregar({
nombre: alt.hipopotasemia.nombre,
descripcion: alt.hipopotasemia.descripcion,
gravedad: gravedadDe('potasio'),
parametros: ['potasio']
});
if (esAlto('potasio')) agregar({
nombre: alt.hiperpotasemia.nombre,
descripcion: alt.hiperpotasemia.descripcion,
gravedad: gravedadDe('potasio'),
parametros: ['potasio']
});
if (esAlto('fosf')) agregar({
nombre: alt.hiperfosforemia.nombre,
descripcion: alt.hiperfosforemia.descripcion,
gravedad: gravedadDe('fosf'),
parametros: ['fosf']
});
// Urianálisis
const valUsg = valor('usg');
if (valUsg !== null && valUsg < 1.008) agregar({
nombre: alt.hiposthenuria.nombre,
descripcion: alt.hiposthenuria.descripcion,
gravedad: valUsg < 1.005 ? 'grave' : 'moderado',
parametros: ['usg']
});
else if (valUsg !== null && valUsg < 1.013) agregar({
nombre: alt.isosthenuria.nombre,
descripcion: alt.isosthenuria.descripcion,
gravedad: 'leve',
parametros: ['usg']
});
// Tiroides
if (especie === 'canino' && esBajo('t4_total')) agregar({
nombre: alt.hipotiroidismo.nombre,
descripcion: alt.hipotiroidismo.descripcion.canino,
gravedad: gravedadDe('t4_total'),
parametros: ['t4_total'].filter(presente)
});
if (esAlto('t4_total')) agregar({
nombre: alt.hipertiroidismo.nombre,
descripcion: alt.hipertiroidismo.descripcion[especie] ?? alt.hipertiroidismo.descripcion.felino,
gravedad: gravedadDe('t4_total'),
parametros: ['t4_total'].filter(presente)
});
// Suprarrenal / Cortisol
if (esAlto('cortisol_acth')) agregar({
nombre: alt.hiperadrenocorticismo.nombre,
descripcion: alt.hiperadrenocorticismo.descripcion[especie] ?? alt.hiperadrenocorticismo.descripcion.canino,
gravedad: gravedadDe('cortisol_acth'),
parametros: ['cortisol_acth', ...(presente('cortisol_bas') ? ['cortisol_bas'] : [])]
});
if (esBajo('cortisol_acth')) agregar({
nombre: alt.hipoadrenocorticismo_cortisol.nombre,
descripcion: alt.hipoadrenocorticismo_cortisol.descripcion,
gravedad: gravedadDe('cortisol_acth'),
parametros: ['cortisol_acth', ...(presente('cortisol_bas') ? ['cortisol_bas'] : [])]
});
if (esBajo('cortisol_bas') && !presente('cortisol_acth')) agregar({
nombre: alt.cortisol_basal_bajo.nombre,
descripcion: alt.cortisol_basal_bajo.descripcion,
gravedad: 'moderado',
parametros: ['cortisol_bas']
});
// Insulina
if (esBajo('insulina') && esAlto('gluc')) agregar({
nombre: alt.deficit_insulina.nombre,
descripcion: alt.deficit_insulina.descripcion,
gravedad: 'moderado',
parametros: ['insulina', 'gluc'].filter(presente)
});
// Páncreas exocrino (PLI)
if (esAlto('pli')) agregar({
nombre: alt.pancreatitis.nombre,
descripcion: alt.pancreatitis.descripcion[especie] ?? alt.pancreatitis.descripcion.canino,
gravedad: gravedadDe('pli'),
parametros: ['pli', ...(presente('lipasa') ? ['lipasa'] : []), ...(presente('amylasa') ? ['amylasa'] : [])].filter(presente)
});
if (esAlto('amylasa') && !presente('pli')) agregar({
nombre: alt.hiperamylasemia.nombre,
descripcion: alt.hiperamylasemia.descripcion,
gravedad: gravedadDe('amylasa'),
parametros: ['amylasa']
});
// Tiroides — TSH
if (esAlto('tsh')) agregar({
nombre: alt.tsh_elevado.nombre,
descripcion: alt.tsh_elevado.descripcion[especie] ?? alt.tsh_elevado.descripcion.canino,
gravedad: gravedadDe('tsh'),
parametros: ['tsh', ...(presente('t4_total') ? ['t4_total'] : []), ...(presente('t4_libre') ? ['t4_libre'] : [])].filter(presente)
});
if (esBajo('tsh')) agregar({
nombre: alt.tsh_suprimido.nombre,
descripcion: alt.tsh_suprimido.descripcion[especie] ?? alt.tsh_suprimido.descripcion.canino,
gravedad: gravedadDe('tsh'),
parametros: ['tsh', ...(presente('t4_total') ? ['t4_total'] : [])].filter(presente)
});
if (esBajo('t4_libre') && !presente('tsh')) agregar({
nombre: alt.t4_libre_baja.nombre,
descripcion: alt.t4_libre_baja.descripcion[especie] ?? alt.t4_libre_baja.descripcion.canino,
gravedad: gravedadDe('t4_libre'),
parametros: ['t4_libre', ...(presente('t4_total') ? ['t4_total'] : [])].filter(presente)
});
// Biomarcadores cardíacos
if (esAlto('ctni')) agregar({
nombre: alt.dano_miocardico.nombre,
descripcion: alt.dano_miocardico.descripcion,
gravedad: gravedadDe('ctni'),
parametros: ['ctni', ...(presente('nt_probnp') ? ['nt_probnp'] : [])].filter(presente)
});
if (esAlto('nt_probnp')) agregar({
nombre: alt.cardiopatia_bnp.nombre,
descripcion: alt.cardiopatia_bnp.descripcion[especie] ?? alt.cardiopatia_bnp.descripcion.canino,
gravedad: gravedadDe('nt_probnp'),
parametros: ['nt_probnp', ...(presente('ctni') ? ['ctni'] : [])].filter(presente)
});
// Proteínas de fase aguda
if (esAlto('crp') || esAlto('saa')) agregar({
nombre: alt.inflamacion_aguda.nombre,
descripcion: alt.inflamacion_aguda.descripcion[especie] ?? alt.inflamacion_aguda.descripcion.canino,
gravedad: gravedadDe('crp', 'saa'),
parametros: ['crp', 'saa'].filter(presente)
});
// Progesterona
if (esAlto('progesterona')) agregar({
nombre: alt.progesterona_elevada.nombre,
descripcion: alt.progesterona_elevada.descripcion[especie] ?? alt.progesterona_elevada.descripcion.canino,
gravedad: gravedadDe('progesterona'),
parametros: ['progesterona']
});
// Magnesio
if (esBajo('magnesio')) agregar({
nombre: alt.hipomagnesemia.nombre,
descripcion: alt.hipomagnesemia.descripcion,
gravedad: gravedadDe('magnesio'),
parametros: ['magnesio']
});
if (esAlto('magnesio')) agregar({
nombre: alt.hipermagnesemia.nombre,
descripcion: alt.hipermagnesemia.descripcion,
gravedad: gravedadDe('magnesio'),
parametros: ['magnesio']
});
// Hierro
if (esBajo('hierro')) agregar({
nombre: alt.ferropenia_hierro.nombre,
descripcion: alt.ferropenia_hierro.descripcion,
gravedad: gravedadDe('hierro'),
parametros: ['hierro']
});
// Ácido úrico
if (esAlto('ac_urico')) agregar({
nombre: alt.ac_urico_elevado.nombre,
descripcion: alt.ac_urico_elevado.descripcion,
gravedad: gravedadDe('ac_urico'),
parametros: ['ac_urico']
});
// LDH
if (esAlto('ldh')) agregar({
nombre: alt.ldh_elevada.nombre,
descripcion: alt.ldh_elevada.descripcion,
gravedad: gravedadDe('ldh'),
parametros: ['ldh']
});
// Monitorización de fármacos (TDM)
if (esBajo('fenobarbital')) agregar({
nombre: alt.fenobarbital_subterapeutico.nombre,
descripcion: alt.fenobarbital_subterapeutico.descripcion,
gravedad: gravedadDe('fenobarbital'),
parametros: ['fenobarbital']
});
if (esAlto('fenobarbital')) agregar({
nombre: alt.fenobarbital_toxico.nombre,
descripcion: alt.fenobarbital_toxico.descripcion,
gravedad: gravedadDe('fenobarbital'),
parametros: ['fenobarbital']
});
if (esBajo('ciclosporina')) agregar({
nombre: alt.ciclosporina_subterapeutica.nombre,
descripcion: alt.ciclosporina_subterapeutica.descripcion,
gravedad: gravedadDe('ciclosporina'),
parametros: ['ciclosporina']
});
if (esAlto('ciclosporina')) agregar({
nombre: alt.ciclosporina_toxica.nombre,
descripcion: alt.ciclosporina_toxica.descripcion,
gravedad: gravedadDe('ciclosporina'),
parametros: ['ciclosporina']
});
// Coagulación
if (esAlto('pt') && !esAlto('aptt')) agregar({
nombre: alt.coagulopatia_extrinseca.nombre,
descripcion: alt.coagulopatia_extrinseca.descripcion,
gravedad: gravedadDe('pt'),
parametros: ['pt']
});
if (esAlto('aptt') && !esAlto('pt')) agregar({
nombre: alt.coagulopatia_intrinseca.nombre,
descripcion: alt.coagulopatia_intrinseca.descripcion,
gravedad: gravedadDe('aptt'),
parametros: ['aptt']
});
if (esAlto('pt') && esAlto('aptt')) agregar({
nombre: alt.coagulopatia_mixta.nombre,
descripcion: alt.coagulopatia_mixta.descripcion,
gravedad: gravedadDe('pt', 'aptt', 'act'),
parametros: ['pt', 'aptt', ...(presente('act') ? ['act'] : [])].filter(presente)
});
if ((esAlto('ddimeros') || esAlto('fdp')) && esBajo('fibrinogeno')) agregar({
nombre: alt.cid.nombre,
descripcion: alt.cid.descripcion,
gravedad: 'grave',
parametros: ['ddimeros', 'fdp', 'fibrinogeno', 'plt'].filter(presente)
});
if (esAlto('fibrinogeno') && !esAlto('ddimeros') && !esAlto('fdp')) agregar({
nombre: alt.hiperfibrinogenemia.nombre,
descripcion: alt.hiperfibrinogenemia.descripcion,
gravedad: gravedadDe('fibrinogeno'),
parametros: ['fibrinogeno']
});
if (esBajo('fibrinogeno') && !esAlto('ddimeros') && !esAlto('fdp')) agregar({
nombre: alt.hipofibrinogenemia.nombre,
descripcion: alt.hipofibrinogenemia.descripcion,
gravedad: gravedadDe('fibrinogeno'),
parametros: ['fibrinogeno']
});
if (esBajo('vwf')) agregar({
nombre: alt.deficit_vwf.nombre,
descripcion: alt.deficit_vwf.descripcion,
gravedad: gravedadDe('vwf'),
parametros: ['vwf', ...(presente('aptt') ? ['aptt'] : [])].filter(presente)
});
if (esBajo('antitrombina')) agregar({
nombre: alt.antitrombina_baja.nombre,
descripcion: alt.antitrombina_baja.descripcion,
gravedad: gravedadDe('antitrombina'),
parametros: ['antitrombina']
});
// Urianálisis — sedimento / UPC
if (esAlto('rbc_uri')) agregar({
nombre: alt.hematuria_uri.nombre,
descripcion: alt.hematuria_uri.descripcion,
gravedad: gravedadDe('rbc_uri'),
parametros: ['rbc_uri']
});
if (esAlto('wbc_uri')) agregar({
nombre: alt.piuria.nombre,
descripcion: alt.piuria.descripcion,
gravedad: gravedadDe('wbc_uri'),
parametros: ['wbc_uri']
});
if (esAlto('upc')) agregar({
nombre: alt.proteinuria_upc.nombre,
descripcion: alt.proteinuria_upc.descripcion,
gravedad: gravedadDe('upc'),
parametros: ['upc']
});
// Gasometría — ácido-base
if (presente('ph_sangre')) {
const phBajo = esBajo('ph_sangre');
const phAlto = esAlto('ph_sangre');
const hipercarbia = esAlto('pco2');
const hipocarbia = esBajo('pco2');
const componenteAcidMet = esBajo('hco3') || esBajo('exceso_base');
const componenteAlcalMet = esAlto('hco3') || esAlto('exceso_base');
if (phBajo) {
if (hipercarbia && componenteAcidMet) {
agregar({
nombre: alt.acidosis_respiratoria.nombre + ' + ' + alt.acidosis_metabolica.nombre,
descripcion: alt.acidosis_metabolica.descripcion,
gravedad: 'grave',
parametros: ['ph_sangre', 'pco2', 'hco3', 'exceso_base'].filter(presente)
});
} else if (hipercarbia) {
agregar({
nombre: alt.acidosis_respiratoria.nombre,
descripcion: alt.acidosis_respiratoria.descripcion,
gravedad: gravedadDe('ph_sangre', 'pco2'),
parametros: ['ph_sangre', 'pco2'].filter(presente)
});
} else if (componenteAcidMet) {
agregar({
nombre: alt.acidosis_metabolica.nombre,
descripcion: alt.acidosis_metabolica.descripcion,
gravedad: gravedadDe('ph_sangre', 'hco3', 'exceso_base'),
parametros: ['ph_sangre', 'hco3', 'exceso_base', 'anion_gap'].filter(presente)
});
}
}
if (phAlto) {
if (hipocarbia && componenteAlcalMet) {
agregar({
nombre: alt.alcalosis_respiratoria.nombre + ' + ' + alt.alcalosis_metabolica.nombre,
descripcion: alt.alcalosis_metabolica.descripcion,
gravedad: 'grave',
parametros: ['ph_sangre', 'pco2', 'hco3', 'exceso_base'].filter(presente)
});
} else if (hipocarbia) {
agregar({
nombre: alt.alcalosis_respiratoria.nombre,
descripcion: alt.alcalosis_respiratoria.descripcion,
gravedad: gravedadDe('ph_sangre', 'pco2'),
parametros: ['ph_sangre', 'pco2'].filter(presente)
});
} else if (componenteAlcalMet) {
agregar({
nombre: alt.alcalosis_metabolica.nombre,
descripcion: alt.alcalosis_metabolica.descripcion,
gravedad: gravedadDe('ph_sangre', 'hco3', 'exceso_base'),
parametros: ['ph_sangre', 'hco3', 'exceso_base'].filter(presente)
});
}
}
}
if (esBajo('po2')) agregar({
nombre: alt.hipoxemia.nombre,
descripcion: alt.hipoxemia.descripcion,
gravedad: gravedadDe('po2', 'so2'),
parametros: ['po2', ...(presente('so2') ? ['so2'] : [])].filter(presente)
});
if (esAlto('lactato')) agregar({
nombre: alt.hiperlactatemia.nombre,
descripcion: alt.hiperlactatemia.descripcion,
gravedad: gravedadDe('lactato'),
parametros: ['lactato']
});
if (esBajo('ca_ion')) agregar({
nombre: alt.ca_ionizado_bajo.nombre,
descripcion: alt.ca_ionizado_bajo.descripcion,
gravedad: gravedadDe('ca_ion'),
parametros: ['ca_ion']
});
if (esAlto('ca_ion')) agregar({
nombre: alt.ca_ionizado_alto.nombre,
descripcion: alt.ca_ionizado_alto.descripcion,
gravedad: gravedadDe('ca_ion'),
parametros: ['ca_ion']
});
if (esAlto('anion_gap')) agregar({
nombre: alt.anion_gap_elevado.nombre,
descripcion: alt.anion_gap_elevado.descripcion,
gravedad: gravedadDe('anion_gap'),
parametros: ['anion_gap', ...(presente('lactato') ? ['lactato'] : [])].filter(presente)
});
return patrones;
};
// Exportación principal
export const analizarResultados = (valoresInput, paciente, referencias, alteraciones) => {
const refsEspecie = referencias[paciente.especie];
if (!refsEspecie) return { hallazgos: [], patrones: [] };
// Ajusta los rangos segun edad, raza y sexo antes de comparar
const refsAjustadas = ajustarReferencias(refsEspecie, paciente);
const hallazgos = [];
for (const [clave, ref] of Object.entries(refsAjustadas)) {
const crudo = valoresInput[clave];
if (crudo === null || crudo === undefined || crudo === '') continue;
const valorNum = parseFloat(crudo);
if (isNaN(valorNum)) continue;
if (valorNum > ref.superior) {
hallazgos.push({
clave, nombre: ref.nombre, valor: valorNum, unidad: ref.unidad,
direccion: 'alto', gravedad: clasificarGravedad(valorNum, ref)
});
} else if (valorNum < ref.inferior) {
hallazgos.push({
clave, nombre: ref.nombre, valor: valorNum, unidad: ref.unidad,
direccion: 'bajo', gravedad: clasificarGravedad(valorNum, ref)
});
}
}
return { hallazgos, patrones: detectarPatrones(hallazgos, paciente.especie, alteraciones) };
};