-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgsea-app.js
100 lines (85 loc) · 2.99 KB
/
gsea-app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
let worker;
function initWorker() {
worker = new Worker('gsea-worker.js');
worker.onmessage = handleWorkerMessage;
worker.onerror = handleWorkerError;
}
function handleWorkerMessage(event) {
console.log('Worker message received:', event.data);
const { status, result, error } = event.data;
if (status === 'ready') {
console.log('Worker is ready');
document.getElementById('run-button').disabled = false;
} else if (status === 'success') {
displayResults(result);
} else if (status === 'error') {
displayError(error);
}
}
function handleWorkerError(error) {
console.error('Worker error:', error);
displayError('An error occurred in the worker: ' + error.message);
}
function runGSEA(event) {
event.preventDefault();
const genes = document.getElementById('genes').value.split(',').map(g => g.trim());
const metric = document.getElementById('metric').value.split(',').map(m => parseFloat(m.trim()));
const geneSets = JSON.parse(document.getElementById('gene-sets').value);
const weight = parseFloat(document.getElementById('weight').value);
const minSize = parseInt(document.getElementById('min-size').value);
const maxSize = parseInt(document.getElementById('max-size').value);
const nperm = parseInt(document.getElementById('nperm').value);
const seed = document.getElementById('seed').value;
worker.postMessage({
genes,
metric,
geneSets,
weight,
minSize,
maxSize,
nperm,
seed
});
document.getElementById('run-button').disabled = true;
document.getElementById('results').innerHTML = 'Calculating...';
}
function displayResults(summaries) {
const resultsDiv = document.getElementById('results');
resultsDiv.innerHTML = '<h2>Results:</h2>';
if (!Array.isArray(summaries)) {
displayError('Invalid summaries structure');
return;
}
const table = document.createElement('table');
table.innerHTML = `
<tr>
<th>Term</th>
<th>ES</th>
<th>NES</th>
<th>P-value</th>
<th>FDR</th>
</tr>
`;
summaries.forEach(summary => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${summary.term}</td>
<td>${summary.es.toFixed(4)}</td>
<td>${summary.nes.toFixed(4)}</td>
<td>${summary.pval.toExponential(2)}</td>
<td>${summary.fdr.toExponential(2)}</td>
`;
table.appendChild(row);
});
resultsDiv.appendChild(table);
document.getElementById('run-button').disabled = false;
}
function displayError(error) {
const resultsDiv = document.getElementById('results');
resultsDiv.innerHTML = `<h2>Error:</h2><p>${error}</p>`;
document.getElementById('run-button').disabled = false;
}
document.addEventListener('DOMContentLoaded', () => {
initWorker();
document.getElementById('gsea-form').addEventListener('submit', runGSEA);
});