@sjcrh/proteinpaint-client 2.74.2 → 2.76.0

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 (307) hide show
  1. package/dist/{2dmaf-b2d78c57.js → 2dmaf-74b99126.js} +1 -1
  2. package/dist/AppHeader-cecb39c2.js +1 -0
  3. package/dist/{ColorScale-9c76aef3.js → ColorScale-21cab8d2.js} +1 -1
  4. package/dist/DEanalysis-95bad59a.js +1 -0
  5. package/dist/Disco-a6e921a0.js +1 -0
  6. package/dist/Disco.UI-9ad999ed.js +1 -0
  7. package/dist/{DragControls-586f72db.js → DragControls-e3b6a937.js} +1 -1
  8. package/dist/{DziViewer-6311327c.js → DziViewer-354a790d.js} +1 -1
  9. package/dist/FilterRxComp-701a1480.js +1 -0
  10. package/dist/{FilterStateless-046081c2.js → FilterStateless-54c0b763.js} +1 -1
  11. package/dist/{HicApp-40e44cba.js → HicApp-d5a946bf.js} +1 -1
  12. package/dist/{OrbitControls-0cda1772.js → OrbitControls-694652cd.js} +1 -1
  13. package/dist/WSIViewer-dc7f8eb0.js +1 -0
  14. package/dist/adSandbox-f438e388.js +1 -0
  15. package/dist/app-3320ab6f.js +1 -0
  16. package/dist/app-649f8357.js +1 -0
  17. package/dist/app-b369b169.js +1 -0
  18. package/dist/app.js +1 -1
  19. package/dist/bam-431875ef.js +1 -0
  20. package/dist/barchart-8277ed43.js +1 -0
  21. package/dist/barchart.events-da29c90d.js +1 -0
  22. package/dist/{bars.renderer-5f7a4174.js → bars.renderer-dcfdd59b.js} +1 -1
  23. package/dist/block-6aedd569.js +1 -0
  24. package/dist/block.lazyload-87b12654.js +1 -0
  25. package/dist/block.legend-d3f61ef7.js +1 -0
  26. package/dist/{block.mds-effc078d.js → block.mds-3ad17dfa.js} +1 -1
  27. package/dist/{block.mds.cnv-ec861a26.js → block.mds.cnv-857ba868.js} +1 -1
  28. package/dist/{block.mds.expressionrank-a2ad7c80.js → block.mds.expressionrank-7e3b208c.js} +1 -1
  29. package/dist/{block.mds.expressionstat-31dc5595.js → block.mds.expressionstat-f2d31c86.js} +1 -1
  30. package/dist/{block.mds.geneboxplot-3ca857ce.js → block.mds.geneboxplot-f0fbaf12.js} +1 -1
  31. package/dist/{block.mds.junction-debba938.js → block.mds.junction-7f87f48f.js} +1 -1
  32. package/dist/{block.mds.svcnv-8dc5abdf.js → block.mds.svcnv-ac035c12.js} +1 -1
  33. package/dist/{block.mds.svcnv.share-81e62600.js → block.mds.svcnv.share-886d9479.js} +1 -1
  34. package/dist/block.mds2-7852c1ee.js +1 -0
  35. package/dist/{block.svg-9121e8e7.js → block.svg-9b916fa6.js} +1 -1
  36. package/dist/{block.tk.aicheck-c1b478e9.js → block.tk.aicheck-6770e333.js} +1 -1
  37. package/dist/{block.tk.ase-0f6ded48.js → block.tk.ase-ee807e59.js} +1 -1
  38. package/dist/{block.tk.bam-7cd06aee.js → block.tk.bam-00fba6e8.js} +1 -1
  39. package/dist/{block.tk.bedgraphdot-3ef8b94e.js → block.tk.bedgraphdot-7fda78e9.js} +1 -1
  40. package/dist/{block.tk.bigwig.ui-d1248810.js → block.tk.bigwig.ui-cc1a42f3.js} +1 -1
  41. package/dist/{block.tk.hicstraw-ee731e55.js → block.tk.hicstraw-526470e3.js} +1 -1
  42. package/dist/{block.tk.junction-4d8cab4d.js → block.tk.junction-b43a4cda.js} +1 -1
  43. package/dist/{block.tk.junction.textmatrixui-a6430b27.js → block.tk.junction.textmatrixui-a60ed78a.js} +1 -1
  44. package/dist/{block.tk.ld-8429a18b.js → block.tk.ld-d15bde41.js} +1 -1
  45. package/dist/{block.tk.menu-3f31f958.js → block.tk.menu-3aeb93c6.js} +1 -1
  46. package/dist/{block.tk.pgv-07e46705.js → block.tk.pgv-9af2bd64.js} +1 -1
  47. package/dist/boxplot-e17a17b7.js +1 -0
  48. package/dist/brainImaging-bf2ceee9.js +1 -0
  49. package/dist/{brush-c386fe3d.js → brush-aa175142.js} +1 -1
  50. package/dist/categorical-a52014a1.js +1 -0
  51. package/dist/condition-c646e357.js +1 -0
  52. package/dist/controls-287e6efa.js +1 -0
  53. package/dist/{controls.btns-1cb2bfab.js → controls.btns-79b805dd.js} +1 -1
  54. package/dist/controls.config-28d6d6a8.js +1 -0
  55. package/dist/cuminc-9e275854.js +1 -0
  56. package/dist/{customdata.inputui-cbd712ea.js → customdata.inputui-dc49d94b.js} +1 -1
  57. package/dist/dataDownload-3a3d4f33.js +1 -0
  58. package/dist/databrowser.ui-d8d3f8fd.js +1 -0
  59. package/dist/{density-19266ebf.js → density-a82a8b1c.js} +1 -1
  60. package/dist/dictionary-c5a19d90.js +1 -0
  61. package/dist/{drag-0b968811.js → drag-7b30ba17.js} +1 -1
  62. package/dist/{e2pca-b8752945.js → e2pca-82765817.js} +1 -1
  63. package/dist/{ep-a86b185a.js → ep-d017ec2f.js} +1 -1
  64. package/dist/facet-a9b44ef3.js +1 -0
  65. package/dist/{fusion.parse-244b2b97.js → fusion.parse-d40d0b9d.js} +1 -1
  66. package/dist/geneExpClustering-34c3f518.js +1 -0
  67. package/dist/geneExpression-0d1b7244.js +1 -0
  68. package/dist/{geneExpression-e0430f2e.js → geneExpression-589f485b.js} +1 -1
  69. package/dist/{geneExpression-387205bf.js → geneExpression-7d14983f.js} +1 -1
  70. package/dist/geneORA-903a780f.js +1 -0
  71. package/dist/{geneVariant-7de021b6.js → geneVariant-89601b34.js} +1 -1
  72. package/dist/geneVariant-92c4e870.js +1 -0
  73. package/dist/{genefusion.ui-a331de19.js → genefusion.ui-7e22e811.js} +1 -1
  74. package/dist/{genesearch-ea59f5d4.js → genesearch-a4e19f0d.js} +1 -1
  75. package/dist/geneset-108a39d2.js +1 -0
  76. package/dist/genomeBrowser-12f86a36.js +1 -0
  77. package/dist/genomeBrowser.controls-d5067811.js +1 -0
  78. package/dist/{groupsetting-20ffef77.js → groupsetting-b4416a96.js} +1 -1
  79. package/dist/gsea-543dab25.js +1 -0
  80. package/dist/hierCluster-26e14090.js +1 -0
  81. package/dist/hierCluster.config-98e82dff.js +1 -0
  82. package/dist/{hierCluster.interactivity-9b433033.js → hierCluster.interactivity-e56f6542.js} +1 -1
  83. package/dist/hierCluster.renderers-74a64cf5.js +1 -0
  84. package/dist/{html.legend-abb5452e.js → html.legend-a3f4ebfe.js} +1 -1
  85. package/dist/imagePlot-b9eae4ae.js +1 -0
  86. package/dist/{lasso-55cf4057.js → lasso-f767f634.js} +1 -1
  87. package/dist/launch.adhoc-abca6af3.js +1 -0
  88. package/dist/leftlabel.sample-24c2388d.js +1 -0
  89. package/dist/legacyDataset-e0e201ab.js +1 -0
  90. package/dist/{log-cf45fcf2.js → log-99af3443.js} +1 -1
  91. package/dist/{lollipop-c5b6e615.js → lollipop-806f8fa4.js} +1 -1
  92. package/dist/{maf-7535f1f9.js → maf-b06579e4.js} +1 -1
  93. package/dist/{maftimeline-1292ab62.js → maftimeline-4840a380.js} +1 -1
  94. package/dist/matrix-00bb50ff.js +1 -0
  95. package/dist/matrix.cells-914dd0c6.js +1 -0
  96. package/dist/{matrix.cluster-168bc96b.js → matrix.cluster-783ceab0.js} +1 -1
  97. package/dist/matrix.config-6ce74dfe.js +1 -0
  98. package/dist/matrix.controls-7b2a6f95.js +1 -0
  99. package/dist/{matrix.data-b1d0febe.js → matrix.data-dac4f1b7.js} +1 -1
  100. package/dist/{matrix.dom-00defa30.js → matrix.dom-4e10bbe9.js} +1 -1
  101. package/dist/matrix.groups-b9fca14a.js +1 -0
  102. package/dist/matrix.interactivity-84169b43.js +1 -0
  103. package/dist/{matrix.layout-c2345231.js → matrix.layout-dd5a44fd.js} +1 -1
  104. package/dist/matrix.legend-ac6d45e6.js +1 -0
  105. package/dist/matrix.renderers-78010275.js +1 -0
  106. package/dist/matrix.serieses-9b4fd744.js +1 -0
  107. package/dist/matrix.sort-014d798d.js +1 -0
  108. package/dist/{matrix.sorterUi-a741ba2e.js → matrix.sorterUi-9bf7e6f9.js} +1 -1
  109. package/dist/{mavb-92136d17.js → mavb-c6be46fc.js} +1 -1
  110. package/dist/{mds.fimo-c03115b4.js → mds.fimo-bff6a1ed.js} +1 -1
  111. package/dist/mds.samplescatterplot-9a02b9fb.js +1 -0
  112. package/dist/{mds.survivalplot-366db380.js → mds.survivalplot-055549f4.js} +1 -1
  113. package/dist/{metaboliteIntensity-ddb6e480.js → metaboliteIntensity-fac92f8b.js} +1 -1
  114. package/dist/niceNumLabels-238aabce.js +1 -0
  115. package/dist/{nodrag-2c046d31.js → nodrag-16ad4b03.js} +1 -1
  116. package/dist/{notify-44ebc0df.js → notify-224cccbd.js} +1 -1
  117. package/dist/{numeric-918d4686.js → numeric-b0b17185.js} +1 -1
  118. package/dist/numeric.binary-1f9e93f2.js +1 -0
  119. package/dist/numeric.continuous-ebcd0567.js +1 -0
  120. package/dist/numeric.discrete-7b97044a.js +1 -0
  121. package/dist/numeric.spline-1be88f3d.js +1 -0
  122. package/dist/numeric.toggle-7fa2a770.js +1 -0
  123. package/dist/oncomatrix-351af2a0.js +1 -0
  124. package/dist/{parseData-e66308cd.js → parseData-21fe9822.js} +1 -1
  125. package/dist/partjson.esm-b3f1fc21.js +1 -0
  126. package/dist/{plot.2dvaf-73dbfbd1.js → plot.2dvaf-18a35e4b.js} +1 -1
  127. package/dist/plot.app-30c4b8e5.js +1 -0
  128. package/dist/plot.barplot-7c4865a2.js +1 -0
  129. package/dist/{plot.boxplot-641da058.js → plot.boxplot-fe3046c6.js} +1 -1
  130. package/dist/plot.brainImaging-2ceb6023.js +1 -0
  131. package/dist/plot.disco-6011f87f.js +1 -0
  132. package/dist/{plot.dzi-41ea26e5.js → plot.dzi-6728a7c8.js} +1 -1
  133. package/dist/plot.ssgq-5581dc56.js +1 -0
  134. package/dist/{plot.vaf2cov-80e58833.js → plot.vaf2cov-b2284c64.js} +1 -1
  135. package/dist/{plot.wsi-51cc48ef.js → plot.wsi-9a9d4034.js} +1 -1
  136. package/dist/profileBarchart-0476f1f8.js +1 -0
  137. package/dist/profileHome-32eb9b50.js +1 -0
  138. package/dist/profilePlot-c7e099e8.js +1 -0
  139. package/dist/profilePolar-6b981e63.js +1 -0
  140. package/dist/profileRadar-bca1cc03.js +1 -0
  141. package/dist/profileRadarFacility-bbb1ecd8.js +1 -0
  142. package/dist/profileSummary-b114204f.js +1 -0
  143. package/dist/recover-49e09de0.js +1 -0
  144. package/dist/regression.inputs-a761f40d.js +1 -0
  145. package/dist/regression.inputs.values.table-5929d25a.js +1 -0
  146. package/dist/regression.results-69bc42d0.js +1 -0
  147. package/dist/{renderPvalueTable-895a72c2.js → renderPvalueTable-dc5d15f2.js} +1 -1
  148. package/dist/sampleScatter-2d0ed680.js +1 -0
  149. package/dist/{sampleScatter.rendererThree-5e686004.js → sampleScatter.rendererThree-0b12ac61.js} +2 -2
  150. package/dist/sampleView-484ab133.js +1 -0
  151. package/dist/samplelst-689796e6.js +1 -0
  152. package/dist/{samplematrix-2a1d7d82.js → samplematrix-2b137a05.js} +1 -1
  153. package/dist/scatter-205e013f.js +1 -0
  154. package/dist/{select2Terms-b4fffc50.js → select2Terms-b21e184a.js} +1 -1
  155. package/dist/{selectGenomeWithTklst-acf7e568.js → selectGenomeWithTklst-466995b4.js} +1 -1
  156. package/dist/singleCellCellType-5db730bb.js +1 -0
  157. package/dist/{singleCellGeneExpression-6de17162.js → singleCellGeneExpression-7147a2d0.js} +1 -1
  158. package/dist/singleCellPlot-73b2738f.js +1 -0
  159. package/dist/{singlecell-f76c856a.js → singlecell-24409b72.js} +1 -1
  160. package/dist/singlecell-bca774ed.js +1 -0
  161. package/dist/{snp-9590a1b4.js → snp-37d06246.js} +1 -1
  162. package/dist/snp-a8388ce4.js +1 -0
  163. package/dist/snplocus-7a1ea8c9.js +1 -0
  164. package/dist/{snplst-007a1926.js → snplst-6865d7c7.js} +1 -1
  165. package/dist/{spliceevent.a53ss.diagram-63dfef69.js → spliceevent.a53ss.diagram-e2eab72b.js} +1 -1
  166. package/dist/{spliceevent.exonskip.diagram-76fa9af8.js → spliceevent.exonskip.diagram-4d5df3a1.js} +1 -1
  167. package/dist/spliceevent.exonskip.getdefault-a94aad6e.js +1 -0
  168. package/dist/{spliceevent.noeventdiagram-64a099e0.js → spliceevent.noeventdiagram-ea97b0fb.js} +1 -1
  169. package/dist/{spliceevent.phrase-770c8cac.js → spliceevent.phrase-c5832470.js} +1 -1
  170. package/dist/{stattable-f1189f0f.js → stattable-7c5ecc2f.js} +1 -1
  171. package/dist/{style.gdc-89cfdb0f.js → style.gdc-131f3c77.js} +1 -1
  172. package/dist/summary-5ec455d3.js +1 -0
  173. package/dist/{sunburst-d5379952.js → sunburst-533902a7.js} +1 -1
  174. package/dist/survival-92250664.js +1 -0
  175. package/dist/survival-e16e068f.js +1 -0
  176. package/dist/{svg.download-86850940.js → svg.download-35926549.js} +1 -1
  177. package/dist/{svg.legend-a94b0697.js → svg.legend-8d490df2.js} +1 -1
  178. package/dist/{svgraph-c57b9ae3.js → svgraph-6fac8cbc.js} +1 -1
  179. package/dist/{svmr-cf6f1b27.js → svmr-d07ff695.js} +1 -1
  180. package/dist/table-29d5a973.js +1 -0
  181. package/dist/table-ad744310.js +1 -0
  182. package/dist/termInfo-bf99a37e.js +1 -0
  183. package/dist/{termdb.bins-9faa5170.js → termdb.bins-8b656cc3.js} +1 -1
  184. package/dist/termsetting-33ea66f1.js +1 -0
  185. package/dist/tk-071a7550.js +1 -0
  186. package/dist/{toggleButtons-002aeda1.js → toggleButtons-dbdbad01.js} +1 -1
  187. package/dist/tp.ui-9c2e9fc5.js +1 -0
  188. package/dist/tslib.es6-c3c2d88f.js +1 -0
  189. package/dist/tvs.density-f6128793.js +1 -0
  190. package/dist/{tvs.geneVariant-3a65ad94.js → tvs.geneVariant-ca4bdbb1.js} +1 -1
  191. package/dist/tvs.numeric-0260a825.js +1 -0
  192. package/dist/{tvs.samplelst-1eeb586b.js → tvs.samplelst-cb71b3bf.js} +1 -1
  193. package/dist/{uiUtils-1336bad7.js → uiUtils-f1bd2bcc.js} +1 -1
  194. package/dist/{variantBrowser-f0c812c1.js → variantBrowser-7c540224.js} +1 -1
  195. package/dist/{vcf-c4a23924.js → vcf-5cc55588.js} +1 -1
  196. package/dist/violin-2ba509eb.js +1 -0
  197. package/dist/violin.interactivity-4da6d7a9.js +1 -0
  198. package/dist/{violin.renderer-dafd89fa.js → violin.renderer-ce024265.js} +1 -1
  199. package/dist/{violinRenderer-8215f40d.js → violinRenderer-f7c96a60.js} +1 -1
  200. package/dist/{viridis-ffd14c4d.js → viridis-01ab20c5.js} +1 -1
  201. package/dist/{y-dd197cc9.js → y-67939f83.js} +1 -1
  202. package/dist/{zoom-9c63e74c.js → zoom-25dce8b9.js} +1 -1
  203. package/package.json +6 -4
  204. package/dist/AppHeader-a2a7e518.js +0 -1
  205. package/dist/DEanalysis-a6b50e49.js +0 -1
  206. package/dist/Disco-1c71b7dd.js +0 -1
  207. package/dist/Disco.UI-4c16ee50.js +0 -1
  208. package/dist/FilterRxComp-242f4615.js +0 -1
  209. package/dist/WSIViewer-d90032d7.js +0 -1
  210. package/dist/adSandbox-3528c372.js +0 -1
  211. package/dist/app-07dee349.js +0 -1
  212. package/dist/app-a8c4854a.js +0 -1
  213. package/dist/app-ade9c62a.js +0 -1
  214. package/dist/bam-92483a98.js +0 -1
  215. package/dist/barchart-3e69d094.js +0 -1
  216. package/dist/barchart.events-9b11d97e.js +0 -1
  217. package/dist/block-dcb130fb.js +0 -1
  218. package/dist/block.lazyload-9f031cac.js +0 -1
  219. package/dist/block.legend-b2987cd9.js +0 -1
  220. package/dist/block.mds2-de6e0986.js +0 -1
  221. package/dist/boxplot-1178fffc.js +0 -1
  222. package/dist/brainImaging-98ed7aa2.js +0 -1
  223. package/dist/categorical-26528ce8.js +0 -1
  224. package/dist/condition-b0d74550.js +0 -1
  225. package/dist/controls-0bacec22.js +0 -1
  226. package/dist/controls.config-0ccc9d79.js +0 -1
  227. package/dist/controls.divide-a9fe9466.js +0 -1
  228. package/dist/controls.overlay-fe20d41d.js +0 -1
  229. package/dist/controls.term1-faa2efcf.js +0 -1
  230. package/dist/cuminc-7e2cac2d.js +0 -1
  231. package/dist/dataDownload-ade8d840.js +0 -1
  232. package/dist/databrowser.ui-716f0519.js +0 -1
  233. package/dist/dictionary-3f83ce63.js +0 -1
  234. package/dist/facet-6850cfed.js +0 -1
  235. package/dist/geneExpClustering-7fd3c87e.js +0 -1
  236. package/dist/geneExpression-6462537d.js +0 -1
  237. package/dist/geneORA-7eb818c4.js +0 -1
  238. package/dist/geneVariant-b58e924a.js +0 -1
  239. package/dist/geneset-9f69ad3f.js +0 -1
  240. package/dist/genomeBrowser-1b2b83f7.js +0 -1
  241. package/dist/genomeBrowser.controls-cd8ddeb1.js +0 -1
  242. package/dist/gsea-36376589.js +0 -1
  243. package/dist/hierCluster-f1e30c19.js +0 -1
  244. package/dist/hierCluster.config-da3510b1.js +0 -1
  245. package/dist/hierCluster.renderers-610d8860.js +0 -1
  246. package/dist/imagePlot-7089bdff.js +0 -1
  247. package/dist/launch.adhoc-d229fd55.js +0 -1
  248. package/dist/leftlabel.sample-a919168c.js +0 -1
  249. package/dist/legacyDataset-1cbcb67d.js +0 -1
  250. package/dist/matrix-0614794d.js +0 -1
  251. package/dist/matrix.cells-819d4991.js +0 -1
  252. package/dist/matrix.config-c54ca273.js +0 -1
  253. package/dist/matrix.controls-5eca7822.js +0 -1
  254. package/dist/matrix.groups-4660dd70.js +0 -1
  255. package/dist/matrix.interactivity-23d83183.js +0 -1
  256. package/dist/matrix.legend-2e647224.js +0 -1
  257. package/dist/matrix.renderers-43445f4f.js +0 -1
  258. package/dist/matrix.serieses-972fbe5d.js +0 -1
  259. package/dist/matrix.sort-80d9b788.js +0 -1
  260. package/dist/mds.samplescatterplot-1623e6d0.js +0 -1
  261. package/dist/niceNumLabels-6cfc1508.js +0 -1
  262. package/dist/numeric.binary-80467e8b.js +0 -1
  263. package/dist/numeric.continuous-69a62a15.js +0 -1
  264. package/dist/numeric.discrete-86181905.js +0 -1
  265. package/dist/numeric.spline-1b07fd13.js +0 -1
  266. package/dist/numeric.toggle-37c4bee8.js +0 -1
  267. package/dist/oncomatrix-475271da.js +0 -1
  268. package/dist/plot.app-aa916e0e.js +0 -1
  269. package/dist/plot.barplot-8b440a2b.js +0 -1
  270. package/dist/plot.brainImaging-2f796b0c.js +0 -1
  271. package/dist/plot.disco-43e18d2f.js +0 -1
  272. package/dist/plot.ssgq-e49cb70b.js +0 -1
  273. package/dist/profileBarchart-91463ab6.js +0 -1
  274. package/dist/profileHome-d37a6821.js +0 -1
  275. package/dist/profilePlot-9ca577cb.js +0 -1
  276. package/dist/profilePolar-19c7da5b.js +0 -1
  277. package/dist/profileRadar-8bf094e3.js +0 -1
  278. package/dist/profileRadarFacility-f9fd8971.js +0 -1
  279. package/dist/profileSummary-93999c14.js +0 -1
  280. package/dist/recover-36ada47f.js +0 -1
  281. package/dist/regression.inputs-cb57ece6.js +0 -1
  282. package/dist/regression.inputs.values.table-908bb37a.js +0 -1
  283. package/dist/regression.results-c186a8dc.js +0 -1
  284. package/dist/roundValue-b0d0517c.js +0 -1
  285. package/dist/sampleScatter-9d5b3630.js +0 -1
  286. package/dist/sampleView-2d895023.js +0 -1
  287. package/dist/samplelst-9f8343ff.js +0 -1
  288. package/dist/scatter-b4992f64.js +0 -1
  289. package/dist/singleCellCellType-84a0c2cf.js +0 -1
  290. package/dist/singleCellPlot-2f2b8619.js +0 -1
  291. package/dist/singlecell-90567dde.js +0 -1
  292. package/dist/snp-79ec95ba.js +0 -1
  293. package/dist/snplocus-cb629be1.js +0 -1
  294. package/dist/spliceevent.exonskip.getdefault-31d2950c.js +0 -1
  295. package/dist/summary-b77bef3c.js +0 -1
  296. package/dist/survival-61ab375a.js +0 -1
  297. package/dist/survival-80a0ade9.js +0 -1
  298. package/dist/table-79e3e776.js +0 -1
  299. package/dist/table-eee91e14.js +0 -1
  300. package/dist/termInfo-f851b415.js +0 -1
  301. package/dist/tk-75566002.js +0 -1
  302. package/dist/tp.ui-02911b56.js +0 -1
  303. package/dist/tslib.es6-1f85f553.js +0 -1
  304. package/dist/tvs.density-026fca97.js +0 -1
  305. package/dist/tvs.numeric-3f3d9919.js +0 -1
  306. package/dist/violin-1515c3e6.js +0 -1
  307. package/dist/violin.interactivity-8e2f480d.js +0 -1
