@sjcrh/proteinpaint-client 2.76.1 → 2.76.2

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 (216) hide show
  1. package/dist/{2dmaf-593951c7.js → 2dmaf-f240211f.js} +1 -1
  2. package/dist/{AppHeader-29b88e14.js → AppHeader-c9432a24.js} +1 -1
  3. package/dist/{ColorScale-3d3c42dc.js → ColorScale-b991fc9e.js} +1 -1
  4. package/dist/{DEanalysis-f81e0f19.js → DEanalysis-bbfad00d.js} +1 -1
  5. package/dist/{Disco-db386f7a.js → Disco-b7c9bf72.js} +1 -1
  6. package/dist/{Disco.UI-8ed9cb39.js → Disco.UI-a5296c36.js} +1 -1
  7. package/dist/{DragControls-d6250d18.js → DragControls-ca3fa0cf.js} +1 -1
  8. package/dist/{DziViewer-9352e224.js → DziViewer-28915c11.js} +1 -1
  9. package/dist/{FilterRxComp-0f35b322.js → FilterRxComp-02e68f1b.js} +1 -1
  10. package/dist/{FilterStateless-b1c6ee04.js → FilterStateless-16a33070.js} +1 -1
  11. package/dist/{HicApp-14b94b20.js → HicApp-e713aa40.js} +1 -1
  12. package/dist/{OrbitControls-45f56ed4.js → OrbitControls-2466d420.js} +1 -1
  13. package/dist/{WSIViewer-80f60272.js → WSIViewer-957695a8.js} +1 -1
  14. package/dist/{adSandbox-94424b88.js → adSandbox-27d93bc0.js} +1 -1
  15. package/dist/app-42f69951.js +1 -0
  16. package/dist/{app-2cd97738.js → app-6fb77603.js} +1 -1
  17. package/dist/{app-686b9547.js → app-d215327f.js} +1 -1
  18. package/dist/app.js +1 -1
  19. package/dist/{bam-6631640f.js → bam-d67e5315.js} +1 -1
  20. package/dist/{barchart-3c5d734c.js → barchart-2898d229.js} +1 -1
  21. package/dist/{barchart.events-df44e666.js → barchart.events-426d737a.js} +1 -1
  22. package/dist/{bars.renderer-b232d882.js → bars.renderer-71935d34.js} +1 -1
  23. package/dist/{block-4134e823.js → block-75d4ff92.js} +1 -1
  24. package/dist/block.lazyload-d2951c91.js +1 -0
  25. package/dist/{block.legend-d2b7f1cb.js → block.legend-93d85a6e.js} +1 -1
  26. package/dist/{block.mds-ebe7b58d.js → block.mds-84b9d1c1.js} +1 -1
  27. package/dist/{block.mds.cnv-99f0a414.js → block.mds.cnv-a991ed79.js} +1 -1
  28. package/dist/{block.mds.expressionrank-96bf864b.js → block.mds.expressionrank-33b858de.js} +1 -1
  29. package/dist/{block.mds.expressionstat-dcab3fd1.js → block.mds.expressionstat-3093599f.js} +1 -1
  30. package/dist/{block.mds.geneboxplot-e5b2a4ce.js → block.mds.geneboxplot-b8391d18.js} +1 -1
  31. package/dist/{block.mds.junction-534eef9b.js → block.mds.junction-69708c7f.js} +1 -1
  32. package/dist/{block.mds.svcnv-de6a3c7d.js → block.mds.svcnv-322baea6.js} +1 -1
  33. package/dist/{block.mds.svcnv.share-2c2c16db.js → block.mds.svcnv.share-c5c38237.js} +1 -1
  34. package/dist/{block.mds2-373fcb4d.js → block.mds2-de4811dd.js} +1 -1
  35. package/dist/{block.svg-be5d741d.js → block.svg-ac9fec2d.js} +1 -1
  36. package/dist/{block.tk.aicheck-f2da5e81.js → block.tk.aicheck-ac4b8d4d.js} +1 -1
  37. package/dist/{block.tk.ase-ef848944.js → block.tk.ase-6dc0f9f1.js} +1 -1
  38. package/dist/{block.tk.bam-11fcba17.js → block.tk.bam-8f68b41d.js} +1 -1
  39. package/dist/{block.tk.bedgraphdot-a81b0709.js → block.tk.bedgraphdot-d8878860.js} +1 -1
  40. package/dist/{block.tk.bigwig.ui-f8e5ba71.js → block.tk.bigwig.ui-f6ed051c.js} +1 -1
  41. package/dist/{block.tk.hicstraw-e7072b25.js → block.tk.hicstraw-725bdc8a.js} +1 -1
  42. package/dist/{block.tk.junction-1c9a7854.js → block.tk.junction-f8b0b51d.js} +1 -1
  43. package/dist/{block.tk.junction.textmatrixui-ffecbb16.js → block.tk.junction.textmatrixui-252e7d7e.js} +1 -1
  44. package/dist/{block.tk.ld-274c3a82.js → block.tk.ld-11acf730.js} +1 -1
  45. package/dist/{block.tk.menu-e970cd4a.js → block.tk.menu-5e04436d.js} +1 -1
  46. package/dist/{block.tk.pgv-f4d4dbf7.js → block.tk.pgv-fef17dc4.js} +1 -1
  47. package/dist/{boxplot-44d3b48f.js → boxplot-4c9a5479.js} +1 -1
  48. package/dist/{brainImaging-2eaa419d.js → brainImaging-7716bc66.js} +1 -1
  49. package/dist/{brush-bb4ae2fb.js → brush-9faa7ae7.js} +1 -1
  50. package/dist/{categorical-db9b0175.js → categorical-1dea48ba.js} +1 -1
  51. package/dist/{condition-4e788f7d.js → condition-ebac4f75.js} +1 -1
  52. package/dist/{controls-3c1691d7.js → controls-268e40e6.js} +1 -1
  53. package/dist/{controls.btns-5b1240c8.js → controls.btns-5bf9e7d7.js} +1 -1
  54. package/dist/controls.config-2f0fa061.js +1 -0
  55. package/dist/{cuminc-c4db28f0.js → cuminc-8dffb765.js} +1 -1
  56. package/dist/{customdata.inputui-f9234d1f.js → customdata.inputui-b229d3a0.js} +1 -1
  57. package/dist/{dataDownload-a4dfa2d0.js → dataDownload-452ae3cd.js} +1 -1
  58. package/dist/{databrowser.ui-a64bab0c.js → databrowser.ui-2197fc73.js} +1 -1
  59. package/dist/{density-69a732f6.js → density-09feb0c9.js} +1 -1
  60. package/dist/{dictionary-e2232e84.js → dictionary-a132a3cc.js} +1 -1
  61. package/dist/{drag-d8daa62f.js → drag-2e9c80bb.js} +1 -1
  62. package/dist/{e2pca-f9324654.js → e2pca-4f1648e3.js} +1 -1
  63. package/dist/{ep-a5c1ee3a.js → ep-1d4c58b4.js} +1 -1
  64. package/dist/{facet-98971c68.js → facet-fa4fe49c.js} +1 -1
  65. package/dist/{fusion.parse-466ded6d.js → fusion.parse-7dfd6988.js} +1 -1
  66. package/dist/{geneExpClustering-66c05fb1.js → geneExpClustering-ed9121b8.js} +1 -1
  67. package/dist/{geneExpression-ff46a389.js → geneExpression-394672ff.js} +1 -1
  68. package/dist/{geneExpression-b5d0261f.js → geneExpression-66208299.js} +1 -1
  69. package/dist/geneExpression-c61e8f1c.js +1 -0
  70. package/dist/{geneORA-f1a90d02.js → geneORA-9456872c.js} +1 -1
  71. package/dist/{geneVariant-1cf17b3b.js → geneVariant-beaf9adb.js} +1 -1
  72. package/dist/{geneVariant-d0b9e1cb.js → geneVariant-f17cda85.js} +1 -1
  73. package/dist/{genefusion.ui-89a727ea.js → genefusion.ui-9238ec7f.js} +1 -1
  74. package/dist/{genesearch-41cb55ce.js → genesearch-ffd88bf2.js} +1 -1
  75. package/dist/{geneset-b63496eb.js → geneset-0315daf8.js} +1 -1
  76. package/dist/{genomeBrowser-ec8fbddc.js → genomeBrowser-608b924e.js} +1 -1
  77. package/dist/{genomeBrowser.controls-2dcaf4f5.js → genomeBrowser.controls-2601cab5.js} +1 -1
  78. package/dist/{groupsetting-3fef59f9.js → groupsetting-e3a4ecd5.js} +1 -1
  79. package/dist/{gsea-3075c82c.js → gsea-0c0cf8de.js} +1 -1
  80. package/dist/{hierCluster-33a828a1.js → hierCluster-7ab62ca5.js} +1 -1
  81. package/dist/hierCluster.config-f4daaf92.js +1 -0
  82. package/dist/{hierCluster.interactivity-6d453881.js → hierCluster.interactivity-7f475259.js} +1 -1
  83. package/dist/{hierCluster.renderers-6279d7fb.js → hierCluster.renderers-19b79639.js} +1 -1
  84. package/dist/{html.legend-fac5cb07.js → html.legend-80b2b3ec.js} +1 -1
  85. package/dist/{imagePlot-38254245.js → imagePlot-1ef24562.js} +1 -1
  86. package/dist/{lasso-e8b9500e.js → lasso-1a02a545.js} +1 -1
  87. package/dist/launch.adhoc-e124c993.js +1 -0
  88. package/dist/{leftlabel.sample-afcdcefd.js → leftlabel.sample-59f99ef5.js} +1 -1
  89. package/dist/{legacyDataset-3b08c91a.js → legacyDataset-fbaa5ebb.js} +1 -1
  90. package/dist/{log-4d84c357.js → log-c26b6cfd.js} +1 -1
  91. package/dist/{lollipop-64c5cdfc.js → lollipop-3aebe5d3.js} +1 -1
  92. package/dist/{maf-fd4ffbd0.js → maf-c439c851.js} +1 -1
  93. package/dist/{maftimeline-3e892da7.js → maftimeline-0da64e54.js} +1 -1
  94. package/dist/{matrix-e371888a.js → matrix-38cd47c3.js} +1 -1
  95. package/dist/{matrix.cells-eb4110a7.js → matrix.cells-a018d731.js} +1 -1
  96. package/dist/{matrix.cluster-0df274ed.js → matrix.cluster-a6e713e8.js} +1 -1
  97. package/dist/{matrix.config-3ef822b9.js → matrix.config-2c550b5d.js} +1 -1
  98. package/dist/matrix.controls-42ad4912.js +1 -0
  99. package/dist/{matrix.data-27b8e3a9.js → matrix.data-2b814c9f.js} +1 -1
  100. package/dist/{matrix.dom-1bbe1f39.js → matrix.dom-1e0da5b3.js} +1 -1
  101. package/dist/{matrix.groups-67606700.js → matrix.groups-824a7244.js} +1 -1
  102. package/dist/{matrix.interactivity-cdcc56c9.js → matrix.interactivity-1cb56534.js} +1 -1
  103. package/dist/{matrix.layout-857cd336.js → matrix.layout-47e44357.js} +1 -1
  104. package/dist/{matrix.legend-09f6dc57.js → matrix.legend-9af0c757.js} +1 -1
  105. package/dist/{matrix.renderers-d392fb69.js → matrix.renderers-337ce240.js} +1 -1
  106. package/dist/{matrix.serieses-b03b62aa.js → matrix.serieses-7b7184c9.js} +1 -1
  107. package/dist/{matrix.sort-9440c86a.js → matrix.sort-1ac05842.js} +1 -1
  108. package/dist/{matrix.sorterUi-2c5eb35f.js → matrix.sorterUi-1c60c145.js} +1 -1
  109. package/dist/{mavb-9d86df89.js → mavb-da8d1a0a.js} +1 -1
  110. package/dist/{mds.fimo-bffccb9f.js → mds.fimo-8604c3f8.js} +1 -1
  111. package/dist/{mds.samplescatterplot-b3908cc7.js → mds.samplescatterplot-3f09ae0e.js} +1 -1
  112. package/dist/{mds.survivalplot-9ad7dabc.js → mds.survivalplot-1d8f2b7e.js} +1 -1
  113. package/dist/{metaboliteIntensity-ec3176f4.js → metaboliteIntensity-bbb23c76.js} +1 -1
  114. package/dist/niceNumLabels-29a7c6ca.js +1 -0
  115. package/dist/{nodrag-ab7d5a9f.js → nodrag-b2737073.js} +1 -1
  116. package/dist/{notify-59f61230.js → notify-0cb8904f.js} +1 -1
  117. package/dist/{numeric-4853b665.js → numeric-24dacbee.js} +1 -1
  118. package/dist/{numeric.binary-1dd9a2b4.js → numeric.binary-f382cc98.js} +1 -1
  119. package/dist/{numeric.continuous-ed132eea.js → numeric.continuous-6feb34a7.js} +1 -1
  120. package/dist/{numeric.discrete-d780d076.js → numeric.discrete-ed10bbc1.js} +1 -1
  121. package/dist/{numeric.spline-abe07708.js → numeric.spline-a35cfbf0.js} +1 -1
  122. package/dist/{numeric.toggle-647423dd.js → numeric.toggle-2f98d6e5.js} +1 -1
  123. package/dist/oncomatrix-c0b2d635.js +1 -0
  124. package/dist/{parseData-567f3d70.js → parseData-292648dd.js} +1 -1
  125. package/dist/{plot.2dvaf-4016e75e.js → plot.2dvaf-6ae22dc1.js} +1 -1
  126. package/dist/plot.app-2a805759.js +1 -0
  127. package/dist/plot.barplot-34841e70.js +1 -0
  128. package/dist/{plot.boxplot-76229491.js → plot.boxplot-87ac2ce9.js} +1 -1
  129. package/dist/{plot.brainImaging-39b80a1c.js → plot.brainImaging-32a484b6.js} +1 -1
  130. package/dist/{plot.disco-9a544f9a.js → plot.disco-1fdfee3c.js} +1 -1
  131. package/dist/{plot.dzi-f1658ebf.js → plot.dzi-e3d0f610.js} +1 -1
  132. package/dist/{plot.ssgq-aeb2dabc.js → plot.ssgq-d33113d5.js} +1 -1
  133. package/dist/{plot.vaf2cov-ba8332ed.js → plot.vaf2cov-9f4f1776.js} +1 -1
  134. package/dist/{plot.wsi-2d802557.js → plot.wsi-dea124a7.js} +1 -1
  135. package/dist/{profileBarchart-72adc533.js → profileBarchart-58f0a8c0.js} +1 -1
  136. package/dist/{profileHome-37fd52e5.js → profileHome-7f404152.js} +1 -1
  137. package/dist/{profilePlot-0b897a05.js → profilePlot-4db8ca78.js} +1 -1
  138. package/dist/{profilePolar-a7248d48.js → profilePolar-50b8e40e.js} +1 -1
  139. package/dist/{profileRadar-1ba5d8fd.js → profileRadar-fff0b004.js} +1 -1
  140. package/dist/{profileRadarFacility-452e76ef.js → profileRadarFacility-d6d34c15.js} +1 -1
  141. package/dist/{profileSummary-7f0eacf0.js → profileSummary-04b8b15b.js} +1 -1
  142. package/dist/{recover-74f2e965.js → recover-299ffdb3.js} +1 -1
  143. package/dist/{regression.inputs-ff00f74e.js → regression.inputs-14df7c31.js} +1 -1
  144. package/dist/{regression.inputs.values.table-1753d56b.js → regression.inputs.values.table-d79efa9e.js} +1 -1
  145. package/dist/{regression.results-6f85a5dc.js → regression.results-4767144e.js} +1 -1
  146. package/dist/{renderPvalueTable-17558d6a.js → renderPvalueTable-002cc8ff.js} +1 -1
  147. package/dist/{sampleScatter-97917406.js → sampleScatter-55d9eb74.js} +1 -1
  148. package/dist/{sampleScatter.rendererThree-4649d1ec.js → sampleScatter.rendererThree-ef289434.js} +2 -2
  149. package/dist/{sampleView-f86dc5ea.js → sampleView-1dff3fca.js} +1 -1
  150. package/dist/{samplelst-4a5512df.js → samplelst-d2db0f24.js} +1 -1
  151. package/dist/{samplematrix-1192e5e2.js → samplematrix-0841387f.js} +1 -1
  152. package/dist/{scatter-cc1b0d07.js → scatter-f8285107.js} +1 -1
  153. package/dist/{select2Terms-d4f6ed9e.js → select2Terms-d48d037e.js} +1 -1
  154. package/dist/{selectGenomeWithTklst-b5cfd153.js → selectGenomeWithTklst-9af86d31.js} +1 -1
  155. package/dist/{singleCellCellType-d8c58253.js → singleCellCellType-fd1606b8.js} +1 -1
  156. package/dist/{singleCellGeneExpression-b7209531.js → singleCellGeneExpression-537f1157.js} +1 -1
  157. package/dist/{singleCellPlot-e6f83b2a.js → singleCellPlot-eff5760b.js} +1 -1
  158. package/dist/{singlecell-321dd973.js → singlecell-38336cbc.js} +1 -1
  159. package/dist/{singlecell-879235b3.js → singlecell-87b4b9a9.js} +1 -1
  160. package/dist/{snp-b046b7e6.js → snp-b81ef740.js} +1 -1
  161. package/dist/snp-f6123244.js +1 -0
  162. package/dist/{snplocus-61ff1c10.js → snplocus-acafb1ba.js} +1 -1
  163. package/dist/{spliceevent.a53ss.diagram-1a84db58.js → spliceevent.a53ss.diagram-5f8352eb.js} +1 -1
  164. package/dist/{spliceevent.exonskip.diagram-da10648b.js → spliceevent.exonskip.diagram-0d30a735.js} +1 -1
  165. package/dist/spliceevent.exonskip.getdefault-237c481c.js +1 -0
  166. package/dist/{spliceevent.noeventdiagram-1d6d790d.js → spliceevent.noeventdiagram-df9ce4bc.js} +1 -1
  167. package/dist/{spliceevent.phrase-2ca0ce59.js → spliceevent.phrase-a8401d53.js} +1 -1
  168. package/dist/{stattable-c5f12d9c.js → stattable-46cde32c.js} +1 -1
  169. package/dist/{style.gdc-5b7d90c6.js → style.gdc-72d730f2.js} +1 -1
  170. package/dist/{summary-0624f5e6.js → summary-a6c15c9e.js} +1 -1
  171. package/dist/{sunburst-30295714.js → sunburst-fe95832e.js} +1 -1
  172. package/dist/{survival-fcc7719f.js → survival-52714cd3.js} +1 -1
  173. package/dist/survival-57ff3c03.js +1 -0
  174. package/dist/{svg.download-e89a7369.js → svg.download-f4aa48e4.js} +1 -1
  175. package/dist/{svg.legend-c93f2980.js → svg.legend-749348e0.js} +1 -1
  176. package/dist/{svgraph-6ab3011b.js → svgraph-b46f1f92.js} +1 -1
  177. package/dist/{svmr-3ad3d600.js → svmr-9a76c6d4.js} +1 -1
  178. package/dist/{table-f50a9344.js → table-0daf2b89.js} +1 -1
  179. package/dist/{table-4d3a771e.js → table-bf40249b.js} +1 -1
  180. package/dist/{termInfo-d0a9e65f.js → termInfo-491b10af.js} +1 -1
  181. package/dist/{termdb.bins-01e8cce6.js → termdb.bins-39d11f24.js} +1 -1
  182. package/dist/termsetting-492eefa7.js +1 -0
  183. package/dist/{tk-e74c9beb.js → tk-ac524564.js} +1 -1
  184. package/dist/{toggleButtons-04c5ad7c.js → toggleButtons-c4d6f260.js} +1 -1
  185. package/dist/{tp.ui-7b24f0ef.js → tp.ui-0a476325.js} +1 -1
  186. package/dist/tvs.density-034b506d.js +1 -0
  187. package/dist/{tvs.geneVariant-418ed4ff.js → tvs.geneVariant-c59c8b54.js} +1 -1
  188. package/dist/{tvs.numeric-de14101f.js → tvs.numeric-aa1f892f.js} +1 -1
  189. package/dist/{tvs.samplelst-15bb62f1.js → tvs.samplelst-515f27b9.js} +1 -1
  190. package/dist/{uiUtils-ff2d4a6a.js → uiUtils-ea7dfea2.js} +1 -1
  191. package/dist/{variantBrowser-261373bf.js → variantBrowser-14d5c3f6.js} +1 -1
  192. package/dist/{vcf-145bf5dd.js → vcf-d357ce08.js} +1 -1
  193. package/dist/{violin-e647aac9.js → violin-74d26b75.js} +1 -1
  194. package/dist/{violin.interactivity-30a239fe.js → violin.interactivity-bf40ddde.js} +1 -1
  195. package/dist/{violin.renderer-e29d2700.js → violin.renderer-469fa0ff.js} +1 -1
  196. package/dist/{violinRenderer-08b3b58c.js → violinRenderer-14fa200d.js} +1 -1
  197. package/dist/{viridis-d86ad99b.js → viridis-cc59f478.js} +1 -1
  198. package/dist/{y-06b0d47c.js → y-59cbff5e.js} +1 -1
  199. package/dist/{zoom-d6ef6f3f.js → zoom-f445cfef.js} +1 -1
  200. package/package.json +1 -1
  201. package/dist/app-f031940d.js +0 -1
  202. package/dist/block.lazyload-eda77d9b.js +0 -1
  203. package/dist/controls.config-81cd5749.js +0 -1
  204. package/dist/geneExpression-5685eae2.js +0 -1
  205. package/dist/hierCluster.config-fa799d06.js +0 -1
  206. package/dist/launch.adhoc-2799109b.js +0 -1
  207. package/dist/matrix.controls-42bb2063.js +0 -1
  208. package/dist/niceNumLabels-5f45218a.js +0 -1
  209. package/dist/oncomatrix-7ac995a2.js +0 -1
  210. package/dist/plot.app-d6fe76e2.js +0 -1
  211. package/dist/plot.barplot-d2fc5020.js +0 -1
  212. package/dist/snp-541ec14d.js +0 -1
  213. package/dist/spliceevent.exonskip.getdefault-8028e522.js +0 -1
  214. package/dist/survival-816e055a.js +0 -1
  215. package/dist/termsetting-ad8c4f3a.js +0 -1
  216. package/dist/tvs.density-b2790080.js +0 -1
