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>