@sjcrh/proteinpaint-client 2.207.1 → 2.208.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (919) hide show
  1. package/dist/2dmaf-PN5YS362.js +1367 -0
  2. package/dist/AggMatrixInput-NJHU4FU2.js +406 -0
  3. package/dist/AggMatrixInput-NJHU4FU2.js.map +7 -0
  4. package/dist/AggregateMatrix-IBWOJWOC.js +41 -0
  5. package/dist/AppHeader-XV6S7GG5.js +830 -0
  6. package/dist/BoxPlot-ZIVA55SK.js +1211 -0
  7. package/dist/CorrelationVolcano-33I4FC44.js +617 -0
  8. package/dist/CorrelationVolcano-33I4FC44.js.map +7 -0
  9. package/dist/Cuminc-WKY35UGV.js +1219 -0
  10. package/dist/DE-E256DHID.js +89 -0
  11. package/dist/DEinput-YU3W72K7.js +499 -0
  12. package/dist/DM-W7PXTIKY.js +90 -0
  13. package/dist/DifferentialAnalysis-SHMQHWJL.js +236 -0
  14. package/dist/DifferentialAnalysis-SHMQHWJL.js.map +7 -0
  15. package/dist/Disco-OZY5GW2Z.js +3389 -0
  16. package/dist/Disco.UI-NRALEYXK.js +243 -0
  17. package/dist/DmrPlot-QKUX5XUW.js +637 -0
  18. package/dist/GB-ZYH7PGHT.js +1391 -0
  19. package/dist/GSEA-VQTD4MLY.js +851 -0
  20. package/dist/GeneExpInput-XEFUTLFU.js +42 -0
  21. package/dist/Geomap-GEK7UEDU.js +84 -0
  22. package/dist/HicApp-ZY7UHV5H.js +2245 -0
  23. package/dist/IDCViewer-YNKG4V46.js +10812 -0
  24. package/dist/NumBinaryEditor-NEL727DX.js +279 -0
  25. package/dist/NumBinaryEditor.unit.spec-GCGZMJYF.js +312 -0
  26. package/dist/NumContEditor-IM6RRDGU.js +105 -0
  27. package/dist/NumContEditor.unit.spec-B5AJXANS.js +164 -0
  28. package/dist/NumCustomBinEditor-EZT5DRKP.js +33 -0
  29. package/dist/NumCustomBinEditor.unit.spec-KLUDS6TH.js +397 -0
  30. package/dist/NumDiscreteEditor-2M6Q5AAZ.js +170 -0
  31. package/dist/NumDiscreteEditor.unit.spec-2JYZYJUX.js +233 -0
  32. package/dist/NumRegularBinEditor-AQDHA2PU.js +33 -0
  33. package/dist/NumRegularBinEditor.unit.spec-62BYFNYG.js +278 -0
  34. package/dist/NumSplineEditor-6Y5TZSTO.js +210 -0
  35. package/dist/NumSplineEditor.unit.spec-S65AV5EK.js +224 -0
  36. package/dist/NumericDensity-5ES4SDWZ.js +33 -0
  37. package/dist/NumericDensity.unit.spec-J6KZSE2P.js +418 -0
  38. package/dist/NumericHandler-ZTLDPP2F.js +34 -0
  39. package/dist/NumericHandler.unit.spec-BZFBVHGU.js +214 -0
  40. package/dist/ProteomeInput-IKEXPCGV.js +388 -0
  41. package/dist/Regression-6F6YP3AX.js +1416 -0
  42. package/dist/RunChart2-CVRPXQH5.js +749 -0
  43. package/dist/SC-FPXVXBXF.js +1175 -0
  44. package/dist/SC-FPXVXBXF.js.map +7 -0
  45. package/dist/Violin-BAS6DQHL.js +1081 -0
  46. package/dist/Violin-BAS6DQHL.js.map +7 -0
  47. package/dist/Volcano-FCCWUMX7.js +1649 -0
  48. package/dist/Wsi-3YTFABWG.js +629 -0
  49. package/dist/Wsi-3YTFABWG.js.map +7 -0
  50. package/dist/adSandbox-QYIG6637.js +33 -0
  51. package/dist/animatedBubbleChart-X53PR73H.js +547 -0
  52. package/dist/app-HJLTRZPI.js +32 -0
  53. package/dist/app-MGY6A4DM.js +42 -0
  54. package/dist/app.js +14 -14
  55. package/dist/bam-VRQHRCP5.js +876 -0
  56. package/dist/barchart-TWMOUZFL.js +42 -0
  57. package/dist/barchart2-CV7RMMRG.js +309 -0
  58. package/dist/block-L53P4UGQ.js +6249 -0
  59. package/dist/block.init-XYOJTXKP.js +33 -0
  60. package/dist/block.mds.expressionrank-77FSBDHA.js +354 -0
  61. package/dist/block.mds.geneboxplot-4TSYV4WS.js +823 -0
  62. package/dist/block.mds.junction-P4MYDET6.js +1539 -0
  63. package/dist/block.mds.svcnv-CYOFAS2T.js +6796 -0
  64. package/dist/block.svg-IT3ELCF4.js +159 -0
  65. package/dist/block.tk.aicheck-GULHJLV5.js +278 -0
  66. package/dist/block.tk.ase-RW5YL6HN.js +360 -0
  67. package/dist/block.tk.bam-MPGQW6KB.js +1901 -0
  68. package/dist/block.tk.bedgraphdot-EYRY374P.js +379 -0
  69. package/dist/block.tk.bigwig.ui-BKSXCDNM.js +206 -0
  70. package/dist/block.tk.hicstraw-76PV6NM3.js +818 -0
  71. package/dist/block.tk.junction-Z52QHQJQ.js +2358 -0
  72. package/dist/block.tk.junction.textmatrixui-K32OOTZC.js +194 -0
  73. package/dist/block.tk.ld-DDGLRHPO.js +94 -0
  74. package/dist/block.tk.menu-MO6TESKI.js +1024 -0
  75. package/dist/block.tk.pgv-AKLKKSEP.js +938 -0
  76. package/dist/brainImaging-KSTJQJAB.js +555 -0
  77. package/dist/brainRegions-WCRMMSK4.js +217 -0
  78. package/dist/bubbleHeatmap-4YOQ3BAB.js +378 -0
  79. package/dist/cellTypeBubbleHeatmap-O6YZ2RW4.js +278 -0
  80. package/dist/chunk-3GUVLDUS.js +299 -0
  81. package/dist/chunk-3PQDD5HM.js +446 -0
  82. package/dist/chunk-3WYUHDDP.js +1986 -0
  83. package/dist/chunk-4C7MA5Q3.js +158 -0
  84. package/dist/chunk-4EZLVENZ.js +1612 -0
  85. package/dist/chunk-4EZLVENZ.js.map +7 -0
  86. package/dist/chunk-4PB5ZEOB.js +102 -0
  87. package/dist/chunk-5IMFPVGT.js +119 -0
  88. package/dist/chunk-6DPELKO5.js +518 -0
  89. package/dist/chunk-6HGTVMZM.js +54 -0
  90. package/dist/chunk-6HGTVMZM.js.map +7 -0
  91. package/dist/chunk-72P6O537.js +1731 -0
  92. package/dist/chunk-72P6O537.js.map +7 -0
  93. package/dist/chunk-74C6G6JD.js +397 -0
  94. package/dist/chunk-A7TXS6JR.js +276 -0
  95. package/dist/chunk-AAJXHERO.js +123 -0
  96. package/dist/chunk-AVS4IXEA.js +692 -0
  97. package/dist/chunk-AVS4IXEA.js.map +7 -0
  98. package/dist/chunk-BFXZBZEV.js +176 -0
  99. package/dist/chunk-BGVGN73F.js +480 -0
  100. package/dist/chunk-BL7EYUZC.js +6360 -0
  101. package/dist/chunk-BPGZUNLL.js +274 -0
  102. package/dist/chunk-CPIPN5F6.js +141 -0
  103. package/dist/chunk-D5MSWPAZ.js +217 -0
  104. package/dist/chunk-DFT2PAIU.js +243 -0
  105. package/dist/chunk-DMWOK4DS.js +178 -0
  106. package/dist/chunk-DMWOK4DS.js.map +7 -0
  107. package/dist/chunk-E7NVJ44Z.js +263 -0
  108. package/dist/chunk-EMMGUSJB.js +54 -0
  109. package/dist/chunk-G3CCQOLH.js +240 -0
  110. package/dist/chunk-GGQVDHYF.js +379 -0
  111. package/dist/chunk-GMRIEUBW.js +408 -0
  112. package/dist/chunk-GMRIEUBW.js.map +7 -0
  113. package/dist/chunk-GPZYAJQH.js +2676 -0
  114. package/dist/chunk-GS6ZMPKP.js +272 -0
  115. package/dist/chunk-GUXKLMLM.js +102 -0
  116. package/dist/chunk-HELEV3LT.js +2853 -0
  117. package/dist/chunk-HKKTNIMX.js +339 -0
  118. package/dist/chunk-HKSRIEWJ.js +26 -0
  119. package/dist/chunk-IELQ3HMN.js +70 -0
  120. package/dist/chunk-IISNWG4X.js +103 -0
  121. package/dist/chunk-J7KB2MH3.js +34 -0
  122. package/dist/chunk-JEJV7V7M.js +2327 -0
  123. package/dist/chunk-JIZ3B32T.js +626 -0
  124. package/dist/chunk-KAY2ODXX.js +38 -0
  125. package/dist/chunk-KJM6PLXM.js +5071 -0
  126. package/dist/chunk-KZHF3MQX.js +1278 -0
  127. package/dist/chunk-MC674TS2.js +194 -0
  128. package/dist/chunk-MLKQZ3RL.js +1339 -0
  129. package/dist/chunk-MSSPT5YM.js +550 -0
  130. package/dist/chunk-N6IWVSFP.js +4375 -0
  131. package/dist/chunk-N6IWVSFP.js.map +7 -0
  132. package/dist/chunk-NBGVEZNX.js +56 -0
  133. package/dist/chunk-NBGVEZNX.js.map +7 -0
  134. package/dist/chunk-OBBR4UYN.js +54 -0
  135. package/dist/chunk-PQA3C2NY.js +294 -0
  136. package/dist/chunk-QJ2VBXFB.js +134 -0
  137. package/dist/chunk-QJ3HYZH3.js +24772 -0
  138. package/dist/chunk-QJ3HYZH3.js.map +7 -0
  139. package/dist/chunk-QP7EJXSU.js +55 -0
  140. package/dist/chunk-QUHXX7JE.js +56 -0
  141. package/dist/chunk-QUHXX7JE.js.map +7 -0
  142. package/dist/chunk-REPQKF5L.js +182 -0
  143. package/dist/chunk-REPQKF5L.js.map +7 -0
  144. package/dist/chunk-SHXJW27D.js +2784 -0
  145. package/dist/chunk-SUNDNTVY.js +302 -0
  146. package/dist/chunk-TSI4W6XO.js +98 -0
  147. package/dist/chunk-TXIQ5PHR.js +468 -0
  148. package/dist/chunk-U45R6QNT.js +562 -0
  149. package/dist/chunk-UMZJQWWK.js +1233 -0
  150. package/dist/chunk-VMRO6DMC.js +2140 -0
  151. package/dist/chunk-VMRO6DMC.js.map +7 -0
  152. package/dist/chunk-VO7Q4WMM.js +55 -0
  153. package/dist/chunk-VWGRKOVJ.js +170 -0
  154. package/dist/chunk-WCTKHF5T.js +197 -0
  155. package/dist/chunk-WOMERKMR.js +31 -0
  156. package/dist/chunk-WXX2YD4Q.js +59 -0
  157. package/dist/chunk-X44AR557.js +382 -0
  158. package/dist/chunk-XEU5HXOY.js +783 -0
  159. package/dist/chunk-XGYQZHNX.js +281 -0
  160. package/dist/chunk-XOND7UIK.js +49 -0
  161. package/dist/chunk-XRMUUWLS.js +339 -0
  162. package/dist/chunk-XTOGCXPD.js +129 -0
  163. package/dist/chunk-Y5BBFDC3.js +14 -0
  164. package/dist/chunk-Z2FSHODI.js +203 -0
  165. package/dist/cohort-JWIQOO7U.js +70 -0
  166. package/dist/condition-ZUAQYF5C.js +327 -0
  167. package/dist/controls-ZPQ6SXD2.js +34 -0
  168. package/dist/controls.config-NELL5HY5.js +34 -0
  169. package/dist/correlation-2X76UI3K.js +95 -0
  170. package/dist/customdata.inputui-V6QIGFRP.js +284 -0
  171. package/dist/dataDownload-NSDY4MSL.js +329 -0
  172. package/dist/databrowser.ui-DDLFQB6K.js +425 -0
  173. package/dist/dictionary-WSDD6TFI.js +113 -0
  174. package/dist/dnaMethylation-3IM4OACZ.js +33 -0
  175. package/dist/dnaMethylation.integration.spec-5CSJA67S.js +198 -0
  176. package/dist/dofetch-GZ7POIBV.js +48 -0
  177. package/dist/e2pca-AX7U2DOI.js +344 -0
  178. package/dist/ep-UKACHFJU.js +1249 -0
  179. package/dist/expclust.gdc.spec-46HDKH2Q.js +302 -0
  180. package/dist/facet-3EONZDDE.js +519 -0
  181. package/dist/gb-W7GX5NWS.js +81 -0
  182. package/dist/geneExpClustering-PJA6Y5GW.js +244 -0
  183. package/dist/geneExpression-EMLVPVNK.js +310 -0
  184. package/dist/geneExpression-JMGYBT53.js +33 -0
  185. package/dist/geneExpression.unit.spec-DDZVZJVC.js +128 -0
  186. package/dist/geneORA-CIAFQQWB.js +273 -0
  187. package/dist/geneRanking-JRAU6FMJ.js +548 -0
  188. package/dist/geneVariant-3DZTWQFG.js +36 -0
  189. package/dist/geneVariant-YWURIZ72.js +286 -0
  190. package/dist/geneVariant.integration.spec-V3KECZMM.js +489 -0
  191. package/dist/genefusion.ui-AO3TUDTL.js +303 -0
  192. package/dist/geneset-RCIP2GZH.js +203 -0
  193. package/dist/genomeBrowser.spec-7PZCNBL3.js +276 -0
  194. package/dist/grin2-EUBCNH4Q.js +70 -0
  195. package/dist/grin2-YYBB5XJK.js +1137 -0
  196. package/dist/hierCluster-AV5NO2GW.js +59 -0
  197. package/dist/hierCluster-W2MVN34V.js +55 -0
  198. package/dist/hierCluster.config-4MBWG6RZ.js +36 -0
  199. package/dist/hierCluster.integration.spec-JUIBIUKH.js +483 -0
  200. package/dist/hierCluster.interactivity-6PJE64PF.js +49 -0
  201. package/dist/hierCluster.renderers-RWDQ5SHY.js +19 -0
  202. package/dist/imagePlot-XLDQNUJA.js +156 -0
  203. package/dist/importPlot-7FISAQKR.js +8 -0
  204. package/dist/isoformExpression-WOQAOVZS.js +35 -0
  205. package/dist/isoformExpression.unit.spec-BMEGJNCO.js +237 -0
  206. package/dist/junction-6NO36IPU.js +36 -0
  207. package/dist/junction.customTerm-N6JAOWZO.js +16 -0
  208. package/dist/junction.unit.spec-UKGSQHO4.js +182 -0
  209. package/dist/launch.adhoc-42PUNEA6.js +37 -0
  210. package/dist/leftlabel.sample-EXAUDPSB.js +258 -0
  211. package/dist/lollipop-4ASTA5HO.js +166 -0
  212. package/dist/maf-HPXANL3M.js +455 -0
  213. package/dist/maftimeline-2SXFX3HF.js +587 -0
  214. package/dist/matrix-DX4W5XMX.js +59 -0
  215. package/dist/matrix-S34ITAPJ.js +54 -0
  216. package/dist/matrix.cells-BLULUGSZ.js +26 -0
  217. package/dist/matrix.config-Z3LWYH74.js +37 -0
  218. package/dist/matrix.data-73HY7Y2V.js +23 -0
  219. package/dist/matrix.groups-NOUMYNFY.js +26 -0
  220. package/dist/matrix.integration.spec-VTXYJ46U.js +3160 -0
  221. package/dist/matrix.interactivity-YHDIO5A2.js +37 -0
  222. package/dist/matrix.layout-25HYKUF2.js +39 -0
  223. package/dist/matrix.legend-IMK7DH4V.js +20 -0
  224. package/dist/matrix.renderers-3RZRN6HO.js +34 -0
  225. package/dist/matrix.serieses-ZTVHQ7QA.js +19 -0
  226. package/dist/matrix.sort-EDXHT6NZ.js +26 -0
  227. package/dist/matrix.sort.unit.spec-LSNY7PHU.js +468 -0
  228. package/dist/matrix.sorterUi-3DRNHG5Z.js +16 -0
  229. package/dist/matrix.sorterUi.unit.spec-GNIIWGRJ.js +338 -0
  230. package/dist/matrix.unit.spec-7A6ZFRXI.js +150 -0
  231. package/dist/mavb-M5AXPLYX.js +727 -0
  232. package/dist/mds.fimo-QE5OFA22.js +513 -0
  233. package/dist/mds.samplescatterplot-664EOHX2.js +1545 -0
  234. package/dist/mds.survivalplot-H4TJD44D.js +477 -0
  235. package/dist/multivalue-JD3CNQJR.js +83 -0
  236. package/dist/numericDictTermCluster-XPKEYXD7.js +63 -0
  237. package/dist/oncomatrix-TX5PZQ76.js +290 -0
  238. package/dist/oncomatrix.spec-6X2WAHL7.js +443 -0
  239. package/dist/plot.2dvaf-5OHUFTMK.js +372 -0
  240. package/dist/plot.app-XIVVJHWG.js +36 -0
  241. package/dist/plot.barplot-PSODLAXD.js +97 -0
  242. package/dist/plot.boxplot-W3ASYFOG.js +146 -0
  243. package/dist/plot.brainImaging-JGDLKLR7.js +51 -0
  244. package/dist/plot.disco-TPMXTTZK.js +99 -0
  245. package/dist/plot.ssgq-KIZIOZIF.js +134 -0
  246. package/dist/plot.vaf2cov-MSMW72IY.js +253 -0
  247. package/dist/polar2-LA4MSRRN.js +232 -0
  248. package/dist/profileForms-BJRNB2ZF.js +941 -0
  249. package/dist/profilePlot-DDO53C4T.js +49 -0
  250. package/dist/proteinView-NFUR42XQ.js +1357 -0
  251. package/dist/proteomeCohortCompare-OZVF3X66.js +912 -0
  252. package/dist/pseudbulk.unit.spec-RY72JF7A.js +86 -0
  253. package/dist/pseudbulk.unit.spec-RY72JF7A.js.map +7 -0
  254. package/dist/pseudobulk-UVT5G2VL.js +35 -0
  255. package/dist/qualitative-X3VXNC7X.js +38 -0
  256. package/dist/radar2-RTVUJ3AN.js +327 -0
  257. package/dist/radarFacility2-ZGLZ5AKM.js +335 -0
  258. package/dist/rememberedGvQ.unit.spec-RLLLWU5M.js +211 -0
  259. package/dist/render-LR5BOYW6.js +33 -0
  260. package/dist/report-37W5OXUM.js +217 -0
  261. package/dist/sampleView-BDC2WPH7.js +43 -0
  262. package/dist/samplelst-V2EIVZC5.js +106 -0
  263. package/dist/samplematrix-XOSKILUL.js +2193 -0
  264. package/dist/sc-ZVZPWQY7.js +81 -0
  265. package/dist/scatter-2ZE5MCYH.js +88 -0
  266. package/dist/scatter-ZOWFPGIS.js +925 -0
  267. package/dist/scatter-ZOWFPGIS.js.map +7 -0
  268. package/dist/selectGenomeWithTklst-EF7WYEAJ.js +129 -0
  269. package/dist/singleCellCellType-TKCGC3G3.js +33 -0
  270. package/dist/singleCellCellType.unit.spec-JZ6UHC5F.js +154 -0
  271. package/dist/singleCellGeneExpression-I2INGXGI.js +33 -0
  272. package/dist/singleCellGeneExpression.unit.spec-KL77FSHZ.js +148 -0
  273. package/dist/singleCellNumericValue-2X5NCEHL.js +33 -0
  274. package/dist/singleCellNumericValue.unit.spec-OUDBX5MY.js +416 -0
  275. package/dist/singleCellNumericValue.unit.spec-OUDBX5MY.js.map +7 -0
  276. package/dist/singleCellPlot-Q6INE54V.js +48 -0
  277. package/dist/singlecell-5N2P5ZAT.js +81 -0
  278. package/dist/singlecell-NPSWMNI3.js +1566 -0
  279. package/dist/snp-2WPJYPDE.js +33 -0
  280. package/dist/snp.unit.spec-PPWIIOX6.js +171 -0
  281. package/dist/snplocus-T3HZFZWA.js +203 -0
  282. package/dist/spliceevent.a53ss.diagram-APCF4LV5.js +146 -0
  283. package/dist/spliceevent.exonskip.diagram-TT5JGBSC.js +278 -0
  284. package/dist/spliceevent.noeventdiagram-CPXQSX3Z.js +455 -0
  285. package/dist/ssGSEA-FSX6P7HA.js +33 -0
  286. package/dist/ssGSEA.unit.spec-TXYT665R.js +83 -0
  287. package/dist/stattable-BD64SFYV.js +117 -0
  288. package/dist/studyCatalog-6BOWO4PO.js +414 -0
  289. package/dist/summarizeCnvGeneexp-AMLYJIPU.js +158 -0
  290. package/dist/summarizeGeneexpSurvival-IDM7T333.js +105 -0
  291. package/dist/summarizeMutationCnv-R6SYSJQC.js +159 -0
  292. package/dist/summarizeMutationDiagnosis-XZJ4JLW2.js +35 -0
  293. package/dist/summarizeMutationSurvival-ABJ5RL4L.js +99 -0
  294. package/dist/summary-NVYCTE6P.js +44 -0
  295. package/dist/summary.integration.spec-SSLTLVNW.js +409 -0
  296. package/dist/summaryInput-SJOZETRP.js +242 -0
  297. package/dist/sunburst-RU5ZPJKW.js +278 -0
  298. package/dist/survival-BHJQMXKI.js +53 -0
  299. package/dist/survival-DVG6Y2FV.js +1248 -0
  300. package/dist/survival.integration.spec-OJUPTY5N.js +613 -0
  301. package/dist/survival.integration.spec-OJUPTY5N.js.map +7 -0
  302. package/dist/svgraph-ETFA4GRX.js +1382 -0
  303. package/dist/svmr-AI3RU4JK.js +3837 -0
  304. package/dist/table-YCTSMLQL.js +197 -0
  305. package/dist/termCollection-GMKEZR6D.js +252 -0
  306. package/dist/termCollection-VEVKKJZD.js +33 -0
  307. package/dist/termCollection.unit.spec-EU6YCEPX.js +299 -0
  308. package/dist/termCollectionFractionSelection-UBS74X36.js +42 -0
  309. package/dist/termCollectionFractionSelection.unit.spec-Y5OJFGDD.js +188 -0
  310. package/dist/tk-HMF4HCNV.js +1121 -0
  311. package/dist/tk-W6Z4FJMW.js +41 -0
  312. package/dist/tp.ui-NECRDJCS.js +1454 -0
  313. package/dist/tvs.dt-2JEH3F35.js +34 -0
  314. package/dist/tvs.dtcnv.categorical-YBXKEBR2.js +35 -0
  315. package/dist/tvs.dtcnv.continuous-AD3SJ6BY.js +67 -0
  316. package/dist/tvs.dtfusion-ODI3CLQS.js +35 -0
  317. package/dist/tvs.dtitd-V3LYLPJY.js +35 -0
  318. package/dist/tvs.dtsnvindel-R3V5LTNL.js +35 -0
  319. package/dist/tvs.dtsv-ZQLKEDLJ.js +35 -0
  320. package/dist/tvs.samplelst-G25A7HM6.js +98 -0
  321. package/dist/tvs.termCollection-WLVCWDEJ.js +124 -0
  322. package/dist/vocabulary-6K537FJM.js +36 -0
  323. package/dist/vocabulary-6K537FJM.js.map +7 -0
  324. package/dist/wsi.direct-SNPPQPVO.js +8343 -0
  325. package/package.json +3 -3
  326. package/dist/2dmaf-32F56QBJ.js +0 -1367
  327. package/dist/AggMatrixInput-RDFMGV47.js +0 -277
  328. package/dist/AggMatrixInput-RDFMGV47.js.map +0 -7
  329. package/dist/AggregateMatrix-TPXNNWVD.js +0 -41
  330. package/dist/AppHeader-SEJXDJE3.js +0 -830
  331. package/dist/BoxPlot-LOAO2MDO.js +0 -1211
  332. package/dist/CorrelationVolcano-AU6ZAFPG.js +0 -614
  333. package/dist/CorrelationVolcano-AU6ZAFPG.js.map +0 -7
  334. package/dist/Cuminc-O533BXFY.js +0 -1219
  335. package/dist/DE-FDAUNOWU.js +0 -89
  336. package/dist/DEinput-TF2VYTIJ.js +0 -499
  337. package/dist/DM-42YN3OEO.js +0 -90
  338. package/dist/DifferentialAnalysis-H5NBPR3P.js +0 -237
  339. package/dist/DifferentialAnalysis-H5NBPR3P.js.map +0 -7
  340. package/dist/Disco-FGFHIKUR.js +0 -3389
  341. package/dist/Disco.UI-YGIU2JPM.js +0 -243
  342. package/dist/DmrPlot-EQFXMAW5.js +0 -637
  343. package/dist/GB-244UT5VU.js +0 -1391
  344. package/dist/GSEA-KXQBR3HH.js +0 -851
  345. package/dist/GeneExpInput-ZY6SHXTX.js +0 -42
  346. package/dist/Geomap-6ZV4AM23.js +0 -84
  347. package/dist/HicApp-4UHX2YGP.js +0 -2245
  348. package/dist/IDCViewer-AB6LLO64.js +0 -10812
  349. package/dist/NumBinaryEditor-CGSO2T4L.js +0 -279
  350. package/dist/NumBinaryEditor.unit.spec-3QHARZQJ.js +0 -312
  351. package/dist/NumContEditor-YLKSC4Y2.js +0 -105
  352. package/dist/NumContEditor.unit.spec-L3GC3ZTJ.js +0 -164
  353. package/dist/NumCustomBinEditor-K3XSFHCC.js +0 -33
  354. package/dist/NumCustomBinEditor.unit.spec-2FUHE6BX.js +0 -397
  355. package/dist/NumDiscreteEditor-RJCSIW4R.js +0 -170
  356. package/dist/NumDiscreteEditor.unit.spec-CUA6BOIS.js +0 -233
  357. package/dist/NumRegularBinEditor-C3VIFDS4.js +0 -33
  358. package/dist/NumRegularBinEditor.unit.spec-V2UJ5FLH.js +0 -278
  359. package/dist/NumSplineEditor-XBE7OV7P.js +0 -210
  360. package/dist/NumSplineEditor.unit.spec-CKRRI4US.js +0 -224
  361. package/dist/NumericDensity-ZL7UY7TL.js +0 -33
  362. package/dist/NumericDensity.unit.spec-CWTMSR56.js +0 -418
  363. package/dist/NumericHandler-56ENFMNK.js +0 -34
  364. package/dist/NumericHandler.unit.spec-3YW34TTJ.js +0 -214
  365. package/dist/ProteomeInput-HIS4GYWH.js +0 -388
  366. package/dist/Regression-C5GZYLEN.js +0 -1416
  367. package/dist/RunChart2-X5WKYLPQ.js +0 -749
  368. package/dist/SC-3Y5J65DT.js +0 -1107
  369. package/dist/SC-3Y5J65DT.js.map +0 -7
  370. package/dist/Violin-F3QS2EMJ.js +0 -1082
  371. package/dist/Violin-F3QS2EMJ.js.map +0 -7
  372. package/dist/Volcano-ZNYDKP2O.js +0 -1649
  373. package/dist/Wsi-B6EIGTI2.js +0 -609
  374. package/dist/Wsi-B6EIGTI2.js.map +0 -7
  375. package/dist/adSandbox-A52OQSOW.js +0 -33
  376. package/dist/animatedBubbleChart-OQOZ3WFK.js +0 -547
  377. package/dist/app-4KIKXQX4.js +0 -32
  378. package/dist/app-NZUNKWKK.js +0 -42
  379. package/dist/bam-SME7YD3E.js +0 -876
  380. package/dist/barchart-ESY6FOS4.js +0 -42
  381. package/dist/barchart2-XEJZGCES.js +0 -309
  382. package/dist/block-747IK2EW.js +0 -6249
  383. package/dist/block.init-ITZ42K43.js +0 -33
  384. package/dist/block.mds.expressionrank-Q63IJAJK.js +0 -354
  385. package/dist/block.mds.geneboxplot-EZIKAIKC.js +0 -823
  386. package/dist/block.mds.junction-TJXFKZ2Q.js +0 -1539
  387. package/dist/block.mds.svcnv-WSIEAII6.js +0 -6796
  388. package/dist/block.svg-CQX5W6R4.js +0 -159
  389. package/dist/block.tk.aicheck-J4MQ4BSD.js +0 -278
  390. package/dist/block.tk.ase-2JFNPWCZ.js +0 -360
  391. package/dist/block.tk.bam-RBQ4AXSQ.js +0 -1901
  392. package/dist/block.tk.bedgraphdot-ZQBOMVTO.js +0 -379
  393. package/dist/block.tk.bigwig.ui-U5IBO3VF.js +0 -206
  394. package/dist/block.tk.hicstraw-ZRZMFLLX.js +0 -818
  395. package/dist/block.tk.junction-7U7ABE4O.js +0 -2358
  396. package/dist/block.tk.junction.textmatrixui-AEXZ7W3U.js +0 -194
  397. package/dist/block.tk.ld-E7WPFL5P.js +0 -94
  398. package/dist/block.tk.menu-AITMEZTZ.js +0 -1024
  399. package/dist/block.tk.pgv-EDPZHI5L.js +0 -938
  400. package/dist/brainImaging-35LPNBDR.js +0 -555
  401. package/dist/brainRegions-JMTQT4X3.js +0 -217
  402. package/dist/bubbleHeatmap-FMBKMDUL.js +0 -378
  403. package/dist/cellTypeBubbleHeatmap-ZPTAGEWW.js +0 -278
  404. package/dist/chunk-2GBG3KA7.js +0 -129
  405. package/dist/chunk-2IVN5DWA.js +0 -302
  406. package/dist/chunk-36AAUYZE.js +0 -194
  407. package/dist/chunk-3K7AYA3M.js +0 -54
  408. package/dist/chunk-4JFFFGL3.js +0 -468
  409. package/dist/chunk-4KJSNR5E.js +0 -562
  410. package/dist/chunk-52QHIKH2.js +0 -2139
  411. package/dist/chunk-52QHIKH2.js.map +0 -7
  412. package/dist/chunk-5ALGKNTQ.js +0 -6360
  413. package/dist/chunk-5JCTTSV4.js +0 -480
  414. package/dist/chunk-5W7K7STT.js +0 -26
  415. package/dist/chunk-6CIGRV5K.js +0 -677
  416. package/dist/chunk-6CIGRV5K.js.map +0 -7
  417. package/dist/chunk-6U2OPC6J.js +0 -176
  418. package/dist/chunk-7AHTS4BP.js +0 -382
  419. package/dist/chunk-7HFAEB3C.js +0 -55
  420. package/dist/chunk-7HGZRJZZ.js +0 -98
  421. package/dist/chunk-A2ORIMUJ.js +0 -339
  422. package/dist/chunk-A32SGNCT.js +0 -1233
  423. package/dist/chunk-AKA6RWLC.js +0 -217
  424. package/dist/chunk-AMVZ6KT5.js +0 -240
  425. package/dist/chunk-ASXUC6SM.js +0 -54
  426. package/dist/chunk-BCO5T43J.js +0 -379
  427. package/dist/chunk-BDQPMVKD.js +0 -783
  428. package/dist/chunk-BOQZOLRA.js +0 -274
  429. package/dist/chunk-BSCMVKBP.js +0 -5071
  430. package/dist/chunk-BZN2O76M.js +0 -119
  431. package/dist/chunk-BZZZQFTI.js +0 -34
  432. package/dist/chunk-CRHGXVUQ.js +0 -272
  433. package/dist/chunk-D6AB63O3.js +0 -216
  434. package/dist/chunk-D6AB63O3.js.map +0 -7
  435. package/dist/chunk-DPQP2GUW.js +0 -626
  436. package/dist/chunk-EKQ7NYOU.js +0 -276
  437. package/dist/chunk-EUQEQOFE.js +0 -141
  438. package/dist/chunk-FKA55PHV.js +0 -281
  439. package/dist/chunk-GVLWCGXX.js +0 -397
  440. package/dist/chunk-HLVWCJRO.js +0 -518
  441. package/dist/chunk-HPAW7XDM.js +0 -178
  442. package/dist/chunk-HPAW7XDM.js.map +0 -7
  443. package/dist/chunk-IV57XNTG.js +0 -123
  444. package/dist/chunk-JMAFJKGG.js +0 -243
  445. package/dist/chunk-JZHRVYNS.js +0 -2676
  446. package/dist/chunk-K6YUMBDY.js +0 -55
  447. package/dist/chunk-L6WNBKYN.js +0 -158
  448. package/dist/chunk-LGR6CJTW.js +0 -2853
  449. package/dist/chunk-LOWJQFCC.js +0 -550
  450. package/dist/chunk-M5SYLBBC.js +0 -2327
  451. package/dist/chunk-MKAILEWO.js +0 -59
  452. package/dist/chunk-N4PDPZWQ.js +0 -4366
  453. package/dist/chunk-N4PDPZWQ.js.map +0 -7
  454. package/dist/chunk-OIJ6GRVS.js +0 -134
  455. package/dist/chunk-ONVIVITY.js +0 -203
  456. package/dist/chunk-OQX3HO46.js +0 -56
  457. package/dist/chunk-OQX3HO46.js.map +0 -7
  458. package/dist/chunk-OYLGAFFY.js +0 -31
  459. package/dist/chunk-P7DIIYCX.js +0 -197
  460. package/dist/chunk-PC4MFDHP.js +0 -24613
  461. package/dist/chunk-PC4MFDHP.js.map +0 -7
  462. package/dist/chunk-PGKOJYV6.js +0 -50
  463. package/dist/chunk-PGKOJYV6.js.map +0 -7
  464. package/dist/chunk-PPSWNLMG.js +0 -402
  465. package/dist/chunk-PPSWNLMG.js.map +0 -7
  466. package/dist/chunk-R624P2GE.js +0 -263
  467. package/dist/chunk-RBSAEAQV.js +0 -446
  468. package/dist/chunk-RUBZCKIX.js +0 -1608
  469. package/dist/chunk-RUBZCKIX.js.map +0 -7
  470. package/dist/chunk-RZ3KEFZ2.js +0 -339
  471. package/dist/chunk-SS66BHGA.js +0 -103
  472. package/dist/chunk-SU63FEY6.js +0 -294
  473. package/dist/chunk-SVC65ZPG.js +0 -102
  474. package/dist/chunk-TG3QBMDK.js +0 -102
  475. package/dist/chunk-TMXW5HVE.js +0 -1278
  476. package/dist/chunk-TPDBOH3A.js +0 -1339
  477. package/dist/chunk-U5RWKZVS.js +0 -1720
  478. package/dist/chunk-U5RWKZVS.js.map +0 -7
  479. package/dist/chunk-UYKZ5HXA.js +0 -1986
  480. package/dist/chunk-VOYUJJQ6.js +0 -70
  481. package/dist/chunk-W4RYRU5D.js +0 -38
  482. package/dist/chunk-WFSMIVJT.js +0 -2784
  483. package/dist/chunk-Y4PX2ECH.js +0 -299
  484. package/dist/chunk-YKM46UX5.js +0 -170
  485. package/dist/chunk-Z7AO6A7M.js +0 -14
  486. package/dist/chunk-ZENZ5H2Q.js +0 -49
  487. package/dist/cohort-Q7TW5XTY.js +0 -70
  488. package/dist/condition-H6LBUHIF.js +0 -327
  489. package/dist/controls-DWDKFDXY.js +0 -34
  490. package/dist/controls.config-KF7PHZSG.js +0 -34
  491. package/dist/correlation-YMSARIER.js +0 -95
  492. package/dist/customdata.inputui-KEFE7ZHS.js +0 -284
  493. package/dist/dataDownload-G7TGPFGL.js +0 -329
  494. package/dist/databrowser.ui-NFIIFQJZ.js +0 -425
  495. package/dist/dictionary-ERJQMALC.js +0 -113
  496. package/dist/dnaMethylation-KVCXKAU3.js +0 -33
  497. package/dist/dnaMethylation.integration.spec-3NXGGG4J.js +0 -198
  498. package/dist/dofetch-YRWLEQEH.js +0 -48
  499. package/dist/e2pca-M2F2CI6I.js +0 -344
  500. package/dist/ep-QAEG4RV4.js +0 -1249
  501. package/dist/expclust.gdc.spec-P77T6JR2.js +0 -302
  502. package/dist/facet-LJTSTASE.js +0 -519
  503. package/dist/gb-KSB2DQHH.js +0 -81
  504. package/dist/geneExpClustering-KHDCPE65.js +0 -244
  505. package/dist/geneExpression-AWWMOUAR.js +0 -310
  506. package/dist/geneExpression-Z2EDR6EN.js +0 -33
  507. package/dist/geneExpression.unit.spec-WB2ESPKT.js +0 -128
  508. package/dist/geneORA-NGZTMFSJ.js +0 -273
  509. package/dist/geneRanking-AYNBGFKU.js +0 -548
  510. package/dist/geneVariant-AL64NDHH.js +0 -36
  511. package/dist/geneVariant-QMKR3LUV.js +0 -286
  512. package/dist/geneVariant.integration.spec-N3U5CIRT.js +0 -489
  513. package/dist/genefusion.ui-IWJMF2BM.js +0 -303
  514. package/dist/geneset-APCO4BRX.js +0 -203
  515. package/dist/genomeBrowser.spec-JTCVUTO5.js +0 -276
  516. package/dist/grin2-FVX6AIST.js +0 -70
  517. package/dist/grin2-LF46UKFY.js +0 -1137
  518. package/dist/hierCluster-4DRHXD6W.js +0 -55
  519. package/dist/hierCluster-SFRQK3PS.js +0 -59
  520. package/dist/hierCluster.config-G2TFGBYF.js +0 -36
  521. package/dist/hierCluster.integration.spec-ZUZKCG6A.js +0 -483
  522. package/dist/hierCluster.interactivity-LQA6J56H.js +0 -49
  523. package/dist/hierCluster.renderers-TZZJEVFO.js +0 -19
  524. package/dist/imagePlot-OUHFWYKT.js +0 -156
  525. package/dist/importPlot-7V456QK7.js +0 -8
  526. package/dist/isoformExpression-NGUJJ6VI.js +0 -35
  527. package/dist/isoformExpression.unit.spec-DCRPXPBY.js +0 -237
  528. package/dist/junction-QYKLNXIW.js +0 -36
  529. package/dist/junction.customTerm-EHOOBR4V.js +0 -16
  530. package/dist/junction.unit.spec-LDNY7OFK.js +0 -182
  531. package/dist/launch.adhoc-FF7B3UG6.js +0 -37
  532. package/dist/leftlabel.sample-BTHMKLGF.js +0 -258
  533. package/dist/lollipop-H3UCNMHN.js +0 -166
  534. package/dist/maf-KWGUTPKO.js +0 -455
  535. package/dist/maftimeline-UD5VE4UW.js +0 -587
  536. package/dist/matrix-DLCX6GOO.js +0 -59
  537. package/dist/matrix-TIV42IQB.js +0 -54
  538. package/dist/matrix.cells-J3QZ7C6U.js +0 -26
  539. package/dist/matrix.config-VNMS6B7J.js +0 -37
  540. package/dist/matrix.data-PIE3TLKD.js +0 -23
  541. package/dist/matrix.groups-URBU775S.js +0 -26
  542. package/dist/matrix.integration.spec-LC6YMEKP.js +0 -3160
  543. package/dist/matrix.interactivity-W5AFOAQN.js +0 -37
  544. package/dist/matrix.layout-LU3NIJAL.js +0 -39
  545. package/dist/matrix.legend-LTP6ETZO.js +0 -20
  546. package/dist/matrix.renderers-762XI65L.js +0 -34
  547. package/dist/matrix.serieses-FHDBRPZA.js +0 -19
  548. package/dist/matrix.sort-Q6A6UWMY.js +0 -26
  549. package/dist/matrix.sort.unit.spec-CTCOPKVS.js +0 -468
  550. package/dist/matrix.sorterUi-4M5AU5EL.js +0 -16
  551. package/dist/matrix.sorterUi.unit.spec-Y7GC3PM5.js +0 -338
  552. package/dist/matrix.unit.spec-DROPHFTM.js +0 -150
  553. package/dist/mavb-BWA73N3U.js +0 -727
  554. package/dist/mds.fimo-3UJWIH2J.js +0 -513
  555. package/dist/mds.samplescatterplot-EUS7DCSQ.js +0 -1545
  556. package/dist/mds.survivalplot-77UEBQIC.js +0 -477
  557. package/dist/multivalue-KZ2DMVIR.js +0 -83
  558. package/dist/numericDictTermCluster-C2MYJYPZ.js +0 -63
  559. package/dist/oncomatrix-6LGB3M7R.js +0 -290
  560. package/dist/oncomatrix.spec-UWMSLOHW.js +0 -443
  561. package/dist/plot.2dvaf-LZAVWH65.js +0 -372
  562. package/dist/plot.app-OEWE3AYV.js +0 -36
  563. package/dist/plot.barplot-VIBHGTUT.js +0 -97
  564. package/dist/plot.boxplot-NQI3PSKR.js +0 -146
  565. package/dist/plot.brainImaging-3MTTCZHI.js +0 -51
  566. package/dist/plot.disco-HODBY7SO.js +0 -99
  567. package/dist/plot.ssgq-4URQE673.js +0 -134
  568. package/dist/plot.vaf2cov-QIJNEKCK.js +0 -253
  569. package/dist/polar2-GVFQNSLK.js +0 -232
  570. package/dist/profileForms-Z22CJXI4.js +0 -941
  571. package/dist/profilePlot-IVQZBSID.js +0 -49
  572. package/dist/proteinView-AUK634AU.js +0 -1357
  573. package/dist/proteomeCohortCompare-7G2F35H5.js +0 -912
  574. package/dist/pseudbulk.unit.spec-JDKUQUCM.js +0 -106
  575. package/dist/pseudbulk.unit.spec-JDKUQUCM.js.map +0 -7
  576. package/dist/pseudobulk-QTCUSH5I.js +0 -37
  577. package/dist/qualitative-7ST7SSBT.js +0 -38
  578. package/dist/radar2-CEE6SNBS.js +0 -327
  579. package/dist/radarFacility2-OSKDYIK7.js +0 -335
  580. package/dist/rememberedGvQ.unit.spec-RYFUJ2NW.js +0 -211
  581. package/dist/render-MAD3WMVD.js +0 -33
  582. package/dist/report-6JXJVSEB.js +0 -217
  583. package/dist/sampleView-SG3QYZKQ.js +0 -43
  584. package/dist/samplelst-R765UFP6.js +0 -106
  585. package/dist/samplematrix-EBJYE5SM.js +0 -2193
  586. package/dist/sc-7ZXPFDHD.js +0 -81
  587. package/dist/scatter-3GUL4KF3.js +0 -88
  588. package/dist/scatter-RHUVER53.js +0 -920
  589. package/dist/scatter-RHUVER53.js.map +0 -7
  590. package/dist/selectGenomeWithTklst-K4YXGJYG.js +0 -129
  591. package/dist/singleCellCellType-TU5VTPLP.js +0 -33
  592. package/dist/singleCellCellType.unit.spec-IRITQIGT.js +0 -154
  593. package/dist/singleCellGeneExpression-3IL52QDK.js +0 -33
  594. package/dist/singleCellGeneExpression.unit.spec-WXC4C37T.js +0 -148
  595. package/dist/singleCellPlot-XG3HZS7I.js +0 -48
  596. package/dist/singlecell-BRF2HAV2.js +0 -81
  597. package/dist/singlecell-KVCJF2HI.js +0 -1566
  598. package/dist/snp-RMZRB426.js +0 -33
  599. package/dist/snp.unit.spec-JF6KR2NT.js +0 -171
  600. package/dist/snplocus-AHUFHQ3Q.js +0 -203
  601. package/dist/spliceevent.a53ss.diagram-OSZZ2CF2.js +0 -146
  602. package/dist/spliceevent.exonskip.diagram-AMA2D2OL.js +0 -278
  603. package/dist/spliceevent.noeventdiagram-RKTUXH5D.js +0 -455
  604. package/dist/ssGSEA-7RKWYZKX.js +0 -33
  605. package/dist/ssGSEA.unit.spec-XLCZHH7S.js +0 -83
  606. package/dist/stattable-NDYUCLVZ.js +0 -117
  607. package/dist/studyCatalog-TAXRF5NS.js +0 -414
  608. package/dist/summarizeCnvGeneexp-3QLHU6N7.js +0 -158
  609. package/dist/summarizeGeneexpSurvival-ARI4MPFX.js +0 -105
  610. package/dist/summarizeMutationCnv-W7V7CKPI.js +0 -159
  611. package/dist/summarizeMutationDiagnosis-GCL4SRON.js +0 -35
  612. package/dist/summarizeMutationSurvival-6TTMSRRX.js +0 -99
  613. package/dist/summary-OUYDWLBF.js +0 -44
  614. package/dist/summary.integration.spec-4GTCG6HY.js +0 -409
  615. package/dist/summaryInput-UK3TLC7M.js +0 -242
  616. package/dist/sunburst-2UFHMNH3.js +0 -278
  617. package/dist/survival-SPWYSDVB.js +0 -53
  618. package/dist/survival-TL6UZ6FQ.js +0 -1248
  619. package/dist/survival.integration.spec-WWZELTKZ.js +0 -613
  620. package/dist/survival.integration.spec-WWZELTKZ.js.map +0 -7
  621. package/dist/svgraph-Z543MLIN.js +0 -1382
  622. package/dist/svmr-SZCAOAIF.js +0 -3837
  623. package/dist/table-IAQ6J4DO.js +0 -197
  624. package/dist/termCollection-3NGHR7QN.js +0 -252
  625. package/dist/termCollection-7P3WU6X6.js +0 -33
  626. package/dist/termCollection.unit.spec-EPYC7LOA.js +0 -299
  627. package/dist/termCollectionFractionSelection-YKIE6BME.js +0 -42
  628. package/dist/termCollectionFractionSelection.unit.spec-AG2CZPGZ.js +0 -188
  629. package/dist/tk-TOXMU4GT.js +0 -1121
  630. package/dist/tk-X454XH5N.js +0 -41
  631. package/dist/tp.ui-FDQ76KPL.js +0 -1454
  632. package/dist/tvs.dt-U77PCG6X.js +0 -34
  633. package/dist/tvs.dtcnv.categorical-XYZU4XLO.js +0 -35
  634. package/dist/tvs.dtcnv.continuous-4GJILFGP.js +0 -67
  635. package/dist/tvs.dtfusion-7YROAHVI.js +0 -35
  636. package/dist/tvs.dtitd-MIYU4ZHH.js +0 -35
  637. package/dist/tvs.dtsnvindel-XLDY7KWB.js +0 -35
  638. package/dist/tvs.dtsv-YMLJ37YR.js +0 -35
  639. package/dist/tvs.samplelst-KIVEXJKD.js +0 -98
  640. package/dist/tvs.termCollection-4CQV3EB3.js +0 -124
  641. package/dist/vocabulary-64GO4YDB.js +0 -36
  642. package/dist/wsi.direct-5MQVRJZX.js +0 -8343
  643. /package/dist/{2dmaf-32F56QBJ.js.map → 2dmaf-PN5YS362.js.map} +0 -0
  644. /package/dist/{AggregateMatrix-TPXNNWVD.js.map → AggregateMatrix-IBWOJWOC.js.map} +0 -0
  645. /package/dist/{AppHeader-SEJXDJE3.js.map → AppHeader-XV6S7GG5.js.map} +0 -0
  646. /package/dist/{BoxPlot-LOAO2MDO.js.map → BoxPlot-ZIVA55SK.js.map} +0 -0
  647. /package/dist/{Cuminc-O533BXFY.js.map → Cuminc-WKY35UGV.js.map} +0 -0
  648. /package/dist/{DE-FDAUNOWU.js.map → DE-E256DHID.js.map} +0 -0
  649. /package/dist/{DEinput-TF2VYTIJ.js.map → DEinput-YU3W72K7.js.map} +0 -0
  650. /package/dist/{DM-42YN3OEO.js.map → DM-W7PXTIKY.js.map} +0 -0
  651. /package/dist/{Disco-FGFHIKUR.js.map → Disco-OZY5GW2Z.js.map} +0 -0
  652. /package/dist/{Disco.UI-YGIU2JPM.js.map → Disco.UI-NRALEYXK.js.map} +0 -0
  653. /package/dist/{DmrPlot-EQFXMAW5.js.map → DmrPlot-QKUX5XUW.js.map} +0 -0
  654. /package/dist/{GB-244UT5VU.js.map → GB-ZYH7PGHT.js.map} +0 -0
  655. /package/dist/{GSEA-KXQBR3HH.js.map → GSEA-VQTD4MLY.js.map} +0 -0
  656. /package/dist/{GeneExpInput-ZY6SHXTX.js.map → GeneExpInput-XEFUTLFU.js.map} +0 -0
  657. /package/dist/{Geomap-6ZV4AM23.js.map → Geomap-GEK7UEDU.js.map} +0 -0
  658. /package/dist/{HicApp-4UHX2YGP.js.map → HicApp-ZY7UHV5H.js.map} +0 -0
  659. /package/dist/{IDCViewer-AB6LLO64.js.map → IDCViewer-YNKG4V46.js.map} +0 -0
  660. /package/dist/{NumBinaryEditor-CGSO2T4L.js.map → NumBinaryEditor-NEL727DX.js.map} +0 -0
  661. /package/dist/{NumBinaryEditor.unit.spec-3QHARZQJ.js.map → NumBinaryEditor.unit.spec-GCGZMJYF.js.map} +0 -0
  662. /package/dist/{NumContEditor-YLKSC4Y2.js.map → NumContEditor-IM6RRDGU.js.map} +0 -0
  663. /package/dist/{NumContEditor.unit.spec-L3GC3ZTJ.js.map → NumContEditor.unit.spec-B5AJXANS.js.map} +0 -0
  664. /package/dist/{NumCustomBinEditor-K3XSFHCC.js.map → NumCustomBinEditor-EZT5DRKP.js.map} +0 -0
  665. /package/dist/{NumCustomBinEditor.unit.spec-2FUHE6BX.js.map → NumCustomBinEditor.unit.spec-KLUDS6TH.js.map} +0 -0
  666. /package/dist/{NumDiscreteEditor-RJCSIW4R.js.map → NumDiscreteEditor-2M6Q5AAZ.js.map} +0 -0
  667. /package/dist/{NumDiscreteEditor.unit.spec-CUA6BOIS.js.map → NumDiscreteEditor.unit.spec-2JYZYJUX.js.map} +0 -0
  668. /package/dist/{NumRegularBinEditor-C3VIFDS4.js.map → NumRegularBinEditor-AQDHA2PU.js.map} +0 -0
  669. /package/dist/{NumRegularBinEditor.unit.spec-V2UJ5FLH.js.map → NumRegularBinEditor.unit.spec-62BYFNYG.js.map} +0 -0
  670. /package/dist/{NumSplineEditor-XBE7OV7P.js.map → NumSplineEditor-6Y5TZSTO.js.map} +0 -0
  671. /package/dist/{NumSplineEditor.unit.spec-CKRRI4US.js.map → NumSplineEditor.unit.spec-S65AV5EK.js.map} +0 -0
  672. /package/dist/{NumericDensity-ZL7UY7TL.js.map → NumericDensity-5ES4SDWZ.js.map} +0 -0
  673. /package/dist/{NumericDensity.unit.spec-CWTMSR56.js.map → NumericDensity.unit.spec-J6KZSE2P.js.map} +0 -0
  674. /package/dist/{NumericHandler-56ENFMNK.js.map → NumericHandler-ZTLDPP2F.js.map} +0 -0
  675. /package/dist/{NumericHandler.unit.spec-3YW34TTJ.js.map → NumericHandler.unit.spec-BZFBVHGU.js.map} +0 -0
  676. /package/dist/{ProteomeInput-HIS4GYWH.js.map → ProteomeInput-IKEXPCGV.js.map} +0 -0
  677. /package/dist/{Regression-C5GZYLEN.js.map → Regression-6F6YP3AX.js.map} +0 -0
  678. /package/dist/{RunChart2-X5WKYLPQ.js.map → RunChart2-CVRPXQH5.js.map} +0 -0
  679. /package/dist/{Volcano-ZNYDKP2O.js.map → Volcano-FCCWUMX7.js.map} +0 -0
  680. /package/dist/{adSandbox-A52OQSOW.js.map → adSandbox-QYIG6637.js.map} +0 -0
  681. /package/dist/{animatedBubbleChart-OQOZ3WFK.js.map → animatedBubbleChart-X53PR73H.js.map} +0 -0
  682. /package/dist/{app-4KIKXQX4.js.map → app-HJLTRZPI.js.map} +0 -0
  683. /package/dist/{app-NZUNKWKK.js.map → app-MGY6A4DM.js.map} +0 -0
  684. /package/dist/{bam-SME7YD3E.js.map → bam-VRQHRCP5.js.map} +0 -0
  685. /package/dist/{barchart-ESY6FOS4.js.map → barchart-TWMOUZFL.js.map} +0 -0
  686. /package/dist/{barchart2-XEJZGCES.js.map → barchart2-CV7RMMRG.js.map} +0 -0
  687. /package/dist/{block-747IK2EW.js.map → block-L53P4UGQ.js.map} +0 -0
  688. /package/dist/{block.init-ITZ42K43.js.map → block.init-XYOJTXKP.js.map} +0 -0
  689. /package/dist/{block.mds.expressionrank-Q63IJAJK.js.map → block.mds.expressionrank-77FSBDHA.js.map} +0 -0
  690. /package/dist/{block.mds.geneboxplot-EZIKAIKC.js.map → block.mds.geneboxplot-4TSYV4WS.js.map} +0 -0
  691. /package/dist/{block.mds.junction-TJXFKZ2Q.js.map → block.mds.junction-P4MYDET6.js.map} +0 -0
  692. /package/dist/{block.mds.svcnv-WSIEAII6.js.map → block.mds.svcnv-CYOFAS2T.js.map} +0 -0
  693. /package/dist/{block.svg-CQX5W6R4.js.map → block.svg-IT3ELCF4.js.map} +0 -0
  694. /package/dist/{block.tk.aicheck-J4MQ4BSD.js.map → block.tk.aicheck-GULHJLV5.js.map} +0 -0
  695. /package/dist/{block.tk.ase-2JFNPWCZ.js.map → block.tk.ase-RW5YL6HN.js.map} +0 -0
  696. /package/dist/{block.tk.bam-RBQ4AXSQ.js.map → block.tk.bam-MPGQW6KB.js.map} +0 -0
  697. /package/dist/{block.tk.bedgraphdot-ZQBOMVTO.js.map → block.tk.bedgraphdot-EYRY374P.js.map} +0 -0
  698. /package/dist/{block.tk.bigwig.ui-U5IBO3VF.js.map → block.tk.bigwig.ui-BKSXCDNM.js.map} +0 -0
  699. /package/dist/{block.tk.hicstraw-ZRZMFLLX.js.map → block.tk.hicstraw-76PV6NM3.js.map} +0 -0
  700. /package/dist/{block.tk.junction-7U7ABE4O.js.map → block.tk.junction-Z52QHQJQ.js.map} +0 -0
  701. /package/dist/{block.tk.junction.textmatrixui-AEXZ7W3U.js.map → block.tk.junction.textmatrixui-K32OOTZC.js.map} +0 -0
  702. /package/dist/{block.tk.ld-E7WPFL5P.js.map → block.tk.ld-DDGLRHPO.js.map} +0 -0
  703. /package/dist/{block.tk.menu-AITMEZTZ.js.map → block.tk.menu-MO6TESKI.js.map} +0 -0
  704. /package/dist/{block.tk.pgv-EDPZHI5L.js.map → block.tk.pgv-AKLKKSEP.js.map} +0 -0
  705. /package/dist/{brainImaging-35LPNBDR.js.map → brainImaging-KSTJQJAB.js.map} +0 -0
  706. /package/dist/{brainRegions-JMTQT4X3.js.map → brainRegions-WCRMMSK4.js.map} +0 -0
  707. /package/dist/{bubbleHeatmap-FMBKMDUL.js.map → bubbleHeatmap-4YOQ3BAB.js.map} +0 -0
  708. /package/dist/{cellTypeBubbleHeatmap-ZPTAGEWW.js.map → cellTypeBubbleHeatmap-O6YZ2RW4.js.map} +0 -0
  709. /package/dist/{chunk-Y4PX2ECH.js.map → chunk-3GUVLDUS.js.map} +0 -0
  710. /package/dist/{chunk-RBSAEAQV.js.map → chunk-3PQDD5HM.js.map} +0 -0
  711. /package/dist/{chunk-UYKZ5HXA.js.map → chunk-3WYUHDDP.js.map} +0 -0
  712. /package/dist/{chunk-L6WNBKYN.js.map → chunk-4C7MA5Q3.js.map} +0 -0
  713. /package/dist/{chunk-TG3QBMDK.js.map → chunk-4PB5ZEOB.js.map} +0 -0
  714. /package/dist/{chunk-BZN2O76M.js.map → chunk-5IMFPVGT.js.map} +0 -0
  715. /package/dist/{chunk-HLVWCJRO.js.map → chunk-6DPELKO5.js.map} +0 -0
  716. /package/dist/{chunk-GVLWCGXX.js.map → chunk-74C6G6JD.js.map} +0 -0
  717. /package/dist/{chunk-EKQ7NYOU.js.map → chunk-A7TXS6JR.js.map} +0 -0
  718. /package/dist/{chunk-IV57XNTG.js.map → chunk-AAJXHERO.js.map} +0 -0
  719. /package/dist/{chunk-6U2OPC6J.js.map → chunk-BFXZBZEV.js.map} +0 -0
  720. /package/dist/{chunk-5JCTTSV4.js.map → chunk-BGVGN73F.js.map} +0 -0
  721. /package/dist/{chunk-5ALGKNTQ.js.map → chunk-BL7EYUZC.js.map} +0 -0
  722. /package/dist/{chunk-BOQZOLRA.js.map → chunk-BPGZUNLL.js.map} +0 -0
  723. /package/dist/{chunk-EUQEQOFE.js.map → chunk-CPIPN5F6.js.map} +0 -0
  724. /package/dist/{chunk-AKA6RWLC.js.map → chunk-D5MSWPAZ.js.map} +0 -0
  725. /package/dist/{chunk-JMAFJKGG.js.map → chunk-DFT2PAIU.js.map} +0 -0
  726. /package/dist/{chunk-R624P2GE.js.map → chunk-E7NVJ44Z.js.map} +0 -0
  727. /package/dist/{chunk-3K7AYA3M.js.map → chunk-EMMGUSJB.js.map} +0 -0
  728. /package/dist/{chunk-AMVZ6KT5.js.map → chunk-G3CCQOLH.js.map} +0 -0
  729. /package/dist/{chunk-BCO5T43J.js.map → chunk-GGQVDHYF.js.map} +0 -0
  730. /package/dist/{chunk-JZHRVYNS.js.map → chunk-GPZYAJQH.js.map} +0 -0
  731. /package/dist/{chunk-CRHGXVUQ.js.map → chunk-GS6ZMPKP.js.map} +0 -0
  732. /package/dist/{chunk-SVC65ZPG.js.map → chunk-GUXKLMLM.js.map} +0 -0
  733. /package/dist/{chunk-LGR6CJTW.js.map → chunk-HELEV3LT.js.map} +0 -0
  734. /package/dist/{chunk-A2ORIMUJ.js.map → chunk-HKKTNIMX.js.map} +0 -0
  735. /package/dist/{chunk-5W7K7STT.js.map → chunk-HKSRIEWJ.js.map} +0 -0
  736. /package/dist/{chunk-VOYUJJQ6.js.map → chunk-IELQ3HMN.js.map} +0 -0
  737. /package/dist/{chunk-SS66BHGA.js.map → chunk-IISNWG4X.js.map} +0 -0
  738. /package/dist/{chunk-BZZZQFTI.js.map → chunk-J7KB2MH3.js.map} +0 -0
  739. /package/dist/{chunk-M5SYLBBC.js.map → chunk-JEJV7V7M.js.map} +0 -0
  740. /package/dist/{chunk-DPQP2GUW.js.map → chunk-JIZ3B32T.js.map} +0 -0
  741. /package/dist/{chunk-W4RYRU5D.js.map → chunk-KAY2ODXX.js.map} +0 -0
  742. /package/dist/{chunk-BSCMVKBP.js.map → chunk-KJM6PLXM.js.map} +0 -0
  743. /package/dist/{chunk-TMXW5HVE.js.map → chunk-KZHF3MQX.js.map} +0 -0
  744. /package/dist/{chunk-36AAUYZE.js.map → chunk-MC674TS2.js.map} +0 -0
  745. /package/dist/{chunk-TPDBOH3A.js.map → chunk-MLKQZ3RL.js.map} +0 -0
  746. /package/dist/{chunk-LOWJQFCC.js.map → chunk-MSSPT5YM.js.map} +0 -0
  747. /package/dist/{chunk-ASXUC6SM.js.map → chunk-OBBR4UYN.js.map} +0 -0
  748. /package/dist/{chunk-SU63FEY6.js.map → chunk-PQA3C2NY.js.map} +0 -0
  749. /package/dist/{chunk-OIJ6GRVS.js.map → chunk-QJ2VBXFB.js.map} +0 -0
  750. /package/dist/{chunk-7HFAEB3C.js.map → chunk-QP7EJXSU.js.map} +0 -0
  751. /package/dist/{chunk-WFSMIVJT.js.map → chunk-SHXJW27D.js.map} +0 -0
  752. /package/dist/{chunk-2IVN5DWA.js.map → chunk-SUNDNTVY.js.map} +0 -0
  753. /package/dist/{chunk-7HGZRJZZ.js.map → chunk-TSI4W6XO.js.map} +0 -0
  754. /package/dist/{chunk-4JFFFGL3.js.map → chunk-TXIQ5PHR.js.map} +0 -0
  755. /package/dist/{chunk-4KJSNR5E.js.map → chunk-U45R6QNT.js.map} +0 -0
  756. /package/dist/{chunk-A32SGNCT.js.map → chunk-UMZJQWWK.js.map} +0 -0
  757. /package/dist/{chunk-K6YUMBDY.js.map → chunk-VO7Q4WMM.js.map} +0 -0
  758. /package/dist/{chunk-YKM46UX5.js.map → chunk-VWGRKOVJ.js.map} +0 -0
  759. /package/dist/{chunk-P7DIIYCX.js.map → chunk-WCTKHF5T.js.map} +0 -0
  760. /package/dist/{chunk-OYLGAFFY.js.map → chunk-WOMERKMR.js.map} +0 -0
  761. /package/dist/{chunk-MKAILEWO.js.map → chunk-WXX2YD4Q.js.map} +0 -0
  762. /package/dist/{chunk-7AHTS4BP.js.map → chunk-X44AR557.js.map} +0 -0
  763. /package/dist/{chunk-BDQPMVKD.js.map → chunk-XEU5HXOY.js.map} +0 -0
  764. /package/dist/{chunk-FKA55PHV.js.map → chunk-XGYQZHNX.js.map} +0 -0
  765. /package/dist/{chunk-ZENZ5H2Q.js.map → chunk-XOND7UIK.js.map} +0 -0
  766. /package/dist/{chunk-RZ3KEFZ2.js.map → chunk-XRMUUWLS.js.map} +0 -0
  767. /package/dist/{chunk-2GBG3KA7.js.map → chunk-XTOGCXPD.js.map} +0 -0
  768. /package/dist/{chunk-Z7AO6A7M.js.map → chunk-Y5BBFDC3.js.map} +0 -0
  769. /package/dist/{chunk-ONVIVITY.js.map → chunk-Z2FSHODI.js.map} +0 -0
  770. /package/dist/{cohort-Q7TW5XTY.js.map → cohort-JWIQOO7U.js.map} +0 -0
  771. /package/dist/{condition-H6LBUHIF.js.map → condition-ZUAQYF5C.js.map} +0 -0
  772. /package/dist/{controls-DWDKFDXY.js.map → controls-ZPQ6SXD2.js.map} +0 -0
  773. /package/dist/{controls.config-KF7PHZSG.js.map → controls.config-NELL5HY5.js.map} +0 -0
  774. /package/dist/{correlation-YMSARIER.js.map → correlation-2X76UI3K.js.map} +0 -0
  775. /package/dist/{customdata.inputui-KEFE7ZHS.js.map → customdata.inputui-V6QIGFRP.js.map} +0 -0
  776. /package/dist/{dataDownload-G7TGPFGL.js.map → dataDownload-NSDY4MSL.js.map} +0 -0
  777. /package/dist/{databrowser.ui-NFIIFQJZ.js.map → databrowser.ui-DDLFQB6K.js.map} +0 -0
  778. /package/dist/{dictionary-ERJQMALC.js.map → dictionary-WSDD6TFI.js.map} +0 -0
  779. /package/dist/{dnaMethylation-KVCXKAU3.js.map → dnaMethylation-3IM4OACZ.js.map} +0 -0
  780. /package/dist/{dnaMethylation.integration.spec-3NXGGG4J.js.map → dnaMethylation.integration.spec-5CSJA67S.js.map} +0 -0
  781. /package/dist/{dofetch-YRWLEQEH.js.map → dofetch-GZ7POIBV.js.map} +0 -0
  782. /package/dist/{e2pca-M2F2CI6I.js.map → e2pca-AX7U2DOI.js.map} +0 -0
  783. /package/dist/{ep-QAEG4RV4.js.map → ep-UKACHFJU.js.map} +0 -0
  784. /package/dist/{expclust.gdc.spec-P77T6JR2.js.map → expclust.gdc.spec-46HDKH2Q.js.map} +0 -0
  785. /package/dist/{facet-LJTSTASE.js.map → facet-3EONZDDE.js.map} +0 -0
  786. /package/dist/{gb-KSB2DQHH.js.map → gb-W7GX5NWS.js.map} +0 -0
  787. /package/dist/{geneExpClustering-KHDCPE65.js.map → geneExpClustering-PJA6Y5GW.js.map} +0 -0
  788. /package/dist/{geneExpression-AWWMOUAR.js.map → geneExpression-EMLVPVNK.js.map} +0 -0
  789. /package/dist/{geneExpression-Z2EDR6EN.js.map → geneExpression-JMGYBT53.js.map} +0 -0
  790. /package/dist/{geneExpression.unit.spec-WB2ESPKT.js.map → geneExpression.unit.spec-DDZVZJVC.js.map} +0 -0
  791. /package/dist/{geneORA-NGZTMFSJ.js.map → geneORA-CIAFQQWB.js.map} +0 -0
  792. /package/dist/{geneRanking-AYNBGFKU.js.map → geneRanking-JRAU6FMJ.js.map} +0 -0
  793. /package/dist/{geneVariant-AL64NDHH.js.map → geneVariant-3DZTWQFG.js.map} +0 -0
  794. /package/dist/{geneVariant-QMKR3LUV.js.map → geneVariant-YWURIZ72.js.map} +0 -0
  795. /package/dist/{geneVariant.integration.spec-N3U5CIRT.js.map → geneVariant.integration.spec-V3KECZMM.js.map} +0 -0
  796. /package/dist/{genefusion.ui-IWJMF2BM.js.map → genefusion.ui-AO3TUDTL.js.map} +0 -0
  797. /package/dist/{geneset-APCO4BRX.js.map → geneset-RCIP2GZH.js.map} +0 -0
  798. /package/dist/{genomeBrowser.spec-JTCVUTO5.js.map → genomeBrowser.spec-7PZCNBL3.js.map} +0 -0
  799. /package/dist/{grin2-FVX6AIST.js.map → grin2-EUBCNH4Q.js.map} +0 -0
  800. /package/dist/{grin2-LF46UKFY.js.map → grin2-YYBB5XJK.js.map} +0 -0
  801. /package/dist/{hierCluster-4DRHXD6W.js.map → hierCluster-AV5NO2GW.js.map} +0 -0
  802. /package/dist/{hierCluster-SFRQK3PS.js.map → hierCluster-W2MVN34V.js.map} +0 -0
  803. /package/dist/{hierCluster.config-G2TFGBYF.js.map → hierCluster.config-4MBWG6RZ.js.map} +0 -0
  804. /package/dist/{hierCluster.integration.spec-ZUZKCG6A.js.map → hierCluster.integration.spec-JUIBIUKH.js.map} +0 -0
  805. /package/dist/{hierCluster.interactivity-LQA6J56H.js.map → hierCluster.interactivity-6PJE64PF.js.map} +0 -0
  806. /package/dist/{hierCluster.renderers-TZZJEVFO.js.map → hierCluster.renderers-RWDQ5SHY.js.map} +0 -0
  807. /package/dist/{imagePlot-OUHFWYKT.js.map → imagePlot-XLDQNUJA.js.map} +0 -0
  808. /package/dist/{importPlot-7V456QK7.js.map → importPlot-7FISAQKR.js.map} +0 -0
  809. /package/dist/{isoformExpression-NGUJJ6VI.js.map → isoformExpression-WOQAOVZS.js.map} +0 -0
  810. /package/dist/{isoformExpression.unit.spec-DCRPXPBY.js.map → isoformExpression.unit.spec-BMEGJNCO.js.map} +0 -0
  811. /package/dist/{junction-QYKLNXIW.js.map → junction-6NO36IPU.js.map} +0 -0
  812. /package/dist/{junction.customTerm-EHOOBR4V.js.map → junction.customTerm-N6JAOWZO.js.map} +0 -0
  813. /package/dist/{junction.unit.spec-LDNY7OFK.js.map → junction.unit.spec-UKGSQHO4.js.map} +0 -0
  814. /package/dist/{launch.adhoc-FF7B3UG6.js.map → launch.adhoc-42PUNEA6.js.map} +0 -0
  815. /package/dist/{leftlabel.sample-BTHMKLGF.js.map → leftlabel.sample-EXAUDPSB.js.map} +0 -0
  816. /package/dist/{lollipop-H3UCNMHN.js.map → lollipop-4ASTA5HO.js.map} +0 -0
  817. /package/dist/{maf-KWGUTPKO.js.map → maf-HPXANL3M.js.map} +0 -0
  818. /package/dist/{maftimeline-UD5VE4UW.js.map → maftimeline-2SXFX3HF.js.map} +0 -0
  819. /package/dist/{matrix-DLCX6GOO.js.map → matrix-DX4W5XMX.js.map} +0 -0
  820. /package/dist/{matrix-TIV42IQB.js.map → matrix-S34ITAPJ.js.map} +0 -0
  821. /package/dist/{matrix.cells-J3QZ7C6U.js.map → matrix.cells-BLULUGSZ.js.map} +0 -0
  822. /package/dist/{matrix.config-VNMS6B7J.js.map → matrix.config-Z3LWYH74.js.map} +0 -0
  823. /package/dist/{matrix.data-PIE3TLKD.js.map → matrix.data-73HY7Y2V.js.map} +0 -0
  824. /package/dist/{matrix.groups-URBU775S.js.map → matrix.groups-NOUMYNFY.js.map} +0 -0
  825. /package/dist/{matrix.integration.spec-LC6YMEKP.js.map → matrix.integration.spec-VTXYJ46U.js.map} +0 -0
  826. /package/dist/{matrix.interactivity-W5AFOAQN.js.map → matrix.interactivity-YHDIO5A2.js.map} +0 -0
  827. /package/dist/{matrix.layout-LU3NIJAL.js.map → matrix.layout-25HYKUF2.js.map} +0 -0
  828. /package/dist/{matrix.legend-LTP6ETZO.js.map → matrix.legend-IMK7DH4V.js.map} +0 -0
  829. /package/dist/{matrix.renderers-762XI65L.js.map → matrix.renderers-3RZRN6HO.js.map} +0 -0
  830. /package/dist/{matrix.serieses-FHDBRPZA.js.map → matrix.serieses-ZTVHQ7QA.js.map} +0 -0
  831. /package/dist/{matrix.sort-Q6A6UWMY.js.map → matrix.sort-EDXHT6NZ.js.map} +0 -0
  832. /package/dist/{matrix.sort.unit.spec-CTCOPKVS.js.map → matrix.sort.unit.spec-LSNY7PHU.js.map} +0 -0
  833. /package/dist/{matrix.sorterUi-4M5AU5EL.js.map → matrix.sorterUi-3DRNHG5Z.js.map} +0 -0
  834. /package/dist/{matrix.sorterUi.unit.spec-Y7GC3PM5.js.map → matrix.sorterUi.unit.spec-GNIIWGRJ.js.map} +0 -0
  835. /package/dist/{matrix.unit.spec-DROPHFTM.js.map → matrix.unit.spec-7A6ZFRXI.js.map} +0 -0
  836. /package/dist/{mavb-BWA73N3U.js.map → mavb-M5AXPLYX.js.map} +0 -0
  837. /package/dist/{mds.fimo-3UJWIH2J.js.map → mds.fimo-QE5OFA22.js.map} +0 -0
  838. /package/dist/{mds.samplescatterplot-EUS7DCSQ.js.map → mds.samplescatterplot-664EOHX2.js.map} +0 -0
  839. /package/dist/{mds.survivalplot-77UEBQIC.js.map → mds.survivalplot-H4TJD44D.js.map} +0 -0
  840. /package/dist/{multivalue-KZ2DMVIR.js.map → multivalue-JD3CNQJR.js.map} +0 -0
  841. /package/dist/{numericDictTermCluster-C2MYJYPZ.js.map → numericDictTermCluster-XPKEYXD7.js.map} +0 -0
  842. /package/dist/{oncomatrix-6LGB3M7R.js.map → oncomatrix-TX5PZQ76.js.map} +0 -0
  843. /package/dist/{oncomatrix.spec-UWMSLOHW.js.map → oncomatrix.spec-6X2WAHL7.js.map} +0 -0
  844. /package/dist/{plot.2dvaf-LZAVWH65.js.map → plot.2dvaf-5OHUFTMK.js.map} +0 -0
  845. /package/dist/{plot.app-OEWE3AYV.js.map → plot.app-XIVVJHWG.js.map} +0 -0
  846. /package/dist/{plot.barplot-VIBHGTUT.js.map → plot.barplot-PSODLAXD.js.map} +0 -0
  847. /package/dist/{plot.boxplot-NQI3PSKR.js.map → plot.boxplot-W3ASYFOG.js.map} +0 -0
  848. /package/dist/{plot.brainImaging-3MTTCZHI.js.map → plot.brainImaging-JGDLKLR7.js.map} +0 -0
  849. /package/dist/{plot.disco-HODBY7SO.js.map → plot.disco-TPMXTTZK.js.map} +0 -0
  850. /package/dist/{plot.ssgq-4URQE673.js.map → plot.ssgq-KIZIOZIF.js.map} +0 -0
  851. /package/dist/{plot.vaf2cov-QIJNEKCK.js.map → plot.vaf2cov-MSMW72IY.js.map} +0 -0
  852. /package/dist/{polar2-GVFQNSLK.js.map → polar2-LA4MSRRN.js.map} +0 -0
  853. /package/dist/{profileForms-Z22CJXI4.js.map → profileForms-BJRNB2ZF.js.map} +0 -0
  854. /package/dist/{profilePlot-IVQZBSID.js.map → profilePlot-DDO53C4T.js.map} +0 -0
  855. /package/dist/{proteinView-AUK634AU.js.map → proteinView-NFUR42XQ.js.map} +0 -0
  856. /package/dist/{proteomeCohortCompare-7G2F35H5.js.map → proteomeCohortCompare-OZVF3X66.js.map} +0 -0
  857. /package/dist/{pseudobulk-QTCUSH5I.js.map → pseudobulk-UVT5G2VL.js.map} +0 -0
  858. /package/dist/{qualitative-7ST7SSBT.js.map → qualitative-X3VXNC7X.js.map} +0 -0
  859. /package/dist/{radar2-CEE6SNBS.js.map → radar2-RTVUJ3AN.js.map} +0 -0
  860. /package/dist/{radarFacility2-OSKDYIK7.js.map → radarFacility2-ZGLZ5AKM.js.map} +0 -0
  861. /package/dist/{rememberedGvQ.unit.spec-RYFUJ2NW.js.map → rememberedGvQ.unit.spec-RLLLWU5M.js.map} +0 -0
  862. /package/dist/{render-MAD3WMVD.js.map → render-LR5BOYW6.js.map} +0 -0
  863. /package/dist/{report-6JXJVSEB.js.map → report-37W5OXUM.js.map} +0 -0
  864. /package/dist/{sampleView-SG3QYZKQ.js.map → sampleView-BDC2WPH7.js.map} +0 -0
  865. /package/dist/{samplelst-R765UFP6.js.map → samplelst-V2EIVZC5.js.map} +0 -0
  866. /package/dist/{samplematrix-EBJYE5SM.js.map → samplematrix-XOSKILUL.js.map} +0 -0
  867. /package/dist/{sc-7ZXPFDHD.js.map → sc-ZVZPWQY7.js.map} +0 -0
  868. /package/dist/{scatter-3GUL4KF3.js.map → scatter-2ZE5MCYH.js.map} +0 -0
  869. /package/dist/{selectGenomeWithTklst-K4YXGJYG.js.map → selectGenomeWithTklst-EF7WYEAJ.js.map} +0 -0
  870. /package/dist/{singleCellCellType-TU5VTPLP.js.map → singleCellCellType-TKCGC3G3.js.map} +0 -0
  871. /package/dist/{singleCellCellType.unit.spec-IRITQIGT.js.map → singleCellCellType.unit.spec-JZ6UHC5F.js.map} +0 -0
  872. /package/dist/{singleCellGeneExpression-3IL52QDK.js.map → singleCellGeneExpression-I2INGXGI.js.map} +0 -0
  873. /package/dist/{singleCellGeneExpression.unit.spec-WXC4C37T.js.map → singleCellGeneExpression.unit.spec-KL77FSHZ.js.map} +0 -0
  874. /package/dist/{singleCellPlot-XG3HZS7I.js.map → singleCellNumericValue-2X5NCEHL.js.map} +0 -0
  875. /package/dist/{snp-RMZRB426.js.map → singleCellPlot-Q6INE54V.js.map} +0 -0
  876. /package/dist/{singlecell-BRF2HAV2.js.map → singlecell-5N2P5ZAT.js.map} +0 -0
  877. /package/dist/{singlecell-KVCJF2HI.js.map → singlecell-NPSWMNI3.js.map} +0 -0
  878. /package/dist/{ssGSEA-7RKWYZKX.js.map → snp-2WPJYPDE.js.map} +0 -0
  879. /package/dist/{snp.unit.spec-JF6KR2NT.js.map → snp.unit.spec-PPWIIOX6.js.map} +0 -0
  880. /package/dist/{snplocus-AHUFHQ3Q.js.map → snplocus-T3HZFZWA.js.map} +0 -0
  881. /package/dist/{spliceevent.a53ss.diagram-OSZZ2CF2.js.map → spliceevent.a53ss.diagram-APCF4LV5.js.map} +0 -0
  882. /package/dist/{spliceevent.exonskip.diagram-AMA2D2OL.js.map → spliceevent.exonskip.diagram-TT5JGBSC.js.map} +0 -0
  883. /package/dist/{spliceevent.noeventdiagram-RKTUXH5D.js.map → spliceevent.noeventdiagram-CPXQSX3Z.js.map} +0 -0
  884. /package/dist/{summarizeMutationDiagnosis-GCL4SRON.js.map → ssGSEA-FSX6P7HA.js.map} +0 -0
  885. /package/dist/{ssGSEA.unit.spec-XLCZHH7S.js.map → ssGSEA.unit.spec-TXYT665R.js.map} +0 -0
  886. /package/dist/{stattable-NDYUCLVZ.js.map → stattable-BD64SFYV.js.map} +0 -0
  887. /package/dist/{studyCatalog-TAXRF5NS.js.map → studyCatalog-6BOWO4PO.js.map} +0 -0
  888. /package/dist/{summarizeCnvGeneexp-3QLHU6N7.js.map → summarizeCnvGeneexp-AMLYJIPU.js.map} +0 -0
  889. /package/dist/{summarizeGeneexpSurvival-ARI4MPFX.js.map → summarizeGeneexpSurvival-IDM7T333.js.map} +0 -0
  890. /package/dist/{summarizeMutationCnv-W7V7CKPI.js.map → summarizeMutationCnv-R6SYSJQC.js.map} +0 -0
  891. /package/dist/{summary-OUYDWLBF.js.map → summarizeMutationDiagnosis-XZJ4JLW2.js.map} +0 -0
  892. /package/dist/{summarizeMutationSurvival-6TTMSRRX.js.map → summarizeMutationSurvival-ABJ5RL4L.js.map} +0 -0
  893. /package/dist/{termCollection-7P3WU6X6.js.map → summary-NVYCTE6P.js.map} +0 -0
  894. /package/dist/{summary.integration.spec-4GTCG6HY.js.map → summary.integration.spec-SSLTLVNW.js.map} +0 -0
  895. /package/dist/{summaryInput-UK3TLC7M.js.map → summaryInput-SJOZETRP.js.map} +0 -0
  896. /package/dist/{sunburst-2UFHMNH3.js.map → sunburst-RU5ZPJKW.js.map} +0 -0
  897. /package/dist/{survival-SPWYSDVB.js.map → survival-BHJQMXKI.js.map} +0 -0
  898. /package/dist/{survival-TL6UZ6FQ.js.map → survival-DVG6Y2FV.js.map} +0 -0
  899. /package/dist/{svgraph-Z543MLIN.js.map → svgraph-ETFA4GRX.js.map} +0 -0
  900. /package/dist/{svmr-SZCAOAIF.js.map → svmr-AI3RU4JK.js.map} +0 -0
  901. /package/dist/{table-IAQ6J4DO.js.map → table-YCTSMLQL.js.map} +0 -0
  902. /package/dist/{termCollection-3NGHR7QN.js.map → termCollection-GMKEZR6D.js.map} +0 -0
  903. /package/dist/{termCollectionFractionSelection-YKIE6BME.js.map → termCollection-VEVKKJZD.js.map} +0 -0
  904. /package/dist/{termCollection.unit.spec-EPYC7LOA.js.map → termCollection.unit.spec-EU6YCEPX.js.map} +0 -0
  905. /package/dist/{tk-X454XH5N.js.map → termCollectionFractionSelection-UBS74X36.js.map} +0 -0
  906. /package/dist/{termCollectionFractionSelection.unit.spec-AG2CZPGZ.js.map → termCollectionFractionSelection.unit.spec-Y5OJFGDD.js.map} +0 -0
  907. /package/dist/{tk-TOXMU4GT.js.map → tk-HMF4HCNV.js.map} +0 -0
  908. /package/dist/{tvs.dt-U77PCG6X.js.map → tk-W6Z4FJMW.js.map} +0 -0
  909. /package/dist/{tp.ui-FDQ76KPL.js.map → tp.ui-NECRDJCS.js.map} +0 -0
  910. /package/dist/{vocabulary-64GO4YDB.js.map → tvs.dt-2JEH3F35.js.map} +0 -0
  911. /package/dist/{tvs.dtcnv.categorical-XYZU4XLO.js.map → tvs.dtcnv.categorical-YBXKEBR2.js.map} +0 -0
  912. /package/dist/{tvs.dtcnv.continuous-4GJILFGP.js.map → tvs.dtcnv.continuous-AD3SJ6BY.js.map} +0 -0
  913. /package/dist/{tvs.dtfusion-7YROAHVI.js.map → tvs.dtfusion-ODI3CLQS.js.map} +0 -0
  914. /package/dist/{tvs.dtitd-MIYU4ZHH.js.map → tvs.dtitd-V3LYLPJY.js.map} +0 -0
  915. /package/dist/{tvs.dtsnvindel-XLDY7KWB.js.map → tvs.dtsnvindel-R3V5LTNL.js.map} +0 -0
  916. /package/dist/{tvs.dtsv-YMLJ37YR.js.map → tvs.dtsv-ZQLKEDLJ.js.map} +0 -0
  917. /package/dist/{tvs.samplelst-KIVEXJKD.js.map → tvs.samplelst-G25A7HM6.js.map} +0 -0
  918. /package/dist/{tvs.termCollection-4CQV3EB3.js.map → tvs.termCollection-WLVCWDEJ.js.map} +0 -0
  919. /package/dist/{wsi.direct-5MQVRJZX.js.map → wsi.direct-SNPPQPVO.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/d3-regression/dist/d3-regression.js", "../plots/scatter/viewmodel/scatterSampleTable.ts", "../plots/scatter/viewmodel/scatterLasso.ts", "../plots/scatter/model/ScatterModelBase.ts", "../plots/scatter/model/scatterModel.ts", "../plots/scatter/viewmodel/scatterLegendInteractivity.ts", "../plots/scatter/view/scatterView.ts", "../plots/scatter/viewmodel/scatterLegend.ts", "../plots/scatter/viewmodel/scatterTooltip.ts", "../plots/scatter/viewmodel/scatterZoom.ts", "../plots/scatter/viewmodel/scatterViewModelBase.ts", "../plots/scatter/viewmodel/scatterViewModel.ts", "../plots/scatter/viewmodel/scatterViewModel2DLarge.ts", "../plots/singleCellPlot.js"],
4
+ "sourcesContent": ["// https://github.com/HarryStevens/d3-regression#readme Version 1.3.10. Copyright 2022 Harry Stevens.\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = global || self, factory(global.d3 = {}));\n}(this, (function (exports) { 'use strict';\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n\n // Adapted from vega-statistics by Jeffrey Heer\n // License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE\n // Source: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/packages/vega-statistics/src/regression/points.js\n function points(data, x, y, sort) {\n data = data.filter(function (d, i) {\n var u = x(d, i),\n v = y(d, i);\n return u != null && isFinite(u) && v != null && isFinite(v);\n });\n\n if (sort) {\n data.sort(function (a, b) {\n return x(a) - x(b);\n });\n }\n\n var n = data.length,\n X = new Float64Array(n),\n Y = new Float64Array(n); // extract values, calculate means\n\n var ux = 0,\n uy = 0,\n xv,\n yv,\n d;\n\n for (var i = 0; i < n;) {\n d = data[i];\n X[i] = xv = +x(d, i, data);\n Y[i] = yv = +y(d, i, data);\n ++i;\n ux += (xv - ux) / i;\n uy += (yv - uy) / i;\n } // mean center the data\n\n\n for (var _i = 0; _i < n; ++_i) {\n X[_i] -= ux;\n Y[_i] -= uy;\n }\n\n return [X, Y, ux, uy];\n }\n function visitPoints(data, x, y, cb) {\n var iterations = 0;\n\n for (var i = 0, n = data.length; i < n; i++) {\n var d = data[i],\n dx = +x(d, i, data),\n dy = +y(d, i, data);\n\n if (dx != null && isFinite(dx) && dy != null && isFinite(dy)) {\n cb(dx, dy, iterations++);\n }\n }\n }\n\n // return the coefficient of determination, or R squared.\n\n function determination(data, x, y, uY, predict) {\n var SSE = 0,\n SST = 0;\n visitPoints(data, x, y, function (dx, dy) {\n var sse = dy - predict(dx),\n sst = dy - uY;\n SSE += sse * sse;\n SST += sst * sst;\n });\n return 1 - SSE / SST;\n }\n\n // Returns the angle of a line in degrees.\n function angle(line) {\n return Math.atan2(line[1][1] - line[0][1], line[1][0] - line[0][0]) * 180 / Math.PI;\n } // Returns the midpoint of a line.\n\n function midpoint(line) {\n return [(line[0][0] + line[1][0]) / 2, (line[0][1] + line[1][1]) / 2];\n }\n\n // returns a smooth line.\n\n function interpose(xmin, xmax, predict) {\n var l = Math.log(xmax - xmin) * Math.LOG10E + 1 | 0;\n var precision = 1 * Math.pow(10, -l / 2 - 1),\n maxIter = 1e4;\n var points = [px(xmin), px(xmax)],\n iter = 0;\n\n while (find(points) && iter < maxIter) {\n }\n\n return points;\n\n function px(x) {\n return [x, predict(x)];\n }\n\n function find(points) {\n iter++;\n var n = points.length;\n var found = false;\n\n for (var i = 0; i < n - 1; i++) {\n var p0 = points[i],\n p1 = points[i + 1],\n m = midpoint([p0, p1]),\n mp = px(m[0]),\n a0 = angle([p0, m]),\n a1 = angle([p0, mp]),\n a = Math.abs(a0 - a1);\n\n if (a > precision) {\n points.splice(i + 1, 0, mp);\n found = true;\n }\n }\n\n return found;\n }\n }\n\n // Ordinary Least Squares from vega-statistics by Jeffrey Heer\n // License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE\n // Source: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/packages/vega-statistics/src/regression/ols.js\n function ols(uX, uY, uXY, uX2) {\n var delta = uX2 - uX * uX,\n slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta,\n intercept = uY - slope * uX;\n return [intercept, slope];\n }\n\n function exponential () {\n var x = function x(d) {\n return d[0];\n },\n y = function y(d) {\n return d[1];\n },\n domain;\n\n function exponential(data) {\n var n = 0,\n Y = 0,\n YL = 0,\n XY = 0,\n XYL = 0,\n X2Y = 0,\n xmin = domain ? +domain[0] : Infinity,\n xmax = domain ? +domain[1] : -Infinity;\n visitPoints(data, x, y, function (dx, dy) {\n var ly = Math.log(dy),\n xy = dx * dy;\n ++n;\n Y += (dy - Y) / n;\n XY += (xy - XY) / n;\n X2Y += (dx * xy - X2Y) / n;\n YL += (dy * ly - YL) / n;\n XYL += (xy * ly - XYL) / n;\n\n if (!domain) {\n if (dx < xmin) xmin = dx;\n if (dx > xmax) xmax = dx;\n }\n });\n\n var _ols = ols(XY / Y, YL / Y, XYL / Y, X2Y / Y),\n _ols2 = _slicedToArray(_ols, 2),\n a = _ols2[0],\n b = _ols2[1];\n\n a = Math.exp(a);\n\n var fn = function fn(x) {\n return a * Math.exp(b * x);\n },\n out = interpose(xmin, xmax, fn);\n\n out.a = a;\n out.b = b;\n out.predict = fn;\n out.rSquared = determination(data, x, y, Y, fn);\n return out;\n }\n\n exponential.domain = function (arr) {\n return arguments.length ? (domain = arr, exponential) : domain;\n };\n\n exponential.x = function (fn) {\n return arguments.length ? (x = fn, exponential) : x;\n };\n\n exponential.y = function (fn) {\n return arguments.length ? (y = fn, exponential) : y;\n };\n\n return exponential;\n }\n\n function linear () {\n var x = function x(d) {\n return d[0];\n },\n y = function y(d) {\n return d[1];\n },\n domain;\n\n function linear(data) {\n var n = 0,\n X = 0,\n // sum of x\n Y = 0,\n // sum of y\n XY = 0,\n // sum of x * y\n X2 = 0,\n // sum of x * x\n xmin = domain ? +domain[0] : Infinity,\n xmax = domain ? +domain[1] : -Infinity;\n visitPoints(data, x, y, function (dx, dy) {\n ++n;\n X += (dx - X) / n;\n Y += (dy - Y) / n;\n XY += (dx * dy - XY) / n;\n X2 += (dx * dx - X2) / n;\n\n if (!domain) {\n if (dx < xmin) xmin = dx;\n if (dx > xmax) xmax = dx;\n }\n });\n\n var _ols = ols(X, Y, XY, X2),\n _ols2 = _slicedToArray(_ols, 2),\n intercept = _ols2[0],\n slope = _ols2[1],\n fn = function fn(x) {\n return slope * x + intercept;\n },\n out = [[xmin, fn(xmin)], [xmax, fn(xmax)]];\n\n out.a = slope;\n out.b = intercept;\n out.predict = fn;\n out.rSquared = determination(data, x, y, Y, fn);\n return out;\n }\n\n linear.domain = function (arr) {\n return arguments.length ? (domain = arr, linear) : domain;\n };\n\n linear.x = function (fn) {\n return arguments.length ? (x = fn, linear) : x;\n };\n\n linear.y = function (fn) {\n return arguments.length ? (y = fn, linear) : y;\n };\n\n return linear;\n }\n\n // Returns the medium value of an array of numbers.\n function median(arr) {\n arr.sort(function (a, b) {\n return a - b;\n });\n var i = arr.length / 2;\n return i % 1 === 0 ? (arr[i - 1] + arr[i]) / 2 : arr[Math.floor(i)];\n }\n\n var maxiters = 2,\n epsilon = 1e-12;\n function loess () {\n var x = function x(d) {\n return d[0];\n },\n y = function y(d) {\n return d[1];\n },\n bandwidth = .3;\n\n function loess(data) {\n var _points = points(data, x, y, true),\n _points2 = _slicedToArray(_points, 4),\n xv = _points2[0],\n yv = _points2[1],\n ux = _points2[2],\n uy = _points2[3],\n n = xv.length,\n bw = Math.max(2, ~~(bandwidth * n)),\n yhat = new Float64Array(n),\n residuals = new Float64Array(n),\n robustWeights = new Float64Array(n).fill(1);\n\n for (var iter = -1; ++iter <= maxiters;) {\n var interval = [0, bw - 1];\n\n for (var i = 0; i < n; ++i) {\n var dx = xv[i],\n i0 = interval[0],\n i1 = interval[1],\n edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n var W = 0,\n X = 0,\n Y = 0,\n XY = 0,\n X2 = 0,\n denom = 1 / Math.abs(xv[edge] - dx || 1); // Avoid singularity\n\n for (var k = i0; k <= i1; ++k) {\n var xk = xv[k],\n yk = yv[k],\n w = tricube(Math.abs(dx - xk) * denom) * robustWeights[k],\n xkw = xk * w;\n W += w;\n X += xkw;\n Y += yk * w;\n XY += yk * xkw;\n X2 += xk * xkw;\n } // Linear regression fit\n\n\n var _ols = ols(X / W, Y / W, XY / W, X2 / W),\n _ols2 = _slicedToArray(_ols, 2),\n a = _ols2[0],\n b = _ols2[1];\n\n yhat[i] = a + b * dx;\n residuals[i] = Math.abs(yv[i] - yhat[i]);\n updateInterval(xv, i + 1, interval);\n }\n\n if (iter === maxiters) {\n break;\n }\n\n var medianResidual = median(residuals);\n if (Math.abs(medianResidual) < epsilon) break;\n\n for (var _i = 0, arg, _w; _i < n; ++_i) {\n arg = residuals[_i] / (6 * medianResidual); // Default to epsilon (rather than zero) for large deviations\n // Keeping weights tiny but non-zero prevents singularites\n\n robustWeights[_i] = arg >= 1 ? epsilon : (_w = 1 - arg * arg) * _w;\n }\n }\n\n return output(xv, yhat, ux, uy);\n }\n\n loess.bandwidth = function (bw) {\n return arguments.length ? (bandwidth = bw, loess) : bandwidth;\n };\n\n loess.x = function (fn) {\n return arguments.length ? (x = fn, loess) : x;\n };\n\n loess.y = function (fn) {\n return arguments.length ? (y = fn, loess) : y;\n };\n\n return loess;\n } // Weighting kernel for local regression\n\n function tricube(x) {\n return (x = 1 - x * x * x) * x * x;\n } // Advance sliding window interval of nearest neighbors\n\n\n function updateInterval(xv, i, interval) {\n var val = xv[i],\n left = interval[0],\n right = interval[1] + 1;\n if (right >= xv.length) return; // Step right if distance to new right edge is <= distance to old left edge\n // Step when distance is equal to ensure movement over duplicate x values\n\n while (i > left && xv[right] - val <= val - xv[left]) {\n interval[0] = ++left;\n interval[1] = right;\n ++right;\n }\n } // Generate smoothed output points\n // Average points with repeated x values\n\n\n function output(xv, yhat, ux, uy) {\n var n = xv.length,\n out = [];\n var i = 0,\n cnt = 0,\n prev = [],\n v;\n\n for (; i < n; ++i) {\n v = xv[i] + ux;\n\n if (prev[0] === v) {\n // Average output values via online update\n prev[1] += (yhat[i] - prev[1]) / ++cnt;\n } else {\n // Add new output point\n cnt = 0;\n prev[1] += uy;\n prev = [v, yhat[i]];\n out.push(prev);\n }\n }\n\n prev[1] += uy;\n return out;\n }\n\n function logarithmic () {\n var x = function x(d) {\n return d[0];\n },\n y = function y(d) {\n return d[1];\n },\n base = Math.E,\n domain;\n\n function logarithmic(data) {\n var n = 0,\n X = 0,\n Y = 0,\n XY = 0,\n X2 = 0,\n xmin = domain ? +domain[0] : Infinity,\n xmax = domain ? +domain[1] : -Infinity,\n lb = Math.log(base);\n visitPoints(data, x, y, function (dx, dy) {\n var lx = Math.log(dx) / lb;\n ++n;\n X += (lx - X) / n;\n Y += (dy - Y) / n;\n XY += (lx * dy - XY) / n;\n X2 += (lx * lx - X2) / n;\n\n if (!domain) {\n if (dx < xmin) xmin = dx;\n if (dx > xmax) xmax = dx;\n }\n });\n\n var _ols = ols(X, Y, XY, X2),\n _ols2 = _slicedToArray(_ols, 2),\n intercept = _ols2[0],\n slope = _ols2[1],\n fn = function fn(x) {\n return slope * Math.log(x) / lb + intercept;\n },\n out = interpose(xmin, xmax, fn);\n\n out.a = slope;\n out.b = intercept;\n out.predict = fn;\n out.rSquared = determination(data, x, y, Y, fn);\n return out;\n }\n\n logarithmic.domain = function (arr) {\n return arguments.length ? (domain = arr, logarithmic) : domain;\n };\n\n logarithmic.x = function (fn) {\n return arguments.length ? (x = fn, logarithmic) : x;\n };\n\n logarithmic.y = function (fn) {\n return arguments.length ? (y = fn, logarithmic) : y;\n };\n\n logarithmic.base = function (n) {\n return arguments.length ? (base = n, logarithmic) : base;\n };\n\n return logarithmic;\n }\n\n function quad () {\n var x = function x(d) {\n return d[0];\n },\n y = function y(d) {\n return d[1];\n },\n domain;\n\n function quadratic(data) {\n var _points = points(data, x, y),\n _points2 = _slicedToArray(_points, 4),\n xv = _points2[0],\n yv = _points2[1],\n ux = _points2[2],\n uy = _points2[3],\n n = xv.length;\n\n var X2 = 0,\n X3 = 0,\n X4 = 0,\n XY = 0,\n X2Y = 0,\n i,\n dx,\n dy,\n x2;\n\n for (i = 0; i < n;) {\n dx = xv[i];\n dy = yv[i++];\n x2 = dx * dx;\n X2 += (x2 - X2) / i;\n X3 += (x2 * dx - X3) / i;\n X4 += (x2 * x2 - X4) / i;\n XY += (dx * dy - XY) / i;\n X2Y += (x2 * dy - X2Y) / i;\n }\n\n var Y = 0,\n n0 = 0,\n xmin = domain ? +domain[0] : Infinity,\n xmax = domain ? +domain[1] : -Infinity;\n visitPoints(data, x, y, function (dx, dy) {\n n0++;\n Y += (dy - Y) / n0;\n\n if (!domain) {\n if (dx < xmin) xmin = dx;\n if (dx > xmax) xmax = dx;\n }\n });\n\n var X2X2 = X4 - X2 * X2,\n d = X2 * X2X2 - X3 * X3,\n a = (X2Y * X2 - XY * X3) / d,\n b = (XY * X2X2 - X2Y * X3) / d,\n c = -a * X2,\n fn = function fn(x) {\n x = x - ux;\n return a * x * x + b * x + c + uy;\n };\n\n var out = interpose(xmin, xmax, fn);\n out.a = a;\n out.b = b - 2 * a * ux;\n out.c = c - b * ux + a * ux * ux + uy;\n out.predict = fn;\n out.rSquared = determination(data, x, y, Y, fn);\n return out;\n }\n\n quadratic.domain = function (arr) {\n return arguments.length ? (domain = arr, quadratic) : domain;\n };\n\n quadratic.x = function (fn) {\n return arguments.length ? (x = fn, quadratic) : x;\n };\n\n quadratic.y = function (fn) {\n return arguments.length ? (y = fn, quadratic) : y;\n };\n\n return quadratic;\n }\n\n // Source: https://github.com/Tom-Alexander/regression-js/blob/master/src/regression.js#L246\n // License: https://github.com/Tom-Alexander/regression-js/blob/master/LICENSE\n // ...with ideas from vega-statistics by Jeffrey Heer\n // Source: https://github.com/vega/vega/blob/f21cb8792b4e0cbe2b1a3fd44b0f5db370dbaadb/packages/vega-statistics/src/regression/poly.js\n // License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE\n\n function polynomial () {\n var x = function x(d) {\n return d[0];\n },\n y = function y(d) {\n return d[1];\n },\n order = 3,\n domain;\n\n function polynomial(data) {\n // Use more efficient methods for lower orders\n if (order === 1) {\n var o = linear().x(x).y(y).domain(domain)(data);\n o.coefficients = [o.b, o.a];\n delete o.a;\n delete o.b;\n return o;\n }\n\n if (order === 2) {\n var _o = quad().x(x).y(y).domain(domain)(data);\n\n _o.coefficients = [_o.c, _o.b, _o.a];\n delete _o.a;\n delete _o.b;\n delete _o.c;\n return _o;\n }\n\n var _points = points(data, x, y),\n _points2 = _slicedToArray(_points, 4),\n xv = _points2[0],\n yv = _points2[1],\n ux = _points2[2],\n uy = _points2[3],\n n = xv.length,\n lhs = [],\n rhs = [],\n k = order + 1;\n\n var Y = 0,\n n0 = 0,\n xmin = domain ? +domain[0] : Infinity,\n xmax = domain ? +domain[1] : -Infinity;\n visitPoints(data, x, y, function (dx, dy) {\n ++n0;\n Y += (dy - Y) / n0;\n\n if (!domain) {\n if (dx < xmin) xmin = dx;\n if (dx > xmax) xmax = dx;\n }\n });\n var i, j, l, v, c;\n\n for (i = 0; i < k; ++i) {\n for (l = 0, v = 0; l < n; ++l) {\n v += Math.pow(xv[l], i) * yv[l];\n }\n\n lhs.push(v);\n c = new Float64Array(k);\n\n for (j = 0; j < k; ++j) {\n for (l = 0, v = 0; l < n; ++l) {\n v += Math.pow(xv[l], i + j);\n }\n\n c[j] = v;\n }\n\n rhs.push(c);\n }\n\n rhs.push(lhs);\n\n var coef = gaussianElimination(rhs),\n fn = function fn(x) {\n x -= ux;\n var y = uy + coef[0] + coef[1] * x + coef[2] * x * x;\n\n for (i = 3; i < k; ++i) {\n y += coef[i] * Math.pow(x, i);\n }\n\n return y;\n },\n out = interpose(xmin, xmax, fn);\n\n out.coefficients = uncenter(k, coef, -ux, uy);\n out.predict = fn;\n out.rSquared = determination(data, x, y, Y, fn);\n return out;\n }\n\n polynomial.domain = function (arr) {\n return arguments.length ? (domain = arr, polynomial) : domain;\n };\n\n polynomial.x = function (fn) {\n return arguments.length ? (x = fn, polynomial) : x;\n };\n\n polynomial.y = function (fn) {\n return arguments.length ? (y = fn, polynomial) : y;\n };\n\n polynomial.order = function (n) {\n return arguments.length ? (order = n, polynomial) : order;\n };\n\n return polynomial;\n }\n\n function uncenter(k, a, x, y) {\n var z = Array(k);\n var i, j, v, c; // initialize to zero\n\n for (i = 0; i < k; ++i) {\n z[i] = 0;\n } // polynomial expansion\n\n\n for (i = k - 1; i >= 0; --i) {\n v = a[i];\n c = 1;\n z[i] += v;\n\n for (j = 1; j <= i; ++j) {\n c *= (i + 1 - j) / j; // binomial coefficent\n\n z[i - j] += v * Math.pow(x, j) * c;\n }\n } // bias term\n\n\n z[0] += y;\n return z;\n } // Given an array for a two-dimensional matrix and the polynomial order,\n // solve A * x = b using Gaussian elimination.\n\n\n function gaussianElimination(matrix) {\n var n = matrix.length - 1,\n coef = [];\n var i, j, k, r, t;\n\n for (i = 0; i < n; ++i) {\n r = i; // max row\n\n for (j = i + 1; j < n; ++j) {\n if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) {\n r = j;\n }\n }\n\n for (k = i; k < n + 1; ++k) {\n t = matrix[k][i];\n matrix[k][i] = matrix[k][r];\n matrix[k][r] = t;\n }\n\n for (j = i + 1; j < n; ++j) {\n for (k = n; k >= i; k--) {\n matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n }\n }\n }\n\n for (j = n - 1; j >= 0; --j) {\n t = 0;\n\n for (k = j + 1; k < n; ++k) {\n t += matrix[k][j] * coef[k];\n }\n\n coef[j] = (matrix[n][j] - t) / matrix[j][j];\n }\n\n return coef;\n }\n\n function power () {\n var x = function x(d) {\n return d[0];\n },\n y = function y(d) {\n return d[1];\n },\n domain;\n\n function power(data) {\n var n = 0,\n X = 0,\n Y = 0,\n XY = 0,\n X2 = 0,\n YS = 0,\n xmin = domain ? +domain[0] : Infinity,\n xmax = domain ? +domain[1] : -Infinity;\n visitPoints(data, x, y, function (dx, dy) {\n var lx = Math.log(dx),\n ly = Math.log(dy);\n ++n;\n X += (lx - X) / n;\n Y += (ly - Y) / n;\n XY += (lx * ly - XY) / n;\n X2 += (lx * lx - X2) / n;\n YS += (dy - YS) / n;\n\n if (!domain) {\n if (dx < xmin) xmin = dx;\n if (dx > xmax) xmax = dx;\n }\n });\n\n var _ols = ols(X, Y, XY, X2),\n _ols2 = _slicedToArray(_ols, 2),\n a = _ols2[0],\n b = _ols2[1];\n\n a = Math.exp(a);\n\n var fn = function fn(x) {\n return a * Math.pow(x, b);\n },\n out = interpose(xmin, xmax, fn);\n\n out.a = a;\n out.b = b;\n out.predict = fn;\n out.rSquared = determination(data, x, y, YS, fn);\n return out;\n }\n\n power.domain = function (arr) {\n return arguments.length ? (domain = arr, power) : domain;\n };\n\n power.x = function (fn) {\n return arguments.length ? (x = fn, power) : x;\n };\n\n power.y = function (fn) {\n return arguments.length ? (y = fn, power) : y;\n };\n\n return power;\n }\n\n exports.regressionExp = exponential;\n exports.regressionLinear = linear;\n exports.regressionLoess = loess;\n exports.regressionLog = logarithmic;\n exports.regressionPoly = polynomial;\n exports.regressionPow = power;\n exports.regressionQuad = quad;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n", "import { mclass } from '#shared/common.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { getDateStrFromNumber } from '#shared/terms.js'\nimport { SINGLECELL_GENE_EXPRESSION } from '#types'\n\n/** One row per sample, one column per term in play. Shared by the hover tooltip / click menu\n * (scatterTooltip) and the lasso's group table (scatterLasso), which listed the same samples\n * with the same columns and had drifted into two copies \u2014 the lasso's read raw `d[category]`\n * while the tooltip's ran the values through getCategoryValue(). Both now format. */\n\n/** Reads the display value a sample carries for one plot dimension.\n *\n * `category` is the key on the sample object, not a term id: 'x' | 'y' | 'category' (color) |\n * 'shape' | 'scale'. `tw` is the matching term wrapper, used only to decide formatting.\n */\nexport function getCategoryValue(category, d, tw, includeMutation = false) {\n\tif (category == '') return ''\n\tlet value = d[category]\n\tif (tw?.term.type == 'geneVariant' && tw.q?.type == 'values') {\n\t\tconst mutation = value.split(', ')[0]\n\t\tfor (const id in mclass) {\n\t\t\tconst class_info = mclass[id]\n\t\t\tif (mutation == class_info.label) {\n\t\t\t\tconst mname = d.cat_info[category].find(m => m.class == class_info.key).mname\n\t\t\t\tif (mname && includeMutation) value = `${mname} ${value}`\n\t\t\t}\n\t\t}\n\t}\n\tif (tw?.term.type == 'date') value = getDateStrFromNumber(value)\n\t/** Not all scge terms will have a geneExp value, such as when the scge term\n\t * is a coordTW. When no geneExp value, value = d[category] is the correct value. */ else if (\n\t\ttw?.term.type == SINGLECELL_GENE_EXPRESSION &&\n\t\tNumber.isFinite(d.geneExp)\n\t) {\n\t\tvalue = roundValueAuto(d.geneExp)\n\t} else if (typeof value == 'number' && value % 1 != 0) value = roundValueAuto(value)\n\treturn value\n}\n\n/** Builds `{columns, rows}` in the shape both renderTable and showResultsTable accept.\n * Columns are included only when the plot actually has that term, and the sample-name and\n * Info columns only when at least one row can fill them. */\nexport function buildSampleTableData(config, itemLabel: string, samples: any[]) {\n\tconst hasName = samples.some(d => d.sample || d.cellId)\n\tconst hasInfo = samples.some(d => 'info' in d)\n\n\tconst dims: { tw: any; key: string; sortable?: boolean }[] = [\n\t\t{ tw: config.term, key: 'x' },\n\t\t{ tw: config.term2, key: 'y' },\n\t\t{ tw: config.colorTW, key: 'category' },\n\t\t{ tw: config.shapeTW, key: 'shape' },\n\t\t{ tw: config.scaleDotTW, key: 'scale', sortable: true }\n\t].filter(d => d.tw)\n\n\tconst columns: any[] = []\n\tif (hasName) columns.push({ label: config.controlLabels?.Sample || itemLabel })\n\tfor (const d of dims) columns.push(d.sortable ? { label: d.tw.term.name, sortable: true } : { label: d.tw.term.name })\n\tif (hasInfo) columns.push({ label: 'Info' })\n\n\tconst rows = samples.map(s => {\n\t\tconst row: any[] = []\n\t\tif (hasName) row.push({ value: s.sample || s.cellId || '' })\n\t\tfor (const d of dims) row.push({ value: getCategoryValue(d.key, s, d.tw) })\n\t\tif (hasInfo)\n\t\t\trow.push({\n\t\t\t\tvalue:\n\t\t\t\t\t'info' in s\n\t\t\t\t\t\t? Object.entries(s.info)\n\t\t\t\t\t\t\t\t.map(([k, v]) => `${k}: ${v}`)\n\t\t\t\t\t\t\t\t.join(', ')\n\t\t\t\t\t\t: ''\n\t\t\t})\n\t\treturn row\n\t})\n\treturn { columns, rows }\n}\n", "import { getSamplelstTW, getFilter, addNewGroup } from '../../../mass/groups.js'\nimport { getId } from '#mass/nav'\nimport type { Scatter } from '../scatter'\nimport { buildSampleTableData } from './scatterSampleTable'\nimport { renderTable } from '#dom'\n\nexport class ScatterLasso {\n\tscatter: Scatter\n\tmodel: any\n\tview: any\n\tinteractivity: any\n\tselectedItems!: any[]\n\thasSampleView: boolean\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.scatter = scatter\n\t\tthis.model = scatter.model\n\t\tthis.view = scatter.view\n\t\tthis.interactivity = scatter.interactivity\n\t\tconst supportedChartTypes = this.scatter.state.currentCohortChartTypes\n\t\tthis.hasSampleView = supportedChartTypes && supportedChartTypes.includes('sampleView')\n\t}\n\n\tstart(chart) {\n\t\tif (this.scatter.config.lassoOn) {\n\t\t\tchart.lasso\n\t\t\t\t.items()\n\t\t\t\t.attr('transform', c => this.model.transform(chart, c, 1 / 2))\n\t\t\t\t.style('fill-opacity', c => (this.model.getOpacity(c) != 0 ? 0.5 : 0))\n\t\t\t\t.classed('not_possible', true)\n\t\t\t\t.classed('selected', false)\n\t\t}\n\t}\n\n\tdraw(chart) {\n\t\tif (this.scatter.config.lassoOn) {\n\t\t\t// Style the possible dots\n\n\t\t\tchart.lasso\n\t\t\t\t.possibleItems()\n\t\t\t\t.attr('transform', c => this.model.transform(chart, c, 1.2))\n\t\t\t\t.style('fill-opacity', c => this.model.getOpacity(c))\n\t\t\t\t.classed('not_possible', false)\n\t\t\t\t.classed('possible', true)\n\n\t\t\t//Style the not possible dot\n\t\t\tchart.lasso\n\t\t\t\t.notPossibleItems()\n\t\t\t\t.attr('transform', c => this.model.transform(chart, c, 1 / 2))\n\t\t\t\t.style('fill-opacity', c => (this.model.getOpacity(c) != 0 ? 0.5 : 0))\n\t\t\t\t.classed('not_possible', true)\n\t\t\t\t.classed('possible', false)\n\t\t}\n\t}\n\n\tend(dragEnd, chart) {\n\t\tif (this.scatter.config.lassoOn) {\n\t\t\t// Reset classes of all items (.possible and .not_possible are useful\n\t\t\t// only while drawing lasso. At end of drawing, only selectedItems()\n\t\t\t// should be used)\n\t\t\tchart.lasso.items().classed('not_possible', false).classed('possible', false)\n\t\t\t// Style the selected dots\n\t\t\tchart.lasso.selectedItems().attr('transform', c => this.model.transform(chart, c, 1.3))\n\t\t\tchart.lasso.items().style('fill-opacity', c => this.model.getOpacity(c))\n\t\t\tthis.selectedItems = []\n\t\t\tfor (const item of chart.lasso.selectedItems()) {\n\t\t\t\tconst data = item.__data__\n\t\t\t\tif (!data.isRef && !(data.hidden['category'] || data.hidden['shape'])) this.selectedItems.push(item)\n\t\t\t}\n\t\t\tchart.lasso.notSelectedItems().attr('transform', c => this.model.transform(chart, c))\n\t\t\tconst samples = this.selectedItems.map(item => item.__data__)\n\t\t\tthis.showLassoMenu(dragEnd.sourceEvent, samples)\n\t\t}\n\t}\n\n\tshowLassoMenu(event, samples) {\n\t\tthis.view.dom.tip.clear().hide()\n\t\tif (samples.length == 0) return\n\t\t// A request not authorized to display sample ids yields cohort dots with no sampleId (the server\n\t\t// dropped it). Listing, grouping, filtering and sample view would all submit nothing or build an\n\t\t// empty filter, so offer no menu when any selected dot lacks a real sample id.\n\t\tif (samples.some(s => s.sampleId == null)) return\n\t\tthis.view.dom.tip.show(event.clientX, event.clientY)\n\n\t\tconst labels = this.scatter.config.controlLabels\n\t\tconst menuDiv = this.view.dom.tip.d.append('div')\n\t\tmenuDiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text(`List ${samples.length} ${labels.samples}`)\n\t\t\t.on('click', event => {\n\t\t\t\tthis.view.dom.tip.hide()\n\t\t\t\tthis.showTable(\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Group ' + (this.scatter.config.groups.length + 1),\n\t\t\t\t\t\titems: samples\n\t\t\t\t\t},\n\t\t\t\t\tevent.clientX,\n\t\t\t\t\tevent.clientY,\n\t\t\t\t\tthis.scatter.app.getState().nav.header_mode === 'with_tabs'\n\t\t\t\t)\n\t\t\t})\n\n\t\tif (this.scatter.app.getState().nav.header_mode === 'with_tabs')\n\t\t\tmenuDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.text('Add to a group')\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tthis.createGroup(samples)\n\t\t\t\t\tthis.view.dom.tip.hide()\n\t\t\t\t})\n\n\t\tif (this.scatter.app.getState().nav.header_mode === 'with_tabs')\n\t\t\tmenuDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.text('Add to a group and filter')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tconst tw = this.createGroup(samples)\n\t\t\t\t\tthis.interactivity.addToFilter(tw)\n\t\t\t\t\tthis.view.dom.tip.hide()\n\t\t\t\t})\n\n\t\tif ('sample' in samples[0] && this.hasSampleView)\n\t\t\tmenuDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.text('Open sample view')\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tconst groupSamples: any[] = []\n\t\t\t\t\tfor (const sample of samples) groupSamples.push({ sampleId: sample.sampleId, sampleName: sample.sample })\n\t\t\t\t\tthis.scatter.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tid: getId(),\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tchartType: 'sampleView',\n\t\t\t\t\t\t\tsamples: groupSamples\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tthis.view.dom.tip.hide()\n\t\t\t\t})\n\t}\n\n\tcreateGroup(samples) {\n\t\tconst group = {\n\t\t\tname: 'Group',\n\t\t\titems: samples\n\t\t}\n\t\tconst tw = getSamplelstTW([group])\n\t\tconst filter = getFilter(tw)\n\t\taddNewGroup(this.scatter.app, filter, this.scatter.state.groups)\n\t\treturn tw\n\t}\n\n\tlassoReset(chart) {\n\t\tconst mainG = chart.mainG\n\n\t\tif (this.scatter.config.lassoOn) {\n\t\t\tchart.lasso\n\t\t\t\t.items(mainG.select('.sjpcb-scatter-series').selectAll('path[name=\"serie\"]'))\n\t\t\t\t.targetArea(mainG)\n\t\t\t\t.on('start', () => this.start(chart))\n\t\t\t\t.on('draw', () => this.draw(chart))\n\t\t\t\t.on('end', event => this.end(event, chart))\n\t\t\t// this seems to clear stale lasso data as sometimes seen\n\t\t\t// when the global filter is changed between lassoing\n\t\t\t// uncertain explanation: the svg and mainG is potentially different between rerenders,\n\t\t\t// so the previous mainG.call(chart.lasso) inside toggle_lasso is on a removed mainG????\n\t\t\tmainG.on('.zoom', null)\n\t\t\tmainG.on('mousedown.drag', null)\n\t\t\tmainG.call(chart.lasso)\n\t\t} else {\n\t\t\tchart.mainG.on('.dragstart', null)\n\t\t\tchart.mainG.on('.drag', null)\n\t\t\tchart.mainG.on('.dragend', null)\n\t\t}\n\t}\n\n\tshowTable(group, x, y, addGroup) {\n\t\t// same samples and same columns as the hover/click table, so both come from one builder.\n\t\t// this also picks up value formatting (geneVariant mname, dates, rounding) that the\n\t\t// hand-rolled version here did not do, and pads the Info cell on rows that have none \u2014\n\t\t// previously those rows came out one cell short and shifted under the header\n\t\tconst { columns, rows } = buildSampleTableData(this.scatter.config, this.scatter.settings.itemLabel, group.items)\n\t\tconst hasSampleName = 'sample' in group.items[0]\n\n\t\tthis.view.dom.tip.clear()\n\t\tconst div = this.view.dom.tip.d.append('div').style('padding', '5px')\n\t\tconst headerDiv = div.append('div').style('margin-top', '5px')\n\n\t\tconst groupDiv = headerDiv\n\t\t\t.append('div')\n\t\t\t.html('&nbsp;' + group.name)\n\t\t\t.style('font-size', '0.9rem')\n\t\t\t.on('click', () => {\n\t\t\t\tconst isEdit = groupDiv.select('input').empty()\n\t\t\t\tif (!isEdit) return\n\t\t\t\tgroupDiv.html('')\n\t\t\t\tconst input = groupDiv\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.attr('value', group.name)\n\t\t\t\t\t.on('change', async () => {\n\t\t\t\t\t\tconst name = input.node().value\n\t\t\t\t\t\tif (name) group.name = name\n\t\t\t\t\t\telse input.node().value = group.name\n\t\t\t\t\t\tgroupDiv.html('&nbsp;' + group.name)\n\t\t\t\t\t})\n\t\t\t\tinput.node().focus()\n\t\t\t\tinput.node().select()\n\t\t\t})\n\t\tconst tableDiv = div.append('div')\n\t\tlet buttons\n\t\tif (addGroup) {\n\t\t\tconst addGroupCallback = {\n\t\t\t\ttext: 'Add to a group',\n\t\t\t\tcallback: indexes => {\n\t\t\t\t\tconst items: any[] = []\n\t\t\t\t\tfor (const i of indexes) items.push(this.selectedItems[i].__data__)\n\t\t\t\t\tconst group = {\n\t\t\t\t\t\tname: `Group ${this.scatter.config.groups.length + 1}`,\n\t\t\t\t\t\titems,\n\t\t\t\t\t\tindex: this.scatter.config.groups.length\n\t\t\t\t\t}\n\t\t\t\t\tconst filter = getFilter(getSamplelstTW([group]))\n\t\t\t\t\taddNewGroup(this.scatter.app, filter, this.scatter.state.groups)\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuttons = [addGroupCallback]\n\t\t}\n\n\t\tconst columnButton = {\n\t\t\ttext: 'View',\n\t\t\tcallback: async (event, i) => {\n\t\t\t\tconst sample = group.items[i]\n\t\t\t\tthis.interactivity.openSampleView(sample)\n\t\t\t}\n\t\t}\n\t\tconst columnButtons: any[] = hasSampleName && this.hasSampleView ? [columnButton] : []\n\t\trenderTable({\n\t\t\trows,\n\t\t\tcolumns,\n\t\t\tdiv: tableDiv,\n\t\t\tshowLines: true,\n\t\t\t//maxWidth: columns.length * '15' + 'vw',\n\t\t\tmaxHeight: '35vh',\n\t\t\tbuttons,\n\t\t\tselectAll: true,\n\t\t\tcolumnButtons\n\t\t})\n\n\t\tthis.view.dom.tip.show(x, y, false, false)\n\t}\n}\n", "import { shapesArray } from '#dom'\nimport { rgb } from 'd3-color'\nimport { scaleLinear as d3Linear, scaleTime } from 'd3-scale'\nimport { axisLeft, axisBottom } from 'd3-axis'\nimport { regressionPoly } from 'd3-regression'\nimport type { Scatter } from '../scatter'\nimport { getDateFromNumber } from '#shared/terms.js'\nimport type { ColorLegendItem, ScatterChart, ScatterDataResult, ScatterRanges, ShapeLegendItem } from '../scatterTypes'\nimport { type SingleCellPlotDataResult, SINGLECELL_GENE_EXPRESSION, SINGLECELL_NUMERIC_VALUE } from '#types'\nimport { xAxisOffSet, yAxisOffSet, getCoordinate, calculatePadding } from '#shared'\n\n//icons have size 16x16\nexport const shapes = shapesArray\n\nexport abstract class ScatterModelBase {\n\tscatter: Scatter\n\tcharts!: ScatterChart[]\n\tis3D: boolean\n\tis2DLarge: boolean\n\taxisOffset: { x: number; y: number }\n\tstartGradient: any\n\tstopGradient: any\n\trange!: ScatterRanges\n\tfilterSampleStr: string | null = null\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.scatter = scatter\n\n\t\tthis.is3D = false\n\t\tthis.is2DLarge = false\n\t\tthis.axisOffset = { x: xAxisOffSet, y: yAxisOffSet }\n\t}\n\n\tabstract getDataRequestOpts(): any\n\tabstract initData(): Promise<void>\n\n\tcreateChart(id: string, data: ScatterDataResult | SingleCellPlotDataResult) {\n\t\t// isRef marks reference-cloud dots; the server sets it once (from sampleId presence, before any\n\t\t// anonymization) so a denied request that drops sampleId still classifies cohort dots correctly.\n\t\tconst cohortSamples: any[] = data.samples ? data.samples.filter(sample => !sample.isRef) : []\n\t\tif (cohortSamples.length > this.scatter.settings.maxSvgSamplesCutoff) this.is2DLarge = true\n\t\tconst colorLegend: Map<string, ColorLegendItem> = new Map(data.colorLegend)\n\t\tconst shapeLegend: Map<string, ShapeLegendItem> = new Map(data.shapeLegend)\n\t\tconst chart: ScatterChart = { id, data, cohortSamples, colorLegend, shapeLegend }\n\t\tif (data.src) {\n\t\t\tchart.src = data.src\n\t\t\tif ('canvasWidth' in data) chart.canvasWidth = data.canvasWidth\n\t\t\tif ('canvasHeight' in data) chart.canvasHeight = data.canvasHeight\n\t\t\tif (data.totalSampleCount) chart.totalSampleCount = data.totalSampleCount\n\t\t\tthis.is2DLarge = true\n\t\t}\n\t\tthis.charts.push(chart)\n\t}\n\n\tasync initRanges() {\n\t\tconst settings = this.scatter.settings\n\t\tlet samples: any[] = []\n\t\tfor (const chart of this.charts) samples = samples.concat(chart.data?.samples || [])\n\t\tif (samples.length == 0) {\n\t\t\tif (this.scatter.config.singleCellPlot) {\n\t\t\t\tthis.charts[0].ranges = {\n\t\t\t\t\txMin: settings.minXScale != null ? settings.minXScale : this.range.xMin,\n\t\t\t\t\txMax: settings.maxXScale != null ? settings.maxXScale : this.range.xMax,\n\t\t\t\t\tyMin: settings.minYScale != null ? settings.minYScale : this.range.yMin,\n\t\t\t\t\tyMax: settings.maxYScale != null ? settings.maxYScale : this.range.yMax,\n\t\t\t\t\tgeMin: this.range.geMin,\n\t\t\t\t\tgeMax: this.range.geMax\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tif (samples.length > settings.maxSvgSamplesCutoff) this.is2DLarge = true\n\t\tconst s0 = samples[0] //First sample to start reduce comparisons\n\t\tconst [xMin, xMax, yMin, yMax, zMin, zMax, scaleMin, scaleMax, geMin, geMax] = samples.reduce(\n\t\t\t(s, d) => [\n\t\t\t\td.x < s[0] ? d.x : s[0],\n\t\t\t\td.x > s[1] ? d.x : s[1],\n\t\t\t\td.y < s[2] ? d.y : s[2],\n\t\t\t\td.y > s[3] ? d.y : s[3],\n\t\t\t\td.z < s[4] ? d.z : s[4],\n\t\t\t\td.z > s[5] ? d.z : s[5],\n\t\t\t\t'scale' in d ? (d.scale < s[6] ? d.scale : s[6]) : Number.POSITIVE_INFINITY,\n\t\t\t\t'scale' in d ? (d.scale > s[7] ? d.scale : s[7]) : Number.NEGATIVE_INFINITY,\n\t\t\t\t'geneExp' in d ? (d.geneExp < s[8] ? d.geneExp : s[8]) : Number.POSITIVE_INFINITY,\n\t\t\t\t'geneExp' in d ? (d.geneExp > s[9] ? d.geneExp : s[9]) : Number.NEGATIVE_INFINITY\n\t\t\t],\n\t\t\t[s0.x, s0.x, s0.y, s0.y, s0.z, s0.z, s0.scale, s0.scale, s0.geneExp, s0.geneExp]\n\t\t)\n\t\tfor (const chart of this.charts) {\n\t\t\tchart.ranges = {\n\t\t\t\txMin: settings.minXScale != null ? settings.minXScale : settings.useGlobalMinMax ? this.range.xMin : xMin,\n\t\t\t\txMax: settings.maxXScale != null ? settings.maxXScale : settings.useGlobalMinMax ? this.range.xMax : xMax,\n\t\t\t\tyMin: settings.minYScale != null ? settings.minYScale : settings.useGlobalMinMax ? this.range.yMin : yMin,\n\t\t\t\tyMax: settings.maxYScale != null ? settings.maxYScale : settings.useGlobalMinMax ? this.range.yMax : yMax,\n\t\t\t\tzMin,\n\t\t\t\tzMax,\n\t\t\t\tscaleMin,\n\t\t\t\tscaleMax,\n\t\t\t\tgeMin,\n\t\t\t\tgeMax\n\t\t\t}\n\t\t}\n\t}\n\n\tgetOpacity(c) {\n\t\tif (!c.isRef) {\n\t\t\tconst hidden = c.hidden?.['category'] || c.hidden?.['shape']\n\t\t\tif (this.filterSampleStr) {\n\t\t\t\tif (!c.sample?.toLowerCase().includes(this.filterSampleStr.toLowerCase())) {\n\t\t\t\t\tif (hidden) return 0\n\t\t\t\t\telse return 0.1\n\t\t\t\t} else return 1.2\n\t\t\t}\n\t\t\tconst opacity = hidden ? 0 : this.scatter.settings.opacity\n\t\t\treturn opacity\n\t\t}\n\t\tconst refOpacity = this.scatter.settings.showRef ? this.scatter.settings.opacity : 0\n\t\treturn refOpacity\n\t}\n\n\tgetShape(chart, c) {\n\t\tconst index = chart.shapeLegend.get(c.shape).shape % shapes.length\n\t\treturn shapes[index]\n\t}\n\n\t/** Returns the calculated coordinate or the min/max axis\n\t * cap set by the user. */\n\tgetCoordinates(chart, c) {\n\t\tconst cx = () => {\n\t\t\treturn getCoordinate(c.x, this.scatter.settings.minXScale, this.scatter.settings.maxXScale)\n\t\t}\n\t\tconst cy = () => {\n\t\t\treturn getCoordinate(c.y, this.scatter.settings.minYScale, this.scatter.settings.maxYScale)\n\t\t}\n\t\tconst x = chart.xAxisScale(cx())\n\t\tconst y = chart.yAxisScale(cy())\n\t\treturn { x, y }\n\t}\n\n\tgetScale(chart, c, factor = 1) {\n\t\tconst isRef = !!c.isRef\n\t\tlet scale\n\t\tif (!this.scatter.config.scaleDotTW || isRef) {\n\t\t\tscale = isRef ? this.scatter.settings.refSize : this.scatter.settings.size\n\t\t} else {\n\t\t\tconst range = this.scatter.settings.maxShapeSize - this.scatter.settings.minShapeSize\n\t\t\tif (this.scatter.settings.scaleDotOrder == 'Ascending')\n\t\t\t\tscale =\n\t\t\t\t\tthis.scatter.settings.minShapeSize +\n\t\t\t\t\t((c.scale - chart.ranges.scaleMin) / (chart.ranges.scaleMax - chart.ranges.scaleMin)) * range\n\t\t\telse\n\t\t\t\tscale =\n\t\t\t\t\tthis.scatter.settings.maxShapeSize -\n\t\t\t\t\t((c.scale - chart.ranges.scaleMin) / (chart.ranges.scaleMax - chart.ranges.scaleMin)) * range\n\t\t}\n\t\tconst zoom = this.is2DLarge ? this.scatter.zoom : 1 //if not 2d large the whole chart is zoomed\n\t\tscale = (zoom * scale * factor) / 3\n\t\tif (this.filterSampleStr) {\n\t\t\tif (c.sample?.toLowerCase().includes(this.filterSampleStr.toLowerCase())) scale = scale * 2\n\t\t\telse scale = scale * 0.8\n\t\t}\n\t\treturn scale\n\t}\n\n\ttransform(chart, c, factor = 1) {\n\t\tconst scale = this.getScale(chart, c, factor)\n\t\tconst particleSize = 16 * scale\n\t\tconst { x, y } = this.getCoordinates(chart, c)\n\t\tconst offSetX = x - particleSize / 2\n\t\tconst offSetY = y - particleSize / 2\n\t\tconst transform = `translate(${offSetX},${offSetY}) scale(${scale})` // original icons are scaled to 0.3\n\t\treturn transform\n\t}\n\n\tgetColor(c, chart) {\n\t\tif (this.scatter.config.colorTW?.term.type == SINGLECELL_GENE_EXPRESSION) {\n\t\t\tlet color\n\t\t\tif (!c.geneExp) color = this.scatter.settings.noExpColor\n\t\t\telse if (c.geneExp > chart.ranges.geMax) color = this.scatter.settings.expColor\n\t\t\telse color = chart.colorGenerator(c.geneExp)\n\t\t\treturn color\n\t\t}\n\t\tif (this.scatter.config.colorTW?.q.mode == 'continuous' && !c.isRef) {\n\t\t\tconst [min, max] = chart.colorGenerator.domain()\n\t\t\tif (c.category < min) return chart.colorGenerator(min)\n\t\t\tif (c.category > max) return chart.colorGenerator(max)\n\t\t\tconst color = chart.colorGenerator(c.category)\n\t\t\treturn color\n\t\t}\n\t\tif (c.category == 'Default') return this.scatter.settings.defaultColor\n\t\tconst category = chart.colorLegend.get(c.category)\n\t\treturn category.color\n\t}\n\n\tasync addGroup(group) {\n\t\tgroup.plotId = this.scatter.id\n\t\tawait this.scatter.app.vocabApi.addGroup(group)\n\t}\n\n\tgetStrokeWidth(c) {\n\t\tconst opacity = this.getOpacity(c)\n\t\tif (opacity <= 0.2)\n\t\t\t//hidden by filter or search\n\t\t\treturn 0\n\t\tif (opacity == 1.2)\n\t\t\t//samples searched\n\t\t\treturn 2\n\t\treturn 1\n\t}\n\n\tinitAxes(chart) {\n\t\tconst config = this.scatter.config\n\t\tconst settings = this.scatter.settings\n\t\t// To enable showing axes for large single cell plots in the future, use this line.\n\t\t// if ((!chart.data?.samples || chart.data.samples.length == 0) && !chart.totalSampleCount) return\n\t\tif (!chart.data?.samples || chart.data.samples.length == 0) return\n\t\tconst offsetX = this.axisOffset.x\n\t\tconst offsetY = this.axisOffset.y\n\t\tconst xMin = chart.ranges.xMin\n\t\tconst xMax = chart.ranges.xMax\n\t\tconst yMin = chart.ranges.yMin\n\t\tconst yMax = chart.ranges.yMax\n\t\t//unless there is a capping in the min/max values add a minimal extra space in the plot\n\t\tconst extraSpaceX = calculatePadding(settings.minXScale, settings.maxXScale, xMin, xMax) //extra space added to avoid clipping the particles on the X axis\n\t\tconst extraSpaceY = calculatePadding(settings.minYScale, settings.maxYScale, yMin, yMax) //extra space added to avoid clipping the particles on the Y axis\n\t\tchart.xAxisScale = d3Linear()\n\t\t\t.domain([xMin - extraSpaceX, xMax + extraSpaceX])\n\t\t\t.range([offsetX, settings.svgw + offsetX])\n\t\tif (config.term && config.term.term.type == 'date') {\n\t\t\tconst xMinDate = getDateFromNumber(xMin - extraSpaceX)\n\t\t\tconst xMaxDate = getDateFromNumber(xMax + extraSpaceX)\n\n\t\t\tchart.xAxisScaleTime = scaleTime()\n\t\t\t\t.domain([xMinDate, xMaxDate])\n\t\t\t\t.range([offsetX, settings.svgw + offsetX])\n\n\t\t\tchart.axisBottom = axisBottom(chart.xAxisScaleTime)\n\t\t} else chart.axisBottom = axisBottom(chart.xAxisScale)\n\t\tconst svgh = settings.svgh\n\t\tchart.yAxisScale = d3Linear()\n\t\t\t.domain([yMax + extraSpaceY, yMin - extraSpaceY])\n\t\t\t.range([offsetY, svgh + offsetY])\n\t\tif (config.term2 && config.term2.term.type == 'date') {\n\t\t\tconst yMinDate = getDateFromNumber(yMin - extraSpaceY)\n\t\t\tconst yMaxDate = getDateFromNumber(yMax + extraSpaceY)\n\n\t\t\t// Flip the domain (max first) to mirror the numeric yAxisScale above. In SVG the y range\n\t\t\t// grows downward, so the numeric scale uses [yMax, yMin] to render larger values at the top;\n\t\t\t// the date axis must match, otherwise the axis labels run opposite to the plotted dots\n\t\t\t// (which are always positioned with yAxisScale), making the y-axis appear inverted.\n\t\t\tchart.yAxisScaleTime = scaleTime()\n\t\t\t\t.domain([yMaxDate, yMinDate])\n\t\t\t\t.range([offsetY, settings.svgh + offsetY])\n\n\t\t\tchart.axisLeft = axisLeft(chart.yAxisScaleTime)\n\t\t} else chart.axisLeft = axisLeft(chart.yAxisScale)\n\n\t\tchart.zAxisScale = d3Linear().domain([chart.ranges.zMin, chart.ranges.zMax]).range([0, settings.svgd])\n\n\t\tthis.initColorGenerator(chart)\n\t}\n\n\tinitColorDefaults(chartId: string) {\n\t\tconst config = this.scatter.config\n\t\tconst settings = this.scatter.settings\n\n\t\tconst gradientColor = rgb(settings.defaultColor)\n\t\tconfig.startColor ||= {}\n\t\tconfig.stopColor ||= {}\n\t\t// supply start and stop color, if term has hardcoded colors, use; otherwise use default\n\t\tif (!config.startColor[chartId]) {\n\t\t\tconfig.startColor[chartId] =\n\t\t\t\tconfig.colorTW?.term.type == SINGLECELL_GENE_EXPRESSION\n\t\t\t\t\t? settings.noExpColor\n\t\t\t\t\t: config.colorTW?.term.continuousColorScale?.minColor || gradientColor.brighter().brighter().toString()\n\t\t}\n\n\t\tif (!config.stopColor[chartId]) {\n\t\t\tconfig.stopColor[chartId] =\n\t\t\t\tconfig.colorTW?.term.type == SINGLECELL_GENE_EXPRESSION\n\t\t\t\t\t? settings.expColor\n\t\t\t\t\t: config.colorTW?.term.continuousColorScale?.maxColor || gradientColor.darker().toString()\n\t\t}\n\t}\n\n\tinitColorGenerator(chart) {\n\t\tconst config = this.scatter.config\n\t\tif (!chart.ranges) return\n\t\tthis.initColorDefaults(chart.id)\n\t\t// Handle continuous color scaling when color term wrapper is in continuous mode\n\t\tif (config.colorTW?.q.mode === 'continuous') {\n\t\t\t// Extract and sort all sample values for our calculations\n\t\t\t// We filter out any values that are explicitly defined in the term values\n\t\t\t// This gives us the raw numerical data we need for scaling\n\t\t\tlet colorValues\n\t\t\tif (config.colorTW.term.type == SINGLECELL_GENE_EXPRESSION ||\n\t\t\t\t(config.colorTW.term.type == SINGLECELL_NUMERIC_VALUE && chart.data.src)) {\n\t\t\t\tcolorValues = [chart.ranges.geMin, chart.ranges.geMax]\n\t\t\t} else {\n\t\t\t\tcolorValues = chart.cohortSamples\n\t\t\t\t\t.filter(s => !config.colorTW.term.values || !(s.category in config.colorTW.term.values))\n\t\t\t\t\t.map(s => Number(s.category))\n\t\t\t\t\t.sort((a, b) => a - b)\n\t\t\t}\n\t\t\tchart.colorValues = colorValues // to use it in renderLegend\n\t\t\t// Determine min/max based on current mode\n\t\t\tlet min, max, index\n\t\t\tconst colorScaleSettings = config.settings.sampleScatter\n\n\t\t\tswitch (colorScaleSettings.colorScaleMode) {\n\t\t\t\t// Fixed mode: Use user-defined min/max values\n\t\t\t\t// This is useful when you want consistent scaling across different views\n\t\t\t\tcase 'fixed':\n\t\t\t\t\tmin = colorScaleSettings.colorScaleMinFixed\n\t\t\t\t\tmax = colorScaleSettings.colorScaleMaxFixed\n\t\t\t\t\tbreak\n\n\t\t\t\tcase 'percentile':\n\t\t\t\t\t// Percentile mode: Scale based on data distribution\n\t\t\t\t\tmin = colorValues[0] // Start at the first value of the array for percentile mode\n\t\t\t\t\t// Calculate the value at the specified percentile\n\t\t\t\t\t// This helps handle outliers by focusing on the main distribution\n\t\t\t\t\tindex = Math.floor((colorValues.length * colorScaleSettings.colorScalePercentile) / 100)\n\t\t\t\t\tmax = colorValues[index]\n\t\t\t\t\tbreak\n\n\t\t\t\tcase 'auto':\n\t\t\t\tdefault:\n\t\t\t\t\t// Auto mode (default): Use the full range of the data\n\t\t\t\t\t// This gives the most accurate representation of the actual data distribution\n\t\t\t\t\tmin = colorValues[0]\n\t\t\t\t\tmax = colorValues[colorValues.length - 1] // Since the values are already sorted in ascending\n\t\t\t\t\t// order just get the first and last values\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Canvas responses carry the domain computed from the full cell distribution.\n\t\t\t// Do not estimate percentiles from the two raw extrema returned with the image.\n\t\t\tif (chart.data.src && 'colorDomain' in chart.data && chart.data.colorDomain) {\n\t\t\t\t[min, max] = chart.data.colorDomain\n\t\t\t}\n\t\t\t// Create the color generator using d3's linear scale\n\t\t\t// This maps our numerical range to a color gradient\n\n\t\t\tchart.colorGenerator = d3Linear()\n\t\t\t\t.domain([min, max])\n\t\t\t\t.range([config.startColor[chart.id], config.stopColor[chart.id]])\n\n\t\t\t// Store the current range for reference\n\t\t\t// This is useful when we need to recreate the color generator\n\t\t\t// or check the current scaling values\n\t\t\tchart.currentColorRange = { min, max }\n\t\t}\n\t}\n\n\tasync processData() {\n\t\tconst term0Values = this.scatter.config.term0?.term.values\n\t\tif (term0Values) {\n\t\t\t// sort the divideBy subCharts based on pre-defined term0 order in db\n\t\t\tconst orderedLabels: any = Object.values(term0Values).sort((a: any, b: any) =>\n\t\t\t\t'order' in a && 'order' in b ? a.order - b.order : 0\n\t\t\t)\n\t\t\tthis.charts.sort(\n\t\t\t\t(a, b) => orderedLabels.findIndex(v => v.label == a.id) - orderedLabels.findIndex(v => v.label == b.id)\n\t\t\t)\n\t\t}\n\t\tfor (const chart of this.charts) {\n\t\t\tthis.initAxes(chart)\n\t\t\tif (!chart.colorGenerator) this.initColorGenerator(chart)\n\t\t\tconst regressionType = this.scatter.settings.regression\n\n\t\t\tif (!regressionType || regressionType == 'None') continue\n\t\t\tlet regression\n\t\t\tconst data: any = []\n\t\t\tawait chart.cohortSamples.forEach(c => {\n\t\t\t\tdata.push(this.getCoordinates(chart, c))\n\t\t\t})\n\t\t\tlet regressionCurve\n\t\t\t// if (regressionType == 'Loess') {\n\t\t\t// \tregression = regressionLoess()\n\t\t\t// \t\t.x(c => c.x)\n\t\t\t// \t\t.y(c => c.y)\n\t\t\t// \t\t.bandwidth(0.25)\n\t\t\t// \tregressionCurve = regression(data)\n\t\t\t// } else\n\t\t\tif (regressionType == 'Polynomial') {\n\t\t\t\tregression = regressionPoly()\n\t\t\t\t\t.x(c => c.x)\n\t\t\t\t\t.y(c => c.y)\n\t\t\t\t\t.order(3)\n\t\t\t\tregressionCurve = regression(data)\n\t\t\t} else if (regressionType == 'Lowess') {\n\t\t\t\tconst X: any = [],\n\t\t\t\t\tY: any = []\n\t\t\t\tfor (const sample of data) {\n\t\t\t\t\tX.push(sample.x)\n\t\t\t\t\tY.push(sample.y)\n\t\t\t\t}\n\t\t\t\tregressionCurve = await this.scatter.vocabApi!.getLowessCurve({ coords: { X, Y } })\n\t\t\t} else {\n\t\t\t\tthrow `unsupported regression type='${regressionType}'`\n\t\t\t}\n\t\t\tchart.regressionCurve = regressionCurve\n\t\t}\n\t}\n}\n", "import type { Scatter } from '../scatter'\nimport type { ScatterResponse, ScatterDataResult } from '../scatterTypes'\nimport { ScatterModelBase } from './ScatterModelBase'\n// Re-export shapes for consumers that import from this module\nexport { shapes } from './ScatterModelBase'\n\nexport class ScatterModel extends ScatterModelBase {\n\tconstructor(scatter: Scatter) {\n\t\tsuper(scatter)\n\t}\n\n\t// creates an opts object for the vocabApi.someMethod(),\n\t// may need to add a new method to client/termdb/vocabulary.js\n\t// for now, just add methods to TermdbVocab,\n\t// later on, add methods with same name to FrontendVocab\n\tgetDataRequestOpts() {\n\t\tconst c: any = this.scatter.config\n\n\t\tconst coordTWs: any = []\n\t\tif (c.term) coordTWs.push(c.term)\n\t\tif (c.term2) coordTWs.push(c.term2)\n\t\t//If filter is provided in the config use it. The config filter includes the term filter, used by the report plot\n\t\tconst filter = this.scatter.parentId ? this.scatter.state.termfilter.filter : this.scatter.getFilter()\n\t\tconst opts: any = {\n\t\t\tname: c.name, // the actual identifier of the plot, for retrieving data from server\n\t\t\tcolorTW: c.colorTW,\n\t\t\tfilter,\n\t\t\tcoordTWs,\n\t\t\tchartType: this.scatter.type,\n\t\t\texcludeOutliers: this.scatter.settings.excludeOutliers\n\t\t}\n\t\tif (this.scatter.state.termfilter.filter0) opts.filter0 = this.scatter.state.termfilter.filter0\n\t\tif (c.colorColumn) opts.colorColumn = c.colorColumn\n\t\tif (c.shapeTW) opts.shapeTW = c.shapeTW\n\t\tif (c.scaleDotTW) {\n\t\t\tif (!c.scaleDotTW.q) c.scaleDotTW.q = {}\n\t\t\tc.scaleDotTW.q.mode = 'continuous'\n\t\t\topts.scaleDotTW = c.scaleDotTW\n\t\t}\n\t\tif (c.term0) opts.divideByTW = c.term0\n\n\t\treturn opts\n\t}\n\n\tasync initData() {\n\t\ttry {\n\t\t\tconst reqOpts = this.getDataRequestOpts()\n\t\t\tif (reqOpts.coordTWs?.length == 1 && this.scatter.type == 'sampleScatter') return //To allow removing a term in the controls, though nothing is rendered (summary tab with violin active)\n\n\t\t\tconst data: ScatterResponse = await this.scatter.app.vocabApi.getScatterData(\n\t\t\t\treqOpts,\n\t\t\t\tthis.scatter.api?.getAbortSignal()\n\t\t\t)\n\t\t\tif ('error' in data || !data.result) throw new Error(data['error'] || 'No data received')\n\t\t\tthis.charts = []\n\t\t\tthis.range = data.range\n\t\t\tfor (const [key, chartData] of Object.entries(data.result)) {\n\t\t\t\tconst chart = chartData as ScatterDataResult\n\t\t\t\tif (!Array.isArray(chart.samples)) throw new Error('data.samples[] not array')\n\t\t\t\tthis.createChart(key, chart)\n\t\t\t}\n\n\t\t\tthis.is3D = this.scatter.config.term0?.q.mode == 'continuous'\n\t\t\tthis.initRanges()\n\t\t} catch (e: any) {\n\t\t\tif (this.scatter.app.isAbortError(e)) return\n\t\t\tconsole.error(e)\n\t\t\tthrow e.message || e\n\t\t}\n\t}\n}\n", "import { Menu, shapeSelector } from '#dom'\nimport { rgb } from 'd3-color'\nimport type { Scatter } from '../scatter'\nimport { scaleLinear as d3Linear } from 'd3-scale'\n\nexport class ScatterLegendInteractivity {\n\tscatter: Scatter\n\tshapeTW: any\n\tcolorTW: any\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.scatter = scatter\n\t}\n\n\tonLegendClick(chart, name, key, e, category) {\n\t\tconst tw = this.scatter.config[name]\n\t\tconst isColorTW = name == 'colorTW'\n\t\tconst hidden = tw.q.hiddenValues ? key in tw.q.hiddenValues : false\n\t\tconst hiddenCount = tw.q.hiddenValues ? Object.keys(tw.q.hiddenValues).length : 0\n\n\t\tif (hidden && hiddenCount == 1) {\n\t\t\t//show hidden category and skip menu\n\t\t\tthis.hideCategory(tw, key, false)\n\t\t\tthis.dispatchConfig(name, tw)\n\t\t\treturn\n\t\t}\n\t\tconst menu = new Menu({ padding: '0px' })\n\t\tconst div = menu.d.append('div')\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text(hidden ? 'Show' : 'Hide')\n\t\t\t.on('click', () => {\n\t\t\t\tthis.hideCategory(tw, key, !hidden)\n\t\t\t\tmenu.hide()\n\t\t\t\tthis.dispatchConfig(name, tw)\n\t\t\t})\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text('Show only')\n\t\t\t.on('click', () => {\n\t\t\t\tconst map = name == 'colorTW' ? chart.colorLegend : chart.shapeLegend\n\t\t\t\tfor (const mapKey of map.keys())\n\t\t\t\t\tthis.hideCategory(\n\t\t\t\t\t\ttw,\n\t\t\t\t\t\tmapKey,\n\t\t\t\t\t\ttw.term.type == 'geneVariant' && tw.q.type == 'values' ? !mapKey.startsWith(key) : mapKey != key\n\t\t\t\t\t)\n\n\t\t\t\tmenu.hide()\n\t\t\t\tthis.dispatchConfig(name, tw)\n\t\t\t})\n\t\tif (hiddenCount > 1)\n\t\t\tdiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.text('Show all')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tmenu.hide()\n\t\t\t\t\tconst map = isColorTW ? chart.colorLegend : chart.shapeLegend\n\t\t\t\t\tfor (const mapKey of map.keys()) this.hideCategory(tw, mapKey, false)\n\t\t\t\t\tthis.dispatchConfig(name, tw)\n\t\t\t\t})\n\t\tif (isColorTW) {\n\t\t\tconst color = rgb(category.color).formatHex()\n\t\t\tconst input: any = div\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_sharp_border')\n\t\t\t\t.style('padding', '0px 10px')\n\t\t\t\t.text('Color:')\n\t\t\t\t.append('input')\n\t\t\t\t.attr('type', 'color')\n\t\t\t\t.attr('value', color)\n\t\t\t\t.on('change', () => {\n\t\t\t\t\tthis.changeColor(category.key, input.node().value)\n\t\t\t\t\tmenu.hide()\n\t\t\t\t})\n\t\t}\n\t\tif (!isColorTW) {\n\t\t\t//is shape\n\t\t\tdiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.text('Change shape')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tdiv.selectAll('*').remove()\n\t\t\t\t\tconst callback = index => {\n\t\t\t\t\t\tthis.changeShape(category.key, index)\n\t\t\t\t\t\tmenu.hide()\n\t\t\t\t\t}\n\t\t\t\t\tshapeSelector(div, callback)\n\t\t\t\t})\n\t\t}\n\n\t\tmenu.showunder(e.target)\n\t}\n\n\tasync changeShape(key, shape) {\n\t\tconst tw = this.scatter.config.shapeTW\n\t\tif (!tw.term.values) tw.term.values = {}\n\t\tif (!tw.term.values[key]) tw.term.values[key] = {}\n\t\ttw.term.values[key].shape = shape\n\t\tawait this.scatter.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.scatter.id,\n\t\t\tconfig: { shapeTW: tw }\n\t\t})\n\t}\n\n\tdispatchConfig(name, tw) {\n\t\tthis.scatter.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.scatter.id,\n\t\t\tconfig: { [name]: tw }\n\t\t})\n\t}\n\n\thideCategory(tw, key, hide) {\n\t\tif (!tw.q) tw.q = {}\n\t\tif (!tw.q.hiddenValues) tw.q.hiddenValues = {}\n\t\t// term.values may be missing entirely (e.g. a binned gene expression term, where the legend\n\t\t// key is the bin label); fall back to a {key,label} stub rather than throwing\n\t\tconst value =\n\t\t\t!(tw.term.type == 'geneVariant' && tw.q.type == 'values') && tw.term.values?.[key]\n\t\t\t\t? tw.term.values[key]\n\t\t\t\t: { key: key, label: key }\n\n\t\tif (!hide) delete tw.q.hiddenValues[key]\n\t\telse tw.q.hiddenValues[key] = value\n\t\tif (key == 'Ref') {\n\t\t\tthis.scatter.settings.showRef = !hide\n\t\t\tthis.scatter.app.dispatch({\n\t\t\t\ttype: 'plot_edit',\n\t\t\t\tid: this.scatter.id,\n\t\t\t\tconfig: {\n\t\t\t\t\tsettings: { sampleScatter: this.scatter.settings }\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tchangeGradientColor(chart, color, idx) {\n\t\tconst hexColor = rgb(color).formatHex()\n\t\tconst colorKey = idx == 0 ? 'startColor' : 'stopColor'\n\t\tthis.scatter.config[colorKey][chart.id] = hexColor\n\n\t\t// Recreate color generator with current settings\n\t\tconst range = chart.currentColorRange || chart.colorGenerator.domain()\n\t\tchart.colorGenerator = d3Linear()\n\t\t\t.domain(range)\n\t\t\t.range([this.scatter.config.startColor[chart.id], this.scatter.config.stopColor[chart.id]])\n\n\t\t// Update the configuration\n\t\tthis.scatter.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.scatter.id,\n\t\t\tconfig: this.scatter.config\n\t\t})\n\t}\n\n\tasync changeColor(key, color) {\n\t\tconst tw = this.scatter.config.colorTW\n\t\tif (!tw.term.values) tw.term.values = {}\n\t\tif (!tw.term.values[key]) tw.term.values[key] = {}\n\t\ttw.term.values[key].color = color\n\t\tawait this.scatter.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.scatter.id,\n\t\t\tconfig: { colorTW: tw }\n\t\t})\n\t}\n}\n", "import { fillTermWrapper } from '#termsetting'\nimport { Menu, formatHeaderText } from '#dom'\nimport type { Scatter } from '../scatter.js'\nimport { isNumericTerm, numericTypes, dictionaryNumericTypes } from '#shared/terms.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { getSingleCellSpecialCase } from '#plots/sc/utils/specialCase.ts'\n\nexport const minShapeSize = 0.2\nexport const maxShapeSize = 6\nconst chartSizeMin = 200\nconst chartSizeMax = 800\n\n/* defaultQ for a newly selected shape term, keyed by term type (see TwRouter.fill()).\n\nOnly a handful of shapes are available and they are hard to tell apart, so a numeric shape term\nmust not default to the many bins a regular-bin scheme produces. Non-dictionary numeric terms\n(gene expression and the other molecular types) have no dataset-curated bins, so the bins would\nbe computed from the data range and easily yield 8+ shapes; default them instead to two bins\nsplit at the median, the same default used for a survival/cuminc overlay term. Dictionary\nnumeric terms (integer/float/date) keep their curated preset bins. */\nfunction getShapeDefaultQ() {\n\tconst defaultQ: { [termType: string]: any } = {}\n\tfor (const type of numericTypes) {\n\t\tif (dictionaryNumericTypes.has(type)) continue\n\t\tdefaultQ[type] = { mode: 'discrete', type: 'custom-bin', preferredBins: 'median' }\n\t}\n\treturn defaultQ\n}\nexport class ScatterView {\n\topts: any\n\tdom: any\n\tscatter: Scatter\n\tloading: any\n\tloadingDiv: any\n\ttooltip: any\n\ttooltipDiv: any\n\tchart: any\n\tchartDiv: any\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.opts = scatter.opts\n\t\tthis.scatter = scatter\n\n\t\tconst leftDiv = this.opts.holder.insert('div').style('display', 'inline-block')\n\t\tconst rightDiv = this.opts.holder.insert('div').style('display', 'inline-block').style('vertical-align', 'top')\n\t\tconst controlsHolder = leftDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.attr('data-testid', 'sjpp-scatter-controls-div')\n\t\tconst domOpts = { controls: controlsHolder, mainWrapper: rightDiv }\n\t\tconst { errdiv, loadingDiv, banner, renderedData } = scatter.getStandardDomLayout(this.opts.holder, domOpts)\n\n\t\t// scatter uses the mainDiv to remove and recreate that charts and legend div on every component update,\n\t\t// so the standard charts and legend div inside it will not be needed/persisted\n\t\trenderedData.selectAll('*').remove()\n\n\t\tthis.dom = {\n\t\t\tcontrolsHolder,\n\t\t\ttoolsDiv: leftDiv.insert('div'),\n\t\t\terrdiv,\n\t\t\tloadingDiv: loadingDiv.attr('data-testid', 'sjpp-scatter-loading-div'),\n\t\t\tbannerDiv: banner,\n\t\t\theaderDiv: renderedData.append('div').attr('data-testid', 'sjpp-scatter-header-div'),\n\t\t\trenderedData: renderedData\n\t\t\t\t.attr('data-testid', 'sjpp-scatter-main-div')\n\t\t\t\t.style('display', 'flex')\n\t\t\t\t.style('flex-direction', 'row')\n\t\t\t\t.style('flex-wrap', 'wrap')\n\t\t\t\t.style('max-width', '100vw'),\n\t\t\tmainDiv: renderedData,\n\t\t\theader: this.opts.header,\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\ttooltip: new Menu({ padding: '2px', offsetX: 10, offsetY: 0 })\n\t\t}\n\n\t\tif (this.dom.header) {\n\t\t\tconst chartName = splitCamelCase(this.scatter.type).toUpperCase()\n\t\t\tformatHeaderText({\n\t\t\t\theader: this.dom.header,\n\t\t\t\tchartType: chartName,\n\t\t\t\ttext: this.scatter.config.name || ''\n\t\t\t})\n\t\t}\n\t}\n\n\tgetControlInputs() {\n\t\tconst labels = this.scatter.config.controlLabels\n\t\tconst hasRef = this.scatter.model.charts?.[0]?.data?.samples?.find(s => s.isRef) || false\n\t\tconst chartType = 'sampleScatter'\n\t\tconst itemLabel = this.scatter.settings.itemLabel\n\t\tconst scaleDotOption = {\n\t\t\ttype: 'term',\n\t\t\tconfigKey: 'scaleDotTW',\n\t\t\tchartType,\n\t\t\tusecase: { target: 'sampleScatter', detail: 'numeric' },\n\t\t\ttitle: `Scale symbol size by term value`,\n\t\t\tlabel: 'Scale by',\n\t\t\tvocabApi: this.scatter.app.vocabApi,\n\t\t\tnumericEditMenuVersion: ['continuous'],\n\t\t\t//Eventually this will be corrected with usecase.detail\n\t\t\t//When single cell, only relevant terms will be displayed\n\t\t\t//in the tree\n\t\t\tgetDisplayStyle: () => {\n\t\t\t\treturn this.scatter.config?.singleCellPlot ? 'none' : ''\n\t\t\t}\n\t\t}\n\t\tconst shapeOption = {\n\t\t\ttype: 'term',\n\t\t\tconfigKey: 'shapeTW',\n\t\t\tchartType,\n\t\t\tusecase: { target: 'sampleScatter', detail: 'shapeTW' },\n\t\t\ttitle: 'Categories to assign a shape',\n\t\t\tlabel: 'Shape',\n\t\t\tvocabApi: this.scatter.app.vocabApi,\n\t\t\tnumericEditMenuVersion: ['discrete'],\n\t\t\t// only applies when a term is first picked from the tree, so a user-chosen binning\n\t\t\t// from the pill's edit menu is not overridden\n\t\t\tdefaultQ4fillTW: getShapeDefaultQ(),\n\t\t\t//Eventually this will be corrected with usecase.detail\n\t\t\t//When single cell, only relevant terms will be displayed\n\t\t\t//in the tree\n\t\t\tgetDisplayStyle: () => {\n\t\t\t\treturn this.scatter.config?.singleCellPlot ? 'none' : ''\n\t\t\t},\n\t\t\tprocessInput: async tw => {\n\t\t\t\t//only discrete mode allowed so set discrete mode and fill term wrapper to add the bins\n\t\t\t\tif (isNumericTerm(tw?.term)) {\n\t\t\t\t\tif (!tw.q) tw.q = {}\n\t\t\t\t\ttw.q.mode = 'discrete' //use discrete mode by default, but preserve other q properties like type\n\t\t\t\t\t// no defaultQ here: it would re-apply the median bins over the q the user just edited\n\t\t\t\t\tawait fillTermWrapper(tw, this.scatter.app.vocabApi)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst shapeSizeOption = {\n\t\t\tlabel: `${itemLabel} size`,\n\t\t\ttype: 'number',\n\t\t\tchartType,\n\t\t\tsettingsKey: 'size',\n\t\t\ttitle: `${itemLabel} size, represents the factor used to scale the ${itemLabel.toLowerCase()}`,\n\t\t\tmin: minShapeSize,\n\t\t\tmax: maxShapeSize,\n\t\t\tstep: 0.1\n\t\t}\n\t\tconst step = (maxShapeSize - minShapeSize) / 10\n\t\tconst minShapeSizeOption = {\n\t\t\tlabel: 'Min size',\n\t\t\ttype: 'number',\n\t\t\tchartType,\n\t\t\tsettingsKey: 'minShapeSize',\n\t\t\ttitle: 'Minimum symbol size',\n\t\t\tmin: minShapeSize,\n\t\t\tmax: maxShapeSize,\n\t\t\tstep\n\t\t}\n\t\tconst maxShapeSizeOption = {\n\t\t\tlabel: 'Max size',\n\t\t\ttype: 'number',\n\t\t\tchartType,\n\t\t\tsettingsKey: 'maxShapeSize',\n\t\t\ttitle: 'Maximum symbol size',\n\t\t\tmin: minShapeSize,\n\t\t\tmax: maxShapeSize,\n\t\t\tstep\n\t\t}\n\t\tconst orientation = {\n\t\t\tlabel: 'Scale order',\n\t\t\ttype: 'radio',\n\t\t\tchartType,\n\t\t\tsettingsKey: 'scaleDotOrder',\n\t\t\toptions: [\n\t\t\t\t{ label: 'Ascending', value: 'Ascending' },\n\t\t\t\t{ label: 'Descending', value: 'Descending' }\n\t\t\t]\n\t\t}\n\t\tconst refSizeOption = {\n\t\t\tlabel: 'Reference size',\n\t\t\ttype: 'number',\n\t\t\tchartType,\n\t\t\tsettingsKey: 'refSize',\n\t\t\ttitle: 'Set the area of the reference symbol in square pixels.',\n\t\t\tmin: 0,\n\t\t\tmax: maxShapeSize,\n\t\t\tstep: 0.1\n\t\t}\n\t\tconst showAxes = {\n\t\t\tboxLabel: '',\n\t\t\tlabel: 'Show axes',\n\t\t\ttype: 'checkbox',\n\t\t\tchartType,\n\t\t\tsettingsKey: 'showAxes',\n\t\t\ttitle: `Option to show/hide plot axes`,\n\t\t\ttestid: 'showAxes'\n\t\t}\n\t\tconst term = this.scatter.config.term ? 'term' : 'colorTW'\n\t\tconst specialCase = getSingleCellSpecialCase(this.scatter.config, term, true)\n\n\t\tconst inputs: any = [\n\t\t\t{\n\t\t\t\ttype: 'term',\n\t\t\t\tconfigKey: 'colorTW',\n\t\t\t\tchartType,\n\t\t\t\tusecase: { target: 'sampleScatter', detail: 'colorTW', specialCase },\n\t\t\t\ttitle: `Categories to color the ${labels.sample} symbol`,\n\t\t\t\tlabel: 'Color',\n\t\t\t\tvocabApi: this.scatter.app.vocabApi,\n\t\t\t\tnumericEditMenuVersion: ['continuous', 'discrete'],\n\t\t\t\t/** Disabling colorBy when two sc terms present.\n\t\t\t\t * Dots overlap and colorBy is not meaningful in this case. */\n\t\t\t\tgetDisplayStyle: () => {\n\t\t\t\t\treturn this.scatter.config?.singleCellPlot && this.scatter.config.term2 ? 'none' : ''\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t{\n\t\t\t\tlabel: 'Opacity',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType,\n\t\t\t\tsettingsKey: 'opacity',\n\t\t\t\ttitle: 'Set the opacity of the elements',\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 1,\n\t\t\t\tstep: 0.1\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Chart width',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType,\n\t\t\t\tmin: chartSizeMin,\n\t\t\t\tmax: chartSizeMax,\n\t\t\t\tstep: 10,\n\t\t\t\tsettingsKey: 'svgw'\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Chart height',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType,\n\t\t\t\tmin: chartSizeMin,\n\t\t\t\tmax: chartSizeMax,\n\t\t\t\tstep: 10,\n\t\t\t\tsettingsKey: 'svgh'\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Show contour map',\n\t\t\t\tboxLabel: '',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tchartType,\n\t\t\t\tsettingsKey: 'showContour',\n\t\t\t\ttitle:\n\t\t\t\t\t\"Shows the density of point clouds. If 'Color' is used in continous mode, it uses it to weight the points when calculating the density contours. If 'Z/Divide by' is added in continous mode, it used it instead.\",\n\t\t\t\tgetDisplayStyle: () => {\n\t\t\t\t\t//Disabling contour option for large single cell plots for now\n\t\t\t\t\treturn this.scatter.config?.singleCellPlot && this.scatter.model.is2DLarge ? 'none' : ''\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Save zoom transform',\n\t\t\t\tboxLabel: '',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tchartType,\n\t\t\t\tsettingsKey: 'saveZoomTransform',\n\t\t\t\ttitle: `Option to save the zoom transformation in the state. Needed if you want to save a session with the actual zoom and pan applied`,\n\t\t\t\tprocessInput: value => this.saveZoomTransform(value),\n\t\t\t\tgetDisplayStyle: () => {\n\t\t\t\t\t//Disabling all zoom functionality for large single cell plots for now\n\t\t\t\t\treturn this.scatter.config?.singleCellPlot && this.scatter.model.is2DLarge ? 'none' : ''\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\t\tif (this.scatter.settings.showContour)\n\t\t\tinputs.push(\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Color contours',\n\t\t\t\t\tboxLabel: '',\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'colorContours'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Contour bandwidth',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'contourBandwidth',\n\t\t\t\t\ttitle: 'Reduce to increase resolution.',\n\t\t\t\t\tmin: 5,\n\t\t\t\t\tmax: 50,\n\t\t\t\t\tstep: 5\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Contour thresholds',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'contourThresholds',\n\t\t\t\t\ttitle: 'Increase to enhance contour detail.',\n\t\t\t\t\tmin: 5,\n\t\t\t\t\tmax: 30,\n\t\t\t\t\tstep: 5\n\t\t\t\t}\n\t\t\t)\n\t\tif (this.scatter.config.sampleCategory) {\n\t\t\tconst options: any = Object.values(this.scatter.config.sampleCategory.tw.term.values).map((v: any) => ({\n\t\t\t\tlabel: v.label || v.key,\n\t\t\t\tvalue: v.key\n\t\t\t}))\n\t\t\tif (this.scatter.config.sampleCategory.order)\n\t\t\t\toptions.sort((elem1, elem2) => {\n\t\t\t\t\tconst i1 = this.scatter.config.sampleCategory.order.indexOf(elem1.value)\n\t\t\t\t\tconst i2 = this.scatter.config.sampleCategory.order.indexOf(elem2.value)\n\t\t\t\t\tif (i1 < i2) return -1\n\t\t\t\t\treturn 1\n\t\t\t\t})\n\t\t\tif (!this.scatter.settings.sampleCategory)\n\t\t\t\tthis.scatter.settings.sampleCategory = this.scatter.config.sampleCategory.defaultValue || ''\n\t\t\toptions.push({ label: 'All', value: '' })\n\t\t\tconst sampleCategory = {\n\t\t\t\tlabel: 'Sample type',\n\t\t\t\ttype: 'dropdown',\n\t\t\t\tchartType,\n\t\t\t\tsettingsKey: 'sampleCategory',\n\t\t\t\toptions\n\t\t\t}\n\t\t\tinputs.push(sampleCategory)\n\t\t}\n\n\t\tif (!this.scatter.model.is2DLarge && !this.scatter.config.singleCellPlot) {\n\t\t\tconst isPremade = this.scatter.config.name !== undefined && !this.scatter.config.term\n\t\t\tinputs.unshift({\n\t\t\t\ttype: 'term',\n\t\t\t\tconfigKey: 'term0',\n\t\t\t\tchartType,\n\t\t\t\tusecase: { target: 'sampleScatter', detail: 'term0' },\n\t\t\t\ttitle: 'Term to to divide by categories or to use as Z coordinate',\n\t\t\t\tlabel: 'Z / Divide by',\n\t\t\t\tvocabApi: this.scatter.app.vocabApi,\n\t\t\t\t// do not allow 'continuous' mode for now, even if it can be rendered along z-axis,\n\t\t\t\t// since clicking to barchart/violin/boxplot tab from the scatter tab does not\n\t\t\t\t// automatically convert the divide-by term to discrete; a continuous mode in those\n\t\t\t\t// other charts leads to nonsensical chart per unique float/integer value\n\t\t\t\tnumericEditMenuVersion: ['discrete'],\n\t\t\t\tprocessInput: tw => {\n\t\t\t\t\tif (!isPremade && isNumericTerm(tw?.term)) tw.q = { mode: 'continuous' } //use continuous mode by default if not premade plot\n\t\t\t\t}\n\t\t\t})\n\t\t} else if (!this.scatter.config.singleCellPlot) {\n\t\t\tinputs.push(\n\t\t\t\t{\n\t\t\t\t\t// below was changed from 'Sample size'\n\t\t\t\t\t// TODO: clarify how this is different from `${itemLabel} size`/`Symbol size`?\n\t\t\t\t\tlabel: `${labels.Sample} size`,\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'threeSize',\n\t\t\t\t\ttitle: `${labels.Sample} size`,\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 1,\n\t\t\t\t\tstep: 0.001\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Field of Vision',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'threeFOV',\n\t\t\t\t\ttitle: 'Field of Vision',\n\t\t\t\t\tmin: 50,\n\t\t\t\t\tmax: 90,\n\t\t\t\t\tstep: 1\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t\tif (this.scatter.config.term) {\n\t\t\tinputs.unshift(\n\t\t\t\t...[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'term',\n\t\t\t\t\t\tconfigKey: 'term',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tusecase: { target: 'sampleScatter', detail: 'numeric', specialCase },\n\t\t\t\t\t\ttitle: `X coordinate to plot the ${labels.samples}`,\n\t\t\t\t\t\tlabel: 'X',\n\t\t\t\t\t\tvocabApi: this.scatter.app.vocabApi,\n\t\t\t\t\t\tmenuOptions: '!remove',\n\t\t\t\t\t\tnumericEditMenuVersion: ['continuous']\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'term',\n\t\t\t\t\t\tconfigKey: 'term2',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tusecase: { target: 'sampleScatter', detail: 'numeric', specialCase },\n\t\t\t\t\t\ttitle: `Y coordinate to plot the ${labels.samples}`,\n\t\t\t\t\t\tlabel: 'Y',\n\t\t\t\t\t\tvocabApi: this.scatter.app.vocabApi,\n\t\t\t\t\t\tmenuOptions: '!remove',\n\t\t\t\t\t\tnumericEditMenuVersion: ['continuous']\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t)\n\t\t\tif (!this.scatter.model.is3D) {\n\t\t\t\tinputs.splice(4, 0, shapeOption)\n\t\t\t\tinputs.splice(5, 0, scaleDotOption)\n\t\t\t\tif (this.scatter.config.scaleDotTW) {\n\t\t\t\t\tinputs.splice(6, 0, minShapeSizeOption)\n\t\t\t\t\tinputs.splice(7, 0, maxShapeSizeOption)\n\t\t\t\t\tinputs.splice(8, 0, orientation)\n\t\t\t\t\tif (hasRef) inputs.splice(9, 0, refSizeOption)\n\t\t\t\t} else {\n\t\t\t\t\tinputs.splice(6, 0, shapeSizeOption)\n\t\t\t\t\tif (hasRef) inputs.splice(7, 0, refSizeOption)\n\t\t\t\t}\n\n\t\t\t\tinputs.push({\n\t\t\t\t\tlabel: 'Show regression',\n\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'regression',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: 'None', value: 'None' },\n\t\t\t\t\t\t//{ label: 'Loess', value: 'Loess' },\n\t\t\t\t\t\t{ label: 'Lowess', value: 'Lowess' },\n\t\t\t\t\t\t{ label: 'Polynomial', value: 'Polynomial' }\n\t\t\t\t\t]\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// TODO set min and max\n\t\t\t\tinputs.push({\n\t\t\t\t\tlabel: 'Chart depth',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'svgd'\n\t\t\t\t})\n\t\t\t\tinputs.push({\n\t\t\t\t\tlabel: 'Field of vision',\n\t\t\t\t\ttitle: 'Camera field of view, in degrees',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType,\n\t\t\t\t\tsettingsKey: 'fov'\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tinputs.push(showAxes, ...this.getMinMaxInputs())\n\n\t\t\tinputs.push({\n\t\t\t\tlabel: 'Default color',\n\t\t\t\ttype: 'color',\n\t\t\t\tchartType,\n\t\t\t\tsettingsKey: 'defaultColor'\n\t\t\t})\n\t\t} else if (!this.scatter.model.is2DLarge) {\n\t\t\tinputs.splice(2, 0, shapeOption)\n\t\t\tinputs.splice(3, 0, scaleDotOption)\n\t\t\tif (this.scatter.config.scaleDotTW) {\n\t\t\t\tinputs.splice(4, 0, minShapeSizeOption)\n\t\t\t\tinputs.splice(5, 0, maxShapeSizeOption)\n\t\t\t\tinputs.splice(6, 0, orientation)\n\t\t\t\tif (hasRef) inputs.splice(7, 0, refSizeOption)\n\t\t\t} else {\n\t\t\t\tinputs.splice(4, 0, shapeSizeOption)\n\t\t\t\tif (hasRef) inputs.splice(5, 0, refSizeOption)\n\t\t\t}\n\t\t\tinputs.push(showAxes)\n\t\t}\n\n\t\tthis.mayAddControlLabels(inputs)\n\n\t\t// a bySample plot shows a single cohort sample among a reference cloud, so the term-based\n\t\t// controls (color/shape/scale/divide-by term) don't apply. Drop them, keeping size/opacity/etc.\n\t\treturn this.scatter.config.bySample ? inputs.filter(i => i.type != 'term') : inputs\n\t}\n\n\tgetMinMaxInputs() {\n\t\tconst range = this.scatter.model.range\n\t\tif (!range) return []\n\t\tconst xMin = roundValueAuto(range.xMin)\n\t\tconst xMax = roundValueAuto(range.xMax)\n\t\tconst xStep = (xMax - xMin) / 10\n\t\tconst yMin = roundValueAuto(range.yMin)\n\t\tconst yMax = roundValueAuto(range.yMax)\n\t\tconst yStep = (yMax - yMin) / 10\n\n\t\tconst inputs = [\n\t\t\t{\n\t\t\t\tlabel: 'X axis minimum',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: this.scatter.type,\n\t\t\t\tsettingsKey: 'minXScale',\n\t\t\t\ttitle: `Set the minimum X axis value between ${xMin} and ${xMax}`,\n\t\t\t\tplaceholder: `${xMin}`,\n\t\t\t\tmin: xMin,\n\t\t\t\tmax: xMax,\n\t\t\t\tstep: xStep\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'X axis maximum',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: this.scatter.type,\n\t\t\t\tsettingsKey: 'maxXScale',\n\t\t\t\ttitle: `Set the maximum X axis value between ${xMin} and ${xMax}`,\n\t\t\t\tplaceholder: `${xMax}`,\n\t\t\t\tmin: xMin,\n\t\t\t\tmax: xMax,\n\t\t\t\tstep: xStep,\n\t\t\t\tprocessInput: value => {\n\t\t\t\t\t/** When the user deletes a value, setNumberInput()\n\t\t\t\t\t * in controls.config.js sets it to input.min. Instead,\n\t\t\t\t\t * reset to default value to allow the user to delete\n\t\t\t\t\t * the value. */\n\t\t\t\t\tconst n = this.dom.controlsHolder.selectAll('input').filter(function (this: any) {\n\t\t\t\t\t\treturn this.placeholder == `${xMax}`\n\t\t\t\t\t})\n\t\t\t\t\tif (!n.node().value) return xMax\n\t\t\t\t\telse return value\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Y axis minimum',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: this.scatter.type,\n\t\t\t\tsettingsKey: 'minYScale',\n\t\t\t\ttitle: `Set the minimum Y axis value between ${yMin} and ${yMax}`,\n\t\t\t\tplaceholder: `${yMin}`,\n\t\t\t\tmin: yMin,\n\t\t\t\tmax: yMax,\n\t\t\t\tstep: yStep\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Y axis maximum',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: this.scatter.type,\n\t\t\t\tsettingsKey: 'maxYScale',\n\t\t\t\ttitle: `Set the maximum Y axis value between ${yMin} and ${yMax}`,\n\t\t\t\tplaceholder: `${yMax}`,\n\t\t\t\tmin: yMin,\n\t\t\t\tmax: yMax,\n\t\t\t\tstep: yStep,\n\t\t\t\tprocessInput: value => {\n\t\t\t\t\t/** When the user deletes a value, setNumberInput()\n\t\t\t\t\t * in controls.config.js sets it to input.min. Instead,\n\t\t\t\t\t * reset to default value to allow the user to delete\n\t\t\t\t\t * the value. */\n\t\t\t\t\tconst n = this.dom.controlsHolder.selectAll('input').filter(function (this: any) {\n\t\t\t\t\t\treturn this.placeholder == `${yMax}`\n\t\t\t\t\t})\n\t\t\t\t\tif (!n.node().value) return yMax\n\t\t\t\t\telse return value\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\t\treturn inputs\n\t}\n\n\tmayAddControlLabels(inputs) {\n\t\tconst controlLabels = structuredClone(this.scatter.config.controlLabels)\n\t\tif (!controlLabels) return\n\t\tlet term1input, term2input, term0input\n\t\tfor (const i of inputs) {\n\t\t\tif (i.configKey == 'term') term1input = i\n\t\t\telse if (i.configKey == 'term2') term2input = i\n\t\t\telse if (i.configKey == 'term0') term0input = i\n\t\t}\n\t\tif (term1input && term2input) {\n\t\t\t// term1 and term2 inputs\n\t\t\t// append X/Y/Z labels to controlLabels\n\t\t\t// note: should not append when term1 and term2 inputs\n\t\t\t// are absent (e.g. tSNE), because having only a Z coordinate\n\t\t\t// does not make sense\n\t\t\tif (controlLabels.term1) term1input.label = controlLabels.term1.label + ' (X)'\n\t\t\tif (controlLabels.term2) term2input.label = controlLabels.term2.label + ' (Y)'\n\t\t\tif (term0input && controlLabels.term0) term0input.label = controlLabels.term0.label + ' (Z)'\n\t\t}\n\t}\n\n\tsaveZoomTransform(value: any) {\n\t\tif (value) this.scatter.vm.scatterZoom.saveZoomTransform()\n\t\treturn value\n\t}\n}\n\n/*\n\tholder: the holder in the tooltip\n\tchartsInstance: MassCharts instance\n\t\ttermdbConfig is accessible at chartsInstance.state.termdbConfig{}\n\t\tmass option is accessible at chartsInstance.app.opts{}\n\t*/\nfunction splitCamelCase(text) {\n\treturn text.split(/(?=[A-Z])/).join(' ')\n}\n", "import { ColorScale, getMaxLabelWidth, Menu } from '#dom'\nimport { select } from 'd3-selection'\nimport { rgb } from 'd3-color'\nimport { morigin, dt2label } from '#shared/common.js'\nimport { shapes } from '../model/scatterModel'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { ScatterLegendInteractivity } from './scatterLegendInteractivity'\nimport { minShapeSize, maxShapeSize } from '../view/scatterView'\nimport type { Scatter } from '../scatter'\nimport type { ScatterLegendItem } from '../scatterTypes'\n\nexport class ScatterLegend {\n\tscatter: Scatter\n\tvm: any\n\tmodel: any\n\tinteractivity: any\n\tlegendInteractivity: ScatterLegendInteractivity\n\tchangeGradientColor: any\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.scatter = scatter\n\t\tthis.vm = scatter.vm\n\t\tthis.model = scatter.model\n\t\tthis.interactivity = scatter.interactivity\n\t\tthis.legendInteractivity = new ScatterLegendInteractivity(scatter)\n\t}\n\t//Dynamically calculate the length of the legend labels\n\tgetLegendLabelWidth(chart, key, svg, size) {\n\t\tconst legend: Map<string, ScatterLegendItem> = chart[`${key}Legend`]\n\t\tif (!legend) return 0\n\t\tconst labels: any = []\n\t\tfor (const [k, v] of legend.entries()) {\n\t\t\tif (k != 'Ref') labels.push(`${k}, n=(${v.sampleCount})`)\n\t\t}\n\t\tlabels.push(this.scatter.config[`${key}TW`]?.term?.name ?? '')\n\n\t\t// Add 70 for icons, paddings, etc.\n\t\tconst width = getMaxLabelWidth(svg, labels, size) + 70\n\t\treturn width\n\t}\n\n\tgetFontSize(chart, legend) {\n\t\tlet fontSize = 0.9\n\t\tif (chart.colorLegend.size < 10 && chart.shapeLegend.size < 10) return fontSize\n\t\tconst top = 20\n\t\t//legend is a Map<string, ScatterLegendItem>\n\t\tif (legend.size > top) {\n\t\t\tfontSize = Math.min(0.9, top / legend.size)\n\t\t\tif (fontSize < 0.7) fontSize = 0.7\n\t\t}\n\t\treturn fontSize\n\t}\n\n\trenderLegend(chart, step) {\n\t\tconst legendG = chart.legendG\n\t\tlegendG.selectAll('*').remove()\n\t\tlet offsetX = 0\n\t\tlet offsetY = 15\n\t\tlet legendHeight = 0\n\t\tif (!this.scatter.config.colorTW && !this.scatter.config.shapeTW && !this.scatter.config.colorColumn) {\n\t\t\tif (this.scatter.config.scaleDotTW) {\n\t\t\t\tchart.scaleG = legendG\n\t\t\t\t\t.append('g')\n\t\t\t\t\t.attr('transform', `translate(${offsetX + 45},${this.scatter.vm.legendHeight - 150})`)\n\t\t\t\tthis.drawScaleDotLegend(chart)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tlet title\n\t\tlet title0\n\t\tif (this.scatter.config.term0) {\n\t\t\ttitle0 = `${this.scatter.config.term0.term.name + ' ' + chart.id}, n=${chart.cohortSamples.length}`\n\t\t} else {\n\t\t\tconst n = chart.totalSampleCount ?? chart.cohortSamples?.length\n\t\t\tconst noun = this.scatter.config.sampleType || this.scatter.settings.itemLabel.toLowerCase()\n\t\t\ttitle0 = `${n} ${noun}${n == 1 ? '' : 's'}`\n\t\t}\n\t\tif (this.model.filterSampleStr) title0 += `, search = ${this.model.filterSampleStr}`\n\t\tlegendG.append('text').attr('x', 0).attr('y', offsetY).text(title0).style('font-weight', 'bold')\n\t\tconst fontSize = this.getFontSize(chart, chart.colorLegend)\n\t\tconst scale = chart.colorLegend.size > 20 || chart.shapeLegend.size > 20 ? 0.6 : 0.7 //if many categories, reduce size\n\n\t\tconst colorG = legendG.append('g').style('font-size', `${fontSize}em`).attr('data-testid', 'sjpp-color-legend')\n\t\toffsetY += step + 20\n\t\tif (this.scatter.config.colorTW || this.scatter.config.colorColumn) {\n\t\t\ttitle = `${getTitle(\n\t\t\t\tthis.scatter.config.colorTW?.term?.name || this.scatter.config.colorColumn.name,\n\t\t\t\t40,\n\t\t\t\tthis.scatter.config.shapeTW == undefined\n\t\t\t)}`\n\t\t\tconst colorRefCategory = chart.colorLegend.get('Ref')\n\n\t\t\tif (this.scatter.config.colorTW?.term?.type == 'geneVariant' && this.scatter.config.colorTW?.q.type == 'values') {\n\t\t\t\toffsetY = this.renderGeneVariantLegend(\n\t\t\t\t\tchart,\n\t\t\t\t\toffsetX,\n\t\t\t\t\toffsetY,\n\t\t\t\t\tlegendG,\n\t\t\t\t\tthis.scatter.config.colorTW,\n\t\t\t\t\t'category',\n\t\t\t\t\tchart.colorLegend,\n\t\t\t\t\tscale\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tthis.addLegendTitle(legendG, title, offsetX, offsetY, this.scatter.config.colorTW, 'COLOR')\n\t\t\t\toffsetY += step\n\n\t\t\t\tif (this.scatter.config.colorTW?.q?.mode === 'continuous') {\n\t\t\t\t\t// Get the current domain values from our color generator\n\t\t\t\t\t// These values represent the minimum and maximum values in our dataset\n\t\t\t\t\tlet [min, max] = chart.colorGenerator.domain()\n\n\t\t\t\t\t// Extract and sort all sample values for our calculations\n\t\t\t\t\t// We filter out any values that are explicitly defined in the term values\n\t\t\t\t\t// This gives us the raw numerical data we need for scaling\n\t\t\t\t\tconst colorValues = chart.colorValues\n\t\t\t\t\tconst scaleG = colorG.append('g').attr('data-testid', 'sjpp-scale-legend')\n\t\t\t\t\t// Create a ColorScale component with enhanced mode functionality\n\t\t\t\t\tconst colorScale = new ColorScale({\n\t\t\t\t\t\t// Basic visual configuration\n\t\t\t\t\t\tholder: scaleG, // SVG group to contain our color scale\n\t\t\t\t\t\tbarheight: 20, // Height of the color gradient bar\n\t\t\t\t\t\tbarwidth: 150, // Width of the color gradient bar\n\t\t\t\t\t\tcolors: [\n\t\t\t\t\t\t\t// Start and end colors for our gradient\n\t\t\t\t\t\t\tthis.scatter.config.startColor[chart.id],\n\t\t\t\t\t\t\tthis.scatter.config.stopColor[chart.id]\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdomain: [min, max], // Current numerical range of our data\n\t\t\t\t\t\tposition: `0, 100`, // Position within the legend\n\t\t\t\t\t\tticks: 4, // Number of tick marks to show\n\t\t\t\t\t\ttickSize: 5, // Size of tick marks\n\t\t\t\t\t\ttopTicks: true, // Display ticks above the gradient bar\n\n\t\t\t\t\t\t// Callback for when gradient colors are changed via color picker\n\t\t\t\t\t\tsetColorsCallback: (val, idx) => {\n\t\t\t\t\t\t\tthis.legendInteractivity.changeGradientColor(chart, val, idx)\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t// Configuration for our enhanced scaling modes\n\t\t\t\t\t\tnumericInputs: {\n\t\t\t\t\t\t\t// Start with either the chart's current mode or default to 'auto'\n\t\t\t\t\t\t\tcutoffMode: this.scatter.settings.colorScaleMode,\n\t\t\t\t\t\t\t// Default percentile value for percentile mode\n\t\t\t\t\t\t\tdefaultPercentile: this.scatter.settings.colorScalePercentile,\n\n\t\t\t\t\t\t\t// This callback handles all mode changes and updates\n\t\t\t\t\t\t\tcallback: (obj: any) => {\n\t\t\t\t\t\t\t\t// Handle different modes for color scaling\n\t\t\t\t\t\t\t\tif (obj.cutoffMode === 'auto') {\n\t\t\t\t\t\t\t\t\tmin = colorValues[0]\n\t\t\t\t\t\t\t\t\tmax = colorValues[colorValues.length - 1]\n\t\t\t\t\t\t\t\t} else if (obj.cutoffMode === 'fixed') {\n\t\t\t\t\t\t\t\t\tmin = obj.min\n\t\t\t\t\t\t\t\t\tmax = obj.max\n\t\t\t\t\t\t\t\t} else if (obj.cutoffMode === 'percentile') {\n\t\t\t\t\t\t\t\t\tmin = colorValues[0]\n\t\t\t\t\t\t\t\t\tconst index = Math.floor((colorValues.length * obj.percentile) / 100)\n\t\t\t\t\t\t\t\t\tmax = colorValues[index]\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Dispatch the updated config\n\t\t\t\t\t\t\t\tthis.scatter.app.dispatch({\n\t\t\t\t\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\t\t\t\t\tid: this.scatter.id,\n\t\t\t\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t\t\t\t\tsampleScatter: {\n\t\t\t\t\t\t\t\t\t\t\t\tcolorScaleMode: obj.cutoffMode,\n\t\t\t\t\t\t\t\t\t\t\t\tcolorScaleMinFixed: obj.cutoffMode === 'fixed' ? min : null,\n\t\t\t\t\t\t\t\t\t\t\t\tcolorScaleMaxFixed: obj.cutoffMode === 'fixed' ? max : null,\n\t\t\t\t\t\t\t\t\t\t\t\tcolorScalePercentile:\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.cutoffMode === 'percentile' ? obj.percentile : this.scatter.settings.colorScalePercentile\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\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}\n\t\t\t\t\t})\n\n\t\t\t\t\t// Initialize the color scale with current settings\n\t\t\t\t\tcolorScale.updateScale()\n\t\t\t\t\toffsetY += step * 2\n\t\t\t\t} else {\n\t\t\t\t\tfor (const [key, category] of chart.colorLegend) {\n\t\t\t\t\t\tif (key == 'Ref') continue\n\t\t\t\t\t\tconst name = key\n\t\t\t\t\t\tconst hidden = this.scatter.config.colorTW?.q.hiddenValues\n\t\t\t\t\t\t\t? key in this.scatter.config.colorTW.q.hiddenValues\n\t\t\t\t\t\t\t: false\n\t\t\t\t\t\tconst [circleG, itemG] = this.addLegendItem(\n\t\t\t\t\t\t\tchart,\n\t\t\t\t\t\t\tcolorG,\n\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\toffsetX,\n\t\t\t\t\t\t\toffsetY,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\thidden\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (!this.scatter.config.colorColumn) {\n\t\t\t\t\t\t\tcircleG.on('click', e => this.legendInteractivity.onLegendClick(chart, 'colorTW', key, e, category))\n\t\t\t\t\t\t\titemG.on('click', event => this.legendInteractivity.onLegendClick(chart, 'colorTW', key, event, category))\n\t\t\t\t\t\t}\n\t\t\t\t\t\toffsetY += step\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (colorRefCategory?.sampleCount > 0) {\n\t\t\t\toffsetY = offsetY + step\n\t\t\t\tconst titleG = legendG.append('g')\n\t\t\t\ttitleG.append('text').attr('x', offsetX).attr('y', offsetY).text('Reference').style('font-weight', 'bold')\n\n\t\t\t\toffsetY = offsetY + step\n\n\t\t\t\tconst refColorG = legendG.append('g')\n\t\t\t\trefColorG\n\t\t\t\t\t.append('path')\n\t\t\t\t\t.attr('transform', () => `translate(${offsetX - 2}, ${offsetY - 4}) scale(${scale})`)\n\t\t\t\t\t.style('fill', colorRefCategory.color)\n\t\t\t\t\t.attr('d', shapes[0])\n\t\t\t\t\t.style('stroke', rgb(colorRefCategory.color).darker())\n\n\t\t\t\trefColorG.on('click', e => this.legendInteractivity.onLegendClick(chart, 'colorTW', 'Ref', e, colorRefCategory))\n\t\t\t\tconst refText = legendG\n\t\t\t\t\t.append('g')\n\t\t\t\t\t.append('text')\n\t\t\t\t\t.attr('name', 'sjpp-scatter-legend-label')\n\t\t\t\t\t.attr('data-testid', 'sjpp-scatter-ref-legend-label')\n\t\t\t\t\t.attr('x', offsetX + 20)\n\t\t\t\t\t.attr('y', offsetY + 4)\n\t\t\t\t\t.text(`n=${colorRefCategory.sampleCount}`)\n\t\t\t\t\t.style('text-decoration', !this.scatter.settings.showRef ? 'line-through' : 'none')\n\t\t\t\t\t.attr('alignment-baseline', 'middle')\n\n\t\t\t\trefText.on('click', e => this.legendInteractivity.onLegendClick(chart, 'colorTW', 'Ref', e, colorRefCategory))\n\t\t\t}\n\t\t\tlegendHeight = offsetY\n\t\t}\n\n\t\tif (this.scatter.config.shapeTW) {\n\t\t\toffsetX = chart.colorLegendWidth\n\t\t\toffsetY = 60\n\t\t\ttitle = `${getTitle(this.scatter.config.shapeTW.term.name, 40)}`\n\t\t\tif (this.scatter.config.shapeTW.term.type == 'geneVariant' && this.scatter.config.shapeTW.q.type == 'values') {\n\t\t\t\t// keep offsetY in sync with what was drawn, so legendHeight below (and the scale-dot\n\t\t\t\t// legend placed under it) accounts for the gene variant rows\n\t\t\t\toffsetY = this.renderGeneVariantLegend(\n\t\t\t\t\tchart,\n\t\t\t\t\toffsetX,\n\t\t\t\t\toffsetY,\n\t\t\t\t\tlegendG,\n\t\t\t\t\tthis.scatter.config.shapeTW,\n\t\t\t\t\t'shape',\n\t\t\t\t\tchart.shapeLegend,\n\t\t\t\t\tscale\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconst shapeG = legendG\n\t\t\t\t\t.append('g')\n\t\t\t\t\t.style('font-size', `${this.getFontSize(chart, chart.shapeLegend)}em`)\n\t\t\t\t\t.attr('data-testid', 'sjpp-shape-legend')\n\n\t\t\t\tthis.addLegendTitle(legendG, title, offsetX, offsetY, this.scatter.config.shapeTW, 'SHAPE')\n\n\t\t\t\toffsetY += step\n\t\t\t\tconst color = 'gray'\n\t\t\t\tfor (const [key, shape] of chart.shapeLegend) {\n\t\t\t\t\tif (key == 'Ref') continue\n\t\t\t\t\tconst index = shape.shape % shapes.length\n\t\t\t\t\tconst symbol = shapes[index]\n\t\t\t\t\tconst name = key\n\t\t\t\t\tconst count = shape.sampleCount\n\t\t\t\t\tconst hidden = this.scatter.config.shapeTW.q.hiddenValues\n\t\t\t\t\t\t? key in this.scatter.config.shapeTW.q.hiddenValues\n\t\t\t\t\t\t: false\n\t\t\t\t\tconst itemG = shapeG.append('g')\n\n\t\t\t\t\titemG\n\t\t\t\t\t\t.append('path')\n\t\t\t\t\t\t.attr('data-testid', 'sjpp-legend-shape')\n\t\t\t\t\t\t.attr('transform', () => `translate(${offsetX}, ${offsetY - 4}) scale(${scale + 0.1})`) //shapes are a bit smaller than the circle shape\n\t\t\t\t\t\t.style('pointer-events', 'bounding-box')\n\t\t\t\t\t\t.style('fill', color)\n\t\t\t\t\t\t.attr('d', symbol)\n\t\t\t\t\t\t.style('stroke', rgb(color).darker())\n\n\t\t\t\t\titemG\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.attr('name', 'sjpp-scatter-legend-label')\n\t\t\t\t\t\t.attr('data-testid', 'sjpp-scatter-shape-legend-label')\n\t\t\t\t\t\t.attr('x', offsetX + 25)\n\t\t\t\t\t\t.attr('y', offsetY + 4)\n\t\t\t\t\t\t.text(`${name}, n=${count}`)\n\t\t\t\t\t\t.style('text-decoration', hidden ? 'line-through' : 'none')\n\t\t\t\t\t\t.attr('alignment-baseline', 'middle')\n\t\t\t\t\toffsetY += step\n\t\t\t\t\titemG.on('click', event => this.legendInteractivity.onLegendClick(chart, 'shapeTW', key, event, shape))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (offsetY > legendHeight) legendHeight = offsetY\n\t\t}\n\n\t\tif (this.scatter.config.scaleDotTW) {\n\t\t\tchart.scaleG = legendG.append('g').attr('transform', `translate(${0},${legendHeight + 50})`)\n\n\t\t\tthis.drawScaleDotLegend(chart)\n\t\t}\n\t}\n\n\taddLegendItem(chart, g, category, name, key, x, y, scale, hidden = false) {\n\t\tconst circleG = g.append('g')\n\t\tcircleG\n\t\t\t.append('path')\n\t\t\t.attr('d', shapes[0])\n\t\t\t.attr('transform', `translate(${x - 2}, ${y - 4}) scale(${scale})`)\n\t\t\t.style('fill', category.color)\n\t\t\t.style('stroke', rgb(category.color).darker())\n\t\tif (!this.scatter.config.colorColumn)\n\t\t\tcircleG.on('click', e => this.legendInteractivity.onLegendClick(chart, 'colorTW', key, e, category))\n\t\tconst itemG = g.append('g')\n\t\titemG\n\t\t\t.append('text')\n\t\t\t.attr('name', 'sjpp-scatter-legend-label')\n\t\t\t.attr('data-testid', 'sjpp-scatter-color-legend-label')\n\t\t\t.attr('x', x + 20)\n\t\t\t.attr('y', y + 4)\n\t\t\t.text(`${name}, n=${category.sampleCount}`)\n\t\t\t.style('text-decoration', hidden ? 'line-through' : 'none')\n\t\t\t.attr('alignment-baseline', 'middle')\n\n\t\treturn [circleG, itemG]\n\t}\n\n\taddLegendTitle(G, title, x, y, tw, extraText) {\n\t\tconst _t = G.append('text')\n\t\t\t.attr('data-testid', 'legendTitle') // may replace id with data-testid to avoid conflict with portal\n\t\t\t.attr('x', x)\n\t\t\t.attr('y', y)\n\t\t\t.text(title)\n\t\t\t.style('font-weight', 'bold')\n\t\t//.on('click',()=>{}) TODO allow click on text to get edit/replace options for tw\n\n\t\tif (extraText) {\n\t\t\t_t.append('tspan').text(extraText).attr('dx', 7).style('font-weight', 'normal').attr('font-size', '.7em')\n\t\t}\n\t}\n\n\trenderGeneVariantLegend(chart, offsetX, offsetY, legendG, tw, cname, map, scale) {\n\t\tconst step = 125\n\t\tconst name = tw.term.name.length > 25 ? tw.term.name.slice(0, 25) + '...' : tw.term.name\n\t\tconst title = name\n\t\tconst G = legendG.append('g').style('font-size', '0.9em')\n\n\t\tthis.addLegendTitle(G, title, offsetX, offsetY, tw, cname == 'category' ? 'COLOR' : 'SHAPE')\n\n\t\toffsetX += step\n\t\tconst mutations: any = []\n\t\tfor (const value of map.values())\n\t\t\tif (value.mutation)\n\t\t\t\t//if no mutation is Ref\n\t\t\t\tmutations.push(value.mutation)\n\n\t\tconst mutationsLabels = new Set()\n\t\toffsetY += 10\n\t\tfor (const mutation of mutations) {\n\t\t\tconst dt = mutation.dt\n\t\t\tconst origin = morigin[mutation.origin]?.label\n\t\t\tconst dtlabel = origin ? `${origin[0]} ${dt2label[dt]}` : dt2label[dt]\n\t\t\tif (!mutationsLabels.has(dtlabel)) mutationsLabels.add(dtlabel)\n\t\t\telse continue\n\t\t\toffsetY += 15\n\n\t\t\tG.append('text')\n\t\t\t\t.attr('x', offsetX - step)\n\t\t\t\t.attr('y', offsetY)\n\t\t\t\t.text(origin ? `${origin} ${dt2label[dt]}` : dt2label[dt])\n\t\t\t\t.style('font-weight', 'bold')\n\t\t\toffsetY += 25\n\t\t\tfor (const [key, category] of map) {\n\t\t\t\tif (key == 'Ref') continue\n\t\t\t\tif (!key.includes(dtlabel)) continue\n\t\t\t\tconst [mkey, cat_dtlabel] = key.split(', ')\n\n\t\t\t\tif (!cat_dtlabel.includes(dtlabel)) continue\n\t\t\t\tconst itemG = G.append('g')\n\t\t\t\tif (cname == 'shape') {\n\t\t\t\t\tconst index = category.shape % shapes.length\n\t\t\t\t\titemG\n\t\t\t\t\t\t.append('path')\n\t\t\t\t\t\t.attr('data-testid', 'sjpp-legend-shape')\n\t\t\t\t\t\t.attr('transform', () => `translate(${offsetX - step - 2}, ${offsetY - 8}) scale(${scale})`)\n\t\t\t\t\t\t.style('fill', 'gray')\n\t\t\t\t\t\t.style('pointer-events', 'bounding-box')\n\t\t\t\t\t\t.attr('d', shapes[index])\n\t\t\t\t\t\t.style('stroke', rgb('gray').darker())\n\t\t\t\t\titemG.on('click', e => this.legendInteractivity.onLegendClick(chart, 'shapeTW', key, e, category))\n\t\t\t\t} else {\n\t\t\t\t\titemG\n\t\t\t\t\t\t.append('path')\n\t\t\t\t\t\t.attr('d', shapes[0])\n\t\t\t\t\t\t.attr('transform', `translate(${-2}, ${offsetY - 8}) scale(${scale})`)\n\t\t\t\t\t\t.style('fill', category.color)\n\t\t\t\t\t\t.style('stroke', rgb(category.color).darker())\n\t\t\t\t\titemG.on('click', e => this.legendInteractivity.onLegendClick(chart, 'colorTW', key, e, category))\n\t\t\t\t}\n\t\t\t\tconst hidden = tw.q.hiddenValues ? key in tw.q.hiddenValues : false\n\n\t\t\t\tconst text = mkey.toUpperCase() + (key.includes(dtlabel) ? `, n=${category.sampleCount}` : '')\n\t\t\t\tG.append('g')\n\t\t\t\t\t.append('text')\n\t\t\t\t\t.attr('x', offsetX - step + 24)\n\t\t\t\t\t.attr('y', offsetY + 4)\n\t\t\t\t\t.attr('name', 'sjpp-scatter-legend-label')\n\t\t\t\t\t.attr('data-testid', cname == 'shape' ? 'sjpp-scatter-shape-legend-label' : 'sjpp-scatter-color-legend-label')\n\t\t\t\t\t.style('text-decoration', hidden ? 'line-through' : 'none')\n\t\t\t\t\t.text(text)\n\t\t\t\t\t.on('click', event =>\n\t\t\t\t\t\tthis.legendInteractivity.onLegendClick(\n\t\t\t\t\t\t\tchart,\n\t\t\t\t\t\t\tcname == 'shape' ? 'shapeTW' : 'colorTW',\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\tcategory\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\n\t\t\t\toffsetY += 25\n\t\t\t}\n\t\t}\n\n\t\treturn offsetY\n\t}\n\n\tdrawScaleDotLegend(chart) {\n\t\tconst scaleG = chart.scaleG\n\t\tscaleG.selectAll('*').remove()\n\t\tconst width = 70\n\n\t\tconst minScale = this.scatter.settings.minShapeSize / 3\n\t\tconst maxScale = this.scatter.settings.maxShapeSize / 3\n\t\tconst order = this.scatter.settings.scaleDotOrder\n\t\tconst isAscending = order == 'Ascending'\n\n\t\tconst titleG = scaleG.append('g')\n\n\t\ttitleG.append('text').text(this.scatter.config.scaleDotTW.term.name).style('font-weight', 'bold')\n\t\tconst start = roundValueAuto(chart.ranges.scaleMin).toString()\n\t\tconst end = roundValueAuto(chart.ranges.scaleMax).toString()\n\t\tconst x = 30\n\t\tconst y = 40\n\t\tconst defaultSize = 16 //icons default size\n\n\t\tconst minSize = defaultSize * minScale\n\t\tconst maxSize = defaultSize * maxScale\n\t\tconst minRadius = minSize / 2\n\t\tconst maxRadius = maxSize / 2\n\t\tconst minG = scaleG\n\t\t\t.append('g')\n\t\t\t.attr('transform', `translate(${x},${y})`)\n\t\t\t.attr('data-testid', 'sjpp-legend-min-scale-g')\n\t\tconst shift = 30\n\t\tminG\n\t\t\t.append('path')\n\t\t\t.attr('data-testid', 'sjpp-legend-min-scale-dot')\n\t\t\t.attr('d', shapes[0])\n\t\t\t.style('fill', '#aaa')\n\t\t\t.style('stroke', '#aaa')\n\t\t\t.attr(\n\t\t\t\t'transform',\n\t\t\t\t`translate(${isAscending ? -minRadius : -maxRadius}, ${isAscending ? -minRadius : -maxRadius}) scale(${\n\t\t\t\t\tisAscending ? minScale : maxScale\n\t\t\t\t})`\n\t\t\t)\n\n\t\tconst maxG = scaleG.append('g').attr('transform', `translate(${width + x},${y})`)\n\n\t\tmaxG\n\t\t\t.append('path')\n\t\t\t.attr('data-testid', 'sjpp-legend-max-scale-dot')\n\t\t\t.attr('d', shapes[0])\n\t\t\t.style('fill', '#aaa')\n\t\t\t.style('stroke', '#aaa')\n\t\t\t.attr(\n\t\t\t\t'transform',\n\t\t\t\t`translate(${isAscending ? -maxRadius : -minRadius}, ${isAscending ? -maxRadius : -minRadius}) scale(${\n\t\t\t\t\tisAscending ? maxScale : minScale\n\t\t\t\t})`\n\t\t\t)\n\n\t\tminG\n\t\t\t.append('text')\n\t\t\t.attr('x', isAscending ? -minRadius - shift : -maxRadius - shift)\n\t\t\t.attr('y', 5)\n\t\t\t.style('font-size', '.8em')\n\t\t\t.attr('text-anchor', 'start')\n\t\t\t.text(start)\n\n\t\tmaxG\n\t\t\t.append('text')\n\t\t\t.attr('x', isAscending ? maxSize + 5 : minSize + 5)\n\t\t\t.attr('y', 5)\n\t\t\t.style('font-size', '.8em')\n\t\t\t.text(end)\n\n\t\tminG\n\t\t\t.append('line')\n\t\t\t.attr('x1', 0)\n\t\t\t.attr('y1', isAscending ? minRadius : maxRadius)\n\t\t\t.attr('x2', width)\n\t\t\t.attr('y2', isAscending ? maxRadius : minRadius)\n\t\t\t.style('stroke', '#aaa')\n\t\tminG\n\t\t\t.append('line')\n\t\t\t.attr('x1', 0)\n\t\t\t.attr('y1', isAscending ? -minRadius : -maxRadius)\n\t\t\t.attr('x2', width)\n\t\t\t.attr('y2', isAscending ? -maxRadius : -minRadius)\n\t\t\t.style('stroke', '#aaa')\n\n\t\tscaleG\n\t\t\t.append('rect')\n\t\t\t.attr('width', 110 * this.scatter.zoom)\n\t\t\t.attr('height', 50)\n\t\t\t.attr('fill', 'transparent')\n\t\t\t.on('click', e => {\n\t\t\t\tconst menu = new Menu({ padding: '3px' })\n\t\t\t\tconst div = menu.d\n\t\t\t\tdiv.append('label').text('Min:')\n\t\t\t\tconst minInput: any = div\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.attr('data-testid', 'sjpp-legend-min-scale-input')\n\t\t\t\t\t.attr('type', 'number')\n\t\t\t\t\t.attr('min', minShapeSize)\n\t\t\t\t\t.attr('step', '0.5')\n\t\t\t\t\t.attr('max', maxShapeSize)\n\t\t\t\t\t.style('width', '50px')\n\t\t\t\t\t.property('value', this.scatter.settings.minShapeSize)\n\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\tlet value = parseFloat(minInput.node().value)\n\t\t\t\t\t\tif (!Number.isFinite(value)) return\n\t\t\t\t\t\tvalue = clampValue(value, minShapeSize, maxShapeSize)\n\t\t\t\t\t\tvalue =\n\t\t\t\t\t\t\tvalue > this.scatter.config.settings.sampleScatter.maxShapeSize\n\t\t\t\t\t\t\t\t? this.scatter.config.settings.sampleScatter.maxShapeSize\n\t\t\t\t\t\t\t\t: value\n\t\t\t\t\t\tminInput.property('value', value)\n\t\t\t\t\t\tthis.scatter.config.settings.sampleScatter.minShapeSize = value\n\t\t\t\t\t\tthis.scatter.app.dispatch({\n\t\t\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\t\t\tid: this.scatter.id,\n\t\t\t\t\t\t\tconfig: this.scatter.config\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\tdiv.append('label').text('Max:')\n\t\t\t\tconst maxInput: any = div\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.attr('data-testid', 'sjpp-legend-max-scale-input')\n\t\t\t\t\t.attr('type', 'number')\n\t\t\t\t\t.attr('step', '0.5')\n\t\t\t\t\t.attr('min', minShapeSize)\n\t\t\t\t\t.attr('max', maxShapeSize)\n\t\t\t\t\t.style('width', '50px')\n\t\t\t\t\t.property('value', this.scatter.settings.maxShapeSize)\n\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\tlet value = parseFloat(maxInput.node().value)\n\t\t\t\t\t\tif (!Number.isFinite(value)) return\n\t\t\t\t\t\tvalue = clampValue(value, minShapeSize, maxShapeSize)\n\t\t\t\t\t\tvalue =\n\t\t\t\t\t\t\tvalue < this.scatter.config.settings.sampleScatter.minShapeSize\n\t\t\t\t\t\t\t\t? this.scatter.config.settings.sampleScatter.minShapeSize\n\t\t\t\t\t\t\t\t: value\n\t\t\t\t\t\tmaxInput.property('value', value)\n\t\t\t\t\t\tthis.scatter.config.settings.sampleScatter.maxShapeSize = value\n\t\t\t\t\t\tthis.scatter.app.dispatch({\n\t\t\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\t\t\tid: this.scatter.id,\n\t\t\t\t\t\t\tconfig: this.scatter.config\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\tconst divRadios = menu.d.append('div')\n\t\t\t\tdivRadios.append('label').text('Order: ')\n\t\t\t\tconst data = ['Ascending', 'Descending']\n\t\t\t\tdivRadios\n\t\t\t\t\t.selectAll('input')\n\t\t\t\t\t.data(data)\n\t\t\t\t\t.enter()\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.each((text, i, divs) => {\n\t\t\t\t\t\tconst div = select(divs[i])\n\t\t\t\t\t\tconst input = div\n\t\t\t\t\t\t\t.append('input')\n\t\t\t\t\t\t\t.attr('type', 'radio')\n\t\t\t\t\t\t\t.attr('name', 'order')\n\t\t\t\t\t\t\t.attr('id', text)\n\t\t\t\t\t\t\t.attr('value', text)\n\t\t\t\t\t\t\t.property('checked', text => text == order)\n\n\t\t\t\t\t\tdiv.append('label').text(text).attr('for', text)\n\t\t\t\t\t\tinput.on('change', e => {\n\t\t\t\t\t\t\tthis.changeScaleDotOrder(e.target.value)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\tmenu.showunder(e.target)\n\t\t\t})\n\t}\n\n\tchangeScaleDotOrder(order) {\n\t\tthis.scatter.config.settings.sampleScatter.scaleDotOrder = order\n\t\tthis.scatter.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.scatter.id,\n\t\t\tconfig: this.scatter.config\n\t\t})\n\t}\n}\nfunction clampValue(inputValue: number, minValue: number, maxValue: number): number {\n\tif (maxValue < inputValue) inputValue = maxValue\n\tif (minValue > inputValue) inputValue = minValue\n\treturn inputValue\n}\nexport function getTitle(name, size = 30, complete = false) {\n\tif (name.length > size && !complete) name = name.slice(0, size) + '...'\n\treturn name\n}\n", "import { mclass } from '#shared/common.js'\nimport { rgb } from 'd3-color'\nimport { pointer } from 'd3-selection'\nimport type { Scatter } from '../scatter'\nimport { table2col, shapesArray, DataPointInteractions, type ActionMenuItem } from '#dom'\nimport { getCategoryValue, buildSampleTableData } from './scatterSampleTable'\n\n/** Forgiveness margin around each dot's rendered edge, in SCREEN px. Kept in screen units\n * so the grab area feels the same at any zoom \u2014 in serie-local units it would inflate along\n * with the dots, reaching 30px of slop at 10x. */\nexport const HIT_BUFFER_PX = 3\n/** Gap between a picked dot's edge and its hover ring, in SCREEN px. Slightly tighter than\n * HIT_BUFFER_PX: the ring marks the dot, it is not meant to trace the whole hit zone. */\nexport const HOVER_RING_MARGIN_PX = 2\n\n/**\n * Adapter between the scatter plot and the shared cover -> quadtree -> hover ring ->\n * tooltip pipeline in `#dom/dataPointInteractions` (the same one manhattan/GRIN2 and the\n * volcano plots use). This class owns only the scatter-specific parts: what a tooltip row\n * says about a sample, and which actions a sample offers on click.\n *\n * Coordinates: the quadtree is built in `chart.serie`'s local space (what\n * `model.getCoordinates()` returns), which is untouched by zoom \u2014 `scatterZoom` puts the\n * d3-zoom transform on `chart.serie` itself. `pointer(event, chart.serie.node())` inverts\n * the full screen CTM, so the mouse lands in that same space at any zoom/pan and the\n * quadtree never needs rebuilding.\n */\nexport class ScatterTooltip {\n\tscatter: Scatter\n\tview: any\n\t/** One DataPointInteractions per chart; a term0 divide-by renders several charts. */\n\tbyChart: Map<string, DataPointInteractions<any>> = new Map()\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.scatter = scatter\n\t\tthis.view = scatter.view\n\t}\n\n\t/** Rendered radius of a dot in serie-local px. `transform()` draws each shape in a 16x16\n\t * box scaled by `getScale()`, so the radius is half of that. `getScale()` already accounts\n\t * for scaleDotTW sizing, the reference cloud's refSize, and the search-match enlargement,\n\t * and is zoom-invariant for the svg view. */\n\tdotRadius(chart, s) {\n\t\treturn 8 * this.scatter.model.getScale(chart, s)\n\t}\n\n\t/** Projected center + rendered radius of every dot, built once per attach. Hover fires on\n\t * every mousemove, so recomputing this per event turned plain cursor movement into an O(n)\n\t * sweep of d3 scale calls over up to maxSvgSamplesCutoff (20k) samples. Everything it\n\t * depends on \u2014 the axis scales and the size settings \u2014 is fixed for the life of an attach,\n\t * and any change to them re-renders, which re-attaches. */\n\tbuildGeom(chart) {\n\t\tconst geom = new Map<any, { x: number; y: number; r: number }>()\n\t\tlet maxR = 0\n\t\tfor (const s of chart.data.samples) {\n\t\t\tconst { x, y } = this.scatter.model.getCoordinates(chart, s)\n\t\t\tconst r = this.dotRadius(chart, s)\n\t\t\tif (r > maxR) maxR = r\n\t\t\tgeom.set(s, { x, y, r })\n\t\t}\n\t\treturn { geom, maxR }\n\t}\n\n\tisVisible(s) {\n\t\t// getOpacity() honours showRef for reference dots but not refSize == 0\n\t\tif (s.isRef && (!this.scatter.settings.showRef || this.scatter.settings.refSize == 0)) return false\n\t\treturn this.scatter.model.getOpacity(s) > 0\n\t}\n\n\t/** Is `b` inside the hover neighbourhood of `a`? The reach is the two dots' radii added\n\t * together \u2014 \"close enough that they would overlap at 100%\" \u2014 but held constant in SCREEN\n\t * px, so it does not stretch as you zoom.\n\t *\n\t * Plain circle overlap looks zoom-invariant (uniform scaling preserves it) but is not what\n\t * the eye sees: the dots themselves grow with zoom, so at 11x a pair that merely touches\n\t * spans ~48 screen px and the tooltip reports dots strewn right across the plot. Dividing\n\t * the reach by the current scale pins it at ~4px on screen at any zoom, matching the\n\t * screen-constant neighbourhood the old 5/zoom threshold happened to give. At 1x this is\n\t * exactly circle overlap; it only bites once zoom would have inflated it.\n\t *\n\t * `scale` is screenScale(chart), hoisted by the caller \u2014 it is a layout read, and this runs\n\t * once per sample. */\n\tisNeighbour(chart, a, b, scale = this.screenScale(chart)) {\n\t\tconst ca = this.scatter.model.getCoordinates(chart, a)\n\t\tconst cb = this.scatter.model.getCoordinates(chart, b)\n\t\tconst reach = (this.dotRadius(chart, a) + this.dotRadius(chart, b)) / scale\n\t\treturn Math.hypot(ca.x - cb.x, ca.y - cb.y) <= reach\n\t}\n\n\t/** Screen px per serie-local px. Reads the composite CTM rather than the zoom state so it\n\t * stays right no matter which ancestor carries the transform. */\n\tscreenScale(chart) {\n\t\treturn chart.serie?.node()?.getScreenCTM()?.a || 1\n\t}\n\n\t/** Serie-local px that a constant SCREEN-px length occupies at the current zoom. */\n\tfromScreenPx(chart, px) {\n\t\treturn px / this.screenScale(chart)\n\t}\n\n\t/** How close the cursor must get to a dot's center to pick it, in serie-local px: the\n\t * radius you can see, plus a forgiveness margin that stays the same size on screen at any\n\t * zoom. Leaving the margin in serie-local px would inflate it with everything else \u2014 at\n\t * 10x zoom a 3px slop becomes 30 screen px of grab area around every dot. */\n\thitRadiusFor(chart, s) {\n\t\treturn this.dotRadius(chart, s) + this.fromScreenPx(chart, HIT_BUFFER_PX)\n\t}\n\n\t/** Scale factor passed to model.transform() to draw the hover ring. The gap is a constant\n\t * number of SCREEN px, not a fixed multiple of the dot: a 1.6x ring is snug on a 2px dot\n\t * but becomes a fat halo once zoom has blown the same dot up to 18px. */\n\thoverRingFactor(chart, s) {\n\t\tconst r = this.dotRadius(chart, s)\n\t\tif (!r) return 1\n\t\treturn 1 + HOVER_RING_MARGIN_PX / this.screenScale(chart) / r\n\t}\n\n\t/** Rings are drawn inside chart.serie so they inherit the zoom transform and track their\n\t * dots. renderSerie() wipes chart.serie, so (re)create the layer lazily. */\n\tgetHoverLayer(chart) {\n\t\tlet g = chart.serie.select('g.sjpp-scatter-hover')\n\t\tif (g.empty()) g = chart.serie.append('g').attr('class', 'sjpp-scatter-hover').attr('pointer-events', 'none')\n\t\treturn g\n\t}\n\n\t/** destroy() rather than detach(): attachTo() builds a fresh DataPointInteractions on every\n\t * renderSerie, and each one owns a Menu that adds a div to <body> plus a body-level\n\t * mousedown listener. detach() alone would leave both behind on every render. */\n\tdetach(chartId?: string) {\n\t\tif (chartId == undefined) {\n\t\t\tfor (const dpi of this.byChart.values()) dpi.destroy()\n\t\t\tthis.byChart.clear()\n\t\t\treturn\n\t\t}\n\t\tthis.byChart.get(chartId)?.destroy()\n\t\tthis.byChart.delete(chartId)\n\t}\n\n\tattachTo(chart) {\n\t\tthis.detach(chart.id)\n\t\t// while the lasso is on it owns the drag over the plot area\n\t\tif (this.scatter.config.lassoOn) return\n\t\tif (!chart.cover || !chart.data?.samples?.length) return\n\t\tconst model = this.scatter.model\n\t\tconst { geom, maxR } = this.buildGeom(chart)\n\n\t\tconst dpi = new DataPointInteractions<any>({\n\t\t\tcover: chart.cover,\n\t\t\thoverLayer: this.getHoverLayer(chart),\n\t\t\thoverTip: this.view.dom.tooltip,\n\t\t\tpoints: chart.data.samples,\n\t\t\ttoLocalCoords: event => pointer(event, chart.serie.node()) as [number, number],\n\t\t\tgetX: s => geom.get(s)!.x,\n\t\t\tgetY: s => geom.get(s)!.y,\n\t\t\t// broad quadtree query; must not under-select before the per-dot filter runs\n\t\t\thitRadius: () => maxR + this.fromScreenPx(chart, HIT_BUFFER_PX),\n\t\t\tperDotRadius: s => geom.get(s)!.r + this.fromScreenPx(chart, HIT_BUFFER_PX),\n\t\t\tisHidden: s => !this.isVisible(s),\n\t\t\t// the cursor picks the nearest dot; the cluster then adds every dot whose rendered\n\t\t\t// circle overlaps that one, so \"neighbour\" means \"visibly on top of each other\".\n\t\t\t// sorted nearest-first because the module truncates this list to maxTooltipRows \u2014\n\t\t\t// in chart.data.samples order the dot actually under the cursor could be cut.\n\t\t\tgetCluster: (seed, all) => {\n\t\t\t\tconst a = geom.get(seed)!\n\t\t\t\t// one layout read for the whole sweep, not one per sample\n\t\t\t\tconst scale = this.screenScale(chart)\n\t\t\t\treturn all\n\t\t\t\t\t.filter(s => {\n\t\t\t\t\t\tif (!this.isVisible(s)) return false\n\t\t\t\t\t\tconst b = geom.get(s)!\n\t\t\t\t\t\treturn Math.hypot(a.x - b.x, a.y - b.y) <= (a.r + b.r) / scale\n\t\t\t\t\t})\n\t\t\t\t\t.sort((s1, s2) => {\n\t\t\t\t\t\tconst b1 = geom.get(s1)!,\n\t\t\t\t\t\t\tb2 = geom.get(s2)!\n\t\t\t\t\t\treturn Math.hypot(a.x - b1.x, a.y - b1.y) - Math.hypot(a.x - b2.x, a.y - b2.y)\n\t\t\t\t\t})\n\t\t\t},\n\t\t\ttoHoverSpec: s => ({\n\t\t\t\tpath: model.getShape(chart, s),\n\t\t\t\ttransform: model.transform(chart, s, this.hoverRingFactor(chart, s)),\n\t\t\t\tstroke: 'black',\n\t\t\t\tfill: 'none'\n\t\t\t}),\n\t\t\tmaxTooltipRows: this.scatter.settings.maxTooltipRows,\n\t\t\titemNoun: this.scatter.settings.itemLabel.toLowerCase(),\n\t\t\trenderSingleHoverTooltip: (s, container) => this.renderSampleRows(s, chart, container),\n\t\t\tbuildMultiHitTableData: dots => this.buildTableData(dots),\n\t\t\tgetActions: s => this.getActions(s),\n\t\t\trenderSingleHitInfo: (s, container) => this.renderSampleRows(s, chart, container),\n\t\t\tgetRowKey: s => s.sample || s.cellId || String(s.sampleId ?? `${s.x},${s.y}`)\n\t\t})\n\t\tdpi.attach()\n\t\t// namespaced so it sits alongside the module's own click handler rather than replacing it\n\t\tchart.cover.on('click.sjpp-scatter-searchmenu', () => this.scatter.interactivity.searchMenu?.hide())\n\t\tthis.byChart.set(chart.id, dpi)\n\t}\n\n\tgetTW(category) {\n\t\tswitch (category) {\n\t\t\tcase 'category':\n\t\t\t\treturn this.scatter.config.colorTW\n\t\t\tcase 'shape':\n\t\t\t\treturn this.scatter.config.shapeTW\n\t\t\tcase 'scale':\n\t\t\t\treturn this.scatter.config.scaleDotTW\n\t\t\tcase 'x':\n\t\t\t\treturn this.scatter.config.term\n\t\t\tcase 'y':\n\t\t\t\treturn this.scatter.config.term2\n\t\t\tdefault:\n\t\t\t\treturn null\n\t\t}\n\t}\n\n\t/** Two-column detail view of one sample, shared by the hover tooltip and the click\n\t * action menu. */\n\trenderSampleRows(sample, chart, container) {\n\t\tconst config = this.scatter.config\n\t\tconst table = table2col({\n\t\t\tholder: container.append('div'),\n\t\t\tdisableScroll: true,\n\t\t\tcellPadding: '5px',\n\t\t\ttestid: 'sjpp-single-hit-table'\n\t\t})\n\t\tif (config.term) {\n\t\t\ttable.addRow(config.term.term.name, this.getCategoryValue('x', sample, config.term))\n\t\t\tif (config.term2) table.addRow(config.term2.term.name, this.getCategoryValue('y', sample, config.term2))\n\t\t}\n\t\tif (sample.category != 'Ref') {\n\t\t\tif (config.colorTW) this.addTermRow(table, 'category', sample, chart)\n\t\t\tif (config.shapeTW) this.addTermRow(table, 'shape', sample, chart)\n\t\t\tif (config.scaleDotTW)\n\t\t\t\ttable.addRow(config.scaleDotTW.term.name, this.getCategoryValue('scale', sample, config.scaleDotTW))\n\t\t}\n\n\t\tif ('info' in sample) for (const [k, v] of Object.entries(sample.info)) table.addRow(k, v)\n\t\tconst name = sample.sample || sample.cellId\n\t\tif (name) table.addRow(this.scatter.settings.itemLabel, name)\n\t}\n\n\t/** A color/shape term row, drawn with the dot's own glyph so the tooltip matches the plot. */\n\taddTermRow(table, category: 'category' | 'shape', sample, chart) {\n\t\tconst tw = this.getTW(category)\n\t\tconst [tdlabel, td] = table.addRow()\n\t\ttdlabel.text(tw.term.name)\n\n\t\tconst isColor = category == 'category'\n\t\tconst color = isColor\n\t\t\t? this.scatter.model.getColor(sample, chart)\n\t\t\t: this.scatter.config.colorTW\n\t\t\t? 'gray'\n\t\t\t: this.scatter.settings.defaultColor\n\t\tconst shapeKey = isColor ? 'Ref' : sample.shape\n\t\tconst shape = shapesArray[chart.shapeLegend.get(shapeKey).shape % shapesArray.length]\n\n\t\tlet value = this.getCategoryValue(category, sample, tw)\n\t\tlet fontColor = 'black'\n\t\tif (tw?.term.type == 'geneVariant' && tw.q.type == 'values') {\n\t\t\tconst whiteColor = rgb('white').toString()\n\t\t\tfor (const id in mclass) {\n\t\t\t\tconst class_info = mclass[id]\n\t\t\t\tif (!value.toString().includes(class_info.label)) continue\n\t\t\t\tif (rgb(class_info.color).toString() != whiteColor) fontColor = class_info.color\n\t\t\t\tvalue = this.getCategoryValue(category, sample, tw, true)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tconst svg = td\n\t\t\t.append('svg')\n\t\t\t.attr('width', value.toString().length * 9 + 60)\n\t\t\t.attr('height', '25px')\n\t\tconst g = svg.append('g').attr('transform', 'translate(0, 14)')\n\t\tg.append('path')\n\t\t\t.attr('d', shape)\n\t\t\t.attr('fill', color)\n\t\t\t.attr('stroke', '#aaa')\n\t\t\t.attr('transform', 'translate(0, -4) scale(0.6)')\n\t\tg.append('text')\n\t\t\t.attr('x', 15)\n\t\t\t.attr('y', 6)\n\t\t\t.attr('font-size', '0.9em')\n\t\t\t.append('tspan')\n\t\t\t.text(value)\n\t\t\t.attr('fill', fontColor)\n\t}\n\n\t/** Flat table for the multi-hit hover tooltip and click menu. */\n\tbuildTableData(dots) {\n\t\treturn buildSampleTableData(this.scatter.config, this.scatter.settings.itemLabel, dots)\n\t}\n\n\tgetActions(sample): ActionMenuItem[] {\n\t\tconst config = this.scatter.config\n\t\tconst interactivity = this.scatter.interactivity\n\t\tconst actions: ActionMenuItem[] = []\n\n\t\t// reference-cloud dots carry no mutation data, so none of these apply to them; the plots below are\n\t\t// also for cohort samples only, and not in the single cell plot. A cohort dot from a request not\n\t\t// authorized to display sample ids has no sampleId (the server dropped it), so gate every\n\t\t// sample-specific action when the real id is absent \u2014 it would submit nothing / build an empty filter.\n\t\tif (sample.isRef || sample.sampleId == null || config.singleCellPlot) return actions\n\n\t\t// the gene may be carried by either term \u2014 the old tooltip offered Lollipop from\n\t\t// whichever of the color/shape rows happened to be a geneVariant\n\t\tconst geneTW = [config.colorTW, config.shapeTW].find(tw => tw?.term.type == 'geneVariant')\n\t\tif (geneTW) actions.push({ label: 'Lollipop', onClick: () => interactivity.openLollipop(geneTW.term.name) })\n\n\t\tconst queries = this.scatter.state.termdbConfig.queries\n\t\tif (this.scatter.state.currentCohortChartTypes.includes('sampleView'))\n\t\t\tactions.push({ label: 'Sample view', onClick: () => interactivity.openSampleView(sample) })\n\t\tif (queries?.singleSampleMutation)\n\t\t\tactions.push({ label: 'Disco', onClick: () => interactivity.openDiscoPlot(sample) })\n\t\tif (queries?.singleSampleGenomeQuantification)\n\t\t\tactions.push({ label: 'Met Array', onClick: () => interactivity.openMetArray(sample) })\n\t\treturn actions\n\t}\n\n\tgetCategoryValue(category, d, tw, includeMutation = false) {\n\t\treturn getCategoryValue(category, d, tw, includeMutation)\n\t}\n}\n", "import { zoom as d3zoom, zoomIdentity } from 'd3-zoom'\nimport { icons as icon_functions } from '#dom'\nimport type { Scatter } from '../scatter.js'\n\nexport class ScatterZoom {\n\tscatter: Scatter\n\tzoomD3: any\n\tdragD3: any\n\tzoom: any\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.zoom = 1\n\t\tthis.scatter = scatter\n\t\tthis.zoomD3 = d3zoom()\n\t\t\t.scaleExtent([0.1, 10])\n\t\t\t.on('zoom', event => this.handleZoom(event.transform))\n\t\t\t.filter(event => {\n\t\t\t\tif (event.type === 'wheel') return event.ctrlKey\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.on('end', async event => {\n\t\t\t\tthis.scatter.transform = event.transform\n\t\t\t\tthis.scatter.zoom = event.transform.k\n\t\t\t\tif (this.scatter.settings.saveZoomTransform) this.saveZoomTransform()\n\t\t\t})\n\t}\n\n\tasync saveZoomTransform() {\n\t\tconst transform = this.scatter.transform?.toString() || null\n\t\tthis.scatter.app.dispatch({ type: 'plot_edit', id: this.scatter.id, config: { transform } })\n\t}\n\n\tinitZoom(toolsDiv) {\n\t\tthis.zoomD3.scaleExtent([0.1, this.scatter.config.scaleDotTW ? 4 : 10])\n\n\t\ttoolsDiv.selectAll('*').remove()\n\t\tconst display = 'block'\n\t\tconst resetDiv = toolsDiv\n\t\t\t.insert('div')\n\t\t\t.style('display', display)\n\t\t\t.style('margin', '15px 10px')\n\t\t\t.attr('name', 'sjpp-reset-btn') //For unit tests\n\t\ticon_functions['restart'](resetDiv, { handler: () => this.resetToIdentity(), title: 'Reset plot to defaults' })\n\n\t\tconst zoomInDiv = toolsDiv\n\t\t\t.insert('div')\n\t\t\t.style('display', display)\n\t\t\t.style('margin', '15px 10px')\n\t\t\t.attr('name', 'sjpp-zoom-in-btn') //For unit tests\n\t\ticon_functions['zoomIn'](zoomInDiv, {\n\t\t\thandler: () => this.zoomIn(),\n\t\t\ttitle: 'Zoom in. You can also zoom in pressing the Ctrl key and using the mouse wheel'\n\t\t})\n\t\tconst zoomOutDiv = toolsDiv\n\t\t\t.insert('div')\n\t\t\t.style('display', display)\n\t\t\t.style('margin', '15px 10px')\n\t\t\t.attr('name', 'sjpp-zoom-out-btn') //For unit tests\n\t\ticon_functions['zoomOut'](zoomOutDiv, {\n\t\t\thandler: () => this.zoomOut(),\n\t\t\ttitle: 'Zoom out. You can also zoom out pressing the Ctrl key and using the mouse wheel'\n\t\t})\n\n\t\tfor (const chart of this.scatter.model.charts) {\n\t\t\tchart.mainG!.call(this.zoomD3)\n\t\t}\n\n\t\tif (this.scatter.config.scaleDotTW && this.zoom > 4) this.resetToIdentity()\n\t}\n\n\thandleZoom(transform) {\n\t\tthis.zoom = transform.scale(1).k\n\t\tfor (const chart of this.scatter.model.charts) {\n\t\t\t// create new scale ojects based on event\n\t\t\tconst new_xScale = transform.rescaleX(chart.xAxisScale)\n\t\t\tconst new_yScale = transform.rescaleY(chart.yAxisScale)\n\t\t\tchart.serie.attr('transform', transform)\n\t\t\tchart.regressionG?.attr('transform', transform)\n\t\t\tchart.xAxis!.call(chart.axisBottom.scale(new_xScale))\n\t\t\tchart.yAxis!.call(chart.axisLeft.scale(new_yScale))\n\t\t\tif (this.scatter.config.lassoOn)\n\t\t\t\tchart.lasso.selectedItems().attr('transform', c => this.scatter.model.transform(chart, c, 1.2))\n\t\t\tif (this.scatter.config.scaleDotTW) this.scatter.vm.legendvm.drawScaleDotLegend(chart)\n\t\t}\n\t}\n\n\tzoomIn() {\n\t\tthis.zoom = this.zoom * 1.2\n\t\tif (!this.scatter.model.is2DLarge)\n\t\t\tfor (const chart of this.scatter.model.charts) this.zoomD3.scaleBy(chart.mainG!.transition().duration(500), 1.2)\n\t}\n\n\tzoomOut() {\n\t\tthis.zoom = this.zoom * 0.8\n\t\tif (!this.scatter.model.is2DLarge)\n\t\t\tfor (const chart of this.scatter.model.charts) this.zoomD3.scaleBy(chart.mainG!.transition().duration(500), 0.8)\n\t}\n\n\tresetToIdentity() {\n\t\tthis.zoom = 1\n\t\tif (!this.scatter.model.is2DLarge)\n\t\t\tfor (const chart of this.scatter.model.charts)\n\t\t\t\tchart.mainG!.transition().duration(500).call(this.zoomD3.transform, zoomIdentity)\n\t}\n}\n", "import { getMaxLabelWidth } from '#dom'\nimport { select } from 'd3-selection'\nimport { line } from 'd3'\nimport { ScatterLegend } from './scatterLegend.js'\nimport { ScatterTooltip } from './scatterTooltip.js'\nimport { getTitle } from './scatterLegend.js'\nimport { ScatterZoom } from './scatterZoom.js'\nimport type { Scatter } from '../scatter.js'\nimport type { ScatterModelBase } from '../model/ScatterModelBase'\n\nexport class ScatterViewModelBase {\n\tscatter: Scatter\n\tview: any\n\tmodel: ScatterModelBase\n\tinteractivity: any\n\tlegendvm: ScatterLegend\n\tscatterTooltip: ScatterTooltip\n\tscatterZoom: ScatterZoom\n\tcanvas: any\n\tstep: any\n\tlegendHeight: any\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.scatter = scatter\n\t\tthis.view = scatter.view\n\t\tthis.model = scatter.model\n\t\tthis.interactivity = scatter.interactivity\n\t\tthis.legendvm = new ScatterLegend(scatter)\n\t\tthis.scatterTooltip = new ScatterTooltip(scatter)\n\t\tthis.scatterZoom = new ScatterZoom(scatter)\n\t}\n\n\trender() {\n\t\tconst chartDivs = this.view.dom.mainDiv.selectAll(':scope > div').data(this.model.charts, chart => chart?.id)\n\t\tchartDivs.exit().remove()\n\t\tchartDivs.each((chart, i, divs) => {\n\t\t\tconst div = select(divs[i])\n\t\t\tthis.renderChart(chart, div)\n\t\t})\n\t\tchartDivs\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.each((chart, i, divs) => {\n\t\t\t\tconst div = select(divs[i])\n\t\t\t\tthis.renderChart(chart, div)\n\t\t\t})\n\t\tif (!this.model.charts?.length) {\n\t\t\t// no data\n\t\t\tthis.view.dom.bannerDiv.html(`<span>No visible scatter plot data to render</span>`).style('display', 'block')\n\t\t\treturn\n\t\t} else {\n\t\t\tthis.view.dom.bannerDiv.style('display', 'none')\n\t\t}\n\t}\n\n\trenderChart(chart, div, removePrevious = true) {\n\t\tconst s = this.scatter.settings\n\t\tdiv\n\t\t\t.style('opacity', 0)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.attr('data-testid', `sjpp-scatter-chart-div-${chart?.id ?? 'Default'}`)\n\t\t// hover/click are wired by ScatterTooltip onto chart.cover (see fillSvgSubElems), so that\n\t\t// the cursor \u2014 not whichever dot happens to be painted on top \u2014 decides what is picked\n\n\t\tchart.svg = div.select('svg').empty() ? div.append('svg') : div.select('svg')\n\t\tthis.renderSVG(chart, s, removePrevious)\n\t\tdiv.transition().duration(s.duration).style('opacity', 1)\n\t\tchart.chartDiv = div\n\t}\n\n\tasync renderSVG(chart, s, removePrevious) {\n\t\tconst svg = chart.svg\n\t\tlet step = Math.min((20 * 40) / chart.colorLegend.size, 25)\n\t\tif (step < 18) step = 18\n\t\tthis.step = step\n\t\tlet colorLegendSize = chart.colorLegend.size * step\n\t\tif (chart.colorLegend.get('Ref')?.sampleCount > 0) colorLegendSize += 60\n\t\tconst scaleHeight = this.scatter.config.scaleDotTW ? 200 : 100\n\t\tthis.legendHeight = Math.max(colorLegendSize, chart.shapeLegend.size * 25) + scaleHeight //legend step and header\n\n\t\tlet fontSize = this.legendvm.getFontSize(chart, chart.colorLegend)\n\n\t\t/** Becomes the x offset for the shape legend.\n\t\t * When in continuous mode, color scale renders with a\n\t\t * default width of 150. */\n\t\tconst labels: any = []\n\n\t\tif (this.scatter.config.colorTW) labels.push(getTitle(this.scatter.config.colorTW.term.name, 40) + ' COLOR')\n\t\t// a bySample plot colors dots by a file column (no colorTW); reserve legend width for it\n\t\telse if (this.scatter.config.colorColumn && this.scatter.config.bySample)\n\t\t\tlabels.push(getTitle(this.scatter.config.colorColumn.name, 40) + ' COLOR')\n\t\tif (this.scatter.config.scaleDotTW) labels.push(getTitle(this.scatter.config.scaleDotTW.term.name, 40) + ' SHAPE')\n\t\tif (labels.length > 0) {\n\t\t\tconst labelsWidth = getMaxLabelWidth(svg, labels) + 40\n\t\t\tchart.colorLegendWidth =\n\t\t\t\tthis.scatter.config?.colorTW?.q.mode == 'continuous'\n\t\t\t\t\t? Math.max(175, labelsWidth)\n\t\t\t\t\t: Math.max(this.legendvm.getLegendLabelWidth(chart, 'color', svg, `${fontSize}em`), labelsWidth)\n\t\t} else chart.colorLegendWidth = 0\n\n\t\tfontSize = this.legendvm.getFontSize(chart, chart.shapeLegend)\n\t\tconst shapeWidth = this.legendvm.getLegendLabelWidth(chart, 'shape', svg, `${fontSize}em`)\n\t\tconst width = s.svgw + chart.colorLegendWidth + shapeWidth + 125\n\t\tsvg\n\n\t\t\t.attr('width', width)\n\t\t\t.attr('height', Math.max(s.svgh + 200, this.legendHeight)) //leaving some space for axis/ref/ scale legend/padding\n\t\t\t.transition()\n\t\t\t.duration(s.duration)\n\t\tthis.fillSvgSubElems(chart)\n\n\t\tawait this.renderSerie(chart, removePrevious) //wait for legendG to be defined if on 2D large or 3D\n\t\tthis.legendvm.renderLegend(chart, step)\n\t}\n\n\tfillSvgSubElems(chart) {\n\t\tconst svg = chart.svg\n\t\tlet axisG, labelsG\n\t\tif (svg.select('.sjpcb-scatter-mainG').size() == 0) {\n\t\t\tchart.G = svg.append('g').attr('class', 'sjpcb-scatter-G')\n\t\t\tchart.mainG = chart.G.append('g').attr('class', 'sjpcb-scatter-mainG')\n\t\t\taxisG = svg.append('g').attr('class', 'sjpcb-scatter-axis')\n\t\t\tlabelsG = svg.append('g').attr('class', 'sjpcb-scatter-labelsG')\n\t\t\tchart.xAxis = axisG.append('g').attr('class', 'sjpcb-scatter-x-axis')\n\t\t\tchart.yAxis = axisG\n\t\t\t\t.append('g')\n\t\t\t\t.attr('class', 'sjpcb-scatter-y-axis')\n\t\t\t\t.attr('transform', `translate(${this.model.axisOffset.x}, 0)`)\n\t\t\tchart.mainG\n\t\t\t\t.append('rect')\n\t\t\t\t.attr('class', 'zoom')\n\t\t\t\t.attr('x', this.model.axisOffset.x)\n\t\t\t\t.attr('y', this.model.axisOffset.y)\n\t\t\t\t.attr('width', this.scatter.settings.svgw)\n\t\t\t\t.attr('height', this.scatter.settings.svgh)\n\t\t\t\t.attr('fill', 'white')\n\t\t\tconst id = 'clip' + this.scatter.id\n\t\t\tchart.clipRect = chart.svg\n\t\t\t\t.append('defs')\n\t\t\t\t.append('clipPath')\n\t\t\t\t.attr('id', id)\n\t\t\t\t.append('rect')\n\t\t\t\t.attr('x', this.model.axisOffset.x)\n\t\t\t\t.attr('y', this.model.axisOffset.y)\n\t\t\t\t.attr('width', this.scatter.settings.svgw + 10)\n\t\t\t\t.attr('height', this.scatter.settings.svgh)\n\n\t\t\tchart.serie = chart.mainG.append('g').attr('class', 'sjpcb-scatter-series')\n\n\t\t\tchart.regressionG = chart.mainG.append('g').attr('class', 'sjpcb-scatter-lowess')\n\t\t\t// Hit area for hover/click, kept as the last child of mainG so it sits above the dots and\n\t\t\t// receives the pointer anywhere in the plot area, not just on a painted dot. It lives in\n\t\t\t// mainG (not serie) so the zoom transform doesn't drag it off the plot, and events still\n\t\t\t// bubble to mainG where d3-zoom and the lasso are bound.\n\t\t\tchart.cover = chart.mainG\n\t\t\t\t.append('rect')\n\t\t\t\t.attr('class', 'sjpp-scatter-cover')\n\t\t\t\t.attr('x', this.model.axisOffset.x)\n\t\t\t\t.attr('y', this.model.axisOffset.y)\n\t\t\t\t.attr('width', this.scatter.settings.svgw)\n\t\t\t\t.attr('height', this.scatter.settings.svgh)\n\t\t\t\t.attr('fill', 'none')\n\t\t\t\t.style('pointer-events', 'all')\n\t\t\tchart.legendG = svg.append('g').attr('class', 'sjpcb-scatter-legend')\n\t\t\tif (this.scatter.state.config.transform && chart.mainG.attr('transform') != this.scatter.state.config.transform) {\n\t\t\t\tchart.mainG.attr('transform', this.scatter.state.config.transform)\n\t\t\t}\n\t\t\tchart.G.attr('clip-path', `url(#${id})`)\n\t\t} else {\n\t\t\tchart.G = svg.select('.sjpcb-scatter-G')\n\t\t\tchart.mainG = svg.select('.sjpcb-scatter-mainG')\n\t\t\tchart.serie = chart.mainG.select('.sjpcb-scatter-series')\n\t\t\tchart.regressionG = chart.mainG.select('.sjpcb-scatter-lowess')\n\t\t\tchart.cover = chart.mainG.select('.sjpp-scatter-cover')\n\t\t\taxisG = svg.select('.sjpcb-scatter-axis')\n\t\t\tlabelsG = svg.select('.sjpcb-scatter-labelsG')\n\t\t\tchart.xAxis = axisG.select('.sjpcb-scatter-x-axis')\n\t\t\tchart.yAxis = axisG.select('.sjpcb-scatter-y-axis')\n\t\t\tchart.legendG = svg.select('.sjpcb-scatter-legend')\n\t\t\tchart.clipRect = svg.select('defs').select('clipPath').select('rect')\n\t\t}\n\n\t\tchart.axisG = axisG\n\t\tchart.labelsG = labelsG\n\t\t// svgw/svgh are user-adjustable, so keep the hit area in sync on re-render\n\t\tchart.cover.attr('width', this.scatter.settings.svgw).attr('height', this.scatter.settings.svgh)\n\t\tchart.xAxis.attr('transform', `translate(0, ${this.scatter.settings.svgh + this.model.axisOffset.y})`)\n\n\t\tchart.legendG.attr('transform', `translate(${this.scatter.settings.svgw + this.model.axisOffset.x + 50}, 20)`)\n\t\tif (chart.axisBottom) {\n\t\t\tchart.xAxis.call(chart.axisBottom)\n\t\t\tchart.yAxis.call(chart.axisLeft)\n\t\t}\n\t\tif (this.scatter.config.term) {\n\t\t\tlet termName = getTitle(this.scatter.config.term.term.name, 60)\n\t\t\tif (!this.scatter.config.colorTW && !this.scatter.config.shapeTW && !this.scatter.config.term0)\n\t\t\t\ttermName = `${termName}, n=${chart.cohortSamples.length || chart.totalSampleCount}`\n\n\t\t\tlabelsG.selectAll('*').remove()\n\t\t\tlet text = labelsG\n\t\t\t\t.append('text')\n\t\t\t\t.attr(\n\t\t\t\t\t'transform',\n\t\t\t\t\t`translate(${this.model.axisOffset.x + this.scatter.settings.svgw / 2}, ${\n\t\t\t\t\t\tthis.scatter.settings.svgh + this.model.axisOffset.y + 40\n\t\t\t\t\t})`\n\t\t\t\t)\n\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t.text(termName)\n\t\t\t\t.style('font-size', '0.9em')\n\n\t\t\tif (termName.length > 65) {\n\t\t\t\ttext\n\t\t\t\t\t.on('mouseenter', event => {\n\t\t\t\t\t\tthis.scatter.interactivity.showText(event, this.scatter.config.term.term.name)\n\t\t\t\t\t})\n\t\t\t\t\t.on('mouseleave', () => this.view.dom.tooltip.hide())\n\t\t\t}\n\t\t\tif (this.scatter.config.term0 && !this.scatter.config.colorTW && !this.scatter.config.shapeTW) {\n\t\t\t\tconst term0Name = `${chart.id}, n=${chart.cohortSamples.length}`\n\n\t\t\t\tlabelsG\n\t\t\t\t\t.append('text')\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'transform',\n\t\t\t\t\t\t`translate(${this.model.axisOffset.x + this.scatter.settings.svgw / 2}, ${\n\t\t\t\t\t\t\tthis.scatter.settings.svgh + this.model.axisOffset.y + 65\n\t\t\t\t\t\t})`\n\t\t\t\t\t)\n\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t.text(term0Name)\n\t\t\t}\n\t\t\tif (this.scatter.config.term2) {\n\t\t\t\tconst t2name = this.scatter.config.term2.term.name\n\t\t\t\tconst term2Name = getTitle(t2name, 60)\n\t\t\t\ttext = labelsG\n\t\t\t\t\t.append('text')\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t'transform',\n\t\t\t\t\t\t`translate(${this.model.axisOffset.x - 50}, ${\n\t\t\t\t\t\t\tthis.scatter.settings.svgh / 2 + this.model.axisOffset.y\n\t\t\t\t\t\t}) rotate(-90)`\n\t\t\t\t\t)\n\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t.text(term2Name)\n\t\t\t\t\t.style('font-size', '0.9em')\n\t\t\t\tif (term2Name.length > 60) {\n\t\t\t\t\ttext\n\t\t\t\t\t\t.on('mouseenter', event => {\n\t\t\t\t\t\t\tthis.scatter.interactivity.showText(event, this.scatter.config.term2.term.name)\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('mouseleave', () => this.view.dom.tooltip.hide())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\trenderSerie(chart, removePrevious) {\n\t\tconst duration = this.scatter.settings.duration\n\t\tif (this.canvas) this.canvas.remove()\n\n\t\tconst g = chart.serie\n\n\t\tconst data = chart.data\n\t\tif (removePrevious) chart.serie.selectAll('*').remove()\n\n\t\t// remove all symbols as there is no data id for privacy\n\t\t//g.selectAll('path').remove()\n\t\tconst labelPointTestId = c => 'sjpp-scatter-dot-' + (c.sample ?? c.sampleId ?? '')\n\t\tconst symbols = g.selectAll('path[name=\"serie\"]').data(data.samples)\n\t\tsymbols\n\t\t\t.transition()\n\t\t\t.duration(duration)\n\t\t\t.attr('name', 'serie')\n\t\t\t.attr('data-testid', labelPointTestId)\n\t\t\t.attr('transform', c => this.model.transform(chart, c))\n\t\t\t.attr('d', c => this.model.getShape(chart, c))\n\t\t\t.attr('fill', c => this.model.getColor(c, chart))\n\t\t\t.attr('stroke', c => this.model.getColor(c, chart))\n\t\t\t.attr('stroke-width', c => this.model.getStrokeWidth(c))\n\t\t\t.style('fill-opacity', c => this.model.getOpacity(c))\n\t\tsymbols\n\t\t\t.enter()\n\t\t\t.append('path')\n\t\t\t.attr('name', 'serie')\n\t\t\t.attr('data-testid', labelPointTestId)\n\t\t\t/*** you'd need to set the symbol position using translate, instead of previously with cx, cy for a circle ***/\n\t\t\t.attr('transform', c => this.model.transform(chart, c))\n\t\t\t.attr('d', c => this.model.getShape(chart, c))\n\t\t\t.attr('fill', c => this.model.getColor(c, chart))\n\t\t\t.attr('stroke', c => this.model.getColor(c, chart))\n\t\t\t.attr('stroke-width', c => this.model.getStrokeWidth(c))\n\t\t\t.style('fill-opacity', c => this.model.getOpacity(c))\n\t\t\t.transition()\n\t\t\t.duration(duration)\n\n\t\tthis.mayRenderSampleLabels(chart)\n\t\tthis.mayRenderRegression()\n\t}\n\n\t/** Draw the sample name as a text label next to each cohort (db) sample dot. Used by per-sample\n\t * (bySample) scatterplots, where a single highlighted dot sits among a reference cloud. */\n\tmayRenderSampleLabels(chart) {\n\t\tconst g = chart.serie\n\t\tconst labelData =\n\t\t\tthis.scatter.config.bySample && chart.data?.samples ? chart.data.samples.filter(c => !c.isRef && c.sample) : []\n\t\tconst labels = g.selectAll('text[name=\"sampleLabel\"]').data(labelData, (c: any) => c.sample)\n\t\tlabels.exit().remove()\n\t\tlabels\n\t\t\t.enter()\n\t\t\t.append('text')\n\t\t\t.attr('name', 'sampleLabel')\n\t\t\t.attr('pointer-events', 'none')\n\t\t\t.attr('font-size', '12px')\n\t\t\t.attr('font-weight', 'bold')\n\t\t\t.attr('paint-order', 'stroke')\n\t\t\t.attr('stroke', 'white')\n\t\t\t.attr('stroke-width', '3px')\n\t\t\t.attr('fill', 'black')\n\t\t\t.merge(labels as any)\n\t\t\t.attr('x', (c: any) => this.model.getCoordinates(chart, c).x + 8)\n\t\t\t.attr('y', (c: any) => this.model.getCoordinates(chart, c).y + 4)\n\t\t\t.text((c: any) => c.sample)\n\t}\n\n\tasync mayRenderRegression() {\n\t\tfor (const chart of this.model.charts) {\n\t\t\tchart.regressionG?.selectAll('*').remove()\n\t\t\tif (chart.regressionCurve) {\n\t\t\t\tconst l = line()\n\t\t\t\t\t.x(d => d[0])\n\t\t\t\t\t.y(d => d[1])\n\t\t\t\tconst regressionPath = chart.regressionG!.append('path')\n\t\t\t\tregressionPath\n\t\t\t\t\t.attr('d', l(chart.regressionCurve))\n\t\t\t\t\t.attr('stroke', 'blue')\n\t\t\t\t\t.attr('fill', 'none')\n\t\t\t\t\t.style('stroke-width', '2')\n\t\t\t}\n\t\t}\n\t}\n\n\tasync addGroup(group) {\n\t\tthis.model.addGroup(group)\n\t\tthis.view.dom.tip.hide()\n\t}\n\n\tsetTools() {\n\t\tif (!this.model.charts[0]) return\n\t\tconst toolsDiv = this.view.dom.toolsDiv.style('background-color', 'white')\n\t\ttoolsDiv.selectAll('*').remove()\n\n\t\t//Disabling all zoom functionality for large single cell plots for now\n\t\tif (!(this.model.is2DLarge && this.scatter.config.singleCellPlot)) this.scatterZoom.initZoom(toolsDiv)\n\t}\n\n\t/** Applies to the ViewModel only\n\t * Note: legendvm.renderLegend called in this file applies to all\n\t * inherited classes. The g dimensions are different\n\t * between the svg rendered scatter and the 2D Large/3D scatter.\n\t * Hence the similar function in scatterViewModel. */\n\taddLegendSVG(chart) {\n\t\tchart.chartDiv.style('margin', '20px 20px')\n\t\tchart.legendDiv = this.view.dom.mainDiv\n\t\t\t.insert('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('vertical-align', 'top')\n\t\tchart.legendG = chart.legendDiv\n\t\t\t.append('svg')\n\t\t\t.attr('width', this.scatter.settings.svgw / 2)\n\t\t\t.attr('height', this.scatter.settings.svgh)\n\t\t\t.append('g')\n\t\t\t.attr('transform', 'translate(20, 20)')\n\t}\n}\n", "import { icons as icon_functions } from '#dom'\nimport { d3lasso } from '#common/lasso'\nimport { scaleLinear as d3Linear } from 'd3-scale'\nimport { line, extent, contourDensity, geoPath, scaleSequential, max, interpolateGreys } from 'd3'\nimport { ScatterLasso } from './scatterLasso'\nimport type { Scatter } from '../scatter'\nimport { ScatterViewModelBase } from './scatterViewModelBase'\n\nexport class ScatterViewModel extends ScatterViewModelBase {\n\tscatterLasso: ScatterLasso\n\n\tconstructor(scatter: Scatter) {\n\t\tsuper(scatter)\n\t\tthis.scatterLasso = new ScatterLasso(scatter)\n\t}\n\n\tfillSvgSubElems(chart) {\n\t\tsuper.fillSvgSubElems(chart)\n\t\tchart.axisG.style('opacity', this.scatter.settings.showAxes ? 1 : 0)\n\t\tchart.labelsG.style('opacity', this.scatter.settings.showAxes ? 1 : 0)\n\t}\n\n\trenderSerie(chart, removePrevious) {\n\t\tsuper.renderSerie(chart, removePrevious)\n\t\tif (this.scatter.settings.showContour) this.renderContours(chart)\n\t\t// rebuild the hover quadtree against the dots just rendered\n\t\tthis.scatterTooltip.attachTo(chart)\n\t}\n\n\trenderContours(chart) {\n\t\tconst contourG = chart.serie\n\t\tlet zAxisScale\n\t\tif (this.scatter.config.colorTW?.q.mode == 'continuous') {\n\t\t\tconst [zMin, zMax] = extent(chart.data.samples, (d: any) => d.category) as [any, any]\n\t\t\tzAxisScale = d3Linear().domain([zMin, zMax]).range([0, 1])\n\t\t}\n\n\t\tconst data = chart.data.samples\n\t\t\t.filter(s => this.model.getOpacity(s) > 0)\n\t\t\t.map(s => {\n\t\t\t\treturn { x: chart.xAxisScale(s.x), y: chart.yAxisScale(s.y), z: zAxisScale ? zAxisScale(s.category) : 1 }\n\t\t\t})\n\t\trenderContours(\n\t\t\tcontourG,\n\t\t\tdata,\n\t\t\tthis.scatter.settings.svgw,\n\t\t\tthis.scatter.settings.svgh,\n\t\t\tthis.scatter.settings.colorContours,\n\t\t\tthis.scatter.settings.contourBandwidth,\n\t\t\tthis.scatter.settings.contourThresholds\n\t\t)\n\t}\n\n\tasync mayRenderRegression() {\n\t\tfor (const chart of this.model.charts) {\n\t\t\tchart.regressionG?.selectAll('*').remove()\n\t\t\tif (chart.regressionCurve) {\n\t\t\t\tconst l = line()\n\t\t\t\t\t.x(d => d[0])\n\t\t\t\t\t.y(d => d[1])\n\t\t\t\tconst regressionPath = chart.regressionG!.append('path')\n\t\t\t\tregressionPath\n\t\t\t\t\t.attr('d', l(chart.regressionCurve))\n\t\t\t\t\t.attr('stroke', 'blue')\n\t\t\t\t\t.attr('fill', 'none')\n\t\t\t\t\t.style('stroke-width', '2')\n\t\t\t}\n\t\t}\n\t}\n\n\tasync toggleLasso() {\n\t\tthis.scatter.config.lassoOn = !this.scatter.config.lassoOn\n\t\tthis.scatter.app.dispatch({ type: 'plot_edit', id: this.scatter.id, config: this.scatter.config })\n\t}\n\n\tasync addGroup(group) {\n\t\tthis.model.addGroup(group)\n\t\tthis.view.dom.tip.hide()\n\t}\n\n\tsetTools() {\n\t\tsuper.setTools()\n\t\t// the search + lasso group tools operate on termdb (cohort) samples. a bySample plot has a\n\t\t// single cohort sample, so these don't apply \u2014 keep only the zoom/reset tools from super\n\t\tif (this.scatter.config.singleCellPlot || this.scatter.config.bySample) return\n\t\tconst toolsDiv = this.view.dom.toolsDiv\n\t\tconst display = 'block'\n\t\tconst searchDiv = toolsDiv.insert('div').style('display', display).style('margin', '15px 10px')\n\t\tthis.view.dom.lassoDiv = toolsDiv.insert('div').style('display', display).style('margin', '15px 10px')\n\t\ticon_functions['search'](searchDiv, { handler: e => this.interactivity.searchSample(e), title: 'Search samples' })\n\t\ticon_functions['lasso'](this.view.dom.lassoDiv, {\n\t\t\thandler: () => this.toggleLasso(),\n\t\t\tenabled: this.scatter.config.lassoOn,\n\t\t\ttitle: 'Select a group of samples'\n\t\t})\n\t\tthis.view.dom.groupDiv = toolsDiv.insert('div').style('display', display).style('margin', '15px 10px')\n\n\t\tfor (const chart of this.model.charts) {\n\t\t\tif (!chart.lasso) chart.lasso = d3lasso()\n\t\t\tthis.scatterLasso.lassoReset(chart)\n\t\t}\n\t}\n\n\t/** Applies to 2D large and 3D add an svg for the legend\n\t * Note: legendvm.renderLegend called in ViewModeBase applies to all\n\t * inherited classes. The g dimensions are different\n\t * between the svg rendered scatter and the 2D Large/3D scatter.\n\t * Hence the similar function in scatterViewModelBase.*/\n\taddLegendSVG(chart) {\n\t\tchart.chartDiv.style('margin', '20px 20px')\n\t\tchart.legendDiv = this.view.dom.mainDiv\n\t\t\t.insert('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('vertical-align', 'top')\n\t\tchart.legendG = chart.legendDiv\n\t\t\t.append('svg')\n\t\t\t.attr('width', this.scatter.settings.svgw / 2)\n\t\t\t.attr('height', this.scatter.vm.legendHeight)\n\t\t\t.append('g')\n\t\t\t.attr('transform', 'translate(20, 20)')\n\t}\n}\n\nexport function renderContours(contourG, data, width, height, colorContours, bandwidth, thresholds) {\n\t// Create the horizontal and vertical scales.\n\n\tconst contours = contourDensity()\n\t\t.x((s: any) => s.x)\n\t\t.y((s: any) => s.y)\n\t\t.weight((s: any) => s.z)\n\t\t.size([width, height])\n\t\t.cellSize(2)\n\n\t\t.bandwidth(bandwidth)\n\t\t.thresholds(thresholds)(data)\n\n\tconst colorScale = scaleSequential()\n\t\t.domain([0, max(contours, d => d.value) as any])\n\t\t.interpolator(interpolateGreys)\n\n\t// Compute the density contours.\n\t// Append the contours.\n\tcontourG\n\t\t.attr('fill', 'none')\n\t\t.attr('stroke', 'gray') // gray to make the contours visible\n\t\t.attr('stroke-linejoin', 'round')\n\t\t.selectAll()\n\t\t.data(contours)\n\t\t.join('path')\n\t\t.attr('stroke-width', (d, i) => (i % 5 ? 0.25 : 1))\n\t\t.attr('d', geoPath())\n\t\t.attr('fill', colorContours ? d => colorScale(d.value) : 'none')\n\t\t.attr('fill-opacity', 0.05) //this is the opacity of the contour, reduce it to 0.05 to avoid hiding the points\n}\n", "import { rgb } from 'd3-color'\nimport { select } from 'd3-selection'\nimport { zoomIdentity } from 'd3-zoom'\nimport * as THREE from 'three'\nimport { ScatterViewModel } from './scatterViewModel'\nimport type { Scatter } from '../scatter'\n\nexport class ScatterViewModel2DLarge extends ScatterViewModel {\n\tisSingleCell: boolean = false\n\n\tconstructor(scatter: Scatter) {\n\t\tsuper(scatter)\n\t\tthis.isSingleCell = scatter.config?.singleCellPlot\n\t}\n\n\tasync renderSerie(chart) {\n\t\tif (this.isSingleCell && chart.src) {\n\t\t\tthis.renderLargeSingleCell(chart)\n\t\t\treturn\n\t\t}\n\t\tconst s = this.scatter.settings\n\t\tconst offsetX = this.model.axisOffset.x\n\t\tconst offsetY = this.model.axisOffset.y\n\n\t\t// fillSvgSubElems() has already drawn the x/y axes, axis titles and legend into chart.svg;\n\t\t// keep that svg and overlay the WebGL canvas on the plot area (offset by the axis margins)\n\t\t// so the axes remain visible around the point cloud, instead of wiping the whole mainDiv.\n\t\tconst div = select(chart.svg.node().parentNode)\n\t\tdiv.style('position', 'relative')\n\t\tdiv.selectAll('canvas').remove()\n\t\t// When a chart crosses from the SVG path to this WebGL path, chart.svg is reused. Clear its data\n\t\t// layers \u2014 the dots/contour in chart.serie and the regression curve in chart.regressionG \u2014 so\n\t\t// stale SVG points don't show through the transparent canvas. Axes, labels and legend are kept.\n\t\tchart.serie?.selectAll('*').remove()\n\t\tchart.regressionG?.selectAll('*').remove()\n\t\tthis.canvas = div\n\t\t\t.append('canvas')\n\t\t\t.style('position', 'absolute')\n\t\t\t.style('left', `${offsetX}px`)\n\t\t\t.style('top', `${offsetY}px`)\n\t\t\t.node()\n\t\tthis.canvas.width = s.svgw\n\t\tthis.canvas.height = s.svgh\n\n\t\tconst fov = s.threeFOV\n\t\tconst near = 0.1\n\t\tconst far = 1000\n\t\tconst camera = new THREE.PerspectiveCamera(fov, 1, near, far)\n\t\tconst scene = new THREE.Scene()\n\t\t// Place the camera so the data range (mapped to world [-1, 1] by getVertices) exactly fills\n\t\t// the canvas: with a vertical fov, the visible half-height at the data plane is\n\t\t// distance * tan(fov/2), so distance = 1 / tan(fov/2) makes that half-height equal 1. This\n\t\t// keeps the point cloud aligned with the SVG axes, which map the same data range to the same\n\t\t// plot-area pixels.\n\t\tcamera.position.set(0, 0, 1 / Math.tan((fov * Math.PI) / 180 / 2))\n\t\tcamera.lookAt(scene.position)\n\t\tcamera.updateMatrix()\n\t\t// leave the scene background unset so the canvas is transparent and the underlying svg\n\t\t// (its plot-area background and the x/y axis spines) shows through around the points\n\n\t\tconst geometry = new THREE.BufferGeometry()\n\t\tconst { vertices, colors } = this.getVertices(chart)\n\n\t\tgeometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\n\t\tgeometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3))\n\t\tconst tex = getThreeCircle(128)\n\t\tconst material = new THREE.PointsMaterial({\n\t\t\tsize: this.scatter.settings.threeSize,\n\t\t\tsizeAttenuation: true,\n\t\t\ttransparent: true,\n\t\t\topacity: this.scatter.settings.opacity,\n\t\t\tmap: tex,\n\t\t\tvertexColors: true\n\t\t})\n\n\t\tconst particles = new THREE.Points(geometry, material)\n\n\t\tscene.add(particles)\n\t\tconst renderer = new THREE.WebGLRenderer({\n\t\t\tantialias: true,\n\t\t\tcanvas: this.canvas,\n\t\t\tpreserveDrawingBuffer: true,\n\t\t\talpha: true\n\t\t})\n\t\trenderer.setClearColor(0x000000, 0) // fully transparent clear so the svg shows through\n\t\trenderer.setSize(this.scatter.settings.svgw, this.scatter.settings.svgh)\n\t\trenderer.setPixelRatio(window.devicePixelRatio)\n\n\t\t// Note: no DragControls here. Dragging the point cloud would translate the particles directly\n\t\t// while the SVG axes stay fixed, so the points would no longer line up with their axis values.\n\t\t// Zoom (below and via the zoom buttons) is the only navigation, and it keeps the axes in sync.\n\n\t\t// drive zoom through the shared scatterZoom so the WebGL camera and the SVG axes stay in sync\n\t\tthis.canvas.addEventListener('wheel', (event: any) => {\n\t\t\tif (!event.ctrlKey) return\n\t\t\tevent.preventDefault()\n\t\t\tconst zoomState = this.scatter.vm.scatterZoom\n\t\t\tconst factor = event.deltaY < 0 ? 1.1 : 0.9\n\t\t\tzoomState.zoom = Math.max(0.1, Math.min(10, zoomState.zoom * factor))\n\t\t})\n\n\t\tthis.renderAxes(chart)\n\t\tthis.animate(chart, camera, scene, renderer)\n\t}\n\n\t/** Redraw the given chart's x/y axes to match the current WebGL zoom. camera.zoom scales the point\n\t * cloud by k about the plot center, so express that as a d3 zoom transform and rescale the axes the\n\t * way ScatterZoom.handleZoom() does for the small plots. Rescaling keeps each axis RANGE pinned to\n\t * the plot edges (only the visible data window is relabeled), so the two axes stay joined at the\n\t * corner and neither the ticks nor the spine spill past the canvas when zoomed in. Ticks that fall\n\t * outside the data range (e.g. when zoomed out past the data) are dropped.\n\t *\n\t * The zoom is tracked per chart (chart.currentAxisZoom), not on the view model, because a\n\t * categorical term0 renders multiple charts \u2014 each with its own canvas and animation loop \u2014 that\n\t * all share one zoom level; per-chart tracking keeps every chart's axes in sync, not just the last. */\n\trenderAxes(chart) {\n\t\tif (!chart?.axisBottom || !chart?.axisLeft || !chart.xAxis || !chart.yAxis) return\n\t\tconst s = this.scatter.settings\n\t\tconst k = this.scatter.vm.scatterZoom.zoom || 1\n\t\tconst offsetX = this.model.axisOffset.x\n\t\tconst offsetY = this.model.axisOffset.y\n\t\tconst cx = offsetX + s.svgw / 2\n\t\tconst cy = offsetY + s.svgh / 2\n\t\t// a scale by k about (cx, cy): applyX(p) = p*k + cx*(1-k), applyY(p) = p*k + cy*(1-k)\n\t\tconst transform = zoomIdentity.translate(cx * (1 - k), cy * (1 - k)).scale(k)\n\t\t// initAxes() binds the axis generators to time scales for date terms (xAxisScaleTime/\n\t\t// yAxisScaleTime); rescale those when present so date ticks and formatting survive the zoom,\n\t\t// and fall back to the numeric coordinate scale otherwise. Both share the same pixel range, so\n\t\t// the same transform applies. The WebGL points always use the numeric chart.xAxisScale/\n\t\t// yAxisScale (see getVertices), which is left untouched.\n\t\tconst xBase = chart.xAxisScaleTime || chart.xAxisScale\n\t\tconst yBase = chart.yAxisScaleTime || chart.yAxisScale\n\t\tconst xScale = transform.rescaleX(xBase)\n\t\tconst yScale = transform.rescaleY(yBase)\n\t\tchart.xAxis.call(chart.axisBottom.scale(xScale).tickValues(this.ticksWithinData(xScale, xBase)))\n\t\tchart.yAxis.call(chart.axisLeft.scale(yScale).tickValues(this.ticksWithinData(yScale, yBase)))\n\t\tchart.currentAxisZoom = k\n\t}\n\n\t/** Ticks of the zoomed scale that still fall within the base (data) domain, so zooming out past\n\t * the data does not render tick marks for values below the minimum or above the maximum. */\n\tticksWithinData(zoomedScale: any, baseScale: any) {\n\t\tconst [d0, d1] = baseScale.domain()\n\t\tconst lo = Math.min(d0, d1)\n\t\tconst hi = Math.max(d0, d1)\n\t\treturn zoomedScale.ticks().filter((t: number) => t >= lo && t <= hi)\n\t}\n\n\tanimate(chart, camera, scene, renderer) {\n\t\t// a re-render replaces scatter.vm with a fresh view model; stop this now-stale loop and release\n\t\t// its canvas + WebGL context. Otherwise, if the plot switched back to the SVG path (which does\n\t\t// not remove this absolute canvas), the stale overlay would cover the new SVG plot, and the\n\t\t// renderer's GPU resources would be retained until garbage collection.\n\t\tif (this.scatter.vm !== this) {\n\t\t\trenderer.domElement.remove()\n\t\t\trenderer.dispose()\n\t\t\treturn\n\t\t}\n\t\trequestAnimationFrame(() => this.animate(chart, camera, scene, renderer))\n\t\tconst k = this.scatter.vm.scatterZoom.zoom\n\t\tcamera.zoom = k\n\t\tcamera.updateProjectionMatrix()\n\t\tif (k !== chart.currentAxisZoom) this.renderAxes(chart)\n\t\trenderer.render(scene, camera)\n\t}\n\n\tgetVertices(chart) {\n\t\t// Map data coordinates into WebGL clip space [-1, 1]. Copy the shared axis scales instead of\n\t\t// mutating their range in place, since fillSvgSubElems (axis), scatterZoom and the hover\n\t\t// quadtree all read chart.xAxisScale/yAxisScale expecting their SVG pixel ranges.\n\t\t// WebGL's y points up while the SVG-oriented chart.yAxisScale uses a flipped domain\n\t\t// ([yMax, yMin]) for SVG's downward y; map y to [1, -1] so larger values render at the top,\n\t\t// matching the SVG y-axis. x needs no flip ([-1, 1]) since both spaces grow left-to-right.\n\t\tconst xAxisScale = chart.xAxisScale.copy().range([-1, 1])\n\t\tconst yAxisScale = chart.yAxisScale.copy().range([1, -1])\n\t\tconst vertices: any = []\n\t\tconst colors: any = []\n\t\tfor (const sample of chart.data.samples) {\n\t\t\tconst opacity = this.model.getOpacity(sample)\n\t\t\tif (opacity == 0) continue\n\t\t\tconst x = xAxisScale(sample.x)\n\t\t\tconst y = yAxisScale(sample.y)\n\t\t\tconst z = 0\n\t\t\tvertices.push(x, y, z)\n\t\t\tconst color = new THREE.Color(rgb(this.model.getColor(sample, chart)).toString())\n\t\t\tcolors.push(color.r, color.g, color.b)\n\t\t}\n\t\treturn { vertices, colors }\n\t}\n\n\t/** Renders the server generated image for a single cell */\n\trenderLargeSingleCell(chart) {\n\t\t/** No need to remove elements or call the legend in this fn.\n\t\t * Unlike the renderSerie above, this fn finishes in renderChart -> renderSVG\n\t\t * before legendvm.renderLegend is called. renderChart handles dom additions\n\t\t * and removal. A new legend is rendered each time. Simply add the image. */\n\t\tchart.svg.selectAll('.sjpp-scatter-img-g').remove()\n\t\tconst imgG = chart.svg.append('g').attr('class', 'sjpp-scatter-img-g')\n\t\tconst img = imgG.append('image').attr('xlink:href', chart.src)\n\t\tif (chart.canvasWidth) img.attr('width', chart.canvasWidth)\n\t\tif (chart.canvasHeight) img.attr('height', chart.canvasHeight)\n\t\tthis.canvas = img\n\t}\n}\n\nexport function getThreeCircle(size) {\n\tconst c = document.createElement('canvas')\n\tc.width = size\n\tc.height = size\n\tconst ctx: any = c.getContext('2d')\n\tctx.clearRect(0, 0, size, size)\n\tctx.fillStyle = 'white'\n\tctx.beginPath()\n\tctx.arc(size / 2, size / 2, size / 2, 0, 2 * Math.PI)\n\tctx.fill()\n\tconst tex = new THREE.CanvasTexture(c)\n\treturn tex\n}\n", "import { getCompInit, copyMerge } from '../rx/index.js'\nimport { scaleLinear as d3Linear } from 'd3-scale'\nimport { dofetch3 } from '#common/dofetch'\nimport { getColors } from '#shared/common.js'\nimport { controlsInit } from './controls'\nimport { downloadSingleSVG } from '#common/svg.download'\nimport { select } from 'd3-selection'\nimport { rgb, create, extent } from 'd3'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { SINGLECELL_CELLTYPE, SINGLECELL_GENE_EXPRESSION } from '#types'\nimport {\n\tColorScale,\n\ticons as icon_functions,\n\taddGeneSearchbox,\n\trenderTable,\n\tsayerror,\n\tMenu,\n\tTabs,\n\tdownloadTable\n} from '#dom'\nimport * as THREE from 'three'\nimport { getThreeCircle } from './scatter/viewmodel/scatterViewModel2DLarge.js'\nimport { renderContours } from './scatter/viewmodel/scatterViewModel.js'\nimport { digestMessage } from '#termsetting'\n\n/*\n\n!!!! NO LONGER MAINTAINED !!!!\n\nhardcoded behaviors when this.samples[].experiments[] is present:\n\n- all samples must either have or not have .experiments[]\n- experiments[] supports tracking multiple experiments done on same sample\n- an experiment must be {experimentID,sampleName} along with optional prop\n- state tracks experimentID as well as this.samples[].sample\n- in sample table, both experimentID and sampleName are shown\n\nthis\n\tsamples[]\n\t\tdatastructure returned by /termdb/singlecellSamples\n\t\t\n\t\telement structure:\n\n\t\t{\n\t\t\tsample: str\n\t\t\t<termid>: <term value>\n\t\t\texperiments?: []\n\t\t\t\texperimentID: str // required to track which table row is selected and for backend to retrieve data for\n\t\t\t\tsampleName: str // for display\n\t\t}\n\n\n\tlegendRendered=bool\n\n\tstate{}\n\t\tconfig{}\n\t\t\tsample // name of selected sample. matches to this.samples[].sample\n\t\t\texperimentID // optional. set when this.samples[].experiments[] is present. allow to match to a specific experiment of a sample that has multiples\n\n*/\n\nconst SAMPLES_TAB = 1\nconst PLOTS_TAB = 2\nconst DIFFERENTIAL_EXPRESSION_TAB = 3\nconst GENE_EXPRESSION_TAB = 4\nconst IMAGES_TAB = 5\nconst VIOLIN_TAB = 6\nconst noExpColor = '#F5F5F5' //lightGray\nconst DE_GENES_TAB = 8\nconst DE_GSEA_TAB = 7\n\nclass singleCellPlot {\n\tstatic type = 'singleCellPlot'\n\n\tconstructor() {\n\t\tthis.type = singleCellPlot.type\n\n\t\tthis.tip = new Menu({ padding: '4px', offsetX: 10, offsetY: 0 })\n\t\tthis.tip.d.style('max-height', '300px').style('overflow', 'scroll').style('font-size', '0.9em')\n\t\tthis.startGradient = {}\n\t\tthis.stopGradient = {}\n\t}\n\n\tasync init(appState) {\n\t\t// generate sample table in init() but not main() is because sample table is constant and no need to update it on dispatch\n\t\t// TODO sample table still needs to be changed when gdc (external portal) cohort changes\n\n\t\tconst state = this.getState(appState)\n\t\tif (this.opts.header) this.opts.header.html(`SINGLE CELL PLOT`).style('font-size', '0.9em')\n\n\t\t// need to set the this.samples based on the current filter0\n\n\t\tthis.tabs = []\n\t\tconst activeTab = state.config.activeTab\n\t\t// shared isVisible function for tabs that require config.sample;\n\t\t// note that tab.isVisible() will be called on tab.update(), which\n\t\t// is called in main() -> showActiveTab() below\n\t\tconst isVisible = () => this.isValidSample\n\n\t\tthis.tabs.push({\n\t\t\tlabel: 'Samples',\n\t\t\tid: SAMPLES_TAB,\n\t\t\tisVisible,\n\t\t\tactive: activeTab == SAMPLES_TAB,\n\t\t\tcallback: () => this.setActiveTab(SAMPLES_TAB)\n\t\t})\n\t\tthis.tabs.push({\n\t\t\tlabel: 'Plots',\n\t\t\tid: PLOTS_TAB,\n\t\t\tactive: activeTab == PLOTS_TAB,\n\t\t\tisVisible,\n\t\t\tcallback: () => this.setActiveTab(PLOTS_TAB)\n\t\t})\n\t\tif (state.termdbConfig.queries.singleCell.DEgenes) {\n\t\t\tthis.tabs.push({\n\t\t\t\tlabel: 'Differential Expression',\n\t\t\t\tid: DIFFERENTIAL_EXPRESSION_TAB,\n\t\t\t\tactive: activeTab == DIFFERENTIAL_EXPRESSION_TAB,\n\t\t\t\tisVisible,\n\t\t\t\ttestid: 'sjppoldscTabDE',\n\t\t\t\tcallback: () => this.setActiveTab(DIFFERENTIAL_EXPRESSION_TAB)\n\t\t\t})\n\t\t}\n\t\tif (state.termdbConfig.queries.singleCell.geneExpression)\n\t\t\tthis.tabs.push({\n\t\t\t\tlabel: 'Gene Expression',\n\t\t\t\tid: GENE_EXPRESSION_TAB,\n\t\t\t\tactive: activeTab == GENE_EXPRESSION_TAB,\n\t\t\t\tisVisible,\n\t\t\t\ttestid: 'sjppoldscTabGE',\n\t\t\t\tcallback: () => this.setActiveTab(GENE_EXPRESSION_TAB)\n\t\t\t})\n\n\t\t// summary tab is not limited to geneExp, as later it can be applied to cell category terms too (if there are multiple)\n\t\tthis.tabs.push({\n\t\t\tlabel: 'Summary',\n\t\t\tid: VIOLIN_TAB,\n\t\t\tactive: activeTab == VIOLIN_TAB,\n\t\t\tisVisible,\n\t\t\ttestid: 'sjppoldscTabSummary',\n\t\t\tcallback: () => this.setActiveTab(VIOLIN_TAB)\n\t\t})\n\n\t\tif (state.termdbConfig.queries.singleCell.images)\n\t\t\tthis.tabs.push({\n\t\t\t\tlabel: state.termdbConfig.queries.singleCell.images.label,\n\t\t\t\tid: IMAGES_TAB,\n\t\t\t\tactive: activeTab == IMAGES_TAB,\n\t\t\t\tisVisible,\n\t\t\t\tcallback: () => this.setActiveTab(IMAGES_TAB)\n\t\t\t})\n\t\tconst q = state.termdbConfig.queries\n\t\tthis.opts.holder.style('position', 'relative').style('min-height', '200px')\n\t\tthis.mainDivId = `${this.id}-sandbox`\n\t\tconst errorDiv = this.opts.holder.append('div')\n\t\tconst mainDiv = this.opts.holder\n\t\t\t.insert('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.style('white-space', 'nowrap')\n\t\t\t.attr('id', this.mainDivId)\n\n\t\tconst leftDiv = mainDiv.append('div').style('display', 'inline-block').style('vertical-align', 'top')\n\t\tconst controlsDiv = leftDiv.append('div').attr('class', 'pp-termdb-plot-controls')\n\n\t\tconst contentDiv = mainDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.style('padding-left', '10px')\n\t\t\t.style('min-height', '300px')\n\t\tthis.tabsComp = await new Tabs({\n\t\t\tholder: contentDiv,\n\t\t\ttabsPosition: 'horizontal',\n\t\t\ttabs: this.tabs\n\t\t})\n\t\tthis.tabsComp.main()\n\t\tconst headerDiv = contentDiv.append('div').style('display', 'inline-block').style('padding-bottom', '10px')\n\n\t\tconst samplesPromptDiv = headerDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'none')\n\t\t\t.text('Select a sample below to see its data:')\n\t\t\t.style('padding', '0px 40px 10px 10px')\n\t\tconst showDiv = headerDiv.append('div').style('padding-bottom', '10px').style('display', 'none')\n\n\t\tif (state.config.plots.length > 1) this.renderShowPlots(showDiv, state)\n\t\t// div to show optional DE genes (precomputed by seurat for each cluster, e.g. via gdc)\n\t\tconst geDiv = headerDiv.append('div').style('display', 'none')\n\t\tconst violinSelectDiv = headerDiv.append('div').style('padding-left', '30px').style('display', 'none')\n\t\tconst deDiv = headerDiv.append('div').style('display', 'none')\n\t\tconst sampleDiv = headerDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.html(await this.getSampleDetails(state))\n\t\t\t.style('padding', '10px 20px')\n\t\tconst plotsDivParent = contentDiv.append('div')\n\t\tconst samplesTableDiv = plotsDivParent.append('div').style('padding-bottom', '10px')\n\n\t\tconst plotsDiv = plotsDivParent\n\t\t\t.append('div')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('flex-wrap', 'wrap')\n\t\t\t.style('justify-content', 'flex-start')\n\n\t\tconst loadingDiv = this.opts.holder\n\t\t\t.append('div')\n\t\t\t.style('position', 'absolute')\n\t\t\t.style('top', '0')\n\t\t\t.style('left', '0')\n\t\t\t.style('width', '100%')\n\t\t\t.style('height', '100%')\n\t\t\t.style('background-color', 'rgba(255, 255, 255, 0.95)')\n\t\t\t.style('text-align', 'center')\n\n\t\tthis.dom = {\n\t\t\tsampleDiv,\n\t\t\tsamplesPromptDiv,\n\t\t\tsamplesTableDiv,\n\t\t\tshowDiv,\n\t\t\tmainDiv,\n\t\t\tloadingDiv,\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\ttooltip: new Menu({ padding: '2px', offsetX: 10, offsetY: 0 }),\n\t\t\tcontrolsHolder: controlsDiv,\n\t\t\tgeDiv,\n\t\t\tviolinSelectDiv,\n\t\t\tdeDiv,\n\t\t\tplotsDiv,\n\t\t\tplotsDivParent,\n\t\t\terrorDiv\n\t\t}\n\n\t\tif (q.singleCell?.geneExpression) this.renderGeneExpressionControls(geDiv, state)\n\n\t\tconst offsetX = 80\n\t\tthis.axisOffset = { x: offsetX, y: 30 }\n\n\t\tif (q.singleCell?.DEgenes) {\n\t\t\tconst label = this.dom.deDiv\n\t\t\t\t.append('label')\n\t\t\t\t.html('View differentially expressed genes for cells of a cluster versus rest of the cells:&nbsp;')\n\t\t\tthis.dom.deselect = label\n\t\t\t\t.append('select')\n\t\t\t\t.attr('data-testid', 'sjppoldscDEselect')\n\t\t\t\t.on('change', e => {\n\t\t\t\t\tconst display = this.dom.deselect.node().value ? 'inline-block' : 'none'\n\t\t\t\t\tconst cluster = this.dom.deselect.node().value.split(' ')[1]\n\t\t\t\t\tthis.genes = null\n\t\t\t\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config: { cluster, gene: null } })\n\t\t\t\t})\n\t\t\tthis.dom.deselect.append('option').text('')\n\t\t}\n\n\t\tthis.settings = {}\n\n\t\tdocument.addEventListener('scroll', event => this?.tip?.hide())\n\t\tselect('.sjpp-output-sandbox-content').on('scroll', event => this.tip.hide())\n\t}\n\n\tgetState(appState) {\n\t\tconst config = appState.plots.find(p => p.id === this.id)\n\t\tif (!config) {\n\t\t\tthrow `No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`\n\t\t}\n\t\treturn {\n\t\t\tconfig,\n\t\t\tdslabel: appState.vocab.dslabel,\n\t\t\tgenome: appState.vocab.genome,\n\t\t\ttermdbConfig: appState.termdbConfig,\n\t\t\ttermfilter: appState.termfilter,\n\t\t\tvocab: appState.vocab\n\t\t}\n\t}\n\n\t// called in relevant dispatch when reactsTo==true\n\t// or current.state != replcament.state\n\tasync main() {\n\t\tthis.dom.mainDiv.style('display', 'block') // show the main div in case it was hidden because no data was found\n\t\tthis.dom.loadingDiv.selectAll('*').remove()\n\t\tthis.dom.loadingDiv\n\t\t\t.style('display', '')\n\t\t\t.append('div')\n\t\t\t.style('position', 'relative')\n\t\t\t.style('top', '50%')\n\t\t\t.text('Loading...')\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\tgenome: this.state.genome,\n\t\t\t\tdslabel: this.state.dslabel,\n\t\t\t\tfilter0: this.state.termfilter.filter0 || null\n\t\t\t}\n\t\t\tconst result = await dofetch3('termdb/singlecellSamples', { body })\n\t\t\tif (result.error) throw result.error\n\t\t\tthis.samples = result.samples\n\t\t\tif (this.samples.length == 0) {\n\t\t\t\tthis.showNoMatchingDataMessage()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.isValidSample = this.state.config.sample && this.samples.find(i => i.sample == this.state.config.sample)\n\t\t\tthis.colorByGene =\n\t\t\t\tthis.state.config.activeTab == GENE_EXPRESSION_TAB || this.state.config.activeTab == DIFFERENTIAL_EXPRESSION_TAB\n\t\t\tthis.config = structuredClone(this.state.config) // this config can be edited to dispatch changes\n\t\t\tcopyMerge(this.settings, this.config.settings.singleCellPlot)\n\t\t\tthis.plotColorByDivs = []\n\t\t\tthis.plots = []\n\n\t\t\tthis.legendRendered = false\n\t\t\tthis.dom.plotsDiv.selectAll('*').remove()\n\t\t\tawait this.getData()\n\t\t\tawait this.setControls()\n\t\t\tthis.dom.sampleDiv.html(await this.getSampleDetails(this.state))\n\t\t\tthis.showActiveTab()\n\t\t\tthis.dom.loadingDiv.style('display', 'none')\n\t\t} catch (e) {\n\t\t\tthis.app.tip.hide()\n\t\t\tthis.dom.loadingDiv.style('display', 'none')\n\t\t\tif (e.stack) console.log(e.stack)\n\t\t\tsayerror(this.dom.errorDiv, e)\n\t\t}\n\t}\n\n\tasync getData() {\n\t\tif (!this.state.config.sample) return\n\t\tconst plots = []\n\t\tfor (const plot of this.config.plots) {\n\t\t\tif (plot.selected) plots.push(plot.name)\n\t\t}\n\n\t\tconst body = {\n\t\t\tgenome: this.state.genome,\n\t\t\tdslabel: this.state.dslabel,\n\t\t\tplots,\n\t\t\tfilter0: this.state.termfilter.filter0\n\t\t}\n\t\t// change the sample to contains both sampleID and experimentID, so that they could\n\t\t// both be used to query data. (GDC sc gene expression only support sample uuid now)\n\t\t// a sample has already been selected\n\t\tbody.sample = {\n\t\t\teID: this.state.config.experimentID,\n\t\t\tsID: this.state.config.sample\n\t\t}\n\t\tif (\n\t\t\tthis.state.config.gene &&\n\t\t\t(this.state.config.activeTab == GENE_EXPRESSION_TAB || this.state.config.activeTab == DIFFERENTIAL_EXPRESSION_TAB)\n\t\t)\n\t\t\tbody.gene = this.state.config.gene\n\t\telse body.colorBy = this.state.config.colorBy\n\t\t//if error it will be catched on main\n\t\tconst result = await dofetch3('termdb/singlecellData', { body })\n\t\tif (result.error) throw result.error\n\t\tthis.refName = result.refName\n\t\tthis.data = result\n\t}\n\n\tasync getSampleDetails(state) {\n\t\tif (!this.samples) return ''\n\t\tconst sampleIdx = this.samples.findIndex(i => i.sample == state.config.sample)\n\t\tif (sampleIdx == -1) return ''\n\n\t\tconst extraText = [] // extra text to show alongside sample name\n\n\t\tif (state.config.experimentID) {\n\t\t\t// experimentID is tracked in state, meaning this.samples[].experiments[] is present. and the id specifies which experiment, out of potential multiple of one sample, is currently selected.\n\t\t\t// in such case, experiments[].sampleName should also be present, and display the sampleName next to config.sample which is actually person id\n\t\t\textraText.push(\n\t\t\t\t'<span style=\"margin-left:15px;font-size:.7em\">SAMPLE</span> ' +\n\t\t\t\t\tthis.samples[sampleIdx].experiments?.find(i => i.experimentID == state.config.experimentID)?.sampleName\n\t\t\t)\n\t\t} else if (this.samples[sampleIdx].experiments) {\n\t\t\t// experimentID not in state, but sample carries exp array; this is possible when app launches. simply show first experiment of this sample\n\t\t\textraText.push(\n\t\t\t\t'<span style=\"margin-left:15px;font-size:.7em\">SAMPLE</span> ' +\n\t\t\t\t\tthis.samples[sampleIdx].experiments[0].sampleName\n\t\t\t)\n\t\t}\n\n\t\tif (state.termdbConfig.queries.singleCell.samples.extraSampleTabLabel) {\n\t\t\t// value is a term id. get the term name\n\t\t\tconst termname = (\n\t\t\t\tawait this.app.vocabApi.getterm(state.termdbConfig.queries.singleCell.samples.extraSampleTabLabel)\n\t\t\t).name\n\t\t\t// get the term value from current sample\n\t\t\tconst sampleValue = this.samples[sampleIdx][state.termdbConfig.queries.singleCell.samples.extraSampleTabLabel]\n\t\t\textraText.push(`<span style=\"margin-left:15px;font-size:.7em\">${termname.toUpperCase()}</span> ${sampleValue}`)\n\t\t}\n\n\t\treturn `<span style=\"font-size:.7em\">${state.config.settings.singleCellPlot.uiLabels.sample.toUpperCase()}</span>\n\t\t\t${this.samples[sampleIdx].sample}\n\t\t\t${extraText.join('')}`\n\t}\n\n\tasync getSampleFilename(state) {\n\t\tconst sampleIdx = this.samples.findIndex(i => i.sample == state.config.sample)\n\t\tif (sampleIdx == -1) return ''\n\n\t\tconst extraText = [] // extra text to show alongside sample name\n\n\t\tif (state.config.experimentID) {\n\t\t\t// experimentID is tracked in state, meaning this.samples[].experiments[] is present. and the id specifies which experiment, out of potential multiple of one sample, is currently selected.\n\t\t\t// in such case, experiments[].sampleName should also be present, and display the sampleName next to config.sample which is actually person id\n\t\t\textraText.push(\n\t\t\t\t'SAMPLE_' +\n\t\t\t\t\tthis.samples[sampleIdx].experiments?.find(i => i.experimentID == state.config.experimentID)?.sampleName\n\t\t\t)\n\t\t} else if (this.samples[sampleIdx].experiments) {\n\t\t\t// experimentID not in state, but sample carries exp array; this is possible when app launches. simply show first experiment of this sample\n\t\t\textraText.push('SAMPLE_' + this.samples[sampleIdx].experiments[0].sampleName)\n\t\t}\n\n\t\tif (state.termdbConfig.queries.singleCell.samples.extraSampleTabLabel) {\n\t\t\t// value is a term id. get the term name\n\t\t\tconst termname = (\n\t\t\t\tawait this.app.vocabApi.getterm(state.termdbConfig.queries.singleCell.samples.extraSampleTabLabel)\n\t\t\t).name\n\t\t\t// get the term value from current sample\n\t\t\tconst sampleValue = this.samples[sampleIdx][state.termdbConfig.queries.singleCell.samples.extraSampleTabLabel]\n\t\t\textraText.push(`${termname.toUpperCase()}_${sampleValue}`)\n\t\t}\n\t\tif (this.state.config.activeTab == GENE_EXPRESSION_TAB) extraText.push(this.state.config.gene)\n\t\tif (this.state.config.activeTab == DIFFERENTIAL_EXPRESSION_TAB) extraText.push(this.state.config.cluster)\n\t\tif (this.state.config.activeTab == VIOLIN_TAB && this.dom.expressionBySelect)\n\t\t\textraText.push(this.dom.expressionBySelect.node().value)\n\n\t\tconst filename = `${state.config.settings.singleCellPlot.uiLabels.sample.toUpperCase()}_\n\t\t\t${this.samples[sampleIdx].sample}_\n\t\t\t${extraText.join('_')}`\n\n\t\treturn filename.replace(/[^0-9a-z_]/gi, '')\n\t}\n\n\trenderShowPlots(showDiv, state) {\n\t\tshowDiv.append('label').text('Plots:').style('font-size', '1.1em')\n\n\t\tfor (const plot of state.config.plots) {\n\t\t\tconst id = plot.name.replace(/\\s+/g, '')\n\t\t\tconst key = `show${id}`\n\t\t\tshowDiv\n\t\t\t\t.append('input')\n\t\t\t\t.attr('type', 'checkbox')\n\t\t\t\t.attr('id', key)\n\t\t\t\t.property('checked', plot.selected)\n\t\t\t\t.on('change', e => {\n\t\t\t\t\tlet plots = structuredClone(this.state.config.plots)\n\t\t\t\t\tplots.find(p => p.name == plot.name).selected = e.target.checked\n\t\t\t\t\tconst selectedCount = plots.filter(p => p.selected).length\n\t\t\t\t\tconst defaultSettings = getDefaultSingleCellSettings()\n\t\t\t\t\tlet settings = { svgw: defaultSettings.svgw, svgh: defaultSettings.svgh }\n\n\t\t\t\t\tif (selectedCount > 1) {\n\t\t\t\t\t\tconst width = 800\n\t\t\t\t\t\tconst height = 800\n\t\t\t\t\t\tsettings.svgh = width / selectedCount\n\t\t\t\t\t\tsettings.svgw = height / selectedCount\n\t\t\t\t\t\tsettings.contourBandwidth = 10\n\t\t\t\t\t}\n\t\t\t\t\tthis.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\t\tid: this.id,\n\t\t\t\t\t\tconfig: { plots, settings: { singleCellPlot: settings } }\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\tshowDiv.append('label').attr('for', key).text(plot.name)\n\t\t}\n\t}\n\n\trenderGeneExpressionControls(geDiv, state) {\n\t\tthis.dom.searchboxDiv = geDiv.append('div').style('display', 'inline-block')\n\t\tthis.dom.geneSearch = addGeneSearchbox({\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\tgenome: this.app.opts.genome,\n\t\t\trow: this.dom.searchboxDiv,\n\t\t\tsearchOnly: 'gene',\n\t\t\tplaceholder: state.config.gene || 'Gene',\n\t\t\tcallback: () => this.colorByGeneExp(),\n\t\t\temptyInputCallback: () => this.colorByGeneExp(),\n\t\t\thideHelp: true,\n\t\t\tfocusOff: true\n\t\t})\n\t\tthis.dom.searchbox = this.dom.geneSearch?.searchbox\n\t}\n\n\tasync setActiveTab(tab) {\n\t\tif (!this.state) return\n\t\tawait this.app.dispatch({ type: 'plot_edit', id: this.id, config: { activeTab: tab } })\n\t}\n\n\tasync showActiveTab() {\n\t\tlet id = this.state.config.activeTab || this.tabs[0].id\n\t\tif (!this.isValidSample && id != SAMPLES_TAB) {\n\t\t\tid = SAMPLES_TAB\n\t\t\tthis.config.activeTab = SAMPLES_TAB\n\t\t}\n\t\tconst index = this.tabs.findIndex(t => t.id == id)\n\t\tconst tab = this.tabs[index]\n\t\ttab.active = true\n\t\tthis.tabsComp.update(index)\n\n\t\tthis.dom.deDiv.style('display', 'none')\n\t\tthis.dom.geDiv.style('display', 'none')\n\t\tthis.dom.showDiv.style('display', 'none')\n\t\tthis.dom.violinSelectDiv.style('display', 'none')\n\t\tthis.dom.samplesTableDiv.style('display', 'none')\n\t\tthis.dom.samplesPromptDiv.style('display', 'none')\n\t\tthis.dom.controlsHolder.style('display', 'none')\n\t\tswitch (id) {\n\t\t\tcase SAMPLES_TAB:\n\t\t\t\tthis.dom.samplesTableDiv.style('display', 'block')\n\t\t\t\tthis.dom.samplesPromptDiv.style('display', 'inline-block')\n\t\t\t\tthis.renderSamplesTable()\n\t\t\t\tbreak\n\t\t\tcase PLOTS_TAB:\n\t\t\t\tawait this.renderPlots()\n\t\t\t\tthis.dom.showDiv.style('display', 'inline-block')\n\t\t\t\tthis.dom.controlsHolder.style('display', 'block')\n\t\t\t\tbreak\n\n\t\t\tcase GENE_EXPRESSION_TAB:\n\t\t\t\tthis.dom.controlsHolder.style('display', 'block')\n\t\t\t\tawait this.renderPlots()\n\t\t\t\tthis.dom.geDiv.style('display', 'inline-block')\n\t\t\t\tthis.dom.searchbox.node().focus()\n\t\t\t\tif (this.state.config.gene) this.dom.searchbox.node().value = this.state.config.gene\n\t\t\t\tbreak\n\t\t\tcase DIFFERENTIAL_EXPRESSION_TAB:\n\t\t\t\tthis.dom.deDiv.style('display', 'inline-block')\n\t\t\t\tthis.renderDETable()\n\t\t\t\tbreak\n\n\t\t\tcase IMAGES_TAB:\n\t\t\t\tthis.renderImage()\n\t\t\t\tbreak\n\t\t\tcase VIOLIN_TAB:\n\t\t\t\tthis.dom.geDiv.style('display', 'inline-block')\n\t\t\t\tthis.renderViolinTab()\n\t\t\t\tthis.dom.searchbox.node().focus()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\taddZoomIcons(iconsDiv, plot) {\n\t\tconst zoomInDiv = iconsDiv.append('div').style('margin', '20px 0px')\n\t\ticon_functions['zoomIn'](zoomInDiv, {\n\t\t\thandler: () => {\n\t\t\t\tplot.particles.position.z += 0.1\n\t\t\t},\n\t\t\ttitle: 'Zoom in. You can also zoom in moving the mouse wheel with the Ctrl key pressed.'\n\t\t})\n\t\tconst zoomOutDiv = iconsDiv.append('div').style('margin', '20px 0px')\n\t\ticon_functions['zoomOut'](zoomOutDiv, {\n\t\t\thandler: () => {\n\t\t\t\tplot.particles.position.z -= 0.1\n\t\t\t},\n\t\t\ttitle: 'Zoom out. You can also zoom out moving the mouse wheel with the Ctrl key pressed.'\n\t\t})\n\t\tconst identityDiv = iconsDiv.append('div').style('margin', '20px 0px')\n\t\ticon_functions['restart'](identityDiv, {\n\t\t\thandler: () => {\n\t\t\t\tplot.particles.position.z = 0\n\t\t\t\tplot.particles.position.x = 0\n\t\t\t\tplot.particles.position.y = 0\n\t\t\t},\n\t\t\ttitle: 'Reset plot to defaults'\n\t\t})\n\t}\n\n\tasync renderImage() {\n\t\tconst sample = this.state.config.sample || this.samples[0].sample\n\t\tconst i = this.state.termdbConfig.queries.singleCell.images\n\t\tconst result = await dofetch3(`img?file=${i.folder}${i.folder.endsWith('/') ? '' : '/'}${sample}/${i.fileName}`)\n\t\tif (!result.src || result.error) {\n\t\t\tsayerror(this.dom.plotsDiv, 'Cannot load image: ' + (result.error || ''))\n\t\t\treturn\n\t\t}\n\t\tthis.dom.plotsDiv.append('img').attr('src', result.src).attr('height', 400)\n\t}\n\n\tasync renderViolinTab() {\n\t\tif (!this.state.config.gene) return\n\t\tconst selectDiv = this.dom.violinSelectDiv.style('display', 'inline-block')\n\t\tselectDiv.selectAll('*').remove()\n\t\tconst plotDiv = this.dom.plotsDiv.append('div').style('width', '100%')\n\n\t\tconst options = new Set()\n\t\tlet selectedOption = ''\n\t\tfor (const plot of this.data.plots) {\n\t\t\tconst colorBy = this.state.config.colorBy?.[plot.name] || plot.colorColumns[0]\n\t\t\tif (!selectedOption) selectedOption = colorBy\n\t\t\tfor (const c of plot.colorColumns) options.add(c)\n\t\t}\n\n\t\tif (options.size > 1) {\n\t\t\tselectDiv.append('label').text('Show expression by: ')\n\t\t\tconst expressionBySelect = selectDiv.append('select').on('change', async e => {\n\t\t\t\tconst expressionBy = e.target.value\n\t\t\t\tviolinDiv.selectAll('*').remove()\n\t\t\t\tthis.renderViolin(expressionBy, violinDiv)\n\t\t\t})\n\t\t\tthis.dom.expressionBySelect = expressionBySelect\n\t\t\texpressionBySelect\n\t\t\t\t.selectAll('option')\n\t\t\t\t.data(Array.from(options))\n\t\t\t\t.enter()\n\t\t\t\t.append('option')\n\t\t\t\t.attr('value', d => d)\n\t\t\t\t.attr('selected', d => (d == selectedOption ? d : null))\n\t\t\t\t.html(d => d)\n\t\t} else selectDiv.append('label').text(`Expression by ${selectedOption}:`)\n\t\tconst violinDiv = this.dom.plotsDiv.append('div')\n\t\tthis.renderViolin(selectedOption, violinDiv)\n\t}\n\n\tasync renderViolin(colorBy, violinDiv) {\n\t\tconst gene = this.state.config.gene\n\t\tconst plot = this.data.plots.find(p => p.colorColumns.find(c => c == colorBy))\n\t\tthis.initPlot(plot)\n\t\tconst values = {}\n\t\tfor (const cluster of plot.clusters) {\n\t\t\tvalues[cluster] = { key: cluster, value: cluster }\n\t\t}\n\t\tconst downloadFilename = (await this.getSampleFilename(this.state)) + '_VIOLIN'\n\t\tconst opts = {\n\t\t\tholder: violinDiv,\n\t\t\tstate: {\n\t\t\t\tvocab: this.state.vocab,\n\t\t\t\tplots: [\n\t\t\t\t\t{\n\t\t\t\t\t\tchartType: 'violin',\n\t\t\t\t\t\tterm: {\n\t\t\t\t\t\t\t$id: await digestMessage(`${gene}-${this.state.config.sample}-${this.state.config.experimentID}`),\n\t\t\t\t\t\t\tterm: {\n\t\t\t\t\t\t\t\ttype: SINGLECELL_GENE_EXPRESSION,\n\t\t\t\t\t\t\t\tid: gene,\n\t\t\t\t\t\t\t\tgene,\n\t\t\t\t\t\t\t\tname: gene,\n\t\t\t\t\t\t\t\tsample: {\n\t\t\t\t\t\t\t\t\tsID: this.state.config.sample,\n\t\t\t\t\t\t\t\t\teID: this.state.config.experimentID\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tq: { mode: 'continuous' }\n\t\t\t\t\t\t},\n\t\t\t\t\t\tterm2: {\n\t\t\t\t\t\t\t$id: await digestMessage(`${colorBy}-${this.state.config.sample}-${this.state.config.experimentID}`),\n\n\t\t\t\t\t\t\tterm: {\n\t\t\t\t\t\t\t\ttype: SINGLECELL_CELLTYPE,\n\t\t\t\t\t\t\t\tid: colorBy,\n\t\t\t\t\t\t\t\tname: colorBy,\n\t\t\t\t\t\t\t\tsample: {\n\t\t\t\t\t\t\t\t\tsID: this.state.config.sample,\n\t\t\t\t\t\t\t\t\teID: this.state.config.experimentID\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t//plot and color by are used to read the sample categories from the plot\n\t\t\t\t\t\t\t\tplot: plot.name,\n\t\t\t\t\t\t\t\tcolorBy,\n\t\t\t\t\t\t\t\tvalues\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdownloadFilename\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t\tconst plotImport = await import('#plots/plot.app.js')\n\t\tconst plotAppApi = await plotImport.appInit(opts)\n\t}\n\n\tasync renderGSEA(holder) {\n\t\tconst gsea_params = {\n\t\t\tgenes: this.genes,\n\t\t\tfold_change: this.fold_changes,\n\t\t\tgenome: this.app.vocabApi.opts.state.vocab.genome\n\t\t}\n\t\tconst downloadFilename = (await this.getSampleFilename(this.state)) + '_GSEA'\n\t\tconst config = {\n\t\t\tchartType: 'gsea',\n\t\t\tgsea_params: gsea_params,\n\t\t\t// if getPlotHolder is defined, use this.mainDivId as insertBefore,\n\t\t\t// so that in GDC frontend framework, plots that are launched from scRNAseq\n\t\t\t// will be inserted before it. TODO: may insert after the scRNAseq plot instead???\n\t\t\tinsertBefore: this.app.opts?.app?.getPlotHolder ? this.mainDivId : this.id,\n\t\t\tdownloadFilename\n\t\t}\n\t\tconst opts = {\n\t\t\tgenome: this.app.opts.genome,\n\t\t\tholder,\n\t\t\tstate: {\n\t\t\t\tvocab: this.state.vocab,\n\t\t\t\tplots: [config]\n\t\t\t}\n\t\t}\n\t\tconst plotImport = await import('#plots/plot.app.js')\n\t\tconst plotAppApi = await plotImport.appInit(opts)\n\t}\n\n\tasync renderDETable() {\n\t\t//first plot\n\t\tthis.dom.deselect.selectAll('*').remove()\n\t\tthis.dom.deselect.append('option').text('')\n\t\tconst plot = this.data.plots[0]\n\t\tthis.initPlot(plot)\n\t\tfor (const cluster of plot.clusters) this.dom.deselect.append('option').text(cluster)\n\t\tconst categoryName = this.state.config.cluster\n\t\tthis.dom.deselect.node().value = categoryName != undefined ? `Cluster ${categoryName}` : ''\n\t\tif (!categoryName) return\n\t\tconst columnName = this.state.termdbConfig.queries.singleCell.DEgenes.termId\n\t\tconst sample =\n\t\t\tthis.state.config.experimentID || this.state.config.sample || this.samples?.[0]?.experiments[0]?.experimentID\n\n\t\tconst DEContentDiv = this.dom.plotsDiv.append('div').style('width', '100%')\n\n\t\tconst tabsDiv = DEContentDiv.append('div')\n\t\tconst tableDiv = DEContentDiv.append('div')\n\t\tconst GSEADiv = DEContentDiv.append('div').style('display', 'none')\n\n\t\tlet result\n\t\ttry {\n\t\t\tconst args = { genome: this.state.genome, dslabel: this.state.dslabel, categoryName, sample, columnName }\n\t\t\tresult = await dofetch3('termdb/singlecellDEgenes', { body: args })\n\t\t\tif (result.error) {\n\t\t\t\ttableDiv.text(result.error)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!result.data || !result?.data?.length) {\n\t\t\t\ttableDiv.text('No differentially expressed genes found.')\n\t\t\t\treturn\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (e.stack) console.error(e.stack)\n\t\t\telse throw `Error fetching DE genes: ${e.message || e} [singleCellPlot.renderDETable()]`\n\t\t\treturn\n\t\t}\n\n\t\tconst tabs = [\n\t\t\t{\n\t\t\t\tlabel: 'Differentially Expressed Genes',\n\t\t\t\tid: DE_GENES_TAB,\n\t\t\t\tactive: true,\n\t\t\t\tcallback: () => showActiveDETab(DE_GENES_TAB)\n\t\t\t}\n\t\t]\n\t\tif (this.app.opts.genome.termdbs) {\n\t\t\t// assumption is that can run gsea on the differential genes, when the genome-level termdb is available (which is right now geneset dbs)\n\t\t\ttabs.push({\n\t\t\t\tlabel: 'Gene Set Enrichment Analysis (GSEA)',\n\t\t\t\tid: DE_GSEA_TAB,\n\t\t\t\tactive: false,\n\t\t\t\tcallback: () => showActiveDETab(DE_GSEA_TAB)\n\t\t\t})\n\t\t}\n\n\t\tfunction showActiveDETab(id) {\n\t\t\ttableDiv.style('display', 'none')\n\t\t\tGSEADiv.style('display', 'none')\n\t\t\tif (id == DE_GENES_TAB) tableDiv.style('display', 'block')\n\t\t\tif (id == DE_GSEA_TAB) GSEADiv.style('display', 'block')\n\t\t}\n\t\tif (tabs.length > 1) {\n\t\t\tconst deTabs = await new Tabs({\n\t\t\t\tholder: tabsDiv,\n\t\t\t\ttabsPosition: 'horizontal',\n\t\t\t\ttabs\n\t\t\t})\n\t\t\tdeTabs.main()\n\t\t}\n\n\t\ttableDiv.append('div').style('padding-bottom', '10px').text('Select a gene to view its expression:')\n\n\t\tconst tableDivContent = tableDiv.append('div').style('padding-bottom', '10px')\n\t\tconst columns = [\n\t\t\t{ label: 'Gene', width: '15vw' },\n\t\t\t{ label: 'Log2FC', width: '12vw', barplot: {} },\n\t\t\t{ label: 'Adjusted P-value', width: '12vw' }\n\t\t]\n\t\tconst rows = []\n\t\tthis.genes = []\n\t\tthis.fold_changes = []\n\t\tresult.data.sort((a, b) => b.fold_change - a.fold_change)\n\t\tconst selectedRows = []\n\t\tlet i = 0\n\t\tfor (const gene of result.data) {\n\t\t\tconst row = [\n\t\t\t\t{ value: gene.gene_name },\n\t\t\t\t{ value: gene.fold_change },\n\t\t\t\t{ value: roundValueAuto(gene.adjusted_p_value) }\n\t\t\t]\n\t\t\trows.push(row)\n\t\t\tthis.genes.push(gene.gene_name)\n\t\t\tthis.fold_changes.push(gene.fold_change)\n\t\t\tif (gene.gene_name == this.state.config.gene) selectedRows.push(i)\n\t\t\ti++\n\t\t}\n\t\tthis.DETable = { rows, columns }\n\t\tconst downloadFilename = `${await this.getSampleFilename(this.state)}_DE_GENES.tsv`\n\t\trenderTable({\n\t\t\trows,\n\t\t\tcolumns,\n\t\t\tmaxHeight: '50vh',\n\t\t\tdiv: tableDivContent,\n\t\t\tsingleMode: true,\n\t\t\tnoButtonCallback: (i, node) => {\n\t\t\t\tconst gene = result.data[i].gene_name\n\t\t\t\tthis.app.dispatch({\n\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\tid: this.id,\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tgene,\n\t\t\t\t\t\tsample: this.state.config.sample || this.samples?.[0]?.sample,\n\t\t\t\t\t\texperimentID: this.state.config.experimentID || this.samples?.[0].experiments?.[0]?.experimentID,\n\t\t\t\t\t\tactiveTab: GENE_EXPRESSION_TAB\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\tselectedRows,\n\t\t\tresize: true,\n\t\t\tdataTestId: 'sjppoldscDEtable',\n\t\t\tdownload: { fileName: downloadFilename }\n\t\t})\n\t\tthis.renderGSEA(GSEADiv)\n\t}\n\n\tcolorByGeneExp() {\n\t\tconst gene = this.dom.searchbox.node().value\n\n\t\tfor (const div of this.plotColorByDivs) div.style('display', 'none')\n\n\t\tthis.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.id,\n\t\t\tconfig: {\n\t\t\t\tgene,\n\t\t\t\tsample: this.state.config.sample || this.samples?.[0]?.sample,\n\t\t\t\texperimentID: this.state.config.experimentID || this.samples?.[0].experiments?.[0]?.experimentID\n\t\t\t}\n\t\t})\n\t}\n\n\tasync setControls() {\n\t\tthis.dom.controlsHolder.selectAll('*').remove()\n\t\tconst inputs = [\n\t\t\t{\n\t\t\t\tlabel: 'Chart width',\n\t\t\t\ttitle: 'Chart width',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\tsettingsKey: 'svgw',\n\t\t\t\tmin: 300,\n\t\t\t\tmax: 1000\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Chart height',\n\t\t\t\ttitle: 'Chart height',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\tsettingsKey: 'svgh',\n\t\t\t\tmin: 300,\n\t\t\t\tmax: 1000\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Dot size',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\tsettingsKey: 'sampleSizeThree',\n\t\t\t\ttitle: 'Dot size',\n\t\t\t\tmin: 0.001,\n\t\t\t\tmax: 0.1,\n\t\t\t\tstep: 0.001\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Dot opacity',\n\t\t\t\ttype: 'number',\n\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\tsettingsKey: 'opacity',\n\t\t\t\ttitle: 'Dot opacity',\n\t\t\t\tmin: 0.1,\n\t\t\t\tmax: 1,\n\t\t\t\tstep: 0.1\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Show grid',\n\t\t\t\tboxLabel: '',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\tsettingsKey: 'showGrid',\n\t\t\t\ttitle: 'Show grid'\n\t\t\t}\n\t\t]\n\t\tconst enableContour = this.state.config.activeTab == GENE_EXPRESSION_TAB && this.state.config.gene\n\t\tif (enableContour)\n\t\t\tinputs.push({\n\t\t\t\tlabel: 'Show contour map',\n\t\t\t\tboxLabel: '',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\tsettingsKey: 'showContour',\n\t\t\t\ttitle:\n\t\t\t\t\t'Shows the density of point clouds. It uses gene expression to weight the points when calculating the density contours.'\n\t\t\t})\n\t\tif (enableContour && this.settings.showContour)\n\t\t\t//enabled and active\n\t\t\tinputs.push(\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Color contours',\n\t\t\t\t\tboxLabel: '',\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\t\tsettingsKey: 'colorContours'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Contour bandwidth',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\t\tsettingsKey: 'contourBandwidth',\n\t\t\t\t\ttitle: 'Reduce to increase resolution. ',\n\t\t\t\t\tmin: 5,\n\t\t\t\t\tmax: 50,\n\t\t\t\t\tstep: 5\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Contour thresholds',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\t\tsettingsKey: 'contourThresholds',\n\t\t\t\t\ttitle: 'Dot size',\n\t\t\t\t\tmin: 5,\n\t\t\t\t\tmax: 30,\n\t\t\t\t\tstep: 5\n\t\t\t\t}\n\t\t\t)\n\t\tif (\n\t\t\t(this.state.config.activeTab == GENE_EXPRESSION_TAB ||\n\t\t\t\tthis.state.config.activeTab == DIFFERENTIAL_EXPRESSION_TAB) &&\n\t\t\tthis.state.config.gene\n\t\t)\n\t\t\tinputs.unshift({\n\t\t\t\tlabel: 'Show unexpressed cells',\n\t\t\t\tboxLabel: '',\n\t\t\t\ttype: 'checkbox',\n\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\tsettingsKey: 'showNoExpCells',\n\t\t\t\ttitle: 'Show cells not expressing the selected gene'\n\t\t\t})\n\t\tthis.components = {\n\t\t\tcontrols: await controlsInit({\n\t\t\t\tapp: this.app,\n\t\t\t\tid: this.id,\n\t\t\t\tholder: this.dom.controlsHolder,\n\t\t\t\tinputs\n\t\t\t})\n\t\t}\n\t\tthis.components.controls.on('downloadClick.singleCellPlot', async () => {\n\t\t\tif (!this.state) return\n\t\t\tconst filename = await this.getSampleFilename(this.state)\n\t\t\tif (this.state.config.activeTab == GENE_EXPRESSION_TAB || this.state.config.activeTab == PLOTS_TAB)\n\t\t\t\tfor (const plot of this.plots) this.downloadPlot(plot, filename)\n\t\t})\n\t}\n\n\tdownloadSCTable(name, table) {\n\t\tdownloadTable(table.rows, table.columns, name)\n\t}\n\n\tdownloadPlot(plot, filename) {\n\t\tdownloadSingleSVG(plot.legendSVG, filename + '_LEGEND.svg', this.opts.holder.node())\n\t\tconst downloadImgName = plot.name\n\t\tconst a = document.createElement('a')\n\t\tdocument.body.appendChild(a)\n\t\tconst dataURL = plot.canvas.toDataURL()\n\n\t\ta.addEventListener(\n\t\t\t'click',\n\t\t\t() => {\n\t\t\t\t// Download the image\n\t\t\t\ta.download = filename + '_' + downloadImgName + '.png'\n\t\t\t\ta.href = dataURL\n\t\t\t\tdocument.body.removeChild(a)\n\t\t\t},\n\t\t\tfalse\n\t\t)\n\t\ta.click()\n\t}\n\n\tshowNoMatchingDataMessage() {\n\t\tthis.dom.mainDiv.style('display', 'none')\n\t\tthis.dom.loadingDiv.selectAll('*').remove()\n\t\tthis.dom.loadingDiv.style('display', '').append('div').style('font-size', '1.2em').html('No matching cohort data.')\n\t}\n\n\trenderPlots() {\n\t\tconst result = this.data\n\t\tif (result.nodata) return\n\t\tfor (const plot of result.plots) {\n\t\t\tif (\n\t\t\t\t(this.state.config.activeTab == DIFFERENTIAL_EXPRESSION_TAB ||\n\t\t\t\t\tthis.state.config.activeTab == GENE_EXPRESSION_TAB) &&\n\t\t\t\tthis.state.config.gene &&\n\t\t\t\t!plot.expCells.length\n\t\t\t)\n\t\t\t\tcontinue\n\n\t\t\tthis.renderPlot(plot)\n\t\t}\n\t\tif (this.plots.length == 0) this.dom.plotsDiv.append('div').text('No data to plot')\n\t}\n\n\trenderPlot(plot) {\n\t\tif (!plot.plotDiv) {\n\t\t\tconst plotDiv = this.dom.plotsDiv.append('div').style('display', 'inline-block').style('vertical-align', 'top')\n\t\t\tconst leftDiv = plotDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('vertical-align', 'top')\n\t\t\t\t.style('padding-top', '30px')\n\t\t\tplot.plotDiv = plotDiv.append('div').style('display', 'inline-block')\n\t\t\tthis.addZoomIcons(leftDiv, plot)\n\t\t}\n\t\tconst colorMap = {}\n\t\tthis.initPlot(plot)\n\n\t\tconst cat2Color = getColors(plot.clusters.length + 2) //Helps to use the same color scheme in different samples\n\t\tfor (const cluster of plot.clusters)\n\t\t\tcolorMap[cluster] = plot.colorMap?.[cluster] ? plot.colorMap[cluster] : cat2Color(cluster)\n\n\t\tplot.colorMap = colorMap\n\n\t\t//used to plot the cells\n\t\tthis.initAxes(plot)\n\n\t\t//.style('flex-grow', 1)\n\t\tplot.headerDiv = plot.plotDiv.append('div')\n\t\tplot.headerDiv.append('label').text(plot.name).style('font-size', '1.2em').style('margin-right', '10px')\n\t\tif (this.colorByGene && this.state.config.gene) {\n\t\t\t// for gene expression sc plot, needs to add colorGenerator to plot even\n\t\t\t// when legend is not needed for the plot\n\t\t\tif (!this.config.startColor[plot.name]) this.config.startColor[plot.name] = '#fffee0'\n\t\t\tif (!this.config.stopColor[plot.name]) this.config.stopColor[plot.name] = 'red'\n\t\t\tconst startColor = this.config.startColor[plot.name]\n\t\t\tconst stopColor = this.config.stopColor[plot.name]\n\t\t\tlet min, max\n\t\t\tconst expCells = plot.expCells\n\n\t\t\tconst values = expCells.map(cell => cell.geneExp).sort()\n\t\t\tplot.colorValues = values\n\t\t\tif (values.length == 0) {\n\t\t\t\tplot.colorGenerator = null\n\t\t\t} else {\n\t\t\t\tswitch (this.settings.colorScaleMode) {\n\t\t\t\t\t// Fixed mode: Use user-defined min/max values\n\t\t\t\t\t// This is useful when you want consistent scaling across different views\n\t\t\t\t\tcase 'fixed':\n\t\t\t\t\t\tmin = this.settings.colorScaleMinFixed\n\t\t\t\t\t\tmax = this.settings.colorScaleMaxFixed\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tcase 'percentile':\n\t\t\t\t\t\t// Percentile mode: Scale based on data distribution\n\t\t\t\t\t\tmin = values[0] // Start at the first value of the array for percentile mode\n\t\t\t\t\t\t// Calculate the value at the specified percentile\n\t\t\t\t\t\t// This helps handle outliers by focusing on the main distribution\n\t\t\t\t\t\tconst index = Math.floor((values.length * this.settings.colorScalePercentile) / 100)\n\t\t\t\t\t\tmax = values[index]\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tcase 'auto':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Auto mode (default): Use the full range of the data\n\t\t\t\t\t\t// This gives the most accurate representation of the actual data distribution\n\t\t\t\t\t\tmin = values[0]\n\t\t\t\t\t\tmax = values[values.length - 1] // Since the values are already sorted in ascending\n\t\t\t\t\t\t// order just get the first and last values\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tplot.colorGenerator = d3Linear().domain([min, max]).range([startColor, stopColor])\n\t\t\t}\n\t\t}\n\t\tthis.renderLargePlotThree(plot)\n\t\tthis.renderLegend(plot)\n\t}\n\n\tinitPlot(plot) {\n\t\tthis.plots.push(plot)\n\t\tconst expCells = plot.expCells.sort((a, b) => a.geneExp - b.geneExp)\n\t\tplot.cells = [...plot.noExpCells, ...expCells]\n\t\tplot.id = plot.name.replace(/\\s+/g, '')\n\t\tlet clusters = new Set(plot.cells.map(c => c.category))\n\n\t\tplot.clusters = Array.from(clusters).sort((a, b) => {\n\t\t\tconst num1 = parseInt(a.split(' ')[1])\n\t\t\tconst num2 = parseInt(b.split(' ')[1])\n\t\t\treturn num1 - num2\n\t\t})\n\t}\n\n\tgetOpacity(d) {\n\t\tif (this.config.hiddenClusters[d.category]) return 0\n\t\tif (this.colorByGene && this.state.config.gene && !d.geneExp)\n\t\t\treturn this.settings.showNoExpCells ? this.settings.opacity : 0\n\t\treturn this.settings.opacity\n\t}\n\n\tgetColor(d, plot) {\n\t\tlet color = plot.colorMap[d.category]\n\t\tif (this.colorByGene && this.state.config.gene) {\n\t\t\tif (!d.geneExp) color = noExpColor\n\t\t\telse if (d.geneExp > plot.max) color = plot.colorGenerator(plot.max)\n\t\t\telse color = plot.colorGenerator(d.geneExp)\n\t\t}\n\t\treturn color\n\t}\n\n\thandleZoom(e, plot) {\n\t\tplot.mainG.attr('transform', e.transform)\n\t}\n\n\tinitAxes(plot) {\n\t\tif (!plot.cells.length) return\n\t\tconst s0 = plot.cells[0]\n\t\tconst [xMin, xMax, yMin, yMax] = plot.cells.reduce(\n\t\t\t(s, d) => [d.x < s[0] ? d.x : s[0], d.x > s[1] ? d.x : s[1], d.y < s[2] ? d.y : s[2], d.y > s[3] ? d.y : s[3]],\n\t\t\t[s0.x, s0.x, s0.y, s0.y]\n\t\t)\n\t\tplot.xAxisScale = d3Linear().domain([xMin, xMax]).range([-1, 1])\n\t\tplot.yAxisScale = d3Linear().domain([yMin, yMax]).range([-1, 1])\n\t}\n\n\trenderLegend(plot) {\n\t\tconst colorMap = plot.colorMap\n\t\tlet legendSVG = plot.legendSVG\n\t\tconst clustersHeight = 20 * Object.keys(colorMap).length + 50 //added 50 for the title and padding\n\t\tconst height = Math.max(this.settings.svgh, clustersHeight)\n\t\tif (!plot.legendSVG) {\n\t\t\tconst activeTab = this.tabs.find(tab => tab.active)\n\t\t\tif (activeTab.id == PLOTS_TAB) {\n\t\t\t\tconst app = this.app\n\n\t\t\t\tif (plot.colorColumns.length > 1) {\n\t\t\t\t\tconst plotColorByDiv = plot.headerDiv\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.style('padding-bottom', '20px')\n\t\t\t\t\tplotColorByDiv.append('label').text('Color by:').style('margin-right', '5px')\n\t\t\t\t\tconst colorBySelect = plotColorByDiv.append('select')\n\t\t\t\t\tthis.plotColorByDivs.push(plotColorByDiv)\n\t\t\t\t\tcolorBySelect\n\t\t\t\t\t\t.selectAll('option')\n\t\t\t\t\t\t.data(plot.colorColumns)\n\t\t\t\t\t\t.enter()\n\t\t\t\t\t\t.append('option')\n\t\t\t\t\t\t.attr('value', d => d)\n\t\t\t\t\t\t.property('selected', d => d == this.state.config.colorBy?.[plot.name])\n\t\t\t\t\t\t.html(d => d)\n\t\t\t\t\tcolorBySelect.on('change', () => {\n\t\t\t\t\t\tconst colorBy = colorBySelect.node().value\n\t\t\t\t\t\tapp.dispatch({\n\t\t\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\t\t\tid: this.id,\n\t\t\t\t\t\t\tconfig: { colorBy: { [plot.name]: colorBy } }\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\tlegendSVG = plot.plotDiv\n\t\t\t\t.append('svg')\n\t\t\t\t.attr('width', 250)\n\t\t\t\t.attr('height', height)\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('vertical-align', 'top')\n\t\t\t\t.style('font-size', '0.9em')\n\n\t\t\tplot.legendSVG = legendSVG\n\t\t}\n\t\tlegendSVG.selectAll('*').remove()\n\n\t\tthis.legendRendered = true\n\n\t\tif (\n\t\t\t(this.state.config.activeTab == GENE_EXPRESSION_TAB ||\n\t\t\t\tthis.state.config.activeTab == DIFFERENTIAL_EXPRESSION_TAB) &&\n\t\t\tthis.state.config.gene\n\t\t) {\n\t\t\tthis.renderColorGradient(plot)\n\t\t\treturn\n\t\t}\n\t\tlet x = 20\n\n\t\tplot.legendSVG\n\t\t\t.append('text')\n\t\t\t.attr('transform', `translate(${x}, ${25})`)\n\t\t\t.style('font-weight', 'bold')\n\t\t\t.text(`${plot.colorBy}`)\n\t\tlet step = 25\n\t\tif (height < 500) {\n\t\t\tplot.legendSVG.style('font-size', '0.8em')\n\t\t\tstep = 20\n\t\t}\n\t\tlet y = 50\n\t\tconst configPlot = this.state.config.plots.find(p => p.name == plot.name)\n\t\tconst aliases = configPlot.colorColumns.find(c => c.name == plot.colorBy)?.aliases\n\t\tfor (const cluster in colorMap) {\n\t\t\tconst clusterCells = plot.cells.filter(item => item.category == cluster)\n\t\t\tconst hidden = this.config.hiddenClusters?.[cluster]\n\t\t\tconst n = clusterCells.length\n\t\t\tconst color = colorMap[cluster]\n\t\t\tconst itemG = plot.legendSVG.append('g').attr('transform', c => `translate(${x}, ${y})`)\n\t\t\titemG.append('circle').attr('r', 5).attr('fill', color)\n\t\t\titemG\n\t\t\t\t.append('g')\n\t\t\t\t.attr('transform', `translate(15, 5)`)\n\t\t\t\t.append('text')\n\t\t\t\t.text(\n\t\t\t\t\t`${\n\t\t\t\t\t\tcluster == 'ref'\n\t\t\t\t\t\t\t? this.state.termdbConfig.queries.singleCell.data.refName\n\t\t\t\t\t\t\t: cluster == 'query'\n\t\t\t\t\t\t\t? this.state.config.sample || this.samples[0].sample\n\t\t\t\t\t\t\t: aliases\n\t\t\t\t\t\t\t? aliases[cluster]\n\t\t\t\t\t\t\t: cluster\n\t\t\t\t\t} n=${n}`\n\t\t\t\t)\n\t\t\t\t.style('text-decoration', hidden ? 'line-through' : 'none')\n\t\t\t\t.on('click', e => this.showLegendItemMenu(e, cluster, plot))\n\t\t\ty += step\n\t\t}\n\t}\n\n\thideCategory(key, hidden) {\n\t\tthis.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.id,\n\t\t\tconfig: { hiddenClusters: { [key]: hidden } }\n\t\t})\n\t}\n\n\tshowLegendItemMenu(e, key, plot) {\n\t\tlet hiddenCount = 0\n\t\tfor (const cluster in this.state.config.hiddenClusters) if (this.state.config.hiddenClusters[cluster]) hiddenCount++\n\t\tconst hidden = this.state.config.hiddenClusters?.[key]\n\t\tif (hidden && hiddenCount == 1) {\n\t\t\t//show hidden category and skip menu\n\t\t\tthis.hideCategory(key, false, plot.legendSVG)\n\t\t\treturn\n\t\t}\n\t\tconst menu = this.tip.clear()\n\t\tconst div = menu.d.append('div')\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text(hidden ? 'Show' : 'Hide')\n\t\t\t.on('click', () => {\n\t\t\t\tthis.hideCategory(key, !hidden, plot.legendSVG)\n\t\t\t\tmenu.hide()\n\t\t\t})\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text('Show only')\n\t\t\t.on('click', () => {\n\t\t\t\tfor (const cluster in plot.colorMap) if (key != cluster) this.hideCategory(cluster, true, plot.legendSVG)\n\t\t\t\tthis.hideCategory(key, false, plot.legendSVG)\n\t\t\t\tmenu.hide()\n\t\t\t})\n\t\tif (hiddenCount > 1)\n\t\t\tdiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.text('Show all')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tmenu.hide()\n\t\t\t\t\tfor (const mapKey in plot.colorMap) this.hideCategory(mapKey, false, plot.legendSVG)\n\t\t\t\t})\n\t\tmenu.showunder(e.target)\n\t}\n\n\trenderColorGradient(plot) {\n\t\tif (plot.cells.length == 0 || !plot.colorGenerator) return\n\t\tconst colors = [this.config.startColor[plot.name], this.config.stopColor[plot.name]]\n\t\tconst gene = this.state.config.gene\n\t\tlet offsetY = 20\n\t\tconst barwidth = 100\n\t\tplot.legendSVG\n\t\t\t.append('g')\n\t\t\t.attr('transform', `translate(${20}, ${offsetY})`)\n\t\t\t.append('text')\n\t\t\t.text(`${gene} expression`)\n\t\tconst legendG = plot.legendSVG.append('g').attr('transform', `translate(20, ${2 * offsetY})`)\n\t\tconst colorScale = new ColorScale({\n\t\t\tholder: legendG,\n\t\t\tbarwidth,\n\t\t\tbarheight: 20,\n\t\t\tcolors,\n\t\t\tdomain: plot.colorGenerator.domain(),\n\n\t\t\tposition: '0, 20',\n\t\t\tticks: 4,\n\t\t\ttickSize: 5,\n\t\t\ttopTicks: true,\n\t\t\tsetColorsCallback: (val, idx) => {\n\t\t\t\tthis.changeGradientColor(plot, val, idx)\n\t\t\t},\n\t\t\tnumericInputs: {\n\t\t\t\tcutoffMode: this.settings.colorScaleMode,\n\t\t\t\tdefaultPercentile: this.settings.colorScalePercentile,\n\t\t\t\tcallback: obj => {\n\t\t\t\t\tlet min, max\n\t\t\t\t\tconst colorValues = plot.colorValues\n\t\t\t\t\t// Handle different modes for color scaling\n\t\t\t\t\tif (obj.cutoffMode === 'auto') {\n\t\t\t\t\t\tmin = colorValues[0]\n\t\t\t\t\t\tmax = colorValues[colorValues.length - 1]\n\t\t\t\t\t} else if (obj.cutoffMode === 'fixed') {\n\t\t\t\t\t\tmin = obj.min\n\t\t\t\t\t\tmax = obj.max\n\t\t\t\t\t} else if (obj.cutoffMode === 'percentile') {\n\t\t\t\t\t\tmin = colorValues[0]\n\t\t\t\t\t\tconst index = Math.floor((colorValues.length * obj.percentile) / 100)\n\t\t\t\t\t\tmax = colorValues[index]\n\t\t\t\t\t}\n\n\t\t\t\t\t// Dispatch the updated config\n\t\t\t\t\tthis.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\t\tid: this.id,\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t\tsingleCellPlot: {\n\t\t\t\t\t\t\t\t\tcolorScaleMode: obj.cutoffMode,\n\t\t\t\t\t\t\t\t\tcolorScaleMinFixed: obj.cutoffMode === 'fixed' ? min : null,\n\t\t\t\t\t\t\t\t\tcolorScaleMaxFixed: obj.cutoffMode === 'fixed' ? max : null,\n\t\t\t\t\t\t\t\t\tcolorScalePercentile:\n\t\t\t\t\t\t\t\t\t\tobj.cutoffMode === 'percentile' ? obj.percentile : this.settings.colorScalePercentile\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\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\tcolorScale.updateScale()\n\t}\n\n\tchangeGradientColor = function (plot, newColor, idx) {\n\t\tconst colorKey = idx == 0 ? 'startColor' : 'stopColor'\n\t\tthis.config[colorKey][plot.name] = newColor\n\n\t\tthis.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.id,\n\t\t\tconfig: this.config\n\t\t})\n\t}\n\n\tshowTooltip(event, plot) {\n\t\tif (this.onClick && event.type == 'click') {\n\t\t\tthis.onClick = false\n\t\t\tthis.tip.hide()\n\t\t\treturn\n\t\t}\n\t\tif (event.target.tagName == 'circle') {\n\t\t\tthis.onClick = event.type == 'click'\n\n\t\t\tconst d = event.target.__data__\n\n\t\t\tconst menu = this.tip.clear()\n\t\t\tconst table = menu.d.append('table')\n\t\t\tlet tr = table.append('tr')\n\t\t\ttr.append('td').style('color', '#aaa').text(plot.colorBy)\n\n\t\t\tlet td = tr.append('td')\n\t\t\ttd.text(d.category)\n\n\t\t\tif ('geneExp' in d) {\n\t\t\t\ttr = table.append('tr')\n\t\t\t\ttr.append('td').style('color', '#aaa').text('Gene expression')\n\t\t\t\ttd = tr.append('td')\n\t\t\t\tconst svg = td.append('svg').attr('width', 150).attr('height', 20)\n\t\t\t\tconst x = 10\n\t\t\t\tconst y = 12\n\t\t\t\tconst g = svg.append('g').attr('transform', `translate(${x}, ${y})`)\n\t\t\t\tg.append('circle').attr('fill', this.getColor(d, plot)).attr('r', 4)\n\t\t\t\tsvg\n\t\t\t\t\t.append('g')\n\t\t\t\t\t.attr('transform', `translate(${x + 15}, ${y + 4})`)\n\t\t\t\t\t.append('text')\n\t\t\t\t\t.text(roundValueAuto(d.geneExp))\n\t\t\t}\n\t\t\tmenu.show(event.clientX, event.clientY, true, true)\n\t\t} else this.onMouseOut(event)\n\t}\n\n\tonMouseOut(event) {\n\t\tthis.tip.hide()\n\t}\n\n\tasync renderSamplesTable() {\n\t\tconst state = this.state\n\t\t// need to do this after the this.samples has been set\n\n\t\tconst div = this.dom.samplesTableDiv\n\n\t\tdiv.selectAll('*').remove()\n\t\tconst [rows, columns] = await this.getTableData(state)\n\t\tif (columns.length > 5) div.style('font-size', '0.9em')\n\t\tconst selectedRows = []\n\t\tconst i = this.samples.findIndex(i => i.sample == state.config.sample)\n\t\tif (i != -1) selectedRows.push(i)\n\t\trenderTable({\n\t\t\trows,\n\t\t\tcolumns,\n\t\t\tresize: true,\n\t\t\tsingleMode: true,\n\t\t\tdiv,\n\t\t\tmaxWidth: columns.length > 3 ? '98vw' : '40vw',\n\t\t\tmaxHeight: '50vh',\n\t\t\tdataTestId: 'sjppoldscSampleTable',\n\t\t\tnoButtonCallback: index => {\n\t\t\t\t// NOTE that \"index\" is not array index of this.samples[]\n\t\t\t\tconst sample = rows[index][0].value\n\t\t\t\tconst hiddenClusters = {}\n\t\t\t\t// reset hidden clusters when changing sample\n\t\t\t\tfor (const cluster in this.config.hiddenClusters) hiddenClusters[cluster] = false\n\t\t\t\t// reset these settings when changing sample\n\t\t\t\tconst settings = {\n\t\t\t\t\tcolorScaleMode: 'auto',\n\t\t\t\t\tcolorScaleMinFixed: null,\n\t\t\t\t\tcolorScaleMaxFixed: null,\n\t\t\t\t\tcolorScalePercentile: 95,\n\t\t\t\t\tshowNoExpCells: false,\n\t\t\t\t\tshowContour: false,\n\t\t\t\t\tcolorContours: false,\n\t\t\t\t\tcontourBandwidth: 15,\n\t\t\t\t\tcontourThresholds: 10\n\t\t\t\t}\n\t\t\t\tconst config = {\n\t\t\t\t\tchartType: 'singleCellPlot',\n\t\t\t\t\tsample, // track sample name to identify it in this.samples[]\n\t\t\t\t\tactiveTab: PLOTS_TAB, // on selecting a sample from table, auto switch to plots to directly show this sample's plots, to save user a click\n\t\t\t\t\tcluster: null, // reset cluster\n\t\t\t\t\thiddenClusters, // reset hidden clusters\n\t\t\t\t\tsettings: { singleCellPlot: settings }\n\t\t\t\t}\n\t\t\t\tthis.genes = null // reset DE genes\n\t\t\t\tif (rows[index][0].__experimentID) {\n\t\t\t\t\tconfig.experimentID = rows[index][0].__experimentID\n\t\t\t\t}\n\n\t\t\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config })\n\t\t\t},\n\t\t\tselectedRows,\n\t\t\tstriped: true,\n\t\t\theader: { style: { 'text-transform': 'capitalize' } } // to show header in title case; if it results in a conflict (e.g. a sample name showing in 1st tab has to be lower case), then use sampleColumns[].columnHeader as override of term name\n\t\t})\n\t}\n\n\tasync getTableData(state) {\n\t\tconst { uiLabels } = state.config.settings.singleCellPlot\n\t\tconst s = state.termdbConfig.queries?.singleCell?.samples || {}\n\t\tconst samples = this.samples\n\t\tconst rows = []\n\t\tconst hasExperiments = samples.some(i => i.experiments)\n\t\t// first column is sample and is hardcoded\n\t\tconst columns = [{ label: uiLabels.Sample }]\n\t\tif (hasExperiments) columns.push({ label: 'Sample' }) //add after the case column\n\n\t\t// add in optional sample columns\n\t\tfor (const c of s.sampleColumns || []) {\n\t\t\tlet label = c.termid\n\t\t\ttry {\n\t\t\t\tlabel = (await this.app.vocabApi.getterm(c.termid)).name\n\t\t\t} catch (e) {\n\t\t\t\t/* term not found by c.termid, in such case ignore and just show termid as column header\n\t\t\t\tthis is due to practical constrain that gdc needs to supply analysis.workflow_type as 'Library',\n\t\t\t\tbut this is not a term in gdc dictionary\n\t\t\t\t*/\n\t\t\t}\n\t\t\tcolumns.push({ label, width: '14vw' })\n\t\t}\n\n\t\t// if samples are using experiments, add the hardcoded experiment column at the end\n\t\tif (hasExperiments) columns.push({ label: 'Experiment' }) // corresponds to this.samples[].experiments[].experimentID\n\n\t\tfor (const sample of samples) {\n\t\t\tif (hasExperiments)\n\t\t\t\t//GDC\n\t\t\t\tfor (const exp of sample.experiments) {\n\t\t\t\t\t// first cell is always sample name. sneak in experiment object to be accessed in click callback\n\t\t\t\t\tconst row = [{ value: sample.sample, __experimentID: exp.experimentID }]\n\t\t\t\t\t// hardcode to expect exp.sampleName and add this as a column\n\t\t\t\t\trow.push({ value: exp.sampleName })\n\t\t\t\t\t// optional sample and experiment columns\n\t\t\t\t\tfor (const c of s.sampleColumns || []) {\n\t\t\t\t\t\trow.push({ value: sample[c.termid] })\n\t\t\t\t\t}\n\n\t\t\t\t\t// hardcode to always add in experiment id column\n\t\t\t\t\tconst urlTemp = this.state.termdbConfig?.urlTemplates?.scrnaExperimentId\n\t\t\t\t\tif (urlTemp) row.push({ value: exp.experimentID, url: `${urlTemp.base}${exp.experimentID}` })\n\t\t\t\t\telse row.push({ value: exp.experimentID })\n\t\t\t\t\trows.push(row)\n\t\t\t\t}\n\t\t\telse {\n\t\t\t\t// sample does not use experiment\n\n\t\t\t\t// first cell is sample name\n\t\t\t\tconst row = [{ value: sample.sample }]\n\n\t\t\t\t// optional sample columns\n\t\t\t\tfor (const c of s.sampleColumns || []) {\n\t\t\t\t\trow.push({ value: sample[c.termid] })\n\t\t\t\t}\n\t\t\t\trows.push(row)\n\t\t\t}\n\t\t}\n\n\t\t//const index = columnNames.length == 1 ? 0 : columnNames.length - 1\n\t\t//columns[index].width = '25vw'\n\t\treturn [rows, columns]\n\t}\n\n\trenderLargePlotThree = async function (plot) {\n\t\tif (!plot.canvas) {\n\t\t\tconst canvas = plot.plotDiv\n\t\t\t\t.append('canvas')\n\t\t\t\t.attr('data-testid', 'sjppoldsccanvas')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('vertical-align', 'top')\n\t\t\tplot.canvas = canvas.node()\n\t\t\tplot.canvas.width = this.settings.svgw\n\t\t\tplot.canvas.height = this.settings.svgh\n\t\t\tplot.renderer = new THREE.WebGLRenderer({ antialias: true, canvas: plot.canvas, preserveDrawingBuffer: true })\n\t\t} else plot.renderer.clear()\n\n\t\tconst renderer = plot.renderer\n\n\t\t//WebGLRenderer.outputColorSpace property determines the color space of the final rendered output. By default this is set to THREE.SRGBColorSpace, so that the rendered image is correctly displayed on standard monitors.\n\t\t//There are times where you may want to set the output color space to THREE.LinearSRGBColorSpace, so that color information is not altered before post processing effects are applied.\n\t\t//This fixes the issue where the colors are washed out and look lighter than in the legend\n\t\trenderer.outputColorSpace = THREE.LinearSRGBColorSpace\n\t\tconst DragControls = await import('three/examples/jsm/controls/DragControls.js')\n\n\t\tconst fov = this.settings.threeFOV\n\t\tconst near = 0.1\n\t\tconst far = 1000\n\t\tconst camera = new THREE.PerspectiveCamera(fov, 1, near, far)\n\t\tconst scene = new THREE.Scene()\n\t\tcamera.position.set(0, 0, 2)\n\t\tcamera.lookAt(scene.position)\n\t\tcamera.updateMatrix()\n\t\tconst whiteColor = new THREE.Color('rgb(255,255,255)')\n\t\tscene.background = whiteColor\n\n\t\tconst geometry = new THREE.BufferGeometry()\n\t\tconst { vertices, colors } = this.getVertices(plot)\n\n\t\tgeometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\n\t\tgeometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3))\n\t\tconst tex = getThreeCircle(256)\n\t\tconst material = new THREE.PointsMaterial({\n\t\t\tsize: this.settings.sampleSizeThree,\n\t\t\tsizeAttenuation: true,\n\t\t\ttransparent: true,\n\t\t\topacity: this.settings.opacity,\n\t\t\tmap: tex,\n\t\t\tvertexColors: true\n\t\t})\n\n\t\tconst particles = new THREE.Points(geometry, material)\n\t\tplot.particles = particles\n\t\tscene.add(particles)\n\n\t\trenderer.setSize(this.settings.svgw, this.settings.svgh)\n\t\trenderer.setPixelRatio(window.devicePixelRatio)\n\n\t\tplot.canvas.addEventListener('mousewheel', event => {\n\t\t\tif (!event.ctrlKey) return\n\t\t\tevent.preventDefault()\n\t\t\tparticles.position.z -= event.deltaY / 500\n\t\t})\n\n\t\tif (this.settings.showContour && this.state.config.gene && this.state.config.activeTab == GENE_EXPRESSION_TAB) {\n\t\t\tconst cells = plot.expCells.length > 0 ? plot.expCells : plot.cells\n\t\t\tconst xAxisScale = plot.xAxisScale.range([0, this.settings.svgw])\n\t\t\tconst yAxisScale = plot.yAxisScale.range([this.settings.svgh, 0])\n\t\t\tlet zAxisScale\n\t\t\tif (plot.expCells.length > 0) {\n\t\t\t\tconst [min, max] = extent(plot.expCells, d => d.geneExp)\n\t\t\t\tzAxisScale = d3Linear().domain([min, max]).range([0, 1])\n\t\t\t}\n\n\t\t\tconst xCoords = cells.map(c => xAxisScale(c.x))\n\t\t\tconst yCoords = cells.map(c => yAxisScale(c.y))\n\t\t\tconst zCoords = cells.map(c => (zAxisScale ? zAxisScale(c.geneExp) : 1))\n\t\t\tawait this.renderContourMap(scene, xCoords, yCoords, zCoords, plot)\n\t\t}\n\n\t\tconst controls = new DragControls.DragControls([particles], camera, renderer.domElement)\n\n\t\tfunction animate() {\n\t\t\trequestAnimationFrame(animate)\n\t\t\trenderer.render(scene, camera)\n\t\t}\n\t\tanimate()\n\t\tif (this.settings.showGrid) this.renderThreeGrid(scene)\n\t}\n\n\tasync renderContourMap(scene, xCoords, yCoords, zCoords, plot) {\n\t\tconst data = xCoords.map((x, i) => ({ x, y: yCoords[i], z: zCoords[i] }))\n\t\t// Create the data URL\n\t\tconst imageUrl = getContourImage(\n\t\t\tdata,\n\t\t\tthis.settings.svgw,\n\t\t\tthis.settings.svgh,\n\t\t\tthis.settings.colorContours,\n\t\t\tthis.settings.contourBandwidth,\n\t\t\tthis.settings.contourThresholds\n\t\t)\n\t\tconst loader = new THREE.TextureLoader()\n\t\tloader.load(imageUrl, texture => {\n\t\t\t// Create a plane geometry\n\t\t\tconst geometry = new THREE.PlaneGeometry(2, 2)\n\t\t\t// Create a material using the loaded texture\n\t\t\t// the transparent parameter is needed to keep the contours transparent, otherwise the background will be black\n\t\t\t// the color parameter is needed to make the contours darker, otherwise they are light gray\n\t\t\tconst material = new THREE.MeshBasicMaterial({ map: texture, transparent: true, color: 0x141414 })\n\t\t\t// Create a mesh with the geometry and material\n\t\t\tconst plane = new THREE.Mesh(geometry, material)\n\t\t\t// Add the plane to the scene\n\t\t\tscene.add(plane)\n\t\t\tplot.plane = plane\n\t\t\tplane.position.z = 0.00001 //makes the plane be on top of the particles\n\t\t\tplot.particles.add(plane) //makes the plane move with the particles\n\t\t})\n\t}\n\n\trenderThreeGrid(scene) {\n\t\tlet x = -1\n\t\t// Line Geometry\n\t\tconst lineMaterial = new THREE.LineBasicMaterial({ color: 0xffd3d3d3 })\n\n\t\tconst lines = 10\n\t\tconst step = 2 / lines\n\n\t\tfor (let i = 0; i < lines; i++) {\n\t\t\tlet points = []\n\t\t\tpoints.push(new THREE.Vector3(x, 1.5, 0))\n\t\t\tpoints.push(new THREE.Vector3(x, -1.5, 0))\n\t\t\tlet lineGeometry = new THREE.BufferGeometry().setFromPoints(points)\n\t\t\tlet line = new THREE.Line(lineGeometry, lineMaterial)\n\t\t\tline.position.z = 1\n\n\t\t\tscene.add(line)\n\t\t\tpoints = []\n\t\t\tpoints.push(new THREE.Vector3(-1.5, x, 0))\n\t\t\tpoints.push(new THREE.Vector3(1.5, x, 0))\n\t\t\tlineGeometry = new THREE.BufferGeometry().setFromPoints(points)\n\t\t\tline = new THREE.Line(lineGeometry, lineMaterial)\n\t\t\tscene.add(line)\n\t\t\tx += step\n\t\t\tline.position.z = 1\n\t\t}\n\t}\n\n\tgetVertices(plot) {\n\t\tconst vertices = []\n\t\tconst colors = []\n\t\tfor (const c of plot.cells) {\n\t\t\tconst opacity = this.getOpacity(c)\n\t\t\tif (opacity == 0) continue\n\t\t\tlet x = plot.xAxisScale(c.x)\n\t\t\tlet y = plot.yAxisScale(c.y)\n\t\t\tconst rgbColor = rgb(this.getColor(c, plot))\n\t\t\tvertices.push(x, y, 0)\n\t\t\tcolors.push(rgbColor.r / 255, rgbColor.g / 255, rgbColor.b / 255)\n\t\t}\n\t\treturn { vertices, colors }\n\t}\n}\n\nexport function getContourImage(data, width, height, colorContours, bandwidth, thresholds) {\n\tconst svg = create('svg').attr('width', width).attr('height', height)\n\n\trenderContours(svg.append('g'), data, width, height, colorContours, bandwidth, thresholds)\n\n\t// Serialize the SVG element\n\tconst svgString = new XMLSerializer().serializeToString(svg.node())\n\n\t// Encode the SVG string\n\tconst encodedSvg = encodeURIComponent(svgString)\n\n\t// Create the data URL\n\tconst imageUrl = 'data:image/svg+xml;charset=utf-8,' + encodedSvg\n\treturn imageUrl\n}\n\n// Function to get mouse position in normalized device coordinates (-1 to +1)\nexport function getMouseNDC(event, rect) {\n\t//const rect = renderer.domElement.getBoundingClientRect()\n\treturn new THREE.Vector2(\n\t\t((event.clientX - rect.left) / rect.width) * 2 - 1,\n\t\t(-(event.clientY - rect.top) / rect.height) * 2 + 1\n\t)\n}\n\nexport const scatterInit = getCompInit(singleCellPlot)\n// this alias will allow abstracted dynamic imports\nexport const componentInit = scatterInit\n\nexport async function getPlotConfig(opts, app) {\n\ttry {\n\t\tconst data = app.vocabApi.termdbConfig?.queries?.singleCell?.data\n\t\tconst plots = data?.plots\n\t\tlet settings = getDefaultSingleCellSettings()\n\t\tif (data.settings)\n\t\t\tfor (const key in data.settings) {\n\t\t\t\tsettings[key] = data.settings[key]\n\t\t\t}\n\n\t\tconst config = {\n\t\t\thiddenClusters: {},\n\t\t\tsettings: {\n\t\t\t\tsingleCellPlot: settings,\n\t\t\t\tcontrols: { isOpen: false }\n\t\t\t},\n\t\t\tstartColor: {},\n\t\t\tstopColor: {},\n\t\t\tplots,\n\t\t\thidePlotFilter: true\n\t\t}\n\t\t// may apply term-specific changes to the default object\n\t\tconst result = copyMerge(config, opts)\n\t\treturn result\n\t} catch (e) {\n\t\tconsole.log(e)\n\t\tthrow `${e} [singleCellPlot getPlotConfig()]`\n\t}\n}\n\nexport function getDefaultSingleCellSettings() {\n\treturn {\n\t\tsvgw: 600,\n\t\tsvgh: 600,\n\t\tshowGrid: true,\n\t\tsampleSize: 1.5,\n\t\tsampleSizeThree: 0.04,\n\t\tthreeFOV: 60,\n\t\topacity: 0.8,\n\t\tshowNoExpCells: false,\n\t\tshowContour: false,\n\t\tcolorContours: false,\n\t\tcontourBandwidth: 15,\n\t\tcontourThresholds: 10,\n\t\tuiLabels: {\n\t\t\t// allow customized user interface labels (buttons, menus, etc) by dataset override,\n\t\t\t// for example in GDC, use 'Case' instead of 'Sample'\n\t\t\t// TODO: different plots should use the same uiLabels override,\n\t\t\t// should not need to define separately for matrix, single cell, etc\n\t\t\tSamples: 'Samples',\n\t\t\tsamples: 'samples',\n\t\t\tSample: 'Sample',\n\t\t\tsample: 'sample'\n\t\t},\n\t\tcolorScaleMode: 'auto', // Default to automatic scaling based on data range\n\t\t// Other options: 'fixed' (user-defined range) or\n\t\t// 'percentile' (scale based on data distribution)\n\n\t\tcolorScalePercentile: 95, // Default percentile for percentile mode\n\t\t// This means we'll scale colors based on values\n\t\t// up to the 95th percentile by default\n\t\tcolorScaleMinFixed: null, // User-defined minimum value for fixed mode\n\t\t// Null indicates this hasn't been set yet\n\t\tcolorScaleMaxFixed: null // User-defined maximum value for fixed mode\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["exports", "d", "i", "points", "x", "y", "exponential", "fn", "linear", "loess", "logarithmic", "dx", "dy", "polynomial", "power", "event", "group", "max", "max", "div", "text", "e", "i", "max"]
7
+ }