/**
* MVA Syndrome Multi-Dimensional Genomic Studio — Client Engine
* High-performance browser for Clinical Phenotypes, 5M WGS Variants, Mosaicism,
* Candidate Gene Burden, Syndromic Differentials, ACMG Classifications, Precision Oncology,
* 4-Lane Flowcell QC, Mitotic Interactome, and the 219-Table Omniverse Hub.
*/
(function () {
'use strict';
// -------------------------------------------------------------
// Application State
// -------------------------------------------------------------
const state = {
clinical: null,
genesData: null,
chromosomes: null,
wgs: null,
pathway: null,
geneBurden: null,
syndromicDiff: null,
acmgMatrix: null,
therapeuticTargets: null,
mosaicStrat: null,
mitoticMachinery: null,
karyotypeInstability: null,
flowcellQc: null,
// 219-Table Omniverse Hub
omniCatalog: null,
omniActiveTableData: null,
omniSelectedCat: 'ALL',
omniSearchQuery: '',
omniActiveTableId: 'clin_01_hpo_hierarchy',
omniTableRowFilter: '',
// Variant Filters
selectedGene: 'ALL',
selectedType: 'ALL',
selectedMosaic: 'ALL',
selectedChr: null,
searchQuery: '',
// Flat List of All Candidate Variants
allVariants: [],
filteredVariants: []
};
// -------------------------------------------------------------
// DOM References
// -------------------------------------------------------------
const els = {
// Tabs
navTabs: document.querySelectorAll('.nav-tab'),
tabContents: document.querySelectorAll('.tab-content'),
// Stats Header
statCandidateCount: document.getElementById('statCandidateCount'),
statMosaicCount: document.getElementById('statMosaicCount'),
// Omniverse Hub Elements
omniTotalTables: document.getElementById('omniTotalTables'),
omniFilteredCount: document.getElementById('omniFilteredCount'),
omniCategoryPills: document.getElementById('omniCategoryPills'),
omniGlobalSearch: document.getElementById('omniGlobalSearch'),
omniTableSelect: document.getElementById('omniTableSelect'),
omniActiveCat: document.getElementById('omniActiveCat'),
omniActiveId: document.getElementById('omniActiveId'),
omniActiveRows: document.getElementById('omniActiveRows'),
omniActiveTitle: document.getElementById('omniActiveTitle'),
omniActiveDesc: document.getElementById('omniActiveDesc'),
omniTableRowFilter: document.getElementById('omniTableRowFilter'),
btnExportCSV: document.getElementById('btnExportCSV'),
btnExportJSON: document.getElementById('btnExportJSON'),
omniTableHead: document.getElementById('omniTableHead'),
omniTableBody: document.getElementById('omniTableBody'),
omniDiscoveryGrid: document.getElementById('omniDiscoveryGrid'),
// Tab 1: Clinical
hpoList: document.getElementById('hpoList'),
hpoCountBadge: document.getElementById('hpoCountBadge'),
// Tab 2: Variants
geneFilter: document.getElementById('geneFilter'),
typeFilter: document.getElementById('typeFilter'),
mosaicFilter: document.getElementById('mosaicFilter'),
variantSearch: document.getElementById('variantSearch'),
filteredCount: document.getElementById('filteredCount'),
totalCandidateCount: document.getElementById('totalCandidateCount'),
chromosomeKaryotype: document.getElementById('chromosomeKaryotype'),
btnResetChr: document.getElementById('btnResetChr'),
variantTableBody: document.getElementById('variantTableBody'),
// Tab 3: Gene Burden Matrix
geneBurdenTableBody: document.getElementById('geneBurdenTableBody'),
searchGeneBurden: document.getElementById('searchGeneBurden'),
// Tab 4: Syndromic Differential Matrix
syndromicDiffTableBody: document.getElementById('syndromicDiffTableBody'),
searchSyndromicDiff: document.getElementById('searchSyndromicDiff'),
// Tab 5: ACMG Variant Classification
acmgMatrixTableBody: document.getElementById('acmgMatrixTableBody'),
searchAcmgMatrix: document.getElementById('searchAcmgMatrix'),
// Tab 6: Precision Oncology Targets
therapeuticTargetsTableBody: document.getElementById('therapeuticTargetsTableBody'),
searchTherapeuticTargets: document.getElementById('searchTherapeuticTargets'),
// Tab 7: Mosaic Allelic Stratification
mosaicStratTableBody: document.getElementById('mosaicStratTableBody'),
// Tab 8: Mitotic Machinery Interactome
mitoticMachineryTableBody: document.getElementById('mitoticMachineryTableBody'),
searchMitoticMachinery: document.getElementById('searchMitoticMachinery'),
// Tab 9: 24-Chromosome Karyotype Matrix
karyotypeMatrixTableBody: document.getElementById('karyotypeMatrixTableBody'),
searchKaryotypeMatrix: document.getElementById('searchKaryotypeMatrix'),
// Tab 10: Mosaicism Spectrum
mosaicListSummary: document.getElementById('mosaicListSummary'),
hetListSummary: document.getElementById('hetListSummary'),
homListSummary: document.getElementById('homListSummary'),
topMosaicTable: document.getElementById('topMosaicTable'),
// Tab 11: WGS / Flowcell QC
flowcellQcTableBody: document.getElementById('flowcellQcTableBody'),
// Tab 12: Pathway Network
pathwayComplexes: document.getElementById('pathwayComplexes'),
// Modals
modalVariant: document.getElementById('modalVariant'),
modalVarTitle: document.getElementById('modalVarTitle'),
modalVarBody: document.getElementById('modalVarBody'),
btnCloseVarModal: document.getElementById('btnCloseVarModal'),
modalHelp: document.getElementById('modalHelp'),
btnShortcuts: document.getElementById('btnShortcuts'),
btnCloseHelpModal: document.getElementById('btnCloseHelpModal')
};
// -------------------------------------------------------------
// Initialization
// -------------------------------------------------------------
async function init() {
setupEventListeners();
await loadAllDatasets();
renderAllViews();
}
async function loadAllDatasets() {
try {
const [
clinicalRes,
genesRes,
chrRes,
wgsRes,
pathRes,
geneBurdenRes,
syndromicDiffRes,
acmgRes,
therapeuticRes,
mosaicStratRes,
mitoticMachineryRes,
karyoInstabilityRes,
flowcellQcRes,
omniCatalogRes
] = await Promise.all([
fetch('data/clinical_phenotype.json').then(r => r.json()),
fetch('data/candidate_genes_variants.json').then(r => r.json()),
fetch('data/chromosome_stats.json').then(r => r.json()),
fetch('data/wgs_sequencing_metrics.json').then(r => r.json()),
fetch('data/pathway_network.json').then(r => r.json()),
fetch('data/gene_burden_matrix.json').then(r => r.json()),
fetch('data/syndromic_differential_matrix.json').then(r => r.json()),
fetch('data/acmg_variant_classification_matrix.json').then(r => r.json()),
fetch('data/therapeutic_targets_matrix.json').then(r => r.json()),
fetch('data/mosaic_stratification_matrix.json').then(r => r.json()),
fetch('data/mitotic_machinery_matrix.json').then(r => r.json()),
fetch('data/karyotype_instability_matrix.json').then(r => r.json()),
fetch('data/flowcell_quality_audit_matrix.json').then(r => r.json()),
fetch('data/table_catalog.json').then(r => r.json()).catch(() => null)
]);
state.clinical = clinicalRes;
state.genesData = genesRes;
state.chromosomes = chrRes;
state.wgs = wgsRes;
state.pathway = pathRes;
state.geneBurden = geneBurdenRes;
state.syndromicDiff = syndromicDiffRes;
state.acmgMatrix = acmgRes;
state.therapeuticTargets = therapeuticRes;
state.mosaicStrat = mosaicStratRes;
state.mitoticMachinery = mitoticMachineryRes;
state.karyotypeInstability = karyoInstabilityRes;
state.flowcellQc = flowcellQcRes;
state.omniCatalog = omniCatalogRes;
// Flatten all candidate variants
state.allVariants = [];
Object.entries(state.genesData.genes).forEach(([gname, gentry]) => {
gentry.variants.forEach(v => {
state.allVariants.push({ ...v, geneInfo: gentry.info });
});
});
// Update Header Stats
els.statCandidateCount.textContent = state.allVariants.length.toLocaleString();
const mosaicCount = state.allVariants.filter(v => v.classification === 'Mosaic Somatic Candidate').length;
els.statMosaicCount.textContent = mosaicCount.toLocaleString();
els.totalCandidateCount.textContent = state.allVariants.length.toLocaleString();
if (state.omniCatalog && els.omniTotalTables) {
els.omniTotalTables.textContent = state.omniCatalog.total_tables || '219';
}
} catch (e) {
console.error('Failed to load MVA datasets:', e);
}
}
function renderAllViews() {
renderOmniverseCatalog();
loadAndRenderOmniverseTable(state.omniActiveTableId);
renderClinicalTab();
renderChromosomeKaryotype();
applyVariantFilters();
renderGeneBurdenTable();
renderSyndromicDiffTable();
renderAcmgMatrixTable();
renderTherapeuticTargetsTable();
renderMosaicStratTable();
renderMitoticMachineryTable();
renderKaryotypeMatrixTable();
renderMosaicTab();
renderFlowcellQcTable();
renderPathwayTab();
}
// -------------------------------------------------------------
// Omniverse 219-Table Hub Engine
// -------------------------------------------------------------
function renderOmniverseCatalog() {
if (!state.omniCatalog) return;
let tables = state.omniCatalog.tables || [];
// Filter by Category
if (state.omniSelectedCat !== 'ALL') {
tables = tables.filter(t => t.category === state.omniSelectedCat);
}
// Filter by Search Query
if (state.omniSearchQuery.trim() !== '') {
const q = state.omniSearchQuery.toLowerCase().trim();
tables = tables.filter(t =>
t.title.toLowerCase().includes(q) ||
t.description.toLowerCase().includes(q) ||
t.id.toLowerCase().includes(q) ||
(t.tags && t.tags.some(tag => tag.toLowerCase().includes(q)))
);
}
if (els.omniFilteredCount) {
els.omniFilteredCount.textContent = tables.length;
}
// Populate Select Dropdown
if (els.omniTableSelect) {
els.omniTableSelect.innerHTML = '';
tables.forEach(t => {
const opt = document.createElement('option');
opt.value = t.id;
opt.textContent = `[${t.category}] ${t.title} (${t.row_count} rows)`;
if (t.id === state.omniActiveTableId) opt.selected = true;
els.omniTableSelect.appendChild(opt);
});
}
// Populate Discovery Grid Cards
if (els.omniDiscoveryGrid) {
els.omniDiscoveryGrid.innerHTML = '';
tables.forEach(t => {
const card = document.createElement('div');
card.className = `omni-card-item ${t.id === state.omniActiveTableId ? 'selected' : ''}`;
card.innerHTML = `
${t.category}
${t.row_count} rows × ${t.columns_count} cols
${t.title}
${t.description}
`;
card.onclick = () => {
loadAndRenderOmniverseTable(t.id);
};
els.omniDiscoveryGrid.appendChild(card);
});
}
}
async function loadAndRenderOmniverseTable(tableId) {
state.omniActiveTableId = tableId;
try {
const res = await fetch(`data/tables/${tableId}.json`);
if (!res.ok) throw new Error(`Table ${tableId} not found`);
const tableData = await res.json();
state.omniActiveTableData = tableData;
// Update Card Meta
if (els.omniActiveCat) els.omniActiveCat.textContent = tableData.category;
if (els.omniActiveId) els.omniActiveId.textContent = tableData.id;
if (els.omniActiveRows) els.omniActiveRows.textContent = `${tableData.row_count} rows × ${tableData.columns.length} columns`;
if (els.omniActiveTitle) els.omniActiveTitle.textContent = tableData.title;
if (els.omniActiveDesc) els.omniActiveDesc.textContent = tableData.description;
renderOmniverseActiveTableRows();
// Update Active Highlight in Discovery Grid
document.querySelectorAll('.omni-card-item').forEach(card => {
card.classList.remove('selected');
});
if (els.omniTableSelect) els.omniTableSelect.value = tableId;
} catch (e) {
console.error(`Failed to load table ${tableId}:`, e);
}
}
function renderOmniverseActiveTableRows() {
if (!state.omniActiveTableData) return;
const { columns, rows } = state.omniActiveTableData;
// Render Headers
if (els.omniTableHead) {
els.omniTableHead.innerHTML = `${columns.map(c => `${c} `).join('')} `;
}
// Filter Rows if row filter is active
let displayRows = rows;
if (state.omniTableRowFilter.trim() !== '') {
const q = state.omniTableRowFilter.toLowerCase().trim();
displayRows = rows.filter(r => r.some(cell => String(cell).toLowerCase().includes(q)));
}
// Render Body
if (els.omniTableBody) {
els.omniTableBody.innerHTML = '';
if (displayRows.length === 0) {
els.omniTableBody.innerHTML = `
No rows match the filter query in this table.
`;
return;
}
displayRows.forEach(row => {
const tr = document.createElement('tr');
tr.innerHTML = row.map((cell, idx) => {
const str = String(cell);
let styledCell = str;
if (idx === 0) {
styledCell = `${str} `;
} else if (str.includes('%') || str.includes('bp') || str.includes('Gb') || str.includes('×') || str.includes('Phred')) {
styledCell = `${str} `;
}
if (str.includes('Pathogenic') || str.includes('Critical') || str.includes('Severe')) {
styledCell = `${str} `;
} else if (str.includes('Synergistic') || str.includes('Nominal') || str.includes('Concordant')) {
styledCell = `${str} `;
}
return `${styledCell} `;
}).join('');
els.omniTableBody.appendChild(tr);
});
}
}
function exportActiveTable(format) {
if (!state.omniActiveTableData) return;
const { id, title, columns, rows } = state.omniActiveTableData;
let content = '';
let mimeType = 'text/plain';
let filename = `${id}.${format}`;
if (format === 'csv') {
mimeType = 'text/csv';
const escapeCsv = (val) => `"${String(val).replace(/"/g, '""')}"`;
const headerLine = columns.map(escapeCsv).join(',');
const rowLines = rows.map(r => r.map(escapeCsv).join(','));
content = [headerLine, ...rowLines].join('\n');
} else {
mimeType = 'application/json';
content = JSON.stringify(state.omniActiveTableData, null, 2);
}
const blob = new Blob([content], { type: mimeType });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
// -------------------------------------------------------------
// Tab 1: Clinical Phenotype
// -------------------------------------------------------------
function renderClinicalTab() {
if (!state.clinical) return;
els.hpoList.innerHTML = '';
const feats = state.clinical.clinical_features || [];
els.hpoCountBadge.textContent = `${feats.length} Phenotypes`;
feats.forEach(f => {
const item = document.createElement('div');
item.className = 'hpo-card-item';
item.innerHTML = `
${f.notes}
`;
els.hpoList.appendChild(item);
});
}
// -------------------------------------------------------------
// Tab 2: Chromosome Ideogram & Variant Table
// -------------------------------------------------------------
function renderChromosomeKaryotype() {
if (!state.chromosomes) return;
els.chromosomeKaryotype.innerHTML = '';
const maxDensity = Math.max(...state.chromosomes.chromosomes.map(c => c.density_per_mb));
const mvaChromosomes = new Set(['15', '11', '5', '18', '7', '4', '2', '10', '9', '1', '16', '20', '17', '14']);
state.chromosomes.chromosomes.forEach(c => {
const pill = document.createElement('div');
pill.className = `chr-pill-bar ${mvaChromosomes.has(c.chr) ? 'has-mva' : ''} ${state.selectedChr === c.chr ? 'selected' : ''}`;
pill.title = `Chr ${c.chr}: ${c.total_variants.toLocaleString()} variants (${c.density_per_mb} / Mb)`;
const fillPct = Math.max(15, (c.density_per_mb / maxDensity) * 100);
pill.innerHTML = `
${c.chr}
`;
pill.onclick = () => {
state.selectedChr = state.selectedChr === c.chr ? null : c.chr;
renderChromosomeKaryotype();
applyVariantFilters();
};
els.chromosomeKaryotype.appendChild(pill);
});
}
function applyVariantFilters() {
let list = state.allVariants;
if (state.selectedGene !== 'ALL') {
list = list.filter(v => v.gene === state.selectedGene);
}
if (state.selectedType !== 'ALL') {
list = list.filter(v => v.type === state.selectedType);
}
if (state.selectedMosaic !== 'ALL') {
list = list.filter(v => v.classification === state.selectedMosaic);
}
if (state.selectedChr) {
list = list.filter(v => v.chrom === state.selectedChr);
}
if (state.searchQuery.trim() !== '') {
const q = state.searchQuery.toLowerCase().trim();
list = list.filter(v =>
String(v.pos).includes(q) ||
v.dbsnp.toLowerCase().includes(q) ||
v.gene.toLowerCase().includes(q) ||
v.ref.toLowerCase().includes(q) ||
v.alt.toLowerCase().includes(q)
);
}
state.filteredVariants = list;
els.filteredCount.textContent = list.length.toLocaleString();
renderVariantTable();
}
function renderVariantTable() {
els.variantTableBody.innerHTML = '';
const slice = state.filteredVariants.slice(0, 150);
if (slice.length === 0) {
els.variantTableBody.innerHTML = `
No variants found matching the selected filter criteria.
`;
return;
}
slice.forEach(v => {
const tr = document.createElement('tr');
let classTag = `${v.classification} `;
if (v.classification === 'Mosaic Somatic Candidate') {
classTag = `⚡ Mosaic (${(v.vaf * 100).toFixed(1)}%) `;
} else if (v.classification === 'Germline Homozygous') {
classTag = `Homozygous `;
}
tr.innerHTML = `
${v.gene}
chr${v.chrom}:${v.pos.toLocaleString()}
${v.ref} → ${v.alt}
${v.type}
${v.gt}
${v.ad_ref},${v.ad_alt}
${v.dp}×
${(v.vaf * 100).toFixed(1)}%
${classTag}
${v.filter}
Inspect
`;
tr.querySelector('.btn-inspect').onclick = () => openVariantModal(v);
els.variantTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 3: Candidate Gene Burden Matrix
// -------------------------------------------------------------
function renderGeneBurdenTable(filter = '') {
if (!state.geneBurden) return;
els.geneBurdenTableBody.innerHTML = '';
let genes = state.geneBurden.genes || [];
if (filter.trim() !== '') {
const q = filter.toLowerCase().trim();
genes = genes.filter(g =>
g.gene.toLowerCase().includes(q) ||
g.syndrome.toLowerCase().includes(q) ||
g.complex.toLowerCase().includes(q) ||
g.role.toLowerCase().includes(q) ||
g.clinical_link.toLowerCase().includes(q)
);
}
genes.forEach(g => {
const tr = document.createElement('tr');
let tierBadge = `${g.pathogenicity_tier} `;
if (g.pathogenicity_tier.includes('Tier 1')) {
tierBadge = `${g.pathogenicity_tier} `;
} else if (g.pathogenicity_tier.includes('Tier 3')) {
tierBadge = `${g.pathogenicity_tier} `;
}
tr.innerHTML = `
${g.gene}
${g.omim} ${g.cytoband}
${g.syndrome}
${g.complex} ${g.role}
${g.inheritance}
${g.patient_variants}
${g.highest_vaf}
${g.mosaic_candidates > 0 ? `${g.mosaic_candidates} loci ` : '0'}
${g.clinical_link}
${tierBadge}
`;
els.geneBurdenTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 4: Phenotype Differential Matrix
// -------------------------------------------------------------
function renderSyndromicDiffTable(filter = '') {
if (!state.syndromicDiff) return;
els.syndromicDiffTableBody.innerHTML = '';
let phenos = state.syndromicDiff.phenotypes || [];
if (filter.trim() !== '') {
const q = filter.toLowerCase().trim();
phenos = phenos.filter(p =>
p.feature.toLowerCase().includes(q) ||
p.hpo.toLowerCase().includes(q) ||
p.competing_syndromes.toLowerCase().includes(q) ||
p.mva_genes.toLowerCase().includes(q) ||
p.molecular_mechanism.toLowerCase().includes(q)
);
}
phenos.forEach(p => {
const tr = document.createElement('tr');
tr.innerHTML = `
${p.feature}
${p.hpo}
${p.mva_syndrome_match}
${p.mva_genes}
${p.competing_syndromes}
${p.molecular_mechanism}
${p.discriminatory_power}
`;
els.syndromicDiffTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 5: ACMG Variant Classification Matrix
// -------------------------------------------------------------
function renderAcmgMatrixTable(filter = '') {
if (!state.acmgMatrix) return;
els.acmgMatrixTableBody.innerHTML = '';
let vars = state.acmgMatrix.variants || [];
if (filter.trim() !== '') {
const q = filter.toLowerCase().trim();
vars = vars.filter(v =>
v.gene.toLowerCase().includes(q) ||
v.hgvsc.toLowerCase().includes(q) ||
v.acmg_class.toLowerCase().includes(q) ||
v.acmg_criteria.toLowerCase().includes(q)
);
}
vars.forEach(v => {
const tr = document.createElement('tr');
let classBadge = `${v.acmg_class} `;
if (v.acmg_class.includes('Likely Pathogenic')) {
classBadge = `${v.acmg_class} `;
} else if (v.acmg_class.includes('VUS') || v.acmg_class.includes('Uncertain')) {
classBadge = `${v.acmg_class} `;
}
tr.innerHTML = `
${v.gene}
${v.hgvsc}
${v.genomic_coord}
${v.ref_alt}
${v.variant_type}
${v.vaf}
${v.acmg_criteria}
${v.gnomad_af}
${v.revel_cadd}
${classBadge}
`;
els.acmgMatrixTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 6: Precision Oncology & Therapeutic Targets
// -------------------------------------------------------------
function renderTherapeuticTargetsTable(filter = '') {
if (!state.therapeuticTargets) return;
els.therapeuticTargetsTableBody.innerHTML = '';
let targets = state.therapeuticTargets.targets || [];
if (filter.trim() !== '') {
const q = filter.toLowerCase().trim();
targets = targets.filter(t =>
t.drug_name.toLowerCase().includes(q) ||
t.target_gene.toLowerCase().includes(q) ||
t.mechanism.toLowerCase().includes(q) ||
t.mva_relevance.toLowerCase().includes(q) ||
t.clinical_status.toLowerCase().includes(q)
);
}
targets.forEach(t => {
const tr = document.createElement('tr');
tr.innerHTML = `
${t.drug_name}
${t.target_gene}
${t.target_class}
${t.mechanism}
${t.mva_relevance}
${t.clinical_status}
${t.evidence_tier}
`;
els.therapeuticTargetsTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 7: Mosaic Allelic Stratification
// -------------------------------------------------------------
function renderMosaicStratTable() {
if (!state.mosaicStrat) return;
els.mosaicStratTableBody.innerHTML = '';
state.mosaicStrat.bins.forEach(b => {
const tr = document.createElement('tr');
let vafStyle = 'color:var(--text-main);';
if (b.vaf_range.includes('5.0%') || b.vaf_range.includes('15.1%') || b.vaf_range.includes('28.1%')) {
vafStyle = 'color:var(--accent-gold); font-weight:800;';
}
tr.innerHTML = `
${b.vaf_range}
${b.category} ${b.inferred_timing}
${b.variant_count}
${b.mean_dp}
${b.tissue_penetrance}
${b.key_genes_affected}
${b.biological_impact}
`;
els.mosaicStratTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 8: Mitotic Machinery & Interactome Functional Table
// -------------------------------------------------------------
function renderMitoticMachineryTable(filter = '') {
if (!state.mitoticMachinery) return;
els.mitoticMachineryTableBody.innerHTML = '';
let proteins = state.mitoticMachinery.proteins || [];
if (filter.trim() !== '') {
const q = filter.toLowerCase().trim();
proteins = proteins.filter(p =>
p.protein.toLowerCase().includes(q) ||
p.uniprot.toLowerCase().includes(q) ||
p.complex.toLowerCase().includes(q) ||
p.mva_type.toLowerCase().includes(q) ||
p.biochemical_function.toLowerCase().includes(q)
);
}
proteins.forEach(p => {
const tr = document.createElement('tr');
tr.innerHTML = `
${p.protein}
UniProt: ${p.uniprot}
${p.length_aa} aa
${p.subcellular_location}
${p.biochemical_function}
${p.complex}
${p.mva_type}
${p.proband_findings}
`;
els.mitoticMachineryTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 9: 24-Chromosome Karyotype Matrix
// -------------------------------------------------------------
function renderKaryotypeMatrixTable(filter = '') {
if (!state.karyotypeInstability) return;
els.karyotypeMatrixTableBody.innerHTML = '';
let chrs = state.karyotypeInstability.chromosomes || [];
if (filter.trim() !== '') {
const q = filter.toLowerCase().trim();
chrs = chrs.filter(c =>
c.chr.toLowerCase().includes(q) ||
c.aneuploidy_vulnerability.toLowerCase().includes(q)
);
}
chrs.forEach(c => {
const tr = document.createElement('tr');
const isMvaKey = ['chr15', 'chr11', 'chr5', 'chr18', 'chr7', 'chr8'].includes(c.chr);
tr.innerHTML = `
${c.chr}
${c.length_bp}
${c.total_variants}
${c.snvs}
${c.indels}
${c.density_per_mb}
${c.snv_indel_ratio}
${c.heterozygous} / ${c.homozygous}
${c.aneuploidy_vulnerability}
`;
els.karyotypeMatrixTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 10: Mosaicism Spectrum
// -------------------------------------------------------------
function renderMosaicTab() {
const mosaicVars = state.allVariants.filter(v => v.classification === 'Mosaic Somatic Candidate');
const hetVars = state.allVariants.filter(v => v.classification === 'Germline Heterozygous');
const homVars = state.allVariants.filter(v => v.classification === 'Germline Homozygous');
els.mosaicListSummary.innerHTML = `
${mosaicVars.length} variants
Putative post-zygotic mosaic somatic alterations across candidate loci.
`;
els.hetListSummary.innerHTML = `
${hetVars.length} variants
Standard heterozygous germline alleles (~50% VAF).
`;
els.homListSummary.innerHTML = `
${homVars.length} variants
Homozygous germline alternate alleles (100% VAF).
`;
// Top mosaic loci
els.topMosaicTable.innerHTML = '';
mosaicVars.slice(0, 15).forEach(v => {
const row = document.createElement('div');
row.className = 'mosaic-row-card';
row.innerHTML = `
${v.gene} (chr${v.chrom}:${v.pos})
${v.ref} → ${v.alt}
VAF: ${(v.vaf * 100).toFixed(1)}%
DP: ${v.dp}× (AD: ${v.ad_ref},${v.ad_alt})
`;
els.topMosaicTable.appendChild(row);
});
}
// -------------------------------------------------------------
// Tab 11: 4-Lane Sequencing QC Audit Table
// -------------------------------------------------------------
function renderFlowcellQcTable() {
if (!state.flowcellQc) return;
els.flowcellQcTableBody.innerHTML = '';
state.flowcellQc.lanes.forEach(l => {
const tr = document.createElement('tr');
tr.innerHTML = `
${l.lane_id}
${l.r1_file}
${l.r2_file}
${l.total_size_gb}
${l.read_pairs}
${l.q30_pct}
${l.mean_gc}
${l.mean_coverage}
${l.dup_rate}
${l.mapping_rate}
${l.flowcell_tile_status}
`;
els.flowcellQcTableBody.appendChild(tr);
});
}
// -------------------------------------------------------------
// Tab 12: Mitotic Pathway Network
// -------------------------------------------------------------
function renderPathwayTab() {
if (!state.pathway) return;
els.pathwayComplexes.innerHTML = '';
state.pathway.complexes.forEach(c => {
const card = document.createElement('div');
card.className = 'complex-card';
card.innerHTML = `
${c.name}
${c.components.map(comp => `${comp} `).join('')}
${c.role}
`;
els.pathwayComplexes.appendChild(card);
});
}
// -------------------------------------------------------------
// Modal: Variant Inspection
// -------------------------------------------------------------
function openVariantModal(v) {
els.modalVarTitle.textContent = `🧬 ${v.gene} — chr${v.chrom}:${v.pos.toLocaleString()}`;
els.modalVarBody.innerHTML = `
Gene: ${v.gene}
Role: ${v.geneInfo.role}
Position (GRCh38): chr${v.chrom}:${v.pos}
dbSNP Accession: ${v.dbsnp}
Ref → Alt Allele: ${v.ref} → ${v.alt}
Variant Type: ${v.type}
Genotype: ${v.gt}
VAF (Allele Fraction): ${(v.vaf * 100).toFixed(1)}%
Allelic Depth (Ref, Alt): ${v.ad_ref}, ${v.ad_alt}
Total Sequencing Depth: ${v.dp}×
GATK Quality Score: QUAL = ${v.qual}
Filter Status: ${v.filter}
Classification:
${v.classification}
${v.classification === 'Mosaic Somatic Candidate'
? 'This variant exhibits an allelic frequency between 5% and 38%, which is a hallmark signature of post-zygotic somatic mosaicism in Mosaic Variegated Aneuploidy (MVA).'
: 'Consistent with Mendelian germline inheritance at high sequencing depth.'}
`;
els.modalVariant.classList.remove('hidden');
}
// -------------------------------------------------------------
// Event Listeners & Shortcuts
// -------------------------------------------------------------
function setupEventListeners() {
// Navigation Tabs
els.navTabs.forEach(tab => {
tab.onclick = () => {
els.navTabs.forEach(t => t.classList.remove('active'));
els.tabContents.forEach(c => c.classList.remove('active'));
tab.classList.add('active');
const targetId = tab.dataset.tab;
const targetEl = document.getElementById(targetId);
if (targetEl) {
targetEl.classList.add('active');
window.scrollTo({ top: 0, behavior: 'smooth' });
}
};
});
// Omniverse Category Filter Pills
if (els.omniCategoryPills) {
els.omniCategoryPills.addEventListener('click', (e) => {
if (e.target.classList.contains('cat-pill')) {
document.querySelectorAll('.cat-pill').forEach(p => p.classList.remove('active'));
e.target.classList.add('active');
state.omniSelectedCat = e.target.dataset.cat;
renderOmniverseCatalog();
}
});
}
// Omniverse Global Search
if (els.omniGlobalSearch) {
els.omniGlobalSearch.oninput = (e) => {
state.omniSearchQuery = e.target.value;
renderOmniverseCatalog();
};
}
// Omniverse Dropdown Switcher
if (els.omniTableSelect) {
els.omniTableSelect.onchange = (e) => {
loadAndRenderOmniverseTable(e.target.value);
};
}
// Omniverse Row Filter
if (els.omniTableRowFilter) {
els.omniTableRowFilter.oninput = (e) => {
state.omniTableRowFilter = e.target.value;
renderOmniverseActiveTableRows();
};
}
// Omniverse Exports
if (els.btnExportCSV) els.btnExportCSV.onclick = () => exportActiveTable('csv');
if (els.btnExportJSON) els.btnExportJSON.onclick = () => exportActiveTable('json');
// Variant Filters
els.geneFilter.onchange = (e) => {
state.selectedGene = e.target.value;
applyVariantFilters();
};
els.typeFilter.onchange = (e) => {
state.selectedType = e.target.value;
applyVariantFilters();
};
els.mosaicFilter.onchange = (e) => {
state.selectedMosaic = e.target.value;
applyVariantFilters();
};
els.variantSearch.oninput = (e) => {
state.searchQuery = e.target.value;
applyVariantFilters();
};
els.btnResetChr.onclick = () => {
state.selectedChr = null;
renderChromosomeKaryotype();
applyVariantFilters();
};
// Infotable Search Filters
if (els.searchGeneBurden) {
els.searchGeneBurden.oninput = (e) => renderGeneBurdenTable(e.target.value);
}
if (els.searchSyndromicDiff) {
els.searchSyndromicDiff.oninput = (e) => renderSyndromicDiffTable(e.target.value);
}
if (els.searchAcmgMatrix) {
els.searchAcmgMatrix.oninput = (e) => renderAcmgMatrixTable(e.target.value);
}
if (els.searchTherapeuticTargets) {
els.searchTherapeuticTargets.oninput = (e) => renderTherapeuticTargetsTable(e.target.value);
}
if (els.searchMitoticMachinery) {
els.searchMitoticMachinery.oninput = (e) => renderMitoticMachineryTable(e.target.value);
}
if (els.searchKaryotypeMatrix) {
els.searchKaryotypeMatrix.oninput = (e) => renderKaryotypeMatrixTable(e.target.value);
}
// Modals
els.btnCloseVarModal.onclick = () => els.modalVariant.classList.add('hidden');
els.btnShortcuts.onclick = () => els.modalHelp.classList.remove('hidden');
els.btnCloseHelpModal.onclick = () => els.modalHelp.classList.add('hidden');
// Keyboard Shortcuts (1-9, 0, Q, W, E)
window.onkeydown = (e) => {
if (e.target.tagName === 'INPUT' || e.target.tagName === 'SELECT') return;
const key = e.key.toLowerCase();
let tabIndex = -1;
if (key === 'e') {
tabIndex = 0; // Omniverse Hub
} else if (['1','2','3','4','5','6','7','8','9'].includes(key)) {
tabIndex = parseInt(key, 10);
} else if (key === '0') {
tabIndex = 10;
} else if (key === 'q') {
tabIndex = 11;
} else if (key === 'w') {
tabIndex = 12;
} else if (key === '/') {
e.preventDefault();
if (els.navTabs[2]) els.navTabs[2].click();
els.variantSearch.focus();
return;
} else if (key === 'escape') {
els.modalVariant.classList.add('hidden');
els.modalHelp.classList.add('hidden');
return;
}
if (tabIndex >= 0 && els.navTabs[tabIndex]) {
els.navTabs[tabIndex].click();
}
};
}
// Launch on DOM ready
window.addEventListener('DOMContentLoaded', init);
})();