(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i minervaProxy.project.map.hideBioEntity(highlighted)); } // **************************************************************************** // ********************* PLUGIN STRUCTURE AND INTERACTION********************* // **************************************************************************** function initMainPageStructure() { globals.container = $('
').appendTo(pluginContainer); $("#ol_plugincontainer").addClass("ol_disabledbutton"); minerva.ServerConnector.getLoggedUser().then(function (user) { globals.user = user._login.toString().toLowerCase(); if (globals.defaultusers.includes(globals.user) === true) { alert('Warning: You can create overlays only after logging in.'); } if (globals.guestuser.includes(globals.user) === true) { alert("Warning: You are logged in using a public account. Overlays you create will be visible to other users if they are not removed."); } minervaProxy.project.data.getAllBioEntities().then(function (bioEntities) { globals.allBioEntities = bioEntities; bioEntities.forEach(e => { if (e.constructor.name === 'Alias') { globals.MIMSpeciesLowerCase.push(e.getName().toLowerCase()); globals.MIMSpecies.push(e.getName()); } }); globals.alreadycalculated = true; globals.container.append(`

Edit Overlays

Select Shown Overlay Creator Description

Upload Overlays

`); $('#ol_selectallbtn').click(function () { $(".clickCBinTable").each(function () { $(this).prop('checked', true); }); }); $('#ol_deselectallbtn').click(function () { $(".clickCBinTable").each(function () { $(this).prop('checked', false); }); }); $('#ol_showselectedbtn').click(function () { let text = disablebutton('ol_showselectedbtn'); showOverlays(getSelectedOVerlays()).finally(rs => { enablebtn('ol_showselectedbtn', text); }); }); $('#ol_hideselectedbtn').click(function () { let text = disablebutton('ol_hideselectedbtn'); hideOverlays(getSelectedOVerlays()).finally(rs => { enablebtn('ol_hideselectedbtn', text); }); }); $('#ol_removeselectedbtn').click(function () { let text = disablebutton('ol_removeselectedbtn'); removeOverlays(getSelectedOVerlays()).finally(r => { enablebtn('ol_removeselectedbtn', text); }); }); globals.container.append(`
`); $('#inputId').on('change', function () { om_detectfile(false); }); globals.container.append(` `); $(".dropdown-toggle").dropdown(); globals.container.append( /*html*/ `

