From 75813d1782d669b0dd115a15ccfe552bc112ae8a Mon Sep 17 00:00:00 2001 From: Maximilian Haeussler Date: Sat, 28 Dec 2019 12:41:51 +0100 Subject: [PATCH 01/16] adding long_label to pip package --- setup.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 60947089..eee133e4 100644 --- a/setup.py +++ b/setup.py @@ -14,8 +14,16 @@ author_email="max@soe.ucsc.edu", url="https://github.com/maximilianh/cellBrowser", description="UCSC Cellbrowser, an interactive browser for single cell data. Includes converters and basic pipelines for text files, Seurat, Scanpy and Cellranger.", - #long_description=long_description, - #long_description_content_type="text/markdown", + long_description="""The UCSC Cell Browser is an interactive browser for + single cell data, like mRNA or ATAC-seq data. You can display + dimensionality reductions, navigate them with the mouse or the cursor keys, + select cells, color by genes or meta annotations and make many other + changes. The main site runs at https://cells.ucsc.edu, but using this + package you can also convert data yourself and build a Cell Browser HTML + directory that can be served through any University webserver. You can try + the Cell Browser at https://cells.ucsc.edu or read about how to convert + data with this package on https://cellbrowser.rtfd.org.""" + long_description_content_type="text/markdown", packages=setuptools.find_packages("src/cbPyLib/"), package_dir={'':'src/cbPyLib/'}, # tell distutils packages are under src include_package_data=True, # use MANIFEST.in for non-python files From 27a381534d1c828828970d2e74fad7b445134cb2 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 28 Dec 2019 03:55:51 -0800 Subject: [PATCH 02/16] setup.py fixes --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index eee133e4..7a0508f9 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ package you can also convert data yourself and build a Cell Browser HTML directory that can be served through any University webserver. You can try the Cell Browser at https://cells.ucsc.edu or read about how to convert - data with this package on https://cellbrowser.rtfd.org.""" + data with this package on https://cellbrowser.rtfd.org.""", long_description_content_type="text/markdown", packages=setuptools.find_packages("src/cbPyLib/"), package_dir={'':'src/cbPyLib/'}, # tell distutils packages are under src From 8afd4d6f629f07aa37ba8a80d1f8bdb59c3bf15d Mon Sep 17 00:00:00 2001 From: Matt Speir Date: Mon, 6 Jan 2020 15:18:59 -0800 Subject: [PATCH 03/16] Adding logo to Github --- docs/cellBrowserLogo.png | Bin 0 -> 38196 bytes docs/cellBrowserLogoBallOnly.png | Bin 0 -> 28581 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/cellBrowserLogo.png create mode 100644 docs/cellBrowserLogoBallOnly.png diff --git a/docs/cellBrowserLogo.png b/docs/cellBrowserLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d05b701e7c9fd832392cf11c44e032a2ed683a6 GIT binary patch literal 38196 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

