cellbrowser 1.2.8__tar.gz → 1.2.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. cellbrowser-1.2.11/PKG-INFO +37 -0
  2. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/setup.cfg +3 -2
  3. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/R/cellbrowser.R +21 -19
  4. cellbrowser-1.2.11/src/cbPyLib/cellbrowser/__init__.py +4 -0
  5. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/_version.py +4 -4
  6. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/css/cellBrowser.css +20 -4
  7. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/js/cbData.js +75 -38
  8. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/js/cellBrowser.js +877 -294
  9. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/js/maxPlot.js +257 -89
  10. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cellbrowser.py +228 -98
  11. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/convert.py +5 -3
  12. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/sampleConfig/cellbrowser.conf +7 -1
  13. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/sampleConfig/desc.conf +2 -1
  14. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/sampleConfig/scanpy.conf +6 -0
  15. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/seurat.py +1 -1
  16. cellbrowser-1.2.11/src/cbPyLib/cellbrowser.egg-info/PKG-INFO +37 -0
  17. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser.egg-info/entry_points.txt +0 -1
  18. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/versioneer.py +795 -340
  19. cellbrowser-1.2.8/PKG-INFO +0 -27
  20. cellbrowser-1.2.8/src/cbPyLib/cellbrowser/__init__.py +0 -5
  21. cellbrowser-1.2.8/src/cbPyLib/cellbrowser.egg-info/PKG-INFO +0 -27
  22. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/LICENSE +0 -0
  23. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/MANIFEST.in +0 -0
  24. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/README.rst +0 -0
  25. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/setup.py +0 -0
  26. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/RangeHTTPServer/__init__.py +0 -0
  27. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/RangeHTTPServer/__main__.py +0 -0
  28. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/css/MaterialIcons-Regular.eot +0 -0
  29. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/css/MaterialIcons-Regular.ttf +0 -0
  30. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/css/MaterialIcons-Regular.woff +0 -0
  31. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/css/MaterialIcons-Regular.woff2 +0 -0
  32. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/Chart.bundle.min.js +0 -0
  33. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/FastBitSet.js +0 -0
  34. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/FileSaver.1.1.20151003.min.js +0 -0
  35. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/OverlayScrollbars.min.css +0 -0
  36. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/bootstrap-dropmenu.min.css +0 -0
  37. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/bootstrap-submenu.js +0 -0
  38. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/bootstrap-submenu.min.css +0 -0
  39. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/bootstrap.3.3.7.min.css +0 -0
  40. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/bootstrap.min.css +0 -0
  41. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/bootstrap.min.js +0 -0
  42. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/chartjs-chart-box-and-violin-plot.js +0 -0
  43. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/chosen-sprite.png +0 -0
  44. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/chosen-sprite@2x.png +0 -0
  45. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/chosen.1.8.2.min.css +0 -0
  46. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/chosen.jquery.min.js +0 -0
  47. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/drawImage-clipper.js +0 -0
  48. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/font-awesome.css +0 -0
  49. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/googleMaterialIcons.css +0 -0
  50. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/hamster.js +0 -0
  51. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  52. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/images/ui-icons_444444_256x240.png +0 -0
  53. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/images/ui-icons_555555_256x240.png +0 -0
  54. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/images/ui-icons_777620_256x240.png +0 -0
  55. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/images/ui-icons_777777_256x240.png +0 -0
  56. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/images/ui-icons_cc0000_256x240.png +0 -0
  57. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/images/ui-icons_ffffff_256x240.png +0 -0
  58. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/intro.min.js +0 -0
  59. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/introjs.2.4.0.min.css +0 -0
  60. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery-ui-1.12.1.css +0 -0
  61. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery-ui.min.js +0 -0
  62. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.3.1.1.min.js +0 -0
  63. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.contextMenu.css +0 -0
  64. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.contextMenu.js +0 -0
  65. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.event.drag-2.3.0.js +0 -0
  66. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.overlayScrollbars.min.js +0 -0
  67. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.sparkline.min.js +0 -0
  68. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.tablesorter.js +0 -0
  69. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.tablesorter.widgets.js +0 -0
  70. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.tipsy.1.0.3.min.css +0 -0
  71. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.tipsy.min.js +0 -0
  72. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jquery.ui.position.min.js +0 -0
  73. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/jsurl2.js +0 -0
  74. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/lz-string.js +0 -0
  75. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/materialIcons.woff +0 -0
  76. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/minified.js +0 -0
  77. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/mousetrap.min.js +0 -0
  78. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/normalizeWheel.js +0 -0
  79. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/pako_inflate.min.js +0 -0
  80. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/palette.js +0 -0
  81. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/papaparse.min.js +0 -0
  82. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/reorder.v1.js +0 -0
  83. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/scaleColorPerceptual.js +0 -0
  84. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/science.v1.js +0 -0
  85. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/select2.4.0.4.min.css +0 -0
  86. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/select2.min.js +0 -0
  87. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/selectize.bootstrap3.css +0 -0
  88. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/selectize.js +0 -0
  89. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.cellrangedecorator.js +0 -0
  90. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.cellrangeselector.js +0 -0
  91. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.cellselectionmodel.js +0 -0
  92. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.core.js +0 -0
  93. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.editors.js +0 -0
  94. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.examples.css +0 -0
  95. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.formatters.js +0 -0
  96. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.grid.css +0 -0
  97. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/slick.grid.js +0 -0
  98. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/spectrum-1.8.0.css +0 -0
  99. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/spectrum.min.js +0 -0
  100. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/split.js +0 -0
  101. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/tablesort.js +0 -0
  102. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/tablesort.number.min.js +0 -0
  103. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/.npmignore +0 -0
  104. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/LICENSE +0 -0
  105. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/Makefile +0 -0
  106. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/README.md +0 -0
  107. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/browser.js +0 -0
  108. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/build.js +0 -0
  109. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/example/d3-random-matrix.js +0 -0
  110. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/example/example.png +0 -0
  111. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/example/gradients.js +0 -0
  112. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/example/package.json +0 -0
  113. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/hex/inferno.json +0 -0
  114. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/hex/magma.json +0 -0
  115. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/hex/plasma.json +0 -0
  116. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/hex/viridis.json +0 -0
  117. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/inferno.js +0 -0
  118. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/magma.js +0 -0
  119. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/package.json +0 -0
  120. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/plasma.js +0 -0
  121. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/rgb/inferno.json +0 -0
  122. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/rgb/magma.json +0 -0
  123. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/rgb/plasma.json +0 -0
  124. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/rgb/viridis.json +0 -0
  125. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/utils/hex2rgb.js +0 -0
  126. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/utils/interpolate.js +0 -0
  127. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/utils/rgb2hex.js +0 -0
  128. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/temp/node_modules/scale-color-perceptual/viridis.js +0 -0
  129. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/theme.bootstrap_3.css +0 -0
  130. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/ext/tiny-queue.js +0 -0
  131. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/files.json +0 -0
  132. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/hg19.gc34.tsv +0 -0
  133. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/hg19.json.gz +0 -0
  134. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/hg38.gc34.tsv +0 -0
  135. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/hg38.json.gz +0 -0
  136. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/log.txt +0 -0
  137. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/makeGenes.py +0 -0
  138. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/mm10.json.gz +0 -0
  139. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/genes/mm10.vm25.tsv +0 -0
  140. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/README.md +0 -0
  141. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/center.png +0 -0
  142. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/README.txt +0 -0
  143. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/gtk-justify-left.png +0 -0
  144. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/gtk-save.png +0 -0
  145. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/log.txt +0 -0
  146. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-center-16.png +0 -0
  147. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-center-24.png +0 -0
  148. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-controller-16.png +0 -0
  149. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-controller-24.png +0 -0
  150. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-edit-16.png +0 -0
  151. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-gravity-west-24.png +0 -0
  152. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-info-16.png +0 -0
  153. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-info-24.png +0 -0
  154. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-merge-down-16.png +0 -0
  155. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-scale-16.png +0 -0
  156. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-free-select-16.png +0 -0
  157. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-free-select-22.png +0 -0
  158. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-move-16.png +0 -0
  159. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-move-22.png +0 -0
  160. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-rect-select-16.png +0 -0
  161. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-rect-select-22.png +0 -0
  162. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-zoom-16.png +0 -0
  163. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/gimpFlat/stock-tool-zoom-22.png +0 -0
  164. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/icons8-help-32.png +0 -0
  165. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/info.png +0 -0
  166. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/lasso.png +0 -0
  167. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/marker.png +0 -0
  168. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/move.png +0 -0
  169. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/select.png +0 -0
  170. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/img/zoom.png +0 -0
  171. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/cbWeb/js/maxHeat.js +0 -0
  172. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/download.py +0 -0
  173. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/geneinfo.py +0 -0
  174. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/genes.py +0 -0
  175. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/hubmaker.py +0 -0
  176. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/sampleConfig/hub.conf +0 -0
  177. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/sampleConfig/seurat.conf +0 -0
  178. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser/sampleConfig/summary.html +0 -0
  179. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser.egg-info/SOURCES.txt +0 -0
  180. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser.egg-info/dependency_links.txt +0 -0
  181. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser.egg-info/not-zip-safe +0 -0
  182. {cellbrowser-1.2.8 → cellbrowser-1.2.11}/src/cbPyLib/cellbrowser.egg-info/top_level.txt +0 -0
