{"id":94,"date":"2026-03-24T10:01:01","date_gmt":"2026-03-24T10:01:01","guid":{"rendered":"https:\/\/optotech.no\/?page_id=94"},"modified":"2026-03-24T10:22:40","modified_gmt":"2026-03-24T10:22:40","slug":"progression-analysis","status":"publish","type":"page","link":"https:\/\/optotech.no\/index.php\/progression-analysis\/","title":{"rendered":"Progression analysis"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Glaucoma Lifetime Progression &#038; Impairment Analyzer<\/title>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n    <style>\n        :root {\n            --primary: #0f172a;\n            --accent: #3b82f6;\n            --danger: #ef4444;\n            --warning: #f59e0b;\n            --success: #10b981;\n            --bg: #f8fafc;\n        }\n\n        body { font-family: 'Inter', -apple-system, sans-serif; background: var(--bg); color: var(--primary); padding: 20px; line-height: 1.5; }\n        .container { max-width: 1100px; margin: 0 auto; background: white; padding: 30px; border-radius: 16px; box-shadow: 0 10px 30px rgba(0,0,0,0.1); border: 1px solid #e2e8f0; }\n        h1 { margin-top: 0; border-bottom: 2px solid #e2e8f0; padding-bottom: 10px; font-size: 1.5rem; color: var(--primary); }\n        \n        .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 30px; margin-top: 20px; }\n        @media (max-width: 800px) { .grid { grid-template-columns: 1fr; } }\n\n        .input-card { background: #f1f5f9; padding: 20px; border-radius: 12px; }\n        .input-group { margin-bottom: 15px; }\n        label { display: block; font-weight: 700; font-size: 0.85rem; margin-bottom: 5px; color: #475569; }\n        input, select { width: 100%; padding: 10px; border: 1px solid #cbd5e1; border-radius: 6px; box-sizing: border-box; }\n        \n        .checkbox-group { display: flex; align-items: center; gap: 10px; margin-top: 20px; padding: 10px; background: white; border-radius: 8px; border: 1px solid #cbd5e1; }\n        .checkbox-group input { width: auto; }\n\n        .analysis-box { margin-top: 30px; padding: 20px; border-radius: 12px; display: none; }\n        .summary-header { font-weight: 800; font-size: 1.1rem; margin-bottom: 10px; display: flex; align-items: center; gap: 10px; }\n\n        .chart-container { position: relative; height: 350px; width: 100%; margin-top: 20px; }\n        \n        .references { margin-top: 50px; padding-top: 20px; border-top: 1px solid #e2e8f0; font-size: 0.8rem; color: #64748b; }\n        .references ol { padding-left: 20px; }\n        \n        button { background: var(--primary); color: white; border: none; padding: 15px; width: 100%; border-radius: 8px; font-weight: 700; cursor: pointer; transition: 0.2s; font-size: 1rem; }\n        button:hover { background: #1e293b; }\n    <\/style>\n<\/head>\n<body>\n\n<div class=\"container\">\n    <h1>Glaucoma Lifetime Progression &#038; Impairment Analyzer<\/h1>\n    \n    <div class=\"grid\">\n        <div class=\"input-card\">\n            <div class=\"grid\" style=\"grid-template-columns: 1fr 1fr; gap: 10px; margin: 0;\">\n                <div class=\"input-group\">\n                    <label>Patient Age (Years)<\/label>\n                    <input type=\"number\" id=\"age\" value=\"65\">\n                <\/div>\n                <div class=\"input-group\">\n                    <label>Current MD (dB)<\/label>\n                    <input type=\"number\" id=\"baseMD\" value=\"-4.5\" step=\"0.1\">\n                <\/div>\n            <\/div>\n\n            <div class=\"grid\" style=\"grid-template-columns: 1fr 1fr; gap: 10px; margin: 0;\">\n                <div class=\"input-group\">\n                    <label>MD RoC (dB\/year)<\/label>\n                    <input type=\"number\" id=\"rocMD\" value=\"-0.8\" step=\"0.1\">\n                <\/div>\n                <div class=\"input-group\">\n                    <label>sLV (dB)<\/label>\n                    <input type=\"number\" id=\"slv\" value=\"2.5\" step=\"0.1\">\n                <\/div>\n            <\/div>\n\n            <div class=\"grid\" style=\"grid-template-columns: 1fr 1fr; gap: 10px; margin: 0;\">\n                <div class=\"input-group\">\n                    <label>cpRNFL Thickness (\u00b5m)<\/label>\n                    <input type=\"number\" id=\"baseRNFL\" value=\"78\">\n                <\/div>\n                <div class=\"input-group\">\n                    <label>cpRNFL RoC (\u00b5m\/year)<\/label>\n                    <input type=\"number\" id=\"rocRNFL\" value=\"-1.5\" step=\"0.1\">\n                <\/div>\n            <\/div>\n\n            <div class=\"grid\" style=\"grid-template-columns: 1fr 1fr; gap: 10px; margin: 0;\">\n                <div class=\"input-group\">\n                    <label>GCL++ Thickness (\u00b5m)<\/label>\n                    <input type=\"number\" id=\"baseGCL\" value=\"72\">\n                <\/div>\n                <div class=\"input-group\">\n                    <label>GCL++ RoC (\u00b5m\/year)<\/label>\n                    <input type=\"number\" id=\"rocGCL\" value=\"-1.2\" step=\"0.1\">\n                <\/div>\n            <\/div>\n\n            <div class=\"checkbox-group\">\n                <input type=\"checkbox\" id=\"centralScotoma\">\n                <label style=\"margin:0;\">Central scotoma present (within 15\u00b0)<\/label>\n            <\/div>\n\n            <button style=\"margin-top: 20px;\" onclick=\"calculateProgression()\">Calculate &#038; Graph Projections<\/button>\n        <\/div>\n\n        <div>\n            <div class=\"chart-container\">\n                <canvas id=\"progressionChart\"><\/canvas>\n            <\/div>\n            <div id=\"analysis-box\" class=\"analysis-box\">\n                <div id=\"analysis-header\" class=\"summary-header\"><\/div>\n                <div id=\"analysis-text\"><\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"references\">\n        <strong>Evidence-Based References:<\/strong>\n        <ol>\n            <li><strong>The Structural Floor:<\/strong> Miki et al. (2014) &#8211; *Ophthalmology*. Rates of cpRNFL thinning reach a baseline floor of ~45-50\u00b5m in advanced disease.<\/li>\n            <li><strong>Functional Impairment:<\/strong> Saunders et al. (2014) &#8211; *IOVS*. MD of -20 dB correlates with legal blindness and significant loss of independent mobility.<\/li>\n            <li><strong>Central Scotoma Impact:<\/strong> Hood et al. (2013) &#8211; *PRER*. Central 10\u00b0 scotomas correlate with severe QoL impairment regardless of global MD.<\/li>\n            <li><strong>Competing Mortality:<\/strong> Actuarial Life Expectancy derived from WHO Statistical Information System (WHOSIS) global averages.<\/li>\n        <\/ol>\n    <\/div>\n<\/div>\n\n<script>\n    let chartInstance = null;\n\n    function calculateProgression() {\n        const age = parseFloat(document.getElementById('age').value);\n        const baseMD = parseFloat(document.getElementById('baseMD').value);\n        const rocMD = parseFloat(document.getElementById('rocMD').value);\n        const baseRNFL = parseFloat(document.getElementById('baseRNFL').value);\n        const rocRNFL = parseFloat(document.getElementById('rocRNFL').value);\n        const baseGCL = parseFloat(document.getElementById('baseGCL').value);\n        const rocGCL = parseFloat(document.getElementById('rocGCL').value);\n        const central = document.getElementById('centralScotoma').checked;\n\n        const years = [0, 5, 10, 15, 20];\n        const mdData = years.map(y => baseMD + (rocMD * y));\n        const rnflData = years.map(y => Math.max(45, baseRNFL + (rocRNFL * y))); \/\/ Floor at 45\n        const gclData = years.map(y => Math.max(40, baseGCL + (rocGCL * y))); \/\/ Floor at 40\n\n        \/\/ Life Expectancy Calculation (Simplified Actuarial)\n        const lifeExp = (age > 85) ? 4 : (age > 75) ? 8 : (age > 65) ? 15 : 25;\n        const yearOfBlindness = ( -20 - baseMD ) \/ rocMD;\n\n        updateUI(yearOfBlindness, lifeExp, central, mdData[4]);\n        renderChart(years, mdData, rnflData, gclData);\n    }\n\n    function updateUI(yob, life, central, finalMD) {\n        const box = document.getElementById('analysis-box');\n        const header = document.getElementById('analysis-header');\n        const text = document.getElementById('analysis-text');\n        box.style.display = 'block';\n\n        let status = \"success\";\n        let title = \"Stable Prognosis\";\n        let message = `Patient is likely to retain functional vision for their projected lifetime.`;\n\n        if (yob > 0 && yob <= life) {\n            status = \"danger\";\n            title = \"High Risk of Lifetime Impairment\";\n            message = `Calculated functional blindness (-20 dB) likely in ~${yob.toFixed(1)} years, which falls within the patient's life expectancy. Aggressive escalation recommended.`;\n        } else if (yob > life) {\n            status = \"warning\";\n            title = \"Competing Mortality Risk\";\n            message = `While progression is noted, the patient is statistically likely to outlive their functional vision loss. Avoid over-treatment.`;\n        }\n\n        if (central && finalMD < -10) {\n            message += ` <br><strong>Note:<\/strong> Presence of central scotoma significantly increases disability risk even at higher MD values.`;\n        }\n\n        box.style.background = status === \"danger\" ? \"#fef2f2\" : status === \"warning\" ? \"#fffbeb\" : \"#f0fdf4\";\n        header.style.color = status === \"danger\" ? \"#991b1b\" : status === \"warning\" ? \"#92400e\" : \"#166534\";\n        header.innerHTML = title;\n        text.innerHTML = message;\n    }\n\n    function renderChart(labels, md, rnfl, gcl) {\n        const ctx = document.getElementById('progressionChart').getContext('2d');\n        \n        if (chartInstance) chartInstance.destroy();\n\n        chartInstance = new Chart(ctx, {\n            type: 'line',\n            data: {\n                labels: labels.map(l => l + \" yrs\"),\n                datasets: [\n                    {\n                        label: 'MD (dB)',\n                        data: md,\n                        borderColor: '#3b82f6',\n                        backgroundColor: '#3b82f6',\n                        yAxisID: 'yFunctional',\n                        borderWidth: 3\n                    },\n                    {\n                        label: 'cpRNFL (\u00b5m)',\n                        data: rnfl,\n                        borderColor: '#0f172a',\n                        borderDash: [5, 5],\n                        yAxisID: 'yStructural'\n                    },\n                    {\n                        label: 'GCL++ (\u00b5m)',\n                        data: gcl,\n                        borderColor: '#10b981',\n                        borderDash: [2, 2],\n                        yAxisID: 'yStructural'\n                    }\n                ]\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                scales: {\n                    yFunctional: {\n                        type: 'linear',\n                        position: 'left',\n                        title: { display: true, text: 'Functional (MD dB)' },\n                        min: -30,\n                        max: 5\n                    },\n                    yStructural: {\n                        type: 'linear',\n                        position: 'right',\n                        title: { display: true, text: 'Structural (\u00b5m)' },\n                        min: 30,\n                        max: 110,\n                        grid: { drawOnChartArea: false }\n                    }\n                },\n                plugins: {\n                    annotation: { \/\/ Conceptual visualization of the impairment zone\n                        annotations: {\n                            line1: {\n                                type: 'line',\n                                yMin: -20,\n                                yMax: -20,\n                                borderColor: 'red',\n                                borderWidth: 2,\n                                label: { content: 'Blindness Threshold', enabled: true }\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n    \/\/ Initial load\n    window.onload = calculateProgression;\n<\/script>\n\n<\/body>\n<\/html>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Glaucoma Lifetime Progression &#038; Impairment Analyzer Glaucoma Lifetime Progression &#038; Impairment Analyzer Patient Age (Years) Current MD (dB) MD RoC (dB\/year) sLV (dB) cpRNFL Thickness (\u00b5m) cpRNFL RoC (\u00b5m\/year) GCL++ Thickness (\u00b5m) GCL++ RoC (\u00b5m\/year) Central scotoma present (within 15\u00b0) Calculate &#038; Graph Projections Evidence-Based References: The Structural Floor: Miki et al. (2014) &#8211; *Ophthalmology*. [&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-94","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/pages\/94","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=94"}],"version-history":[{"count":2,"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/pages\/94\/revisions"}],"predecessor-version":[{"id":104,"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/pages\/94\/revisions\/104"}],"wp:attachment":[{"href":"https:\/\/optotech.no\/index.php\/wp-json\/wp\/v2\/media?parent=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}