B&9VoJ-y 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 H^z;7$N^Dm& literal 0 HcmV?d00001 From 34a867b5c7304cd06a2c5e5b191a1f6bf466d1cd Mon Sep 17 00:00:00 2001 From: Nikolay Markov Date: Mon, 20 Apr 2020 16:48:31 -0500 Subject: [PATCH 04/16] Allow commas in cluster names in markers file --- src/cbPyLib/cellbrowser/cellbrowser.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cbPyLib/cellbrowser/cellbrowser.py b/src/cbPyLib/cellbrowser/cellbrowser.py index 267259e1..08bad2da 100755 --- a/src/cbPyLib/cellbrowser/cellbrowser.py +++ b/src/cbPyLib/cellbrowser/cellbrowser.py @@ -17,6 +17,7 @@ from collections import namedtuple, OrderedDict from os.path import join, basename, dirname, isfile, isdir, relpath, abspath, getsize, getmtime, expanduser from time import gmtime, strftime +import csv try: # python3 @@ -2462,10 +2463,10 @@ def parseMarkerTable(filename, geneToSym): otherHeaders = headers[otherStart:otherEnd] logging.debug("Other headers: %s" % otherHeaders) + reader = csv.reader(ifh, delimiter=sep, quotechar='"') data = defaultdict(list) otherColumns = defaultdict(list) - for line in ifh: - row = line.rstrip("\r\n").split(sep) + for row in reader: clusterName = row[clusterIdx] geneId = row[geneIdx] scoreVal = float(row[scoreIdx]) From 389f4d6f6eff9e8b72d5451bc8fd83e5f59dc418 Mon Sep 17 00:00:00 2001 From: Ino de Bruijn Date: Tue, 28 Apr 2020 11:39:04 -0400 Subject: [PATCH 05/16] Fix #170 --- src/cbPyLib/cellbrowser/cellbrowser.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cbPyLib/cellbrowser/cellbrowser.py b/src/cbPyLib/cellbrowser/cellbrowser.py index 08bad2da..0b173b20 100755 --- a/src/cbPyLib/cellbrowser/cellbrowser.py +++ b/src/cbPyLib/cellbrowser/cellbrowser.py @@ -4166,8 +4166,9 @@ def findRoot(inDir=None): def resolveOutDir(outDir): """ user can define mapping e.g. {"alpha" : "/usr/local/apache/htdocs-cells"} in ~/.cellbrowser.conf """ confDirs = getConfig("outDirs") - if outDir in confDirs: - outDir = confDirs[outDir] + if confDirs: + if outDir in confDirs: + outDir = confDirs[outDir] return outDir def build(confFnames, outDir, port=None, doDebug=False, devMode=False, redo=None): From d1852ddac810f7559b60b2e0faad97ead7402e30 Mon Sep 17 00:00:00 2001 From: Nikolay Markov Date: Thu, 21 May 2020 16:48:24 -0500 Subject: [PATCH 06/16] Fix open dataset for plain datasets, fix Esc closing for open dataset dialog --- src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js b/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js index a5bb482f..a8654b1e 100644 --- a/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js +++ b/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js @@ -932,7 +932,7 @@ var cellbrowser = function() { let doFaceting = false; let filtList = []; - if (openDsInfo.parents === undefined) { + if (openDsInfo.parents === undefined && openDsInfo.datasets !== undefined) { //noteLines.push("Filter:"); let bodyParts = getBodyParts(openDsInfo.datasets); if (bodyParts.length!==0) { @@ -1055,7 +1055,9 @@ var cellbrowser = function() { changeUrl({"ds":openDatasetName}); }); + var focused = document.activeElement; var scroller = $("#tpDatasetList").overlayScrollbars({ }); + $(focused).focus(); $("#tabLink1").tab("show"); From 04fdba61a6e077a901ffc435f47761092e99721f Mon Sep 17 00:00:00 2001 From: Nikolay Markov Date: Sun, 24 May 2020 13:58:56 -0500 Subject: [PATCH 07/16] Update legend selection checkboxes on selection actions --- src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js b/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js index a5bb482f..2d494714 100644 --- a/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js +++ b/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js @@ -1107,6 +1107,8 @@ var cellbrowser = function() { renderer.selectClear(); renderer.selectVisible(); renderer.drawDots(); + + $(".tpLegendCheckbox").prop("checked", true); } function onSelectNoneClick() { @@ -1114,6 +1116,8 @@ var cellbrowser = function() { clearSelectionState(); renderer.selectClear(); renderer.drawDots(); + + $(".tpLegendCheckbox").prop("checked", false); } function onSelectInvertClick() { @@ -1121,6 +1125,10 @@ var cellbrowser = function() { clearSelectionState(); renderer.selectInvert(); renderer.drawDots(); + + $(".tpLegendCheckbox").each(function() { + $(this).prop("checked", !$(this).prop("checked")); + }); } function buildOneComboboxRow(htmls, comboWidth, rowIdx, queryExpr) { @@ -5217,6 +5225,7 @@ var cellbrowser = function() { renderer.unselectByColor(valIdx); renderer.drawDots(); ev.stopPropagation(); + $(this).blur(); } function buildMinMaxPart(htmls) { From a066e9cd28d0ee154ca51460d0ef89196dcd72f6 Mon Sep 17 00:00:00 2001 From: Maximilian Haeussler Date: Mon, 25 May 2020 16:50:17 +0200 Subject: [PATCH 08/16] Update README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 9d76ee69..01803626 100644 --- a/README.rst +++ b/README.rst @@ -18,8 +18,8 @@ If you want us to add a single cell dataset to the website http://cells.ucsc.edu please contact us at cells@ucsc.edu. We are happy to add any dataset. This is a viewer for a static, precomputed layout. If you're looking for an interative layout, where you can -move the cells around and run algorithsm interactively, try Chan-Zuckerberg's own cellxgene or Spring. -Another viewer is `Scope `_. +move the cells around and run some algorithms interactively, try Chan-Zuckerberg's own cellxgene or Spring. +A website with both datasets and some analysis is `Scope `_. Apart from labs at UCSC, UCSF and Gladstone who host their data at cells.ucsc.edu, other groups have setup their own cell browsers: From ce461ce5ef08e794dad889c0560d85cae1b634f4 Mon Sep 17 00:00:00 2001 From: Maximilian Haeussler Date: Mon, 25 May 2020 17:25:03 +0200 Subject: [PATCH 09/16] Update README.rst --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 01803626..90b18dd1 100644 --- a/README.rst +++ b/README.rst @@ -26,14 +26,14 @@ cells.ucsc.edu, other groups have setup their own cell browsers: * Alexander Misharin Lab, Northwester University, https://www.nupulmonary.org/resources/ * Accelerating Medicine Partnership Consortium, https://immunogenomics.io/cellbrowser/, used in `Zhang et al. 2018 `_ and `Der et al 2018 `_ -* Sansom Lab, Oxford, https://sansomlab.github.io -* http://caire.ipmc.cnrs.fr/cellbrowser/Differentiation/ Zaragosi group at IPMC CNRS Nice, for the manuscript https://dev.biologists.org/content/early/2019/09/25/dev.177428.abstract +* Sansom Lab, Oxford, https://sansomlab.github.io for `Croft et al, Nature 2019 `_ +* http://caire.ipmc.cnrs.fr/cellbrowser/Differentiation/ (URL has changed, contacted authors) Zaragosi group at IPMC CNRS Nice, for the manuscript https://dev.biologists.org/content/early/2019/09/25/dev.177428.abstract Additional availability ----------------------- * The preferred installation is via pip https://pypi.org/project/cellbrowser/0.4.12/, see https://cellbrowser.readthedocs.io -* Bioconda: this tool is available to install via `bioconda `_Note that the conda release is usually a bit outdated relative to the pip release. +* Bioconda: this tool is available to install via `bioconda `_. Note that the conda release is usually a bit outdated relative to the pip release, so use pip if possible. If you cannot use pip, please contact us. * Biocontainers: there is a biocontainer automatically generated from the bioconda package available `here `_ * The Seurat3Wizard, demo at http://nasqar.abudhabi.nyu.edu/SeuratV3Wizard, builds a cell browser as its last step * Galaxy: there is a Galaxy tool for UCSC CellBrowser, which can be installed on any Galaxy instance via its `Galaxy Toolshed entry `_ or it can be directly used by users at the `Human Cell Atlas Galaxy instance `_ or as part of the example workflows, such as the `Human Cell Atlas / Scanpy CellBrowser workflow `_ or the `EBI Single Cell Expression Atlas / Scanpy / CellBrowser workflow `_ From e4b7161e9db212b1f4855b300df69386b617bed9 Mon Sep 17 00:00:00 2001 From: Maximilian Haeussler Date: Mon, 25 May 2020 17:26:20 +0200 Subject: [PATCH 10/16] Update README.rst --- README.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 90b18dd1..82d26ea8 100644 --- a/README.rst +++ b/README.rst @@ -21,8 +21,7 @@ This is a viewer for a static, precomputed layout. If you're looking for an inte move the cells around and run some algorithms interactively, try Chan-Zuckerberg's own cellxgene or Spring. A website with both datasets and some analysis is `Scope `_. -Apart from labs at UCSC, UCSF and Gladstone who host their data at -cells.ucsc.edu, other groups have setup their own cell browsers: +Many labs host their data at cells.ucsc.edu by sending it to us, but some groups have setup their own cell browsers: * Alexander Misharin Lab, Northwester University, https://www.nupulmonary.org/resources/ * Accelerating Medicine Partnership Consortium, https://immunogenomics.io/cellbrowser/, used in `Zhang et al. 2018 `_ and `Der et al 2018 `_ @@ -39,8 +38,8 @@ Additional availability * Galaxy: there is a Galaxy tool for UCSC CellBrowser, which can be installed on any Galaxy instance via its `Galaxy Toolshed entry `_ or it can be directly used by users at the `Human Cell Atlas Galaxy instance `_ or as part of the example workflows, such as the `Human Cell Atlas / Scanpy CellBrowser workflow `_ or the `EBI Single Cell Expression Atlas / Scanpy / CellBrowser workflow `_ -Funded by the California Institute of Regenerative Medicine and the -Chan-Zuckerberg Initiative https://www.chanzuckerberg.com/. +This project was funded by the California Institute of Regenerative Medicine and the +Chan-Zuckerberg Initiative https://www.chanzuckerberg.com/. It is funded right now through a supplement to the NHGRI Genome Browser grant. This is early research software. You are likely to find bugs. Please open a Github ticket or email us at cells@ucsc.edu, we can usually fix them quickly. From 920ac129cbc81174d61e323e4818c5cad0aa8b0c Mon Sep 17 00:00:00 2001 From: Maximilian Haeussler Date: Mon, 25 May 2020 17:27:01 +0200 Subject: [PATCH 11/16] Update README.rst --- README.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 82d26ea8..190c4231 100644 --- a/README.rst +++ b/README.rst @@ -31,15 +31,14 @@ Many labs host their data at cells.ucsc.edu by sending it to us, but some groups Additional availability ----------------------- -* The preferred installation is via pip https://pypi.org/project/cellbrowser/0.4.12/, see https://cellbrowser.readthedocs.io +* The preferred installation is via pip https://pypi.org/project/cellbrowser/, for documentation see https://cellbrowser.readthedocs.io * Bioconda: this tool is available to install via `bioconda `_. Note that the conda release is usually a bit outdated relative to the pip release, so use pip if possible. If you cannot use pip, please contact us. * Biocontainers: there is a biocontainer automatically generated from the bioconda package available `here `_ * The Seurat3Wizard, demo at http://nasqar.abudhabi.nyu.edu/SeuratV3Wizard, builds a cell browser as its last step * Galaxy: there is a Galaxy tool for UCSC CellBrowser, which can be installed on any Galaxy instance via its `Galaxy Toolshed entry `_ or it can be directly used by users at the `Human Cell Atlas Galaxy instance `_ or as part of the example workflows, such as the `Human Cell Atlas / Scanpy CellBrowser workflow `_ or the `EBI Single Cell Expression Atlas / Scanpy / CellBrowser workflow `_ - This project was funded by the California Institute of Regenerative Medicine and the -Chan-Zuckerberg Initiative https://www.chanzuckerberg.com/. It is funded right now through a supplement to the NHGRI Genome Browser grant. +Chan-Zuckerberg Initiative https://www.chanzuckerberg.com/. In 2020, it is funded through a supplement to the NHGRI Genome Browser grant. This is early research software. You are likely to find bugs. Please open a Github ticket or email us at cells@ucsc.edu, we can usually fix them quickly. From 268751654bc5378b4fc5035b5568014656145375 Mon Sep 17 00:00:00 2001 From: Nikolay Markov Date: Mon, 1 Jun 2020 18:08:16 -0500 Subject: [PATCH 12/16] Change selection to Set, toggle legend checkboxes based on selection --- .../cellbrowser/cbWeb/js/cellBrowser.js | 70 ++++--------- src/cbPyLib/cellbrowser/cbWeb/js/maxPlot.js | 97 +++++++++---------- 2 files changed, 65 insertions(+), 102 deletions(-) diff --git a/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js b/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js index 2d494714..1c560438 100644 --- a/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js +++ b/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js @@ -1074,8 +1074,11 @@ var cellbrowser = function() { } - function onSelChange(cellIds) { + function onSelChange(selection) { /* called each time when the selection has been changed */ + var cellIds = []; + selection.forEach(function(x) {cellIds.push(x)}); + if (cellIds.length===0 || cellIds===null) { clearMetaAndGene(); clearSelectionState(); @@ -1093,6 +1096,21 @@ var cellbrowser = function() { if ("geneSym" in gLegend) buildViolinPlot(); + var cols = renderer.col.arr; + var selectedLegends = {}; + for (var i = 0; i < gLegend.rows.length; i++) { + selectedLegends[i] = 0; + } + selection.forEach(function(cellId) { + selectedLegends[cols[cellId]]++; + }); + for (var i = 0; i < gLegend.rows.length; i++) { + if (selectedLegends[i] == gLegend.rows[i].count) { + $("#tpLegendCheckbox_" + i).prop("checked", true); + } else { + $("#tpLegendCheckbox_" + i).prop("checked", false); + } + } } function onSaveAsClick() { @@ -1107,8 +1125,6 @@ var cellbrowser = function() { renderer.selectClear(); renderer.selectVisible(); renderer.drawDots(); - - $(".tpLegendCheckbox").prop("checked", true); } function onSelectNoneClick() { @@ -1116,8 +1132,6 @@ var cellbrowser = function() { clearSelectionState(); renderer.selectClear(); renderer.drawDots(); - - $(".tpLegendCheckbox").prop("checked", false); } function onSelectInvertClick() { @@ -1125,10 +1139,6 @@ var cellbrowser = function() { clearSelectionState(); renderer.selectInvert(); renderer.drawDots(); - - $(".tpLegendCheckbox").each(function() { - $(this).prop("checked", !$(this).prop("checked")); - }); } function buildOneComboboxRow(htmls, comboWidth, rowIdx, queryExpr) { @@ -5088,49 +5098,9 @@ var cellbrowser = function() { function onLegendLabelClick(ev) { /* called when user clicks on legend entry. */ - //function saveLabel() { - ///* save the current labelEl text to the cart and update everything */ - //$(".tooltip").remove(); // not sure why tooltips won't disappear here - //labelEl.removeAttr("contenteditable"); - //var newLabel = labelEl.text(); // = strip the rich text tags possibly added through copy/paste - //var metaInfo = gLegend.metaInfo; - //cartFieldArrayUpdate(db, metaInfo, "shortLabels", legendId, newLabel); - //legendUpdateLabels(gLegend.metaInfo.name); - //rendererUpdateLabels(metaInfo); - //buildLegendBar(); - //renderer.drawDots(); - //} - var legendId = parseInt(ev.target.id.split("_")[1]); var colorIndex = gLegend.rows[legendId].intKey; - - //if (("lastClicked" in gLegend) && gLegend.lastClicked===legendId) { - // user clicked the same entry as before: - //gLegend.lastClicked = null; - //$('#tpLegend_'+legendId).removeClass('tpLegendSelect'); - //renderer.selectClear(); - //} - //else { - // clear the old selection - //if (!ev.shiftKey && !ev.ctrlKey && !ev.metaKey) { - //renderer.selectClear(); - //$('.tpLegend').removeClass('tpLegendSelect'); - //} - $("#tpLegendCheckbox_"+colorIndex).prop("checked", true); - renderer.selectByColor(colorIndex); - //menuBarShow("#tpFilterButton"); - //menuBarShow("#tpOnlySelectedButton"); - //$('#tpLegend_'+legendId).addClass('tpLegendSelect'); - //gLegend.lastClicked=legendId; - clearSelectionState(); - //if (gLegend.type==="meta" && gLegend.metaInfo.type==="enum") { - //let fieldName = gLegend.metaInfo.name; - //let fieldVal = gLegend.metaInfo.valCounts[colorIndex][0]; - //let queryList = [{"m":fieldName, "eq":fieldVal}]; - //saveQueryList(queryList); - //} - //} - renderer.drawDots(); + $("#tpLegendCheckbox_" + colorIndex).click(); } function onSortByClick (ev) { diff --git a/src/cbPyLib/cellbrowser/cbWeb/js/maxPlot.js b/src/cbPyLib/cellbrowser/cbWeb/js/maxPlot.js index b84a04db..7bfe91e6 100644 --- a/src/cbPyLib/cellbrowser/cbWeb/js/maxPlot.js +++ b/src/cbPyLib/cellbrowser/cbWeb/js/maxPlot.js @@ -174,7 +174,7 @@ function MaxPlot(div, top, left, width, height, args) { self.col.pal = null; // list of six-digit hex codes self.col.arr = null; // length is coords.px/2, one byte per cell = index into self.col.pal - self.selCells = []; // IDs of cells that are selected (drawn in black) + self.selCells = new Set(); // IDs of cells that are selected (drawn in black) self.doDrawLabels = true; // should cluster labels be drawn? self.initPort(args); @@ -652,13 +652,12 @@ function MaxPlot(div, top, left, width, height, args) { // draw the selection as black rectangles ctx.globalAlpha = 0.7; ctx.fillStyle="black"; - for (i = 0; i < selCells.length; i++) { - var cellId = selCells[i]; + selCells.forEach(function(cellId) { let pxX = pxCoords[2*cellId]; let pxY = pxCoords[2*cellId+1]; ctx.fillRect(pxX-radius, pxY-radius, dblSize, dblSize); count += 1; - } + }) console.log(count+" rectangles drawn (including selection)"); ctx.restore(); return count; @@ -907,18 +906,17 @@ function MaxPlot(div, top, left, width, height, args) { // overdraw the selection as solid black circle outlines ctx.globalAlpha = 0.7; - for (i = 0; i < selCells.length; i++) { - var cellId = selCells[i]; + selCells.forEach(function(cellId) { let pxX = pxCoords[2*cellId]; let pxY = pxCoords[2*cellId+1]; if (isHidden(pxX, pxY)) - continue; + return; // make sure that old leftover overlapping black circles don't shine through let col = coordColors[cellId]; ctx.drawImage(off, col * tileWidth, 0, tileWidth, tileHeight, pxX - radius -1, pxY - radius-1, tileWidth, tileHeight); ctx.drawImage(off, selImgId * tileWidth, 0, tileWidth, tileHeight, pxX - radius -1, pxY - radius-1, tileWidth, tileHeight); - } + }) console.log(count +" circles drawn"); ctx.restore(); @@ -1020,17 +1018,16 @@ function MaxPlot(div, top, left, width, height, args) { } // overdraw the selection as black pixels - for (i = 0; i < selCells.length; i++) { - var cellId = selCells[i]; + selCells.forEach(function(cellId) { let pxX = pxCoords[2*cellId]; let pxY = pxCoords[2*cellId+1]; if (isHidden(pxX, pxY)) - continue; + return; let p = 4 * (pxY*width+pxX); // pointer to red value of pixel at x,y cData[p] = 0; cData[p+1] = 0; cData[p+2] = 0; - } + }) self.ctx.putImageData(canvasData, 0, 0); return count; @@ -1493,30 +1490,29 @@ function MaxPlot(div, top, left, width, height, args) { this.selectClear = function() { /* clear selection */ - self.selCells.length = 0; + self.selCells.clear(); setStatus(""); if (self.onSelChange!==null) - self.onSelChange([]); + self.onSelChange(self.selCells); }; this.selectSet = function(cellIds) { /* set selection to an array of integer cellIds */ - self.selCells.length = 0; + self.selCells.clear(); //self.selCells.push(...cellIds); // "extend" = array spread syntax, https://davidwalsh.name/spread-operator let selCells = self.selCells; for (let i=0; i

  • Rename clusters...
  • '); htmls.push('
  • Remove all custom annotations
  • '); //htmls.push('
  • Run clustering...
  • '); + htmls.push('
  • Set as background cellsb s
  • '); + htmls.push('
  • Reset background cellsb r
  • '); htmls.push(''); // Tools dropdown-menu htmls.push(''); // Tools dropdown container @@ -2224,6 +2250,8 @@ var cellbrowser = function() { $('#tpRenameClusters').click( onRenameClustersClick ); $('#tpCustomAnnots').click( onCustomAnnotationsClick ); + $('#tpSetBackground').click( onBackgroudSetClick ); + $('#tpResetBackground').click( onBackgroudResetClick ); //$('#tpCluster').click( onRunClusteringClick ); // This version is more like OSX/Windows: @@ -2501,10 +2529,13 @@ var cellbrowser = function() { var labelLines = []; //labelLines.push([labelList[0], dataList[0].length+" cells"]); - labelLines.push([labelList[0], dataList[0].length]); - if (dataList.length > 1) + labelLines[0] = labelList[0].split("\n"); + labelLines[0].push(dataList[0].length); + if (dataList.length > 1) { //labelLines.push([labelList[1], dataList[1].length+" cells"]); - labelLines.push([labelList[1], dataList[1].length]); + labelLines[1] = labelList[1].split("\n"); + labelLines[1].push(dataList[1].length); + } const ctx = document.getElementById("tpViolinCanvas").getContext("2d"); @@ -2587,6 +2618,31 @@ var cellbrowser = function() { var dataList = []; var labelList = []; var selCells = renderer.getSelection(); + + // filter exprVec by background + if (background !== null) { + var ourSelCells = {}; + for (var i = 0; i < selCells.length; i++) { + ourSelCells[selCells[i]] = true; + } + var ourCells = {}; + for (i = 0; i < background.length; i++) { + ourCells[background[i]] = true; + } + + var result = []; + var renamedSelCells = []; + for (i = 0; i < exprVec.length; i++) { + if (i in ourSelCells) { + renamedSelCells.push(result.length); + result.push(exprVec[i]); + } else if (i in ourCells) { + result.push(exprVec[i]); + } + } + exprVec = result; + selCells = renamedSelCells; + } // if we have a violin meta field to split on, make two violin plots, one meta vs, the other meta // restrict the plot to the selected cells, if any if (db.conf.violinField!==undefined) { @@ -2596,12 +2652,20 @@ var cellbrowser = function() { if (selCells.length===0) { // no selection, no violinField: default to a single violin plot dataList = [Array.prototype.slice.call(exprVec)]; - labelList = ['All cells']; + if (background === null) { + labelList = ['All cells']; + } else { + labelList = ['Background\ncells']; + } buildViolinFromValues(labelList, dataList); } else { // cells are selected and no violin field: make two violin plots, selected against other cells dataList = splitExpr(exprVec, selCells); - labelList = ['Selected', 'Others']; + if (background === null) { + labelList = ['Selected', 'Others']; + } else { + labelList = ['Selected', 'Background\nOthers']; + } if (dataList[1].length===0) { dataList = [dataList[0]]; labelList = ['All Selected']; @@ -4888,6 +4952,8 @@ var cellbrowser = function() { Mousetrap.bind('s i', onSelectInvertClick); Mousetrap.bind('s s', onSelectNameClick); + Mousetrap.bind('b s', onBackgroudSetClick); + Mousetrap.bind('b r', onBackgroudResetClick); Mousetrap.bind('m', function() {$('#tpMetaCombo').trigger("chosen:open"); return false;}); Mousetrap.bind('d', function() {$('#tpDatasetCombo').trigger("chosen:open"); return false;});