`); $('#ol-positivecolor').change(function () { $('#ol-positivecolorvalue').val($(this).val()); }); $('#ol-neutralcolor').change(function () { $('#ol-neutralcolorvalue').val($(this).val()); }); $('#ol-negativecolor').change(function () { $('#ol-negativecolorvalue').val($(this).val()); }); globals.container.append(`
File Type:
Phenotype p-value threshold:
`); globals.container.append(''); var $note = $(`
Note: This will overwrite existing overlays with the same sample names.
`); globals.container.append($note); $("#ol_cb_overrideOverlay").change(function () { if (this.checked) { $note.remove(); $("#ol_startbtn").after($note); } else { $note.remove(); } }); $('#ol_startbtn').click(function () { readUserFile(); }); $("#ol_plugincontainer").removeClass("ol_disabledbutton"); globals.ol_table = $('#ol_table').DataTable({ "order": [[2, "asc"]], scrollX: true, autoWidth: true, columns: [{ "width": "10%" }, { "width": "10%" }, null, { "width": "15%" }, { "width": "25%" }], columnDefs: [{ orderable: false, className: 'dt-center', targets: 0 }, { targets: 1, className: 'dt-center' }, { targets: 2, className: 'dt-left' }, { targets: 3, className: 'dt-left' }, { targets: 4, className: 'dt-left' }] }); $('[data-toggle="popover"]').popover(); createOverlayTable(); }); }); } function getSelectedOVerlays() { let selected = []; $(".clickCBinTable").each(function () { var id = $(this).attr('data'); if ($(this).prop('checked') === true) { selected.push(id); } }); return selected; } function createOverlayTable() { globals.ol_table.clear(); var tbl = document.getElementById('ol_table'); let selectedDict = {}; $('input[type=checkbox]').each(function () { var data = $(this).attr('data'); if ($(this).attr('name') == "overlayToggle" && typeof data !== typeof undefined && data !== false) { selectedDict[data] = $(this).prop('checked'); } }); var overlays = minervaProxy.project.data.getDataOverlays(); for (let olCount = 0; olCount < overlays.length; olCount++) { var result_row = tbl.insertRow(tbl.rows.length); checkBoxCell(result_row, 'th', overlays[olCount].name, overlays[olCount].name, 'center', 'clickCBinTable'); let cbcell = checkBoxCell(result_row, 'th', "", overlays[olCount].id, 'center', ""); cbcell.disabled = true; cbcell.checked = selectedDict[overlays[olCount].id]; createTextCell(result_row, 'th', overlays[olCount].name, "", 'left'); createTextCell(result_row, 'th', overlays[olCount]._creator, "", 'left'); createTextCell(result_row, 'th', overlays[olCount]._description, "", 'left'); globals.ol_table.row.add(result_row); } globals.ol_table.columns.adjust().draw(); } function checkBoxCell(row, type, text, data, align, classname) { var button = document.createElement('input'); // create text node button.innerHTML = text; button.setAttribute('type', 'checkbox'); if (classname != "") button.setAttribute('class', classname); if (data != "") button.setAttribute('data', data); var cell = document.createElement(type); // create text node cell.appendChild(button); cell.setAttribute('style', 'text-align: ' + align + '; vertical-align: middle;'); // append DIV to the table cell row.appendChild(cell); // append DIV to the table cell return button; } function createTextCell(row, type, text, data, align) { var button = document.createElement('span'); // create text node button.innerHTML = text; if (data != "") button.setAttribute('data', data); var cell = document.createElement(type); // create text node cell.appendChild(button); cell.setAttribute('style', 'text-align: ' + align + '; vertical-align: middle;'); // append DIV to the table cell row.appendChild(cell); // append DIV to the table cell return button; // append DIV to the table cell } $(document).on('click', '.clickElementinTable', function () { var sid = parseFloat($(this).attr('data')); globals.selected = []; globals.allBioEntities.forEach(e => { if (e.constructor.name === 'Alias') { if (github.phenotypeNames[sid].toLowerCase() === e.getName().toLowerCase()) { globals.selected.push(e); } } }); focusOnSelected(); highlightSelected(false); }); function AddOverlays() { AddOverlaysPromise().then(r => { $("[name='refreshOverlays']").click(); }).catch(error => alert('Failed to add Overlays')); } function AddOverlaysPromise() { return new Promise((resolve, reject) => { function ajaxPostQuery(count) { return new Promise((resolve, reject) => { if (count <= globals.numberofSamples) { $.ajax({ method: 'POST', url: minerva.ServerConnector._serverBaseUrl + 'api/projects/' + minervaProxy.project.data.getProjectId() + '/overlays/', data: `content=name%09color${contentString(count)}&description=${globals.samples[count - 1]}&filename=${globals.samples[count - 1]}.txt&name=${globals.samples[count - 1]}&googleLicenseConsent=true`, cookie: 'MINERVA_AUTH_TOKEN=xxxxxxxx', success: response => { ajaxPostQuery(count + 1).then(r => resolve(response)); }, error: response => { reject(); } }); } else { resolve(''); } }); } ajaxPostQuery(1).then(pr => { $("[name='refreshOverlays']").click(); setTimeout(() => { createOverlayTable(); resolve(''); }, 400); }).catch(error => { reject(''); }); }); } function readUserFile() { let text = disablebutton("ol_startbtn"); setTimeout(() => { loadfile($("#ol_cb_overrideOverlay").prop('checked')).then(lf => { if (lf != "") { alert(lf); } normalizeExpressionValues().then(ne => { removeOverlays(globals.samples).then(r => { AddOverlaysPromise().then(ao => { if (globals.container.find('.resultscontainer').length > 0) { var element = globals.container.find('.resultscontainer')[0]; element.parentElement.removeChild(element); } if (!(globals.container.find('.resultscontainer').length > 0)) { globals.container.append(`

