@sjcrh/proteinpaint-client 2.166.0 → 2.167.1

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 (882) hide show
  1. package/dist/2dmaf-6M6QWXAQ.js +1364 -0
  2. package/dist/AIProjectAdmin-2NHMC3IV.js +780 -0
  3. package/dist/AppHeader-CTHEWSZD.js +813 -0
  4. package/dist/BoxPlot-3U6ZAKKO.js +44 -0
  5. package/dist/CorrelationVolcano-2ASIR6KY.js +616 -0
  6. package/dist/DifferentialAnalysis-C3NYGF7U.js +237 -0
  7. package/dist/Disco-2QLBZ3X5.js +3089 -0
  8. package/dist/Disco.UI-GPIIPM2P.js +238 -0
  9. package/dist/DziViewer-OHPZOH72.js +16328 -0
  10. package/dist/GB-FH6YQGHI.js +1099 -0
  11. package/dist/HicApp-TI2II3SZ.js +2218 -0
  12. package/dist/NumBinaryEditor-O42T63EX.js +259 -0
  13. package/dist/NumBinaryEditor.unit.spec-UMB2PHT5.js +277 -0
  14. package/dist/NumContEditor-7NOUKPCV.js +98 -0
  15. package/dist/NumContEditor.unit.spec-JGXJ2HLE.js +160 -0
  16. package/dist/NumCustomBinEditor-6CHN3KX3.js +29 -0
  17. package/dist/NumCustomBinEditor.unit.spec-RJPQLE3E.js +275 -0
  18. package/dist/NumDiscreteEditor-AFTUKU4K.js +145 -0
  19. package/dist/NumDiscreteEditor.unit.spec-GKR6ZNBQ.js +193 -0
  20. package/dist/NumRegularBinEditor-UJ5WQPHR.js +29 -0
  21. package/dist/NumRegularBinEditor.unit.spec-5HGJQEX7.js +220 -0
  22. package/dist/NumSplineEditor-JANA2DUE.js +181 -0
  23. package/dist/NumSplineEditor.unit.spec-UYAMAKZD.js +190 -0
  24. package/dist/NumericDensity-YE5R4CNP.js +29 -0
  25. package/dist/NumericDensity.unit.spec-SVEB5U2S.js +212 -0
  26. package/dist/NumericHandler-WW4M7YW2.js +30 -0
  27. package/dist/NumericHandler.unit.spec-2BWDFO53.js +210 -0
  28. package/dist/SC-UGJGMBL7.js +714 -0
  29. package/dist/Volcano-IU76MEIL.js +1018 -0
  30. package/dist/WSIViewer-3S7N4UDO.js +46959 -0
  31. package/dist/WsiSamplesPlot-4CAOHWCL.js +153 -0
  32. package/dist/adSandbox-AEBS3RTL.js +29 -0
  33. package/dist/alphaGenome-F2PB4SGI.js +170 -0
  34. package/dist/app-6SKETLMT.js +28 -0
  35. package/dist/app-GBEF2HBR.js +54 -0
  36. package/dist/app.js +16 -16
  37. package/dist/bam-5SE6XQJV.js +842 -0
  38. package/dist/barchart-AUSOT2XB.js +48 -0
  39. package/dist/barchart.data-GYCNBRPY.js +30 -0
  40. package/dist/barchart.events-QTSWNYXO.js +44 -0
  41. package/dist/barchart.integration.spec-LORJLJVX.js +1600 -0
  42. package/dist/bars.renderer-4N4QOUNI.js +12 -0
  43. package/dist/bars.settings-SDU7PZOS.js +10 -0
  44. package/dist/block-QLSIELXK.js +6291 -0
  45. package/dist/block.init-OOLEA6ZK.js +29 -0
  46. package/dist/block.mds.expressionrank-D2KUISXZ.js +350 -0
  47. package/dist/block.mds.geneboxplot-AMYBWXPS.js +819 -0
  48. package/dist/block.mds.junction-OG335MBK.js +1536 -0
  49. package/dist/block.mds.svcnv-WYDBQ6FV.js +6792 -0
  50. package/dist/block.svg-OH73245R.js +155 -0
  51. package/dist/block.tk.aicheck-CG5THFW2.js +274 -0
  52. package/dist/block.tk.ase-G2L3G5MQ.js +356 -0
  53. package/dist/block.tk.bam-DXWCA6EU.js +1897 -0
  54. package/dist/block.tk.bedgraphdot-LF3TFPNL.js +375 -0
  55. package/dist/block.tk.bigwig.ui-JKXZ3VDF.js +202 -0
  56. package/dist/block.tk.hicstraw-ZK4RKFB6.js +814 -0
  57. package/dist/block.tk.junction-ZB7Q2NLB.js +2355 -0
  58. package/dist/block.tk.junction.textmatrixui-ZYNQWKIW.js +190 -0
  59. package/dist/block.tk.ld-7H64HGER.js +90 -0
  60. package/dist/block.tk.menu-WFVKAH74.js +1020 -0
  61. package/dist/block.tk.pgv-632LLSBI.js +935 -0
  62. package/dist/brainImaging-AEPTHIQF.js +417 -0
  63. package/dist/chat-3XZCAFDD.js +142 -0
  64. package/dist/chat-3XZCAFDD.js.map +7 -0
  65. package/dist/chunk-22O6F463.js +619 -0
  66. package/dist/chunk-2HJ7OD7H.js +252 -0
  67. package/dist/chunk-2MN5JLZB.js +2878 -0
  68. package/dist/chunk-2OVIUIIL.js +1720 -0
  69. package/dist/chunk-2OVIUIIL.js.map +7 -0
  70. package/dist/chunk-37CK5IGW.js +480 -0
  71. package/dist/chunk-3JFEWVHR.js +80 -0
  72. package/dist/chunk-3MGBC64I.js +133 -0
  73. package/dist/chunk-3NWLWH4G.js +6364 -0
  74. package/dist/chunk-46T54RUY.js +1133 -0
  75. package/dist/chunk-46T54RUY.js.map +7 -0
  76. package/dist/chunk-4GKQ5PWY.js +142 -0
  77. package/dist/chunk-4PHD5H4A.js +226 -0
  78. package/dist/chunk-56IFQMJK.js +413 -0
  79. package/dist/chunk-5AMBV2JE.js +797 -0
  80. package/dist/chunk-5AMBV2JE.js.map +7 -0
  81. package/dist/chunk-5DMFTXUZ.js +158 -0
  82. package/dist/chunk-5QJDZHRU.js +95 -0
  83. package/dist/chunk-5WAVKWL6.js +1275 -0
  84. package/dist/chunk-6ISTNHM6.js +144 -0
  85. package/dist/chunk-6VQ4C735.js +1536 -0
  86. package/dist/chunk-74WMSW3E.js +229 -0
  87. package/dist/chunk-AFU66YOW.js +459 -0
  88. package/dist/chunk-AUJ2YUXV.js +14 -0
  89. package/dist/chunk-B65X5UQH.js +518 -0
  90. package/dist/chunk-B6I64LSV.js +634 -0
  91. package/dist/chunk-BAJ74DKS.js +419 -0
  92. package/dist/chunk-BAJ74DKS.js.map +7 -0
  93. package/dist/chunk-BTYCW3D5.js +85 -0
  94. package/dist/chunk-CCB5KYFQ.js +1415 -0
  95. package/dist/chunk-CKLYFA7H.js +467 -0
  96. package/dist/chunk-CLYRJ466.js +272 -0
  97. package/dist/chunk-CPHCZZWT.js +82 -0
  98. package/dist/chunk-CUADOD2T.js +217 -0
  99. package/dist/chunk-CV6ID6T7.js +422 -0
  100. package/dist/chunk-CWHBWY3B.js +190 -0
  101. package/dist/chunk-D53HBTYQ.js +238 -0
  102. package/dist/chunk-DDOM4XYV.js +1177 -0
  103. package/dist/chunk-DDOM4XYV.js.map +7 -0
  104. package/dist/chunk-DKI7YOTJ.js +196 -0
  105. package/dist/chunk-DNU4IPD2.js +165 -0
  106. package/dist/chunk-FN5XPUPH.js +83 -0
  107. package/dist/chunk-FN5XPUPH.js.map +7 -0
  108. package/dist/chunk-GLSDMBHR.js +55 -0
  109. package/dist/chunk-GLSDMBHR.js.map +7 -0
  110. package/dist/chunk-H3BSKMND.js +487 -0
  111. package/dist/chunk-H3BSKMND.js.map +7 -0
  112. package/dist/chunk-H6HP4H3U.js +2327 -0
  113. package/dist/chunk-HPEMEDXB.js +123 -0
  114. package/dist/chunk-HUDESZGX.js +1151 -0
  115. package/dist/chunk-ITJ2SXU5.js +467 -0
  116. package/dist/chunk-ITJ2SXU5.js.map +7 -0
  117. package/dist/chunk-J7IU77CA.js +166 -0
  118. package/dist/chunk-JMO7ENSD.js +381 -0
  119. package/dist/chunk-JTPN3BRG.js +129 -0
  120. package/dist/chunk-KCAMFDJH.js +323 -0
  121. package/dist/chunk-LD45BCVM.js +177 -0
  122. package/dist/chunk-LMELY5Z2.js +1412 -0
  123. package/dist/chunk-LVQK62CV.js +215 -0
  124. package/dist/chunk-MCVLRF66.js +157 -0
  125. package/dist/chunk-MK7RRJTX.js +1968 -0
  126. package/dist/chunk-MK7RRJTX.js.map +7 -0
  127. package/dist/chunk-MLD7DW5I.js +613 -0
  128. package/dist/chunk-NEF7LGNE.js +2789 -0
  129. package/dist/chunk-O7BAQPP3.js +256 -0
  130. package/dist/chunk-O7BAQPP3.js.map +7 -0
  131. package/dist/chunk-OARG7PAV.js +401 -0
  132. package/dist/chunk-OGCF6E6I.js +4947 -0
  133. package/dist/chunk-OGCF6E6I.js.map +7 -0
  134. package/dist/chunk-OGWY4MOB.js +748 -0
  135. package/dist/chunk-PQD6K5W5.js +2784 -0
  136. package/dist/chunk-Q4FYGFTQ.js +91 -0
  137. package/dist/chunk-QX5QVWUP.js +451 -0
  138. package/dist/chunk-QX5QVWUP.js.map +7 -0
  139. package/dist/chunk-RA2KI64U.js +303 -0
  140. package/dist/chunk-RHHLAKYS.js +1088 -0
  141. package/dist/chunk-RKV3CP4C.js +258 -0
  142. package/dist/chunk-RL7RU2V7.js +368 -0
  143. package/dist/chunk-RQ7CE7SK.js +161 -0
  144. package/dist/chunk-RX552WU6.js +1143 -0
  145. package/dist/chunk-S7V4SFKB.js +276 -0
  146. package/dist/chunk-SEL5UNRC.js +142 -0
  147. package/dist/chunk-SRBO57AD.js +297 -0
  148. package/dist/chunk-SYGLOTOV.js +1197 -0
  149. package/dist/chunk-TGZA4ETW.js +311 -0
  150. package/dist/chunk-TGZA4ETW.js.map +7 -0
  151. package/dist/chunk-UZ466XO3.js +203 -0
  152. package/dist/chunk-VDF5W47R.js +149 -0
  153. package/dist/chunk-W4SEWZF2.js +279 -0
  154. package/dist/chunk-W4SEWZF2.js.map +7 -0
  155. package/dist/chunk-W5EG334J.js +15083 -0
  156. package/dist/chunk-W5EG334J.js.map +7 -0
  157. package/dist/chunk-WTPVXDJT.js +31 -0
  158. package/dist/chunk-XRIM2YJZ.js +228 -0
  159. package/dist/chunk-YSWMQO23.js +55 -0
  160. package/dist/chunk-ZBZXIWSK.js +402 -0
  161. package/dist/chunk-ZFFHOEBE.js +117 -0
  162. package/dist/chunk-ZG63ZUDE.js +102 -0
  163. package/dist/chunk-ZGQ3BMLW.js +2676 -0
  164. package/dist/chunk-ZNINQ3FN.js +293 -0
  165. package/dist/chunk-ZQZWM544.js +4172 -0
  166. package/dist/condition-4FVKPSQ2.js +323 -0
  167. package/dist/controls-ZWBN566I.js +35 -0
  168. package/dist/controls.btns-H4TWTHTW.js +10 -0
  169. package/dist/controls.config-YU4W3CDL.js +31 -0
  170. package/dist/correlation-VADB4SQO.js +102 -0
  171. package/dist/cuminc-4BXE2YS6.js +1143 -0
  172. package/dist/cuminc.integration.spec-XQREKHVA.js +669 -0
  173. package/dist/customdata.inputui-VBQWT3M7.js +278 -0
  174. package/dist/dataDownload-QIZKBKH7.js +320 -0
  175. package/dist/dataDownload.integration.spec-MLJEHLYD.js +184 -0
  176. package/dist/databrowser.ui-6UIR4ULJ.js +426 -0
  177. package/dist/dictionary-FLWIWAC6.js +90 -0
  178. package/dist/e2pca-NKWSJRXM.js +341 -0
  179. package/dist/ep-EPN3AR6D.js +1247 -0
  180. package/dist/expclust.gdc.spec-ZRUH5E6E.js +298 -0
  181. package/dist/facet-BM7SLACF.js +437 -0
  182. package/dist/frequencyChart-HBXRIBAW.js +371 -0
  183. package/dist/frequencyChart.integration.spec-YJUYZWM6.js +301 -0
  184. package/dist/geneExpClustering-4VD5PAWN.js +242 -0
  185. package/dist/geneExpression-6OT2Y4P6.js +54 -0
  186. package/dist/geneExpression-EAMEZXJQ.js +310 -0
  187. package/dist/geneORA-RI2AG7JT.js +272 -0
  188. package/dist/geneVariant-FYYEOTWA.js +32 -0
  189. package/dist/geneVariant-PAKVDVC4.js +29 -0
  190. package/dist/genefusion.ui-QWC42XWQ.js +242 -0
  191. package/dist/geneset-XA6IWP3Q.js +186 -0
  192. package/dist/genomeBrowser.spec-LRKXWXNT.js +272 -0
  193. package/dist/grin2-O6TETVZ3.js +1044 -0
  194. package/dist/grin2-O6TETVZ3.js.map +7 -0
  195. package/dist/grin2-WLB7BY3S.js +1547 -0
  196. package/dist/gsea-ZM4WOPSQ.js +43 -0
  197. package/dist/hierCluster-LD43LLRC.js +60 -0
  198. package/dist/hierCluster-ZGYRS2WV.js +56 -0
  199. package/dist/hierCluster.config-O5HUOFNH.js +32 -0
  200. package/dist/hierCluster.integration.spec-37UNKHTH.js +389 -0
  201. package/dist/hierCluster.interactivity-B27ETKRP.js +45 -0
  202. package/dist/hierCluster.renderers-GWFH5ZX7.js +21 -0
  203. package/dist/imagePlot-LJZVGNDJ.js +134 -0
  204. package/dist/importPlot-RMVENQRD.js +8 -0
  205. package/dist/launch.adhoc-S3XHRSLN.js +36 -0
  206. package/dist/leftlabel.sample-J6PCA3UB.js +249 -0
  207. package/dist/lollipop-OZTV4C7A.js +159 -0
  208. package/dist/maf-3SRLCKGO.js +435 -0
  209. package/dist/maf-3SRLCKGO.js.map +7 -0
  210. package/dist/maftimeline-6F2LQJU6.js +584 -0
  211. package/dist/matrix-FIXOFAB4.js +60 -0
  212. package/dist/matrix-O5KPDLM2.js +55 -0
  213. package/dist/matrix.cells-SCLZA3P4.js +30 -0
  214. package/dist/matrix.config-WG7HFJL4.js +33 -0
  215. package/dist/matrix.controls-QQLBUUYP.js +31 -0
  216. package/dist/matrix.data-6JLF5HVI.js +35 -0
  217. package/dist/matrix.dom-QO7BXZ27.js +11 -0
  218. package/dist/matrix.groups-QMZMZ6Q7.js +26 -0
  219. package/dist/matrix.integration.spec-ZJYWNQ57.js +2936 -0
  220. package/dist/matrix.interactivity-ZZY5ET4E.js +36 -0
  221. package/dist/matrix.layout-XKFB4PKY.js +35 -0
  222. package/dist/matrix.legend-CS6DNC5V.js +22 -0
  223. package/dist/matrix.renderers-4LST6PBA.js +29 -0
  224. package/dist/matrix.serieses-3SERD6CV.js +21 -0
  225. package/dist/matrix.sort-UVS6WHIS.js +27 -0
  226. package/dist/matrix.sort.unit.spec-CTSUNUWB.js +464 -0
  227. package/dist/matrix.sorterUi-JDGLTLJM.js +18 -0
  228. package/dist/matrix.sorterUi.unit.spec-VQFMHIYI.js +335 -0
  229. package/dist/mavb-ECQ2CQ7F.js +723 -0
  230. package/dist/mds.fimo-JDYDT5NK.js +509 -0
  231. package/dist/mds.samplescatterplot-PEJBVSTO.js +1541 -0
  232. package/dist/mds.survivalplot-GYK6VRQT.js +474 -0
  233. package/dist/mutationSignature-43SECPTY.js +72 -0
  234. package/dist/numericDictTermCluster-2ER4FUKO.js +72 -0
  235. package/dist/oncomatrix-ZXDJMLN3.js +287 -0
  236. package/dist/oncomatrix.spec-HOPRIG3I.js +439 -0
  237. package/dist/plot.2dvaf-Y4SZUHLD.js +368 -0
  238. package/dist/plot.app-W5Z3C7P5.js +35 -0
  239. package/dist/plot.barplot-B2PRZDKV.js +93 -0
  240. package/dist/plot.boxplot-J7ET34FY.js +143 -0
  241. package/dist/plot.brainImaging-ISY4P6RT.js +51 -0
  242. package/dist/plot.disco-D7AL42PW.js +100 -0
  243. package/dist/plot.dzi-O32LH65U.js +33 -0
  244. package/dist/plot.ssgq-WF7262IZ.js +130 -0
  245. package/dist/plot.vaf2cov-OB6UKSFQ.js +250 -0
  246. package/dist/plot.wsi-J5S4YYXN.js +36 -0
  247. package/dist/polar-LIJORXR6.js +179 -0
  248. package/dist/profile.spec-3KE4CREI.js +71 -0
  249. package/dist/profileBarchart-UQHOJB5V.js +260 -0
  250. package/dist/profileForms-WTYVTIUN.js +365 -0
  251. package/dist/profilePlot-SOXXEUAT.js +50 -0
  252. package/dist/profileRadar-2OHJ2RIU.js +256 -0
  253. package/dist/profileRadarFacility-GHLG3QNG.js +256 -0
  254. package/dist/qualitative-B3OY7A7P.js +34 -0
  255. package/dist/regression-HO2TO4XT.js +57 -0
  256. package/dist/regression.inputs-JN3ZMIOP.js +49 -0
  257. package/dist/regression.inputs.term-67HVMXFZ.js +49 -0
  258. package/dist/regression.inputs.values.table-JXJK2YZT.js +46 -0
  259. package/dist/regression.integration.spec-L54ZS5VY.js +777 -0
  260. package/dist/regression.results-3ZSFKUNN.js +31 -0
  261. package/dist/regression.spec-SVWCQX2U.js +699 -0
  262. package/dist/report-IHX7XSOI.js +220 -0
  263. package/dist/runChart-QLQMK3OE.js +54 -0
  264. package/dist/runchart.integration.spec-5NVY5GHR.js +362 -0
  265. package/dist/sampleScatter.spec-4Q5CQQWH.js +193 -0
  266. package/dist/sampleView-7WHDFHB5.js +42 -0
  267. package/dist/samplelst-34GJVLVD.js +102 -0
  268. package/dist/samplematrix-L2HOSLUT.js +2189 -0
  269. package/dist/scatter-X6AAM2LJ.js +55 -0
  270. package/dist/scatter.integration.spec-QSH3PLBK.js +1026 -0
  271. package/dist/selectGenomeWithTklst-AJS2IPPW.js +125 -0
  272. package/dist/singleCellPlot-7JEWDVSR.js +50 -0
  273. package/dist/singlecell-IC5KU72L.js +1563 -0
  274. package/dist/singlecell-NWANPXWM.js +80 -0
  275. package/dist/snp-PSRNMTL6.js +73 -0
  276. package/dist/snplocus-QCAVDYLR.js +199 -0
  277. package/dist/spliceevent.a53ss.diagram-SGDJKUEC.js +142 -0
  278. package/dist/spliceevent.exonskip.diagram-BUYTHCK5.js +268 -0
  279. package/dist/spliceevent.noeventdiagram-OJZJUHXP.js +451 -0
  280. package/dist/ssGSEA-UUZG57MF.js +53 -0
  281. package/dist/stattable-324FS2HA.js +89 -0
  282. package/dist/summarizeCnvGeneexp-ZVZYWP43.js +136 -0
  283. package/dist/summarizeGeneexpSurvival-7XJRMT6M.js +90 -0
  284. package/dist/summarizeMutationDiagnosis-ZKLXOVY2.js +32 -0
  285. package/dist/summarizeMutationSurvival-S4YPGLWA.js +92 -0
  286. package/dist/summary-RVG7JL6Y.js +55 -0
  287. package/dist/summary.integration.spec-SCD35GO4.js +405 -0
  288. package/dist/summaryInput-DMN6DTSW.js +170 -0
  289. package/dist/sunburst-QZXYILRC.js +275 -0
  290. package/dist/survival-6CWEBRSF.js +41 -0
  291. package/dist/survival-J657VYLI.js +49 -0
  292. package/dist/survival.integration.spec-S5WE4V6M.js +601 -0
  293. package/dist/svgraph-NEKJL24M.js +1378 -0
  294. package/dist/svmr-5RQ5JQF2.js +3833 -0
  295. package/dist/table-CG6Z6NCJ.js +193 -0
  296. package/dist/termCollection-FOQNVXB7.js +80 -0
  297. package/dist/termInfo-5USFZGDB.js +9 -0
  298. package/dist/tk-2O7XOVGJ.js +37 -0
  299. package/dist/tp.ui-S4YUVCZH.js +1450 -0
  300. package/dist/tvs.dtcnv.continuous-7BPIXZ6C.js +65 -0
  301. package/dist/tvs.numeric-FCC2EY62.js +355 -0
  302. package/dist/tvs.samplelst-PKGFTULN.js +95 -0
  303. package/dist/violin-C7IBRTYP.js +47 -0
  304. package/dist/violin.integration.spec-WXRD3Z4E.js +1425 -0
  305. package/dist/violin.interactivity-BMG4TG5L.js +39 -0
  306. package/dist/violin.renderer-WUNW6ULV.js +31 -0
  307. package/dist/vocabulary-UUNEEBM3.js +32 -0
  308. package/package.json +3 -3
  309. package/dist/2dmaf-E4NOGWWO.js +0 -1364
  310. package/dist/AIProjectAdmin-3QDXMCOK.js +0 -780
  311. package/dist/AppHeader-IFZ57DJE.js +0 -813
  312. package/dist/BoxPlot-GXDTPRA5.js +0 -44
  313. package/dist/CorrelationVolcano-S4GUYIPT.js +0 -616
  314. package/dist/DifferentialAnalysis-YLKYWPUT.js +0 -237
  315. package/dist/Disco-OQMP3HRQ.js +0 -3089
  316. package/dist/Disco.UI-XB3XQP33.js +0 -238
  317. package/dist/DziViewer-UIRNTFNS.js +0 -16328
  318. package/dist/GB-KDPJTOLP.js +0 -1099
  319. package/dist/HicApp-XJERMLKH.js +0 -2218
  320. package/dist/NumBinaryEditor-5MWWWNLW.js +0 -259
  321. package/dist/NumBinaryEditor.unit.spec-ROGT5FOH.js +0 -277
  322. package/dist/NumContEditor-RRCB4CKG.js +0 -98
  323. package/dist/NumContEditor.unit.spec-AJTKOF7W.js +0 -160
  324. package/dist/NumCustomBinEditor-3GJITZ7V.js +0 -29
  325. package/dist/NumCustomBinEditor.unit.spec-DNBDZSHT.js +0 -275
  326. package/dist/NumDiscreteEditor-TARWA6CZ.js +0 -145
  327. package/dist/NumDiscreteEditor.unit.spec-TCSLTQ25.js +0 -193
  328. package/dist/NumRegularBinEditor-QF5ALVV4.js +0 -29
  329. package/dist/NumRegularBinEditor.unit.spec-GFNDBWNM.js +0 -220
  330. package/dist/NumSplineEditor-MOEUXR34.js +0 -181
  331. package/dist/NumSplineEditor.unit.spec-XPJOOXS4.js +0 -190
  332. package/dist/NumericDensity-JDE263EQ.js +0 -29
  333. package/dist/NumericDensity.unit.spec-RX6UGV56.js +0 -212
  334. package/dist/NumericHandler-XM7LUYHN.js +0 -30
  335. package/dist/NumericHandler.unit.spec-5EYRMII7.js +0 -210
  336. package/dist/SC-Z4KBNK7P.js +0 -714
  337. package/dist/Volcano-WYJLKM4K.js +0 -1018
  338. package/dist/WSIViewer-3RMG3VOA.js +0 -46959
  339. package/dist/WsiSamplesPlot-PAWNKI7R.js +0 -153
  340. package/dist/adSandbox-7H5H46SE.js +0 -29
  341. package/dist/alphaGenome-PODWDV5T.js +0 -170
  342. package/dist/app-JPURIGQW.js +0 -28
  343. package/dist/app-YL7S55T5.js +0 -54
  344. package/dist/bam-XEO47VYA.js +0 -842
  345. package/dist/barchart-B5M6SSJH.js +0 -48
  346. package/dist/barchart.data-6A6WVV4Y.js +0 -30
  347. package/dist/barchart.events-2GNB5KWY.js +0 -44
  348. package/dist/barchart.integration.spec-JEOTKIWC.js +0 -1600
  349. package/dist/bars.renderer-NLUBMQEO.js +0 -12
  350. package/dist/bars.settings-UQZ63KU4.js +0 -8
  351. package/dist/block-B7WMYLPO.js +0 -6291
  352. package/dist/block.init-KCIXEYQC.js +0 -29
  353. package/dist/block.mds.expressionrank-RYZXAH5Y.js +0 -350
  354. package/dist/block.mds.geneboxplot-LNWUEI6N.js +0 -819
  355. package/dist/block.mds.junction-CVIY7QMD.js +0 -1536
  356. package/dist/block.mds.svcnv-EUGWHSCA.js +0 -6792
  357. package/dist/block.svg-QBLNIGUF.js +0 -155
  358. package/dist/block.tk.aicheck-U6NG22FX.js +0 -274
  359. package/dist/block.tk.ase-U3TRZAOH.js +0 -356
  360. package/dist/block.tk.bam-6Y6YFVR2.js +0 -1897
  361. package/dist/block.tk.bedgraphdot-O3VCFX6K.js +0 -375
  362. package/dist/block.tk.bigwig.ui-DNBJAF72.js +0 -202
  363. package/dist/block.tk.hicstraw-2EIFJX7E.js +0 -814
  364. package/dist/block.tk.junction-UXSO5EJP.js +0 -2355
  365. package/dist/block.tk.junction.textmatrixui-HQ6ZKCHM.js +0 -190
  366. package/dist/block.tk.ld-NEB4F3UG.js +0 -90
  367. package/dist/block.tk.menu-BN4JPJSD.js +0 -1020
  368. package/dist/block.tk.pgv-A4QFVSPF.js +0 -935
  369. package/dist/brainImaging-ESQGNGZH.js +0 -417
  370. package/dist/chat-AY7RCQYY.js +0 -145
  371. package/dist/chat-AY7RCQYY.js.map +0 -7
  372. package/dist/chunk-236ZRGXA.js +0 -297
  373. package/dist/chunk-2DZWOGEH.js +0 -272
  374. package/dist/chunk-2HQJMZNY.js +0 -14
  375. package/dist/chunk-2MRZFUHZ.js +0 -165
  376. package/dist/chunk-2ZEORJCF.js +0 -215
  377. package/dist/chunk-3WA7SJTR.js +0 -82
  378. package/dist/chunk-47HG7LGD.js +0 -133
  379. package/dist/chunk-47X254B7.js +0 -91
  380. package/dist/chunk-4TPDYPGD.js +0 -1098
  381. package/dist/chunk-4TPDYPGD.js.map +0 -7
  382. package/dist/chunk-4WA2H5DE.js +0 -75
  383. package/dist/chunk-4WA2H5DE.js.map +0 -7
  384. package/dist/chunk-4XDKCFFT.js +0 -613
  385. package/dist/chunk-5CJJLBUZ.js +0 -229
  386. package/dist/chunk-5TDKRZN5.js +0 -1931
  387. package/dist/chunk-5TDKRZN5.js.map +0 -7
  388. package/dist/chunk-6MSJ3TLQ.js +0 -1151
  389. package/dist/chunk-7JAFXNAL.js +0 -256
  390. package/dist/chunk-7JAFXNAL.js.map +0 -7
  391. package/dist/chunk-7LKSKJCV.js +0 -480
  392. package/dist/chunk-7P67W6NF.js +0 -190
  393. package/dist/chunk-7RIC35AF.js +0 -129
  394. package/dist/chunk-A76B53VT.js +0 -158
  395. package/dist/chunk-AZ276Z7T.js +0 -2327
  396. package/dist/chunk-B662XJMJ.js +0 -748
  397. package/dist/chunk-BK7GIOC5.js +0 -4924
  398. package/dist/chunk-BK7GIOC5.js.map +0 -7
  399. package/dist/chunk-BP2F2GRB.js +0 -2676
  400. package/dist/chunk-BRO4KZSZ.js +0 -417
  401. package/dist/chunk-BRO4KZSZ.js.map +0 -7
  402. package/dist/chunk-C5YNONHQ.js +0 -144
  403. package/dist/chunk-CT3LPTWW.js +0 -1197
  404. package/dist/chunk-CZTC4MTE.js +0 -161
  405. package/dist/chunk-DA5VGV5L.js +0 -280
  406. package/dist/chunk-DA5VGV5L.js.map +0 -7
  407. package/dist/chunk-DPU66MZ7.js +0 -381
  408. package/dist/chunk-E6NE5IWR.js +0 -102
  409. package/dist/chunk-ECKWM4HB.js +0 -1536
  410. package/dist/chunk-EEX5VPJG.js +0 -467
  411. package/dist/chunk-EIMEUZP2.js +0 -323
  412. package/dist/chunk-ETFPL4UP.js +0 -4172
  413. package/dist/chunk-F3FTQWTA.js +0 -303
  414. package/dist/chunk-F4APZ34G.js +0 -55
  415. package/dist/chunk-FOXJTDTH.js +0 -166
  416. package/dist/chunk-FYTZCTJC.js +0 -1157
  417. package/dist/chunk-FYTZCTJC.js.map +0 -7
  418. package/dist/chunk-GBS5I24E.js +0 -1706
  419. package/dist/chunk-GBS5I24E.js.map +0 -7
  420. package/dist/chunk-GBWRKJAH.js +0 -413
  421. package/dist/chunk-GG67VPVD.js +0 -238
  422. package/dist/chunk-GZ2B634M.js +0 -123
  423. package/dist/chunk-HEFXMCSF.js +0 -6364
  424. package/dist/chunk-I26R4NJJ.js +0 -228
  425. package/dist/chunk-I2GCD26Y.js +0 -55
  426. package/dist/chunk-I2GCD26Y.js.map +0 -7
  427. package/dist/chunk-ICNJQHQZ.js +0 -117
  428. package/dist/chunk-IPAGDFO4.js +0 -80
  429. package/dist/chunk-J2E4FALN.js +0 -1415
  430. package/dist/chunk-JXHU2FIA.js +0 -2789
  431. package/dist/chunk-K7LZ77GD.js +0 -468
  432. package/dist/chunk-K7LZ77GD.js.map +0 -7
  433. package/dist/chunk-KACWSU3U.js +0 -487
  434. package/dist/chunk-KACWSU3U.js.map +0 -7
  435. package/dist/chunk-KGSCQRQ5.js +0 -203
  436. package/dist/chunk-KGYPMYQD.js +0 -1143
  437. package/dist/chunk-L3PMRBTA.js +0 -422
  438. package/dist/chunk-M7QVMSRW.js +0 -293
  439. package/dist/chunk-MG6GRQKO.js +0 -459
  440. package/dist/chunk-N5VBIEH5.js +0 -1412
  441. package/dist/chunk-NRYOB7WU.js +0 -252
  442. package/dist/chunk-NXOWHUR4.js +0 -311
  443. package/dist/chunk-NXOWHUR4.js.map +0 -7
  444. package/dist/chunk-OFQV6PRB.js +0 -1275
  445. package/dist/chunk-OMO754MK.js +0 -177
  446. package/dist/chunk-OQSP66C6.js +0 -226
  447. package/dist/chunk-OS46MR72.js +0 -368
  448. package/dist/chunk-PBJFLQGL.js +0 -142
  449. package/dist/chunk-PMZS3SHH.js +0 -2877
  450. package/dist/chunk-PPJSDC3Z.js +0 -157
  451. package/dist/chunk-QIS45Z4Y.js +0 -2784
  452. package/dist/chunk-RCVZ4L7K.js +0 -402
  453. package/dist/chunk-ROWCKPNW.js +0 -1088
  454. package/dist/chunk-RQUXELHE.js +0 -276
  455. package/dist/chunk-RYRCMHYR.js +0 -196
  456. package/dist/chunk-S7EKSDVS.js +0 -258
  457. package/dist/chunk-SN5QKRXO.js +0 -85
  458. package/dist/chunk-TZRD3FPN.js +0 -634
  459. package/dist/chunk-U5QRRS7K.js +0 -619
  460. package/dist/chunk-UOMRXQNW.js +0 -401
  461. package/dist/chunk-UT6W4ZZL.js +0 -15048
  462. package/dist/chunk-UT6W4ZZL.js.map +0 -7
  463. package/dist/chunk-UZV3QI5M.js +0 -518
  464. package/dist/chunk-VALBVQXS.js +0 -217
  465. package/dist/chunk-VDR5JXI2.js +0 -444
  466. package/dist/chunk-VDR5JXI2.js.map +0 -7
  467. package/dist/chunk-W4D2EYE4.js +0 -95
  468. package/dist/chunk-XATIKUGU.js +0 -142
  469. package/dist/chunk-ZHWC5SJP.js +0 -797
  470. package/dist/chunk-ZHWC5SJP.js.map +0 -7
  471. package/dist/chunk-ZL4CNBYY.js +0 -149
  472. package/dist/chunk-ZQ7L66GP.js +0 -31
  473. package/dist/condition-24HPVH23.js +0 -323
  474. package/dist/controls-5CSAKANR.js +0 -35
  475. package/dist/controls.btns-QLLBCT65.js +0 -10
  476. package/dist/controls.config-H4FMU5LI.js +0 -31
  477. package/dist/correlation-RB77VSXB.js +0 -102
  478. package/dist/cuminc-YZSLH5IO.js +0 -1143
  479. package/dist/cuminc.integration.spec-MZPT3Y5A.js +0 -669
  480. package/dist/customdata.inputui-CBTZFODT.js +0 -278
  481. package/dist/dataDownload-ZTGRVI4Q.js +0 -320
  482. package/dist/dataDownload.integration.spec-Q6GUTUYD.js +0 -184
  483. package/dist/databrowser.ui-V7E6CLUZ.js +0 -426
  484. package/dist/dictionary-RPC5OZMM.js +0 -90
  485. package/dist/e2pca-WDQHMAUM.js +0 -341
  486. package/dist/ep-NAM34BBI.js +0 -1247
  487. package/dist/expclust.gdc.spec-QB4GVDJA.js +0 -298
  488. package/dist/facet-DOXBBIG6.js +0 -437
  489. package/dist/frequencyChart-GLOIGP3T.js +0 -371
  490. package/dist/frequencyChart.integration.spec-B7NBBLH2.js +0 -301
  491. package/dist/geneExpClustering-B4S6GFNT.js +0 -242
  492. package/dist/geneExpression-DMU4AQP6.js +0 -310
  493. package/dist/geneExpression-MVVXRNEY.js +0 -54
  494. package/dist/geneORA-XDAITCQF.js +0 -272
  495. package/dist/geneVariant-N6IGEIRR.js +0 -29
  496. package/dist/geneVariant-QYLA2V6J.js +0 -32
  497. package/dist/genefusion.ui-FRBMNK7V.js +0 -242
  498. package/dist/geneset-GZYNBG7Y.js +0 -186
  499. package/dist/genomeBrowser.spec-WFIVQSE7.js +0 -272
  500. package/dist/grin2-I6GJF35U.js +0 -882
  501. package/dist/grin2-I6GJF35U.js.map +0 -7
  502. package/dist/grin2-ZKNNZXON.js +0 -1547
  503. package/dist/gsea-GFGAEC4K.js +0 -43
  504. package/dist/hierCluster-MF4TI3E4.js +0 -60
  505. package/dist/hierCluster-SDJMQLOQ.js +0 -56
  506. package/dist/hierCluster.config-RMEX3VTC.js +0 -32
  507. package/dist/hierCluster.integration.spec-3H63OHMU.js +0 -389
  508. package/dist/hierCluster.interactivity-4DZBRQ6P.js +0 -45
  509. package/dist/hierCluster.renderers-UOW7BI6N.js +0 -21
  510. package/dist/imagePlot-P2UHJRSL.js +0 -134
  511. package/dist/importPlot-PPCMNVOW.js +0 -8
  512. package/dist/launch.adhoc-RJWUEVRA.js +0 -36
  513. package/dist/leftlabel.sample-OYP6MICL.js +0 -249
  514. package/dist/lollipop-BXQOWLGO.js +0 -159
  515. package/dist/maf-YJJO773K.js +0 -448
  516. package/dist/maf-YJJO773K.js.map +0 -7
  517. package/dist/maftimeline-GHKDDWYR.js +0 -584
  518. package/dist/matrix-FWDLHZYR.js +0 -60
  519. package/dist/matrix-YMJFP53F.js +0 -55
  520. package/dist/matrix.cells-JH7FPY3E.js +0 -30
  521. package/dist/matrix.config-HIHOLDCE.js +0 -33
  522. package/dist/matrix.controls-EKZ543FY.js +0 -31
  523. package/dist/matrix.data-NKAZI2BF.js +0 -35
  524. package/dist/matrix.dom-RGZ52GJ2.js +0 -11
  525. package/dist/matrix.groups-BO53ZXXV.js +0 -26
  526. package/dist/matrix.integration.spec-BXTATNAC.js +0 -2936
  527. package/dist/matrix.interactivity-UGUMKCFN.js +0 -36
  528. package/dist/matrix.layout-WBIF5QTG.js +0 -35
  529. package/dist/matrix.legend-P3GFCXXK.js +0 -22
  530. package/dist/matrix.renderers-I54IHQ3S.js +0 -29
  531. package/dist/matrix.serieses-R2T57OYI.js +0 -21
  532. package/dist/matrix.sort-3GCA2GDU.js +0 -27
  533. package/dist/matrix.sort.unit.spec-AXGPCZZD.js +0 -464
  534. package/dist/matrix.sorterUi-QWRK6OGE.js +0 -18
  535. package/dist/matrix.sorterUi.unit.spec-H7GUVWRJ.js +0 -335
  536. package/dist/mavb-4EECWXYX.js +0 -723
  537. package/dist/mds.fimo-NHZOY43X.js +0 -509
  538. package/dist/mds.samplescatterplot-7A5IZ6W7.js +0 -1541
  539. package/dist/mds.survivalplot-SQDPUFQE.js +0 -474
  540. package/dist/mutationSignature-QH7PZYKL.js +0 -72
  541. package/dist/numericDictTermCluster-X5SGSC5K.js +0 -72
  542. package/dist/oncomatrix-M4C4XPQK.js +0 -287
  543. package/dist/oncomatrix.spec-3C642O7O.js +0 -439
  544. package/dist/plot.2dvaf-TILP7J53.js +0 -368
  545. package/dist/plot.app-DE2UQP2M.js +0 -35
  546. package/dist/plot.barplot-FJHS765K.js +0 -93
  547. package/dist/plot.boxplot-YRSHGNYZ.js +0 -143
  548. package/dist/plot.brainImaging-JV4OUVJY.js +0 -51
  549. package/dist/plot.disco-DBVPBMLG.js +0 -100
  550. package/dist/plot.dzi-O2OA4EBK.js +0 -33
  551. package/dist/plot.ssgq-YFQEZQYK.js +0 -130
  552. package/dist/plot.vaf2cov-YNFP5LJ4.js +0 -250
  553. package/dist/plot.wsi-DJB7TDIS.js +0 -36
  554. package/dist/polar-K5Z5FYKV.js +0 -179
  555. package/dist/profile.spec-A6EADWEC.js +0 -71
  556. package/dist/profileBarchart-EFLPJK2P.js +0 -260
  557. package/dist/profileForms-TG35YNLD.js +0 -365
  558. package/dist/profilePlot-2EW2XVTK.js +0 -50
  559. package/dist/profileRadar-AKUYC2O5.js +0 -256
  560. package/dist/profileRadarFacility-EAT66XTX.js +0 -256
  561. package/dist/qualitative-PHQU5DXE.js +0 -34
  562. package/dist/regression-EOMJRRDO.js +0 -57
  563. package/dist/regression.inputs-LIH5X2JM.js +0 -49
  564. package/dist/regression.inputs.term-OO4RZ3QB.js +0 -49
  565. package/dist/regression.inputs.values.table-E7WCTO2L.js +0 -46
  566. package/dist/regression.integration.spec-62VEQP6X.js +0 -777
  567. package/dist/regression.results-WAHFJ6NA.js +0 -31
  568. package/dist/regression.spec-IBIOTZVX.js +0 -699
  569. package/dist/report-MKDJXHGY.js +0 -220
  570. package/dist/runChart-ETM2EETF.js +0 -54
  571. package/dist/runchart.integration.spec-QFA4XBKB.js +0 -362
  572. package/dist/sampleScatter.spec-N4N7ZGZF.js +0 -193
  573. package/dist/sampleView-JTY3RV7I.js +0 -42
  574. package/dist/samplelst-RRUMBVT6.js +0 -102
  575. package/dist/samplematrix-L37O664Y.js +0 -2189
  576. package/dist/scatter-E5QHW32W.js +0 -55
  577. package/dist/scatter.integration.spec-FNVAJSVU.js +0 -1026
  578. package/dist/selectGenomeWithTklst-J6VXCYGG.js +0 -125
  579. package/dist/singleCellPlot-S6S6CKYX.js +0 -50
  580. package/dist/singlecell-4BMIKFY4.js +0 -80
  581. package/dist/singlecell-B4TNI23F.js +0 -1563
  582. package/dist/snp-PAUQ24NZ.js +0 -73
  583. package/dist/snplocus-HVFYZTEE.js +0 -199
  584. package/dist/spliceevent.a53ss.diagram-GGGHVNBF.js +0 -142
  585. package/dist/spliceevent.exonskip.diagram-HLMFD6LJ.js +0 -268
  586. package/dist/spliceevent.noeventdiagram-CKZ3BZ7Y.js +0 -451
  587. package/dist/ssGSEA-UGT4GH55.js +0 -53
  588. package/dist/stattable-6JWMALGB.js +0 -89
  589. package/dist/summarizeCnvGeneexp-BJOQY62E.js +0 -136
  590. package/dist/summarizeGeneexpSurvival-4HDHL7PE.js +0 -90
  591. package/dist/summarizeMutationDiagnosis-TDWO5CKU.js +0 -32
  592. package/dist/summarizeMutationSurvival-CJJFABOX.js +0 -92
  593. package/dist/summary-WOAXXIHG.js +0 -55
  594. package/dist/summary.integration.spec-GM73ERMN.js +0 -405
  595. package/dist/summaryInput-FD4SONTY.js +0 -170
  596. package/dist/sunburst-3LCJTBRN.js +0 -275
  597. package/dist/survival-A3A7IVXT.js +0 -41
  598. package/dist/survival-XF72VMM6.js +0 -49
  599. package/dist/survival.integration.spec-AU7MCAQV.js +0 -601
  600. package/dist/svgraph-BEMS4JDJ.js +0 -1378
  601. package/dist/svmr-CDEMTZPK.js +0 -3833
  602. package/dist/table-WYF6QCGB.js +0 -193
  603. package/dist/termCollection-BVQMNVY7.js +0 -80
  604. package/dist/termInfo-JXLIVCSO.js +0 -9
  605. package/dist/tk-TGIIJYBO.js +0 -37
  606. package/dist/tp.ui-USYF67P7.js +0 -1450
  607. package/dist/tvs.dtcnv.continuous-7SCTSFK3.js +0 -65
  608. package/dist/tvs.numeric-OLVW6US3.js +0 -355
  609. package/dist/tvs.samplelst-BHZHCX5V.js +0 -95
  610. package/dist/violin-OEOWVIZF.js +0 -47
  611. package/dist/violin.integration.spec-AW2U3RHO.js +0 -1425
  612. package/dist/violin.interactivity-3O2UDNPQ.js +0 -39
  613. package/dist/violin.renderer-W26FA6M7.js +0 -31
  614. package/dist/vocabulary-BIQYDKVY.js +0 -32
  615. /package/dist/{2dmaf-E4NOGWWO.js.map → 2dmaf-6M6QWXAQ.js.map} +0 -0
  616. /package/dist/{AIProjectAdmin-3QDXMCOK.js.map → AIProjectAdmin-2NHMC3IV.js.map} +0 -0
  617. /package/dist/{AppHeader-IFZ57DJE.js.map → AppHeader-CTHEWSZD.js.map} +0 -0
  618. /package/dist/{BoxPlot-GXDTPRA5.js.map → BoxPlot-3U6ZAKKO.js.map} +0 -0
  619. /package/dist/{CorrelationVolcano-S4GUYIPT.js.map → CorrelationVolcano-2ASIR6KY.js.map} +0 -0
  620. /package/dist/{DifferentialAnalysis-YLKYWPUT.js.map → DifferentialAnalysis-C3NYGF7U.js.map} +0 -0
  621. /package/dist/{Disco-OQMP3HRQ.js.map → Disco-2QLBZ3X5.js.map} +0 -0
  622. /package/dist/{Disco.UI-XB3XQP33.js.map → Disco.UI-GPIIPM2P.js.map} +0 -0
  623. /package/dist/{DziViewer-UIRNTFNS.js.map → DziViewer-OHPZOH72.js.map} +0 -0
  624. /package/dist/{GB-KDPJTOLP.js.map → GB-FH6YQGHI.js.map} +0 -0
  625. /package/dist/{HicApp-XJERMLKH.js.map → HicApp-TI2II3SZ.js.map} +0 -0
  626. /package/dist/{NumBinaryEditor-5MWWWNLW.js.map → NumBinaryEditor-O42T63EX.js.map} +0 -0
  627. /package/dist/{NumBinaryEditor.unit.spec-ROGT5FOH.js.map → NumBinaryEditor.unit.spec-UMB2PHT5.js.map} +0 -0
  628. /package/dist/{NumContEditor-RRCB4CKG.js.map → NumContEditor-7NOUKPCV.js.map} +0 -0
  629. /package/dist/{NumContEditor.unit.spec-AJTKOF7W.js.map → NumContEditor.unit.spec-JGXJ2HLE.js.map} +0 -0
  630. /package/dist/{NumCustomBinEditor-3GJITZ7V.js.map → NumCustomBinEditor-6CHN3KX3.js.map} +0 -0
  631. /package/dist/{NumCustomBinEditor.unit.spec-DNBDZSHT.js.map → NumCustomBinEditor.unit.spec-RJPQLE3E.js.map} +0 -0
  632. /package/dist/{NumDiscreteEditor-TARWA6CZ.js.map → NumDiscreteEditor-AFTUKU4K.js.map} +0 -0
  633. /package/dist/{NumDiscreteEditor.unit.spec-TCSLTQ25.js.map → NumDiscreteEditor.unit.spec-GKR6ZNBQ.js.map} +0 -0
  634. /package/dist/{NumRegularBinEditor-QF5ALVV4.js.map → NumRegularBinEditor-UJ5WQPHR.js.map} +0 -0
  635. /package/dist/{NumRegularBinEditor.unit.spec-GFNDBWNM.js.map → NumRegularBinEditor.unit.spec-5HGJQEX7.js.map} +0 -0
  636. /package/dist/{NumSplineEditor-MOEUXR34.js.map → NumSplineEditor-JANA2DUE.js.map} +0 -0
  637. /package/dist/{NumSplineEditor.unit.spec-XPJOOXS4.js.map → NumSplineEditor.unit.spec-UYAMAKZD.js.map} +0 -0
  638. /package/dist/{NumericDensity-JDE263EQ.js.map → NumericDensity-YE5R4CNP.js.map} +0 -0
  639. /package/dist/{NumericDensity.unit.spec-RX6UGV56.js.map → NumericDensity.unit.spec-SVEB5U2S.js.map} +0 -0
  640. /package/dist/{NumericHandler-XM7LUYHN.js.map → NumericHandler-WW4M7YW2.js.map} +0 -0
  641. /package/dist/{NumericHandler.unit.spec-5EYRMII7.js.map → NumericHandler.unit.spec-2BWDFO53.js.map} +0 -0
  642. /package/dist/{SC-Z4KBNK7P.js.map → SC-UGJGMBL7.js.map} +0 -0
  643. /package/dist/{Volcano-WYJLKM4K.js.map → Volcano-IU76MEIL.js.map} +0 -0
  644. /package/dist/{WSIViewer-3RMG3VOA.js.map → WSIViewer-3S7N4UDO.js.map} +0 -0
  645. /package/dist/{WsiSamplesPlot-PAWNKI7R.js.map → WsiSamplesPlot-4CAOHWCL.js.map} +0 -0
  646. /package/dist/{adSandbox-7H5H46SE.js.map → adSandbox-AEBS3RTL.js.map} +0 -0
  647. /package/dist/{alphaGenome-PODWDV5T.js.map → alphaGenome-F2PB4SGI.js.map} +0 -0
  648. /package/dist/{app-JPURIGQW.js.map → app-6SKETLMT.js.map} +0 -0
  649. /package/dist/{app-YL7S55T5.js.map → app-GBEF2HBR.js.map} +0 -0
  650. /package/dist/{bam-XEO47VYA.js.map → bam-5SE6XQJV.js.map} +0 -0
  651. /package/dist/{barchart-B5M6SSJH.js.map → barchart-AUSOT2XB.js.map} +0 -0
  652. /package/dist/{barchart.data-6A6WVV4Y.js.map → barchart.data-GYCNBRPY.js.map} +0 -0
  653. /package/dist/{barchart.events-2GNB5KWY.js.map → barchart.events-QTSWNYXO.js.map} +0 -0
  654. /package/dist/{barchart.integration.spec-JEOTKIWC.js.map → barchart.integration.spec-LORJLJVX.js.map} +0 -0
  655. /package/dist/{bars.renderer-NLUBMQEO.js.map → bars.renderer-4N4QOUNI.js.map} +0 -0
  656. /package/dist/{bars.settings-UQZ63KU4.js.map → bars.settings-SDU7PZOS.js.map} +0 -0
  657. /package/dist/{block-B7WMYLPO.js.map → block-QLSIELXK.js.map} +0 -0
  658. /package/dist/{block.init-KCIXEYQC.js.map → block.init-OOLEA6ZK.js.map} +0 -0
  659. /package/dist/{block.mds.expressionrank-RYZXAH5Y.js.map → block.mds.expressionrank-D2KUISXZ.js.map} +0 -0
  660. /package/dist/{block.mds.geneboxplot-LNWUEI6N.js.map → block.mds.geneboxplot-AMYBWXPS.js.map} +0 -0
  661. /package/dist/{block.mds.junction-CVIY7QMD.js.map → block.mds.junction-OG335MBK.js.map} +0 -0
  662. /package/dist/{block.mds.svcnv-EUGWHSCA.js.map → block.mds.svcnv-WYDBQ6FV.js.map} +0 -0
  663. /package/dist/{block.svg-QBLNIGUF.js.map → block.svg-OH73245R.js.map} +0 -0
  664. /package/dist/{block.tk.aicheck-U6NG22FX.js.map → block.tk.aicheck-CG5THFW2.js.map} +0 -0
  665. /package/dist/{block.tk.ase-U3TRZAOH.js.map → block.tk.ase-G2L3G5MQ.js.map} +0 -0
  666. /package/dist/{block.tk.bam-6Y6YFVR2.js.map → block.tk.bam-DXWCA6EU.js.map} +0 -0
  667. /package/dist/{block.tk.bedgraphdot-O3VCFX6K.js.map → block.tk.bedgraphdot-LF3TFPNL.js.map} +0 -0
  668. /package/dist/{block.tk.bigwig.ui-DNBJAF72.js.map → block.tk.bigwig.ui-JKXZ3VDF.js.map} +0 -0
  669. /package/dist/{block.tk.hicstraw-2EIFJX7E.js.map → block.tk.hicstraw-ZK4RKFB6.js.map} +0 -0
  670. /package/dist/{block.tk.junction-UXSO5EJP.js.map → block.tk.junction-ZB7Q2NLB.js.map} +0 -0
  671. /package/dist/{block.tk.junction.textmatrixui-HQ6ZKCHM.js.map → block.tk.junction.textmatrixui-ZYNQWKIW.js.map} +0 -0
  672. /package/dist/{block.tk.ld-NEB4F3UG.js.map → block.tk.ld-7H64HGER.js.map} +0 -0
  673. /package/dist/{block.tk.menu-BN4JPJSD.js.map → block.tk.menu-WFVKAH74.js.map} +0 -0
  674. /package/dist/{block.tk.pgv-A4QFVSPF.js.map → block.tk.pgv-632LLSBI.js.map} +0 -0
  675. /package/dist/{brainImaging-ESQGNGZH.js.map → brainImaging-AEPTHIQF.js.map} +0 -0
  676. /package/dist/{chunk-U5QRRS7K.js.map → chunk-22O6F463.js.map} +0 -0
  677. /package/dist/{chunk-NRYOB7WU.js.map → chunk-2HJ7OD7H.js.map} +0 -0
  678. /package/dist/{chunk-PMZS3SHH.js.map → chunk-2MN5JLZB.js.map} +0 -0
  679. /package/dist/{chunk-7LKSKJCV.js.map → chunk-37CK5IGW.js.map} +0 -0
  680. /package/dist/{chunk-IPAGDFO4.js.map → chunk-3JFEWVHR.js.map} +0 -0
  681. /package/dist/{chunk-47HG7LGD.js.map → chunk-3MGBC64I.js.map} +0 -0
  682. /package/dist/{chunk-HEFXMCSF.js.map → chunk-3NWLWH4G.js.map} +0 -0
  683. /package/dist/{chunk-XATIKUGU.js.map → chunk-4GKQ5PWY.js.map} +0 -0
  684. /package/dist/{chunk-OQSP66C6.js.map → chunk-4PHD5H4A.js.map} +0 -0
  685. /package/dist/{chunk-GBWRKJAH.js.map → chunk-56IFQMJK.js.map} +0 -0
  686. /package/dist/{chunk-A76B53VT.js.map → chunk-5DMFTXUZ.js.map} +0 -0
  687. /package/dist/{chunk-W4D2EYE4.js.map → chunk-5QJDZHRU.js.map} +0 -0
  688. /package/dist/{chunk-OFQV6PRB.js.map → chunk-5WAVKWL6.js.map} +0 -0
  689. /package/dist/{chunk-C5YNONHQ.js.map → chunk-6ISTNHM6.js.map} +0 -0
  690. /package/dist/{chunk-ECKWM4HB.js.map → chunk-6VQ4C735.js.map} +0 -0
  691. /package/dist/{chunk-5CJJLBUZ.js.map → chunk-74WMSW3E.js.map} +0 -0
  692. /package/dist/{chunk-MG6GRQKO.js.map → chunk-AFU66YOW.js.map} +0 -0
  693. /package/dist/{chunk-2HQJMZNY.js.map → chunk-AUJ2YUXV.js.map} +0 -0
  694. /package/dist/{chunk-UZV3QI5M.js.map → chunk-B65X5UQH.js.map} +0 -0
  695. /package/dist/{chunk-TZRD3FPN.js.map → chunk-B6I64LSV.js.map} +0 -0
  696. /package/dist/{chunk-SN5QKRXO.js.map → chunk-BTYCW3D5.js.map} +0 -0
  697. /package/dist/{chunk-J2E4FALN.js.map → chunk-CCB5KYFQ.js.map} +0 -0
  698. /package/dist/{chunk-EEX5VPJG.js.map → chunk-CKLYFA7H.js.map} +0 -0
  699. /package/dist/{chunk-2DZWOGEH.js.map → chunk-CLYRJ466.js.map} +0 -0
  700. /package/dist/{chunk-3WA7SJTR.js.map → chunk-CPHCZZWT.js.map} +0 -0
  701. /package/dist/{chunk-VALBVQXS.js.map → chunk-CUADOD2T.js.map} +0 -0
  702. /package/dist/{chunk-L3PMRBTA.js.map → chunk-CV6ID6T7.js.map} +0 -0
  703. /package/dist/{chunk-7P67W6NF.js.map → chunk-CWHBWY3B.js.map} +0 -0
  704. /package/dist/{chunk-GG67VPVD.js.map → chunk-D53HBTYQ.js.map} +0 -0
  705. /package/dist/{chunk-RYRCMHYR.js.map → chunk-DKI7YOTJ.js.map} +0 -0
  706. /package/dist/{chunk-2MRZFUHZ.js.map → chunk-DNU4IPD2.js.map} +0 -0
  707. /package/dist/{chunk-AZ276Z7T.js.map → chunk-H6HP4H3U.js.map} +0 -0
  708. /package/dist/{chunk-GZ2B634M.js.map → chunk-HPEMEDXB.js.map} +0 -0
  709. /package/dist/{chunk-6MSJ3TLQ.js.map → chunk-HUDESZGX.js.map} +0 -0
  710. /package/dist/{chunk-FOXJTDTH.js.map → chunk-J7IU77CA.js.map} +0 -0
  711. /package/dist/{chunk-DPU66MZ7.js.map → chunk-JMO7ENSD.js.map} +0 -0
  712. /package/dist/{chunk-7RIC35AF.js.map → chunk-JTPN3BRG.js.map} +0 -0
  713. /package/dist/{chunk-EIMEUZP2.js.map → chunk-KCAMFDJH.js.map} +0 -0
  714. /package/dist/{chunk-OMO754MK.js.map → chunk-LD45BCVM.js.map} +0 -0
  715. /package/dist/{chunk-N5VBIEH5.js.map → chunk-LMELY5Z2.js.map} +0 -0
  716. /package/dist/{chunk-2ZEORJCF.js.map → chunk-LVQK62CV.js.map} +0 -0
  717. /package/dist/{chunk-PPJSDC3Z.js.map → chunk-MCVLRF66.js.map} +0 -0
  718. /package/dist/{chunk-4XDKCFFT.js.map → chunk-MLD7DW5I.js.map} +0 -0
  719. /package/dist/{chunk-JXHU2FIA.js.map → chunk-NEF7LGNE.js.map} +0 -0
  720. /package/dist/{chunk-UOMRXQNW.js.map → chunk-OARG7PAV.js.map} +0 -0
  721. /package/dist/{chunk-B662XJMJ.js.map → chunk-OGWY4MOB.js.map} +0 -0
  722. /package/dist/{chunk-QIS45Z4Y.js.map → chunk-PQD6K5W5.js.map} +0 -0
  723. /package/dist/{chunk-47X254B7.js.map → chunk-Q4FYGFTQ.js.map} +0 -0
  724. /package/dist/{chunk-F3FTQWTA.js.map → chunk-RA2KI64U.js.map} +0 -0
  725. /package/dist/{chunk-ROWCKPNW.js.map → chunk-RHHLAKYS.js.map} +0 -0
  726. /package/dist/{chunk-S7EKSDVS.js.map → chunk-RKV3CP4C.js.map} +0 -0
  727. /package/dist/{chunk-OS46MR72.js.map → chunk-RL7RU2V7.js.map} +0 -0
  728. /package/dist/{chunk-CZTC4MTE.js.map → chunk-RQ7CE7SK.js.map} +0 -0
  729. /package/dist/{chunk-KGYPMYQD.js.map → chunk-RX552WU6.js.map} +0 -0
  730. /package/dist/{chunk-RQUXELHE.js.map → chunk-S7V4SFKB.js.map} +0 -0
  731. /package/dist/{chunk-PBJFLQGL.js.map → chunk-SEL5UNRC.js.map} +0 -0
  732. /package/dist/{chunk-236ZRGXA.js.map → chunk-SRBO57AD.js.map} +0 -0
  733. /package/dist/{chunk-CT3LPTWW.js.map → chunk-SYGLOTOV.js.map} +0 -0
  734. /package/dist/{chunk-KGSCQRQ5.js.map → chunk-UZ466XO3.js.map} +0 -0
  735. /package/dist/{chunk-ZL4CNBYY.js.map → chunk-VDF5W47R.js.map} +0 -0
  736. /package/dist/{chunk-ZQ7L66GP.js.map → chunk-WTPVXDJT.js.map} +0 -0
  737. /package/dist/{chunk-I26R4NJJ.js.map → chunk-XRIM2YJZ.js.map} +0 -0
  738. /package/dist/{chunk-F4APZ34G.js.map → chunk-YSWMQO23.js.map} +0 -0
  739. /package/dist/{chunk-RCVZ4L7K.js.map → chunk-ZBZXIWSK.js.map} +0 -0
  740. /package/dist/{chunk-ICNJQHQZ.js.map → chunk-ZFFHOEBE.js.map} +0 -0
  741. /package/dist/{chunk-E6NE5IWR.js.map → chunk-ZG63ZUDE.js.map} +0 -0
  742. /package/dist/{chunk-BP2F2GRB.js.map → chunk-ZGQ3BMLW.js.map} +0 -0
  743. /package/dist/{chunk-M7QVMSRW.js.map → chunk-ZNINQ3FN.js.map} +0 -0
  744. /package/dist/{chunk-ETFPL4UP.js.map → chunk-ZQZWM544.js.map} +0 -0
  745. /package/dist/{condition-24HPVH23.js.map → condition-4FVKPSQ2.js.map} +0 -0
  746. /package/dist/{controls-5CSAKANR.js.map → controls-ZWBN566I.js.map} +0 -0
  747. /package/dist/{controls.btns-QLLBCT65.js.map → controls.btns-H4TWTHTW.js.map} +0 -0
  748. /package/dist/{controls.config-H4FMU5LI.js.map → controls.config-YU4W3CDL.js.map} +0 -0
  749. /package/dist/{correlation-RB77VSXB.js.map → correlation-VADB4SQO.js.map} +0 -0
  750. /package/dist/{cuminc-YZSLH5IO.js.map → cuminc-4BXE2YS6.js.map} +0 -0
  751. /package/dist/{cuminc.integration.spec-MZPT3Y5A.js.map → cuminc.integration.spec-XQREKHVA.js.map} +0 -0
  752. /package/dist/{customdata.inputui-CBTZFODT.js.map → customdata.inputui-VBQWT3M7.js.map} +0 -0
  753. /package/dist/{dataDownload-ZTGRVI4Q.js.map → dataDownload-QIZKBKH7.js.map} +0 -0
  754. /package/dist/{dataDownload.integration.spec-Q6GUTUYD.js.map → dataDownload.integration.spec-MLJEHLYD.js.map} +0 -0
  755. /package/dist/{databrowser.ui-V7E6CLUZ.js.map → databrowser.ui-6UIR4ULJ.js.map} +0 -0
  756. /package/dist/{dictionary-RPC5OZMM.js.map → dictionary-FLWIWAC6.js.map} +0 -0
  757. /package/dist/{e2pca-WDQHMAUM.js.map → e2pca-NKWSJRXM.js.map} +0 -0
  758. /package/dist/{ep-NAM34BBI.js.map → ep-EPN3AR6D.js.map} +0 -0
  759. /package/dist/{expclust.gdc.spec-QB4GVDJA.js.map → expclust.gdc.spec-ZRUH5E6E.js.map} +0 -0
  760. /package/dist/{facet-DOXBBIG6.js.map → facet-BM7SLACF.js.map} +0 -0
  761. /package/dist/{frequencyChart-GLOIGP3T.js.map → frequencyChart-HBXRIBAW.js.map} +0 -0
  762. /package/dist/{frequencyChart.integration.spec-B7NBBLH2.js.map → frequencyChart.integration.spec-YJUYZWM6.js.map} +0 -0
  763. /package/dist/{geneExpClustering-B4S6GFNT.js.map → geneExpClustering-4VD5PAWN.js.map} +0 -0
  764. /package/dist/{geneExpression-MVVXRNEY.js.map → geneExpression-6OT2Y4P6.js.map} +0 -0
  765. /package/dist/{geneExpression-DMU4AQP6.js.map → geneExpression-EAMEZXJQ.js.map} +0 -0
  766. /package/dist/{geneORA-XDAITCQF.js.map → geneORA-RI2AG7JT.js.map} +0 -0
  767. /package/dist/{geneVariant-N6IGEIRR.js.map → geneVariant-FYYEOTWA.js.map} +0 -0
  768. /package/dist/{geneVariant-QYLA2V6J.js.map → geneVariant-PAKVDVC4.js.map} +0 -0
  769. /package/dist/{genefusion.ui-FRBMNK7V.js.map → genefusion.ui-QWC42XWQ.js.map} +0 -0
  770. /package/dist/{geneset-GZYNBG7Y.js.map → geneset-XA6IWP3Q.js.map} +0 -0
  771. /package/dist/{genomeBrowser.spec-WFIVQSE7.js.map → genomeBrowser.spec-LRKXWXNT.js.map} +0 -0
  772. /package/dist/{grin2-ZKNNZXON.js.map → grin2-WLB7BY3S.js.map} +0 -0
  773. /package/dist/{gsea-GFGAEC4K.js.map → gsea-ZM4WOPSQ.js.map} +0 -0
  774. /package/dist/{hierCluster-MF4TI3E4.js.map → hierCluster-LD43LLRC.js.map} +0 -0
  775. /package/dist/{hierCluster-SDJMQLOQ.js.map → hierCluster-ZGYRS2WV.js.map} +0 -0
  776. /package/dist/{hierCluster.config-RMEX3VTC.js.map → hierCluster.config-O5HUOFNH.js.map} +0 -0
  777. /package/dist/{hierCluster.integration.spec-3H63OHMU.js.map → hierCluster.integration.spec-37UNKHTH.js.map} +0 -0
  778. /package/dist/{hierCluster.interactivity-4DZBRQ6P.js.map → hierCluster.interactivity-B27ETKRP.js.map} +0 -0
  779. /package/dist/{hierCluster.renderers-UOW7BI6N.js.map → hierCluster.renderers-GWFH5ZX7.js.map} +0 -0
  780. /package/dist/{imagePlot-P2UHJRSL.js.map → imagePlot-LJZVGNDJ.js.map} +0 -0
  781. /package/dist/{importPlot-PPCMNVOW.js.map → importPlot-RMVENQRD.js.map} +0 -0
  782. /package/dist/{launch.adhoc-RJWUEVRA.js.map → launch.adhoc-S3XHRSLN.js.map} +0 -0
  783. /package/dist/{leftlabel.sample-OYP6MICL.js.map → leftlabel.sample-J6PCA3UB.js.map} +0 -0
  784. /package/dist/{lollipop-BXQOWLGO.js.map → lollipop-OZTV4C7A.js.map} +0 -0
  785. /package/dist/{maftimeline-GHKDDWYR.js.map → maftimeline-6F2LQJU6.js.map} +0 -0
  786. /package/dist/{matrix-FWDLHZYR.js.map → matrix-FIXOFAB4.js.map} +0 -0
  787. /package/dist/{matrix-YMJFP53F.js.map → matrix-O5KPDLM2.js.map} +0 -0
  788. /package/dist/{matrix.cells-JH7FPY3E.js.map → matrix.cells-SCLZA3P4.js.map} +0 -0
  789. /package/dist/{matrix.config-HIHOLDCE.js.map → matrix.config-WG7HFJL4.js.map} +0 -0
  790. /package/dist/{matrix.controls-EKZ543FY.js.map → matrix.controls-QQLBUUYP.js.map} +0 -0
  791. /package/dist/{matrix.data-NKAZI2BF.js.map → matrix.data-6JLF5HVI.js.map} +0 -0
  792. /package/dist/{matrix.dom-RGZ52GJ2.js.map → matrix.dom-QO7BXZ27.js.map} +0 -0
  793. /package/dist/{matrix.groups-BO53ZXXV.js.map → matrix.groups-QMZMZ6Q7.js.map} +0 -0
  794. /package/dist/{matrix.integration.spec-BXTATNAC.js.map → matrix.integration.spec-ZJYWNQ57.js.map} +0 -0
  795. /package/dist/{matrix.interactivity-UGUMKCFN.js.map → matrix.interactivity-ZZY5ET4E.js.map} +0 -0
  796. /package/dist/{matrix.layout-WBIF5QTG.js.map → matrix.layout-XKFB4PKY.js.map} +0 -0
  797. /package/dist/{matrix.legend-P3GFCXXK.js.map → matrix.legend-CS6DNC5V.js.map} +0 -0
  798. /package/dist/{matrix.renderers-I54IHQ3S.js.map → matrix.renderers-4LST6PBA.js.map} +0 -0
  799. /package/dist/{matrix.serieses-R2T57OYI.js.map → matrix.serieses-3SERD6CV.js.map} +0 -0
  800. /package/dist/{matrix.sort-3GCA2GDU.js.map → matrix.sort-UVS6WHIS.js.map} +0 -0
  801. /package/dist/{matrix.sort.unit.spec-AXGPCZZD.js.map → matrix.sort.unit.spec-CTSUNUWB.js.map} +0 -0
  802. /package/dist/{matrix.sorterUi-QWRK6OGE.js.map → matrix.sorterUi-JDGLTLJM.js.map} +0 -0
  803. /package/dist/{matrix.sorterUi.unit.spec-H7GUVWRJ.js.map → matrix.sorterUi.unit.spec-VQFMHIYI.js.map} +0 -0
  804. /package/dist/{mavb-4EECWXYX.js.map → mavb-ECQ2CQ7F.js.map} +0 -0
  805. /package/dist/{mds.fimo-NHZOY43X.js.map → mds.fimo-JDYDT5NK.js.map} +0 -0
  806. /package/dist/{mds.samplescatterplot-7A5IZ6W7.js.map → mds.samplescatterplot-PEJBVSTO.js.map} +0 -0
  807. /package/dist/{mds.survivalplot-SQDPUFQE.js.map → mds.survivalplot-GYK6VRQT.js.map} +0 -0
  808. /package/dist/{mutationSignature-QH7PZYKL.js.map → mutationSignature-43SECPTY.js.map} +0 -0
  809. /package/dist/{numericDictTermCluster-X5SGSC5K.js.map → numericDictTermCluster-2ER4FUKO.js.map} +0 -0
  810. /package/dist/{oncomatrix-M4C4XPQK.js.map → oncomatrix-ZXDJMLN3.js.map} +0 -0
  811. /package/dist/{oncomatrix.spec-3C642O7O.js.map → oncomatrix.spec-HOPRIG3I.js.map} +0 -0
  812. /package/dist/{plot.2dvaf-TILP7J53.js.map → plot.2dvaf-Y4SZUHLD.js.map} +0 -0
  813. /package/dist/{plot.app-DE2UQP2M.js.map → plot.app-W5Z3C7P5.js.map} +0 -0
  814. /package/dist/{plot.barplot-FJHS765K.js.map → plot.barplot-B2PRZDKV.js.map} +0 -0
  815. /package/dist/{plot.boxplot-YRSHGNYZ.js.map → plot.boxplot-J7ET34FY.js.map} +0 -0
  816. /package/dist/{plot.brainImaging-JV4OUVJY.js.map → plot.brainImaging-ISY4P6RT.js.map} +0 -0
  817. /package/dist/{plot.disco-DBVPBMLG.js.map → plot.disco-D7AL42PW.js.map} +0 -0
  818. /package/dist/{plot.dzi-O2OA4EBK.js.map → plot.dzi-O32LH65U.js.map} +0 -0
  819. /package/dist/{plot.ssgq-YFQEZQYK.js.map → plot.ssgq-WF7262IZ.js.map} +0 -0
  820. /package/dist/{plot.vaf2cov-YNFP5LJ4.js.map → plot.vaf2cov-OB6UKSFQ.js.map} +0 -0
  821. /package/dist/{plot.wsi-DJB7TDIS.js.map → plot.wsi-J5S4YYXN.js.map} +0 -0
  822. /package/dist/{polar-K5Z5FYKV.js.map → polar-LIJORXR6.js.map} +0 -0
  823. /package/dist/{profile.spec-A6EADWEC.js.map → profile.spec-3KE4CREI.js.map} +0 -0
  824. /package/dist/{profileBarchart-EFLPJK2P.js.map → profileBarchart-UQHOJB5V.js.map} +0 -0
  825. /package/dist/{profileForms-TG35YNLD.js.map → profileForms-WTYVTIUN.js.map} +0 -0
  826. /package/dist/{profilePlot-2EW2XVTK.js.map → profilePlot-SOXXEUAT.js.map} +0 -0
  827. /package/dist/{profileRadar-AKUYC2O5.js.map → profileRadar-2OHJ2RIU.js.map} +0 -0
  828. /package/dist/{profileRadarFacility-EAT66XTX.js.map → profileRadarFacility-GHLG3QNG.js.map} +0 -0
  829. /package/dist/{qualitative-PHQU5DXE.js.map → qualitative-B3OY7A7P.js.map} +0 -0
  830. /package/dist/{regression-EOMJRRDO.js.map → regression-HO2TO4XT.js.map} +0 -0
  831. /package/dist/{regression.inputs-LIH5X2JM.js.map → regression.inputs-JN3ZMIOP.js.map} +0 -0
  832. /package/dist/{regression.inputs.term-OO4RZ3QB.js.map → regression.inputs.term-67HVMXFZ.js.map} +0 -0
  833. /package/dist/{regression.inputs.values.table-E7WCTO2L.js.map → regression.inputs.values.table-JXJK2YZT.js.map} +0 -0
  834. /package/dist/{regression.integration.spec-62VEQP6X.js.map → regression.integration.spec-L54ZS5VY.js.map} +0 -0
  835. /package/dist/{regression.results-WAHFJ6NA.js.map → regression.results-3ZSFKUNN.js.map} +0 -0
  836. /package/dist/{regression.spec-IBIOTZVX.js.map → regression.spec-SVWCQX2U.js.map} +0 -0
  837. /package/dist/{report-MKDJXHGY.js.map → report-IHX7XSOI.js.map} +0 -0
  838. /package/dist/{runChart-ETM2EETF.js.map → runChart-QLQMK3OE.js.map} +0 -0
  839. /package/dist/{runchart.integration.spec-QFA4XBKB.js.map → runchart.integration.spec-5NVY5GHR.js.map} +0 -0
  840. /package/dist/{sampleScatter.spec-N4N7ZGZF.js.map → sampleScatter.spec-4Q5CQQWH.js.map} +0 -0
  841. /package/dist/{sampleView-JTY3RV7I.js.map → sampleView-7WHDFHB5.js.map} +0 -0
  842. /package/dist/{samplelst-RRUMBVT6.js.map → samplelst-34GJVLVD.js.map} +0 -0
  843. /package/dist/{samplematrix-L37O664Y.js.map → samplematrix-L2HOSLUT.js.map} +0 -0
  844. /package/dist/{scatter-E5QHW32W.js.map → scatter-X6AAM2LJ.js.map} +0 -0
  845. /package/dist/{scatter.integration.spec-FNVAJSVU.js.map → scatter.integration.spec-QSH3PLBK.js.map} +0 -0
  846. /package/dist/{selectGenomeWithTklst-J6VXCYGG.js.map → selectGenomeWithTklst-AJS2IPPW.js.map} +0 -0
  847. /package/dist/{singleCellPlot-S6S6CKYX.js.map → singleCellPlot-7JEWDVSR.js.map} +0 -0
  848. /package/dist/{singlecell-B4TNI23F.js.map → singlecell-IC5KU72L.js.map} +0 -0
  849. /package/dist/{singlecell-4BMIKFY4.js.map → singlecell-NWANPXWM.js.map} +0 -0
  850. /package/dist/{snp-PAUQ24NZ.js.map → snp-PSRNMTL6.js.map} +0 -0
  851. /package/dist/{snplocus-HVFYZTEE.js.map → snplocus-QCAVDYLR.js.map} +0 -0
  852. /package/dist/{spliceevent.a53ss.diagram-GGGHVNBF.js.map → spliceevent.a53ss.diagram-SGDJKUEC.js.map} +0 -0
  853. /package/dist/{spliceevent.exonskip.diagram-HLMFD6LJ.js.map → spliceevent.exonskip.diagram-BUYTHCK5.js.map} +0 -0
  854. /package/dist/{spliceevent.noeventdiagram-CKZ3BZ7Y.js.map → spliceevent.noeventdiagram-OJZJUHXP.js.map} +0 -0
  855. /package/dist/{ssGSEA-UGT4GH55.js.map → ssGSEA-UUZG57MF.js.map} +0 -0
  856. /package/dist/{stattable-6JWMALGB.js.map → stattable-324FS2HA.js.map} +0 -0
  857. /package/dist/{summarizeCnvGeneexp-BJOQY62E.js.map → summarizeCnvGeneexp-ZVZYWP43.js.map} +0 -0
  858. /package/dist/{summarizeGeneexpSurvival-4HDHL7PE.js.map → summarizeGeneexpSurvival-7XJRMT6M.js.map} +0 -0
  859. /package/dist/{summarizeMutationDiagnosis-TDWO5CKU.js.map → summarizeMutationDiagnosis-ZKLXOVY2.js.map} +0 -0
  860. /package/dist/{summarizeMutationSurvival-CJJFABOX.js.map → summarizeMutationSurvival-S4YPGLWA.js.map} +0 -0
  861. /package/dist/{summary-WOAXXIHG.js.map → summary-RVG7JL6Y.js.map} +0 -0
  862. /package/dist/{summary.integration.spec-GM73ERMN.js.map → summary.integration.spec-SCD35GO4.js.map} +0 -0
  863. /package/dist/{summaryInput-FD4SONTY.js.map → summaryInput-DMN6DTSW.js.map} +0 -0
  864. /package/dist/{sunburst-3LCJTBRN.js.map → sunburst-QZXYILRC.js.map} +0 -0
  865. /package/dist/{survival-A3A7IVXT.js.map → survival-6CWEBRSF.js.map} +0 -0
  866. /package/dist/{survival-XF72VMM6.js.map → survival-J657VYLI.js.map} +0 -0
  867. /package/dist/{survival.integration.spec-AU7MCAQV.js.map → survival.integration.spec-S5WE4V6M.js.map} +0 -0
  868. /package/dist/{svgraph-BEMS4JDJ.js.map → svgraph-NEKJL24M.js.map} +0 -0
  869. /package/dist/{svmr-CDEMTZPK.js.map → svmr-5RQ5JQF2.js.map} +0 -0
  870. /package/dist/{table-WYF6QCGB.js.map → table-CG6Z6NCJ.js.map} +0 -0
  871. /package/dist/{termCollection-BVQMNVY7.js.map → termCollection-FOQNVXB7.js.map} +0 -0
  872. /package/dist/{termInfo-JXLIVCSO.js.map → termInfo-5USFZGDB.js.map} +0 -0
  873. /package/dist/{tk-TGIIJYBO.js.map → tk-2O7XOVGJ.js.map} +0 -0
  874. /package/dist/{tp.ui-USYF67P7.js.map → tp.ui-S4YUVCZH.js.map} +0 -0
  875. /package/dist/{tvs.dtcnv.continuous-7SCTSFK3.js.map → tvs.dtcnv.continuous-7BPIXZ6C.js.map} +0 -0
  876. /package/dist/{tvs.numeric-OLVW6US3.js.map → tvs.numeric-FCC2EY62.js.map} +0 -0
  877. /package/dist/{tvs.samplelst-BHZHCX5V.js.map → tvs.samplelst-PKGFTULN.js.map} +0 -0
  878. /package/dist/{violin-OEOWVIZF.js.map → violin-C7IBRTYP.js.map} +0 -0
  879. /package/dist/{violin.integration.spec-AW2U3RHO.js.map → violin.integration.spec-WXRD3Z4E.js.map} +0 -0
  880. /package/dist/{violin.interactivity-3O2UDNPQ.js.map → violin.interactivity-BMG4TG5L.js.map} +0 -0
  881. /package/dist/{violin.renderer-W26FA6M7.js.map → violin.renderer-WUNW6ULV.js.map} +0 -0
  882. /package/dist/{vocabulary-BIQYDKVY.js.map → vocabulary-UUNEEBM3.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../mds3/itemtable.js", "../mds3/sampletable.js", "../mds3/clickVariant.js", "../mds3/skewer.render.shapes.ts", "../mds3/skewer.render.js", "../mds3/datagroup.js", "../mds3/leftlabel.js", "../mds3/numericmode.js", "../mds3/skewer.js", "../mds3/leftlabel.variant.js", "../mds3/legend.js", "../mds3/filterName.js", "../mds3/makeTk.js", "../mds3/cnv.js", "../mds3/tk.js"],
4
+ "sourcesContent": ["import { mclass, dtsnvindel, dtfusionrna, dtsv, dtcnv, bplen, dt2label } from '#shared/common.js'\nimport { init_sampletable } from './sampletable'\nimport { appear, renderTable, table2col, makeSsmLink } from '#dom'\nimport { dofetch3 } from '#common/dofetch'\n\n/*\nwhen there's just one item, print a vertical 2-col table to show details\nwhen there are multiple items (all same type!!), print a table to list all items\nthis table is different from \"sampletable\" in that it focuses on a brief overview of multiple items, and only print occurrence of each item and no other sample-level detail\n\tTODO always nice to add in more columns for better description of the items, e.g. vcf info fields\n\narg{}\n.div\n\tcontents are rendered here\n.tipDiv\n\toptional. the menu.d DOM element of the menu;\n\tif provided, may try to move it left if table may be too wide and tipDiv is too much to right\n.mlst[]\n\t!!! all of the same dt !!!\n\t.occurrence=int must be set for each variant\n.tk\n.block\n.tippos{left,top}\n\tif provided, is the x/y position of the tk.itemtip in which the table is displayed, and will allow moving tk.itemtip to left when it decides the table has too many columns\n\tif not provided, the function does not know which menu tip it is printing into and will not try to move it\n.doNotListSample4multim\n\tonly set to true by leftlabel.variant to not to generate a sample handle\n\n\nitemtable\n\titemtable_oneItem\n\t\ttable_snvindel\n\t\t\ttable_snvindel_mayInsertNumericValueRow\n\t\t\ttable_snvindel_mayInsertHtmlSections\n\t\t\ttable_snvindel_mayInsertLD\n\t\ttable_svfusion\n\titemtable_multiItems\nmayMoveTipDiv2left\nadd_csqButton\nprint_snv\nprintSvPair\n*/\n\nconst cutoff_tableview = 10\n//let ontologyTerms\n\nexport async function itemtable(arg) {\n\tif (arg.mlst.find(m => m.dt != dtsnvindel && m.dt != dtfusionrna && m.dt != dtsv && m.dt != dtcnv)) {\n\t\tthrow 'mlst[] contains unknown dt'\n\t}\n\n\tif (arg.mlst.length == 1) {\n\t\tawait itemtable_oneItem(arg)\n\t} else {\n\t\tawait itemtable_multiItems(arg)\n\t}\n\n\tmayMoveTipDiv2left(arg)\n}\n\nfunction mayMoveTipDiv2left(arg) {\n\tif (!arg.tipDiv) {\n\t\t// tipDiv not provided, this is called from leftlabel.variants, the tip is already on window left and no need to move\n\t\treturn\n\t}\n\t// arg.div should have children: <div><table></div>\n\t// where table may show sample-by-attr info. if there are many columns, then try to move tipDiv to window left\n\tconst tableDoms = []\n\tfor (const d of arg.div.selectAll('div').selectAll('table')) {\n\t\tif (d) tableDoms.push(d)\n\t}\n\tif (!tableDoms.length) return // no table found\n\tlet maxColumnCount = 0\n\tfor (const table of tableDoms) {\n\t\t// table's first element should be <thead><tr>...</tr></thead>\n\t\tconst thead = table.firstChild\n\t\tif (thead.tagName != 'THEAD') continue\n\t\tconst tr = thead.firstChild\n\t\tif (tr.tagName != 'TR') continue\n\t\tmaxColumnCount = Math.max(maxColumnCount, tr.childNodes?.length)\n\t}\n\tif (maxColumnCount > 5) {\n\t\t// dataset has lots of columns\n\t\targ.tipDiv.style('left', '50px')\n\t}\n}\n\n/*\ndisplay full details (and samples) for one item\n*/\nexport async function itemtable_oneItem(arg) {\n\tconst table = table2col({ holder: arg.div })\n\n\tconst m = arg.mlst[0]\n\n\tif (m.dt == dtsnvindel) {\n\t\ttable_snvindel(arg, table)\n\t} else if (m.dt == dtsv || m.dt == dtfusionrna) {\n\t\tawait table_svfusion(arg, table)\n\t} else if (m.dt == dtcnv) {\n\t\ttable_cnv(arg, table)\n\t} else {\n\t\tthrow 'itemtable_oneItem: unknown dt'\n\t}\n\n\t// if the variant has only one sample,\n\t// allow to append new rows to table to show sample key:value\n\targ.singleSampleDiv = table\n\t// if there are multiple samples, this <div> won't be used\n\t// a new table will be created under arg.div to show sample table\n\n\tif (arg.tk.mds.variant2samples) {\n\t\tif (m.occurrence) {\n\t\t\t// has valid occurrence; display samples carrying this variant\n\t\t\tawait init_sampletable(arg)\n\t\t}\n\t}\n}\n\n/*\nmultiple variants\nshow an option for each, click one to run above single-variant code\nmlst table has optional columns, only the first column is clickable menu option, rest of columns are info only\n1. basic info about the variant, as menu option\n2. occurrence if present, as text\n3. numeric value if used, as text\n*/\nasync function itemtable_multiItems(arg) {\n\t// upon clicking an option for a variant, hide tableDiv and display go-back button allowing to go back to tableDiv\n\tconst goBackButton = arg.div.append('div').style('margin', '10px').append('button').style('display', 'none')\n\tgoBackButton.html('&#8810; Back to list').on('click', () => {\n\t\ttableDiv.style('display', '')\n\t\tgoBackButton.style('display', 'none')\n\t\tsingleVariantDiv.style('display', 'none')\n\t})\n\tconst singleVariantDiv = arg.div.append('div').style('display', 'none')\n\n\t///////////////// determine table columns\n\n\tconst columns = [\n\t\t{\n\t\t\tlabel: `Click a ${dt2label[arg.mlst[0].dt]} to see details`,\n\t\t\tfillCell: (td, i) => {\n\t\t\t\t// to render an item into a cell, not convenient to use \"value\" or \"html\", use fillCell() to create elements with click handler\n\t\t\t\tconst m = arg.mlst[i]\n\t\t\t\tif (m.dt == dtsnvindel) {\n\t\t\t\t\ttd.append('span').text(arg.tk.mnamegetter(m))\n\t\t\t\t\ttd.append('span')\n\t\t\t\t\t\t.text(mclass[m.class].label)\n\t\t\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t\t\t.style('color', mclass[m.class].color)\n\t\t\t\t\ttd.append('span')\n\t\t\t\t\t\t.text(`${m.chr}:${m.pos + 1}${m.ref ? ', ' + m.ref + '>' + m.alt : ''}`)\n\t\t\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t} else if (m.dt == dtsv || m.dt == dtfusionrna) {\n\t\t\t\t\ttd.append('span').text(mclass[m.class].label).style('font-size', '.7em').style('margin-right', '8px')\n\n\t\t\t\t\tprintSvPair(m.pairlst[0], td)\n\t\t\t\t} else if (m.dt == dtcnv) {\n\t\t\t\t\tconst cs = cnv2str(m, arg.tk)\n\t\t\t\t\ttd.html(cs.value + '&nbsp;&nbsp;' + cs.pos)\n\t\t\t\t} else {\n\t\t\t\t\ttd.text('error: unknown m.dt')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n\tconst hasOccurrence = arg.mlst.some(i => i.occurrence)\n\tif (hasOccurrence) {\n\t\tcolumns.push({ label: 'Occurrence' })\n\t\t// do not sort m by occurrence to show by order of position\n\t}\n\t// info fields?\n\tlet infoFields = null\n\tif (arg.tk.mds.bcf?.info) {\n\t\tinfoFields = []\n\t\tfor (const k in arg.tk.mds.bcf.info) {\n\t\t\tif (arg.tk.mds.bcf.info[k].categories) {\n\t\t\t\tinfoFields.push(k)\n\t\t\t\tcolumns.push({ label: arg.tk.mds.bcf.info[k].name || k })\n\t\t\t}\n\t\t}\n\t\tif (infoFields.length == 0) infoFields = null\n\t}\n\t// numeric value view mode object (that is not occurrence)\n\tlet numViewMode\n\tif (arg.tk.skewer) {\n\t\tnumViewMode = arg.tk.skewer.viewModes.find(i => i.inuse && i.type == 'numeric' && i.byAttribute != 'occurrence')\n\t\tif (numViewMode) {\n\t\t\tcolumns.push({ label: numViewMode.label })\n\t\t}\n\t}\n\n\t////////////////// generate table rows\n\n\t// sort mlst by on screen position \"__x\", common to all dt and irrespective of block strand\n\targ.mlst.sort((i, j) => i.__x - j.__x)\n\n\tconst rows = [] // one row per m\n\tfor (const m of arg.mlst) {\n\t\tconst row = [{}] // 1st blank cell to print variant button\n\t\tif (hasOccurrence) {\n\t\t\trow.push({ value: 'occurrence' in m ? m.occurrence : '' })\n\t\t}\n\t\tif (infoFields) {\n\t\t\tfor (const k of infoFields) {\n\t\t\t\tconst v = m.info?.[k]\n\t\t\t\tif (v == undefined) {\n\t\t\t\t\trow.push({}) // unannotated\n\t\t\t\t} else {\n\t\t\t\t\tconst o = arg.tk.mds.bcf.info[k].categories[v]\n\t\t\t\t\tif (o?.color) {\n\t\t\t\t\t\trow.push({ html: `<span style=\"background:${o.color}\">&nbsp;&nbsp;</span> ${o.label || v}` })\n\t\t\t\t\t} else {\n\t\t\t\t\t\trow.push({ value: v })\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (numViewMode) {\n\t\t\trow.push({ value: m.__value_use })\n\t\t}\n\t\trows.push(row)\n\t}\n\n\tconst tableDiv = arg.div.append('div')\n\n\trenderTable({\n\t\tdiv: tableDiv,\n\t\tcolumns,\n\t\trows,\n\t\tresize: true,\n\t\tnoButtonCallback: i => {\n\t\t\ttableDiv.style('display', 'none')\n\t\t\tgoBackButton.style('display', '')\n\t\t\tsingleVariantDiv.style('display', '').selectAll('*').remove()\n\t\t\tconst a2 = Object.assign({}, arg)\n\t\t\ta2.mlst = [arg.mlst[i]]\n\t\t\ta2.div = singleVariantDiv\n\t\t\titemtable(a2)\n\t\t},\n\t\tsingleMode: true,\n\t\tnoRadioBtn: true\n\t})\n\n\tif (!arg.doNotListSample4multim && arg.tk.mds.variant2samples) {\n\t\tconst totalOccurrence = arg.mlst.reduce((i, j) => i + (j.occurrence || 0), 0)\n\t\tif (totalOccurrence) {\n\t\t\targ.div\n\t\t\t\t.append('div')\n\t\t\t\t.style('margin-top', '10px')\n\t\t\t\t.append('span')\n\t\t\t\t.attr('class', 'sja_clbtext')\n\t\t\t\t.text('List all samples')\n\t\t\t\t.on('click', async event => {\n\t\t\t\t\tevent.target.remove()\n\t\t\t\t\ttableDiv.remove()\n\t\t\t\t\tawait init_sampletable(arg)\n\t\t\t\t\tmayMoveTipDiv2left(arg)\n\t\t\t\t})\n\t\t}\n\t}\n}\n\n/*\ntable display of variant attributes, for mlst[0] single variant\ndo not show sample level details\n*/\nasync function table_snvindel({ mlst, tk, block }, table) {\n\tconst m = mlst[0]\n\t{\n\t\tconst [td1, td2] = table.addRow()\n\t\ttd1.text(block.mclassOverride ? block.mclassOverride.className : 'Consequence')\n\t\tprint_mname(td2, m)\n\t\t//add_csqButton(m, tk, td2, table)\n\t}\n\t{\n\t\tconst [td1, td2] = table.addRow()\n\t\t// do not pretend m is mutation if ref/alt is missing\n\t\ttd1.text(m.ref && m.alt ? 'Mutation' : 'Position')\n\t\tprint_snv(td2, m, tk, block)\n\t}\n\tif (m.occurrence > 1) {\n\t\tconst [td1, td2] = table.addRow()\n\t\ttd1.text('Occurrence')\n\t\ttd2.text(m.occurrence)\n\t}\n\ttable_snvindel_mayInsertNumericValueRow(m, tk, table)\n\ttable_snvindel_mayInsertHtmlSections(m, tk, table)\n\ttable_snvindel_mayInsertLD(m, tk, table)\n\n\tif (m.info) {\n\t\t/* info fields are available for this variant\n\t\tlater to add more features for info field display\n\t\tby referencing tk.mds.bcf.info{} for instructions to display each info field\n\t\t*/\n\t\tfor (const key in m.info) {\n\t\t\tif (key == 'CSQ') {\n\t\t\t\t// TODO for custom tk, backend will send csq to client for display\n\t\t\t\t// for native tk, dataset may be configured not to send?\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst [td1, td2] = table.addRow()\n\n\t\t\t// column 1: info field key\n\t\t\ttd1.text(key).attr('data-testid', 'sjpp-mds3tk-singlemtablerow4infokey')\n\n\t\t\t// column 2: info field value of this variant m{}\n\t\t\t// value can be array or one string\n\n\t\t\tconst infoValue = m.info[key]\n\t\t\tconst infoField = tk.mds?.bcf?.info?.[key] // client-side obj about this info field, could be missing for custom track!!\n\n\t\t\t// TODO improve code\n\t\t\tif (Array.isArray(infoValue)) {\n\t\t\t\tfor (const v of infoValue) {\n\t\t\t\t\trenderInfoTd(m, infoField, v, td2, tk)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trenderInfoTd(m, infoField, infoValue, td2, tk)\n\t\t\t}\n\n\t\t\tif (infoField?.Description) {\n\t\t\t\ttd2\n\t\t\t\t\t.append('span')\n\t\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t\t.style('opacity', 0.6)\n\t\t\t\t\t.text(infoField.Description)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction table_snvindel_mayInsertNumericValueRow(m, tk, table) {\n\tconst currentMode = tk.skewer.viewModes.find(i => i.inuse)\n\tif (currentMode.type != 'numeric' || currentMode.byAttribute == 'occurrence') return\n\t// current mode is numeric and is not occurrence, as occurrence has already been shown in the table\n\tif (currentMode.tooltipPrintValue) {\n\t\tconst tmp = currentMode.tooltipPrintValue(m)\n\n\t\tif (Array.isArray(tmp)) {\n\t\t\tfor (const s of tmp) {\n\t\t\t\t// s should be {k,v}\n\t\t\t\tconst [td1, td2] = table.addRow()\n\t\t\t\ttd1.text(s.k)\n\t\t\t\ttd2.text(s.v)\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log('unknown return value')\n\t\t}\n\t\treturn\n\t}\n\n\tconst [td1, td2] = table.addRow()\n\ttd1.text(currentMode.label)\n\ttd2.text(m.__value_missing ? 'NA' : m.__value_use)\n}\nfunction table_snvindel_mayInsertHtmlSections(m, tk, table) {\n\tif (!m.htmlSections) return\n\tif (!Array.isArray(m.htmlSections)) throw 'htmlSections[] is not array'\n\tfor (const section of m.htmlSections) {\n\t\tconst [td1, td2] = table.addRow()\n\t\tif (section.key && section.html) {\n\t\t\ttd1.text(section.key)\n\t\t\ttd2.html(section.html)\n\t\t}\n\t\t// support more configurations\n\t}\n}\n\nfunction renderInfoTd(m, infoField, infoValue, td, tk) {\n\t/* render the <td> cell for one INFO field for a variant\nm{}\nkey:str\ninfoValue:str\ntd: <td>\ntk{}\n*/\n\tif (!infoField) {\n\t\t// no \"control\" object for the info field\n\t\ttd.append('span').text(infoValue)\n\t\treturn\n\t}\n\n\tif (infoField.urlBase) {\n\t\t// value of this info field will be rendered as url\n\t\ttd.append('a')\n\t\t\t.text(infoValue)\n\t\t\t.attr('href', infoField.urlBase + infoValue)\n\t\t\t.attr('target', '_blank')\n\t\treturn\n\t}\n\t// this key is not rendered as url, show it using following logic\n\tconst color = infoField.categories?.[infoValue]?.color\n\tif (color) {\n\t\t// key has a color, show circle\n\t\ttd.append('span').html('&nbsp;&nbsp;').style('background', color).style('margin-right', '5px')\n\t}\n\ttd.append('span').text(infoField.categories?.[infoValue]?.label || infoValue)\n}\n\nfunction print_mname(div, m) {\n\tdiv.append('span').text(m.mname)\n\tdiv\n\t\t.append('span')\n\t\t.style('margin-left', '5px')\n\t\t.style('color', mclass[m.class].color)\n\t\t.style('font-size', '.8em')\n\t\t.text(mclass[m.class].label.toUpperCase())\n}\n\nexport function print_snv(holder, m, tk, block) {\n\t// first print snv name. ref/alt may be missing if data is non-mutation\n\t// later its html may be rewritten with a link\n\tconst ssmNameDom = holder.append('span').text(`${m.chr}:${m.pos + 1} ${m.ref && m.alt ? m.ref + '>' + m.alt : ''}`)\n\n\t// ssm url definition can come from two places! see type def\n\tconst urlConfig = tk.mds.termdbConfig?.urlTemplates?.ssm || tk.mds.queries?.snvindel?.ssmUrl\n\tif (urlConfig) {\n\t\tconst separateUrls = makeSsmLink(urlConfig, m, ssmNameDom, block.genome.name)\n\t\tif (separateUrls?.length) {\n\t\t\tholder.append('span').style('margin-left', '10px').html(separateUrls.join(' '))\n\t\t}\n\t}\n}\n\n// function is not used\nfunction add_csqButton(m, tk, td, table) {\n\t// m:\n\t// tk:\n\t// td: the <td> to show current csq label\n\t// table: 2-col\n\tif (tk.mds.queries && tk.mds.queries.snvindel.m2csq && m.csqcount > 1) {\n\t\tconst a = td.append('a')\n\t\ta.html(m.mname + ' <span style=\"font-size:.8em\">' + mclass[m.class].label.toUpperCase() + '</span> &#9660;')\n\t\t// click link to query for csq list\n\t\tconst tr = table.append('tr').style('display', 'none')\n\t\tconst td2 = tr.append('td').attr('colspan', 2) // to show result of additional csq\n\t\tlet first = true\n\t\ta.on('click', async () => {\n\t\t\tif (tr.style('display') == 'none') {\n\t\t\t\ttr.style('display', 'table-row')\n\t\t\t\ta.html(m.mname + ' <span style=\"font-size:.8em\">' + mclass[m.class].label.toUpperCase() + '</span> &#9650;')\n\t\t\t} else {\n\t\t\t\ttr.style('display', 'none')\n\t\t\t\ta.html(m.mname + ' <span style=\"font-size:.8em\">' + mclass[m.class].label.toUpperCase() + '</span> &#9660;')\n\t\t\t}\n\t\t\tif (!first) return\n\t\t\tfirst = false\n\t\t\tconst wait = td2.append('div').text('Loading...')\n\t\t\ttry {\n\t\t\t\tconst data = await tk.mds.queries.snvindel.m2csq.get(m)\n\t\t\t\tif (data.error) throw data.error\n\t\t\t\twait.remove()\n\t\t\t\tconst table = td2.append('table').style('margin-bottom', '10px')\n\t\t\t\tconst tr = table.append('tr').style('font-size', '.7em').style('opacity', 0.5)\n\t\t\t\ttr.append('td').text('AA change')\n\t\t\t\ttr.append('td').text('Isoform')\n\t\t\t\ttr.append('td').text('Consequence')\n\t\t\t\tfor (const d of data.csq) {\n\t\t\t\t\tconst tr = table.append('tr')\n\t\t\t\t\ttr.append('td').text(d.aa_change)\n\t\t\t\t\ttr.append('td').text(d.transcript_id)\n\t\t\t\t\ttr.append('td').text(d.consequence_type)\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\twait.text(e.message || e)\n\t\t\t}\n\t\t})\n\t} else {\n\t\t// no showing additional csq\n\t\tprint_mname(td, m)\n\t}\n}\n\nasync function table_svfusion(arg, table) {\n\t// display one svfusion event\n\n\t// svgraph in 1st row\n\tawait makeSvgraph(\n\t\targ.mlst[0],\n\t\ttable.scrollDiv.insert('div', ':first-child'), // insert to top\n\t\targ.block\n\t)\n\n\t// rows\n\t{\n\t\tconst [c1, c2] = table.addRow()\n\t\tc1.text('Data type')\n\t\tc2.text(mclass[arg.mlst[0].class].label)\n\t}\n\t{\n\t\t// todo: support chimeric read fraction on each break end\n\t\tconst [c1, c2] = table.addRow()\n\t\tc1.text('Break points')\n\t\tfor (const pair of arg.mlst[0].pairlst) {\n\t\t\tprintSvPair(pair, c2.append('div'))\n\t\t}\n\t}\n}\n\nexport function table_cnv(arg, table) {\n\tconst cs = cnv2str(arg.mlst[0], arg.tk)\n\t{\n\t\tconst [c1, c2] = table.addRow()\n\t\tc1.text('Copy number change')\n\t\tc2.html(cs.value)\n\t}\n\t{\n\t\tconst [c1, c2] = table.addRow()\n\t\tc1.text('Position')\n\t\tc2.html(cs.pos)\n\t}\n}\n\nexport function cnv2str(m, tk) {\n\tconst cs = {}\n\t// TODO need queries.cnv.type=categorical/logratio/integer copy number\n\t// with type, will be able to make better indication\n\tif (Number.isFinite(m.value)) {\n\t\tif (tk.cnv.colorScale) {\n\t\t\tcs.value = `<span style=\"background:${tk.cnv.colorScale(m.value)}\">&nbsp;&nbsp;</span> ${m.value}`\n\t\t} else {\n\t\t\t// color scale will be missing when cnv in density mode, and a cnv event can still be displayed in sample table!\n\t\t\tcs.value = m.value\n\t\t}\n\t} else {\n\t\tcs.value = `<span style=\"background:${mclass[m.class].color}\">&nbsp;&nbsp;</span> \n\t\t\t${tk.mds.termdbConfig?.mclass?.[m.class]?.label || mclass[m.class].label}`\n\t}\n\tcs.pos = `${m.chr}:${m.start}-${m.stop} <span style=\"font-size:.8em\">${bplen(m.stop - m.start)}</span>`\n\treturn cs\n}\n\nexport function printSvPair(pair, div) {\n\tif (pair.a.name) div.append('span').text(pair.a.name).style('font-weight', 'bold').style('margin-right', '5px')\n\tdiv\n\t\t.append('span')\n\t\t.text(\n\t\t\t`${pair.a.chr}:${pair.a.pos + 1} ${pair.a.strand == '+' ? 'forward' : 'reverse'} > ${pair.b.chr}:${\n\t\t\t\tpair.b.pos + 1\n\t\t\t} ${pair.b.strand == '+' ? 'forward' : 'reverse'}`\n\t\t)\n\tif (pair.b.name) div.append('span').text(pair.b.name).style('font-weight', 'bold').style('margin-left', '5px')\n}\n\nasync function makeSvgraph(m, div, block) {\n\tdiv.attr('data-testid', 'sjpp-mds3tk-singlesvfusiongraph')\n\tconst wait = div.append('div').text('Loading...')\n\ttry {\n\t\tif (!m.pairlst) throw '.pairlst[] missing'\n\t\tconst svpair = {\n\t\t\ta: {\n\t\t\t\tchr: m.pairlst[0].a.chr,\n\t\t\t\tposition: m.pairlst[0].a.pos,\n\t\t\t\tstrand: m.pairlst[0].a.strand\n\t\t\t},\n\t\t\tb: {\n\t\t\t\tchr: m.pairlst[0].b.chr,\n\t\t\t\tposition: m.pairlst[0].b.pos,\n\t\t\t\tstrand: m.pairlst[0].b.strand\n\t\t\t}\n\t\t}\n\n\t\tawait getGm(svpair.a, block, m.pairlst[0].a.name)\n\t\tawait getGm(svpair.b, block, m.pairlst[0].b.name)\n\n\t\twait.remove()\n\n\t\tconst _ = await import('#src/svgraph')\n\t\t_.default({\n\t\t\tpairlst: [svpair],\n\t\t\tgenome: block.genome,\n\t\t\tholder: div\n\t\t})\n\t} catch (e) {\n\t\twait.text(e.message || e)\n\t}\n}\nasync function getGm(p, block, name) {\n\t// p={chr, position}\n\tconst d = await dofetch3('isoformbycoord', { body: { genome: block.genome.name, chr: p.chr, pos: p.position } })\n\tif (d.error) throw d.error\n\t//Find name if more than one gene returned\n\tconst u = d.lst.find(i => i.isdefault && name == i.name) || d.lst[0]\n\tif (u) {\n\t\tp.name = u.name\n\t\tp.gm = { isoform: u.isoform }\n\t}\n}\n\nfunction table_snvindel_mayInsertLD(m, tk, table) {\n\tif (!tk.mds.queries?.ld) return // not available\n\tconst [td1, td2] = table.addRow()\n\ttd1.text('LD overlay')\n\n\tconst m0 = tk.mds.queries.ld.mOverlay?.m\n\n\tif (m0) {\n\t\t// doing overlay now. indicate some informational info; m0 is the selected variant\n\t\tconst row = td2.append('div').style('margin-bottom', '5px')\n\t\tif (m.ssm_id == m0.ssm_id) {\n\t\t\t// the clicked variant is same as m0\n\t\t\trow.html(\n\t\t\t\ttk.mds.queries.ld.mOverlay.ldtkname +\n\t\t\t\t\t' r<sup>2</sup> values against this variant are displayed on all the other variants.'\n\t\t\t)\n\t\t} else {\n\t\t\t// not the same as m0\n\t\t\tlet r2 = null\n\t\t\tfor (const v of tk.mds.queries.ld.mOverlay.data || []) {\n\t\t\t\tif (v.pos == m.pos && v.alleles == m.ref + '.' + m.alt) {\n\t\t\t\t\tr2 = v.r2\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (r2 == null) {\n\t\t\t\trow.html('No r<sup>2</sup> value is found.')\n\t\t\t} else {\n\t\t\t\trow.html(tk.mds.queries.ld.mOverlay.ldtkname + ' r<sup>2</sup> = ' + r2)\n\t\t\t}\n\t\t}\n\t}\n\n\ttd2\n\t\t.append('div')\n\t\t.html('Click a button to overlay LD r<sup>2</sup> values against this variant:')\n\t\t.style('font-size', '.8em')\n\t\t.style('opacity', 0.5)\n\n\tfor (const o of tk.mds.queries.ld.tracks) {\n\t\t// o = {name}\n\t\tconst btn = td2.append('button').text(o.name)\n\n\t\tif (m0 && m0.ssm_id == m.ssm_id) {\n\t\t\t// the same index variant everybody else's overlaying against\n\t\t\tif (o.name == tk.mds.queries.ld.mOverlay.ldtkname) {\n\t\t\t\t// the same ld tk\n\t\t\t\tbtn.property('disabled', true)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// enable clicking this button to overlay on this ld tk\n\t\tbtn.on('click', () => {\n\t\t\ttk.itemtip.hide()\n\t\t\t// create the object to indicate overlaying is active\n\t\t\ttk.mds.queries.ld.mOverlay = {\n\t\t\t\tldtkname: o.name,\n\t\t\t\tm: {\n\t\t\t\t\tchr: m.chr,\n\t\t\t\t\tpos: m.pos,\n\t\t\t\t\tref: m.ref,\n\t\t\t\t\talt: m.alt,\n\t\t\t\t\tssm_id: m.ssm_id // required for highlighting\n\t\t\t\t}\n\t\t\t}\n\t\t\ttk.load()\n\t\t})\n\t}\n}\n\n// not in use\nfunction determineLeftCoordinate(div) {\n\tconst coords = div.node().getBoundingClientRect()\n\t// Reset left position to 100% - (arg.div.width % + 3%)\n\tlet leftpos\n\tif (coords.width / (document.documentElement.clientWidth || window.innerWidth) > 0.4) {\n\t\tleftpos = 3\n\t} else {\n\t\tleftpos = 100 - ((coords.width / (document.documentElement.clientWidth || window.innerWidth)) * 100 + 3)\n\t}\n\treturn leftpos\n}\n// not in use\nfunction isElementInViewport(el) {\n\tconst rect = el.node().getBoundingClientRect()\n\treturn (\n\t\t// Fix for div appearing still appearing within viewport but without a border,\n\t\t// causing content to render bunched.\n\t\trect.top >= 5 &&\n\t\trect.left >= 5 &&\n\t\trect.bottom < (document.documentElement.clientHeight || window.innerHeight) - 5 &&\n\t\trect.right < (document.documentElement.clientWidth || window.innerWidth) - 5\n\t)\n}\n", "import { rgb } from 'd3-color'\nimport { fillbar, renderTable, newSandboxDiv, table2col } from '#dom'\nimport { mclass, dtsnvindel, dtsv, dtfusionrna, dtcnv } from '#shared/common.js'\nimport { guessSsmid } from '#shared/mds3tk.js'\nimport { print_snv, printSvPair, cnv2str } from './itemtable'\nimport { convertUnits } from '#shared/helpers.js'\n\n/*\n********************** EXPORTED\ninit_sampletable()\n\tusing mds.variant2samples.get() to map mlst[] to samples\n\talways return list of samples, does not return summaries\n\tmlst can be mixture of data types, doesn't matter\n\ndisplaySampleTable()\n\tcall this function to render one or multiple samples\n\tcalls make_singleSampleTable() or renderTable()\n\nsamples2columnsRows()\n\n********************** INTERNAL\nmake_singleSampleTable\nfeedSample2selectCallback\n\n\n********************** arg{}\n.mlst[]\n\tused for v2s.get() query\n.tk\n\t.mds.variant2samples.twLst[]\n.block\n.div\n.tid2value={}\n \tsample filters by e.g. clicking on a sunburst ring, for tk.mds.variant2samples.get\n.singleSampleDiv\n\toptional, if just one single sample, can show into this table rather than creating a new one\n*/\n\nconst cutoff_tableview = 10\n\nexport async function init_sampletable(arg) {\n\t//run variant2samples.get() to map variants to samples\n\tconst wait = arg.div\n\t\t.append('div')\n\t\t.text('Loading...')\n\t\t.style('padding', '10px')\n\t\t.style('color', '#8AB1D4')\n\t\t.style('font-size', '1.25em')\n\t\t.style('font-weight', 'bold')\n\n\t// may not be used!\n\t//terms from sunburst ring\n\t// Note: in ordered to keep term-values related to sunburst immuatable, these term names are\n\t// stored as 'tid2value_orig' and not removed from tid2Value when filter changed or removed\n\targ.tid2value_orig = new Set()\n\tif (arg.tid2value) Object.keys(arg.tid2value).forEach(arg.tid2value_orig.add, arg.tid2value_orig)\n\n\ttry {\n\t\targ.querytype = arg.tk.mds.variant2samples.type_samples\n\t\tconst out = await arg.tk.mds.variant2samples.get(arg) // returns list of samples\n\t\tawait displaySampleTable(out.samples, arg)\n\t\twait.remove()\n\t} catch (e) {\n\t\twait.text('Error: ' + (e.message || e))\n\t\tif (e.stack) console.log(e.stack)\n\t}\n}\n\nexport async function displaySampleTable(samples, args) {\n\tif (samples.length == 1) {\n\t\treturn await make_singleSampleTable(samples[0], args)\n\t}\n\tconst [columns, rows] = await samples2columnsRows(samples, args.tk)\n\tconst params = { rows, columns, div: args.div, resize: rows.length > 10, dataTestId: 'sjpp_mds3tk_sampletable' }\n\t//if (args.maxWidth) params.maxWidth = args.maxWidth\n\t//if (args.maxHeight) params.maxHeight = args.maxHeight\n\n\tparams.columnButtons = []\n\n\tif (args.tk.mds.queries?.singleSampleMutation) {\n\t\tconst width = window.innerWidth\n\t\tconst height = screen.height\n\t\tconst colButton = {\n\t\t\ttext: 'Disco',\n\t\t\tdataTestId: 'sja_sample_table_disco_button',\n\t\t\tcallback: async (event, i) => {\n\t\t\t\t// hide tooltips where disco may have been launched\n\t\t\t\targs.tk.itemtip.hide() // when clicking dot with occurrence>1\n\t\t\t\targs.tk.menutip.hide() // when from sample leftlabel\n\t\t\t\tlet thisMutation\n\t\t\t\tif (samples[i].ssm_id_lst?.[0]) {\n\t\t\t\t\tthisMutation = (args.tk.skewer.rawmlst || args.tk.custom_variants).find(\n\t\t\t\t\t\tm => m.ssm_id == samples[i].ssm_id_lst[0]\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tawait createDiscoInSandbox(args.tk, args.block, samples[i], thisMutation)\n\t\t\t}\n\t\t}\n\t\tparams.columnButtons.push(colButton)\n\t}\n\n\tif (args.tk.mds.queries?.singleSampleGenomeQuantification) {\n\t\tfor (const k in args.tk.mds.queries.singleSampleGenomeQuantification) {\n\t\t\tconst btn = {\n\t\t\t\ttext: k,\n\t\t\t\tdataTestId: `${k}_button`,\n\t\t\t\tcallback: async (event, i) => {\n\t\t\t\t\tconst sandbox = newSandboxDiv(args.tk.newChartHolder || args.block.holder0)\n\t\t\t\t\tsandbox.header.text(samples[i].sample_id)\n\n\t\t\t\t\tawait (\n\t\t\t\t\t\tawait import('#plots/plot.ssgq.js')\n\t\t\t\t\t).plotSingleSampleGenomeQuantification(\n\t\t\t\t\t\targs.tk.mds,\n\t\t\t\t\t\targs.tk.mds.label,\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tsamples[i],\n\t\t\t\t\t\tsandbox.body.append('div').style('margin', '20px'),\n\t\t\t\t\t\targs.block.genome,\n\t\t\t\t\t\targs.block.usegm?.name\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tparams.columnButtons.push(btn)\n\t\t}\n\t}\n\n\tif (args.tk.allow2selectSamples) {\n\t\t// this tk allows to select samples; create new opt to display button\n\n\t\tparams.buttons = [\n\t\t\t{\n\t\t\t\ttext: args.tk.allow2selectSamples.buttonText,\n\t\t\t\tclass: args.tk.allow2selectSamples.class,\n\t\t\t\tcallback: sampleIdxLst => {\n\t\t\t\t\t// argument is list of array index of selected samples\n\t\t\t\t\tfeedSample2selectCallback(args.tk, args.block, samples, sampleIdxLst)\n\t\t\t\t\targs.tk.itemtip.hide()\n\t\t\t\t\targs.tk.menutip.hide()\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\t}\n\n\treturn renderTable(params)\n}\n\n/*\nmap sampleIdxLst to sample attributes that caller wants to pick\ncallback requests a set of attributes from the mds3 samples\nan attribute may need to convert the value\n*/\nasync function feedSample2selectCallback(tk, block, _samples, sampleIdxLst) {\n\tconst s = [..._samples]\n\tconst samples = sampleIdxLst.map(i => s[i])\n\ttk.allow2selectSamples.callback({\n\t\tsamples: await tk.mds.termdb.vocabApi.convertSampleId(samples, tk.allow2selectSamples.attributes),\n\t\tsource: 'Samples with ' + block2source(block)\n\t})\n}\n\nasync function make_singleSampleTable(s, arg) {\n\tconst table = arg.singleSampleDiv || table2col({ holder: arg.div })\n\n\tif (s.sample_id) {\n\t\t// sample_id is hardcoded\n\t\tconst [cell1, cell2] = table.addRow()\n\t\tcell1.text(arg.tk.mds.termdbConfig?.lollipop?.sample || 'Sample')\n\t\tlet m // mutation carried by this sample. if found, pass to createDiscoInSandbox for showing aachange on disco sandbox header for showing context\n\t\tif (s.ssm_id_lst?.[0]) {\n\t\t\tm = arg.tk.skewer.rawmlst.find(i => i.ssm_id == s.ssm_id_lst[0])\n\t\t}\n\t\tprintSampleName(s, arg.tk, cell2, arg.block, m)\n\t}\n\n\t/////////////\n\t// hardcoded logic to represent if this case is open or controlled-access\n\tif ('caseIsOpenAccess' in s) {\n\t\tconst [cell1, cell2] = table.addRow()\n\t\tcell1.text('Access')\n\t\tcell2.text(s.caseIsOpenAccess ? 'Open' : 'Controlled')\n\t}\n\n\tif (arg.tk.mds.variant2samples.twLst) {\n\t\tfor (const tw of arg.tk.mds.variant2samples.twLst) {\n\t\t\tconst [cell1, cell2] = table.addRow()\n\t\t\tcell1.text(tw.term.name).style('text-overflow', 'ellipsis')\n\t\t\tcell2.style('text-overflow', 'ellipsis')\n\t\t\t// TODO: use tw.$id to accomodate non-dictionary terms\n\t\t\tif (tw.term.id in s) {\n\t\t\t\tif (Array.isArray(s[tw.term.id])) {\n\t\t\t\t\tcell2.html(value2urlsOrText(s[tw.term.id], tw))\n\t\t\t\t} else {\n\t\t\t\t\t// single value\n\t\t\t\t\tconst v = twDisplayValueFromSample(s, tw)\n\t\t\t\t\tcell2.html(value2urlsOrText(v, tw))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (s.ssmid2format) {\n\t\t// format data is displayed per ssmid (if there are multiple variants)\n\t\tfor (const ssmid of s.ssm_id_lst) {\n\t\t\tif (s.ssm_id_lst.length > 1) {\n\t\t\t\t// there are multiple, need to mark it out\n\t\t\t\t//const td = table.addRow({spanTwoColumns:true})\n\t\t\t\tconst [td1, td] = table.addRow()\n\t\t\t\ttd.style('padding-top', '20px')\n\t\t\t\tconst m = arg.tk.skewer.rawmlst.find(i => i.ssm_id == ssmid)\n\t\t\t\tif (m) {\n\t\t\t\t\t// found m object by id, can make a better display\n\t\t\t\t\tif (m.dt == dtsnvindel) {\n\t\t\t\t\t\tprint_snv(td, m, arg.tk, arg.block)\n\t\t\t\t\t} else if (m.dt == dtsv || m.dt == dtfusionrna) {\n\t\t\t\t\t\tprintSvPair(m.pairlst[0], td)\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttd.text(ssmid)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttd.text(ssmid)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// only 1 ssm from this sample obj, no need to mark it out\n\t\t\t}\n\n\t\t\tfor (const formatkey in s.ssmid2format[ssmid]) {\n\t\t\t\tconst value = s.ssmid2format[ssmid][formatkey]\n\t\t\t\tconst [t1, t2] = table.addRow()\n\t\t\t\tconst fobj = arg.tk.mds?.bcf?.format?.[formatkey]\n\t\t\t\tt1.text(fobj?.Description || formatkey)\n\t\t\t\t\t.attr('data-testid', 'sjpp-mds3tk-singlemtablerow4formatkey')\n\t\t\t\t\t.attr('__key__', formatkey)\n\t\t\t\tt2.html(printFormat(fobj, value))\n\t\t\t}\n\t\t}\n\t}\n\n\t/* quick fix for accessing details of a single case\n if (arg.tk.mds.termdb && arg.tk.mds.termdb.allowCaseDetails) {\n // has one single case\n arg.div.append('div').text('Case details')\n }\n */\n}\n\n// get display value for a tw from a sample\nfunction twDisplayValueFromSample(s, tw) {\n\tif (!(tw.term.id in s)) return ''\n\tconst v = s[tw.term.id]\n\tif (tw.term.values?.[v]?.label) return tw.term.values[v].label\n\n\tconst vc = tw.term.valueConversion\n\tif (vc) return convertUnits(v, vc.fromUnit, vc.toUnit, vc.scaleFactor)\n\n\treturn v\n}\n\n/*\nprint name of a single sample\noptional mutation from this sample may be provided, for showing along with disco launched from the button clicking to maintain context\n*/\nfunction printSampleName(sample, tk, div, block, thisMutation) {\n\t// print sample name in a div, if applicable, generate a hyper link using the sample name\n\tconst temp = tk.mds.termdbConfig?.urlTemplates?.sample\n\tif (temp) {\n\t\tconst a = div.append('a')\n\t\ta.attr('href', temp.base + (sample[temp.namekey] || sample.sample_id))\n\t\ta.attr('target', '_blank')\n\t\ta.text(sample.sample_id)\n\t\ta.style('word-break', 'break-word')\n\t} else {\n\t\t// class name for testing\n\t\tdiv.append('span').attr('class', 'pp_mds3_singleSampleNameSpan').text(sample.sample_id)\n\t}\n\n\tconst extraRow = div.append('div') // row under sample name to show optional info about the sample\n\n\tif (tk.allow2selectSamples) {\n\t\t// display button for selecting this sample alone\n\t\tconst t = tk.allow2selectSamples.buttonText\n\t\tconst btn = extraRow\n\t\t\t.append('button')\n\t\t\t.attr('data-testid', 'sjpp-mds3tk-selectsamplebtn')\n\t\t\t.style('margin-right', '10px')\n\t\t\t.text(t.endsWith('s') ? t.substring(0, t.length - 1) : t)\n\t\t\t.on('click', () => {\n\t\t\t\tfeedSample2selectCallback(tk, block, [sample], [0])\n\t\t\t\ttk.itemtip.hide()\n\t\t\t\ttk.menutip.hide()\n\t\t\t})\n\t\tif (tk.allow2selectSamples.class) btn.attr('class', tk.allow2selectSamples.class)\n\t}\n\n\tif (tk.mds.queries?.singleSampleMutation) {\n\t\t// make disco button\n\t\textraRow\n\t\t\t.append('button')\n\t\t\t.style('margin-right', '10px')\n\t\t\t.text('Disco plot')\n\t\t\t.attr('data-testid', 'proteinpaint_disc_table_disco_button')\n\t\t\t.on('click', async () => {\n\t\t\t\ttk.itemtip.hide() // hide tooltip so it won't block\n\t\t\t\tawait createDiscoInSandbox(tk, block, sample, thisMutation)\n\t\t\t})\n\t}\n\n\tif (tk.mds.queries?.singleSampleGenomeQuantification) {\n\t\tfor (const k in tk.mds.queries.singleSampleGenomeQuantification) {\n\t\t\textraRow\n\t\t\t\t.append('button')\n\t\t\t\t.text(k)\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tconst sandbox = newSandboxDiv(tk.newChartHolder || block.holder0)\n\t\t\t\t\tsandbox.header.text(sample.sample_id)\n\t\t\t\t\tawait (\n\t\t\t\t\t\tawait import('#plots/plot.ssgq.js')\n\t\t\t\t\t).plotSingleSampleGenomeQuantification(\n\t\t\t\t\t\ttk.mds,\n\t\t\t\t\t\ttk.mds.label,\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tsample,\n\t\t\t\t\t\tsandbox.body.append('div').style('margin', '20px'),\n\t\t\t\t\t\tblock.genome,\n\t\t\t\t\t\tblock.usegm?.name\n\t\t\t\t\t\t/* to pass current gene name to launch ssgb at that gene\n\t\t\t\t\t\tdo not use thisMutation.gene, as \"gene\" is not guaranteed attribute on mutations\n\t\t\t\t\t\t*/\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t}\n\t}\n}\n\nasync function createDiscoInSandbox(tk, block, sample, thisMutation) {\n\t// create ad-hoc sandbox; if newChartHolder is present, plot into it\n\tconst sandbox = newSandboxDiv(tk.newChartHolder || block.holder0)\n\tconst headerTexts = [sample.sample_id] // for sandbox header\n\tif (thisMutation) {\n\t\t// mutation of this sample is provided (tooltip currently shows info about this mutation)\n\t\t// as tooltip is hidden, display this in disco header to inform context\n\t\theaderTexts.push(', with ')\n\t\tif (block.usegm) {\n\t\t\theaderTexts.push(block.usegm.name)\n\t\t} else {\n\t\t\theaderTexts.push(thisMutation.isoform) // todo convert to gene symbol\n\t\t}\n\t\theaderTexts.push(' ' + thisMutation.mname)\n\t}\n\tsandbox.header.text(headerTexts.join(''))\n\ttry {\n\t\t;(await import('#plots/plot.disco.js')).default(\n\t\t\ttk.mds.termdbConfig,\n\t\t\ttk.mds.label,\n\t\t\tsample,\n\t\t\tsandbox.body,\n\t\t\tblock.genome,\n\t\t\t{\n\t\t\t\tdownloadImgName: headerTexts.join('') + ' Disco' // file name of svg downloaded from disco\n\t\t\t}\n\t\t)\n\t} catch (e) {\n\t\tsandbox.body.append('div').text('Error: ' + (e.message || e))\n\t\tif (e.stack) console.log(e.stack)\n\t}\n}\n\n/***********************************************\n converts list of samples into inputs for renderTable()\n\n samples with multiple variants must have been grouped to the same sample obj\n\n */\nexport async function samples2columnsRows(samples, tk) {\n\t// detect if these columns appear in the samples\n\tconst has_caseAccess = samples.some(i => 'caseIsOpenAccess' in i),\n\t\thas_ssm = samples.some(i => i.ssm_id) || samples.some(i => i.ssm_id_lst),\n\t\thas_format = samples.some(i => i.ssmid2format) && tk.mds?.bcf?.format\n\tconst displayedFormatKeySet = new Set() // set of format keys for display, to skip keys not in display\n\n\t// to be returned by this function, as inputs for renderTable\n\tconst columns = [{ label: tk.mds.termdbConfig?.lollipop?.sample || 'Sample' }],\n\t\trows = [] // each row is an array of same length as columns\n\n\t///////////////// fill in columns[]\n\tif (has_caseAccess) {\n\t\tcolumns.push({ label: 'Access' })\n\t}\n\n\tif (tk.mds.variant2samples.twLst) {\n\t\tfor (const tw of tk.mds.variant2samples.twLst) {\n\t\t\tconst cell = { label: tw.term.name }\n\t\t\tcolumns.push(cell)\n\t\t}\n\t}\n\n\tif (has_ssm) {\n\t\tcolumns.push({\n\t\t\tlabel: 'Mutations',\n\t\t\tisSsm: true // flag for text file downloader to do detect and do special treatment on this field\n\t\t})\n\t}\n\n\tif (has_format) {\n\t\tfor (const s of samples) {\n\t\t\tif (!s.ssmid2format) continue\n\t\t\tfor (const sm in s.ssmid2format) {\n\t\t\t\tfor (const k in s.ssmid2format[sm]) displayedFormatKeySet.add(k)\n\t\t\t}\n\t\t}\n\n\t\tfor (const f in tk.mds.bcf.format) {\n\t\t\tif (!displayedFormatKeySet.has(f)) continue\n\t\t\tconst fobj = tk.mds.bcf.format[f]\n\t\t\tcolumns.push({\n\t\t\t\tlabel: fobj.Description || f\n\t\t\t})\n\t\t}\n\t}\n\n\t// done making columns[]\n\n\t///////////////// fill in rows[]\n\n\tfor (const sample of samples) {\n\t\t// create one row[] for each sample\n\t\t// elements are by the same order as columns[]\n\t\tconst row = [{ value: sample.sample_id }]\n\n\t\t// generate list of ssm\n\t\t// so as to show per-ssm data in consistent order\n\t\tlet ssm_id_lst = sample.ssm_id_lst\n\t\tif (!ssm_id_lst && sample.ssm_id) ssm_id_lst = [sample.ssm_id]\n\n\t\t{\n\t\t\tconst temp = tk.mds.termdbConfig?.urlTemplates?.sample\n\t\t\tif (temp) {\n\t\t\t\trow[0].url = temp.base + (sample[temp.namekey] || sample.sample_id)\n\t\t\t}\n\t\t}\n\n\t\tif (has_caseAccess) {\n\t\t\trow.push({ value: sample.caseIsOpenAccess ? 'Open' : 'Controlled' })\n\t\t}\n\n\t\tif (tk.mds.variant2samples.twLst) {\n\t\t\tfor (const tw of tk.mds.variant2samples.twLst) {\n\t\t\t\tconst v = twDisplayValueFromSample(sample, tw)\n\t\t\t\tconst v2 = value2urlsOrText(v, tw)\n\t\t\t\tif (tw.baseURL || tw.pmidOrDoi) {\n\t\t\t\t\trow.push({ html: v2 })\n\t\t\t\t} else {\n\t\t\t\t\trow.push({ value: v })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (has_ssm) {\n\t\t\tif (ssm_id_lst) {\n\t\t\t\tconst htmls = []\n\t\t\t\tfor (const ssm_id of ssm_id_lst) {\n\t\t\t\t\tconst m = findMbyId(ssm_id, tk)\n\t\t\t\t\tconst oneHtml = []\n\t\t\t\t\tif (m) {\n\t\t\t\t\t\t// found m data point\n\t\t\t\t\t\tlet showClass\n\t\t\t\t\t\tif (m.dt == dtsnvindel) {\n\t\t\t\t\t\t\tif (tk.mds.queries && tk.mds.queries.snvindel && tk.mds.queries.snvindel.url) {\n\t\t\t\t\t\t\t\toneHtml.push(`<a href=${tk.mds.queries.snvindel.url.base + m.ssm_id} target=_blank>${m.mname}</a>`)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toneHtml.push(m.mname)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tshowClass = true\n\t\t\t\t\t\t} else if (m.dt == dtsv || m.dt == dtfusionrna) {\n\t\t\t\t\t\t\t// server-returned data has sample._pairlst and shouldn't use m.pairlst; client-side custom data only has m.pairlst\n\t\t\t\t\t\t\tconst p = sample._pairlst?.[0] || m.pairlst[0]\n\t\t\t\t\t\t\toneHtml.push(\n\t\t\t\t\t\t\t\t`${p.a.name || ''} ${p.a.chr}:${p.a.pos} ${p.a.strand == '+' ? 'forward' : 'reverse'} > ${\n\t\t\t\t\t\t\t\t\tp.b.name || ''\n\t\t\t\t\t\t\t\t} ${p.b.chr}:${p.b.pos} ${p.b.strand == '+' ? 'forward' : 'reverse'}`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tshowClass = true\n\t\t\t\t\t\t} else if (m.dt == dtcnv) {\n\t\t\t\t\t\t\tconst v = cnv2str(m, tk)\n\t\t\t\t\t\t\toneHtml.push(v.value + ' ' + v.pos)\n\t\t\t\t\t\t\tshowClass = Number.isFinite(m.value) // display class when using numeric value\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow 'unknown dt'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (showClass) {\n\t\t\t\t\t\t\toneHtml.push(\n\t\t\t\t\t\t\t\t`<span style=\"color:${rgb(mclass[m.class].color).darker()};font-size:0.8em;\">${\n\t\t\t\t\t\t\t\t\tmclass[m.class].label\n\t\t\t\t\t\t\t\t}</span>`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thtmls.push(`<span style=\"white-space:nowrap\">${oneHtml.join(' ')}</span>`)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// m datapoint not found on client\n\t\t\t\t\t\thtmls.push(ssm_id + '?')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trow.push({ html: htmls.join('<br>') })\n\t\t\t} else {\n\t\t\t\t// sample has no ssm, shouldn't happen\n\t\t\t\trow.push({ value: '' })\n\t\t\t}\n\t\t}\n\n\t\tif (has_format) {\n\t\t\tif (!ssm_id_lst) throw 'ssm_id_lst missing, cannot show format'\n\t\t\tfor (const fkey in tk.mds.bcf.format) {\n\t\t\t\tif (!displayedFormatKeySet.has(fkey)) continue\n\t\t\t\tif (!sample.ssmid2format) {\n\t\t\t\t\t// sample does not have format values, return blank cell for each format field\n\t\t\t\t\trow.push({ value: '' })\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst fobj = tk.mds.bcf.format[fkey]\n\t\t\t\tconst htmls = []\n\t\t\t\tfor (const ssmid of ssm_id_lst) {\n\t\t\t\t\tconst value = sample.ssmid2format?.[ssmid]?.[fkey]\n\t\t\t\t\tif (value == undefined) {\n\t\t\t\t\t\t// in multi-sample table, when a sample has multiple ssms, both ssm names & format fields are shown as multiple rows. for a missing format value like this, must insert space to ensure the format field rows are aligned with ssm name rows\n\t\t\t\t\t\thtmls.push('&nbsp;')\n\t\t\t\t\t} else {\n\t\t\t\t\t\thtmls.push(printFormat(fobj, value))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trow.push({ html: `<span style=\"white-space:nowrap\">${htmls.join('<br>')}</span>` }) // whitespace-nowrap prevents rows from misaligning\n\t\t\t}\n\t\t}\n\n\t\trows.push(row)\n\t}\n\treturn [columns, rows]\n}\n\n/*\nv can be:\n\ta singular value\n\t\tif build url, return url\n\t\telse, return value as-is\n\tan array of values\n\t\tif build url, return urls built for each value, joined by <br>\n\t\telse, return array elements joined by <br>\n*/\nexport function value2urlsOrText(v, tw) {\n\tif (tw.baseURL) {\n\t\tif (Array.isArray(v)) return v.map(i => `<a href=${tw.baseURL + i} target=_blank>${i}</a>`).join('<br>')\n\t\treturn `<a href=${tw.baseURL + v} target=_blank>${v}</a>`\n\t}\n\tif (tw.pmidOrDoi) {\n\t\tconst h = []\n\t\tfor (const i of Array.isArray(v) ? v : [v]) {\n\t\t\tif (i.startsWith('doi: ')) {\n\t\t\t\th.push(`<a href=https://doi.org/${i.slice(5)} target=_blank>${i}</a>`)\n\t\t\t} else {\n\t\t\t\t// must be pmid\n\t\t\t\th.push(`<a href=https://pubmed.ncbi.nlm.nih.gov/${i} target=_blank>${i}</a>`)\n\t\t\t}\n\t\t}\n\t\treturn h.join('<br>')\n\t}\n\tif (Array.isArray(v)) return v.join('<br>')\n\treturn v\n}\n\nexport function findMbyId(str, tk) {\n\tconst lst = tk.skewer?.rawmlst || tk.custom_variants\n\tif (lst) {\n\t\tconst m = lst.find(i => i.ssm_id == str)\n\t\tif (m) return m\n\t}\n\tif (tk.cnv) {\n\t\tif (tk.cnv.cnvLst) {\n\t\t\t// not in density mode. if str is id for cnv, then it should match from cnvLst[]\n\t\t\tconst m = tk.cnv.cnvLst.find(i => i.ssm_id == str)\n\t\t\tif (m) return m\n\t\t} else {\n\t\t\t// cnvLst missing, cnv is in density mode. if the str is cnv id, it won't match. to avoid showing a dry string, try to guess if it is cnv\n\t\t\tconst m = guessSsmid(str)\n\t\t\tif (m.dt == dtcnv) {\n\t\t\t\treturn {\n\t\t\t\t\tdt: dtcnv,\n\t\t\t\t\tchr: m.l[0],\n\t\t\t\t\tstart: m.l[1],\n\t\t\t\t\tstop: m.l[2],\n\t\t\t\t\tclass: m.l[3],\n\t\t\t\t\tvalue: m.l[4]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn null\n}\n\nfunction printFormat(fobj, value) {\n\tif (fobj && value && fobj.Number == 'R' && fobj.Type == 'Integer') {\n\t\tconst lst = value.split(',').map(Number)\n\t\tif (lst.length == 2) {\n\t\t\tconst [ref, alt] = lst // [0] is ref read count, [1] is alt\n\t\t\tif (ref >= 0 && alt >= 0 && ref + alt > 0) {\n\t\t\t\t// the two numbers are valid allelic read count\n\t\t\t\treturn `${fillbar(null, { f: alt / (alt + ref) })} <span style=\"font-size:.8em\">${alt}/${alt + ref}</span>`\n\t\t\t}\n\t\t}\n\t}\n\t// any other case, simply return raw value without parsing\n\treturn value\n}\n\nexport function block2source(b) {\n\tif (b.gmmode == 'genomic') {\n\t\tconst r = b.rglst[0]\n\t\treturn 'mutations from ' + r.chr + ':' + r.start + '-' + r.stop\n\t}\n\tif (b.usegm) return 'mutations in ' + b.usegm.name\n\treturn 'mutations'\n}\n", "import { init_sampletable } from './sampletable'\nimport { itemtable } from './itemtable'\nimport { skewer_sety, mayHighlightDiskBySsmid } from './skewer.render'\n\nconst minoccur4sunburst = 10 // minimum occurrence for showing skewer, maybe ds specific\n\n/*\n************** EXPORT\nclick_variant()\n\n************** tentative logic\ncustom method:\n\tif tk.click_snvindel() is set, call this; will also create hlssmid and call mayHighlightDiskBySsmid \nbuilt-in methods\n\tif d.occurrence is set, show sunburst\n\telse, call variant_details()\n\n************** arguments\nd{} \n\t3 cases:\n\t1. if d.aa{}, is a group of skewer.data[0].groups[], and is one or multiple variants sharing the same mname (kras Q61H)\n\t2. is one of skewer.data[] (e.g clicking ssk box under a skewer),\n\t variants may be of different data type\n\t both case, use d.mlst[] for full list\n\t3. from numeric mode. d.mlst[] should have just a single m\ntk\nblock\ntippos{ left, top }\n\tsuggested itemtip position, if not sunburst\neventTarget\n\tsvg <circle> element of the kick cover of the clicked disc\n\tused by click_snvindel to highlight this disc\n*/\nexport async function click_variant(d, tk, block, tippos, eventTarget) {\n\ttry {\n\t\tif (tk.click_snvindel) {\n\t\t\t// custom handler overrides default behavior\n\t\t\ttk.skewer.hlssmid = new Set(d.mlst.map(i => i.ssm_id))\n\t\t\tmayHighlightDiskBySsmid(tk)\n\t\t\ttk.click_snvindel(d.mlst[0])\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\t'occurrence' in d &&\n\t\t\td.occurrence >= minoccur4sunburst &&\n\t\t\ttk.mds.variant2samples &&\n\t\t\ttk.mds.variant2samples.sunburst_twLst\n\t\t) {\n\t\t\t// show sunburst when meeting conditions: mutation have occurrence, have v2s.sunburst_twLst[]\n\t\t\tawait click2sunburst(d, tk, block, tippos)\n\t\t\treturn\n\t\t}\n\t\t// no sunburst, no matter occurrence, show details\n\t\tawait variant_details({ mlst: d.mlst, tk, block, tippos })\n\t} catch (e) {\n\t\tblock.error(e.message || e)\n\t\tif (e.stack) console.log(e.stack)\n\t}\n}\n\nasync function click2sunburst(d, tk, block, tippos) {\n\ttk.glider.style('cursor', 'wait')\n\tconst data = await tk.mds.variant2samples.get({\n\t\tmlst: d.mlst,\n\t\tquerytype: tk.mds.variant2samples.type_sunburst\n\t})\n\ttk.glider.style('cursor', 'auto')\n\n\tif (!dataGood4sunburst(data)) {\n\t\tawait variant_details({ mlst: d.mlst, tk, block, tippos })\n\t\treturn\n\t}\n\n\t// when no samples from this group are annotated by sunburst terms, avoid showing a blank sunburst\n\tconst arg = {\n\t\tnodes: data.nodes,\n\t\toccurrence: d.occurrence,\n\t\tboxyoff: tk.yoff,\n\t\tboxheight: Math.min(800, tk.height), // guard against very tall track\n\t\tboxwidth: block.width,\n\t\tsvgheight: Number.parseFloat(block.svg.attr('height')),\n\t\tg: tk.skewer.g.append('g'),\n\t\tpica: tk.pica,\n\t\tclick_listbutton: (x, y) => {\n\t\t\tvariant_details({ mlst: d.mlst, tk, block, tippos })\n\t\t},\n\t\tclick_ring: async (event, d2) => {\n\t\t\t/* hardcoded attributes from d2.data{}, due to how stratinput structures the data\n\t\t\t.id0, v0 should exist for all levels\n\t\t\t.id1, v1 should exist for 2nd and next levels... etc\n\t\t\tadd the key/values to tid2value{}\n\t\t\t*/\n\t\t\ttk.itemtip.clear()\n\t\t\tconst param = {\n\t\t\t\tmlst: d.mlst,\n\t\t\t\ttk,\n\t\t\t\tblock,\n\t\t\t\tdiv: tk.itemtip.d,\n\t\t\t\ttid2value: {}\n\t\t\t}\n\t\t\tparam.tid2value[d2.data.id0] = d2.data.v0\n\t\t\tif (d2.data.id1) param.tid2value[d2.data.id1] = d2.data.v1\n\t\t\tif (d2.data.id2) param.tid2value[d2.data.id2] = d2.data.v2\n\n\t\t\t/*\n\t\t\t!! to create a mock param.mlst[] !!\n\t\t\t(re-evaluate if this is actually temp fix)\n\t\t\tthis wedge has less samples than what d.mlst[] have in total\n\t\t\tas mlst2samplesummary uses occurrence sum to decide what type of data to request\n\t\t\tmust change occurrence sum to d2.value so mlst2samplesummary() can function based on sum of this wedge\n\t\t\t(by first setting .occurrence=0 for entire param.mlst[], then just set param.mlst[0].occurrence=d2.value)\n\t\t\t*/\n\t\t\tparam.mlst = d.mlst.map(m => {\n\t\t\t\tif (tk.mds.variant2samples.variantkey == 'ssm_id') {\n\t\t\t\t\treturn { ssm_id: m.ssm_id, occurrence: 0 }\n\t\t\t\t}\n\t\t\t\tthrow 'unknown variant2samples.variantkey'\n\t\t\t})\n\t\t\tparam.mlst[0].occurrence = d2.value\n\n\t\t\tconst x = event.clientX\n\t\t\tconst y = event.clientY\n\n\t\t\t/* may delete later\n\t\t\tconst width = window.innerWidth\n\t\t\tconst height = window.innerHeight\n\t\t\tconst middlex = width / 2\n\t\t\tconst middley = height / 2\n\n\t\t\tparam.maxWidth = width - x > middlex ? width - x : x\n\t\t\tparam.maxHeight = height - y > middley ? height - y : y\n\t\t\tparam.maxWidth = param.maxWidth - 150 + 'px'\n\t\t\tparam.maxHeight = param.maxHeight - 150 + 'px'\n\t\t\t*/\n\n\t\t\t/* do not call variant_details() as no need to show info on variants\n\t\t\tonly need to show sample display\n\t\t\t*/\n\t\t\tawait init_sampletable(param)\n\t\t\t// the last 2 boolean arguments causes the sample table to be\n\t\t\t// positioned relative to the bottom of the div, which may not be visible\n\t\t\t// relative to the screen/window bottom and so the sample table is rendered\n\t\t\t// below the screen and not visible unless the user scrolls down\n\t\t\ttk.itemtip.show2(x, y)\n\t\t}\n\t}\n\tif (d.aa) {\n\t\targ.cx = d.aa.x\n\t\targ.cy = skewer_sety(d, tk) + d.yoffset * (tk.skewer.pointup ? -1 : 1)\n\t} else {\n\t\targ.cx = d.x\n\t\targ.cy = d.y + ((tk.skewer.pointup ? 1 : -1) * tk.skewer.stem1) / 2\n\t\t// not to show list button in sunburst in case mlst has different data types\n\t}\n\tif (d.mlst.length == 1) {\n\t\targ.chartlabel = d.mlst[0].mname\n\t} else {\n\t\tconst mnameSet = new Set(d.mlst.map(i => i.mname))\n\t\tif (mnameSet.size == 1) {\n\t\t\targ.chartlabel = [...mnameSet][0]\n\t\t} else {\n\t\t\t// multiple m of different mname. use mname of most recurrent variant\n\t\t\targ.chartlabel = d.mlst.reduce((i, j) => (j.occurrence > i.occurrence ? j : i)).mname + ' etc'\n\t\t}\n\t}\n\tconst _ = await import('#src/sunburst')\n\t_.default(arg)\n}\n\nexport function dataGood4sunburst(data) {\n\t// return true/false to show/not show sunburst; throws on data error\n\t// data={nodes:[ {id:'root'}, {id:'root...cat1'}, ...]}\n\tif (!Array.isArray(data.nodes)) throw 'nodes not array'\n\tif (data.nodes.length == 0) throw 'nodes empty array'\n\t// just {root} element means samples are not annotated by sunburst terms. return false to avoid showing a blank sunburst\n\tif (data.nodes.length == 1) return false\n\t// root node is not validated, do if needed\n\tfor (let i = 1; i < data.nodes.length; i++) {\n\t\tconst n = data.nodes[i]\n\t\tif (!n.name) throw 'node name missing'\n\t\tif (!Number.isInteger(n.cohortsize)) {\n\t\t\t// known issue: cohortsize can be missing for controlled gdc data. (might also happen for non-gdc). this check is disabled and sunburst rendering already handles missing cohortsize\n\t\t\t//throw 'node cohortsize not integer'\n\t\t}\n\t\t// validate additional properties if needed\n\t}\n\treturn true\n}\n\n/*\narg{}\n.mlst[]\n\tcan be mixture of different dt\n.tk\n.block\n.tippos\n.tid2value{}\n*/\nasync function variant_details(arg) {\n\targ.tk.itemtip.clear().show(arg.tippos.left - 10, arg.tippos.top - 10)\n\targ.div = arg.tk.itemtip.d\n\targ.tipDiv = arg.tk.itemtip.d\n\tawait itemtable(arg)\n}\n", "import type { Elem } from '../types/d3'\nimport { shapes } from '#dom'\nimport { dtsnvindel, dtsv, dtfusionrna } from '#shared/common.js'\nimport { select as d3select } from 'd3-selection'\n\nexport function renderSkewerShapes(tk: any, skewer: any, shapeG: Elem) {\n\tshapeG\n\t\t.filter(d => d.dt == dtsnvindel || d.dt == dtsv || d.dt == dtfusionrna)\n\t\t.append('path')\n\t\t.attr('d', d => shapes[d.shape].calculatePath(getPathDimensions(d.shape, d.radius, skewer.pointup)))\n\t\t.attr('fill', d => (!shapes[d.shape].isFilled ? 'none' : d.mlst?.[0] ? tk.color4disc(d.mlst[0]) : tk.color4disc(d)))\n\t\t.attr('stroke', d =>\n\t\t\t(d.dt == dtfusionrna || d.dt == dtsv) && d?.mlst[0]\n\t\t\t\t? tk.color4disc(d.mlst[0])\n\t\t\t\t: shapes[d.shape].isFilled\n\t\t\t\t? 'white'\n\t\t\t\t: d.mlst?.[0]\n\t\t\t\t? tk.color4disc(d.mlst[0])\n\t\t\t\t: tk.color4disc(d)\n\t\t)\n\n\tconst defs = shapeG\n\t\t.append('defs')\n\t\t.selectAll('clipPath')\n\t\t.data(shapeG.data())\n\t\t.enter()\n\t\t.append('clipPath')\n\t\t//Keep the long id. It must be unique to the data point for rendering\n\t\t.attr(\n\t\t\t'id',\n\t\t\td => `clip-path-${d?.mlst ? `${d.mlst[0].mname}-${d.mlst[0].__x}-${d.yoffset}` : `${d.mname}-${d.__x}-${d._y}`}`\n\t\t)\n\n\tdefs.each(function (d) {\n\t\tconst { width, height } = getPathDimensions(d.shape, d.radius, skewer.pointup)\n\t\tif (!width || !height) return\n\t\td3select(this)\n\t\t\t.append('rect')\n\t\t\t/**** Always show the colored area on the correct side ****\n\t\t\t * Preserves showing the colored:white areas regardless if\n\t\t\t * the shape is filled or not\n\t\t\t */\n\t\t\t.attr('x', d.useNterm != shapes[d.shape].isFilled ? -(width / 2) : 0)\n\t\t\t.attr('y', -(height / 2))\n\t\t\t.attr('width', d.useNterm != shapes[d.shape].isFilled ? width / 2 : width)\n\t\t\t.attr('height', height)\n\t})\n\n\tshapeG\n\t\t.filter(d => d.dt == dtfusionrna || d.dt == dtsv)\n\t\t.append('g')\n\t\t.attr(\n\t\t\t'clip-path',\n\t\t\td =>\n\t\t\t\t`url(#clip-path-${d?.mlst ? `${d.mlst[0].mname}-${d.mlst[0].__x}-${d.yoffset}` : `${d.mname}-${d.__x}-${d._y}`}`\n\t\t)\n\t\t.append('path')\n\t\t.attr('d', d => shapes[d.shape].calculatePath(getPathDimensions(d.shape, d.radius, skewer.pointup)))\n\t\t.attr('fill', d => (shapes[d.shape].isFilled ? 'white' : tk.color4disc(d.mlst[0])))\n\t\t.attr('stroke', 'none')\n}\n\nexport function renderShapeKick(skewer: any, elem: any) {\n\tconst kick = elem\n\t\t.append('path')\n\t\t.attr('d', d => {\n\t\t\tif (!d.shape) d.shape = d.groups[0].shape\n\t\t\tconst radius = d.radius * 1.01 || d.maxradius + 2\n\t\t\treturn shapes[d.shape].calculatePath(getPathDimensions(d.shape, radius, skewer.pointup))\n\t\t})\n\t\t.attr('stroke-width', 1.75)\n\n\treturn kick\n}\n\nfunction getPathDimensions(key: string, radius: number, pointup = true) {\n\t//Add more shapes here using the key from #dom/shapes.js\n\tswitch (key) {\n\t\tcase 'filledCircle':\n\t\t\treturn { radius: radius * 0.95 }\n\t\tcase 'emptyCircle':\n\t\t\treturn { radius }\n\t\tcase 'filledVerticalRectangle':\n\t\t\treturn { width: radius * 1.5, height: radius * 2.1 }\n\t\tcase 'emptyVerticalRectangle':\n\t\t\treturn { width: radius * 1.4, height: radius * 2 }\n\t\tcase 'filledTriangle':\n\t\t\treturn { width: radius * 2.1, height: radius * 2.1, isUp: pointup }\n\t\tcase 'emptyTriangle':\n\t\t\treturn { width: radius * 2, height: radius * 2, isUp: pointup }\n\t\tcase 'filledSquare':\n\t\t\treturn { width: radius * 1.7, height: radius * 1.7 }\n\t\tcase 'emptySquare':\n\t\t\treturn { width: radius * 1.7, height: radius * 1.7 }\n\t\tdefault:\n\t\t\tthrow 'Invalid shape key. Add shape [getPathDimensions() skewer.render.shapes.ts]'\n\t}\n}\n\nexport function setNumBaseline(key: string, pointup: boolean) {\n\tif (key.includes('Triangle')) {\n\t\tif (pointup) return 'central'\n\t\telse return `text-after-edge`\n\t} else return ''\n}\n", "import { select as d3select } from 'd3-selection'\nimport { arc as d3arc } from 'd3-shape'\nimport { scaleLinear } from 'd3-scale'\nimport { click_variant } from './clickVariant'\nimport { dtsnvindel, dtsv, dtfusionrna, mclass } from '#shared/common.js'\nimport { renderSkewerShapes, renderShapeKick, setNumBaseline } from './skewer.render.shapes.ts'\nimport { shapes } from '#dom/shapes'\n\n/*\n********************** EXPORTED\nskewer_make\nsettle_glyph\nunfold_glyph\nfold_glyph\nskewer_sety\nmayHighlightDiskBySsmid\n********************** INTERNAL\nskewer_setstem\nsettle_glyph\nunfold_update\nhoriplace\nhoriplace0\n*/\n\nconst modefold = 0\nconst modeshow = 1\nconst middlealignshift = 0.3\nconst disclabelspacing = 1 // px spacing between disc and label\nconst textlensf = 0.6 // to replace n.getBBox().width for detecting filling font size which breaks in chrome\n\n/*\nsets tk.skewer.maxheight\n*/\nexport function skewer_make(tk, block) {\n\tconst ss = tk.skewer\n\n\tfor (const d of ss.data) {\n\t\td.x0 = d.x\n\t\tif (d.xoffset != undefined) {\n\t\t\td.x = d.x0 + d.xoffset\n\t\t}\n\t\t// updates x\n\t\t// create stack bars\n\t\tfor (const g of d.groups) {\n\t\t\tg.aa = d // disc reference group\n\t\t}\n\t}\n\n\tconst dotwidth = Math.max(14, block.width / 110)\n\t// create skewers for all data (single or multiple) and compute width\n\n\t// get max m count for discs, for scaling disc radius\n\tlet mdc = 0\n\tfor (const d of ss.data) {\n\t\tfor (const g of d.groups) {\n\t\t\tmdc = Math.max(mdc, g.occurrence)\n\t\t}\n\t}\n\tlet mrd = 0 // max disc radius\n\tconst w = Math.pow(dotwidth / 2, 2) * Math.PI // unit area\n\tif (mdc <= 10) mrd = w * mdc * 0.9\n\telse if (mdc <= 100) mrd = w * 10\n\telse if (mdc <= 1000) mrd = w * 14\n\telse mrd = w * 20\n\t// scale for disc radius\n\tconst sf_discradius = scaleLinear()\n\t\t.domain([1, mdc * 0.5, mdc * 0.6, mdc * 0.7, mdc * 0.8, mdc])\n\t\t.range([w, w + (mrd - w) * 0.8, w + (mrd - w) * 0.85, w + (mrd - w) * 0.9, w + (mrd - w) * 0.95, mrd])\n\n\tlet globalmaxradius = dotwidth / 2\n\tss.maxheight = 0\n\tfor (const d of ss.data) {\n\t\t// settings may have been carried over from previous rendering\n\t\tif (d.showmode == undefined) d.showmode = modefold\n\t\tif (d.slabelrotate == undefined) d.slabelrotate = false\n\t\t// determine dimension for this skewer, do not position or render yet\n\t\t// compute radius for each group\n\t\td.maxradius = 0\n\t\td.maxrimwidth = 0\n\t\td.width = 0\n\t\td.slabelwidth = 0\n\t\tfor (const r of d.groups) {\n\t\t\tif (r.occurrence <= 1) {\n\t\t\t\t/*\n\t\t\t\tprotect against occurrence=0 or even negative, which can break scale\n\t\t\t\t*/\n\t\t\t\tr.radius = dotwidth / 2\n\t\t\t} else {\n\t\t\t\tconst digc = r.occurrence.toString().length\n\t\t\t\tr.radius = Math.max(Math.sqrt(sf_discradius(r.occurrence) / Math.PI), digc * 5)\n\t\t\t}\n\t\t\td.maxradius = Math.max(d.maxradius, r.radius)\n\t\t\tglobalmaxradius = Math.max(globalmaxradius, r.radius)\n\n\t\t\tr.rimwidth = r.rim1count + r.rim2count == 0 ? 0 : Math.max(2, r.radius / 6)\n\t\t\td.maxrimwidth = Math.max(d.maxrimwidth, r.rimwidth)\n\t\t}\n\t\tlet totalheight = 0\n\t\tfor (const r of d.groups) {\n\t\t\tr.yoffset = totalheight + r.radius + r.rimwidth // immutable, y shift at expand mode\n\t\t\ttotalheight += (r.radius + r.rimwidth) * 2\n\t\t}\n\t\tss.maxheight = Math.max(ss.maxheight, totalheight)\n\t}\n\n\tif (!tk.shapes) {\n\t\t/** TODO: This assumes every skewer track has mutations\n\t\t * In future change to accept other annotations\n\t\t */\n\t\tif (!tk.shapeBy) {\n\t\t\ttk.shapes = {}\n\t\t\tObject.keys(mclass).forEach(v => (tk.shapes[v] = 'filledCircle'))\n\t\t}\n\t}\n\n\tss.selection = ss.g\n\t\t.selectAll()\n\t\t.data(ss.data)\n\t\t.enter()\n\t\t.append('g')\n\t\t.attr('class', 'sja_skg')\n\t\t.each(function (d) {\n\t\t\td.skewer = this\n\t\t})\n\n\t// disc containers\n\tconst discg = ss.selection\n\t\t.selectAll()\n\t\t.data(d => d.groups)\n\t\t.enter()\n\t\t.append('g')\n\t\t.attr(\n\t\t\t'transform',\n\t\t\td => 'translate(0,' + (d.aa.showmode == modefold ? 0 : d.yoffset * (tk.skewer.pointup ? -1 : 1)) + ')'\n\t\t)\n\t\t.attr('class', 'sja_aa_discg')\n\t\t.each(function (d) {\n\t\t\td.g = this\n\t\t\tif (!d.shape) {\n\t\t\t\t//TODO: Add logic to determine when to apply shape or color\n\t\t\t\t// and which annotation to use if multiple (i.e. tk.shapeBy)\n\t\t\t\td.shape = tk.shapes[d.mlst[0].class]\n\t\t\t}\n\t\t\tif (!d.shape.includes('Circle')) {\n\t\t\t\t//Use existing rendering code for circle shapes\n\t\t\t\trenderSkewerShapes(tk, ss, d3select(this))\n\t\t\t} else {\n\t\t\t\t// actual disc\n\t\t\t\tconst discdot = d3select(this).append('circle')\n\n\t\t\t\t// full filled\n\t\t\t\tdiscdot\n\t\t\t\t\t.filter(d => d.dt == dtsnvindel || d.dt == dtsv || d.dt == dtfusionrna)\n\t\t\t\t\t.attr('fill', d => (!shapes[d.shape].isFilled ? 'white' : tk.color4disc(d.mlst[0])))\n\t\t\t\t\t.attr('stroke', d => (!shapes[d.shape].isFilled ? tk.color4disc(d.mlst[0]) : 'white'))\n\t\t\t\t\t.attr('r', d => d.radius - 0.5)\n\t\t\t\t// masking half\n\t\t\t\td3select(this)\n\t\t\t\t\t.filter(d => d.dt == dtfusionrna || d.dt == dtsv)\n\t\t\t\t\t.append('path')\n\t\t\t\t\t.attr('fill', d => (!shapes[d.shape].isFilled ? tk.color4disc(d.mlst[0]) : 'white'))\n\t\t\t\t\t.attr('stroke', 'none')\n\t\t\t\t\t.attr('d', d =>\n\t\t\t\t\t\td3arc()({\n\t\t\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\t\t\touterRadius: d.radius - 2,\n\t\t\t\t\t\t\t/**** Always show the colored area on the correct side ****\n\t\t\t\t\t\t\t * Preserves showing the colored:white areas regardless if\n\t\t\t\t\t\t\t * the shape is filled or not\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tstartAngle: d.useNterm == shapes[d.shape].isFilled ? 0 : Math.PI,\n\t\t\t\t\t\t\tendAngle: d.useNterm == shapes[d.shape].isFilled ? Math.PI : Math.PI * 2\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t}\n\t\t})\n\n\t// number in disc\n\tconst textslc = discg\n\t\t.filter(d => d.occurrence > 1)\n\t\t.append('text')\n\t\t.text(d => d.occurrence)\n\t\t.attr('class', 'sja_aa_discnum')\n\t\t.attr('fill-opacity', d => (d.aa.showmode == modefold ? 0 : 1))\n\t\t.attr('stroke-opacity', d => (d.aa.showmode == modefold ? 0 : 1))\n\t\t.attr('dominant-baseline', d => (tk.shapes ? setNumBaseline(d.shape, tk.skewer.pointup) : ''))\n\t\t.attr('text-anchor', 'middle')\n\t\t.each(d => {\n\t\t\tconst s = d.radius * 1.5\n\t\t\td.discnumfontsize = Math.min(s / (d.occurrence.toString().length * textlensf), s)\n\t\t})\n\t\t.attr('font-size', d => d.discnumfontsize)\n\t\t.attr('y', d => d.discnumfontsize * middlealignshift)\n\ttextslc\n\t\t.filter(d => d.dt == dtsnvindel)\n\t\t.attr('fill', d => (tk.shapes && !shapes[d.shape].isFilled ? 'black' : 'white'))\n\ttextslc\n\t\t.filter(d => d.dt == dtsv || d.dt == dtfusionrna)\n\t\t.attr('stroke', d => tk.color4disc(d.mlst[0]))\n\t\t.attr('stroke-width', 0.8)\n\t\t.attr('font-weight', 'bold')\n\t\t.attr('fill', 'white')\n\t// right-side label\n\tconst textlab = discg\n\t\t.append('text')\n\t\t.text(d => d.mnameCompact || tk.mnamegetter(d.mlst[0]))\n\t\t.attr('font-size', d => {\n\t\t\td._labfontsize = Math.max(12, d.radius * 1.2)\n\t\t\treturn d._labfontsize\n\t\t})\n\t\t.each(function (d) {\n\t\t\t// after setting font size, set skewer width by label width\n\t\t\tconst lw = this.getBBox().width\n\t\t\td._label_width = lw\n\t\t\tif (d.aa.groups.length == 1) {\n\t\t\t\td.aa.slabelrotate = true\n\t\t\t\td.aa.slabelwidth = lw\n\t\t\t\t// skewer has single disc, label may rotate up, thus should be considerred in skewer maxheight\n\t\t\t\tss.maxheight = Math.max(ss.maxheight, (d.radius + d.rimwidth) * 2 + 2 + lw)\n\t\t\t}\n\t\t})\n\t\t.attr('fill', d => tk.color4disc(d.mlst[0]))\n\t\t.attr('x', d => d.radius + d.rimwidth + 1)\n\t\t.attr('y', d => d._labfontsize * middlealignshift)\n\t\t.classed('sja_aa_disclabel', true)\n\t\t.attr('fill-opacity', d => (d.aa.showmode == modefold ? 0 : 1))\n\t\t.attr('transform', 'scale(1) rotate(0)')\n\t\t.on('mousedown', event => {\n\t\t\tevent.stopPropagation()\n\t\t})\n\t\t.on('click', (event, d) => {\n\t\t\tfold_glyph([d.aa], tk)\n\t\t\tunfold_update(tk, block)\n\t\t})\n\t\t.on('mouseover', (event, d) => {\n\t\t\tevent.target.setAttribute('font-size', d._labfontsize * 1.1)\n\t\t\tshowHoverTipOnDisk(event, d, tk)\n\t\t})\n\t\t.on('mouseout', (event, d) => {\n\t\t\tevent.target.setAttribute('font-size', d._labfontsize)\n\t\t\ttk.hovertip.hide()\n\t\t})\n\n\t// red box for highlighting, under the kick cover\n\tss.hlBoxG = discg.append('g')\n\n\t// pulsating label, not in use\n\t// textlab.filter(d => d.mlst.find(m => tk.hlssmid.has(m.ssm_id))).classed('sja_pulse', true)\n\n\t// skewer width\n\tfor (const d of ss.data) {\n\t\tlet leftw = 0,\n\t\t\trightw = 0\n\t\tfor (const g of d.groups) {\n\t\t\tleftw = Math.max(leftw, g.radius + g.rimwidth)\n\t\t\trightw = Math.max(rightw, g.radius + g.rimwidth + disclabelspacing + g._label_width)\n\t\t}\n\t\td.width = leftw + rightw\n\t}\n\n\tlet kick\n\t// invisible kicking disc cover\n\tif (tk.shapes) {\n\t\t//Returns the kick in the same shape if skewer is not a circle\n\t\tkick = renderShapeKick(ss, discg)\n\t} else {\n\t\tkick = discg.append('circle').attr('r', d => d.radius - 0.5)\n\t}\n\n\tkick\n\t\t.attr('stroke', d => tk.color4disc(d.mlst[0]))\n\t\t.classed('sja_aa_disckick', true)\n\t\t.attr('fill', 'white')\n\t\t.attr('fill-opacity', 0)\n\t\t.attr('stroke-opacity', 0)\n\t\t.on('mousedown', event => {\n\t\t\tevent.stopPropagation()\n\t\t})\n\t\t.on('mouseover', (event, d) => {\n\t\t\tshowHoverTipOnDisk(event, d, tk)\n\t\t\tif (tk.disc_mouseover) {\n\t\t\t\ttk.disc_mouseover(d, event.target)\n\t\t\t}\n\t\t})\n\t\t.on('mouseout', (event, d) => {\n\t\t\ttk.hovertip.hide()\n\t\t\tif (tk.disc_mouseout) {\n\t\t\t\ttk.disc_mouseout(d)\n\t\t\t}\n\t\t})\n\t\t.on('click', async (event, d) => {\n\t\t\tclick_variant(d, tk, block, event.target.getBoundingClientRect(), event.target)\n\t\t})\n\t// disc rims\n\tconst rimfunc = d3arc()\n\t\t.innerRadius(d => d.radius)\n\t\t.outerRadius(d => d.radius + d.rimwidth)\n\t\t.startAngle(0)\n\t\t.endAngle(d => {\n\t\t\td.rim1_startangle = (Math.PI * 2 * d.rim1count) / d.occurrence\n\t\t\treturn d.rim1_startangle\n\t\t})\n\tdiscg\n\t\t.filter(d => d.rim1count > 0)\n\t\t.append('path')\n\t\t.attr('d', rimfunc)\n\t\t.attr('fill', d => tk.color4disc(d.mlst[0]))\n\t\t.attr('class', 'sja_aa_discrim')\n\t\t.attr('fill-opacity', 0)\n\n\tconst rimfunc2 = d3arc()\n\t\t.innerRadius(d => d.radius + 0.5)\n\t\t.outerRadius(d => d.radius + 0.5 + d.rimwidth)\n\t\t.startAngle(d => d.rim1_startangle)\n\t\t.endAngle(d => d.rim1_startangle + (Math.PI * 2 * d.rim2count) / d.occurrence)\n\tdiscg\n\t\t.filter(d => d.rim2count > 0)\n\t\t.append('path')\n\t\t.attr('d', rimfunc2)\n\t\t.attr('stroke', d => tk.color4disc(d.mlst[0]))\n\t\t.attr('fill', 'none')\n\t\t.attr('class', 'sja_aa_discrim')\n\t\t.attr('stroke-opacity', 0)\n\t// set stem lengths\n\t{\n\t\t// stem 1,2\n\t\tlet lapcount = 0\n\t\tlet lastx = 0\n\t\tfor (const d of ss.data) {\n\t\t\tif (d.x - d.maxradius - d.maxrimwidth < lastx) {\n\t\t\t\tlapcount++\n\t\t\t}\n\t\t\tlastx = Math.max(lastx, d.x + d.width - d.maxradius - d.maxrimwidth)\n\t\t}\n\t\t// stem1\n\t\tss.stem1 = lapcount == 0 ? 0 : dotwidth\n\t\t// stem2\n\t\tss.stem2 = scaleLinear()\n\t\t\t.domain([0, 1, ss.data.length])\n\t\t\t.range([0, dotwidth, dotwidth * 3])(lapcount)\n\t}\n\t// stem3\n\tconst hbaseline = dotwidth * 0.7\n\t// to set stem3, get max group size\n\tlet maxm = 0\n\tfor (const d of ss.data) {\n\t\tfor (const g of d.groups) {\n\t\t\tmaxm = Math.max(maxm, g.occurrence)\n\t\t}\n\t}\n\tss.stem3 = Math.max(2, hbaseline + dotwidth * Math.min(5, maxm))\n\n\tlet foldedKick\n\t// invisible kicking skewer cover when folded\n\tif (tk.shapes) {\n\t\t//Returns the kick in the same shape if skewer is not a circle\n\t\tfoldedKick = renderShapeKick(ss, ss.selection)\n\t\tfoldedKick.attr(\n\t\t\t'transform',\n\t\t\td =>\n\t\t\t\t`translate(0, ${(tk.skewer.pointup ? -1 : 1) * d.maxradius})\n\t\t\tscale(${d.showmode == modefold ? '1,1' : '0.01,0.01'})`\n\t\t)\n\t} else {\n\t\tfoldedKick = ss.selection\n\t\t\t.append('circle')\n\t\t\t.attr('r', d => d.maxradius + 1)\n\t\t\t.attr('cy', d => (tk.skewer.pointup ? -1 : 1) * d.maxradius)\n\t\t\t.attr('transform', d => `scale(${d.showmode == modefold ? '1,1' : '0.01,0.01'})`) // \"scale(0)\" will not make the circle disappear on safari\n\t}\n\n\tfoldedKick\n\t\t.attr('class', 'sja_aa_skkick')\n\t\t.attr('fill', 'white')\n\t\t.attr('fill-opacity', 0)\n\t\t.attr('stroke', 'none')\n\t\t.on('mouseover', (event, d) => {\n\t\t\tlet cumh = 0\n\t\t\tlet boxw = 0\n\t\t\tconst hpad = 5\n\t\t\tconst tiph = tk.skewer.pointup ? 7 : 14\n\t\t\tfor (const g of d.groups) {\n\t\t\t\tg.pica_fontsize = Math.max(11, g.radius)\n\t\t\t\tcumh += g.pica_fontsize + 1\n\t\t\t\ttk.pica.g\n\t\t\t\t\t.append('text')\n\t\t\t\t\t.text((g.mnameCompact || g.mlst[0].mname) + (g.occurrence > 1 ? ' x' + g.occurrence : ''))\n\t\t\t\t\t.attr('font-size', g.pica_fontsize)\n\t\t\t\t\t.each(function () {\n\t\t\t\t\t\tboxw = Math.max(boxw, this.getBBox().width)\n\t\t\t\t\t})\n\t\t\t\t\t.remove()\n\t\t\t}\n\t\t\tboxw += hpad * 2\n\t\t\tconst boxh = cumh + 5\n\t\t\ttk.pica.g\n\t\t\t\t.append('rect')\n\t\t\t\t.attr('y', tk.skewer.pointup ? -boxh : 0)\n\t\t\t\t.attr('width', boxw)\n\t\t\t\t.attr('height', boxh)\n\t\t\t\t.attr('fill', 'white')\n\t\t\t\t.attr('fill-opacity', 0.8)\n\t\t\t\t.attr('stroke', '#ccc')\n\t\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\tcumh = 0\n\t\t\tconst _g = tk.pica.g\n\t\t\t\t.selectAll()\n\t\t\t\t.data(d.groups)\n\t\t\t\t.enter()\n\t\t\t\t.append('g')\n\t\t\t\t.attr('transform', (g, i) => {\n\t\t\t\t\tcumh += g.pica_fontsize + 1\n\t\t\t\t\treturn 'translate(' + hpad + ',' + cumh * (tk.skewer.pointup ? -1 : 1) + ')'\n\t\t\t\t})\n\t\t\t_g.append('text')\n\t\t\t\t.text(g => g.mnameCompact || g.mlst[0].mname)\n\t\t\t\t.attr('font-size', g => g.pica_fontsize)\n\t\t\t\t.each(function (g) {\n\t\t\t\t\tg.pica_mlabelwidth = this.getBBox().width\n\t\t\t\t})\n\t\t\t\t.attr('fill', d => tk.color4disc(d.mlst[0]))\n\t\t\t\t.attr('dominant-baseline', tk.skewer.pointup ? 'hanging' : 'auto')\n\t\t\tconst firstlabw = d.groups[0].pica_mlabelwidth\n\t\t\ttk.pica.x = d.x - hpad - firstlabw / 2\n\t\t\ttk.pica.y = d.y + (tk.skewer.pointup ? -1 : 1) * (d.maxradius * 2 + tiph + 2)\n\t\t\ttk.pica.g.attr('transform', 'translate(' + tk.pica.x + ',' + tk.pica.y + ')')\n\t\t\t_g.filter(g => g.occurrence > 1)\n\t\t\t\t.append('text')\n\t\t\t\t.text(g => 'x' + g.occurrence)\n\t\t\t\t.attr('x', g => g.pica_mlabelwidth + 5)\n\t\t\t\t.attr('font-size', g => g.pica_fontsize)\n\t\t\t\t.attr('dominant-baseline', tk.skewer.pointup ? 'hanging' : 'auto')\n\t\t\t\t.attr('fill', '#9e9e9e')\n\t\t\tconst handle = tk.pica.g\n\t\t\t\t.append('g')\n\t\t\t\t.attr('transform', 'translate(' + (hpad + firstlabw / 2) + ',' + (tk.skewer.pointup ? 1 : -1) + ')')\n\t\t\thandle\n\t\t\t\t.append('line')\n\t\t\t\t.attr('y2', (tk.skewer.pointup ? 1 : -1) * tiph)\n\t\t\t\t.attr('stroke', '#858585')\n\t\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\thandle\n\t\t\t\t.append('line')\n\t\t\t\t.attr('x1', -1)\n\t\t\t\t.attr('x2', -1)\n\t\t\t\t.attr('y2', (tk.skewer.pointup ? 1 : -1) * tiph)\n\t\t\t\t.attr('stroke', 'white')\n\t\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\thandle\n\t\t\t\t.append('line')\n\t\t\t\t.attr('x1', 1)\n\t\t\t\t.attr('x2', 1)\n\t\t\t\t.attr('y2', (tk.skewer.pointup ? 1 : -1) * tiph)\n\t\t\t\t.attr('stroke', 'white')\n\t\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t})\n\t\t.on('mouseout', (event, d) => {\n\t\t\ttk.pica.g.selectAll('*').remove()\n\t\t})\n\t\t.on('click', (event, d) => {\n\t\t\ttk.pica.g.selectAll('*').remove()\n\t\t\tunfold_glyph([d], tk, block)\n\t\t})\n\t// set fold y offset\n\t// get max mcount for skewers\n\tlet mm = 0\n\tfor (const d of ss.data) {\n\t\tmm = Math.max(mm, d.occurrence)\n\t}\n\tconst sf_foldyoff = scaleLinear()\n\t\t.domain([1, mm])\n\t\t.range([hbaseline, ss.stem3 - globalmaxradius])\n\tss.selection.attr('transform', d => {\n\t\td.foldyoffset = sf_foldyoff(d.occurrence)\n\t\td.y = skewer_sety(d, tk)\n\t\treturn 'translate(' + d.x + ',' + d.y + ')'\n\t})\n\t// no stackbars\n\t// stem\n\tss.selection\n\t\t.append('path')\n\t\t.attr('class', 'sja_aa_stem')\n\t\t.attr('d', d => skewer_setstem(d, tk))\n\t\t.attr('stroke', d => tk.color4disc(d.groups[0].mlst[0]))\n\t\t.attr('fill', 'none')\n\t// ssk: only for skewers with >1 groups\n\tconst mgsk = ss.selection.filter(d => d.groups.length > 1)\n\tmgsk\n\t\t.append('rect')\n\t\t.attr('class', 'sja_aa_ssk_bg')\n\t\t.attr('shape-rendering', 'crispEdges')\n\t\t.attr('fill-opacity', 0)\n\t\t.attr('height', ss.stem1)\n\t\t.attr('fill', d => tk.color4disc(d.groups[0].mlst[0]))\n\t\t.attr('width', d => {\n\t\t\td.ssk_width = Math.max(d.occurrence.toString().length * 8 + 6, 2 * (d.maxradius + d.maxrimwidth))\n\t\t\treturn d.ssk_width\n\t\t})\n\t\t.attr('x', d => -d.ssk_width / 2)\n\tmgsk\n\t\t.append('text')\n\t\t.attr('class', 'sja_aa_ssk_text')\n\t\t.attr('fill', 'white')\n\t\t.attr('fill-opacity', 0)\n\t\t.attr('font-weight', 'bold')\n\t\t.attr('text-anchor', 'middle')\n\t\t.attr('dominant-baseline', 'central')\n\t\t.text(d => d.occurrence)\n\t\t.each(d => {\n\t\t\td.ssk_fontsize = Math.min(ss.stem1, d.ssk_width / (d.occurrence.toString().length * textlensf))\n\t\t})\n\t\t.attr('font-size', d => d.ssk_fontsize)\n\t// ssk - kick\n\tmgsk\n\t\t.append('rect')\n\t\t.attr('class', 'sja_aa_ssk_kick')\n\t\t.attr('fill', 'white')\n\t\t.attr('fill-opacity', 0)\n\t\t.attr('stroke', 'none')\n\t\t.attr('height', ss.stem1)\n\t\t.attr('x', d => -d.ssk_width / 2)\n\t\t.attr('width', d => d.ssk_width)\n\t\t.on('mouseover', (event, d) => {\n\t\t\tconst p = d3select(event.target.parentNode)\n\t\t\tp.selectAll('.sja_aa_disckick').transition().attr('stroke-opacity', 1)\n\t\t\tp.select('.sja_aa_ssk_bg').transition().attr('fill-opacity', 1).attr('stroke-opacity', 1)\n\t\t\tp.select('.sja_aa_ssk_text').transition().attr('fill-opacity', 1)\n\t\t})\n\t\t.on('mouseout', function (event, d) {\n\t\t\tconst p = d3select(event.target.parentNode)\n\t\t\tp.selectAll('.sja_aa_disckick').transition().attr('stroke-opacity', 0)\n\t\t\tp.select('.sja_aa_ssk_bg').transition().attr('fill-opacity', 0).attr('stroke-opacity', 0)\n\t\t\tp.select('.sja_aa_ssk_text').transition().attr('fill-opacity', 0)\n\t\t})\n\t\t.on('click', async (event, d) => {\n\t\t\tclick_variant(d, tk, block, event.target.getBoundingClientRect(), null, event.target)\n\t\t})\n}\n\nexport function skewer_sety(d, tk) {\n\tif (tk.skewer.pointup) {\n\t\tif (d.showmode == modefold) {\n\t\t\treturn tk.skewer.maxheight + tk.skewer.stem1 + tk.skewer.stem2 + tk.skewer.stem3 - d.foldyoffset\n\t\t}\n\t\treturn tk.skewer.maxheight\n\t}\n\tif (d.showmode == modefold) return d.foldyoffset\n\treturn tk.skewer.stem1 + tk.skewer.stem2 + tk.skewer.stem3\n}\n\nfunction skewer_setstem(d, tk) {\n\tif (tk.skewer.pointup) {\n\t\tif (d.showmode == modefold) {\n\t\t\treturn 'M0,0v0l0,0v' + d.foldyoffset\n\t\t}\n\t\treturn 'M0,0v' + tk.skewer.stem1 + 'l' + (d.x0 - d.x) + ',' + tk.skewer.stem2 + 'v' + tk.skewer.stem3\n\t}\n\tif (d.showmode == modefold) {\n\t\treturn 'M0,0v0l0,0v-' + d.foldyoffset\n\t}\n\treturn 'M0,0v-' + tk.skewer.stem1 + 'l' + (d.x0 - d.x) + ',-' + tk.skewer.stem2 + 'v-' + tk.skewer.stem3\n}\n\nexport function settle_glyph(tk, block) {\n\tif (tk.skewer.data.length == 0) return\n\tconst x1 = 0\n\tconst x2 = block.width\n\t// only settle those in view range\n\t// sum of skewer width, determines whether full or pack\n\tlet sumwidth = 0\n\tconst allinview = []\n\tconst beyondviewitems = []\n\tfor (const d of tk.skewer.data) {\n\t\tif (d.x0 < x1 || d.x0 > x2) {\n\t\t\tdelete d.xoffset\n\t\t\tbeyondviewitems.push(d)\n\t\t} else {\n\t\t\t// important: singleton label is rotated by default, must not include label width\n\t\t\tsumwidth += d.slabelrotate ? (d.groups[0].radius + d.groups[0].rimwidth) * 2 : d.width\n\t\t\tallinview.push(d)\n\t\t}\n\t}\n\n\t// reset those beyond view range\n\tfold_glyph(beyondviewitems, tk)\n\t// TODO may move d.x to +/-1000 out of sight\n\n\tlet expandlst = []\n\tconst foldlst = []\n\n\tif (sumwidth < x2 - x1) {\n\t\t// skewers can show in full\n\t\texpandlst = allinview\n\t} else {\n\t\t// rank skewers by ...\n\t\tallinview.sort((a, b) => {\n\t\t\tif (b.occurrence == a.occurrence) {\n\t\t\t\tif (b.groups.length == a.groups.length) {\n\t\t\t\t\t//return Math.abs(a.aapos*2-aarangestart-aarangestop)-Math.abs(b.aaposition*2-aarangestart-aarangestop);\n\t\t\t\t\treturn Math.abs(a.x0 * 2 - x1 - x2) - Math.abs(b.x0 * 2 - x1 - x2)\n\t\t\t\t} else {\n\t\t\t\t\treturn b.groups.length - a.groups.length\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn b.occurrence - a.occurrence\n\t\t})\n\t\t// collect top items to expand\n\t\tlet width = 0\n\t\tlet allowpx = (x2 - x1) * 0.8\n\t\tlet stop = false\n\t\tfor (const d of allinview) {\n\t\t\tif (stop) {\n\t\t\t\tdelete d.xoffset\n\t\t\t\tfoldlst.push(d)\n\t\t\t\td.showmode = modefold\n\t\t\t} else {\n\t\t\t\tif (width + d.width < allowpx) {\n\t\t\t\t\texpandlst.push(d)\n\t\t\t\t\twidth += d.width\n\t\t\t\t} else {\n\t\t\t\t\tstop = true\n\t\t\t\t\tdelete d.xoffset\n\t\t\t\t\tfoldlst.push(d)\n\t\t\t\t\td.showmode = modefold\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfold_glyph(foldlst, tk)\n\tunfold_glyph(expandlst, tk, block)\n}\n\nexport function unfold_glyph(newlst, tk, block) {\n\tconst dur = 1000\n\t// set up new items\n\tconst expanded = new Set() // d.x as key\n\tconst folded = new Set()\n\tfor (const d of newlst) {\n\t\tif (d.showmode == modeshow) {\n\t\t\texpanded.add(d.x0)\n\t\t} else {\n\t\t\td.showmode = modeshow\n\t\t\tfolded.add(d.x0)\n\t\t\td.y = skewer_sety(d, tk)\n\t\t}\n\t}\n\n\tif (expanded.size) {\n\t\t/* issue\n\t\ton panning, skewers that were already expanded before, will keep rims hidden\n\t\tthis quick fix allows to show rims for such\n\t\t*/\n\t\tconst set = tk.skewer.selection.filter(d => expanded.has(d.x0))\n\t\tset.selectAll('.sja_aa_discrim').attr('fill-opacity', 1).attr('stroke-opacity', 1)\n\t}\n\n\tif (folded.size) {\n\t\t// vertical extending\n\t\tconst set = tk.skewer.selection.filter(d => folded.has(d.x0))\n\t\tset\n\t\t\t.transition()\n\t\t\t.duration(dur)\n\t\t\t.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')')\n\t\tset\n\t\t\t.selectAll('.sja_aa_discg')\n\t\t\t.transition()\n\t\t\t.duration(dur)\n\t\t\t.attr('transform', d => {\n\t\t\t\td.y = d.yoffset * (tk.skewer.pointup ? -1 : 1)\n\t\t\t\treturn 'translate(0,' + d.y + ')'\n\t\t\t})\n\t\tset\n\t\t\t.selectAll('.sja_aa_disckick')\n\t\t\t.transition()\n\t\t\t.duration(dur)\n\t\t\t.attr('transform', 'scale(1)')\n\t\t\t.on('end', () => {\n\t\t\t\t// on disckick fully expanded, make ssk_kick visible\n\t\t\t\tset\n\t\t\t\t\t.selectAll('.sja_aa_ssk_kick')\n\t\t\t\t\t.attr('transform', 'scale(1)')\n\t\t\t\t\t.attr('y', tk.skewer.pointup ? 0 : -tk.skewer.stem1)\n\n\t\t\t\t//For e2e testing\n\t\t\t\tset.selectAll('.sja_aa_disckick').classed('sjpp-active', true)\n\t\t\t})\n\t\tset.selectAll('.sja_aa_discnum').transition().duration(dur).attr('fill-opacity', 1).attr('stroke-opacity', 1)\n\t\tset\n\t\t\t.filter(d => d.groups.length > 1)\n\t\t\t.selectAll('.sja_aa_disclabel')\n\t\t\t.transition()\n\t\t\t.duration(dur)\n\t\t\t.attr('fill-opacity', 1)\n\t\t\t.attr('transform', 'scale(1)')\n\t\tset.selectAll('.sja_aa_discrim').transition().duration(dur).attr('fill-opacity', 1).attr('stroke-opacity', 1)\n\n\t\t/**** do not expand sja_aa_ssk_kick at this moment but wait till disckick is fully expanded:\n\t\tif ssk is expanded right now, cursor hover over it will halt disckick expanding transition and cause the discs to be unclickable\n\t\t*/\n\n\t\tset\n\t\t\t.selectAll('.sja_aa_ssk_bg')\n\t\t\t.attr('transform', 'scale(1)')\n\t\t\t.attr('y', tk.skewer.pointup ? 0 : -tk.skewer.stem1)\n\t\tset\n\t\t\t.selectAll('.sja_aa_ssk_text')\n\t\t\t.attr('transform', 'scale(1)')\n\t\t\t.attr('y', ((tk.skewer.pointup ? 1 : -1) * tk.skewer.stem1) / 2)\n\t\tset\n\t\t\t.selectAll('.sja_aa_skkick')\n\t\t\t.transition()\n\t\t\t.duration(0)\n\t\t\t.attr(\n\t\t\t\t'transform',\n\t\t\t\td =>\n\t\t\t\t\t`${\n\t\t\t\t\t\td.shape && !d.shape.includes('Circle') ? `translate(0, ${(tk.skewer.pointup ? -1 : 1) * d.maxradius})` : ''\n\t\t\t\t\t} scale(0.01, 0.01)` // safari fix\n\t\t\t)\n\t\t\t.on('end', () => {\n\t\t\t\t//For e2e testing\n\t\t\t\tset.selectAll('.sja_aa_skkick').classed('sjpp-active', false)\n\t\t\t})\n\t\tlet counter = 0\n\t\tset\n\t\t\t.selectAll('.sja_aa_stem')\n\t\t\t.transition()\n\t\t\t.duration(dur)\n\t\t\t.attr('d', d => skewer_setstem(d, tk))\n\t\t\t.each(() => ++counter)\n\t\t\t.on('end', () => {\n\t\t\t\tif (!--counter) {\n\t\t\t\t\tunfold_update(tk, block)\n\t\t\t\t}\n\t\t\t})\n\t} else {\n\t\tunfold_update(tk, block)\n\t}\n}\n\nfunction unfold_update(tk, block) {\n\tconst dur = 1000\n\tconst alllst = [] // already expanded\n\tconst hash = new Set() // d.x0 as key\n\tconst x1 = 0\n\tconst x2 = block.width\n\tfor (const d of tk.skewer.data) {\n\t\tif (d.x0 < x1 || d.x0 > x2) continue\n\t\tif (d.showmode == modeshow) {\n\t\t\td.x = d.x0\n\t\t\talllst.push(d)\n\t\t\thash.add(d.x0)\n\t\t}\n\t}\n\tif (alllst.length == 0) {\n\t\treturn\n\t}\n\thoriplace(alllst, tk, block)\n\tfor (const d of alllst) {\n\t\td.xoffset = d.x - d.x0\n\t}\n\tfor (let i = 0; i < alllst.length; i++) {\n\t\tconst d = alllst[i]\n\t\tif (d.groups.length > 1) continue\n\t\t// single\n\t\tconst disc = d.groups[0]\n\t\tif (tk.slabel_forcerotate) {\n\t\t\td.slabelrotate = true\n\t\t} else {\n\t\t\tconst next = alllst[i + 1]\n\t\t\tconst rightx = next ? next.x - next.maxradius - next.maxrimwidth : x2\n\t\t\td.slabelrotate = rightx - d.x - disc.radius - disc.rimwidth - 1 < d.slabelwidth\n\t\t}\n\t\td.width = (disc.radius + disc.rimwidth) * 2 + (d.slabelrotate ? 0 : 2 + d.slabelwidth)\n\t}\n\t// horizontal shifting\n\tconst set = tk.skewer.selection.filter(d => hash.has(d.x0))\n\tset\n\t\t.transition()\n\t\t.duration(dur)\n\t\t.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')')\n\tset\n\t\t.selectAll('.sja_aa_stem')\n\t\t.transition()\n\t\t.duration(dur)\n\t\t.attr('d', d => skewer_setstem(d, tk))\n\tset\n\t\t.filter(d => d.groups.length == 1)\n\t\t.selectAll('.sja_aa_disclabel')\n\t\t.transition()\n\t\t.duration(dur)\n\t\t.attr('fill-opacity', 1)\n\t\t.attr(\n\t\t\t'transform',\n\t\t\td => 'scale(1) rotate(' + (d.aa.slabelrotate ? (tk.skewer.pointup ? '-' : '') + '90' : '0') + ')'\n\t\t)\n\ttk.slabel_forcerotate = false\n}\n\nfunction horiplace(items, tk, block) {\n\t// only arrange those in aa view range\n\tconst xoffset0 = 0\n\tconst x2 = block.width\n\tlet xoffset = xoffset0\n\t// those out of range are not touched\n\t// detect if any overlap\n\tlet overlap = false\n\tfor (const i of items) {\n\t\tif (i.x0 < xoffset0 || i.x0 > x2) continue\n\t\tif (i.groups.length == 1) {\n\t\t\ti.slabelrotate = true\n\t\t\tconst disc = i.groups[0]\n\t\t\ti.width = (disc.radius + disc.rimwidth) * 2\n\t\t}\n\t\tconst x = i.x - i.maxradius - i.maxrimwidth\n\t\tif (x < xoffset) {\n\t\t\toverlap = true\n\t\t}\n\t\tif (x + i.width > x2) {\n\t\t\toverlap = true\n\t\t}\n\t\txoffset = Math.max(xoffset, x + i.width)\n\t}\n\tif (!overlap) {\n\t\t// nothing to do\n\t\treturn false\n\t}\n\t// push and pack all to the left\n\txoffset = xoffset0\n\tfor (const i of items) {\n\t\tif (i.x0 < xoffset0 || i.x0 > x2) continue\n\t\ti.x = xoffset + i.maxradius + i.maxrimwidth\n\t\txoffset += i.width\n\t}\n\n\thoriplace0(items, block.width)\n}\n\nfunction horiplace0(items, allwidth) {\n\t/*\n\titems[]\n\t.width\n\t.x0\n\t.x\n\t\talready set by pushing to left\n\t*/\n\tfor (let i = 0; i < items.length; i++) {\n\t\tif (items[i].x0 < 0) continue\n\t\tif (items[i].x0 > allwidth) break\n\n\t\twhile (1) {\n\t\t\tlet currsum = 0,\n\t\t\t\tnewsum = 0\n\t\t\tfor (let j = i; j < items.length; j++) {\n\t\t\t\tconst t = items[j]\n\t\t\t\tif (t.x0 > allwidth) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcurrsum += Math.abs(t.x - t.x0)\n\t\t\t\tt.x++\n\t\t\t\tnewsum += Math.abs(t.x - t.x0)\n\t\t\t}\n\t\t\tif (items[i].x >= items[i].x0) {\n\t\t\t\t// wind back to make sure stem [i] stem is straight\n\t\t\t\tfor (let j = i; j < items.length; j++) {\n\t\t\t\t\titems[j].x--\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst z = items[items.length - 1]\n\t\t\tif (z.x + z.width / 2 >= allwidth) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (newsum <= currsum) {\n\t\t\t\t// accept move\n\t\t\t} else {\n\t\t\t\t// reject move, procceed to next item\n\t\t\t\tfor (let j = i; j < items.length; j++) {\n\t\t\t\t\tif (items[j].x0 > allwidth) {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// wind back\n\t\t\t\t\titems[j].x--\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function fold_glyph(lst, tk) {\n\tif (lst.length == 0) return\n\tconst dur = 1000\n\t// total number of discs, determines if disc details are visible prior to folding\n\tconst hash = new Set()\n\tfor (const d of lst) {\n\t\td.x = d.x0\n\t\thash.add(d.x0)\n\t\td.showmode = modefold\n\t\td.y = skewer_sety(d, tk)\n\t}\n\tconst set = tk.skewer.selection.filter(d => hash.has(d.x0))\n\tset\n\t\t.transition()\n\t\t.duration(dur)\n\t\t.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')')\n\tset\n\t\t.selectAll('.sja_aa_stem')\n\t\t.transition()\n\t\t.duration(dur)\n\t\t.attr('d', d => skewer_setstem(d, tk))\n\tset\n\t\t.selectAll('.sja_aa_discg')\n\t\t.transition()\n\t\t.duration(dur)\n\t\t.attr('transform', d => 'translate(0,' + (tk.skewer.pointup ? '-' : '') + d.aa.maxradius + ')')\n\tset\n\t\t.selectAll('.sja_aa_disckick')\n\t\t.transition()\n\t\t.duration(0) // must add a transition so .on(end) below can be triggered\n\t\t.attr('transform', 'scale(0)')\n\t\t.on('end', () => {\n\t\t\t//For e2e testing\n\t\t\tset.selectAll('.sja_aa_disckick').classed('sjpp-active', false)\n\t\t})\n\tset.selectAll('.sja_aa_discnum').transition().duration(dur).attr('fill-opacity', 0).attr('stroke-opacity', 0)\n\tset.selectAll('.sja_aa_disclabel').transition().duration(dur).attr('fill-opacity', 0).attr('transform', 'scale(0)') // hide this label so it won't be tred\n\tset.selectAll('.sja_aa_discrim').transition().duration(dur).attr('fill-opacity', 0).attr('stroke-opacity', 0)\n\tset.selectAll('.sja_aa_ssk_kick').attr('transform', 'scale(0)')\n\tset.selectAll('.sja_aa_ssk_bg').attr('transform', 'scale(0)')\n\tset.selectAll('.sja_aa_ssk_text').attr('transform', 'scale(0)')\n\tset\n\t\t.selectAll('.sja_aa_skkick')\n\t\t.transition()\n\t\t.duration(dur) // to prevent showing pica over busy skewer\n\t\t.attr('transform', d => `${d.shape ? `translate(0, ${(tk.skewer.pointup ? -1 : 1) * d.maxradius})` : ''} scale(1)`)\n\t\t.on('end', () => {\n\t\t\t//For e2e testing\n\t\t\tset.selectAll('.sja_aa_skkick').classed('sjpp-active', true)\n\t\t})\n}\n\n/* works for both skewer and numeric mode\nhighlights disc dots by matching with tk.skewer.hlssmid, a set\nhlBoxG is blank <g> in each discg\nto highlight a disk, insert a <rect> with colored border\n*/\nexport function mayHighlightDiskBySsmid(tk) {\n\t// clear existing highlights\n\ttk.skewer.hlBoxG.selectAll('*').remove()\n\tif (!tk.skewer.hlssmid) return\n\ttk.skewer.hlBoxG\n\t\t.filter(g => {\n\t\t\tif (g.mlst) {\n\t\t\t\t// in skewer mode\n\t\t\t\treturn g.mlst.find(m => tk.skewer.hlssmid.has(m.ssm_id))\n\t\t\t}\n\t\t\t// numeric mode\n\t\t\treturn tk.skewer.hlssmid.has(g.ssm_id)\n\t\t})\n\t\t.append('rect')\n\t\t.attr('x', g => -g.radius)\n\t\t.attr('y', g => -g.radius)\n\t\t.attr('width', g => g.radius * 2)\n\t\t.attr('height', g => g.radius * 2)\n\t\t.attr('stroke', tk.skewer.hlBoxColor)\n\t\t.attr('stroke-width', g => (g.radius > 10 ? 1.5 : 1))\n\t\t.attr('fill', 'none')\n\t\t.attr('class', 'sja_mds3_skewer_ssmhlbox') // for testing\n}\n\nexport function showHoverTipOnDisk(event, d, tk) {\n\ttk.hovertip.clear().show(event.clientX, event.clientY)\n\tif (!d.mlst?.[0]) {\n\t\t// should not happen\n\t\ttk.hovertip.d.append('div').text('d.mlst[] missing or blank')\n\t\treturn\n\t}\n\t// d.mlst[] is valid and has at least 1 item\n\t// when there are multiple items, assume they all have same dt and class\n\tconst m = mclass[d.mlst[0]?.class] || { color: 'black', label: '_unknown' }\n\ttk.hovertip.d\n\t\t.append('div')\n\t\t.style('font-size', '.9em')\n\t\t.html(`<span style=\"background:${m.color}\">&nbsp;&nbsp;</span> ${m.label}`)\n\tif (d.mlst[0].occurrence) {\n\t\tconst c = d.mlst.reduce((t, i) => t + i.occurrence, 0)\n\t\ttk.hovertip.d.append('div').text(`${c} sample${c > 1 ? 's' : ''}`)\n\t}\n\tif (d.mlst.length > 1) {\n\t\t// this disc represents multiple item/variants\n\t\t// assuming all mlst has same dt; call as \"variants/alteractions\" depending on dt\n\t\ttk.hovertip.d.append('div').text(`${d.mlst.length} ${d.mlst[0].dt == dtsnvindel ? 'variants' : 'alterations'}`)\n\t}\n}\n", "import { gmmode, dtsnvindel, dtsv, dtfusionrna } from '#shared/common.js'\nimport * as coord from '#src/coord'\n\n/* method shared by skewer and numeric mode\n\n******** input ************\n\nlist of mixed snvindel or sv/fusion\neach element is one data point\n\nsnvindel is:\n{\n\tdt = dtsnvindel\n\tchr = str\n\tpos = int\n}\nsv/fusion is:\n{\n\tdt = dtsv/dtfusionrna\n\tchr = str\n\tpos = int\n\tpairlstIdx = int\n\tstrand = +/-\n\tmname = str\n}\n\n******** output ***********\n\ninput data points that are clustering together are grouped for skewer data\n\n{\n\tchr\n\tpos\n\tmlst[ {} ]\n\t\t.aapos = number\n\t\t.rnapos = number\n\t\t.__x = number\n\t\t.useNterm = boolean\n\tx\n}\n*/\n\n// minimum #pixels per basepair, for which to group data points by bp position\n// if lower than this, means too zoomed out and will group by on-screen pixel position\nconst minbpwidth = 4\n\nexport function make_datagroup(tk, rawmlst, block) {\n\tmlst_pretreat(rawmlst, tk, block)\n\t// m.__x is added to viewable data points\n\n\tconst x2mlst = new Map()\n\t// k: m.__x, v: mlst\n\n\tfor (const m of rawmlst) {\n\t\tif (m.__x == undefined) continue // dropped\n\t\tif (!x2mlst.has(m.__x)) {\n\t\t\tx2mlst.set(m.__x, [])\n\t\t}\n\t\tx2mlst.get(m.__x).push(m)\n\t}\n\tconst datagroup = []\n\t// by resolution\n\tif (block.exonsf >= minbpwidth) {\n\t\t// # pixel per nt is big enough, group by each nt\n\t\tfor (const [x, mlst] of x2mlst) {\n\t\t\tdatagroup.push({\n\t\t\t\tchr: mlst[0].chr,\n\t\t\t\tpos: mlst[0].pos,\n\t\t\t\tmlst,\n\t\t\t\tx\n\t\t\t})\n\t\t}\n\t} else {\n\t\t// # pixel per nt is too small\n\t\tif (block.usegm && block.usegm.coding && block.gmmode != gmmode.genomic) {\n\t\t\t// by aa\n\t\t\t// in gmsum, rglst may include introns, need to distinguish symbolic and rglst introns, use __x difference by a exonsf*3 limit\n\t\t\tconst aa2mlst = new Map()\n\t\t\tfor (const [x, mlst] of x2mlst) {\n\t\t\t\tif (mlst[0].chr != block.usegm.chr) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tlet aapos = undefined\n\t\t\t\tfor (const m of mlst) {\n\t\t\t\t\tif (Number.isFinite(m.aapos)) aapos = m.aapos\n\t\t\t\t}\n\t\t\t\tif (aapos == undefined) {\n\t\t\t\t\taapos = coord.genomic2gm(mlst[0].pos, block.usegm).aapos\n\t\t\t\t}\n\t\t\t\tif (aapos == undefined) {\n\t\t\t\t\tconsole.error('data item cannot map to aaposition')\n\t\t\t\t\tconsole.log(mlst[0])\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tx2mlst.delete(x)\n\t\t\t\tif (!aa2mlst.has(aapos)) {\n\t\t\t\t\taa2mlst.set(aapos, [])\n\t\t\t\t}\n\t\t\t\tlet notmet = true\n\t\t\t\tfor (const lst of aa2mlst.get(aapos)) {\n\t\t\t\t\tif (Math.abs(lst[0].__x - mlst[0].__x) <= block.exonsf * 3) {\n\t\t\t\t\t\tfor (const m of mlst) {\n\t\t\t\t\t\t\tlst.push(m)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnotmet = false\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (notmet) {\n\t\t\t\t\taa2mlst.get(aapos).push(mlst)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const llst of aa2mlst.values()) {\n\t\t\t\tfor (const mlst of llst) {\n\t\t\t\t\tlet m = null\n\t\t\t\t\tfor (const m2 of mlst) {\n\t\t\t\t\t\tif (Number.isFinite(m2.rnapos)) m = m2\n\t\t\t\t\t}\n\t\t\t\t\tif (m == null) {\n\t\t\t\t\t\tconsole.log('trying to map mlst to codon, but no rnapos found')\n\t\t\t\t\t\tfor (const m of mlst) {\n\t\t\t\t\t\t\tconsole.log(m)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tdatagroup.push({\n\t\t\t\t\t\tchr: mlst[0].chr,\n\t\t\t\t\t\tpos: m.pos,\n\t\t\t\t\t\tmlst,\n\t\t\t\t\t\tx: mlst[0].__x\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// leftover by px bin\n\t\tconst pxbin = []\n\t\tconst binpx = 2\n\t\tfor (const [x, mlst] of x2mlst) {\n\t\t\tconst i = Math.floor(x / binpx)\n\t\t\tif (!pxbin[i]) {\n\t\t\t\tpxbin[i] = []\n\t\t\t}\n\t\t\tpxbin[i] = [...pxbin[i], ...mlst]\n\t\t}\n\t\tfor (const mlst of pxbin) {\n\t\t\tif (!mlst) continue\n\t\t\tconst xsum = mlst.reduce((i, j) => i + j.__x, 0)\n\t\t\tdatagroup.push({\n\t\t\t\tisbin: true,\n\t\t\t\tchr: mlst[0].chr,\n\t\t\t\tpos: mlst[0].pos,\n\t\t\t\tmlst,\n\t\t\t\tx: xsum / mlst.length\n\t\t\t})\n\t\t}\n\t}\n\tdatagroup.sort((a, b) => a.x - b.x)\n\treturn datagroup\n}\n\n/*\nlegacy function kept to add in new filters\nguard against bad data\nfilter data by a systematic filter\n\nfor viewable data points, add following:\n.__x = view range x position\n.rnapos = rna position of block.usegm\n.aapos = aa position of block.usegm\n*/\nfunction mlst_pretreat(rawmlst, tk, block) {\n\tlet nogenomicpos = 0,\n\t\toutofcds = 0,\n\t\tnochr = 0\n\tconst unmapped = []\n\tconst usemlst = [] // usable after filtering, for updating stats\n\n\tfor (const m of rawmlst) {\n\t\tdelete m.__x\n\n\t\tif (block.gmmode == gmmode.protein && block.usegm.codingstart && block.usegm.codingstop) {\n\t\t\t// in protein view, exclude those out of cds, e.g. utr ones\n\t\t\t// this may be risky as those p53 utr SVs are no longer visible\n\t\t\tif (m.pos < block.usegm.codingstart || m.pos > block.usegm.codingstop) {\n\t\t\t\toutofcds++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tif (!m.chr) {\n\t\t\tnochr++\n\t\t\tcontinue\n\t\t}\n\t\tif (!Number.isInteger(m.pos)) {\n\t\t\tnogenomicpos++\n\t\t\tcontinue\n\t\t}\n\t\tconst hits = block.seekcoord(m.chr, m.pos)\n\t\tif (hits.length == 0) {\n\t\t\tunmapped.push(m)\n\t\t\tcontinue\n\t\t}\n\t\tif (hits.length == 1) {\n\t\t\tm.__x = hits[0].x\n\t\t} else {\n\t\t\t// hit at multiple regions, still use first hit as following code is not finished\n\t\t\tm.__x = hits[0].x\n\t\t}\n\n\t\tif (m.__x < -1 || m.__x > block.width + 1) {\n\t\t\t// out of view range\n\t\t\tcontinue\n\t\t}\n\n\t\tusemlst.push(m)\n\t}\n\n\tif (nogenomicpos + nochr > 0) {\n\t\tblock.tkerror(tk, nogenomicpos + nochr + ' items have no chromosome or genomic position')\n\t}\n\tif (unmapped.length) {\n\t\tconsole.error(unmapped.length + ' items not mapped to any region')\n\t\tfor (const m of unmapped) console.log(m)\n\t}\n\n\tdsqueryresult_snvindelfusionitd(usemlst, tk, block)\n}\n\nfunction dsqueryresult_snvindelfusionitd(lst, tk, block) {\n\tfor (const m of lst) {\n\t\tif (block.usegm) {\n\t\t\t// m.pos must always be set\n\t\t\tconst t = coord.genomic2gm(m.pos, block.usegm)\n\t\t\tm.rnapos = t.rnapos\n\t\t\tm.aapos = t.aapos\n\t\t}\n\n\t\tif (m.dt == dtsnvindel) {\n\t\t\t// no further processing needed for snvindel\n\t\t\tcontinue\n\t\t}\n\n\t\tif (m.dt == dtsv || m.dt == dtfusionrna) {\n\t\t\tif (m.pairlstIdx == 0) {\n\t\t\t\tm.useNterm = true\n\t\t\t} else {\n\t\t\t\tm.useNterm = false\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// support additional data types\n\n\t\tthrow 'unknown dt: ' + m.dt\n\t}\n}\n", "import { makeVariantLabel } from './leftlabel.variant'\nimport { select } from 'd3-selection'\n// variant label is always made. sample label is optional and dynamically loads script when needed\n\nconst labyspace = 5\n\n/*\nmake_leftlabels\n\tmakeVariantLabel\n\tmakeSampleLabel\n\tmakeSampleFilterLabel\n\tpositionLeftlabelg\n\tmakelabel\n\n\nmake a column of functional labels on the left, under the track label\nlabels are based on server data\nlabels are kept persistent by keys in tk.leftlabels.doms{}\nmust call after rendering skewer track\nmust reset tk.leftlabels.maxwidth\n\n*/\n\nexport async function make_leftlabels(data, tk, block) {\n\tlet laby = 0 // cumulative y offset for various labels created here\n\n\tmakeVariantLabel(data, tk, block, laby)\n\tif (tk.leftlabels.doms.variants) {\n\t\t// has variants label, increment laby\n\t\tlaby += labyspace + block.labelfontsize\n\t}\n\n\tif ('sampleTotalNumber' in data || tk.leftlabels.doms.samples) {\n\t\t/* if either of two conditions is met, will create/update sample label\n\t\t1: data has sample. create label if missing (first time starting tk)\n\t\t2: data has no sample but label exists. should be that filtering dropped all samples\n\t\t*/\n\t\tconst _ = await import('./leftlabel.sample')\n\t\t_.makeSampleLabel(data, tk, block, laby)\n\t\tlaby += labyspace + block.labelfontsize\n\n\t\tif (tk.filterObj) {\n\t\t\t// this tk has a modifiable sample filter, create Filter label\n\t\t\t_.makeSampleFilterLabel(data, tk, block, laby)\n\t\t}\n\t\tif (tk.leftlabels.doms.filterObj) {\n\t\t\tlaby += labyspace + block.labelfontsize\n\t\t}\n\t}\n\n\tif (tk.showCloseLeftlabel) {\n\t\t// allow shorthand to close tk\n\t\tif (!tk.leftlabels.doms.close) {\n\t\t\t// \"Close\" is missing, create\n\t\t\ttk.leftlabels.doms.close = makelabel(tk, block, laby)\n\t\t\t\t.text('Close')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tfor (const [i, t] of block.tklst.entries()) {\n\t\t\t\t\t\tif (t.tkid == tk.tkid) {\n\t\t\t\t\t\t\tblock.tk_remove(i)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttk.onClose?.() // run if present\n\t\t\t\t})\n\t\t}\n\t\t// Close label is present, increment laby\n\t\tlaby += labyspace + block.labelfontsize\n\t}\n\n\t// done creating all possible left labels\n\ttk.leftlabels.laby = laby\n\tpositionLeftlabelg(tk, block)\n\n\tsetLeftlabelsMaxWidth(tk)\n\ttk.subtk2height.leftlabels = laby + 20 // account for tk.tklabel\n}\n\nexport function setLeftlabelsMaxWidth(tk) {\n\t// set tk.leftlabels.maxwidth anew, from all labels\n\ttk.leftlabels.maxwidth = tk.tklabel.node().getBBox().width\n\tfor (const k in tk.leftlabels.doms) {\n\t\ttk.leftlabels.maxwidth = Math.max(tk.leftlabels.maxwidth, tk.leftlabels.doms[k].node().getBBox().width)\n\t}\n}\n\nexport function positionLeftlabelg(tk, block) {\n\tif (tk.leftlabels.laby == 0) {\n\t\t// no labels\n\t\treturn\n\t}\n\ttk.leftlabels.xoff = 0\n\tif (tk.skewer) {\n\t\tconst nm = tk.skewer.viewModes.find(i => i.inuse)\n\t\tif (nm.type == 'numeric') {\n\t\t\t// in numeric mode now, axis opens to left,\n\t\t\t// need to prevent left label from overlapping with axis\n\t\t\t// use y position of last label\n\t\t\tconst lly = tk.leftlabels.laby + labyspace + block.labelfontsize\n\t\t\tif (lly > nm.toplabelheight + 5) {\n\t\t\t\t// FIXME tentatively plus 5 here! was -10!\n\t\t\t\ttk.leftlabels.xoff = nm.axisWidth\n\t\t\t}\n\t\t}\n\t}\n\t// transition for nice effect when switching skewer mode\n\ttk.leftlabels.g.transition().attr('transform', `translate(-${tk.leftlabels.xoff},${labyspace + block.labelfontsize})`)\n}\n\nexport function makelabel(tk, block, y) {\n\tconst text = tk.leftlabels.g\n\t\t.append('text')\n\t\t.attr('font-size', block.labelfontsize)\n\t\t.attr('y', block.labelfontsize / 2 + y)\n\t\t.attr('text-anchor', 'end')\n\t\t.attr('dominant-baseline', 'central')\n\t\t.attr('class', 'sja_clbtext2')\n\t\t.attr('fill', 'black')\n\t\t.attr('x', block.tkleftlabel_xshift)\n\t\t.attr('tabindex', 0)\n\t\t.on('keydown', function (event) {\n\t\t\t// ignore this event if it bubbled up from a descendant element\n\t\t\tif (event.target != textElem) return\n\t\t\tif (event.key == 'Enter') textElem.dispatchEvent(new Event('click'))\n\t\t})\n\n\tconst textElem = text.node()\n\treturn text\n}\n", "import { select as d3select } from 'd3-selection'\nimport { format as d3format } from 'd3-format'\nimport { axisLeft } from 'd3-axis'\nimport { scaleLinear } from 'd3-scale'\nimport { axisstyle, makeNumericAxisConfig, shapes } from '#dom'\nimport { make_datagroup } from './datagroup'\nimport { click_variant } from './clickVariant'\nimport { positionLeftlabelg } from './leftlabel'\nimport { may_render_skewer } from './skewer'\nimport { mayHighlightDiskBySsmid } from './skewer.render'\nimport { renderShapeKick, renderSkewerShapes } from './skewer.render.shapes'\n\n/*\n********************** EXPORTED\nrenderNumericMode\n********************** INTERNAL\nnumeric_make\nrender_axis\nsetup_axis_scale\nadjustview\nverticallabplace\nsetStem\nm_mouseover\nm_mouseout\n\n\nbased on zoom level, toggle between two views:\n1. cozy view, showing stem, x-shift, labels showing for all discs and point up\n at this mode, default is to draw a single circle for each variant\n alternatively, allow to show graphs e.g. boxplot\n such kind of values should all be server-computed\n2. crowded view, no stem, no x-shift, only show label for top/bottom items\n\nwhen clicking variant:\ndots in numeric mode are individual variants\ncompared to skewer, each dot is a mlst[]\n\n*/\n\nconst font = 'Arial'\nconst disclabelspacing = 1 // px spacing between disc and label\nconst middlealignshift = 0.3\nconst labyspace = 5\nconst clustercrowdlimit = 7 // at least 8 px per disc, otherwise won't show mname label\n// when using an info field, if the variant is not annotated and no missing_value is available from the info field, use this\nconst maxclusterwidth = 100\nconst hardcode_missing_value = 0\nconst stemColor = '#ededed'\nconst defaultLabel = 'Numeric value'\n\n/*\nnm{}\n\tthe object marked as \"in use\" in skewer.viewModes[]\n\trendering parameters are attached to it\ndata: {skewer}\n\ttricky!\n\tdata.skewer can be missing when pan/zoom in protein mode, where skewer data is not returned\n\tas same data has been kept at tk.skewer.rawmlst\n*/\nexport function renderNumericMode(nm, data, tk, block) {\n\tconst datagroup = make_datagroup(tk, data.skewer || tk.skewer.rawmlst, block).filter(\n\t\tg => g.x >= 0 && g.x <= block.width\n\t)\n\n\t// for variant leftlabel to access later\n\tnm.data = datagroup\n\n\t// initialize numeric mode\n\tif (!nm.axisg) nm.axisg = tk.gleft.append('g')\n\tif (!nm.axisheight) nm.axisheight = 150\n\n\tclearTk(tk)\n\n\tnumeric_make(nm, tk, block)\n\n\tmayHighlightByLDoverlay(tk)\n\n\treturn (\n\t\tnm.toplabelheight +\n\t\tnm.maxradius +\n\t\tnm.axisheight +\n\t\tnm.maxradius +\n\t\tnm.stem1 +\n\t\tnm.stem2 +\n\t\tnm.stem3 +\n\t\tnm.bottomlabelheight\n\t)\n}\n\nfunction clearTk(tk) {\n\t// skewer.g <g> is always there. will create nm plot into it\n\t// new d3 group selection is registered at skewer.nmg\n\ttk.skewer.g.selectAll('*').remove()\n\tif (tk.skewer.nmg) tk.skewer.nmg.selectAll('*').remove()\n}\n\nfunction numeric_make(nm, tk, block) {\n\t/*\n\t */\n\n\tif (!nm.axisSetting) {\n\t\t// should be fine to create default setting when missing\n\t\tnm.axisSetting = { auto: 1 }\n\t}\n\n\tconst data = nm.data\n\n\tfor (const d of data) {\n\t\td.x0 = d.x\n\t\tif (d.xoffset != undefined) {\n\t\t\td.x = d.x0 + d.xoffset\n\t\t}\n\t}\n\n\t// diameter, also m label font size\n\tconst dotwidth = Math.max(14, block.width / 110)\n\n\tnm.dotwidth = dotwidth\n\tnm.maxradius = 0\n\n\tfor (const d of data) {\n\t\tfor (const m of d.mlst) {\n\t\t\t// radius may be variable\n\t\t\tm.radius = dotwidth / 2\n\t\t\tnm.maxradius = Math.max(m.radius, nm.maxradius)\n\n\t\t\t// determine if has rim\n\t\t\tm.rimwidth = 0\n\n\t\t\tm.aa = d // m references data point\n\t\t}\n\t}\n\n\tconst showstem = adjustview(data, nm, tk, block)\n\n\tsetup_axis_scale(data, nm, tk)\n\n\tconst numscale = scaleLinear().domain([nm.minvalue, nm.maxvalue]).range([0, nm.axisheight])\n\n\t// set m._y\n\tfor (const d of data) {\n\t\tfor (const m of d.mlst) {\n\t\t\tif (m.__value_missing) {\n\t\t\t\t// missing numeric value, assign 0 to place the dot at the bottom of axis\n\t\t\t\tm._y = 0\n\t\t\t} else {\n\t\t\t\t// has valid value, map to axis\n\t\t\t\tif (m.__value_use < nm.minvalue) {\n\t\t\t\t\tm._y = 0\n\t\t\t\t} else if (m.__value_use > nm.maxvalue) {\n\t\t\t\t\tm._y = nm.axisheight\n\t\t\t\t} else {\n\t\t\t\t\tm._y = numscale(m.__value_use)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\tset:\n\t.data[].width\n\t.data[].stemw\n\t.data[].xoffset\n\t.data[].x\n\t.data[].mlst[].xoff\n\t.data[].mlst[].rotate\n\t*/\n\n\tif (showstem) {\n\t\tnm.stem1 = 5\n\t\tnm.stem2 = 20\n\t\tnm.stem3 = 10 // should be determined by stackbars\n\t} else {\n\t\tnm.stem1 = 0\n\t\tnm.stem2 = 0\n\t\tnm.stem3 = 0\n\t}\n\n\t// get mname label width\n\tfor (const d of data) {\n\t\tfor (const m of d.mlst) {\n\t\t\ttk.glider\n\t\t\t\t.append('text')\n\t\t\t\t.text(tk.mnamegetter(m))\n\t\t\t\t.attr('font-size', m.radius * 2 - 2)\n\t\t\t\t.each(function () {\n\t\t\t\t\tm.labwidth = this.getBBox().width\n\t\t\t\t})\n\t\t\t\t.remove()\n\t\t}\n\t}\n\n\t// rotated labels, size protruding beyond y axis\n\tfor (const d of data) {\n\t\t// reset all\n\t\tfor (const m of d.mlst) {\n\t\t\tdelete m.labattop\n\t\t\tdelete m.labatbottom\n\t\t}\n\t}\n\n\tif (!tk.skewer.hideDotLabels) {\n\t\t// can show m label\n\t\tif (showstem) {\n\t\t\t// show label for each disc, all rotated up\n\t\t\tfor (const d of data) {\n\t\t\t\tif (d.mlst.length == 1) {\n\t\t\t\t\tconst m = d.mlst[0]\n\t\t\t\t\tm.labattop = true\n\t\t\t\t} else {\n\t\t\t\t\t// cluster\n\t\t\t\t\tif ((d.width - d.fixedgew) / (d.mlst.length - 1) < clustercrowdlimit) {\n\t\t\t\t\t\t// too crowded, no label\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// show label for all m\n\t\t\t\t\t\tfor (const m of d.mlst) {\n\t\t\t\t\t\t\tm.labattop = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// no stem\n\t\t\t// sort items by v\n\t\t\tverticallabplace(data)\n\t\t}\n\t}\n\n\tnm.toplabelheight = 0\n\tnm.bottomlabelheight = 0\n\n\tif (nm.showsamplebar || nm.showgenotypebyvalue) {\n\t\tfor (const d of data) {\n\t\t\tfor (const m of d.mlst) {\n\t\t\t\tnm.toplabelheight = Math.max(nm.toplabelheight, m.labwidth)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const d of data) {\n\t\t\tfor (const m of d.mlst) {\n\t\t\t\tif (m.labattop) {\n\t\t\t\t\tnm.toplabelheight = Math.max(nm.toplabelheight, m._y + m.labwidth - nm.axisheight)\n\t\t\t\t} else if (m.labatbottom) {\n\t\t\t\t\tnm.bottomlabelheight = Math.max(nm.bottomlabelheight, m.labwidth - m._y)\n\t\t\t\t}\n\t\t\t\t//Backwards compatibility with .variantShapeName{} arg\n\t\t\t\t//May allow other shapes\n\t\t\t\tif (m.shapeCircle) {\n\t\t\t\t\tm.shape = 'emptyCircle'\n\t\t\t\t\tdelete m.shapeCircle\n\t\t\t\t} else if (m.shapeTriangle) {\n\t\t\t\t\tm.shape = 'filledTriangle'\n\t\t\t\t\tdelete m.shapeTriangle\n\t\t\t\t} else if (!m.shape) m.shape = 'filledCircle'\n\t\t\t}\n\t\t}\n\t}\n\n\t// adjust toplabelheight by tk labels\n\t{\n\t\tlet h = block.labelfontsize + labyspace + block.labelfontsize // tk label and label_mcount\n\t\tif (tk.label_stratify) {\n\t\t\th += tk.label_stratify.length * (labyspace + block.labelfontsize)\n\t\t}\n\t\tnm.toplabelheight = Math.max(nm.toplabelheight, h)\n\t}\n\n\trender_axis(tk, nm, block)\n\n\ttk.skewer.g\n\t\t.append('line')\n\t\t.attr('y1', nm.toplabelheight + nm.maxradius)\n\t\t.attr('y2', nm.toplabelheight + nm.maxradius)\n\t\t.attr('x2', block.width)\n\t\t.attr('stroke', stemColor)\n\t\t.attr('shape-rendering', 'crispEdges')\n\ttk.skewer.g\n\t\t.append('line')\n\t\t.attr('y1', nm.toplabelheight + nm.maxradius + nm.axisheight)\n\t\t.attr('y2', nm.toplabelheight + nm.maxradius + nm.axisheight)\n\t\t.attr('x2', block.width)\n\t\t.attr('stroke', stemColor)\n\t\t.attr('shape-rendering', 'crispEdges')\n\n\ttk.skewer.nmg = tk.skewer.g\n\t\t.selectAll()\n\t\t.data(data)\n\t\t.enter()\n\t\t.append('g')\n\t\t.attr('class', 'sja_skg2')\n\t\t.each(function (d) {\n\t\t\t// compute radius for each group\n\t\t\td.g = this\n\t\t})\n\n\ttk.skewer.nmg.attr(\n\t\t'transform',\n\t\td =>\n\t\t\t'translate(' +\n\t\t\td.x +\n\t\t\t',' +\n\t\t\t(nm.toplabelheight + disclabelspacing + nm.maxradius + nm.axisheight + nm.maxradius) +\n\t\t\t')'\n\t)\n\n\t// 2: stem\n\tif (showstem) {\n\t\ttk.skewer.nmg\n\t\t\t.append('path')\n\t\t\t.attr('class', 'sja_aa_stem')\n\t\t\t.attr('d', d => setStem(d, nm))\n\t\t\t.attr('stroke', d => tk.color4disc(d.mlst[0]))\n\t\t\t.attr('fill', d => (d.mlst.length == 1 ? 'none' : stemColor))\n\t}\n\n\t// 3: discs\n\n\tconst discg = tk.skewer.nmg\n\t\t.selectAll()\n\t\t.data(d => d.mlst)\n\t\t.enter()\n\t\t.append('g')\n\t\t.attr('class', 'sja_aa_discg')\n\t\t.each(function (m) {\n\t\t\tm.g = this\n\n\t\t\t// actual disc\n\t\t\tif (!m.shape.includes('Circle')) {\n\t\t\t\trenderSkewerShapes(tk, nm, d3select(this))\n\t\t\t} else {\n\t\t\t\td3select(this)\n\t\t\t\t\t.append('circle')\n\t\t\t\t\t.attr('fill', m => (shapes[m.shape].isFilled ? tk.color4disc(m) : 'none'))\n\t\t\t\t\t.attr('stroke', m => (shapes[m.shape].isFilled ? 'white' : tk.color4disc(m)))\n\t\t\t\t\t.attr('r', m => m.radius - 0.5)\n\t\t\t\t\t.attr('class', 'sja_aa_disk_fill')\n\t\t\t}\n\t\t})\n\n\tdiscg.attr('transform', m => {\n\t\treturn 'translate(' + m.xoff + ',' + (m._y + nm.maxradius) * -1 + ')'\n\t})\n\n\t// no text in disc\n\n\t// used by mayHighlightDiskBySsmid\n\ttk.skewer.hlBoxG = discg.append('g')\n\n\t// disc kick\n\tconst kick = renderShapeKick(nm, discg)\n\n\tkick\n\t\t.attr('stroke', m => tk.color4disc(m))\n\t\t.attr('fill', 'white')\n\t\t.attr('class', 'sja_aa_disckick')\n\t\t.attr('fill-opacity', 0)\n\t\t.attr('stroke-opacity', 0)\n\t\t.on('mousedown', event => {\n\t\t\tevent.preventDefault()\n\t\t})\n\t\t.on('mouseover', (event, m) => {\n\t\t\tm_mouseover(m, nm, tk)\n\t\t})\n\t\t.on('mouseout', (event, m) => {\n\t\t\tm_mouseout(m, tk)\n\t\t})\n\t\t.on('click', (event, m) => {\n\t\t\tclick_variant({ mlst: [m] }, tk, block, event.target.getBoundingClientRect(), event.target)\n\t\t})\n\n\t// m label\n\t// only make for those to appear on top or bottom\n\tconst textlabels = discg\n\t\t.filter(m => m.labattop || m.labatbottom)\n\t\t.append('text')\n\t\t.each(function (m) {\n\t\t\tm.__svg_textlabel = this\n\t\t})\n\t\t.text(m => tk.mnamegetter(m))\n\t\t.attr('font-size', m => {\n\t\t\tm._labfontsize = Math.max(12, m.radius * 1.2)\n\t\t\treturn m._labfontsize\n\t\t})\n\t\t.attr('fill', m => tk.color4disc(m))\n\t\t.attr('x', m =>\n\t\t\tnm.showsamplebar || nm.showgenotypebyvalue\n\t\t\t\t? nm.axisheight + nm.maxradius + 4\n\t\t\t\t: m.radius + m.rimwidth + disclabelspacing\n\t\t)\n\t\t.attr('y', m => m._labfontsize * middlealignshift)\n\t\t.attr('class', 'sja_aa_disclabel')\n\t\t.attr('transform', m => 'rotate(' + (m.labattop ? '-' : '') + '90)')\n\t\t.on('mousedown', event => {\n\t\t\tevent.preventDefault()\n\t\t})\n\t\t.on('mouseover', (event, m) => m_mouseover(m, nm, tk))\n\t\t.on('mouseout', (event, m) => m_mouseout(m, tk))\n\t\t.on('click', (event, m) => {\n\t\t\tclick_variant({ mlst: [m] }, tk, block, event.target.getBoundingClientRect(), event.target.previousSibling)\n\t\t})\n}\n\nfunction adjustview(data, nm, tk, block) {\n\t/*\n\tself adjusting\n\tfor .data[], add:\n\t\t.x0\n\t\t.width\n\tfor .data[0].mlst[], add:\n\t\t.xoff\n\t*/\n\n\tlet sumwidth = 0\n\n\t// set initial width\n\n\tfor (const d of data) {\n\t\tlet w = 0\n\t\tfor (const m of d.mlst) {\n\t\t\tw += 2 * (m.radius + m.rimwidth)\n\t\t}\n\n\t\tif (d.mlst.length == 1) {\n\t\t\td.width = w\n\t\t} else {\n\t\t\t// cluster, apply maximum allowed span\n\t\t\td.width = Math.min(maxclusterwidth, w)\n\n\t\t\tconst m0 = d.mlst[0]\n\t\t\tconst m1 = d.mlst[d.mlst.length - 1]\n\t\t\td.fixedgew = m0.radius + m0.rimwidth + m1.radius + m1.rimwidth\n\t\t}\n\n\t\tsumwidth += d.width\n\t}\n\n\tif (sumwidth <= block.width) {\n\t\t// fits all\n\t\t// move all to left\n\t\tlet cum = 0\n\t\tfor (const d of data) {\n\t\t\td.x = cum + d.mlst[0].radius + d.mlst[0].rimwidth\n\t\t\tcum += d.width\n\n\t\t\t// stemw required for placing\n\t\t\tif (d.mlst.length == 1) {\n\t\t\t\td.stemw = 0\n\t\t\t} else {\n\t\t\t\td.stemw = d.width - d.fixedgew\n\t\t\t}\n\t\t}\n\n\t\thoriplace1(data, block.width)\n\n\t\tfor (const d of data) {\n\t\t\td.xoffset = d.x - d.x0\n\n\t\t\tif (d.mlst.length == 1) {\n\t\t\t\td.mlst[0].xoff = 0\n\t\t\t\td.stemw = 0\n\t\t\t} else {\n\t\t\t\td.stemw = d.width - d.fixedgew\n\n\t\t\t\tconst span = d.stemw / (d.mlst.length - 1)\n\t\t\t\tfor (let i = 0; i < d.mlst.length; i++) {\n\t\t\t\t\td.mlst[i].xoff = span * i\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n\n\t// do not shrink and horiplace\n\tfor (const d of data) {\n\t\td.x = d.x0\n\t\td.xoffset = 0\n\t\tfor (const m of d.mlst) {\n\t\t\tm.xoff = 0\n\t\t}\n\t}\n\n\t// do not show stem\n\treturn false\n}\n\nfunction horiplace1(items, allwidth) {\n\t/*\n\tonly for numeric\n\t*/\n\tfor (let i = 0; i < items.length; i++) {\n\t\tif (items[i].x0 < 0) continue\n\t\tif (items[i].x0 > allwidth) break\n\n\t\twhile (1) {\n\t\t\tlet currsum = 0,\n\t\t\t\tnewsum = 0\n\t\t\tfor (let j = i; j < items.length; j++) {\n\t\t\t\tconst t = items[j]\n\t\t\t\tif (t.x0 > allwidth) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcurrsum += Math.abs(t.x - t.x0 - t.stemw / 2)\n\t\t\t\tt.x++\n\t\t\t\tnewsum += Math.abs(t.x - t.x0 - t.stemw / 2)\n\t\t\t}\n\t\t\tif (items[i].x > items[i].x0 - items[i].stemw / 2) {\n\t\t\t\t// wind back to make sure stem [i] stem is straight\n\t\t\t\tfor (let j = i; j < items.length; j++) {\n\t\t\t\t\titems[j].x--\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst z = items[items.length - 1]\n\t\t\tif (z.x + z.width / 2 >= allwidth) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (newsum <= currsum) {\n\t\t\t\t// accept move\n\t\t\t} else {\n\t\t\t\t// reject move, procceed to next item\n\t\t\t\tfor (let j = i; j < items.length; j++) {\n\t\t\t\t\tif (items[j].x0 > allwidth) {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// wind back\n\t\t\t\t\titems[j].x--\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction verticallabplace(data) {\n\tconst mlst = []\n\tfor (const d of data) {\n\t\tfor (const m of d.mlst) {\n\t\t\tmlst.push({\n\t\t\t\tm: m,\n\t\t\t\tw: 2 * (m.radius + m.rimwidth),\n\t\t\t\tx: d.x0,\n\t\t\t\ty: m._y\n\t\t\t})\n\t\t}\n\t}\n\n\tmlst.sort((i, j) => j.y - i.y) // descending\n\n\t// 1. labels pointing up, none has label yet\n\n\tfor (let i = 0; i < mlst.length; i++) {\n\t\tconst big = mlst[i]\n\t\tlet overlapwithdisc = false\n\t\tfor (let j = 0; j < i; j++) {\n\t\t\tconst small = mlst[j]\n\t\t\tif (Math.abs(big.x - small.x) < (big.w + small.w) / 2 - 2) {\n\t\t\t\toverlapwithdisc = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!overlapwithdisc) {\n\t\t\tbig.m.labattop = true\n\t\t}\n\t}\n\n\t// 2. labels pointing down\n\n\tfor (let i = mlst.length - 1; i >= 0; i--) {\n\t\tconst big = mlst[i]\n\t\tif (big.m.labattop) continue\n\t\tlet overlapwithlabeleddisc = false\n\t\tfor (let j = mlst.length - 1; j > i; j--) {\n\t\t\tconst small = mlst[j]\n\t\t\tif (small.m.labatbottom && Math.abs(small.x - big.x) < (small.w + big.w) / 2 - 2) {\n\t\t\t\toverlapwithlabeleddisc = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!overlapwithlabeleddisc) {\n\t\t\tbig.m.labatbottom = true\n\t\t}\n\t}\n}\n\nfunction setStem(d, nm) {\n\tif (d.mlst.length == 1) {\n\t\treturn 'M0,0v' + nm.stem1 + 'l' + -d.xoffset + ',' + nm.stem2 + 'v' + nm.stem3\n\t}\n\t// funnel\n\treturn (\n\t\t'M0,0' +\n\t\t'v' +\n\t\tnm.stem1 + // vertical down\n\t\t'l' +\n\t\t-d.xoffset +\n\t\t',' +\n\t\tnm.stem2 + // slope 1\n\t\t'v' +\n\t\tnm.stem3 + // vertical down\n\t\t//+'h1' // to right 1\n\t\t'v-' +\n\t\tnm.stem3 + // veritical up\n\t\t'l' +\n\t\t(d.stemw + d.xoffset - 1) +\n\t\t',-' +\n\t\tnm.stem2 + // slope 2\n\t\t'v-' +\n\t\tnm.stem1\n\t)\n\t//+'Z'\n}\n\nfunction m_mouseover(m, nm, tk) {\n\tif (m.__svg_textlabel) {\n\t\td3select(m.__svg_textlabel).attr('font-size', m._labfontsize * 1.1)\n\t}\n\n\t// pica moves to center of m disc\n\ttk.pica.g.attr(\n\t\t'transform',\n\t\t'translate(' + (m.aa.x + m.xoff) + ',' + (nm.toplabelheight + nm.maxradius + nm.axisheight - m._y) + ')'\n\t)\n\n\tconst linelen = 10\n\tconst boxpad = 4\n\tconst fontsize = m._labfontsize || 13 // _labfontsize is undefined if this m has no lab\n\tconst color = tk.color4disc(m)\n\n\tconst words = []\n\n\tif (nm.tooltipPrintValue) {\n\t\tconst out = nm.tooltipPrintValue(m)\n\t\tif (Array.isArray(out)) {\n\t\t\twords.push(...out.map(i => `${i.k} = ${i.v}`))\n\t\t}\n\t} else {\n\t\twords.push(nm.label + ' = ' + (m.__value_missing ? 'NA' : m.__value_use))\n\t}\n\n\tif (tk.mds.queries?.ld?.mOverlay?.data) {\n\t\t// doing ld overlay now\n\t\tif (m.ssm_id == tk.mds.queries.ld.mOverlay.m.ssm_id) {\n\t\t\t// the same variant, do not indicate r2 value\n\t\t} else {\n\t\t\t// indicate r2 value\n\t\t\tlet r2 = '?'\n\t\t\tfor (const v of tk.mds.queries.ld.mOverlay.data) {\n\t\t\t\tif (v.pos == m.pos && v.alleles == m.ref + '.' + m.alt) {\n\t\t\t\t\tr2 = v.r2\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\twords.push('r2 = ' + r2)\n\t\t}\n\t}\n\n\tif (!m.labattop && !m.labatbottom) {\n\t\twords.push(tk.mnamegetter(m))\n\t}\n\n\tlet textw = 0\n\t//showlab=false\n\tfor (const w of words) {\n\t\ttk.pica.g\n\t\t\t.append('text')\n\t\t\t.attr('font-size', fontsize)\n\t\t\t.text(w)\n\t\t\t.each(function () {\n\t\t\t\ttextw = Math.max(textw, this.getBBox().width)\n\t\t\t})\n\t\t\t.remove()\n\t}\n\n\tconst boxw = boxpad * 2 + textw\n\tlet boxx,\n\t\tlinex1,\n\t\tonleft = true\n\tif (boxw + linelen > m.aa.x + m.xoff) {\n\t\t// pica on right\n\t\tonleft = false\n\t\tlinex1 = m.radius + m.rimwidth\n\t\tboxx = linex1 + linelen\n\t} else {\n\t\t// on left\n\t\tlinex1 = -m.radius - m.rimwidth - linelen\n\t\tboxx = linex1 - boxw\n\t}\n\n\tconst boxh = fontsize * words.length\n\n\t// bg box for white rim\n\ttk.pica.g\n\t\t.append('rect')\n\t\t.attr('x', boxx - 2)\n\t\t.attr('y', -2 - boxpad - boxh / 2)\n\t\t.attr('width', 4 + boxw)\n\t\t.attr('height', 4 + boxpad * 2 + boxh)\n\t\t.attr('fill', 'white')\n\ttk.pica.g\n\t\t.append('line')\n\t\t.attr('x1', linex1)\n\t\t.attr('x2', linex1 + linelen)\n\t\t.attr('stroke', 'white')\n\t\t.attr('stroke-width', 3)\n\t\t.attr('shape-rendering', 'crispEdges')\n\ttk.pica.g\n\t\t.append('line')\n\t\t.attr('x1', linex1)\n\t\t.attr('x2', linex1 + linelen)\n\t\t.attr('stroke', color)\n\t\t.attr('shape-rendering', 'crispEdges')\n\ttk.pica.g\n\t\t.append('rect')\n\t\t.attr('x', boxx)\n\t\t.attr('y', -boxpad - boxh / 2)\n\t\t.attr('width', boxw)\n\t\t.attr('height', boxpad * 2 + boxh)\n\t\t.attr('fill', 'none')\n\t\t.attr('stroke', color)\n\t\t.attr('shape-rendering', 'crispEdges')\n\n\tlet y = (fontsize - boxh) / 2\n\tfor (const w of words) {\n\t\ttk.pica.g\n\t\t\t.append('text')\n\t\t\t.text(w)\n\t\t\t.attr('text-anchor', onleft ? 'end' : 'start')\n\t\t\t.attr('font-size', fontsize)\n\t\t\t.attr('x', onleft ? linex1 - boxpad : boxx + boxpad)\n\t\t\t.attr('y', y)\n\t\t\t.attr('fill', color)\n\t\t\t.attr('dominant-baseline', 'central')\n\t\ty += fontsize\n\t}\n}\n\nfunction m_mouseout(m, tk) {\n\tif (m.__svg_textlabel) {\n\t\td3select(m.__svg_textlabel).attr('font-size', m._labfontsize)\n\t}\n\ttk.pica.g.selectAll('*').remove()\n}\n\n/*\nbased on numeric datatype selector, determine numeric value for each m\n\nif axisSetting.auto=1, determine min/max range\n*/\nfunction setup_axis_scale(data, nm, tk) {\n\tfor (const g of data) {\n\t\tfor (const m of g.mlst) {\n\t\t\tdelete m.__value_use\n\t\t\tdelete m.__value_missing\n\t\t}\n\t}\n\n\tif (nm.byAttribute) {\n\t\tfor (const g of data) {\n\t\t\tfor (const m of g.mlst) {\n\t\t\t\tconst v = m[nm.byAttribute]\n\t\t\t\tif (Number.isFinite(v)) {\n\t\t\t\t\tm.__value_use = v\n\t\t\t\t} else {\n\t\t\t\t\tm.__value_missing = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (nm.byInfo) {\n\t\tfor (const g of data) {\n\t\t\tfor (const m of g.mlst) {\n\t\t\t\tconst v = m?.info?.[nm.byInfo]\n\t\t\t\tif (Number.isFinite(v)) {\n\t\t\t\t\tm.__value_use = v\n\t\t\t\t} else {\n\t\t\t\t\tm.__value_missing = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthrow 'unknown method of getting value'\n\t}\n\n\tif (nm.axisSetting.auto) {\n\t\tnm.minvalue = null\n\t\tnm.maxvalue = null\n\n\t\tfor (const g of data) {\n\t\t\tfor (const m of g.mlst) {\n\t\t\t\tif ('__value_use' in m) {\n\t\t\t\t\tif (nm.minvalue == null) {\n\t\t\t\t\t\tnm.minvalue = m.__value_use\n\t\t\t\t\t\tnm.maxvalue = m.__value_use\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnm.minvalue = Math.min(nm.minvalue, m.__value_use)\n\t\t\t\t\t\tnm.maxvalue = Math.max(nm.maxvalue, m.__value_use)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (nm.axisSetting.fixed) {\n\t\tnm.minvalue = nm.axisSetting.fixed.min\n\t\tnm.maxvalue = nm.axisSetting.fixed.max\n\t} else {\n\t\tthrow 'unknown axisSetting'\n\t}\n}\n\nfunction render_axis(tk, nm, block) {\n\t// axis always opens to left so as not to overlap with data points\n\t// to share space with left labels and not overlapping, records nm.toplabelheight and nm.axisWidth\n\tnm.axisg\n\t\t.attr('transform', 'translate(0,' + (nm.toplabelheight + nm.maxradius) + ')')\n\t\t.selectAll('*')\n\t\t.remove()\n\n\t// axis is inverse of numscale\n\tconst thisscale = scaleLinear().domain([nm.minvalue, nm.maxvalue]).range([nm.axisheight, 0])\n\n\tconst thisaxis = axisLeft().scale(thisscale).ticks(4)\n\tif (nm.isinteger) {\n\t\tthisaxis.tickFormat(d3format('d'))\n\t\tif (nm.maxvalue - nm.minvalue < 3) {\n\t\t\t/*\n\t\t\tmust do this to avoid axis showing redundant labels that doesn't make sense\n\t\t\te.g. -1 -2 -2\n\t\t\t*/\n\t\t\tthisaxis.ticks(nm.maxvalue - nm.minvalue)\n\t\t}\n\t}\n\taxisstyle({\n\t\taxis: nm.axisg.call(thisaxis),\n\t\tshowline: true,\n\t\tfontsize: nm.dotwidth\n\t})\n\n\t// axis label, text must wrap\n\t// read the max tick label width at nm.axisWidth, so axis label won't overlap with them\n\tnm.axisWidth = 0\n\tnm.axisg.selectAll('text').each(function () {\n\t\tnm.axisWidth = Math.max(nm.axisWidth, this.getBBox().width)\n\t})\n\tnm.axisWidth += 15\n\n\t// axis label\n\n\t/* split string by space and render one word in each line\n\tconst lst = (nm.label || defaultLabel).split(' ')\n\tconst y = (nm.axisheight - lst.length * (nm.dotwidth + 1)) / 2\n\tlet maxlabelw = 0\n\tlst.forEach((text, i) => {\n\t\tnm.axisg\n\t\t\t.append('text')\n\t\t\t.attr('fill', 'black')\n\t\t\t.attr('font-size', nm.dotwidth)\n\t\t\t.attr('dominant-baseline', 'central')\n\t\t\t.attr('text-anchor', 'end')\n\t\t\t.attr('y', y + (nm.dotwidth + 1) * i)\n\t\t\t.attr('x', -nm.axisWidth)\n\t\t\t.text(text)\n\t\t\t.each(function() {\n\t\t\t\tmaxlabelw = Math.max(maxlabelw, this.getBBox().width + 15 + nm.axisWidth)\n\t\t\t})\n\t})\n\t*/\n\n\t// render one single text label so can apply click\n\tlet w\n\tnm.axisg\n\t\t.append('text')\n\t\t.attr('fill', 'black')\n\t\t.attr('font-size', nm.dotwidth)\n\t\t.attr('dominant-baseline', 'central')\n\t\t.attr('text-anchor', 'end')\n\t\t.attr('class', 'sjpp-mds3-nm-axislabel sja_clbtext2') // for testing\n\t\t.attr('y', nm.axisheight / 2)\n\t\t.attr('x', -nm.axisWidth)\n\t\t.text(nm.label || defaultLabel) // if too long can use ellipsis, hover to show full\n\t\t.each(function () {\n\t\t\tw = this.getBBox().width\n\t\t})\n\t\t.on('click', event => {\n\t\t\ttk.menutip\n\t\t\t\t.clear()\n\t\t\t\t.showunder(event.target)\n\t\t\t\t.d.append('div')\n\t\t\t\t.text('Cancel')\n\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t.style('border-radius', '0px')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\ttk.menutip.hide()\n\t\t\t\t\tnm.inuse = false\n\t\t\t\t\ttk.skewer.viewModes.find(i => i.type == 'skewer').inuse = true\n\t\t\t\t\tmay_render_skewer({ skewer: tk.skewer.rawmlst }, tk, block)\n\t\t\t\t\tpositionLeftlabelg(tk, block)\n\t\t\t\t\ttk._finish()\n\t\t\t\t})\n\n\t\t\tmakeNumericAxisConfig({\n\t\t\t\tholder: tk.menutip.d.append('div').style('margin', '10px'),\n\t\t\t\tnoPercentile: true,\n\t\t\t\tcallback: s => {\n\t\t\t\t\tnm.axisSetting = s\n\t\t\t\t\tclearTk(tk)\n\t\t\t\t\tnumeric_make(nm, tk, block)\n\t\t\t\t},\n\t\t\t\tsetting: nm.axisSetting\n\t\t\t})\n\t\t})\n\n\ttk.skewer.maxwidth = nm.axisWidth + w\n}\n\nfunction mayHighlightByLDoverlay(tk) {\n\t// quick fix:\n\t// after rendering numeric tk, allow to highlight the \"index\" variant from ld overlay\n\tconst m = tk.mds.queries?.ld?.mOverlay?.m\n\tif (!m) return\n\ttk.skewer.hlssmid = new Set([m.ssm_id])\n\tmayHighlightDiskBySsmid(tk)\n}\n", "import { mclass, dtsnvindel, dtsv, dtfusionrna, dtitd, dtdel, dtnloss, dtcloss } from '#shared/common.js'\nimport { skewer_make, settle_glyph, fold_glyph, unfold_glyph, mayHighlightDiskBySsmid } from './skewer.render'\nimport { make_datagroup } from './datagroup'\nimport { renderNumericMode } from './numericmode'\n\n/*\nat some point, data.skewer will return aggregated data,\ne.g. one object for ten or hundreds of variants of same class, \nssm_id list may be given when there are not a lot of variants in a group,\notherwise, ssm_id list will not be given when the number is big, in hundreds\navailability of ssm_id decides if variant2samples query is allowed\n\n\n\n********************** EXPORTED\nmay_render_skewer\n\n*********** function cascade\nmake_skewer_data\n\tskewer_make\n\ttkdata_update_x\n\tsettle_glyph\n\n*************************\n* skewer data structure *\n*************************\ntk.skewer{}\n\t.pointup\n\t.rawmlst[] -- comes from server-returned data.skewer[]\n\t.g\n\t.data[]\n\t\t// each element is a skewer\n\t\t.chr, pos\n\t\t.x\n\t\t.occurrence // different types of values\n\t\t // if occurrence is in rawmlst, this is the sum of occurrences from .mlst[]\n\t\t\t\t\t// otherwise it's the length of .mlst[]\n\t\t.mlst[]\n\t\t.groups[]\n\t\t\t// each group is a disk\n\t\t\t.dt\n\t\t\t.occurrence // same as above\n\t\t\t.mlst[]\n\t.selection\n\t.stem1, stem2, stem3 // #pixel\n\t.maxheight\n\n\n*******************************\n* numeric mode data structure *\n*******************************\nnm{}\n\t// the view mode object from skewer.viewModes[] that is in use\n\t.data[]\n\t\t.chr, .pos\n\t\t.g\n\t\t.mlst[]\n\t\t\t// can be multiple variants at the same position with different alleles\n\t\t.width\n\t\t.x\n\t\t.x0\n\t\t.xoffset\n*/\n\n/*\ncutoff value of # pixel per bp\ncompared to exonsf\nwhen exonsf>:\n\tbasepairs are visible enough, and group mutation grps by basepair position\nelse exon<:\n\tbasepairs are too tiny and will group mutations by AA position\n*/\n\n// if the number of mname categories from a skewer exceeds this count, these mnames will be compacted into one group/disc\n// otherwise, each mname will be an individual disc\nconst minMnameCount2compact = 10\n\nexport function may_render_skewer(data, tk, block) {\n\t// update skewer subtrack height to tk.subtk2height.skewer:int\n\n\tif (!tk.skewer) {\n\t\t// not equipped with skewer track\n\t\t// created in makeTk when skewer datatype is available\n\t\treturn\n\t}\n\n\t// numericmode axis label and any other skewer things rendered into gleft\n\t// record the max width\n\ttk.skewer.maxwidth = 0\n\n\tupdateViewModes(tk, data.skewer)\n\t// tk.skewer.viewModes[] updated\n\n\thlaachange2ssmid(tk, data.skewer) // tk.skewer.hlssmid may be set\n\n\tconst currentMode = tk.skewer.viewModes.find(n => n.inuse)\n\tif (!currentMode) throw 'no mode!!'\n\tif (data.skewer) {\n\t\t// register new mlst data\n\t\t// otherwise will not overwrite skewer.mlst\n\t\ttk.skewer.rawmlst = data.skewer\n\t\tdata.skewer.forEach(d => {\n\t\t\tif (!d.id) d.id = Math.random().toString()\n\t\t})\n\t} else {\n\t\ttk.skewer.rawmlst.forEach(d => {\n\t\t\tif (!d.id) d.id = Math.random().toString()\n\t\t})\n\t\t// server will not return skewer data when panning/zooming in protein mode\n\t\t// the data is already kept as tk.skewer.rawmlst\n\t}\n\n\tif (currentMode.type == 'numeric') {\n\t\ttk.subtk2height.skewer = renderNumericMode(currentMode, data, tk, block)\n\t\tmayHighlightDiskBySsmid(tk)\n\t\treturn\n\t}\n\n\t// possible to plug in new skewer.*.js scripts to support additional mode types\n\n\tif (currentMode.type != 'skewer') throw 'mode.type is not \"skewer\"'\n\n\tif (data && !data.skewer && block.usegm && block.gmmode != 'genomic' && block.pannedpx != undefined) {\n\t\t// when data.skewer is not given\n\t\t// in gmmode, browser panned, no re-requesting data\n\t\t// no need to re-group\n\t\t// set x\n\t\ttkdata_update_x(tk, block)\n\t\ttk.skewer.selection.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')')\n\t\tsettle_glyph(tk, block)\n\t} else {\n\t\t// when zooming protein mode, data.skewer is not given but still need to remake skewers\n\t\t// generate new skewer track data from skewer.mlst\n\t\ttk.skewer.g.selectAll('*').remove()\n\t\ttk.skewer.data = make_skewer_data(tk, block)\n\t\tskewer_make(tk, block)\n\t}\n\n\tif (!tk.skewer.data || tk.skewer.data.length == 0) {\n\t\ttk.subtk2height.skewer = 0\n\t\ttk.skewer.g.selectAll('*').remove() //remove previous message in case of panning in gmmode\n\t\treturn\n\t}\n\n\t/*\n\tvariants loaded for this track\n\t*/\n\n\tif (tk.skewer.hlssmid) {\n\t\t// highlight variants based on if m.ssm_id is in hlssmid (a set)\n\t\t// and fold all the others\n\t\tconst fold = []\n\t\tconst unfold = []\n\t\tfor (const d of tk.skewer.data) {\n\t\t\tlet has = false\n\t\t\tfor (const g of d.groups) {\n\t\t\t\tfor (const m of g.mlst) {\n\t\t\t\t\tif (tk.skewer.hlssmid.has(m.ssm_id)) {\n\t\t\t\t\t\thas = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (has) {\n\t\t\t\tunfold.push(d)\n\t\t\t} else {\n\t\t\t\tfold.push(d)\n\t\t\t}\n\t\t}\n\t\tfold_glyph(fold, tk)\n\t\tunfold_glyph(unfold, tk, block)\n\t\tmayHighlightDiskBySsmid(tk)\n\t} else {\n\t\t// automatically expand\n\t\tsettle_glyph(tk, block)\n\t}\n\n\ttk.subtk2height.skewer = tk.skewer.maxheight + tk.skewer.stem1 + tk.skewer.stem2 + tk.skewer.stem3\n}\n\nfunction hlaachange2ssmid(tk, mlst) {\n\tif (!tk.hlaachange || !mlst) return\n\t// value is comma-joined list of mnames, convert to ssm_id for keeping track of variants\n\t// using skewer data mlst[], either from server or client,\n\tconst set = new Set(tk.hlaachange.split(','))\n\tdelete tk.hlaachange\n\ttk.skewer.hlssmid = new Set()\n\tfor (const m of mlst) {\n\t\tif (set.has(m.mname)) tk.skewer.hlssmid.add(m.ssm_id)\n\t}\n}\n\nfunction tkdata_update_x(tk, block) {\n\t/*\n\tcall when panned in gmmode,\n\tno re-requesting data\n\tno re-rendering\n\tonly update skewer x position\n\t*/\n\n\tfor (const d of tk.skewer.data) {\n\t\tif (d.isbin) {\n\t\t\tlet sumx = 0\n\t\t\tfor (const m of d.mlst) {\n\t\t\t\tconst hits = block.seekcoord(m.chr, m.pos)\n\t\t\t\tif (m.usehitidx != undefined && hits[m.usehitidx]) {\n\t\t\t\t\tsumx += hits[m.usehitidx].x\n\t\t\t\t} else if (hits.length == 1) {\n\t\t\t\t\tsumx += hits[0].x\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('cannot map item')\n\t\t\t\t\tconsole.log(m)\n\t\t\t\t}\n\t\t\t}\n\t\t\td.x0 = sumx / d.mlst.length\n\t\t\td.x = d.x0 + (d.xoffset != undefined ? d.xoffset : 0)\n\t\t} else {\n\t\t\tconst hits = block.seekcoord(d.chr, d.pos)\n\t\t\tif (hits.length > 0) {\n\t\t\t\td.x0 = hits[0].x\n\t\t\t\td.x = d.x0 + (d.xoffset != undefined ? d.xoffset : 0)\n\t\t\t} else {\n\t\t\t\tconsole.log('cannot map group of item')\n\t\t\t\tconsole.log(d)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction make_skewer_data(tk, block) {\n\tconst datagroup = make_datagroup(tk, tk.skewer.rawmlst, block)\n\t// generate secondary groups (discs) in each datagroup\n\t// specific for skewer, not for numeric mode\n\tfor (const g of datagroup) {\n\t\tg.groups = mlst2disc(g.mlst, tk)\n\t}\n\tif (tk.skewer.data && block.pannedpx != undefined) {\n\t\t/* block is panned, tk.skewer.data is the previous set of skewers\n\t\texisting data points from before panning should assemble into the same set of skewers\n\t\tas resolution did not change\n\t\twill inherit the showmode\n\t\tused to only run this at genomic mode but not in protein mode\n\t\t(!block.usegm || block.gmmode == 'genomic')\n\t\t*/\n\t\tconst pastmode = {}\n\t\tfor (const g of tk.skewer.data) {\n\t\t\tpastmode[g.chr + '.' + g.pos] = {\n\t\t\t\tmode: g.showmode,\n\t\t\t\txoffset: g.xoffset,\n\t\t\t\tslabelrotate: g.slabelrotate // no effect\n\t\t\t}\n\t\t}\n\t\tfor (const g of datagroup) {\n\t\t\tconst k = g.chr + '.' + g.pos\n\t\t\tif (pastmode[k]) {\n\t\t\t\tg.showmode = pastmode[k].mode\n\t\t\t\tg.xoffset = pastmode[k].xoffset\n\t\t\t\tg.slabelrotate = pastmode[k].slabelrotate\n\t\t\t}\n\t\t}\n\t}\n\tfor (const d of datagroup) {\n\t\td.occurrence = d.groups.reduce((i, j) => i + j.occurrence, 0)\n\t}\n\treturn datagroup\n}\n\nfunction mlst2disc(mlst, tk) {\n\t/*\n\tmlst[] is the complete of data points to be shown in one skewer, here divide them to groups to make discs\n\n\tsnvindel and svfusion has 3 layers. class & mname combination will result in individual discs in skewer\n\t2nd layer is classes for snvindel, and left/right for svfusion, it will have only limited number of categories\n\t3rd layer may have too many categories by the presence of data points with distinct mname\n\tit will be compacted to reduce number of discs\n\t<m.dt> : Map\n\t <m.class> : Map\n\t <m.mname> : mlst[]\n\t\n\trest of dt are single-layer:\n\t<m.dt> : []\n\t*/\n\tconst k2g = new Map()\n\tfor (const m of mlst) {\n\t\tif (!Number.isInteger(m.dt)) continue\n\n\t\tif (!k2g.has(m.dt)) k2g.set(m.dt, new Map())\n\n\t\tswitch (m.dt) {\n\t\t\tcase dtsnvindel:\n\t\t\t\tif (!k2g.get(m.dt).has(m.class)) k2g.get(m.dt).set(m.class, new Map())\n\t\t\t\tconst n = m.mname || ''\n\t\t\t\tif (!k2g.get(m.dt).get(m.class).has(n)) {\n\t\t\t\t\tk2g.get(m.dt).get(m.class).set(n, [])\n\t\t\t\t}\n\t\t\t\tk2g.get(m.dt).get(m.class).get(n).push(m)\n\t\t\t\tbreak\n\t\t\tcase dtsv:\n\t\t\tcase dtfusionrna:\n\t\t\t\tif (!k2g.get(m.dt).has(m.class)) {\n\t\t\t\t\tk2g.get(m.dt).set(m.class, {\n\t\t\t\t\t\tuse5: new Map(),\n\t\t\t\t\t\tuse3: new Map()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (m.useNterm) {\n\t\t\t\t\tif (!k2g.get(m.dt).get(m.class).use5.has(m.mname)) {\n\t\t\t\t\t\tk2g.get(m.dt).get(m.class).use5.set(m.mname, [])\n\t\t\t\t\t}\n\t\t\t\t\tk2g.get(m.dt).get(m.class).use5.get(m.mname).push(m)\n\t\t\t\t} else {\n\t\t\t\t\tif (!k2g.get(m.dt).get(m.class).use3.has(m.mname)) {\n\t\t\t\t\t\tk2g.get(m.dt).get(m.class).use3.set(m.mname, [])\n\t\t\t\t\t}\n\t\t\t\t\tk2g.get(m.dt).get(m.class).use3.get(m.mname).push(m)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase dtitd:\n\t\t\tcase dtdel:\n\t\t\tcase dtnloss:\n\t\t\tcase dtcloss:\n\t\t\t\tif (!k2g.has(m.dt)) {\n\t\t\t\t\tk2g.set(m.dt, [])\n\t\t\t\t}\n\t\t\t\tk2g.get(m.dt).push(m)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tconsole.log('unknown datatype: ' + m.dt)\n\t\t\t\tconsole.log(m)\n\t\t\t\treturn\n\t\t}\n\t}\n\n\t// each group corresponds to one disc\n\tconst groups = []\n\n\tfor (const [dt, tmp] of k2g) {\n\t\tswitch (dt) {\n\t\t\tcase dtsnvindel:\n\t\t\t\tfor (const [thisClass, mname2lst] of tmp) {\n\t\t\t\t\tif (mname2lst.size > minMnameCount2compact) {\n\t\t\t\t\t\t// too many mname under this class, compact to one single disc\n\t\t\t\t\t\tconst mlst = []\n\t\t\t\t\t\tfor (const l2 of mname2lst.values()) mlst.push(...l2)\n\t\t\t\t\t\tgroups.push({\n\t\t\t\t\t\t\tdt,\n\t\t\t\t\t\t\tmlst,\n\t\t\t\t\t\t\tmnameCompact: mclass[thisClass].label\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const mlst of mname2lst.values()) {\n\t\t\t\t\t\t\tgroups.push({ dt, mlst })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase dtsv:\n\t\t\tcase dtfusionrna:\n\t\t\t\tfor (const classset of tmp.values()) {\n\t\t\t\t\tif (classset.use5.size > minMnameCount2compact) {\n\t\t\t\t\t\tconst mlst = []\n\t\t\t\t\t\tfor (const l2 of classset.use5.values()) mlst.push(...l2)\n\t\t\t\t\t\tgroups.push({ dt, mlst, useNterm: true, mnameCompact: dt == dtsv ? 'SV' : 'fusion' })\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const mlst of classset.use5.values()) {\n\t\t\t\t\t\t\tgroups.push({ dt, mlst, useNterm: true })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (classset.use3.size > minMnameCount2compact) {\n\t\t\t\t\t\tconst mlst = []\n\t\t\t\t\t\tfor (const l2 of classset.use3.values()) mlst.push(...l2)\n\t\t\t\t\t\tgroups.push({ dt, mlst, useNterm: false, mnameCompact: dt == dtsv ? 'SV' : 'fusion' })\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (const mlst of classset.use3.values()) {\n\t\t\t\t\t\t\tgroups.push({ dt, mlst, useNterm: false })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase dtitd:\n\t\t\tcase dtdel:\n\t\t\tcase dtnloss:\n\t\t\tcase dtcloss:\n\t\t\t\tgroups.push({\n\t\t\t\t\tdt: dt,\n\t\t\t\t\tmlst: tmp\n\t\t\t\t})\n\t\t}\n\t}\n\tfor (const g of groups) {\n\t\tlet rim1count = 0,\n\t\t\trim2count = 0\n\t\tfor (const m of g.mlst) {\n\t\t\t// m rim counts are computed on server\n\t\t\trim1count += m.rim1count || 0\n\t\t\trim2count += m.rim2count || 0\n\t\t}\n\t\tg.rim1count = rim1count\n\t\tg.rim2count = rim2count\n\t}\n\n\tif (mlst.some(m => Number.isFinite(m.occurrence))) {\n\t\t// data points has occurrence; g.occurrence will be the sum from mlst[]\n\t\tfor (const g of groups) g.occurrence = g.mlst.reduce((i, j) => i + j.occurrence, 0)\n\t} else {\n\t\t// no occurrence from mlst[]; g.occurrence is length of mlst\n\t\tfor (const g of groups) g.occurrence = g.mlst.length\n\t}\n\t// this ensures that data groups all get a valid .occurrence value for rendering\n\n\tgroups.sort((a, b) => {\n\t\treturn b.occurrence - a.occurrence\n\t})\n\treturn groups\n}\n\nfunction updateViewModes(tk, mlst) {\n\tdetectNumericMode(tk, mlst)\n\tdetectAlternativeSkewerModes(tk, mlst)\n\t// for numeric modes not in use, clear axisg\n\tfor (const n of tk.skewer.viewModes) {\n\t\tif (n.type == 'numeric' && !n.inuse && n.axisg) {\n\t\t\tn.axisg.remove()\n\t\t\tdelete n.axisg\n\t\t}\n\t}\n}\n\nfunction detectAlternativeSkewerModes(tk) {\n\t// TODO if possible to render as protein painter style\n\t// low #variants, low occurrences\n\t// may delete special skewer modes if condition no longer applies\n}\n\nfunction detectNumericMode(tk, mlst) {\n\t// detect if data has occurrence\n\t// mlst can be undefined when server returns no new data\n\tif (mlst && mlst.find(i => Number.isFinite(i.occurrence))) {\n\t\t// has occurrence, assume all data points have it thus numeric mode is possible\n\t\tif (!tk.skewer.viewModes.find(n => n.type == 'numeric' && n.byAttribute == 'occurrence')) {\n\t\t\t// occurrence mode obj is missing, add it\n\t\t\ttk.skewer.viewModes.push({\n\t\t\t\ttype: 'numeric',\n\t\t\t\tbyAttribute: 'occurrence',\n\t\t\t\tlabel: 'Occurrence',\n\t\t\t\tisinteger: true\n\t\t\t})\n\t\t}\n\t}\n\t// TODO more sources e.g. bcf numeric info fields\n}\n\nfunction makeSkewerModeUI(tk) {}\n", "import { fold_glyph, settle_glyph } from './skewer.render'\nimport { may_render_skewer } from './skewer'\nimport { itemtable } from './itemtable'\nimport { makelabel, positionLeftlabelg } from './leftlabel'\nimport { to_textfile, Tabs, make_radios, shapes, shapeSelector } from '#dom'\nimport { rangequery_rglst } from './tk'\nimport { samples2columnsRows, block2source, findMbyId } from './sampletable'\nimport { dt2label, mclass, dtsnvindel, dtsv, dtcnv, dtfusionrna } from '#shared/common.js'\n\n/*\nvariant label covers any data item rendered in a mds3 tk\nif has tk.skewer{}\n\tif type=skewer, cached at tk.skewer.data\n\tif type=numeric, cached at currentMode.data\nif has tk.cnv:\n\tget count from data.cnv[] as that's per segment\n\tbut not tk.cnv.cnvLst as that's aggregated by sample\n*/\nexport function makeVariantLabel(data, tk, block, laby) {\n\t// variant label covers skewer and cnv\n\tif (!tk.skewer && !tk.cnv) return\n\t// skewer and/or cnv subtrack available. will create this label\n\n\tif (!tk.leftlabels.doms.variants) {\n\t\ttk.leftlabels.doms.variants = makelabel(tk, block, laby)\n\t\ttk.leftlabels.doms.variants.attr('data-testid', 'sja_variants_label')\n\t\tif (data.variantAlerts?.length) tk.leftlabels.doms.variants.attr('fill', 'red')\n\t}\n\n\tconst [labeltext, totalcount, showcount] = getVariantLabelText(data, tk, block)\n\n\tif (totalcount == 0) {\n\t\ttk.leftlabels.doms.variants.text(labeltext).attr('class', '').style('opacity', 0.7).on('click', null)\n\t\treturn\n\t}\n\n\tif (showcount == 0) {\n\t\t// has data but none displayed\n\t\ttk.leftlabels.doms.variants.text(labeltext).attr('class', '').style('opacity', 0.5).on('click', null)\n\t\treturn\n\t}\n\n\ttk.leftlabels.doms.variants\n\t\t.style('opacity', 1) // restore style in case label was disabled\n\t\t.attr('class', 'sja_clbtext2')\n\t\t.text(labeltext)\n\t\t.on('click', event => {\n\t\t\ttk.menutip.clear().showunder(event.target)\n\t\t\tmenu_variants(data, tk, block)\n\t\t})\n}\n\nexport function getVariantLabelText(data, tk, block) {\n\tlet totalcount = 0,\n\t\tshowcount = 0\n\tconst dtset = new Set() // count number of unique dt, to detect if visible data has only one dt, if so show new label\n\n\tif (tk.custom_variants) {\n\t\t// if custom list is available, total is defined by its array length\n\t\ttotalcount = tk.custom_variants.length\n\t\tfor (const m of tk.custom_variants) dtset.add(m.dt)\n\t} else {\n\t\t// no custom data but server returned data, get total from it\n\t\tif (tk.skewer?.rawmlst) {\n\t\t\ttotalcount += tk.skewer.rawmlst.length\n\t\t\tfor (const m of tk.skewer.rawmlst) dtset.add(m.dt)\n\t\t}\n\t\tif (data.cnv) {\n\t\t\ttotalcount += data.cnv.cnvs.length\n\t\t\tfor (const m of data.cnv.cnvs) dtset.add(m.dt)\n\t\t} else if (data.cnvDensity) {\n\t\t\ttotalcount += data.cnvDensity.segmentCount\n\t\t\tdtset.add(dtcnv)\n\t\t}\n\t}\n\n\tif (totalcount == 0) return ['No data', 0, 0]\n\n\t// there is at least 1 variant shown. start to count those that are shown which could be less than totalcount\n\n\tif (tk.skewer) {\n\t\tconst currentMode = tk.skewer.viewModes.find(i => i.inuse)\n\t\t/*\n\t\tout of total, only a subset may be plotted\n\t\tto count how many are plotted, check with mode type\n\t\tif type=skewer, plotted data are at tk.skewer.data[]\n\t\telse if type=numeric, plotted data are at tk.skewer.numericModes[?].data\n\t\t*/\n\t\tif (currentMode.type == 'skewer') {\n\t\t\tshowcount = tk.skewer.data.filter(i => i.x >= 0 && i.x <= block.width).reduce((i, j) => i + j.mlst.length, 0)\n\t\t} else if (currentMode.type == 'numeric') {\n\t\t\tshowcount = currentMode.data.filter(i => i.x >= 0 && i.x <= block.width).reduce((i, j) => i + j.mlst.length, 0)\n\t\t} else {\n\t\t\tthrow 'unknown mode type'\n\t\t}\n\t}\n\n\tif (data.cnv) {\n\t\t// always count cnv when present, so as not to trigger \"xx of yy\" at variant label\n\t\tshowcount += data.cnv.cnvs.length\n\t} else if (data.cnvDensity) {\n\t\tshowcount += data.cnvDensity.segmentCount\n\t}\n\n\t// what to call the items: if only a single dt shown, call by its name; if items are of multiple dts, use generic name \"variant\"\n\tlet vn = 'variant'\n\tif (dtset.size == 1) {\n\t\tconst dt = [...dtset][0]\n\t\tif (dt == dtsnvindel) {\n\t\t\t// do not change. avoid using snv/indel, looks odd\n\t\t} else {\n\t\t\tvn = dt2label[dt]\n\t\t}\n\t}\n\n\tif (showcount == 0) {\n\t\treturn [`0 out of ${totalcount} ${vn}${totalcount > 1 ? 's' : ''}`, totalcount, showcount]\n\t}\n\n\treturn [\n\t\tshowcount < totalcount\n\t\t\t? showcount + ' of ' + totalcount + ' ' + vn + 's'\n\t\t\t: showcount + ' ' + vn + (showcount > 1 ? 's' : ''),\n\t\ttotalcount,\n\t\tshowcount\n\t]\n}\n\nfunction menu_variants(data, tk, block) {\n\tif (data.variantAlerts?.length) {\n\t\tfor (const m of data.variantAlerts) {\n\t\t\ttk.menutip.d.append('div').style('margin', '10px').style('font-size', '.8em').style('color', 'red').text(m)\n\t\t}\n\t}\n\n\t// in case only showing cnv density but no skewer, disable all options from this menu as they do not apply to cnv density\n\tif ((!tk.skewer?.rawmlst || tk.skewer.rawmlst?.length == 0) && tk.cnv?.cnvInDensity) {\n\t\ttk.menutip.d\n\t\t\t.append('div')\n\t\t\t.style('margin', '10px')\n\t\t\t.text('Viewing CNV segment density, no information on individual segments.')\n\t\tif (tk.cnv.cnvMsg) {\n\t\t\ttk.menutip.d.append('div').style('margin', '10px').text(tk.cnv.cnvMsg)\n\t\t}\n\t\treturn\n\t}\n\tconst listDiv = tk.menutip.d\n\t\t.append('div')\n\t\t.text('List')\n\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t.attr('data-testid', 'sjpp_mds3tk_variantleftlabel_list')\n\t\t.attr('tabindex', 0)\n\t\t.on('click', () => {\n\t\t\tlistVariantData(tk, block)\n\t\t})\n\n\tlistDiv.node().focus()\n\tsetTimeout(() => listDiv.node().blur(), 2000)\n\n\tif (tk.skewer && !tk.hardcodeCnvOnly) {\n\t\t// these are skewer-specific options, if hardcoded cnv-only, do not show;\n\t\tif (tk.skewer.hlssmid) {\n\t\t\ttk.menutip.d\n\t\t\t\t.append('div')\n\t\t\t\t.text('Cancel highlight')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tdelete tk.skewer.hlssmid\n\t\t\t\t\ttk.skewer.hlBoxG.selectAll('*').remove()\n\t\t\t\t\tconst currentMode = tk.skewer.viewModes.find(i => i.inuse)\n\t\t\t\t\tif (currentMode.type == 'skewer') {\n\t\t\t\t\t\t// have to rerender under skewer mode, to rearrange skewers\n\t\t\t\t\t\tsettle_glyph(tk, block)\n\t\t\t\t\t} else if (currentMode.type == 'numeric') {\n\t\t\t\t\t\t// no need to rerender for numeric mode, the disks are fixed\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'unknown mode type'\n\t\t\t\t\t}\n\t\t\t\t\ttk.menutip.hide()\n\t\t\t\t})\n\t\t}\n\n\t\tconst vm = tk.skewer.viewModes.find(n => n.inuse) // view mode that's in use. following menu options depends on it\n\t\tif (vm.type == 'skewer') {\n\t\t\t// show options related to skewer mode\n\n\t\t\t// showmode=1/0 means expanded/folded skewer, defined in skewer.render.js\n\t\t\tconst expandCount = tk.skewer.data.reduce((i, j) => i + j.showmode, 0)\n\t\t\tif (expandCount > 0) {\n\t\t\t\t// has expanded skewer\n\t\t\t\ttk.menutip.d\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.text('Collapse')\n\t\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t\t.attr('data-testid', 'sja_collapse_menuoption') // mds3tk_variantleftlabel_collapse\n\t\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\tfold_glyph(tk.skewer.data, tk)\n\t\t\t\t\t\ttk.menutip.hide()\n\t\t\t\t\t})\n\t\t\t} else if (expandCount == 0) {\n\t\t\t\ttk.menutip.d\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.text('Expand')\n\t\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t\t.attr('data-testid', 'sja_expand_menuoption') // mds3tk_variantleftlabel_expand\n\t\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\tsettle_glyph(tk, block)\n\t\t\t\t\t\ttk.menutip.hide()\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\ttk.menutip.d\n\t\t\t\t.append('div')\n\t\t\t\t.text(tk.skewer.pointup ? 'Point down' : 'Point up')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\ttk.skewer.pointup = !tk.skewer.pointup\n\t\t\t\t\ttk.load()\n\t\t\t\t\ttk.menutip.hide()\n\t\t\t\t})\n\n\t\t\t// change variant shape option\n\t\t\tif (tk.filterObj) {\n\t\t\t\tlet called = false\n\t\t\t\tconst div = tk.menutip.d\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.text('Change variant shape')\n\t\t\t\t\t.style('vertical-align', 'middle')\n\t\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\tif (called == false) {\n\t\t\t\t\t\t\tcalled = true\n\t\t\t\t\t\t\trenderShapePicker({\n\t\t\t\t\t\t\t\tholder: div.append('div').style('margin-top', '10px'),\n\t\t\t\t\t\t\t\tcallback: shape => {\n\t\t\t\t\t\t\t\t\tObject.keys(tk.shapes).forEach(key => {\n\t\t\t\t\t\t\t\t\t\ttk.shapes[key] = shape\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\ttk.load()\n\t\t\t\t\t\t\t\t\ttk.menutip.hide()\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttk\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\t\t} else if (vm.type == 'numeric') {\n\t\t\t// only show this opt in numeric mode; delete when label hiding works for skewer mode\n\n\t\t\ttk.menutip.d\n\t\t\t\t.append('div')\n\t\t\t\t.text(tk.skewer.hideDotLabels ? 'Show all variant labels' : 'Hide all variant labels')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\ttk.skewer.hideDotLabels = !tk.skewer.hideDotLabels\n\t\t\t\t\ttk.load()\n\t\t\t\t\ttk.menutip.hide()\n\t\t\t\t})\n\t\t}\n\t}\n\n\tif (!tk.custom_variants) {\n\t\t// FIXME enable download for custom data\n\t\ttk.menutip.d\n\t\t\t.append('div')\n\t\t\t.text('Download')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.attr('tabindex', 0)\n\t\t\t.attr('data-testid', 'sjpp_mds3tk_variantdownload_menuoption')\n\t\t\t.on('click', () => {\n\t\t\t\tdownloadVariants(tk, block)\n\t\t\t\ttk.menutip.hide()\n\t\t\t})\n\t}\n\n\ttk.menutip.d.on('keydown', function (event) {\n\t\tif (event.key != 'Enter' || !event.target.className.includes('sja_menuoption')) return\n\t\tevent.target.dispatchEvent(new KeyboardEvent('click'))\n\t})\n\n\tmayAddSkewerModeOption(tk, block)\n}\n\nasync function listVariantData(tk, block) {\n\t/* data: []\n\teach element {}:\n\t.x\n\t.mlst[]\n\t\teach m{}:\n\t\t\t.mname\n\t\t\t.class\n\t*/\n\n\ttk.menutip.clear()\n\n\t// TODO make reusable and supply contents to menu_variants() List\n\t// group variants by dt; for each group, render with itemtable()\n\tconst dt2mlst = new Map()\n\n\tif (tk.skewer) {\n\t\tconst currentMode = tk.skewer.viewModes.find(i => i.inuse)\n\t\tlet data\n\t\tif (currentMode.type == 'skewer') {\n\t\t\tdata = tk.skewer.data.filter(i => i.x >= 0 && i.x <= block.width)\n\t\t} else if (currentMode.type == 'numeric') {\n\t\t\tdata = currentMode.data\n\t\t} else {\n\t\t\tthrow 'unknown mode type'\n\t\t}\n\t\tfor (const g of data) {\n\t\t\tfor (const m of g.mlst) {\n\t\t\t\tif (!dt2mlst.has(m.dt)) dt2mlst.set(m.dt, [])\n\t\t\t\tdt2mlst.get(m.dt).push(m)\n\t\t\t}\n\t\t}\n\t}\n\n\tif (tk.cnv?.cnvLst?.length) {\n\t\tdt2mlst.set(dtcnv, tk.cnv.cnvLst)\n\t}\n\n\tif (dt2mlst.size == 1) {\n\t\t// only one dt\n\t\tconst div = tk.menutip.d.append('div').style('margin', '10px')\n\t\tawait itemtable({\n\t\t\tdiv,\n\t\t\tmlst: dt2mlst.get([...dt2mlst.keys()][0]),\n\t\t\ttk,\n\t\t\tblock,\n\t\t\tdoNotListSample4multim: true\n\t\t})\n\t\treturn\n\t}\n\n\t// multiple dt\n\tconst tabs = []\n\tfor (const [dt, mlst] of dt2mlst) {\n\t\ttabs.push({ label: mlst.length + ' ' + dt2label[dt] })\n\t}\n\tnew Tabs({\n\t\tholder: tk.menutip.d\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_pp_vlb_dttabdiv') // for testing\n\t\t\t.style('margin', '10px'),\n\t\ttabs\n\t}).main()\n\tlet i = 0\n\tfor (const [dt, mlst] of dt2mlst) {\n\t\titemtable({\n\t\t\tdiv: tabs[i++].contentHolder.append('div').style('margin-left', '10px'),\n\t\t\tmlst,\n\t\t\ttk,\n\t\t\tblock,\n\t\t\tdoNotListSample4multim: true\n\t\t})\n\t}\n}\n\nexport function renderShapePicker(arg) {\n\tconst lollipopShapes = {\n\t\tfilledCircle: shapes.filledCircle,\n\t\temptyCircle: shapes.emptyCircle,\n\t\tfilledVerticalRectangle: shapes.filledVerticalRectangle,\n\t\temptyVerticalRectangle: shapes.emptyVerticalRectangle,\n\t\tfilledTriangle: shapes.filledTriangle,\n\t\temptyTriangle: shapes.emptyTriangle,\n\t\tfilledSquare: shapes.filledSquare,\n\t\temptySquare: shapes.emptySquare\n\t}\n\n\tconst { holder, callback, tk } = arg\n\tconst shapePaths = Object.values(lollipopShapes).map(shape => shape.path)\n\n\tconst selectorCallback = val => {\n\t\tconst shape = Object.keys(lollipopShapes)[val]\n\t\tcallback(shape, tk)\n\t}\n\n\tconst opts = { backgroundColor: '' }\n\n\tshapeSelector(holder, selectorCallback, shapePaths, opts)\n}\n\nfunction mayAddSkewerModeOption(tk, block) {\n\tif (!tk.skewer) return\n\tif (tk.skewer.viewModes.length <= 1) {\n\t\t// only one possible mode, cannot toggle mode, do not add option\n\t\treturn\n\t}\n\t// there are more than 1 mode, print name of current mode\n\tconst options = []\n\tfor (const [idx, v] of tk.skewer.viewModes.entries()) {\n\t\tconst o = {\n\t\t\tlabel: getViewmodeName(v),\n\t\t\tvalue: idx\n\t\t}\n\t\tif (v.inuse) o.checked = true\n\t\toptions.push(o)\n\t}\n\tmake_radios({\n\t\tholder: tk.menutip.d\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_pp_vlb_viewmoderadiodiv') // for testing\n\t\t\t.style('margin', '10px'),\n\t\tstyles: {\n\t\t\tdisplay: 'block'\n\t\t},\n\t\toptions,\n\t\tcallback: async idx => {\n\t\t\tfor (const i of tk.skewer.viewModes) i.inuse = false\n\t\t\ttk.skewer.viewModes[idx].inuse = true\n\t\t\tmay_render_skewer({ skewer: tk.skewer.rawmlst }, tk, block)\n\t\t\tpositionLeftlabelg(tk, block)\n\t\t\ttk._finish()\n\t\t}\n\t})\n}\n\nfunction getViewmodeName(n) {\n\tif (!n) return 'MISSING!!'\n\tif (n.type == 'skewer') return 'As lollipops'\n\tif (n.type == 'numeric') return n.label + ' as Y axis'\n\treturn 'unknown mode'\n}\n\nasync function downloadVariants(tk, block) {\n\tif (!tk.mds.variant2samples) {\n\t\tconsole.log('TODO: variant-only')\n\t\treturn\n\t}\n\t// call variant2samples.get() to get sample-level data\n\tconst arg = {\n\t\tquerytype: 'samples'\n\t}\n\n\trangequery_rglst(tk, block, arg)\n\n\t// FIXME for custom_variants, somehow arg requries .mlst=[]\n\n\tconst samples = (await tk.mds.variant2samples.get(arg)).samples\n\t/*\n\tarray of sample objects\n\teach sample will have 1 or more variants\n\t*/\n\n\tconst [columns, rows] = await samples2columnsRows(samples, tk)\n\t/*\n\tcolumns[] is array of text file columns\n\trows[] is same length as samples[]\n\n\tto output text file:\n\n\tcolumn with {isSsm=true} is skipped, and is replaced with adhoc columns \n\t*/\n\n\t// header line of text file\n\tconst headerline = []\n\tfor (const c of columns) {\n\t\tif (c.isSsm) {\n\t\t\t// skip the field as the value is html; replace with sub fields\n\t\t\theaderline.push('AAchange')\n\t\t\theaderline.push('Consequence')\n\t\t\theaderline.push('Mutation')\n\t\t\tcontinue\n\t\t}\n\t\tif (c.isMaf) {\n\t\t\t// skip the field as the value is svg; replace with sub fields\n\t\t\theaderline.push('Alternative allele depth in tumor')\n\t\t\theaderline.push('Total depth in tumor')\n\t\t\tcontinue\n\t\t}\n\t\theaderline.push(c.label)\n\t}\n\n\t// one line for each mutation per sample, with the same set of columns as headerline\n\tconst lines = []\n\tfor (const [sidx, sample] of samples.entries()) {\n\t\t// sidx is used on rows[]\n\n\t\tlet ssm_id_lst // a sample can have >= 1 mutations\n\t\tif (Array.isArray(sample.ssm_id_lst)) {\n\t\t\tssm_id_lst = sample.ssm_id_lst\n\t\t} else if (sample.ssm_id) {\n\t\t\tssm_id_lst = [sample.ssm_id]\n\t\t} else {\n\t\t\tconsole.log('sample obj lacks ssm_id and ssm_id_lst')\n\t\t\tcontinue\n\t\t}\n\n\t\tfor (const ssmid of ssm_id_lst) {\n\t\t\tconst m = findMbyId(ssmid, tk)\n\t\t\tif (!m) {\n\t\t\t\tconsole.log('ssm not found by id: ' + ssmid)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// create one line for this m{} from this sample{}\n\n\t\t\tconst line = []\n\n\t\t\tfor (const [cidx, c] of columns.entries()) {\n\t\t\t\tif (c.isSsm) {\n\t\t\t\t\t// skip the field as the value is html; replace with breakdown fields\n\t\t\t\t\tif (m.dt == dtsnvindel) {\n\t\t\t\t\t\tline.push(m.mname)\n\t\t\t\t\t\tline.push(mclass[m.class].label)\n\t\t\t\t\t\tline.push(m.chr + ':' + (m.pos + 1) + ' ' + m.ref + '>' + m.alt)\n\t\t\t\t\t} else if (m.dt == dtsv || m.dt == dtfusionrna) {\n\t\t\t\t\t\tline.push('')\n\t\t\t\t\t\tline.push(mclass[m.class].label)\n\t\t\t\t\t\tline.push(\n\t\t\t\t\t\t\tm.pairlst[0].a.chr + ':' + m.pairlst[0].a.pos + '>' + m.pairlst[0].b.chr + ':' + m.pairlst[0].b.pos\n\t\t\t\t\t\t)\n\t\t\t\t\t} else if (m.dt == dtcnv) {\n\t\t\t\t\t\tline.push(Number.isFinite(m.value) ? m.value : '')\n\t\t\t\t\t\tline.push(mclass[m.class].label)\n\t\t\t\t\t\tline.push(m.chr + ':' + (m.start + 1) + '-' + (m.stop + 1))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'unknown m.dt'\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// the data cell returned by table builder\n\t\t\t\tconst cell = rows[sidx][cidx]\n\n\t\t\t\tif (cell.bySsmid) {\n\t\t\t\t\t// value is per ssm\n\t\t\t\t\tif (ssmid in cell.bySsmid) {\n\t\t\t\t\t\tconst v = cell.bySsmid[ssmid]\n\t\t\t\t\t\tif (c.isMaf) {\n\t\t\t\t\t\t\tline.push(v.altTumor)\n\t\t\t\t\t\t\tline.push(v.totalTumor)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tline.push(v)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// no value for this ssm\n\t\t\t\t\t\tline.push('')\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (c.isMaf) {\n\t\t\t\t\tline.push(cell.altTumor)\n\t\t\t\t\tline.push(cell.totalTumor)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tline.push(cell.value)\n\t\t\t}\n\n\t\t\tlines.push(line.join('\\t'))\n\t\t}\n\t}\n\tto_textfile(\n\t\tblock2source(block) + ' ' + new Date().toLocaleDateString() + '.txt',\n\t\theaderline.join('\\t') + '\\n' + lines.join('\\n')\n\t)\n}\n", "import { legend_newrow } from '#src/block.legend'\nimport { Menu, ColorScale, icons, shapes, renderCnvConfig } from '#dom'\nimport {\n\tmds3tkMclass,\n\tmclass,\n\tdt2label,\n\tdtcnv,\n\tdtloh,\n\tdtitd,\n\tdtsv,\n\tdtfusionrna,\n\tmclassitd,\n\tbplen\n} from '#shared/common.js'\nimport { interpolateRgb } from 'd3-interpolate'\nimport { showLDlegend } from '../plots/regression.results'\nimport { rgb } from 'd3-color'\nimport { renderShapePicker } from './leftlabel.variant'\n\n/*\t\n********************** EXPORTED\ninitLegend\nupdateLegend\n********************** INTERNAL\ncreate_mclass\nupdate_mclass\nmay_create_variantShapeName\nmay_update_variantShapeName\nmay_create_infoFields\nmay_update_infoFields\nmay_create_formatFilter\nmay_update_formatFilter\nmay_create_skewerRim\nmay_update_skewerRim\nmay_create_ld\nmay_update_ld\nmay_create_cnv\nmay_update_cnv\n\n********************** tk.legend{} structure\n.tip\n.table\n\t<table>, in which creates <tr> of two <td> to show legend sections\n.mclass{}\n\t.hiddenvalues Set()\n\t.holder DOM\n\t.row DOM\n.variantShapeName{}\n\t.row\n*/\n\nconst unknown_infoCategory_color = 'black'\n\nexport const unannotatedKey = 'Unannotated'\n\nexport function initLegend(tk, block) {\n\t// run only once, called by makeTk\n\tif (!block.legend) return // block has no legend. could be due to hidegenelegend flag\n\tif (!tk.legend) tk.legend = {}\n\ttk.legend.tip = new Menu({ padding: '0px' })\n\n\tconst [tr, td, td0] = legend_newrow(block, tk.name)\n\ttk.legend.headTd = td0 // for updating tk name in legend when filterObj updates\n\n\ttk.tr_legend = tr // to be compatible with block.tk_remove()\n\n\tconst table = td.append('table').style('border-spacing', '5px').style('border-collapse', 'separate')\n\n\ttk.legend.table = table\n\n\tcreate_mclass(tk, block)\n\tmay_create_variantShapeName(tk)\n\tmay_create_infoFields(tk)\n\tmay_create_formatFilter(tk)\n\tmay_create_skewerRim(tk)\n\tmay_create_ld(tk)\n\tmay_create_cnv(tk)\n}\n\n/*\nlist all mutation classes\nattribute may have already been created with customization\nlegend.mclass{}\n\t.hiddenvalues\n\t.row\n\t.holder\n*/\nfunction create_mclass(tk, block) {\n\tif (!tk.legend.mclass) tk.legend.mclass = {}\n\tif (!tk.legend.mclass.hiddenvalues) tk.legend.mclass.hiddenvalues = new Set()\n\n\ttk.legend.mclass.row = tk.legend.table.append('tr')\n\tif (tk.hardcodeCnvOnly) {\n\t\t// in cnv-only mode, keep mutation legend invisible and still create tk.legend.mclass{} to avoid breaking logic\n\t\ttk.legend.mclass.row.style('display', 'none')\n\t}\n\n\ttk.legend.mclass.row\n\t\t.append('td')\n\t\t.style('text-align', 'right')\n\t\t.style('opacity', 0.7)\n\t\t.text(block.mclassOverride ? block.mclassOverride.className || 'Mutation' : 'Mutation')\n\n\ttk.legend.mclass.holder = tk.legend.mclass.row.append('td')\n}\n\nfunction may_create_variantShapeName(tk) {\n\tif (!tk.legend.customShapeLabels || !tk.custom_variants) return\n\tif (!tk.legend.variantShapeName) tk.legend.variantShapeName = []\n\n\tfor (const data of tk.custom_variants) {\n\t\tif (!data.shape) data.shape = 'filledCircle' //Quick fix since legend renders simultaneously with skewers\n\t\tconst shapeObj = tk.legend.variantShapeName.find(v => v.key == data.shape)\n\t\tif (!shapeObj) {\n\t\t\ttk.legend.variantShapeName.push({\n\t\t\t\tkey: data.shape,\n\t\t\t\torigShape: data.shape,\n\t\t\t\tnum: 1\n\t\t\t})\n\t\t} else {\n\t\t\tshapeObj.num = ++shapeObj.num\n\t\t}\n\t}\n\n\t// custom_variants[] initial items may have limited set of shapes; later the items maybe dynamically reassigned with additional shape not found in variantShapeName[] that will break code; since all shapes should be declared in customShapeLabels{}, populate them into variantShapeName[] to avoid this issue\n\tif (tk.legend.customShapeLabels) {\n\t\tfor (const shape in tk.legend.customShapeLabels) {\n\t\t\tif (!tk.legend.variantShapeName.find(i => i.key == shape)) {\n\t\t\t\ttk.legend.variantShapeName.push({\n\t\t\t\t\tkey: shape,\n\t\t\t\t\torigShape: shape,\n\t\t\t\t\tnum: 0\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\ttk.legend.variantShapeName.sort((a, b) => b.num - a.num)\n\n\tconst width = 12\n\tconst height = 12\n\n\tconst shapesWrapper = tk.legend.table.append('tr').append('td').attr('colspan', 2)\n\n\tfor (const shapeObj of Object.values(tk.legend.variantShapeName)) {\n\t\tconst getArgs = () => {\n\t\t\treturn shapeObj.key.includes('Circle')\n\t\t\t\t? { radius: width / 2 - 0.5 }\n\t\t\t\t: shapeObj.key.includes('Rectangle')\n\t\t\t\t? { width: width / 2 + 2.5, height: height - 0.5 }\n\t\t\t\t: { width: width - 0.5, height: height - 0.5 }\n\t\t}\n\n\t\tshapeObj.wrapper = shapesWrapper.append('div')\n\n\t\t// .on('click', event => {\n\t\t// \ttk.legend.tip.clear().showunder(event.target)\n\t\t// \trenderShapePicker({\n\t\t// \t\tholder: tk.legend.tip.d.append('div'),\n\t\t// \t\tcallback: val => {\n\t\t// \t\t\tfor (const d of tk.skewer.rawmlst) {\n\t\t// \t\t\t\tif (shapeObj.ids.some(i => i == d.id)) {\n\t\t// \t\t\t\t\td.shape = val\n\t\t// \t\t\t\t}\n\t\t// \t\t\t}\n\t\t// \t\t\tshapeObj.key = val\n\t\t// \t\t\tshapeObj.shapeG\n\t\t// \t\t\t\t.attr('d', shapes[val].calculatePath(getArgs(shapeObj)))\n\t\t// \t\t\t\t.attr('fill', shapes[val].isFilled ? 'grey' : 'white')\n\t\t// \t\t\t\t.attr('stroke', shapes[val].isFilled ? 'none' : 'grey')\n\t\t// \t\t\treload(tk)\n\t\t// \t\t},\n\t\t// \t\ttk: tk\n\t\t// \t})\n\t\t// })\n\n\t\tconst svg = shapeObj.wrapper.append('span').append('svg').attr('width', width).attr('height', height)\n\n\t\tshapeObj.shapeG = svg\n\t\t\t.append('g')\n\t\t\t.attr('transform', `translate(${width / 2}, ${height / 2})`)\n\t\t\t.append('path')\n\t\t\t.attr('d', shapes[shapeObj.key].calculatePath(getArgs(shapeObj)))\n\t\t\t.attr('fill', shapes[shapeObj.key].isFilled ? 'grey' : 'white')\n\t\t\t.attr('stroke', shapes[shapeObj.key].isFilled ? 'none' : 'grey')\n\n\t\tshapeObj.wrapper.append('span').html(`&nbsp;n=`)\n\t\tshapeObj.numDiv = shapeObj.wrapper.append('span').text(shapeObj.num)\n\t\tshapeObj.wrapper.append('span').text(`, ${tk.legend.customShapeLabels[shapeObj.key]}`)\n\t}\n}\n\nfunction may_create_infoFields(tk) {\n\tif (!tk.mds.bcf?.info) return // not using bcf with info fields\n\t// collect info field keys eligible for displaying in legend\n\tconst infoFields4legend = []\n\t// find eligible info field keys to show in legend and create global object with infofield categories as field_category\n\tfor (const key in tk.mds.bcf.info) {\n\t\tconst field = tk.mds.bcf.info[key]\n\t\tif (field.categories) {\n\t\t\tinfoFields4legend.push(key)\n\t\t}\n\t}\n\tif (!infoFields4legend.length) return // no filterable fields\n\n\t// has info fields to show in legend\n\n\tif (!tk.legend.bcfInfo) tk.legend.bcfInfo = {} // key: info key\n\tfor (const key of infoFields4legend) {\n\t\tconst row = tk.legend.table.append('tr') // html <tr> created for this info field in the legend table\n\t\t// this row will have two columns, just like mclass\n\n\t\t// column 1 <td>: info field name\n\t\trow\n\t\t\t.append('td')\n\t\t\t.style('text-align', 'right')\n\t\t\t.style('opacity', 0.7)\n\t\t\t.text(tk.mds.bcf.info[key].name || key)\n\n\t\ttk.legend.bcfInfo[key] = {\n\t\t\thiddenvalues: new Set(),\n\t\t\trow,\n\t\t\t// column 2 <td>: content holder\n\t\t\tholder: row.append('td')\n\t\t}\n\t}\n}\n\nfunction may_create_formatFilter(tk) {\n\tif (!tk.mds.bcf?.format) return // not using bcf with format fields\n\t// collect format fields used for filtering\n\tconst formatFields4legend = []\n\tfor (const k in tk.mds.bcf.format) {\n\t\tif (tk.mds.bcf.format[k].isFilter) formatFields4legend.push(k)\n\t}\n\tif (!formatFields4legend.length) return // nothing filterable\n\n\tif (!tk.legend.formatFilter) tk.legend.formatFilter = {} // key: format key\n\tfor (const key of formatFields4legend) {\n\t\tconst row = tk.legend.table.append('tr') // html <tr> created for this info field in the legend table\n\t\t// this row will have two columns, just like mclass\n\n\t\t// column 1 <td>: format field name\n\t\trow.append('td').style('text-align', 'right').style('opacity', 0.7).text(tk.mds.bcf.format[key].Description)\n\n\t\ttk.legend.formatFilter[key] = {\n\t\t\thiddenvalues: new Set(),\n\t\t\trow,\n\t\t\t// column 2 <td>: content holder\n\t\t\tholder: row.append('td')\n\t\t}\n\t}\n}\n\nfunction may_update_formatFilter(data, tk) {\n\tif (!tk.legend.formatFilter) return\n\tif (!data.skewer) {\n\t\tconsole.log('data.skewer[] is not present and cannot show INFO legend')\n\t\treturn\n\t}\n\n\tfor (const formatKey in tk.legend.formatFilter) {\n\t\t// key of a FORMAT field and will create a legend section\n\n\t\t// clear holder\n\t\ttk.legend.formatFilter[formatKey].holder.selectAll('*').remove()\n\n\t\t// data for the INFO field is categorical, in the legend show unique list of categories and variant count\n\t\t// TODO later use \"termType=categorical/integer/float\"\n\n\t\tconst category2variantCount = new Map() // key: category of this INFO field, v: number of variants\n\t\tlet unannotatedCount = 0\n\t\tfor (const m of data.skewer) {\n\t\t\tif (!m.formatK2count?.[formatKey]) continue // no data\n\t\t\tfor (const category in m.formatK2count[formatKey].v2c) {\n\t\t\t\tcategory2variantCount.set(\n\t\t\t\t\tcategory,\n\t\t\t\t\tm.formatK2count[formatKey].v2c[category] + (category2variantCount.get(category) || 0)\n\t\t\t\t)\n\t\t\t}\n\t\t\tunannotatedCount += m.formatK2count[formatKey].unannotatedCount || 0\n\t\t}\n\n\t\t// sort tally in descending order, each element is a two-ele array [category, variantCount]\n\t\tconst show_lst = [...category2variantCount]\n\t\tshow_lst.sort((i, j) => j[1] - i[1])\n\t\tif (unannotatedCount) {\n\t\t\t// show unannotated at the end\n\t\t\tshow_lst.push([unannotatedKey, unannotatedCount])\n\t\t}\n\n\t\tfor (const [category, count] of show_lst) {\n\t\t\tconst cell = tk.legend.formatFilter[formatKey].holder\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_clb')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tconst opts = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Hide',\n\t\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\ttk.legend.formatFilter[formatKey].hiddenvalues.add(category)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Show only',\n\t\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\tfor (const c2 of show_lst) {\n\t\t\t\t\t\t\t\t\ttk.legend.formatFilter[formatKey].hiddenvalues.add(c2[0])\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttk.legend.formatFilter[formatKey].hiddenvalues.delete(category)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Show all',\n\t\t\t\t\t\t\tisVisible: () => tk.legend.formatFilter[formatKey].hiddenvalues.size,\n\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\ttk.legend.formatFilter[formatKey].hiddenvalues.clear()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t\tcreateLegendTipMenu(opts, tk, cell.node())\n\t\t\t\t})\n\t\t\tcell\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.attr('class', 'sja_mcdot')\n\t\t\t\t.style('background', '#aaa')\n\t\t\t\t.style('margin-right', '5px')\n\t\t\t\t.html(count > 1 ? count : '&nbsp;')\n\t\t\tcell.append('div').style('display', 'inline-block').text(category)\n\t\t}\n\n\t\t// hidden ones\n\t\tfor (const c of tk.legend.formatFilter[formatKey].hiddenvalues) {\n\t\t\tlet loading = false\n\t\t\ttk.legend.formatFilter[formatKey].holder\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.attr('class', 'sja_clb')\n\t\t\t\t.style('text-decoration', 'line-through')\n\t\t\t\t.style('opacity', 0.7)\n\t\t\t\t.text(c)\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tif (loading) return\n\t\t\t\t\tloading = true\n\t\t\t\t\ttk.legend.formatFilter[formatKey].hiddenvalues.delete(c)\n\t\t\t\t\treload(tk)\n\t\t\t\t})\n\t\t}\n\t}\n}\n\nfunction reload(tk) {\n\ttk.legend.tip.hide()\n\ttk.load()\n}\n\n/*\ndata is returned by xhr\nupdate legend dom\nmakes no return\n*/\nexport function updateLegend(data, tk, block) {\n\tif (!tk.legend) {\n\t\t// if using invalid dslabel, upon initiating initLegend() will not be called\n\t\t//and tk.legend may not be created\n\t\treturn\n\t}\n\n\t/* data.mclass2variantcount is optional; if present, will render in mclass section of track legend\n\talso keep data so it can be accessible by block.svg.js\n\tfor rendering mclass legend in exported svg\n\t*/\n\n\ttk.legend.mclass.currentData = data.mclass2variantcount\n\tupdate_mclass(tk)\n\tmay_update_variantShapeName(data, tk)\n\tmay_update_infoFields(data, tk)\n\tmay_update_formatFilter(data, tk)\n\tmay_update_skewerRim(data, tk)\n\tmay_update_ld(tk)\n\tmay_update_cnv(tk)\n}\n\nfunction may_update_variantShapeName(data, tk) {\n\tif (!tk.legend.customShapeLabels) return\n\tObject.values(tk.legend.variantShapeName).forEach(s => {\n\t\tif (!s.ids) {\n\t\t\t/** Create function completes before ids are assigned to each data pt.\n\t\t\t * Create list here once, to prevent incorrect counts for legend items\n\t\t\t * when the same shape is selected more than once.\n\t\t\t */\n\t\t\ts.ids = data.skewer.filter(d => d.shape == s.key).map(i => i.id)\n\t\t}\n\t\ts.num = 0\n\t})\n\n\tfor (const d of data.skewer) {\n\t\tlet shapeObj = tk.legend.variantShapeName.find(s => s.ids.some(i => i == d.id))\n\t\tif (!shapeObj) {\n\t\t\tshapeObj = tk.legend.variantShapeName.find(s => s.key == d.shape || s.origShape == d.shape)\n\t\t\tshapeObj.ids.push(d.id)\n\t\t}\n\t\tshapeObj.num = ++shapeObj.num\n\t}\n\n\tObject.values(tk.legend.variantShapeName).forEach(s => {\n\t\ts.wrapper.style('display', s.num ? 'block' : 'none')\n\t\ts.numDiv.text(s.num)\n\t})\n}\n\n/*\nupdate legend for all info fields of this track\n*/\nfunction may_update_infoFields(data, tk) {\n\tif (!tk.legend.bcfInfo) return\n\tif (!data.skewer) {\n\t\tconsole.log('data.skewer[] is not present and cannot show INFO legend')\n\t\treturn\n\t}\n\n\tfor (const infoKey in tk.legend.bcfInfo) {\n\t\t// key of an INFO field and will create a legend section\n\n\t\t// clear holder\n\t\ttk.legend.bcfInfo[infoKey].holder.selectAll('*').remove()\n\n\t\tif (tk.mds.bcf.info[infoKey].Type == 'String') {\n\t\t\t// data for the INFO field is categorical, in the legend show unique list of categories and variant count\n\t\t\t// TODO later use \"termType=categorical/integer/float\"\n\n\t\t\tconst category2variantCount = new Map() // key: category of this INFO field, v: number of variants\n\t\t\tfor (const m of data.skewer) {\n\t\t\t\tconst category = m.info?.[infoKey] || unannotatedKey\n\t\t\t\tif (Array.isArray(category)) {\n\t\t\t\t\tfor (const c of category) {\n\t\t\t\t\t\tcategory2variantCount.set(c, 1 + (category2variantCount.get(c) || 0))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcategory2variantCount.set(category, 1 + (category2variantCount.get(category) || 0))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// sort tally in descending order, each element is a two-ele array [category, variantCount]\n\t\t\tconst show_lst = [...category2variantCount].sort((i, j) => j[1] - i[1])\n\n\t\t\tfor (const [category, count] of show_lst) {\n\t\t\t\tprintCategory({\n\t\t\t\t\tholder: tk.legend.bcfInfo[infoKey].holder,\n\t\t\t\t\tkey: category,\n\t\t\t\t\tcolor: tk.mds.bcf.info[infoKey].categories?.[category]?.color || unknown_infoCategory_color,\n\t\t\t\t\tlabel: tk.mds.bcf.info[infoKey].categories?.[category]?.label || category,\n\t\t\t\t\tcount,\n\t\t\t\t\tclick: event => {\n\t\t\t\t\t\tconst opts = [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Hide',\n\t\t\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\t\ttk.legend.bcfInfo[infoKey].hiddenvalues.add(category)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Show only',\n\t\t\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\t\tfor (const c2 of show_lst) {\n\t\t\t\t\t\t\t\t\t\ttk.legend.bcfInfo[infoKey].hiddenvalues.add(c2[0])\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttk.legend.bcfInfo[infoKey].hiddenvalues.delete(category)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Show all',\n\t\t\t\t\t\t\t\tisVisible: () => tk.legend.bcfInfo[infoKey].hiddenvalues.size,\n\t\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\t\ttk.legend.bcfInfo[infoKey].hiddenvalues.clear()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\n\t\t\t\t\t\tcreateLegendTipMenu(opts, tk, event.target)\n\n\t\t\t\t\t\t// optional description of this category\n\t\t\t\t\t\tconst desc = tk.mds.bcf.info[infoKey].categories?.[category]?.desc\n\t\t\t\t\t\tif (desc) {\n\t\t\t\t\t\t\ttk.legend.tip.d\n\t\t\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t\t\t.style('padding', '10px')\n\t\t\t\t\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t\t\t\t\t.style('width', '150px')\n\t\t\t\t\t\t\t\t.html(desc)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// hidden ones\n\t\t\tfor (const c of tk.legend.bcfInfo[infoKey].hiddenvalues) {\n\t\t\t\tlet loading = false\n\t\t\t\ttk.legend.bcfInfo[infoKey].holder\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.attr('class', 'sja_clb')\n\t\t\t\t\t.style('text-decoration', 'line-through')\n\t\t\t\t\t.text(c)\n\t\t\t\t\t.on('click', async () => {\n\t\t\t\t\t\tif (loading) return\n\t\t\t\t\t\tloading = true\n\t\t\t\t\t\ttk.legend.bcfInfo[infoKey].hiddenvalues.delete(c)\n\t\t\t\t\t\treload(tk)\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction update_mclass(tk) {\n\tif (tk.hardcodeCnvOnly) return // legend is permanently hidden, no need to update\n\tif (!tk.legend.mclass.currentData || tk.legend.mclass.currentData.length == 0) return\n\t/* currentData[]: each element is shown as an entry in legend [ [class=str, count], [dt=integer, count] ]\n\telement is length=2 array. ele[0] can be either string or integer:\n\t- string: mclass key for snvindel\n\t- integer: a dt value e.g. dtcnv, those dt that doesn't have a corresponding mclass key\n\t*/\n\n\ttk.legend.mclass.holder.selectAll('*').remove()\n\n\tconst showlst = [],\n\t\thiddenlst = []\n\tfor (const [k, count] of tk.legend.mclass.currentData) {\n\t\tconst v = { k, count }\n\t\tif (tk.legend.mclass.hiddenvalues.has(k)) {\n\t\t\thiddenlst.push(v)\n\t\t} else {\n\t\t\tshowlst.push(v)\n\t\t}\n\t}\n\tshowlst.sort((i, j) => j.count - i.count)\n\thiddenlst.sort((i, j) => j.count - i.count)\n\n\t// items in hiddenvalues{} can still be absent in hiddenlst,\n\t// e.g. if class filter is done at backend, and currentData is calculated just from visible data items\n\tfor (const k of tk.legend.mclass.hiddenvalues) {\n\t\tif (!hiddenlst.find(i => i.k == k)) {\n\t\t\thiddenlst.push({ k })\n\t\t}\n\t}\n\n\tfor (const c of showlst) {\n\t\t// { k, count }\n\t\tconst { label, desc, color } = mds3tkMclass(c.k)\n\t\tprintCategory({\n\t\t\tholder: tk.legend.mclass.holder,\n\t\t\tkey: c.k,\n\t\t\tlabel: tk.mds.termdbConfig?.mclass?.[c.k]?.label || label,\n\t\t\tcolor,\n\t\t\tcount: c.count,\n\t\t\tclick: () => {\n\t\t\t\tconst opts = [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Hide',\n\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\ttk.legend.mclass.hiddenvalues.add(c.k)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Show only',\n\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\tfor (const c2 of showlst) {\n\t\t\t\t\t\t\t\ttk.legend.mclass.hiddenvalues.add(c2.k)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttk.legend.mclass.hiddenvalues.delete(c.k)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Show all',\n\t\t\t\t\t\tisVisible: () => hiddenlst.length,\n\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\ttk.legend.mclass.hiddenvalues.clear()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tisChangeShape: true,\n\t\t\t\t\t\tisVisible: () => {\n\t\t\t\t\t\t\tif (c.k == dtcnv) return false // no changing shape for cnv\n\t\t\t\t\t\t\treturn !tk.skewer.viewModes.find(v => v.type === 'numeric')?.inuse\n\t\t\t\t\t\t\t\t? tk.mds?.termdbConfig?.tracks?.allowSkewerChanges ?? true\n\t\t\t\t\t\t\t\t: false\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: (val, tk) => {\n\t\t\t\t\t\t\ttk.shapes[c.k] = val\n\t\t\t\t\t\t\ttk.load()\n\t\t\t\t\t\t\ttk.legend.tip.hide()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tisChangeColor: true,\n\t\t\t\t\t\tvalue: color,\n\t\t\t\t\t\tisVisible: () => {\n\t\t\t\t\t\t\treturn c.k != dtcnv // no changing color for cnv\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: colorValue => {\n\t\t\t\t\t\t\tif (!mclass[c.k].origColor) mclass[c.k].origColor = mclass[c.k].color\n\t\t\t\t\t\t\tmclass[c.k].color = colorValue\n\t\t\t\t\t\t},\n\t\t\t\t\t\treset: {\n\t\t\t\t\t\t\tisVisible: () => mclass[c.k].origColor,\n\t\t\t\t\t\t\tcallback: () => (mclass[c.k].color = mclass[c.k].origColor)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t\tcreateLegendTipMenu(opts, tk, event.target)\n\n\t\t\t\tconst descDiv = tk.legend.tip.d\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('padding', '10px')\n\t\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t\t.style('width', '150px')\n\n\t\t\t\tdescDiv.append('span').style('color', color).text(label.toUpperCase())\n\n\t\t\t\tdescDiv.append('div').style('color', 'black').html(desc)\n\t\t\t}\n\t\t})\n\t}\n\n\t// hidden ones\n\tfor (const c of hiddenlst) {\n\t\tlet loading = false\n\n\t\ttk.legend.mclass.holder\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.attr('class', 'sja_clb')\n\t\t\t.style('text-decoration', 'line-through')\n\t\t\t.style('opacity', 0.7)\n\t\t\t.text((c.count ? '(' + c.count + ') ' : '') + (Number.isInteger(c.k) ? dt2label[c.k] : mclass[c.k].label))\n\t\t\t.on('click', async event => {\n\t\t\t\tif (loading) return\n\t\t\t\tloading = true\n\t\t\t\ttk.legend.mclass.hiddenvalues.delete(c.k)\n\t\t\t\tevent.target.innerHTML = 'Updating...'\n\t\t\t\tawait tk.load()\n\t\t\t})\n\t}\n}\n\nfunction may_create_skewerRim(tk, block) {\n\tif (!tk.mds.queries?.snvindel?.skewerRim) return // not enabled\n\tconst R = (tk.legend.skewerRim = {})\n\tif (!tk.mds.queries.snvindel.skewerRim.hiddenvaluelst) tk.mds.queries.snvindel.skewerRim.hiddenvaluelst = []\n\n\tR.row = tk.legend.table.append('tr')\n\n\tR.headerTd = R.row // name of rim legend row is set on the fly, allows to change data type for rim\n\t\t.append('td')\n\t\t.style('text-align', 'right')\n\t\t.style('opacity', 0.7)\n\n\tR.holder = R.row.append('td')\n}\n\nfunction getSkewerRimLegendHeaderName(tk) {\n\tconst sk = tk.mds.queries.snvindel.skewerRim\n\tif (sk.type == 'format') {\n\t\tif (!sk.formatKey) throw 'skewerRim.formatKey missing'\n\t\treturn tk.mds.bcf?.format?.[sk.formatKey]?.Description || sk.formatKey\n\t}\n\treturn 'unknown skewerRim.type'\n}\n\nfunction may_update_skewerRim(data, tk) {\n\tif (!data.skewer) return // when missing, do nothing. this is possible when server breaks at loading a subtk\n\tconst sk = tk.mds.queries?.snvindel?.skewerRim\n\tif (!sk) return // not enabled\n\tlet rim1total = 0, // count number of cases, not unique\n\t\tnoRimTotal = 0\n\tfor (const m of data.skewer) {\n\t\tconst r1 = m.rim1count || 0\n\t\trim1total += r1\n\t\tnoRimTotal += m.occurrence - r1\n\t}\n\tconst R = tk.legend.skewerRim\n\tR.headerTd.text(getSkewerRimLegendHeaderName(tk))\n\tR.holder.selectAll('*').remove()\n\n\t// rim1\n\tif (rim1total > 0) {\n\t\tR.holder\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_clb')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.html(`${getRimSvg(1)}${sk.rim1value}, n=${rim1total}`)\n\t\t\t.on('click', event => {\n\t\t\t\ttk.legend.tip\n\t\t\t\t\t.clear()\n\t\t\t\t\t.showunder(event.target)\n\t\t\t\t\t.d.append('div')\n\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t.text('Hide')\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\tsk.hiddenvaluelst.push(sk.rim1value)\n\t\t\t\t\t\treload(tk)\n\t\t\t\t\t})\n\t\t\t})\n\t}\n\t// no rim\n\tif (noRimTotal > 0) {\n\t\tR.holder\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_clb')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.html(`${getRimSvg()}${sk.noRimValue}, n=${noRimTotal}`)\n\t\t\t.on('click', event => {\n\t\t\t\ttk.legend.tip\n\t\t\t\t\t.clear()\n\t\t\t\t\t.showunder(event.target)\n\t\t\t\t\t.d.append('div')\n\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t.text('Hide')\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\tsk.hiddenvaluelst.push(sk.noRimValue)\n\t\t\t\t\t\treload(tk)\n\t\t\t\t\t})\n\t\t\t})\n\t}\n\n\t// hidden ones\n\tfor (const c of sk.hiddenvaluelst) {\n\t\tlet loading = false\n\t\tR.holder\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.attr('class', 'sja_clb')\n\t\t\t.style('text-decoration', 'line-through')\n\t\t\t.style('opacity', 0.7)\n\t\t\t.text(c)\n\t\t\t.on('click', async event => {\n\t\t\t\tif (loading) return\n\t\t\t\tloading = true\n\t\t\t\tsk.hiddenvaluelst.splice(sk.hiddenvaluelst.indexOf(c), 1)\n\t\t\t\tevent.target.innerHTML = 'Updating...'\n\t\t\t\tawait tk.load()\n\t\t\t})\n\t}\n}\n\nfunction getRimSvg(rim) {\n\treturn (\n\t\t'<svg width=\"19\" height=\"19\" style=\"margin-right: 5px;\">' +\n\t\t'<circle cx=\"7\" cy=\"12\" r=\"7\" fill=\"#b1b1b1\"></circle>' +\n\t\t(rim == 1\n\t\t\t? '<path d=\"M6.735557395310443e-16,-11A11,11 0 0,1 11,0L9,0A9,9 0 0,0 5.51091059616309e-16,-9Z\" transform=\"translate(7,12)\" fill=\"#858585\" stroke=\"none\"></path>'\n\t\t\t: rim == 2\n\t\t\t? '' // hollow rim2, not done yet\n\t\t\t: '') + // blank for no rim\n\t\t'</svg>'\n\t)\n}\n\nfunction may_create_ld(tk, block) {\n\tif (!tk.mds.queries?.ld) return\n\ttk.mds.queries.ld.colorScale = interpolateRgb(tk.mds.queries.ld.overlay.color_0, tk.mds.queries.ld.overlay.color_1)\n\tconst R = (tk.legend.ld = {})\n\tR.row = tk.legend.table.append('tr')\n\t// contents are filled in dynamically\n\tR.headerTd = R.row.append('td').style('text-align', 'right').style('opacity', 0.7)\n\tR.holder = R.row.append('td')\n\tR.showHolder = R.holder.append('div').style('display', 'none')\n\tshowLDlegend(R.showHolder, tk.mds.queries.ld.colorScale)\n\tR.showHolder\n\t\t.append('span')\n\t\t.text('Cancel overlay')\n\t\t.style('font-size', '.7em')\n\t\t.attr('class', 'sja_clbtext')\n\t\t.on('click', () => {\n\t\t\tdelete tk.mds.queries.ld.mOverlay\n\t\t\tif (tk.skewer?.hlssmid) delete tk.skewer.hlssmid\n\t\t\ttk.load()\n\t\t})\n}\n\nfunction may_update_ld(tk) {\n\tif (!tk.mds.queries?.ld?.mOverlay) {\n\t\t// not in use\n\t\tif (tk.legend.ld) {\n\t\t\ttk.legend.ld.headerTd.html('')\n\t\t\ttk.legend.ld.showHolder.style('display', 'none')\n\t\t}\n\t\treturn\n\t}\n\t// doing overlay\n\ttk.legend.ld.headerTd.html(tk.mds.queries.ld.mOverlay.ldtkname + ' LD r<sup>2</sup>')\n\ttk.legend.ld.showHolder.style('display', 'block')\n}\n\nfunction may_create_cnv(tk, block) {\n\tif (!tk.cnv) return\n\n\tconst R = (tk.legend.cnv = {})\n\tR.row = tk.legend.table.append('tr')\n\tR.headerTd = R.row.append('td').style('text-align', 'right').style('opacity', 0.7).text('CNV')\n\tR.holder = R.row.append('td').style('padding-left', '10px')\n\n\tif (Number.isFinite(tk.cnv.cnvGainCutoff)) {\n\t\t// has the cutoff and cnv data uses numeric value; show colorscale\n\n\t\t// make all pieces that are arranged left to right inside <td>\n\t\tR.colorscaleHolder = R.holder.append('div') // visibility determined by if any segments are shown in view range\n\t\tR.colorscaleHolder.append('span').text('Loss').style('font-size', '.8em').style('opacity', 0.6) // \"Loss\" label on left of colorscale\n\t\tconst csHolder = R.colorscaleHolder.append('span') // actual holder of colorscale\n\t\tR.colorscaleHolder.append('span').text('Gain').style('font-size', '.8em').style('opacity', 0.6) // \"Gain\" label on right of colorscale\n\n\t\t// initiate colorscale component\n\t\tconst axisheight = 20\n\t\tconst barheight = 15\n\t\tconst xpad = 10\n\t\tconst axiswidth = 150\n\n\t\tR.colorScale = new ColorScale({\n\t\t\tbarwidth: axiswidth,\n\t\t\tbarheight,\n\t\t\tcolors: [tk.cnv.lossColor, 'white', tk.cnv.gainColor],\n\t\t\tdomain: [-1, 0, 1], // actual domain added during update\n\t\t\tfontSize: 12,\n\t\t\tholder: csHolder,\n\t\t\theight: axisheight + barheight,\n\t\t\twidth: xpad * 2 + axiswidth,\n\t\t\tposition: `${xpad},${axisheight}`,\n\t\t\tticks: 4,\n\t\t\ttickSize: 6,\n\t\t\ttopTicks: true,\n\t\t\tnumericInputs: {\n\t\t\t\tcallback: obj => {\n\t\t\t\t\tif (obj.cutoffMode == 'auto') {\n\t\t\t\t\t\tdelete tk.cnv.presetMax\n\t\t\t\t\t} else if (obj.cutoffMode == 'fixed') {\n\t\t\t\t\t\ttk.cnv.presetMax = Math.abs(obj.max)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'unknown cutoffMode value'\n\t\t\t\t\t}\n\t\t\t\t\ttk.load()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t} else {\n\t\t// cnv data uses category but not numeric value; fill category legend based on returned data\n\t\tR.cnvCategoryHolder = R.holder.append('span').attr('data-testid', 'sjpp-mds3cnvlegend-categoryholder')\n\t}\n\n\tR.noCnv = R.holder.append('div').text('No data').style('opacity', 0.6) // indicator there's no cnv in the region\n\n\t// following prompt will always be shown for cnv both using numeric value or not\n\n\tconst menu = new Menu() // launched by prompt\n\t// prompt to show cnv filter stats. click prompt to show menu to adjust filter parameters\n\tR.cnvFilterPrompt = R.holder\n\t\t.append('div')\n\t\t.style('display', 'inline-block')\n\t\t.style('margin-left', '10px')\n\t\t.style('font-size', '.9em')\n\t\t.attr('class', 'sja_clbtext')\n\t\t.on('click', () => {\n\t\t\t// show menu above prompt\n\t\t\tconst p = R.cnvFilterPrompt.node().getBoundingClientRect()\n\t\t\tconst x = p.left + window.scrollX\n\t\t\tconst y = p.top + window.scrollY\n\t\t\tmenu.clear().show(x, y, false, false, false)\n\t\t\t// render cnv config\n\t\t\tconst arg = {\n\t\t\t\tholder: menu.d.append('div'),\n\t\t\t\tcnvGainCutoff: tk.cnv.cnvGainCutoff,\n\t\t\t\tcnvLossCutoff: tk.cnv.cnvLossCutoff,\n\t\t\t\tcnvMaxLength: tk.cnv.cnvMaxLength,\n\t\t\t\tcallback: config => {\n\t\t\t\t\tObject.assign(tk.cnv, config)\n\t\t\t\t\tmenu.hide()\n\t\t\t\t\ttk.load()\n\t\t\t\t}\n\t\t\t}\n\t\t\trenderCnvConfig(arg)\n\t\t})\n}\n\nfunction may_update_cnv(tk) {\n\tif (!tk.cnv) return\n\n\t// tk is equipped with cnv. determine if cnv data is actually shown\n\tif (!tk.cnv.cnvLst || tk.cnv.cnvLst.length == 0) {\n\t\t// no cnv shown in this region. hide colorscale\n\t\t// possible for cnvLst to be missing! e.g. on server error\n\t\ttk.legend.cnv.colorscaleHolder?.style('display', 'none')\n\t\ttk.legend.cnv.cnvCategoryHolder?.style('display', 'none')\n\n\t\t// when cnvLst is missing, could be showing density instead of segments. in such case do not show noCnv message\n\t\ttk.legend.cnv.noCnv.style('display', tk.cnv.cnvInDensity ? 'none' : 'inline-block')\n\t} else {\n\t\t// has cnv showing; update legend with data contents\n\t\ttk.legend.cnv.noCnv.style('display', 'none')\n\n\t\tif (Number.isFinite(tk.cnv.cnvGainCutoff)) {\n\t\t\t// cnv uses numeric values\n\t\t\ttk.legend.cnv.colorscaleHolder.style('display', 'inline-block')\n\t\t\t// update colorscale\n\t\t\ttk.legend.cnv.colorScale.colors = [tk.cnv.lossColor, 'white', tk.cnv.gainColor]\n\t\t\ttk.legend.cnv.colorScale.domain = tk.cnv.presetMax\n\t\t\t\t? [-tk.cnv.presetMax, 0, tk.cnv.presetMax]\n\t\t\t\t: [-tk.cnv.absoluteMax, 0, tk.cnv.absoluteMax]\n\t\t\ttk.legend.cnv.colorScale.updateScale()\n\t\t} else {\n\t\t\t// uses categories\n\t\t\tif (!tk.hardcodeCnvOnly) {\n\t\t\t\t// !!! tricky !!!\n\t\t\t\t// not in cnv-only mode, the categories are already shown in Mutation legend section; do not duplicate legend here\n\t\t\t} else {\n\t\t\t\t// show legend in cnv-only mode\n\t\t\t\ttk.legend.cnv.cnvCategoryHolder.style('display', 'inline-block').selectAll('*').remove()\n\n\t\t\t\tconst class2count = new Map()\n\t\t\t\tfor (const c of tk.cnv.cnvLst) {\n\t\t\t\t\tif (!c.class) continue\n\t\t\t\t\tclass2count.set(c.class, 1 + (class2count.get(c.class) || 0))\n\t\t\t\t}\n\t\t\t\tfor (const [cls, count] of [...class2count].sort((i, j) => j[1] - i[1])) {\n\t\t\t\t\tprintCategory({\n\t\t\t\t\t\tholder: tk.legend.cnv.cnvCategoryHolder,\n\t\t\t\t\t\tkey: cls,\n\t\t\t\t\t\tlabel: mclass[cls].label,\n\t\t\t\t\t\tcolor: mclass[cls].color,\n\t\t\t\t\t\tcount: count,\n\t\t\t\t\t\tclick: event => {\n\t\t\t\t\t\t\tconst opts = [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tlabel: 'Hide',\n\t\t\t\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\t\t\t// NOTE add hidden cnv class here and pass it to backend using existing method\n\t\t\t\t\t\t\t\t\t\ttk.legend.mclass.hiddenvalues.add(cls)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisChangeColor: true,\n\t\t\t\t\t\t\t\t\tvalue: mclass[cls].color,\n\t\t\t\t\t\t\t\t\tisVisible: () => true,\n\t\t\t\t\t\t\t\t\tcallback: colorValue => {\n\t\t\t\t\t\t\t\t\t\tif (!mclass[cls].origColor) mclass[cls].origColor = mclass[cls].color\n\t\t\t\t\t\t\t\t\t\tmclass[cls].color = colorValue\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\treset: {\n\t\t\t\t\t\t\t\t\t\tisVisible: () => mclass[cls].origColor,\n\t\t\t\t\t\t\t\t\t\tcallback: () => (mclass[cls].color = mclass[cls].origColor)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\tcreateLegendTipMenu(opts, tk, event.target)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tfor (const cls of tk.legend.mclass.hiddenvalues) {\n\t\t\t\t\tlet loading = false\n\t\t\t\t\ttk.legend.cnv.cnvCategoryHolder\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t\t.attr('class', 'sja_clb')\n\t\t\t\t\t\t.style('text-decoration', 'line-through')\n\t\t\t\t\t\t.style('opacity', 0.7)\n\t\t\t\t\t\t.text(mclass[cls].label)\n\t\t\t\t\t\t.on('click', async event => {\n\t\t\t\t\t\t\tif (loading) return\n\t\t\t\t\t\t\tloading = true\n\t\t\t\t\t\t\ttk.legend.mclass.hiddenvalues.delete(cls)\n\t\t\t\t\t\t\tevent.target.innerHTML = 'Updating...'\n\t\t\t\t\t\t\tawait tk.load()\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// update filter prompt. each applicable filter criteria generates a phrase. concatenated phrases are shown in prompt\n\t// must do this even if no cnv is shown, which could be caused by filter param and allow to change here\n\tconst lst = []\n\tif (Number.isFinite(tk.cnv.cnvGainCutoff)) {\n\t\tlst.push(`CNV gain \u2265 ${tk.cnv.cnvGainCutoff}`)\n\t}\n\tif (Number.isFinite(tk.cnv.cnvLossCutoff)) {\n\t\tlst.push(`CNV loss \u2264 ${tk.cnv.cnvLossCutoff}`)\n\t}\n\tif (Number.isFinite(tk.cnv.cnvMaxLength)) {\n\t\tlst.push(`CNV length \u2264 ${bplen(tk.cnv.cnvMaxLength)}`)\n\t} else {\n\t\tlst.push('no length limit')\n\t}\n\ttk.legend.cnv.cnvFilterPrompt.text(`Filter: ${lst.join('; ')}`)\n}\n\nfunction createLegendTipMenu(opts, tk, elem) {\n\ttk.legend.tip.clear().showunder(elem)\n\n\tfor (const opt of opts) {\n\t\tif (opt.isVisible()) {\n\t\t\tif (opt.isChangeColor) {\n\t\t\t\ttk.legend.tip.d\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('padding', '5px 10px')\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.text('Color:')\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.attr('type', 'color')\n\t\t\t\t\t.property('value', rgb(opt.value).formatHex())\n\t\t\t\t\t.on('change', event => {\n\t\t\t\t\t\tconst color = event.target.value\n\t\t\t\t\t\topt.callback(color)\n\t\t\t\t\t\treload(tk)\n\t\t\t\t\t})\n\t\t\t\tif (opt.reset && opt.reset?.isVisible()) {\n\t\t\t\t\tconst resetDiv = tk.legend.tip.d.append('div').style('display', 'inline-block')\n\t\t\t\t\tconst handler = () => {\n\t\t\t\t\t\topt.reset.callback()\n\t\t\t\t\t\treload(tk)\n\t\t\t\t\t}\n\t\t\t\t\ticons['restart'](resetDiv, { handler, title: 'Reset to original color' })\n\t\t\t\t}\n\t\t\t} else if (opt.isChangeShape) {\n\t\t\t\tlet called = false\n\t\t\t\tconst div = tk.legend.tip.d\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.text('Change shape')\n\t\t\t\t\t.style('vertical-align', 'middle')\n\t\t\t\t\t/** Adding the class here for the hover effect\n\t\t\t\t\t * Styles are repeated to maintain the appearance\n\t\t\t\t\t * of the menu item after the class (aka hover\n\t\t\t\t\t * effect) is removed.\n\t\t\t\t\t */\n\t\t\t\t\t.classed('sja_menuoption', true)\n\t\t\t\t\t.style('padding', '5px 10px')\n\t\t\t\t\t.style('margin', '1px')\n\t\t\t\t\t.style('border-radius', '0px')\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\tdiv.classed('sja_menuoption', false)\n\t\t\t\t\t\tdiv.style('background-color', 'white')\n\t\t\t\t\t\tif (called == false) {\n\t\t\t\t\t\t\tcalled = true\n\t\t\t\t\t\t\trenderShapePicker({\n\t\t\t\t\t\t\t\tholder: div.append('div').style('margin-top', '10px'),\n\t\t\t\t\t\t\t\tcallback: val => opt.callback(val, tk),\n\t\t\t\t\t\t\t\ttk: tk\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t} else {\n\t\t\t\ttk.legend.tip.d\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t.style('border-radius', '0px')\n\t\t\t\t\t.text(opt.label)\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\topt.callback()\n\t\t\t\t\t\treload(tk)\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\n// print an entry for a category as a legend item\nfunction printCategory({ holder, key, color, count, label, click }) {\n\tconst div = holder.append('div').attr('class', 'sja_clb').style('display', 'inline-block').on('click', click)\n\tdiv\n\t\t.append('div')\n\t\t.style('display', 'inline-block')\n\t\t.attr('class', 'sja_mcdot')\n\t\t.style('background', color)\n\t\t.html(count > 1 ? count : '&nbsp;')\n\tdiv\n\t\t.append('div')\n\t\t.style('display', 'inline-block')\n\t\t.style('color', color)\n\t\t.style('padding-left', '5px')\n\t\t.attr('data-testid', 'sjpp-mds3tk-legenditemlabel')\n\t\t.attr('__key__', key) // for testing\n\t\t.text(label)\n}\n", "import { niceNumLabels } from '../dom/niceNumLabels.ts'\nimport { convertUnits } from '#shared/helpers.js'\nimport { dtTerms } from '#shared/common.js'\n\n/*\ntry to provide a meaningful name based on filter content; \nwhen filter is single-tvs, return a human-readable label.\nwhen there's >=2 tvs, which is hard to summarize, return `Filter (n)` and give up\n\nnot specific to mds3, can move to client/filter/ or shared/\n*/\n\nexport function getFilterName(f) {\n\tif (!Array.isArray(f?.lst)) return 'Invalid filter'\n\t// for a ds using subcohorts, a filter may contain cohort tvs and is not informative to display. thus derive new tvs array by skipping it\n\tconst lst = f.lst.filter(i => i.tag != 'cohortFilter')\n\tif (lst.length == 0) return 'No filter' // this is possible when user has deleted the only tvs\n\n\tif (lst.length == 1 && lst[0].type == 'tvs') {\n\t\t// has only one tvs\n\t\tconst tvs = lst[0].tvs\n\t\tif (!tvs) throw 'f.lst[0].tvs{} missing'\n\n\t\tswitch (tvs?.term?.type) {\n\t\t\tcase 'categorical':\n\t\t\t\tif (!Array.isArray(tvs.values)) throw 'f.lst[0].tvs.values not array'\n\n\t\t\t\t// only assess 1st category name; only use for display, not computing\n\t\t\t\tconst catKey = tvs.values[0]?.key\n\t\t\t\tif (catKey == undefined) throw 'f.lst[0].tvs.values[0].key missing'\n\t\t\t\tconst catValue = tvs.term.values?.[catKey]?.label || catKey\n\n\t\t\t\tif (tvs.values.length == 1) {\n\t\t\t\t\t// tvs uses only 1 category\n\t\t\t\t\tif ((tvs.term.name + catValue).length < 20) {\n\t\t\t\t\t\t// term name plus category value has short length, show both\n\t\t\t\t\t\treturn tvs.term.name + (tvs.isnot ? '!=' : ': ') + catValue\n\t\t\t\t\t}\n\t\t\t\t\t// only show cat value\n\t\t\t\t\treturn (tvs.isnot ? '!' : '') + (catValue.length < 15 ? catValue : catValue.substring(0, 13) + '...')\n\t\t\t\t}\n\t\t\t\t// tvs uses more than 1 category, set label as \"catValue (3)\"\n\t\t\t\treturn `${tvs.isnot ? '!' : ''}${catValue.length < 12 ? catValue : catValue.substring(0, 10) + '...'} (${\n\t\t\t\t\ttvs.values.length\n\t\t\t\t})`\n\t\t\tcase 'integer':\n\t\t\tcase 'float':\n\t\t\tcase 'geneExpression':\n\t\t\tcase 'metaboliteIntensity':\n\t\t\t\t// tvs is numeric, show numeric range\n\t\t\t\treturn getNumericRangeLabel(tvs)\n\t\t\tcase 'samplelst':\n\t\t\t\t// XXX quick fix! only uses first key in tvs.term.values{}\n\t\t\t\treturn Object.keys(tvs.term.values)[0]\n\t\t\tdefault:\n\t\t\t\t// after exhausting above term types, find a match from dtTerms[]; this avoids repeating them in many \"case\" statements\n\t\t\t\tfor (const dtt of dtTerms) {\n\t\t\t\t\tif (dtt.type == tvs.term.type) {\n\t\t\t\t\t\treturn (tvs.term.parentTerm?.name || '?') + ' ' + dtt.name\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow 'unknown tvs term type'\n\t\t}\n\t}\n\t// more than 1 tvs, not able to generate a short name\n\t// TODO count total tvs from nested list\n\treturn 'Filter (' + lst.length + ')'\n}\n\n/*\ntvs={ranges:[], term:{type}}\nonly generate label with first range. if multiple, simply append '...' to indicate such\nlabel is always show as A<x<B\nwhere \"x\" represents the variable, no matter term type. using \"AKT1 expresion\" can be too long\nif needed e.g. has enough space in another setting, can allow replacing \"x\" with entity name based on term type\n*/\nfunction getNumericRangeLabel(tvs) {\n\tif (!Array.isArray(tvs.ranges)) throw 'tvs.ranges not array'\n\tif (!tvs.ranges[0]) throw 'tvs.ranges[] blank array'\n\n\tconst r = tvs.ranges[0]\n\n\tlet startName, stopName // logic to compute print name and use if needed\n\tconst vc = tvs.term.valueConversion\n\tif (vc) {\n\t\tif ('start' in r) startName = convertUnits(r.start, vc.fromUnit, vc.toUnit, vc.scaleFactor, true)\n\t\tif ('stop' in r) stopName = convertUnits(r.stop, vc.fromUnit, vc.toUnit, vc.scaleFactor, true)\n\t} else {\n\t\t// no conversion, show numeric values\n\t\tif (tvs.term.type == 'integer') {\n\t\t\t// integer term, round to integer\n\t\t\tif ('start' in r) startName = Math.round(r.start)\n\t\t\tif ('stop' in r) stopName = Math.round(r.stop)\n\t\t} else {\n\t\t\t// not integer, then must be float, including geneExpression etc.\n\t\t\tif ('start' in r) startName = r.start\n\t\t\tif ('stop' in r) stopName = r.stop\n\n\t\t\tif ('start' in r && 'stop' in r) {\n\t\t\t\t// range has both start/stop, can apply nice label\n\t\t\t\t;[startName, stopName] = niceNumLabels([startName, stopName])\n\t\t\t}\n\t\t}\n\t}\n\n\tlet label\n\tif (tvs.isnot) {\n\t\tif (r.startunbounded) label = `x ${r.stopinclusive ? '>' : '>='} ${stopName}`\n\t\telse if (r.stopunbounded) label = `x ${r.startinclusive ? '<' : '<='} ${startName}`\n\t\telse label = `!(${startName} ${stopName})`\n\t} else {\n\t\tif (r.startunbounded) label = `x ${r.stopinclusive ? '<=' : '<'} ${stopName}`\n\t\telse if (r.stopunbounded) label = `x ${r.startinclusive ? '>=' : '>'} ${startName}`\n\t\telse label = `${startName}${r.startinclusive ? '<=' : '<'}x${r.stopinclusive ? '<=' : '<'}${stopName}`\n\t}\n\tif (tvs.ranges.length > 1) label += '...' // quick way to indicate there're more\n\treturn label\n}\n", "import { Menu } from '#dom'\nimport { dofetch3 } from '#common/dofetch'\nimport { initLegend, updateLegend } from './legend'\nimport { loadTk, rangequery_rglst } from './tk'\nimport urlmap from '#common/urlmap'\nimport { mclass, dtsnvindel, dtsv, dtfusionrna, dtcnv, getColors } from '#shared/common.js'\nimport { ssmIdFieldsSeparator } from '#shared/mds3tk.js'\nimport { getFilterName } from './filterName'\nimport { fillTermWrapper } from '#termsetting'\nimport { rehydrateFilter } from '../filter/rehydrateFilter.js'\n\n/*\nthis script exports one function \"makeTk()\" that will be called just once\nwhen the mds3 track object is initiating\nmakeTk will not be called for subsequent user interactions with mds3 track\nit will initiate dataset object \"tk.mds{}\" for both official and custom data\nand creates getter callbacks to abstract dataset details\n\n\n********************** EXPORTED\nmakeTk\n********************** INTERNAL\ninit_mclass\nget_ds\n\tvalidateCustomVariants\n\t\tvalidateCustomSnvindel\n\t\tvalidateCustomSvfusion\n\tmayDeriveSkewerOccurrence4samples\nmayInitTermdb\nmayInitSkewer\n\tsetSkewerMode\nmayInitCnv\nmayaddGetter_m2csq\nmayInit_variant2samples\nconfigPanel\n_load\n\n\ntk.subtk2height{ skewer: int, ... }\n\n\ntk.skewer{}\n\tcreate if skewer data type is available for this mds\n\tif not equipped then tk.skewer is undefined and should not show skewer track\n\nstratify labels will account for all tracks, e.g. skewer, cnv\n\n********************************\n* On highlighting skewer disks *\n********************************\nclient can supply tk.hlssmid or tk.hlaachange, both are comma-joined list of names\nupon init, both will be converted to tk.skewer.hlssmid (set)\nhlaachange is converted when skewer data is returned from server\ntk.skewer.hlssmid can be modified or deleted dynamically\nhighlighting is done by inserting <rect> into tk.skewer.hlBoxG\nsee mayHighlightDiskBySsmid()\n\n********************************\n* On skewer view modes *\n********************************\nview modes applicable to current data are declared in tk.skewer.viewModes[]\neach element is one mode, defines how to show snv/indel data points; will also control fusion\nobj can offer flexibility on defining complex data source/method/arithmetics\nviewModes[] is a merge from tk.skewerModes (custom) and tk.mds.skewerModes (official)\nviewModes[] is dynamically modified in may_render_skewer, upon getting new data\nlater may add cnv.viewModes[] to control mode of other data types\n\n********************************\n* On tricky skewer data *\n********************************\nwhen requesting skewer data at gmmode (not genomic) for the first time,\ndata is queried by isoform, and returned data is kept at tk.skewer.rawmlst\nat subsequent panning/zooming, it won't re-request skewer data, as it's still using the same isoform\nand will use cached data at rawmlst instead\n\n********************************\n* On skewer shapes *\n********************************\nIn both the numeric and skewer modes, one of eight shapes is defined for each data point. In \nskewer mode, shapes are mapped to the mutation and assigned to each skewer on render init. \nIn numeric mode, the shape is defined individually via the custom_variants.shape[Triangle/Circle] arg. \nThe default is the `filledCircle` for both modes. \n*/\n\n// names of client-supplied optional callbacks attached to tk body, to centralize list and easy validation\nconst callbacknames = [\n\t'onClose', // this only takes effect if tk shows the \"Close\" handle, e.g. on subtk\n\t'click_snvindel',\n\t'callbackOnRender',\n\t'disc_mouseover',\n\t'disc_mouseout'\n]\n\nexport async function makeTk(tk, block) {\n\t// run just once to initiate a track by adding in essential attributes to tk object\n\n\t/* some tk components will contribute to determination of total tk height\n\tdeclare all these components, default height for each to 0 for not rendered, so the values can be easily assessed\n\twhen a component rendered, set actual height\n\t*/\n\ttk.subtk2height = {\n\t\tskewer: 0,\n\t\tleftlabels: 0,\n\t\tcnv: 0\n\t}\n\n\ttk.leftlabels = {\n\t\tg: tk.gleft.append('g'), // all labels are rendered here, except track label\n\t\tdoms: {},\n\t\t// keys: label name, value: label dom\n\t\t// to avoid having to delete all labels upon tk rendering\n\t\tlaby: 0, // cumulative height, 0 for no labels\n\t\txoff: 0,\n\t\tmaxwidth: 0 // set default 0 in case track runs into err, can still render tk\n\t}\n\n\ttk._finish = loadTk_finish_closure(tk, block)\n\n\ttk.cache = {}\n\ttk.itemtip = new Menu() // show contents on clicking an item\n\ttk.hovertip = new Menu() // show contents here on hovering an item and avoid reusing itemtip\n\ttk.menutip = new Menu({ padding: '' }) // to show menu options without margin\n\n\ttk.load = _load(tk, block) // shorthand\n\n\ttk.mnamegetter = m => {\n\t\t// may require m.dt=1\n\t\tif (tk.mds.queries?.snvindel?.vcfid4skewerName && m.vcf_id) return m.vcf_id\n\t\tconst s = m.mname\n\t\tif (!s) return ''\n\t\t// trim too long names\n\t\tif (s.length > 25) {\n\t\t\treturn s.substr(0, 20) + '...'\n\t\t}\n\t\treturn s\n\t}\n\n\tawait get_ds(tk, block)\n\t// tk.mds{} is created for both official and custom track\n\t// following procedures are only based on tk.mds\n\n\t// must init termdb first to get termdbconfig, and do all the rest (inform what queries are available, has vocabApi methods etc)\n\tawait mayInitTermdb(tk, block)\n\n\tawait mayInit_variant2samples(tk, block)\n\tmayaddGetter_m2csq(tk, block)\n\n\tmayInitSkewer(tk) // tk.skewer{} may be added\n\n\tmayInitCnv(tk)\n\n\tif (tk.filterObj) await Promise.all(rehydrateFilter(tk.filterObj, tk.mds.termdb.vocabApi))\n\n\ttk.tklabel.text(tk.mds.label || tk.name)\n\n\ttk.clear = () => {\n\t\t// called in loadTk, when uninitialized is true\n\t\tif (tk.skewer) tk.skewer.g.selectAll('*').remove()\n\t}\n\n\t// TODO <g> for other file types\n\n\t// config\n\t/*\n\ttk.config_handle = block.maketkconfighandle(tk).on('click', () => {\n\t\tconfigPanel(tk, block)\n\t})\n\t*/\n\n\tinitLegend(tk, block)\n\n\tinit_mclass(tk)\n\n\ttk.color4disc = m => {\n\t\t// figure out what color to use for a m point\n\t\tif (tk.mutationColorBy) {\n\t\t\tif (tk.mutationColorBy == 'hardcode') {\n\t\t\t\tif (m.color) return m.color\n\t\t\t}\n\t\t}\n\n\t\tif (tk.mds.queries?.ld?.mOverlay?.data) {\n\t\t\tconst m0 = tk.mds.queries.ld.mOverlay.m\n\t\t\tif (m.chr == m0.chr && m.pos == m0.pos && m.ref == m0.ref && m.alt == m0.alt) {\n\t\t\t\t// the same variant as has been clicked for overlaying\n\t\t\t\treturn tk.mds.queries.ld.overlay.color_1\n\t\t\t}\n\t\t\t// this variant is not the \"index\" one, find a matching variant from returned data\n\t\t\tfor (const m1 of tk.mds.queries.ld.mOverlay.data) {\n\t\t\t\tif (m1.pos == m.pos && m1.alleles == m.ref + '.' + m.alt) {\n\t\t\t\t\t// found match\n\t\t\t\t\treturn tk.mds.queries.ld.colorScale(m1.r2)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// no match\n\t\t\treturn tk.mds.queries.ld.overlay.color_0\n\t\t}\n\n\t\tif (tk.vcfinfofilter && tk.vcfinfofilter.setidx4mclass != undefined) {\n\t\t\t// TODO\n\t\t\tconst mcset = tk.vcfinfofilter.lst[tk.vcfinfofilter.setidx4mclass]\n\n\t\t\tconst [err, vlst] = getter_mcset_key(mcset, m)\n\n\t\t\tif (err || vlst == undefined) return 'black'\n\n\t\t\tfor (const v of vlst) {\n\t\t\t\t// no choice but simply use first value to ever have a valid color\n\t\t\t\tif (mcset.categories[v]) {\n\t\t\t\t\treturn mcset.categories[v].color\n\t\t\t\t} else {\n\t\t\t\t\treturn 'black'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// mclass\n\t\tif (mclass[m.class]) {\n\t\t\treturn mclass[m.class].color\n\t\t}\n\t\treturn 'black'\n\t}\n\n\tparseUrl(tk)\n\n\t// do this after parsing url\n\tif (tk.hlssmid) {\n\t\ttk.skewer.hlssmid = new Set(tk.hlssmid.split(','))\n\t\tdelete tk.hlssmid\n\t}\n\n\ttry {\n\t\tvalidateSelectSamples(tk)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n\n\ttk.duplicateTk = filter => {\n\t\t// generate tkarg object by duplicating configration of current tk, to be used for block launch\n\t\t// provide optional filter obj to assign to tk\n\t\tconst tkarg = {\n\t\t\ttype: 'mds3',\n\t\t\tdslabel: tk.dslabel,\n\t\t\tfilter0: tk.filter0,\n\t\t\tshowCloseLeftlabel: true,\n\t\t\tfilterObj: filter || structuredClone(tk.filterObj),\n\t\t\tallow2selectSamples: tk.allow2selectSamples,\n\t\t\tonClose: tk.onClose,\n\t\t\tcallbackOnRender: tk.callbackOnRender,\n\t\t\thardcodeCnvOnly: tk.hardcodeCnvOnly,\n\t\t\ttoken: tk.token // for testing\n\t\t}\n\t\tif (tk.cnv?.presetMax) tkarg.cnv = { presetMax: tk.cnv.presetMax } // preset value is present, pass to subtk\n\t\tif (tk.legend.mclass?.hiddenvalues?.size) {\n\t\t\ttkarg.legend = { mclass: { hiddenvalues: new Set() } }\n\t\t\tfor (const v of tk.legend.mclass.hiddenvalues) tkarg.legend.mclass.hiddenvalues.add(v)\n\t\t}\n\t\treturn tkarg\n\t}\n\n\tfor (const n of callbacknames) {\n\t\tif (tk[n] && typeof tk[n] != 'function') throw `.${n}() is not function`\n\t}\n}\n\nfunction loadTk_finish_closure(tk, block) {\n\t// call this when tk finish rendering\n\treturn data => {\n\t\t// update legend name in case filter has changed\n\t\t// tk.legend{} is missing if tk is not initiated (wrong ds name)\n\t\ttk.legend?.headTd.text(tk.name + (tk.filterObj ? ' - ' + getFilterName(tk.filterObj) : ''))\n\n\t\tif (tk.cnv) {\n\t\t\ttk.cnv.g.transition().attr('transform', `translate(0,${tk.subtk2height.skewer})`)\n\t\t}\n\n\t\tif (data) {\n\t\t\t// centralized place on indicating if tk has error or simply no data\n\t\t\t// only do this when server return data is present. data may not be supplied e.g when switching skewer mode\n\n\t\t\tif (data.error) {\n\t\t\t\t// has error e.g. server snafu. set skewer height to show error msg later\n\t\t\t\ttk.subtk2height.skewer = 40\n\t\t\t} else {\n\t\t\t\t// no error. detect if has data or not\n\t\t\t\tlet totalCount = 0\n\t\t\t\tif (data.skewer) totalCount = data.skewer.length\n\t\t\t\tif (data.cnv) totalCount += data.cnv.length\n\t\t\t\tif (data.cnvDensity) totalCount += data.cnvDensity.segmentCount\n\t\t\t\tif (totalCount == 0) {\n\t\t\t\t\t// show blank tk with msg\n\t\t\t\t\tlet context = 'view range'\n\t\t\t\t\tif (block.usegm && block.gmmode != 'genomic') context = block.usegm.name || block.usegm.isoform\n\t\t\t\t\ttk.skewer.g\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.text('No data in ' + context)\n\t\t\t\t\t\t.attr('y', 25)\n\t\t\t\t\t\t.attr('x', block.width / 2)\n\t\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t\t.attr('dominant-baseline', 'center')\n\t\t\t\t\ttk.subtk2height.skewer = 40\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// derive tk height\n\t\ttk.height_main =\n\t\t\tMath.max(\n\t\t\t\ttk.subtk2height.leftlabels, // won't be added if tk crashed\n\t\t\t\ttk.subtk2height.skewer + tk.subtk2height.cnv\n\t\t\t) +\n\t\t\ttk.toppad +\n\t\t\ttk.bottompad\n\n\t\tif (data) {\n\t\t\t/*if (data.error) throw data.error // TODO: may need to handle data.error, can be propagated here? \n\t\t\telse*/ updateLegend(data, tk, block)\n\t\t}\n\n\t\ttk.leftLabelMaxwidth = Math.max(\n\t\t\ttk.leftlabels.maxwidth + tk.leftlabels.xoff,\n\t\t\t// tk.skewer.maxwidth is undefined if makeTk had exception. must yield valid value for leftLabelMaxwidth for block to show properly with err msg in tk body\n\t\t\tNumber.isFinite(tk.skewer?.maxwidth) ? tk.skewer.maxwidth : 0\n\t\t)\n\n\t\tblock.tkcloakoff(tk, { error: data ? data.error : null })\n\t\tblock.block_setheight()\n\t\tblock.setllabel()\n\n\t\ttk.callbackOnRender?.(tk, block) // run if present\n\t}\n}\n\nfunction parseUrl(tk) {\n\t// parse url parameters applicable to this track\n\t// may inhibit this through some settings\n\tconst urlp = urlmap()\n\tif (tk.skewer) {\n\t\t// process skewer-related params\n\t\tif (urlp.has('hlaachange')) {\n\t\t\ttk.hlaachange = urlp.get('hlaachange')\n\t\t\t// later convert to hlssmid, when skewer data is available\n\t\t}\n\t\tif (urlp.has('hlssmid')) {\n\t\t\ttk.hlssmid = urlp.get('hlssmid').split(',')\n\t\t}\n\t}\n\t// process additional params\n}\n\nfunction mayInitSkewer(tk) {\n\tif (!tk.mds.has_skewer) return\n\ttk.skewer = {\n\t\t// both skewer and numeric mode will render elements into tk.skewer.g\n\t\t// will also attach skewer.discKickSelection\n\t\tg: tk.glider.append('g'),\n\t\t// border color of a box over a highlighted data\n\t\thlBoxColor: tk.mds.hlBoxColor || 'red',\n\t\t// default to show dot labels\n\t\thideDotLabels: false,\n\t\t// true for pointing up\n\t\tpointup: true\n\t}\n\tsetSkewerMode(tk) // adds skewer.viewModes[]\n}\n\nexport function mayInitCnv(tk) {\n\tlet cfg // the config object for rendering cnv\n\tif (tk.mds.termdbConfig?.queries?.cnv) {\n\t\tcfg = tk.mds.termdbConfig.queries.cnv // native ds config\n\t} else if (tk.custom_variants?.find(i => i.dt == dtcnv)) {\n\t\t// has custom cnv; require that all are same type (using value or using category)\n\t\tlet useValue = false,\n\t\t\tuseCat = false\n\t\tfor (const m of tk.custom_variants) {\n\t\t\tif (m.dt == dtcnv) {\n\t\t\t\tif (Number.isFinite(m.value)) useValue = true\n\t\t\t\telse useCat = true\n\t\t\t}\n\t\t}\n\t\tif (useValue && useCat) throw 'custom cnv should be either using numeric value or not, but cannot be mixture'\n\t\tif (useValue) {\n\t\t\tcfg = {\n\t\t\t\tcnvGainCutoff: 0, // use 0 for not filtering and show all events\n\t\t\t\tcnvLossCutoff: 0\n\t\t\t}\n\t\t} else if (useCat) {\n\t\t\tcfg = {} // no need for flags\n\t\t} else {\n\t\t\tthrow 'custom cnv is neither value or category, should not happen'\n\t\t}\n\t} else {\n\t\treturn // no cnv from this tk\n\t}\n\n\tif (!tk.cnv) tk.cnv = {} // preserve existing setting\n\ttk.cnv.g = tk.glider.append('g')\n\ttk.cnv.cnvMaxLength = cfg.cnvMaxLength // if missing do not filter\n\ttk.cnv.cnvGainCutoff = cfg.cnvGainCutoff // if missing do not filter\n\ttk.cnv.cnvLossCutoff = cfg.cnvLossCutoff\n\ttk.cnv.absoluteValueRenderMax = cfg.absoluteValueRenderMax || 5\n\ttk.cnv.gainColor = cfg.gainColor || '#D6683C'\n\ttk.cnv.lossColor = cfg.lossColor || '#67a9cf'\n\ttk.cnv.density = {\n\t\tbarheight: 60\n\t}\n}\n\nfunction setSkewerMode(tk) {\n\ttk.skewer.viewModes = tk.skewerModes\n\tdelete tk.skewerModes\n\tif (!tk.skewer.viewModes) tk.skewer.viewModes = []\n\tconst vm = tk.skewer.viewModes\n\tif (!Array.isArray(vm)) throw 'skewerModes[] is not array'\n\tif (tk.mds.skewerModes) {\n\t\tfor (const n of tk.mds.skewerModes) vm.push(n)\n\t}\n\tif (!vm.find(n => n.type == 'skewer')) vm.push({ type: 'skewer' })\n\tfor (const n of vm) {\n\t\tif (typeof n != 'object') throw 'one of skewerModes[] is not object'\n\t\tif (n.type == 'skewer') {\n\t\t\t// allowed type, no more configs\n\t\t\tif (!n.label) n.label = 'lollipops'\n\t\t} else if (n.type == 'numeric') {\n\t\t\t// data method\n\t\t\tif (n.byAttribute) {\n\t\t\t\tif (!n.label) n.label = n.byAttribute\n\t\t\t} else if (n.byInfo) {\n\t\t\t} else {\n\t\t\t\t// support info fields etc\n\t\t\t\tthrow 'unknown data method for a type=numeric mode'\n\t\t\t}\n\t\t} else {\n\t\t\tthrow 'unknown type from a skewerModes[]'\n\t\t}\n\t}\n\tif (!vm.find(n => n.inuse)) vm[0].inuse = true\n}\n\nfunction init_mclass(tk) {\n\t// hidden mclass is controled on the client side\n\tif (tk.mds.hiddenmclass) {\n\t\t// port over default hidden mclass\n\t\tfor (const c of tk.mds.hiddenmclass) tk.legend.mclass.hiddenvalues.add(c)\n\t}\n}\n\n/*\nto get the dataset object for this track, to be kept in client side\n\ninput:\n\ttk{}\n\tblock{}\nno output\n\neffect: creates tk.mds{}\n\n\nfor official dataset, query ?getDataset to obtain a fresh copy\nfor custom dataset, generate an object from scratch\n*/\nasync function get_ds(tk, block) {\n\tif (tk.dslabel) {\n\t\t// this tk loads from an official dataset\n\t\tconst data = await dofetch3('getDataset', { body: { genome: block.genome.name, dsname: tk.dslabel } })\n\t\tif (data.error) throw 'Error: ' + data.error\n\t\tif (!data.ds) throw 'data.ds{} missing'\n\t\tif (!data.ds.isMds3) throw 'A legacy dataset cannot be loaded as a mds3 track'\n\t\ttk.mds = data.ds\n\t\ttk.name = data.ds.label\n\t\treturn\n\t}\n\n\t// this tk loads as a custom track\n\n\tif (!tk.name) tk.name = 'Custom data'\n\t// create the dataset object\n\ttk.mds = {}\n\t// fill in details to tk.mds\n\n\t///////////// custom data sources\n\tif (tk.bcf) {\n\t\tif (!tk.bcf.file && !tk.bcf.url) throw 'file or url missing for tk.bcf{}'\n\t\ttk.mds.has_skewer = true // enable skewer tk\n\t\tawait getbcfheader_customtk(tk, block.genome)\n\t} else if (tk.custom_variants) {\n\t\tvalidateCustomVariants(tk, block)\n\t\tmayDeriveSkewerOccurrence4samples(tk)\n\t\tmayAddInfoField(tk)\n\t} else {\n\t\tthrow 'unknown data source for custom track'\n\t}\n\n\tmayProcessSampleAnnotation(tk)\n}\n\nfunction mayProcessSampleAnnotation(tk) {\n\t// temp function to process custom sample annotation\n\tif (!tk.sampleAnnotation) return\n\t// use this data to initiate tk.mds.termdb{}\n\tif (!Array.isArray(tk.sampleAnnotation.terms)) throw 'sampleAnnotation.terms is not array'\n\tif (!tk.mds.termdb) tk.mds.termdb = {}\n\ttk.mds.termdb.terms = tk.sampleAnnotation.terms\n\ttk.mds.termdb.annotations = tk.sampleAnnotation.annotations\n}\n\nasync function mayInitTermdb(tk, block) {\n\tconst tdb = tk.mds.termdb\n\tif (!tdb) return\n\n\t{\n\t\tconst arg = {}\n\t\tif (tk.mds.label) {\n\t\t\t// official dataset\n\t\t\targ.vocab = {\n\t\t\t\tgenome: block.genome.name,\n\t\t\t\tdslabel: tk.mds.label\n\t\t\t}\n\t\t} else if (tdb.terms) {\n\t\t\t// custom dataset\n\t\t\targ.vocab = {\n\t\t\t\tterms: tdb.terms,\n\t\t\t\tsampleannotation: tdb.annotations\n\t\t\t}\n\t\t} else {\n\t\t\tthrow 'do not know how to init vocab'\n\t\t}\n\t\tconst _ = await import('#termdb/vocabulary')\n\t\ttdb.vocabApi = _.vocabInit(arg)\n\n\t\tif (!tdb.vocabApi.app) {\n\t\t\t/**** Note!\n\t\t\twhen tk is doing sample filtering (e.g. a subtk), vocabApi will be passed to filter UI code\n\t\t\tand filter UI will call termdb app with term type selector, which requires genome obj to be accessible\n\t\t\tvia vocabApi.app.opts.genome for gene search to function\n\t\t\there .app is missing, and since vocabApi is not frozen, this quick fix supplies it in entirely adhoc manner\n\t\t\t*/\n\t\t\ttdb.vocabApi.app = { opts: { genome: block.genome } }\n\t\t}\n\t}\n\n\ttk.mds.termdbConfig = await tdb.vocabApi.getTermdbConfig()\n\n\tif (tk.mds.termdb.allowCaseDetails) {\n\t\ttk.mds.termdb.allowCaseDetails.get = async acase => {}\n\t}\n}\n\nfunction mayaddGetter_m2csq(tk, block) {\n\tif (!tk.mds.queries?.snvindel?.m2csq) return\n\ttk.mds.queries.snvindel.m2csq.get = async m => {\n\t\tconst body = { genome: block.genome.name, dslabel: tk.mds.label, m2csq: 1 }\n\t\tif (tk.mds.queries.snvindel.m2csq.by == 'ssm_id') {\n\t\t\tbody.ssm_id = m.ssm_id\n\t\t} else {\n\t\t\treturn { error: 'unknown query method' }\n\t\t}\n\t\tconst headers = { 'Content-Type': 'application/json', Accept: 'application/json' }\n\t\tif (tk.token) headers['X-Auth-Token'] = tk.token\n\t\treturn await dofetch3('mds3', { body, headers }, { serverData: tk.cache })\n\t}\n}\n\n/* to add tk.mds.variant2samples.get()\nwith different implementation for client/server-based data sources\n\nnote inconsistency in getSamples() for client/server\nwhere server function queries v2s.get()\nbut client function does not do v2s.get() but should do the same to support sunburst and summary\n*/\nasync function mayInit_variant2samples(tk, block) {\n\tif (!tk.mds.variant2samples) return\n\n\tif (tk.custom_variants) {\n\t\taddV2Sgetter_custom(tk, block)\n\t} else {\n\t\taddV2Sgetter_native(tk, block)\n\t}\n\n\tif (tk.mds.variant2samples.twLst) {\n\t\tif (!Array.isArray(tk.mds.variant2samples.twLst)) throw 'v2s.twLst[] not array'\n\t\tif (!tk.mds.termdb?.vocabApi) throw 'mds.termdb.vocabApi should be present for initiating v2s.twLst'\n\t\tfor (const t of tk.mds.variant2samples.twLst) await fillTermWrapper(t, tk.mds.termdb.vocabApi)\n\t}\n}\n\nfunction addV2Sgetter_custom(tk, block) {\n\t// TODO auto generate variant2samples.twLst[] based on sample data\n\n\t/* getter implemented for custom data\n\tcurrently only provides list of samples\n\tTODO support summary and sunburst\n\t*/\n\ttk.mds.variant2samples.get = arg => {\n\t\t/*\n\t\targ{}\n\t\t.mlst[]\n\t\t*/\n\t\tif (arg.querytype == tk.mds.variant2samples.type_samples) {\n\t\t\tconst samples = []\n\t\t\tfor (const m of arg.mlst) {\n\t\t\t\tif (!m.samples) continue\n\t\t\t\tfor (const s of m.samples) {\n\t\t\t\t\tconst s2 = JSON.parse(JSON.stringify(s))\n\t\t\t\t\ts2.ssm_id = m.ssm_id\n\t\t\t\t\tsamples.push(s2)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { samples }\n\t\t}\n\t\tif (arg.querytype == tk.mds.variant2samples.type_summary) {\n\t\t\tthrow 'todo: summary'\n\t\t}\n\t\tif (arg.querytype == tk.mds.variant2samples.type_sunburst) {\n\t\t\tthrow 'todo: sunburst'\n\t\t}\n\t\tthrow 'unknown querytype'\n\t}\n\n\ttk.mds.getSamples = () => {\n\t\tconst id2sample = new Map()\n\t\tfor (const m of tk.custom_variants) {\n\t\t\tif (!m.samples) continue\n\t\t\tfor (const s of m.samples) {\n\t\t\t\tif (id2sample.has(s.sample_id)) {\n\t\t\t\t\tid2sample.get(s.sample_id).ssm_id_lst.push(m.ssm_id)\n\t\t\t\t} else {\n\t\t\t\t\tconst s2 = JSON.parse(JSON.stringify(s))\n\t\t\t\t\ts2.ssm_id_lst = [m.ssm_id]\n\t\t\t\t\tid2sample.set(s.sample_id, s2)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { samples: [...id2sample.values()] }\n\t}\n}\n\nfunction addV2Sgetter_native(tk, block) {\n\t/*\n\tworks for both official and custom bcf\n\n\tcall v2s.get() with querytype=?\n\tbased on querytype, get() finds terms from appropriate places to retrieve attributes\n\tthus no need to directly supply list of terms to get()\n\n\targ{}\n\t.querytype=sunburst/samples/summary\n\t.mlst\n\t.isoform \n\t.rglst[] // requires one of (mlst, isoform, rglst)\n\t.tid2value{}\n\t*/\n\ttk.mds.variant2samples.get = async arg => {\n\t\tconst par = {\n\t\t\tgenome: block.genome.name,\n\t\t\tvariant2samples: 1,\n\t\t\tget: arg.querytype,\n\t\t\thardcodeCnvOnly: tk.hardcodeCnvOnly\n\t\t}\n\n\t\tif (tk.cnv) {\n\t\t\t// for querying cnv\n\t\t\tif (tk.cnv.cnvMaxLength) par.cnvMaxLength = tk.cnv.cnvMaxLength\n\t\t\tif (tk.cnv.cnvGainCutoff) par.cnvGainCutoff = tk.cnv.cnvGainCutoff\n\t\t\tif (tk.cnv.cnvLossCutoff) par.cnvLossCutoff = tk.cnv.cnvLossCutoff\n\t\t}\n\n\t\tif (tk.mds.label) {\n\t\t\tpar.dslabel = tk.mds.label\n\t\t} else if (tk.bcf) {\n\t\t\tif (tk.bcf.file) par.bcffile = tk.bcf.file\n\t\t\telse if (tk.bcf.url) par.bcfurl = tk.bcf.url\n\t\t\telse throw 'tk.bcf{}: file/url missing'\n\t\t} else {\n\t\t\tthrow 'no dslabel or tk.bcf'\n\t\t}\n\n\t\tif (arg.groupSsmBySample) {\n\t\t\t// from getSamples(), is a modifier of querytype=samples, to return .ssm_id_lst[] with each sample\n\t\t\tpar.groupSsmBySample = 1\n\t\t}\n\n\t\tif (arg.mlst) {\n\t\t\tif (tk.mds.variant2samples.variantkey == 'ssm_id') {\n\t\t\t\t// TODO detect too long string length that will result url-too-long error\n\t\t\t\t// in such case, need alternative query method\n\t\t\t\t// call encodeURIComponent to pass plus strand from sv/fusion\n\t\t\t\tpar.ssm_id_lst = arg.mlst.map(i => i.ssm_id).join(',')\n\t\t\t} else {\n\t\t\t\tthrow 'unknown variantkey for variant2samples'\n\t\t\t}\n\t\t}\n\t\tif (arg.isoform) {\n\t\t\tpar.isoform = arg.isoform\n\t\t}\n\t\tif (arg.rglst) {\n\t\t\tpar.rglst = arg.rglst\n\t\t}\n\n\t\tconst headers = { 'Content-Type': 'application/json', Accept: 'application/json' }\n\t\tif (tk.set_id) par.set_id = tk.set_id\n\t\tif (tk.token) headers['X-Auth-Token'] = tk.token\n\t\tif (tk.filter0) par.filter0 = tk.filter0\n\t\tif (tk.filterObj) par.filterObj = tk.filterObj\n\t\tif (arg.tid2value) par.tid2value = arg.tid2value\n\n\t\t// supply list of terms based on querytype\n\t\tif (arg.querytype == tk.mds.variant2samples.type_sunburst) {\n\t\t\t// TODO may change to vocabApi.getNestedChartSeriesData\n\t\t\tif (tk.mds.variant2samples.sunburst_twLst) {\n\t\t\t\tpar.twLst = tk.mds.variant2samples.sunburst_twLst\n\t\t\t}\n\t\t} else if (arg.querytype == tk.mds.variant2samples.type_samples) {\n\t\t\tif (tk.mds.variant2samples.twLst) par.twLst = tk.mds.variant2samples.twLst\n\t\t} else if (arg.querytype == tk.mds.variant2samples.type_summary) {\n\t\t\t// TODO querytype=summary should be replaced by client barchar issuing its own query\n\t\t\tif (tk.mds.variant2samples.twLst) par.twLst = tk.mds.variant2samples.twLst\n\t\t} else {\n\t\t\tthrow 'unknown querytype'\n\t\t}\n\n\t\t// add in parameters that will filter samples\n\t\tpar.skewerRim = tk.mds.queries.snvindel?.skewerRim\n\n\t\tif (tk.legend?.formatFilter) {\n\t\t\t// add format fields to filter samples\n\t\t\tconst filter = {}\n\t\t\tfor (const k in tk.legend.formatFilter) {\n\t\t\t\tif (tk.legend.formatFilter[k].hiddenvalues.size) {\n\t\t\t\t\tfilter[k] = [...tk.legend.formatFilter[k].hiddenvalues]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(filter).length) {\n\t\t\t\tpar.formatFilter = filter\n\t\t\t}\n\t\t}\n\n\t\tif (tk.legend?.mclass?.hiddenvalues?.size) {\n\t\t\t// since hiddenvalues set contains mixture of mclass(str) and dt(int), pass json array instead of comma-joined string\n\t\t\tpar.hiddenmclasslst = JSON.stringify([...tk.legend.mclass.hiddenvalues])\n\t\t}\n\n\t\tconst data = await dofetch3('mds3', { body: par, headers }, { serverData: tk.cache })\n\t\tif (data.error) throw data.error\n\t\tconst r = data.variant2samples\n\t\tif (!r) throw 'result error'\n\t\tif (arg.querytype == tk.mds.variant2samples.type_sunburst) {\n\t\t\tif (!Array.isArray(r.nodes)) throw 'nodes[] not array from return'\n\t\t} else if (arg.querytype == tk.mds.variant2samples.type_samples) {\n\t\t\tif (!Array.isArray(r.samples)) throw 'samples[] not array from return'\n\t\t} else if (arg.querytype == tk.mds.variant2samples.type_summary) {\n\t\t\tif (!Array.isArray(r.summary)) throw 'summary[] not array from return'\n\t\t} else {\n\t\t\tthrow 'unknown querytype'\n\t\t}\n\t\treturn r\n\t}\n\n\t/*\n\tthis function is called for 2 uses in #cases menu\n\targ{}\n\t.isSummary=true\n\t\ttrue: return summaries for v2s.twLst\n\t\tfalse: return list of samples\n\t.tid2value={}\n\t\toptional, to filter samples\n\t*/\n\ttk.mds.getSamples = async (arg = {}) => {\n\t\tif (arg.isSummary) {\n\t\t\targ.querytype = tk.mds.variant2samples.type_summary\n\t\t} else {\n\t\t\t// must be calling from \"List\" option of #case menu\n\t\t\targ.querytype = tk.mds.variant2samples.type_samples\n\t\t\t// supply this flag so server will group ssm by case\n\t\t\targ.groupSsmBySample = 1\n\t\t}\n\t\trangequery_rglst(tk, block, arg)\n\t\treturn await tk.mds.variant2samples.get(arg)\n\t}\n}\n\nfunction configPanel(tk, block) {}\n\nfunction _load(tk, block) {\n\treturn async () => {\n\t\treturn await loadTk(tk, block)\n\t}\n}\n\nfunction getter_mcset_key(mcset, m) {\n\t/*\n\tget the key from an item (m) given a mcset\n\n\treturns list!!!\n\n\t*/\n\tif (mcset.altalleleinfo) {\n\t\tif (!m.altinfo) return ['no .altinfo']\n\n\t\tconst value = m.altinfo[mcset.altalleleinfo.key]\n\t\tif (value == undefined) {\n\t\t\t// no value\n\n\t\t\tif (mcset.numericfilter) {\n\t\t\t\t// for alleles without AF_ExAC e.g. not seem in that population, treat value as 0\n\t\t\t\t// FIXME: only work for population frequency, assumption won't hold for negative values\n\t\t\t\treturn [null, [0]]\n\t\t\t}\n\n\t\t\treturn [null, undefined]\n\t\t}\n\n\t\tlet vlst = Array.isArray(value) ? value : [value]\n\n\t\tif (mcset.altalleleinfo.separator) {\n\t\t\t// hardcoded separator for string\n\t\t\tvlst = vlst[0].split(mcset.altalleleinfo.separator)\n\t\t}\n\t\treturn [null, vlst]\n\t}\n\n\tif (mcset.locusinfo) {\n\t\tif (!m.info) return ['no .info']\n\n\t\tconst value = m.info[mcset.locusinfo.key]\n\t\tif (value == undefined) {\n\t\t\t// no value\n\t\t\tif (mcset.numericfilter) {\n\t\t\t\t// hard fix: for alleles without AF_ExAC e.g. not seem in that population, treat value as 0\n\t\t\t\treturn [null, [0]]\n\t\t\t}\n\t\t\treturn [null, undefined]\n\t\t}\n\n\t\tlet vlst = Array.isArray(value) ? value : [value]\n\n\t\tif (mcset.locusinfo.separator) {\n\t\t\tvlst = vlst[0].split(mcset.locusinfo.separator)\n\t\t}\n\t\treturn [null, vlst]\n\t}\n\n\treturn ['no trigger']\n}\n\n/*\nto validate custom variants (snvindel and svfusion) already present in tk.custom_variants[]\ncreate \"ssm_id\" for each variant inside array\ncreate \"pairlst[]\" for sv/fusion\nmakes no return\n*/\nfunction validateCustomVariants(tk, block) {\n\tfor (const m of tk.custom_variants) {\n\t\t// has_skewer is a convenient flag to indicate skewer will render based on multiple datatypes; a flag for cnv is not needed\n\t\tif (m.dt == dtsnvindel) {\n\t\t\ttk.mds.has_skewer = true // enable skewer tk\n\t\t\tvalidateCustomSnvindel(m)\n\t\t\tcontinue\n\t\t}\n\t\tif (m.dt == dtfusionrna || m.dt == dtsv) {\n\t\t\ttk.mds.has_skewer = true // enable skewer tk\n\t\t\tvalidateCustomSvfusion(m, block)\n\t\t\tcontinue\n\t\t}\n\t\tif (m.dt == dtcnv) {\n\t\t\tm.ssm_id = [m.chr, m.start, m.stop, m.class].join(ssmIdFieldsSeparator)\n\t\t\tcontinue\n\t\t}\n\t\tthrow 'unknown dt for a custom variant'\n\t}\n}\n\nfunction validateCustomSnvindel(m) {\n\t// snvindel\n\tif (!m.chr) throw '.chr missing for custom snvindel'\n\tif (!Number.isInteger(m.pos)) throw '.pos not integer for custom snvindel'\n\tif (!m.ssm_id) {\n\t\tm.ssm_id = [m.chr, m.pos, m.ref && m.alt ? m.ref + ssmIdFieldsSeparator + m.alt : m.mname].join(\n\t\t\tssmIdFieldsSeparator\n\t\t)\n\t}\n}\nfunction validateCustomSvfusion(m, block) {\n\t// sv or fusion\n\tif (m.pairlst) {\n\t\t// todo validate pairlst[]\n\t} else {\n\t\t// make pairlst[], requires chr1/pos1/chr2/pos2 etc\n\t\tif (!m.chr1) throw '.chr1 missing for custom sv/fusion'\n\t\tif (!Number.isInteger(m.pos1)) throw '.pos1 not integer for custom svfusion'\n\t\tif (m.strand1 != '+' && m.strand1 != '-') throw '.strand1 not +/- for custom svfusion'\n\t\tif (!m.chr2) throw '.chr1 missing for custom sv/fusion'\n\t\tif (!Number.isInteger(m.pos2)) throw '.pos1 not integer for custom svfusion'\n\t\tif (m.strand2 != '+' && m.strand2 != '-') throw '.strand1 not +/- for custom svfusion'\n\t\tm.pairlst = [\n\t\t\t{\n\t\t\t\ta: {\n\t\t\t\t\tchr: m.chr1,\n\t\t\t\t\tpos: m.pos1,\n\t\t\t\t\tstrand: m.strand1,\n\t\t\t\t\tname: m.gene1 || ''\n\t\t\t\t},\n\t\t\t\tb: {\n\t\t\t\t\tchr: m.chr2,\n\t\t\t\t\tpos: m.pos2,\n\t\t\t\t\tstrand: m.strand2,\n\t\t\t\t\tname: m.gene2 || ''\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\t\tdelete m.chr1\n\t\tdelete m.pos1\n\t\tdelete m.strand1\n\t\tdelete m.gene1\n\t\tdelete m.chr2\n\t\tdelete m.pos2\n\t\tdelete m.strand2\n\t\tdelete m.gene2\n\t}\n\n\t// m.pairlst[] is ready\n\n\t// create ssm_id\n\tconst fields = [m.dt] // fields to make ssm_id for svfusion\n\n\t// FIXME need pairlst[] index and a/b side\n\t// \"2.chr22.23253797.+.1.ABL1\" should be \"2.chr22.23253797.+.0b.ABL1\" instead\n\t// TODO loop through m.pairlst[]\n\n\t// seek [0].a{}\n\tconst hits = block.seekcoord(m.pairlst[0].a.chr, m.pairlst[0].a.pos)\n\tif (hits.length && hits[0].x > 0 && hits[0].x < block.width) {\n\t\t// [0].a is within range\n\t\tfields.push(...[m.pairlst[0].a.chr, m.pairlst[0].a.pos, m.pairlst[0].a.strand, 0, m.pairlst[0].a.name])\n\n\t\t// since .a{} is in range, use .b.name as mname\n\t\tm.mname = m.pairlst[0].b.name || ''\n\t\tm.chr = m.pairlst[0].a.chr\n\t\tm.pos = m.pairlst[0].a.pos\n\t\tm.pairlstIdx = 0\n\t} else {\n\t\t// [0].a is not within range, seek [0].b{}\n\t\tconst hits = block.seekcoord(m.pairlst[0].b.chr, m.pairlst[0].b.pos)\n\t\tif (hits.length && hits[0].x > 0 && hits[0].x < block.width) {\n\t\t\t// [0].b is in range\n\t\t\tfields.push(...[m.pairlst[0].b.chr, m.pairlst[0].b.pos, m.pairlst[0].b.strand, 1, m.pairlst[0].b.name])\n\n\t\t\t// since .b{} is in range, use .a.name as mname\n\t\t\tm.mname = m.pairlst[0].a.name || ''\n\t\t\tm.chr = m.pairlst[0].b.chr\n\t\t\tm.pos = m.pairlst[0].b.pos\n\t\t\tm.pairlstIdx = 1\n\t\t} else {\n\t\t\t// [0] a/b both are not in range. do not reject?\n\t\t}\n\t}\n\tm.ssm_id = fields.join(ssmIdFieldsSeparator)\n}\n\n/* wip\nthis works for receiving data from mass-matrix gene label-clicking\nin custom_variants[] data points,\nif \"sample_id\" is present but \"occurrence\" is missing, do below:\n- dedup the list by merging m{} of same variant together. only apply to ssm!\n- on unique m{}, create .samples[] to collect list of samples harboring that variant\n- derive m.occurrence:int, as the samples[] array length\n- enable tk.mds.variant2samples{}\n\nmay share code with server\n*/\nfunction mayDeriveSkewerOccurrence4samples(tk) {\n\tif (tk.custom_variants.find(i => i.occurrence != undefined)) {\n\t\t// at least one m{} has occurrence, presumably all m{} should have it. no need to group\n\t\treturn\n\t}\n\n\t// sample_id is hardcoded, change \"sample\" to \"sample_id\"\n\n\tfor (const i of tk.custom_variants) {\n\t\tif (i.sample) {\n\t\t\ti.sample_id = i.sample\n\t\t\tdelete i.sample\n\t\t}\n\t}\n\n\tif (!tk.custom_variants.find(i => i.sample_id)) {\n\t\t// no m{} has sample, cannot derive occurrence\n\t\t// usecase: for displaying variant-only info, e.g. regression-snplocus, dbsnp, clinvar\n\t\treturn\n\t}\n\n\t// has .sample_id but lacks .occurrence, do things\n\n\t// ungrouped events are stored here and combined to grouped ones.\n\t// FIXME group fusion.\n\t// lacks a way to group cnv\n\tconst ungrouped = []\n\n\tconst key2m = new Map()\n\t// k: mutation ssm_id, v: m{} after deduplication, with occurrence:int\n\n\tfor (const m of tk.custom_variants) {\n\t\tif (m.dt != dtsnvindel) {\n\t\t\tm.occurrence = 1\n\t\t\tm.samples = [{ sample_id: m.sample_id }]\n\t\t\tdelete m.sample_id\n\t\t\tungrouped.push(m)\n\t\t\tcontinue\n\t\t}\n\t\tconst key = [m.mname, m.chr, m.pos, m.ref, m.alt].join(ssmIdFieldsSeparator)\n\t\tconst m2 = key2m.get(key)\n\t\tif (m2) {\n\t\t\tm2.occurrence++\n\t\t\t// TODO collect samples to array\n\t\t\tm2.samples.push({\n\t\t\t\tsample_id: m.sample_id\n\t\t\t})\n\t\t} else {\n\t\t\tm.occurrence = 1\n\t\t\tm.samples = [\n\t\t\t\t{\n\t\t\t\t\tsample_id: m.sample_id\n\t\t\t\t}\n\t\t\t]\n\t\t\tdelete m.sample_id\n\t\t\tkey2m.set(key, m)\n\t\t}\n\t}\n\n\ttk.custom_variants = ungrouped\n\tfor (const m of key2m.values()) tk.custom_variants.push(m)\n\t// enable variant2samples\n\tif (!tk.mds.variant2samples) tk.mds.variant2samples = {}\n\tconst v = tk.mds.variant2samples\n\tv.type_samples = 'samples'\n\tv.type_summary = 'summary'\n\tv.type_sunburst = 'sunburst'\n}\n\n/* wip\nhardcode for Type=\"string\", no auto detecting numeric values to set Type=\"Float\"\n*/\nfunction mayAddInfoField(tk) {\n\tif (!tk.custom_variants.some(i => i.info)) return // no variant has info field\n\tconst info = {} // replicate same structure as native tk\n\tfor (const m of tk.custom_variants) {\n\t\tif (typeof m.info != 'object') continue\n\t\tfor (const k in m.info) {\n\t\t\tconst v = m.info[k]\n\t\t\tif (v == null || v == undefined) continue\n\t\t\tif (!info[k]) info[k] = { ID: k, Number: '.', Type: 'String', categories: {} }\n\t\t\tif (!info[k].categories[v]) info[k].categories[v] = {}\n\t\t}\n\t}\n\tfor (const k in info) {\n\t\tconst colors = getColors(Object.keys(info[k].categories).length)\n\t\tfor (const c in info[k].categories) {\n\t\t\tinfo[k].categories[c].color = colors(c)\n\t\t}\n\t}\n\ttk.mds.bcf = { info }\n}\n\n/*\ninput:\n\ttk{}\n\tgenome{}\n\t\tclient-side genome object\n*/\nasync function getbcfheader_customtk(tk, genome) {\n\tconst arg = { genome: genome.name }\n\tif (tk.bcf.file) {\n\t\targ.file = tk.bcf.file\n\t} else {\n\t\targ.url = tk.bcf.url\n\t\tif (tk.bcf.indexURL) arg.indexURL = tk.bcf.indexURL\n\t}\n\tconst data = await dofetch3('bcfheader', { body: arg })\n\tif (data.error) throw data.error\n\tconst [info, format, samples, errs] = data.header\n\tif (errs) throw 'Error parsing VCF meta lines: ' + errs.join('; ')\n\ttk.mds.bcf = {\n\t\tinfo,\n\t\tformat // can be null\n\t}\n\tif (samples?.length) {\n\t\t// bcf file has samples\n\t\ttk.mds.bcf.samples = samples\n\t\t// add v2s; later getter will be added\n\t\ttk.mds.variant2samples = {\n\t\t\t//twLst:[], // TODO should not be required\n\t\t\ttype_samples: 'samples',\n\t\t\tvariantkey: 'ssm_id'\n\t\t}\n\t}\n\tif (!tk.mds.queries) tk.mds.queries = {}\n\ttk.mds.queries.snvindel = { forTrack: true }\n}\n\nfunction validateSelectSamples(tk) {\n\tconst a = tk.allow2selectSamples\n\tif (!a) return\n\tif (!a.buttonText) a.buttonText = 'Select samples'\n\tif (typeof a.buttonText != 'string') throw 'allow2selectSamples.buttonText value is not string'\n\tif (!a.attributes) a.attributes = [{ from: 'sample_id', to: 'sample_id' }]\n\tif (!Array.isArray(a.attributes)) throw 'allow2selectSamples.attributes[] is not array'\n\tif (a.attributes.length == 0) throw 'allow2selectSamples.attributes[] blank array'\n\tfor (const i of a.attributes) {\n\t\tif (typeof i.from != 'string' || !i.from) throw 'allow2selectSamples.attributes.from is not string'\n\t\tif (typeof i.to != 'string' || !i.to) throw 'allow2selectSamples.attributes.to is not string'\n\t}\n\tif (typeof a.callback != 'function') throw 'allow2selectSamples.callback() is not function'\n\ta._cart = [] // array to hold samples selected so far (e.g. separately from multiple mutations), for submitting to a.callback()\n}\n", "import { scaleLinear } from 'd3-scale'\nimport { mclass } from '#shared/common.js'\nimport { table_cnv, itemtable_oneItem } from './itemtable'\nimport { axisRight } from 'd3-axis'\nimport { table2col, axisstyle } from '#dom'\n\n/* (important param for cnv tk rendering thus is put at top)\narg is an array. each element is a row of either:\n\t- all cnv segments per sample (for each sample, all cnv are shown in one row)\n\t- a stack that will be shown as a row\n\nlogic:\n\n\tif there are small enough number of rows:\n\t- max out row height to maxRowHeight with spacing. total subtrack height shouldn't exceed limit\n\n\tif number of rows exceeds maxTkHeight:\n\t\treturn fractional row height (maxTkHeight/#rows) for canvas plotting\n\t\n\telse:\n\t\tscale \nuse same sample number cutoff values in scale and capping\n*/\nconst maxRowHeight = 10\nconst maxTkHeight = 200 // cnv tk max height when skewer is present\nfunction getRowHeight(rows, tk) {\n\tlet maxh = maxTkHeight\n\tif (tk.subtk2height.skewer == 0) {\n\t\t/* assumes that skewer subtk is already rendered and height already determined. if skewer height=0, allow to double cnv max height due to:\n\t\t- tk is hardcoded cnv-only\n\t\t- there's no skewer data in view range\n\t\t*/\n\t\tmaxh *= 2\n\t}\n\n\t// v is computed row height and used for deriving actual row height\n\tconst v = maxh / rows.length\n\tif (v > maxRowHeight) return [maxRowHeight, 1] // small enough number of rows. use max height\n\tif (v > 3) return [Math.floor(v), 1] // big enough height, round to small integer with spacing\n\tif (v > 1) return [Math.floor(v), 0] // same above, no spacing\n\treturn [v, 0] // very small height. no spacing\n}\n\n/*\ntk.cnv = {\n\n\t// following are optional setting when tk.cnv.cnvGainCutoff is used (cnv using numeric values)\n\tpresetMax: number // if set, use this to set colorscale domain\n\tabsoluteMax: number // if presetMax is not set, use this for colorscale domain\n}\n\nto find out if server can return a cnv segment with >1 samples\n\nclick cnv legend to:\n- hide all cnv\n- show only\n- hide gain\n- hide loss\n- set absoluteValueRenderMax\n- set cnvMaxLength\nalso\n- subtk maintains same absoluteMax as parent tk\n*/\nexport function may_render_cnv(data, tk, block) {\n\tif (!tk.cnv) return\n\t// reset all properties indicative of run state; other code relies on them to detect if in segment or density mode\n\ttk.cnv?.g.selectAll('*').remove()\n\tdelete tk.cnv.cnvLst\n\tdelete tk.cnv.cnvInDensity\n\tdelete tk.cnv.cnvMsg\n\n\tif (data.cnv) {\n\t\tif (!Array.isArray(data.cnv.cnvs)) throw 'data.cnv.cnvs[] not array'\n\t\ttk.cnv.cnvMsg = data.cnv.cnvMsg\n\t\t// has moderate amounts of segments. show as lines\n\t\trenderSegments(data, tk, block)\n\t\t// tk.cnv.cnvLst created\n\t\treturn\n\t}\n\tif (data.cnvDensity) {\n\t\ttk.cnv.cnvInDensity = true\n\t\ttk.cnv.cnvMsg = data.cnvDensity.cnvMsg\n\t\trenderDensity(data, tk, block)\n\t\treturn\n\t}\n\n\ttk.subtk2height.cnv = 0 // set to 0 in case cnv was showing before and now turned off so as to remove its space\n\tif (tk.cnv) tk.cnv.cnvLst = [] // a trick to hide legend colorscale\n}\n\nfunction renderDensity(data, tk, block) {\n\t/* render two subtracks, one for density of gain and loss\n\t */\n\ttk.cnv.g\n\t\t.append('image')\n\t\t.attr('width', block.width)\n\t\t.attr('height', tk.cnv.density.barheight)\n\t\t.attr('xlink:href', data.cnvDensity.gain.src)\n\ttk.cnv.g\n\t\t.append('image')\n\t\t.attr('width', block.width)\n\t\t.attr('height', tk.cnv.density.barheight)\n\t\t.attr('xlink:href', data.cnvDensity.loss.src)\n\t\t.attr('y', tk.cnv.density.barheight)\n\n\t// todo show axis in tk.gleft\n\taxisstyle({\n\t\taxis: tk.cnv.g\n\t\t\t.append('g')\n\t\t\t.attr('transform', `translate(-1,0)`)\n\t\t\t.call(\n\t\t\t\taxisRight()\n\t\t\t\t\t.scale(scaleLinear().domain([0, data.cnvDensity.max]).range([tk.cnv.density.barheight, 0]))\n\t\t\t\t\t.tickValues([0, data.cnvDensity.max])\n\t\t\t),\n\t\tcolor: 'black',\n\t\tshowline: true\n\t})\n\taxisstyle({\n\t\taxis: tk.cnv.g\n\t\t\t.append('g')\n\t\t\t.attr('transform', `translate(-1,${tk.cnv.density.barheight})`)\n\t\t\t.call(\n\t\t\t\taxisRight()\n\t\t\t\t\t.scale(scaleLinear().domain([0, data.cnvDensity.max]).range([0, tk.cnv.density.barheight]))\n\t\t\t\t\t.tickValues([0, data.cnvDensity.max])\n\t\t\t),\n\t\tcolor: 'black',\n\t\tshowline: true\n\t})\n\ttk.cnv.g\n\t\t.append('text')\n\t\t.text('Gain')\n\t\t.attr('font-size', block.labelfontsize * 0.9)\n\t\t.attr('x', 5)\n\t\t.attr('y', tk.cnv.density.barheight / 2)\n\ttk.cnv.g\n\t\t.append('text')\n\t\t.text('Loss')\n\t\t.attr('font-size', block.labelfontsize * 0.9)\n\t\t.attr('x', 5)\n\t\t.attr('y', tk.cnv.density.barheight * 1.5)\n\n\ttk.subtk2height.cnv = tk.cnv.density.barheight * 2\n}\n\nfunction renderSegments(data, tk, block) {\n\tconst [cnvBySample, cnvLst, absoluteMax] = prepData(data, tk, block)\n\ttk.cnv.cnvLst = cnvLst // raw list of events to be used in itemtable\n\n\t// FIXME if this tk is subtk keep value from parent tk and do not overwrite\n\ttk.cnv.absoluteMax = absoluteMax\n\n\ttk.cnv.colorScale = scaleLinear(\n\t\ttk.cnv.presetMax ? [-tk.cnv.presetMax, 0, tk.cnv.presetMax] : [-absoluteMax, 0, absoluteMax],\n\t\t[tk.cnv.lossColor, 'white', tk.cnv.gainColor]\n\t).clamp(true)\n\n\tconst [rowheight, rowspace] = getRowHeight(cnvBySample || cnvLst, tk)\n\n\t/* rendering\n\twhen using samples:\n\t\teach sample is a row, all cnv segments of this sample are rendered into this row; number of rows is number of unique samples\n\twhen not using samples:\n\t\ttotal number of rows are determined by stacking segments\n\t{x1,x2} where x1<x2 no matter block is reversed or not, for onscreen rendering\n\t*/\n\n\tif (cnvBySample) {\n\t\tfor (const sample of cnvBySample) {\n\t\t\t// all cnv segments of same sample are rendered in same row. segments have already been sorted\n\t\t\t// do not consider overlapping segments. sample is not supposed to have that\n\t\t\tfor (const c of sample.cnvs) {\n\t\t\t\tplotOneSegment(c, sample.y * (rowheight + rowspace), rowheight, tk, block, sample)\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// no sample\n\t\tfor (const c of cnvLst) {\n\t\t\tplotOneSegment(c, c.y * (rowheight + rowspace), rowheight, tk, block)\n\t\t}\n\t}\n\n\tconst rowc = (cnvBySample || cnvLst).length\n\ttk.subtk2height.cnv = rowc * rowheight + (rowc - 1) * rowspace\n}\n\nexport function prepData(data, tk, block) {\n\t// return following 3 variables. contents will vary depends on if sample is present\n\tlet maxAbsoluteValue = 0 // updated if cnv uses numeric value\n\tconst sample2cnv = new Map() // k: sample_id, v: [{chr/start/stop/value/x1/x2}]. only populated when cnv has sample, in order to show cnvs from the same sample grouped together rather than scattered\n\tconst cnvLst = [] // raw list of events passing filter, each has structure of {samples:[]} to be used in itemtable. is used for cnv rendering when there's no sample\n\n\tfor (const v of data.cnv.cnvs) {\n\t\tif (!v.chr) continue\n\t\tif (!Number.isInteger(v.start) || !Number.isInteger(v.stop)) continue\n\n\t\tconst t1 = block.seekcoord(v.chr, v.start)[0]\n\t\tif (!t1) continue\n\t\tconst t2 = block.seekcoord(v.chr, v.stop)[0]\n\t\tif (!t2) continue\n\n\t\t// the segment is visible\n\n\t\tconst j = structuredClone(v)\n\t\tif (t1.x > t2.x) {\n\t\t\t// block is reverse\n\t\t\tj.x1 = t2.x\n\t\t\tj.x2 = t1.x\n\t\t} else {\n\t\t\tj.x1 = t1.x\n\t\t\tj.x2 = t2.x\n\t\t}\n\n\t\t// only when cnv uses numeric value\n\t\tif (Number.isFinite(v.value)) maxAbsoluteValue = Math.max(maxAbsoluteValue, Math.abs(v.value))\n\n\t\tcnvLst.push(j)\n\n\t\tif (Array.isArray(v.samples)) {\n\t\t\t// this cnv has sample (meaning all events should have sample)\n\t\t\tfor (const s of v.samples) {\n\t\t\t\t// {sample_id}\n\t\t\t\tif (!sample2cnv.has(s.sample_id)) sample2cnv.set(s.sample_id, [])\n\t\t\t\tsample2cnv.get(s.sample_id).push(structuredClone(j))\n\t\t\t}\n\t\t}\n\t}\n\n\tlet samples\n\tif (sample2cnv.size) {\n\t\t// group cnv by samples\n\t\tsamples = [] // flatten to array. each sample is one elem showing in one row\n\t\tfor (const [s, cnvs] of sample2cnv) {\n\t\t\tcnvs.sort((a, b) => a.x1 - b.x1) // important to guard against overlapping segments of a sample and allow such to be rendered\n\t\t\tsamples.push({\n\t\t\t\tsample_id: s,\n\t\t\t\tcnvs,\n\t\t\t\tx1: Math.min(...cnvs.map(i => i.x1)),\n\t\t\t\tx2: Math.max(...cnvs.map(i => i.x2))\n\t\t\t})\n\t\t}\n\t\tsamples.sort((a, b) => a.x1 - b.x1)\n\t\t// each sample will be rendered into one row. no samples will share rows. do not perform stacking\n\t\tfor (let i = 0; i < samples.length; i++) samples[i].y = i\n\t} else {\n\t\t// not using samples. stack segments to plot\n\t\tcnvLst.sort((a, b) => a.x1 - b.x1)\n\t\tstackRows(cnvLst, 0)\n\t}\n\n\treturn [samples, cnvLst, Math.min(tk.cnv.absoluteValueRenderMax, maxAbsoluteValue)]\n}\n\nfunction plotOneSegment(c, y, rowheight, tk, block, sample) {\n\tconst x1 = Math.max(0, c.x1),\n\t\tx2 = Math.min(c.x2, block.width) // apply clip so segment box doesn't go beyond block\n\ttk.cnv.g\n\t\t.append('rect')\n\t\t.attr('x', x1)\n\t\t.attr('y', y)\n\t\t.attr('width', x2 - x1)\n\t\t.attr('height', Math.max(rowheight, 1))\n\t\t.attr('fill', Number.isFinite(c.value) ? tk.cnv.colorScale(c.value) : mclass[c.class].color)\n\t\t.on('mouseover', event => {\n\t\t\tevent.target.setAttribute('stroke', 'black')\n\t\t\ttk.hovertip.clear().show(event.clientX, event.clientY)\n\t\t\tconst table = table2col({ holder: tk.hovertip.d })\n\t\t\ttable_cnv({ mlst: [c], tk }, table)\n\t\t\tif (sample) {\n\t\t\t\tconst [t1, t2] = table.addRow()\n\t\t\t\tt1.text('Sample')\n\t\t\t\tt2.text(sample.sample_id)\n\t\t\t}\n\t\t})\n\t\t.on('mouseout', event => {\n\t\t\tevent.target.setAttribute('stroke', '')\n\t\t\ttk.hovertip.hide()\n\t\t})\n\t\t.on('click', async event => {\n\t\t\t// TODO show more contents in click menu\n\t\t\ttk.itemtip.clear().show(event.clientX, event.clientY)\n\t\t\tawait itemtable_oneItem({\n\t\t\t\tmlst: [c],\n\t\t\t\ttk,\n\t\t\t\tblock,\n\t\t\t\tdiv: tk.itemtip.d\n\t\t\t})\n\n\t\t\treturn\n\n\t\t\tconst table = table2col({ holder: tk.itemtip.d })\n\t\t\tconst cnv = structuredClone(c)\n\n\t\t\tif (sample) {\n\t\t\t\t// tricky! sample is optional\n\t\t\t\tcnv.samples = [{ sample_id: sample.sample_id }]\n\t\t\t}\n\n\t\t\ttable_cnv({ mlst: [cnv], tk }, table, true)\n\t\t})\n}\n\n/* TODO sharable function.\nlst:\n\teach item {x1,x2}. on finish, .y=integer is assigned to every item as stack id, or row number\nspacing:\n\tmininum spacing width between items in one stack\n*/\nfunction stackRows(lst, spacing) {\n\tconst stacks = [] // each value is screen x position of a stack\n\tfor (const item of lst) {\n\t\tfor (let i = 0; i < stacks.length; i++) {\n\t\t\tif (stacks[i] + spacing < item.x1) {\n\t\t\t\t// falls into this stack\n\t\t\t\tstacks[i] = item.x2\n\t\t\t\titem.y = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!('y' in item)) {\n\t\t\t// item goes to a new stack\n\t\t\titem.y = stacks.length\n\t\t\tstacks.push(item.x2)\n\t\t}\n\t}\n}\n", "import { dofetch3 } from '#common/dofetch'\nimport { makeTk } from './makeTk'\nimport { may_render_skewer } from './skewer'\nimport { may_render_cnv } from './cnv'\nimport { make_leftlabels } from './leftlabel'\nimport { mclass, dtsnvindel, dtsv, dtfusionrna, dtcnv } from '#shared/common.js'\nimport { summarize_mclass } from '#shared/mds3tk.js'\nimport { unannotatedKey } from './legend'\n\n/*\nloadTk\n\tgetTkData\n\t\tdataFromCustomVariants\n\t\t\tmayDoLDoverlay\n\t\tgetParameter\n\t\t\trangequery_rglst\nrangequery_add_variantfilters\n\n********** properties attached to tkobj ************\n\n- callbackOnRender()\n- onClose()\n- allow2selectSamples{}\n- hardcodeCnvOnly=true:\n special case to only show cnv. used for gdc cnv tool which won't show anything other than cnv.\n\t this is intended to be supplied via pp react wrapper in GFF e.g. runpp({tklst[{hardcodeCnvOnly:true}]})\n this flag shouldn't be set in gdc ds, that will permanently disable skewer (lollipop and cnv tool are based on same ds)\n\t this mode will not allow reenabling snvindel, and will hide skewer-specific menu options\n\t this is similar to user \"show only\" cnv via legend option on a regular tk, but is reversible\n*/\n\nexport async function loadTk(tk, block) {\n\t/*\n\t */\n\n\tblock.tkcloakon(tk)\n\tblock.block_setheight()\n\n\ttry {\n\t\tif (!tk.mds || tk.uninitialized) {\n\t\t\t// missing .mds{}, run makeTk to initiate; only run once\n\t\t\t// or, when uninitialized=true, must rerun makeTk(). somehow this fixes an issue allowing custom and native tk to reappear by hiding-showing it in tkmenu\n\t\t\tawait makeTk(tk, block)\n\t\t}\n\n\t\tconst data = await getTkData(tk, block)\n\t\tif (tk.uninitialized) {\n\t\t\ttk.clear()\n\t\t\tdelete tk.uninitialized\n\t\t}\n\n\t\t// render each possible track type. if indeed rendered, return sub track height\n\n\t\t// left labels and skewer at same row, whichever taller\n\t\tmay_render_skewer(data, tk, block)\n\n\t\tmay_render_cnv(data, tk, block)\n\n\t\t// must render skewer first, then left labels\n\t\tawait make_leftlabels(data, tk, block)\n\n\t\t////////// add new subtrack type\n\n\t\t// done tk rendering, adjust height\n\t\ttk._finish(data)\n\t} catch (e) {\n\t\tif (tk.clear) tk.clear() // if the error is thrown upon initiating the track, clear() function may not have been added\n\t\tif (tk.subtk2height) tk.subtk2height.skewer = 50 // allow for enough tk.height_main to show err msg\n\t\tif (tk._finish) tk._finish({ error: e.message || e })\n\t\tif (e.stack) console.log(e.stack)\n\t\treturn\n\t}\n}\n\nfunction getParameter(tk, block) {\n\t// to get data for current view range\n\n\tconst par = {\n\t\tgenome: block.genome.name,\n\t\t// instructs server to return data types associated with tracks\n\t\t// including skewer or non-skewer\n\t\tforTrack: 1,\n\t\t// may not pass skewerRim if it is not in use (turn off)\n\t\tskewerRim: tk.mds.queries?.snvindel?.skewerRim, // instructions for counting rim counts per variant\n\t\thardcodeCnvOnly: tk.hardcodeCnvOnly\n\t}\n\n\tconst headers = { 'Content-Type': 'application/json', Accept: 'application/json' }\n\n\t/*\n\ttemporary change: \n\tdisable efficiency check and always issue data request, even when zooming in on same isoform (and the data are there)\n\tthis is to be able to let server properly count the number of samples with a mutation in the current range\n\tto address ui issue\n\n\tif (tk.uninitialized || !block.usegm || block.gmmode == 'genomic' || block.gmmodepast == 'genomic') {\n\t\t// assumption is that api will return the same amount of variants for different mode (protein/exon/splicerna)\n\t\t// so there's no need to re-request data in these modes (but not genomic mode)\n\t} else {\n\t\t// in gmmode and not first time loading the track,\n\t\t// do not request skewer data as all skewer data has already been loaded for current isoform\n\t\t// still need to request other track data e.g. cnvpileup\n\t}\n\t*/\n\n\t//if (tk.mds.has_skewer) {} // need to load skewer data\n\t// always set skewer=1 and do not depend on has_skewer to allow a ds with cnv-only to show tk\n\tpar.skewer = 1\n\n\tif (tk.set_id) {\n\t\t// quick fix!!!\n\t\tpar.set_id = tk.set_id\n\t}\n\tif (tk.filter0) {\n\t\t// expecting to be a simple filter such as\n\t\t// {\"op\":\"and\",\"content\":[{\"op\":\"in\",\"content\":{\"field\":\"cases.project.project_id\",\"value\":[\"TCGA-BRCA\"]}}]}\n\t\tpar.filter0 = tk.filter0\n\t}\n\tif (tk.filterObj) {\n\t\t// json filter object\n\t\tif (tk.filterObj?.lst.length) {\n\t\t\t// when user deletes the only tvs from the filter ui, the lst[] will be empty and can cause issue in backend\n\t\t\tpar.filterObj = tk.filterObj\n\t\t}\n\t}\n\n\tif (tk.token) {\n\t\t// quick fix for testing with gdc token, which is supplied as url parameter; token is added to http header in adhoc way as dofetch() doesn't handle adhoc token\n\t\t// this method is not used in production\n\t\theaders['X-Auth-Token'] = tk.token\n\t}\n\n\tif (tk.mds.label) {\n\t\t// official\n\t\tpar.dslabel = tk.mds.label\n\t} else {\n\t\t// should be custom track with data files on backend\n\t\tif (tk.bcf) {\n\t\t\tif (tk.bcf.file) {\n\t\t\t\tpar.bcffile = tk.bcf.file\n\t\t\t} else if (tk.bcf.url) {\n\t\t\t\tpar.bcfurl = tk.bcf.url\n\t\t\t\tif (tk.bcf.indexURL) par.bcfindexURL = tk.bcf.indexURL\n\t\t\t} else {\n\t\t\t\tthrow '.file and .url missing for tk.bcf{}'\n\t\t\t}\n\t\t}\n\t\t// add new file types\n\t}\n\n\t//rangequery_add_variantfilters(par, tk)\n\n\trangequery_rglst(tk, block, par)\n\n\tif (tk.legend?.mclass.hiddenvalues.size) {\n\t\t// contains mixture of mclass(str) and dt(int), pass json array instead of comma-joined string\n\t\tpar.hiddenmclasslst = JSON.stringify([...tk.legend.mclass.hiddenvalues])\n\t}\n\n\tif (tk.legend?.bcfInfo) {\n\t\t// add info fields to filter variants\n\t\tconst infoFilter = {}\n\t\tfor (const k in tk.legend.bcfInfo) {\n\t\t\tif (tk.legend.bcfInfo[k].hiddenvalues.size) {\n\t\t\t\tinfoFilter[k] = [...tk.legend.bcfInfo[k].hiddenvalues]\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(infoFilter).length) {\n\t\t\tpar.infoFilter = infoFilter\n\t\t}\n\t}\n\n\tif (tk.legend?.formatFilter) {\n\t\t// add format fields to filter samples\n\t\tconst filter = {}\n\t\tfor (const k in tk.legend.formatFilter) {\n\t\t\tif (tk.legend.formatFilter[k].hiddenvalues.size) {\n\t\t\t\tfilter[k] = [...tk.legend.formatFilter[k].hiddenvalues]\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(filter).length) {\n\t\t\tpar.formatFilter = filter\n\t\t}\n\t}\n\tif (tk.cnv) {\n\t\tif (tk.cnv.cnvMaxLength) par.cnvMaxLength = tk.cnv.cnvMaxLength\n\t\tif (tk.cnv.cnvGainCutoff) par.cnvGainCutoff = tk.cnv.cnvGainCutoff\n\t\tif (tk.cnv.cnvLossCutoff) par.cnvLossCutoff = tk.cnv.cnvLossCutoff\n\t\tpar.cnvDensity = {\n\t\t\twidth: block.width,\n\t\t\tbarheight: tk.cnv.density.barheight,\n\t\t\tpcolor: tk.cnv.gainColor,\n\t\t\tncolor: tk.cnv.lossColor\n\t\t}\n\t}\n\treturn [par, headers]\n}\n\n/*\nabstract various data sources\n\nreturned data{}:\n\n.skewer[]\n\tlist of data points to show as skewer plot\n.mclass2variantcount[]\n\tmclass breakdown of skewer[]\n*/\nasync function getTkData(tk, block) {\n\tlet data\n\tif (tk.custom_variants) {\n\t\t// has custom data on client side, no need to request from server\n\t\tdata = await dataFromCustomVariants(tk, block)\n\t} else {\n\t\t// request data from server, either official or custom sources\n\t\tconst [body, headers] = getParameter(tk, block)\n\t\tdata = await dofetch3('mds3', { body, headers })\n\t}\n\tif (data.error) throw data.error\n\treturn data\n}\n\nexport function rangequery_rglst(tk, block, par) {\n\t// adds new key:value pairs to par{} and makes no return\n\tif (typeof par != 'object') throw 'par{} is not object'\n\tlet rglst = []\n\tif (block.usegm) {\n\t\t/* to merge par.rglst[] into one region\n\t\tthis does not apply to subpanels\n\t\t*/\n\t\tconst r = {\n\t\t\tchr: block.rglst[0].chr,\n\t\t\treverse: block.rglst[0].reverse,\n\t\t\twidth: 0,\n\t\t\tstart: null,\n\t\t\tstop: null\n\t\t}\n\t\tfor (let i = block.startidx; i <= block.stopidx; i++) {\n\t\t\tconst j = block.rglst[i]\n\t\t\tr.width += j.width + block.regionspace\n\t\t\tr.start = r.start == null ? j.start : Math.min(r.start, j.start)\n\t\t\tr.stop = r.stop == null ? j.stop : Math.max(r.stop, j.stop)\n\t\t}\n\t\trglst.push(r)\n\t\tif (block.gmmode == 'genomic') {\n\t\t\t// in genomic mode for a gene. do not pass isoform and force backend to query via \"byrange{}\" rather than byisoform which incorrectly limits result to those on isoform but not region\n\t\t} else {\n\t\t\tpar.isoform = block.usegm.isoform\n\t\t\tpar.gene = block.usegm.name\n\t\t}\n\t} else {\n\t\trglst = block.tkarg_rglst(tk)\n\t}\n\t// append xoff to each r from block\n\tlet xoff = 0\n\tfor (const r of rglst) {\n\t\tr.xoff = 0\n\t\txoff += r.width + block.regionspace\n\t}\n\n\tif (block.subpanels.length == tk.subpanels.length) {\n\t\t/*\n\t\tmust wait when subpanels are added to tk\n\t\tthis is only done when block finishes loading data for main tk\n\t\t*/\n\t\tfor (const r of block.subpanels) {\n\t\t\trglst.push({\n\t\t\t\tchr: r.chr,\n\t\t\t\tstart: r.start,\n\t\t\t\tstop: r.stop,\n\t\t\t\twidth: r.width,\n\t\t\t\texonsf: r.exonsf,\n\t\t\t\txoff: xoff\n\t\t\t})\n\t\t\txoff += r.width + r.leftpad\n\t\t}\n\t}\n\tpar.rglst = rglst\n\tpar.regionspace = block.regionspace\n\tpar.devicePixelRatio = window.devicePixelRatio > 1 ? window.devicePixelRatio : 1\n}\n\nfunction rangequery_add_variantfilters(par, tk) {\n\t/*\n\ttodo\nmay add filter parameter for range query\nby info_fields[] and variantcase_fields[]\n*/\n\tif (tk.info_fields) {\n\t\tpar.info_fields = tk.info_fields.reduce((lst, i) => {\n\t\t\tif (i.isfilter) {\n\t\t\t\tif (i.iscategorical) {\n\t\t\t\t\t// for categorical term, always register in parameter\n\t\t\t\t\t// server will collect #variants for each category\n\t\t\t\t\tconst j = {\n\t\t\t\t\t\tkey: i.key,\n\t\t\t\t\t\tiscategorical: true,\n\t\t\t\t\t\tunannotated_ishidden: i.unannotated_ishidden,\n\t\t\t\t\t\thiddenvalues: {}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const v of i.values) {\n\t\t\t\t\t\tif (v.ishidden) j.hiddenvalues[v.key] = 1\n\t\t\t\t\t}\n\t\t\t\t\tlst.push(j)\n\t\t\t\t} else if (i.isinteger || i.isfloat) {\n\t\t\t\t\t// numerical\n\t\t\t\t\tif (i.isactivefilter) {\n\t\t\t\t\t\t// only apply when the numerical filter is in use\n\t\t\t\t\t\tlst.push({\n\t\t\t\t\t\t\tkey: i.key,\n\t\t\t\t\t\t\tisnumerical: true,\n\t\t\t\t\t\t\tmissing_value: i.missing_value,\n\t\t\t\t\t\t\trange: i.range\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t} else if (i.isflag) {\n\t\t\t\t\t// always register flag to collect counts\n\t\t\t\t\tlst.push({\n\t\t\t\t\t\tkey: i.key,\n\t\t\t\t\t\tisflag: true,\n\t\t\t\t\t\tremove_no: i.remove_no,\n\t\t\t\t\t\tremove_yes: i.remove_yes\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'unknown type of info filter'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lst\n\t\t}, [])\n\t}\n}\n\nasync function dataFromCustomVariants(tk, block) {\n\t// return the same data{} object as server queries\n\tconst data = {\n\t\t// these holder will contain subset of tk.custom_variants[] that are in view range\n\t\tskewer: [], // for non-cnv data\n\t\tcnv: {\n\t\t\tcnvs: [] // for cnv segments\n\t\t}\n\t\t// adds mclass2variantcount[] later\n\t}\n\n\t// must exclude out-of-range items, otherwise numeric mode rendering will break\n\tlet bbstart = null,\n\t\tbbstop\n\tfor (let i = block.startidx; i <= block.stopidx; i++) {\n\t\tif (bbstart == null) {\n\t\t\tbbstart = block.rglst[i].start\n\t\t\tbbstop = block.rglst[i].stop\n\t\t} else {\n\t\t\tbbstart = Math.min(bbstart, block.rglst[i].start)\n\t\t\tbbstop = Math.max(bbstop, block.rglst[i].stop)\n\t\t}\n\t}\n\n\tfor (const m of tk.custom_variants) {\n\t\tif (tk.legend?.bcfInfo) {\n\t\t\tlet skip = false\n\t\t\tfor (const infoKey in tk.legend.bcfInfo) {\n\t\t\t\tif (tk.legend.bcfInfo[infoKey].hiddenvalues?.size) {\n\t\t\t\t\tconst v = m.info?.[infoKey] || unannotatedKey\n\t\t\t\t\tif (tk.legend?.bcfInfo[infoKey].hiddenvalues.has(v)) {\n\t\t\t\t\t\tskip = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (skip) continue\n\t\t}\n\t\tif (m.dt == dtcnv) {\n\t\t\tif (m.chr != block.rglst[0].chr) continue\n\t\t\tif (Math.max(m.start, bbstart) > Math.min(m.stop, bbstop)) continue\n\t\t\tdata.cnv.cnvs.push(m)\n\t\t} else if (m.dt == dtsnvindel || m.dt == dtsv || m.dt == dtfusionrna) {\n\t\t\tif (m.chr != block.rglst[0].chr) continue // may not work for subpanel\n\t\t\tif (m.pos <= bbstart || m.pos >= bbstop) continue\n\n\t\t\t// guard against missing or invalid class from custom data\n\t\t\t// wrong values are silently converted to \"X\" for \"nonstandard\", which can alert user without needing a separate alert\n\t\t\tif (!m.class) m.class = 'X' // missing class\n\t\t\tif (!mclass[m.class]) m.class = 'X' // invalid class\n\n\t\t\tif (tk.legend?.mclass.hiddenvalues.has(m.class)) continue\n\n\t\t\tdata.skewer.push(m)\n\t\t} else {\n\t\t\tthrow 'unknown custom data dt'\n\t\t}\n\t}\n\n\tdata.mclass2variantcount = summarize_mclass([...data.skewer, ...data.cnv.cnvs])\n\n\tif (data.cnv.cnvs.length == 0) delete data.cnv // important to delete to avoid triggering cnv logic\n\n\t// count unique number of samples, if has such\n\tconst set = new Set()\n\tif (data.skewer?.some(i => i.samples)) {\n\t\t// has .samples[], get sample count\n\t\tfor (const m of data.skewer) {\n\t\t\tif (m.samples) {\n\t\t\t\tfor (const s of m.samples) set.add(s.sample_id)\n\t\t\t}\n\t\t}\n\t}\n\tif (data.cnv?.cnvs?.some(i => i.samples)) {\n\t\tfor (const m of data.cnv.cnvs) {\n\t\t\tif (m.samples) {\n\t\t\t\tfor (const s of m.samples) set.add(s.sample_id)\n\t\t\t}\n\t\t}\n\t}\n\tif (set.size) data.sampleTotalNumber = set.size\n\n\t// a special arrangment to do ld overlay on the custom variants via the official dataset\n\tawait mayDoLDoverlay(tk, data.skewer)\n\n\treturn data\n}\n\nasync function mayDoLDoverlay(tk) {\n\tif (!tk.mds.queries?.ld?.mOverlay) return\n\tif (!tk.mds.termdb?.vocabApi) return\n\tdelete tk.mds.queries.ld.mOverlay.data // delete previous data\n\tconst data = await tk.mds.termdb.vocabApi.getLDdata(tk.mds.queries.ld.mOverlay.ldtkname, tk.mds.queries.ld.mOverlay.m)\n\tif (data.error || !Array.isArray(data.lst)) return\n\ttk.mds.queries.ld.mOverlay.data = data.lst // register returned data to be used\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["event", "td1", "td2", "event", "event", "d", "event", "m", "event", "disclabelspacing", "middlealignshift", "labyspace", "labyspace", "disclabelspacing", "m", "event", "middlealignshift", "mlst", "event", "i", "event", "tk", "hits", "format", "event"]
7
+ }