@@ -1 +1 @@
1
- import{h as t,P as e,b as s,d as i,y as o}from"./app-2cd97738.js";import"./controls-3c1691d7.js";import{i as a,R as l}from"./termsetting-ad8c4f3a.js";import{g as n}from"./FilterRxComp-0f35b322.js";import"./controls.btns-5b1240c8.js";import"./controls.config-81cd5749.js";import"./tslib.es6-c3c2d88f.js";import"path";import"./table-f50a9344.js";import"./partjson.esm-b3f1fc21.js";import"./termdb.bins-01e8cce6.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-f1658ebf.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-2d802557.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-9a544f9a.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-aeb2dabc.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-39b80a1c.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-38254245.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};
1
+ import{h as t,P as e,b as s,d as i,y as o}from"./app-6fb77603.js";import"./controls-268e40e6.js";import{i as a,R as l}from"./termsetting-492eefa7.js";import{g as n}from"./FilterRxComp-02e68f1b.js";import"./controls.btns-5bf9e7d7.js";import"./controls.config-2f0fa061.js";import"./tslib.es6-c3c2d88f.js";import"path";import"./table-0daf2b89.js";import"./partjson.esm-b3f1fc21.js";import"./termdb.bins-39d11f24.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-e3d0f610.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-dea124a7.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-1fdfee3c.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-d33113d5.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-32a484b6.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-1ef24562.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};
@@ -1 +1 @@
1
- import{o as e}from"./termsetting-ad8c4f3a.js";import{r as t}from"./table-f50a9344.js";import"./tslib.es6-c3c2d88f.js";import"./app-2cd97738.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
+ import{o as e}from"./termsetting-492eefa7.js";import{r as t}from"./table-0daf2b89.js";import"./tslib.es6-c3c2d88f.js";import"./app-6fb77603.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-2cd97738.js";import{v as F}from"./vcf-145bf5dd.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-9ad7dabc.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-4134e823.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-6fb77603.js";import{v as F}from"./vcf-d357ce08.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-1d8f2b7e.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-75d4ff92.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 +1 @@
1
- import{h as t,d as e,I as s,P as a,U as i}from"./app-2cd97738.js";import{controlsInit as n}from"./controls-3c1691d7.js";import{c as r}from"./partjson.esm-b3f1fc21.js";import{a as o,b as c}from"./axis-747c801e.js";import"./controls.btns-5b1240c8.js";import"./controls.config-81cd5749.js";import"./termsetting-ad8c4f3a.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
+ import{h as t,d as e,I as s,P as a,U as i}from"./app-6fb77603.js";import{controlsInit as n}from"./controls-268e40e6.js";import{c as r}from"./partjson.esm-b3f1fc21.js";import{a as o,b as c}from"./axis-747c801e.js";import"./controls.btns-5bf9e7d7.js";import"./controls.config-2f0fa061.js";import"./termsetting-492eefa7.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-74f2e965.js";import{M as e}from"./app-2cd97738.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
+ import{h as t}from"./recover-299ffdb3.js";import{M as e}from"./app-6fb77603.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-2cd97738.js";import{a as s}from"./genesearch-41cb55ce.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-4134e823.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-6fb77603.js";import{a as s}from"./genesearch-ffd88bf2.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 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-75d4ff92.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 +1 @@
1
- import{_ as t}from"./tslib.es6-c3c2d88f.js";import{s as e}from"./termsetting-ad8c4f3a.js";import{getHandler as i}from"./categorical-db9b0175.js";import{P as r}from"./app-2cd97738.js";import"path";import"./groupsetting-3fef59f9.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
+ import{_ as t}from"./tslib.es6-c3c2d88f.js";import{s as e}from"./termsetting-492eefa7.js";import{getHandler as i}from"./categorical-1dea48ba.js";import{P as r}from"./app-6fb77603.js";import"path";import"./groupsetting-e3a4ecd5.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-c3c2d88f.js";import{P as n}from"./app-2cd97738.js";function t(e){switch(e){case"./numeric.binary.ts":return import("./numeric.binary-1dd9a2b4.js");case"./numeric.continuous.ts":return import("./numeric.continuous-ed132eea.js");case"./numeric.discrete.ts":return import("./numeric.discrete-d780d076.js");case"./numeric.spline.ts":return import("./numeric.spline-abe07708.js");case"./numeric.toggle.ts":return import("./numeric.toggle-647423dd.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-6fb77603.js";function t(e){switch(e){case"./numeric.binary.ts":return import("./numeric.binary-f382cc98.js");case"./numeric.continuous.ts":return import("./numeric.continuous-6feb34a7.js");case"./numeric.discrete.ts":return import("./numeric.discrete-ed10bbc1.js");case"./numeric.spline.ts":return import("./numeric.spline-a35cfbf0.js");case"./numeric.toggle.ts":return import("./numeric.toggle-2f98d6e5.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};