@sjcrh/proteinpaint-client 2.170.13 → 2.170.15

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 (499) hide show
  1. package/dist/{2dmaf-JJJS4QVZ.js → 2dmaf-34YUEZHQ.js} +4 -4
  2. package/dist/{AIProjectAdmin-3XJ5FSVS.js → AIProjectAdmin-VRXXHIFV.js} +5 -5
  3. package/dist/{AppHeader-4NPOF5JL.js → AppHeader-GIIEJQ6G.js} +12 -12
  4. package/dist/{BoxPlot-PAEB5PQU.js → BoxPlot-2W5EYI4W.js} +8 -5
  5. package/dist/{BoxPlot-PAEB5PQU.js.map → BoxPlot-2W5EYI4W.js.map} +2 -2
  6. package/dist/{CorrelationVolcano-MNJFOMTY.js → CorrelationVolcano-2X5R5AXL.js} +4 -4
  7. package/dist/{DifferentialAnalysis-5AK56UX2.js → DifferentialAnalysis-HLIJ5KLU.js} +6 -6
  8. package/dist/{Disco-4GZNRD6P.js → Disco-35YLYFIA.js} +6 -6
  9. package/dist/{Disco.UI-7H7MTXBB.js → Disco.UI-OXZSKCU2.js} +7 -7
  10. package/dist/{GB-HFDALSUS.js → GB-NQPJHMPD.js} +6 -6
  11. package/dist/{HicApp-UY5NMHEC.js → HicApp-E6X52JL7.js} +6 -6
  12. package/dist/{NumBinaryEditor-NG2TZ2GI.js → NumBinaryEditor-HSSHXWEO.js} +4 -4
  13. package/dist/{NumBinaryEditor.unit.spec-JO37G4JD.js → NumBinaryEditor.unit.spec-ORACGYQ3.js} +5 -5
  14. package/dist/{NumContEditor-APKF4RPR.js → NumContEditor-IFTY2CZO.js} +4 -4
  15. package/dist/{NumContEditor.unit.spec-UFWELETU.js → NumContEditor.unit.spec-O5OWM2RE.js} +5 -5
  16. package/dist/{NumCustomBinEditor-BBTS4FB7.js → NumCustomBinEditor-6OX4S7FU.js} +5 -5
  17. package/dist/{NumCustomBinEditor.unit.spec-BMFY2CI4.js → NumCustomBinEditor.unit.spec-OKIFZGGB.js} +5 -5
  18. package/dist/{NumDiscreteEditor-POHQOWFG.js → NumDiscreteEditor-MT4GWFE6.js} +6 -6
  19. package/dist/{NumDiscreteEditor.unit.spec-G5KDFODT.js → NumDiscreteEditor.unit.spec-4W3UZCPM.js} +5 -5
  20. package/dist/{NumRegularBinEditor-DH4BA72V.js → NumRegularBinEditor-XXXIJTP4.js} +5 -5
  21. package/dist/{NumRegularBinEditor.unit.spec-P2AZO6M3.js → NumRegularBinEditor.unit.spec-PZXPUOBD.js} +5 -5
  22. package/dist/{NumSplineEditor-KLX4KE72.js → NumSplineEditor-QX546RZL.js} +4 -4
  23. package/dist/{NumSplineEditor.unit.spec-PTU6XM22.js → NumSplineEditor.unit.spec-VAOQ7273.js} +5 -5
  24. package/dist/{NumericDensity-XBMTLG3X.js → NumericDensity-LIHDJBRQ.js} +4 -4
  25. package/dist/{NumericDensity.unit.spec-22N4OE5T.js → NumericDensity.unit.spec-4PYE3JBB.js} +4 -4
  26. package/dist/{NumericHandler-SYGKJ6DT.js → NumericHandler-DNYVU5UY.js} +5 -5
  27. package/dist/{NumericHandler.unit.spec-VIVKWJFQ.js → NumericHandler.unit.spec-RFHH47JL.js} +5 -5
  28. package/dist/{SC-Y43YK5DP.js → SC-4VXXALEM.js} +4 -4
  29. package/dist/{Volcano-M7OLHCPE.js → Volcano-WETY43EN.js} +5 -5
  30. package/dist/{WSIViewer-CCLP4YLK.js → WSIViewer-MR22OWBJ.js} +4 -4
  31. package/dist/{WsiSamplesPlot-M23PW47B.js → WsiSamplesPlot-PSP7GF4X.js} +5 -5
  32. package/dist/{adSandbox-EGDXUDB3.js → adSandbox-7OQBUMRO.js} +5 -5
  33. package/dist/{alphaGenome-OKJZZD6U.js → alphaGenome-PXPFF57K.js} +4 -4
  34. package/dist/{app-WTWHDUA6.js → app-76R7LNF4.js} +4 -4
  35. package/dist/{app-5OQVO6PL.js → app-HRSWWPMQ.js} +14 -14
  36. package/dist/app.js +10 -10
  37. package/dist/{bam-T7TZ5TDR.js → bam-B2R3LWIE.js} +6 -6
  38. package/dist/{barchart-4VEUHJPT.js → barchart-AASIQC7G.js} +4 -4
  39. package/dist/{barchart.data-WQ3FQSKT.js → barchart.data-ZWZYDBRD.js} +4 -4
  40. package/dist/{barchart.events-IH7LKBIC.js → barchart.events-DA6VDPX7.js} +4 -4
  41. package/dist/{barchart.integration.spec-SAMY5MQF.js → barchart.integration.spec-NRBT7G7Q.js} +12 -12
  42. package/dist/{block-WCLO3QIC.js → block-JKEP3VXL.js} +25 -25
  43. package/dist/{block.init-4WT3S577.js → block.init-AUY5L6YJ.js} +5 -5
  44. package/dist/{block.mds.expressionrank-QBHPR47Q.js → block.mds.expressionrank-KWVC5JS2.js} +6 -6
  45. package/dist/{block.mds.geneboxplot-HV3II4OK.js → block.mds.geneboxplot-EB54VBTN.js} +5 -5
  46. package/dist/{block.mds.junction-3LHN52D5.js → block.mds.junction-UGKF2BV3.js} +11 -11
  47. package/dist/{block.mds.svcnv-RRF65XFP.js → block.mds.svcnv-ZCOKOV4B.js} +18 -18
  48. package/dist/{block.svg-4WKDJEJ3.js → block.svg-WPYUWSS7.js} +4 -4
  49. package/dist/{block.tk.aicheck-RAXM2H5R.js → block.tk.aicheck-AR32ODDQ.js} +4 -4
  50. package/dist/{block.tk.ase-VX2BVYWG.js → block.tk.ase-CMJJOTS7.js} +6 -6
  51. package/dist/{block.tk.bam-Q7QD7HJB.js → block.tk.bam-7KOWHAYI.js} +4 -4
  52. package/dist/{block.tk.bedgraphdot-55T3BBT7.js → block.tk.bedgraphdot-FI4ILOEU.js} +4 -4
  53. package/dist/{block.tk.bigwig.ui-NTYYOWRQ.js → block.tk.bigwig.ui-SYXMZVMS.js} +4 -4
  54. package/dist/{block.tk.hicstraw-CF6K5Y24.js → block.tk.hicstraw-SLMWXBPU.js} +5 -5
  55. package/dist/{block.tk.junction-6FC5K7BL.js → block.tk.junction-POPMPYSD.js} +8 -8
  56. package/dist/{block.tk.junction.textmatrixui-ZR4OVUTN.js → block.tk.junction.textmatrixui-FN6ECUYF.js} +5 -5
  57. package/dist/{block.tk.ld-2JULMODC.js → block.tk.ld-AZ4QYFYM.js} +7 -7
  58. package/dist/{block.tk.menu-EOA76JET.js → block.tk.menu-75RTVRAP.js} +4 -4
  59. package/dist/{block.tk.pgv-36PO7DI4.js → block.tk.pgv-DBR5YJZC.js} +7 -7
  60. package/dist/{brainImaging-MNUU3ZLR.js → brainImaging-6ULOIHMJ.js} +4 -4
  61. package/dist/{chat-4NOH35JY.js → chat-UFNVMQCI.js} +5 -5
  62. package/dist/{chunk-NJKN6DAK.js → chunk-2E3IOEPG.js} +2 -2
  63. package/dist/{chunk-VMVBUU63.js → chunk-37UC4HE6.js} +2 -2
  64. package/dist/{chunk-TADFLIQ5.js → chunk-3AS3GUYM.js} +2 -2
  65. package/dist/{chunk-SV6N2HNL.js → chunk-3XB3AQFN.js} +3 -3
  66. package/dist/{chunk-VCZQJQIS.js → chunk-44NYI4TU.js} +4 -4
  67. package/dist/{chunk-CLNRUJ2N.js → chunk-4HTXTTEC.js} +8 -8
  68. package/dist/{chunk-23TOE33H.js → chunk-64HDX7DO.js} +3 -3
  69. package/dist/{chunk-TEERDYUS.js → chunk-6LEQKBLY.js} +3 -3
  70. package/dist/{chunk-5KBEMRSI.js → chunk-6PK4CX2S.js} +6 -6
  71. package/dist/{chunk-AZ5J32KP.js → chunk-AJ5A3AO4.js} +5 -5
  72. package/dist/{chunk-PWNZL5IJ.js → chunk-AZ5QVEBH.js} +5 -5
  73. package/dist/{chunk-H3DCEJBL.js → chunk-BJAGRLOF.js} +8 -8
  74. package/dist/{chunk-E3IIUVLZ.js → chunk-BVX5P3NZ.js} +2 -2
  75. package/dist/{chunk-Y6OL4KUS.js → chunk-C663K4HT.js} +75 -72
  76. package/dist/{chunk-Y6OL4KUS.js.map → chunk-C663K4HT.js.map} +2 -2
  77. package/dist/{chunk-E4KVO2QB.js → chunk-CFMGZEKV.js} +3 -3
  78. package/dist/{chunk-J24OUE4D.js → chunk-ERP3OM7Y.js} +3 -3
  79. package/dist/{chunk-HJGGXQZ5.js → chunk-ETT3IFTZ.js} +11 -7
  80. package/dist/chunk-ETT3IFTZ.js.map +7 -0
  81. package/dist/{chunk-4XLDP35V.js → chunk-FOMCTGFF.js} +3 -3
  82. package/dist/{chunk-P6LSONHQ.js → chunk-GCLB7V7Q.js} +3 -3
  83. package/dist/{chunk-OIB5C2RK.js → chunk-GSFAQS6X.js} +2 -2
  84. package/dist/{chunk-5DYBCPJ6.js → chunk-GWJQSTLK.js} +2 -2
  85. package/dist/{chunk-GYJW2AB2.js → chunk-HCEGGN4N.js} +3 -3
  86. package/dist/{chunk-D7QK5NTL.js → chunk-HDR6NCOK.js} +38 -38
  87. package/dist/{chunk-BUQ7S2O2.js → chunk-J7BZTO5G.js} +100 -100
  88. package/dist/{chunk-PHHTY45N.js → chunk-JUIPKB3J.js} +2 -2
  89. package/dist/{chunk-25MV7QKV.js → chunk-LFZPQ6HQ.js} +2 -2
  90. package/dist/{chunk-VCZZ6N2C.js → chunk-M2JZ6ALU.js} +8 -5
  91. package/dist/chunk-M2JZ6ALU.js.map +7 -0
  92. package/dist/{chunk-X2J3DJX2.js → chunk-MI6EULGM.js} +2 -2
  93. package/dist/{chunk-24O5JOP7.js → chunk-MVW6VLUM.js} +3 -3
  94. package/dist/{chunk-WHJTQR5P.js → chunk-NCQBBILL.js} +8 -8
  95. package/dist/{chunk-QAVBHPY3.js → chunk-NJ35ODQA.js} +2 -2
  96. package/dist/{chunk-7JNJ5LHM.js → chunk-NZQ3FUKO.js} +4 -4
  97. package/dist/{chunk-UJ5E5OSU.js → chunk-OOY2W6D7.js} +2 -2
  98. package/dist/{chunk-FXA25J4U.js → chunk-P5W3KHMX.js} +8 -8
  99. package/dist/{chunk-MW5SFVPY.js → chunk-PJ2VOA2U.js} +3 -3
  100. package/dist/{chunk-K5DHHUJL.js → chunk-QXISDZW5.js} +2 -2
  101. package/dist/{chunk-U3EF5DDC.js → chunk-RVSESNWL.js} +2 -2
  102. package/dist/{chunk-JJKZRFLM.js → chunk-RZUPOEMN.js} +2 -2
  103. package/dist/{chunk-DP5T33IU.js → chunk-TMI2Q2NW.js} +4 -4
  104. package/dist/{chunk-YIS337R3.js → chunk-TUDPQS4A.js} +2 -2
  105. package/dist/{chunk-BBEESEQM.js → chunk-VBAW4JG7.js} +5 -5
  106. package/dist/{chunk-MT3BM3MJ.js → chunk-VFQW5YCN.js} +3 -3
  107. package/dist/{chunk-MTHJNV5B.js → chunk-VIJOC6L2.js} +4 -4
  108. package/dist/{chunk-76THLD6X.js → chunk-VITFCJIU.js} +5 -5
  109. package/dist/{chunk-KRAEDA33.js → chunk-VYBP7AT5.js} +3 -3
  110. package/dist/{chunk-7QW52A66.js → chunk-WZMO7Z2H.js} +2 -2
  111. package/dist/{chunk-TMFHJD3G.js → chunk-XKXTJHA7.js} +1 -1
  112. package/dist/{chunk-TMFHJD3G.js.map → chunk-XKXTJHA7.js.map} +2 -2
  113. package/dist/{chunk-CUVPRGNE.js → chunk-XLHV2JEG.js} +31 -31
  114. package/dist/{chunk-EJSNAJBJ.js → chunk-YD4QI2UP.js} +9 -9
  115. package/dist/{chunk-FYJDO2WJ.js → chunk-YLQ5P6PZ.js} +11 -11
  116. package/dist/{chunk-BJANTR6U.js → chunk-YOAVLKDS.js} +12 -12
  117. package/dist/{chunk-HV46AUOB.js → chunk-Z76EKBGS.js} +5 -5
  118. package/dist/{chunk-34KY6AZP.js → chunk-ZNJ46D22.js} +6 -6
  119. package/dist/{chunk-KSIPOBZV.js → chunk-ZQPDDXL5.js} +2 -2
  120. package/dist/{condition-NZ2ILZXY.js → condition-S6IF36PG.js} +4 -4
  121. package/dist/{controls-PG7TO24T.js → controls-5FVCQT7E.js} +4 -4
  122. package/dist/{controls.config-ACGSBAYN.js → controls.config-QEVAMKQS.js} +4 -4
  123. package/dist/{correlation-A6FKTPWF.js → correlation-J5ODM6PI.js} +14 -14
  124. package/dist/{cuminc-SJMGX2HP.js → cuminc-P6GA5DYB.js} +4 -4
  125. package/dist/{cuminc.integration.spec-DNSJWVIE.js → cuminc.integration.spec-XQOAHBYQ.js} +12 -12
  126. package/dist/{customdata.inputui-AGUP5ART.js → customdata.inputui-2WGM334T.js} +4 -4
  127. package/dist/{dataDownload-CA5WRH3P.js → dataDownload-Q7UVOFEC.js} +4 -4
  128. package/dist/{dataDownload.integration.spec-LZAHLQE3.js → dataDownload.integration.spec-SUTF6CBZ.js} +12 -12
  129. package/dist/{databrowser.ui-PEG4G3ZA.js → databrowser.ui-VQ6VAOBI.js} +14 -14
  130. package/dist/{dictionary-ZSDMCWGL.js → dictionary-PE6CJMLE.js} +4 -4
  131. package/dist/{e2pca-JKZ4UGY6.js → e2pca-7VH4CSSV.js} +4 -4
  132. package/dist/{ep-HC5VXXOI.js → ep-WX5KI45A.js} +4 -4
  133. package/dist/{expclust.gdc.spec-ZK25SL6N.js → expclust.gdc.spec-OAFXEPQX.js} +12 -12
  134. package/dist/{facet-35PKFEQB.js → facet-TS5LRQMO.js} +4 -4
  135. package/dist/{frequencyChart-HMHTNPRC.js → frequencyChart-RKUS77AW.js} +9 -9
  136. package/dist/{frequencyChart.integration.spec-ZXY2FVFA.js → frequencyChart.integration.spec-D2JZW4VS.js} +12 -12
  137. package/dist/{geneExpClustering-QHM4UB4H.js → geneExpClustering-X3QVXV56.js} +6 -6
  138. package/dist/{geneExpression-OBT7MUYM.js → geneExpression-A3TOFOGG.js} +2 -2
  139. package/dist/{geneExpression-BCHU3MRB.js → geneExpression-KHDBS2HX.js} +4 -4
  140. package/dist/{geneORA-ZJHKXCKH.js → geneORA-PG3JWWCY.js} +4 -4
  141. package/dist/{geneVariant-GXZSQXRM.js → geneVariant-QAUEUXA5.js} +4 -4
  142. package/dist/{geneVariant-J35SE6LY.js → geneVariant-ZACCSX4Z.js} +4 -4
  143. package/dist/{genefusion.ui-V4BA24JW.js → genefusion.ui-S4TSFJQ7.js} +4 -4
  144. package/dist/{geneset-TVFHJSFS.js → geneset-OSQPXKU5.js} +4 -4
  145. package/dist/{genomeBrowser.spec-W4GLAWAW.js → genomeBrowser.spec-RQEAYFX6.js} +12 -12
  146. package/dist/{grin2-AVOQ72HB.js → grin2-DE4XGJOR.js} +4 -4
  147. package/dist/{grin2-6UE4RAUN.js → grin2-L56BZ4QQ.js} +4 -4
  148. package/dist/{gsea-DSH65VZV.js → gsea-AJ55WFRH.js} +6 -6
  149. package/dist/{hierCluster-CBJNAPXZ.js → hierCluster-PPT5QQVX.js} +14 -14
  150. package/dist/{hierCluster-NXDHQTTT.js → hierCluster-QYDI3I67.js} +13 -13
  151. package/dist/{hierCluster.config-3BIJ7HNK.js → hierCluster.config-IQZALO77.js} +6 -6
  152. package/dist/{hierCluster.integration.spec-AEGAT3F4.js → hierCluster.integration.spec-MCNZSMPI.js} +14 -14
  153. package/dist/{hierCluster.interactivity-V7HV5ELW.js → hierCluster.interactivity-SLJXC4UE.js} +5 -5
  154. package/dist/{imagePlot-I4WZTPET.js → imagePlot-N5ZWTUAH.js} +5 -5
  155. package/dist/importPlot-M6GKP2W5.js +8 -0
  156. package/dist/{launch.adhoc-RDQMGMWO.js → launch.adhoc-JCV5VQMQ.js} +7 -7
  157. package/dist/{leftlabel.sample-SUXEIOQ2.js → leftlabel.sample-6NEERDOO.js} +8 -8
  158. package/dist/{lollipop-TE4YXO5H.js → lollipop-IAEPMLYV.js} +6 -6
  159. package/dist/{maf-BUCGAAT3.js → maf-S6WPKAEI.js} +4 -4
  160. package/dist/{maftimeline-IKWNA3CU.js → maftimeline-ZILUGRGK.js} +4 -4
  161. package/dist/{matrix-76CVSPEO.js → matrix-6Q7WDAFL.js} +11 -11
  162. package/dist/{matrix-O6CTVV5P.js → matrix-OEXWXOP3.js} +11 -11
  163. package/dist/{matrix.config-A4GL7AOO.js → matrix.config-MOEVHOKG.js} +5 -5
  164. package/dist/{matrix.controls-RIO6AGIN.js → matrix.controls-CAHLSBNK.js} +5 -5
  165. package/dist/{matrix.data-EVSUEYAE.js → matrix.data-RDLMLPI7.js} +5 -5
  166. package/dist/{matrix.integration.spec-GJATCPXR.js → matrix.integration.spec-KMNWBLPK.js} +12 -12
  167. package/dist/{matrix.interactivity-BDI46QOJ.js → matrix.interactivity-MGBGPMAX.js} +5 -5
  168. package/dist/{matrix.layout-5MAJZQ43.js → matrix.layout-HUZIVA5L.js} +5 -5
  169. package/dist/{matrix.renderers-U5BXAGLE.js → matrix.renderers-GS65EJLL.js} +5 -5
  170. package/dist/{matrix.sort.unit.spec-R26PFWQM.js → matrix.sort.unit.spec-WGTGN2QP.js} +5 -5
  171. package/dist/{matrix.sorterUi.unit.spec-QBZECV7P.js → matrix.sorterUi.unit.spec-23UNNE3M.js} +5 -5
  172. package/dist/{mavb-3UDTBUGW.js → mavb-LODCREKA.js} +5 -5
  173. package/dist/{mds.fimo-UY2ZIMSH.js → mds.fimo-MQQUUBVP.js} +4 -4
  174. package/dist/{mds.samplescatterplot-UE5B2SBK.js → mds.samplescatterplot-CI4OQKS6.js} +6 -6
  175. package/dist/{mds.survivalplot-5CMVRVTM.js → mds.survivalplot-FUGCHYWY.js} +4 -4
  176. package/dist/{oncomatrix-AXYPV3KI.js → oncomatrix-C5BQUSK6.js} +6 -6
  177. package/dist/{oncomatrix.spec-WLB4CGQU.js → oncomatrix.spec-7PD4HDB7.js} +12 -12
  178. package/dist/{plot.2dvaf-5RMILSEK.js → plot.2dvaf-CTVCB6JU.js} +4 -4
  179. package/dist/{plot.app-PZAOK7XL.js → plot.app-FHUL6SFH.js} +6 -6
  180. package/dist/{plot.barplot-UKWGKYC3.js → plot.barplot-L3PJB4KW.js} +4 -4
  181. package/dist/{plot.boxplot-VU6BG3MI.js → plot.boxplot-BGC2HDPR.js} +4 -4
  182. package/dist/{plot.brainImaging-T22K5X3S.js → plot.brainImaging-2XLM4V34.js} +2 -2
  183. package/dist/{plot.disco-BOW777AK.js → plot.disco-DNMOOCA7.js} +3 -3
  184. package/dist/{plot.dzi-S7Y6FJGL.js → plot.dzi-IH46MTZD.js} +2 -2
  185. package/dist/{plot.ssgq-LIEYVBR6.js → plot.ssgq-ILRGZS4T.js} +5 -5
  186. package/dist/{plot.vaf2cov-D73PXD5L.js → plot.vaf2cov-ZUUYJ3GI.js} +4 -4
  187. package/dist/{plot.wsi-2VPM63LA.js → plot.wsi-OGXNZSKK.js} +2 -2
  188. package/dist/{polar-STAH5F35.js → polar-WOMWDUD2.js} +5 -5
  189. package/dist/{profile.spec-XFSONNLP.js → profile.spec-OLOTKJVD.js} +12 -12
  190. package/dist/{profileBarchart-2JN27FI4.js → profileBarchart-OBDEZ27I.js} +5 -5
  191. package/dist/{profileForms-7PMEUPP7.js → profileForms-ZZ7YIQ36.js} +5 -5
  192. package/dist/{profilePlot-UPALYU2Q.js → profilePlot-US5UJYOA.js} +5 -5
  193. package/dist/{profileRadar-IT3LYZP4.js → profileRadar-CEN3RFAR.js} +5 -5
  194. package/dist/{profileRadarFacility-EW7CQXG2.js → profileRadarFacility-VDZYO7YO.js} +5 -5
  195. package/dist/{qualitative-FMOWJOXQ.js → qualitative-M6CWWFC6.js} +4 -4
  196. package/dist/{regression-ITL3U2EL.js → regression-WF6N7Y5S.js} +12 -12
  197. package/dist/{regression.inputs-NWQHJ6G3.js → regression.inputs-F5OYIY3J.js} +12 -12
  198. package/dist/{regression.inputs.term-VDHB4YSR.js → regression.inputs.term-33DOYIUB.js} +12 -12
  199. package/dist/{regression.inputs.values.table-MKCWTT2A.js → regression.inputs.values.table-FP2WOOT4.js} +10 -10
  200. package/dist/{regression.integration.spec-KFTA75KY.js → regression.integration.spec-JH5S3AC5.js} +12 -12
  201. package/dist/{regression.results-6HXJEZJB.js → regression.results-KDQUSCGI.js} +5 -5
  202. package/dist/{regression.spec-HRN2FWBA.js → regression.spec-SCRNOUAB.js} +12 -12
  203. package/dist/{report-35PFVBNA.js → report-324E5SNK.js} +4 -4
  204. package/dist/{runChart-JWW6ZHI2.js → runChart-VQSB727Z.js} +9 -9
  205. package/dist/{runchart.integration.spec-WNLCAF2H.js → runchart.integration.spec-AGPF7GPS.js} +12 -12
  206. package/dist/{sampleScatter.spec-YXPZONTC.js → sampleScatter.spec-3XTTIYTV.js} +12 -12
  207. package/dist/{sampleView-OOCJNAVK.js → sampleView-6MMGODPU.js} +5 -5
  208. package/dist/{samplelst-O6Q2QZ2S.js → samplelst-GH2MNWVY.js} +4 -4
  209. package/dist/{samplematrix-GAR2PBNX.js → samplematrix-W6OJWXC3.js} +6 -6
  210. package/dist/{scatter-V5VQRIWJ.js → scatter-KSZ6Y6OE.js} +8 -8
  211. package/dist/{scatter.integration.spec-M6KI4ZMN.js → scatter.integration.spec-45EE2OG3.js} +12 -12
  212. package/dist/{selectGenomeWithTklst-LF52E5F5.js → selectGenomeWithTklst-KBUDGZ7D.js} +5 -5
  213. package/dist/{singleCellPlot-R7V7MTIA.js → singleCellPlot-KIQULD32.js} +6 -6
  214. package/dist/{singlecell-OGT4OAEV.js → singlecell-7XHCWR4N.js} +6 -6
  215. package/dist/{singlecell-QGKFM6CJ.js → singlecell-VUVDCNWO.js} +7 -7
  216. package/dist/{snp-6WCLJX44.js → snp-R3P5LKYY.js} +4 -4
  217. package/dist/{snplocus-BQZ72QBQ.js → snplocus-JZHQFYHR.js} +4 -4
  218. package/dist/{spliceevent.a53ss.diagram-3EGT2GQA.js → spliceevent.a53ss.diagram-ED2IUEA4.js} +4 -4
  219. package/dist/{spliceevent.exonskip.diagram-DPQPG2HL.js → spliceevent.exonskip.diagram-AB2W56TC.js} +5 -5
  220. package/dist/{spliceevent.noeventdiagram-Y5MP7F2C.js → spliceevent.noeventdiagram-2B6WTPET.js} +4 -4
  221. package/dist/{ssGSEA-LRXFLZQ4.js → ssGSEA-P2OODCHX.js} +4 -4
  222. package/dist/{summarizeCnvGeneexp-J3NOFHHT.js → summarizeCnvGeneexp-FO34AWQG.js} +5 -5
  223. package/dist/{summarizeGeneexpSurvival-EGHTXLLP.js → summarizeGeneexpSurvival-VXS3WSUV.js} +6 -6
  224. package/dist/{summarizeMutationCnv-AMTGYZ6V.js → summarizeMutationCnv-M37KCBC3.js} +5 -5
  225. package/dist/{summarizeMutationDiagnosis-7ZS2FUPE.js → summarizeMutationDiagnosis-J4SBRTLU.js} +5 -5
  226. package/dist/{summarizeMutationSurvival-Z5STBDYF.js → summarizeMutationSurvival-J4UXVZDX.js} +5 -5
  227. package/dist/{summary-YLRI3A3E.js → summary-3PHQGXKZ.js} +12 -12
  228. package/dist/{summary.integration.spec-5ONC3S54.js → summary.integration.spec-H36BGFOG.js} +12 -12
  229. package/dist/{summaryInput-3ZSTIE5B.js → summaryInput-GYLEJI77.js} +5 -5
  230. package/dist/{sunburst-DRZZYAUH.js → sunburst-6BFBLU4S.js} +4 -4
  231. package/dist/{survival-PJKJ2Z4B.js → survival-2W2NCKW4.js} +4 -4
  232. package/dist/{survival-5E2VV46S.js → survival-RN45E7SJ.js} +5 -5
  233. package/dist/{survival.integration.spec-ZHEVVSFI.js → survival.integration.spec-6VMFUP74.js} +12 -12
  234. package/dist/{svgraph-EV7XM3VZ.js → svgraph-JNLSQFOO.js} +4 -4
  235. package/dist/{svmr-NMNGV2TY.js → svmr-C6KXEPIR.js} +7 -7
  236. package/dist/{table-VJ44XPYD.js → table-DQ5AJKWK.js} +4 -4
  237. package/dist/{termCollection-NDLSU6NG.js → termCollection-7RP3PPUZ.js} +4 -4
  238. package/dist/{termCollection-4W246ZOD.js → termCollection-HTPTRUYP.js} +4 -4
  239. package/dist/{tk-4BT462Y4.js → tk-GE3XCT4W.js} +8 -8
  240. package/dist/{tp.ui-DIBDS4SM.js → tp.ui-AVJ26PGA.js} +13 -13
  241. package/dist/{tvs.dt-UYO4LYVG.js → tvs.dt-RIWQXAA2.js} +4 -4
  242. package/dist/{tvs.dtcnv.categorical-4EGZBKKS.js → tvs.dtcnv.categorical-NIYLISRH.js} +4 -4
  243. package/dist/{tvs.dtcnv.continuous-MEQFAQVF.js → tvs.dtcnv.continuous-OXMJVTSG.js} +4 -4
  244. package/dist/{tvs.dtfusion-FSTZOHJM.js → tvs.dtfusion-B4QGYUNU.js} +4 -4
  245. package/dist/{tvs.dtsnvindel-A4GY67UR.js → tvs.dtsnvindel-ZAZCES5T.js} +4 -4
  246. package/dist/{tvs.dtsv-OM7BHPB2.js → tvs.dtsv-SOBS7E7L.js} +4 -4
  247. package/dist/{tvs.samplelst-S5UQ75LK.js → tvs.samplelst-4SLFLDND.js} +4 -4
  248. package/dist/{tvs.termCollection-4L6QFRPQ.js → tvs.termCollection-SDTPHI57.js} +4 -4
  249. package/dist/{violin-FURRSD5E.js → violin-HRUVZFHW.js} +7 -7
  250. package/dist/{violin.integration.spec-KBG52YHF.js → violin.integration.spec-AWCNW6AR.js} +12 -12
  251. package/dist/{violin.interactivity-FYGFPTHW.js → violin.interactivity-OEVSVKRZ.js} +5 -5
  252. package/dist/{violin.renderer-GUZZ7F7D.js → violin.renderer-F4Z5ISZQ.js} +5 -5
  253. package/dist/{vocabulary-PJOKSM2P.js → vocabulary-BWJMHEDD.js} +4 -4
  254. package/package.json +1 -1
  255. package/dist/chunk-HJGGXQZ5.js.map +0 -7
  256. package/dist/chunk-VCZZ6N2C.js.map +0 -7
  257. package/dist/importPlot-LCTQOZHQ.js +0 -8
  258. /package/dist/{2dmaf-JJJS4QVZ.js.map → 2dmaf-34YUEZHQ.js.map} +0 -0
  259. /package/dist/{AIProjectAdmin-3XJ5FSVS.js.map → AIProjectAdmin-VRXXHIFV.js.map} +0 -0
  260. /package/dist/{AppHeader-4NPOF5JL.js.map → AppHeader-GIIEJQ6G.js.map} +0 -0
  261. /package/dist/{CorrelationVolcano-MNJFOMTY.js.map → CorrelationVolcano-2X5R5AXL.js.map} +0 -0
  262. /package/dist/{DifferentialAnalysis-5AK56UX2.js.map → DifferentialAnalysis-HLIJ5KLU.js.map} +0 -0
  263. /package/dist/{Disco-4GZNRD6P.js.map → Disco-35YLYFIA.js.map} +0 -0
  264. /package/dist/{Disco.UI-7H7MTXBB.js.map → Disco.UI-OXZSKCU2.js.map} +0 -0
  265. /package/dist/{GB-HFDALSUS.js.map → GB-NQPJHMPD.js.map} +0 -0
  266. /package/dist/{HicApp-UY5NMHEC.js.map → HicApp-E6X52JL7.js.map} +0 -0
  267. /package/dist/{NumBinaryEditor-NG2TZ2GI.js.map → NumBinaryEditor-HSSHXWEO.js.map} +0 -0
  268. /package/dist/{NumBinaryEditor.unit.spec-JO37G4JD.js.map → NumBinaryEditor.unit.spec-ORACGYQ3.js.map} +0 -0
  269. /package/dist/{NumContEditor-APKF4RPR.js.map → NumContEditor-IFTY2CZO.js.map} +0 -0
  270. /package/dist/{NumContEditor.unit.spec-UFWELETU.js.map → NumContEditor.unit.spec-O5OWM2RE.js.map} +0 -0
  271. /package/dist/{NumCustomBinEditor-BBTS4FB7.js.map → NumCustomBinEditor-6OX4S7FU.js.map} +0 -0
  272. /package/dist/{NumCustomBinEditor.unit.spec-BMFY2CI4.js.map → NumCustomBinEditor.unit.spec-OKIFZGGB.js.map} +0 -0
  273. /package/dist/{NumDiscreteEditor-POHQOWFG.js.map → NumDiscreteEditor-MT4GWFE6.js.map} +0 -0
  274. /package/dist/{NumDiscreteEditor.unit.spec-G5KDFODT.js.map → NumDiscreteEditor.unit.spec-4W3UZCPM.js.map} +0 -0
  275. /package/dist/{NumRegularBinEditor-DH4BA72V.js.map → NumRegularBinEditor-XXXIJTP4.js.map} +0 -0
  276. /package/dist/{NumRegularBinEditor.unit.spec-P2AZO6M3.js.map → NumRegularBinEditor.unit.spec-PZXPUOBD.js.map} +0 -0
  277. /package/dist/{NumSplineEditor-KLX4KE72.js.map → NumSplineEditor-QX546RZL.js.map} +0 -0
  278. /package/dist/{NumSplineEditor.unit.spec-PTU6XM22.js.map → NumSplineEditor.unit.spec-VAOQ7273.js.map} +0 -0
  279. /package/dist/{NumericDensity-XBMTLG3X.js.map → NumericDensity-LIHDJBRQ.js.map} +0 -0
  280. /package/dist/{NumericDensity.unit.spec-22N4OE5T.js.map → NumericDensity.unit.spec-4PYE3JBB.js.map} +0 -0
  281. /package/dist/{NumericHandler-SYGKJ6DT.js.map → NumericHandler-DNYVU5UY.js.map} +0 -0
  282. /package/dist/{NumericHandler.unit.spec-VIVKWJFQ.js.map → NumericHandler.unit.spec-RFHH47JL.js.map} +0 -0
  283. /package/dist/{SC-Y43YK5DP.js.map → SC-4VXXALEM.js.map} +0 -0
  284. /package/dist/{Volcano-M7OLHCPE.js.map → Volcano-WETY43EN.js.map} +0 -0
  285. /package/dist/{WSIViewer-CCLP4YLK.js.map → WSIViewer-MR22OWBJ.js.map} +0 -0
  286. /package/dist/{WsiSamplesPlot-M23PW47B.js.map → WsiSamplesPlot-PSP7GF4X.js.map} +0 -0
  287. /package/dist/{adSandbox-EGDXUDB3.js.map → adSandbox-7OQBUMRO.js.map} +0 -0
  288. /package/dist/{alphaGenome-OKJZZD6U.js.map → alphaGenome-PXPFF57K.js.map} +0 -0
  289. /package/dist/{app-5OQVO6PL.js.map → app-76R7LNF4.js.map} +0 -0
  290. /package/dist/{app-WTWHDUA6.js.map → app-HRSWWPMQ.js.map} +0 -0
  291. /package/dist/{bam-T7TZ5TDR.js.map → bam-B2R3LWIE.js.map} +0 -0
  292. /package/dist/{barchart-4VEUHJPT.js.map → barchart-AASIQC7G.js.map} +0 -0
  293. /package/dist/{barchart.data-WQ3FQSKT.js.map → barchart.data-ZWZYDBRD.js.map} +0 -0
  294. /package/dist/{barchart.events-IH7LKBIC.js.map → barchart.events-DA6VDPX7.js.map} +0 -0
  295. /package/dist/{barchart.integration.spec-SAMY5MQF.js.map → barchart.integration.spec-NRBT7G7Q.js.map} +0 -0
  296. /package/dist/{block-WCLO3QIC.js.map → block-JKEP3VXL.js.map} +0 -0
  297. /package/dist/{block.init-4WT3S577.js.map → block.init-AUY5L6YJ.js.map} +0 -0
  298. /package/dist/{block.mds.expressionrank-QBHPR47Q.js.map → block.mds.expressionrank-KWVC5JS2.js.map} +0 -0
  299. /package/dist/{block.mds.geneboxplot-HV3II4OK.js.map → block.mds.geneboxplot-EB54VBTN.js.map} +0 -0
  300. /package/dist/{block.mds.junction-3LHN52D5.js.map → block.mds.junction-UGKF2BV3.js.map} +0 -0
  301. /package/dist/{block.mds.svcnv-RRF65XFP.js.map → block.mds.svcnv-ZCOKOV4B.js.map} +0 -0
  302. /package/dist/{block.svg-4WKDJEJ3.js.map → block.svg-WPYUWSS7.js.map} +0 -0
  303. /package/dist/{block.tk.aicheck-RAXM2H5R.js.map → block.tk.aicheck-AR32ODDQ.js.map} +0 -0
  304. /package/dist/{block.tk.ase-VX2BVYWG.js.map → block.tk.ase-CMJJOTS7.js.map} +0 -0
  305. /package/dist/{block.tk.bam-Q7QD7HJB.js.map → block.tk.bam-7KOWHAYI.js.map} +0 -0
  306. /package/dist/{block.tk.bedgraphdot-55T3BBT7.js.map → block.tk.bedgraphdot-FI4ILOEU.js.map} +0 -0
  307. /package/dist/{block.tk.bigwig.ui-NTYYOWRQ.js.map → block.tk.bigwig.ui-SYXMZVMS.js.map} +0 -0
  308. /package/dist/{block.tk.hicstraw-CF6K5Y24.js.map → block.tk.hicstraw-SLMWXBPU.js.map} +0 -0
  309. /package/dist/{block.tk.junction-6FC5K7BL.js.map → block.tk.junction-POPMPYSD.js.map} +0 -0
  310. /package/dist/{block.tk.junction.textmatrixui-ZR4OVUTN.js.map → block.tk.junction.textmatrixui-FN6ECUYF.js.map} +0 -0
  311. /package/dist/{block.tk.ld-2JULMODC.js.map → block.tk.ld-AZ4QYFYM.js.map} +0 -0
  312. /package/dist/{block.tk.menu-EOA76JET.js.map → block.tk.menu-75RTVRAP.js.map} +0 -0
  313. /package/dist/{block.tk.pgv-36PO7DI4.js.map → block.tk.pgv-DBR5YJZC.js.map} +0 -0
  314. /package/dist/{brainImaging-MNUU3ZLR.js.map → brainImaging-6ULOIHMJ.js.map} +0 -0
  315. /package/dist/{chat-4NOH35JY.js.map → chat-UFNVMQCI.js.map} +0 -0
  316. /package/dist/{chunk-NJKN6DAK.js.map → chunk-2E3IOEPG.js.map} +0 -0
  317. /package/dist/{chunk-VMVBUU63.js.map → chunk-37UC4HE6.js.map} +0 -0
  318. /package/dist/{chunk-TADFLIQ5.js.map → chunk-3AS3GUYM.js.map} +0 -0
  319. /package/dist/{chunk-SV6N2HNL.js.map → chunk-3XB3AQFN.js.map} +0 -0
  320. /package/dist/{chunk-VCZQJQIS.js.map → chunk-44NYI4TU.js.map} +0 -0
  321. /package/dist/{chunk-CLNRUJ2N.js.map → chunk-4HTXTTEC.js.map} +0 -0
  322. /package/dist/{chunk-23TOE33H.js.map → chunk-64HDX7DO.js.map} +0 -0
  323. /package/dist/{chunk-TEERDYUS.js.map → chunk-6LEQKBLY.js.map} +0 -0
  324. /package/dist/{chunk-5KBEMRSI.js.map → chunk-6PK4CX2S.js.map} +0 -0
  325. /package/dist/{chunk-AZ5J32KP.js.map → chunk-AJ5A3AO4.js.map} +0 -0
  326. /package/dist/{chunk-PWNZL5IJ.js.map → chunk-AZ5QVEBH.js.map} +0 -0
  327. /package/dist/{chunk-H3DCEJBL.js.map → chunk-BJAGRLOF.js.map} +0 -0
  328. /package/dist/{chunk-E3IIUVLZ.js.map → chunk-BVX5P3NZ.js.map} +0 -0
  329. /package/dist/{chunk-E4KVO2QB.js.map → chunk-CFMGZEKV.js.map} +0 -0
  330. /package/dist/{chunk-J24OUE4D.js.map → chunk-ERP3OM7Y.js.map} +0 -0
  331. /package/dist/{chunk-4XLDP35V.js.map → chunk-FOMCTGFF.js.map} +0 -0
  332. /package/dist/{chunk-P6LSONHQ.js.map → chunk-GCLB7V7Q.js.map} +0 -0
  333. /package/dist/{chunk-OIB5C2RK.js.map → chunk-GSFAQS6X.js.map} +0 -0
  334. /package/dist/{chunk-5DYBCPJ6.js.map → chunk-GWJQSTLK.js.map} +0 -0
  335. /package/dist/{chunk-GYJW2AB2.js.map → chunk-HCEGGN4N.js.map} +0 -0
  336. /package/dist/{chunk-D7QK5NTL.js.map → chunk-HDR6NCOK.js.map} +0 -0
  337. /package/dist/{chunk-BUQ7S2O2.js.map → chunk-J7BZTO5G.js.map} +0 -0
  338. /package/dist/{chunk-PHHTY45N.js.map → chunk-JUIPKB3J.js.map} +0 -0
  339. /package/dist/{chunk-25MV7QKV.js.map → chunk-LFZPQ6HQ.js.map} +0 -0
  340. /package/dist/{chunk-X2J3DJX2.js.map → chunk-MI6EULGM.js.map} +0 -0
  341. /package/dist/{chunk-24O5JOP7.js.map → chunk-MVW6VLUM.js.map} +0 -0
  342. /package/dist/{chunk-WHJTQR5P.js.map → chunk-NCQBBILL.js.map} +0 -0
  343. /package/dist/{chunk-QAVBHPY3.js.map → chunk-NJ35ODQA.js.map} +0 -0
  344. /package/dist/{chunk-7JNJ5LHM.js.map → chunk-NZQ3FUKO.js.map} +0 -0
  345. /package/dist/{chunk-UJ5E5OSU.js.map → chunk-OOY2W6D7.js.map} +0 -0
  346. /package/dist/{chunk-FXA25J4U.js.map → chunk-P5W3KHMX.js.map} +0 -0
  347. /package/dist/{chunk-MW5SFVPY.js.map → chunk-PJ2VOA2U.js.map} +0 -0
  348. /package/dist/{chunk-K5DHHUJL.js.map → chunk-QXISDZW5.js.map} +0 -0
  349. /package/dist/{chunk-U3EF5DDC.js.map → chunk-RVSESNWL.js.map} +0 -0
  350. /package/dist/{chunk-JJKZRFLM.js.map → chunk-RZUPOEMN.js.map} +0 -0
  351. /package/dist/{chunk-DP5T33IU.js.map → chunk-TMI2Q2NW.js.map} +0 -0
  352. /package/dist/{chunk-YIS337R3.js.map → chunk-TUDPQS4A.js.map} +0 -0
  353. /package/dist/{chunk-BBEESEQM.js.map → chunk-VBAW4JG7.js.map} +0 -0
  354. /package/dist/{chunk-MT3BM3MJ.js.map → chunk-VFQW5YCN.js.map} +0 -0
  355. /package/dist/{chunk-MTHJNV5B.js.map → chunk-VIJOC6L2.js.map} +0 -0
  356. /package/dist/{chunk-76THLD6X.js.map → chunk-VITFCJIU.js.map} +0 -0
  357. /package/dist/{chunk-KRAEDA33.js.map → chunk-VYBP7AT5.js.map} +0 -0
  358. /package/dist/{chunk-7QW52A66.js.map → chunk-WZMO7Z2H.js.map} +0 -0
  359. /package/dist/{chunk-CUVPRGNE.js.map → chunk-XLHV2JEG.js.map} +0 -0
  360. /package/dist/{chunk-EJSNAJBJ.js.map → chunk-YD4QI2UP.js.map} +0 -0
  361. /package/dist/{chunk-FYJDO2WJ.js.map → chunk-YLQ5P6PZ.js.map} +0 -0
  362. /package/dist/{chunk-BJANTR6U.js.map → chunk-YOAVLKDS.js.map} +0 -0
  363. /package/dist/{chunk-HV46AUOB.js.map → chunk-Z76EKBGS.js.map} +0 -0
  364. /package/dist/{chunk-34KY6AZP.js.map → chunk-ZNJ46D22.js.map} +0 -0
  365. /package/dist/{chunk-KSIPOBZV.js.map → chunk-ZQPDDXL5.js.map} +0 -0
  366. /package/dist/{condition-NZ2ILZXY.js.map → condition-S6IF36PG.js.map} +0 -0
  367. /package/dist/{controls-PG7TO24T.js.map → controls-5FVCQT7E.js.map} +0 -0
  368. /package/dist/{controls.config-ACGSBAYN.js.map → controls.config-QEVAMKQS.js.map} +0 -0
  369. /package/dist/{correlation-A6FKTPWF.js.map → correlation-J5ODM6PI.js.map} +0 -0
  370. /package/dist/{cuminc-SJMGX2HP.js.map → cuminc-P6GA5DYB.js.map} +0 -0
  371. /package/dist/{cuminc.integration.spec-DNSJWVIE.js.map → cuminc.integration.spec-XQOAHBYQ.js.map} +0 -0
  372. /package/dist/{customdata.inputui-AGUP5ART.js.map → customdata.inputui-2WGM334T.js.map} +0 -0
  373. /package/dist/{dataDownload-CA5WRH3P.js.map → dataDownload-Q7UVOFEC.js.map} +0 -0
  374. /package/dist/{dataDownload.integration.spec-LZAHLQE3.js.map → dataDownload.integration.spec-SUTF6CBZ.js.map} +0 -0
  375. /package/dist/{databrowser.ui-PEG4G3ZA.js.map → databrowser.ui-VQ6VAOBI.js.map} +0 -0
  376. /package/dist/{dictionary-ZSDMCWGL.js.map → dictionary-PE6CJMLE.js.map} +0 -0
  377. /package/dist/{e2pca-JKZ4UGY6.js.map → e2pca-7VH4CSSV.js.map} +0 -0
  378. /package/dist/{ep-HC5VXXOI.js.map → ep-WX5KI45A.js.map} +0 -0
  379. /package/dist/{expclust.gdc.spec-ZK25SL6N.js.map → expclust.gdc.spec-OAFXEPQX.js.map} +0 -0
  380. /package/dist/{facet-35PKFEQB.js.map → facet-TS5LRQMO.js.map} +0 -0
  381. /package/dist/{frequencyChart-HMHTNPRC.js.map → frequencyChart-RKUS77AW.js.map} +0 -0
  382. /package/dist/{frequencyChart.integration.spec-ZXY2FVFA.js.map → frequencyChart.integration.spec-D2JZW4VS.js.map} +0 -0
  383. /package/dist/{geneExpClustering-QHM4UB4H.js.map → geneExpClustering-X3QVXV56.js.map} +0 -0
  384. /package/dist/{geneExpression-OBT7MUYM.js.map → geneExpression-A3TOFOGG.js.map} +0 -0
  385. /package/dist/{geneExpression-BCHU3MRB.js.map → geneExpression-KHDBS2HX.js.map} +0 -0
  386. /package/dist/{geneORA-ZJHKXCKH.js.map → geneORA-PG3JWWCY.js.map} +0 -0
  387. /package/dist/{geneVariant-GXZSQXRM.js.map → geneVariant-QAUEUXA5.js.map} +0 -0
  388. /package/dist/{geneVariant-J35SE6LY.js.map → geneVariant-ZACCSX4Z.js.map} +0 -0
  389. /package/dist/{genefusion.ui-V4BA24JW.js.map → genefusion.ui-S4TSFJQ7.js.map} +0 -0
  390. /package/dist/{geneset-TVFHJSFS.js.map → geneset-OSQPXKU5.js.map} +0 -0
  391. /package/dist/{genomeBrowser.spec-W4GLAWAW.js.map → genomeBrowser.spec-RQEAYFX6.js.map} +0 -0
  392. /package/dist/{grin2-AVOQ72HB.js.map → grin2-DE4XGJOR.js.map} +0 -0
  393. /package/dist/{grin2-6UE4RAUN.js.map → grin2-L56BZ4QQ.js.map} +0 -0
  394. /package/dist/{gsea-DSH65VZV.js.map → gsea-AJ55WFRH.js.map} +0 -0
  395. /package/dist/{hierCluster-CBJNAPXZ.js.map → hierCluster-PPT5QQVX.js.map} +0 -0
  396. /package/dist/{hierCluster-NXDHQTTT.js.map → hierCluster-QYDI3I67.js.map} +0 -0
  397. /package/dist/{hierCluster.config-3BIJ7HNK.js.map → hierCluster.config-IQZALO77.js.map} +0 -0
  398. /package/dist/{hierCluster.integration.spec-AEGAT3F4.js.map → hierCluster.integration.spec-MCNZSMPI.js.map} +0 -0
  399. /package/dist/{hierCluster.interactivity-V7HV5ELW.js.map → hierCluster.interactivity-SLJXC4UE.js.map} +0 -0
  400. /package/dist/{imagePlot-I4WZTPET.js.map → imagePlot-N5ZWTUAH.js.map} +0 -0
  401. /package/dist/{importPlot-LCTQOZHQ.js.map → importPlot-M6GKP2W5.js.map} +0 -0
  402. /package/dist/{launch.adhoc-RDQMGMWO.js.map → launch.adhoc-JCV5VQMQ.js.map} +0 -0
  403. /package/dist/{leftlabel.sample-SUXEIOQ2.js.map → leftlabel.sample-6NEERDOO.js.map} +0 -0
  404. /package/dist/{lollipop-TE4YXO5H.js.map → lollipop-IAEPMLYV.js.map} +0 -0
  405. /package/dist/{maf-BUCGAAT3.js.map → maf-S6WPKAEI.js.map} +0 -0
  406. /package/dist/{maftimeline-IKWNA3CU.js.map → maftimeline-ZILUGRGK.js.map} +0 -0
  407. /package/dist/{matrix-76CVSPEO.js.map → matrix-6Q7WDAFL.js.map} +0 -0
  408. /package/dist/{matrix-O6CTVV5P.js.map → matrix-OEXWXOP3.js.map} +0 -0
  409. /package/dist/{matrix.config-A4GL7AOO.js.map → matrix.config-MOEVHOKG.js.map} +0 -0
  410. /package/dist/{matrix.controls-RIO6AGIN.js.map → matrix.controls-CAHLSBNK.js.map} +0 -0
  411. /package/dist/{matrix.data-EVSUEYAE.js.map → matrix.data-RDLMLPI7.js.map} +0 -0
  412. /package/dist/{matrix.integration.spec-GJATCPXR.js.map → matrix.integration.spec-KMNWBLPK.js.map} +0 -0
  413. /package/dist/{matrix.interactivity-BDI46QOJ.js.map → matrix.interactivity-MGBGPMAX.js.map} +0 -0
  414. /package/dist/{matrix.layout-5MAJZQ43.js.map → matrix.layout-HUZIVA5L.js.map} +0 -0
  415. /package/dist/{matrix.renderers-U5BXAGLE.js.map → matrix.renderers-GS65EJLL.js.map} +0 -0
  416. /package/dist/{matrix.sort.unit.spec-R26PFWQM.js.map → matrix.sort.unit.spec-WGTGN2QP.js.map} +0 -0
  417. /package/dist/{matrix.sorterUi.unit.spec-QBZECV7P.js.map → matrix.sorterUi.unit.spec-23UNNE3M.js.map} +0 -0
  418. /package/dist/{mavb-3UDTBUGW.js.map → mavb-LODCREKA.js.map} +0 -0
  419. /package/dist/{mds.fimo-UY2ZIMSH.js.map → mds.fimo-MQQUUBVP.js.map} +0 -0
  420. /package/dist/{mds.samplescatterplot-UE5B2SBK.js.map → mds.samplescatterplot-CI4OQKS6.js.map} +0 -0
  421. /package/dist/{mds.survivalplot-5CMVRVTM.js.map → mds.survivalplot-FUGCHYWY.js.map} +0 -0
  422. /package/dist/{oncomatrix-AXYPV3KI.js.map → oncomatrix-C5BQUSK6.js.map} +0 -0
  423. /package/dist/{oncomatrix.spec-WLB4CGQU.js.map → oncomatrix.spec-7PD4HDB7.js.map} +0 -0
  424. /package/dist/{plot.2dvaf-5RMILSEK.js.map → plot.2dvaf-CTVCB6JU.js.map} +0 -0
  425. /package/dist/{plot.app-PZAOK7XL.js.map → plot.app-FHUL6SFH.js.map} +0 -0
  426. /package/dist/{plot.barplot-UKWGKYC3.js.map → plot.barplot-L3PJB4KW.js.map} +0 -0
  427. /package/dist/{plot.boxplot-VU6BG3MI.js.map → plot.boxplot-BGC2HDPR.js.map} +0 -0
  428. /package/dist/{plot.brainImaging-T22K5X3S.js.map → plot.brainImaging-2XLM4V34.js.map} +0 -0
  429. /package/dist/{plot.disco-BOW777AK.js.map → plot.disco-DNMOOCA7.js.map} +0 -0
  430. /package/dist/{plot.dzi-S7Y6FJGL.js.map → plot.dzi-IH46MTZD.js.map} +0 -0
  431. /package/dist/{plot.ssgq-LIEYVBR6.js.map → plot.ssgq-ILRGZS4T.js.map} +0 -0
  432. /package/dist/{plot.vaf2cov-D73PXD5L.js.map → plot.vaf2cov-ZUUYJ3GI.js.map} +0 -0
  433. /package/dist/{plot.wsi-2VPM63LA.js.map → plot.wsi-OGXNZSKK.js.map} +0 -0
  434. /package/dist/{polar-STAH5F35.js.map → polar-WOMWDUD2.js.map} +0 -0
  435. /package/dist/{profile.spec-XFSONNLP.js.map → profile.spec-OLOTKJVD.js.map} +0 -0
  436. /package/dist/{profileBarchart-2JN27FI4.js.map → profileBarchart-OBDEZ27I.js.map} +0 -0
  437. /package/dist/{profileForms-7PMEUPP7.js.map → profileForms-ZZ7YIQ36.js.map} +0 -0
  438. /package/dist/{profilePlot-UPALYU2Q.js.map → profilePlot-US5UJYOA.js.map} +0 -0
  439. /package/dist/{profileRadar-IT3LYZP4.js.map → profileRadar-CEN3RFAR.js.map} +0 -0
  440. /package/dist/{profileRadarFacility-EW7CQXG2.js.map → profileRadarFacility-VDZYO7YO.js.map} +0 -0
  441. /package/dist/{qualitative-FMOWJOXQ.js.map → qualitative-M6CWWFC6.js.map} +0 -0
  442. /package/dist/{regression-ITL3U2EL.js.map → regression-WF6N7Y5S.js.map} +0 -0
  443. /package/dist/{regression.inputs-NWQHJ6G3.js.map → regression.inputs-F5OYIY3J.js.map} +0 -0
  444. /package/dist/{regression.inputs.term-VDHB4YSR.js.map → regression.inputs.term-33DOYIUB.js.map} +0 -0
  445. /package/dist/{regression.inputs.values.table-MKCWTT2A.js.map → regression.inputs.values.table-FP2WOOT4.js.map} +0 -0
  446. /package/dist/{regression.integration.spec-KFTA75KY.js.map → regression.integration.spec-JH5S3AC5.js.map} +0 -0
  447. /package/dist/{regression.results-6HXJEZJB.js.map → regression.results-KDQUSCGI.js.map} +0 -0
  448. /package/dist/{regression.spec-HRN2FWBA.js.map → regression.spec-SCRNOUAB.js.map} +0 -0
  449. /package/dist/{report-35PFVBNA.js.map → report-324E5SNK.js.map} +0 -0
  450. /package/dist/{runChart-JWW6ZHI2.js.map → runChart-VQSB727Z.js.map} +0 -0
  451. /package/dist/{runchart.integration.spec-WNLCAF2H.js.map → runchart.integration.spec-AGPF7GPS.js.map} +0 -0
  452. /package/dist/{sampleScatter.spec-YXPZONTC.js.map → sampleScatter.spec-3XTTIYTV.js.map} +0 -0
  453. /package/dist/{sampleView-OOCJNAVK.js.map → sampleView-6MMGODPU.js.map} +0 -0
  454. /package/dist/{samplelst-O6Q2QZ2S.js.map → samplelst-GH2MNWVY.js.map} +0 -0
  455. /package/dist/{samplematrix-GAR2PBNX.js.map → samplematrix-W6OJWXC3.js.map} +0 -0
  456. /package/dist/{scatter-V5VQRIWJ.js.map → scatter-KSZ6Y6OE.js.map} +0 -0
  457. /package/dist/{scatter.integration.spec-M6KI4ZMN.js.map → scatter.integration.spec-45EE2OG3.js.map} +0 -0
  458. /package/dist/{selectGenomeWithTklst-LF52E5F5.js.map → selectGenomeWithTklst-KBUDGZ7D.js.map} +0 -0
  459. /package/dist/{singleCellPlot-R7V7MTIA.js.map → singleCellPlot-KIQULD32.js.map} +0 -0
  460. /package/dist/{singlecell-OGT4OAEV.js.map → singlecell-7XHCWR4N.js.map} +0 -0
  461. /package/dist/{singlecell-QGKFM6CJ.js.map → singlecell-VUVDCNWO.js.map} +0 -0
  462. /package/dist/{snp-6WCLJX44.js.map → snp-R3P5LKYY.js.map} +0 -0
  463. /package/dist/{snplocus-BQZ72QBQ.js.map → snplocus-JZHQFYHR.js.map} +0 -0
  464. /package/dist/{spliceevent.a53ss.diagram-3EGT2GQA.js.map → spliceevent.a53ss.diagram-ED2IUEA4.js.map} +0 -0
  465. /package/dist/{spliceevent.exonskip.diagram-DPQPG2HL.js.map → spliceevent.exonskip.diagram-AB2W56TC.js.map} +0 -0
  466. /package/dist/{spliceevent.noeventdiagram-Y5MP7F2C.js.map → spliceevent.noeventdiagram-2B6WTPET.js.map} +0 -0
  467. /package/dist/{ssGSEA-LRXFLZQ4.js.map → ssGSEA-P2OODCHX.js.map} +0 -0
  468. /package/dist/{summarizeCnvGeneexp-J3NOFHHT.js.map → summarizeCnvGeneexp-FO34AWQG.js.map} +0 -0
  469. /package/dist/{summarizeGeneexpSurvival-EGHTXLLP.js.map → summarizeGeneexpSurvival-VXS3WSUV.js.map} +0 -0
  470. /package/dist/{summarizeMutationCnv-AMTGYZ6V.js.map → summarizeMutationCnv-M37KCBC3.js.map} +0 -0
  471. /package/dist/{summarizeMutationDiagnosis-7ZS2FUPE.js.map → summarizeMutationDiagnosis-J4SBRTLU.js.map} +0 -0
  472. /package/dist/{summarizeMutationSurvival-Z5STBDYF.js.map → summarizeMutationSurvival-J4UXVZDX.js.map} +0 -0
  473. /package/dist/{summary-YLRI3A3E.js.map → summary-3PHQGXKZ.js.map} +0 -0
  474. /package/dist/{summary.integration.spec-5ONC3S54.js.map → summary.integration.spec-H36BGFOG.js.map} +0 -0
  475. /package/dist/{summaryInput-3ZSTIE5B.js.map → summaryInput-GYLEJI77.js.map} +0 -0
  476. /package/dist/{sunburst-DRZZYAUH.js.map → sunburst-6BFBLU4S.js.map} +0 -0
  477. /package/dist/{survival-PJKJ2Z4B.js.map → survival-2W2NCKW4.js.map} +0 -0
  478. /package/dist/{survival-5E2VV46S.js.map → survival-RN45E7SJ.js.map} +0 -0
  479. /package/dist/{survival.integration.spec-ZHEVVSFI.js.map → survival.integration.spec-6VMFUP74.js.map} +0 -0
  480. /package/dist/{svgraph-EV7XM3VZ.js.map → svgraph-JNLSQFOO.js.map} +0 -0
  481. /package/dist/{svmr-NMNGV2TY.js.map → svmr-C6KXEPIR.js.map} +0 -0
  482. /package/dist/{table-VJ44XPYD.js.map → table-DQ5AJKWK.js.map} +0 -0
  483. /package/dist/{termCollection-NDLSU6NG.js.map → termCollection-7RP3PPUZ.js.map} +0 -0
  484. /package/dist/{termCollection-4W246ZOD.js.map → termCollection-HTPTRUYP.js.map} +0 -0
  485. /package/dist/{tk-4BT462Y4.js.map → tk-GE3XCT4W.js.map} +0 -0
  486. /package/dist/{tp.ui-DIBDS4SM.js.map → tp.ui-AVJ26PGA.js.map} +0 -0
  487. /package/dist/{tvs.dt-UYO4LYVG.js.map → tvs.dt-RIWQXAA2.js.map} +0 -0
  488. /package/dist/{tvs.dtcnv.categorical-4EGZBKKS.js.map → tvs.dtcnv.categorical-NIYLISRH.js.map} +0 -0
  489. /package/dist/{tvs.dtcnv.continuous-MEQFAQVF.js.map → tvs.dtcnv.continuous-OXMJVTSG.js.map} +0 -0
  490. /package/dist/{tvs.dtfusion-FSTZOHJM.js.map → tvs.dtfusion-B4QGYUNU.js.map} +0 -0
  491. /package/dist/{tvs.dtsnvindel-A4GY67UR.js.map → tvs.dtsnvindel-ZAZCES5T.js.map} +0 -0
  492. /package/dist/{tvs.dtsv-OM7BHPB2.js.map → tvs.dtsv-SOBS7E7L.js.map} +0 -0
  493. /package/dist/{tvs.samplelst-S5UQ75LK.js.map → tvs.samplelst-4SLFLDND.js.map} +0 -0
  494. /package/dist/{tvs.termCollection-4L6QFRPQ.js.map → tvs.termCollection-SDTPHI57.js.map} +0 -0
  495. /package/dist/{violin-FURRSD5E.js.map → violin-HRUVZFHW.js.map} +0 -0
  496. /package/dist/{violin.integration.spec-KBG52YHF.js.map → violin.integration.spec-AWCNW6AR.js.map} +0 -0
  497. /package/dist/{violin.interactivity-FYGFPTHW.js.map → violin.interactivity-OEVSVKRZ.js.map} +0 -0
  498. /package/dist/{violin.renderer-GUZZ7F7D.js.map → violin.renderer-F4Z5ISZQ.js.map} +0 -0
  499. /package/dist/{vocabulary-PJOKSM2P.js.map → vocabulary-BWJMHEDD.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../node_modules/d3-regression/dist/d3-regression.js", "../plots/scatter/viewmodel/scatterLasso.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 { getSamplelstTW, getFilter, addNewGroup } from '../../../mass/groups.js'\nimport { getId } from '#mass/nav'\nimport { renderTable } from '../../../dom/table.ts'\nimport type { Scatter } from '../scatter.js'\nimport type { TableCell, TableColumn, TableRow } from '#dom'\nexport class ScatterLasso {\n\tscatter: Scatter\n\tmodel: any\n\tview: any\n\tinteractivity: any\n\tselectedItems!: any[]\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}\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 ('sampleId' in data && !(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\tthis.view.dom.tip.show(event.clientX, event.clientY)\n\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} 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\ttrue\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])\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\tgetCategoryInfo(d, category) {\n\t\tif (!(category in d)) return ''\n\t\treturn d[category]\n\t}\n\n\tshowTable(group, x, y, addGroup) {\n\t\tconst rows: TableRow[] = []\n\t\tconst columns: TableColumn[] = []\n\t\tconst first = group.items[0]\n\t\tif ('sample' in first) columns.push(formatCell('Sample', 'label'))\n\t\tif (this.scatter.config.term) columns.push(formatCell(this.scatter.config.term.term.name, 'label'))\n\t\tif (this.scatter.config.term2) columns.push(formatCell(this.scatter.config.term2.term.name, 'label'))\n\t\tif (this.scatter.config.colorTW) columns.push(formatCell(this.scatter.config.colorTW.term.name, 'label'))\n\t\tif (this.scatter.config.shapeTW) columns.push(formatCell(this.scatter.config.shapeTW.term.name, 'label'))\n\t\tlet info = false\n\t\tconst hasSampleName = 'sample' in group.items[0]\n\n\t\tfor (const item of group.items) {\n\t\t\tconst row: TableCell[] = []\n\t\t\tif (hasSampleName) row.push(formatCell(item.sample))\n\t\t\tif (this.scatter.config.term) row.push(formatCell(this.getCategoryInfo(item, 'x')))\n\t\t\tif (this.scatter.config.term2) row.push(formatCell(this.getCategoryInfo(item, 'y')))\n\t\t\tif (this.scatter.config.colorTW) row.push(formatCell(this.getCategoryInfo(item, 'category')))\n\t\t\tif (this.scatter.config.shapeTW) row.push(formatCell(this.getCategoryInfo(item, 'shape')))\n\t\t\tif ('info' in item) {\n\t\t\t\tinfo = true\n\t\t\t\tconst values: any = []\n\t\t\t\tfor (const [k, v] of Object.entries(item.info)) values.push(`${k}: ${v}`)\n\t\t\t\trow.push(formatCell(values.join(', ')))\n\t\t\t}\n\t\t\trows.push(row)\n\t\t}\n\t\tif (info) columns.push(formatCell('Info', 'label'))\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\tconst buttons: any[] = []\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.push(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 ? [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\n\t\tfunction formatCell(column: string, name = 'value'): any {\n\t\t\tconst dict = {}\n\t\t\tdict[name] = column\n\t\t\treturn dict\n\t\t}\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/utils/src/terms.js'\nimport type {\n\tScatterResponse,\n\tScatterChart,\n\tColorLegendItem,\n\tShapeLegendItem,\n\tScatterDataResult\n} from '../scatterTypes.js'\n//icons have size 16x16\nexport const shapes = shapesArray\n\nconst numberOfSamplesCutoff = 20000 // if map is greater than cutoff, switch from svg to canvas rendering\n\nexport class ScatterModel {\n\tstartGradient: any\n\tstopGradient: any\n\trange: any\n\tcharts!: ScatterChart[]\n\tis2DLarge: boolean\n\tis3D: boolean\n\taxisOffset: any\n\tfilterSampleStr: string | null = null\n\tscatter: Scatter\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.startGradient = {}\n\t\tthis.stopGradient = {}\n\t\tthis.scatter = scatter\n\t\tthis.axisOffset = { x: 80, y: 30 }\n\t\tthis.is2DLarge = false\n\t\tthis.is3D = false\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\tif (c.singleCellPlot) return c\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}\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\t\topts.excludeOutliers = this.scatter.settings.excludeOutliers\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\tthis.is3D = this.scatter.config.term0?.q.mode == 'continuous'\n\t\t\tif ('error' in data) throw data.error\n\t\t\tthis.range = data.range\n\t\t\tthis.charts = []\n\t\t\tfor (const [key, chartData] of Object.entries(data.result)) {\n\t\t\t\tif (!Array.isArray(chartData.samples)) throw 'data.samples[] not array'\n\t\t\t\tthis.createChart(key, chartData)\n\t\t\t}\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\tcreateChart(id: string, data: ScatterDataResult) {\n\t\tconst cohortSamples: any[] = data.samples.filter(sample => 'sampleId' in sample)\n\t\tif (cohortSamples.length > numberOfSamplesCutoff) 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\tthis.charts.push({ id, data, cohortSamples, colorLegend, shapeLegend })\n\t}\n\n\tasync initRanges() {\n\t\tlet samples: any[] = []\n\t\tfor (const chart of this.charts) samples = samples.concat(chart.data.samples)\n\t\tif (samples.length > numberOfSamplesCutoff) this.is2DLarge = true\n\t\tif (samples.length == 0) return\n\t\tconst s0 = samples[0] //First sample to start reduce comparisons\n\t\tconst [xMin, xMax, yMin, yMax, zMin, zMax, scaleMin, scaleMax] = 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],\n\t\t\t[s0.x, s0.x, s0.y, s0.y, s0.z, s0.z, s0.scale, s0.scale]\n\t\t)\n\t\tconst settings = this.scatter.settings\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}\n\t\t}\n\t}\n\n\tgetOpacity(c) {\n\t\tif ('sampleId' in c) {\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 = !('sampleId' in c)\n\t\tlet scale\n\t\tif (!this.scatter.config.scaleDotTW || isRef) {\n\t\t\tscale = 'sampleId' in c ? this.scatter.settings.size : this.scatter.settings.refSize\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?.q.mode == 'continuous' && 'sampleId' in c) {\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\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\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.app.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\tinitAxes(chart) {\n\t\tif (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 =\n\t\t\tthis.scatter.settings.minXScale != null || this.scatter.settings.maxXScale != null ? 0 : (xMax - xMin) * 0.01 //extra space added to avoid clipping the particles on the X axis\n\t\tconst extraSpaceY =\n\t\t\tthis.scatter.settings.minYScale != null || this.scatter.settings.maxYScale != null ? 0 : (yMax - yMin) * 0.01 //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, this.scatter.settings.svgw + offsetX])\n\t\tif (this.scatter.config.term && this.scatter.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, this.scatter.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 = this.scatter.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 (this.scatter.config.term2 && this.scatter.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\tchart.yAxisScaleTime = scaleTime()\n\t\t\t\t.domain([yMinDate, yMaxDate])\n\t\t\t\t.range([offsetY, this.scatter.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, this.scatter.settings.svgd])\n\n\t\tconst gradientColor = rgb(this.scatter.settings.defaultColor)\n\t\tif (!this.scatter.config.startColor) {\n\t\t\tthis.scatter.config.startColor = {}\n\t\t\tthis.scatter.config.stopColor = {}\n\t\t}\n\t\t// supply start and stop color, if term has hardcoded colors, use; otherwise use default\n\t\tif (!this.scatter.config.startColor[chart.id]) {\n\t\t\tthis.scatter.config.startColor[chart.id] =\n\t\t\t\tthis.scatter.config.colorTW?.term.continuousColorScale?.minColor ||\n\t\t\t\tgradientColor.brighter().brighter().toString()\n\t\t}\n\n\t\tif (!this.scatter.config.stopColor[chart.id]) {\n\t\t\tthis.scatter.config.stopColor[chart.id] =\n\t\t\t\tthis.scatter.config.colorTW?.term.continuousColorScale?.maxColor || gradientColor.darker().toString()\n\t\t}\n\n\t\t// Handle continuous color scaling when color term wrapper is in continuous mode\n\t\tif (this.scatter.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\tconst colorValues = chart.cohortSamples\n\t\t\t\t.filter(\n\t\t\t\t\ts => !this.scatter.config.colorTW.term.values || !(s.category in this.scatter.config.colorTW.term.values)\n\t\t\t\t)\n\t\t\t\t.map(s => s.category)\n\t\t\t\t.sort((a, b) => a - b)\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 settings = this.scatter.config.settings.sampleScatter\n\n\t\t\tswitch (settings.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 = settings.colorScaleMinFixed\n\t\t\t\t\tmax = settings.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 * settings.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\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([this.scatter.config.startColor[chart.id], this.scatter.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\nexport function getCoordinate(val: number, min: number | null, max: number | null) {\n\tif (min != null && val < min) return min\n\tif (max != null && val > max) return max\n\treturn val\n}\n", "import { Menu } from '#dom/menu'\nimport { rgb } from 'd3-color'\nimport { shapeSelector } from '../../../dom/shapes.js'\nimport type { Scatter } from '../scatter.js'\nimport { scaleLinear as d3Linear } from 'd3-scale'\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\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 } from '#dom'\nimport type { Scatter } from '../scatter.js'\nimport { isNumericTerm } from '#shared/terms.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\n\nexport const minShapeSize = 0.2\nexport const maxShapeSize = 6\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 controlsHolder = leftDiv.insert('div').style('display', 'inline-block')\n\n\t\tconst rightDiv = this.opts.holder.insert('div').style('display', 'inline-block').style('vertical-align', 'top')\n\t\tconst loadingDiv = rightDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('padding', '24px')\n\t\t\t.text('Loading ...')\n\t\tconst bannerDiv = rightDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'none')\n\t\t\t.style('text-align', 'center')\n\t\t\t.style('padding', '24px')\n\t\t\t.style('font-size', '16px')\n\t\tconst headerDiv = rightDiv.append('div')\n\t\tconst mainDiv = rightDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('flex-direction', 'row')\n\t\t\t.style('flex-wrap', 'wrap')\n\t\t\t.style('max-width', '100vw')\n\n\t\tthis.dom = {\n\t\t\tloadingDiv,\n\t\t\tbannerDiv,\n\t\t\theaderDiv,\n\t\t\tmainDiv,\n\t\t\theader: this.opts.header,\n\t\t\t//holder,\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\ttooltip: new Menu({ padding: '2px', offsetX: 10, offsetY: 0 }),\n\t\t\tcontrolsHolder,\n\t\t\ttoolsDiv: leftDiv.insert('div')\n\t\t}\n\n\t\tif (this.dom.header) {\n\t\t\tconst chartName = splitCamelCase(this.scatter.type).toUpperCase()\n\t\t\tthis.dom.header.html(\n\t\t\t\t`${\n\t\t\t\t\tthis.scatter.config.name || ''\n\t\t\t\t} <span style=\"opacity:.6;font-size:.7em;margin-left:10px;\">${chartName}</span>`\n\t\t\t)\n\t\t}\n\t}\n\n\tgetControlInputs() {\n\t\tconst hasRef = this.scatter.model.charts[0]?.data.samples.find(s => !('sampleId' in s)) || false\n\t\tconst scaleDotOption = {\n\t\t\ttype: 'term',\n\t\t\tconfigKey: 'scaleDotTW',\n\t\t\tchartType: 'sampleScatter',\n\t\t\tusecase: { target: 'sampleScatter', detail: 'numeric' },\n\t\t\ttitle: 'Scale sample 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: 'sampleScatter',\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//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\ttw.q = { mode: 'discrete' } //use discrete mode by default\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: 'Sample size',\n\t\t\ttype: 'number',\n\t\t\tchartType: 'sampleScatter',\n\t\t\tsettingsKey: 'size',\n\t\t\ttitle: 'Sample size, represents the factor used to scale the sample',\n\t\t\tmin: 0,\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: 'sampleScatter',\n\t\t\tsettingsKey: 'minShapeSize',\n\t\t\ttitle: 'Minimum sample 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: 'sampleScatter',\n\t\t\tsettingsKey: 'maxShapeSize',\n\t\t\ttitle: 'Maximum sample 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: 'sampleScatter',\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: 'sampleScatter',\n\t\t\tsettingsKey: 'refSize',\n\t\t\ttitle: 'It represents the area of the reference symbol in square pixels',\n\t\t\tmin: 0,\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: 'sampleScatter',\n\t\t\tsettingsKey: 'showAxes',\n\t\t\ttitle: `Option to show/hide plot axes`,\n\t\t\ttestid: 'showAxes'\n\t\t}\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: 'sampleScatter',\n\t\t\t\tusecase: { target: 'sampleScatter', detail: 'colorTW' },\n\t\t\t\ttitle: 'Categories to color the samples',\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//Eventually this will be corrected with usecase.detail\n\t\t\t\t//When single cell, only relevant terms will be displayed\n\t\t\t\t//in the tree\n\t\t\t\tgetDisplayStyle: () => {\n\t\t\t\t\treturn this.scatter.config?.singleCellPlot ? '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: 'sampleScatter',\n\t\t\t\tsettingsKey: 'opacity',\n\t\t\t\ttitle: 'It represents 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: 'sampleScatter',\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: 'sampleScatter',\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: 'sampleScatter',\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},\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: 'sampleScatter',\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}\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: 'sampleScatter',\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: 'sampleScatter',\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: 'sampleScatter',\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: 'sampleScatter',\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: 'sampleScatter',\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\tnumericEditMenuVersion: ['discrete', 'continuous'],\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\tlabel: 'Sample size',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType: 'sampleScatter',\n\t\t\t\t\tsettingsKey: 'threeSize',\n\t\t\t\t\ttitle: '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: 'sampleScatter',\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: 'sampleScatter',\n\t\t\t\t\t\tusecase: { target: 'sampleScatter', detail: 'numeric' },\n\t\t\t\t\t\ttitle: 'X coordinate to plot the 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: 'sampleScatter',\n\t\t\t\t\t\tusecase: { target: 'sampleScatter', detail: 'numeric' },\n\t\t\t\t\t\ttitle: 'Y coordinate to plot the 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: 'sampleScatter',\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\tinputs.push({\n\t\t\t\t\tlabel: 'Chart depth',\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\tchartType: 'sampleScatter',\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: 'sampleScatter',\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: 'sampleScatter',\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\treturn inputs\n\t}\n\n\tgetMinMaxInputs() {\n\t\tconst xMin = roundValueAuto(this.scatter.model.range.xMin)\n\t\tconst xMax = roundValueAuto(this.scatter.model.range.xMax)\n\t\tconst xStep = (xMax - xMin) / 10\n\t\tconst yMin = roundValueAuto(this.scatter.model.range.yMin)\n\t\tconst yMax = roundValueAuto(this.scatter.model.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.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { ScatterLegendInteractivity } from './scatterLegendInteractivity.js'\nimport { minShapeSize, maxShapeSize } from '../view/scatterView.js'\nimport type { Scatter } from '../scatter.js'\nimport type { ScatterLegendItem } from '../scatterTypes.js'\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 = this.scatter.config.term0\n\t\t\t? `${this.scatter.config.term0.term.name + ' ' + chart.id}, n=${chart.cohortSamples.length}`\n\t\t\t: `${chart.cohortSamples.length} ${\n\t\t\t\t\tthis.scatter.config.sampleType ? this.scatter.config.sampleType + 's' : 'samples'\n\t\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`)\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')\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('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\tthis.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.append('g').style('font-size', `${this.getFontSize(chart, chart.shapeLegend)}em`)\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('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('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\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('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('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.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.append('g').attr('transform', `translate(${x},${y})`)\n\t\tconst shift = 30\n\t\tminG\n\t\t\t.append('path')\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('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('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.attr('value', this.scatter.settings.minShapeSize)\n\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\tconst value = parseFloat(minInput.node().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('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.attr('value', this.scatter.settings.maxShapeSize)\n\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\tconst value: any = parseFloat(maxInput.node().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}\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 { shapesArray } from '../../../dom/shapes.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { getDateStrFromNumber } from '#shared/terms.js'\nimport { rgb } from 'd3-color'\nimport type { Scatter } from '../scatter.js'\nimport { table2col } from '#dom'\nimport { getCoordinate } from '../model/scatterModel.ts'\n\nexport class ScatterTooltip {\n\tscatter: Scatter\n\tview: any\n\tchart: any\n\tsamples!: any[]\n\ttree!: any[]\n\ttableDiv: any\n\tonClick: boolean\n\tdisplaySample!: boolean\n\tparentCategories!: string[]\n\tsearchMenu: any\n\tsamplesData: any\n\tchartDiv: any\n\tlevel: any\n\tparentTW: any\n\n\tconstructor(scatter: Scatter) {\n\t\tthis.scatter = scatter\n\t\tthis.view = scatter.view\n\t\tthis.onClick = false\n\t}\n\n\tshowTooltip(event, chart) {\n\t\tif (this.scatter.config.lassoOn) return\n\t\tthis.chart = chart\n\t\tconst onClick = event.type == 'click'\n\t\tthis.onClick = onClick\n\t\tif (onClick) this.scatter.interactivity.searchMenu?.hide()\n\t\tif (!(event.target.tagName == 'path' && event.target.getAttribute('name') == 'serie')) {\n\t\t\tif (this.onClick && onClick) {\n\t\t\t\tthis.onClick = false\n\t\t\t\tthis.view.dom.tooltip.hide()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!onClick) {\n\t\t\t\tthis.view.dom.tooltip.hide()\n\t\t\t} //dont hide current tooltip if mouse moved away, may want to scroll\n\t\t\treturn\n\t\t}\n\t\tthis.showSampleTooltip(event.target.__data__, event.clientX, event.clientY, chart)\n\t}\n\n\tshowSampleTooltip(s2, x, y, chart) {\n\t\tthis.chart = chart\n\t\tthis.displaySample = 'sample' in s2\n\t\tconst threshold = 5 / this.scatter.zoom //Threshold should consider the zoom\n\t\t/** Avoid calculating the min and max for x and y\n\t\t * multiple times in the distance function.\n\t\t * Supply them as parameters.*/\n\t\tconst xMin = chart.xAxisScale.invert(0)\n\t\tconst xMax = chart.xAxisScale.invert(chart.width)\n\t\tconst yMin = chart.yAxisScale.invert(chart.height)\n\t\tconst yMax = chart.yAxisScale.invert(0)\n\t\tconst samples = chart.data.samples.filter(s => {\n\t\t\tconst dist = distance(s.x, s.y, s2.x, s2.y, chart, xMin, xMax, yMin, yMax)\n\t\t\tif (!('sampleId' in s) && (!this.scatter.settings.showRef || this.scatter.settings.refSize == 0)) return false\n\t\t\treturn this.scatter.model.getOpacity(s) > 0 && dist < threshold\n\t\t})\n\t\tthis.samples = samples\n\t\tsamples.sort((s1, s2) => {\n\t\t\tif (!('sampleId' in s1)) return 1\n\t\t\tif (this.scatter.config.term) {\n\t\t\t\t//coordinates from terms\n\t\t\t\tif (s1.x < s2.x) return -1\n\t\t\t\tif (s1.x > s2.x) return 1\n\t\t\t\tif (s1.y < s2.y) return -1\n\t\t\t\treturn 1\n\t\t\t}\n\n\t\t\tif (this.scatter.config.colorTW) {\n\t\t\t\tif (this.scatter.config.colorTW.term.type == 'categorical') {\n\t\t\t\t\tif (s1.category.includes(mclass.WT.label) || s1.category.includes(mclass.Blank.label)) return 1\n\t\t\t\t} // numeric\n\t\t\t\telse {\n\t\t\t\t\tif (s1.category < s2.category) return -1\n\t\t\t\t\telse if (s1.category > s2.category) return 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (s1.shape.includes(mclass.WT.label) || s1.shape.includes(mclass.Blank.label)) return 1\n\n\t\t\treturn -1\n\t\t})\n\t\tif (samples.length == 0) return\n\t\tthis.tree = []\n\t\tconst showCoords = this.scatter.config.term ? true : false\n\n\t\t//Building tree\n\t\tfor (const sample of samples) {\n\t\t\tconst id = `${roundValueAuto(sample.x)},${roundValueAuto(sample.y)}`\n\t\t\tlet node = this.tree.find(item => item.id == id)\n\t\t\tif (!node) {\n\t\t\t\tnode = { id, parentId: null, samples: [sample], level: 1, category: null, children: [] }\n\t\t\t\tthis.tree.push(node)\n\t\t\t\tif (showCoords) {\n\t\t\t\t\tconst xvalue = this.getCategoryValue('x', sample, this.scatter.config.term)\n\t\t\t\t\tconst xnode: any = {\n\t\t\t\t\t\tid: xvalue,\n\t\t\t\t\t\tparentId: id,\n\t\t\t\t\t\tsamples: [sample],\n\t\t\t\t\t\tlevel: 2,\n\t\t\t\t\t\tcategory: this.scatter.config.term.term.name,\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\tvalue: xvalue\n\t\t\t\t\t}\n\t\t\t\t\tthis.tree.push(xnode)\n\t\t\t\t\tnode.children.push(xnode)\n\t\t\t\t\tconst yvalue = this.getCategoryValue('y', sample, this.scatter.config.term2)\n\t\t\t\t\tconst ynode = {\n\t\t\t\t\t\tid: `${yvalue}${xvalue}`,\n\t\t\t\t\t\tparent: xnode,\n\t\t\t\t\t\tparentId: xvalue,\n\t\t\t\t\t\tsamples: [sample],\n\t\t\t\t\t\tlevel: 3,\n\t\t\t\t\t\tcategory: this.scatter.config.term2.term.name,\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\tvalue: yvalue\n\t\t\t\t\t}\n\t\t\t\t\txnode.children.push(ynode)\n\t\t\t\t\tthis.tree.push(ynode)\n\t\t\t\t\tnode.xnode = xnode\n\t\t\t\t\tnode.ynode = ynode\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.samples.push(sample)\n\t\t\t\tif (showCoords) {\n\t\t\t\t\tnode.xnode.samples.push(sample)\n\t\t\t\t\tnode.ynode.samples.push(sample)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.level = showCoords ? 4 : 2 //current level after adding the parent categories\n\t\tthis.parentCategories = showCoords ? ['y', 'x', ''] : ['']\n\t\tif (showCoords) this.parentTW = this.scatter.config.term\n\t\telse this.parentTW = null\n\t\tif (this.scatter.config.colorTW) this.addNodes('category', this.scatter.config.colorTW)\n\t\tif (this.scatter.config.shapeTW) this.addNodes('shape', this.scatter.config.shapeTW)\n\t\tif (this.scatter.config.scaleDotTW) this.addNodes('scale', this.scatter.config.scaleDotTW)\n\t\tthis.view.dom.tooltip.clear()\n\t\t//Rendering tooltip\n\t\tconst div = this.view.dom.tooltip.d\n\t\tif (samples.length > 1)\n\t\t\tdiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('color', '#aaa')\n\t\t\t\t.style('font-weight', 'bold')\n\t\t\t\t.html(`&nbsp;&nbsp;&nbsp;${samples.length} Samples`)\n\t\tconst tableDiv = div.append('div').style('max-height', '500px').style('overflow-y', 'scroll')\n\t\tif (samples.length > 4) tableDiv.attr('class', 'sjpp_show_scrollbar')\n\t\tthis.tableDiv = tableDiv\n\t\tconst nodes = this.tree.filter(node => (showCoords ? node.level == 1 : node.level == 2))\n\t\tif (showCoords)\n\t\t\tfor (const node of nodes) {\n\t\t\t\tif (samples.length > 1) tableDiv.append('div').style('padding', '2px')\n\t\t\t\tfor (const child of node.children) {\n\t\t\t\t\tthis.addCategory(child, null)\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\tfor (const node of nodes) {\n\t\t\t\tif (samples.length > 1) tableDiv.append('div').style('padding', '2px')\n\t\t\t\tthis.addCategory(node, null)\n\t\t\t}\n\n\t\tthis.view.dom.tooltip.show(x, y, true, false)\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\taddCategory(node, table) {\n\t\tconst samples = this.samples\n\t\tconst chart = this.chart\n\t\tconst tw = this.getTW(node.category)\n\t\tnode.added = true\n\t\tconst hasDiscoPlot = this.scatter.state.termdbConfig.queries?.singleSampleMutation\n\t\tconst hasMetArrayPlot = this.scatter.state.termdbConfig.queries?.singleSampleGenomeQuantification\n\t\tconst div = this.tableDiv.append('div')\n\t\tif (!table) table = table2col({ holder: div, disableScroll: true, cellPadding: '5px' })\n\t\tconst sample = node.samples[0]\n\t\tif (sample.category != 'Ref') {\n\t\t\tconst [tdlabel, td] = table.addRow()\n\t\t\tconst showIcon = tw != null && (tw == this.scatter.config.colorTW || tw == this.scatter.config.shapeTW)\n\t\t\tlet label = tw ? tw.term.name : node.category\n\t\t\tif (samples.length > 1 && !this.displaySample) label = label + ` (${node.samples.length})`\n\t\t\ttdlabel.text(label)\n\n\t\t\tif (showIcon) {\n\t\t\t\tconst color =\n\t\t\t\t\ttw == this.scatter.config.colorTW\n\t\t\t\t\t\t? this.scatter.model.getColor(sample, chart)\n\t\t\t\t\t\t: this.scatter.config.colorTW\n\t\t\t\t\t\t? 'gray'\n\t\t\t\t\t\t: this.scatter.settings.defaultColor\n\t\t\t\tconst index =\n\t\t\t\t\ttw == this.scatter.config.colorTW\n\t\t\t\t\t\t? chart.shapeLegend.get('Ref').shape % shapesArray.length\n\t\t\t\t\t\t: chart.shapeLegend.get(sample.shape).shape % shapesArray.length\n\t\t\t\tconst shape = shapesArray[index]\n\t\t\t\tlet fontColor = 'black'\n\t\t\t\tconst whiteColor = rgb('white').toString()\n\n\t\t\t\tif (tw?.term.type == 'geneVariant' && tw.q.type == 'values') {\n\t\t\t\t\tfor (const id in mclass) {\n\t\t\t\t\t\tconst class_info = mclass[id]\n\t\t\t\t\t\tif (node.value.includes(class_info.label)) {\n\t\t\t\t\t\t\tif (rgb(class_info.color).toString() != whiteColor) fontColor = class_info.color\n\t\t\t\t\t\t\tnode.value = this.getCategoryValue(node.category, sample, tw, true)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.onClick) {\n\t\t\t\t\t\ttd.append('button')\n\t\t\t\t\t\t\t.style('float', 'right')\n\t\t\t\t\t\t\t.text('Lollipop')\n\t\t\t\t\t\t\t.on('click', async () => {\n\t\t\t\t\t\t\t\tawait this.scatter.interactivity.openLollipop(label)\n\t\t\t\t\t\t\t\tthis.scatter.dom.tip.hide()\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst chars = node.value.toString().length\n\t\t\t\tconst width = chars * 9 + 60\n\t\t\t\tconst svg = td.append('svg').attr('width', width).attr('height', '25px')\n\t\t\t\tconst g = svg.append('g').attr('transform', 'translate(0, 14)')\n\t\t\t\tg.append('path')\n\t\t\t\t\t.attr('d', shape)\n\t\t\t\t\t.attr('fill', color)\n\t\t\t\t\t.attr('stroke', '#aaa')\n\t\t\t\t\t.attr('transform', 'translate(0, -4) scale(0.6)')\n\t\t\t\tconst text = g.append('text').attr('x', 15).attr('y', 6).attr('font-size', '0.9em')\n\t\t\t\ttext.append('tspan').text(node.value).attr('fill', fontColor)\n\t\t\t} else td.text(`${node.value}`)\n\t\t}\n\n\t\tfor (const child of node.children) if (!child.added) this.addCategory(child, table)\n\t\tif (node.children.length == 0 && this.displaySample) {\n\t\t\tfor (const sample of node.samples) {\n\t\t\t\tif ('info' in sample)\n\t\t\t\t\tfor (const [k, v] of Object.entries(sample.info)) {\n\t\t\t\t\t\tconst [tdlabel, td] = table.addRow()\n\t\t\t\t\t\ttdlabel.text(k)\n\t\t\t\t\t\ttd.text(v)\n\t\t\t\t\t}\n\n\t\t\t\tconst [tdlabel, td] = table.addRow()\n\t\t\t\ttdlabel.text('Sample')\n\t\t\t\ttd.text(sample.sample)\n\t\t\t\tif ('sampleId' in sample && this.onClick) {\n\t\t\t\t\tif (this.scatter.state.currentCohortChartTypes.includes('sampleView')) {\n\t\t\t\t\t\ttd.append('button')\n\t\t\t\t\t\t\t.style('float', 'right')\n\t\t\t\t\t\t\t.text('Sample view')\n\t\t\t\t\t\t\t.on('click', () => this.scatter.interactivity.openSampleView(sample))\n\t\t\t\t\t}\n\t\t\t\t\tif (hasDiscoPlot)\n\t\t\t\t\t\ttd.append('button')\n\t\t\t\t\t\t\t.style('float', 'right')\n\t\t\t\t\t\t\t.text('Disco')\n\t\t\t\t\t\t\t.on('click', async () => this.scatter.interactivity.openDiscoPlot(sample))\n\n\t\t\t\t\tif (hasMetArrayPlot)\n\t\t\t\t\t\ttd.append('button')\n\t\t\t\t\t\t\t.style('float', 'right')\n\t\t\t\t\t\t\t.text('Met Array')\n\t\t\t\t\t\t\t.on('click', async () => this.scatter.interactivity.openMetArray(sample))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\taddNodes(category, tw) {\n\t\tfor (const sample of this.samples) {\n\t\t\tconst value = this.getCategoryValue(category, sample, tw)\n\t\t\tlet parentId = ''\n\t\t\tfor (const pc of this.parentCategories) parentId += this.getCategoryValue(pc, sample, this.parentTW)\n\t\t\tconst id = value + parentId\n\t\t\tlet node = this.tree.find(item => item.id == id && item.parentId == parentId)\n\t\t\tconst parent = this.tree.find(item => item.id == parentId)\n\t\t\tif (!node) {\n\t\t\t\tnode = { id, parentId, samples: [], level: this.level, category, children: [], value }\n\t\t\t\tthis.tree.push(node)\n\t\t\t}\n\t\t\tnode.samples.push(sample)\n\t\t\tif (parent) parent.children.push(node)\n\t\t}\n\t\tthis.parentCategories.unshift(category)\n\t\tthis.parentTW = tw\n\t\tthis.level++\n\t}\n\n\tgetCategoryValue(category, d, tw, includeMutation = false) {\n\t\tif (category == '') return ''\n\t\tlet value = d[category]\n\t\tif (tw?.term.type == 'geneVariant' && tw.q?.type == 'values') {\n\t\t\tconst mutation = value.split(', ')[0]\n\t\t\tfor (const id in mclass) {\n\t\t\t\tconst class_info = mclass[id]\n\t\t\t\tif (mutation == class_info.label) {\n\t\t\t\t\tconst mname = d.cat_info[category].find(m => m.class == class_info.key).mname\n\t\t\t\t\tif (mname && includeMutation) value = `${mname} ${value}`\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tw?.term.type == 'date') value = getDateStrFromNumber(value)\n\t\telse if (typeof value == 'number' && value % 1 != 0) value = roundValueAuto(value)\n\t\treturn value\n\t}\n}\n\nexport function distance(x1: number, y1: number, x2: number, y2: number, chart: any, xMin, xMax, yMin, yMax): number {\n\tconst convertedX1 = getCoordinate(x1, xMin, xMax)\n\tconst convertedX2 = getCoordinate(x2, xMin, xMax)\n\tconst convertedY1 = getCoordinate(y1, yMin, yMax)\n\tconst convertedY2 = getCoordinate(y2, yMin, yMax)\n\tconst x = chart.xAxisScale(convertedX2) - chart.xAxisScale(convertedX1)\n\tconst y = chart.yAxisScale(convertedY2) - chart.yAxisScale(convertedY1)\n\tconst distance = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))\n\treturn distance\n}\n", "import { zoom as d3zoom } from 'd3-zoom'\nimport { icons as icon_functions } from '#dom'\nimport type { Scatter } from '../scatter.js'\nimport { zoomIdentity } from 'd3-zoom'\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.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'\n\nexport class ScatterViewModelBase {\n\tscatter: Scatter\n\tview: any\n\tmodel: any\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.style('opacity', 0).style('display', 'inline-block')\n\t\tdiv.on('mouseover', event => {\n\t\t\tif (!this.scatterTooltip.onClick) this.scatterTooltip.showTooltip(event, chart)\n\t\t})\n\t\tdiv.on('click', event => this.scatterTooltip.showTooltip(event, chart))\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\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\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\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\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}`\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\tconst isEvents = this.scatter.config.term2 ? false : true\n\t\t\tconst t2name = this.scatter.config.term2?.term?.name\n\t\t\tconst term2Name = isEvents ? 'Frequency' : getTitle(t2name, 60)\n\t\t\ttext = 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 - 50}, ${\n\t\t\t\t\t\tthis.scatter.settings.svgh / 2 + this.model.axisOffset.y\n\t\t\t\t\t}) rotate(-90)`\n\t\t\t\t)\n\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t.text(term2Name)\n\t\t\t\t.style('font-size', '0.9em')\n\t\t\tif (term2Name.length > 60) {\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.term2.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}\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\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('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/*** 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.mayRenderRegression()\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\tthis.scatterZoom.initZoom(toolsDiv)\n\t}\n\n\t//2D large and 3D add an svg for the legend\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.js'\nimport type { Scatter } from '../scatter.js'\nimport { ScatterViewModelBase } from './scatterViewModelBase.js'\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}\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\tif (this.scatter.config.singleCellPlot) 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//2D large and 3D add an svg for the legend\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 * as THREE from 'three'\nimport { ScatterViewModel } from './scatterViewModel.js'\n\nexport class ScatterViewModel2DLarge extends ScatterViewModel {\n\tconstructor(scatter) {\n\t\tsuper(scatter)\n\t}\n\n\tasync renderSerie(chart) {\n\t\tconst DragControls = await import('three/examples/jsm/controls/DragControls.js')\n\n\t\tthis.view.dom.mainDiv.selectAll('*').remove()\n\n\t\tthis.canvas = this.view.dom.mainDiv.insert('div').style('display', 'inline-block').append('canvas').node()\n\t\tthis.canvas.width = this.scatter.settings.svgw\n\t\tthis.canvas.height = this.scatter.settings.svgh\n\t\tchart.chartDiv.style('margin', '20px 20px')\n\n\t\tconst fov = this.scatter.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, 1.5)\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(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({ antialias: true, canvas: this.canvas, preserveDrawingBuffer: true })\n\t\trenderer.setSize(this.scatter.settings.svgw, this.scatter.settings.svgh)\n\t\trenderer.setPixelRatio(window.devicePixelRatio)\n\n\t\tnew DragControls.DragControls([particles], camera, renderer.domElement)\n\n\t\tdocument.addEventListener('mousewheel', (event: any) => {\n\t\t\tif (event.ctrlKey) camera.position.z += event.deltaY / 500\n\t\t})\n\n\t\tthis.addLegendSVG(chart)\n\t\tthis.animate(camera, scene, renderer)\n\t}\n\n\tanimate(camera, scene, renderer) {\n\t\trequestAnimationFrame(() => this.animate(camera, scene, renderer))\n\t\tcamera.zoom = this.scatter.vm.scatterZoom.zoom\n\t\tcamera.updateProjectionMatrix()\n\t\trenderer.render(scene, camera)\n\t}\n\n\tgetVertices(chart) {\n\t\tconst xAxisScale = chart.xAxisScale.range([-1, 1])\n\t\tconst yAxisScale = chart.yAxisScale.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\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, deepEqual } 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 { TermTypes } from '#shared/terms.js'\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\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\tconstructor() {\n\t\tthis.type = 'singleCellPlot'\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\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\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\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.append('select').on('change', e => {\n\t\t\t\tconst display = this.dom.deselect.node().value ? 'inline-block' : 'none'\n\t\t\t\tconst cluster = this.dom.deselect.node().value.split(' ')[1]\n\t\t\t\tthis.genes = null\n\t\t\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config: { cluster, gene: null } })\n\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: TermTypes.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: TermTypes.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\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\tdistance(x1, y1, x2, y2, plot) {\n\t\tconst x = plot.xAxisScale(x2) - plot.xAxisScale(x1)\n\t\tconst y = plot.yAxisScale(y2) - plot.yAxisScale(y1)\n\t\tconst distance = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))\n\t\treturn distance\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\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.append('canvas').style('display', 'inline-block').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", "s2", "sample", "tdlabel", "td", "distance", "i", "max", "distance"]
7
- }