70 lines
3.3 KiB
JavaScript
70 lines
3.3 KiB
JavaScript
var fentonCache = null;
|
|
|
|
export function loadFentonLmsData() {
|
|
if (fentonCache) return Promise.resolve(fentonCache);
|
|
return fetch('/data/calculators/fenton-lms.json', { credentials: 'same-origin' })
|
|
.then(function(response) {
|
|
if (!response.ok) throw new Error('Failed to load Fenton LMS data');
|
|
return response.json();
|
|
})
|
|
.then(function(data) {
|
|
fentonCache = data.weightLms || {};
|
|
return fentonCache;
|
|
});
|
|
}
|
|
|
|
export function interpolateLMS(table, val) {
|
|
var keys = Object.keys(table).map(Number).sort(function(a,b){return a-b;});
|
|
if (val <= keys[0]) return table[keys[0]];
|
|
if (val >= keys[keys.length-1]) return table[keys[keys.length-1]];
|
|
for (var i = 0; i < keys.length - 1; i++) {
|
|
if (val >= keys[i] && val <= keys[i+1]) {
|
|
var t = (val - keys[i]) / (keys[i+1] - keys[i]);
|
|
var a = table[keys[i]], b = table[keys[i+1]];
|
|
return { L: a.L + t*(b.L-a.L), M: a.M + t*(b.M-a.M), S: a.S + t*(b.S-a.S) };
|
|
}
|
|
}
|
|
return table[keys[0]];
|
|
}
|
|
|
|
export function calcZ(value, L, M, S) {
|
|
if (Math.abs(L) < 0.001) return Math.log(value / M) / S;
|
|
return (Math.pow(value / M, L) - 1) / (L * S);
|
|
}
|
|
|
|
export function zToPercentile(z) {
|
|
var a1=0.254829592, a2=-0.284496736, a3=1.421413741, a4=-1.453152027, a5=1.061405429, p=0.3275911;
|
|
var sign = z < 0 ? -1 : 1;
|
|
var x = Math.abs(z) / Math.sqrt(2);
|
|
var t = 1 / (1 + p * x);
|
|
var y = 1 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t * Math.exp(-x*x);
|
|
return Math.round(((1 + sign * y) / 2) * 1000) / 10;
|
|
}
|
|
|
|
export function classifyGA(weeks, days) {
|
|
var total = weeks + (days || 0) / 7;
|
|
if (total < 28) return { label: 'Extremely Preterm', color: '#dc2626', icon: 'fa-triangle-exclamation' };
|
|
if (total < 32) return { label: 'Very Preterm', color: '#ea580c', icon: 'fa-triangle-exclamation' };
|
|
if (total < 34) return { label: 'Moderate Preterm', color: '#d97706', icon: 'fa-circle-exclamation' };
|
|
if (total < 37) return { label: 'Late Preterm', color: '#ca8a04', icon: 'fa-circle-info' };
|
|
if (total < 39) return { label: 'Early Term', color: '#2563eb', icon: 'fa-circle-info' };
|
|
if (total < 41) return { label: 'Full Term', color: '#16a34a', icon: 'fa-circle-check' };
|
|
if (total < 42) return { label: 'Late Term', color: '#d97706', icon: 'fa-circle-info' };
|
|
return { label: 'Post Term', color: '#dc2626', icon: 'fa-triangle-exclamation' };
|
|
}
|
|
|
|
export function classifyWeight(percentile) {
|
|
if (percentile < 3) return { label: 'Severely SGA', color: '#dc2626', detail: '<3rd percentile' };
|
|
if (percentile < 10) return { label: 'SGA', color: '#ea580c', detail: '<10th percentile' };
|
|
if (percentile > 97) return { label: 'Severely LGA', color: '#dc2626', detail: '>97th percentile' };
|
|
if (percentile > 90) return { label: 'LGA', color: '#ea580c', detail: '>90th percentile' };
|
|
return { label: 'AGA', color: '#16a34a', detail: '10th-90th percentile' };
|
|
}
|
|
|
|
export function classifyBirthWeight(grams) {
|
|
if (grams < 1000) return { label: 'Extremely Low Birth Weight (ELBW)', color: '#dc2626' };
|
|
if (grams < 1500) return { label: 'Very Low Birth Weight (VLBW)', color: '#ea580c' };
|
|
if (grams < 2500) return { label: 'Low Birth Weight (LBW)', color: '#d97706' };
|
|
if (grams <= 4000) return { label: 'Normal Birth Weight', color: '#16a34a' };
|
|
return { label: 'Macrosomia (>4000g)', color: '#ea580c' };
|
|
}
|