Questa è una vecchia versione del documento!
<!DOCTYPE html> <html lang=“it”> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Calcolatore Probabilità NEC</title>
<style>
.nec-calculator {
max-width: 800px;
margin: 20px auto;
font-family: Arial, sans-serif;
background: #f9f9f9;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.input-section {
background: white;
padding: 15px;
margin-bottom: 20px;
border-radius: 5px;
border-left: 4px solid #2196F3;
}
.probability-display {
background: #e3f2fd;
padding: 15px;
margin-bottom: 20px;
border-radius: 5px;
text-align: center;
font-size: 18px;
font-weight: bold;
}
.signs-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 10px;
margin-bottom: 20px;
}
.sign-card {
background: white;
padding: 12px;
border-radius: 5px;
border: 1px solid #ddd;
cursor: pointer;
transition: all 0.3s ease;
}
.sign-card:hover {
background: #f0f8ff;
border-color: #2196F3;
}
.sign-card.positive {
background: #ffebee;
border-color: #f44336;
}
.sign-card.negative {
background: #e8f5e8;
border-color: #4caf50;
}
.sign-name {
font-weight: bold;
margin-bottom: 5px;
}
.sign-lr {
font-size: 12px;
color: #666;
}
.calculation-history {
background: white;
padding: 15px;
border-radius: 5px;
margin-bottom: 20px;
}
.calculation-step {
padding: 8px;
margin-bottom: 8px;
background: #f5f5f5;
border-radius: 3px;
font-family: monospace;
font-size: 14px;
}
.controls {
text-align: center;
}
.btn {
background: #2196F3;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
margin: 5px;
font-size: 14px;
}
.btn:hover {
background: #1976D2;
}
.btn-reset {
background: #f44336;
}
.btn-reset:hover {
background: #d32f2f;
}
input[type="number"] {
width: 80px;
padding: 5px;
border: 1px solid #ddd;
border-radius: 3px;
}
.legend {
font-size: 12px;
color: #666;
margin-top: 10px;
}
</style>
</head> <body>
<div class="nec-calculator">
<h2>🩺 Calcolatore Probabilità NEC</h2>
<div class="input-section">
<label for="priorProb">Probabilità a priori (0-1): </label>
<input type="number" id="priorProb" min="0" max="1" step="0.01" value="0.2">
<button class="btn" onclick="updatePriorProbability()">Aggiorna</button>
</div>
<div class="probability-display" id="currentProb">
Probabilità attuale: 20.0%
</div>
<h3>Segni Clinici</h3>
<div class="signs-grid" id="clinicalSigns"></div>
<h3>Segni Radiologici</h3>
<div class="signs-grid" id="radiologicalSigns"></div>
<div class="legend">
💡 Clicca sui segni per aggiungerli come positivi (rosso) o negativi (verde). Clicca nuovamente per rimuoverli.
</div>
<div class="calculation-history">
<h3>Cronologia Calcoli</h3>
<div id="calculationSteps"></div>
</div>
<div class="controls">
<button class="btn btn-reset" onclick="resetCalculation()">Reset Calcolo</button>
<button class="btn" onclick="exportResults()">Esporta Risultati</button>
</div>
</div>
<script>
// Dati LR per i segni/sintomi di NEC
const necSigns = {
clinical: [
{name: "Distensione addominale", lrPos: 1.71, lrNeg: 0.33},
{name: "Dolorabilità addominale", lrPos: 7.05, lrNeg: 0.62},
{name: "Aspirato aumentato/bilioso", lrPos: 1.17, lrNeg: 0.91},
{name: "Colorazione addominale", lrPos: 8.54, lrNeg: 0.81},
{name: "Massa addominale", lrPos: 1.27, lrNeg: 1.00},
{name: "Sangue nelle feci", lrPos: 8.79, lrNeg: 0.81},
{name: "Muco nelle feci", lrPos: 7.14, lrNeg: 0.96}
],
radiological: [
{name: "Pneumatosi", lrPos: 43.6, lrNeg: 0.57},
{name: "Gas portale", lrPos: 25.0, lrNeg: 0.98},
{name: "Pneumoperitoneo", lrPos: 4.16, lrNeg: 0.94},
{name: "Ansa fissa", lrPos: 2.59, lrNeg: 0.96},
{name: "Addome senza gas", lrPos: 1.41, lrNeg: 0.99}
]
};
let currentProbability = 0.2;
let calculationSteps = [];
let signStates = {}; // 'positive', 'negative', or null
function initializeCalculator() {
renderSigns('clinical', 'clinicalSigns');
renderSigns('radiological', 'radiologicalSigns');
updateDisplay();
}
function renderSigns(category, containerId) {
const container = document.getElementById(containerId);
container.innerHTML = '';
necSigns[category].forEach((sign, index) => {
const signId = `${category}_${index}`;
const signElement = document.createElement('div');
signElement.className = 'sign-card';
signElement.id = signId;
signElement.onclick = () => toggleSign(signId, sign);
const state = signStates[signId];
if (state === 'positive') signElement.classList.add('positive');
if (state === 'negative') signElement.classList.add('negative');
signElement.innerHTML = `
<div class="sign-name">${sign.name}</div>
<div class="sign-lr">LR+ = ${sign.lrPos} | LR- = ${sign.lrNeg}</div>
`;
container.appendChild(signElement);
});
}
function toggleSign(signId, signData) {
const currentState = signStates[signId];
let newState;
if (currentState === null || currentState === undefined) {
newState = 'positive';
} else if (currentState === 'positive') {
newState = 'negative';
} else {
newState = null;
}
signStates[signId] = newState;
if (newState === 'positive') {
applyLikelihoodRatio(signData.name, signData.lrPos, true);
} else if (newState === 'negative') {
applyLikelihoodRatio(signData.name, signData.lrNeg, false);
}
// Re-render per aggiornare i colori
renderSigns('clinical', 'clinicalSigns');
renderSigns('radiological', 'radiologicalSigns');
updateDisplay();
}
function applyLikelihoodRatio(signName, lr, isPositive) {
const oldProb = currentProbability;
const oldOdds = oldProb / (1 - oldProb);
const newOdds = oldOdds * lr;
const newProb = newOdds / (1 + newOdds);
currentProbability = newProb;
const step = {
sign: signName,
type: isPositive ? 'positivo' : 'negativo',
lr: lr,
oldProb: oldProb,
newProb: newProb,
calculation: `${(oldProb * 100).toFixed(1)}% → Odds: ${oldOdds.toFixed(3)} × ${lr} = ${newOdds.toFixed(3)} → ${(newProb * 100).toFixed(1)}%`
};
calculationSteps.push(step);
}
function updatePriorProbability() {
const newPrior = parseFloat(document.getElementById('priorProb').value);
if (newPrior >= 0 && newPrior <= 1) {
currentProbability = newPrior;
resetCalculation();
} else {
alert('Inserire un valore tra 0 e 1');
}
}
function updateDisplay() {
const probDisplay = document.getElementById('currentProb');
const percentage = (currentProbability * 100).toFixed(1);
probDisplay.textContent = `Probabilità attuale: ${percentage}%`;
// Cambia colore in base alla probabilità
if (currentProbability < 0.3) {
probDisplay.style.backgroundColor = '#e8f5e8';
probDisplay.style.color = '#2e7d32';
} else if (currentProbability < 0.7) {
probDisplay.style.backgroundColor = '#fff3e0';
probDisplay.style.color = '#f57c00';
} else {
probDisplay.style.backgroundColor = '#ffebee';
probDisplay.style.color = '#c62828';
}
updateCalculationHistory();
}
function updateCalculationHistory() {
const historyContainer = document.getElementById('calculationSteps');
historyContainer.innerHTML = '';
calculationSteps.forEach((step, index) => {
const stepElement = document.createElement('div');
stepElement.className = 'calculation-step';
stepElement.innerHTML = `
${index + 1}. ${step.sign} (${step.type}) - LR: ${step.lr}<br>
${step.calculation}
`;
historyContainer.appendChild(stepElement);
});
}
function resetCalculation() {
currentProbability = parseFloat(document.getElementById('priorProb').value) || 0.2;
calculationSteps = [];
signStates = {};
renderSigns('clinical', 'clinicalSigns');
renderSigns('radiological', 'radiologicalSigns');
updateDisplay();
}
function exportResults() {
const results = {
probabilitaFinale: (currentProbability * 100).toFixed(1) + '%',
probabilitaAPriori: (parseFloat(document.getElementById('priorProb').value) * 100).toFixed(1) + '%',
segniPresenti: calculationSteps,
timestamp: new Date().toLocaleString('it-IT')
};
const exportText = `
Calcolo Probabilità NEC
Data: ${results.timestamp} Probabilità a priori: ${results.probabilitaAPriori} Probabilità finale: ${results.probabilitaFinale}
Segni considerati: ${calculationSteps.map((step, i) ⇒ `${i+1}. ${step.sign} (${step.type}) - LR: ${step.lr} → ${(step.newProb * 100).toFixed(1)}%`).join('\n')}
`;
navigator.clipboard.writeText(exportText).then(() => {
alert('Risultati copiati negli appunti!');
});
}
// Inizializza il calcolatore
initializeCalculator();
</script>
</body> </html>