Online Bioinformatics Protein Folding Simulator
An illustrative 2D simulation of protein folding using the HP (Hydrophobic-Polar) model.
Configuration
H = Hydrophobic, P = Polar/Hydrophilic
Final Conformation
${energy}
`; resultsSection.classList.remove('hidden'); draw(); } function resetSimulation() { isSimulating = false; cancelAnimationFrame(animationFrameId); setControlsDisabled(false); simStatus.classList.add('hidden'); resultsSection.classList.add('hidden'); errorMessage.textContent = ''; init(); } function generatePdf() { if (!lastResult) return; const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(20); doc.text("Protein Folding Simulation Report", 105, 20, { align: 'center' }); doc.autoTable({ startY: 30, head: [['Parameter', 'Value']], body: [ ['Sequence', lastResult.sequence], ['Simulation Steps', lastResult.steps.toString()], ['Temperature', lastResult.temperature.toFixed(1)], ['Final Energy Score', lastResult.finalEnergy.toString()], ], theme: 'grid', headStyles: { fillColor: [101, 163, 13] } }); doc.text("Final Conformation", 14, doc.lastAutoTable.finalY + 15); try { const imgData = canvas.toDataURL('image/png'); doc.addImage(imgData, 'PNG', 14, doc.lastAutoTable.finalY + 20, 180, 180); } catch(e) { doc.text("Could not render canvas image.", 14, doc.lastAutoTable.finalY + 25); } doc.save(`Protein_Folding_Report.pdf`); } function showError(msg) { errorMessage.textContent = msg; } function setControlsDisabled(disabled) { foldBtn.disabled = disabled; sequenceInput.disabled = disabled; simStepsInput.disabled = disabled; temperatureInput.disabled = disabled; } // --- EVENT LISTENERS --- foldBtn.addEventListener('click', startSimulation); resetBtn.addEventListener('click', resetSimulation); downloadPdfBtn.addEventListener('click', generatePdf); simStepsInput.addEventListener('input', e => simStepsLabel.textContent = e.target.value); temperatureInput.addEventListener('input', e => temperatureLabel.textContent = parseFloat(e.target.value).toFixed(1)); // --- INITIALIZATION --- init(); });