`); $('#ol_showoverlaybtn').click(function () { let text = disablebutton('ol_showoverlaybtn'); setTimeout(() => { showOverlays(globals.samples).finally(rs => { enablebtn('ol_showoverlaybtn', text); }); }, 200); }); $('#ol_hideoverlaybtn').click(function () { let text = disablebutton('ol_hideoverlaybtn'); setTimeout(() => { hideOverlays(globals.samples).finally(rs => { enablebtn('ol_hideoverlaybtn', text); }); }, 200); }); $('#ol_removeoverlaybtn').click(function () { let text = disablebutton('ol_removeoverlaybtn'); setTimeout(() => { removeOverlays(globals.samples).finally(r => { enablebtn('ol_removeoverlaybtn', text); }); }, 200); }); } }).catch(error => alert('Failed to create Overlays.')).finally(r => enablebtn("ol_startbtn", text)); }).catch(error => { alert('Failed to remove old Overlays.'); enablebtn("ol_startbtn", text); }); }).catch(error => { alert('Failed to normalize data values.'); enablebtn("ol_startbtn", text); }); }).catch(error => { alert('Could not read the file.'); enablebtn("ol_startbtn", text); }); }, 400); } function disablebutton(id) { var $btn = $('#' + id); let text = $btn.html(); $btn.html(''); $btn.addClass("ol_disabledbutton"); $("#ol_plugincontainer").addClass("ol_disabledbutton"); return text; } function enablebtn(id, text) { var $btn = $('#' + id); $btn.html(text); $btn.removeClass("ol_disabledbutton"); $("#ol_plugincontainer").removeClass("ol_disabledbutton"); } function loadfile(override) { return new Promise((resolve, reject) => { let existingols = []; var overlays = minervaProxy.project.data.getDataOverlays(); for (let olCount = 0; olCount < overlays.length; olCount++) { existingols.push(overlays[olCount].name); } var resolvemessage = ""; globals.pvalue = document.getElementById("om_checkbox_pvalue").checked; if (globals.pValue && (globals.columnheaders.length - 1) % 2 != 0) { reject('Number of p-value columns is different from the sumber of sample columns!'); return; } let pvalue_threshold = 1; if (globals.pvalue) { pvalue_threshold = parseFloat($("#pvalue_threshold").val().replace(',', '.')); if (isNaN(pvalue_threshold)) { alert("Only (decimal) numbers are allowed as an p-value threshold. p-value threshold was set to 0.05."); pvalue_threshold = 0.05; } } var fileToLoad = document.getElementById("inputId").files[0]; if (!fileToLoad) { reject('No file selected.'); } globals.numberofuserprobes = 0; var fileReader = new FileReader(); fileReader.onload = function (fileLoadedEvent) { globals.PhenotypeResults = []; globals.downloadtext = []; globals.speciesinsamples = []; globals.ExpressionValues = []; globals.samples = []; globals.UserExpressionValues = []; globals.normalizedExpressionValues = []; globals.UsernormalizedExpressionValues = []; var datamapped = false; var textFromFileLoaded = fileLoadedEvent.target.result; if (textFromFileLoaded.trim() == "") { reject('The file appears to be empty.'); } var firstline = true; textFromFileLoaded.split('\n').forEach(line => { if (firstline === true) { firstline = false; globals.samplestring = line; globals.numberofSamples = (line.split(globals.seperator).length - 1) / (globals.pvalue ? 2 : 1); var genename = true; let even_count = 0; line.split(globals.seperator).forEach(s => { if (genename === false) { even_count++; if (even_count % 2 != 0 || globals.pvalue == false) { var samplename = s; globals.specialCharacters.forEach(c => { samplename = samplename.replace(c, ""); }); samplename = samplename.trim(); if (!override) { let originalname = samplename; let j = 1; while (existingols.includes(samplename)) { samplename = originalname + "(" + j++ + ")"; } } existingols.push(samplename); globals.samples.push(samplename); } } else genename = false; }); } else { let breakflag = false; globals.numberofuserprobes++; var expression = []; var isname = true; if (line == "") { return; } if (globals.pvalue && line.split(globals.seperator).length != globals.samples.length * 2 + 1 || globals.pvalue == false && line.split(globals.seperator).length > globals.samples.length + 1) { var linelengtherror = "Lines in the datafile may have been skipped because of structural issues."; if (resolvemessage.includes(linelengtherror) === false) { resolvemessage += linelengtherror; } return; } let even_count = 0; line.split(globals.seperator).forEach(element => { if (isname === true) { isname = false; let name = element.toLowerCase().trim(); if (globals.MIMSpeciesLowerCase.includes(name) === false) { breakflag = true; } else { datamapped = true; } if (breakflag === false) { expression.push(name); globals.speciesinsamples.push(name); } } else { even_count++; if (breakflag === false) { var number = parseFloat(element.replace(",", ".").trim()); if (even_count % 2 != 0 || globals.pvalue == false) { if (isNaN(number)) { var numbererror = "Some values could not be read as numbers."; if (resolvemessage.includes(numbererror) === false) { if (resolvemessage != "") { resolvemessage += "\n"; } resolvemessage += numbererror; } expression.push(0); } else { expression.push(number); } } if (even_count % 2 == 0 && globals.pvalue == true) { if (isNaN(number) || number > pvalue_threshold) { expression[expression.length - 1] = 0; } } } } }); if (expression.length === globals.numberofSamples + 1) { globals.ExpressionValues.push(expression); globals.UserExpressionValues.push(expression); } } }); if (globals.ExpressionValues.length === 0) { if (datamapped === false) { reject('No data in the file could be found, read or mapped.'); } else { reject('The data could not be read.'); } } else { resolve(resolvemessage); } }; fileReader.readAsText(fileToLoad, "UTF-8"); }); } function contentString(ID) { function hexToRgb(hex) { var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); if (result) { return [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)]; } else { throw new Error('Color hex code error!'); } } function pickHex(weight) { var color1 = hexToRgb($('#ol-neutralcolor').val()); var color2; if (weight < 0) { color2 = hexToRgb($('#ol-negativecolor').val()); } else { color2 = hexToRgb($('#ol-positivecolor').val()); } var rgbToHex = function (rgb) { var hex = Number(Math.round(rgb)).toString(16); if (hex.length < 2) { hex = "0" + hex; } return hex; }; var w2 = Math.abs(weight); var w1 = 1 - w2; var output = rgbToHex(color1[0] * w1 + color2[0] * w2) + rgbToHex(color1[1] * w1 + color2[1] * w2) + rgbToHex(color1[2] * w1 + color2[2] * w2); return output; } let output = ''; globals.UsernormalizedExpressionValues.forEach(p => { if (!isNaN(p[ID]) && p[ID] != 0) { output += `%0A${p[0]}%09%23` + pickHex(p[ID]); } }); return output; } function removeOverlays(samples) { return new Promise((resolve, reject) => { function ajaxDeleteQuery(count) { return new Promise((resolve, reject) => { if (count.length > 0) { $.ajax({ method: 'DELETE', url: minerva.ServerConnector._serverBaseUrl + 'api/projects/' + minervaProxy.project.data.getProjectId() + '/overlays/' + count[0].id, cookie: 'MINERVA_AUTH_TOKEN=xxxxxxxx', success: response => { count.splice(0, 1); ajaxDeleteQuery(count).then(r => resolve(response)); } }); } else { resolve(''); } }); } hideOverlays(samples = samples).then(rs => { setTimeout(getDataOverlays(samples).then(ols => { ajaxDeleteQuery(ols).then(dr => { $("[name='refreshOverlays']").click(); setTimeout(() => { createOverlayTable(); resolve(''); }, 400); //Overlay POST function }); }), 200); }); }); } function getDataOverlays(samples, all = false) { return new Promise((resolve, reject) => { var overlays = minervaProxy.project.data.getDataOverlays(); if (all) { resolve(overlays); } else { let olarray = []; for (let olCount = 0; olCount < overlays.length; olCount++) { if (samples.includes(overlays[olCount].name) === true) { olarray.push(overlays[olCount]); } } resolve(olarray); } }); } function hideOverlays(samples = [], all = false) { return new Promise((resolve, reject) => { var overlays = minervaProxy.project.data.getDataOverlays(); function hideOverlay(ols) { return new Promise((resolve, reject) => { if (ols.length > 0) { minervaProxy.project.map.hideDataOverlay(ols[0].id).then(r => { ols.splice(0, 1); hideOverlay(ols).then(s => { resolve(''); }); }); ; } else { resolve(''); } }); } getDataOverlays(samples, all = all).then(ol => { hideOverlay(ol).then(rs => { $("[name='refreshOverlays']").click(); setTimeout(() => { resolve(''); }, 400); }); }); }); } function showOverlays(samples) { return new Promise((resolve, reject) => { function showOverlay(ols) { return new Promise((resolve, reject) => { if (ols.length > 0) { minervaProxy.project.map.showDataOverlay(ols[0]).then(r => { ols.splice(0, 1); showOverlay(ols).then(s => { resolve(''); }); }); ; } else { resolve(''); } }); } getDataOverlays(samples).then(ol => { showOverlay(ol).then(rs => { $("[name='refreshOverlays']").click(); setTimeout(() => { resolve(''); }, 400); }); }); }); } function normalizeExpressionValues() { return new Promise((resolve, reject) => { let typevalue = $('.selecttype').val(); let allmax = 0.0; let alreadyincluded = []; let samplemaxvalues = []; let probemaxvalues = []; for (var i = 0; i < globals.numberofSamples; i++) { samplemaxvalues.push(0); } for (var i = 0; i < globals.UserExpressionValues.length; i++) { let probemax = 0; for (let j = 1; j < globals.UserExpressionValues[i].length; j++) { let value = Math.abs(globals.UserExpressionValues[i][j]); if (value > allmax) allmax = value; if (value > probemax) probemax = value; if (j <= globals.numberofSamples) { if (value > samplemaxvalues[j - 1]) { samplemaxvalues[j - 1] = value; } } } probemaxvalues.push(probemax); } for (var m = 0; m < globals.UserExpressionValues.length; m++) { if (globals.UserExpressionValues[m].length != globals.numberofSamples + 1) continue; let name = globals.UserExpressionValues[m][0]; if (alreadyincluded.includes(name) === true) continue; let normalizedExpression = []; normalizedExpression.push(name); alreadyincluded.push(name); let max = allmax; if (typevalue == 1) { max = probemaxvalues[m]; } for (let k = 1; k < globals.UserExpressionValues[m].length; k++) { if (typevalue == 2) { max = samplemaxvalues[k - 1]; } if (max > 0) { normalizedExpression.push(globals.UserExpressionValues[m][k] / max); } else { normalizedExpression.push(globals.UserExpressionValues[m][k]); } } globals.UsernormalizedExpressionValues.push(normalizedExpression); } resolve(''); }); } function highlightSelected(pickedRandomly = false) { minervaProxy.project.map.getHighlightedBioEntities().then(highlighted => { minervaProxy.project.map.hideBioEntity(highlighted).then(r => { const highlightDefs = []; if (pickedRandomly) { if (globals.pickedRandomly) { highlightDefs.push({ element: { id: globals.pickedRandomly.id, modelId: globals.pickedRandomly.getModelId(), type: globals.pickedRandomly.constructor.name.toUpperCase() }, type: "SURFACE", options: { color: '#00FF00', opacity: 0.2 } }); } } else { globals.selected.forEach(e => { if (e.constructor.name === 'Alias') { highlightDefs.push({ element: { id: e.id, modelId: e.getModelId(), type: "ALIAS" }, type: "ICON" }); } }); } minervaProxy.project.map.showBioEntity(highlightDefs); }); }); } function focusOnSelected() { function focus(entity) { if (entity.constructor.name === 'Alias') { minervaProxy.project.map.fitBounds({ modelId: entity.getModelId(), x1: entity.getX(), y1: entity.getY(), x2: entity.getX() + entity.getWidth(), y2: entity.getY() + entity.getHeight() }); } else { minervaProxy.project.map.fitBounds({ modelId: entity.getModelId(), x1: entity.getCenter().x, y1: entity.getCenter().y, x2: entity.getCenter().x, y2: entity.getCenter().y }); } } if (globals.selected.length > 0) { minervaProxy.project.map.openMap({ id: globals.selected[0].getModelId() }); focus(globals.selected[0]); } } function searchListener(entites) { globals.selected = entites[0]; let str = ''; if (globals.selected.length > 0) { globals.selected.forEach(e => { if (e.constructor.name === 'Alias') str += `
${e.getName()} - ${e.getElementId()} - ${e._type}
`; }); } } function om_detectfile(force_seperator) { if (document.getElementById("inputId").files.length == 0) { return false; } var fileToLoad = document.getElementById("inputId").files[0]; var fileReader = new FileReader(); fileReader.readAsText(fileToLoad, "UTF-8"); fileReader.onload = function (fileLoadedEvent) { var success = false; globals.columnheaders = []; $("#om_columnSelect").empty(); var textFromFileLoaded = fileLoadedEvent.target.result; if (textFromFileLoaded.trim() == "") { return stopfile('The file appears to be empty.'); } var firstline = textFromFileLoaded.split('\n')[0]; if (!force_seperator) { if ((firstline.match(new RegExp(",", "g")) || []).length > (firstline.match(new RegExp("\t", "g")) || []).length) { globals.seperator = ","; $("#om_filetypeSelect").val(1); } else { globals.seperator = "\t"; $("#om_filetypeSelect").val(0); } } var index = 0; firstline.split(globals.seperator).forEach(entry => { let header = entry; globals.specialCharacters.forEach(c => { header = header.replace(c, ""); }); globals.columnheaders.push(header.trim()); index++; }); if ((globals.columnheaders.length - 1) % 2 != 0) { $('#om_checkbox_pvalue').prop('checked', false); } else { for (let _header of globals.columnheaders) { if (_header.toLowerCase().includes("pvalue")) { $('#om_checkbox_pvalue').prop('checked', true); break; } } } //let columnSelect = document.getElementById('om_columnSelect'); for (let i = 0; i < globals.columnheaders.length; i++) { if (globals.columnheaders.filter(item => item == globals.columnheaders[i]).length > 1) { return stopfile('Headers in first line need to be unique!
Column ' + globals.columnheaders[i] + ' occured multiple times.'); } //columnSelect.options[columnSelect.options.length] = new Option(globals.columnheaders[i], i); } ; if (globals.columnheaders.length <= 1) { return stopfile('Could not read Headers'); } success = true; function stopfile(alerttext) { if (alerttext != "") alert(alerttext); success = false; return false; } return success; }; } function isNumber(evt) { evt = evt ? evt : window.event; var charCode = evt.which ? evt.which : evt.keyCode; if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 44 && charCode != 46) { return false; } return true; } },{"../css/styles.css":1}],3:[function(require,module,exports){ 'use strict'; // For more information about browser field, check out the browser field at https://github.com/substack/browserify-handbook#browser-field. var styleElementsInsertedAtTop = []; var insertStyleElement = function(styleElement, options) { var head = document.head || document.getElementsByTagName('head')[0]; var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1]; options = options || {}; options.insertAt = options.insertAt || 'bottom'; if (options.insertAt === 'top') { if (!lastStyleElementInsertedAtTop) { head.insertBefore(styleElement, head.firstChild); } else if (lastStyleElementInsertedAtTop.nextSibling) { head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling); } else { head.appendChild(styleElement); } styleElementsInsertedAtTop.push(styleElement); } else if (options.insertAt === 'bottom') { head.appendChild(styleElement); } else { throw new Error('Invalid value for parameter \'insertAt\'. Must be \'top\' or \'bottom\'.'); } }; module.exports = { // Create a tag with optional data attributes createLink: function(href, attributes) { var head = document.head || document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.href = href; link.rel = 'stylesheet'; for (var key in attributes) { if ( ! attributes.hasOwnProperty(key)) { continue; } var value = attributes[key]; link.setAttribute('data-' + key, value); } head.appendChild(link); }, // Create a