@@ -0,0 +1,37 @@
1
+ Metadata-Version: 2.2
2
+ Name: cellbrowser
3
+ Version: 1.2.11
4
+ Summary: UCSC Cellbrowser, an interactive browser for single cell data. Includes converters and basic pipelines for text files, Seurat, Scanpy and Cellranger.
5
+ Home-page: https://github.com/maximilianh/cellBrowser
6
+ Author: Maximilian Haeussler
7
+ Author-email: max@soe.ucsc.edu
8
+ License: GPL 3
9
+ Classifier: Programming Language :: Python :: 2
10
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: JavaScript
13
+ Requires-Python: >=2.5
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Dynamic: author
17
+ Dynamic: author-email
18
+ Dynamic: classifier
19
+ Dynamic: description
20
+ Dynamic: description-content-type
21
+ Dynamic: home-page
22
+ Dynamic: license
23
+ Dynamic: requires-python
24
+ Dynamic: summary
25
+
26
+ The UCSC Cell Browser is an interactive browser for
27
+ single cell data, like mRNA or ATAC-seq data. You can display
28
+ dimensionality reductions, navigate them with the mouse or the cursor keys,
29
+ select cells, color by genes or meta annotations and make many other
30
+ changes. The main site runs at https://cells.ucsc.edu, but using this
31
+ package you can also convert data yourself and build a Cell Browser HTML
32
+ directory that can be served through any University or any other webserver
33
+ for static webpages. You can try the Cell Browser at https://cells.ucsc.edu
34
+ or read about how to convert data with this package on
35
+ https://cellbrowser.rtfd.org.
36
+
37
+ We strongly recommend that to use Python3, but we make an effort to remain compatible with Python2.
@@ -1,9 +1,10 @@
1
1
  [versioneer]
