87 lines
3.5 KiB
JavaScript
87 lines
3.5 KiB
JavaScript
var bhutaniCache = null;
|
|
var aapCache = null;
|
|
|
|
export function loadAapBilirubinThresholds() {
|
|
if (aapCache) return Promise.resolve(aapCache);
|
|
return fetch('/data/calculators/aap-bilirubin-thresholds.json', { credentials: 'same-origin' })
|
|
.then(function(response) {
|
|
if (!response.ok) throw new Error('Failed to load AAP bilirubin threshold data');
|
|
return response.json();
|
|
})
|
|
.then(function(data) {
|
|
aapCache = data;
|
|
return aapCache;
|
|
});
|
|
}
|
|
|
|
function pickGestationalAgeTable(tables, gaWeeks, maxWeek) {
|
|
var ga = Math.max(35, Math.min(maxWeek, parseInt(gaWeeks, 10)));
|
|
return tables[String(ga)];
|
|
}
|
|
|
|
export function selectAapBilirubinThresholdTables(thresholds, gaWeeks, risk) {
|
|
var hasRiskFactors = risk === 'medium';
|
|
return {
|
|
phototherapy: hasRiskFactors
|
|
? pickGestationalAgeTable(thresholds.phototherapy.risk, gaWeeks, 38)
|
|
: pickGestationalAgeTable(thresholds.phototherapy.noRisk, gaWeeks, 40),
|
|
exchange: hasRiskFactors
|
|
? pickGestationalAgeTable(thresholds.exchange.risk, gaWeeks, 38)
|
|
: pickGestationalAgeTable(thresholds.exchange.noRisk, gaWeeks, 38)
|
|
};
|
|
}
|
|
|
|
export function calculateAapBilirubinAssessment(thresholds, gaWeeks, hours, tsb, risk) {
|
|
var tables = selectAapBilirubinThresholdTables(thresholds, gaWeeks, risk);
|
|
var phototherapyThreshold = interpolateThreshold(tables.phototherapy, hours);
|
|
var exchangeThreshold = interpolateThreshold(tables.exchange, hours);
|
|
var aboveExchange = tsb >= exchangeThreshold;
|
|
var abovePhototherapy = tsb >= phototherapyThreshold;
|
|
return {
|
|
phototherapyTable: tables.phototherapy,
|
|
exchangeTable: tables.exchange,
|
|
phototherapyThreshold: phototherapyThreshold,
|
|
exchangeThreshold: exchangeThreshold,
|
|
phototherapyMargin: tsb - phototherapyThreshold,
|
|
exchangeMargin: tsb - exchangeThreshold,
|
|
abovePhototherapy: abovePhototherapy,
|
|
aboveExchange: aboveExchange,
|
|
status: aboveExchange ? 'exchange' : (abovePhototherapy ? 'phototherapy' : 'below')
|
|
};
|
|
}
|
|
|
|
export function loadBhutaniZones() {
|
|
if (bhutaniCache) return Promise.resolve(bhutaniCache);
|
|
return fetch('/data/calculators/bhutani-zones.json', { credentials: 'same-origin' })
|
|
.then(function(response) {
|
|
if (!response.ok) throw new Error('Failed to load Bhutani zone data');
|
|
return response.json();
|
|
})
|
|
.then(function(data) {
|
|
bhutaniCache = data.zones || {};
|
|
return bhutaniCache;
|
|
});
|
|
}
|
|
|
|
export function interpolateThreshold(table, hours) {
|
|
var keys = Object.keys(table).map(Number).sort(function(a,b){return a-b;});
|
|
if (hours <= keys[0]) return table[keys[0]];
|
|
if (hours >= keys[keys.length-1]) return table[keys[keys.length-1]];
|
|
for (var i = 0; i < keys.length-1; i++) {
|
|
if (hours >= keys[i] && hours <= keys[i+1]) {
|
|
var t = (hours - keys[i]) / (keys[i+1] - keys[i]);
|
|
return table[keys[i]] + t * (table[keys[i+1]] - table[keys[i]]);
|
|
}
|
|
}
|
|
return table[keys[0]];
|
|
}
|
|
|
|
export function classifyBhutaniRisk(zones, hours, tsb) {
|
|
var p95 = interpolateThreshold(zones.p95, hours);
|
|
var p75 = interpolateThreshold(zones.p75, hours);
|
|
var p40 = interpolateThreshold(zones.p40, hours);
|
|
if (tsb >= p95) return { zone: 'High-Risk Zone', color: '#ef4444', bg: '#fee2e2', p95: p95, p75: p75, p40: p40 };
|
|
if (tsb >= p75) return { zone: 'High-Intermediate Zone', color: '#f97316', bg: '#ffedd5', p95: p95, p75: p75, p40: p40 };
|
|
if (tsb >= p40) return { zone: 'Low-Intermediate Zone', color: '#f59e0b', bg: '#fef3c7', p95: p95, p75: p75, p40: p40 };
|
|
return { zone: 'Low-Risk Zone', color: '#10b981', bg: '#d1fae5', p95: p95, p75: p75, p40: p40 };
|
|
}
|