@@ -0,0 +1 @@
1
+ import{h as t,P as e,b as s,d as i,y as o}from"./app-b369b169.js";import"./controls-287e6efa.js";import{i as a,R as l}from"./termsetting-33ea66f1.js";import{g as n}from"./FilterRxComp-701a1480.js";import"./controls.btns-79b805dd.js";import"./controls.config-28d6d6a8.js";import"./tslib.es6-c3c2d88f.js";import"path";import"./table-29d5a973.js";import"./partjson.esm-b3f1fc21.js";import"./termdb.bins-8b656cc3.js";const r="root";const p=15;class d{constructor(t){this.opts=t;this.type="sampleView";this.setDom(t);g(this);f(this)}setDom(t){const e=t.holder.append("div");const s=e.append("div").style("display","inline-block");const i=e.append("div").style("display","inline-block").style("padding","20px");const o=e.append("div").style("display","flex").style("flex-direction","row").style("flex-wrap","wrap").style("justify-content","flex-start").style("width","100vw");const a=o;const l=i.insert("div").style("display","inline-block");const n=i.append("div").style("display","inline-block").style("vertical-align","top");this.dom={header:t.header,holder:t.holder,controlsDiv:s,sampleDiv:l,showPlotsDiv:n,plotsDiv:a}}async init(t){this.termsByCohort={};await this.setSampleSelect(t);const e=this.getState(t);await this.setControls(e)}async setSampleSelect(t){const e=t.plots.find((t=>t.id===this.id));const s=this.dom.sampleDiv;if(this.dom.header)this.dom.header.html(`Sample View`);if(e.samples&&e.samples.length>1){s.insert("label").style("vertical-align","top").html("Samples:");const t=s.insert("select").style("margin","0px 5px").property("multiple",true).attr("id","select");t.selectAll("option").data(e.samples).enter().append("option").attr("value",(t=>t.sampleId)).property("selected",((t,e)=>e<p)).html(((t,e)=>t.sampleName));this.dom.noteDiv=s.insert("div").style("display","none").style("vertical-align","top").style("font-size","0.8em").style("color","#aaa").html(`*Note that only ${p} samples can be selected.<br/>&nbsp;Navigate through the list to view all the samples.`);if(e.samples.length>p)this.dom.noteDiv.style("display","inline-block");t.on("change",(s=>{const i=t.node().options;const o=[];let a=0;for(const t of i){if(t.selected){if(a<p){const s=Number(t.value);const i=e.samples.find((t=>t.sampleId==s)).sampleName;const l={sampleId:s,sampleName:i};o.push(l);a++}else t.selected=false}}this.app.dispatch({type:"plot_edit",id:this.id,config:{samples:o}})}))}else{this.samplesData=await this.app.vocabApi.getSamplesByName({filter:n(t.termfilter?.filter)});const i=t=>{if(this.samplesData[t]){const e=b(this.samplesData,t);this.app.dispatch({type:"plot_edit",id:this.id,config:{samples:e}});this.dom.downloadbt.property("disabled",false)}else{this.dom.tableDiv.style("display","none");for(const t of this.discoPlots)t.cellDiv.style("display","none");for(const t of Object.values(this.singleSamplePlots)){t.forEach((t=>t.cellDiv.style("display","none")))}for(const t of this.brainPlots)t.cellDiv.style("display","none");if(t!=""){this.dom.downloadbt.property("disabled",true);const e=s.append("div");o(e,`Invalid sample ID: ${t}. Please check the sample ID.`);setTimeout((()=>{e.remove()}),6e3)}}};const a=u(this.dom.sampleDiv,this.samplesData,i);this.sample=e.sample||{sampleId:this.samplesData[a].id,sampleName:a};this.dom.downloadbt=s.insert("button").style("margin-left","10px").style("vertical-align","top").text("Download").on("click",(t=>{this.downloadData()}));this.dom.messageDiv=s.insert("div").style("display","inline-block").style("display","none").style("vertical-align","top").html("&nbsp;&nbsp;Downloading data ...")}}getState(t){const e=t.plots?.find((t=>t.id===this.id));let s=e.samples||b(this.samplesData,this.sample.sampleName);if(e.samples?.length>15)s=e.samples.filter(((t,e)=>e<15));const i=t.termdbConfig.queries;const o={config:e,termfilter:t.termfilter,activeCohort:e.activeCohort,terms:e.terms,expandedTermIds:e.expandedTermIds,samples:s,singleSampleGenomeQuantification:i?.singleSampleGenomeQuantification,singleSampleMutation:i?.singleSampleMutation,NIdata:i?.NIdata,hasVerifiedToken:this.app.vocabApi.hasVerifiedToken(),tokenVerificationPayload:this.app.vocabApi.tokenVerificationPayload,termdbConfig:t.termdbConfig,vocab:t.vocab};if(t.termdbConfig.selectCohort){o.toSelectCohort=true;const e=t.termdbConfig.selectCohort.values[o.activeCohort];if(e){o.cohortValuelst=e.keys}}return o}async main(){if(this.mayRequireToken())return;this.config=structuredClone(this.state.config);this.settings=this.state.config.settings.sampleView;this.dom.plotsDiv.selectAll("*").remove();this.termsById=this.getTermsById(this.state);this.sampleDataByTermId={};const t=this.termsById[r];t.terms=await this.requestTermRecursive(t);this.orderedVisibleTerms=this.getOrderedVisibleTerms(t);if(this.dom.downloadbt)this.dom.downloadbt.style("display",this.settings.showDictionary?"inline-block":"none");if(this.settings.showDictionary)this.renderSampleDictionary();this.dom.tableDiv.style("display",this.settings.showDictionary?"block":"none");await this.renderPlots(this.state,this.state.samples);this.showVisiblePlots()}async setControls(t){const e=t.termdbConfig.queries;const s=e?.singleSampleMutation||e?.singleSampleGenomeQuantification||e?.NIdata||e?.images||e?.DZImages||e?.WSImages;if(s){this.dom.showPlotsDiv.append("input").attr("id","showDictionary").attr("type","checkbox").property("checked",true).on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{sampleView:{showDictionary:t.target.checked}}}})}));this.dom.showPlotsDiv.append("label").text("Show Dictionary").attr("for","showDictionary")}if(e?.DZImages){this.dom.showPlotsDiv.append("input").attr("id","showDzi").attr("type","checkbox").property("checked",true).on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{sampleView:{showDzi:t.target.checked}}}})}));this.dom.showPlotsDiv.append("label").attr("for","showDzi").text("Show DZI images")}if(e?.WSImages){this.dom.showPlotsDiv.append("input").attr("id","showWsi").attr("type","checkbox").property("checked",true).on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{sampleView:{showWsi:t.target.checked}}}})}));this.dom.showPlotsDiv.append("label").attr("for","showWsi").text("Show WSI images")}if(e?.singleSampleMutation){this.dom.showPlotsDiv.append("input").attr("type","checkbox").property("checked",true).attr("id","showDisco").on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{sampleView:{showDisco:t.target.checked}}}})}));this.dom.showPlotsDiv.append("label").text("Show Disco").attr("for","showDisco")}if(e?.singleSampleGenomeQuantification){for(const t in e.singleSampleGenomeQuantification){const e=t.replace(/([a-z](?=[A-Z]))/g,"$1 ");this.dom.showPlotsDiv.append("input").attr("type","checkbox").property("checked",true).attr("id",t).on("change",(e=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{sampleView:{[t]:e.target.checked}}}})}));this.dom.showPlotsDiv.append("label").text("Show "+e).attr("for",t)}}if(e?.images){this.dom.showPlotsDiv.append("input").attr("type","checkbox").property("checked",true).attr("id","showImages").on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{sampleView:{showImages:t.target.checked}}}})}));this.dom.showPlotsDiv.append("label").text("Show Images").attr("for","showImages")}if(e?.NIdata){this.dom.showPlotsDiv.append("input").attr("type","checkbox").property("checked",true).attr("id","showBrainImaging").on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{sampleView:{showBrainImaging:t.target.checked}}}})}));this.dom.showPlotsDiv.append("label").text("Show brain imaging").attr("for","showBrainImaging")}}getTermsById(t){if(!(t.activeCohort in this.termsByCohort)){this.termsByCohort[t.activeCohort]={[r]:{id:r,__tree_isroot:true}}}return this.termsByCohort[t.activeCohort]}async requestTermRecursive(t,e=[r]){const s=await this.app.vocabApi.getTermChildren(t,this.state.toSelectCohort?this.state.cohortValuelst:null);if(s.error)throw s.error;if(!s.lst||s.lst.length==0){return[]}const i=[];const o=e.slice(-1)[0];for(const t of s.lst){t.parent_id=o;const s=[...e];const a=structuredClone(t);a.ancestry=s;i.push(a);if(!a.isleaf&&this.config.expandedTermIds.includes(a.id)){a.terms=await this.requestTermRecursive(a,[...s,t.id]);if(this.state.samples)await this.fillSampleData(a.terms)}else{const t=this.termsById[a.id];if(this.state.samples)await this.fillSampleData([a]);if(t&&t.terms){a.terms=t.terms}}this.termsById[a.id]=a}return i}getOrderedVisibleTerms(t){const e=Object.values(this.termsById).filter(this.isVisibleTermId.bind(this));const s=[];this.sortVisibleTerms(this.termsById[r],e,s);return s}isVisibleTermId(t){if(t.parent_id==r)return true;if(!t.ancestry)return false;for(const e of t.ancestry){if(e===r)continue;if(!this.config.expandedTermIds.includes(e))return false}return true}sortVisibleTerms(t,e,s=[]){const i=[];const o=[];for(const s of e){if(s.parent_id==t.id){o.push(s)}else i.push(s)}e.splice(0,e.length,...i);if(e.length){for(const t of o){s.push(t);if(!t.isleaf&&e.length){this.sortVisibleTerms(t,e,s)}}}else{s.push(...o)}}async fillSampleData(t){const e=[];for(const s of t)e.push(s.id);for(const t of this.state.samples){const s=await this.app.vocabApi.getSingleSampleData({sampleId:t.sampleId,term_ids:e});if("error"in s)throw s.error;if(!this.sampleDataByTermId[t.sampleId])this.sampleDataByTermId[t.sampleId]={};for(const e in s)this.sampleDataByTermId[t.sampleId][e]=s[e]}}async downloadData(){this.dom.messageDiv.style("display","block");this.dom.downloadbt.style("display","none");const t=`samples.tsv`;const e={};let s="Sample";for(const t of this.state.samples){e[t.sampleId]=await this.app.vocabApi.getSingleSampleData({sampleId:t.sampleId});s+=`\t${t.sampleName}`}s+="\n";const i=this.state.samples[0].sampleId;for(const t in e[i]){const o=e[i][t].term;s+=`${o.name}`;for(const t in e){const i=e[t];let a=c(o,i);if(a==null)a="Missing";s+=`\t${a}`}s+="\n"}const o="data:text/tsv;charset=utf-8,"+encodeURIComponent(s);const a=document.createElement("a");a.setAttribute("href",o);a.setAttribute("download",t);document.body.appendChild(a);a.click();a.remove();this.dom.messageDiv.style("display","none");this.dom.downloadbt.style("display","inline-block")}mayRequireToken(){if(this.state.hasVerifiedToken){this.dom.holder.style("display","block");return false}else{const t=this.state.tokenVerificationPayload;const e=t?.error=="Missing access"&&this.state.termdbConfig.dataDownloadCatch?.missingAccess;const s=e?.message?.replace("MISSING-ACCESS-LINK",e?.links[t?.linkKey]);const i=this.state.termdbConfig.dataDownloadCatch?.helpLink;this.dom.holder.style("color","#e44").style("padding","10px").html(s||(this.state.tokenVerificationMessage||"Requires sign-in")+(i?` <a href='${i}' target=_blank>Tutorial</a>`:""));return true}}showVisiblePlots(){this.visiblePlots=false;this.showPlotsFromCategory(this.discoPlots,"showDisco");for(const t in this.state.singleSampleGenomeQuantification)this.showPlotsFromCategory(this.singleSamplePlots[t],t);this.showPlotsFromCategory(this.brainPlots,"showBrain");this.showPlotsFromCategory(this.imagePlots,"showImages");this.showPlotsFromCategory(this.dziPlots,"showDzi");this.showPlotsFromCategory(this.wsiPlots,"showWsi");if(this.state.samples.length==1&&this.visiblePlots)this.dom.tableDiv.style("max-width","48vw").style("max-height","40vw").attr("class","sjpp_show_scrollbar");else this.dom.tableDiv.style("max-width","").style("max-height","").attr("class","")}showPlotsFromCategory(t,e){for(const s of t){const t=this.state.samples.find((t=>t.sampleName==s.sample.sampleName));const i=this.settings[e]&&t;if(i)this.visiblePlots=true;s.cellDiv.style("display",i?"table-cell":"none")}}async renderPlots(t,e){const i=this.dom.plotsDiv;this.discoPlots=[];this.singleSamplePlots={};this.brainPlots=[];this.imagePlots=[];this.dziPlots=[];this.wsiPlots=[];t.termdbConfig.queries;if(t.termdbConfig.queries?.DZImages){let o=i.append("div");if(t.samples.length==1)o.style("display","inline-block").style("width","50vw");for(const i of e){const e=await s("sampledzimages",{body:{genome:this.app.opts.genome.name,dslabel:t.vocab.dslabel,sample_id:i.sampleName}});if(e.sampleDZImages?.length>0){const s=o.append("div").style("display","inline-block");this.dziPlots.push({sample:i,cellDiv:s});const a=await import("./plot.dzi-6728a7c8.js");a.default(t.vocab.dslabel,s,this.app.opts.genome,i.sampleName,e.sampleDZImages)}}}if(t.termdbConfig.queries?.WSImages){let s=i.append("div");if(t.samples.length==1)s.style("display","inline-block").style("width","50vw");for(const i of e){const e=s.append("div").style("display","inline-block");this.wsiPlots.push({sample:i,cellDiv:e});const o=await import("./plot.wsi-9a9d4034.js");o.default(t.vocab.dslabel,e,this.app.opts.genome,i.sampleName)}}if(t.termdbConfig?.queries?.singleSampleMutation){let s=i.append("div");if(t.samples.length==1)s.style("display","inline-block").style("width","50vw");let o=false;for(const i of e){const e=s.append("div").style("display","inline-block");this.discoPlots.push({sample:i,cellDiv:e});const a=e.insert("div");const l=await import("./plot.disco-6011f87f.js");const n=await l.default(t.termdbConfig,t.vocab.dslabel,{sample_id:i.sampleName},e,this.app.opts.genome,{},false);if(n){if(t.samples.length>1)a.style("font-weight","bold").style("padding-left","20px").text(i.sampleName);o=true}}this.dom.showPlotsDiv.select("input[id=showDisco").style("display",o?"inline-block":"none");this.dom.showPlotsDiv.select("label[for=showDisco").style("display",o?"inline-block":"none")}if(t.termdbConfig.queries?.singleSampleGenomeQuantification){for(const s in t.termdbConfig.queries.singleSampleGenomeQuantification){let o=false;this.singleSamplePlots[s]=[];let a=i.append("div");if(t.samples.length==1)a.style("display","inline-block").style("width","50vw");for(const i of e){const e=s.match(/[A-Z][a-z]+|[0-9]+/g).join(" ");const l=a.insert("div").style("display","table-cell").style("padding","20px");this.singleSamplePlots[s].push({sample:i,cellDiv:l});if(t.samples.length>1)l.insert("div").style("font-weight","bold").text(`${i.sampleName} ${e}`);const n=await import("./plot.ssgq-5581dc56.js");const r=await n.plotSingleSampleGenomeQuantification(t.termdbConfig,t.vocab.dslabel,s,{sample_id:i.sampleName},l.insert("div"),this.app.opts.genome,null,false);if(r)o=true}this.dom.showPlotsDiv.select(`input[id=${s}`).style("display",o?"inline-block":"none");this.dom.showPlotsDiv.select(`label[for=${s}`).style("display",o?"inline-block":"none")}}if(t.termdbConfig.queries?.NIdata){let s=i.append("div");if(t.samples.length==1)s.style("display","inline-block");for(const s in t.termdbConfig.queries?.NIdata){let o=i.append("div");if(t.samples.length==1)o.style("display","inline-block").style("width","50vw");for(const i of e){const e=o.insert("div").style("display","inline-block");this.brainPlots.push({sample:i,cellDiv:e});if(t.samples.length>1)e.insert("div").style("font-weight","bold").style("padding-left","20px").text(i.sampleName);const a=await import("./plot.brainImaging-2ceb6023.js");a.default(t.termdbConfig,t.vocab.dslabel,s,{sample_id:i.sampleName},e,this.app.opts.genome)}}}if(t.termdbConfig?.queries?.images){let s=i.append("div");if(t.samples.length==1)s.style("display","inline-block").style("width","50vw");for(const i of e){const e=s.append("div").style("display","inline-block");this.imagePlots.push({sample:i,cellDiv:e});if(t.samples.length>1)e.insert("div").style("font-weight","bold").style("padding-left","20px").text(i.sampleName);const o=await import("./imagePlot-b9eae4ae.js");o.renderImagePlot(t,e,i)}}}}function c(t,e){let s=e[t.id]?.value;if(s==null||s==undefined||s=="undefined")return null;if(a(t)){s=t.values?.[s]?.label||t.values?.[s]?.key||s;if(isNaN(s))return s;return s%1==0?s.toString():s.toFixed(2).toString()}if(t.type=="categorical")return t.values[s]?.label||t.values[s]?.key;if(t.type=="condition"){const e=s.toString().split(" ");let[i,o]=e;o=t.values[o].label||t.values[o].key;return`Max grade: ${o}, Time to event: ${Number(i).toFixed(1)} years`}if(t.type=="survival"){const e=s.split(" ");let[i,o]=e;o=t.values?.[o]?.label||t.values?.[o]?.key||o;return`${o} after ${Number(i).toFixed(1)} years`}return null}const m=t(d);const h=m;function f(t){t.renderSampleDictionary=function(){this.dom.tableDiv=this.dom.plotsDiv.append("div").style("display","inline-block").style("padding","20px");const e=this.dom.tableDiv.append("table").style("border-collapse","collapse");const s=e.append("thead");const i=s.append("tr");const o=e.append("tbody");const a=[];for(const e of t.state.samples)a.push(t.sampleDataByTermId[e.sampleId]);t.renderTHead(["",...t.state.samples.map((t=>t.sampleName))],i);const l=t.orderedVisibleTerms.map(((t,e)=>[{term:t},...a.map((e=>({term:t,sample:e})))]));t.renderTBody(l,o)};t.renderTHead=function(e,s){const i=s.selectAll("th").data(e);i.exit().remove();i.html(t.getThHtml);i.enter().append("th").style("padding","5px 10px").style("text-align","end").html(t.getThHtml)};t.getThHtml=t=>t;t.renderTBody=function(e,s){const i=s.selectAll("tr").data(e);i.exit().remove();i.each(t.renderTr);i.enter().append("tr").each(t.renderTr)};t.renderTr=function(e,s){const o=i(this).selectAll("td").data(e,(t=>t));o.exit().remove();o.each(t.renderTd);o.enter().append("td").style("border-bottom","solid 1px rgb(245,245,245)").style("text-align",((t,e)=>e===0?"left":"center")).style("padding","2px 10px").each(t.renderTd)};t.renderTd=function(e,s){if(!e.sample){t.renderTerm(i(this));return}e.sample;const o=e.term;const l=a(o);const n=c(e.term,e.sample);const r=i(this).datum(e).style("text-align","end").style("padding","5px 10px").html(e.sample[e.term.id]?.label||n);if(l)r.append("button").style("margin-left","5px").text("Plot").on("click",(e=>{const s={id:o.id,q:{mode:"continuous"}};t.app.dispatch({type:"plot_create",config:{chartType:"violin",term:s,value:n}})}))};t.renderTerm=function(e){const s=e.datum();if(!e.select("span").size()){const s=e.append("span");s.append("button").style("border-width",0).style("border-radius","5px").style("width","28px").style("height","28px").style("cursor","pointer");s.append("span").style("margin-left",`3px`).style("cursor","pointer");e.on("click",t.toggleTerm)}const i=(s.term.ancestry.length-1)*24;const o=e.select(":scope>span").style("margin-left",`${i}px`);o.select("button").style("display",s.term.isleaf?"none":"").html(t.config.expandedTermIds.includes(s.term.id)?"-":"+");o.select("span").html(s.term.name);return}}function g(t){t.toggleTerm=function(){const e=i(this).datum();if(e.term.isleaf)return;const s=t.config.expandedTermIds.slice();const o=s.indexOf(e.term.id);if(o==-1)s.push(e.term.id);else s.splice(o,1);t.app.dispatch({type:"plot_edit",id:t.id,config:{expandedTermIds:s}})}}async function y(t,s){const i=s.getState()?.termdbConfig?.queries;const o={sampleView:{showDictionary:true,showDisco:true,showBrain:true,showImages:true,showDzi:true,showWsi:true}};if(i)for(const t in i.singleSampleGenomeQuantification)o.sampleView[t]=true;const a={activeCohort:0,sample:null,expandedTermIds:[r],settings:o};return e(a,t)}function u(t,e,s,i){const o=100;const a=[];for(const t in e){const s=e[t].sample_type;if(s==l||s==null)a.push(t)}const n=a.length>1e4;if(a.length==0)return;const r=a[0];const p=t.append("input").attr("list","sampleDatalist").property("autocomplete","off").attr("placeholder",r).style("width","400px");const d=t.append("datalist").attr("id","sampleDatalist");c(a);p.on("keyup",(t=>{d.selectAll("*").remove();const e=p.node().value.toLowerCase();if(i)i(e);const s=[];for(const t of a){if(t.toLowerCase().startsWith(e))s.push(t);if(s.length==o&&a.length>1e4)break}for(const t of a){if(t.toLowerCase().includes(e)&&!s.includes(t))s.push(t);if(s.length==o&&a.length>1e4)break}if(s.length>1||s.length==1&&p.node().value!=s[0])c(s)}));p.on("change",(t=>{const e=p.node().value;s(e)}));function c(t){d.selectAll("option").data(t.filter(((t,e)=>e<o))).enter().append("option").attr("value",(t=>t)).attr("label",((e,s)=>m(e)+(s+1==o?n?`Showing first ${s+1} hits`:`Showing ${s+1} of ${t.length} hits`:s+1===t.length&&s>0?` (Found ${t.length} hits)`:"")))}function m(t){const s=b(e,t);return s.map((t=>t.sampleName)).join(" > ")}return r}function b(t,e){let s=e;const i=Object.values(t);let o=i.find((t=>t.ancestor_name==s));while(o){s=o.name;o=i.find((t=>t.ancestor_name==s))}let a=t[s];if(!a)return[];const n=[{sampleId:a.id,sampleName:a.name}];while(a.ancestor_name){if(t[a.ancestor_name]?.sample_type!=l)n.unshift({sampleId:a.ancestor_id,sampleName:a.ancestor_name});a=t[a.ancestor_name]}return n}export{h as componentInit,y as getPlotConfig,b as getSamplesRelated,c as getTermValue,m as sampleViewInit,u as searchSampleInput};
@@ -0,0 +1 @@
1
+ import{o as e}from"./termsetting-33ea66f1.js";import{r as t}from"./table-29d5a973.js";import"./tslib.es6-c3c2d88f.js";import"./app-b369b169.js";import"path";function i(t){return{showEditMenu(e){var i,o,s,n,a;e.selectAll("*").remove();if(((i=t.vocabApi.termdbConfig)===null||i===void 0?void 0:i.displaySampleIds)&&t.vocabApi.hasVerifiedToken()){const i=t.q.groups;for(const t of i){const i=e.append("div").style("display","inline-block").style("vertical-align","top");const o=(e,i)=>{t.values[e].checked=i.checked};const s=t.in?t.name:`${t.name} will exclude these samples`;l(i,s,t,o)}e.append("div").append("div").style("display","inline-block").style("float","right").style("padding","6px 20px").append("button").attr("class","sjpp_apply_btn sja_filter_tag_btn").text("Apply").on("click",(()=>{for(const e of i)e.values=e.values.filter((e=>!("checked"in e)||e.checked));t.runCallback()}))}else{const i=t.vocabApi.tokenVerificationPayload;const l=(i===null||i===void 0?void 0:i.error)=="Missing access"&&((o=t.vocabApi.termdbConfig.dataDownloadCatch)===null||o===void 0?void 0:o.missingAccess);const d=i&&((s=l===null||l===void 0?void 0:l.message)===null||s===void 0?void 0:s.replace("MISSING-ACCESS-LINK",l===null||l===void 0?void 0:l.links[i.linkKey||""]));const p=(a=(n=t.vocabApi.termdbConfig)===null||n===void 0?void 0:n.dataDownloadCatch)===null||a===void 0?void 0:a.helpLink;e.append("div").style("color","#e44").style("padding","10px").html(d||(t.vocabApi.tokenVerificationMessage||"Requires sign-in")+(p?` <a href='${p}' target=_blank>Tutorial</a>`:""))}},getPillStatus(){},getPillName(i){return e(t,i)}}}function l(e,i,l,o){e.style("padding","6px").append("div").style("margin","10px").style("font-size","0.8rem").html(`<b> ${i}</b>.`);const s=[];for(const e of l.values)s.push([{value:e.sample}]);const n=[{label:"Sample"}];t({rows:s,columns:n,div:e,maxWidth:"30vw",maxHeight:"40vh",noButtonCallback:o,striped:false,showHeader:false,selectAll:true,columnButtons:undefined,buttons:undefined})}function o(e){if(!e.q.type)e.q.type="custom-samplelst";if(!e.q.groups)e.q.groups=[];if(e.q.groups.length==0){for(const t in e.term.values){const i=e.term.values[t];e.q.groups.push({name:t,inuse:i.inuse,values:i.list})}}}export{o as fillTW,i as getHandler};
@@ -1 +1 @@
1
- import{z as t,ak as e,Z as s,M as i,j as a,al as n,am as o,b as l,c as r,x as c,q as p,I as h,an as d,a8 as f,af as u,ao as m,ap as y,aq as g,ar as v,as as b,at as _,ah as x,f as w,ae as k,a9 as z,a7 as q,p as j,ac as M,B as A,ab as E}from"./app-a8c4854a.js";import{v as F}from"./vcf-c4a23924.js";function C(t,e){t.menu.d.append("div").attr("class","sja_menuoption").text("Sort").on("click",(()=>{t.menu.hide();if(e.sort){return}for(const e of t.features){if(e.isgenevalue)delete e.sort}e.sort=1;t.draw_matrix()}))}function L(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV log2(ratio) cutoff&nbsp;");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show CNV with absolute log2(ratio) no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV segment size limit&nbsp;");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the CNV segment length to show only focal events.<br>Set to 0 to cancel.")}}function S(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segmean cutoff&nbsp;");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show LOH with segmean no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segment size limit&nbsp;");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the LOH segment length to show only focal events.<br>Set to 0 to cancel.")}}function N(s,i){{const a=s.menu.d.append("div").style("margin","10px").style("border","solid 1px #ededed");const n=()=>{s.update_singlefeature(i);s.menu.hide()};const o=a.append("table").style("margin","10px").style("border-spacing","1px");const l=o.append("tbody");{const t=l.append("tr");t.append("td").style("opacity",.5).text("CNV");t.append("td").attr("class","sja_menuoption").text(i.cnv.hidden?"Show":"Hide").on("click",(()=>{i.cnv.hidden=!i.cnv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.cnv.hidden;n()}));const e=t.append("td");if(!i.cnv.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();L(s,i,i.cnv)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("LOH");t.append("td").attr("class","sja_menuoption").text(i.loh.hidden?"Show":"Hide").on("click",(()=>{i.loh.hidden=!i.loh.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.loh.hidden;n()}));const e=t.append("td");if(!i.loh.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();S(s,i,i.loh)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("ITD");t.append("td").attr("class","sja_menuoption").text(i.itd.hidden?"Show":"Hide").on("click",(()=>{i.itd.hidden=!i.itd.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.itd.hidden;n()}));t.append("td");if(!i.itd.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("SV");t.append("td").attr("class","sja_menuoption").text(i.sv.hidden?"Show":"Hide").on("click",(()=>{i.sv.hidden=!i.sv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.sv.hidden;n()}));t.append("td");if(!i.sv.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("Fusion");t.append("td").attr("class","sja_menuoption").text(i.fusion.hidden?"show":"hide").on("click",(()=>{i.fusion.hidden=!i.fusion.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("show only").on("click",(()=>{V(i);delete i.fusion.hidden;n()}));t.append("td");if(!i.fusion.hidden);}o.append("tbody").append("tr").append("td").attr("colspan",4).style("padding-top","10px").append("span").style("font-size",".8em").text("List SNV/indel").attr("class","sja_clbtext").on("click",(()=>{if(r.style("display")=="none"){r.style("display","table-row-group")}else{r.style("display","none")}}));const r=o.append("tbody").style("display","none");for(const s in t){const a=t[s];if(a.dt!=e){continue}const o=r.append("tr");o.append("td").style("opacity",.5).text(a.label);o.append("td").attr("class","sja_menuoption").text(i.snvindel.excludeclasses[s]?"Show":"Hide").on("click",(()=>{if(i.snvindel.excludeclasses[s]){delete i.snvindel.excludeclasses[s]}else{i.snvindel.excludeclasses[s]=1}n()}));o.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.snvindel.excludeclasses[s];n()}));o.append("td")}a.append("div").style("margin","10px").append("span").style("font-size",".8em").text("Show all classes").attr("class","sja_clbtext").on("click",(()=>{i.cnv.hidden=false;i.loh.hidden=false;i.itd.hidden=false;i.sv.hidden=false;i.fusion.hidden=false;i.snvindel.excludeclasses={};n()}))}}function V(s){s.cnv.hidden=true;s.loh.hidden=true;s.itd.hidden=true;s.sv.hidden=true;s.fusion.hidden=true;s.snvindel.excludeclasses={};for(const i in t){if(t[i].dt==e)s.snvindel.excludeclasses[i]=1}}function T(t,e){if(!t.mds||!t.mds.survivalplot)return;e.append("span").style("margin-right","20px").style("font-size",".8em").text("SURVIVAL PLOT").attr("class","sja_clbtext").on("click",(e=>{t.menu.clear().showunder(e.target);I(t)}))}async function I(t){const e=t.features.filter((t=>t.ismutation));try{if(e.length!=2)throw"only works with two genomic features.";await B(t,e[0],e[1])}catch(e){t.menu.d.append("div").style("margin","20px").text("Cannot make survival plot: "+(e.message||e))}}async function B(t,e,i){const a=[],n=[],o=[];for(const s of t.samples){const t=e.items.find((t=>t.sample==s.name));const l=i.items.find((t=>t.sample==s.name));if(t){if(l)o.push(s.name);else a.push(s.name)}else{n.push(s.name)}}const l={renderplot:1,samplerule:{full:{},mutated_sets:[{name:e.label+" mutated (n="+a.length+")",samplenames:a},{name:i.label+" mutated (n="+n.length+")",samplenames:n},{name:e.label+" and "+i.label+" mutated (n="+o.length+")",samplenames:o}]}};if(t.limitsamplebyeitherannotation){l.samplerule.full={byattr:1,key:t.limitsamplebyeitherannotation[0].key,value:t.limitsamplebyeitherannotation[0].value,immutable:1}}const r=s({x:100,y:100});r.header.text((t.limitsamplebyeitherannotation?t.limitsamplebyeitherannotation[0].value+" ":"")+"survival by "+e.label+" and "+i.label+" mutation status");const c=await import("./mds.survivalplot-366db380.js");c.init({mds:t.mds,genome:t.genome,plotlist:[l]},r.body)}const O="na";const R="#D6683C";const U="#67a9cf";const H="#095873";const D="#858585";const G="#858585";const P=8;class X{constructor(t){for(const e in t){this[e]=t[e]}if(this.debugmode)window.smat=this;this.tip=new i({padding:"0px",hideXmute:1,hideYmute:1});this.menu=new i({padding:"0px"});this.errdiv=this.holder.append("div");if(!this.iscustom){try{if(!this.dslabel)throw"not custom data but dslabel is missing";this.mds=this.genome.datasets[this.dslabel];if(!this.mds)throw"invalid dataset name: "+this.dslabel;if(!this.mds.isMds)throw"improper dataset: "+this.dslabel}catch(t){this.error(t)}}K(this);if(this.header){this.holder.append("div").style("margin-bottom","20px").html(this.header)}this.wait_div=this.holder.append("div");this.wait_div.style("display","block").text("Loading...");this.svg=this.holder.append("svg");this.validate_config().then((()=>this.get_features())).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}error(t){a(this.errdiv,t)}async validate_config(){if(this.iscustom){if(!this.querykey2tracks)throw"querykey2tracks missing for custom dataset";let t=true;for(const e in this.querykey2tracks){const s=this.querykey2tracks[e];if(!s.file&&!s.url)throw"no file or url for a custom track by key "+e;if(!s.type)throw"missing type for member track by key "+e;if(!n(s.type))throw"invalid type for a member track: "+s.type;t=false}if(t)throw"no custom tracks from querykey2tracks";let e;for(const t in this.querykey2tracks){const s=this.querykey2tracks[t];if(s.type==o.mdsvcf){e=s}}if(e){await this.may_init_customvcf(e)}}else{if(this.mds.mdsIsUninitiated){const t=await l(`getDataset?genome=${this.genome.name}&dsname=${this.mds.label}`);if(t.error)throw t.error;if(!t.ds)throw"ds missing";Object.assign(this.mds,t.ds);delete this.mds.mdsIsUninitiated}}if(this.limitsamplebyeitherannotation){if(!Array.isArray(this.limitsamplebyeitherannotation))throw"limitsamplebyeitherannotation must be an array";this.legendtable.append("tr");for(const t of this.limitsamplebyeitherannotation){if(!t.key)throw".key missing from an element of limitsamplebyeitherannotation";if(!t.value)throw".value missing from an element of limitsamplebyeitherannotation"}this.showlegend_limitsample()}const t=this.legendtable.append("tr");t.append("td").style("opacity",.5).style("text-align","right").text("CNV cutoff");this.legendtable.cnv_td=t.append("td");const e=this.legendtable.append("tr");e.append("td").style("opacity",.5).style("text-align","right").text("LOH cutoff");this.legendtable.loh_td=e.append("td");if(this.limitbysamplesetgroup){if(!Array.isArray(this.limitbysamplesetgroup.samples))throw".limitbysamplesetgroup.samples is not array"}if(!this.rowspace)this.rowspace=1;if(!this.colspace)this.colspace=1;if(!this.rowlabspace)this.rowlabspace=5;if(!this.collabspace)this.collabspace=5;if(!this.rowlabticksize)this.rowlabticksize=5;if(!this.collabticksize)this.collabticksize=5;if(!this.features)throw"missing features[]";if(!Array.isArray(this.features))throw"features must be an array";if(this.features[0].height)this.ori_feature_height=this.features[0].height;if(this.features[0].width)this.ori_feature_width=this.features[0].width;for(const t of this.features){await this.validate_feature(t)}}showlegend_limitsample(){if(!this.limitsamplebyeitherannotation)return}feature_parseposition_maygene(t){return Promise.resolve().then((()=>{if(t.position){const e=r(t.position,this.genome);if(e){t.chr=e.chr;t.start=e.start;t.stop=e.stop}}if(t.chr){const e=c(this.genome,t.chr,t.start,t.stop);if(e){throw'feature "'+t.label+'" position error: '+e}else{return}}if(!t.genename)throw"position required for a feature: no position or genename given";return p("/genelookup",{input:t.genename,genome:this.genome.name,deep:1}).then((e=>{if(e.error)throw e.error;if(!e.gmlst||e.gmlst.length==0)throw"no gene can be found for "+t.genename;const s=[];for(const t of e.gmlst){let e=true;for(const i of s){if(t.chr==i.chr&&Math.max(t.start,i.start)<Math.min(t.stop,i.stop)){e=false;i.start=Math.min(i.start,t.start);i.stop=Math.max(i.stop,t.stop);break}}if(e){s.push({chr:t.chr,start:t.start,stop:t.stop})}}if(s.length>1){a(this.errdiv,"multiple regions found for gene "+t.genename+" you'd better specify one in feature")}t.chr=s[0].chr;t.start=s[0].start;t.stop=s[0].stop}))}))}validate_feature(e){return Promise.resolve().then((()=>{e.id=Math.random().toString();const s=this.legendtable.append("tr");e.legend_tr=s;if(e.isgenevalue){if(!e.genename)throw".genename missing for isgenevalue feature";e.label=e.genename+" expression";if(this.dslabel){if(!e.querykey)throw".querykey missing for isgenevalue feature while loading from official dataset"}if(!e.scale)e.scale={auto:1};if(e.missingvalue==undefined)e.missingvalue=0;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.color)e.color=H;return this.feature_parseposition_maygene(e)}if(e.iscnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for iscnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.colorgain)e.colorgain=R;if(!e.colorloss)e.colorloss=U;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isloh){if(this.dslabel){if(!e.querykey)throw".querykey missing for isloh feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" LOH"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.color)e.color=D;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" LOH";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isvcf){if(this.dslabel){if(!e.querykey)throw".querykey missing for isvcf feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SNV/indel"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.snvindel)e.snvindel={};return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SNV/indel"}))}if(e.isitd){if(this.dslabel){if(!e.querykey)throw".querykey missing for isitd feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" ITD"}if(!e.width)e.width=20;if(!e.color)e.color=t[d].color;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");e.legendholder.append("div").style("width","20px").html("&nbsp;").style("background",e.color);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" ITD"}))}if(e.issvfusion){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvfusion feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SV/fusion"}if(!e.width)e.width=20;if(!e.color)e.color=G;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SV/fusion"}))}if(e.issvcnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvcnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV/SV"}s.append("td").text(e.label).style("color","#858585").style("text-align","right");e.legendholder=s.append("td");J(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV/SV"}))}if(e.ismutation){if(this.dslabel){if(!e.querykeylst)throw".querykeylst missing for ismutation feature";if(!Array.isArray(e.querykeylst))throw".querykeylst[] should be array for ismutation feature";if(e.querykeylst.length==0)throw"querykeylst[] empty array for ismutation feature"}if(!e.label&&e.genename){e.label=e.genename+" mutation"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");J(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" mutation";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.issampleattribute){if(!this.dslabel)throw".dslabel missing: sampleattribute only works for official dataset";if(!e.key)throw".key missing for issampleattribute feature";if(!e.label)e.label=e.key;if(this.mds&&this.mds.sampleAttribute&&this.mds.sampleAttribute.attributes){const t=this.mds.sampleAttribute.attributes[e.key];if(t){e.values=t.values}}if(!e.values){e.values={}}e.assignmissingcolor=f(u);if(!e.width&&!this.features_on_rows)e.width=20;else if(!e.height&&this.features_on_rows)e.height=50;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return Promise.resolve()}throw"unknown feature type in validating feature"}))}get_features(t){this.max_cnv=0;this.min_cnv=0;this.max_loh=0;this.min_loh=0;const e={genome:this.genome.name,limitsamplebyeitherannotation:this.limitsamplebyeitherannotation,features:(t||this.features).map(Y)};if(this.limitbysamplesetgroup){e.sampleset=this.limitbysamplesetgroup.samples}if(this.iscustom){e.iscustom=1;e.querykey2tracks={};for(const t of e.features){if(t.querykey){e.querykey2tracks[t.querykey]=this.querykey2tracks[t.querykey]}else if(t.querykeylst){for(const s of t.querykeylst)e.querykey2tracks[s]=this.querykey2tracks[s]}}}else{e.dslabel=this.mds.label}return p("/samplematrix",e).then((t=>{if(t.error){for(const t of e.features){const e=this.features.find((e=>e.id==t.id));if(e)e.items=[]}throw t.error}for(const e of t.results){const t=this.features.find((t=>t.id==e.id));if(!t)throw"feature not found: "+t.id;t.items=e.items;this.prep_featuredata(t)}this.draw_matrix();this.make_legend();this.wait_div.style("display","none")}))}update_singlefeature(t){this.get_features([t]).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}addnewfeature_update(t){this.features.push(t);this.validate_feature(t).then((()=>this.get_features([t]))).catch((t=>{this.error(typeof t=="string"?t:t.message);if(t.stack)console.log(t.stack)}))}prep_featuredata(t){if(t.isgenevalue){t.scale.maxv=0;t.scale.minv=0;for(const e of t.items){t.scale.maxv=Math.max(t.scale.maxv,e.value)}return}if(t.iscnv){const e=[],s=[];for(const i of t.items){if(i.value>0){e.push(i.value)}else{s.push(-i.value)}}const i=m(e,0);const a=m(s,0);t.maxabslogratio=Math.max(i,a);if(t.maxabslogratio>this.max_cnv)this.max_cnv=t.maxabslogratio;return}if(t.isloh){const e=t.items.map((t=>t.segmean));t.minvalue=0;t.maxvalue=Math.max(...e);if(t.maxvalue>this.max_loh)this.max_loh=t.maxvalue;return}if(t.isvcf){return}if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv||t.ismutation){const e=[],s=[];let i=0;for(const a of t.items){if(a.dt==y){if(a.value>0){e.push(a.value)}else{s.push(-a.value)}}else if(a.dt==g){i=Math.max(a.segmean,i)}}if(e.length+s.length>0){const i=m(e,0);const a=m(s,0);t.cnv.maxabslogratio=Math.max(i,a);if(t.cnv.maxabslogratio>this.max_cnv){this.max_cnv=t.cnv.maxabslogratio;this.min_cnv=-t.cnv.maxabslogratio;this.cnv_colorloss=t.cnv.colorloss;this.cnv_colorgain=t.cnv.colorgain}}if(i){t.loh.minvalue=0;t.loh.maxvalue=i;if(t.loh.maxvalue>this.max_loh)this.max_loh=t.loh.maxvalue;this.loh_color=t.loh.color}return}if(t.issampleattribute){for(const e of t.items){if(!t.values[e.value]){t.values[e.value]={name:e.value,color:t.assignmissingcolor(e.value)}}}return}throw"unknown feature type in preparing feature data"}make_legend(){for(const s of this.features){const i=s.legendholder;i.selectAll("*").remove();if(s.isgenevalue){i.append("span").text(s.scale.minv.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.scale.maxv.toFixed(3));continue}if(s.iscnv){i.append("span").html('Gain <span style="background:'+s.colorgain+';color:white;padding:1px 5px">'+s.maxabslogratio.toFixed(3)+"</span> &nbsp; "+'Loss <span style="background:'+s.colorloss+';color:white;padding:1px 5px">-'+s.maxabslogratio.toFixed(3)+"</span>");continue}if(s.isloh){i.append("span").text(s.minvalue.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.maxvalue.toFixed(3));continue}if(s.isvcf){const e=new Set;for(const t of s.items){if(t.class){e.add(t.class)}}for(const s of e){const e=i.append("div").style("display","inline-block").style("margin-right","10px");e.append("span").style("background",t[s].color).style("margin-right","2px").html("&nbsp;&nbsp;&nbsp;");e.append("span").text(t[s].label).style("color",t[s].color)}continue}if(s.isitd){continue}if(s.issvfusion){continue}if(s.issvcnv||s.ismutation){const a=new Map;let n=0;let o=0;let l=0;for(const t of s.items){if(t.dt==e){if(t.class&&t.sampledata){if(!a.has(t.class)){a.set(t.class,0)}a.set(t.class,a.get(t.class)+t.sampledata.length)}}else if(t.dt==v){n++}else if(t.dt==b){o++}else if(t.dt==_){l++}}if(a.size+n+o+l>0){const e=i.append("div").style("margin-bottom","5px").style("white-space","nowrap");for(const[s,i]of a){const a=t[s];const n=e.append("div").style("display","inline-block").style("margin-right","20px");n.append("span").attr("class","sja_mcdot").style("background",a.color).text(i);n.append("span").text(a.label).style("color",a.color)}if(n){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.itd.color).text(n);t.append("span").text("ITD")}if(o){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.sv.color).text(o);t.append("span").text("SV")}if(l){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.fusion.color).text(l);t.append("span").text("Fusion")}}continue}if(s.issampleattribute){const t=new Map;for(const e of this.samples){const i=s.items.find((t=>t.sample==e.name));if(i){t.set(i.value,(t.get(i.value)||0)+1)}}for(const[e,a]of t){const t=i.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.values[e].color).text(a);t.append("span").text(s.values[e].name)}continue}throw"unknown feature type in making legend"}this.makeGlobalCnvLohLegend()}makeGlobalCnvLohLegend(){const t=[{type:"cnv",legend_label:"CNV log2(ratio): "},{type:"loh",legend_label:"LOH seg.mean: "}];const e=parseFloat(this.min_cnv.toFixed(3));const s=parseFloat(this.max_cnv.toFixed(3));const i=parseFloat(this.min_loh.toFixed(3));const a=parseFloat(this.max_loh.toFixed(3));let n=false;t.forEach((t=>{let o=t.type=="cnv"?this.min_cnv:this.min_loh;let l=t.type=="cnv"?this.max_cnv:this.max_loh;const r=t.type=="cnv"?this.legendtable.cnv_td:this.legendtable.loh_td;const c=r.append("div").style("margin-bottom","5px");c.append("span").text(t.legend_label);const p=c.append("span").text(o.toFixed(3));const h=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",o.toFixed(3));if(t.type=="cnv"){c.append("div").style("margin","4px 0 1px 10px").style("display","inline-block").style("width","50px").style("height","15px").style("background","linear-gradient( to right,"+this.cnv_colorloss+",white)")}c.append("div").style("margin","4px 10px 1px 10px").style("margin-left",t.type=="cnv"?"0":"10px").style("display","inline-block").style("width",t.type=="cnv"?"50px":"100px").style("height","15px").style("background","linear-gradient( to right, white, "+(t.type=="cnv"?this.cnv_colorgain:this.loh_color)+")");const d=c.append("span").text(l.toFixed(3));const f=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",l.toFixed(3));const u=c.append("button").style("margin","2px 5px").style("padding","3px 10px").text("Edit").on("click",(()=>{p.style("display","none");d.style("display","none");h.style("display","inline-block");f.style("display","inline-block");u.style("display","none");m.style("display","inline-block")}));const m=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Submit").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=h.property("value");this.max_cnv=l=f.property("value");if(this.min_cnv!=e||this.max_cnv!=s)n=true}else{this.min_loh=o=parseFloat(h.property("value"));this.max_loh=l=parseFloat(f.property("value"));if(this.min_loh!=i||this.max_loh!=a)n=true}p.style("display","inline-block").text(parseFloat(o).toFixed(3));d.style("display","inline-block").text(parseFloat(l).toFixed(3));h.style("display","none");f.style("display","none");u.style("display","inline-block");m.style("display","none");y.style("display",n?"inline-block":"none");this.draw_matrix()}));const y=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Reset").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=e;this.max_cnv=l=s}else{this.min_loh=o=i;this.max_loh=l=a}p.text(parseFloat(o).toFixed(3));d.text(parseFloat(l).toFixed(3));h.property("value",parseFloat(o).toFixed(3));f.property("value",parseFloat(l).toFixed(3));y.style("display","none");n=false;this.draw_matrix()}));y.style("display","none")}))}gatherSamplesFromFeatureData(){const t=new Map;for(const s of this.features){if(s.donotaddsample){continue}if(s.isgenevalue||s.iscnv||s.isloh||s.isitd||s.issvfusion||s.issvcnv){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else if(s.isvcf){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{console.error("unsupported dt from isvcf: "+i.dt)}}}else if(s.ismutation){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{if(!i.sample)continue;if(!t.has(i.sample)){t.set(i.sample,{})}}}}else if(s.issampleattribute){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else{console.error("unknown feature type from this.data")}}const s=Math.min(18,Math.max(1,Math.ceil(800/t.size)));this.samples=[];for(const[e,i]of t){if(!this.features_on_rows)i.height=s;else i.width=s;i.name=e;this.samples.push(i)}}draw_matrix(){this.svg.selectAll("*").remove();const t=this.svg.append("g");this.gatherSamplesFromFeatureData();this.sortsamplesbyfeatures();const e=this.features_on_rows?this.features:this.samples;const s=this.features_on_rows?this.samples:this.features;let i=0,a=0;for(const s of e){s.g=t.append("g").attr("transform","translate(0,"+i+")");i+=s.height+this.rowspace;if(s.height>=P){s.g.append("text").attr("font-family",x).attr("font-size",Math.min(16,s.height)).attr("text-anchor","end").attr("dominant-baseline","central").attr("x",-this.rowlabspace-this.rowlabticksize).attr("y",s.height/2).text(this.features_on_rows?s.label+(s.count?" ("+s.count+")":""):s.name).each((function(){a=Math.max(a,this.getBBox().width)})).attr("class","sja_clbtext").on("mouseover",(()=>{this.features_on_rows?this.showTip_feature(s):this.showTip_sample(s)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(this.features_on_rows)this.showMenu_feature(s)}));s.g.append("line").attr("x1",-this.rowlabticksize).attr("y1",s.height/2).attr("y2",s.height/2).attr("stroke","black").attr("shape-rendering","crispEdges")}}let n=0,o=0;for(const e of s){const s=t.append("g").attr("transform","translate("+(n+e.width/2)+",-"+(this.collabspace+this.collabticksize)+")");n+=e.width+this.colspace;const i=s.append("text").attr("font-family",x).attr("font-size",Math.min(16,e.width-2)).attr("dominant-baseline","central").attr("transform","rotate(-90)").text(this.features_on_rows?e.name:e.label+(e.count?" ("+e.count+")":"")).each((function(){o=Math.max(o,this.getBBox().width)})).on("mouseover",(()=>{this.features_on_rows?this.showTip_sample(e):this.showTip_feature(e)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(!this.features_on_rows)this.showMenu_feature(e)}));if(e.isgenevalue){i.attr("fill",e.color)}s.append("line").attr("y1",this.collabspace).attr("y2",this.collabspace+this.collabticksize).attr("stroke","black").attr("shape-rendering","crispEdges")}for(const t of e){let e=0;for(const i of s){const s=this.features_on_rows?i:t;const a=this.features_on_rows?t:i;const n=t.g.append("g").attr("transform","translate("+e+",0)");e+=i.width+this.colspace;if(a.isgenevalue){this.drawCell_isgenevalue(s,a,n)}else if(a.iscnv){this.drawCell_iscnv(s,a,n)}else if(a.isloh){this.drawCell_isloh(s,a,n)}else if(a.isvcf){this.drawCell_isvcf(s,a,n)}else if(a.isitd){this.drawCell_isitd(s,a,n)}else if(a.issvfusion){this.drawCell_issvfusion(s,a,n)}else if(a.issvcnv||a.ismutation){this.drawCell_ismutation(s,a,n)}else if(a.issampleattribute){this.drawCell_issampleattribute(s,a,n)}else{console.error("unknown feature type when drawing cell")}}}t.attr("transform","translate("+(a+this.rowlabspace+this.rowlabticksize)+","+(o+this.collabspace+this.collabticksize)+")");this.svg.attr("width",a+this.rowlabspace+this.rowlabticksize+s.reduce(((t,e)=>t+e.width),0)+s.length*this.colspace).attr("height",o+this.collabspace+this.collabticksize+e.reduce(((t,e)=>t+e.height),0)+e.length*this.rowspace)}drawCell_isgenevalue(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}const o=s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}));if(n.value<e.scale.maxv){o.attr("fill-opacity",n.value/e.scale.maxv)}}drawCell_iscnv(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const i of n){const a=e.coordscale(Math.max(e.start,i.start));const n=e.coordscale(Math.min(e.stop,i.stop));const o=this.max_cnv;s.append("rect").attr("x",a).attr("width",Math.max(1,n-a)).attr("height",t.height).attr("fill",i.value>0?e.colorgain:e.colorloss).attr("fill-opacity",Math.abs(i.value/o)).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isloh(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const t of n){const n=e.coordscale(Math.max(e.start,t.start));const o=e.coordscale(Math.min(e.stop,t.stop));const l=this.max_loh-this.min_loh;s.append("rect").attr("x",this.features_on_rows?0:n).attr("y",this.features_on_rows?n:0).attr("width",this.features_on_rows?a:Math.max(1,o-n)).attr("height",this.features_on_rows?Math.max(1,o-n):i).attr("fill",e.color).attr("fill-opacity",(t.segmean-this.min_loh)/l).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isvcf(e,s,i){const a=this.features_on_rows?s.height:e.height;const n=this.features_on_rows?e.width:s.width;const o=$(s,e);if(o.length==0){this.drawEmptycell(e,s,i);return}const l=new Map;for(const t of o){if(!l.has(t.class)){l.set(t.class,0)}l.set(t.class,l.get(t.class)+1)}let r=0;for(const[e,s]of l){const l=s/o.length*this.features_on_rows?a:n;i.append("rect").attr("x",this.features_on_rows?0:r).attr("y",this.features_on_rows?r:0).attr("width",this.features_on_rows?n:l).attr("height",this.features_on_rows?l:a).attr("fill",t[e].color).attr("shape-rendering","crispEdges");r+=l}i.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",n).attr("height",a).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_isitd(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issampleattribute(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.values[n.value].color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issvfusion(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_ismutation(e,s,i){const[a,n,o,l,r,c]=Z(s,e);const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;if(a.length+n.length+o.length+l.length+r.length+c.length==0){this.drawEmptycell(e,s,i);return}let d=false;if(this.ismutation_allsymbolic){d=true}else if(this.ismutation_allnotsymbolic);else{if(p<=4){d=true}}if(d){this.drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c)}else{if(n.length){for(const t of n){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=this.max_loh-this.min_loh;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.loh.color).attr("fill-opacity",(t.segmean-this.min_loh)/n).attr("shape-rendering","crispEdges")}}if(a.length){for(const t of a){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=t.value>0?this.max_cnv:this.min_cnv;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",t.value>0?s.cnv.colorgain:s.cnv.colorloss).attr("fill-opacity",Math.abs(t.value/n)).attr("shape-rendering","crispEdges")}}if(o.length){for(const t of o){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.itd.color).attr("shape-rendering","crispEdges")}}if(l.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.sv.color).attr("fill","none")}if(r.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.fusion.color).attr("fill","none")}if(c.length){const e=c[0];const s=i.append("g").attr("transform","translate("+h/2+","+p/2+")");const a=t[e.m.class].color;const n=Math.min(h,p)/2;s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke",a);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke",a)}}i.append("rect").attr("width",h).attr("height",p).attr("fill","white").attr("fill-opacity",0).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c){const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;const d=this.max_loh-this.min_loh;const f=[];if(a.length){for(const t of a){const e=t.value>0?this.max_cnv:this.min_cnv;let i;if(t.value>0){i={color:s.cnv.colorgain}}else{i={color:s.cnv.colorloss}}i.opacity=Math.abs(t.value/e);f.push(i)}}if(n.length){for(const t of n){f.push({color:s.loh.color,opacity:(t.segmean-this.min_loh)/d})}}if(o.length){for(const t of o){f.push({color:s.itd.color})}}if(l.length){for(const t of l){f.push({color:s.sv.color})}}if(r.length){for(const t of r){f.push({color:s.fusion.color})}}if(c.length){for(const e of c){f.push({color:t[e.m.class].color})}}const u=this.features_on_rows?p/f.length:h/f.length;let m=0;for(const t of f){const e=i.append("rect").attr("x",this.features_on_rows?0:m).attr("y",this.features_on_rows?m:0).attr("width",this.features_on_rows?h:u).attr("height",this.features_on_rows?u:p).attr("fill",t.color).attr("shape-rendering","crispEdges");if(t.opacity)e.attr("opacity",t.opacity);m+=u}}async click_cell(t,e){try{let i;if(this.iscustom){i={iscustom:true,type:o.mdssvcnv,singlesample:{name:t.name}};for(const t in this.querykey2tracks){const e=this.querykey2tracks[t];if(e.type==o.mdssvcnv){i.name=e.name||"Custom tk";i.file=e.file;i.url=e.url;i.indexURL=e.indexURL}else if(e.type==o.mdsvcf){i.checkvcf={file:e.file,url:e.url,indexURL:e.indexURL}}else if(e.type==o.mdsexpression){i.checkexpressionrank={file:e.file,url:e.url,indexURL:e.indexURL}}}}else{if(!this.mds)throw"not custom but .mds{} missing";for(const e in this.mds.queries){const s=this.mds.queries[e];if(s.type==o.mdssvcnv){i={mds:this.mds,querykey:e,singlesample:{name:t.name}};for(const t in s)i[t]=s[t];break}}}if(!i)throw"cannot find a svcnv tk";i.bplengthUpperLimit=0;const a=s({x:100,y:100});const n={jwt:this.jwt,hostURL:this.hostURL,nobox:1,genome:this.genome,holder:a.body,chr:e.chr,start:e.start,stop:e.stop,tklst:[]};w(this.genome,n.tklst);n.tklst.push(i);if(!this.iscustom){if(!this.dslabel)throw"not custom but dslabel missing";const e={genome:this.genome.name,dslabel:this.dslabel,querykey:i.querykey,gettrack4singlesample:t.name};const s=await p("/mdssvcnv",e);if(s.error)throw"Error checking for assay track: "+s.error;if(s.tracks){for(const t of s.tracks)n.tklst.push(t)}}const l=await import("./block-dcb130fb.js").then((function(t){return t.c}));new l.Block(n)}catch(t){window.alert(t.message||t);if(t.stack)console.log(t.stack)}}showTip_feature(t){this.tip.clear();this.tipContent_feature(t,this.tip.d);this.tip.showunder(event.target)}showMenu_feature(t){this.menu.showunder(event.target).clear();this.tipContent_feature(t,this.menu.d);this.menu.d.append("div").attr("class","sja_menuoption").text("Remove this feature").on("click",(()=>{this.menu.hide();t.legend_tr.remove();this.features.splice(this.features.findIndex((e=>e.id==t.id)),1);this.draw_matrix()}));if(t.isgenevalue)return C(this,t);if(t.iscnv)return L(this,t,t);if(t.isloh)return S(this,t,t);if(t.ismutation)return N(this,t);if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv){return}if(t.issampleattribute){return}}tipContent_feature(t,e){e.append("div").text(t.label).style("opacity",.5).style("font-size",".7em").style("margin","10px");if(t.isgenevalue||t.iscnv||t.isloh||t.isitd||t.issvfusion){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" &nbsp; "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}else if(t.issvcnv||t.ismutation){if(!t.genename){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" &nbsp; "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}else if(t.issampleattribute){e.append("div").text(t.label)}if(t.isgenevalue){e.append("div").text("Min: "+t.scale.minv+", max: "+t.scale.maxv).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}showTip_sample(e){this.tip.clear().d.append("div").text(e.name).style("padding","10px").style("font-size",".7em");const s=[];for(const i of this.features){if(s.length>10){s.push({k:"more",v:"..."});break}if(i.isgenevalue){const t=i.items.find((t=>t.sample==e.name));s.push({k:i.label,v:t?t.value:O});continue}if(i.iscnv){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?i.colorgain:i.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isloh){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+i.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isvcf){const a=$(i,e);let n;if(a.length==0){n=O}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}s.push({k:i.label,v:n});continue}if(i.isitd){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{a='<div style="background:'+i.color+';width:20px">&nbsp;</div>'}s.push({k:i.label,v:a});continue}if(i.issvfusion){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{a='<div style="background:'+i.color+';width:20px">&nbsp;</div>'}s.push({k:i.label,v:a});continue}if(i.issvcnv){continue}if(i.ismutation){continue}if(i.issampleattribute){const t=i.items.find((t=>t.sample==e.name));if(t){s.push({k:i.label,v:t.value})}continue}console.error("sample tooltip: Unknown feature type")}z(this.tip.d,s);this.tip.show(event.clientX,event.clientY)}showTip_cell(e,s){const i=[{k:"sample",v:e.name}];if(s.isgenevalue){const t=s.items.find((t=>t.sample==e.name));i.push({k:s.label,v:t?t.value:O})}else if(s.iscnv){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?s.colorgain:s.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isloh){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+s.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isvcf){const a=$(s,e);let n;if(a.length==0){n=O}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}i.push({k:s.label,v:n})}else if(s.isitd){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvfusion){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chrA+":"+t.posA+" - "+t.chrB+":"+t.posB+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvcnv||s.ismutation){const[a,n,o,l,r,c]=Z(s,e);if(a.length){i.push({k:(s.genename||s.label)+" CNV",v:a.map((t=>"<div>"+'<span style="background:'+(t.value>0?s.cnv.colorgain:s.cnv.colorloss)+';color:white;padding:0px 3px">'+t.value+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" &nbsp;&nbsp;"+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(n.length){i.push({k:(s.genename||s.label)+" LOH",v:n.map((t=>"<div>"+'<span style="background:'+s.loh.color+';color:white;padding:0px 3px">'+t.segmean+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" &nbsp;&nbsp;"+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(o.length){i.push({k:(s.genename||s.label)+" ITD",v:o.map((t=>'<div style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+"</div>")).join("")})}if(l.length){i.push({k:(s.genename||s.label)+" SV",v:l.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" &gt; "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(r.length){i.push({k:(s.genename||s.label)+" fusion",v:r.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" &gt; "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(c.length){i.push({k:(s.genename||s.label)+" SNV/indel",v:c.map((e=>{const s=t[e.m.class];return"<div>"+'<span style="color:'+s.color+'">'+(e.m.mname||"")+"</span> "+'<span style="font-size:.7em;opacity:.5">'+s.label+"</span>"+"</div>"})).join("")})}}else if(s.issampleattribute){const t=s.items.find((t=>t.sample==e.name));if(t){i.push({k:s.label,v:t.value})}}else{console.error("cell tooltip: unknown feature type")}this.tip.clear();z(this.tip.d,i);this.tip.show(event.clientX,event.clientY)}sortsamplesbyfeatures(){const t=this.features.find((t=>t.isgenevalue&&t.sort));if(t&&t.items){const e=new Map;for(const s of t.items){e.set(s.sample,s.value)}this.samples.sort(((s,i)=>{const a=e.has(s.name)?e.get(s.name):t.missingvalue;const n=e.has(i.name)?e.get(i.name):t.missingvalue;return n-a}))}}may_init_customvcf(t){if(t.info)return;const e=["genome="+this.genome.name];if(t.file){e.push("file="+t.file)}else{e.push("url="+t.url);if(t.indexURL)e.push("indexURL="+t.indexURL)}return q("vcfheader?"+e.join("&")).then((e=>{const[s,i,a,n]=F(e.metastr.split("\n"));if(n)throw"Error parsing VCF meta lines: "+n.join("; ");t.info=s;t.format=i;t.samples=a;t.nochr=e.nochr}))}drawEmptycell(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;if(i<5)return;s.append("line").attr("x2",a).attr("y2",i).attr("stroke","#ededed")}}function Y(t){if(t.isgenevalue){return{id:t.id,isgenevalue:1,querykey:t.querykey,genename:t.genename,chr:t.chr,start:t.start,stop:t.stop}}if(t.iscnv){return{id:t.id,iscnv:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isloh){return{id:t.id,isloh:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isvcf){return{id:t.id,isvcf:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,snvindel:{excludeclasses:t.snvindel.excludeclasses}}}if(t.isitd){return{id:t.id,isitd:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvfusion){return{id:t.id,issvfusion:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvcnv||t.ismutation){const e={id:t.id,chr:t.chr,start:t.start,stop:t.stop,cnv:{hidden:t.cnv.hidden,valuecutoff:t.cnv.valuecutoff,focalsizelimit:t.cnv.focalsizelimit},loh:{hidden:t.loh.hidden,valuecutoff:t.loh.valuecutoff,focalsizelimit:t.loh.focalsizelimit},itd:{hidden:t.itd.hidden},sv:{hidden:t.sv.hidden},fusion:{hidden:t.fusion.hidden},snvindel:{excludeclasses:t.snvindel.excludeclasses}};if(t.issvcnv){e.issvcnv=1;e.querykey=t.querykey}else{e.ismutation=1;e.querykeylst=t.querykeylst}return e}if(t.issampleattribute){return{id:t.id,issampleattribute:1,key:t.key}}throw"unknown feature type in making request parameter"}function $(t,s){const i=[];for(const a of t.items){if(a.dt==e){if(a.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){i.push(a)}}else{console.error("getitemforsample_vcf: unknown dt")}}return i}function Z(t,s){const i=[],a=[],n=[],o=[],l=[],r=[];for(const c of t.items){if(c.dt==e){if(!c.sampledata)continue;const t=c.sampledata.find((t=>t.sampleobj.name==s.name));if(!t)continue;r.push({m:c,m_sample:t});continue}if(c.sample!=s.name)continue;if(c.dt==y){i.push(c)}else if(c.dt==g){a.push(c)}else if(c.dt==v){n.push(c)}else if(c.dt==b){o.push(c)}else if(c.dt==_){l.push(c)}else{console.error("unknown dt: "+c.dt)}}return[i,a,n,o,l,r]}function J(e){if(!e.width)e.width=20;if(!e.cnv)e.cnv={};if(!e.cnv.valuecutoff)e.cnv.valuecutoff=.2;if(!Number.isInteger(e.cnv.focalsizelimit))e.cnv.focalsizelimit=2e6;if(!e.cnv.colorgain)e.cnv.colorgain=R;if(!e.cnv.colorloss)e.cnv.colorloss=U;if(!e.loh)e.loh={};if(!e.loh.valuecutoff)e.loh.valuecutoff=.1;if(!Number.isInteger(e.loh.focalsizelimit))e.loh.focalsizelimit=2e6;if(!e.loh.color)e.loh.color=D;if(!e.itd)e.itd={};if(!e.itd.color)e.itd.color=t[d].color;if(!e.sv)e.sv={};if(!e.sv.color)e.sv.color=G;if(!e.fusion)e.fusion={};if(!e.fusion.color)e.fusion.color=G;if(!e.snvindel)e.snvindel={};if(!e.snvindel.excludeclasses)e.snvindel.excludeclasses={}}function K(t){const e=t.holder.append("div").style("margin-bottom","5px");const s=t.holder.append("div").style("margin-bottom","20px");e.append("span").style("margin-right","20px").style("font-size",".8em").text("LEGEND").attr("class","sja_clbtext").on("click",(()=>{if(t.legendtable.style("display")=="none"){j(t.legendtable)}else{M(t.legendtable)}}));t.legendtable=s.append("table").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("border-spacing","10px").style("display","none");e.append("span").style("margin-right","20px").style("font-size",".8em").text("CONFIG").attr("class","sja_clbtext").on("click",(()=>{if(i.style("display")=="none"){j(i)}else{M(i)}}));const i=s.append("div").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("display","none");const a=i.append("div").style("margin","5px");a.append("div").style("vertical-align","top").style("display","inline-block").html("Show features as &nbsp;&nbsp;");const n=a.append("div").style("display","inline-block");const o=[{value:"symbol",text:"CNV on genomic location, others as symbol"},{value:"proportion",text:"All features as porportion"}];o.forEach((e=>{const s=n.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","mutaion_display").attr("value",e.value).property("checked",e.value=="symbol"&&t.ismutation_allsymbolic===undefined&&t.ismutation_allnotsymbolic===undefined?1:e.value=="symbol"&&t.ismutation_allnotsymbolic?1:e.value=="proportion"&&t.ismutation_allsymbolic?1:0).on("change",(function(){if(e.value=="symbol"&&t.ismutation_allnotsymbolic)return;else if(e.value=="proportion"&&t.ismutation_allsymbolic)return;else if(e.value=="symbol"){delete t.ismutation_allsymbolic;t.ismutation_allnotsymbolic=true}else if(e.value=="proportion"){t.ismutation_allsymbolic=true;delete t.ismutation_allnotsymbolic}else{return}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));const l=i.append("div").style("margin","5px");l.append("div").style("vertical-align","top").style("display","inline-block").html("Layout of Matrix &nbsp;&nbsp;");const r=l.append("div").style("display","inline-block");const c=[{value:"gene_on_row",text:"Genes as Rows"},{value:"sam_on_row",text:"Samples as Rows"}];c.forEach((e=>{const s=r.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","layout").attr("value",e.value).property("checked",e.value=="gene_on_row"&&t.features_on_rows?1:e.value=="sam_on_row"&&!t.features_on_rows?1:0).on("change",(function(){if(e.value=="gene_on_row"&&t.features_on_rows)return;else if(e.value=="sam_on_row"&&!t.features_on_rows)return;else if(e.value=="gene_on_row"){t.features_on_rows=true;if(t.ori_feature_width)t.features.forEach((e=>e.height=t.ori_feature_width))}else{t.features_on_rows=false;if(t.ori_feature_height)t.features.forEach((e=>e.width=t.ori_feature_height))}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));e.append("span").style("margin-right","20px").style("font-size",".8em").text("DATA").attr("class","sja_clbtext").on("click",(()=>{Q(t)}));T(t,e)}function Q(t){const e=["sample\tfeature\tvarianttype\tvariant"];for(const s of t.samples){for(const i of t.features){for(const t of i.items){if(t.sample&&t.sample==s.name||t.sampledata&&t.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){e.push(s.name+"\t"+i.label+"\t"+A[t.dt]+"\t"+W(t))}}}}E("Matrix data",[{text:e.join("\n")}])}function W(s){if(s.dt==e)return s.mname+" "+t[s.class].label+" "+s.chr+"."+s.pos+"."+s.ref+"."+s.alt;if(s.dt==_||s.dt==b)return s.chrA+"."+s.posA+"."+(s.strandA||"")+" > "+s.chrB+"."+s.posB+"."+(s.strandB||"");if(s.dt==y)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.value;if(s.dt==g)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.segmean;if(s.dt==v)return s.chr+":"+s.start+"-"+s.stop;return""}export{X as Samplematrix};
1
+ import{z as t,ak as e,Z as s,M as i,j as a,al as n,am as o,b as l,c as r,x as c,q as p,I as h,an as d,a8 as f,af as u,ao as m,ap as y,aq as g,ar as v,as as b,at as _,ah as x,f as w,ae as k,a9 as z,a7 as q,p as j,ac as M,B as A,ab as E}from"./app-b369b169.js";import{v as F}from"./vcf-5cc55588.js";function C(t,e){t.menu.d.append("div").attr("class","sja_menuoption").text("Sort").on("click",(()=>{t.menu.hide();if(e.sort){return}for(const e of t.features){if(e.isgenevalue)delete e.sort}e.sort=1;t.draw_matrix()}))}function L(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV log2(ratio) cutoff&nbsp;");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show CNV with absolute log2(ratio) no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV segment size limit&nbsp;");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the CNV segment length to show only focal events.<br>Set to 0 to cancel.")}}function S(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segmean cutoff&nbsp;");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show LOH with segmean no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segment size limit&nbsp;");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the LOH segment length to show only focal events.<br>Set to 0 to cancel.")}}function N(s,i){{const a=s.menu.d.append("div").style("margin","10px").style("border","solid 1px #ededed");const n=()=>{s.update_singlefeature(i);s.menu.hide()};const o=a.append("table").style("margin","10px").style("border-spacing","1px");const l=o.append("tbody");{const t=l.append("tr");t.append("td").style("opacity",.5).text("CNV");t.append("td").attr("class","sja_menuoption").text(i.cnv.hidden?"Show":"Hide").on("click",(()=>{i.cnv.hidden=!i.cnv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.cnv.hidden;n()}));const e=t.append("td");if(!i.cnv.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();L(s,i,i.cnv)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("LOH");t.append("td").attr("class","sja_menuoption").text(i.loh.hidden?"Show":"Hide").on("click",(()=>{i.loh.hidden=!i.loh.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.loh.hidden;n()}));const e=t.append("td");if(!i.loh.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();S(s,i,i.loh)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("ITD");t.append("td").attr("class","sja_menuoption").text(i.itd.hidden?"Show":"Hide").on("click",(()=>{i.itd.hidden=!i.itd.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.itd.hidden;n()}));t.append("td");if(!i.itd.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("SV");t.append("td").attr("class","sja_menuoption").text(i.sv.hidden?"Show":"Hide").on("click",(()=>{i.sv.hidden=!i.sv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.sv.hidden;n()}));t.append("td");if(!i.sv.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("Fusion");t.append("td").attr("class","sja_menuoption").text(i.fusion.hidden?"show":"hide").on("click",(()=>{i.fusion.hidden=!i.fusion.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("show only").on("click",(()=>{V(i);delete i.fusion.hidden;n()}));t.append("td");if(!i.fusion.hidden);}o.append("tbody").append("tr").append("td").attr("colspan",4).style("padding-top","10px").append("span").style("font-size",".8em").text("List SNV/indel").attr("class","sja_clbtext").on("click",(()=>{if(r.style("display")=="none"){r.style("display","table-row-group")}else{r.style("display","none")}}));const r=o.append("tbody").style("display","none");for(const s in t){const a=t[s];if(a.dt!=e){continue}const o=r.append("tr");o.append("td").style("opacity",.5).text(a.label);o.append("td").attr("class","sja_menuoption").text(i.snvindel.excludeclasses[s]?"Show":"Hide").on("click",(()=>{if(i.snvindel.excludeclasses[s]){delete i.snvindel.excludeclasses[s]}else{i.snvindel.excludeclasses[s]=1}n()}));o.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.snvindel.excludeclasses[s];n()}));o.append("td")}a.append("div").style("margin","10px").append("span").style("font-size",".8em").text("Show all classes").attr("class","sja_clbtext").on("click",(()=>{i.cnv.hidden=false;i.loh.hidden=false;i.itd.hidden=false;i.sv.hidden=false;i.fusion.hidden=false;i.snvindel.excludeclasses={};n()}))}}function V(s){s.cnv.hidden=true;s.loh.hidden=true;s.itd.hidden=true;s.sv.hidden=true;s.fusion.hidden=true;s.snvindel.excludeclasses={};for(const i in t){if(t[i].dt==e)s.snvindel.excludeclasses[i]=1}}function T(t,e){if(!t.mds||!t.mds.survivalplot)return;e.append("span").style("margin-right","20px").style("font-size",".8em").text("SURVIVAL PLOT").attr("class","sja_clbtext").on("click",(e=>{t.menu.clear().showunder(e.target);I(t)}))}async function I(t){const e=t.features.filter((t=>t.ismutation));try{if(e.length!=2)throw"only works with two genomic features.";await B(t,e[0],e[1])}catch(e){t.menu.d.append("div").style("margin","20px").text("Cannot make survival plot: "+(e.message||e))}}async function B(t,e,i){const a=[],n=[],o=[];for(const s of t.samples){const t=e.items.find((t=>t.sample==s.name));const l=i.items.find((t=>t.sample==s.name));if(t){if(l)o.push(s.name);else a.push(s.name)}else{n.push(s.name)}}const l={renderplot:1,samplerule:{full:{},mutated_sets:[{name:e.label+" mutated (n="+a.length+")",samplenames:a},{name:i.label+" mutated (n="+n.length+")",samplenames:n},{name:e.label+" and "+i.label+" mutated (n="+o.length+")",samplenames:o}]}};if(t.limitsamplebyeitherannotation){l.samplerule.full={byattr:1,key:t.limitsamplebyeitherannotation[0].key,value:t.limitsamplebyeitherannotation[0].value,immutable:1}}const r=s({x:100,y:100});r.header.text((t.limitsamplebyeitherannotation?t.limitsamplebyeitherannotation[0].value+" ":"")+"survival by "+e.label+" and "+i.label+" mutation status");const c=await import("./mds.survivalplot-055549f4.js");c.init({mds:t.mds,genome:t.genome,plotlist:[l]},r.body)}const O="na";const R="#D6683C";const U="#67a9cf";const H="#095873";const D="#858585";const G="#858585";const P=8;class X{constructor(t){for(const e in t){this[e]=t[e]}if(this.debugmode)window.smat=this;this.tip=new i({padding:"0px",hideXmute:1,hideYmute:1});this.menu=new i({padding:"0px"});this.errdiv=this.holder.append("div");if(!this.iscustom){try{if(!this.dslabel)throw"not custom data but dslabel is missing";this.mds=this.genome.datasets[this.dslabel];if(!this.mds)throw"invalid dataset name: "+this.dslabel;if(!this.mds.isMds)throw"improper dataset: "+this.dslabel}catch(t){this.error(t)}}K(this);if(this.header){this.holder.append("div").style("margin-bottom","20px").html(this.header)}this.wait_div=this.holder.append("div");this.wait_div.style("display","block").text("Loading...");this.svg=this.holder.append("svg");this.validate_config().then((()=>this.get_features())).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}error(t){a(this.errdiv,t)}async validate_config(){if(this.iscustom){if(!this.querykey2tracks)throw"querykey2tracks missing for custom dataset";let t=true;for(const e in this.querykey2tracks){const s=this.querykey2tracks[e];if(!s.file&&!s.url)throw"no file or url for a custom track by key "+e;if(!s.type)throw"missing type for member track by key "+e;if(!n(s.type))throw"invalid type for a member track: "+s.type;t=false}if(t)throw"no custom tracks from querykey2tracks";let e;for(const t in this.querykey2tracks){const s=this.querykey2tracks[t];if(s.type==o.mdsvcf){e=s}}if(e){await this.may_init_customvcf(e)}}else{if(this.mds.mdsIsUninitiated){const t=await l(`getDataset?genome=${this.genome.name}&dsname=${this.mds.label}`);if(t.error)throw t.error;if(!t.ds)throw"ds missing";Object.assign(this.mds,t.ds);delete this.mds.mdsIsUninitiated}}if(this.limitsamplebyeitherannotation){if(!Array.isArray(this.limitsamplebyeitherannotation))throw"limitsamplebyeitherannotation must be an array";this.legendtable.append("tr");for(const t of this.limitsamplebyeitherannotation){if(!t.key)throw".key missing from an element of limitsamplebyeitherannotation";if(!t.value)throw".value missing from an element of limitsamplebyeitherannotation"}this.showlegend_limitsample()}const t=this.legendtable.append("tr");t.append("td").style("opacity",.5).style("text-align","right").text("CNV cutoff");this.legendtable.cnv_td=t.append("td");const e=this.legendtable.append("tr");e.append("td").style("opacity",.5).style("text-align","right").text("LOH cutoff");this.legendtable.loh_td=e.append("td");if(this.limitbysamplesetgroup){if(!Array.isArray(this.limitbysamplesetgroup.samples))throw".limitbysamplesetgroup.samples is not array"}if(!this.rowspace)this.rowspace=1;if(!this.colspace)this.colspace=1;if(!this.rowlabspace)this.rowlabspace=5;if(!this.collabspace)this.collabspace=5;if(!this.rowlabticksize)this.rowlabticksize=5;if(!this.collabticksize)this.collabticksize=5;if(!this.features)throw"missing features[]";if(!Array.isArray(this.features))throw"features must be an array";if(this.features[0].height)this.ori_feature_height=this.features[0].height;if(this.features[0].width)this.ori_feature_width=this.features[0].width;for(const t of this.features){await this.validate_feature(t)}}showlegend_limitsample(){if(!this.limitsamplebyeitherannotation)return}feature_parseposition_maygene(t){return Promise.resolve().then((()=>{if(t.position){const e=r(t.position,this.genome);if(e){t.chr=e.chr;t.start=e.start;t.stop=e.stop}}if(t.chr){const e=c(this.genome,t.chr,t.start,t.stop);if(e){throw'feature "'+t.label+'" position error: '+e}else{return}}if(!t.genename)throw"position required for a feature: no position or genename given";return p("/genelookup",{input:t.genename,genome:this.genome.name,deep:1}).then((e=>{if(e.error)throw e.error;if(!e.gmlst||e.gmlst.length==0)throw"no gene can be found for "+t.genename;const s=[];for(const t of e.gmlst){let e=true;for(const i of s){if(t.chr==i.chr&&Math.max(t.start,i.start)<Math.min(t.stop,i.stop)){e=false;i.start=Math.min(i.start,t.start);i.stop=Math.max(i.stop,t.stop);break}}if(e){s.push({chr:t.chr,start:t.start,stop:t.stop})}}if(s.length>1){a(this.errdiv,"multiple regions found for gene "+t.genename+" you'd better specify one in feature")}t.chr=s[0].chr;t.start=s[0].start;t.stop=s[0].stop}))}))}validate_feature(e){return Promise.resolve().then((()=>{e.id=Math.random().toString();const s=this.legendtable.append("tr");e.legend_tr=s;if(e.isgenevalue){if(!e.genename)throw".genename missing for isgenevalue feature";e.label=e.genename+" expression";if(this.dslabel){if(!e.querykey)throw".querykey missing for isgenevalue feature while loading from official dataset"}if(!e.scale)e.scale={auto:1};if(e.missingvalue==undefined)e.missingvalue=0;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.color)e.color=H;return this.feature_parseposition_maygene(e)}if(e.iscnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for iscnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.colorgain)e.colorgain=R;if(!e.colorloss)e.colorloss=U;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isloh){if(this.dslabel){if(!e.querykey)throw".querykey missing for isloh feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" LOH"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.color)e.color=D;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" LOH";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isvcf){if(this.dslabel){if(!e.querykey)throw".querykey missing for isvcf feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SNV/indel"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.snvindel)e.snvindel={};return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SNV/indel"}))}if(e.isitd){if(this.dslabel){if(!e.querykey)throw".querykey missing for isitd feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" ITD"}if(!e.width)e.width=20;if(!e.color)e.color=t[d].color;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");e.legendholder.append("div").style("width","20px").html("&nbsp;").style("background",e.color);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" ITD"}))}if(e.issvfusion){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvfusion feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SV/fusion"}if(!e.width)e.width=20;if(!e.color)e.color=G;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SV/fusion"}))}if(e.issvcnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvcnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV/SV"}s.append("td").text(e.label).style("color","#858585").style("text-align","right");e.legendholder=s.append("td");J(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV/SV"}))}if(e.ismutation){if(this.dslabel){if(!e.querykeylst)throw".querykeylst missing for ismutation feature";if(!Array.isArray(e.querykeylst))throw".querykeylst[] should be array for ismutation feature";if(e.querykeylst.length==0)throw"querykeylst[] empty array for ismutation feature"}if(!e.label&&e.genename){e.label=e.genename+" mutation"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");J(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" mutation";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.issampleattribute){if(!this.dslabel)throw".dslabel missing: sampleattribute only works for official dataset";if(!e.key)throw".key missing for issampleattribute feature";if(!e.label)e.label=e.key;if(this.mds&&this.mds.sampleAttribute&&this.mds.sampleAttribute.attributes){const t=this.mds.sampleAttribute.attributes[e.key];if(t){e.values=t.values}}if(!e.values){e.values={}}e.assignmissingcolor=f(u);if(!e.width&&!this.features_on_rows)e.width=20;else if(!e.height&&this.features_on_rows)e.height=50;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return Promise.resolve()}throw"unknown feature type in validating feature"}))}get_features(t){this.max_cnv=0;this.min_cnv=0;this.max_loh=0;this.min_loh=0;const e={genome:this.genome.name,limitsamplebyeitherannotation:this.limitsamplebyeitherannotation,features:(t||this.features).map(Y)};if(this.limitbysamplesetgroup){e.sampleset=this.limitbysamplesetgroup.samples}if(this.iscustom){e.iscustom=1;e.querykey2tracks={};for(const t of e.features){if(t.querykey){e.querykey2tracks[t.querykey]=this.querykey2tracks[t.querykey]}else if(t.querykeylst){for(const s of t.querykeylst)e.querykey2tracks[s]=this.querykey2tracks[s]}}}else{e.dslabel=this.mds.label}return p("/samplematrix",e).then((t=>{if(t.error){for(const t of e.features){const e=this.features.find((e=>e.id==t.id));if(e)e.items=[]}throw t.error}for(const e of t.results){const t=this.features.find((t=>t.id==e.id));if(!t)throw"feature not found: "+t.id;t.items=e.items;this.prep_featuredata(t)}this.draw_matrix();this.make_legend();this.wait_div.style("display","none")}))}update_singlefeature(t){this.get_features([t]).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}addnewfeature_update(t){this.features.push(t);this.validate_feature(t).then((()=>this.get_features([t]))).catch((t=>{this.error(typeof t=="string"?t:t.message);if(t.stack)console.log(t.stack)}))}prep_featuredata(t){if(t.isgenevalue){t.scale.maxv=0;t.scale.minv=0;for(const e of t.items){t.scale.maxv=Math.max(t.scale.maxv,e.value)}return}if(t.iscnv){const e=[],s=[];for(const i of t.items){if(i.value>0){e.push(i.value)}else{s.push(-i.value)}}const i=m(e,0);const a=m(s,0);t.maxabslogratio=Math.max(i,a);if(t.maxabslogratio>this.max_cnv)this.max_cnv=t.maxabslogratio;return}if(t.isloh){const e=t.items.map((t=>t.segmean));t.minvalue=0;t.maxvalue=Math.max(...e);if(t.maxvalue>this.max_loh)this.max_loh=t.maxvalue;return}if(t.isvcf){return}if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv||t.ismutation){const e=[],s=[];let i=0;for(const a of t.items){if(a.dt==y){if(a.value>0){e.push(a.value)}else{s.push(-a.value)}}else if(a.dt==g){i=Math.max(a.segmean,i)}}if(e.length+s.length>0){const i=m(e,0);const a=m(s,0);t.cnv.maxabslogratio=Math.max(i,a);if(t.cnv.maxabslogratio>this.max_cnv){this.max_cnv=t.cnv.maxabslogratio;this.min_cnv=-t.cnv.maxabslogratio;this.cnv_colorloss=t.cnv.colorloss;this.cnv_colorgain=t.cnv.colorgain}}if(i){t.loh.minvalue=0;t.loh.maxvalue=i;if(t.loh.maxvalue>this.max_loh)this.max_loh=t.loh.maxvalue;this.loh_color=t.loh.color}return}if(t.issampleattribute){for(const e of t.items){if(!t.values[e.value]){t.values[e.value]={name:e.value,color:t.assignmissingcolor(e.value)}}}return}throw"unknown feature type in preparing feature data"}make_legend(){for(const s of this.features){const i=s.legendholder;i.selectAll("*").remove();if(s.isgenevalue){i.append("span").text(s.scale.minv.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.scale.maxv.toFixed(3));continue}if(s.iscnv){i.append("span").html('Gain <span style="background:'+s.colorgain+';color:white;padding:1px 5px">'+s.maxabslogratio.toFixed(3)+"</span> &nbsp; "+'Loss <span style="background:'+s.colorloss+';color:white;padding:1px 5px">-'+s.maxabslogratio.toFixed(3)+"</span>");continue}if(s.isloh){i.append("span").text(s.minvalue.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.maxvalue.toFixed(3));continue}if(s.isvcf){const e=new Set;for(const t of s.items){if(t.class){e.add(t.class)}}for(const s of e){const e=i.append("div").style("display","inline-block").style("margin-right","10px");e.append("span").style("background",t[s].color).style("margin-right","2px").html("&nbsp;&nbsp;&nbsp;");e.append("span").text(t[s].label).style("color",t[s].color)}continue}if(s.isitd){continue}if(s.issvfusion){continue}if(s.issvcnv||s.ismutation){const a=new Map;let n=0;let o=0;let l=0;for(const t of s.items){if(t.dt==e){if(t.class&&t.sampledata){if(!a.has(t.class)){a.set(t.class,0)}a.set(t.class,a.get(t.class)+t.sampledata.length)}}else if(t.dt==v){n++}else if(t.dt==b){o++}else if(t.dt==_){l++}}if(a.size+n+o+l>0){const e=i.append("div").style("margin-bottom","5px").style("white-space","nowrap");for(const[s,i]of a){const a=t[s];const n=e.append("div").style("display","inline-block").style("margin-right","20px");n.append("span").attr("class","sja_mcdot").style("background",a.color).text(i);n.append("span").text(a.label).style("color",a.color)}if(n){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.itd.color).text(n);t.append("span").text("ITD")}if(o){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.sv.color).text(o);t.append("span").text("SV")}if(l){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.fusion.color).text(l);t.append("span").text("Fusion")}}continue}if(s.issampleattribute){const t=new Map;for(const e of this.samples){const i=s.items.find((t=>t.sample==e.name));if(i){t.set(i.value,(t.get(i.value)||0)+1)}}for(const[e,a]of t){const t=i.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.values[e].color).text(a);t.append("span").text(s.values[e].name)}continue}throw"unknown feature type in making legend"}this.makeGlobalCnvLohLegend()}makeGlobalCnvLohLegend(){const t=[{type:"cnv",legend_label:"CNV log2(ratio): "},{type:"loh",legend_label:"LOH seg.mean: "}];const e=parseFloat(this.min_cnv.toFixed(3));const s=parseFloat(this.max_cnv.toFixed(3));const i=parseFloat(this.min_loh.toFixed(3));const a=parseFloat(this.max_loh.toFixed(3));let n=false;t.forEach((t=>{let o=t.type=="cnv"?this.min_cnv:this.min_loh;let l=t.type=="cnv"?this.max_cnv:this.max_loh;const r=t.type=="cnv"?this.legendtable.cnv_td:this.legendtable.loh_td;const c=r.append("div").style("margin-bottom","5px");c.append("span").text(t.legend_label);const p=c.append("span").text(o.toFixed(3));const h=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",o.toFixed(3));if(t.type=="cnv"){c.append("div").style("margin","4px 0 1px 10px").style("display","inline-block").style("width","50px").style("height","15px").style("background","linear-gradient( to right,"+this.cnv_colorloss+",white)")}c.append("div").style("margin","4px 10px 1px 10px").style("margin-left",t.type=="cnv"?"0":"10px").style("display","inline-block").style("width",t.type=="cnv"?"50px":"100px").style("height","15px").style("background","linear-gradient( to right, white, "+(t.type=="cnv"?this.cnv_colorgain:this.loh_color)+")");const d=c.append("span").text(l.toFixed(3));const f=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",l.toFixed(3));const u=c.append("button").style("margin","2px 5px").style("padding","3px 10px").text("Edit").on("click",(()=>{p.style("display","none");d.style("display","none");h.style("display","inline-block");f.style("display","inline-block");u.style("display","none");m.style("display","inline-block")}));const m=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Submit").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=h.property("value");this.max_cnv=l=f.property("value");if(this.min_cnv!=e||this.max_cnv!=s)n=true}else{this.min_loh=o=parseFloat(h.property("value"));this.max_loh=l=parseFloat(f.property("value"));if(this.min_loh!=i||this.max_loh!=a)n=true}p.style("display","inline-block").text(parseFloat(o).toFixed(3));d.style("display","inline-block").text(parseFloat(l).toFixed(3));h.style("display","none");f.style("display","none");u.style("display","inline-block");m.style("display","none");y.style("display",n?"inline-block":"none");this.draw_matrix()}));const y=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Reset").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=e;this.max_cnv=l=s}else{this.min_loh=o=i;this.max_loh=l=a}p.text(parseFloat(o).toFixed(3));d.text(parseFloat(l).toFixed(3));h.property("value",parseFloat(o).toFixed(3));f.property("value",parseFloat(l).toFixed(3));y.style("display","none");n=false;this.draw_matrix()}));y.style("display","none")}))}gatherSamplesFromFeatureData(){const t=new Map;for(const s of this.features){if(s.donotaddsample){continue}if(s.isgenevalue||s.iscnv||s.isloh||s.isitd||s.issvfusion||s.issvcnv){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else if(s.isvcf){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{console.error("unsupported dt from isvcf: "+i.dt)}}}else if(s.ismutation){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{if(!i.sample)continue;if(!t.has(i.sample)){t.set(i.sample,{})}}}}else if(s.issampleattribute){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else{console.error("unknown feature type from this.data")}}const s=Math.min(18,Math.max(1,Math.ceil(800/t.size)));this.samples=[];for(const[e,i]of t){if(!this.features_on_rows)i.height=s;else i.width=s;i.name=e;this.samples.push(i)}}draw_matrix(){this.svg.selectAll("*").remove();const t=this.svg.append("g");this.gatherSamplesFromFeatureData();this.sortsamplesbyfeatures();const e=this.features_on_rows?this.features:this.samples;const s=this.features_on_rows?this.samples:this.features;let i=0,a=0;for(const s of e){s.g=t.append("g").attr("transform","translate(0,"+i+")");i+=s.height+this.rowspace;if(s.height>=P){s.g.append("text").attr("font-family",x).attr("font-size",Math.min(16,s.height)).attr("text-anchor","end").attr("dominant-baseline","central").attr("x",-this.rowlabspace-this.rowlabticksize).attr("y",s.height/2).text(this.features_on_rows?s.label+(s.count?" ("+s.count+")":""):s.name).each((function(){a=Math.max(a,this.getBBox().width)})).attr("class","sja_clbtext").on("mouseover",(()=>{this.features_on_rows?this.showTip_feature(s):this.showTip_sample(s)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(this.features_on_rows)this.showMenu_feature(s)}));s.g.append("line").attr("x1",-this.rowlabticksize).attr("y1",s.height/2).attr("y2",s.height/2).attr("stroke","black").attr("shape-rendering","crispEdges")}}let n=0,o=0;for(const e of s){const s=t.append("g").attr("transform","translate("+(n+e.width/2)+",-"+(this.collabspace+this.collabticksize)+")");n+=e.width+this.colspace;const i=s.append("text").attr("font-family",x).attr("font-size",Math.min(16,e.width-2)).attr("dominant-baseline","central").attr("transform","rotate(-90)").text(this.features_on_rows?e.name:e.label+(e.count?" ("+e.count+")":"")).each((function(){o=Math.max(o,this.getBBox().width)})).on("mouseover",(()=>{this.features_on_rows?this.showTip_sample(e):this.showTip_feature(e)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(!this.features_on_rows)this.showMenu_feature(e)}));if(e.isgenevalue){i.attr("fill",e.color)}s.append("line").attr("y1",this.collabspace).attr("y2",this.collabspace+this.collabticksize).attr("stroke","black").attr("shape-rendering","crispEdges")}for(const t of e){let e=0;for(const i of s){const s=this.features_on_rows?i:t;const a=this.features_on_rows?t:i;const n=t.g.append("g").attr("transform","translate("+e+",0)");e+=i.width+this.colspace;if(a.isgenevalue){this.drawCell_isgenevalue(s,a,n)}else if(a.iscnv){this.drawCell_iscnv(s,a,n)}else if(a.isloh){this.drawCell_isloh(s,a,n)}else if(a.isvcf){this.drawCell_isvcf(s,a,n)}else if(a.isitd){this.drawCell_isitd(s,a,n)}else if(a.issvfusion){this.drawCell_issvfusion(s,a,n)}else if(a.issvcnv||a.ismutation){this.drawCell_ismutation(s,a,n)}else if(a.issampleattribute){this.drawCell_issampleattribute(s,a,n)}else{console.error("unknown feature type when drawing cell")}}}t.attr("transform","translate("+(a+this.rowlabspace+this.rowlabticksize)+","+(o+this.collabspace+this.collabticksize)+")");this.svg.attr("width",a+this.rowlabspace+this.rowlabticksize+s.reduce(((t,e)=>t+e.width),0)+s.length*this.colspace).attr("height",o+this.collabspace+this.collabticksize+e.reduce(((t,e)=>t+e.height),0)+e.length*this.rowspace)}drawCell_isgenevalue(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}const o=s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}));if(n.value<e.scale.maxv){o.attr("fill-opacity",n.value/e.scale.maxv)}}drawCell_iscnv(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const i of n){const a=e.coordscale(Math.max(e.start,i.start));const n=e.coordscale(Math.min(e.stop,i.stop));const o=this.max_cnv;s.append("rect").attr("x",a).attr("width",Math.max(1,n-a)).attr("height",t.height).attr("fill",i.value>0?e.colorgain:e.colorloss).attr("fill-opacity",Math.abs(i.value/o)).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isloh(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const t of n){const n=e.coordscale(Math.max(e.start,t.start));const o=e.coordscale(Math.min(e.stop,t.stop));const l=this.max_loh-this.min_loh;s.append("rect").attr("x",this.features_on_rows?0:n).attr("y",this.features_on_rows?n:0).attr("width",this.features_on_rows?a:Math.max(1,o-n)).attr("height",this.features_on_rows?Math.max(1,o-n):i).attr("fill",e.color).attr("fill-opacity",(t.segmean-this.min_loh)/l).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isvcf(e,s,i){const a=this.features_on_rows?s.height:e.height;const n=this.features_on_rows?e.width:s.width;const o=$(s,e);if(o.length==0){this.drawEmptycell(e,s,i);return}const l=new Map;for(const t of o){if(!l.has(t.class)){l.set(t.class,0)}l.set(t.class,l.get(t.class)+1)}let r=0;for(const[e,s]of l){const l=s/o.length*this.features_on_rows?a:n;i.append("rect").attr("x",this.features_on_rows?0:r).attr("y",this.features_on_rows?r:0).attr("width",this.features_on_rows?n:l).attr("height",this.features_on_rows?l:a).attr("fill",t[e].color).attr("shape-rendering","crispEdges");r+=l}i.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",n).attr("height",a).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_isitd(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issampleattribute(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.values[n.value].color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issvfusion(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_ismutation(e,s,i){const[a,n,o,l,r,c]=Z(s,e);const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;if(a.length+n.length+o.length+l.length+r.length+c.length==0){this.drawEmptycell(e,s,i);return}let d=false;if(this.ismutation_allsymbolic){d=true}else if(this.ismutation_allnotsymbolic);else{if(p<=4){d=true}}if(d){this.drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c)}else{if(n.length){for(const t of n){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=this.max_loh-this.min_loh;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.loh.color).attr("fill-opacity",(t.segmean-this.min_loh)/n).attr("shape-rendering","crispEdges")}}if(a.length){for(const t of a){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=t.value>0?this.max_cnv:this.min_cnv;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",t.value>0?s.cnv.colorgain:s.cnv.colorloss).attr("fill-opacity",Math.abs(t.value/n)).attr("shape-rendering","crispEdges")}}if(o.length){for(const t of o){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.itd.color).attr("shape-rendering","crispEdges")}}if(l.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.sv.color).attr("fill","none")}if(r.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.fusion.color).attr("fill","none")}if(c.length){const e=c[0];const s=i.append("g").attr("transform","translate("+h/2+","+p/2+")");const a=t[e.m.class].color;const n=Math.min(h,p)/2;s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke",a);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke",a)}}i.append("rect").attr("width",h).attr("height",p).attr("fill","white").attr("fill-opacity",0).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c){const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;const d=this.max_loh-this.min_loh;const f=[];if(a.length){for(const t of a){const e=t.value>0?this.max_cnv:this.min_cnv;let i;if(t.value>0){i={color:s.cnv.colorgain}}else{i={color:s.cnv.colorloss}}i.opacity=Math.abs(t.value/e);f.push(i)}}if(n.length){for(const t of n){f.push({color:s.loh.color,opacity:(t.segmean-this.min_loh)/d})}}if(o.length){for(const t of o){f.push({color:s.itd.color})}}if(l.length){for(const t of l){f.push({color:s.sv.color})}}if(r.length){for(const t of r){f.push({color:s.fusion.color})}}if(c.length){for(const e of c){f.push({color:t[e.m.class].color})}}const u=this.features_on_rows?p/f.length:h/f.length;let m=0;for(const t of f){const e=i.append("rect").attr("x",this.features_on_rows?0:m).attr("y",this.features_on_rows?m:0).attr("width",this.features_on_rows?h:u).attr("height",this.features_on_rows?u:p).attr("fill",t.color).attr("shape-rendering","crispEdges");if(t.opacity)e.attr("opacity",t.opacity);m+=u}}async click_cell(t,e){try{let i;if(this.iscustom){i={iscustom:true,type:o.mdssvcnv,singlesample:{name:t.name}};for(const t in this.querykey2tracks){const e=this.querykey2tracks[t];if(e.type==o.mdssvcnv){i.name=e.name||"Custom tk";i.file=e.file;i.url=e.url;i.indexURL=e.indexURL}else if(e.type==o.mdsvcf){i.checkvcf={file:e.file,url:e.url,indexURL:e.indexURL}}else if(e.type==o.mdsexpression){i.checkexpressionrank={file:e.file,url:e.url,indexURL:e.indexURL}}}}else{if(!this.mds)throw"not custom but .mds{} missing";for(const e in this.mds.queries){const s=this.mds.queries[e];if(s.type==o.mdssvcnv){i={mds:this.mds,querykey:e,singlesample:{name:t.name}};for(const t in s)i[t]=s[t];break}}}if(!i)throw"cannot find a svcnv tk";i.bplengthUpperLimit=0;const a=s({x:100,y:100});const n={jwt:this.jwt,hostURL:this.hostURL,nobox:1,genome:this.genome,holder:a.body,chr:e.chr,start:e.start,stop:e.stop,tklst:[]};w(this.genome,n.tklst);n.tklst.push(i);if(!this.iscustom){if(!this.dslabel)throw"not custom but dslabel missing";const e={genome:this.genome.name,dslabel:this.dslabel,querykey:i.querykey,gettrack4singlesample:t.name};const s=await p("/mdssvcnv",e);if(s.error)throw"Error checking for assay track: "+s.error;if(s.tracks){for(const t of s.tracks)n.tklst.push(t)}}const l=await import("./block-6aedd569.js").then((function(t){return t.c}));new l.Block(n)}catch(t){window.alert(t.message||t);if(t.stack)console.log(t.stack)}}showTip_feature(t){this.tip.clear();this.tipContent_feature(t,this.tip.d);this.tip.showunder(event.target)}showMenu_feature(t){this.menu.showunder(event.target).clear();this.tipContent_feature(t,this.menu.d);this.menu.d.append("div").attr("class","sja_menuoption").text("Remove this feature").on("click",(()=>{this.menu.hide();t.legend_tr.remove();this.features.splice(this.features.findIndex((e=>e.id==t.id)),1);this.draw_matrix()}));if(t.isgenevalue)return C(this,t);if(t.iscnv)return L(this,t,t);if(t.isloh)return S(this,t,t);if(t.ismutation)return N(this,t);if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv){return}if(t.issampleattribute){return}}tipContent_feature(t,e){e.append("div").text(t.label).style("opacity",.5).style("font-size",".7em").style("margin","10px");if(t.isgenevalue||t.iscnv||t.isloh||t.isitd||t.issvfusion){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" &nbsp; "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}else if(t.issvcnv||t.ismutation){if(!t.genename){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" &nbsp; "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}else if(t.issampleattribute){e.append("div").text(t.label)}if(t.isgenevalue){e.append("div").text("Min: "+t.scale.minv+", max: "+t.scale.maxv).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}showTip_sample(e){this.tip.clear().d.append("div").text(e.name).style("padding","10px").style("font-size",".7em");const s=[];for(const i of this.features){if(s.length>10){s.push({k:"more",v:"..."});break}if(i.isgenevalue){const t=i.items.find((t=>t.sample==e.name));s.push({k:i.label,v:t?t.value:O});continue}if(i.iscnv){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?i.colorgain:i.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isloh){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+i.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isvcf){const a=$(i,e);let n;if(a.length==0){n=O}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}s.push({k:i.label,v:n});continue}if(i.isitd){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{a='<div style="background:'+i.color+';width:20px">&nbsp;</div>'}s.push({k:i.label,v:a});continue}if(i.issvfusion){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{a='<div style="background:'+i.color+';width:20px">&nbsp;</div>'}s.push({k:i.label,v:a});continue}if(i.issvcnv){continue}if(i.ismutation){continue}if(i.issampleattribute){const t=i.items.find((t=>t.sample==e.name));if(t){s.push({k:i.label,v:t.value})}continue}console.error("sample tooltip: Unknown feature type")}z(this.tip.d,s);this.tip.show(event.clientX,event.clientY)}showTip_cell(e,s){const i=[{k:"sample",v:e.name}];if(s.isgenevalue){const t=s.items.find((t=>t.sample==e.name));i.push({k:s.label,v:t?t.value:O})}else if(s.iscnv){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?s.colorgain:s.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isloh){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+s.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isvcf){const a=$(s,e);let n;if(a.length==0){n=O}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}i.push({k:s.label,v:n})}else if(s.isitd){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvfusion){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=O}else{const e=t.map((t=>"<div>"+t.chrA+":"+t.posA+" - "+t.chrB+":"+t.posB+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvcnv||s.ismutation){const[a,n,o,l,r,c]=Z(s,e);if(a.length){i.push({k:(s.genename||s.label)+" CNV",v:a.map((t=>"<div>"+'<span style="background:'+(t.value>0?s.cnv.colorgain:s.cnv.colorloss)+';color:white;padding:0px 3px">'+t.value+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" &nbsp;&nbsp;"+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(n.length){i.push({k:(s.genename||s.label)+" LOH",v:n.map((t=>"<div>"+'<span style="background:'+s.loh.color+';color:white;padding:0px 3px">'+t.segmean+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" &nbsp;&nbsp;"+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(o.length){i.push({k:(s.genename||s.label)+" ITD",v:o.map((t=>'<div style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+"</div>")).join("")})}if(l.length){i.push({k:(s.genename||s.label)+" SV",v:l.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" &gt; "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(r.length){i.push({k:(s.genename||s.label)+" fusion",v:r.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" &gt; "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(c.length){i.push({k:(s.genename||s.label)+" SNV/indel",v:c.map((e=>{const s=t[e.m.class];return"<div>"+'<span style="color:'+s.color+'">'+(e.m.mname||"")+"</span> "+'<span style="font-size:.7em;opacity:.5">'+s.label+"</span>"+"</div>"})).join("")})}}else if(s.issampleattribute){const t=s.items.find((t=>t.sample==e.name));if(t){i.push({k:s.label,v:t.value})}}else{console.error("cell tooltip: unknown feature type")}this.tip.clear();z(this.tip.d,i);this.tip.show(event.clientX,event.clientY)}sortsamplesbyfeatures(){const t=this.features.find((t=>t.isgenevalue&&t.sort));if(t&&t.items){const e=new Map;for(const s of t.items){e.set(s.sample,s.value)}this.samples.sort(((s,i)=>{const a=e.has(s.name)?e.get(s.name):t.missingvalue;const n=e.has(i.name)?e.get(i.name):t.missingvalue;return n-a}))}}may_init_customvcf(t){if(t.info)return;const e=["genome="+this.genome.name];if(t.file){e.push("file="+t.file)}else{e.push("url="+t.url);if(t.indexURL)e.push("indexURL="+t.indexURL)}return q("vcfheader?"+e.join("&")).then((e=>{const[s,i,a,n]=F(e.metastr.split("\n"));if(n)throw"Error parsing VCF meta lines: "+n.join("; ");t.info=s;t.format=i;t.samples=a;t.nochr=e.nochr}))}drawEmptycell(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;if(i<5)return;s.append("line").attr("x2",a).attr("y2",i).attr("stroke","#ededed")}}function Y(t){if(t.isgenevalue){return{id:t.id,isgenevalue:1,querykey:t.querykey,genename:t.genename,chr:t.chr,start:t.start,stop:t.stop}}if(t.iscnv){return{id:t.id,iscnv:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isloh){return{id:t.id,isloh:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isvcf){return{id:t.id,isvcf:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,snvindel:{excludeclasses:t.snvindel.excludeclasses}}}if(t.isitd){return{id:t.id,isitd:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvfusion){return{id:t.id,issvfusion:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvcnv||t.ismutation){const e={id:t.id,chr:t.chr,start:t.start,stop:t.stop,cnv:{hidden:t.cnv.hidden,valuecutoff:t.cnv.valuecutoff,focalsizelimit:t.cnv.focalsizelimit},loh:{hidden:t.loh.hidden,valuecutoff:t.loh.valuecutoff,focalsizelimit:t.loh.focalsizelimit},itd:{hidden:t.itd.hidden},sv:{hidden:t.sv.hidden},fusion:{hidden:t.fusion.hidden},snvindel:{excludeclasses:t.snvindel.excludeclasses}};if(t.issvcnv){e.issvcnv=1;e.querykey=t.querykey}else{e.ismutation=1;e.querykeylst=t.querykeylst}return e}if(t.issampleattribute){return{id:t.id,issampleattribute:1,key:t.key}}throw"unknown feature type in making request parameter"}function $(t,s){const i=[];for(const a of t.items){if(a.dt==e){if(a.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){i.push(a)}}else{console.error("getitemforsample_vcf: unknown dt")}}return i}function Z(t,s){const i=[],a=[],n=[],o=[],l=[],r=[];for(const c of t.items){if(c.dt==e){if(!c.sampledata)continue;const t=c.sampledata.find((t=>t.sampleobj.name==s.name));if(!t)continue;r.push({m:c,m_sample:t});continue}if(c.sample!=s.name)continue;if(c.dt==y){i.push(c)}else if(c.dt==g){a.push(c)}else if(c.dt==v){n.push(c)}else if(c.dt==b){o.push(c)}else if(c.dt==_){l.push(c)}else{console.error("unknown dt: "+c.dt)}}return[i,a,n,o,l,r]}function J(e){if(!e.width)e.width=20;if(!e.cnv)e.cnv={};if(!e.cnv.valuecutoff)e.cnv.valuecutoff=.2;if(!Number.isInteger(e.cnv.focalsizelimit))e.cnv.focalsizelimit=2e6;if(!e.cnv.colorgain)e.cnv.colorgain=R;if(!e.cnv.colorloss)e.cnv.colorloss=U;if(!e.loh)e.loh={};if(!e.loh.valuecutoff)e.loh.valuecutoff=.1;if(!Number.isInteger(e.loh.focalsizelimit))e.loh.focalsizelimit=2e6;if(!e.loh.color)e.loh.color=D;if(!e.itd)e.itd={};if(!e.itd.color)e.itd.color=t[d].color;if(!e.sv)e.sv={};if(!e.sv.color)e.sv.color=G;if(!e.fusion)e.fusion={};if(!e.fusion.color)e.fusion.color=G;if(!e.snvindel)e.snvindel={};if(!e.snvindel.excludeclasses)e.snvindel.excludeclasses={}}function K(t){const e=t.holder.append("div").style("margin-bottom","5px");const s=t.holder.append("div").style("margin-bottom","20px");e.append("span").style("margin-right","20px").style("font-size",".8em").text("LEGEND").attr("class","sja_clbtext").on("click",(()=>{if(t.legendtable.style("display")=="none"){j(t.legendtable)}else{M(t.legendtable)}}));t.legendtable=s.append("table").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("border-spacing","10px").style("display","none");e.append("span").style("margin-right","20px").style("font-size",".8em").text("CONFIG").attr("class","sja_clbtext").on("click",(()=>{if(i.style("display")=="none"){j(i)}else{M(i)}}));const i=s.append("div").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("display","none");const a=i.append("div").style("margin","5px");a.append("div").style("vertical-align","top").style("display","inline-block").html("Show features as &nbsp;&nbsp;");const n=a.append("div").style("display","inline-block");const o=[{value:"symbol",text:"CNV on genomic location, others as symbol"},{value:"proportion",text:"All features as porportion"}];o.forEach((e=>{const s=n.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","mutaion_display").attr("value",e.value).property("checked",e.value=="symbol"&&t.ismutation_allsymbolic===undefined&&t.ismutation_allnotsymbolic===undefined?1:e.value=="symbol"&&t.ismutation_allnotsymbolic?1:e.value=="proportion"&&t.ismutation_allsymbolic?1:0).on("change",(function(){if(e.value=="symbol"&&t.ismutation_allnotsymbolic)return;else if(e.value=="proportion"&&t.ismutation_allsymbolic)return;else if(e.value=="symbol"){delete t.ismutation_allsymbolic;t.ismutation_allnotsymbolic=true}else if(e.value=="proportion"){t.ismutation_allsymbolic=true;delete t.ismutation_allnotsymbolic}else{return}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));const l=i.append("div").style("margin","5px");l.append("div").style("vertical-align","top").style("display","inline-block").html("Layout of Matrix &nbsp;&nbsp;");const r=l.append("div").style("display","inline-block");const c=[{value:"gene_on_row",text:"Genes as Rows"},{value:"sam_on_row",text:"Samples as Rows"}];c.forEach((e=>{const s=r.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","layout").attr("value",e.value).property("checked",e.value=="gene_on_row"&&t.features_on_rows?1:e.value=="sam_on_row"&&!t.features_on_rows?1:0).on("change",(function(){if(e.value=="gene_on_row"&&t.features_on_rows)return;else if(e.value=="sam_on_row"&&!t.features_on_rows)return;else if(e.value=="gene_on_row"){t.features_on_rows=true;if(t.ori_feature_width)t.features.forEach((e=>e.height=t.ori_feature_width))}else{t.features_on_rows=false;if(t.ori_feature_height)t.features.forEach((e=>e.width=t.ori_feature_height))}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));e.append("span").style("margin-right","20px").style("font-size",".8em").text("DATA").attr("class","sja_clbtext").on("click",(()=>{Q(t)}));T(t,e)}function Q(t){const e=["sample\tfeature\tvarianttype\tvariant"];for(const s of t.samples){for(const i of t.features){for(const t of i.items){if(t.sample&&t.sample==s.name||t.sampledata&&t.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){e.push(s.name+"\t"+i.label+"\t"+A[t.dt]+"\t"+W(t))}}}}E("Matrix data",[{text:e.join("\n")}])}function W(s){if(s.dt==e)return s.mname+" "+t[s.class].label+" "+s.chr+"."+s.pos+"."+s.ref+"."+s.alt;if(s.dt==_||s.dt==b)return s.chrA+"."+s.posA+"."+(s.strandA||"")+" > "+s.chrB+"."+s.posB+"."+(s.strandB||"");if(s.dt==y)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.value;if(s.dt==g)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.segmean;if(s.dt==v)return s.chr+":"+s.start+"-"+s.stop;return""}export{X as Samplematrix};
@@ -0,0 +1 @@
1
+ import{h as t,d as e,I as s,P as a,U as i}from"./app-b369b169.js";import{controlsInit as n}from"./controls-287e6efa.js";import{c as r}from"./partjson.esm-b3f1fc21.js";import{a as o,b as c}from"./axis-747c801e.js";import"./controls.btns-79b805dd.js";import"./controls.config-28d6d6a8.js";import"./termsetting-33ea66f1.js";import"./tslib.es6-c3c2d88f.js";import"path";class l{constructor(t){this.type="scatter"}async init(){const t=this.opts.controls?this.opts.holder:this.opts.holder.append("div");this.dom={header:this.opts.header,controls:this.opts.controls?null:holder.append("div"),div:t};this.settings={};if(this.dom.header)this.dom.header.html("Scatter Plot");await this.setControls();h(this);p(this)}async setControls(){if(this.opts.controls){this.opts.controls.on("downloadClick.boxplot",this.download)}else{this.components={controls:await n({app:this.app,id:this.id,holder:this.dom.controls.attr("class","pp-termdb-plot-controls"),inputs:["term1","overlay","divideBy"]})};this.components.controls.on("downloadClick.boxplot",this.download)}}getState(t){const e=t.plots.find((t=>t.id===this.id));if(!e){throw`No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`}return{activeCohort:t.activeCohort,termfilter:t.termfilter,config:{term:e.term,term0:e.term0,term2:e.term2,settings:{common:e.settings.common,scatter:JSON.parse(JSON.stringify(e.settings.scatter))}}}}async main(){try{this.config=structuredClone(this.state.config);if(this.dom.header)this.dom.header.html(this.config.term.term.name+" vs "+this.config.term2.term.name);a(this.settings,this.state.config.settings.scatter);if(!this.pj)this.pj=m(this);const t=this.getDataRequestOpts();this.currData=await this.app.vocabApi.getNestedChartSeriesData(t);this.app.vocabApi.syncTermData(this.state.config,this.currData);this.pj.refresh({data:this.currData.rows});this.render()}catch(t){throw t}}getDataRequestOpts(){const t=this.config;const e={chartType:"scatter",term:t.term,filter:this.state.termfilter.filter};if(t.term2)e.term2=t.term2;if(t.term0)e.term0=t.term0;if(this.state.ssid)e.ssid=this.state.ssid;return e}}const d=t(l);function p(t){t.render=function(){const e=t.dom.div.selectAll(".pp-scatter-chart").data(t.pj.tree.charts,(t=>t.chartId));e.exit().remove();e.each(t.updateCharts);e.enter().each(t.addCharts);t.dom.div.style("display","block");t.dom.div.on("mouseover",t.mouseover).on("mouseout",t.mouseout)};t.addCharts=function(s){const i=t.settings;const n=e(this).append("div").attr("class","pp-scatter-chart").style("opacity",0).style("width",i.svgw+50+"px").style("display","inline-block").style("margin",i.chartMargin+"px").style("top",0).style("left",0).style("text-align","left").style("border","1px solid #eee").style("box-shadow","0px 0px 1px 0px #ccc").style("background",s.color);n.append("div").attr("class","sjpcb-scatter-title").style("text-align","center").style("width",i.svgw+50+"px").style("height",i.chartTitleDivHt+"px").style("font-weight","600").style("margin","5px").datum(s.chartId).html(s.chartId);const r=n.append("svg").attr("class","pp-scatter-svg");a(r,s,i,0);n.transition().duration(i.duration).style("opacity",1)};t.updateCharts=function(s){const i=t.settings;const n=e(this);n.transition().duration(i.duration).style("width",i.svgw+50+"px").style("background",s.color);n.select(".sjpcb-scatter-title").style("width",i.svgw+50).style("height",i.chartTitleDivHt+"px").datum(s.chartId).html(s.chartId);n.selectAll(".sjpcb-lock-icon").style("display",i.scale=="byChart"?"block":"none");n.selectAll(".sjpcb-unlock-icon").style("display",i.scale=="byChart"?"none":"block");a(n.select("svg"),s,i,i.duration)};function a(t,s,a,o){t.transition().duration(o).attr("width",a.svgw).attr("height",a.svgh).style("overflow","visible").style("padding-left","20px");const[c,l,d,p,h,m]=i(t);c.attr("transform","translate("+a.svgPadding.left+","+a.svgPadding.top+")");const g=c.selectAll(".sjpcb-scatter-series").data(s.serieses,(t=>t&&t[0]?t[0].seriesId:""));g.exit().remove();g.each((function(t,i){n(e(this),s,t,i,a,a.duration)}));g.enter().append("g").attr("class","sjpcb-scatter-series").each((function(t,i){n(e(this),s,t,i,a,o)}));r(d,h,p,m,a,s)}function i(t){let e,s,a,i,n,r;if(!t.select(".sjpcb-scatter-mainG").size()){e=t.append("g").attr("class","sjpcb-scatter-mainG");s=e.append("g").attr("class","sjpcb-scatter-axis");a=s.append("g").attr("class","sjpcb-scatter-x-axis");i=s.append("g").attr("class","sjpcb-scatter-y-axis");n=s.append("g").attr("class","sjpcb-scatter-x-title");r=s.append("g").attr("class","sjpcb-scatter-y-title")}else{e=t.select(".sjpcb-scatter-mainG");s=e.select(".sjpcb-scatter-axis");a=s.select(".sjpcb-scatter-x-axis");i=s.select(".sjpcb-scatter-y-axis");n=s.select(".sjpcb-scatter-x-title");r=s.select(".sjpcb-scatter-y-title")}return[e,s,a,i,n,r]}function n(t,e,s,a,i,n){t.selectAll("circle").remove();const r=t.selectAll("circle").data(s.data,(t=>t.x));r.exit().remove();r.transition().duration(n).attr("r",i.radius).attr("cx",(t=>t.scaledX)).attr("cy",(t=>t.scaledY)).style("fill-opacity",i.fillOpacity);r.enter().append("circle").attr("r",i.radius).attr("cx",(t=>t.scaledX)).attr("cy",(t=>t.scaledY)).style("fill-opacity",i.fillOpacity).transition().duration(n)}function r(e,a,i,n,r,l){e.attr("transform","translate(0,"+(r.svgh-r.svgPadding.top-r.svgPadding.bottom)+")").call(o(l.xScale).ticks(5));i.call(c(s().domain(l.yScale.domain()).range([0,r.svgh-r.svgPadding.top-r.svgPadding.bottom])).ticks(5));a.select("text, title").remove();const d=t.config.term.term.name.length>24?t.config.term.term.name.slice(0,20)+"...":t.config.term.term.name;const p=a.attr("transform","translate("+(r.svgw-r.svgPadding.left-r.svgPadding.right)/2+","+(r.svgh-r.axisTitleFontSize)+")").append("text").style("text-anchor","middle").style("font-size",r.axisTitleFontSize+"px").text(d+(t.config.term.term.unit?", "+t.config.term.term.unit:""));p.append("title").text(t.config.term.term.name);const h=t.config.term2.term.name.length>24?t.config.term2.term.name.slice(0,20)+"...":t.config.term2.term.name;n.select("text, title").remove();const m=n.attr("transform","translate("+(-r.svgPadding.left/2-r.axisTitleFontSize)+","+(r.svgh-r.svgPadding.top-r.svgPadding.bottom)/2+")rotate(-90)").append("text").style("text-anchor","middle").style("font-size",r.axisTitleFontSize+"px").text(h+(t.config.term2.term.unit?", "+t.config.term2.term.unit:""));m.append("title").text(t.config.term2.term.name)}}function h(t){t.mouseover=function(e){if(e.target.tagName=="circle"){const s=e.target.__data__;const a=[`<tr><td style='padding:3px; color:#aaa'>X:</td><td style='padding:3px; text-align:center'>${s.x}</td></tr>`,`<tr><td style='padding:3px; color:#aaa'>Y:</td><td style='padding:3px; text-align:center'>${s.y}</td></tr>`];t.app.tip.show(e.clientX,e.clientY).d.html(`<table class='sja_simpletable'>${a.join("\n")}</table>`)}else{t.app.tip.hide()}};t.mouseout=function(){t.app.tip.hide()};t.download=()=>{if(!t.state||!t.state.isVisible)return;const s=[];const a={x:undefined,y:undefined};const n=[];let r=0,o=0,c=0;let l=0,d=0;t.dom.div.selectAll(".sjpcb-scatter-mainG").each((function(){s.push(this);const t=this.getBBox();if(t.width>r)r=t.width;if(t.height>o)o=t.height;const i=Math.round(this.parentNode.parentNode.getBoundingClientRect().y);if(!d){l=i;d++}else if(Math.abs(i-l)<5){d++}const p=e(this).attr("transform").split("translate(")[1].split(")")[0].split(",").map((t=>+t.trim()));if(a.x===undefined||p[0]>a.x)a.x=+p[0];if(a.y===undefined||p[1]>a.y)a.y=+p[1];const h=this.parentNode.parentNode.firstChild;const m=h.getBoundingClientRect();if(m.width>r)r=m.width;if(m.height>c)c=m.height;n.push({text:h.innerText,styles:window.getComputedStyle(h)})}));r+=30;o+=30;const p=document.createElementNS("http://www.w3.org/2000/svg","svg");e(p).style("display","block").style("opacity",1).attr("width",d*r).attr("height",Math.floor(s.length/d)*o);const h=window.getComputedStyle(document.querySelector(".pp-scatter-svg"));const m=e(p);for(const t of h){if(t.startsWith("font"))m.style(t,h.getPropertyValue(t))}s.forEach(((t,s)=>{const i=t.cloneNode(true);const l=s%d;const h=Math.floor(s/d);const m={x:l*r+a.x,y:h*o+a.y};const g=e(p).append("text").attr("transform","translate("+m.x+","+m.y+")").text(n[s].text);for(const t of n[s].styles){if(t.startsWith("font"))g.style(t,n[s].styles.getPropertyValue(t))}e(i).attr("transform","translate("+m.x+","+(m.y+c)+")");p.appendChild(i)}));const g=t.plot.term.term.name+" scatter";i(p,g)}}function m(t){const e=t.settings;const a=new r({template:{yMin:">$val2",yMax:"<$val2",charts:[{chartId:"@key",chc:"@key",xMin:">$val1",xMax:"<$val1",yMin:">$val2",yMax:"<$val2","__:xScale":"=xScale()","__:yScale":"=yScale()",serieses:[{chartId:"@parent.@parent.@key",seriesId:"@key",data:[{"__:chc":"@parent.@parent.chc","__:seriesId":"@parent.@parent.seriesId",x:"$val1",y:"$val2","_1:scaledX":"=scaledX()","_1:scaledY":"=scaledY()"},"$val2"]},"-"]},"$val0"]},"=":{xScale(t,a){return s().domain([a.self.xMin,a.self.xMax]).range([0,e.svgw-e.svgPadding.left-e.svgPadding.right])},scaledX(t,e){return e.context.context.context.parent.xScale(e.self.x)},scaledY(t,e){return e.context.context.context.parent.yScale(e.self.y)},yScale(t,a){const i=a.self.yMax;const n=e.scale=="byChart"?[i,0]:[a.root.yMax,0];return s().domain(n).range([0,e.svgh-e.svgPadding.top-e.svgPadding.bottom])}}});return a}export{d as scatterInit,p as setRenderers};
@@ -1 +1 @@
1
- import{h as t}from"./recover-36ada47f.js";import{M as e}from"./app-a8c4854a.js";function s(s,n,a,p,d){const i=new e({padding:"5px"});const l=s.d.append("div").style("padding","5px");l.append("div").html("Select variables to plot").style("font-size","0.9rem");let o,r;const c=l.append("div").style("padding-top","5px").html("&nbsp;X&nbsp;&nbsp;");const b=c.append("div").attr("class","sja_filter_tag_btn add_term_btn").text("+").on("click",(t=>{v(b,(t=>o=t),p)}));const f=l.append("div").html("&nbsp;Y&nbsp;&nbsp;");const m=f.append("div").attr("class","sja_filter_tag_btn add_term_btn").text("+").on("click",(t=>{v(m,(t=>r=t),p)}));const u=l.append("div").style("float","right").style("padding","5px").insert("button").text("Submit").property("disabled",true).on("click",(()=>{d(o,r);s.hide()}));function v(e,p,d){const l={tree:{usecase:{detail:d,target:a}}};const c=[];if(o)c.push(o);if(r)c.push(r);t(e,(t=>{p(t);i.hide();e.selectAll("*").remove();e.text(t.name);if(o!=null&&r!=null)u.property("disabled",false)}),n,s,l,false,false,c)}}export{s};
1
+ import{h as t}from"./recover-49e09de0.js";import{M as e}from"./app-b369b169.js";function s(s,n,p,a,d){const i=new e({padding:"5px"});const l=s.d.append("div").style("padding","5px");l.append("div").html("Select variables to plot").style("font-size","0.9rem");let o,r;const c=l.append("div").style("padding-top","5px").html("&nbsp;X&nbsp;&nbsp;");const b=c.append("div").attr("class","sja_filter_tag_btn add_term_btn").text("+").on("click",(t=>{v(b,(t=>o=t),a)}));const f=l.append("div").html("&nbsp;Y&nbsp;&nbsp;");const m=f.append("div").attr("class","sja_filter_tag_btn add_term_btn").text("+").on("click",(t=>{v(m,(t=>r=t),a)}));const u=l.append("div").style("float","right").style("padding","5px").insert("button").text("Submit").property("disabled",true).on("click",(()=>{d(o,r);s.hide()}));function v(e,a,d){const l={tree:{usecase:{detail:d,target:p}}};const c=[];if(o)c.push(o);if(r)c.push(r);t(e,(t=>{a(t);i.hide();e.selectAll("*").remove();e.text(t.name);if(o!=null&&r!=null)u.property("disabled",false)}),n,s,l,false,false,c)}}export{s};
@@ -1 +1 @@
1
- import{M as t,aj as e,f as n}from"./app-a8c4854a.js";import{a as s}from"./genesearch-ea59f5d4.js";import"./tslib.es6-1f85f553.js";const o=new t({padding:""});const r=60;async function a(t,a,i){a.style("margin","40px 20px 20px 20px");const p=a.append("div");p.append("p").text("To launch view, press ENTER at gene search.").style("opacity",.3);const l=a.append("div");const f=c(p,i).on("change",u);let d,m;const h=p.append("span").style("margin-left","10px");const g=p.append("button").style("display","none").style("margin-top","20px").style("padding","10px 15px").style("border-radius","30px").text("Launch ProteinPaint").on("click",x);u();function u(){h.selectAll("*").remove();const t=f.node();m=i[t.options[t.selectedIndex].innerHTML];const e={genome:m,tip:o,row:h,allowVariant:true,callback:()=>g.style("display","block")};d=s(e)}async function x(){try{p.remove();const s={nobox:1,genome:m,holder:l,tklst:t.selectGenomeWithTklst};const o=d;if(o.chr){const[t,n]=e(m,[o.chr]);if(t+n==0)throw"Invalid chromosome name: "+o.chr;const a=t?"chr"+o.chr:o.chr;if(Number.isInteger(o.pos)){if(!o.ref)throw"Reference allele missing from variant string";if(!o.alt)throw"Alternative allele missing from variant string";s.chr=a;s.start=o.pos-r;s.stop=o.pos+r;for(const t of s.tklst){if(t.type=="bam"){t.variants=[{chr:a,pos:o.pos-1,ref:o.ref,alt:o.alt}]}}}else{if(!Number.isInteger(o.start)||!Number.isInteger(o.stop))throw"non-integer start/stop";s.chr=a;s.start=o.start;s.stop=o.stop}}else{const t=m.defaultcoord;s.chr=t.chr;s.start=t.start;s.stop=t.stop}n(m,s.tklst);const a=await import("./block-dcb130fb.js").then((function(t){return t.c}));new a.Block(s)}catch(t){window.alert(t.message||t)}}}function c(t,e){const n=t.append("select");for(const t in e){n.append("option").text(t)}return n}export{a as init};
1
+ import{M as t,aj as e,f as n}from"./app-b369b169.js";import{a as s}from"./genesearch-a4e19f0d.js";import"./tslib.es6-c3c2d88f.js";const o=new t({padding:""});const r=60;async function a(t,a,i){a.style("margin","40px 20px 20px 20px");const p=a.append("div");p.append("p").text("To launch view, press ENTER at gene search.").style("opacity",.3);const l=a.append("div");const d=c(p,i).on("change",u);let f,m;const h=p.append("span").style("margin-left","10px");const g=p.append("button").style("display","none").style("margin-top","20px").style("padding","10px 15px").style("border-radius","30px").text("Launch ProteinPaint").on("click",x);u();function u(){h.selectAll("*").remove();const t=d.node();m=i[t.options[t.selectedIndex].innerHTML];const e={genome:m,tip:o,row:h,allowVariant:true,callback:()=>g.style("display","block")};f=s(e)}async function x(){try{p.remove();const s={nobox:1,genome:m,holder:l,tklst:t.selectGenomeWithTklst};const o=f;if(o.chr){const[t,n]=e(m,[o.chr]);if(t+n==0)throw"Invalid chromosome name: "+o.chr;const a=t?"chr"+o.chr:o.chr;if(Number.isInteger(o.pos)){if(!o.ref)throw"Reference allele missing from variant string";if(!o.alt)throw"Alternative allele missing from variant string";s.chr=a;s.start=o.pos-r;s.stop=o.pos+r;for(const t of s.tklst){if(t.type=="bam"){t.variants=[{chr:a,pos:o.pos-1,ref:o.ref,alt:o.alt}]}}}else{if(!Number.isInteger(o.start)||!Number.isInteger(o.stop))throw"non-integer start/stop";s.chr=a;s.start=o.start;s.stop=o.stop}}else{const t=m.defaultcoord;s.chr=t.chr;s.start=t.start;s.stop=t.stop}n(m,s.tklst);const a=await import("./block-6aedd569.js").then((function(t){return t.c}));new a.Block(s)}catch(t){window.alert(t.message||t)}}}function c(t,e){const n=t.append("select");for(const t in e){n.append("option").text(t)}return n}export{a as init};
@@ -0,0 +1 @@
1
+ import{_ as t}from"./tslib.es6-c3c2d88f.js";import{s as e}from"./termsetting-33ea66f1.js";import{getHandler as i}from"./categorical-a52014a1.js";import{P as r}from"./app-b369b169.js";import"path";import"./groupsetting-b4416a96.js";function s(e){return t(this,void 0,void 0,(function*(){return i(e)}))}function o(t,i,s=null){var o,p;if(!((o=t.term)===null||o===void 0?void 0:o.sample))throw"missing term.sample";if(!((p=t.term)===null||p===void 0?void 0:p.plot))throw"missing term.plot";if(!Object.keys(t.q).includes("type"))t.q.type="values";if(!t.term.groupsetting)t.term.groupsetting={disabled:false};if(t.q.type=="predefined-groupset"){if(!Number.isInteger(t.q.predefined_groupset_idx))throw"predefined_groupset_idx is not an integer"}if(t.q.type=="custom-groupset"){if(!t.q.customset)throw"invalid customset"}if(s){s.isAtomic=true;r(t.q,s)}e(t.q,t.term)}export{o as fillTW,s as getHandler};
@@ -1 +1 @@
1
- import{_ as e}from"./tslib.es6-1f85f553.js";import{P as n}from"./app-a8c4854a.js";function t(e){switch(e){case"./numeric.binary.ts":return import("./numeric.binary-80467e8b.js");case"./numeric.continuous.ts":return import("./numeric.continuous-69a62a15.js");case"./numeric.discrete.ts":return import("./numeric.discrete-86181905.js");case"./numeric.spline.ts":return import("./numeric.spline-1b07fd13.js");case"./numeric.toggle.ts":return import("./numeric.toggle-37c4bee8.js");default:return new Promise((function(n,t){(typeof queueMicrotask==="function"?queueMicrotask:setTimeout)(t.bind(null,new Error("Unknown variable dynamic import: "+e)))}))}}function i(n){return e(this,void 0,void 0,(function*(){const e=n.opts.numericEditMenuVersion;const t=e.length>1?"toggle":e[0];const i=yield o(t);return yield i.getHandler(n)}))}function r(t,i,r=null){var o,s;return e(this,void 0,void 0,(function*(){if(!((o=t.term)===null||o===void 0?void 0:o.sample))throw"singleCellGeneExpression tw.term.sample must be provided";if(typeof t.term.gene!="string"||!t.term.gene)throw"singleCellGeneExpression tw.term.gene must be non-empty string";if(!t.term.name)t.term.name=t.term.gene;if(!((s=t.q)===null||s===void 0?void 0:s.mode))t.q={mode:"continuous"};if(r)n(t.q,r);if(t.q.mode!="continuous"&&!t.term.bins){yield i.setTermBins(t)}return t}))}function o(n){return e(this,void 0,void 0,(function*(){try{return yield t(`./numeric.${n}.ts`)}catch(e){if(e.stack)console.log(e.stack);throw`Type numeric.${n} does not exist [handlers/numeric.ts importSubtype()]`}}))}export{r as fillTW,i as getHandler};
1
+ import{_ as e}from"./tslib.es6-c3c2d88f.js";import{P as n}from"./app-b369b169.js";function t(e){switch(e){case"./numeric.binary.ts":return import("./numeric.binary-1f9e93f2.js");case"./numeric.continuous.ts":return import("./numeric.continuous-ebcd0567.js");case"./numeric.discrete.ts":return import("./numeric.discrete-7b97044a.js");case"./numeric.spline.ts":return import("./numeric.spline-1be88f3d.js");case"./numeric.toggle.ts":return import("./numeric.toggle-7fa2a770.js");default:return new Promise((function(n,t){(typeof queueMicrotask==="function"?queueMicrotask:setTimeout)(t.bind(null,new Error("Unknown variable dynamic import: "+e)))}))}}function i(n){return e(this,void 0,void 0,(function*(){const e=n.opts.numericEditMenuVersion;const t=e.length>1?"toggle":e[0];const i=yield o(t);return yield i.getHandler(n)}))}function r(t,i,r=null){var o,s;return e(this,void 0,void 0,(function*(){if(!((o=t.term)===null||o===void 0?void 0:o.sample))throw"singleCellGeneExpression tw.term.sample must be provided";if(typeof t.term.gene!="string"||!t.term.gene)throw"singleCellGeneExpression tw.term.gene must be non-empty string";if(!t.term.name)t.term.name=t.term.gene;if(!((s=t.q)===null||s===void 0?void 0:s.mode))t.q={mode:"continuous"};if(r)n(t.q,r);if(t.q.mode!="continuous"&&!t.term.bins){yield i.setTermBins(t)}return t}))}function o(n){return e(this,void 0,void 0,(function*(){try{return yield t(`./numeric.${n}.ts`)}catch(e){if(e.stack)console.log(e.stack);throw`Type numeric.${n} does not exist [handlers/numeric.ts importSubtype()]`}}))}export{r as fillTW,i as getHandler};
@@ -0,0 +1 @@
1
+ import{b as t,y as e,F as s,h as o,P as i,M as n,d as l,C as a,I as r,r as p,Q as c}from"./app-b369b169.js";import{d}from"./zoom-25dce8b9.js";import{r as h}from"./table-29d5a973.js";import{controlsInit as g}from"./controls-287e6efa.js";import{d as m}from"./svg.download-35926549.js";import{a as f}from"./genesearch-a4e19f0d.js";import{T as y,c as u}from"./termsetting-33ea66f1.js";import{a as b,b as v,c as x}from"./axis-747c801e.js";import"./pointer-c7475677.js";import"./nodrag-16ad4b03.js";import"./tslib.es6-c3c2d88f.js";import"./controls.btns-79b805dd.js";import"./controls.config-28d6d6a8.js";import"path";class C{constructor(){this.type="singleCellPlot";this.tip=new n({padding:"4px",offsetX:10,offsetY:0});this.tip.d.style("max-height","300px").style("overflow","scroll").style("font-size","0.9em");this.startGradient={};this.stopGradient={}}async init(e){const s=this.getState(e);const o=s.termdbConfig.queries;this.tableOnPlot=e.nav?.header_mode=="hidden";this.opts.holder.style("position","relative");this.showDivId=`${this.id}-sandbox`;const i=this.opts.holder.insert("div").style("display","inline-block").style("vertical-align","top");const a=i.append("div").style("padding","10px");const r=i.append("div");const p=a.append("div").attr("id",this.showDivId);const c=a.append("div").style("padding-top","10px").style("display","inline-block");if(this.tableOnPlot){p.append("input").attr("id",`showSamples`).attr("type","checkbox").property("checked",true).on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{singleCellPlot:{showSamples:t.target.checked}}}})}));p.append("label").text("Show samples").attr("for",`showSamples`)}for(const t of s.config.plots){const e=t.name.replace(/\s+/g,"");p.append("input").attr("id",`show${e}`).attr("type","checkbox").property("checked",true).on("change",(t=>{this.app.dispatch({type:"plot_edit",id:this.id,config:{settings:{singleCellPlot:{[`show${e}`]:t.target.checked}}}})}));p.append("label").text(t.name).attr("for",`show${e}`)}if(o.singleCell?.geneExpression){c.append("label").html("Gene expression:");const t=f({tip:new n({padding:"0px"}),genome:this.app.opts.genome,row:c,searchOnly:"gene",placeholder:s.config.gene||"Gene",callback:()=>{o?.style("display","inline-block");e?.style("display","inline-block");const s=t.geneSymbol;this.app.dispatch({type:"plot_edit",id:this.id,config:{gene:s}})},emptyInputCallback:()=>{o.style("display","none");e.style("display","none");this.app.dispatch({type:"plot_edit",id:this.id,config:{gene:null}})},hideHelp:true,focusOff:true});const e=c.append("select").style("display",s.config.gene?"inline-block":"none");for(const t of s.termdbConfig?.queries.singleCell.data.plots){e.append("option").text(t.colorColumn)}e.on("change",(async()=>{const t=s.termdbConfig?.queries.singleCell.data.plots[0];const o=t.columnName;const i={sample:s.config.sample.sampleName,columnName:o,category:e.node().value};await this.app.vocabApi.getTopTermsByType(i)}));const o=c.append("button").text("Open violin").style("margin-left","2px").style("display",s.config.gene?"inline-block":"none");o.on("click",(()=>{const o=t.geneSymbol||s.config.gene;const i=this.state.config.plots.find((t=>t.colorColumn==e.node().value)).name;const n=this.plots.find((t=>t.name==i));const l={};for(const t of n.clusters){l[t]={key:t,value:t}}this.app.dispatch({type:"plot_create",config:{chartType:"violin",settings:{violin:{plotThickness:50}},term:{term:{type:y.SINGLECELL_GENE_EXPRESSION,id:o,gene:o,name:o,sample:s.config.sample}},term2:{term:{type:y.SINGLECELL_CELLTYPE,id:y.SINGLECELL_CELLTYPE,name:"Cell type",sample:s.config.sample,plot:n.name,values:l}}}})}))}const d=a.append("div").style("padding","10px").style("display","inline-block");const g=i.append("div").style("display","inline-block").attr("class","pp-termdb-plot-controls");const m=i.append("div").style("display","inline-block");const b=m.append("div").style("display","flex").style("flex-wrap","wrap").style("justify-content","flex-start").style("width","92vw");const v=this.opts.holder.append("div").style("position","absolute").style("top",0).style("left",0).style("width","100%").style("height","100%").style("background-color","rgba(255, 255, 255, 0.8)").style("text-align","center");v.append("div").attr("class","sjpp-spinner");this.dom={header:this.opts.header,mainDiv:i,loadingDiv:v,tip:new n({padding:"0px"}),tooltip:new n({padding:"2px",offsetX:10,offsetY:0}),controlsHolder:g,tableDiv:r,deDiv:d,plotsDiv:b,plotsDivParent:m};const x=80;this.axisOffset={x:x,y:30};if(o.singleCell?.DEgenes){this.dom.deDiv.append("label").html("View differentially expresed genes of a cluster vs rest of cells:&nbsp;");this.dom.deselect=this.dom.deDiv.append("select");if(this.app.opts.genome.termdbs)this.dom.GSEAbt=this.dom.deDiv.append("button").style("margin-left","5px").property("disabled",true).text("Gene set enrichment analysis").on("click",(t=>{const e={genes:this.genes,fold_change:this.fold_changes,genome:this.app.vocabApi.opts.state.vocab.genome};const s={chartType:"gsea",gsea_params:e,insertBefore:this.app.opts?.app?.getPlotHolder&&this.showDivId};this.app.dispatch({type:"plot_create",config:s})}));const e=this.dom.deDiv.append("div");this.dom.DETableDiv=e;this.dom.deselect.append("option").text("");this.dom.deselect.on("change",(async o=>{e.selectAll("*").remove();const i=this.dom.deselect.node().value.split(" ")?.[1];if(this.dom.GSEAbt)this.dom.GSEAbt.property("disabled",!i);if(!i)return;const n=s.termdbConfig.queries.singleCell.DEgenes.columnName;const l=this.state.config.experimentID||this.state.config.sample||this.samples[0]?.experiments[0]?.experimentID;const a={genome:s.genome,dslabel:s.dslabel,categoryName:i,sample:l,columnName:n};const r=await t("termdb/singlecellDEgenes",{body:a});const p=[{label:"Gene"},{label:"Log2FC"},{label:"Adjusted P-value"}];const c=[];this.genes=[];this.fold_changes=[];r.genes.sort(((t,e)=>e.avg_log2FC-t.avg_log2FC));for(const t of r.genes){const e=[{value:t.name},{value:u(t.avg_log2FC)},{value:u(t.p_val_adj)}];c.push(e);this.genes.push(t.name);this.fold_changes.push(t.avg_log2FC)}h({rows:c,columns:p,resize:true,div:e})}))}this.settings={};document.addEventListener("scroll",(t=>this?.tip?.hide()));l(".sjpp-output-sandbox-content").on("scroll",(t=>this.tip.hide()));await this.setControls(s)}async setControls(t){const e=[{label:"Chart width",type:"number",chartType:"singleCellPlot",settingsKey:"svgw",min:300,max:1e3},{label:"Chart height",type:"number",chartType:"singleCellPlot",settingsKey:"svgh",min:300,max:1e3},{label:"Show borders",type:"checkbox",chartType:"singleCellPlot",settingsKey:"showBorders",boxLabel:""}];if(this.tableOnPlot)e.push({label:"Show samples",type:"checkbox",chartType:"singleCellPlot",settingsKey:"showSamples",boxLabel:""});this.components={controls:await g({app:this.app,id:this.id,holder:this.dom.controlsHolder,inputs:e})};this.components.controls.on("downloadClick.singleCellPlot",(()=>{for(const t of this.plots)m(t.svg,"plot.svg",this.opts.holder.node())}))}getState(t){const e=t.plots.find((t=>t.id===this.id));if(!e){throw`No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`}this.prevFilter0=this.state?.termfilter.filter0;return{config:e,dslabel:t.vocab.dslabel,genome:t.vocab.genome,termdbConfig:t.termdbConfig,termfilter:t.termfilter}}async main(){this.config=structuredClone(this.state.config);i(this.settings,this.config.settings.singleCellPlot);this.dom.tableDiv.style("display",this.settings.showSamples?"block":"none");if(this.tableOnPlot){await D(this.dom.tableDiv,this,this.state);if(!this.samples?.length){this.showNoMatchingDataMessage();return}}this.dom.loadingDiv.selectAll("*").remove();this.dom.loadingDiv.style("display","").append("div").attr("class","sjpp-spinner");this.dom.mainDiv.style("opacity",1).style("display","");this.legendRendered=false;const t=await this.getData();this.dom.plotsDivParent.style("display","inline-block");this.renderPlots(t);this.dom.loadingDiv.style("display","none");if(this.dom.header)this.dom.header.html(`Single Cell Data`)}async getData(){const s=[];for(const t of this.config.plots){const e=t.name.replace(/\s+/g,"");const o=this.settings[`show${e}`];if(o)s.push(t.name)}const o={genome:this.state.genome,dslabel:this.state.dslabel,plots:s,filter0:this.state.termfilter.filter0};if(this.state.config.sample){this.state.config.sample;o.sample=this.state.config.experimentID||this.state.config.sample}else{this.samples[0].sample;o.sample=this.samples[0].experiments?.[0]?.experimentID||this.samples[0].sample}if(this.state.config.gene)o.gene=this.state.config.gene;try{const e=await t("termdb/singlecellData",{body:o});if(e.error)throw e.error;this.refName=e.refName;return e}catch(t){if(t.stack)console.log(t.stack);e(this.dom.plotsDiv,t);return}}showNoMatchingDataMessage(){this.dom.mainDiv.style("opacity",.001).style("display","none");this.dom.loadingDiv.style("display","").html("");this.dom.loadingDiv.append("div").style("display","inline-block").style("text-align","center").style("position","relative").style("left","-150px").style("font-size","1.2em").style("margin","2em 1em").html("No matching cohort data.")}renderPlots(t){this.dom.plotsDiv.selectAll("*").remove();this.plots=[];for(const e of t.plots){e.id=e.name.replace(/\s+/g,"");this.renderPlot(e)}}renderPlot(t){const e={};let s=new Set(t.cells.map((t=>t.category)));t.clusters=Array.from(s).sort(((t,e)=>{const s=parseInt(t.split(" ")[1]);const o=parseInt(e.split(" ")[1]);return s-o}));if(this.dom.deselect&&!this.legendRendered){this.dom.deselect.selectAll("*").remove();this.dom.deselect.append("option").text("");for(const e of t.clusters)this.dom.deselect.append("option").text(e)}const o=a(t.clusters.length+2);for(const s of t.clusters)e[s]=s=="ref"||s=="No"?"#F2F2F2":t.colorMap?.[s]?t.colorMap[s]:o(s);t.colorMap=e;this.plots.push(t);this.initAxes(t);t.plotDiv=this.dom.plotsDiv.append("div").style("overflow","hidden").style("display","inline-block").style("padding","10px").style("flex-grow",1);if(this.state.config.settings.singleCellPlot.showBorders)t.plotDiv.style("border","1px solid #aaa");this.renderLegend(t);const i=t.plotDiv.append("svg").attr("width",this.settings.svgw).attr("height",this.settings.svgh+40).on("mouseover",(e=>{if(this.state.config.gene&&!this.onClick)this.showTooltip(e,t)})).on("click",(e=>this.showTooltip(e,t)));i.append("text").attr("transform",`translate(20, 30)`).style("font-weight","bold").text(`${t.name}`);t.svg=i;const n=d().scaleExtent([.5,5]).on("zoom",(e=>this.handleZoom(e,t))).filter((t=>{if(t.type==="wheel")return t.ctrlKey;return true}));i.call(n);const l=i.selectAll("g").data(t.cells);l.enter().append("g").attr("transform",(e=>`translate(${t.xAxisScale(e.x)}, ${t.yAxisScale(e.y)+40})`)).append("circle").attr("r",1.5).attr("fill",(e=>this.getColor(e,t))).style("fill-opacity",(t=>this.getOpacity(t)))}getOpacity(t){if(this.config.hiddenClusters.includes(t.category))return 0;return.7}getColor(t,e){const s="#FAFAFA";if(this.state.config.gene){if(!t.geneExp)return s;if(e.colorGenerator)return e.colorGenerator(t.geneExp);return s}return e.colorMap[t.category]}handleZoom(t,e){e.svg.attr("transform",t.transform);e.zoom=t.transform.scale(1).k}initAxes(t){if(!t.cells.length)return;const e=t.cells[0];const[s,o,i,n]=t.cells.reduce(((t,e)=>[e.x<t[0]?e.x:t[0],e.x>t[1]?e.x:t[1],e.y<t[2]?e.y:t[2],e.y>t[3]?e.y:t[3]]),[e.x,e.x,e.y,e.y]);const l=5;t.xAxisScale=r().domain([s,o]).range([0+l,this.settings.svgh+l]);t.axisBottom=b(t.xAxisScale);t.yAxisScale=r().domain([n,i]).range([0+l,this.settings.svgh+l]);t.axisLeft=v(t.yAxisScale);t.zoom=1}renderLegend(t){const e=t.colorMap;let s=t.legendSVG;if(!t.legendSVG){s=t.plotDiv.append("svg").attr("width",250).attr("height",this.settings.svgh).style("vertical-align","top");t.legendSVG=s}s.selectAll("*").remove();if(this.state.termdbConfig.queries.singleCell.data.sameLegend&&this.legendRendered)return;this.legendRendered=true;const o=s.append("g").attr("transform",`translate(25, 50)`).style("font-size","0.8em");if(this.state.config.gene){this.renderColorGradient(t,o);return}o.append("text").attr("transform",`translate(${0}, ${25})`).style("font-weight","bold").text(`${t.colorBy}`);const i=20;let n=50;let l=0;for(const s in e){const r=t.cells.filter((t=>t.category==s));const p=this.config.hiddenClusters.includes(s);const c=r.length;const d=e[s];const h=o.append("g").attr("transform",(t=>`translate(${l}, ${n})`));h.append("circle").attr("r",3).attr("fill",d);h.append("g").attr("transform",`translate(${l+10}, ${5})`).append("text").text(`${s=="ref"?this.state.termdbConfig.queries.singleCell.data.refName:s=="query"?this.state.config.sample:s} n=${c}`).style("text-decoration",p?"line-through":"none").on("click",(t=>a(this,t,s)));n+=i}function a(t,e,s,o){const i=e.target;const n=i.style["text-decoration"]=="line-through";i.style["text-decoration"]=n?"none":"line-through";let l=t.config.hiddenClusters;if(!n)l.push(s);else l.splice(l.indexOf(s),1);t.app.dispatch({type:"plot_edit",id:t.id,config:{hiddenClusters:l}})}}renderColorGradient(t,e){if(t.cells.length==0)return;const s=p(c);if(!this.config.startColor[t.name])this.config.startColor[t.name]=s.brighter(1).toString();if(!this.config.stopColor[t.name])this.config.stopColor[t.name]=s.darker(3).toString();const o=this.config.startColor[t.name];const i=this.config.stopColor[t.name];const n=e.append("defs").append("linearGradient").attr("id",`linear-gradient-${t.id}`).attr("x1","0%").attr("y1","0%").attr("x2","100%").attr("y2","0%");this.startGradient[t.name]=n.append("stop").attr("offset","0%").attr("stop-color",o);this.stopGradient[t.name]=n.append("stop").attr("offset","100%").attr("stop-color",i);let l,a;const d=t.cells[0]?.geneExp==undefined?[]:t.cells.map((t=>t.geneExp));if(d.length==0){t.colorGenerator=null;return}else[l,a]=d.reduce(((t,e)=>[e<t[0]?e:t[0],e>t[1]?e:t[1]]),[d[0],d[0]]);t.colorGenerator=r().domain([l,a]).range([o,i]);const h=100;const g=r().domain([l,a]).range([0,h]);const m=(a-l)/4;const f=[l,l+m,l+2*m,l+3*m,a];const y=x(g).tickValues(f);e.append("g").attr("transform",`translate(0, 100)`).call(y);t.startRect=e.append("rect").attr("x",-25).attr("y",100).attr("width",20).attr("height",20).style("fill",o).on("click",(e=>this.editColor(t,"startColor",t.startRect)));t.stopRect=e.append("rect").attr("x",h+5).attr("y",100).attr("width",20).attr("height",20).style("fill",i).on("click",(e=>this.editColor(t,"stopColor",t.stopRect)));e.append("rect").attr("x",0).attr("y",100).attr("width",h).attr("height",20).style("fill",`url(#linear-gradient-${t.id})`)}editColor(t,e,s){const o=this.config[e][t.name];const i=new n({padding:"3px"});const l=i.clear().d.append("Label").text("Color:").append("input").attr("type","color").attr("value",p(o).formatHex()).on("change",(()=>{const o=l.node().value;this.changeGradientColor(t,e,s,o);i.hide()}));i.showunder(s.node(),false)}changeGradientColor=function(t,e,s,o){this.config[e][t.name]=o;this.app.dispatch({type:"plot_edit",id:this.id,config:this.config})};distance(t,e,s,o,i){const n=i.xAxisScale(s)-i.xAxisScale(t);const l=i.yAxisScale(o)-i.yAxisScale(e);const a=Math.sqrt(Math.pow(n,2)+Math.pow(l,2));return a}showTooltip(t,e){if(this.onClick&&t.type=="click"){this.onClick=false;this.tip.hide();return}if(t.target.tagName=="circle"){this.onClick=t.type=="click";const s=t.target.__data__;const o=this.tip.clear();const i=o.d.append("table");let n=i.append("tr");n.append("td").style("color","#aaa").text(e.colorBy);const l=n.append("td");const a=l.append("svg").attr("width",150).attr("height",20);const r=10;const p=12;const c=a.append("g").attr("transform",`translate(${r}, ${p})`);c.append("circle").attr("fill",this.getColor(s,e)).attr("r",4);a.append("g").attr("transform",`translate(${r+15}, ${p+4})`).append("text").text(s.category);if("geneExp"in s){n=i.append("tr");n.append("td").style("color","#aaa").text("Gene expression");n.append("td").text(u(s.geneExp))}o.show(t.clientX,t.clientY,true,true)}else this.onMouseOut(t)}onMouseOut(t){this.tip.hide()}}async function w(t,e){const s=t.append("div").style("padding","5px");D(s,e,e.state)}async function D(o,i,n){const l={genome:n.genome,dslabel:n.dslabel,filter0:n.termfilter.filter0||null};let a;try{a=await t("termdb/singlecellSamples",{body:l});if(a.error)throw a.error}catch(t){e(o,t);return}const r=a.samples;i.samples=r;if(i.tableOnPlot){if(r.length==0){i.dom.plotsDiv.selectAll("*").remove();return}if(i.table&&s(i.state.termfilter.filter0,i.prevFilter0))return}o.selectAll("*").remove();r.sort(((t,e)=>{const s=t.primarySite?.localeCompare(e.primarySite);if(s==1||s==-1)return s;else return t.sample.localeCompare(e.sample)}));const[p,c]=await k(i,r,n);const d=[];let g="40vh";if(i.tableOnPlot){const t=i.config.sample;const e=i.samples.findIndex((e=>e.sample==t));const s=e==-1?0:e;d.push(s);g="30vh"}i.table=h({rows:p,columns:c,resize:true,singleMode:true,div:o,maxHeight:g,noButtonCallback:t=>{if(i.dom.DETableDiv){i.dom.deselect.node().value="";i.dom.DETableDiv.selectAll("*").remove();if(i.dom.GSEAbt)i.dom.GSEAbt.property("disabled",true)}const e=p[t][0].value;const s={chartType:"singleCellPlot",sample:e};if(p[t][0].__experimentID){s.experimentID=p[t][0].__experimentID}if(i.tableOnPlot){i.app.dispatch({type:"plot_edit",id:i.id,config:s})}else{i.dom.tip.hide();i.app.dispatch({type:"plot_create",config:s})}},selectedRows:d})}async function k(t,e,s){const o=[];for(const t of e){if(t.experiments)for(const e of t.experiments){const i=[{value:t.sample,__experimentID:e.experimentID}];for(const e of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){i.push({value:t[e.termid]})}for(const e of s.termdbConfig.queries.singleCell.samples.experimentColumns||[]){i.push({value:t[e.label]})}i.push({value:e.experimentID});o.push(i)}else{const e=[{value:t.sample}];for(const o of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){e.push({value:t[o.termid]})}o.push(e)}}const i=[{label:s.termdbConfig.queries.singleCell.samples.firstColumnName||"Sample"}];for(const e of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){i.push({label:(await t.app.vocabApi.getterm(e.termid)).name,width:"15vw"})}for(const t of s.termdbConfig.queries.singleCell.samples.experimentColumns||[]){i.push({label:t.label,width:"20vw"})}if(e.some((t=>t.experiments))){i.push({label:"Experiment"})}return[o,i]}const S=o(C);const A=S;async function _(t,e){try{const s=e.vocabApi.termdbConfig?.queries?.singleCell.data.plots;const o=E();for(const t of s){const e=t.name.replace(/\s+/g,"");const s=`show${e}`;o[s]=true}const n={hiddenClusters:[],settings:{singleCellPlot:o},startColor:{},stopColor:{},plots:s};const l=i(n,t);return l}catch(t){console.log(t);throw`${t} [singleCellPlot getPlotConfig()]`}}function E(){return{svgw:420,svgh:420,showBorders:false,showSamples:true}}export{A as componentInit,E as getDefaultSingleCellSettings,_ as getPlotConfig,w as makeChartBtnMenu,S as scatterInit};