2
- vcs = git
2
+ VCS = git
3
3
  style = pep440-pre
4
4
  versionfile_source = src/cbPyLib/cellbrowser/_version.py
5
5
  versionfile_build = cellbrowser/_version.py
6
- tag_prefix =
6
+ tag_prefix = v
7
+ parentdir_prefix = cellbrowser-
7
8
 
8
9
  [build_ext]
9
10
  inplace = 1
@@ -381,21 +381,20 @@ ExportToCellbrowser <- function(
381
381
  }
382
382
  if (is.null(markers.file) && !skip.markers) {
383
383
  if (length(levels(Idents(object))) > 1) {
384
- markers.helper <- function(x) {
385
- partition <- markers[x,]
384
+ #markers.helper <- function(x) {
385
+ #partition <- markers[x,]
386
386
 
387
387
  # Seurat4 changed the field name! grrrr...
388
- if ("avg_log2FC" %in% colnames(markers))
389
- avgs <- -partition$avg_log2FC
390
- else
391
- avgs <- -partition$avg_logFC
392
-
393
- ord <- order(partition$p_val_adj < 0.05, avgs)
394
- res <- x[ord]
395
- naCount <- max(0, length(x) - markers.n)
396
- res <- c(res[1:markers.n], rep(NA, naCount))
397
- return(res)
398
- }
388
+ #if ("avg_log2FC" %in% colnames(markers))
389
+ #avgs <- -partition$avg_log2FC
390
+ #else
391
+ #avgs <- -partition$avg_logFC
392
+ #ord <- order(partition$p_val_adj < 0.05, avgs)
393
+ #res <- x[ord]
394
+ #naCount <- max(0, length(x) - markers.n)
395
+ #res <- c(res[1:markers.n], rep(NA, naCount))
396
+ #return(res)
397
+ #}
399
398
  if (.hasSlot(object, "misc") && !is.null(x = object@misc["markers"][[1]])) {
400
399
  message("Found precomputed markers in obj@misc['markers']")
401
400
  markers <- object@misc["markers"]$markers
@@ -404,15 +403,18 @@ ExportToCellbrowser <- function(
404
403
  markers <- FindAllMarkers(
405
404
  object,
406
405
  do.print = TRUE,
407
- print.bar = TRUE,
408
- test.use = "wilcox",
409
- logfc.threshold = 0.25
406
+ only.pos = TRUE,
407
+ logfc.threshold = 0.25,
408
+ min.pct = 0.25
410
409
  )
411
410
  }
412
411
  message("Writing top ", markers.n, ", cluster markers to ", fname)
413
- markers.order <- ave(x = rownames(x = markers), markers$cluster, FUN = markers.helper)
414
- top.markers <- markers[markers.order[!is.na(x = markers.order)], ]
415
- write.table(x = top.markers, file = fname, quote = FALSE, sep = "\t", col.names = NA)
412
+ #markers.order <- ave(x = rownames(x = markers), markers$cluster, FUN = markers.helper)
413
+ #top.markers <- markers[markers.order[!is.na(x = markers.order)], ]
414
+ require(dplyr);
415
+ #markers %>% group_by(cluster) %>% top_n(n = markers.n, wt = avg_logFC)
416
+ markers %>% group_by(cluster) %>% dplyr::filter(avg_log2FC > 1) %>% slice_head(n = markers.n) %>% ungroup() -> topMarkers
417
+ write.table(x = topMarkers, file = fname, quote = FALSE, sep = "\t", col.names = NA)
416
418
  } else {
417
419
  message("No clusters found in Seurat object and no external marker file provided, so no marker genes can be computed")
418
420
  file <- NULL
@@ -0,0 +1,4 @@
1
+ # empty init, nothing to do here
2
+
3
+ from . import _version
4
+ __version__ = _version.get_versions()['version']
@@ -1,5 +1,5 @@
1
1
 
2
- # This file was generated by 'versioneer.py' (0.18) from
2
+ # This file was generated by 'versioneer.py' (0.29) from
3
3
  # revision-control system data, or from the parent directory name of an
4
4
  # unpacked source archive. Distribution tarballs contain a pre-generated copy
5
5
  # of this file.
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-07-09T12:41:36-0700",
11
+ "date": "2025-01-31T10:12:36-0800",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "0775adae1db21db211175fe6099fd4217f7a21ac",
15
- "version": "v1.2.8"
14
+ "full-revisionid": "bc2a38bfa21dd92e505693b264f0cef876890b17",
15
+ "version": "1.2.11"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -48,6 +48,10 @@ section { font-weight: bold; padding-top: 5px; padding-bottom: 5px }
48
48
  margin-right: 6px;
49
49
  }
50
50
 
51
+ .tpTitle {
52
+ z-index: 100;
53
+ }
54
+
51
55
  .tpGeneExprCombo {
52
56
  margin-left: 6px;
53
57
  margin-right: 6px;
@@ -92,6 +96,7 @@ section { font-weight: bold; padding-top: 5px; padding-bottom: 5px }
92
96
  position : absolute;
93
97
  display: grid;
94
98
  grid-template-columns: 45px 120px 15px;
99
+ background: rgba(255,255,255,0.5);
95
100
  }
96
101
 
97
102
  .sliderLabel {
@@ -130,8 +135,9 @@ section { font-weight: bold; padding-top: 5px; padding-bottom: 5px }
130
135
  .ui-menu-item { font-size:13px }
131
136
  .ui-menu .ui-menu-item-wrapper { padding: 1px 1em 1px .4em; }
132
137
  .ui-tooltip { font-size: 13px }
133
- #tpButtonInfo { height: 24px; top: 1px; margin-right: 8px; width: 120px; border-radius: 4px }
138
+ #tpButtonInfo { height: 24px; top: 1px; margin-right: 8px; border-radius: 4px; padding-top: 4px }
134
139
  .tpDialogInput { margin-left: 12px; margin-top: 5px; margin-bottom: 12px; }
140
+ #tpDialog { z-index: 1001; }}
135
141
 
136
142
  .tpIconButton {
137
143
  padding: 1px 2px 1px 2px;
@@ -168,6 +174,13 @@ section { font-weight: bold; padding-top: 5px; padding-bottom: 5px }
168
174
  cursor: pointer;
169
175
  }
170
176
 
177
+ .tpSameLink {
178
+ text-decoration: underline;
179
+ cursor: pointer;
180
+ color: darkgrey;
181
+ float: right
182
+ }
183
+
171
184
  .tpDatasetPane {
172
185
  padding-top: 10px !important;
173
186
  border-radius: 4px;
@@ -319,12 +332,15 @@ input[type=checkbox], input[type=radio] {
319
332
  }
320
333
 
321
334
  .tpMetaBox { font-size: 13px; cursor:default; overflow:hidden }
322
- .tpMetaHover { color: #FFF; background-color: #666}
335
+ .tpMetaHover {
336
+ color: white;
337
+ background-color: #333 !important;
338
+ }
323
339
  .tpMetaLabel { font-weight: bold; padding-left: 2px}
324
340
  .tpMetaLabelGrey { color: #666666}
325
341
  .tpMetaMultiVal { font-style: italic; color: gray }
326
342
  .tpMetaHistLabel { text-decoration: underline; color: blue }
327
- .tpMetaValue { height: 1.3em; margin-left: 8px; padding-left: 3px; background-color:#EEE; }
343
+ .tpMetaValue { height: 1.3em; padding-left: 3px; background-color:#EEE; }
328
344
  .tpMetaSelect { outline: 2px solid black; background-color: #DEDEDE }
329
345
  .tpMetaValueSelect { background-color: #CCC}
330
346
  .tpMetaPerc { color:grey; float:right }
@@ -342,7 +358,7 @@ button { line-height: 12px }
342
358
  .btn-default { background: linear-gradient(#fff 20%, #f7f7f7 60%, #f5f5f5 100%) }
343
359
 
344
360
  #tpButtonBar {display: block; }
345
- .tpButton { border-radius: 0; font-size: 15px; display: inline-block; background-color: #f6f6f6; border: 1px solid #c5c5c5; margin: 1px 3px 1px 1px; padding: 1px 3px 1px 3px; cursor:default; vertical-align: middle; user-select: none}
361
+ .tpButton { border-radius: 0; font-size: 15px; display: inline-block; background-color: #f6f6f6; border: 1px solid #c5c5c5; margin: 1px 3px 1px 1px; padding: 1px 3px 1px 3px; cursor:default; vertical-align: middle; user-select: none; }
346
362
  .tpButton:active { background-color: #888; }
347
363
  .tpButton active { background-color: #888; }
348
364
  .tpButton:hover { background-color: #eee }
@@ -480,6 +480,15 @@ function CbDbFile(url) {
480
480
  }
481
481
  }
482
482
 
483
+ this.findCoordIdx = function(name) {
484
+ /* given coord label return its index */
485
+ coords = self.conf.coords;
486
+ for (let i=0; i<coords.length; i++) {
487
+ if (coords[i].name===coordLabel)
488
+ return i;
489
+ }
490
+ }
491
+
483
492
  this.loadCoords = function(coordIdx, onDone, onSpatialDone, onProgress) {
484
493
  /* load coordinates from URL and call onDone(array of (x,y), coordInfoObj, labelMids) when done */
485
494
  var i = 0;
@@ -487,6 +496,17 @@ function CbDbFile(url) {
487
496
  var meta = null;
488
497
  var labelMids; // null means: no json file found
489
498
 
499
+ var coordInfo = self.conf.coords[coordIdx];
500
+ if (coordInfo===null) {
501
+ alert("Could not find coordinates with name "+this.coordName);
502
+ return;
503
+ }
504
+
505
+ let hasSpatial = coordInfo.images || self.conf.spatial;
506
+
507
+ //if (hasSpatial && coordInfo.aspectRatio===undefined) // patch up old datasets
508
+ //coordInfo.aspectRatio = 1.0
509
+
490
510
  function binDone(data, other) {
491
511
  binData = data;
492
512
  meta = other;
@@ -505,13 +525,7 @@ function CbDbFile(url) {
505
525
  return;
506
526
  }
507
527
 
508
- var coordInfo = self.conf.coords[coordIdx];
509
- if (coordInfo===null) {
510
- alert("Could not find coordinates with name "+this.coordName);
511
- return;
512
- }
513
-
514
- if (coordInfo.images || self.conf.spatial) {
528
+ if (hasSpatial) {
515
529
  var spatials = coordInfo.images;
516
530
  if (!spatials)// older placement of the object
517
531
  spatials = self.conf.spatial; //now spatial settings must be on the coords to support multi-coord datasets
@@ -547,7 +561,7 @@ function CbDbFile(url) {
547
561
  };
548
562
 
549
563
  this.getDefaultColorField = function() {
550
- /* return a pair: [0] is "meta" or "gene" and [1] is the field name or the gene */
564
+ /* return the meta field to colors on */
551
565
  if (self.conf.clusterField)
552
566
  return self.conf.clusterField; // just for backwards-compat. with old datasets
553
567
  else
@@ -853,15 +867,22 @@ function CbDbFile(url) {
853
867
 
854
868
  this.locusToOffset = function(name) {
855
869
  /* for both gene and ATAC mode: */
856
- /* return an array [start, end, name] given a locus description (=a string: gene symbol or chr|start|end) */
870
+ /* return an array [start, end, name] given a locus description (=a string: gene ID/symbol or chr|start|end) */
857
871
  var off = null;
872
+ var geneId = name;
858
873
  //if (name.includes("|")) { // atac mode: name is chrom|start|end
859
874
  if (self.peakOffsets !== null) { // atac mode: name is chrom|start|end
860
875
  let pos = name.split("|");
861
876
  off = self.findAtacOffsets(pos[0], parseInt(pos[1]), parseInt(pos[2]));
862
877
  }
863
878
  else {
864
- off = self.geneOffsets[name];
879
+ var geneIds = self.findGenesExact(name);
880
+ if (geneIds.length!==0) {
881
+ geneId = geneIds[0];
882
+ off = self.geneOffsets[geneIds[0]];
883
+ if (geneIds.length>1)
884
+ alert("More than one match for gene name "+name+", using only first match.");
885
+ }
865
886
  }
866
887
 
867
888
  if (off===null || off===undefined) {
@@ -872,7 +893,7 @@ function CbDbFile(url) {
872
893
  let start = off[0];
873
894
  let len = off[1];
874
895
  let end = start+len;
875
- return [start, end, name];
896
+ return [start, end, geneId];
876
897
  }
877
898
 
878
899
  this.namesToChunks = function(lociNames) {
@@ -1382,19 +1403,22 @@ function CbDbFile(url) {
1382
1403
  return lo;
1383
1404
  }
1384
1405
 
1385
- function updateGeneSyns(geneSyns, name) {
1406
+ function addToGeneSynsAndSplit(geneSyns, name) {
1386
1407
  /* given a symbol which can be geneId|sym, append to geneSyn array 1 or 2 tuples with [searchKey, geneId] */
1408
+ var geneId = name;
1409
+ var sym = name;
1387
1410
  if (name.indexOf("|")===-1) {
1388
1411
  // datasets with only one gene name: old behavior
1389
1412
  geneSyns.push( [name.toLowerCase(), name] );
1390
1413
  } else {
1391
1414
  // dataset with geneId and symbol
1392
1415
  var parts = name.split("|");
1393
- var geneId = parts[0];
1394
- var sym = parts[1];
1416
+ geneId = parts[0];
1417
+ sym = parts[1];
1395
1418
  geneSyns.push( [geneId.toLowerCase(), geneId] );
1396
1419
  geneSyns.push( [sym.toLowerCase(), geneId] );
1397
1420
  }
1421
+ return [geneId, sym];
1398
1422
  }
1399
1423
 
1400
1424
  this.indexGenes = function() {
@@ -1405,24 +1429,16 @@ function CbDbFile(url) {
1405
1429
  var newIdx = {};
1406
1430
  var geneIdx = self.geneOffsets;
1407
1431
  var geneSyns = [];
1408
- for (var key in geneIdx) { // as of 2019, faster than Object.entries()
1409
- updateGeneSyns(geneSyns, key);
1410
-
1411
- var val = geneIdx[key];
1412
- var sym = key;
1413
- var geneId = key;
1414
- if (key.indexOf("|")!==-1) {
1415
- var parts = key.split("|");
1416
- geneId = parts[0];
1417
- sym = parts[1];
1418
- }
1419
-
1420
- var newVal = [val[0], val[1], sym];
1421
- newIdx[geneId] = newVal;
1422
-
1423
- self.geneOffsets=newIdx;
1424
- self.geneSyns = geneSyns;
1425
- }
1432
+ for (var geneName in geneIdx) { // as of 2019, faster than Object.entries()
1433
+ // a geneName can be either a single symbol or a string like geneId|sym
1434
+ var offsets = geneIdx[geneName];
1435
+ var geneIdSym = addToGeneSynsAndSplit(geneSyns, geneName);
1436
+ var geneId = geneIdSym[0];
1437
+ var sym = geneIdSym[1];
1438
+ newIdx[geneId] = [offsets[0], offsets[1], sym];
1439
+ }
1440
+ self.geneOffsets=newIdx;
1441
+ self.geneSyns = geneSyns;
1426
1442
  }
1427
1443
 
1428
1444
  function searchGeneNames(geneSyns, searchStr) {
@@ -1437,7 +1453,7 @@ function CbDbFile(url) {
1437
1453
  return foundIds;
1438
1454
  }
1439
1455
 
1440
- this.findGeneIds = function(searchStr) {
1456
+ this.findGeneIdsPrefixSuffix = function(searchStr) {
1441
1457
  /* return an array of matching geneIds for searchStr, uses self.geneSyns */
1442
1458
  searchStr = searchStr.toLowerCase();
1443
1459
  var geneSyns = self.geneSyns;
@@ -1452,7 +1468,7 @@ function CbDbFile(url) {
1452
1468
  * returns an array of objects with .id and .sym.
1453
1469
  * There is a version using this for ATAC mode, see findGenesAtac()
1454
1470
  * */
1455
- var foundIds = self.findGeneIds(searchStr);
1471
+ var foundIds = self.findGeneIdsPrefixSuffix(searchStr);
1456
1472
  var geneNameObjs = [];
1457
1473
  for (var geneId of foundIds)
1458
1474
  geneNameObjs.push(self.getGeneInfo(geneId)); // for selectizeSendGenes
@@ -1460,10 +1476,10 @@ function CbDbFile(url) {
1460
1476
  return geneNameObjs;
1461
1477
  };
1462
1478
 
1463
- this.findGenesExact = function(geneSyns, geneSym) {
1479
+ this.findGenesExact = function(geneSym) {
1464
1480
  /* search the geneSyns (arr of [syn, geneId]) for matches. Return arr of geneIds
1465
1481
  * Used to resolve symbol to geneId (symToGene)*/
1466
- geneSym = geneSyns.toLowerCase();
1482
+ geneSym = geneSym.toLowerCase();
1467
1483
  var geneSyns = self.geneSyns;
1468
1484
  var foundIds = [];
1469
1485
  for (var i=0; i<geneSyns.length; i++) {
@@ -1475,6 +1491,27 @@ function CbDbFile(url) {
1475
1491
  return foundIds;
1476
1492
  }
1477
1493
 
1494
+ this.mustFindOneGeneExact= function(symOrId) {
1495
+ /* given a geneId or symbol, return the geneId. If 0 or >1 are found, abort and show error message. */
1496
+ if (symOrId.indexOf("|")!==-1)
1497
+ symOrId = symOrId.split("|")[0];
1498
+
1499
+ let geneIds = self.findGenesExact(symOrId);
1500
+ if (geneIds.length===0) {
1501
+ alert("Could not find gene symbold or ID: "+symOrId);
1502
+ return null;
1503
+ }
1504
+ if (geneIds.length>1) {
1505
+ alert("Found more than one geneId for symbol, using only the first match: "+symOrId);
1506
+ }
1507
+ return geneIds[0];
1508
+ }
1509
+
1510
+ this.isGeneId = function (geneId) {
1511
+ /* check if a given string is a geneId */
1512
+ return (geneId in self.geneOffsets);
1513
+ }
1514
+
1478
1515
  function pickTssForGene(loc) {
1479
1516
  /* given a chromLoc tuple (start, end, strand, sym), return the TSS of the gene (start or end )*/
1480
1517
  var start = loc[0];
@@ -1530,7 +1567,7 @@ function CbDbFile(url) {
1530
1567
  this.findGenesAtac = function(searchStr) {
1531
1568
  /* like findGenes(), but for ATAC mode: return an array of {.id and .sym} given a search string */
1532
1569
  //var geneInfos = cbUtil.searchKeys(self.geneToTss, searchStr);
1533
- var geneIds = self.findGeneIds(searchStr);
1570
+ var geneIds = self.findGeneIdsPrefixSuffix(searchStr);
1534
1571
 
1535
1572
  if (geneIds.length===0)
1536
1573
  return [];
@@ -1666,7 +1703,7 @@ function CbDbFile(url) {
1666
1703
  },
1667
1704
  onProgress, strategy);
1668
1705
  }
1669
- }
1706
+ }
1670
1707
  };
1671
1708
 
1672
1709
  this.loadGeneSetExpr = function(onDone) {