{"id":108,"date":"2026-03-24T11:00:32","date_gmt":"2026-03-24T11:00:32","guid":{"rendered":"https:\/\/optotech.no\/?page_id=108"},"modified":"2026-03-24T11:23:37","modified_gmt":"2026-03-24T11:23:37","slug":"glaucoma-risk-progression-and-treatment-tool","status":"publish","type":"page","link":"https:\/\/optotech.no\/index.php\/glaucoma-risk-progression-and-treatment-tool\/","title":{"rendered":"Glaucoma risk, progression and treatment tool"},"content":{"rendered":"\n<div id=\"ot-master-v13\" style=\"max-width: 1150px; margin: 20px auto; font-family: 'Inter', sans-serif; background: #ffffff; padding: 40px; border-radius: 20px; box-shadow: 0 20px 50px rgba(0,0,0,0.1); border: 1px solid #cbd5e1; color: #1e293b;\">\n\n    <h2 style=\"color: #005a66; border-bottom: 2px solid #f1f5f9; padding-bottom: 15px; margin-top: 0; font-weight: 800;\">Optotech Unified Master Suite V13.0<\/h2>\n    \n    <div style=\"display: grid; grid-template-columns: 1fr 420px; gap: 35px;\">\n        \n        <div>\n            <div style=\"background: #f8fafc; padding: 20px; border-radius: 15px; border: 1px solid #e2e8f0; margin-bottom: 25px;\">\n                <div style=\"display: flex; justify-content: space-between; margin-bottom: 12px;\">\n                    <input type=\"file\" id=\"v13_imgIn\" accept=\"image\/*\" style=\"font-size: 0.8rem;\">\n                    <button type=\"button\" onclick=\"v13_resetCanvas()\" style=\"padding: 5px 15px; background: #fecaca; color: #991b1b; border: none; border-radius: 5px; cursor: pointer; font-size: 0.75rem;\">Reset View<\/button>\n                <\/div>\n                <div id=\"v13_canvas_wrap\" style=\"height: 450px; background: #0f172a; border-radius: 10px; overflow: hidden; position: relative; cursor: crosshair; border: 2px solid #334155;\">\n                    <canvas id=\"v13_canvas\"><\/canvas>\n                <\/div>\n                <div style=\"margin-top: 10px; display: flex; justify-content: space-between; align-items: center;\">\n                    <span style=\"font-size: 0.75rem; color: #64748b;\">Mark BMO endpoints. Measured Vector: <strong id=\"v13_liveDeg\" style=\"color: #005a66;\">0<\/strong>\u00b0<\/span>\n                    <div style=\"display: flex; gap: 10px;\">\n                        <button type=\"button\" onclick=\"v13_setVal('alpha')\" style=\"padding: 5px 12px; font-size: 0.75rem; cursor: pointer;\">Assign to &alpha;<\/button>\n                        <button type=\"button\" onclick=\"v13_setVal('gamma')\" style=\"padding: 5px 12px; font-size: 0.75rem; cursor: pointer;\">Assign to &gamma;<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 25px;\">\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">PATIENT AGE<\/label><input type=\"number\" id=\"v13_age\" value=\"55\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">CURRENT IOP<\/label><input type=\"number\" id=\"v13_iop\" value=\"23\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">CCT (&mu;m)<\/label><input type=\"number\" id=\"v13_cct\" value=\"545\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">VCDR (VERTICAL)<\/label><input type=\"number\" id=\"v13_vcdr\" value=\"0.5\" step=\"0.1\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">HORIZ. TILT (&alpha;)<\/label><input type=\"number\" id=\"v13_alpha\" value=\"5\" oninput=\"v13_autoTheta()\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">VERT. TILT (&gamma;)<\/label><input type=\"number\" id=\"v13_gamma\" value=\"5\" oninput=\"v13_autoTheta()\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#005a66; margin-bottom:5px;\">DIHEDRAL ANGLE (&theta;)<\/label><input type=\"number\" id=\"v13_theta\" value=\"7.07\" step=\"0.01\" style=\"border:2px solid #005a66; font-weight:800;\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">REFRACTION<\/label>\n                    <select id=\"v13_myopia\">\n                        <option value=\"1\">Emmetropia \/ Hyperopia<\/option>\n                        <option value=\"1.5\">Mild Myopia (-1 to -3D)<\/option>\n                        <option value=\"2.5\">High Myopia (>-6D)<\/option>\n                    <\/select>\n                <\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">CURRENT MD (dB)<\/label><input type=\"number\" id=\"v13_md\" value=\"-3.0\" step=\"0.1\"><\/div>\n                <div style=\"display:flex; flex-direction:column;\"><label style=\"font-size:0.7rem; font-weight:800; color:#64748b; margin-bottom:5px;\">MD RATE OF CHANGE (\/yr)<\/label><input type=\"number\" id=\"v13_roc\" value=\"-0.6\" step=\"0.1\"><\/div>\n            <\/div>\n\n            <div style=\"display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 30px; font-size: 0.75rem; font-weight: 600;\">\n                <label style=\"cursor:pointer; display:flex; align-items:center; gap:5px;\"><input type=\"checkbox\" id=\"v13_dh\"> Disc Heme<\/label>\n                <label style=\"cursor:pointer; display:flex; align-items:center; gap:5px;\"><input type=\"checkbox\" id=\"v13_fam\"> Heredity<\/label>\n                <label style=\"cursor:pointer; display:flex; align-items:center; gap:5px;\"><input type=\"checkbox\" id=\"v13_not\"> Rim Notch<\/label>\n                <label style=\"cursor:pointer; display:flex; align-items:center; gap:5px;\"><input type=\"checkbox\" id=\"v13_pex\"> PEX\/PDS<\/label>\n            <\/div>\n\n            <button type=\"button\" id=\"v13_runBtn\" style=\"width: 100%; padding: 20px; background: #005a66; color: white; border: none; border-radius: 12px; font-weight: 800; font-size: 1.1rem; cursor: pointer; box-shadow: 0 10px 20px rgba(0,90,102,0.2);\">Execute Prognostic Simulation<\/button>\n        <\/div>\n\n        <div>\n            <div id=\"v13_riskCard\" style=\"background: #f1f5f9; padding: 25px; border-radius: 15px; border-left: 8px solid #94a3b8; margin-bottom: 25px;\">\n                <div id=\"v13_lvlBadge\" style=\"display:inline-block; padding:5px 15px; border-radius:99px; color:white; font-size:0.7rem; font-weight:900; margin-bottom:10px;\">READY<\/div>\n                <div id=\"v13_lvlTitle\" style=\"font-weight:900; font-size:1.3rem; color:#005a66;\">Awaiting Analysis<\/div>\n                <div id=\"v13_lvlProb\" style=\"font-size:0.95rem; font-weight:700; color:#475569; margin-top:5px;\"><\/div>\n                <div id=\"v13_lvlDesc\" style=\"font-size:0.9rem; margin-top:15px; line-height:1.5;\">Complete fields and press execute.<\/div>\n            <\/div>\n\n            <div id=\"v13_alert\" style=\"padding:15px; border-radius:10px; background:#fff1f2; border:1px solid #fecaca; color:#9f1239; font-size:0.9rem; font-weight:700; margin-bottom:25px; display:none;\"><\/div>\n\n            <div style=\"height: 320px; background: white; border: 1px solid #e2e8f0; border-radius: 12px; padding: 10px;\">\n                <canvas id=\"v13_chart\"><\/canvas>\n            <\/div>\n\n            <div style=\"margin-top: 25px; padding: 20px; background: #1e293b; color: white; border-radius: 15px;\">\n                <strong style=\"font-size: 0.75rem; text-transform: uppercase; color: #38bdf8;\">Evidence-Based Recommendation:<\/strong>\n                <div id=\"v13_tx\" style=\"font-size: 0.9rem; margin-top: 10px; opacity: 0.9;\">Analyze data to see clinical pathway.<\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div style=\"margin-top: 40px; padding-top: 20px; border-top: 1px solid #e2e8f0; font-size: 0.8rem; color: #94a3b8; line-height: 1.6;\">\n        <strong>Scientific Basis (V13.0 Specialist Edition):<\/strong><br>\n        1. <strong>Li et al. (2024):<\/strong> Trigonometric &theta; calculation based on BMO-PPSC dihedral plane intersection.<br>\n        2. <strong>OHTS \/ EGPS:<\/strong> Multivariate HR for conversion. IOP (HR 1.10), CCT (HR 1.71 per 40&mu;m), VCDR (HR 1.25 per 0.1).<br>\n        3. <strong>Saunders et al. (2014):<\/strong> Defining the -20 dB MD threshold as the clinical &#8220;floor&#8221; for profound vision loss.\n    <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n<script>\n(function() {\n    \/\/ --- CANVAS UNIT ---\n    const cvs = document.getElementById('v13_canvas'), ctx = cvs.getContext('2d'), wrap = document.getElementById('v13_canvas_wrap');\n    let img = new Image(), pts = [], scale = 1, ox = 0, oy = 0;\n\n    function initC() { cvs.width = wrap.clientWidth; cvs.height = wrap.clientHeight; v13_draw(); }\n    window.addEventListener('resize', initC);\n    initC();\n\n    document.getElementById('v13_imgIn').onchange = (e) => {\n        const reader = new FileReader();\n        reader.onload = (ev) => {\n            img = new Image();\n            img.onload = () => { \n                scale = Math.min(cvs.width\/img.width, cvs.height\/img.height)*0.95; \n                ox = (cvs.width - img.width*scale)\/2; \n                oy = (cvs.height - img.height*scale)\/2; \n                v13_draw(); \n            };\n            img.src = ev.target.result;\n        };\n        reader.readAsDataURL(e.target.files[0]);\n    };\n\n    window.v13_draw = function() {\n        ctx.clearRect(0,0,cvs.width,cvs.height);\n        if(!img.src) {\n            ctx.fillStyle = \"#64748b\"; ctx.textAlign=\"center\"; ctx.fillText(\"Upload Image to Start Measurement\", cvs.width\/2, cvs.height\/2);\n            return;\n        }\n        ctx.save(); ctx.translate(ox, oy); ctx.scale(scale, scale);\n        ctx.drawImage(img,0,0);\n        ctx.fillStyle = '#f43f5e';\n        pts.forEach(p => { ctx.beginPath(); ctx.arc(p.x, p.y, 6\/scale, 0, 7); ctx.fill(); });\n        if(pts.length === 2) {\n            ctx.strokeStyle = '#38bdf8'; ctx.lineWidth = 3\/scale;\n            ctx.beginPath(); ctx.moveTo(pts[0].x, pts[0].y); ctx.lineTo(pts[1].x, pts[1].y); ctx.stroke();\n            const d = Math.abs(Math.atan2(pts[1].y - pts[0].y, pts[1].x - pts[0].x) * 180 \/ Math.PI);\n            document.getElementById('v13_liveDeg').innerText = d.toFixed(1);\n        }\n        ctx.restore();\n    }\n\n    cvs.onmousedown = (e) => {\n        if(!img.src) return;\n        const r = cvs.getBoundingClientRect();\n        if(pts.length >= 2) pts = [];\n        pts.push({ x: (e.clientX-r.left-ox)\/scale, y: (e.clientY-r.top-oy)\/scale });\n        v13_draw();\n    };\n\n    window.v13_resetCanvas = () => { if(img.src) { scale = Math.min(cvs.width\/img.width, cvs.height\/img.height)*0.95; ox = (cvs.width - img.width*scale)\/2; oy = (cvs.height - img.height*scale)\/2; v13_draw(); } };\n    window.v13_setVal = (id) => { document.getElementById('v13_' + id).value = document.getElementById('v13_liveDeg').innerText; v13_autoTheta(); };\n\n    \/\/ --- ANALYTICS ENGINE ---\n    window.v13_autoTheta = () => {\n        const a = (parseFloat(document.getElementById('v13_alpha').value) || 0) * (Math.PI\/180);\n        const g = (parseFloat(document.getElementById('v13_gamma').value) || 0) * (Math.PI\/180);\n        const n = Math.cos(a) * Math.cos(g);\n        const d = Math.sqrt(Math.pow(Math.cos(a), 2) + Math.pow(Math.cos(g), 2) * Math.pow(Math.sin(a), 2));\n        const res = (Math.acos(Math.abs(n \/ d)) \/ Math.PI) * 180;\n        document.getElementById('v13_theta').value = res.toFixed(2);\n    };\n\n    let v13Chart = null;\n\n    function runV13Analysis() {\n        const age = parseFloat(document.getElementById('v13_age').value);\n        const iop = parseFloat(document.getElementById('v13_iop').value);\n        const cct = parseFloat(document.getElementById('v13_cct').value);\n        const vcdr = parseFloat(document.getElementById('v13_vcdr').value);\n        const theta = parseFloat(document.getElementById('v13_theta').value);\n        const md = parseFloat(document.getElementById('v13_md').value);\n        const roc = parseFloat(document.getElementById('v13_roc').value);\n        const myopia = parseFloat(document.getElementById('v13_myopia').value);\n\n        \/\/ 1. Point Scoring (Conversion Risk)\n        let score = 0;\n        if(iop >= 23) score += 3; if(iop >= 28) score += 7;\n        if(cct < 545) score += 2; if(cct < 510) score += 6;\n        if(vcdr > 0.4) score += 2; if(vcdr > 0.6) score += 5;\n        if(document.getElementById('v13_dh').checked) score += 9;\n        if(document.getElementById('v13_fam').checked) score += 2;\n        if(document.getElementById('v13_not').checked) score += 5;\n        if(theta > 20) score += 4;\n        \n        let adjusted = score * (myopia > 1 ? 1.4 : 1.0);\n\n        let lvl=\"LOW\", clr=\"#059669\", prob=\"< 5%\";\n        if(adjusted >= 8) { lvl=\"MODERATE\"; clr=\"#d97706\"; prob=\"5-15%\"; }\n        if(adjusted >= 15) { lvl=\"HIGH\"; clr=\"#be123c\"; prob=\"15-25%\"; }\n        if(adjusted >= 22) { lvl=\"CRITICAL\"; clr=\"#9f1239\"; prob=\"> 30%\"; }\n\n        document.getElementById('v13_lvlBadge').innerText = lvl;\n        document.getElementById('v13_lvlBadge').style.background = clr;\n        document.getElementById('v13_lvlTitle').innerText = lvl + \" CONVERSION PROFILE\";\n        document.getElementById('v13_lvlTitle').style.color = clr;\n        document.getElementById('v13_lvlProb').innerText = \"5-Year Conversion Probability: \" + prob;\n        document.getElementById('v13_riskCard').style.borderLeftColor = clr;\n\n        \/\/ 2. Lifetime Projection\n        const lifeExp = (age > 75) ? 8 : (age > 60) ? 18 : (age > 45) ? 32 : 45;\n        const yToBlind = (roc < 0) ? (-20 - md) \/ roc : 100;\n        const alert = document.getElementById('v13_alert');\n\n        if (roc < 0 &#038;&#038; yToBlind < lifeExp) {\n            alert.style.display = 'block';\n            alert.innerHTML = `\u26a0\ufe0f LIFETIME ALERT: Threshold -20 dB projected in ${yToBlind.toFixed(1)} years (Age ${(age + yToBlind).toFixed(1)}). This is WITHIN the statistical life expectancy of ${(age + lifeExp).toFixed(0)}y.`;\n        } else { alert.style.display = 'none'; }\n\n        \/\/ 3. Treatment\n        let tx = (adjusted >= 15 || (roc < 0 &#038;&#038; yToBlind < lifeExp)) \n            ? \"<strong>Aggressive Management:<\/strong> Target &ge; 30% reduction. Consider SLT or surgery.\" \n            : \"Observe. Repeat Fields\/OCT in 6 months.\";\n        document.getElementById('v13_tx').innerHTML = tx;\n\n        \/\/ 4. Chart\n        const ctxM = document.getElementById('v13_chart').getContext('2d');\n        if(v13Chart) v13Chart.destroy();\n        const years = [0, 5, 10, 15, 20, 25, 30, 40];\n        const vals = years.map(y => md + (roc * y));\n        v13Chart = new Chart(ctxM, {\n            type: 'line',\n            data: { labels: years.map(y => \"+\"+y+\"y\"), datasets: [{ label:'MD (dB)', data:vals, borderColor:'#005a66', borderWidth:5, fill:false }] },\n            options: { responsive:true, maintainAspectRatio:false, scales: { y: { min:-25, max:2 } }, plugins: { annotation: { annotations: { b: { type:'line', yMin:-20, yMax:-20, borderColor:'red', borderDash:[5,5] } } } } }\n        });\n    }\n\n    \/\/ ARMER SCRIPT\n    const hunter = setInterval(() => {\n        const btn = document.getElementById('v13_runBtn');\n        if(btn) { btn.onclick = runV13Analysis; clearInterval(hunter); console.log(\"Optotech Armed.\"); }\n    }, 500);\n\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Optotech Unified Master Suite V13.0 Reset View Mark BMO endpoints. Measured Vector: 0\u00b0 Assign to &alpha; Assign to &gamma; PATIENT AGE CURRENT IOP CCT (&mu;m) VCDR (VERTICAL) HORIZ. TILT (&alpha;) VERT. TILT (&gamma;) DIHEDRAL ANGLE (&theta;) REFRACTION Emmetropia \/ HyperopiaMild Myopia (-1 to -3D)High Myopia (>-6D) CURRENT MD (dB) MD RATE OF CHANGE (\/yr) Disc [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-108","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/pages\/108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/comments?post=108"}],"version-history":[{"count":5,"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/pages\/108\/revisions"}],"predecessor-version":[{"id":117,"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/pages\/108\/revisions\/117"}],"wp:attachment":[{"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/media?parent=108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}